]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - binutils/readelf.c
S390: Make IPA recognize tdescs with guarded storage
[thirdparty/binutils-gdb.git] / binutils / readelf.c
1 /* readelf.c -- display contents of an ELF format file
2 Copyright (C) 1998-2018 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/pru.h"
140 #include "elf/riscv.h"
141 #include "elf/rl78.h"
142 #include "elf/rx.h"
143 #include "elf/s390.h"
144 #include "elf/score.h"
145 #include "elf/sh.h"
146 #include "elf/sparc.h"
147 #include "elf/spu.h"
148 #include "elf/tic6x.h"
149 #include "elf/tilegx.h"
150 #include "elf/tilepro.h"
151 #include "elf/v850.h"
152 #include "elf/vax.h"
153 #include "elf/visium.h"
154 #include "elf/wasm32.h"
155 #include "elf/x86-64.h"
156 #include "elf/xc16x.h"
157 #include "elf/xgate.h"
158 #include "elf/xstormy16.h"
159 #include "elf/xtensa.h"
160
161 #include "getopt.h"
162 #include "libiberty.h"
163 #include "safe-ctype.h"
164 #include "filenames.h"
165
166 #ifndef offsetof
167 #define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
168 #endif
169
170 typedef struct elf_section_list
171 {
172 Elf_Internal_Shdr * hdr;
173 struct elf_section_list * next;
174 } elf_section_list;
175
176 /* Flag bits indicating particular types of dump. */
177 #define HEX_DUMP (1 << 0) /* The -x command line switch. */
178 #define DISASS_DUMP (1 << 1) /* The -i command line switch. */
179 #define DEBUG_DUMP (1 << 2) /* The -w command line switch. */
180 #define STRING_DUMP (1 << 3) /* The -p command line switch. */
181 #define RELOC_DUMP (1 << 4) /* The -R command line switch. */
182
183 typedef unsigned char dump_type;
184
185 /* A linked list of the section names for which dumps were requested. */
186 struct dump_list_entry
187 {
188 char * name;
189 dump_type type;
190 struct dump_list_entry * next;
191 };
192
193 typedef struct filedata
194 {
195 const char * file_name;
196 FILE * handle;
197 bfd_size_type file_size;
198 Elf_Internal_Ehdr file_header;
199 Elf_Internal_Shdr * section_headers;
200 Elf_Internal_Phdr * program_headers;
201 char * string_table;
202 unsigned long string_table_length;
203 /* A dynamic array of flags indicating for which sections a dump of
204 some kind has been requested. It is reset on a per-object file
205 basis and then initialised from the cmdline_dump_sects array,
206 the results of interpreting the -w switch, and the
207 dump_sects_byname list. */
208 dump_type * dump_sects;
209 unsigned int num_dump_sects;
210 } Filedata;
211
212 char * program_name = "readelf";
213
214 static unsigned long archive_file_offset;
215 static unsigned long archive_file_size;
216 static unsigned long dynamic_addr;
217 static bfd_size_type dynamic_size;
218 static size_t dynamic_nent;
219 static char * dynamic_strings;
220 static unsigned long dynamic_strings_length;
221 static unsigned long num_dynamic_syms;
222 static Elf_Internal_Sym * dynamic_symbols;
223 static Elf_Internal_Syminfo * dynamic_syminfo;
224 static unsigned long dynamic_syminfo_offset;
225 static unsigned int dynamic_syminfo_nent;
226 static char program_interpreter[PATH_MAX];
227 static bfd_vma dynamic_info[DT_ENCODING];
228 static bfd_vma dynamic_info_DT_GNU_HASH;
229 static bfd_vma version_info[16];
230 static Elf_Internal_Dyn * dynamic_section;
231 static elf_section_list * symtab_shndx_list;
232 static bfd_boolean show_name = FALSE;
233 static bfd_boolean do_dynamic = FALSE;
234 static bfd_boolean do_syms = FALSE;
235 static bfd_boolean do_dyn_syms = FALSE;
236 static bfd_boolean do_reloc = FALSE;
237 static bfd_boolean do_sections = FALSE;
238 static bfd_boolean do_section_groups = FALSE;
239 static bfd_boolean do_section_details = FALSE;
240 static bfd_boolean do_segments = FALSE;
241 static bfd_boolean do_unwind = FALSE;
242 static bfd_boolean do_using_dynamic = FALSE;
243 static bfd_boolean do_header = FALSE;
244 static bfd_boolean do_dump = FALSE;
245 static bfd_boolean do_version = FALSE;
246 static bfd_boolean do_histogram = FALSE;
247 static bfd_boolean do_debugging = FALSE;
248 static bfd_boolean do_arch = FALSE;
249 static bfd_boolean do_notes = FALSE;
250 static bfd_boolean do_archive_index = FALSE;
251 static bfd_boolean is_32bit_elf = FALSE;
252 static bfd_boolean decompress_dumps = FALSE;
253
254 struct group_list
255 {
256 struct group_list * next;
257 unsigned int section_index;
258 };
259
260 struct group
261 {
262 struct group_list * root;
263 unsigned int group_index;
264 };
265
266 static size_t group_count;
267 static struct group * section_groups;
268 static struct group ** section_headers_groups;
269
270 /* A dynamic array of flags indicating for which sections a dump
271 has been requested via command line switches. */
272 static Filedata cmdline;
273
274 static struct dump_list_entry * dump_sects_byname;
275
276 /* How to print a vma value. */
277 typedef enum print_mode
278 {
279 HEX,
280 DEC,
281 DEC_5,
282 UNSIGNED,
283 PREFIX_HEX,
284 FULL_HEX,
285 LONG_HEX
286 }
287 print_mode;
288
289 /* Versioned symbol info. */
290 enum versioned_symbol_info
291 {
292 symbol_undefined,
293 symbol_hidden,
294 symbol_public
295 };
296
297 static const char * get_symbol_version_string
298 (Filedata *, bfd_boolean, const char *, unsigned long, unsigned,
299 Elf_Internal_Sym *, enum versioned_symbol_info *, unsigned short *);
300
301 #define UNKNOWN -1
302
303 #define SECTION_NAME(X) \
304 ((X) == NULL ? _("<none>") \
305 : filedata->string_table == NULL ? _("<no-strings>") \
306 : ((X)->sh_name >= filedata->string_table_length ? _("<corrupt>") \
307 : filedata->string_table + (X)->sh_name))
308
309 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
310
311 #define GET_ELF_SYMBOLS(file, section, sym_count) \
312 (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count) \
313 : get_64bit_elf_symbols (file, section, sym_count))
314
315 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
316 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
317 already been called and verified that the string exists. */
318 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
319
320 #define REMOVE_ARCH_BITS(ADDR) \
321 do \
322 { \
323 if (filedata->file_header.e_machine == EM_ARM) \
324 (ADDR) &= ~1; \
325 } \
326 while (0)
327 \f
328 /* Print a BFD_VMA to an internal buffer, for use in error messages.
329 BFD_FMA_FMT can't be used in translated strings. */
330
331 static const char *
332 bfd_vmatoa (char *fmtch, bfd_vma value)
333 {
334 /* bfd_vmatoa is used more then once in a printf call for output.
335 Cycle through an array of buffers. */
336 static int buf_pos = 0;
337 static struct bfd_vmatoa_buf
338 {
339 char place[64];
340 } buf[4];
341 char *ret;
342 char fmt[32];
343
344 ret = buf[buf_pos++].place;
345 buf_pos %= ARRAY_SIZE (buf);
346
347 sprintf (fmt, "%%%s%s", BFD_VMA_FMT, fmtch);
348 snprintf (ret, sizeof (buf[0].place), fmt, value);
349 return ret;
350 }
351
352 /* Retrieve NMEMB structures, each SIZE bytes long from FILEDATA starting at
353 OFFSET + the offset of the current archive member, if we are examining an
354 archive. Put the retrieved data into VAR, if it is not NULL. Otherwise
355 allocate a buffer using malloc and fill that. In either case return the
356 pointer to the start of the retrieved data or NULL if something went wrong.
357 If something does go wrong and REASON is not NULL then emit an error
358 message using REASON as part of the context. */
359
360 static void *
361 get_data (void * var,
362 Filedata * filedata,
363 unsigned long offset,
364 bfd_size_type size,
365 bfd_size_type nmemb,
366 const char * reason)
367 {
368 void * mvar;
369 bfd_size_type amt = size * nmemb;
370
371 if (size == 0 || nmemb == 0)
372 return NULL;
373
374 /* If the size_t type is smaller than the bfd_size_type, eg because
375 you are building a 32-bit tool on a 64-bit host, then make sure
376 that when the sizes are cast to (size_t) no information is lost. */
377 if (sizeof (size_t) < sizeof (bfd_size_type)
378 && ( (bfd_size_type) ((size_t) size) != size
379 || (bfd_size_type) ((size_t) nmemb) != nmemb))
380 {
381 if (reason)
382 error (_("Size truncation prevents reading %s"
383 " elements of size %s for %s\n"),
384 bfd_vmatoa ("u", nmemb), bfd_vmatoa ("u", size), reason);
385 return NULL;
386 }
387
388 /* Check for size overflow. */
389 if (amt < nmemb)
390 {
391 if (reason)
392 error (_("Size overflow prevents reading %s"
393 " elements of size %s for %s\n"),
394 bfd_vmatoa ("u", nmemb), bfd_vmatoa ("u", size), reason);
395 return NULL;
396 }
397
398 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
399 attempting to allocate memory when the read is bound to fail. */
400 if (amt > filedata->file_size
401 || offset + archive_file_offset + amt > filedata->file_size)
402 {
403 if (reason)
404 error (_("Reading %s bytes extends past end of file for %s\n"),
405 bfd_vmatoa ("u", amt), reason);
406 return NULL;
407 }
408
409 if (fseek (filedata->handle, archive_file_offset + offset, SEEK_SET))
410 {
411 if (reason)
412 error (_("Unable to seek to 0x%lx for %s\n"),
413 archive_file_offset + offset, reason);
414 return NULL;
415 }
416
417 mvar = var;
418 if (mvar == NULL)
419 {
420 /* Check for overflow. */
421 if (nmemb < (~(bfd_size_type) 0 - 1) / size)
422 /* + 1 so that we can '\0' terminate invalid string table sections. */
423 mvar = malloc ((size_t) amt + 1);
424
425 if (mvar == NULL)
426 {
427 if (reason)
428 error (_("Out of memory allocating %s bytes for %s\n"),
429 bfd_vmatoa ("u", amt), reason);
430 return NULL;
431 }
432
433 ((char *) mvar)[amt] = '\0';
434 }
435
436 if (fread (mvar, (size_t) size, (size_t) nmemb, filedata->handle) != nmemb)
437 {
438 if (reason)
439 error (_("Unable to read in %s bytes of %s\n"),
440 bfd_vmatoa ("u", amt), reason);
441 if (mvar != var)
442 free (mvar);
443 return NULL;
444 }
445
446 return mvar;
447 }
448
449 /* Print a VMA value in the MODE specified.
450 Returns the number of characters displayed. */
451
452 static unsigned int
453 print_vma (bfd_vma vma, print_mode mode)
454 {
455 unsigned int nc = 0;
456
457 switch (mode)
458 {
459 case FULL_HEX:
460 nc = printf ("0x");
461 /* Fall through. */
462 case LONG_HEX:
463 #ifdef BFD64
464 if (is_32bit_elf)
465 return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
466 #endif
467 printf_vma (vma);
468 return nc + 16;
469
470 case DEC_5:
471 if (vma <= 99999)
472 return printf ("%5" BFD_VMA_FMT "d", vma);
473 /* Fall through. */
474 case PREFIX_HEX:
475 nc = printf ("0x");
476 /* Fall through. */
477 case HEX:
478 return nc + printf ("%" BFD_VMA_FMT "x", vma);
479
480 case DEC:
481 return printf ("%" BFD_VMA_FMT "d", vma);
482
483 case UNSIGNED:
484 return printf ("%" BFD_VMA_FMT "u", vma);
485
486 default:
487 /* FIXME: Report unrecognised mode ? */
488 return 0;
489 }
490 }
491
492 /* Display a symbol on stdout. Handles the display of control characters and
493 multibye characters (assuming the host environment supports them).
494
495 Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
496
497 If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
498 padding as necessary.
499
500 Returns the number of emitted characters. */
501
502 static unsigned int
503 print_symbol (signed int width, const char *symbol)
504 {
505 bfd_boolean extra_padding = FALSE;
506 signed int num_printed = 0;
507 #ifdef HAVE_MBSTATE_T
508 mbstate_t state;
509 #endif
510 unsigned int width_remaining;
511
512 if (width < 0)
513 {
514 /* Keep the width positive. This helps the code below. */
515 width = - width;
516 extra_padding = TRUE;
517 }
518 assert (width != 0);
519
520 if (do_wide)
521 /* Set the remaining width to a very large value.
522 This simplifies the code below. */
523 width_remaining = INT_MAX;
524 else
525 width_remaining = width;
526
527 #ifdef HAVE_MBSTATE_T
528 /* Initialise the multibyte conversion state. */
529 memset (& state, 0, sizeof (state));
530 #endif
531
532 while (width_remaining)
533 {
534 size_t n;
535 const char c = *symbol++;
536
537 if (c == 0)
538 break;
539
540 /* Do not print control characters directly as they can affect terminal
541 settings. Such characters usually appear in the names generated
542 by the assembler for local labels. */
543 if (ISCNTRL (c))
544 {
545 if (width_remaining < 2)
546 break;
547
548 printf ("^%c", c + 0x40);
549 width_remaining -= 2;
550 num_printed += 2;
551 }
552 else if (ISPRINT (c))
553 {
554 putchar (c);
555 width_remaining --;
556 num_printed ++;
557 }
558 else
559 {
560 #ifdef HAVE_MBSTATE_T
561 wchar_t w;
562 #endif
563 /* Let printf do the hard work of displaying multibyte characters. */
564 printf ("%.1s", symbol - 1);
565 width_remaining --;
566 num_printed ++;
567
568 #ifdef HAVE_MBSTATE_T
569 /* Try to find out how many bytes made up the character that was
570 just printed. Advance the symbol pointer past the bytes that
571 were displayed. */
572 n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
573 #else
574 n = 1;
575 #endif
576 if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
577 symbol += (n - 1);
578 }
579 }
580
581 if (extra_padding && num_printed < width)
582 {
583 /* Fill in the remaining spaces. */
584 printf ("%-*s", width - num_printed, " ");
585 num_printed = width;
586 }
587
588 return num_printed;
589 }
590
591 /* Returns a pointer to a static buffer containing a printable version of
592 the given section's name. Like print_symbol, except that it does not try
593 to print multibyte characters, it just interprets them as hex values. */
594
595 static const char *
596 printable_section_name (Filedata * filedata, const Elf_Internal_Shdr * sec)
597 {
598 #define MAX_PRINT_SEC_NAME_LEN 128
599 static char sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
600 const char * name = SECTION_NAME (sec);
601 char * buf = sec_name_buf;
602 char c;
603 unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
604
605 while ((c = * name ++) != 0)
606 {
607 if (ISCNTRL (c))
608 {
609 if (remaining < 2)
610 break;
611
612 * buf ++ = '^';
613 * buf ++ = c + 0x40;
614 remaining -= 2;
615 }
616 else if (ISPRINT (c))
617 {
618 * buf ++ = c;
619 remaining -= 1;
620 }
621 else
622 {
623 static char hex[17] = "0123456789ABCDEF";
624
625 if (remaining < 4)
626 break;
627 * buf ++ = '<';
628 * buf ++ = hex[(c & 0xf0) >> 4];
629 * buf ++ = hex[c & 0x0f];
630 * buf ++ = '>';
631 remaining -= 4;
632 }
633
634 if (remaining == 0)
635 break;
636 }
637
638 * buf = 0;
639 return sec_name_buf;
640 }
641
642 static const char *
643 printable_section_name_from_index (Filedata * filedata, unsigned long ndx)
644 {
645 if (ndx >= filedata->file_header.e_shnum)
646 return _("<corrupt>");
647
648 return printable_section_name (filedata, filedata->section_headers + ndx);
649 }
650
651 /* Return a pointer to section NAME, or NULL if no such section exists. */
652
653 static Elf_Internal_Shdr *
654 find_section (Filedata * filedata, const char * name)
655 {
656 unsigned int i;
657
658 if (filedata->section_headers == NULL)
659 return NULL;
660
661 for (i = 0; i < filedata->file_header.e_shnum; i++)
662 if (streq (SECTION_NAME (filedata->section_headers + i), name))
663 return filedata->section_headers + i;
664
665 return NULL;
666 }
667
668 /* Return a pointer to a section containing ADDR, or NULL if no such
669 section exists. */
670
671 static Elf_Internal_Shdr *
672 find_section_by_address (Filedata * filedata, bfd_vma addr)
673 {
674 unsigned int i;
675
676 if (filedata->section_headers == NULL)
677 return NULL;
678
679 for (i = 0; i < filedata->file_header.e_shnum; i++)
680 {
681 Elf_Internal_Shdr *sec = filedata->section_headers + i;
682
683 if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
684 return sec;
685 }
686
687 return NULL;
688 }
689
690 static Elf_Internal_Shdr *
691 find_section_by_type (Filedata * filedata, unsigned int type)
692 {
693 unsigned int i;
694
695 if (filedata->section_headers == NULL)
696 return NULL;
697
698 for (i = 0; i < filedata->file_header.e_shnum; i++)
699 {
700 Elf_Internal_Shdr *sec = filedata->section_headers + i;
701
702 if (sec->sh_type == type)
703 return sec;
704 }
705
706 return NULL;
707 }
708
709 /* Return a pointer to section NAME, or NULL if no such section exists,
710 restricted to the list of sections given in SET. */
711
712 static Elf_Internal_Shdr *
713 find_section_in_set (Filedata * filedata, const char * name, unsigned int * set)
714 {
715 unsigned int i;
716
717 if (filedata->section_headers == NULL)
718 return NULL;
719
720 if (set != NULL)
721 {
722 while ((i = *set++) > 0)
723 {
724 /* See PR 21156 for a reproducer. */
725 if (i >= filedata->file_header.e_shnum)
726 continue; /* FIXME: Should we issue an error message ? */
727
728 if (streq (SECTION_NAME (filedata->section_headers + i), name))
729 return filedata->section_headers + i;
730 }
731 }
732
733 return find_section (filedata, name);
734 }
735
736 /* Read an unsigned LEB128 encoded value from DATA.
737 Set *LENGTH_RETURN to the number of bytes read. */
738
739 static inline unsigned long
740 read_uleb128 (unsigned char * data,
741 unsigned int * length_return,
742 const unsigned char * const end)
743 {
744 return read_leb128 (data, length_return, FALSE, end);
745 }
746
747 /* Return TRUE if the current file is for IA-64 machine and OpenVMS ABI.
748 This OS has so many departures from the ELF standard that we test it at
749 many places. */
750
751 static inline bfd_boolean
752 is_ia64_vms (Filedata * filedata)
753 {
754 return filedata->file_header.e_machine == EM_IA_64
755 && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
756 }
757
758 /* Guess the relocation size commonly used by the specific machines. */
759
760 static bfd_boolean
761 guess_is_rela (unsigned int e_machine)
762 {
763 switch (e_machine)
764 {
765 /* Targets that use REL relocations. */
766 case EM_386:
767 case EM_IAMCU:
768 case EM_960:
769 case EM_ARM:
770 case EM_D10V:
771 case EM_CYGNUS_D10V:
772 case EM_DLX:
773 case EM_MIPS:
774 case EM_MIPS_RS3_LE:
775 case EM_CYGNUS_M32R:
776 case EM_SCORE:
777 case EM_XGATE:
778 return FALSE;
779
780 /* Targets that use RELA relocations. */
781 case EM_68K:
782 case EM_860:
783 case EM_AARCH64:
784 case EM_ADAPTEVA_EPIPHANY:
785 case EM_ALPHA:
786 case EM_ALTERA_NIOS2:
787 case EM_ARC:
788 case EM_ARC_COMPACT:
789 case EM_ARC_COMPACT2:
790 case EM_AVR:
791 case EM_AVR_OLD:
792 case EM_BLACKFIN:
793 case EM_CR16:
794 case EM_CRIS:
795 case EM_CRX:
796 case EM_D30V:
797 case EM_CYGNUS_D30V:
798 case EM_FR30:
799 case EM_FT32:
800 case EM_CYGNUS_FR30:
801 case EM_CYGNUS_FRV:
802 case EM_H8S:
803 case EM_H8_300:
804 case EM_H8_300H:
805 case EM_IA_64:
806 case EM_IP2K:
807 case EM_IP2K_OLD:
808 case EM_IQ2000:
809 case EM_LATTICEMICO32:
810 case EM_M32C_OLD:
811 case EM_M32C:
812 case EM_M32R:
813 case EM_MCORE:
814 case EM_CYGNUS_MEP:
815 case EM_METAG:
816 case EM_MMIX:
817 case EM_MN10200:
818 case EM_CYGNUS_MN10200:
819 case EM_MN10300:
820 case EM_CYGNUS_MN10300:
821 case EM_MOXIE:
822 case EM_MSP430:
823 case EM_MSP430_OLD:
824 case EM_MT:
825 case EM_NDS32:
826 case EM_NIOS32:
827 case EM_OR1K:
828 case EM_PPC64:
829 case EM_PPC:
830 case EM_TI_PRU:
831 case EM_RISCV:
832 case EM_RL78:
833 case EM_RX:
834 case EM_S390:
835 case EM_S390_OLD:
836 case EM_SH:
837 case EM_SPARC:
838 case EM_SPARC32PLUS:
839 case EM_SPARCV9:
840 case EM_SPU:
841 case EM_TI_C6000:
842 case EM_TILEGX:
843 case EM_TILEPRO:
844 case EM_V800:
845 case EM_V850:
846 case EM_CYGNUS_V850:
847 case EM_VAX:
848 case EM_VISIUM:
849 case EM_X86_64:
850 case EM_L1OM:
851 case EM_K1OM:
852 case EM_XSTORMY16:
853 case EM_XTENSA:
854 case EM_XTENSA_OLD:
855 case EM_MICROBLAZE:
856 case EM_MICROBLAZE_OLD:
857 case EM_WEBASSEMBLY:
858 return TRUE;
859
860 case EM_68HC05:
861 case EM_68HC08:
862 case EM_68HC11:
863 case EM_68HC16:
864 case EM_FX66:
865 case EM_ME16:
866 case EM_MMA:
867 case EM_NCPU:
868 case EM_NDR1:
869 case EM_PCP:
870 case EM_ST100:
871 case EM_ST19:
872 case EM_ST7:
873 case EM_ST9PLUS:
874 case EM_STARCORE:
875 case EM_SVX:
876 case EM_TINYJ:
877 default:
878 warn (_("Don't know about relocations on this machine architecture\n"));
879 return FALSE;
880 }
881 }
882
883 /* Load RELA type relocations from FILEDATA at REL_OFFSET extending for REL_SIZE bytes.
884 Returns TRUE upon success, FALSE otherwise. If successful then a
885 pointer to a malloc'ed buffer containing the relocs is placed in *RELASP,
886 and the number of relocs loaded is placed in *NRELASP. It is the caller's
887 responsibility to free the allocated buffer. */
888
889 static bfd_boolean
890 slurp_rela_relocs (Filedata * filedata,
891 unsigned long rel_offset,
892 unsigned long rel_size,
893 Elf_Internal_Rela ** relasp,
894 unsigned long * nrelasp)
895 {
896 Elf_Internal_Rela * relas;
897 size_t nrelas;
898 unsigned int i;
899
900 if (is_32bit_elf)
901 {
902 Elf32_External_Rela * erelas;
903
904 erelas = (Elf32_External_Rela *) get_data (NULL, filedata, rel_offset, 1,
905 rel_size, _("32-bit relocation data"));
906 if (!erelas)
907 return FALSE;
908
909 nrelas = rel_size / sizeof (Elf32_External_Rela);
910
911 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
912 sizeof (Elf_Internal_Rela));
913
914 if (relas == NULL)
915 {
916 free (erelas);
917 error (_("out of memory parsing relocs\n"));
918 return FALSE;
919 }
920
921 for (i = 0; i < nrelas; i++)
922 {
923 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
924 relas[i].r_info = BYTE_GET (erelas[i].r_info);
925 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
926 }
927
928 free (erelas);
929 }
930 else
931 {
932 Elf64_External_Rela * erelas;
933
934 erelas = (Elf64_External_Rela *) get_data (NULL, filedata, rel_offset, 1,
935 rel_size, _("64-bit relocation data"));
936 if (!erelas)
937 return FALSE;
938
939 nrelas = rel_size / sizeof (Elf64_External_Rela);
940
941 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
942 sizeof (Elf_Internal_Rela));
943
944 if (relas == NULL)
945 {
946 free (erelas);
947 error (_("out of memory parsing relocs\n"));
948 return FALSE;
949 }
950
951 for (i = 0; i < nrelas; i++)
952 {
953 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
954 relas[i].r_info = BYTE_GET (erelas[i].r_info);
955 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
956
957 /* The #ifdef BFD64 below is to prevent a compile time
958 warning. We know that if we do not have a 64 bit data
959 type that we will never execute this code anyway. */
960 #ifdef BFD64
961 if (filedata->file_header.e_machine == EM_MIPS
962 && filedata->file_header.e_ident[EI_DATA] != ELFDATA2MSB)
963 {
964 /* In little-endian objects, r_info isn't really a
965 64-bit little-endian value: it has a 32-bit
966 little-endian symbol index followed by four
967 individual byte fields. Reorder INFO
968 accordingly. */
969 bfd_vma inf = relas[i].r_info;
970 inf = (((inf & 0xffffffff) << 32)
971 | ((inf >> 56) & 0xff)
972 | ((inf >> 40) & 0xff00)
973 | ((inf >> 24) & 0xff0000)
974 | ((inf >> 8) & 0xff000000));
975 relas[i].r_info = inf;
976 }
977 #endif /* BFD64 */
978 }
979
980 free (erelas);
981 }
982
983 *relasp = relas;
984 *nrelasp = nrelas;
985 return TRUE;
986 }
987
988 /* Load REL type relocations from FILEDATA at REL_OFFSET extending for REL_SIZE bytes.
989 Returns TRUE upon success, FALSE otherwise. If successful then a
990 pointer to a malloc'ed buffer containing the relocs is placed in *RELSP,
991 and the number of relocs loaded is placed in *NRELSP. It is the caller's
992 responsibility to free the allocated buffer. */
993
994 static bfd_boolean
995 slurp_rel_relocs (Filedata * filedata,
996 unsigned long rel_offset,
997 unsigned long rel_size,
998 Elf_Internal_Rela ** relsp,
999 unsigned long * nrelsp)
1000 {
1001 Elf_Internal_Rela * rels;
1002 size_t nrels;
1003 unsigned int i;
1004
1005 if (is_32bit_elf)
1006 {
1007 Elf32_External_Rel * erels;
1008
1009 erels = (Elf32_External_Rel *) get_data (NULL, filedata, rel_offset, 1,
1010 rel_size, _("32-bit relocation data"));
1011 if (!erels)
1012 return FALSE;
1013
1014 nrels = rel_size / sizeof (Elf32_External_Rel);
1015
1016 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
1017
1018 if (rels == NULL)
1019 {
1020 free (erels);
1021 error (_("out of memory parsing relocs\n"));
1022 return FALSE;
1023 }
1024
1025 for (i = 0; i < nrels; i++)
1026 {
1027 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
1028 rels[i].r_info = BYTE_GET (erels[i].r_info);
1029 rels[i].r_addend = 0;
1030 }
1031
1032 free (erels);
1033 }
1034 else
1035 {
1036 Elf64_External_Rel * erels;
1037
1038 erels = (Elf64_External_Rel *) get_data (NULL, filedata, rel_offset, 1,
1039 rel_size, _("64-bit relocation data"));
1040 if (!erels)
1041 return FALSE;
1042
1043 nrels = rel_size / sizeof (Elf64_External_Rel);
1044
1045 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
1046
1047 if (rels == NULL)
1048 {
1049 free (erels);
1050 error (_("out of memory parsing relocs\n"));
1051 return FALSE;
1052 }
1053
1054 for (i = 0; i < nrels; i++)
1055 {
1056 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
1057 rels[i].r_info = BYTE_GET (erels[i].r_info);
1058 rels[i].r_addend = 0;
1059
1060 /* The #ifdef BFD64 below is to prevent a compile time
1061 warning. We know that if we do not have a 64 bit data
1062 type that we will never execute this code anyway. */
1063 #ifdef BFD64
1064 if (filedata->file_header.e_machine == EM_MIPS
1065 && filedata->file_header.e_ident[EI_DATA] != ELFDATA2MSB)
1066 {
1067 /* In little-endian objects, r_info isn't really a
1068 64-bit little-endian value: it has a 32-bit
1069 little-endian symbol index followed by four
1070 individual byte fields. Reorder INFO
1071 accordingly. */
1072 bfd_vma inf = rels[i].r_info;
1073 inf = (((inf & 0xffffffff) << 32)
1074 | ((inf >> 56) & 0xff)
1075 | ((inf >> 40) & 0xff00)
1076 | ((inf >> 24) & 0xff0000)
1077 | ((inf >> 8) & 0xff000000));
1078 rels[i].r_info = inf;
1079 }
1080 #endif /* BFD64 */
1081 }
1082
1083 free (erels);
1084 }
1085
1086 *relsp = rels;
1087 *nrelsp = nrels;
1088 return TRUE;
1089 }
1090
1091 /* Returns the reloc type extracted from the reloc info field. */
1092
1093 static unsigned int
1094 get_reloc_type (Filedata * filedata, bfd_vma reloc_info)
1095 {
1096 if (is_32bit_elf)
1097 return ELF32_R_TYPE (reloc_info);
1098
1099 switch (filedata->file_header.e_machine)
1100 {
1101 case EM_MIPS:
1102 /* Note: We assume that reloc_info has already been adjusted for us. */
1103 return ELF64_MIPS_R_TYPE (reloc_info);
1104
1105 case EM_SPARCV9:
1106 return ELF64_R_TYPE_ID (reloc_info);
1107
1108 default:
1109 return ELF64_R_TYPE (reloc_info);
1110 }
1111 }
1112
1113 /* Return the symbol index extracted from the reloc info field. */
1114
1115 static bfd_vma
1116 get_reloc_symindex (bfd_vma reloc_info)
1117 {
1118 return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
1119 }
1120
1121 static inline bfd_boolean
1122 uses_msp430x_relocs (Filedata * filedata)
1123 {
1124 return
1125 filedata->file_header.e_machine == EM_MSP430 /* Paranoia. */
1126 /* GCC uses osabi == ELFOSBI_STANDALONE. */
1127 && (((filedata->file_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
1128 /* TI compiler uses ELFOSABI_NONE. */
1129 || (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
1130 }
1131
1132 /* Display the contents of the relocation data found at the specified
1133 offset. */
1134
1135 static bfd_boolean
1136 dump_relocations (Filedata * filedata,
1137 unsigned long rel_offset,
1138 unsigned long rel_size,
1139 Elf_Internal_Sym * symtab,
1140 unsigned long nsyms,
1141 char * strtab,
1142 unsigned long strtablen,
1143 int is_rela,
1144 bfd_boolean is_dynsym)
1145 {
1146 unsigned long i;
1147 Elf_Internal_Rela * rels;
1148 bfd_boolean res = TRUE;
1149
1150 if (is_rela == UNKNOWN)
1151 is_rela = guess_is_rela (filedata->file_header.e_machine);
1152
1153 if (is_rela)
1154 {
1155 if (!slurp_rela_relocs (filedata, rel_offset, rel_size, &rels, &rel_size))
1156 return FALSE;
1157 }
1158 else
1159 {
1160 if (!slurp_rel_relocs (filedata, rel_offset, rel_size, &rels, &rel_size))
1161 return FALSE;
1162 }
1163
1164 if (is_32bit_elf)
1165 {
1166 if (is_rela)
1167 {
1168 if (do_wide)
1169 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
1170 else
1171 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
1172 }
1173 else
1174 {
1175 if (do_wide)
1176 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
1177 else
1178 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
1179 }
1180 }
1181 else
1182 {
1183 if (is_rela)
1184 {
1185 if (do_wide)
1186 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
1187 else
1188 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
1189 }
1190 else
1191 {
1192 if (do_wide)
1193 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
1194 else
1195 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
1196 }
1197 }
1198
1199 for (i = 0; i < rel_size; i++)
1200 {
1201 const char * rtype;
1202 bfd_vma offset;
1203 bfd_vma inf;
1204 bfd_vma symtab_index;
1205 bfd_vma type;
1206
1207 offset = rels[i].r_offset;
1208 inf = rels[i].r_info;
1209
1210 type = get_reloc_type (filedata, inf);
1211 symtab_index = get_reloc_symindex (inf);
1212
1213 if (is_32bit_elf)
1214 {
1215 printf ("%8.8lx %8.8lx ",
1216 (unsigned long) offset & 0xffffffff,
1217 (unsigned long) inf & 0xffffffff);
1218 }
1219 else
1220 {
1221 #if BFD_HOST_64BIT_LONG
1222 printf (do_wide
1223 ? "%16.16lx %16.16lx "
1224 : "%12.12lx %12.12lx ",
1225 offset, inf);
1226 #elif BFD_HOST_64BIT_LONG_LONG
1227 #ifndef __MSVCRT__
1228 printf (do_wide
1229 ? "%16.16llx %16.16llx "
1230 : "%12.12llx %12.12llx ",
1231 offset, inf);
1232 #else
1233 printf (do_wide
1234 ? "%16.16I64x %16.16I64x "
1235 : "%12.12I64x %12.12I64x ",
1236 offset, inf);
1237 #endif
1238 #else
1239 printf (do_wide
1240 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1241 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
1242 _bfd_int64_high (offset),
1243 _bfd_int64_low (offset),
1244 _bfd_int64_high (inf),
1245 _bfd_int64_low (inf));
1246 #endif
1247 }
1248
1249 switch (filedata->file_header.e_machine)
1250 {
1251 default:
1252 rtype = NULL;
1253 break;
1254
1255 case EM_AARCH64:
1256 rtype = elf_aarch64_reloc_type (type);
1257 break;
1258
1259 case EM_M32R:
1260 case EM_CYGNUS_M32R:
1261 rtype = elf_m32r_reloc_type (type);
1262 break;
1263
1264 case EM_386:
1265 case EM_IAMCU:
1266 rtype = elf_i386_reloc_type (type);
1267 break;
1268
1269 case EM_68HC11:
1270 case EM_68HC12:
1271 rtype = elf_m68hc11_reloc_type (type);
1272 break;
1273
1274 case EM_68K:
1275 rtype = elf_m68k_reloc_type (type);
1276 break;
1277
1278 case EM_960:
1279 rtype = elf_i960_reloc_type (type);
1280 break;
1281
1282 case EM_AVR:
1283 case EM_AVR_OLD:
1284 rtype = elf_avr_reloc_type (type);
1285 break;
1286
1287 case EM_OLD_SPARCV9:
1288 case EM_SPARC32PLUS:
1289 case EM_SPARCV9:
1290 case EM_SPARC:
1291 rtype = elf_sparc_reloc_type (type);
1292 break;
1293
1294 case EM_SPU:
1295 rtype = elf_spu_reloc_type (type);
1296 break;
1297
1298 case EM_V800:
1299 rtype = v800_reloc_type (type);
1300 break;
1301 case EM_V850:
1302 case EM_CYGNUS_V850:
1303 rtype = v850_reloc_type (type);
1304 break;
1305
1306 case EM_D10V:
1307 case EM_CYGNUS_D10V:
1308 rtype = elf_d10v_reloc_type (type);
1309 break;
1310
1311 case EM_D30V:
1312 case EM_CYGNUS_D30V:
1313 rtype = elf_d30v_reloc_type (type);
1314 break;
1315
1316 case EM_DLX:
1317 rtype = elf_dlx_reloc_type (type);
1318 break;
1319
1320 case EM_SH:
1321 rtype = elf_sh_reloc_type (type);
1322 break;
1323
1324 case EM_MN10300:
1325 case EM_CYGNUS_MN10300:
1326 rtype = elf_mn10300_reloc_type (type);
1327 break;
1328
1329 case EM_MN10200:
1330 case EM_CYGNUS_MN10200:
1331 rtype = elf_mn10200_reloc_type (type);
1332 break;
1333
1334 case EM_FR30:
1335 case EM_CYGNUS_FR30:
1336 rtype = elf_fr30_reloc_type (type);
1337 break;
1338
1339 case EM_CYGNUS_FRV:
1340 rtype = elf_frv_reloc_type (type);
1341 break;
1342
1343 case EM_FT32:
1344 rtype = elf_ft32_reloc_type (type);
1345 break;
1346
1347 case EM_MCORE:
1348 rtype = elf_mcore_reloc_type (type);
1349 break;
1350
1351 case EM_MMIX:
1352 rtype = elf_mmix_reloc_type (type);
1353 break;
1354
1355 case EM_MOXIE:
1356 rtype = elf_moxie_reloc_type (type);
1357 break;
1358
1359 case EM_MSP430:
1360 if (uses_msp430x_relocs (filedata))
1361 {
1362 rtype = elf_msp430x_reloc_type (type);
1363 break;
1364 }
1365 /* Fall through. */
1366 case EM_MSP430_OLD:
1367 rtype = elf_msp430_reloc_type (type);
1368 break;
1369
1370 case EM_NDS32:
1371 rtype = elf_nds32_reloc_type (type);
1372 break;
1373
1374 case EM_PPC:
1375 rtype = elf_ppc_reloc_type (type);
1376 break;
1377
1378 case EM_PPC64:
1379 rtype = elf_ppc64_reloc_type (type);
1380 break;
1381
1382 case EM_MIPS:
1383 case EM_MIPS_RS3_LE:
1384 rtype = elf_mips_reloc_type (type);
1385 break;
1386
1387 case EM_RISCV:
1388 rtype = elf_riscv_reloc_type (type);
1389 break;
1390
1391 case EM_ALPHA:
1392 rtype = elf_alpha_reloc_type (type);
1393 break;
1394
1395 case EM_ARM:
1396 rtype = elf_arm_reloc_type (type);
1397 break;
1398
1399 case EM_ARC:
1400 case EM_ARC_COMPACT:
1401 case EM_ARC_COMPACT2:
1402 rtype = elf_arc_reloc_type (type);
1403 break;
1404
1405 case EM_PARISC:
1406 rtype = elf_hppa_reloc_type (type);
1407 break;
1408
1409 case EM_H8_300:
1410 case EM_H8_300H:
1411 case EM_H8S:
1412 rtype = elf_h8_reloc_type (type);
1413 break;
1414
1415 case EM_OR1K:
1416 rtype = elf_or1k_reloc_type (type);
1417 break;
1418
1419 case EM_PJ:
1420 case EM_PJ_OLD:
1421 rtype = elf_pj_reloc_type (type);
1422 break;
1423 case EM_IA_64:
1424 rtype = elf_ia64_reloc_type (type);
1425 break;
1426
1427 case EM_CRIS:
1428 rtype = elf_cris_reloc_type (type);
1429 break;
1430
1431 case EM_860:
1432 rtype = elf_i860_reloc_type (type);
1433 break;
1434
1435 case EM_X86_64:
1436 case EM_L1OM:
1437 case EM_K1OM:
1438 rtype = elf_x86_64_reloc_type (type);
1439 break;
1440
1441 case EM_S370:
1442 rtype = i370_reloc_type (type);
1443 break;
1444
1445 case EM_S390_OLD:
1446 case EM_S390:
1447 rtype = elf_s390_reloc_type (type);
1448 break;
1449
1450 case EM_SCORE:
1451 rtype = elf_score_reloc_type (type);
1452 break;
1453
1454 case EM_XSTORMY16:
1455 rtype = elf_xstormy16_reloc_type (type);
1456 break;
1457
1458 case EM_CRX:
1459 rtype = elf_crx_reloc_type (type);
1460 break;
1461
1462 case EM_VAX:
1463 rtype = elf_vax_reloc_type (type);
1464 break;
1465
1466 case EM_VISIUM:
1467 rtype = elf_visium_reloc_type (type);
1468 break;
1469
1470 case EM_ADAPTEVA_EPIPHANY:
1471 rtype = elf_epiphany_reloc_type (type);
1472 break;
1473
1474 case EM_IP2K:
1475 case EM_IP2K_OLD:
1476 rtype = elf_ip2k_reloc_type (type);
1477 break;
1478
1479 case EM_IQ2000:
1480 rtype = elf_iq2000_reloc_type (type);
1481 break;
1482
1483 case EM_XTENSA_OLD:
1484 case EM_XTENSA:
1485 rtype = elf_xtensa_reloc_type (type);
1486 break;
1487
1488 case EM_LATTICEMICO32:
1489 rtype = elf_lm32_reloc_type (type);
1490 break;
1491
1492 case EM_M32C_OLD:
1493 case EM_M32C:
1494 rtype = elf_m32c_reloc_type (type);
1495 break;
1496
1497 case EM_MT:
1498 rtype = elf_mt_reloc_type (type);
1499 break;
1500
1501 case EM_BLACKFIN:
1502 rtype = elf_bfin_reloc_type (type);
1503 break;
1504
1505 case EM_CYGNUS_MEP:
1506 rtype = elf_mep_reloc_type (type);
1507 break;
1508
1509 case EM_CR16:
1510 rtype = elf_cr16_reloc_type (type);
1511 break;
1512
1513 case EM_MICROBLAZE:
1514 case EM_MICROBLAZE_OLD:
1515 rtype = elf_microblaze_reloc_type (type);
1516 break;
1517
1518 case EM_RL78:
1519 rtype = elf_rl78_reloc_type (type);
1520 break;
1521
1522 case EM_RX:
1523 rtype = elf_rx_reloc_type (type);
1524 break;
1525
1526 case EM_METAG:
1527 rtype = elf_metag_reloc_type (type);
1528 break;
1529
1530 case EM_XC16X:
1531 case EM_C166:
1532 rtype = elf_xc16x_reloc_type (type);
1533 break;
1534
1535 case EM_TI_C6000:
1536 rtype = elf_tic6x_reloc_type (type);
1537 break;
1538
1539 case EM_TILEGX:
1540 rtype = elf_tilegx_reloc_type (type);
1541 break;
1542
1543 case EM_TILEPRO:
1544 rtype = elf_tilepro_reloc_type (type);
1545 break;
1546
1547 case EM_WEBASSEMBLY:
1548 rtype = elf_wasm32_reloc_type (type);
1549 break;
1550
1551 case EM_XGATE:
1552 rtype = elf_xgate_reloc_type (type);
1553 break;
1554
1555 case EM_ALTERA_NIOS2:
1556 rtype = elf_nios2_reloc_type (type);
1557 break;
1558
1559 case EM_TI_PRU:
1560 rtype = elf_pru_reloc_type (type);
1561 break;
1562 }
1563
1564 if (rtype == NULL)
1565 printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1566 else
1567 printf (do_wide ? "%-22s" : "%-17.17s", rtype);
1568
1569 if (filedata->file_header.e_machine == EM_ALPHA
1570 && rtype != NULL
1571 && streq (rtype, "R_ALPHA_LITUSE")
1572 && is_rela)
1573 {
1574 switch (rels[i].r_addend)
1575 {
1576 case LITUSE_ALPHA_ADDR: rtype = "ADDR"; break;
1577 case LITUSE_ALPHA_BASE: rtype = "BASE"; break;
1578 case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1579 case LITUSE_ALPHA_JSR: rtype = "JSR"; break;
1580 case LITUSE_ALPHA_TLSGD: rtype = "TLSGD"; break;
1581 case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1582 case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1583 default: rtype = NULL;
1584 }
1585
1586 if (rtype)
1587 printf (" (%s)", rtype);
1588 else
1589 {
1590 putchar (' ');
1591 printf (_("<unknown addend: %lx>"),
1592 (unsigned long) rels[i].r_addend);
1593 res = FALSE;
1594 }
1595 }
1596 else if (symtab_index)
1597 {
1598 if (symtab == NULL || symtab_index >= nsyms)
1599 {
1600 error (_(" bad symbol index: %08lx in reloc"), (unsigned long) symtab_index);
1601 res = FALSE;
1602 }
1603 else
1604 {
1605 Elf_Internal_Sym * psym;
1606 const char * version_string;
1607 enum versioned_symbol_info sym_info;
1608 unsigned short vna_other;
1609
1610 psym = symtab + symtab_index;
1611
1612 version_string
1613 = get_symbol_version_string (filedata, is_dynsym,
1614 strtab, strtablen,
1615 symtab_index,
1616 psym,
1617 &sym_info,
1618 &vna_other);
1619
1620 printf (" ");
1621
1622 if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1623 {
1624 const char * name;
1625 unsigned int len;
1626 unsigned int width = is_32bit_elf ? 8 : 14;
1627
1628 /* Relocations against GNU_IFUNC symbols do not use the value
1629 of the symbol as the address to relocate against. Instead
1630 they invoke the function named by the symbol and use its
1631 result as the address for relocation.
1632
1633 To indicate this to the user, do not display the value of
1634 the symbol in the "Symbols's Value" field. Instead show
1635 its name followed by () as a hint that the symbol is
1636 invoked. */
1637
1638 if (strtab == NULL
1639 || psym->st_name == 0
1640 || psym->st_name >= strtablen)
1641 name = "??";
1642 else
1643 name = strtab + psym->st_name;
1644
1645 len = print_symbol (width, name);
1646 if (version_string)
1647 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1648 version_string);
1649 printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1650 }
1651 else
1652 {
1653 print_vma (psym->st_value, LONG_HEX);
1654
1655 printf (is_32bit_elf ? " " : " ");
1656 }
1657
1658 if (psym->st_name == 0)
1659 {
1660 const char * sec_name = "<null>";
1661 char name_buf[40];
1662
1663 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1664 {
1665 if (psym->st_shndx < filedata->file_header.e_shnum)
1666 sec_name = SECTION_NAME (filedata->section_headers + psym->st_shndx);
1667 else if (psym->st_shndx == SHN_ABS)
1668 sec_name = "ABS";
1669 else if (psym->st_shndx == SHN_COMMON)
1670 sec_name = "COMMON";
1671 else if ((filedata->file_header.e_machine == EM_MIPS
1672 && psym->st_shndx == SHN_MIPS_SCOMMON)
1673 || (filedata->file_header.e_machine == EM_TI_C6000
1674 && psym->st_shndx == SHN_TIC6X_SCOMMON))
1675 sec_name = "SCOMMON";
1676 else if (filedata->file_header.e_machine == EM_MIPS
1677 && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1678 sec_name = "SUNDEF";
1679 else if ((filedata->file_header.e_machine == EM_X86_64
1680 || filedata->file_header.e_machine == EM_L1OM
1681 || filedata->file_header.e_machine == EM_K1OM)
1682 && psym->st_shndx == SHN_X86_64_LCOMMON)
1683 sec_name = "LARGE_COMMON";
1684 else if (filedata->file_header.e_machine == EM_IA_64
1685 && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1686 && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1687 sec_name = "ANSI_COM";
1688 else if (is_ia64_vms (filedata)
1689 && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1690 sec_name = "VMS_SYMVEC";
1691 else
1692 {
1693 sprintf (name_buf, "<section 0x%x>",
1694 (unsigned int) psym->st_shndx);
1695 sec_name = name_buf;
1696 }
1697 }
1698 print_symbol (22, sec_name);
1699 }
1700 else if (strtab == NULL)
1701 printf (_("<string table index: %3ld>"), psym->st_name);
1702 else if (psym->st_name >= strtablen)
1703 {
1704 error (_("<corrupt string table index: %3ld>"), psym->st_name);
1705 res = FALSE;
1706 }
1707 else
1708 {
1709 print_symbol (22, strtab + psym->st_name);
1710 if (version_string)
1711 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1712 version_string);
1713 }
1714
1715 if (is_rela)
1716 {
1717 bfd_vma off = rels[i].r_addend;
1718
1719 if ((bfd_signed_vma) off < 0)
1720 printf (" - %" BFD_VMA_FMT "x", - off);
1721 else
1722 printf (" + %" BFD_VMA_FMT "x", off);
1723 }
1724 }
1725 }
1726 else if (is_rela)
1727 {
1728 bfd_vma off = rels[i].r_addend;
1729
1730 printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1731 if ((bfd_signed_vma) off < 0)
1732 printf ("-%" BFD_VMA_FMT "x", - off);
1733 else
1734 printf ("%" BFD_VMA_FMT "x", off);
1735 }
1736
1737 if (filedata->file_header.e_machine == EM_SPARCV9
1738 && rtype != NULL
1739 && streq (rtype, "R_SPARC_OLO10"))
1740 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1741
1742 putchar ('\n');
1743
1744 #ifdef BFD64
1745 if (! is_32bit_elf && filedata->file_header.e_machine == EM_MIPS)
1746 {
1747 bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1748 bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1749 const char * rtype2 = elf_mips_reloc_type (type2);
1750 const char * rtype3 = elf_mips_reloc_type (type3);
1751
1752 printf (" Type2: ");
1753
1754 if (rtype2 == NULL)
1755 printf (_("unrecognized: %-7lx"),
1756 (unsigned long) type2 & 0xffffffff);
1757 else
1758 printf ("%-17.17s", rtype2);
1759
1760 printf ("\n Type3: ");
1761
1762 if (rtype3 == NULL)
1763 printf (_("unrecognized: %-7lx"),
1764 (unsigned long) type3 & 0xffffffff);
1765 else
1766 printf ("%-17.17s", rtype3);
1767
1768 putchar ('\n');
1769 }
1770 #endif /* BFD64 */
1771 }
1772
1773 free (rels);
1774
1775 return res;
1776 }
1777
1778 static const char *
1779 get_mips_dynamic_type (unsigned long type)
1780 {
1781 switch (type)
1782 {
1783 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1784 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1785 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1786 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1787 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1788 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1789 case DT_MIPS_MSYM: return "MIPS_MSYM";
1790 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1791 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1792 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1793 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1794 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1795 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1796 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1797 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1798 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1799 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1800 case DT_MIPS_RLD_MAP_REL: return "MIPS_RLD_MAP_REL";
1801 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1802 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1803 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1804 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1805 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1806 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1807 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1808 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1809 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1810 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1811 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1812 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1813 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1814 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1815 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1816 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1817 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1818 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1819 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1820 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1821 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1822 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1823 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1824 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1825 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1826 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1827 case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1828 case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1829 default:
1830 return NULL;
1831 }
1832 }
1833
1834 static const char *
1835 get_sparc64_dynamic_type (unsigned long type)
1836 {
1837 switch (type)
1838 {
1839 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1840 default:
1841 return NULL;
1842 }
1843 }
1844
1845 static const char *
1846 get_ppc_dynamic_type (unsigned long type)
1847 {
1848 switch (type)
1849 {
1850 case DT_PPC_GOT: return "PPC_GOT";
1851 case DT_PPC_OPT: return "PPC_OPT";
1852 default:
1853 return NULL;
1854 }
1855 }
1856
1857 static const char *
1858 get_ppc64_dynamic_type (unsigned long type)
1859 {
1860 switch (type)
1861 {
1862 case DT_PPC64_GLINK: return "PPC64_GLINK";
1863 case DT_PPC64_OPD: return "PPC64_OPD";
1864 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
1865 case DT_PPC64_OPT: return "PPC64_OPT";
1866 default:
1867 return NULL;
1868 }
1869 }
1870
1871 static const char *
1872 get_parisc_dynamic_type (unsigned long type)
1873 {
1874 switch (type)
1875 {
1876 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1877 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1878 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1879 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1880 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1881 case DT_HP_PREINIT: return "HP_PREINIT";
1882 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1883 case DT_HP_NEEDED: return "HP_NEEDED";
1884 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1885 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1886 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1887 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1888 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1889 case DT_HP_EPLTREL: return "HP_GST_EPLTREL";
1890 case DT_HP_EPLTRELSZ: return "HP_GST_EPLTRELSZ";
1891 case DT_HP_FILTERED: return "HP_FILTERED";
1892 case DT_HP_FILTER_TLS: return "HP_FILTER_TLS";
1893 case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1894 case DT_HP_LAZYLOAD: return "HP_LAZYLOAD";
1895 case DT_HP_BIND_NOW_COUNT: return "HP_BIND_NOW_COUNT";
1896 case DT_PLT: return "PLT";
1897 case DT_PLT_SIZE: return "PLT_SIZE";
1898 case DT_DLT: return "DLT";
1899 case DT_DLT_SIZE: return "DLT_SIZE";
1900 default:
1901 return NULL;
1902 }
1903 }
1904
1905 static const char *
1906 get_ia64_dynamic_type (unsigned long type)
1907 {
1908 switch (type)
1909 {
1910 case DT_IA_64_PLT_RESERVE: return "IA_64_PLT_RESERVE";
1911 case DT_IA_64_VMS_SUBTYPE: return "VMS_SUBTYPE";
1912 case DT_IA_64_VMS_IMGIOCNT: return "VMS_IMGIOCNT";
1913 case DT_IA_64_VMS_LNKFLAGS: return "VMS_LNKFLAGS";
1914 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1915 case DT_IA_64_VMS_IDENT: return "VMS_IDENT";
1916 case DT_IA_64_VMS_NEEDED_IDENT: return "VMS_NEEDED_IDENT";
1917 case DT_IA_64_VMS_IMG_RELA_CNT: return "VMS_IMG_RELA_CNT";
1918 case DT_IA_64_VMS_SEG_RELA_CNT: return "VMS_SEG_RELA_CNT";
1919 case DT_IA_64_VMS_FIXUP_RELA_CNT: return "VMS_FIXUP_RELA_CNT";
1920 case DT_IA_64_VMS_FIXUP_NEEDED: return "VMS_FIXUP_NEEDED";
1921 case DT_IA_64_VMS_SYMVEC_CNT: return "VMS_SYMVEC_CNT";
1922 case DT_IA_64_VMS_XLATED: return "VMS_XLATED";
1923 case DT_IA_64_VMS_STACKSIZE: return "VMS_STACKSIZE";
1924 case DT_IA_64_VMS_UNWINDSZ: return "VMS_UNWINDSZ";
1925 case DT_IA_64_VMS_UNWIND_CODSEG: return "VMS_UNWIND_CODSEG";
1926 case DT_IA_64_VMS_UNWIND_INFOSEG: return "VMS_UNWIND_INFOSEG";
1927 case DT_IA_64_VMS_LINKTIME: return "VMS_LINKTIME";
1928 case DT_IA_64_VMS_SEG_NO: return "VMS_SEG_NO";
1929 case DT_IA_64_VMS_SYMVEC_OFFSET: return "VMS_SYMVEC_OFFSET";
1930 case DT_IA_64_VMS_SYMVEC_SEG: return "VMS_SYMVEC_SEG";
1931 case DT_IA_64_VMS_UNWIND_OFFSET: return "VMS_UNWIND_OFFSET";
1932 case DT_IA_64_VMS_UNWIND_SEG: return "VMS_UNWIND_SEG";
1933 case DT_IA_64_VMS_STRTAB_OFFSET: return "VMS_STRTAB_OFFSET";
1934 case DT_IA_64_VMS_SYSVER_OFFSET: return "VMS_SYSVER_OFFSET";
1935 case DT_IA_64_VMS_IMG_RELA_OFF: return "VMS_IMG_RELA_OFF";
1936 case DT_IA_64_VMS_SEG_RELA_OFF: return "VMS_SEG_RELA_OFF";
1937 case DT_IA_64_VMS_FIXUP_RELA_OFF: return "VMS_FIXUP_RELA_OFF";
1938 case DT_IA_64_VMS_PLTGOT_OFFSET: return "VMS_PLTGOT_OFFSET";
1939 case DT_IA_64_VMS_PLTGOT_SEG: return "VMS_PLTGOT_SEG";
1940 case DT_IA_64_VMS_FPMODE: return "VMS_FPMODE";
1941 default:
1942 return NULL;
1943 }
1944 }
1945
1946 static const char *
1947 get_solaris_section_type (unsigned long type)
1948 {
1949 switch (type)
1950 {
1951 case 0x6fffffee: return "SUNW_ancillary";
1952 case 0x6fffffef: return "SUNW_capchain";
1953 case 0x6ffffff0: return "SUNW_capinfo";
1954 case 0x6ffffff1: return "SUNW_symsort";
1955 case 0x6ffffff2: return "SUNW_tlssort";
1956 case 0x6ffffff3: return "SUNW_LDYNSYM";
1957 case 0x6ffffff4: return "SUNW_dof";
1958 case 0x6ffffff5: return "SUNW_cap";
1959 case 0x6ffffff6: return "SUNW_SIGNATURE";
1960 case 0x6ffffff7: return "SUNW_ANNOTATE";
1961 case 0x6ffffff8: return "SUNW_DEBUGSTR";
1962 case 0x6ffffff9: return "SUNW_DEBUG";
1963 case 0x6ffffffa: return "SUNW_move";
1964 case 0x6ffffffb: return "SUNW_COMDAT";
1965 case 0x6ffffffc: return "SUNW_syminfo";
1966 case 0x6ffffffd: return "SUNW_verdef";
1967 case 0x6ffffffe: return "SUNW_verneed";
1968 case 0x6fffffff: return "SUNW_versym";
1969 case 0x70000000: return "SPARC_GOTDATA";
1970 default: return NULL;
1971 }
1972 }
1973
1974 static const char *
1975 get_alpha_dynamic_type (unsigned long type)
1976 {
1977 switch (type)
1978 {
1979 case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1980 default: return NULL;
1981 }
1982 }
1983
1984 static const char *
1985 get_score_dynamic_type (unsigned long type)
1986 {
1987 switch (type)
1988 {
1989 case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1990 case DT_SCORE_LOCAL_GOTNO: return "SCORE_LOCAL_GOTNO";
1991 case DT_SCORE_SYMTABNO: return "SCORE_SYMTABNO";
1992 case DT_SCORE_GOTSYM: return "SCORE_GOTSYM";
1993 case DT_SCORE_UNREFEXTNO: return "SCORE_UNREFEXTNO";
1994 case DT_SCORE_HIPAGENO: return "SCORE_HIPAGENO";
1995 default: return NULL;
1996 }
1997 }
1998
1999 static const char *
2000 get_tic6x_dynamic_type (unsigned long type)
2001 {
2002 switch (type)
2003 {
2004 case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
2005 case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
2006 case DT_C6000_DSBT_BASE: return "C6000_DSBT_BASE";
2007 case DT_C6000_DSBT_SIZE: return "C6000_DSBT_SIZE";
2008 case DT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
2009 case DT_C6000_DSBT_INDEX: return "C6000_DSBT_INDEX";
2010 default: return NULL;
2011 }
2012 }
2013
2014 static const char *
2015 get_nios2_dynamic_type (unsigned long type)
2016 {
2017 switch (type)
2018 {
2019 case DT_NIOS2_GP: return "NIOS2_GP";
2020 default: return NULL;
2021 }
2022 }
2023
2024 static const char *
2025 get_solaris_dynamic_type (unsigned long type)
2026 {
2027 switch (type)
2028 {
2029 case 0x6000000d: return "SUNW_AUXILIARY";
2030 case 0x6000000e: return "SUNW_RTLDINF";
2031 case 0x6000000f: return "SUNW_FILTER";
2032 case 0x60000010: return "SUNW_CAP";
2033 case 0x60000011: return "SUNW_SYMTAB";
2034 case 0x60000012: return "SUNW_SYMSZ";
2035 case 0x60000013: return "SUNW_SORTENT";
2036 case 0x60000014: return "SUNW_SYMSORT";
2037 case 0x60000015: return "SUNW_SYMSORTSZ";
2038 case 0x60000016: return "SUNW_TLSSORT";
2039 case 0x60000017: return "SUNW_TLSSORTSZ";
2040 case 0x60000018: return "SUNW_CAPINFO";
2041 case 0x60000019: return "SUNW_STRPAD";
2042 case 0x6000001a: return "SUNW_CAPCHAIN";
2043 case 0x6000001b: return "SUNW_LDMACH";
2044 case 0x6000001d: return "SUNW_CAPCHAINENT";
2045 case 0x6000001f: return "SUNW_CAPCHAINSZ";
2046 case 0x60000021: return "SUNW_PARENT";
2047 case 0x60000023: return "SUNW_ASLR";
2048 case 0x60000025: return "SUNW_RELAX";
2049 case 0x60000029: return "SUNW_NXHEAP";
2050 case 0x6000002b: return "SUNW_NXSTACK";
2051
2052 case 0x70000001: return "SPARC_REGISTER";
2053 case 0x7ffffffd: return "AUXILIARY";
2054 case 0x7ffffffe: return "USED";
2055 case 0x7fffffff: return "FILTER";
2056
2057 default: return NULL;
2058 }
2059 }
2060
2061 static const char *
2062 get_dynamic_type (Filedata * filedata, unsigned long type)
2063 {
2064 static char buff[64];
2065
2066 switch (type)
2067 {
2068 case DT_NULL: return "NULL";
2069 case DT_NEEDED: return "NEEDED";
2070 case DT_PLTRELSZ: return "PLTRELSZ";
2071 case DT_PLTGOT: return "PLTGOT";
2072 case DT_HASH: return "HASH";
2073 case DT_STRTAB: return "STRTAB";
2074 case DT_SYMTAB: return "SYMTAB";
2075 case DT_RELA: return "RELA";
2076 case DT_RELASZ: return "RELASZ";
2077 case DT_RELAENT: return "RELAENT";
2078 case DT_STRSZ: return "STRSZ";
2079 case DT_SYMENT: return "SYMENT";
2080 case DT_INIT: return "INIT";
2081 case DT_FINI: return "FINI";
2082 case DT_SONAME: return "SONAME";
2083 case DT_RPATH: return "RPATH";
2084 case DT_SYMBOLIC: return "SYMBOLIC";
2085 case DT_REL: return "REL";
2086 case DT_RELSZ: return "RELSZ";
2087 case DT_RELENT: return "RELENT";
2088 case DT_PLTREL: return "PLTREL";
2089 case DT_DEBUG: return "DEBUG";
2090 case DT_TEXTREL: return "TEXTREL";
2091 case DT_JMPREL: return "JMPREL";
2092 case DT_BIND_NOW: return "BIND_NOW";
2093 case DT_INIT_ARRAY: return "INIT_ARRAY";
2094 case DT_FINI_ARRAY: return "FINI_ARRAY";
2095 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
2096 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
2097 case DT_RUNPATH: return "RUNPATH";
2098 case DT_FLAGS: return "FLAGS";
2099
2100 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2101 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
2102 case DT_SYMTAB_SHNDX: return "SYMTAB_SHNDX";
2103
2104 case DT_CHECKSUM: return "CHECKSUM";
2105 case DT_PLTPADSZ: return "PLTPADSZ";
2106 case DT_MOVEENT: return "MOVEENT";
2107 case DT_MOVESZ: return "MOVESZ";
2108 case DT_FEATURE: return "FEATURE";
2109 case DT_POSFLAG_1: return "POSFLAG_1";
2110 case DT_SYMINSZ: return "SYMINSZ";
2111 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
2112
2113 case DT_ADDRRNGLO: return "ADDRRNGLO";
2114 case DT_CONFIG: return "CONFIG";
2115 case DT_DEPAUDIT: return "DEPAUDIT";
2116 case DT_AUDIT: return "AUDIT";
2117 case DT_PLTPAD: return "PLTPAD";
2118 case DT_MOVETAB: return "MOVETAB";
2119 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
2120
2121 case DT_VERSYM: return "VERSYM";
2122
2123 case DT_TLSDESC_GOT: return "TLSDESC_GOT";
2124 case DT_TLSDESC_PLT: return "TLSDESC_PLT";
2125 case DT_RELACOUNT: return "RELACOUNT";
2126 case DT_RELCOUNT: return "RELCOUNT";
2127 case DT_FLAGS_1: return "FLAGS_1";
2128 case DT_VERDEF: return "VERDEF";
2129 case DT_VERDEFNUM: return "VERDEFNUM";
2130 case DT_VERNEED: return "VERNEED";
2131 case DT_VERNEEDNUM: return "VERNEEDNUM";
2132
2133 case DT_AUXILIARY: return "AUXILIARY";
2134 case DT_USED: return "USED";
2135 case DT_FILTER: return "FILTER";
2136
2137 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
2138 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
2139 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
2140 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
2141 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
2142 case DT_GNU_HASH: return "GNU_HASH";
2143
2144 default:
2145 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
2146 {
2147 const char * result;
2148
2149 switch (filedata->file_header.e_machine)
2150 {
2151 case EM_MIPS:
2152 case EM_MIPS_RS3_LE:
2153 result = get_mips_dynamic_type (type);
2154 break;
2155 case EM_SPARCV9:
2156 result = get_sparc64_dynamic_type (type);
2157 break;
2158 case EM_PPC:
2159 result = get_ppc_dynamic_type (type);
2160 break;
2161 case EM_PPC64:
2162 result = get_ppc64_dynamic_type (type);
2163 break;
2164 case EM_IA_64:
2165 result = get_ia64_dynamic_type (type);
2166 break;
2167 case EM_ALPHA:
2168 result = get_alpha_dynamic_type (type);
2169 break;
2170 case EM_SCORE:
2171 result = get_score_dynamic_type (type);
2172 break;
2173 case EM_TI_C6000:
2174 result = get_tic6x_dynamic_type (type);
2175 break;
2176 case EM_ALTERA_NIOS2:
2177 result = get_nios2_dynamic_type (type);
2178 break;
2179 default:
2180 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2181 result = get_solaris_dynamic_type (type);
2182 else
2183 result = NULL;
2184 break;
2185 }
2186
2187 if (result != NULL)
2188 return result;
2189
2190 snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
2191 }
2192 else if (((type >= DT_LOOS) && (type <= DT_HIOS))
2193 || (filedata->file_header.e_machine == EM_PARISC
2194 && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
2195 {
2196 const char * result;
2197
2198 switch (filedata->file_header.e_machine)
2199 {
2200 case EM_PARISC:
2201 result = get_parisc_dynamic_type (type);
2202 break;
2203 case EM_IA_64:
2204 result = get_ia64_dynamic_type (type);
2205 break;
2206 default:
2207 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2208 result = get_solaris_dynamic_type (type);
2209 else
2210 result = NULL;
2211 break;
2212 }
2213
2214 if (result != NULL)
2215 return result;
2216
2217 snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2218 type);
2219 }
2220 else
2221 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
2222
2223 return buff;
2224 }
2225 }
2226
2227 static char *
2228 get_file_type (unsigned e_type)
2229 {
2230 static char buff[32];
2231
2232 switch (e_type)
2233 {
2234 case ET_NONE: return _("NONE (None)");
2235 case ET_REL: return _("REL (Relocatable file)");
2236 case ET_EXEC: return _("EXEC (Executable file)");
2237 case ET_DYN: return _("DYN (Shared object file)");
2238 case ET_CORE: return _("CORE (Core file)");
2239
2240 default:
2241 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
2242 snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
2243 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
2244 snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
2245 else
2246 snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
2247 return buff;
2248 }
2249 }
2250
2251 static char *
2252 get_machine_name (unsigned e_machine)
2253 {
2254 static char buff[64]; /* XXX */
2255
2256 switch (e_machine)
2257 {
2258 /* Please keep this switch table sorted by increasing EM_ value. */
2259 /* 0 */
2260 case EM_NONE: return _("None");
2261 case EM_M32: return "WE32100";
2262 case EM_SPARC: return "Sparc";
2263 case EM_386: return "Intel 80386";
2264 case EM_68K: return "MC68000";
2265 case EM_88K: return "MC88000";
2266 case EM_IAMCU: return "Intel MCU";
2267 case EM_860: return "Intel 80860";
2268 case EM_MIPS: return "MIPS R3000";
2269 case EM_S370: return "IBM System/370";
2270 /* 10 */
2271 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
2272 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
2273 case EM_PARISC: return "HPPA";
2274 case EM_VPP550: return "Fujitsu VPP500";
2275 case EM_SPARC32PLUS: return "Sparc v8+" ;
2276 case EM_960: return "Intel 90860";
2277 case EM_PPC: return "PowerPC";
2278 /* 20 */
2279 case EM_PPC64: return "PowerPC64";
2280 case EM_S390_OLD:
2281 case EM_S390: return "IBM S/390";
2282 case EM_SPU: return "SPU";
2283 /* 30 */
2284 case EM_V800: return "Renesas V850 (using RH850 ABI)";
2285 case EM_FR20: return "Fujitsu FR20";
2286 case EM_RH32: return "TRW RH32";
2287 case EM_MCORE: return "MCORE";
2288 /* 40 */
2289 case EM_ARM: return "ARM";
2290 case EM_OLD_ALPHA: return "Digital Alpha (old)";
2291 case EM_SH: return "Renesas / SuperH SH";
2292 case EM_SPARCV9: return "Sparc v9";
2293 case EM_TRICORE: return "Siemens Tricore";
2294 case EM_ARC: return "ARC";
2295 case EM_H8_300: return "Renesas H8/300";
2296 case EM_H8_300H: return "Renesas H8/300H";
2297 case EM_H8S: return "Renesas H8S";
2298 case EM_H8_500: return "Renesas H8/500";
2299 /* 50 */
2300 case EM_IA_64: return "Intel IA-64";
2301 case EM_MIPS_X: return "Stanford MIPS-X";
2302 case EM_COLDFIRE: return "Motorola Coldfire";
2303 case EM_68HC12: return "Motorola MC68HC12 Microcontroller";
2304 case EM_MMA: return "Fujitsu Multimedia Accelerator";
2305 case EM_PCP: return "Siemens PCP";
2306 case EM_NCPU: return "Sony nCPU embedded RISC processor";
2307 case EM_NDR1: return "Denso NDR1 microprocesspr";
2308 case EM_STARCORE: return "Motorola Star*Core processor";
2309 case EM_ME16: return "Toyota ME16 processor";
2310 /* 60 */
2311 case EM_ST100: return "STMicroelectronics ST100 processor";
2312 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
2313 case EM_X86_64: return "Advanced Micro Devices X86-64";
2314 case EM_PDSP: return "Sony DSP processor";
2315 case EM_PDP10: return "Digital Equipment Corp. PDP-10";
2316 case EM_PDP11: return "Digital Equipment Corp. PDP-11";
2317 case EM_FX66: return "Siemens FX66 microcontroller";
2318 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2319 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
2320 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
2321 /* 70 */
2322 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
2323 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
2324 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
2325 case EM_SVX: return "Silicon Graphics SVx";
2326 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
2327 case EM_VAX: return "Digital VAX";
2328 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
2329 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
2330 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
2331 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
2332 /* 80 */
2333 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
2334 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
2335 case EM_PRISM: return "Vitesse Prism";
2336 case EM_AVR_OLD:
2337 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
2338 case EM_CYGNUS_FR30:
2339 case EM_FR30: return "Fujitsu FR30";
2340 case EM_CYGNUS_D10V:
2341 case EM_D10V: return "d10v";
2342 case EM_CYGNUS_D30V:
2343 case EM_D30V: return "d30v";
2344 case EM_CYGNUS_V850:
2345 case EM_V850: return "Renesas V850";
2346 case EM_CYGNUS_M32R:
2347 case EM_M32R: return "Renesas M32R (formerly Mitsubishi M32r)";
2348 case EM_CYGNUS_MN10300:
2349 case EM_MN10300: return "mn10300";
2350 /* 90 */
2351 case EM_CYGNUS_MN10200:
2352 case EM_MN10200: return "mn10200";
2353 case EM_PJ: return "picoJava";
2354 case EM_OR1K: return "OpenRISC 1000";
2355 case EM_ARC_COMPACT: return "ARCompact";
2356 case EM_XTENSA_OLD:
2357 case EM_XTENSA: return "Tensilica Xtensa Processor";
2358 case EM_VIDEOCORE: return "Alphamosaic VideoCore processor";
2359 case EM_TMM_GPP: return "Thompson Multimedia General Purpose Processor";
2360 case EM_NS32K: return "National Semiconductor 32000 series";
2361 case EM_TPC: return "Tenor Network TPC processor";
2362 case EM_SNP1K: return "Trebia SNP 1000 processor";
2363 /* 100 */
2364 case EM_ST200: return "STMicroelectronics ST200 microcontroller";
2365 case EM_IP2K_OLD:
2366 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
2367 case EM_MAX: return "MAX Processor";
2368 case EM_CR: return "National Semiconductor CompactRISC";
2369 case EM_F2MC16: return "Fujitsu F2MC16";
2370 case EM_MSP430: return "Texas Instruments msp430 microcontroller";
2371 case EM_BLACKFIN: return "Analog Devices Blackfin";
2372 case EM_SE_C33: return "S1C33 Family of Seiko Epson processors";
2373 case EM_SEP: return "Sharp embedded microprocessor";
2374 case EM_ARCA: return "Arca RISC microprocessor";
2375 /* 110 */
2376 case EM_UNICORE: return "Unicore";
2377 case EM_EXCESS: return "eXcess 16/32/64-bit configurable embedded CPU";
2378 case EM_DXP: return "Icera Semiconductor Inc. Deep Execution Processor";
2379 case EM_ALTERA_NIOS2: return "Altera Nios II";
2380 case EM_CRX: return "National Semiconductor CRX microprocessor";
2381 case EM_XGATE: return "Motorola XGATE embedded processor";
2382 case EM_C166:
2383 case EM_XC16X: return "Infineon Technologies xc16x";
2384 case EM_M16C: return "Renesas M16C series microprocessors";
2385 case EM_DSPIC30F: return "Microchip Technology dsPIC30F Digital Signal Controller";
2386 case EM_CE: return "Freescale Communication Engine RISC core";
2387 /* 120 */
2388 case EM_M32C: return "Renesas M32c";
2389 /* 130 */
2390 case EM_TSK3000: return "Altium TSK3000 core";
2391 case EM_RS08: return "Freescale RS08 embedded processor";
2392 case EM_ECOG2: return "Cyan Technology eCOG2 microprocessor";
2393 case EM_SCORE: return "SUNPLUS S+Core";
2394 case EM_DSP24: return "New Japan Radio (NJR) 24-bit DSP Processor";
2395 case EM_VIDEOCORE3: return "Broadcom VideoCore III processor";
2396 case EM_LATTICEMICO32: return "Lattice Mico32";
2397 case EM_SE_C17: return "Seiko Epson C17 family";
2398 /* 140 */
2399 case EM_TI_C6000: return "Texas Instruments TMS320C6000 DSP family";
2400 case EM_TI_C2000: return "Texas Instruments TMS320C2000 DSP family";
2401 case EM_TI_C5500: return "Texas Instruments TMS320C55x DSP family";
2402 case EM_TI_PRU: return "TI PRU I/O processor";
2403 /* 160 */
2404 case EM_MMDSP_PLUS: return "STMicroelectronics 64bit VLIW Data Signal Processor";
2405 case EM_CYPRESS_M8C: return "Cypress M8C microprocessor";
2406 case EM_R32C: return "Renesas R32C series microprocessors";
2407 case EM_TRIMEDIA: return "NXP Semiconductors TriMedia architecture family";
2408 case EM_QDSP6: return "QUALCOMM DSP6 Processor";
2409 case EM_8051: return "Intel 8051 and variants";
2410 case EM_STXP7X: return "STMicroelectronics STxP7x family";
2411 case EM_NDS32: return "Andes Technology compact code size embedded RISC processor family";
2412 case EM_ECOG1X: return "Cyan Technology eCOG1X family";
2413 case EM_MAXQ30: return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2414 /* 170 */
2415 case EM_XIMO16: return "New Japan Radio (NJR) 16-bit DSP Processor";
2416 case EM_MANIK: return "M2000 Reconfigurable RISC Microprocessor";
2417 case EM_CRAYNV2: return "Cray Inc. NV2 vector architecture";
2418 case EM_RX: return "Renesas RX";
2419 case EM_METAG: return "Imagination Technologies Meta processor architecture";
2420 case EM_MCST_ELBRUS: return "MCST Elbrus general purpose hardware architecture";
2421 case EM_ECOG16: return "Cyan Technology eCOG16 family";
2422 case EM_CR16:
2423 case EM_MICROBLAZE:
2424 case EM_MICROBLAZE_OLD: return "Xilinx MicroBlaze";
2425 case EM_ETPU: return "Freescale Extended Time Processing Unit";
2426 case EM_SLE9X: return "Infineon Technologies SLE9X core";
2427 /* 180 */
2428 case EM_L1OM: return "Intel L1OM";
2429 case EM_K1OM: return "Intel K1OM";
2430 case EM_INTEL182: return "Intel (reserved)";
2431 case EM_AARCH64: return "AArch64";
2432 case EM_ARM184: return "ARM (reserved)";
2433 case EM_AVR32: return "Atmel Corporation 32-bit microprocessor";
2434 case EM_STM8: return "STMicroeletronics STM8 8-bit microcontroller";
2435 case EM_TILE64: return "Tilera TILE64 multicore architecture family";
2436 case EM_TILEPRO: return "Tilera TILEPro multicore architecture family";
2437 /* 190 */
2438 case EM_CUDA: return "NVIDIA CUDA architecture";
2439 case EM_TILEGX: return "Tilera TILE-Gx multicore architecture family";
2440 case EM_CLOUDSHIELD: return "CloudShield architecture family";
2441 case EM_COREA_1ST: return "KIPO-KAIST Core-A 1st generation processor family";
2442 case EM_COREA_2ND: return "KIPO-KAIST Core-A 2nd generation processor family";
2443 case EM_ARC_COMPACT2: return "ARCv2";
2444 case EM_OPEN8: return "Open8 8-bit RISC soft processor core";
2445 case EM_RL78: return "Renesas RL78";
2446 case EM_VIDEOCORE5: return "Broadcom VideoCore V processor";
2447 case EM_78K0R: return "Renesas 78K0R";
2448 /* 200 */
2449 case EM_56800EX: return "Freescale 56800EX Digital Signal Controller (DSC)";
2450 case EM_BA1: return "Beyond BA1 CPU architecture";
2451 case EM_BA2: return "Beyond BA2 CPU architecture";
2452 case EM_XCORE: return "XMOS xCORE processor family";
2453 case EM_MCHP_PIC: return "Microchip 8-bit PIC(r) family";
2454 /* 210 */
2455 case EM_KM32: return "KM211 KM32 32-bit processor";
2456 case EM_KMX32: return "KM211 KMX32 32-bit processor";
2457 case EM_KMX16: return "KM211 KMX16 16-bit processor";
2458 case EM_KMX8: return "KM211 KMX8 8-bit processor";
2459 case EM_KVARC: return "KM211 KVARC processor";
2460 case EM_CDP: return "Paneve CDP architecture family";
2461 case EM_COGE: return "Cognitive Smart Memory Processor";
2462 case EM_COOL: return "Bluechip Systems CoolEngine";
2463 case EM_NORC: return "Nanoradio Optimized RISC";
2464 case EM_CSR_KALIMBA: return "CSR Kalimba architecture family";
2465 /* 220 */
2466 case EM_Z80: return "Zilog Z80";
2467 case EM_VISIUM: return "CDS VISIUMcore processor";
2468 case EM_FT32: return "FTDI Chip FT32";
2469 case EM_MOXIE: return "Moxie";
2470 case EM_AMDGPU: return "AMD GPU";
2471 case EM_RISCV: return "RISC-V";
2472 case EM_LANAI: return "Lanai 32-bit processor";
2473 case EM_BPF: return "Linux BPF";
2474
2475 /* Large numbers... */
2476 case EM_MT: return "Morpho Techologies MT processor";
2477 case EM_ALPHA: return "Alpha";
2478 case EM_WEBASSEMBLY: return "Web Assembly";
2479 case EM_DLX: return "OpenDLX";
2480 case EM_XSTORMY16: return "Sanyo XStormy16 CPU core";
2481 case EM_IQ2000: return "Vitesse IQ2000";
2482 case EM_M32C_OLD:
2483 case EM_NIOS32: return "Altera Nios";
2484 case EM_CYGNUS_MEP: return "Toshiba MeP Media Engine";
2485 case EM_ADAPTEVA_EPIPHANY: return "Adapteva EPIPHANY";
2486 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
2487
2488 default:
2489 snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2490 return buff;
2491 }
2492 }
2493
2494 static void
2495 decode_ARC_machine_flags (unsigned e_flags, unsigned e_machine, char buf[])
2496 {
2497 /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2. Some
2498 other compilers don't a specific architecture type in the e_flags, and
2499 instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
2500 architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
2501 architectures.
2502
2503 Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
2504 but also sets a specific architecture type in the e_flags field.
2505
2506 However, when decoding the flags we don't worry if we see an
2507 unexpected pairing, for example EM_ARC_COMPACT machine type, with
2508 ARCEM architecture type. */
2509
2510 switch (e_flags & EF_ARC_MACH_MSK)
2511 {
2512 /* We only expect these to occur for EM_ARC_COMPACT2. */
2513 case EF_ARC_CPU_ARCV2EM:
2514 strcat (buf, ", ARC EM");
2515 break;
2516 case EF_ARC_CPU_ARCV2HS:
2517 strcat (buf, ", ARC HS");
2518 break;
2519
2520 /* We only expect these to occur for EM_ARC_COMPACT. */
2521 case E_ARC_MACH_ARC600:
2522 strcat (buf, ", ARC600");
2523 break;
2524 case E_ARC_MACH_ARC601:
2525 strcat (buf, ", ARC601");
2526 break;
2527 case E_ARC_MACH_ARC700:
2528 strcat (buf, ", ARC700");
2529 break;
2530
2531 /* The only times we should end up here are (a) A corrupt ELF, (b) A
2532 new ELF with new architecture being read by an old version of
2533 readelf, or (c) An ELF built with non-GNU compiler that does not
2534 set the architecture in the e_flags. */
2535 default:
2536 if (e_machine == EM_ARC_COMPACT)
2537 strcat (buf, ", Unknown ARCompact");
2538 else
2539 strcat (buf, ", Unknown ARC");
2540 break;
2541 }
2542
2543 switch (e_flags & EF_ARC_OSABI_MSK)
2544 {
2545 case E_ARC_OSABI_ORIG:
2546 strcat (buf, ", (ABI:legacy)");
2547 break;
2548 case E_ARC_OSABI_V2:
2549 strcat (buf, ", (ABI:v2)");
2550 break;
2551 /* Only upstream 3.9+ kernels will support ARCv2 ISA. */
2552 case E_ARC_OSABI_V3:
2553 strcat (buf, ", v3 no-legacy-syscalls ABI");
2554 break;
2555 case E_ARC_OSABI_V4:
2556 strcat (buf, ", v4 ABI");
2557 break;
2558 default:
2559 strcat (buf, ", unrecognised ARC OSABI flag");
2560 break;
2561 }
2562 }
2563
2564 static void
2565 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2566 {
2567 unsigned eabi;
2568 bfd_boolean unknown = FALSE;
2569
2570 eabi = EF_ARM_EABI_VERSION (e_flags);
2571 e_flags &= ~ EF_ARM_EABIMASK;
2572
2573 /* Handle "generic" ARM flags. */
2574 if (e_flags & EF_ARM_RELEXEC)
2575 {
2576 strcat (buf, ", relocatable executable");
2577 e_flags &= ~ EF_ARM_RELEXEC;
2578 }
2579
2580 /* Now handle EABI specific flags. */
2581 switch (eabi)
2582 {
2583 default:
2584 strcat (buf, ", <unrecognized EABI>");
2585 if (e_flags)
2586 unknown = TRUE;
2587 break;
2588
2589 case EF_ARM_EABI_VER1:
2590 strcat (buf, ", Version1 EABI");
2591 while (e_flags)
2592 {
2593 unsigned flag;
2594
2595 /* Process flags one bit at a time. */
2596 flag = e_flags & - e_flags;
2597 e_flags &= ~ flag;
2598
2599 switch (flag)
2600 {
2601 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2602 strcat (buf, ", sorted symbol tables");
2603 break;
2604
2605 default:
2606 unknown = TRUE;
2607 break;
2608 }
2609 }
2610 break;
2611
2612 case EF_ARM_EABI_VER2:
2613 strcat (buf, ", Version2 EABI");
2614 while (e_flags)
2615 {
2616 unsigned flag;
2617
2618 /* Process flags one bit at a time. */
2619 flag = e_flags & - e_flags;
2620 e_flags &= ~ flag;
2621
2622 switch (flag)
2623 {
2624 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2625 strcat (buf, ", sorted symbol tables");
2626 break;
2627
2628 case EF_ARM_DYNSYMSUSESEGIDX:
2629 strcat (buf, ", dynamic symbols use segment index");
2630 break;
2631
2632 case EF_ARM_MAPSYMSFIRST:
2633 strcat (buf, ", mapping symbols precede others");
2634 break;
2635
2636 default:
2637 unknown = TRUE;
2638 break;
2639 }
2640 }
2641 break;
2642
2643 case EF_ARM_EABI_VER3:
2644 strcat (buf, ", Version3 EABI");
2645 break;
2646
2647 case EF_ARM_EABI_VER4:
2648 strcat (buf, ", Version4 EABI");
2649 while (e_flags)
2650 {
2651 unsigned flag;
2652
2653 /* Process flags one bit at a time. */
2654 flag = e_flags & - e_flags;
2655 e_flags &= ~ flag;
2656
2657 switch (flag)
2658 {
2659 case EF_ARM_BE8:
2660 strcat (buf, ", BE8");
2661 break;
2662
2663 case EF_ARM_LE8:
2664 strcat (buf, ", LE8");
2665 break;
2666
2667 default:
2668 unknown = TRUE;
2669 break;
2670 }
2671 }
2672 break;
2673
2674 case EF_ARM_EABI_VER5:
2675 strcat (buf, ", Version5 EABI");
2676 while (e_flags)
2677 {
2678 unsigned flag;
2679
2680 /* Process flags one bit at a time. */
2681 flag = e_flags & - e_flags;
2682 e_flags &= ~ flag;
2683
2684 switch (flag)
2685 {
2686 case EF_ARM_BE8:
2687 strcat (buf, ", BE8");
2688 break;
2689
2690 case EF_ARM_LE8:
2691 strcat (buf, ", LE8");
2692 break;
2693
2694 case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT. */
2695 strcat (buf, ", soft-float ABI");
2696 break;
2697
2698 case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT. */
2699 strcat (buf, ", hard-float ABI");
2700 break;
2701
2702 default:
2703 unknown = TRUE;
2704 break;
2705 }
2706 }
2707 break;
2708
2709 case EF_ARM_EABI_UNKNOWN:
2710 strcat (buf, ", GNU EABI");
2711 while (e_flags)
2712 {
2713 unsigned flag;
2714
2715 /* Process flags one bit at a time. */
2716 flag = e_flags & - e_flags;
2717 e_flags &= ~ flag;
2718
2719 switch (flag)
2720 {
2721 case EF_ARM_INTERWORK:
2722 strcat (buf, ", interworking enabled");
2723 break;
2724
2725 case EF_ARM_APCS_26:
2726 strcat (buf, ", uses APCS/26");
2727 break;
2728
2729 case EF_ARM_APCS_FLOAT:
2730 strcat (buf, ", uses APCS/float");
2731 break;
2732
2733 case EF_ARM_PIC:
2734 strcat (buf, ", position independent");
2735 break;
2736
2737 case EF_ARM_ALIGN8:
2738 strcat (buf, ", 8 bit structure alignment");
2739 break;
2740
2741 case EF_ARM_NEW_ABI:
2742 strcat (buf, ", uses new ABI");
2743 break;
2744
2745 case EF_ARM_OLD_ABI:
2746 strcat (buf, ", uses old ABI");
2747 break;
2748
2749 case EF_ARM_SOFT_FLOAT:
2750 strcat (buf, ", software FP");
2751 break;
2752
2753 case EF_ARM_VFP_FLOAT:
2754 strcat (buf, ", VFP");
2755 break;
2756
2757 case EF_ARM_MAVERICK_FLOAT:
2758 strcat (buf, ", Maverick FP");
2759 break;
2760
2761 default:
2762 unknown = TRUE;
2763 break;
2764 }
2765 }
2766 }
2767
2768 if (unknown)
2769 strcat (buf,_(", <unknown>"));
2770 }
2771
2772 static void
2773 decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2774 {
2775 --size; /* Leave space for null terminator. */
2776
2777 switch (e_flags & EF_AVR_MACH)
2778 {
2779 case E_AVR_MACH_AVR1:
2780 strncat (buf, ", avr:1", size);
2781 break;
2782 case E_AVR_MACH_AVR2:
2783 strncat (buf, ", avr:2", size);
2784 break;
2785 case E_AVR_MACH_AVR25:
2786 strncat (buf, ", avr:25", size);
2787 break;
2788 case E_AVR_MACH_AVR3:
2789 strncat (buf, ", avr:3", size);
2790 break;
2791 case E_AVR_MACH_AVR31:
2792 strncat (buf, ", avr:31", size);
2793 break;
2794 case E_AVR_MACH_AVR35:
2795 strncat (buf, ", avr:35", size);
2796 break;
2797 case E_AVR_MACH_AVR4:
2798 strncat (buf, ", avr:4", size);
2799 break;
2800 case E_AVR_MACH_AVR5:
2801 strncat (buf, ", avr:5", size);
2802 break;
2803 case E_AVR_MACH_AVR51:
2804 strncat (buf, ", avr:51", size);
2805 break;
2806 case E_AVR_MACH_AVR6:
2807 strncat (buf, ", avr:6", size);
2808 break;
2809 case E_AVR_MACH_AVRTINY:
2810 strncat (buf, ", avr:100", size);
2811 break;
2812 case E_AVR_MACH_XMEGA1:
2813 strncat (buf, ", avr:101", size);
2814 break;
2815 case E_AVR_MACH_XMEGA2:
2816 strncat (buf, ", avr:102", size);
2817 break;
2818 case E_AVR_MACH_XMEGA3:
2819 strncat (buf, ", avr:103", size);
2820 break;
2821 case E_AVR_MACH_XMEGA4:
2822 strncat (buf, ", avr:104", size);
2823 break;
2824 case E_AVR_MACH_XMEGA5:
2825 strncat (buf, ", avr:105", size);
2826 break;
2827 case E_AVR_MACH_XMEGA6:
2828 strncat (buf, ", avr:106", size);
2829 break;
2830 case E_AVR_MACH_XMEGA7:
2831 strncat (buf, ", avr:107", size);
2832 break;
2833 default:
2834 strncat (buf, ", avr:<unknown>", size);
2835 break;
2836 }
2837
2838 size -= strlen (buf);
2839 if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2840 strncat (buf, ", link-relax", size);
2841 }
2842
2843 static void
2844 decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2845 {
2846 unsigned abi;
2847 unsigned arch;
2848 unsigned config;
2849 unsigned version;
2850 bfd_boolean has_fpu = FALSE;
2851 unsigned int r = 0;
2852
2853 static const char *ABI_STRINGS[] =
2854 {
2855 "ABI v0", /* use r5 as return register; only used in N1213HC */
2856 "ABI v1", /* use r0 as return register */
2857 "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2858 "ABI v2fp", /* for FPU */
2859 "AABI",
2860 "ABI2 FP+"
2861 };
2862 static const char *VER_STRINGS[] =
2863 {
2864 "Andes ELF V1.3 or older",
2865 "Andes ELF V1.3.1",
2866 "Andes ELF V1.4"
2867 };
2868 static const char *ARCH_STRINGS[] =
2869 {
2870 "",
2871 "Andes Star v1.0",
2872 "Andes Star v2.0",
2873 "Andes Star v3.0",
2874 "Andes Star v3.0m"
2875 };
2876
2877 abi = EF_NDS_ABI & e_flags;
2878 arch = EF_NDS_ARCH & e_flags;
2879 config = EF_NDS_INST & e_flags;
2880 version = EF_NDS32_ELF_VERSION & e_flags;
2881
2882 memset (buf, 0, size);
2883
2884 switch (abi)
2885 {
2886 case E_NDS_ABI_V0:
2887 case E_NDS_ABI_V1:
2888 case E_NDS_ABI_V2:
2889 case E_NDS_ABI_V2FP:
2890 case E_NDS_ABI_AABI:
2891 case E_NDS_ABI_V2FP_PLUS:
2892 /* In case there are holes in the array. */
2893 r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2894 break;
2895
2896 default:
2897 r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2898 break;
2899 }
2900
2901 switch (version)
2902 {
2903 case E_NDS32_ELF_VER_1_2:
2904 case E_NDS32_ELF_VER_1_3:
2905 case E_NDS32_ELF_VER_1_4:
2906 r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2907 break;
2908
2909 default:
2910 r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2911 break;
2912 }
2913
2914 if (E_NDS_ABI_V0 == abi)
2915 {
2916 /* OLD ABI; only used in N1213HC, has performance extension 1. */
2917 r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2918 if (arch == E_NDS_ARCH_STAR_V1_0)
2919 r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2920 return;
2921 }
2922
2923 switch (arch)
2924 {
2925 case E_NDS_ARCH_STAR_V1_0:
2926 case E_NDS_ARCH_STAR_V2_0:
2927 case E_NDS_ARCH_STAR_V3_0:
2928 case E_NDS_ARCH_STAR_V3_M:
2929 r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2930 break;
2931
2932 default:
2933 r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2934 /* ARCH version determines how the e_flags are interpreted.
2935 If it is unknown, we cannot proceed. */
2936 return;
2937 }
2938
2939 /* Newer ABI; Now handle architecture specific flags. */
2940 if (arch == E_NDS_ARCH_STAR_V1_0)
2941 {
2942 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2943 r += snprintf (buf + r, size -r, ", MFUSR_PC");
2944
2945 if (!(config & E_NDS32_HAS_NO_MAC_INST))
2946 r += snprintf (buf + r, size -r, ", MAC");
2947
2948 if (config & E_NDS32_HAS_DIV_INST)
2949 r += snprintf (buf + r, size -r, ", DIV");
2950
2951 if (config & E_NDS32_HAS_16BIT_INST)
2952 r += snprintf (buf + r, size -r, ", 16b");
2953 }
2954 else
2955 {
2956 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2957 {
2958 if (version <= E_NDS32_ELF_VER_1_3)
2959 r += snprintf (buf + r, size -r, ", [B8]");
2960 else
2961 r += snprintf (buf + r, size -r, ", EX9");
2962 }
2963
2964 if (config & E_NDS32_HAS_MAC_DX_INST)
2965 r += snprintf (buf + r, size -r, ", MAC_DX");
2966
2967 if (config & E_NDS32_HAS_DIV_DX_INST)
2968 r += snprintf (buf + r, size -r, ", DIV_DX");
2969
2970 if (config & E_NDS32_HAS_16BIT_INST)
2971 {
2972 if (version <= E_NDS32_ELF_VER_1_3)
2973 r += snprintf (buf + r, size -r, ", 16b");
2974 else
2975 r += snprintf (buf + r, size -r, ", IFC");
2976 }
2977 }
2978
2979 if (config & E_NDS32_HAS_EXT_INST)
2980 r += snprintf (buf + r, size -r, ", PERF1");
2981
2982 if (config & E_NDS32_HAS_EXT2_INST)
2983 r += snprintf (buf + r, size -r, ", PERF2");
2984
2985 if (config & E_NDS32_HAS_FPU_INST)
2986 {
2987 has_fpu = TRUE;
2988 r += snprintf (buf + r, size -r, ", FPU_SP");
2989 }
2990
2991 if (config & E_NDS32_HAS_FPU_DP_INST)
2992 {
2993 has_fpu = TRUE;
2994 r += snprintf (buf + r, size -r, ", FPU_DP");
2995 }
2996
2997 if (config & E_NDS32_HAS_FPU_MAC_INST)
2998 {
2999 has_fpu = TRUE;
3000 r += snprintf (buf + r, size -r, ", FPU_MAC");
3001 }
3002
3003 if (has_fpu)
3004 {
3005 switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
3006 {
3007 case E_NDS32_FPU_REG_8SP_4DP:
3008 r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
3009 break;
3010 case E_NDS32_FPU_REG_16SP_8DP:
3011 r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
3012 break;
3013 case E_NDS32_FPU_REG_32SP_16DP:
3014 r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
3015 break;
3016 case E_NDS32_FPU_REG_32SP_32DP:
3017 r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
3018 break;
3019 }
3020 }
3021
3022 if (config & E_NDS32_HAS_AUDIO_INST)
3023 r += snprintf (buf + r, size -r, ", AUDIO");
3024
3025 if (config & E_NDS32_HAS_STRING_INST)
3026 r += snprintf (buf + r, size -r, ", STR");
3027
3028 if (config & E_NDS32_HAS_REDUCED_REGS)
3029 r += snprintf (buf + r, size -r, ", 16REG");
3030
3031 if (config & E_NDS32_HAS_VIDEO_INST)
3032 {
3033 if (version <= E_NDS32_ELF_VER_1_3)
3034 r += snprintf (buf + r, size -r, ", VIDEO");
3035 else
3036 r += snprintf (buf + r, size -r, ", SATURATION");
3037 }
3038
3039 if (config & E_NDS32_HAS_ENCRIPT_INST)
3040 r += snprintf (buf + r, size -r, ", ENCRP");
3041
3042 if (config & E_NDS32_HAS_L2C_INST)
3043 r += snprintf (buf + r, size -r, ", L2C");
3044 }
3045
3046 static char *
3047 get_machine_flags (Filedata * filedata, unsigned e_flags, unsigned e_machine)
3048 {
3049 static char buf[1024];
3050
3051 buf[0] = '\0';
3052
3053 if (e_flags)
3054 {
3055 switch (e_machine)
3056 {
3057 default:
3058 break;
3059
3060 case EM_ARC_COMPACT2:
3061 case EM_ARC_COMPACT:
3062 decode_ARC_machine_flags (e_flags, e_machine, buf);
3063 break;
3064
3065 case EM_ARM:
3066 decode_ARM_machine_flags (e_flags, buf);
3067 break;
3068
3069 case EM_AVR:
3070 decode_AVR_machine_flags (e_flags, buf, sizeof buf);
3071 break;
3072
3073 case EM_BLACKFIN:
3074 if (e_flags & EF_BFIN_PIC)
3075 strcat (buf, ", PIC");
3076
3077 if (e_flags & EF_BFIN_FDPIC)
3078 strcat (buf, ", FDPIC");
3079
3080 if (e_flags & EF_BFIN_CODE_IN_L1)
3081 strcat (buf, ", code in L1");
3082
3083 if (e_flags & EF_BFIN_DATA_IN_L1)
3084 strcat (buf, ", data in L1");
3085
3086 break;
3087
3088 case EM_CYGNUS_FRV:
3089 switch (e_flags & EF_FRV_CPU_MASK)
3090 {
3091 case EF_FRV_CPU_GENERIC:
3092 break;
3093
3094 default:
3095 strcat (buf, ", fr???");
3096 break;
3097
3098 case EF_FRV_CPU_FR300:
3099 strcat (buf, ", fr300");
3100 break;
3101
3102 case EF_FRV_CPU_FR400:
3103 strcat (buf, ", fr400");
3104 break;
3105 case EF_FRV_CPU_FR405:
3106 strcat (buf, ", fr405");
3107 break;
3108
3109 case EF_FRV_CPU_FR450:
3110 strcat (buf, ", fr450");
3111 break;
3112
3113 case EF_FRV_CPU_FR500:
3114 strcat (buf, ", fr500");
3115 break;
3116 case EF_FRV_CPU_FR550:
3117 strcat (buf, ", fr550");
3118 break;
3119
3120 case EF_FRV_CPU_SIMPLE:
3121 strcat (buf, ", simple");
3122 break;
3123 case EF_FRV_CPU_TOMCAT:
3124 strcat (buf, ", tomcat");
3125 break;
3126 }
3127 break;
3128
3129 case EM_68K:
3130 if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
3131 strcat (buf, ", m68000");
3132 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
3133 strcat (buf, ", cpu32");
3134 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
3135 strcat (buf, ", fido_a");
3136 else
3137 {
3138 char const * isa = _("unknown");
3139 char const * mac = _("unknown mac");
3140 char const * additional = NULL;
3141
3142 switch (e_flags & EF_M68K_CF_ISA_MASK)
3143 {
3144 case EF_M68K_CF_ISA_A_NODIV:
3145 isa = "A";
3146 additional = ", nodiv";
3147 break;
3148 case EF_M68K_CF_ISA_A:
3149 isa = "A";
3150 break;
3151 case EF_M68K_CF_ISA_A_PLUS:
3152 isa = "A+";
3153 break;
3154 case EF_M68K_CF_ISA_B_NOUSP:
3155 isa = "B";
3156 additional = ", nousp";
3157 break;
3158 case EF_M68K_CF_ISA_B:
3159 isa = "B";
3160 break;
3161 case EF_M68K_CF_ISA_C:
3162 isa = "C";
3163 break;
3164 case EF_M68K_CF_ISA_C_NODIV:
3165 isa = "C";
3166 additional = ", nodiv";
3167 break;
3168 }
3169 strcat (buf, ", cf, isa ");
3170 strcat (buf, isa);
3171 if (additional)
3172 strcat (buf, additional);
3173 if (e_flags & EF_M68K_CF_FLOAT)
3174 strcat (buf, ", float");
3175 switch (e_flags & EF_M68K_CF_MAC_MASK)
3176 {
3177 case 0:
3178 mac = NULL;
3179 break;
3180 case EF_M68K_CF_MAC:
3181 mac = "mac";
3182 break;
3183 case EF_M68K_CF_EMAC:
3184 mac = "emac";
3185 break;
3186 case EF_M68K_CF_EMAC_B:
3187 mac = "emac_b";
3188 break;
3189 }
3190 if (mac)
3191 {
3192 strcat (buf, ", ");
3193 strcat (buf, mac);
3194 }
3195 }
3196 break;
3197
3198 case EM_CYGNUS_MEP:
3199 switch (e_flags & EF_MEP_CPU_MASK)
3200 {
3201 case EF_MEP_CPU_MEP: strcat (buf, ", generic MeP"); break;
3202 case EF_MEP_CPU_C2: strcat (buf, ", MeP C2"); break;
3203 case EF_MEP_CPU_C3: strcat (buf, ", MeP C3"); break;
3204 case EF_MEP_CPU_C4: strcat (buf, ", MeP C4"); break;
3205 case EF_MEP_CPU_C5: strcat (buf, ", MeP C5"); break;
3206 case EF_MEP_CPU_H1: strcat (buf, ", MeP H1"); break;
3207 default: strcat (buf, _(", <unknown MeP cpu type>")); break;
3208 }
3209
3210 switch (e_flags & EF_MEP_COP_MASK)
3211 {
3212 case EF_MEP_COP_NONE: break;
3213 case EF_MEP_COP_AVC: strcat (buf, ", AVC coprocessor"); break;
3214 case EF_MEP_COP_AVC2: strcat (buf, ", AVC2 coprocessor"); break;
3215 case EF_MEP_COP_FMAX: strcat (buf, ", FMAX coprocessor"); break;
3216 case EF_MEP_COP_IVC2: strcat (buf, ", IVC2 coprocessor"); break;
3217 default: strcat (buf, _("<unknown MeP copro type>")); break;
3218 }
3219
3220 if (e_flags & EF_MEP_LIBRARY)
3221 strcat (buf, ", Built for Library");
3222
3223 if (e_flags & EF_MEP_INDEX_MASK)
3224 sprintf (buf + strlen (buf), ", Configuration Index: %#x",
3225 e_flags & EF_MEP_INDEX_MASK);
3226
3227 if (e_flags & ~ EF_MEP_ALL_FLAGS)
3228 sprintf (buf + strlen (buf), _(", unknown flags bits: %#x"),
3229 e_flags & ~ EF_MEP_ALL_FLAGS);
3230 break;
3231
3232 case EM_PPC:
3233 if (e_flags & EF_PPC_EMB)
3234 strcat (buf, ", emb");
3235
3236 if (e_flags & EF_PPC_RELOCATABLE)
3237 strcat (buf, _(", relocatable"));
3238
3239 if (e_flags & EF_PPC_RELOCATABLE_LIB)
3240 strcat (buf, _(", relocatable-lib"));
3241 break;
3242
3243 case EM_PPC64:
3244 if (e_flags & EF_PPC64_ABI)
3245 {
3246 char abi[] = ", abiv0";
3247
3248 abi[6] += e_flags & EF_PPC64_ABI;
3249 strcat (buf, abi);
3250 }
3251 break;
3252
3253 case EM_V800:
3254 if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
3255 strcat (buf, ", RH850 ABI");
3256
3257 if (e_flags & EF_V800_850E3)
3258 strcat (buf, ", V3 architecture");
3259
3260 if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
3261 strcat (buf, ", FPU not used");
3262
3263 if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
3264 strcat (buf, ", regmode: COMMON");
3265
3266 if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
3267 strcat (buf, ", r4 not used");
3268
3269 if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
3270 strcat (buf, ", r30 not used");
3271
3272 if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
3273 strcat (buf, ", r5 not used");
3274
3275 if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
3276 strcat (buf, ", r2 not used");
3277
3278 for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
3279 {
3280 switch (e_flags & - e_flags)
3281 {
3282 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
3283 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
3284 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
3285 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
3286 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
3287 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
3288 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
3289 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
3290 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
3291 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
3292 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
3293 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
3294 default: break;
3295 }
3296 }
3297 break;
3298
3299 case EM_V850:
3300 case EM_CYGNUS_V850:
3301 switch (e_flags & EF_V850_ARCH)
3302 {
3303 case E_V850E3V5_ARCH:
3304 strcat (buf, ", v850e3v5");
3305 break;
3306 case E_V850E2V3_ARCH:
3307 strcat (buf, ", v850e2v3");
3308 break;
3309 case E_V850E2_ARCH:
3310 strcat (buf, ", v850e2");
3311 break;
3312 case E_V850E1_ARCH:
3313 strcat (buf, ", v850e1");
3314 break;
3315 case E_V850E_ARCH:
3316 strcat (buf, ", v850e");
3317 break;
3318 case E_V850_ARCH:
3319 strcat (buf, ", v850");
3320 break;
3321 default:
3322 strcat (buf, _(", unknown v850 architecture variant"));
3323 break;
3324 }
3325 break;
3326
3327 case EM_M32R:
3328 case EM_CYGNUS_M32R:
3329 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3330 strcat (buf, ", m32r");
3331 break;
3332
3333 case EM_MIPS:
3334 case EM_MIPS_RS3_LE:
3335 if (e_flags & EF_MIPS_NOREORDER)
3336 strcat (buf, ", noreorder");
3337
3338 if (e_flags & EF_MIPS_PIC)
3339 strcat (buf, ", pic");
3340
3341 if (e_flags & EF_MIPS_CPIC)
3342 strcat (buf, ", cpic");
3343
3344 if (e_flags & EF_MIPS_UCODE)
3345 strcat (buf, ", ugen_reserved");
3346
3347 if (e_flags & EF_MIPS_ABI2)
3348 strcat (buf, ", abi2");
3349
3350 if (e_flags & EF_MIPS_OPTIONS_FIRST)
3351 strcat (buf, ", odk first");
3352
3353 if (e_flags & EF_MIPS_32BITMODE)
3354 strcat (buf, ", 32bitmode");
3355
3356 if (e_flags & EF_MIPS_NAN2008)
3357 strcat (buf, ", nan2008");
3358
3359 if (e_flags & EF_MIPS_FP64)
3360 strcat (buf, ", fp64");
3361
3362 switch ((e_flags & EF_MIPS_MACH))
3363 {
3364 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3365 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3366 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
3367 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
3368 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3369 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3370 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3371 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
3372 case E_MIPS_MACH_5900: strcat (buf, ", 5900"); break;
3373 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
3374 case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
3375 case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3376 case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
3377 case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
3378 case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
3379 case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
3380 case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
3381 case E_MIPS_MACH_XLR: strcat (buf, ", xlr"); break;
3382 case E_MIPS_MACH_IAMR2: strcat (buf, ", interaptiv-mr2"); break;
3383 case 0:
3384 /* We simply ignore the field in this case to avoid confusion:
3385 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3386 extension. */
3387 break;
3388 default: strcat (buf, _(", unknown CPU")); break;
3389 }
3390
3391 switch ((e_flags & EF_MIPS_ABI))
3392 {
3393 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3394 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3395 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3396 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3397 case 0:
3398 /* We simply ignore the field in this case to avoid confusion:
3399 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3400 This means it is likely to be an o32 file, but not for
3401 sure. */
3402 break;
3403 default: strcat (buf, _(", unknown ABI")); break;
3404 }
3405
3406 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3407 strcat (buf, ", mdmx");
3408
3409 if (e_flags & EF_MIPS_ARCH_ASE_M16)
3410 strcat (buf, ", mips16");
3411
3412 if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3413 strcat (buf, ", micromips");
3414
3415 switch ((e_flags & EF_MIPS_ARCH))
3416 {
3417 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3418 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3419 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3420 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3421 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3422 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
3423 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
3424 case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
3425 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
3426 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
3427 case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
3428 default: strcat (buf, _(", unknown ISA")); break;
3429 }
3430 break;
3431
3432 case EM_NDS32:
3433 decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3434 break;
3435
3436 case EM_RISCV:
3437 if (e_flags & EF_RISCV_RVC)
3438 strcat (buf, ", RVC");
3439
3440 switch (e_flags & EF_RISCV_FLOAT_ABI)
3441 {
3442 case EF_RISCV_FLOAT_ABI_SOFT:
3443 strcat (buf, ", soft-float ABI");
3444 break;
3445
3446 case EF_RISCV_FLOAT_ABI_SINGLE:
3447 strcat (buf, ", single-float ABI");
3448 break;
3449
3450 case EF_RISCV_FLOAT_ABI_DOUBLE:
3451 strcat (buf, ", double-float ABI");
3452 break;
3453
3454 case EF_RISCV_FLOAT_ABI_QUAD:
3455 strcat (buf, ", quad-float ABI");
3456 break;
3457 }
3458 break;
3459
3460 case EM_SH:
3461 switch ((e_flags & EF_SH_MACH_MASK))
3462 {
3463 case EF_SH1: strcat (buf, ", sh1"); break;
3464 case EF_SH2: strcat (buf, ", sh2"); break;
3465 case EF_SH3: strcat (buf, ", sh3"); break;
3466 case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3467 case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3468 case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3469 case EF_SH3E: strcat (buf, ", sh3e"); break;
3470 case EF_SH4: strcat (buf, ", sh4"); break;
3471 case EF_SH5: strcat (buf, ", sh5"); break;
3472 case EF_SH2E: strcat (buf, ", sh2e"); break;
3473 case EF_SH4A: strcat (buf, ", sh4a"); break;
3474 case EF_SH2A: strcat (buf, ", sh2a"); break;
3475 case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3476 case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
3477 case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
3478 case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3479 case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3480 case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3481 case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3482 case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3483 case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
3484 default: strcat (buf, _(", unknown ISA")); break;
3485 }
3486
3487 if (e_flags & EF_SH_PIC)
3488 strcat (buf, ", pic");
3489
3490 if (e_flags & EF_SH_FDPIC)
3491 strcat (buf, ", fdpic");
3492 break;
3493
3494 case EM_OR1K:
3495 if (e_flags & EF_OR1K_NODELAY)
3496 strcat (buf, ", no delay");
3497 break;
3498
3499 case EM_SPARCV9:
3500 if (e_flags & EF_SPARC_32PLUS)
3501 strcat (buf, ", v8+");
3502
3503 if (e_flags & EF_SPARC_SUN_US1)
3504 strcat (buf, ", ultrasparcI");
3505
3506 if (e_flags & EF_SPARC_SUN_US3)
3507 strcat (buf, ", ultrasparcIII");
3508
3509 if (e_flags & EF_SPARC_HAL_R1)
3510 strcat (buf, ", halr1");
3511
3512 if (e_flags & EF_SPARC_LEDATA)
3513 strcat (buf, ", ledata");
3514
3515 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3516 strcat (buf, ", tso");
3517
3518 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3519 strcat (buf, ", pso");
3520
3521 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3522 strcat (buf, ", rmo");
3523 break;
3524
3525 case EM_PARISC:
3526 switch (e_flags & EF_PARISC_ARCH)
3527 {
3528 case EFA_PARISC_1_0:
3529 strcpy (buf, ", PA-RISC 1.0");
3530 break;
3531 case EFA_PARISC_1_1:
3532 strcpy (buf, ", PA-RISC 1.1");
3533 break;
3534 case EFA_PARISC_2_0:
3535 strcpy (buf, ", PA-RISC 2.0");
3536 break;
3537 default:
3538 break;
3539 }
3540 if (e_flags & EF_PARISC_TRAPNIL)
3541 strcat (buf, ", trapnil");
3542 if (e_flags & EF_PARISC_EXT)
3543 strcat (buf, ", ext");
3544 if (e_flags & EF_PARISC_LSB)
3545 strcat (buf, ", lsb");
3546 if (e_flags & EF_PARISC_WIDE)
3547 strcat (buf, ", wide");
3548 if (e_flags & EF_PARISC_NO_KABP)
3549 strcat (buf, ", no kabp");
3550 if (e_flags & EF_PARISC_LAZYSWAP)
3551 strcat (buf, ", lazyswap");
3552 break;
3553
3554 case EM_PJ:
3555 case EM_PJ_OLD:
3556 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3557 strcat (buf, ", new calling convention");
3558
3559 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3560 strcat (buf, ", gnu calling convention");
3561 break;
3562
3563 case EM_IA_64:
3564 if ((e_flags & EF_IA_64_ABI64))
3565 strcat (buf, ", 64-bit");
3566 else
3567 strcat (buf, ", 32-bit");
3568 if ((e_flags & EF_IA_64_REDUCEDFP))
3569 strcat (buf, ", reduced fp model");
3570 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3571 strcat (buf, ", no function descriptors, constant gp");
3572 else if ((e_flags & EF_IA_64_CONS_GP))
3573 strcat (buf, ", constant gp");
3574 if ((e_flags & EF_IA_64_ABSOLUTE))
3575 strcat (buf, ", absolute");
3576 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3577 {
3578 if ((e_flags & EF_IA_64_VMS_LINKAGES))
3579 strcat (buf, ", vms_linkages");
3580 switch ((e_flags & EF_IA_64_VMS_COMCOD))
3581 {
3582 case EF_IA_64_VMS_COMCOD_SUCCESS:
3583 break;
3584 case EF_IA_64_VMS_COMCOD_WARNING:
3585 strcat (buf, ", warning");
3586 break;
3587 case EF_IA_64_VMS_COMCOD_ERROR:
3588 strcat (buf, ", error");
3589 break;
3590 case EF_IA_64_VMS_COMCOD_ABORT:
3591 strcat (buf, ", abort");
3592 break;
3593 default:
3594 warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3595 e_flags & EF_IA_64_VMS_COMCOD);
3596 strcat (buf, ", <unknown>");
3597 }
3598 }
3599 break;
3600
3601 case EM_VAX:
3602 if ((e_flags & EF_VAX_NONPIC))
3603 strcat (buf, ", non-PIC");
3604 if ((e_flags & EF_VAX_DFLOAT))
3605 strcat (buf, ", D-Float");
3606 if ((e_flags & EF_VAX_GFLOAT))
3607 strcat (buf, ", G-Float");
3608 break;
3609
3610 case EM_VISIUM:
3611 if (e_flags & EF_VISIUM_ARCH_MCM)
3612 strcat (buf, ", mcm");
3613 else if (e_flags & EF_VISIUM_ARCH_MCM24)
3614 strcat (buf, ", mcm24");
3615 if (e_flags & EF_VISIUM_ARCH_GR6)
3616 strcat (buf, ", gr6");
3617 break;
3618
3619 case EM_RL78:
3620 switch (e_flags & E_FLAG_RL78_CPU_MASK)
3621 {
3622 case E_FLAG_RL78_ANY_CPU: break;
3623 case E_FLAG_RL78_G10: strcat (buf, ", G10"); break;
3624 case E_FLAG_RL78_G13: strcat (buf, ", G13"); break;
3625 case E_FLAG_RL78_G14: strcat (buf, ", G14"); break;
3626 }
3627 if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3628 strcat (buf, ", 64-bit doubles");
3629 break;
3630
3631 case EM_RX:
3632 if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3633 strcat (buf, ", 64-bit doubles");
3634 if (e_flags & E_FLAG_RX_DSP)
3635 strcat (buf, ", dsp");
3636 if (e_flags & E_FLAG_RX_PID)
3637 strcat (buf, ", pid");
3638 if (e_flags & E_FLAG_RX_ABI)
3639 strcat (buf, ", RX ABI");
3640 if (e_flags & E_FLAG_RX_SINSNS_SET)
3641 strcat (buf, e_flags & E_FLAG_RX_SINSNS_YES
3642 ? ", uses String instructions" : ", bans String instructions");
3643 if (e_flags & E_FLAG_RX_V2)
3644 strcat (buf, ", V2");
3645 break;
3646
3647 case EM_S390:
3648 if (e_flags & EF_S390_HIGH_GPRS)
3649 strcat (buf, ", highgprs");
3650 break;
3651
3652 case EM_TI_C6000:
3653 if ((e_flags & EF_C6000_REL))
3654 strcat (buf, ", relocatable module");
3655 break;
3656
3657 case EM_MSP430:
3658 strcat (buf, _(": architecture variant: "));
3659 switch (e_flags & EF_MSP430_MACH)
3660 {
3661 case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3662 case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3663 case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3664 case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3665 case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3666 case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3667 case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3668 case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3669 case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3670 case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3671 case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3672 case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3673 case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3674 case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3675 case E_MSP430_MACH_MSP430X : strcat (buf, "MSP430X"); break;
3676 default:
3677 strcat (buf, _(": unknown")); break;
3678 }
3679
3680 if (e_flags & ~ EF_MSP430_MACH)
3681 strcat (buf, _(": unknown extra flag bits also present"));
3682 }
3683 }
3684
3685 return buf;
3686 }
3687
3688 static const char *
3689 get_osabi_name (Filedata * filedata, unsigned int osabi)
3690 {
3691 static char buff[32];
3692
3693 switch (osabi)
3694 {
3695 case ELFOSABI_NONE: return "UNIX - System V";
3696 case ELFOSABI_HPUX: return "UNIX - HP-UX";
3697 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
3698 case ELFOSABI_GNU: return "UNIX - GNU";
3699 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
3700 case ELFOSABI_AIX: return "UNIX - AIX";
3701 case ELFOSABI_IRIX: return "UNIX - IRIX";
3702 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
3703 case ELFOSABI_TRU64: return "UNIX - TRU64";
3704 case ELFOSABI_MODESTO: return "Novell - Modesto";
3705 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
3706 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
3707 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
3708 case ELFOSABI_AROS: return "AROS";
3709 case ELFOSABI_FENIXOS: return "FenixOS";
3710 case ELFOSABI_CLOUDABI: return "Nuxi CloudABI";
3711 case ELFOSABI_OPENVOS: return "Stratus Technologies OpenVOS";
3712 default:
3713 if (osabi >= 64)
3714 switch (filedata->file_header.e_machine)
3715 {
3716 case EM_ARM:
3717 switch (osabi)
3718 {
3719 case ELFOSABI_ARM: return "ARM";
3720 default:
3721 break;
3722 }
3723 break;
3724
3725 case EM_MSP430:
3726 case EM_MSP430_OLD:
3727 case EM_VISIUM:
3728 switch (osabi)
3729 {
3730 case ELFOSABI_STANDALONE: return _("Standalone App");
3731 default:
3732 break;
3733 }
3734 break;
3735
3736 case EM_TI_C6000:
3737 switch (osabi)
3738 {
3739 case ELFOSABI_C6000_ELFABI: return _("Bare-metal C6000");
3740 case ELFOSABI_C6000_LINUX: return "Linux C6000";
3741 default:
3742 break;
3743 }
3744 break;
3745
3746 default:
3747 break;
3748 }
3749 snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3750 return buff;
3751 }
3752 }
3753
3754 static const char *
3755 get_aarch64_segment_type (unsigned long type)
3756 {
3757 switch (type)
3758 {
3759 case PT_AARCH64_ARCHEXT: return "AARCH64_ARCHEXT";
3760 default: return NULL;
3761 }
3762 }
3763
3764 static const char *
3765 get_arm_segment_type (unsigned long type)
3766 {
3767 switch (type)
3768 {
3769 case PT_ARM_EXIDX: return "EXIDX";
3770 default: return NULL;
3771 }
3772 }
3773
3774 static const char *
3775 get_s390_segment_type (unsigned long type)
3776 {
3777 switch (type)
3778 {
3779 case PT_S390_PGSTE: return "S390_PGSTE";
3780 default: return NULL;
3781 }
3782 }
3783
3784 static const char *
3785 get_mips_segment_type (unsigned long type)
3786 {
3787 switch (type)
3788 {
3789 case PT_MIPS_REGINFO: return "REGINFO";
3790 case PT_MIPS_RTPROC: return "RTPROC";
3791 case PT_MIPS_OPTIONS: return "OPTIONS";
3792 case PT_MIPS_ABIFLAGS: return "ABIFLAGS";
3793 default: return NULL;
3794 }
3795 }
3796
3797 static const char *
3798 get_parisc_segment_type (unsigned long type)
3799 {
3800 switch (type)
3801 {
3802 case PT_HP_TLS: return "HP_TLS";
3803 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
3804 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
3805 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
3806 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
3807 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
3808 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
3809 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
3810 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
3811 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
3812 case PT_HP_PARALLEL: return "HP_PARALLEL";
3813 case PT_HP_FASTBIND: return "HP_FASTBIND";
3814 case PT_HP_OPT_ANNOT: return "HP_OPT_ANNOT";
3815 case PT_HP_HSL_ANNOT: return "HP_HSL_ANNOT";
3816 case PT_HP_STACK: return "HP_STACK";
3817 case PT_HP_CORE_UTSNAME: return "HP_CORE_UTSNAME";
3818 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
3819 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
3820 case PT_PARISC_WEAKORDER: return "PARISC_WEAKORDER";
3821 default: return NULL;
3822 }
3823 }
3824
3825 static const char *
3826 get_ia64_segment_type (unsigned long type)
3827 {
3828 switch (type)
3829 {
3830 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
3831 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
3832 case PT_HP_TLS: return "HP_TLS";
3833 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
3834 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
3835 case PT_IA_64_HP_STACK: return "HP_STACK";
3836 default: return NULL;
3837 }
3838 }
3839
3840 static const char *
3841 get_tic6x_segment_type (unsigned long type)
3842 {
3843 switch (type)
3844 {
3845 case PT_C6000_PHATTR: return "C6000_PHATTR";
3846 default: return NULL;
3847 }
3848 }
3849
3850 static const char *
3851 get_solaris_segment_type (unsigned long type)
3852 {
3853 switch (type)
3854 {
3855 case 0x6464e550: return "PT_SUNW_UNWIND";
3856 case 0x6474e550: return "PT_SUNW_EH_FRAME";
3857 case 0x6ffffff7: return "PT_LOSUNW";
3858 case 0x6ffffffa: return "PT_SUNWBSS";
3859 case 0x6ffffffb: return "PT_SUNWSTACK";
3860 case 0x6ffffffc: return "PT_SUNWDTRACE";
3861 case 0x6ffffffd: return "PT_SUNWCAP";
3862 case 0x6fffffff: return "PT_HISUNW";
3863 default: return NULL;
3864 }
3865 }
3866
3867 static const char *
3868 get_segment_type (Filedata * filedata, unsigned long p_type)
3869 {
3870 static char buff[32];
3871
3872 switch (p_type)
3873 {
3874 case PT_NULL: return "NULL";
3875 case PT_LOAD: return "LOAD";
3876 case PT_DYNAMIC: return "DYNAMIC";
3877 case PT_INTERP: return "INTERP";
3878 case PT_NOTE: return "NOTE";
3879 case PT_SHLIB: return "SHLIB";
3880 case PT_PHDR: return "PHDR";
3881 case PT_TLS: return "TLS";
3882 case PT_GNU_EH_FRAME: return "GNU_EH_FRAME";
3883 case PT_GNU_STACK: return "GNU_STACK";
3884 case PT_GNU_RELRO: return "GNU_RELRO";
3885
3886 default:
3887 if (p_type >= PT_GNU_MBIND_LO && p_type <= PT_GNU_MBIND_HI)
3888 {
3889 sprintf (buff, "GNU_MBIND+%#lx",
3890 p_type - PT_GNU_MBIND_LO);
3891 }
3892 else if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3893 {
3894 const char * result;
3895
3896 switch (filedata->file_header.e_machine)
3897 {
3898 case EM_AARCH64:
3899 result = get_aarch64_segment_type (p_type);
3900 break;
3901 case EM_ARM:
3902 result = get_arm_segment_type (p_type);
3903 break;
3904 case EM_MIPS:
3905 case EM_MIPS_RS3_LE:
3906 result = get_mips_segment_type (p_type);
3907 break;
3908 case EM_PARISC:
3909 result = get_parisc_segment_type (p_type);
3910 break;
3911 case EM_IA_64:
3912 result = get_ia64_segment_type (p_type);
3913 break;
3914 case EM_TI_C6000:
3915 result = get_tic6x_segment_type (p_type);
3916 break;
3917 case EM_S390:
3918 case EM_S390_OLD:
3919 result = get_s390_segment_type (p_type);
3920 break;
3921 default:
3922 result = NULL;
3923 break;
3924 }
3925
3926 if (result != NULL)
3927 return result;
3928
3929 sprintf (buff, "LOPROC+%#lx", p_type - PT_LOPROC);
3930 }
3931 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3932 {
3933 const char * result;
3934
3935 switch (filedata->file_header.e_machine)
3936 {
3937 case EM_PARISC:
3938 result = get_parisc_segment_type (p_type);
3939 break;
3940 case EM_IA_64:
3941 result = get_ia64_segment_type (p_type);
3942 break;
3943 default:
3944 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
3945 result = get_solaris_segment_type (p_type);
3946 else
3947 result = NULL;
3948 break;
3949 }
3950
3951 if (result != NULL)
3952 return result;
3953
3954 sprintf (buff, "LOOS+%#lx", p_type - PT_LOOS);
3955 }
3956 else
3957 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
3958
3959 return buff;
3960 }
3961 }
3962
3963 static const char *
3964 get_arc_section_type_name (unsigned int sh_type)
3965 {
3966 switch (sh_type)
3967 {
3968 case SHT_ARC_ATTRIBUTES: return "ARC_ATTRIBUTES";
3969 default:
3970 break;
3971 }
3972 return NULL;
3973 }
3974
3975 static const char *
3976 get_mips_section_type_name (unsigned int sh_type)
3977 {
3978 switch (sh_type)
3979 {
3980 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
3981 case SHT_MIPS_MSYM: return "MIPS_MSYM";
3982 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
3983 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
3984 case SHT_MIPS_UCODE: return "MIPS_UCODE";
3985 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
3986 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
3987 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
3988 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
3989 case SHT_MIPS_RELD: return "MIPS_RELD";
3990 case SHT_MIPS_IFACE: return "MIPS_IFACE";
3991 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
3992 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
3993 case SHT_MIPS_SHDR: return "MIPS_SHDR";
3994 case SHT_MIPS_FDESC: return "MIPS_FDESC";
3995 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
3996 case SHT_MIPS_DENSE: return "MIPS_DENSE";
3997 case SHT_MIPS_PDESC: return "MIPS_PDESC";
3998 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
3999 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
4000 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
4001 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
4002 case SHT_MIPS_LINE: return "MIPS_LINE";
4003 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
4004 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
4005 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
4006 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
4007 case SHT_MIPS_DWARF: return "MIPS_DWARF";
4008 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
4009 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
4010 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
4011 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
4012 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
4013 case SHT_MIPS_XLATE: return "MIPS_XLATE";
4014 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
4015 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
4016 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
4017 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
4018 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
4019 case SHT_MIPS_ABIFLAGS: return "MIPS_ABIFLAGS";
4020 default:
4021 break;
4022 }
4023 return NULL;
4024 }
4025
4026 static const char *
4027 get_parisc_section_type_name (unsigned int sh_type)
4028 {
4029 switch (sh_type)
4030 {
4031 case SHT_PARISC_EXT: return "PARISC_EXT";
4032 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
4033 case SHT_PARISC_DOC: return "PARISC_DOC";
4034 case SHT_PARISC_ANNOT: return "PARISC_ANNOT";
4035 case SHT_PARISC_SYMEXTN: return "PARISC_SYMEXTN";
4036 case SHT_PARISC_STUBS: return "PARISC_STUBS";
4037 case SHT_PARISC_DLKM: return "PARISC_DLKM";
4038 default: return NULL;
4039 }
4040 }
4041
4042 static const char *
4043 get_ia64_section_type_name (Filedata * filedata, unsigned int sh_type)
4044 {
4045 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
4046 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
4047 return get_osabi_name (filedata, (sh_type & 0x00FF0000) >> 16);
4048
4049 switch (sh_type)
4050 {
4051 case SHT_IA_64_EXT: return "IA_64_EXT";
4052 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
4053 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
4054 case SHT_IA_64_VMS_TRACE: return "VMS_TRACE";
4055 case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
4056 case SHT_IA_64_VMS_DEBUG: return "VMS_DEBUG";
4057 case SHT_IA_64_VMS_DEBUG_STR: return "VMS_DEBUG_STR";
4058 case SHT_IA_64_VMS_LINKAGES: return "VMS_LINKAGES";
4059 case SHT_IA_64_VMS_SYMBOL_VECTOR: return "VMS_SYMBOL_VECTOR";
4060 case SHT_IA_64_VMS_FIXUP: return "VMS_FIXUP";
4061 default:
4062 break;
4063 }
4064 return NULL;
4065 }
4066
4067 static const char *
4068 get_x86_64_section_type_name (unsigned int sh_type)
4069 {
4070 switch (sh_type)
4071 {
4072 case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
4073 default: return NULL;
4074 }
4075 }
4076
4077 static const char *
4078 get_aarch64_section_type_name (unsigned int sh_type)
4079 {
4080 switch (sh_type)
4081 {
4082 case SHT_AARCH64_ATTRIBUTES: return "AARCH64_ATTRIBUTES";
4083 default: return NULL;
4084 }
4085 }
4086
4087 static const char *
4088 get_arm_section_type_name (unsigned int sh_type)
4089 {
4090 switch (sh_type)
4091 {
4092 case SHT_ARM_EXIDX: return "ARM_EXIDX";
4093 case SHT_ARM_PREEMPTMAP: return "ARM_PREEMPTMAP";
4094 case SHT_ARM_ATTRIBUTES: return "ARM_ATTRIBUTES";
4095 case SHT_ARM_DEBUGOVERLAY: return "ARM_DEBUGOVERLAY";
4096 case SHT_ARM_OVERLAYSECTION: return "ARM_OVERLAYSECTION";
4097 default: return NULL;
4098 }
4099 }
4100
4101 static const char *
4102 get_tic6x_section_type_name (unsigned int sh_type)
4103 {
4104 switch (sh_type)
4105 {
4106 case SHT_C6000_UNWIND: return "C6000_UNWIND";
4107 case SHT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
4108 case SHT_C6000_ATTRIBUTES: return "C6000_ATTRIBUTES";
4109 case SHT_TI_ICODE: return "TI_ICODE";
4110 case SHT_TI_XREF: return "TI_XREF";
4111 case SHT_TI_HANDLER: return "TI_HANDLER";
4112 case SHT_TI_INITINFO: return "TI_INITINFO";
4113 case SHT_TI_PHATTRS: return "TI_PHATTRS";
4114 default: return NULL;
4115 }
4116 }
4117
4118 static const char *
4119 get_msp430x_section_type_name (unsigned int sh_type)
4120 {
4121 switch (sh_type)
4122 {
4123 case SHT_MSP430_SEC_FLAGS: return "MSP430_SEC_FLAGS";
4124 case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
4125 case SHT_MSP430_ATTRIBUTES: return "MSP430_ATTRIBUTES";
4126 default: return NULL;
4127 }
4128 }
4129
4130 static const char *
4131 get_v850_section_type_name (unsigned int sh_type)
4132 {
4133 switch (sh_type)
4134 {
4135 case SHT_V850_SCOMMON: return "V850 Small Common";
4136 case SHT_V850_TCOMMON: return "V850 Tiny Common";
4137 case SHT_V850_ZCOMMON: return "V850 Zero Common";
4138 case SHT_RENESAS_IOP: return "RENESAS IOP";
4139 case SHT_RENESAS_INFO: return "RENESAS INFO";
4140 default: return NULL;
4141 }
4142 }
4143
4144 static const char *
4145 get_section_type_name (Filedata * filedata, unsigned int sh_type)
4146 {
4147 static char buff[32];
4148 const char * result;
4149
4150 switch (sh_type)
4151 {
4152 case SHT_NULL: return "NULL";
4153 case SHT_PROGBITS: return "PROGBITS";
4154 case SHT_SYMTAB: return "SYMTAB";
4155 case SHT_STRTAB: return "STRTAB";
4156 case SHT_RELA: return "RELA";
4157 case SHT_HASH: return "HASH";
4158 case SHT_DYNAMIC: return "DYNAMIC";
4159 case SHT_NOTE: return "NOTE";
4160 case SHT_NOBITS: return "NOBITS";
4161 case SHT_REL: return "REL";
4162 case SHT_SHLIB: return "SHLIB";
4163 case SHT_DYNSYM: return "DYNSYM";
4164 case SHT_INIT_ARRAY: return "INIT_ARRAY";
4165 case SHT_FINI_ARRAY: return "FINI_ARRAY";
4166 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
4167 case SHT_GNU_HASH: return "GNU_HASH";
4168 case SHT_GROUP: return "GROUP";
4169 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
4170 case SHT_GNU_verdef: return "VERDEF";
4171 case SHT_GNU_verneed: return "VERNEED";
4172 case SHT_GNU_versym: return "VERSYM";
4173 case 0x6ffffff0: return "VERSYM";
4174 case 0x6ffffffc: return "VERDEF";
4175 case 0x7ffffffd: return "AUXILIARY";
4176 case 0x7fffffff: return "FILTER";
4177 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
4178
4179 default:
4180 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
4181 {
4182 switch (filedata->file_header.e_machine)
4183 {
4184 case EM_ARC:
4185 case EM_ARC_COMPACT:
4186 case EM_ARC_COMPACT2:
4187 result = get_arc_section_type_name (sh_type);
4188 break;
4189 case EM_MIPS:
4190 case EM_MIPS_RS3_LE:
4191 result = get_mips_section_type_name (sh_type);
4192 break;
4193 case EM_PARISC:
4194 result = get_parisc_section_type_name (sh_type);
4195 break;
4196 case EM_IA_64:
4197 result = get_ia64_section_type_name (filedata, sh_type);
4198 break;
4199 case EM_X86_64:
4200 case EM_L1OM:
4201 case EM_K1OM:
4202 result = get_x86_64_section_type_name (sh_type);
4203 break;
4204 case EM_AARCH64:
4205 result = get_aarch64_section_type_name (sh_type);
4206 break;
4207 case EM_ARM:
4208 result = get_arm_section_type_name (sh_type);
4209 break;
4210 case EM_TI_C6000:
4211 result = get_tic6x_section_type_name (sh_type);
4212 break;
4213 case EM_MSP430:
4214 result = get_msp430x_section_type_name (sh_type);
4215 break;
4216 case EM_V800:
4217 case EM_V850:
4218 case EM_CYGNUS_V850:
4219 result = get_v850_section_type_name (sh_type);
4220 break;
4221 default:
4222 result = NULL;
4223 break;
4224 }
4225
4226 if (result != NULL)
4227 return result;
4228
4229 sprintf (buff, "LOPROC+%#x", sh_type - SHT_LOPROC);
4230 }
4231 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
4232 {
4233 switch (filedata->file_header.e_machine)
4234 {
4235 case EM_IA_64:
4236 result = get_ia64_section_type_name (filedata, sh_type);
4237 break;
4238 default:
4239 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
4240 result = get_solaris_section_type (sh_type);
4241 else
4242 {
4243 switch (sh_type)
4244 {
4245 case SHT_GNU_INCREMENTAL_INPUTS: result = "GNU_INCREMENTAL_INPUTS"; break;
4246 case SHT_GNU_ATTRIBUTES: result = "GNU_ATTRIBUTES"; break;
4247 case SHT_GNU_HASH: result = "GNU_HASH"; break;
4248 case SHT_GNU_LIBLIST: result = "GNU_LIBLIST"; break;
4249 default:
4250 result = NULL;
4251 break;
4252 }
4253 }
4254 break;
4255 }
4256
4257 if (result != NULL)
4258 return result;
4259
4260 sprintf (buff, "LOOS+%#x", sh_type - SHT_LOOS);
4261 }
4262 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
4263 {
4264 switch (filedata->file_header.e_machine)
4265 {
4266 case EM_V800:
4267 case EM_V850:
4268 case EM_CYGNUS_V850:
4269 result = get_v850_section_type_name (sh_type);
4270 break;
4271 default:
4272 result = NULL;
4273 break;
4274 }
4275
4276 if (result != NULL)
4277 return result;
4278
4279 sprintf (buff, "LOUSER+%#x", sh_type - SHT_LOUSER);
4280 }
4281 else
4282 /* This message is probably going to be displayed in a 15
4283 character wide field, so put the hex value first. */
4284 snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
4285
4286 return buff;
4287 }
4288 }
4289
4290 #define OPTION_DEBUG_DUMP 512
4291 #define OPTION_DYN_SYMS 513
4292 #define OPTION_DWARF_DEPTH 514
4293 #define OPTION_DWARF_START 515
4294 #define OPTION_DWARF_CHECK 516
4295
4296 static struct option options[] =
4297 {
4298 {"all", no_argument, 0, 'a'},
4299 {"file-header", no_argument, 0, 'h'},
4300 {"program-headers", no_argument, 0, 'l'},
4301 {"headers", no_argument, 0, 'e'},
4302 {"histogram", no_argument, 0, 'I'},
4303 {"segments", no_argument, 0, 'l'},
4304 {"sections", no_argument, 0, 'S'},
4305 {"section-headers", no_argument, 0, 'S'},
4306 {"section-groups", no_argument, 0, 'g'},
4307 {"section-details", no_argument, 0, 't'},
4308 {"full-section-name",no_argument, 0, 'N'},
4309 {"symbols", no_argument, 0, 's'},
4310 {"syms", no_argument, 0, 's'},
4311 {"dyn-syms", no_argument, 0, OPTION_DYN_SYMS},
4312 {"relocs", no_argument, 0, 'r'},
4313 {"notes", no_argument, 0, 'n'},
4314 {"dynamic", no_argument, 0, 'd'},
4315 {"arch-specific", no_argument, 0, 'A'},
4316 {"version-info", no_argument, 0, 'V'},
4317 {"use-dynamic", no_argument, 0, 'D'},
4318 {"unwind", no_argument, 0, 'u'},
4319 {"archive-index", no_argument, 0, 'c'},
4320 {"hex-dump", required_argument, 0, 'x'},
4321 {"relocated-dump", required_argument, 0, 'R'},
4322 {"string-dump", required_argument, 0, 'p'},
4323 {"decompress", no_argument, 0, 'z'},
4324 #ifdef SUPPORT_DISASSEMBLY
4325 {"instruction-dump", required_argument, 0, 'i'},
4326 #endif
4327 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
4328
4329 {"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH},
4330 {"dwarf-start", required_argument, 0, OPTION_DWARF_START},
4331 {"dwarf-check", no_argument, 0, OPTION_DWARF_CHECK},
4332
4333 {"version", no_argument, 0, 'v'},
4334 {"wide", no_argument, 0, 'W'},
4335 {"help", no_argument, 0, 'H'},
4336 {0, no_argument, 0, 0}
4337 };
4338
4339 static void
4340 usage (FILE * stream)
4341 {
4342 fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
4343 fprintf (stream, _(" Display information about the contents of ELF format files\n"));
4344 fprintf (stream, _(" Options are:\n\
4345 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4346 -h --file-header Display the ELF file header\n\
4347 -l --program-headers Display the program headers\n\
4348 --segments An alias for --program-headers\n\
4349 -S --section-headers Display the sections' header\n\
4350 --sections An alias for --section-headers\n\
4351 -g --section-groups Display the section groups\n\
4352 -t --section-details Display the section details\n\
4353 -e --headers Equivalent to: -h -l -S\n\
4354 -s --syms Display the symbol table\n\
4355 --symbols An alias for --syms\n\
4356 --dyn-syms Display the dynamic symbol table\n\
4357 -n --notes Display the core notes (if present)\n\
4358 -r --relocs Display the relocations (if present)\n\
4359 -u --unwind Display the unwind info (if present)\n\
4360 -d --dynamic Display the dynamic section (if present)\n\
4361 -V --version-info Display the version sections (if present)\n\
4362 -A --arch-specific Display architecture specific information (if any)\n\
4363 -c --archive-index Display the symbol/file index in an archive\n\
4364 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
4365 -x --hex-dump=<number|name>\n\
4366 Dump the contents of section <number|name> as bytes\n\
4367 -p --string-dump=<number|name>\n\
4368 Dump the contents of section <number|name> as strings\n\
4369 -R --relocated-dump=<number|name>\n\
4370 Dump the contents of section <number|name> as relocated bytes\n\
4371 -z --decompress Decompress section before dumping it\n\
4372 -w[lLiaprmfFsoRtUuTgAckK] or\n\
4373 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
4374 =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
4375 =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4376 =addr,=cu_index,=links,=follow-links]\n\
4377 Display the contents of DWARF debug sections\n"));
4378 fprintf (stream, _("\
4379 --dwarf-depth=N Do not display DIEs at depth N or greater\n\
4380 --dwarf-start=N Display DIEs starting with N, at the same depth\n\
4381 or deeper\n"));
4382 #ifdef SUPPORT_DISASSEMBLY
4383 fprintf (stream, _("\
4384 -i --instruction-dump=<number|name>\n\
4385 Disassemble the contents of section <number|name>\n"));
4386 #endif
4387 fprintf (stream, _("\
4388 -I --histogram Display histogram of bucket list lengths\n\
4389 -W --wide Allow output width to exceed 80 characters\n\
4390 @<file> Read options from <file>\n\
4391 -H --help Display this information\n\
4392 -v --version Display the version number of readelf\n"));
4393
4394 if (REPORT_BUGS_TO[0] && stream == stdout)
4395 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
4396
4397 exit (stream == stdout ? 0 : 1);
4398 }
4399
4400 /* Record the fact that the user wants the contents of section number
4401 SECTION to be displayed using the method(s) encoded as flags bits
4402 in TYPE. Note, TYPE can be zero if we are creating the array for
4403 the first time. */
4404
4405 static void
4406 request_dump_bynumber (Filedata * filedata, unsigned int section, dump_type type)
4407 {
4408 if (section >= filedata->num_dump_sects)
4409 {
4410 dump_type * new_dump_sects;
4411
4412 new_dump_sects = (dump_type *) calloc (section + 1,
4413 sizeof (* new_dump_sects));
4414
4415 if (new_dump_sects == NULL)
4416 error (_("Out of memory allocating dump request table.\n"));
4417 else
4418 {
4419 if (filedata->dump_sects)
4420 {
4421 /* Copy current flag settings. */
4422 memcpy (new_dump_sects, filedata->dump_sects,
4423 filedata->num_dump_sects * sizeof (* new_dump_sects));
4424
4425 free (filedata->dump_sects);
4426 }
4427
4428 filedata->dump_sects = new_dump_sects;
4429 filedata->num_dump_sects = section + 1;
4430 }
4431 }
4432
4433 if (filedata->dump_sects)
4434 filedata->dump_sects[section] |= type;
4435 }
4436
4437 /* Request a dump by section name. */
4438
4439 static void
4440 request_dump_byname (const char * section, dump_type type)
4441 {
4442 struct dump_list_entry * new_request;
4443
4444 new_request = (struct dump_list_entry *)
4445 malloc (sizeof (struct dump_list_entry));
4446 if (!new_request)
4447 error (_("Out of memory allocating dump request table.\n"));
4448
4449 new_request->name = strdup (section);
4450 if (!new_request->name)
4451 error (_("Out of memory allocating dump request table.\n"));
4452
4453 new_request->type = type;
4454
4455 new_request->next = dump_sects_byname;
4456 dump_sects_byname = new_request;
4457 }
4458
4459 static inline void
4460 request_dump (Filedata * filedata, dump_type type)
4461 {
4462 int section;
4463 char * cp;
4464
4465 do_dump++;
4466 section = strtoul (optarg, & cp, 0);
4467
4468 if (! *cp && section >= 0)
4469 request_dump_bynumber (filedata, section, type);
4470 else
4471 request_dump_byname (optarg, type);
4472 }
4473
4474 static void
4475 parse_args (Filedata * filedata, int argc, char ** argv)
4476 {
4477 int c;
4478
4479 if (argc < 2)
4480 usage (stderr);
4481
4482 while ((c = getopt_long
4483 (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
4484 {
4485 switch (c)
4486 {
4487 case 0:
4488 /* Long options. */
4489 break;
4490 case 'H':
4491 usage (stdout);
4492 break;
4493
4494 case 'a':
4495 do_syms = TRUE;
4496 do_reloc = TRUE;
4497 do_unwind = TRUE;
4498 do_dynamic = TRUE;
4499 do_header = TRUE;
4500 do_sections = TRUE;
4501 do_section_groups = TRUE;
4502 do_segments = TRUE;
4503 do_version = TRUE;
4504 do_histogram = TRUE;
4505 do_arch = TRUE;
4506 do_notes = TRUE;
4507 break;
4508 case 'g':
4509 do_section_groups = TRUE;
4510 break;
4511 case 't':
4512 case 'N':
4513 do_sections = TRUE;
4514 do_section_details = TRUE;
4515 break;
4516 case 'e':
4517 do_header = TRUE;
4518 do_sections = TRUE;
4519 do_segments = TRUE;
4520 break;
4521 case 'A':
4522 do_arch = TRUE;
4523 break;
4524 case 'D':
4525 do_using_dynamic = TRUE;
4526 break;
4527 case 'r':
4528 do_reloc = TRUE;
4529 break;
4530 case 'u':
4531 do_unwind = TRUE;
4532 break;
4533 case 'h':
4534 do_header = TRUE;
4535 break;
4536 case 'l':
4537 do_segments = TRUE;
4538 break;
4539 case 's':
4540 do_syms = TRUE;
4541 break;
4542 case 'S':
4543 do_sections = TRUE;
4544 break;
4545 case 'd':
4546 do_dynamic = TRUE;
4547 break;
4548 case 'I':
4549 do_histogram = TRUE;
4550 break;
4551 case 'n':
4552 do_notes = TRUE;
4553 break;
4554 case 'c':
4555 do_archive_index = TRUE;
4556 break;
4557 case 'x':
4558 request_dump (filedata, HEX_DUMP);
4559 break;
4560 case 'p':
4561 request_dump (filedata, STRING_DUMP);
4562 break;
4563 case 'R':
4564 request_dump (filedata, RELOC_DUMP);
4565 break;
4566 case 'z':
4567 decompress_dumps = TRUE;
4568 break;
4569 case 'w':
4570 do_dump = TRUE;
4571 if (optarg == 0)
4572 {
4573 do_debugging = TRUE;
4574 dwarf_select_sections_all ();
4575 }
4576 else
4577 {
4578 do_debugging = FALSE;
4579 dwarf_select_sections_by_letters (optarg);
4580 }
4581 break;
4582 case OPTION_DEBUG_DUMP:
4583 do_dump = TRUE;
4584 if (optarg == 0)
4585 do_debugging = TRUE;
4586 else
4587 {
4588 do_debugging = FALSE;
4589 dwarf_select_sections_by_names (optarg);
4590 }
4591 break;
4592 case OPTION_DWARF_DEPTH:
4593 {
4594 char *cp;
4595
4596 dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4597 }
4598 break;
4599 case OPTION_DWARF_START:
4600 {
4601 char *cp;
4602
4603 dwarf_start_die = strtoul (optarg, & cp, 0);
4604 }
4605 break;
4606 case OPTION_DWARF_CHECK:
4607 dwarf_check = TRUE;
4608 break;
4609 case OPTION_DYN_SYMS:
4610 do_dyn_syms = TRUE;
4611 break;
4612 #ifdef SUPPORT_DISASSEMBLY
4613 case 'i':
4614 request_dump (filedata, DISASS_DUMP);
4615 break;
4616 #endif
4617 case 'v':
4618 print_version (program_name);
4619 break;
4620 case 'V':
4621 do_version = TRUE;
4622 break;
4623 case 'W':
4624 do_wide = TRUE;
4625 break;
4626 default:
4627 /* xgettext:c-format */
4628 error (_("Invalid option '-%c'\n"), c);
4629 /* Fall through. */
4630 case '?':
4631 usage (stderr);
4632 }
4633 }
4634
4635 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
4636 && !do_segments && !do_header && !do_dump && !do_version
4637 && !do_histogram && !do_debugging && !do_arch && !do_notes
4638 && !do_section_groups && !do_archive_index
4639 && !do_dyn_syms)
4640 usage (stderr);
4641 }
4642
4643 static const char *
4644 get_elf_class (unsigned int elf_class)
4645 {
4646 static char buff[32];
4647
4648 switch (elf_class)
4649 {
4650 case ELFCLASSNONE: return _("none");
4651 case ELFCLASS32: return "ELF32";
4652 case ELFCLASS64: return "ELF64";
4653 default:
4654 snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
4655 return buff;
4656 }
4657 }
4658
4659 static const char *
4660 get_data_encoding (unsigned int encoding)
4661 {
4662 static char buff[32];
4663
4664 switch (encoding)
4665 {
4666 case ELFDATANONE: return _("none");
4667 case ELFDATA2LSB: return _("2's complement, little endian");
4668 case ELFDATA2MSB: return _("2's complement, big endian");
4669 default:
4670 snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
4671 return buff;
4672 }
4673 }
4674
4675 /* Decode the data held in 'filedata->file_header'. */
4676
4677 static bfd_boolean
4678 process_file_header (Filedata * filedata)
4679 {
4680 Elf_Internal_Ehdr * header = & filedata->file_header;
4681
4682 if ( header->e_ident[EI_MAG0] != ELFMAG0
4683 || header->e_ident[EI_MAG1] != ELFMAG1
4684 || header->e_ident[EI_MAG2] != ELFMAG2
4685 || header->e_ident[EI_MAG3] != ELFMAG3)
4686 {
4687 error
4688 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4689 return FALSE;
4690 }
4691
4692 init_dwarf_regnames (header->e_machine);
4693
4694 if (do_header)
4695 {
4696 unsigned i;
4697
4698 printf (_("ELF Header:\n"));
4699 printf (_(" Magic: "));
4700 for (i = 0; i < EI_NIDENT; i++)
4701 printf ("%2.2x ", header->e_ident[i]);
4702 printf ("\n");
4703 printf (_(" Class: %s\n"),
4704 get_elf_class (header->e_ident[EI_CLASS]));
4705 printf (_(" Data: %s\n"),
4706 get_data_encoding (header->e_ident[EI_DATA]));
4707 printf (_(" Version: %d %s\n"),
4708 header->e_ident[EI_VERSION],
4709 (header->e_ident[EI_VERSION] == EV_CURRENT
4710 ? "(current)"
4711 : (header->e_ident[EI_VERSION] != EV_NONE
4712 ? _("<unknown: %lx>")
4713 : "")));
4714 printf (_(" OS/ABI: %s\n"),
4715 get_osabi_name (filedata, header->e_ident[EI_OSABI]));
4716 printf (_(" ABI Version: %d\n"),
4717 header->e_ident[EI_ABIVERSION]);
4718 printf (_(" Type: %s\n"),
4719 get_file_type (header->e_type));
4720 printf (_(" Machine: %s\n"),
4721 get_machine_name (header->e_machine));
4722 printf (_(" Version: 0x%lx\n"),
4723 (unsigned long) header->e_version);
4724
4725 printf (_(" Entry point address: "));
4726 print_vma ((bfd_vma) header->e_entry, PREFIX_HEX);
4727 printf (_("\n Start of program headers: "));
4728 print_vma ((bfd_vma) header->e_phoff, DEC);
4729 printf (_(" (bytes into file)\n Start of section headers: "));
4730 print_vma ((bfd_vma) header->e_shoff, DEC);
4731 printf (_(" (bytes into file)\n"));
4732
4733 printf (_(" Flags: 0x%lx%s\n"),
4734 (unsigned long) header->e_flags,
4735 get_machine_flags (filedata, header->e_flags, header->e_machine));
4736 printf (_(" Size of this header: %ld (bytes)\n"),
4737 (long) header->e_ehsize);
4738 printf (_(" Size of program headers: %ld (bytes)\n"),
4739 (long) header->e_phentsize);
4740 printf (_(" Number of program headers: %ld"),
4741 (long) header->e_phnum);
4742 if (filedata->section_headers != NULL
4743 && header->e_phnum == PN_XNUM
4744 && filedata->section_headers[0].sh_info != 0)
4745 printf (" (%ld)", (long) filedata->section_headers[0].sh_info);
4746 putc ('\n', stdout);
4747 printf (_(" Size of section headers: %ld (bytes)\n"),
4748 (long) header->e_shentsize);
4749 printf (_(" Number of section headers: %ld"),
4750 (long) header->e_shnum);
4751 if (filedata->section_headers != NULL && header->e_shnum == SHN_UNDEF)
4752 printf (" (%ld)", (long) filedata->section_headers[0].sh_size);
4753 putc ('\n', stdout);
4754 printf (_(" Section header string table index: %ld"),
4755 (long) header->e_shstrndx);
4756 if (filedata->section_headers != NULL
4757 && header->e_shstrndx == (SHN_XINDEX & 0xffff))
4758 printf (" (%u)", filedata->section_headers[0].sh_link);
4759 else if (header->e_shstrndx != SHN_UNDEF
4760 && header->e_shstrndx >= header->e_shnum)
4761 printf (_(" <corrupt: out of range>"));
4762 putc ('\n', stdout);
4763 }
4764
4765 if (filedata->section_headers != NULL)
4766 {
4767 if (header->e_phnum == PN_XNUM
4768 && filedata->section_headers[0].sh_info != 0)
4769 header->e_phnum = filedata->section_headers[0].sh_info;
4770 if (header->e_shnum == SHN_UNDEF)
4771 header->e_shnum = filedata->section_headers[0].sh_size;
4772 if (header->e_shstrndx == (SHN_XINDEX & 0xffff))
4773 header->e_shstrndx = filedata->section_headers[0].sh_link;
4774 if (header->e_shstrndx >= header->e_shnum)
4775 header->e_shstrndx = SHN_UNDEF;
4776 free (filedata->section_headers);
4777 filedata->section_headers = NULL;
4778 }
4779
4780 return TRUE;
4781 }
4782
4783 /* Read in the program headers from FILEDATA and store them in PHEADERS.
4784 Returns TRUE upon success, FALSE otherwise. Loads 32-bit headers. */
4785
4786 static bfd_boolean
4787 get_32bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
4788 {
4789 Elf32_External_Phdr * phdrs;
4790 Elf32_External_Phdr * external;
4791 Elf_Internal_Phdr * internal;
4792 unsigned int i;
4793 unsigned int size = filedata->file_header.e_phentsize;
4794 unsigned int num = filedata->file_header.e_phnum;
4795
4796 /* PR binutils/17531: Cope with unexpected section header sizes. */
4797 if (size == 0 || num == 0)
4798 return FALSE;
4799 if (size < sizeof * phdrs)
4800 {
4801 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4802 return FALSE;
4803 }
4804 if (size > sizeof * phdrs)
4805 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4806
4807 phdrs = (Elf32_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
4808 size, num, _("program headers"));
4809 if (phdrs == NULL)
4810 return FALSE;
4811
4812 for (i = 0, internal = pheaders, external = phdrs;
4813 i < filedata->file_header.e_phnum;
4814 i++, internal++, external++)
4815 {
4816 internal->p_type = BYTE_GET (external->p_type);
4817 internal->p_offset = BYTE_GET (external->p_offset);
4818 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4819 internal->p_paddr = BYTE_GET (external->p_paddr);
4820 internal->p_filesz = BYTE_GET (external->p_filesz);
4821 internal->p_memsz = BYTE_GET (external->p_memsz);
4822 internal->p_flags = BYTE_GET (external->p_flags);
4823 internal->p_align = BYTE_GET (external->p_align);
4824 }
4825
4826 free (phdrs);
4827 return TRUE;
4828 }
4829
4830 /* Read in the program headers from FILEDATA and store them in PHEADERS.
4831 Returns TRUE upon success, FALSE otherwise. Loads 64-bit headers. */
4832
4833 static bfd_boolean
4834 get_64bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
4835 {
4836 Elf64_External_Phdr * phdrs;
4837 Elf64_External_Phdr * external;
4838 Elf_Internal_Phdr * internal;
4839 unsigned int i;
4840 unsigned int size = filedata->file_header.e_phentsize;
4841 unsigned int num = filedata->file_header.e_phnum;
4842
4843 /* PR binutils/17531: Cope with unexpected section header sizes. */
4844 if (size == 0 || num == 0)
4845 return FALSE;
4846 if (size < sizeof * phdrs)
4847 {
4848 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4849 return FALSE;
4850 }
4851 if (size > sizeof * phdrs)
4852 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4853
4854 phdrs = (Elf64_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
4855 size, num, _("program headers"));
4856 if (!phdrs)
4857 return FALSE;
4858
4859 for (i = 0, internal = pheaders, external = phdrs;
4860 i < filedata->file_header.e_phnum;
4861 i++, internal++, external++)
4862 {
4863 internal->p_type = BYTE_GET (external->p_type);
4864 internal->p_flags = BYTE_GET (external->p_flags);
4865 internal->p_offset = BYTE_GET (external->p_offset);
4866 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4867 internal->p_paddr = BYTE_GET (external->p_paddr);
4868 internal->p_filesz = BYTE_GET (external->p_filesz);
4869 internal->p_memsz = BYTE_GET (external->p_memsz);
4870 internal->p_align = BYTE_GET (external->p_align);
4871 }
4872
4873 free (phdrs);
4874 return TRUE;
4875 }
4876
4877 /* Returns TRUE if the program headers were read into `program_headers'. */
4878
4879 static bfd_boolean
4880 get_program_headers (Filedata * filedata)
4881 {
4882 Elf_Internal_Phdr * phdrs;
4883
4884 /* Check cache of prior read. */
4885 if (filedata->program_headers != NULL)
4886 return TRUE;
4887
4888 /* Be kind to memory checkers by looking for
4889 e_phnum values which we know must be invalid. */
4890 if (filedata->file_header.e_phnum
4891 * (is_32bit_elf ? sizeof (Elf32_External_Phdr) : sizeof (Elf64_External_Phdr))
4892 >= filedata->file_size)
4893 {
4894 error (_("Too many program headers - %#x - the file is not that big\n"),
4895 filedata->file_header.e_phnum);
4896 return FALSE;
4897 }
4898
4899 phdrs = (Elf_Internal_Phdr *) cmalloc (filedata->file_header.e_phnum,
4900 sizeof (Elf_Internal_Phdr));
4901 if (phdrs == NULL)
4902 {
4903 error (_("Out of memory reading %u program headers\n"),
4904 filedata->file_header.e_phnum);
4905 return FALSE;
4906 }
4907
4908 if (is_32bit_elf
4909 ? get_32bit_program_headers (filedata, phdrs)
4910 : get_64bit_program_headers (filedata, phdrs))
4911 {
4912 filedata->program_headers = phdrs;
4913 return TRUE;
4914 }
4915
4916 free (phdrs);
4917 return FALSE;
4918 }
4919
4920 /* Returns TRUE if the program headers were loaded. */
4921
4922 static bfd_boolean
4923 process_program_headers (Filedata * filedata)
4924 {
4925 Elf_Internal_Phdr * segment;
4926 unsigned int i;
4927 Elf_Internal_Phdr * previous_load = NULL;
4928
4929 if (filedata->file_header.e_phnum == 0)
4930 {
4931 /* PR binutils/12467. */
4932 if (filedata->file_header.e_phoff != 0)
4933 {
4934 warn (_("possibly corrupt ELF header - it has a non-zero program"
4935 " header offset, but no program headers\n"));
4936 return FALSE;
4937 }
4938 else if (do_segments)
4939 printf (_("\nThere are no program headers in this file.\n"));
4940 return TRUE;
4941 }
4942
4943 if (do_segments && !do_header)
4944 {
4945 printf (_("\nElf file type is %s\n"), get_file_type (filedata->file_header.e_type));
4946 printf (_("Entry point 0x%s\n"), bfd_vmatoa ("x", filedata->file_header.e_entry));
4947 printf (ngettext ("There is %d program header, starting at offset %s\n",
4948 "There are %d program headers, starting at offset %s\n",
4949 filedata->file_header.e_phnum),
4950 filedata->file_header.e_phnum,
4951 bfd_vmatoa ("u", filedata->file_header.e_phoff));
4952 }
4953
4954 if (! get_program_headers (filedata))
4955 return TRUE;
4956
4957 if (do_segments)
4958 {
4959 if (filedata->file_header.e_phnum > 1)
4960 printf (_("\nProgram Headers:\n"));
4961 else
4962 printf (_("\nProgram Headers:\n"));
4963
4964 if (is_32bit_elf)
4965 printf
4966 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
4967 else if (do_wide)
4968 printf
4969 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
4970 else
4971 {
4972 printf
4973 (_(" Type Offset VirtAddr PhysAddr\n"));
4974 printf
4975 (_(" FileSiz MemSiz Flags Align\n"));
4976 }
4977 }
4978
4979 dynamic_addr = 0;
4980 dynamic_size = 0;
4981
4982 for (i = 0, segment = filedata->program_headers;
4983 i < filedata->file_header.e_phnum;
4984 i++, segment++)
4985 {
4986 if (do_segments)
4987 {
4988 printf (" %-14.14s ", get_segment_type (filedata, segment->p_type));
4989
4990 if (is_32bit_elf)
4991 {
4992 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4993 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
4994 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
4995 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
4996 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
4997 printf ("%c%c%c ",
4998 (segment->p_flags & PF_R ? 'R' : ' '),
4999 (segment->p_flags & PF_W ? 'W' : ' '),
5000 (segment->p_flags & PF_X ? 'E' : ' '));
5001 printf ("%#lx", (unsigned long) segment->p_align);
5002 }
5003 else if (do_wide)
5004 {
5005 if ((unsigned long) segment->p_offset == segment->p_offset)
5006 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
5007 else
5008 {
5009 print_vma (segment->p_offset, FULL_HEX);
5010 putchar (' ');
5011 }
5012
5013 print_vma (segment->p_vaddr, FULL_HEX);
5014 putchar (' ');
5015 print_vma (segment->p_paddr, FULL_HEX);
5016 putchar (' ');
5017
5018 if ((unsigned long) segment->p_filesz == segment->p_filesz)
5019 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
5020 else
5021 {
5022 print_vma (segment->p_filesz, FULL_HEX);
5023 putchar (' ');
5024 }
5025
5026 if ((unsigned long) segment->p_memsz == segment->p_memsz)
5027 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
5028 else
5029 {
5030 print_vma (segment->p_memsz, FULL_HEX);
5031 }
5032
5033 printf (" %c%c%c ",
5034 (segment->p_flags & PF_R ? 'R' : ' '),
5035 (segment->p_flags & PF_W ? 'W' : ' '),
5036 (segment->p_flags & PF_X ? 'E' : ' '));
5037
5038 if ((unsigned long) segment->p_align == segment->p_align)
5039 printf ("%#lx", (unsigned long) segment->p_align);
5040 else
5041 {
5042 print_vma (segment->p_align, PREFIX_HEX);
5043 }
5044 }
5045 else
5046 {
5047 print_vma (segment->p_offset, FULL_HEX);
5048 putchar (' ');
5049 print_vma (segment->p_vaddr, FULL_HEX);
5050 putchar (' ');
5051 print_vma (segment->p_paddr, FULL_HEX);
5052 printf ("\n ");
5053 print_vma (segment->p_filesz, FULL_HEX);
5054 putchar (' ');
5055 print_vma (segment->p_memsz, FULL_HEX);
5056 printf (" %c%c%c ",
5057 (segment->p_flags & PF_R ? 'R' : ' '),
5058 (segment->p_flags & PF_W ? 'W' : ' '),
5059 (segment->p_flags & PF_X ? 'E' : ' '));
5060 print_vma (segment->p_align, PREFIX_HEX);
5061 }
5062
5063 putc ('\n', stdout);
5064 }
5065
5066 switch (segment->p_type)
5067 {
5068 case PT_LOAD:
5069 #if 0 /* Do not warn about out of order PT_LOAD segments. Although officially
5070 required by the ELF standard, several programs, including the Linux
5071 kernel, make use of non-ordered segments. */
5072 if (previous_load
5073 && previous_load->p_vaddr > segment->p_vaddr)
5074 error (_("LOAD segments must be sorted in order of increasing VirtAddr\n"));
5075 #endif
5076 if (segment->p_memsz < segment->p_filesz)
5077 error (_("the segment's file size is larger than its memory size\n"));
5078 previous_load = segment;
5079 break;
5080
5081 case PT_PHDR:
5082 /* PR 20815 - Verify that the program header is loaded into memory. */
5083 if (i > 0 && previous_load != NULL)
5084 error (_("the PHDR segment must occur before any LOAD segment\n"));
5085 if (filedata->file_header.e_machine != EM_PARISC)
5086 {
5087 unsigned int j;
5088
5089 for (j = 1; j < filedata->file_header.e_phnum; j++)
5090 if (filedata->program_headers[j].p_vaddr <= segment->p_vaddr
5091 && (filedata->program_headers[j].p_vaddr
5092 + filedata->program_headers[j].p_memsz)
5093 >= (segment->p_vaddr + segment->p_filesz))
5094 break;
5095 if (j == filedata->file_header.e_phnum)
5096 error (_("the PHDR segment is not covered by a LOAD segment\n"));
5097 }
5098 break;
5099
5100 case PT_DYNAMIC:
5101 if (dynamic_addr)
5102 error (_("more than one dynamic segment\n"));
5103
5104 /* By default, assume that the .dynamic section is the first
5105 section in the DYNAMIC segment. */
5106 dynamic_addr = segment->p_offset;
5107 dynamic_size = segment->p_filesz;
5108
5109 /* Try to locate the .dynamic section. If there is
5110 a section header table, we can easily locate it. */
5111 if (filedata->section_headers != NULL)
5112 {
5113 Elf_Internal_Shdr * sec;
5114
5115 sec = find_section (filedata, ".dynamic");
5116 if (sec == NULL || sec->sh_size == 0)
5117 {
5118 /* A corresponding .dynamic section is expected, but on
5119 IA-64/OpenVMS it is OK for it to be missing. */
5120 if (!is_ia64_vms (filedata))
5121 error (_("no .dynamic section in the dynamic segment\n"));
5122 break;
5123 }
5124
5125 if (sec->sh_type == SHT_NOBITS)
5126 {
5127 dynamic_size = 0;
5128 break;
5129 }
5130
5131 dynamic_addr = sec->sh_offset;
5132 dynamic_size = sec->sh_size;
5133
5134 if (dynamic_addr < segment->p_offset
5135 || dynamic_addr > segment->p_offset + segment->p_filesz)
5136 warn (_("the .dynamic section is not contained"
5137 " within the dynamic segment\n"));
5138 else if (dynamic_addr > segment->p_offset)
5139 warn (_("the .dynamic section is not the first section"
5140 " in the dynamic segment.\n"));
5141 }
5142
5143 /* PR binutils/17512: Avoid corrupt dynamic section info in the
5144 segment. Check this after matching against the section headers
5145 so we don't warn on debuginfo file (which have NOBITS .dynamic
5146 sections). */
5147 if (dynamic_addr + dynamic_size >= filedata->file_size)
5148 {
5149 error (_("the dynamic segment offset + size exceeds the size of the file\n"));
5150 dynamic_addr = dynamic_size = 0;
5151 }
5152 break;
5153
5154 case PT_INTERP:
5155 if (fseek (filedata->handle, archive_file_offset + (long) segment->p_offset,
5156 SEEK_SET))
5157 error (_("Unable to find program interpreter name\n"));
5158 else
5159 {
5160 char fmt [32];
5161 int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
5162
5163 if (ret >= (int) sizeof (fmt) || ret < 0)
5164 error (_("Internal error: failed to create format string to display program interpreter\n"));
5165
5166 program_interpreter[0] = 0;
5167 if (fscanf (filedata->handle, fmt, program_interpreter) <= 0)
5168 error (_("Unable to read program interpreter name\n"));
5169
5170 if (do_segments)
5171 printf (_(" [Requesting program interpreter: %s]\n"),
5172 program_interpreter);
5173 }
5174 break;
5175 }
5176 }
5177
5178 if (do_segments
5179 && filedata->section_headers != NULL
5180 && filedata->string_table != NULL)
5181 {
5182 printf (_("\n Section to Segment mapping:\n"));
5183 printf (_(" Segment Sections...\n"));
5184
5185 for (i = 0; i < filedata->file_header.e_phnum; i++)
5186 {
5187 unsigned int j;
5188 Elf_Internal_Shdr * section;
5189
5190 segment = filedata->program_headers + i;
5191 section = filedata->section_headers + 1;
5192
5193 printf (" %2.2d ", i);
5194
5195 for (j = 1; j < filedata->file_header.e_shnum; j++, section++)
5196 {
5197 if (!ELF_TBSS_SPECIAL (section, segment)
5198 && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
5199 printf ("%s ", printable_section_name (filedata, section));
5200 }
5201
5202 putc ('\n',stdout);
5203 }
5204 }
5205
5206 return TRUE;
5207 }
5208
5209
5210 /* Find the file offset corresponding to VMA by using the program headers. */
5211
5212 static long
5213 offset_from_vma (Filedata * filedata, bfd_vma vma, bfd_size_type size)
5214 {
5215 Elf_Internal_Phdr * seg;
5216
5217 if (! get_program_headers (filedata))
5218 {
5219 warn (_("Cannot interpret virtual addresses without program headers.\n"));
5220 return (long) vma;
5221 }
5222
5223 for (seg = filedata->program_headers;
5224 seg < filedata->program_headers + filedata->file_header.e_phnum;
5225 ++seg)
5226 {
5227 if (seg->p_type != PT_LOAD)
5228 continue;
5229
5230 if (vma >= (seg->p_vaddr & -seg->p_align)
5231 && vma + size <= seg->p_vaddr + seg->p_filesz)
5232 return vma - seg->p_vaddr + seg->p_offset;
5233 }
5234
5235 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
5236 (unsigned long) vma);
5237 return (long) vma;
5238 }
5239
5240
5241 /* Allocate memory and load the sections headers into FILEDATA->filedata->section_headers.
5242 If PROBE is true, this is just a probe and we do not generate any error
5243 messages if the load fails. */
5244
5245 static bfd_boolean
5246 get_32bit_section_headers (Filedata * filedata, bfd_boolean probe)
5247 {
5248 Elf32_External_Shdr * shdrs;
5249 Elf_Internal_Shdr * internal;
5250 unsigned int i;
5251 unsigned int size = filedata->file_header.e_shentsize;
5252 unsigned int num = probe ? 1 : filedata->file_header.e_shnum;
5253
5254 /* PR binutils/17531: Cope with unexpected section header sizes. */
5255 if (size == 0 || num == 0)
5256 return FALSE;
5257 if (size < sizeof * shdrs)
5258 {
5259 if (! probe)
5260 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5261 return FALSE;
5262 }
5263 if (!probe && size > sizeof * shdrs)
5264 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5265
5266 shdrs = (Elf32_External_Shdr *) get_data (NULL, filedata, filedata->file_header.e_shoff,
5267 size, num,
5268 probe ? NULL : _("section headers"));
5269 if (shdrs == NULL)
5270 return FALSE;
5271
5272 free (filedata->section_headers);
5273 filedata->section_headers = (Elf_Internal_Shdr *)
5274 cmalloc (num, sizeof (Elf_Internal_Shdr));
5275 if (filedata->section_headers == NULL)
5276 {
5277 if (!probe)
5278 error (_("Out of memory reading %u section headers\n"), num);
5279 return FALSE;
5280 }
5281
5282 for (i = 0, internal = filedata->section_headers;
5283 i < num;
5284 i++, internal++)
5285 {
5286 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5287 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
5288 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5289 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5290 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5291 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5292 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5293 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5294 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5295 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
5296 if (!probe && internal->sh_link > num)
5297 warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5298 if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5299 warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5300 }
5301
5302 free (shdrs);
5303 return TRUE;
5304 }
5305
5306 /* Like get_32bit_section_headers, except that it fetches 64-bit headers. */
5307
5308 static bfd_boolean
5309 get_64bit_section_headers (Filedata * filedata, bfd_boolean probe)
5310 {
5311 Elf64_External_Shdr * shdrs;
5312 Elf_Internal_Shdr * internal;
5313 unsigned int i;
5314 unsigned int size = filedata->file_header.e_shentsize;
5315 unsigned int num = probe ? 1 : filedata->file_header.e_shnum;
5316
5317 /* PR binutils/17531: Cope with unexpected section header sizes. */
5318 if (size == 0 || num == 0)
5319 return FALSE;
5320
5321 if (size < sizeof * shdrs)
5322 {
5323 if (! probe)
5324 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5325 return FALSE;
5326 }
5327
5328 if (! probe && size > sizeof * shdrs)
5329 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5330
5331 shdrs = (Elf64_External_Shdr *) get_data (NULL, filedata,
5332 filedata->file_header.e_shoff,
5333 size, num,
5334 probe ? NULL : _("section headers"));
5335 if (shdrs == NULL)
5336 return FALSE;
5337
5338 free (filedata->section_headers);
5339 filedata->section_headers = (Elf_Internal_Shdr *)
5340 cmalloc (num, sizeof (Elf_Internal_Shdr));
5341 if (filedata->section_headers == NULL)
5342 {
5343 if (! probe)
5344 error (_("Out of memory reading %u section headers\n"), num);
5345 return FALSE;
5346 }
5347
5348 for (i = 0, internal = filedata->section_headers;
5349 i < num;
5350 i++, internal++)
5351 {
5352 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5353 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
5354 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5355 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5356 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5357 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
5358 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5359 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5360 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5361 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5362 if (!probe && internal->sh_link > num)
5363 warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5364 if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5365 warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5366 }
5367
5368 free (shdrs);
5369 return TRUE;
5370 }
5371
5372 static Elf_Internal_Sym *
5373 get_32bit_elf_symbols (Filedata * filedata,
5374 Elf_Internal_Shdr * section,
5375 unsigned long * num_syms_return)
5376 {
5377 unsigned long number = 0;
5378 Elf32_External_Sym * esyms = NULL;
5379 Elf_External_Sym_Shndx * shndx = NULL;
5380 Elf_Internal_Sym * isyms = NULL;
5381 Elf_Internal_Sym * psym;
5382 unsigned int j;
5383
5384 if (section->sh_size == 0)
5385 {
5386 if (num_syms_return != NULL)
5387 * num_syms_return = 0;
5388 return NULL;
5389 }
5390
5391 /* Run some sanity checks first. */
5392 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5393 {
5394 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5395 printable_section_name (filedata, section),
5396 (unsigned long) section->sh_entsize);
5397 goto exit_point;
5398 }
5399
5400 if (section->sh_size > filedata->file_size)
5401 {
5402 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5403 printable_section_name (filedata, section),
5404 (unsigned long) section->sh_size);
5405 goto exit_point;
5406 }
5407
5408 number = section->sh_size / section->sh_entsize;
5409
5410 if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
5411 {
5412 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5413 (unsigned long) section->sh_size,
5414 printable_section_name (filedata, section),
5415 (unsigned long) section->sh_entsize);
5416 goto exit_point;
5417 }
5418
5419 esyms = (Elf32_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
5420 section->sh_size, _("symbols"));
5421 if (esyms == NULL)
5422 goto exit_point;
5423
5424 {
5425 elf_section_list * entry;
5426
5427 shndx = NULL;
5428 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5429 if (entry->hdr->sh_link == (unsigned long) (section - filedata->section_headers))
5430 {
5431 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
5432 entry->hdr->sh_offset,
5433 1, entry->hdr->sh_size,
5434 _("symbol table section indicies"));
5435 if (shndx == NULL)
5436 goto exit_point;
5437 /* PR17531: file: heap-buffer-overflow */
5438 else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5439 {
5440 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5441 printable_section_name (filedata, entry->hdr),
5442 (unsigned long) entry->hdr->sh_size,
5443 (unsigned long) section->sh_size);
5444 goto exit_point;
5445 }
5446 }
5447 }
5448
5449 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5450
5451 if (isyms == NULL)
5452 {
5453 error (_("Out of memory reading %lu symbols\n"),
5454 (unsigned long) number);
5455 goto exit_point;
5456 }
5457
5458 for (j = 0, psym = isyms; j < number; j++, psym++)
5459 {
5460 psym->st_name = BYTE_GET (esyms[j].st_name);
5461 psym->st_value = BYTE_GET (esyms[j].st_value);
5462 psym->st_size = BYTE_GET (esyms[j].st_size);
5463 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5464 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5465 psym->st_shndx
5466 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5467 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5468 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5469 psym->st_info = BYTE_GET (esyms[j].st_info);
5470 psym->st_other = BYTE_GET (esyms[j].st_other);
5471 }
5472
5473 exit_point:
5474 if (shndx != NULL)
5475 free (shndx);
5476 if (esyms != NULL)
5477 free (esyms);
5478
5479 if (num_syms_return != NULL)
5480 * num_syms_return = isyms == NULL ? 0 : number;
5481
5482 return isyms;
5483 }
5484
5485 static Elf_Internal_Sym *
5486 get_64bit_elf_symbols (Filedata * filedata,
5487 Elf_Internal_Shdr * section,
5488 unsigned long * num_syms_return)
5489 {
5490 unsigned long number = 0;
5491 Elf64_External_Sym * esyms = NULL;
5492 Elf_External_Sym_Shndx * shndx = NULL;
5493 Elf_Internal_Sym * isyms = NULL;
5494 Elf_Internal_Sym * psym;
5495 unsigned int j;
5496
5497 if (section->sh_size == 0)
5498 {
5499 if (num_syms_return != NULL)
5500 * num_syms_return = 0;
5501 return NULL;
5502 }
5503
5504 /* Run some sanity checks first. */
5505 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5506 {
5507 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5508 printable_section_name (filedata, section),
5509 (unsigned long) section->sh_entsize);
5510 goto exit_point;
5511 }
5512
5513 if (section->sh_size > filedata->file_size)
5514 {
5515 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5516 printable_section_name (filedata, section),
5517 (unsigned long) section->sh_size);
5518 goto exit_point;
5519 }
5520
5521 number = section->sh_size / section->sh_entsize;
5522
5523 if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5524 {
5525 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5526 (unsigned long) section->sh_size,
5527 printable_section_name (filedata, section),
5528 (unsigned long) section->sh_entsize);
5529 goto exit_point;
5530 }
5531
5532 esyms = (Elf64_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
5533 section->sh_size, _("symbols"));
5534 if (!esyms)
5535 goto exit_point;
5536
5537 {
5538 elf_section_list * entry;
5539
5540 shndx = NULL;
5541 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5542 if (entry->hdr->sh_link == (unsigned long) (section - filedata->section_headers))
5543 {
5544 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
5545 entry->hdr->sh_offset,
5546 1, entry->hdr->sh_size,
5547 _("symbol table section indicies"));
5548 if (shndx == NULL)
5549 goto exit_point;
5550 /* PR17531: file: heap-buffer-overflow */
5551 else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5552 {
5553 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5554 printable_section_name (filedata, entry->hdr),
5555 (unsigned long) entry->hdr->sh_size,
5556 (unsigned long) section->sh_size);
5557 goto exit_point;
5558 }
5559 }
5560 }
5561
5562 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5563
5564 if (isyms == NULL)
5565 {
5566 error (_("Out of memory reading %lu symbols\n"),
5567 (unsigned long) number);
5568 goto exit_point;
5569 }
5570
5571 for (j = 0, psym = isyms; j < number; j++, psym++)
5572 {
5573 psym->st_name = BYTE_GET (esyms[j].st_name);
5574 psym->st_info = BYTE_GET (esyms[j].st_info);
5575 psym->st_other = BYTE_GET (esyms[j].st_other);
5576 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5577
5578 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5579 psym->st_shndx
5580 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5581 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5582 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5583
5584 psym->st_value = BYTE_GET (esyms[j].st_value);
5585 psym->st_size = BYTE_GET (esyms[j].st_size);
5586 }
5587
5588 exit_point:
5589 if (shndx != NULL)
5590 free (shndx);
5591 if (esyms != NULL)
5592 free (esyms);
5593
5594 if (num_syms_return != NULL)
5595 * num_syms_return = isyms == NULL ? 0 : number;
5596
5597 return isyms;
5598 }
5599
5600 static const char *
5601 get_elf_section_flags (Filedata * filedata, bfd_vma sh_flags)
5602 {
5603 static char buff[1024];
5604 char * p = buff;
5605 unsigned int field_size = is_32bit_elf ? 8 : 16;
5606 signed int sindex;
5607 unsigned int size = sizeof (buff) - (field_size + 4 + 1);
5608 bfd_vma os_flags = 0;
5609 bfd_vma proc_flags = 0;
5610 bfd_vma unknown_flags = 0;
5611 static const struct
5612 {
5613 const char * str;
5614 unsigned int len;
5615 }
5616 flags [] =
5617 {
5618 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
5619 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
5620 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
5621 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
5622 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
5623 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
5624 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5625 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5626 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
5627 /* 9 */ { STRING_COMMA_LEN ("TLS") },
5628 /* IA-64 specific. */
5629 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5630 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5631 /* IA-64 OpenVMS specific. */
5632 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5633 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5634 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5635 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5636 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5637 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
5638 /* Generic. */
5639 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
5640 /* SPARC specific. */
5641 /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
5642 /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5643 /* ARM specific. */
5644 /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
5645 /* 22 */ { STRING_COMMA_LEN ("ARM_PURECODE") },
5646 /* 23 */ { STRING_COMMA_LEN ("COMDEF") },
5647 /* GNU specific. */
5648 /* 24 */ { STRING_COMMA_LEN ("GNU_MBIND") },
5649 /* VLE specific. */
5650 /* 25 */ { STRING_COMMA_LEN ("VLE") },
5651 };
5652
5653 if (do_section_details)
5654 {
5655 sprintf (buff, "[%*.*lx]: ",
5656 field_size, field_size, (unsigned long) sh_flags);
5657 p += field_size + 4;
5658 }
5659
5660 while (sh_flags)
5661 {
5662 bfd_vma flag;
5663
5664 flag = sh_flags & - sh_flags;
5665 sh_flags &= ~ flag;
5666
5667 if (do_section_details)
5668 {
5669 switch (flag)
5670 {
5671 case SHF_WRITE: sindex = 0; break;
5672 case SHF_ALLOC: sindex = 1; break;
5673 case SHF_EXECINSTR: sindex = 2; break;
5674 case SHF_MERGE: sindex = 3; break;
5675 case SHF_STRINGS: sindex = 4; break;
5676 case SHF_INFO_LINK: sindex = 5; break;
5677 case SHF_LINK_ORDER: sindex = 6; break;
5678 case SHF_OS_NONCONFORMING: sindex = 7; break;
5679 case SHF_GROUP: sindex = 8; break;
5680 case SHF_TLS: sindex = 9; break;
5681 case SHF_EXCLUDE: sindex = 18; break;
5682 case SHF_COMPRESSED: sindex = 20; break;
5683 case SHF_GNU_MBIND: sindex = 24; break;
5684
5685 default:
5686 sindex = -1;
5687 switch (filedata->file_header.e_machine)
5688 {
5689 case EM_IA_64:
5690 if (flag == SHF_IA_64_SHORT)
5691 sindex = 10;
5692 else if (flag == SHF_IA_64_NORECOV)
5693 sindex = 11;
5694 #ifdef BFD64
5695 else if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5696 switch (flag)
5697 {
5698 case SHF_IA_64_VMS_GLOBAL: sindex = 12; break;
5699 case SHF_IA_64_VMS_OVERLAID: sindex = 13; break;
5700 case SHF_IA_64_VMS_SHARED: sindex = 14; break;
5701 case SHF_IA_64_VMS_VECTOR: sindex = 15; break;
5702 case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5703 case SHF_IA_64_VMS_PROTECTED: sindex = 17; break;
5704 default: break;
5705 }
5706 #endif
5707 break;
5708
5709 case EM_386:
5710 case EM_IAMCU:
5711 case EM_X86_64:
5712 case EM_L1OM:
5713 case EM_K1OM:
5714 case EM_OLD_SPARCV9:
5715 case EM_SPARC32PLUS:
5716 case EM_SPARCV9:
5717 case EM_SPARC:
5718 if (flag == SHF_ORDERED)
5719 sindex = 19;
5720 break;
5721
5722 case EM_ARM:
5723 switch (flag)
5724 {
5725 case SHF_ENTRYSECT: sindex = 21; break;
5726 case SHF_ARM_PURECODE: sindex = 22; break;
5727 case SHF_COMDEF: sindex = 23; break;
5728 default: break;
5729 }
5730 break;
5731 case EM_PPC:
5732 if (flag == SHF_PPC_VLE)
5733 sindex = 25;
5734 break;
5735
5736 default:
5737 break;
5738 }
5739 }
5740
5741 if (sindex != -1)
5742 {
5743 if (p != buff + field_size + 4)
5744 {
5745 if (size < (10 + 2))
5746 {
5747 warn (_("Internal error: not enough buffer room for section flag info"));
5748 return _("<unknown>");
5749 }
5750 size -= 2;
5751 *p++ = ',';
5752 *p++ = ' ';
5753 }
5754
5755 size -= flags [sindex].len;
5756 p = stpcpy (p, flags [sindex].str);
5757 }
5758 else if (flag & SHF_MASKOS)
5759 os_flags |= flag;
5760 else if (flag & SHF_MASKPROC)
5761 proc_flags |= flag;
5762 else
5763 unknown_flags |= flag;
5764 }
5765 else
5766 {
5767 switch (flag)
5768 {
5769 case SHF_WRITE: *p = 'W'; break;
5770 case SHF_ALLOC: *p = 'A'; break;
5771 case SHF_EXECINSTR: *p = 'X'; break;
5772 case SHF_MERGE: *p = 'M'; break;
5773 case SHF_STRINGS: *p = 'S'; break;
5774 case SHF_INFO_LINK: *p = 'I'; break;
5775 case SHF_LINK_ORDER: *p = 'L'; break;
5776 case SHF_OS_NONCONFORMING: *p = 'O'; break;
5777 case SHF_GROUP: *p = 'G'; break;
5778 case SHF_TLS: *p = 'T'; break;
5779 case SHF_EXCLUDE: *p = 'E'; break;
5780 case SHF_COMPRESSED: *p = 'C'; break;
5781 case SHF_GNU_MBIND: *p = 'D'; break;
5782
5783 default:
5784 if ((filedata->file_header.e_machine == EM_X86_64
5785 || filedata->file_header.e_machine == EM_L1OM
5786 || filedata->file_header.e_machine == EM_K1OM)
5787 && flag == SHF_X86_64_LARGE)
5788 *p = 'l';
5789 else if (filedata->file_header.e_machine == EM_ARM
5790 && flag == SHF_ARM_PURECODE)
5791 *p = 'y';
5792 else if (filedata->file_header.e_machine == EM_PPC
5793 && flag == SHF_PPC_VLE)
5794 *p = 'v';
5795 else if (flag & SHF_MASKOS)
5796 {
5797 *p = 'o';
5798 sh_flags &= ~ SHF_MASKOS;
5799 }
5800 else if (flag & SHF_MASKPROC)
5801 {
5802 *p = 'p';
5803 sh_flags &= ~ SHF_MASKPROC;
5804 }
5805 else
5806 *p = 'x';
5807 break;
5808 }
5809 p++;
5810 }
5811 }
5812
5813 if (do_section_details)
5814 {
5815 if (os_flags)
5816 {
5817 size -= 5 + field_size;
5818 if (p != buff + field_size + 4)
5819 {
5820 if (size < (2 + 1))
5821 {
5822 warn (_("Internal error: not enough buffer room for section flag info"));
5823 return _("<unknown>");
5824 }
5825 size -= 2;
5826 *p++ = ',';
5827 *p++ = ' ';
5828 }
5829 sprintf (p, "OS (%*.*lx)", field_size, field_size,
5830 (unsigned long) os_flags);
5831 p += 5 + field_size;
5832 }
5833 if (proc_flags)
5834 {
5835 size -= 7 + field_size;
5836 if (p != buff + field_size + 4)
5837 {
5838 if (size < (2 + 1))
5839 {
5840 warn (_("Internal error: not enough buffer room for section flag info"));
5841 return _("<unknown>");
5842 }
5843 size -= 2;
5844 *p++ = ',';
5845 *p++ = ' ';
5846 }
5847 sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5848 (unsigned long) proc_flags);
5849 p += 7 + field_size;
5850 }
5851 if (unknown_flags)
5852 {
5853 size -= 10 + field_size;
5854 if (p != buff + field_size + 4)
5855 {
5856 if (size < (2 + 1))
5857 {
5858 warn (_("Internal error: not enough buffer room for section flag info"));
5859 return _("<unknown>");
5860 }
5861 size -= 2;
5862 *p++ = ',';
5863 *p++ = ' ';
5864 }
5865 sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
5866 (unsigned long) unknown_flags);
5867 p += 10 + field_size;
5868 }
5869 }
5870
5871 *p = '\0';
5872 return buff;
5873 }
5874
5875 static unsigned int
5876 get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf, bfd_size_type size)
5877 {
5878 if (is_32bit_elf)
5879 {
5880 Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
5881
5882 if (size < sizeof (* echdr))
5883 {
5884 error (_("Compressed section is too small even for a compression header\n"));
5885 return 0;
5886 }
5887
5888 chdr->ch_type = BYTE_GET (echdr->ch_type);
5889 chdr->ch_size = BYTE_GET (echdr->ch_size);
5890 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5891 return sizeof (*echdr);
5892 }
5893 else
5894 {
5895 Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) buf;
5896
5897 if (size < sizeof (* echdr))
5898 {
5899 error (_("Compressed section is too small even for a compression header\n"));
5900 return 0;
5901 }
5902
5903 chdr->ch_type = BYTE_GET (echdr->ch_type);
5904 chdr->ch_size = BYTE_GET (echdr->ch_size);
5905 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5906 return sizeof (*echdr);
5907 }
5908 }
5909
5910 static bfd_boolean
5911 process_section_headers (Filedata * filedata)
5912 {
5913 Elf_Internal_Shdr * section;
5914 unsigned int i;
5915
5916 filedata->section_headers = NULL;
5917
5918 if (filedata->file_header.e_shnum == 0)
5919 {
5920 /* PR binutils/12467. */
5921 if (filedata->file_header.e_shoff != 0)
5922 {
5923 warn (_("possibly corrupt ELF file header - it has a non-zero"
5924 " section header offset, but no section headers\n"));
5925 return FALSE;
5926 }
5927 else if (do_sections)
5928 printf (_("\nThere are no sections in this file.\n"));
5929
5930 return TRUE;
5931 }
5932
5933 if (do_sections && !do_header)
5934 printf (ngettext ("There is %d section header, "
5935 "starting at offset 0x%lx:\n",
5936 "There are %d section headers, "
5937 "starting at offset 0x%lx:\n",
5938 filedata->file_header.e_shnum),
5939 filedata->file_header.e_shnum,
5940 (unsigned long) filedata->file_header.e_shoff);
5941
5942 if (is_32bit_elf)
5943 {
5944 if (! get_32bit_section_headers (filedata, FALSE))
5945 return FALSE;
5946 }
5947 else
5948 {
5949 if (! get_64bit_section_headers (filedata, FALSE))
5950 return FALSE;
5951 }
5952
5953 /* Read in the string table, so that we have names to display. */
5954 if (filedata->file_header.e_shstrndx != SHN_UNDEF
5955 && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
5956 {
5957 section = filedata->section_headers + filedata->file_header.e_shstrndx;
5958
5959 if (section->sh_size != 0)
5960 {
5961 filedata->string_table = (char *) get_data (NULL, filedata, section->sh_offset,
5962 1, section->sh_size,
5963 _("string table"));
5964
5965 filedata->string_table_length = filedata->string_table != NULL ? section->sh_size : 0;
5966 }
5967 }
5968
5969 /* Scan the sections for the dynamic symbol table
5970 and dynamic string table and debug sections. */
5971 dynamic_symbols = NULL;
5972 dynamic_strings = NULL;
5973 dynamic_syminfo = NULL;
5974 symtab_shndx_list = NULL;
5975
5976 eh_addr_size = is_32bit_elf ? 4 : 8;
5977 switch (filedata->file_header.e_machine)
5978 {
5979 case EM_MIPS:
5980 case EM_MIPS_RS3_LE:
5981 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
5982 FDE addresses. However, the ABI also has a semi-official ILP32
5983 variant for which the normal FDE address size rules apply.
5984
5985 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
5986 section, where XX is the size of longs in bits. Unfortunately,
5987 earlier compilers provided no way of distinguishing ILP32 objects
5988 from LP64 objects, so if there's any doubt, we should assume that
5989 the official LP64 form is being used. */
5990 if ((filedata->file_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
5991 && find_section (filedata, ".gcc_compiled_long32") == NULL)
5992 eh_addr_size = 8;
5993 break;
5994
5995 case EM_H8_300:
5996 case EM_H8_300H:
5997 switch (filedata->file_header.e_flags & EF_H8_MACH)
5998 {
5999 case E_H8_MACH_H8300:
6000 case E_H8_MACH_H8300HN:
6001 case E_H8_MACH_H8300SN:
6002 case E_H8_MACH_H8300SXN:
6003 eh_addr_size = 2;
6004 break;
6005 case E_H8_MACH_H8300H:
6006 case E_H8_MACH_H8300S:
6007 case E_H8_MACH_H8300SX:
6008 eh_addr_size = 4;
6009 break;
6010 }
6011 break;
6012
6013 case EM_M32C_OLD:
6014 case EM_M32C:
6015 switch (filedata->file_header.e_flags & EF_M32C_CPU_MASK)
6016 {
6017 case EF_M32C_CPU_M16C:
6018 eh_addr_size = 2;
6019 break;
6020 }
6021 break;
6022 }
6023
6024 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
6025 do \
6026 { \
6027 bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64; \
6028 if (section->sh_entsize != expected_entsize) \
6029 { \
6030 char buf[40]; \
6031 sprintf_vma (buf, section->sh_entsize); \
6032 /* Note: coded this way so that there is a single string for \
6033 translation. */ \
6034 error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
6035 error (_("(Using the expected size of %u for the rest of this dump)\n"), \
6036 (unsigned) expected_entsize); \
6037 section->sh_entsize = expected_entsize; \
6038 } \
6039 } \
6040 while (0)
6041
6042 #define CHECK_ENTSIZE(section, i, type) \
6043 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
6044 sizeof (Elf64_External_##type))
6045
6046 for (i = 0, section = filedata->section_headers;
6047 i < filedata->file_header.e_shnum;
6048 i++, section++)
6049 {
6050 char * name = SECTION_NAME (section);
6051
6052 if (section->sh_type == SHT_DYNSYM)
6053 {
6054 if (dynamic_symbols != NULL)
6055 {
6056 error (_("File contains multiple dynamic symbol tables\n"));
6057 continue;
6058 }
6059
6060 CHECK_ENTSIZE (section, i, Sym);
6061 dynamic_symbols = GET_ELF_SYMBOLS (filedata, section, & num_dynamic_syms);
6062 }
6063 else if (section->sh_type == SHT_STRTAB
6064 && streq (name, ".dynstr"))
6065 {
6066 if (dynamic_strings != NULL)
6067 {
6068 error (_("File contains multiple dynamic string tables\n"));
6069 continue;
6070 }
6071
6072 dynamic_strings = (char *) get_data (NULL, filedata, section->sh_offset,
6073 1, section->sh_size,
6074 _("dynamic strings"));
6075 dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
6076 }
6077 else if (section->sh_type == SHT_SYMTAB_SHNDX)
6078 {
6079 elf_section_list * entry = xmalloc (sizeof * entry);
6080
6081 entry->hdr = section;
6082 entry->next = symtab_shndx_list;
6083 symtab_shndx_list = entry;
6084 }
6085 else if (section->sh_type == SHT_SYMTAB)
6086 CHECK_ENTSIZE (section, i, Sym);
6087 else if (section->sh_type == SHT_GROUP)
6088 CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
6089 else if (section->sh_type == SHT_REL)
6090 CHECK_ENTSIZE (section, i, Rel);
6091 else if (section->sh_type == SHT_RELA)
6092 CHECK_ENTSIZE (section, i, Rela);
6093 else if ((do_debugging || do_debug_info || do_debug_abbrevs
6094 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
6095 || do_debug_aranges || do_debug_frames || do_debug_macinfo
6096 || do_debug_str || do_debug_loc || do_debug_ranges
6097 || do_debug_addr || do_debug_cu_index || do_debug_links)
6098 && (const_strneq (name, ".debug_")
6099 || const_strneq (name, ".zdebug_")))
6100 {
6101 if (name[1] == 'z')
6102 name += sizeof (".zdebug_") - 1;
6103 else
6104 name += sizeof (".debug_") - 1;
6105
6106 if (do_debugging
6107 || (do_debug_info && const_strneq (name, "info"))
6108 || (do_debug_info && const_strneq (name, "types"))
6109 || (do_debug_abbrevs && const_strneq (name, "abbrev"))
6110 || (do_debug_lines && strcmp (name, "line") == 0)
6111 || (do_debug_lines && const_strneq (name, "line."))
6112 || (do_debug_pubnames && const_strneq (name, "pubnames"))
6113 || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
6114 || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
6115 || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
6116 || (do_debug_aranges && const_strneq (name, "aranges"))
6117 || (do_debug_ranges && const_strneq (name, "ranges"))
6118 || (do_debug_ranges && const_strneq (name, "rnglists"))
6119 || (do_debug_frames && const_strneq (name, "frame"))
6120 || (do_debug_macinfo && const_strneq (name, "macinfo"))
6121 || (do_debug_macinfo && const_strneq (name, "macro"))
6122 || (do_debug_str && const_strneq (name, "str"))
6123 || (do_debug_loc && const_strneq (name, "loc"))
6124 || (do_debug_loc && const_strneq (name, "loclists"))
6125 || (do_debug_addr && const_strneq (name, "addr"))
6126 || (do_debug_cu_index && const_strneq (name, "cu_index"))
6127 || (do_debug_cu_index && const_strneq (name, "tu_index"))
6128 )
6129 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6130 }
6131 /* Linkonce section to be combined with .debug_info at link time. */
6132 else if ((do_debugging || do_debug_info)
6133 && const_strneq (name, ".gnu.linkonce.wi."))
6134 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6135 else if (do_debug_frames && streq (name, ".eh_frame"))
6136 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6137 else if (do_gdb_index && (streq (name, ".gdb_index")
6138 || streq (name, ".debug_names")))
6139 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6140 /* Trace sections for Itanium VMS. */
6141 else if ((do_debugging || do_trace_info || do_trace_abbrevs
6142 || do_trace_aranges)
6143 && const_strneq (name, ".trace_"))
6144 {
6145 name += sizeof (".trace_") - 1;
6146
6147 if (do_debugging
6148 || (do_trace_info && streq (name, "info"))
6149 || (do_trace_abbrevs && streq (name, "abbrev"))
6150 || (do_trace_aranges && streq (name, "aranges"))
6151 )
6152 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6153 }
6154 else if ((do_debugging || do_debug_links)
6155 && (const_strneq (name, ".gnu_debuglink")
6156 || const_strneq (name, ".gnu_debugaltlink")))
6157 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6158 }
6159
6160 if (! do_sections)
6161 return TRUE;
6162
6163 if (filedata->file_header.e_shnum > 1)
6164 printf (_("\nSection Headers:\n"));
6165 else
6166 printf (_("\nSection Header:\n"));
6167
6168 if (is_32bit_elf)
6169 {
6170 if (do_section_details)
6171 {
6172 printf (_(" [Nr] Name\n"));
6173 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
6174 }
6175 else
6176 printf
6177 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
6178 }
6179 else if (do_wide)
6180 {
6181 if (do_section_details)
6182 {
6183 printf (_(" [Nr] Name\n"));
6184 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
6185 }
6186 else
6187 printf
6188 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
6189 }
6190 else
6191 {
6192 if (do_section_details)
6193 {
6194 printf (_(" [Nr] Name\n"));
6195 printf (_(" Type Address Offset Link\n"));
6196 printf (_(" Size EntSize Info Align\n"));
6197 }
6198 else
6199 {
6200 printf (_(" [Nr] Name Type Address Offset\n"));
6201 printf (_(" Size EntSize Flags Link Info Align\n"));
6202 }
6203 }
6204
6205 if (do_section_details)
6206 printf (_(" Flags\n"));
6207
6208 for (i = 0, section = filedata->section_headers;
6209 i < filedata->file_header.e_shnum;
6210 i++, section++)
6211 {
6212 /* Run some sanity checks on the section header. */
6213
6214 /* Check the sh_link field. */
6215 switch (section->sh_type)
6216 {
6217 case SHT_SYMTAB_SHNDX:
6218 case SHT_GROUP:
6219 case SHT_HASH:
6220 case SHT_GNU_HASH:
6221 case SHT_GNU_versym:
6222 case SHT_REL:
6223 case SHT_RELA:
6224 if (section->sh_link < 1
6225 || section->sh_link >= filedata->file_header.e_shnum
6226 || (filedata->section_headers[section->sh_link].sh_type != SHT_SYMTAB
6227 && filedata->section_headers[section->sh_link].sh_type != SHT_DYNSYM))
6228 warn (_("[%2u]: Link field (%u) should index a symtab section.\n"),
6229 i, section->sh_link);
6230 break;
6231
6232 case SHT_DYNAMIC:
6233 case SHT_SYMTAB:
6234 case SHT_DYNSYM:
6235 case SHT_GNU_verneed:
6236 case SHT_GNU_verdef:
6237 case SHT_GNU_LIBLIST:
6238 if (section->sh_link < 1
6239 || section->sh_link >= filedata->file_header.e_shnum
6240 || filedata->section_headers[section->sh_link].sh_type != SHT_STRTAB)
6241 warn (_("[%2u]: Link field (%u) should index a string section.\n"),
6242 i, section->sh_link);
6243 break;
6244
6245 case SHT_INIT_ARRAY:
6246 case SHT_FINI_ARRAY:
6247 case SHT_PREINIT_ARRAY:
6248 if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6249 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6250 i, section->sh_link);
6251 break;
6252
6253 default:
6254 /* FIXME: Add support for target specific section types. */
6255 #if 0 /* Currently we do not check other section types as there are too
6256 many special cases. Stab sections for example have a type
6257 of SHT_PROGBITS but an sh_link field that links to the .stabstr
6258 section. */
6259 if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6260 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6261 i, section->sh_link);
6262 #endif
6263 break;
6264 }
6265
6266 /* Check the sh_info field. */
6267 switch (section->sh_type)
6268 {
6269 case SHT_REL:
6270 case SHT_RELA:
6271 if (section->sh_info < 1
6272 || section->sh_info >= filedata->file_header.e_shnum
6273 || (filedata->section_headers[section->sh_info].sh_type != SHT_PROGBITS
6274 && filedata->section_headers[section->sh_info].sh_type != SHT_NOBITS
6275 && filedata->section_headers[section->sh_info].sh_type != SHT_NOTE
6276 && filedata->section_headers[section->sh_info].sh_type != SHT_INIT_ARRAY
6277 /* FIXME: Are other section types valid ? */
6278 && filedata->section_headers[section->sh_info].sh_type < SHT_LOOS))
6279 {
6280 if (section->sh_info == 0
6281 && (filedata->file_header.e_type == ET_EXEC
6282 || filedata->file_header.e_type == ET_DYN
6283 /* These next two tests may be redundant, but
6284 they have been left in for paranoia's sake. */
6285 || streq (SECTION_NAME (section), ".rel.dyn")
6286 || streq (SECTION_NAME (section), ".rela.dyn")))
6287 /* Dynamic relocations apply to segments, not sections, so
6288 they do not need an sh_info value. */
6289 ;
6290 else
6291 warn (_("[%2u]: Info field (%u) should index a relocatable section.\n"),
6292 i, section->sh_info);
6293 }
6294 break;
6295
6296 case SHT_DYNAMIC:
6297 case SHT_HASH:
6298 case SHT_SYMTAB_SHNDX:
6299 case SHT_INIT_ARRAY:
6300 case SHT_FINI_ARRAY:
6301 case SHT_PREINIT_ARRAY:
6302 if (section->sh_info != 0)
6303 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6304 i, section->sh_info);
6305 break;
6306
6307 case SHT_GROUP:
6308 case SHT_SYMTAB:
6309 case SHT_DYNSYM:
6310 /* A symbol index - we assume that it is valid. */
6311 break;
6312
6313 default:
6314 /* FIXME: Add support for target specific section types. */
6315 if (section->sh_type == SHT_NOBITS)
6316 /* NOBITS section headers with non-zero sh_info fields can be
6317 created when a binary is stripped of everything but its debug
6318 information. The stripped sections have their headers
6319 preserved but their types set to SHT_NOBITS. So do not check
6320 this type of section. */
6321 ;
6322 else if (section->sh_flags & SHF_INFO_LINK)
6323 {
6324 if (section->sh_info < 1 || section->sh_info >= filedata->file_header.e_shnum)
6325 warn (_("[%2u]: Expected link to another section in info field"), i);
6326 }
6327 else if (section->sh_type < SHT_LOOS
6328 && (section->sh_flags & SHF_GNU_MBIND) == 0
6329 && section->sh_info != 0)
6330 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6331 i, section->sh_info);
6332 break;
6333 }
6334
6335 /* Check the sh_size field. */
6336 if (section->sh_size > filedata->file_size
6337 && section->sh_type != SHT_NOBITS
6338 && section->sh_type != SHT_NULL
6339 && section->sh_type < SHT_LOOS)
6340 warn (_("Size of section %u is larger than the entire file!\n"), i);
6341
6342 printf (" [%2u] ", i);
6343 if (do_section_details)
6344 printf ("%s\n ", printable_section_name (filedata, section));
6345 else
6346 print_symbol (-17, SECTION_NAME (section));
6347
6348 printf (do_wide ? " %-15s " : " %-15.15s ",
6349 get_section_type_name (filedata, section->sh_type));
6350
6351 if (is_32bit_elf)
6352 {
6353 const char * link_too_big = NULL;
6354
6355 print_vma (section->sh_addr, LONG_HEX);
6356
6357 printf ( " %6.6lx %6.6lx %2.2lx",
6358 (unsigned long) section->sh_offset,
6359 (unsigned long) section->sh_size,
6360 (unsigned long) section->sh_entsize);
6361
6362 if (do_section_details)
6363 fputs (" ", stdout);
6364 else
6365 printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6366
6367 if (section->sh_link >= filedata->file_header.e_shnum)
6368 {
6369 link_too_big = "";
6370 /* The sh_link value is out of range. Normally this indicates
6371 an error but it can have special values in Solaris binaries. */
6372 switch (filedata->file_header.e_machine)
6373 {
6374 case EM_386:
6375 case EM_IAMCU:
6376 case EM_X86_64:
6377 case EM_L1OM:
6378 case EM_K1OM:
6379 case EM_OLD_SPARCV9:
6380 case EM_SPARC32PLUS:
6381 case EM_SPARCV9:
6382 case EM_SPARC:
6383 if (section->sh_link == (SHN_BEFORE & 0xffff))
6384 link_too_big = "BEFORE";
6385 else if (section->sh_link == (SHN_AFTER & 0xffff))
6386 link_too_big = "AFTER";
6387 break;
6388 default:
6389 break;
6390 }
6391 }
6392
6393 if (do_section_details)
6394 {
6395 if (link_too_big != NULL && * link_too_big)
6396 printf ("<%s> ", link_too_big);
6397 else
6398 printf ("%2u ", section->sh_link);
6399 printf ("%3u %2lu\n", section->sh_info,
6400 (unsigned long) section->sh_addralign);
6401 }
6402 else
6403 printf ("%2u %3u %2lu\n",
6404 section->sh_link,
6405 section->sh_info,
6406 (unsigned long) section->sh_addralign);
6407
6408 if (link_too_big && ! * link_too_big)
6409 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
6410 i, section->sh_link);
6411 }
6412 else if (do_wide)
6413 {
6414 print_vma (section->sh_addr, LONG_HEX);
6415
6416 if ((long) section->sh_offset == section->sh_offset)
6417 printf (" %6.6lx", (unsigned long) section->sh_offset);
6418 else
6419 {
6420 putchar (' ');
6421 print_vma (section->sh_offset, LONG_HEX);
6422 }
6423
6424 if ((unsigned long) section->sh_size == section->sh_size)
6425 printf (" %6.6lx", (unsigned long) section->sh_size);
6426 else
6427 {
6428 putchar (' ');
6429 print_vma (section->sh_size, LONG_HEX);
6430 }
6431
6432 if ((unsigned long) section->sh_entsize == section->sh_entsize)
6433 printf (" %2.2lx", (unsigned long) section->sh_entsize);
6434 else
6435 {
6436 putchar (' ');
6437 print_vma (section->sh_entsize, LONG_HEX);
6438 }
6439
6440 if (do_section_details)
6441 fputs (" ", stdout);
6442 else
6443 printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6444
6445 printf ("%2u %3u ", section->sh_link, section->sh_info);
6446
6447 if ((unsigned long) section->sh_addralign == section->sh_addralign)
6448 printf ("%2lu\n", (unsigned long) section->sh_addralign);
6449 else
6450 {
6451 print_vma (section->sh_addralign, DEC);
6452 putchar ('\n');
6453 }
6454 }
6455 else if (do_section_details)
6456 {
6457 printf (" %-15.15s ",
6458 get_section_type_name (filedata, section->sh_type));
6459 print_vma (section->sh_addr, LONG_HEX);
6460 if ((long) section->sh_offset == section->sh_offset)
6461 printf (" %16.16lx", (unsigned long) section->sh_offset);
6462 else
6463 {
6464 printf (" ");
6465 print_vma (section->sh_offset, LONG_HEX);
6466 }
6467 printf (" %u\n ", section->sh_link);
6468 print_vma (section->sh_size, LONG_HEX);
6469 putchar (' ');
6470 print_vma (section->sh_entsize, LONG_HEX);
6471
6472 printf (" %-16u %lu\n",
6473 section->sh_info,
6474 (unsigned long) section->sh_addralign);
6475 }
6476 else
6477 {
6478 putchar (' ');
6479 print_vma (section->sh_addr, LONG_HEX);
6480 if ((long) section->sh_offset == section->sh_offset)
6481 printf (" %8.8lx", (unsigned long) section->sh_offset);
6482 else
6483 {
6484 printf (" ");
6485 print_vma (section->sh_offset, LONG_HEX);
6486 }
6487 printf ("\n ");
6488 print_vma (section->sh_size, LONG_HEX);
6489 printf (" ");
6490 print_vma (section->sh_entsize, LONG_HEX);
6491
6492 printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6493
6494 printf (" %2u %3u %lu\n",
6495 section->sh_link,
6496 section->sh_info,
6497 (unsigned long) section->sh_addralign);
6498 }
6499
6500 if (do_section_details)
6501 {
6502 printf (" %s\n", get_elf_section_flags (filedata, section->sh_flags));
6503 if ((section->sh_flags & SHF_COMPRESSED) != 0)
6504 {
6505 /* Minimum section size is 12 bytes for 32-bit compression
6506 header + 12 bytes for compressed data header. */
6507 unsigned char buf[24];
6508
6509 assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
6510 if (get_data (&buf, filedata, section->sh_offset, 1,
6511 sizeof (buf), _("compression header")))
6512 {
6513 Elf_Internal_Chdr chdr;
6514
6515 (void) get_compression_header (&chdr, buf, sizeof (buf));
6516
6517 if (chdr.ch_type == ELFCOMPRESS_ZLIB)
6518 printf (" ZLIB, ");
6519 else
6520 printf (_(" [<unknown>: 0x%x], "),
6521 chdr.ch_type);
6522 print_vma (chdr.ch_size, LONG_HEX);
6523 printf (", %lu\n", (unsigned long) chdr.ch_addralign);
6524 }
6525 }
6526 }
6527 }
6528
6529 if (!do_section_details)
6530 {
6531 /* The ordering of the letters shown here matches the ordering of the
6532 corresponding SHF_xxx values, and hence the order in which these
6533 letters will be displayed to the user. */
6534 printf (_("Key to Flags:\n\
6535 W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6536 L (link order), O (extra OS processing required), G (group), T (TLS),\n\
6537 C (compressed), x (unknown), o (OS specific), E (exclude),\n "));
6538 if (filedata->file_header.e_machine == EM_X86_64
6539 || filedata->file_header.e_machine == EM_L1OM
6540 || filedata->file_header.e_machine == EM_K1OM)
6541 printf (_("l (large), "));
6542 else if (filedata->file_header.e_machine == EM_ARM)
6543 printf (_("y (purecode), "));
6544 else if (filedata->file_header.e_machine == EM_PPC)
6545 printf (_("v (VLE), "));
6546 printf ("p (processor specific)\n");
6547 }
6548
6549 return TRUE;
6550 }
6551
6552 static const char *
6553 get_group_flags (unsigned int flags)
6554 {
6555 static char buff[128];
6556
6557 if (flags == 0)
6558 return "";
6559 else if (flags == GRP_COMDAT)
6560 return "COMDAT ";
6561
6562 snprintf (buff, 14, _("[0x%x: "), flags);
6563
6564 flags &= ~ GRP_COMDAT;
6565 if (flags & GRP_MASKOS)
6566 {
6567 strcat (buff, "<OS specific>");
6568 flags &= ~ GRP_MASKOS;
6569 }
6570
6571 if (flags & GRP_MASKPROC)
6572 {
6573 strcat (buff, "<PROC specific>");
6574 flags &= ~ GRP_MASKPROC;
6575 }
6576
6577 if (flags)
6578 strcat (buff, "<unknown>");
6579
6580 strcat (buff, "]");
6581 return buff;
6582 }
6583
6584 static bfd_boolean
6585 process_section_groups (Filedata * filedata)
6586 {
6587 Elf_Internal_Shdr * section;
6588 unsigned int i;
6589 struct group * group;
6590 Elf_Internal_Shdr * symtab_sec;
6591 Elf_Internal_Shdr * strtab_sec;
6592 Elf_Internal_Sym * symtab;
6593 unsigned long num_syms;
6594 char * strtab;
6595 size_t strtab_size;
6596
6597 /* Don't process section groups unless needed. */
6598 if (!do_unwind && !do_section_groups)
6599 return TRUE;
6600
6601 if (filedata->file_header.e_shnum == 0)
6602 {
6603 if (do_section_groups)
6604 printf (_("\nThere are no sections to group in this file.\n"));
6605
6606 return TRUE;
6607 }
6608
6609 if (filedata->section_headers == NULL)
6610 {
6611 error (_("Section headers are not available!\n"));
6612 /* PR 13622: This can happen with a corrupt ELF header. */
6613 return FALSE;
6614 }
6615
6616 section_headers_groups = (struct group **) calloc (filedata->file_header.e_shnum,
6617 sizeof (struct group *));
6618
6619 if (section_headers_groups == NULL)
6620 {
6621 error (_("Out of memory reading %u section group headers\n"),
6622 filedata->file_header.e_shnum);
6623 return FALSE;
6624 }
6625
6626 /* Scan the sections for the group section. */
6627 group_count = 0;
6628 for (i = 0, section = filedata->section_headers;
6629 i < filedata->file_header.e_shnum;
6630 i++, section++)
6631 if (section->sh_type == SHT_GROUP)
6632 group_count++;
6633
6634 if (group_count == 0)
6635 {
6636 if (do_section_groups)
6637 printf (_("\nThere are no section groups in this file.\n"));
6638
6639 return TRUE;
6640 }
6641
6642 section_groups = (struct group *) calloc (group_count, sizeof (struct group));
6643
6644 if (section_groups == NULL)
6645 {
6646 error (_("Out of memory reading %lu groups\n"),
6647 (unsigned long) group_count);
6648 return FALSE;
6649 }
6650
6651 symtab_sec = NULL;
6652 strtab_sec = NULL;
6653 symtab = NULL;
6654 num_syms = 0;
6655 strtab = NULL;
6656 strtab_size = 0;
6657 for (i = 0, section = filedata->section_headers, group = section_groups;
6658 i < filedata->file_header.e_shnum;
6659 i++, section++)
6660 {
6661 if (section->sh_type == SHT_GROUP)
6662 {
6663 const char * name = printable_section_name (filedata, section);
6664 const char * group_name;
6665 unsigned char * start;
6666 unsigned char * indices;
6667 unsigned int entry, j, size;
6668 Elf_Internal_Shdr * sec;
6669 Elf_Internal_Sym * sym;
6670
6671 /* Get the symbol table. */
6672 if (section->sh_link >= filedata->file_header.e_shnum
6673 || ((sec = filedata->section_headers + section->sh_link)->sh_type
6674 != SHT_SYMTAB))
6675 {
6676 error (_("Bad sh_link in group section `%s'\n"), name);
6677 continue;
6678 }
6679
6680 if (symtab_sec != sec)
6681 {
6682 symtab_sec = sec;
6683 if (symtab)
6684 free (symtab);
6685 symtab = GET_ELF_SYMBOLS (filedata, symtab_sec, & num_syms);
6686 }
6687
6688 if (symtab == NULL)
6689 {
6690 error (_("Corrupt header in group section `%s'\n"), name);
6691 continue;
6692 }
6693
6694 if (section->sh_info >= num_syms)
6695 {
6696 error (_("Bad sh_info in group section `%s'\n"), name);
6697 continue;
6698 }
6699
6700 sym = symtab + section->sh_info;
6701
6702 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6703 {
6704 if (sym->st_shndx == 0
6705 || sym->st_shndx >= filedata->file_header.e_shnum)
6706 {
6707 error (_("Bad sh_info in group section `%s'\n"), name);
6708 continue;
6709 }
6710
6711 group_name = SECTION_NAME (filedata->section_headers + sym->st_shndx);
6712 strtab_sec = NULL;
6713 if (strtab)
6714 free (strtab);
6715 strtab = NULL;
6716 strtab_size = 0;
6717 }
6718 else
6719 {
6720 /* Get the string table. */
6721 if (symtab_sec->sh_link >= filedata->file_header.e_shnum)
6722 {
6723 strtab_sec = NULL;
6724 if (strtab)
6725 free (strtab);
6726 strtab = NULL;
6727 strtab_size = 0;
6728 }
6729 else if (strtab_sec
6730 != (sec = filedata->section_headers + symtab_sec->sh_link))
6731 {
6732 strtab_sec = sec;
6733 if (strtab)
6734 free (strtab);
6735
6736 strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
6737 1, strtab_sec->sh_size,
6738 _("string table"));
6739 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
6740 }
6741 group_name = sym->st_name < strtab_size
6742 ? strtab + sym->st_name : _("<corrupt>");
6743 }
6744
6745 /* PR 17531: file: loop. */
6746 if (section->sh_entsize > section->sh_size)
6747 {
6748 error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6749 printable_section_name (filedata, section),
6750 (unsigned long) section->sh_entsize,
6751 (unsigned long) section->sh_size);
6752 break;
6753 }
6754
6755 start = (unsigned char *) get_data (NULL, filedata, section->sh_offset,
6756 1, section->sh_size,
6757 _("section data"));
6758 if (start == NULL)
6759 continue;
6760
6761 indices = start;
6762 size = (section->sh_size / section->sh_entsize) - 1;
6763 entry = byte_get (indices, 4);
6764 indices += 4;
6765
6766 if (do_section_groups)
6767 {
6768 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
6769 get_group_flags (entry), i, name, group_name, size);
6770
6771 printf (_(" [Index] Name\n"));
6772 }
6773
6774 group->group_index = i;
6775
6776 for (j = 0; j < size; j++)
6777 {
6778 struct group_list * g;
6779
6780 entry = byte_get (indices, 4);
6781 indices += 4;
6782
6783 if (entry >= filedata->file_header.e_shnum)
6784 {
6785 static unsigned num_group_errors = 0;
6786
6787 if (num_group_errors ++ < 10)
6788 {
6789 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6790 entry, i, filedata->file_header.e_shnum - 1);
6791 if (num_group_errors == 10)
6792 warn (_("Further error messages about overlarge group section indicies suppressed\n"));
6793 }
6794 continue;
6795 }
6796
6797 if (section_headers_groups [entry] != NULL)
6798 {
6799 if (entry)
6800 {
6801 static unsigned num_errs = 0;
6802
6803 if (num_errs ++ < 10)
6804 {
6805 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6806 entry, i,
6807 section_headers_groups [entry]->group_index);
6808 if (num_errs == 10)
6809 warn (_("Further error messages about already contained group sections suppressed\n"));
6810 }
6811 continue;
6812 }
6813 else
6814 {
6815 /* Intel C/C++ compiler may put section 0 in a
6816 section group. We just warn it the first time
6817 and ignore it afterwards. */
6818 static bfd_boolean warned = FALSE;
6819 if (!warned)
6820 {
6821 error (_("section 0 in group section [%5u]\n"),
6822 section_headers_groups [entry]->group_index);
6823 warned = TRUE;
6824 }
6825 }
6826 }
6827
6828 section_headers_groups [entry] = group;
6829
6830 if (do_section_groups)
6831 {
6832 sec = filedata->section_headers + entry;
6833 printf (" [%5u] %s\n", entry, printable_section_name (filedata, sec));
6834 }
6835
6836 g = (struct group_list *) xmalloc (sizeof (struct group_list));
6837 g->section_index = entry;
6838 g->next = group->root;
6839 group->root = g;
6840 }
6841
6842 if (start)
6843 free (start);
6844
6845 group++;
6846 }
6847 }
6848
6849 if (symtab)
6850 free (symtab);
6851 if (strtab)
6852 free (strtab);
6853 return TRUE;
6854 }
6855
6856 /* Data used to display dynamic fixups. */
6857
6858 struct ia64_vms_dynfixup
6859 {
6860 bfd_vma needed_ident; /* Library ident number. */
6861 bfd_vma needed; /* Index in the dstrtab of the library name. */
6862 bfd_vma fixup_needed; /* Index of the library. */
6863 bfd_vma fixup_rela_cnt; /* Number of fixups. */
6864 bfd_vma fixup_rela_off; /* Fixups offset in the dynamic segment. */
6865 };
6866
6867 /* Data used to display dynamic relocations. */
6868
6869 struct ia64_vms_dynimgrela
6870 {
6871 bfd_vma img_rela_cnt; /* Number of relocations. */
6872 bfd_vma img_rela_off; /* Reloc offset in the dynamic segment. */
6873 };
6874
6875 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6876 library). */
6877
6878 static bfd_boolean
6879 dump_ia64_vms_dynamic_fixups (Filedata * filedata,
6880 struct ia64_vms_dynfixup * fixup,
6881 const char * strtab,
6882 unsigned int strtab_sz)
6883 {
6884 Elf64_External_VMS_IMAGE_FIXUP * imfs;
6885 long i;
6886 const char * lib_name;
6887
6888 imfs = get_data (NULL, filedata, dynamic_addr + fixup->fixup_rela_off,
6889 1, fixup->fixup_rela_cnt * sizeof (*imfs),
6890 _("dynamic section image fixups"));
6891 if (!imfs)
6892 return FALSE;
6893
6894 if (fixup->needed < strtab_sz)
6895 lib_name = strtab + fixup->needed;
6896 else
6897 {
6898 warn (_("corrupt library name index of 0x%lx found in dynamic entry"),
6899 (unsigned long) fixup->needed);
6900 lib_name = "???";
6901 }
6902 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
6903 (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
6904 printf
6905 (_("Seg Offset Type SymVec DataType\n"));
6906
6907 for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
6908 {
6909 unsigned int type;
6910 const char *rtype;
6911
6912 printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
6913 printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
6914 type = BYTE_GET (imfs [i].type);
6915 rtype = elf_ia64_reloc_type (type);
6916 if (rtype == NULL)
6917 printf (" 0x%08x ", type);
6918 else
6919 printf (" %-32s ", rtype);
6920 printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
6921 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
6922 }
6923
6924 free (imfs);
6925 return TRUE;
6926 }
6927
6928 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
6929
6930 static bfd_boolean
6931 dump_ia64_vms_dynamic_relocs (Filedata * filedata, struct ia64_vms_dynimgrela *imgrela)
6932 {
6933 Elf64_External_VMS_IMAGE_RELA *imrs;
6934 long i;
6935
6936 imrs = get_data (NULL, filedata, dynamic_addr + imgrela->img_rela_off,
6937 1, imgrela->img_rela_cnt * sizeof (*imrs),
6938 _("dynamic section image relocations"));
6939 if (!imrs)
6940 return FALSE;
6941
6942 printf (_("\nImage relocs\n"));
6943 printf
6944 (_("Seg Offset Type Addend Seg Sym Off\n"));
6945
6946 for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
6947 {
6948 unsigned int type;
6949 const char *rtype;
6950
6951 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
6952 printf ("%08" BFD_VMA_FMT "x ",
6953 (bfd_vma) BYTE_GET (imrs [i].rela_offset));
6954 type = BYTE_GET (imrs [i].type);
6955 rtype = elf_ia64_reloc_type (type);
6956 if (rtype == NULL)
6957 printf ("0x%08x ", type);
6958 else
6959 printf ("%-31s ", rtype);
6960 print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
6961 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
6962 printf ("%08" BFD_VMA_FMT "x\n",
6963 (bfd_vma) BYTE_GET (imrs [i].sym_offset));
6964 }
6965
6966 free (imrs);
6967 return TRUE;
6968 }
6969
6970 /* Display IA-64 OpenVMS dynamic relocations and fixups. */
6971
6972 static bfd_boolean
6973 process_ia64_vms_dynamic_relocs (Filedata * filedata)
6974 {
6975 struct ia64_vms_dynfixup fixup;
6976 struct ia64_vms_dynimgrela imgrela;
6977 Elf_Internal_Dyn *entry;
6978 bfd_vma strtab_off = 0;
6979 bfd_vma strtab_sz = 0;
6980 char *strtab = NULL;
6981 bfd_boolean res = TRUE;
6982
6983 memset (&fixup, 0, sizeof (fixup));
6984 memset (&imgrela, 0, sizeof (imgrela));
6985
6986 /* Note: the order of the entries is specified by the OpenVMS specs. */
6987 for (entry = dynamic_section;
6988 entry < dynamic_section + dynamic_nent;
6989 entry++)
6990 {
6991 switch (entry->d_tag)
6992 {
6993 case DT_IA_64_VMS_STRTAB_OFFSET:
6994 strtab_off = entry->d_un.d_val;
6995 break;
6996 case DT_STRSZ:
6997 strtab_sz = entry->d_un.d_val;
6998 if (strtab == NULL)
6999 strtab = get_data (NULL, filedata, dynamic_addr + strtab_off,
7000 1, strtab_sz, _("dynamic string section"));
7001 break;
7002
7003 case DT_IA_64_VMS_NEEDED_IDENT:
7004 fixup.needed_ident = entry->d_un.d_val;
7005 break;
7006 case DT_NEEDED:
7007 fixup.needed = entry->d_un.d_val;
7008 break;
7009 case DT_IA_64_VMS_FIXUP_NEEDED:
7010 fixup.fixup_needed = entry->d_un.d_val;
7011 break;
7012 case DT_IA_64_VMS_FIXUP_RELA_CNT:
7013 fixup.fixup_rela_cnt = entry->d_un.d_val;
7014 break;
7015 case DT_IA_64_VMS_FIXUP_RELA_OFF:
7016 fixup.fixup_rela_off = entry->d_un.d_val;
7017 if (! dump_ia64_vms_dynamic_fixups (filedata, &fixup, strtab, strtab_sz))
7018 res = FALSE;
7019 break;
7020 case DT_IA_64_VMS_IMG_RELA_CNT:
7021 imgrela.img_rela_cnt = entry->d_un.d_val;
7022 break;
7023 case DT_IA_64_VMS_IMG_RELA_OFF:
7024 imgrela.img_rela_off = entry->d_un.d_val;
7025 if (! dump_ia64_vms_dynamic_relocs (filedata, &imgrela))
7026 res = FALSE;
7027 break;
7028
7029 default:
7030 break;
7031 }
7032 }
7033
7034 if (strtab != NULL)
7035 free (strtab);
7036
7037 return res;
7038 }
7039
7040 static struct
7041 {
7042 const char * name;
7043 int reloc;
7044 int size;
7045 int rela;
7046 }
7047 dynamic_relocations [] =
7048 {
7049 { "REL", DT_REL, DT_RELSZ, FALSE },
7050 { "RELA", DT_RELA, DT_RELASZ, TRUE },
7051 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
7052 };
7053
7054 /* Process the reloc section. */
7055
7056 static bfd_boolean
7057 process_relocs (Filedata * filedata)
7058 {
7059 unsigned long rel_size;
7060 unsigned long rel_offset;
7061
7062 if (!do_reloc)
7063 return TRUE;
7064
7065 if (do_using_dynamic)
7066 {
7067 int is_rela;
7068 const char * name;
7069 bfd_boolean has_dynamic_reloc;
7070 unsigned int i;
7071
7072 has_dynamic_reloc = FALSE;
7073
7074 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
7075 {
7076 is_rela = dynamic_relocations [i].rela;
7077 name = dynamic_relocations [i].name;
7078 rel_size = dynamic_info [dynamic_relocations [i].size];
7079 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
7080
7081 if (rel_size)
7082 has_dynamic_reloc = TRUE;
7083
7084 if (is_rela == UNKNOWN)
7085 {
7086 if (dynamic_relocations [i].reloc == DT_JMPREL)
7087 switch (dynamic_info[DT_PLTREL])
7088 {
7089 case DT_REL:
7090 is_rela = FALSE;
7091 break;
7092 case DT_RELA:
7093 is_rela = TRUE;
7094 break;
7095 }
7096 }
7097
7098 if (rel_size)
7099 {
7100 printf
7101 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
7102 name, rel_offset, rel_size);
7103
7104 dump_relocations (filedata,
7105 offset_from_vma (filedata, rel_offset, rel_size),
7106 rel_size,
7107 dynamic_symbols, num_dynamic_syms,
7108 dynamic_strings, dynamic_strings_length,
7109 is_rela, TRUE /* is_dynamic */);
7110 }
7111 }
7112
7113 if (is_ia64_vms (filedata))
7114 if (process_ia64_vms_dynamic_relocs (filedata))
7115 has_dynamic_reloc = TRUE;
7116
7117 if (! has_dynamic_reloc)
7118 printf (_("\nThere are no dynamic relocations in this file.\n"));
7119 }
7120 else
7121 {
7122 Elf_Internal_Shdr * section;
7123 unsigned long i;
7124 bfd_boolean found = FALSE;
7125
7126 for (i = 0, section = filedata->section_headers;
7127 i < filedata->file_header.e_shnum;
7128 i++, section++)
7129 {
7130 if ( section->sh_type != SHT_RELA
7131 && section->sh_type != SHT_REL)
7132 continue;
7133
7134 rel_offset = section->sh_offset;
7135 rel_size = section->sh_size;
7136
7137 if (rel_size)
7138 {
7139 Elf_Internal_Shdr * strsec;
7140 int is_rela;
7141 unsigned long num_rela;
7142
7143 printf (_("\nRelocation section "));
7144
7145 if (filedata->string_table == NULL)
7146 printf ("%d", section->sh_name);
7147 else
7148 printf ("'%s'", printable_section_name (filedata, section));
7149
7150 num_rela = rel_size / section->sh_entsize;
7151 printf (ngettext (" at offset 0x%lx contains %lu entry:\n",
7152 " at offset 0x%lx contains %lu entries:\n",
7153 num_rela),
7154 rel_offset, num_rela);
7155
7156 is_rela = section->sh_type == SHT_RELA;
7157
7158 if (section->sh_link != 0
7159 && section->sh_link < filedata->file_header.e_shnum)
7160 {
7161 Elf_Internal_Shdr * symsec;
7162 Elf_Internal_Sym * symtab;
7163 unsigned long nsyms;
7164 unsigned long strtablen = 0;
7165 char * strtab = NULL;
7166
7167 symsec = filedata->section_headers + section->sh_link;
7168 if (symsec->sh_type != SHT_SYMTAB
7169 && symsec->sh_type != SHT_DYNSYM)
7170 continue;
7171
7172 symtab = GET_ELF_SYMBOLS (filedata, symsec, & nsyms);
7173
7174 if (symtab == NULL)
7175 continue;
7176
7177 if (symsec->sh_link != 0
7178 && symsec->sh_link < filedata->file_header.e_shnum)
7179 {
7180 strsec = filedata->section_headers + symsec->sh_link;
7181
7182 strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
7183 1, strsec->sh_size,
7184 _("string table"));
7185 strtablen = strtab == NULL ? 0 : strsec->sh_size;
7186 }
7187
7188 dump_relocations (filedata, rel_offset, rel_size,
7189 symtab, nsyms, strtab, strtablen,
7190 is_rela,
7191 symsec->sh_type == SHT_DYNSYM);
7192 if (strtab)
7193 free (strtab);
7194 free (symtab);
7195 }
7196 else
7197 dump_relocations (filedata, rel_offset, rel_size,
7198 NULL, 0, NULL, 0, is_rela,
7199 FALSE /* is_dynamic */);
7200
7201 found = TRUE;
7202 }
7203 }
7204
7205 if (! found)
7206 {
7207 /* Users sometimes forget the -D option, so try to be helpful. */
7208 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
7209 {
7210 if (dynamic_info [dynamic_relocations [i].size])
7211 {
7212 printf (_("\nThere are no static relocations in this file."));
7213 printf (_("\nTo see the dynamic relocations add --use-dynamic to the command line.\n"));
7214
7215 break;
7216 }
7217 }
7218 if (i == ARRAY_SIZE (dynamic_relocations))
7219 printf (_("\nThere are no relocations in this file.\n"));
7220 }
7221 }
7222
7223 return TRUE;
7224 }
7225
7226 /* An absolute address consists of a section and an offset. If the
7227 section is NULL, the offset itself is the address, otherwise, the
7228 address equals to LOAD_ADDRESS(section) + offset. */
7229
7230 struct absaddr
7231 {
7232 unsigned short section;
7233 bfd_vma offset;
7234 };
7235
7236 #define ABSADDR(a) \
7237 ((a).section \
7238 ? filedata->section_headers [(a).section].sh_addr + (a).offset \
7239 : (a).offset)
7240
7241 /* Find the nearest symbol at or below ADDR. Returns the symbol
7242 name, if found, and the offset from the symbol to ADDR. */
7243
7244 static void
7245 find_symbol_for_address (Filedata * filedata,
7246 Elf_Internal_Sym * symtab,
7247 unsigned long nsyms,
7248 const char * strtab,
7249 unsigned long strtab_size,
7250 struct absaddr addr,
7251 const char ** symname,
7252 bfd_vma * offset)
7253 {
7254 bfd_vma dist = 0x100000;
7255 Elf_Internal_Sym * sym;
7256 Elf_Internal_Sym * beg;
7257 Elf_Internal_Sym * end;
7258 Elf_Internal_Sym * best = NULL;
7259
7260 REMOVE_ARCH_BITS (addr.offset);
7261 beg = symtab;
7262 end = symtab + nsyms;
7263
7264 while (beg < end)
7265 {
7266 bfd_vma value;
7267
7268 sym = beg + (end - beg) / 2;
7269
7270 value = sym->st_value;
7271 REMOVE_ARCH_BITS (value);
7272
7273 if (sym->st_name != 0
7274 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
7275 && addr.offset >= value
7276 && addr.offset - value < dist)
7277 {
7278 best = sym;
7279 dist = addr.offset - value;
7280 if (!dist)
7281 break;
7282 }
7283
7284 if (addr.offset < value)
7285 end = sym;
7286 else
7287 beg = sym + 1;
7288 }
7289
7290 if (best)
7291 {
7292 *symname = (best->st_name >= strtab_size
7293 ? _("<corrupt>") : strtab + best->st_name);
7294 *offset = dist;
7295 return;
7296 }
7297
7298 *symname = NULL;
7299 *offset = addr.offset;
7300 }
7301
7302 static /* signed */ int
7303 symcmp (const void *p, const void *q)
7304 {
7305 Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
7306 Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
7307
7308 return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
7309 }
7310
7311 /* Process the unwind section. */
7312
7313 #include "unwind-ia64.h"
7314
7315 struct ia64_unw_table_entry
7316 {
7317 struct absaddr start;
7318 struct absaddr end;
7319 struct absaddr info;
7320 };
7321
7322 struct ia64_unw_aux_info
7323 {
7324 struct ia64_unw_table_entry * table; /* Unwind table. */
7325 unsigned long table_len; /* Length of unwind table. */
7326 unsigned char * info; /* Unwind info. */
7327 unsigned long info_size; /* Size of unwind info. */
7328 bfd_vma info_addr; /* Starting address of unwind info. */
7329 bfd_vma seg_base; /* Starting address of segment. */
7330 Elf_Internal_Sym * symtab; /* The symbol table. */
7331 unsigned long nsyms; /* Number of symbols. */
7332 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7333 unsigned long nfuns; /* Number of entries in funtab. */
7334 char * strtab; /* The string table. */
7335 unsigned long strtab_size; /* Size of string table. */
7336 };
7337
7338 static bfd_boolean
7339 dump_ia64_unwind (Filedata * filedata, struct ia64_unw_aux_info * aux)
7340 {
7341 struct ia64_unw_table_entry * tp;
7342 unsigned long j, nfuns;
7343 int in_body;
7344 bfd_boolean res = TRUE;
7345
7346 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7347 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7348 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7349 aux->funtab[nfuns++] = aux->symtab[j];
7350 aux->nfuns = nfuns;
7351 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7352
7353 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7354 {
7355 bfd_vma stamp;
7356 bfd_vma offset;
7357 const unsigned char * dp;
7358 const unsigned char * head;
7359 const unsigned char * end;
7360 const char * procname;
7361
7362 find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
7363 aux->strtab_size, tp->start, &procname, &offset);
7364
7365 fputs ("\n<", stdout);
7366
7367 if (procname)
7368 {
7369 fputs (procname, stdout);
7370
7371 if (offset)
7372 printf ("+%lx", (unsigned long) offset);
7373 }
7374
7375 fputs (">: [", stdout);
7376 print_vma (tp->start.offset, PREFIX_HEX);
7377 fputc ('-', stdout);
7378 print_vma (tp->end.offset, PREFIX_HEX);
7379 printf ("], info at +0x%lx\n",
7380 (unsigned long) (tp->info.offset - aux->seg_base));
7381
7382 /* PR 17531: file: 86232b32. */
7383 if (aux->info == NULL)
7384 continue;
7385
7386 /* PR 17531: file: 0997b4d1. */
7387 if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
7388 {
7389 warn (_("Invalid offset %lx in table entry %ld\n"),
7390 (long) tp->info.offset, (long) (tp - aux->table));
7391 res = FALSE;
7392 continue;
7393 }
7394
7395 head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
7396 stamp = byte_get ((unsigned char *) head, sizeof (stamp));
7397
7398 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
7399 (unsigned) UNW_VER (stamp),
7400 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
7401 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
7402 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
7403 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
7404
7405 if (UNW_VER (stamp) != 1)
7406 {
7407 printf (_("\tUnknown version.\n"));
7408 continue;
7409 }
7410
7411 in_body = 0;
7412 end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
7413 /* PR 17531: file: 16ceda89. */
7414 if (end > aux->info + aux->info_size)
7415 end = aux->info + aux->info_size;
7416 for (dp = head + 8; dp < end;)
7417 dp = unw_decode (dp, in_body, & in_body, end);
7418 }
7419
7420 free (aux->funtab);
7421
7422 return res;
7423 }
7424
7425 static bfd_boolean
7426 slurp_ia64_unwind_table (Filedata * filedata,
7427 struct ia64_unw_aux_info * aux,
7428 Elf_Internal_Shdr * sec)
7429 {
7430 unsigned long size, nrelas, i;
7431 Elf_Internal_Phdr * seg;
7432 struct ia64_unw_table_entry * tep;
7433 Elf_Internal_Shdr * relsec;
7434 Elf_Internal_Rela * rela;
7435 Elf_Internal_Rela * rp;
7436 unsigned char * table;
7437 unsigned char * tp;
7438 Elf_Internal_Sym * sym;
7439 const char * relname;
7440
7441 aux->table_len = 0;
7442
7443 /* First, find the starting address of the segment that includes
7444 this section: */
7445
7446 if (filedata->file_header.e_phnum)
7447 {
7448 if (! get_program_headers (filedata))
7449 return FALSE;
7450
7451 for (seg = filedata->program_headers;
7452 seg < filedata->program_headers + filedata->file_header.e_phnum;
7453 ++seg)
7454 {
7455 if (seg->p_type != PT_LOAD)
7456 continue;
7457
7458 if (sec->sh_addr >= seg->p_vaddr
7459 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7460 {
7461 aux->seg_base = seg->p_vaddr;
7462 break;
7463 }
7464 }
7465 }
7466
7467 /* Second, build the unwind table from the contents of the unwind section: */
7468 size = sec->sh_size;
7469 table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
7470 _("unwind table"));
7471 if (!table)
7472 return FALSE;
7473
7474 aux->table_len = size / (3 * eh_addr_size);
7475 aux->table = (struct ia64_unw_table_entry *)
7476 xcmalloc (aux->table_len, sizeof (aux->table[0]));
7477 tep = aux->table;
7478
7479 for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
7480 {
7481 tep->start.section = SHN_UNDEF;
7482 tep->end.section = SHN_UNDEF;
7483 tep->info.section = SHN_UNDEF;
7484 tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7485 tep->end.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7486 tep->info.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7487 tep->start.offset += aux->seg_base;
7488 tep->end.offset += aux->seg_base;
7489 tep->info.offset += aux->seg_base;
7490 }
7491 free (table);
7492
7493 /* Third, apply any relocations to the unwind table: */
7494 for (relsec = filedata->section_headers;
7495 relsec < filedata->section_headers + filedata->file_header.e_shnum;
7496 ++relsec)
7497 {
7498 if (relsec->sh_type != SHT_RELA
7499 || relsec->sh_info >= filedata->file_header.e_shnum
7500 || filedata->section_headers + relsec->sh_info != sec)
7501 continue;
7502
7503 if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
7504 & rela, & nrelas))
7505 {
7506 free (aux->table);
7507 aux->table = NULL;
7508 aux->table_len = 0;
7509 return FALSE;
7510 }
7511
7512 for (rp = rela; rp < rela + nrelas; ++rp)
7513 {
7514 relname = elf_ia64_reloc_type (get_reloc_type (filedata, rp->r_info));
7515 sym = aux->symtab + get_reloc_symindex (rp->r_info);
7516
7517 /* PR 17531: file: 9fa67536. */
7518 if (relname == NULL)
7519 {
7520 warn (_("Skipping unknown relocation type: %u\n"),
7521 get_reloc_type (filedata, rp->r_info));
7522 continue;
7523 }
7524
7525 if (! const_strneq (relname, "R_IA64_SEGREL"))
7526 {
7527 warn (_("Skipping unexpected relocation type: %s\n"), relname);
7528 continue;
7529 }
7530
7531 i = rp->r_offset / (3 * eh_addr_size);
7532
7533 /* PR 17531: file: 5bc8d9bf. */
7534 if (i >= aux->table_len)
7535 {
7536 warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
7537 continue;
7538 }
7539
7540 switch (rp->r_offset / eh_addr_size % 3)
7541 {
7542 case 0:
7543 aux->table[i].start.section = sym->st_shndx;
7544 aux->table[i].start.offset = rp->r_addend + sym->st_value;
7545 break;
7546 case 1:
7547 aux->table[i].end.section = sym->st_shndx;
7548 aux->table[i].end.offset = rp->r_addend + sym->st_value;
7549 break;
7550 case 2:
7551 aux->table[i].info.section = sym->st_shndx;
7552 aux->table[i].info.offset = rp->r_addend + sym->st_value;
7553 break;
7554 default:
7555 break;
7556 }
7557 }
7558
7559 free (rela);
7560 }
7561
7562 return TRUE;
7563 }
7564
7565 static bfd_boolean
7566 ia64_process_unwind (Filedata * filedata)
7567 {
7568 Elf_Internal_Shdr * sec;
7569 Elf_Internal_Shdr * unwsec = NULL;
7570 Elf_Internal_Shdr * strsec;
7571 unsigned long i, unwcount = 0, unwstart = 0;
7572 struct ia64_unw_aux_info aux;
7573 bfd_boolean res = TRUE;
7574
7575 memset (& aux, 0, sizeof (aux));
7576
7577 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
7578 {
7579 if (sec->sh_type == SHT_SYMTAB
7580 && sec->sh_link < filedata->file_header.e_shnum)
7581 {
7582 aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
7583
7584 strsec = filedata->section_headers + sec->sh_link;
7585 if (aux.strtab != NULL)
7586 {
7587 error (_("Multiple auxillary string tables encountered\n"));
7588 free (aux.strtab);
7589 res = FALSE;
7590 }
7591 aux.strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
7592 1, strsec->sh_size,
7593 _("string table"));
7594 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7595 }
7596 else if (sec->sh_type == SHT_IA_64_UNWIND)
7597 unwcount++;
7598 }
7599
7600 if (!unwcount)
7601 printf (_("\nThere are no unwind sections in this file.\n"));
7602
7603 while (unwcount-- > 0)
7604 {
7605 char * suffix;
7606 size_t len, len2;
7607
7608 for (i = unwstart, sec = filedata->section_headers + unwstart, unwsec = NULL;
7609 i < filedata->file_header.e_shnum; ++i, ++sec)
7610 if (sec->sh_type == SHT_IA_64_UNWIND)
7611 {
7612 unwsec = sec;
7613 break;
7614 }
7615 /* We have already counted the number of SHT_IA64_UNWIND
7616 sections so the loop above should never fail. */
7617 assert (unwsec != NULL);
7618
7619 unwstart = i + 1;
7620 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
7621
7622 if ((unwsec->sh_flags & SHF_GROUP) != 0)
7623 {
7624 /* We need to find which section group it is in. */
7625 struct group_list * g;
7626
7627 if (section_headers_groups == NULL
7628 || section_headers_groups [i] == NULL)
7629 i = filedata->file_header.e_shnum;
7630 else
7631 {
7632 g = section_headers_groups [i]->root;
7633
7634 for (; g != NULL; g = g->next)
7635 {
7636 sec = filedata->section_headers + g->section_index;
7637
7638 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
7639 break;
7640 }
7641
7642 if (g == NULL)
7643 i = filedata->file_header.e_shnum;
7644 }
7645 }
7646 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
7647 {
7648 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
7649 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
7650 suffix = SECTION_NAME (unwsec) + len;
7651 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum;
7652 ++i, ++sec)
7653 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
7654 && streq (SECTION_NAME (sec) + len2, suffix))
7655 break;
7656 }
7657 else
7658 {
7659 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
7660 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
7661 len = sizeof (ELF_STRING_ia64_unwind) - 1;
7662 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
7663 suffix = "";
7664 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
7665 suffix = SECTION_NAME (unwsec) + len;
7666 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum;
7667 ++i, ++sec)
7668 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
7669 && streq (SECTION_NAME (sec) + len2, suffix))
7670 break;
7671 }
7672
7673 if (i == filedata->file_header.e_shnum)
7674 {
7675 printf (_("\nCould not find unwind info section for "));
7676
7677 if (filedata->string_table == NULL)
7678 printf ("%d", unwsec->sh_name);
7679 else
7680 printf ("'%s'", printable_section_name (filedata, unwsec));
7681 }
7682 else
7683 {
7684 aux.info_addr = sec->sh_addr;
7685 aux.info = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1,
7686 sec->sh_size,
7687 _("unwind info"));
7688 aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
7689
7690 printf (_("\nUnwind section "));
7691
7692 if (filedata->string_table == NULL)
7693 printf ("%d", unwsec->sh_name);
7694 else
7695 printf ("'%s'", printable_section_name (filedata, unwsec));
7696
7697 printf (_(" at offset 0x%lx contains %lu entries:\n"),
7698 (unsigned long) unwsec->sh_offset,
7699 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
7700
7701 if (slurp_ia64_unwind_table (filedata, & aux, unwsec)
7702 && aux.table_len > 0)
7703 dump_ia64_unwind (filedata, & aux);
7704
7705 if (aux.table)
7706 free ((char *) aux.table);
7707 if (aux.info)
7708 free ((char *) aux.info);
7709 aux.table = NULL;
7710 aux.info = NULL;
7711 }
7712 }
7713
7714 if (aux.symtab)
7715 free (aux.symtab);
7716 if (aux.strtab)
7717 free ((char *) aux.strtab);
7718
7719 return res;
7720 }
7721
7722 struct hppa_unw_table_entry
7723 {
7724 struct absaddr start;
7725 struct absaddr end;
7726 unsigned int Cannot_unwind:1; /* 0 */
7727 unsigned int Millicode:1; /* 1 */
7728 unsigned int Millicode_save_sr0:1; /* 2 */
7729 unsigned int Region_description:2; /* 3..4 */
7730 unsigned int reserved1:1; /* 5 */
7731 unsigned int Entry_SR:1; /* 6 */
7732 unsigned int Entry_FR:4; /* Number saved 7..10 */
7733 unsigned int Entry_GR:5; /* Number saved 11..15 */
7734 unsigned int Args_stored:1; /* 16 */
7735 unsigned int Variable_Frame:1; /* 17 */
7736 unsigned int Separate_Package_Body:1; /* 18 */
7737 unsigned int Frame_Extension_Millicode:1; /* 19 */
7738 unsigned int Stack_Overflow_Check:1; /* 20 */
7739 unsigned int Two_Instruction_SP_Increment:1; /* 21 */
7740 unsigned int Ada_Region:1; /* 22 */
7741 unsigned int cxx_info:1; /* 23 */
7742 unsigned int cxx_try_catch:1; /* 24 */
7743 unsigned int sched_entry_seq:1; /* 25 */
7744 unsigned int reserved2:1; /* 26 */
7745 unsigned int Save_SP:1; /* 27 */
7746 unsigned int Save_RP:1; /* 28 */
7747 unsigned int Save_MRP_in_frame:1; /* 29 */
7748 unsigned int extn_ptr_defined:1; /* 30 */
7749 unsigned int Cleanup_defined:1; /* 31 */
7750
7751 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
7752 unsigned int HP_UX_interrupt_marker:1; /* 1 */
7753 unsigned int Large_frame:1; /* 2 */
7754 unsigned int Pseudo_SP_Set:1; /* 3 */
7755 unsigned int reserved4:1; /* 4 */
7756 unsigned int Total_frame_size:27; /* 5..31 */
7757 };
7758
7759 struct hppa_unw_aux_info
7760 {
7761 struct hppa_unw_table_entry * table; /* Unwind table. */
7762 unsigned long table_len; /* Length of unwind table. */
7763 bfd_vma seg_base; /* Starting address of segment. */
7764 Elf_Internal_Sym * symtab; /* The symbol table. */
7765 unsigned long nsyms; /* Number of symbols. */
7766 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7767 unsigned long nfuns; /* Number of entries in funtab. */
7768 char * strtab; /* The string table. */
7769 unsigned long strtab_size; /* Size of string table. */
7770 };
7771
7772 static bfd_boolean
7773 dump_hppa_unwind (Filedata * filedata, struct hppa_unw_aux_info * aux)
7774 {
7775 struct hppa_unw_table_entry * tp;
7776 unsigned long j, nfuns;
7777 bfd_boolean res = TRUE;
7778
7779 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7780 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7781 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7782 aux->funtab[nfuns++] = aux->symtab[j];
7783 aux->nfuns = nfuns;
7784 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7785
7786 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7787 {
7788 bfd_vma offset;
7789 const char * procname;
7790
7791 find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
7792 aux->strtab_size, tp->start, &procname,
7793 &offset);
7794
7795 fputs ("\n<", stdout);
7796
7797 if (procname)
7798 {
7799 fputs (procname, stdout);
7800
7801 if (offset)
7802 printf ("+%lx", (unsigned long) offset);
7803 }
7804
7805 fputs (">: [", stdout);
7806 print_vma (tp->start.offset, PREFIX_HEX);
7807 fputc ('-', stdout);
7808 print_vma (tp->end.offset, PREFIX_HEX);
7809 printf ("]\n\t");
7810
7811 #define PF(_m) if (tp->_m) printf (#_m " ");
7812 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
7813 PF(Cannot_unwind);
7814 PF(Millicode);
7815 PF(Millicode_save_sr0);
7816 /* PV(Region_description); */
7817 PF(Entry_SR);
7818 PV(Entry_FR);
7819 PV(Entry_GR);
7820 PF(Args_stored);
7821 PF(Variable_Frame);
7822 PF(Separate_Package_Body);
7823 PF(Frame_Extension_Millicode);
7824 PF(Stack_Overflow_Check);
7825 PF(Two_Instruction_SP_Increment);
7826 PF(Ada_Region);
7827 PF(cxx_info);
7828 PF(cxx_try_catch);
7829 PF(sched_entry_seq);
7830 PF(Save_SP);
7831 PF(Save_RP);
7832 PF(Save_MRP_in_frame);
7833 PF(extn_ptr_defined);
7834 PF(Cleanup_defined);
7835 PF(MPE_XL_interrupt_marker);
7836 PF(HP_UX_interrupt_marker);
7837 PF(Large_frame);
7838 PF(Pseudo_SP_Set);
7839 PV(Total_frame_size);
7840 #undef PF
7841 #undef PV
7842 }
7843
7844 printf ("\n");
7845
7846 free (aux->funtab);
7847
7848 return res;
7849 }
7850
7851 static bfd_boolean
7852 slurp_hppa_unwind_table (Filedata * filedata,
7853 struct hppa_unw_aux_info * aux,
7854 Elf_Internal_Shdr * sec)
7855 {
7856 unsigned long size, unw_ent_size, nentries, nrelas, i;
7857 Elf_Internal_Phdr * seg;
7858 struct hppa_unw_table_entry * tep;
7859 Elf_Internal_Shdr * relsec;
7860 Elf_Internal_Rela * rela;
7861 Elf_Internal_Rela * rp;
7862 unsigned char * table;
7863 unsigned char * tp;
7864 Elf_Internal_Sym * sym;
7865 const char * relname;
7866
7867 /* First, find the starting address of the segment that includes
7868 this section. */
7869 if (filedata->file_header.e_phnum)
7870 {
7871 if (! get_program_headers (filedata))
7872 return FALSE;
7873
7874 for (seg = filedata->program_headers;
7875 seg < filedata->program_headers + filedata->file_header.e_phnum;
7876 ++seg)
7877 {
7878 if (seg->p_type != PT_LOAD)
7879 continue;
7880
7881 if (sec->sh_addr >= seg->p_vaddr
7882 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7883 {
7884 aux->seg_base = seg->p_vaddr;
7885 break;
7886 }
7887 }
7888 }
7889
7890 /* Second, build the unwind table from the contents of the unwind
7891 section. */
7892 size = sec->sh_size;
7893 table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
7894 _("unwind table"));
7895 if (!table)
7896 return FALSE;
7897
7898 unw_ent_size = 16;
7899 nentries = size / unw_ent_size;
7900 size = unw_ent_size * nentries;
7901
7902 tep = aux->table = (struct hppa_unw_table_entry *)
7903 xcmalloc (nentries, sizeof (aux->table[0]));
7904
7905 for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
7906 {
7907 unsigned int tmp1, tmp2;
7908
7909 tep->start.section = SHN_UNDEF;
7910 tep->end.section = SHN_UNDEF;
7911
7912 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
7913 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
7914 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
7915 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
7916
7917 tep->start.offset += aux->seg_base;
7918 tep->end.offset += aux->seg_base;
7919
7920 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
7921 tep->Millicode = (tmp1 >> 30) & 0x1;
7922 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
7923 tep->Region_description = (tmp1 >> 27) & 0x3;
7924 tep->reserved1 = (tmp1 >> 26) & 0x1;
7925 tep->Entry_SR = (tmp1 >> 25) & 0x1;
7926 tep->Entry_FR = (tmp1 >> 21) & 0xf;
7927 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
7928 tep->Args_stored = (tmp1 >> 15) & 0x1;
7929 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
7930 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
7931 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
7932 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
7933 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
7934 tep->Ada_Region = (tmp1 >> 9) & 0x1;
7935 tep->cxx_info = (tmp1 >> 8) & 0x1;
7936 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
7937 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
7938 tep->reserved2 = (tmp1 >> 5) & 0x1;
7939 tep->Save_SP = (tmp1 >> 4) & 0x1;
7940 tep->Save_RP = (tmp1 >> 3) & 0x1;
7941 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
7942 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
7943 tep->Cleanup_defined = tmp1 & 0x1;
7944
7945 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
7946 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
7947 tep->Large_frame = (tmp2 >> 29) & 0x1;
7948 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
7949 tep->reserved4 = (tmp2 >> 27) & 0x1;
7950 tep->Total_frame_size = tmp2 & 0x7ffffff;
7951 }
7952 free (table);
7953
7954 /* Third, apply any relocations to the unwind table. */
7955 for (relsec = filedata->section_headers;
7956 relsec < filedata->section_headers + filedata->file_header.e_shnum;
7957 ++relsec)
7958 {
7959 if (relsec->sh_type != SHT_RELA
7960 || relsec->sh_info >= filedata->file_header.e_shnum
7961 || filedata->section_headers + relsec->sh_info != sec)
7962 continue;
7963
7964 if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
7965 & rela, & nrelas))
7966 return FALSE;
7967
7968 for (rp = rela; rp < rela + nrelas; ++rp)
7969 {
7970 relname = elf_hppa_reloc_type (get_reloc_type (filedata, rp->r_info));
7971 sym = aux->symtab + get_reloc_symindex (rp->r_info);
7972
7973 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
7974 if (! const_strneq (relname, "R_PARISC_SEGREL"))
7975 {
7976 warn (_("Skipping unexpected relocation type %s\n"), relname);
7977 continue;
7978 }
7979
7980 i = rp->r_offset / unw_ent_size;
7981
7982 switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
7983 {
7984 case 0:
7985 aux->table[i].start.section = sym->st_shndx;
7986 aux->table[i].start.offset = sym->st_value + rp->r_addend;
7987 break;
7988 case 1:
7989 aux->table[i].end.section = sym->st_shndx;
7990 aux->table[i].end.offset = sym->st_value + rp->r_addend;
7991 break;
7992 default:
7993 break;
7994 }
7995 }
7996
7997 free (rela);
7998 }
7999
8000 aux->table_len = nentries;
8001
8002 return TRUE;
8003 }
8004
8005 static bfd_boolean
8006 hppa_process_unwind (Filedata * filedata)
8007 {
8008 struct hppa_unw_aux_info aux;
8009 Elf_Internal_Shdr * unwsec = NULL;
8010 Elf_Internal_Shdr * strsec;
8011 Elf_Internal_Shdr * sec;
8012 unsigned long i;
8013 bfd_boolean res = TRUE;
8014
8015 if (filedata->string_table == NULL)
8016 return FALSE;
8017
8018 memset (& aux, 0, sizeof (aux));
8019
8020 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
8021 {
8022 if (sec->sh_type == SHT_SYMTAB
8023 && sec->sh_link < filedata->file_header.e_shnum)
8024 {
8025 aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
8026
8027 strsec = filedata->section_headers + sec->sh_link;
8028 if (aux.strtab != NULL)
8029 {
8030 error (_("Multiple auxillary string tables encountered\n"));
8031 free (aux.strtab);
8032 res = FALSE;
8033 }
8034 aux.strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
8035 1, strsec->sh_size,
8036 _("string table"));
8037 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8038 }
8039 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
8040 unwsec = sec;
8041 }
8042
8043 if (!unwsec)
8044 printf (_("\nThere are no unwind sections in this file.\n"));
8045
8046 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
8047 {
8048 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
8049 {
8050 unsigned long num_unwind = sec->sh_size / (2 * eh_addr_size + 8);
8051
8052 printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
8053 "contains %lu entry:\n",
8054 "\nUnwind section '%s' at offset 0x%lx "
8055 "contains %lu entries:\n",
8056 num_unwind),
8057 printable_section_name (filedata, sec),
8058 (unsigned long) sec->sh_offset,
8059 num_unwind);
8060
8061 if (! slurp_hppa_unwind_table (filedata, &aux, sec))
8062 res = FALSE;
8063
8064 if (aux.table_len > 0)
8065 {
8066 if (! dump_hppa_unwind (filedata, &aux))
8067 res = FALSE;
8068 }
8069
8070 if (aux.table)
8071 free ((char *) aux.table);
8072 aux.table = NULL;
8073 }
8074 }
8075
8076 if (aux.symtab)
8077 free (aux.symtab);
8078 if (aux.strtab)
8079 free ((char *) aux.strtab);
8080
8081 return res;
8082 }
8083
8084 struct arm_section
8085 {
8086 unsigned char * data; /* The unwind data. */
8087 Elf_Internal_Shdr * sec; /* The cached unwind section header. */
8088 Elf_Internal_Rela * rela; /* The cached relocations for this section. */
8089 unsigned long nrelas; /* The number of relocations. */
8090 unsigned int rel_type; /* REL or RELA ? */
8091 Elf_Internal_Rela * next_rela; /* Cyclic pointer to the next reloc to process. */
8092 };
8093
8094 struct arm_unw_aux_info
8095 {
8096 Filedata * filedata; /* The file containing the unwind sections. */
8097 Elf_Internal_Sym * symtab; /* The file's symbol table. */
8098 unsigned long nsyms; /* Number of symbols. */
8099 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
8100 unsigned long nfuns; /* Number of these symbols. */
8101 char * strtab; /* The file's string table. */
8102 unsigned long strtab_size; /* Size of string table. */
8103 };
8104
8105 static const char *
8106 arm_print_vma_and_name (Filedata * filedata,
8107 struct arm_unw_aux_info * aux,
8108 bfd_vma fn,
8109 struct absaddr addr)
8110 {
8111 const char *procname;
8112 bfd_vma sym_offset;
8113
8114 if (addr.section == SHN_UNDEF)
8115 addr.offset = fn;
8116
8117 find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
8118 aux->strtab_size, addr, &procname,
8119 &sym_offset);
8120
8121 print_vma (fn, PREFIX_HEX);
8122
8123 if (procname)
8124 {
8125 fputs (" <", stdout);
8126 fputs (procname, stdout);
8127
8128 if (sym_offset)
8129 printf ("+0x%lx", (unsigned long) sym_offset);
8130 fputc ('>', stdout);
8131 }
8132
8133 return procname;
8134 }
8135
8136 static void
8137 arm_free_section (struct arm_section *arm_sec)
8138 {
8139 if (arm_sec->data != NULL)
8140 free (arm_sec->data);
8141
8142 if (arm_sec->rela != NULL)
8143 free (arm_sec->rela);
8144 }
8145
8146 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
8147 cached section and install SEC instead.
8148 2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
8149 and return its valued in * WORDP, relocating if necessary.
8150 3) Update the NEXT_RELA field in ARM_SEC and store the section index and
8151 relocation's offset in ADDR.
8152 4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
8153 into the string table of the symbol associated with the reloc. If no
8154 reloc was applied store -1 there.
8155 5) Return TRUE upon success, FALSE otherwise. */
8156
8157 static bfd_boolean
8158 get_unwind_section_word (Filedata * filedata,
8159 struct arm_unw_aux_info * aux,
8160 struct arm_section * arm_sec,
8161 Elf_Internal_Shdr * sec,
8162 bfd_vma word_offset,
8163 unsigned int * wordp,
8164 struct absaddr * addr,
8165 bfd_vma * sym_name)
8166 {
8167 Elf_Internal_Rela *rp;
8168 Elf_Internal_Sym *sym;
8169 const char * relname;
8170 unsigned int word;
8171 bfd_boolean wrapped;
8172
8173 if (sec == NULL || arm_sec == NULL)
8174 return FALSE;
8175
8176 addr->section = SHN_UNDEF;
8177 addr->offset = 0;
8178
8179 if (sym_name != NULL)
8180 *sym_name = (bfd_vma) -1;
8181
8182 /* If necessary, update the section cache. */
8183 if (sec != arm_sec->sec)
8184 {
8185 Elf_Internal_Shdr *relsec;
8186
8187 arm_free_section (arm_sec);
8188
8189 arm_sec->sec = sec;
8190 arm_sec->data = get_data (NULL, aux->filedata, sec->sh_offset, 1,
8191 sec->sh_size, _("unwind data"));
8192 arm_sec->rela = NULL;
8193 arm_sec->nrelas = 0;
8194
8195 for (relsec = filedata->section_headers;
8196 relsec < filedata->section_headers + filedata->file_header.e_shnum;
8197 ++relsec)
8198 {
8199 if (relsec->sh_info >= filedata->file_header.e_shnum
8200 || filedata->section_headers + relsec->sh_info != sec
8201 /* PR 15745: Check the section type as well. */
8202 || (relsec->sh_type != SHT_REL
8203 && relsec->sh_type != SHT_RELA))
8204 continue;
8205
8206 arm_sec->rel_type = relsec->sh_type;
8207 if (relsec->sh_type == SHT_REL)
8208 {
8209 if (!slurp_rel_relocs (aux->filedata, relsec->sh_offset,
8210 relsec->sh_size,
8211 & arm_sec->rela, & arm_sec->nrelas))
8212 return FALSE;
8213 }
8214 else /* relsec->sh_type == SHT_RELA */
8215 {
8216 if (!slurp_rela_relocs (aux->filedata, relsec->sh_offset,
8217 relsec->sh_size,
8218 & arm_sec->rela, & arm_sec->nrelas))
8219 return FALSE;
8220 }
8221 break;
8222 }
8223
8224 arm_sec->next_rela = arm_sec->rela;
8225 }
8226
8227 /* If there is no unwind data we can do nothing. */
8228 if (arm_sec->data == NULL)
8229 return FALSE;
8230
8231 /* If the offset is invalid then fail. */
8232 if (/* PR 21343 *//* PR 18879 */
8233 sec->sh_size < 4
8234 || word_offset > (sec->sh_size - 4)
8235 || ((bfd_signed_vma) word_offset) < 0)
8236 return FALSE;
8237
8238 /* Get the word at the required offset. */
8239 word = byte_get (arm_sec->data + word_offset, 4);
8240
8241 /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128. */
8242 if (arm_sec->rela == NULL)
8243 {
8244 * wordp = word;
8245 return TRUE;
8246 }
8247
8248 /* Look through the relocs to find the one that applies to the provided offset. */
8249 wrapped = FALSE;
8250 for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
8251 {
8252 bfd_vma prelval, offset;
8253
8254 if (rp->r_offset > word_offset && !wrapped)
8255 {
8256 rp = arm_sec->rela;
8257 wrapped = TRUE;
8258 }
8259 if (rp->r_offset > word_offset)
8260 break;
8261
8262 if (rp->r_offset & 3)
8263 {
8264 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
8265 (unsigned long) rp->r_offset);
8266 continue;
8267 }
8268
8269 if (rp->r_offset < word_offset)
8270 continue;
8271
8272 /* PR 17531: file: 027-161405-0.004 */
8273 if (aux->symtab == NULL)
8274 continue;
8275
8276 if (arm_sec->rel_type == SHT_REL)
8277 {
8278 offset = word & 0x7fffffff;
8279 if (offset & 0x40000000)
8280 offset |= ~ (bfd_vma) 0x7fffffff;
8281 }
8282 else if (arm_sec->rel_type == SHT_RELA)
8283 offset = rp->r_addend;
8284 else
8285 {
8286 error (_("Unknown section relocation type %d encountered\n"),
8287 arm_sec->rel_type);
8288 break;
8289 }
8290
8291 /* PR 17531 file: 027-1241568-0.004. */
8292 if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
8293 {
8294 error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
8295 (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
8296 break;
8297 }
8298
8299 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
8300 offset += sym->st_value;
8301 prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
8302
8303 /* Check that we are processing the expected reloc type. */
8304 if (filedata->file_header.e_machine == EM_ARM)
8305 {
8306 relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
8307 if (relname == NULL)
8308 {
8309 warn (_("Skipping unknown ARM relocation type: %d\n"),
8310 (int) ELF32_R_TYPE (rp->r_info));
8311 continue;
8312 }
8313
8314 if (streq (relname, "R_ARM_NONE"))
8315 continue;
8316
8317 if (! streq (relname, "R_ARM_PREL31"))
8318 {
8319 warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
8320 continue;
8321 }
8322 }
8323 else if (filedata->file_header.e_machine == EM_TI_C6000)
8324 {
8325 relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
8326 if (relname == NULL)
8327 {
8328 warn (_("Skipping unknown C6000 relocation type: %d\n"),
8329 (int) ELF32_R_TYPE (rp->r_info));
8330 continue;
8331 }
8332
8333 if (streq (relname, "R_C6000_NONE"))
8334 continue;
8335
8336 if (! streq (relname, "R_C6000_PREL31"))
8337 {
8338 warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
8339 continue;
8340 }
8341
8342 prelval >>= 1;
8343 }
8344 else
8345 {
8346 /* This function currently only supports ARM and TI unwinders. */
8347 warn (_("Only TI and ARM unwinders are currently supported\n"));
8348 break;
8349 }
8350
8351 word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
8352 addr->section = sym->st_shndx;
8353 addr->offset = offset;
8354
8355 if (sym_name)
8356 * sym_name = sym->st_name;
8357 break;
8358 }
8359
8360 *wordp = word;
8361 arm_sec->next_rela = rp;
8362
8363 return TRUE;
8364 }
8365
8366 static const char *tic6x_unwind_regnames[16] =
8367 {
8368 "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
8369 "A14", "A13", "A12", "A11", "A10",
8370 "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
8371 };
8372
8373 static void
8374 decode_tic6x_unwind_regmask (unsigned int mask)
8375 {
8376 int i;
8377
8378 for (i = 12; mask; mask >>= 1, i--)
8379 {
8380 if (mask & 1)
8381 {
8382 fputs (tic6x_unwind_regnames[i], stdout);
8383 if (mask > 1)
8384 fputs (", ", stdout);
8385 }
8386 }
8387 }
8388
8389 #define ADVANCE \
8390 if (remaining == 0 && more_words) \
8391 { \
8392 data_offset += 4; \
8393 if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec, \
8394 data_offset, & word, & addr, NULL)) \
8395 return FALSE; \
8396 remaining = 4; \
8397 more_words--; \
8398 } \
8399
8400 #define GET_OP(OP) \
8401 ADVANCE; \
8402 if (remaining) \
8403 { \
8404 remaining--; \
8405 (OP) = word >> 24; \
8406 word <<= 8; \
8407 } \
8408 else \
8409 { \
8410 printf (_("[Truncated opcode]\n")); \
8411 return FALSE; \
8412 } \
8413 printf ("0x%02x ", OP)
8414
8415 static bfd_boolean
8416 decode_arm_unwind_bytecode (Filedata * filedata,
8417 struct arm_unw_aux_info * aux,
8418 unsigned int word,
8419 unsigned int remaining,
8420 unsigned int more_words,
8421 bfd_vma data_offset,
8422 Elf_Internal_Shdr * data_sec,
8423 struct arm_section * data_arm_sec)
8424 {
8425 struct absaddr addr;
8426 bfd_boolean res = TRUE;
8427
8428 /* Decode the unwinding instructions. */
8429 while (1)
8430 {
8431 unsigned int op, op2;
8432
8433 ADVANCE;
8434 if (remaining == 0)
8435 break;
8436 remaining--;
8437 op = word >> 24;
8438 word <<= 8;
8439
8440 printf (" 0x%02x ", op);
8441
8442 if ((op & 0xc0) == 0x00)
8443 {
8444 int offset = ((op & 0x3f) << 2) + 4;
8445
8446 printf (" vsp = vsp + %d", offset);
8447 }
8448 else if ((op & 0xc0) == 0x40)
8449 {
8450 int offset = ((op & 0x3f) << 2) + 4;
8451
8452 printf (" vsp = vsp - %d", offset);
8453 }
8454 else if ((op & 0xf0) == 0x80)
8455 {
8456 GET_OP (op2);
8457 if (op == 0x80 && op2 == 0)
8458 printf (_("Refuse to unwind"));
8459 else
8460 {
8461 unsigned int mask = ((op & 0x0f) << 8) | op2;
8462 bfd_boolean first = TRUE;
8463 int i;
8464
8465 printf ("pop {");
8466 for (i = 0; i < 12; i++)
8467 if (mask & (1 << i))
8468 {
8469 if (first)
8470 first = FALSE;
8471 else
8472 printf (", ");
8473 printf ("r%d", 4 + i);
8474 }
8475 printf ("}");
8476 }
8477 }
8478 else if ((op & 0xf0) == 0x90)
8479 {
8480 if (op == 0x9d || op == 0x9f)
8481 printf (_(" [Reserved]"));
8482 else
8483 printf (" vsp = r%d", op & 0x0f);
8484 }
8485 else if ((op & 0xf0) == 0xa0)
8486 {
8487 int end = 4 + (op & 0x07);
8488 bfd_boolean first = TRUE;
8489 int i;
8490
8491 printf (" pop {");
8492 for (i = 4; i <= end; i++)
8493 {
8494 if (first)
8495 first = FALSE;
8496 else
8497 printf (", ");
8498 printf ("r%d", i);
8499 }
8500 if (op & 0x08)
8501 {
8502 if (!first)
8503 printf (", ");
8504 printf ("r14");
8505 }
8506 printf ("}");
8507 }
8508 else if (op == 0xb0)
8509 printf (_(" finish"));
8510 else if (op == 0xb1)
8511 {
8512 GET_OP (op2);
8513 if (op2 == 0 || (op2 & 0xf0) != 0)
8514 printf (_("[Spare]"));
8515 else
8516 {
8517 unsigned int mask = op2 & 0x0f;
8518 bfd_boolean first = TRUE;
8519 int i;
8520
8521 printf ("pop {");
8522 for (i = 0; i < 12; i++)
8523 if (mask & (1 << i))
8524 {
8525 if (first)
8526 first = FALSE;
8527 else
8528 printf (", ");
8529 printf ("r%d", i);
8530 }
8531 printf ("}");
8532 }
8533 }
8534 else if (op == 0xb2)
8535 {
8536 unsigned char buf[9];
8537 unsigned int i, len;
8538 unsigned long offset;
8539
8540 for (i = 0; i < sizeof (buf); i++)
8541 {
8542 GET_OP (buf[i]);
8543 if ((buf[i] & 0x80) == 0)
8544 break;
8545 }
8546 if (i == sizeof (buf))
8547 {
8548 error (_("corrupt change to vsp"));
8549 res = FALSE;
8550 }
8551 else
8552 {
8553 offset = read_uleb128 (buf, &len, buf + i + 1);
8554 assert (len == i + 1);
8555 offset = offset * 4 + 0x204;
8556 printf ("vsp = vsp + %ld", offset);
8557 }
8558 }
8559 else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
8560 {
8561 unsigned int first, last;
8562
8563 GET_OP (op2);
8564 first = op2 >> 4;
8565 last = op2 & 0x0f;
8566 if (op == 0xc8)
8567 first = first + 16;
8568 printf ("pop {D%d", first);
8569 if (last)
8570 printf ("-D%d", first + last);
8571 printf ("}");
8572 }
8573 else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
8574 {
8575 unsigned int count = op & 0x07;
8576
8577 printf ("pop {D8");
8578 if (count)
8579 printf ("-D%d", 8 + count);
8580 printf ("}");
8581 }
8582 else if (op >= 0xc0 && op <= 0xc5)
8583 {
8584 unsigned int count = op & 0x07;
8585
8586 printf (" pop {wR10");
8587 if (count)
8588 printf ("-wR%d", 10 + count);
8589 printf ("}");
8590 }
8591 else if (op == 0xc6)
8592 {
8593 unsigned int first, last;
8594
8595 GET_OP (op2);
8596 first = op2 >> 4;
8597 last = op2 & 0x0f;
8598 printf ("pop {wR%d", first);
8599 if (last)
8600 printf ("-wR%d", first + last);
8601 printf ("}");
8602 }
8603 else if (op == 0xc7)
8604 {
8605 GET_OP (op2);
8606 if (op2 == 0 || (op2 & 0xf0) != 0)
8607 printf (_("[Spare]"));
8608 else
8609 {
8610 unsigned int mask = op2 & 0x0f;
8611 bfd_boolean first = TRUE;
8612 int i;
8613
8614 printf ("pop {");
8615 for (i = 0; i < 4; i++)
8616 if (mask & (1 << i))
8617 {
8618 if (first)
8619 first = FALSE;
8620 else
8621 printf (", ");
8622 printf ("wCGR%d", i);
8623 }
8624 printf ("}");
8625 }
8626 }
8627 else
8628 {
8629 printf (_(" [unsupported opcode]"));
8630 res = FALSE;
8631 }
8632
8633 printf ("\n");
8634 }
8635
8636 return res;
8637 }
8638
8639 static bfd_boolean
8640 decode_tic6x_unwind_bytecode (Filedata * filedata,
8641 struct arm_unw_aux_info * aux,
8642 unsigned int word,
8643 unsigned int remaining,
8644 unsigned int more_words,
8645 bfd_vma data_offset,
8646 Elf_Internal_Shdr * data_sec,
8647 struct arm_section * data_arm_sec)
8648 {
8649 struct absaddr addr;
8650
8651 /* Decode the unwinding instructions. */
8652 while (1)
8653 {
8654 unsigned int op, op2;
8655
8656 ADVANCE;
8657 if (remaining == 0)
8658 break;
8659 remaining--;
8660 op = word >> 24;
8661 word <<= 8;
8662
8663 printf (" 0x%02x ", op);
8664
8665 if ((op & 0xc0) == 0x00)
8666 {
8667 int offset = ((op & 0x3f) << 3) + 8;
8668 printf (" sp = sp + %d", offset);
8669 }
8670 else if ((op & 0xc0) == 0x80)
8671 {
8672 GET_OP (op2);
8673 if (op == 0x80 && op2 == 0)
8674 printf (_("Refuse to unwind"));
8675 else
8676 {
8677 unsigned int mask = ((op & 0x1f) << 8) | op2;
8678 if (op & 0x20)
8679 printf ("pop compact {");
8680 else
8681 printf ("pop {");
8682
8683 decode_tic6x_unwind_regmask (mask);
8684 printf("}");
8685 }
8686 }
8687 else if ((op & 0xf0) == 0xc0)
8688 {
8689 unsigned int reg;
8690 unsigned int nregs;
8691 unsigned int i;
8692 const char *name;
8693 struct
8694 {
8695 unsigned int offset;
8696 unsigned int reg;
8697 } regpos[16];
8698
8699 /* Scan entire instruction first so that GET_OP output is not
8700 interleaved with disassembly. */
8701 nregs = 0;
8702 for (i = 0; nregs < (op & 0xf); i++)
8703 {
8704 GET_OP (op2);
8705 reg = op2 >> 4;
8706 if (reg != 0xf)
8707 {
8708 regpos[nregs].offset = i * 2;
8709 regpos[nregs].reg = reg;
8710 nregs++;
8711 }
8712
8713 reg = op2 & 0xf;
8714 if (reg != 0xf)
8715 {
8716 regpos[nregs].offset = i * 2 + 1;
8717 regpos[nregs].reg = reg;
8718 nregs++;
8719 }
8720 }
8721
8722 printf (_("pop frame {"));
8723 reg = nregs - 1;
8724 for (i = i * 2; i > 0; i--)
8725 {
8726 if (regpos[reg].offset == i - 1)
8727 {
8728 name = tic6x_unwind_regnames[regpos[reg].reg];
8729 if (reg > 0)
8730 reg--;
8731 }
8732 else
8733 name = _("[pad]");
8734
8735 fputs (name, stdout);
8736 if (i > 1)
8737 printf (", ");
8738 }
8739
8740 printf ("}");
8741 }
8742 else if (op == 0xd0)
8743 printf (" MOV FP, SP");
8744 else if (op == 0xd1)
8745 printf (" __c6xabi_pop_rts");
8746 else if (op == 0xd2)
8747 {
8748 unsigned char buf[9];
8749 unsigned int i, len;
8750 unsigned long offset;
8751
8752 for (i = 0; i < sizeof (buf); i++)
8753 {
8754 GET_OP (buf[i]);
8755 if ((buf[i] & 0x80) == 0)
8756 break;
8757 }
8758 /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2. */
8759 if (i == sizeof (buf))
8760 {
8761 warn (_("Corrupt stack pointer adjustment detected\n"));
8762 return FALSE;
8763 }
8764
8765 offset = read_uleb128 (buf, &len, buf + i + 1);
8766 assert (len == i + 1);
8767 offset = offset * 8 + 0x408;
8768 printf (_("sp = sp + %ld"), offset);
8769 }
8770 else if ((op & 0xf0) == 0xe0)
8771 {
8772 if ((op & 0x0f) == 7)
8773 printf (" RETURN");
8774 else
8775 printf (" MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
8776 }
8777 else
8778 {
8779 printf (_(" [unsupported opcode]"));
8780 }
8781 putchar ('\n');
8782 }
8783
8784 return TRUE;
8785 }
8786
8787 static bfd_vma
8788 arm_expand_prel31 (Filedata * filedata, bfd_vma word, bfd_vma where)
8789 {
8790 bfd_vma offset;
8791
8792 offset = word & 0x7fffffff;
8793 if (offset & 0x40000000)
8794 offset |= ~ (bfd_vma) 0x7fffffff;
8795
8796 if (filedata->file_header.e_machine == EM_TI_C6000)
8797 offset <<= 1;
8798
8799 return offset + where;
8800 }
8801
8802 static bfd_boolean
8803 decode_arm_unwind (Filedata * filedata,
8804 struct arm_unw_aux_info * aux,
8805 unsigned int word,
8806 unsigned int remaining,
8807 bfd_vma data_offset,
8808 Elf_Internal_Shdr * data_sec,
8809 struct arm_section * data_arm_sec)
8810 {
8811 int per_index;
8812 unsigned int more_words = 0;
8813 struct absaddr addr;
8814 bfd_vma sym_name = (bfd_vma) -1;
8815 bfd_boolean res = TRUE;
8816
8817 if (remaining == 0)
8818 {
8819 /* Fetch the first word.
8820 Note - when decoding an object file the address extracted
8821 here will always be 0. So we also pass in the sym_name
8822 parameter so that we can find the symbol associated with
8823 the personality routine. */
8824 if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec, data_offset,
8825 & word, & addr, & sym_name))
8826 return FALSE;
8827
8828 remaining = 4;
8829 }
8830
8831 if ((word & 0x80000000) == 0)
8832 {
8833 /* Expand prel31 for personality routine. */
8834 bfd_vma fn;
8835 const char *procname;
8836
8837 fn = arm_expand_prel31 (filedata, word, data_sec->sh_addr + data_offset);
8838 printf (_(" Personality routine: "));
8839 if (fn == 0
8840 && addr.section == SHN_UNDEF && addr.offset == 0
8841 && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
8842 {
8843 procname = aux->strtab + sym_name;
8844 print_vma (fn, PREFIX_HEX);
8845 if (procname)
8846 {
8847 fputs (" <", stdout);
8848 fputs (procname, stdout);
8849 fputc ('>', stdout);
8850 }
8851 }
8852 else
8853 procname = arm_print_vma_and_name (filedata, aux, fn, addr);
8854 fputc ('\n', stdout);
8855
8856 /* The GCC personality routines use the standard compact
8857 encoding, starting with one byte giving the number of
8858 words. */
8859 if (procname != NULL
8860 && (const_strneq (procname, "__gcc_personality_v0")
8861 || const_strneq (procname, "__gxx_personality_v0")
8862 || const_strneq (procname, "__gcj_personality_v0")
8863 || const_strneq (procname, "__gnu_objc_personality_v0")))
8864 {
8865 remaining = 0;
8866 more_words = 1;
8867 ADVANCE;
8868 if (!remaining)
8869 {
8870 printf (_(" [Truncated data]\n"));
8871 return FALSE;
8872 }
8873 more_words = word >> 24;
8874 word <<= 8;
8875 remaining--;
8876 per_index = -1;
8877 }
8878 else
8879 return TRUE;
8880 }
8881 else
8882 {
8883 /* ARM EHABI Section 6.3:
8884
8885 An exception-handling table entry for the compact model looks like:
8886
8887 31 30-28 27-24 23-0
8888 -- ----- ----- ----
8889 1 0 index Data for personalityRoutine[index] */
8890
8891 if (filedata->file_header.e_machine == EM_ARM
8892 && (word & 0x70000000))
8893 {
8894 warn (_("Corrupt ARM compact model table entry: %x \n"), word);
8895 res = FALSE;
8896 }
8897
8898 per_index = (word >> 24) & 0x7f;
8899 printf (_(" Compact model index: %d\n"), per_index);
8900 if (per_index == 0)
8901 {
8902 more_words = 0;
8903 word <<= 8;
8904 remaining--;
8905 }
8906 else if (per_index < 3)
8907 {
8908 more_words = (word >> 16) & 0xff;
8909 word <<= 16;
8910 remaining -= 2;
8911 }
8912 }
8913
8914 switch (filedata->file_header.e_machine)
8915 {
8916 case EM_ARM:
8917 if (per_index < 3)
8918 {
8919 if (! decode_arm_unwind_bytecode (filedata, aux, word, remaining, more_words,
8920 data_offset, data_sec, data_arm_sec))
8921 res = FALSE;
8922 }
8923 else
8924 {
8925 warn (_("Unknown ARM compact model index encountered\n"));
8926 printf (_(" [reserved]\n"));
8927 res = FALSE;
8928 }
8929 break;
8930
8931 case EM_TI_C6000:
8932 if (per_index < 3)
8933 {
8934 if (! decode_tic6x_unwind_bytecode (filedata, aux, word, remaining, more_words,
8935 data_offset, data_sec, data_arm_sec))
8936 res = FALSE;
8937 }
8938 else if (per_index < 5)
8939 {
8940 if (((word >> 17) & 0x7f) == 0x7f)
8941 printf (_(" Restore stack from frame pointer\n"));
8942 else
8943 printf (_(" Stack increment %d\n"), (word >> 14) & 0x1fc);
8944 printf (_(" Registers restored: "));
8945 if (per_index == 4)
8946 printf (" (compact) ");
8947 decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
8948 putchar ('\n');
8949 printf (_(" Return register: %s\n"),
8950 tic6x_unwind_regnames[word & 0xf]);
8951 }
8952 else
8953 printf (_(" [reserved (%d)]\n"), per_index);
8954 break;
8955
8956 default:
8957 error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
8958 filedata->file_header.e_machine);
8959 res = FALSE;
8960 }
8961
8962 /* Decode the descriptors. Not implemented. */
8963
8964 return res;
8965 }
8966
8967 static bfd_boolean
8968 dump_arm_unwind (Filedata * filedata,
8969 struct arm_unw_aux_info * aux,
8970 Elf_Internal_Shdr * exidx_sec)
8971 {
8972 struct arm_section exidx_arm_sec, extab_arm_sec;
8973 unsigned int i, exidx_len;
8974 unsigned long j, nfuns;
8975 bfd_boolean res = TRUE;
8976
8977 memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
8978 memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
8979 exidx_len = exidx_sec->sh_size / 8;
8980
8981 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
8982 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
8983 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
8984 aux->funtab[nfuns++] = aux->symtab[j];
8985 aux->nfuns = nfuns;
8986 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
8987
8988 for (i = 0; i < exidx_len; i++)
8989 {
8990 unsigned int exidx_fn, exidx_entry;
8991 struct absaddr fn_addr, entry_addr;
8992 bfd_vma fn;
8993
8994 fputc ('\n', stdout);
8995
8996 if (! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
8997 8 * i, & exidx_fn, & fn_addr, NULL)
8998 || ! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
8999 8 * i + 4, & exidx_entry, & entry_addr, NULL))
9000 {
9001 free (aux->funtab);
9002 arm_free_section (& exidx_arm_sec);
9003 arm_free_section (& extab_arm_sec);
9004 return FALSE;
9005 }
9006
9007 /* ARM EHABI, Section 5:
9008 An index table entry consists of 2 words.
9009 The first word contains a prel31 offset to the start of a function, with bit 31 clear. */
9010 if (exidx_fn & 0x80000000)
9011 {
9012 warn (_("corrupt index table entry: %x\n"), exidx_fn);
9013 res = FALSE;
9014 }
9015
9016 fn = arm_expand_prel31 (filedata, exidx_fn, exidx_sec->sh_addr + 8 * i);
9017
9018 arm_print_vma_and_name (filedata, aux, fn, fn_addr);
9019 fputs (": ", stdout);
9020
9021 if (exidx_entry == 1)
9022 {
9023 print_vma (exidx_entry, PREFIX_HEX);
9024 fputs (" [cantunwind]\n", stdout);
9025 }
9026 else if (exidx_entry & 0x80000000)
9027 {
9028 print_vma (exidx_entry, PREFIX_HEX);
9029 fputc ('\n', stdout);
9030 decode_arm_unwind (filedata, aux, exidx_entry, 4, 0, NULL, NULL);
9031 }
9032 else
9033 {
9034 bfd_vma table, table_offset = 0;
9035 Elf_Internal_Shdr *table_sec;
9036
9037 fputs ("@", stdout);
9038 table = arm_expand_prel31 (filedata, exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
9039 print_vma (table, PREFIX_HEX);
9040 printf ("\n");
9041
9042 /* Locate the matching .ARM.extab. */
9043 if (entry_addr.section != SHN_UNDEF
9044 && entry_addr.section < filedata->file_header.e_shnum)
9045 {
9046 table_sec = filedata->section_headers + entry_addr.section;
9047 table_offset = entry_addr.offset;
9048 /* PR 18879 */
9049 if (table_offset > table_sec->sh_size
9050 || ((bfd_signed_vma) table_offset) < 0)
9051 {
9052 warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
9053 (unsigned long) table_offset,
9054 printable_section_name (filedata, table_sec));
9055 res = FALSE;
9056 continue;
9057 }
9058 }
9059 else
9060 {
9061 table_sec = find_section_by_address (filedata, table);
9062 if (table_sec != NULL)
9063 table_offset = table - table_sec->sh_addr;
9064 }
9065
9066 if (table_sec == NULL)
9067 {
9068 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
9069 (unsigned long) table);
9070 res = FALSE;
9071 continue;
9072 }
9073
9074 if (! decode_arm_unwind (filedata, aux, 0, 0, table_offset, table_sec,
9075 &extab_arm_sec))
9076 res = FALSE;
9077 }
9078 }
9079
9080 printf ("\n");
9081
9082 free (aux->funtab);
9083 arm_free_section (&exidx_arm_sec);
9084 arm_free_section (&extab_arm_sec);
9085
9086 return res;
9087 }
9088
9089 /* Used for both ARM and C6X unwinding tables. */
9090
9091 static bfd_boolean
9092 arm_process_unwind (Filedata * filedata)
9093 {
9094 struct arm_unw_aux_info aux;
9095 Elf_Internal_Shdr *unwsec = NULL;
9096 Elf_Internal_Shdr *strsec;
9097 Elf_Internal_Shdr *sec;
9098 unsigned long i;
9099 unsigned int sec_type;
9100 bfd_boolean res = TRUE;
9101
9102 switch (filedata->file_header.e_machine)
9103 {
9104 case EM_ARM:
9105 sec_type = SHT_ARM_EXIDX;
9106 break;
9107
9108 case EM_TI_C6000:
9109 sec_type = SHT_C6000_UNWIND;
9110 break;
9111
9112 default:
9113 error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
9114 filedata->file_header.e_machine);
9115 return FALSE;
9116 }
9117
9118 if (filedata->string_table == NULL)
9119 return FALSE;
9120
9121 memset (& aux, 0, sizeof (aux));
9122 aux.filedata = filedata;
9123
9124 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
9125 {
9126 if (sec->sh_type == SHT_SYMTAB && sec->sh_link < filedata->file_header.e_shnum)
9127 {
9128 aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
9129
9130 strsec = filedata->section_headers + sec->sh_link;
9131
9132 /* PR binutils/17531 file: 011-12666-0.004. */
9133 if (aux.strtab != NULL)
9134 {
9135 error (_("Multiple string tables found in file.\n"));
9136 free (aux.strtab);
9137 res = FALSE;
9138 }
9139 aux.strtab = get_data (NULL, filedata, strsec->sh_offset,
9140 1, strsec->sh_size, _("string table"));
9141 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
9142 }
9143 else if (sec->sh_type == sec_type)
9144 unwsec = sec;
9145 }
9146
9147 if (unwsec == NULL)
9148 printf (_("\nThere are no unwind sections in this file.\n"));
9149 else
9150 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
9151 {
9152 if (sec->sh_type == sec_type)
9153 {
9154 unsigned long num_unwind = sec->sh_size / (2 * eh_addr_size);
9155 printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
9156 "contains %lu entry:\n",
9157 "\nUnwind section '%s' at offset 0x%lx "
9158 "contains %lu entries:\n",
9159 num_unwind),
9160 printable_section_name (filedata, sec),
9161 (unsigned long) sec->sh_offset,
9162 num_unwind);
9163
9164 if (! dump_arm_unwind (filedata, &aux, sec))
9165 res = FALSE;
9166 }
9167 }
9168
9169 if (aux.symtab)
9170 free (aux.symtab);
9171 if (aux.strtab)
9172 free ((char *) aux.strtab);
9173
9174 return res;
9175 }
9176
9177 static bfd_boolean
9178 process_unwind (Filedata * filedata)
9179 {
9180 struct unwind_handler
9181 {
9182 unsigned int machtype;
9183 bfd_boolean (* handler)(Filedata *);
9184 } handlers[] =
9185 {
9186 { EM_ARM, arm_process_unwind },
9187 { EM_IA_64, ia64_process_unwind },
9188 { EM_PARISC, hppa_process_unwind },
9189 { EM_TI_C6000, arm_process_unwind },
9190 { 0, NULL }
9191 };
9192 int i;
9193
9194 if (!do_unwind)
9195 return TRUE;
9196
9197 for (i = 0; handlers[i].handler != NULL; i++)
9198 if (filedata->file_header.e_machine == handlers[i].machtype)
9199 return handlers[i].handler (filedata);
9200
9201 printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
9202 get_machine_name (filedata->file_header.e_machine));
9203 return TRUE;
9204 }
9205
9206 static void
9207 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
9208 {
9209 switch (entry->d_tag)
9210 {
9211 case DT_MIPS_FLAGS:
9212 if (entry->d_un.d_val == 0)
9213 printf (_("NONE"));
9214 else
9215 {
9216 static const char * opts[] =
9217 {
9218 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
9219 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
9220 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
9221 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
9222 "RLD_ORDER_SAFE"
9223 };
9224 unsigned int cnt;
9225 bfd_boolean first = TRUE;
9226
9227 for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
9228 if (entry->d_un.d_val & (1 << cnt))
9229 {
9230 printf ("%s%s", first ? "" : " ", opts[cnt]);
9231 first = FALSE;
9232 }
9233 }
9234 break;
9235
9236 case DT_MIPS_IVERSION:
9237 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9238 printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
9239 else
9240 {
9241 char buf[40];
9242 sprintf_vma (buf, entry->d_un.d_ptr);
9243 /* Note: coded this way so that there is a single string for translation. */
9244 printf (_("<corrupt: %s>"), buf);
9245 }
9246 break;
9247
9248 case DT_MIPS_TIME_STAMP:
9249 {
9250 char timebuf[128];
9251 struct tm * tmp;
9252 time_t atime = entry->d_un.d_val;
9253
9254 tmp = gmtime (&atime);
9255 /* PR 17531: file: 6accc532. */
9256 if (tmp == NULL)
9257 snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
9258 else
9259 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
9260 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9261 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9262 printf (_("Time Stamp: %s"), timebuf);
9263 }
9264 break;
9265
9266 case DT_MIPS_RLD_VERSION:
9267 case DT_MIPS_LOCAL_GOTNO:
9268 case DT_MIPS_CONFLICTNO:
9269 case DT_MIPS_LIBLISTNO:
9270 case DT_MIPS_SYMTABNO:
9271 case DT_MIPS_UNREFEXTNO:
9272 case DT_MIPS_HIPAGENO:
9273 case DT_MIPS_DELTA_CLASS_NO:
9274 case DT_MIPS_DELTA_INSTANCE_NO:
9275 case DT_MIPS_DELTA_RELOC_NO:
9276 case DT_MIPS_DELTA_SYM_NO:
9277 case DT_MIPS_DELTA_CLASSSYM_NO:
9278 case DT_MIPS_COMPACT_SIZE:
9279 print_vma (entry->d_un.d_val, DEC);
9280 break;
9281
9282 default:
9283 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9284 }
9285 putchar ('\n');
9286 }
9287
9288 static void
9289 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
9290 {
9291 switch (entry->d_tag)
9292 {
9293 case DT_HP_DLD_FLAGS:
9294 {
9295 static struct
9296 {
9297 long int bit;
9298 const char * str;
9299 }
9300 flags[] =
9301 {
9302 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
9303 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
9304 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
9305 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
9306 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
9307 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
9308 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
9309 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
9310 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
9311 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
9312 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
9313 { DT_HP_GST, "HP_GST" },
9314 { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
9315 { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
9316 { DT_HP_NODELETE, "HP_NODELETE" },
9317 { DT_HP_GROUP, "HP_GROUP" },
9318 { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
9319 };
9320 bfd_boolean first = TRUE;
9321 size_t cnt;
9322 bfd_vma val = entry->d_un.d_val;
9323
9324 for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
9325 if (val & flags[cnt].bit)
9326 {
9327 if (! first)
9328 putchar (' ');
9329 fputs (flags[cnt].str, stdout);
9330 first = FALSE;
9331 val ^= flags[cnt].bit;
9332 }
9333
9334 if (val != 0 || first)
9335 {
9336 if (! first)
9337 putchar (' ');
9338 print_vma (val, HEX);
9339 }
9340 }
9341 break;
9342
9343 default:
9344 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9345 break;
9346 }
9347 putchar ('\n');
9348 }
9349
9350 #ifdef BFD64
9351
9352 /* VMS vs Unix time offset and factor. */
9353
9354 #define VMS_EPOCH_OFFSET 35067168000000000LL
9355 #define VMS_GRANULARITY_FACTOR 10000000
9356
9357 /* Display a VMS time in a human readable format. */
9358
9359 static void
9360 print_vms_time (bfd_int64_t vmstime)
9361 {
9362 struct tm *tm;
9363 time_t unxtime;
9364
9365 unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
9366 tm = gmtime (&unxtime);
9367 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
9368 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
9369 tm->tm_hour, tm->tm_min, tm->tm_sec);
9370 }
9371 #endif /* BFD64 */
9372
9373 static void
9374 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
9375 {
9376 switch (entry->d_tag)
9377 {
9378 case DT_IA_64_PLT_RESERVE:
9379 /* First 3 slots reserved. */
9380 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9381 printf (" -- ");
9382 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
9383 break;
9384
9385 case DT_IA_64_VMS_LINKTIME:
9386 #ifdef BFD64
9387 print_vms_time (entry->d_un.d_val);
9388 #endif
9389 break;
9390
9391 case DT_IA_64_VMS_LNKFLAGS:
9392 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9393 if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
9394 printf (" CALL_DEBUG");
9395 if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
9396 printf (" NOP0BUFS");
9397 if (entry->d_un.d_val & VMS_LF_P0IMAGE)
9398 printf (" P0IMAGE");
9399 if (entry->d_un.d_val & VMS_LF_MKTHREADS)
9400 printf (" MKTHREADS");
9401 if (entry->d_un.d_val & VMS_LF_UPCALLS)
9402 printf (" UPCALLS");
9403 if (entry->d_un.d_val & VMS_LF_IMGSTA)
9404 printf (" IMGSTA");
9405 if (entry->d_un.d_val & VMS_LF_INITIALIZE)
9406 printf (" INITIALIZE");
9407 if (entry->d_un.d_val & VMS_LF_MAIN)
9408 printf (" MAIN");
9409 if (entry->d_un.d_val & VMS_LF_EXE_INIT)
9410 printf (" EXE_INIT");
9411 if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
9412 printf (" TBK_IN_IMG");
9413 if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
9414 printf (" DBG_IN_IMG");
9415 if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
9416 printf (" TBK_IN_DSF");
9417 if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
9418 printf (" DBG_IN_DSF");
9419 if (entry->d_un.d_val & VMS_LF_SIGNATURES)
9420 printf (" SIGNATURES");
9421 if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
9422 printf (" REL_SEG_OFF");
9423 break;
9424
9425 default:
9426 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9427 break;
9428 }
9429 putchar ('\n');
9430 }
9431
9432 static bfd_boolean
9433 get_32bit_dynamic_section (Filedata * filedata)
9434 {
9435 Elf32_External_Dyn * edyn;
9436 Elf32_External_Dyn * ext;
9437 Elf_Internal_Dyn * entry;
9438
9439 edyn = (Elf32_External_Dyn *) get_data (NULL, filedata, dynamic_addr, 1,
9440 dynamic_size, _("dynamic section"));
9441 if (!edyn)
9442 return FALSE;
9443
9444 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9445 might not have the luxury of section headers. Look for the DT_NULL
9446 terminator to determine the number of entries. */
9447 for (ext = edyn, dynamic_nent = 0;
9448 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9449 ext++)
9450 {
9451 dynamic_nent++;
9452 if (BYTE_GET (ext->d_tag) == DT_NULL)
9453 break;
9454 }
9455
9456 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9457 sizeof (* entry));
9458 if (dynamic_section == NULL)
9459 {
9460 error (_("Out of memory allocating space for %lu dynamic entries\n"),
9461 (unsigned long) dynamic_nent);
9462 free (edyn);
9463 return FALSE;
9464 }
9465
9466 for (ext = edyn, entry = dynamic_section;
9467 entry < dynamic_section + dynamic_nent;
9468 ext++, entry++)
9469 {
9470 entry->d_tag = BYTE_GET (ext->d_tag);
9471 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9472 }
9473
9474 free (edyn);
9475
9476 return TRUE;
9477 }
9478
9479 static bfd_boolean
9480 get_64bit_dynamic_section (Filedata * filedata)
9481 {
9482 Elf64_External_Dyn * edyn;
9483 Elf64_External_Dyn * ext;
9484 Elf_Internal_Dyn * entry;
9485
9486 /* Read in the data. */
9487 edyn = (Elf64_External_Dyn *) get_data (NULL, filedata, dynamic_addr, 1,
9488 dynamic_size, _("dynamic section"));
9489 if (!edyn)
9490 return FALSE;
9491
9492 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9493 might not have the luxury of section headers. Look for the DT_NULL
9494 terminator to determine the number of entries. */
9495 for (ext = edyn, dynamic_nent = 0;
9496 /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer. */
9497 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9498 ext++)
9499 {
9500 dynamic_nent++;
9501 if (BYTE_GET (ext->d_tag) == DT_NULL)
9502 break;
9503 }
9504
9505 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9506 sizeof (* entry));
9507 if (dynamic_section == NULL)
9508 {
9509 error (_("Out of memory allocating space for %lu dynamic entries\n"),
9510 (unsigned long) dynamic_nent);
9511 free (edyn);
9512 return FALSE;
9513 }
9514
9515 /* Convert from external to internal formats. */
9516 for (ext = edyn, entry = dynamic_section;
9517 entry < dynamic_section + dynamic_nent;
9518 ext++, entry++)
9519 {
9520 entry->d_tag = BYTE_GET (ext->d_tag);
9521 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9522 }
9523
9524 free (edyn);
9525
9526 return TRUE;
9527 }
9528
9529 static void
9530 print_dynamic_flags (bfd_vma flags)
9531 {
9532 bfd_boolean first = TRUE;
9533
9534 while (flags)
9535 {
9536 bfd_vma flag;
9537
9538 flag = flags & - flags;
9539 flags &= ~ flag;
9540
9541 if (first)
9542 first = FALSE;
9543 else
9544 putc (' ', stdout);
9545
9546 switch (flag)
9547 {
9548 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
9549 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
9550 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
9551 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
9552 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
9553 default: fputs (_("unknown"), stdout); break;
9554 }
9555 }
9556 puts ("");
9557 }
9558
9559 /* Parse and display the contents of the dynamic section. */
9560
9561 static bfd_boolean
9562 process_dynamic_section (Filedata * filedata)
9563 {
9564 Elf_Internal_Dyn * entry;
9565
9566 if (dynamic_size == 0)
9567 {
9568 if (do_dynamic)
9569 printf (_("\nThere is no dynamic section in this file.\n"));
9570
9571 return TRUE;
9572 }
9573
9574 if (is_32bit_elf)
9575 {
9576 if (! get_32bit_dynamic_section (filedata))
9577 return FALSE;
9578 }
9579 else
9580 {
9581 if (! get_64bit_dynamic_section (filedata))
9582 return FALSE;
9583 }
9584
9585 /* Find the appropriate symbol table. */
9586 if (dynamic_symbols == NULL)
9587 {
9588 for (entry = dynamic_section;
9589 entry < dynamic_section + dynamic_nent;
9590 ++entry)
9591 {
9592 Elf_Internal_Shdr section;
9593
9594 if (entry->d_tag != DT_SYMTAB)
9595 continue;
9596
9597 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
9598
9599 /* Since we do not know how big the symbol table is,
9600 we default to reading in the entire file (!) and
9601 processing that. This is overkill, I know, but it
9602 should work. */
9603 section.sh_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
9604 if ((bfd_size_type) section.sh_offset > filedata->file_size)
9605 {
9606 /* See PR 21379 for a reproducer. */
9607 error (_("Invalid DT_SYMTAB entry: %lx"), (long) section.sh_offset);
9608 return FALSE;
9609 }
9610
9611 if (archive_file_offset != 0)
9612 section.sh_size = archive_file_size - section.sh_offset;
9613 else
9614 section.sh_size = filedata->file_size - section.sh_offset;
9615
9616 if (is_32bit_elf)
9617 section.sh_entsize = sizeof (Elf32_External_Sym);
9618 else
9619 section.sh_entsize = sizeof (Elf64_External_Sym);
9620 section.sh_name = filedata->string_table_length;
9621
9622 dynamic_symbols = GET_ELF_SYMBOLS (filedata, &section, & num_dynamic_syms);
9623 if (num_dynamic_syms < 1)
9624 {
9625 error (_("Unable to determine the number of symbols to load\n"));
9626 continue;
9627 }
9628 }
9629 }
9630
9631 /* Similarly find a string table. */
9632 if (dynamic_strings == NULL)
9633 {
9634 for (entry = dynamic_section;
9635 entry < dynamic_section + dynamic_nent;
9636 ++entry)
9637 {
9638 unsigned long offset;
9639 long str_tab_len;
9640
9641 if (entry->d_tag != DT_STRTAB)
9642 continue;
9643
9644 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
9645
9646 /* Since we do not know how big the string table is,
9647 we default to reading in the entire file (!) and
9648 processing that. This is overkill, I know, but it
9649 should work. */
9650
9651 offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
9652
9653 if (archive_file_offset != 0)
9654 str_tab_len = archive_file_size - offset;
9655 else
9656 str_tab_len = filedata->file_size;
9657
9658 if (str_tab_len < 1)
9659 {
9660 error
9661 (_("Unable to determine the length of the dynamic string table\n"));
9662 continue;
9663 }
9664
9665 dynamic_strings = (char *) get_data (NULL, filedata, offset, 1,
9666 str_tab_len,
9667 _("dynamic string table"));
9668 dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
9669 break;
9670 }
9671 }
9672
9673 /* And find the syminfo section if available. */
9674 if (dynamic_syminfo == NULL)
9675 {
9676 unsigned long syminsz = 0;
9677
9678 for (entry = dynamic_section;
9679 entry < dynamic_section + dynamic_nent;
9680 ++entry)
9681 {
9682 if (entry->d_tag == DT_SYMINENT)
9683 {
9684 /* Note: these braces are necessary to avoid a syntax
9685 error from the SunOS4 C compiler. */
9686 /* PR binutils/17531: A corrupt file can trigger this test.
9687 So do not use an assert, instead generate an error message. */
9688 if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
9689 error (_("Bad value (%d) for SYMINENT entry\n"),
9690 (int) entry->d_un.d_val);
9691 }
9692 else if (entry->d_tag == DT_SYMINSZ)
9693 syminsz = entry->d_un.d_val;
9694 else if (entry->d_tag == DT_SYMINFO)
9695 dynamic_syminfo_offset = offset_from_vma (filedata, entry->d_un.d_val,
9696 syminsz);
9697 }
9698
9699 if (dynamic_syminfo_offset != 0 && syminsz != 0)
9700 {
9701 Elf_External_Syminfo * extsyminfo;
9702 Elf_External_Syminfo * extsym;
9703 Elf_Internal_Syminfo * syminfo;
9704
9705 /* There is a syminfo section. Read the data. */
9706 extsyminfo = (Elf_External_Syminfo *)
9707 get_data (NULL, filedata, dynamic_syminfo_offset, 1, syminsz,
9708 _("symbol information"));
9709 if (!extsyminfo)
9710 return FALSE;
9711
9712 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
9713 if (dynamic_syminfo == NULL)
9714 {
9715 error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9716 (unsigned long) syminsz);
9717 return FALSE;
9718 }
9719
9720 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
9721 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
9722 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
9723 ++syminfo, ++extsym)
9724 {
9725 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
9726 syminfo->si_flags = BYTE_GET (extsym->si_flags);
9727 }
9728
9729 free (extsyminfo);
9730 }
9731 }
9732
9733 if (do_dynamic && dynamic_addr)
9734 printf (ngettext ("\nDynamic section at offset 0x%lx "
9735 "contains %lu entry:\n",
9736 "\nDynamic section at offset 0x%lx "
9737 "contains %lu entries:\n",
9738 dynamic_nent),
9739 dynamic_addr, (unsigned long) dynamic_nent);
9740 if (do_dynamic)
9741 printf (_(" Tag Type Name/Value\n"));
9742
9743 for (entry = dynamic_section;
9744 entry < dynamic_section + dynamic_nent;
9745 entry++)
9746 {
9747 if (do_dynamic)
9748 {
9749 const char * dtype;
9750
9751 putchar (' ');
9752 print_vma (entry->d_tag, FULL_HEX);
9753 dtype = get_dynamic_type (filedata, entry->d_tag);
9754 printf (" (%s)%*s", dtype,
9755 ((is_32bit_elf ? 27 : 19) - (int) strlen (dtype)), " ");
9756 }
9757
9758 switch (entry->d_tag)
9759 {
9760 case DT_FLAGS:
9761 if (do_dynamic)
9762 print_dynamic_flags (entry->d_un.d_val);
9763 break;
9764
9765 case DT_AUXILIARY:
9766 case DT_FILTER:
9767 case DT_CONFIG:
9768 case DT_DEPAUDIT:
9769 case DT_AUDIT:
9770 if (do_dynamic)
9771 {
9772 switch (entry->d_tag)
9773 {
9774 case DT_AUXILIARY:
9775 printf (_("Auxiliary library"));
9776 break;
9777
9778 case DT_FILTER:
9779 printf (_("Filter library"));
9780 break;
9781
9782 case DT_CONFIG:
9783 printf (_("Configuration file"));
9784 break;
9785
9786 case DT_DEPAUDIT:
9787 printf (_("Dependency audit library"));
9788 break;
9789
9790 case DT_AUDIT:
9791 printf (_("Audit library"));
9792 break;
9793 }
9794
9795 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9796 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
9797 else
9798 {
9799 printf (": ");
9800 print_vma (entry->d_un.d_val, PREFIX_HEX);
9801 putchar ('\n');
9802 }
9803 }
9804 break;
9805
9806 case DT_FEATURE:
9807 if (do_dynamic)
9808 {
9809 printf (_("Flags:"));
9810
9811 if (entry->d_un.d_val == 0)
9812 printf (_(" None\n"));
9813 else
9814 {
9815 unsigned long int val = entry->d_un.d_val;
9816
9817 if (val & DTF_1_PARINIT)
9818 {
9819 printf (" PARINIT");
9820 val ^= DTF_1_PARINIT;
9821 }
9822 if (val & DTF_1_CONFEXP)
9823 {
9824 printf (" CONFEXP");
9825 val ^= DTF_1_CONFEXP;
9826 }
9827 if (val != 0)
9828 printf (" %lx", val);
9829 puts ("");
9830 }
9831 }
9832 break;
9833
9834 case DT_POSFLAG_1:
9835 if (do_dynamic)
9836 {
9837 printf (_("Flags:"));
9838
9839 if (entry->d_un.d_val == 0)
9840 printf (_(" None\n"));
9841 else
9842 {
9843 unsigned long int val = entry->d_un.d_val;
9844
9845 if (val & DF_P1_LAZYLOAD)
9846 {
9847 printf (" LAZYLOAD");
9848 val ^= DF_P1_LAZYLOAD;
9849 }
9850 if (val & DF_P1_GROUPPERM)
9851 {
9852 printf (" GROUPPERM");
9853 val ^= DF_P1_GROUPPERM;
9854 }
9855 if (val != 0)
9856 printf (" %lx", val);
9857 puts ("");
9858 }
9859 }
9860 break;
9861
9862 case DT_FLAGS_1:
9863 if (do_dynamic)
9864 {
9865 printf (_("Flags:"));
9866 if (entry->d_un.d_val == 0)
9867 printf (_(" None\n"));
9868 else
9869 {
9870 unsigned long int val = entry->d_un.d_val;
9871
9872 if (val & DF_1_NOW)
9873 {
9874 printf (" NOW");
9875 val ^= DF_1_NOW;
9876 }
9877 if (val & DF_1_GLOBAL)
9878 {
9879 printf (" GLOBAL");
9880 val ^= DF_1_GLOBAL;
9881 }
9882 if (val & DF_1_GROUP)
9883 {
9884 printf (" GROUP");
9885 val ^= DF_1_GROUP;
9886 }
9887 if (val & DF_1_NODELETE)
9888 {
9889 printf (" NODELETE");
9890 val ^= DF_1_NODELETE;
9891 }
9892 if (val & DF_1_LOADFLTR)
9893 {
9894 printf (" LOADFLTR");
9895 val ^= DF_1_LOADFLTR;
9896 }
9897 if (val & DF_1_INITFIRST)
9898 {
9899 printf (" INITFIRST");
9900 val ^= DF_1_INITFIRST;
9901 }
9902 if (val & DF_1_NOOPEN)
9903 {
9904 printf (" NOOPEN");
9905 val ^= DF_1_NOOPEN;
9906 }
9907 if (val & DF_1_ORIGIN)
9908 {
9909 printf (" ORIGIN");
9910 val ^= DF_1_ORIGIN;
9911 }
9912 if (val & DF_1_DIRECT)
9913 {
9914 printf (" DIRECT");
9915 val ^= DF_1_DIRECT;
9916 }
9917 if (val & DF_1_TRANS)
9918 {
9919 printf (" TRANS");
9920 val ^= DF_1_TRANS;
9921 }
9922 if (val & DF_1_INTERPOSE)
9923 {
9924 printf (" INTERPOSE");
9925 val ^= DF_1_INTERPOSE;
9926 }
9927 if (val & DF_1_NODEFLIB)
9928 {
9929 printf (" NODEFLIB");
9930 val ^= DF_1_NODEFLIB;
9931 }
9932 if (val & DF_1_NODUMP)
9933 {
9934 printf (" NODUMP");
9935 val ^= DF_1_NODUMP;
9936 }
9937 if (val & DF_1_CONFALT)
9938 {
9939 printf (" CONFALT");
9940 val ^= DF_1_CONFALT;
9941 }
9942 if (val & DF_1_ENDFILTEE)
9943 {
9944 printf (" ENDFILTEE");
9945 val ^= DF_1_ENDFILTEE;
9946 }
9947 if (val & DF_1_DISPRELDNE)
9948 {
9949 printf (" DISPRELDNE");
9950 val ^= DF_1_DISPRELDNE;
9951 }
9952 if (val & DF_1_DISPRELPND)
9953 {
9954 printf (" DISPRELPND");
9955 val ^= DF_1_DISPRELPND;
9956 }
9957 if (val & DF_1_NODIRECT)
9958 {
9959 printf (" NODIRECT");
9960 val ^= DF_1_NODIRECT;
9961 }
9962 if (val & DF_1_IGNMULDEF)
9963 {
9964 printf (" IGNMULDEF");
9965 val ^= DF_1_IGNMULDEF;
9966 }
9967 if (val & DF_1_NOKSYMS)
9968 {
9969 printf (" NOKSYMS");
9970 val ^= DF_1_NOKSYMS;
9971 }
9972 if (val & DF_1_NOHDR)
9973 {
9974 printf (" NOHDR");
9975 val ^= DF_1_NOHDR;
9976 }
9977 if (val & DF_1_EDITED)
9978 {
9979 printf (" EDITED");
9980 val ^= DF_1_EDITED;
9981 }
9982 if (val & DF_1_NORELOC)
9983 {
9984 printf (" NORELOC");
9985 val ^= DF_1_NORELOC;
9986 }
9987 if (val & DF_1_SYMINTPOSE)
9988 {
9989 printf (" SYMINTPOSE");
9990 val ^= DF_1_SYMINTPOSE;
9991 }
9992 if (val & DF_1_GLOBAUDIT)
9993 {
9994 printf (" GLOBAUDIT");
9995 val ^= DF_1_GLOBAUDIT;
9996 }
9997 if (val & DF_1_SINGLETON)
9998 {
9999 printf (" SINGLETON");
10000 val ^= DF_1_SINGLETON;
10001 }
10002 if (val & DF_1_STUB)
10003 {
10004 printf (" STUB");
10005 val ^= DF_1_STUB;
10006 }
10007 if (val & DF_1_PIE)
10008 {
10009 printf (" PIE");
10010 val ^= DF_1_PIE;
10011 }
10012 if (val != 0)
10013 printf (" %lx", val);
10014 puts ("");
10015 }
10016 }
10017 break;
10018
10019 case DT_PLTREL:
10020 dynamic_info[entry->d_tag] = entry->d_un.d_val;
10021 if (do_dynamic)
10022 puts (get_dynamic_type (filedata, entry->d_un.d_val));
10023 break;
10024
10025 case DT_NULL :
10026 case DT_NEEDED :
10027 case DT_PLTGOT :
10028 case DT_HASH :
10029 case DT_STRTAB :
10030 case DT_SYMTAB :
10031 case DT_RELA :
10032 case DT_INIT :
10033 case DT_FINI :
10034 case DT_SONAME :
10035 case DT_RPATH :
10036 case DT_SYMBOLIC:
10037 case DT_REL :
10038 case DT_DEBUG :
10039 case DT_TEXTREL :
10040 case DT_JMPREL :
10041 case DT_RUNPATH :
10042 dynamic_info[entry->d_tag] = entry->d_un.d_val;
10043
10044 if (do_dynamic)
10045 {
10046 char * name;
10047
10048 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
10049 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
10050 else
10051 name = NULL;
10052
10053 if (name)
10054 {
10055 switch (entry->d_tag)
10056 {
10057 case DT_NEEDED:
10058 printf (_("Shared library: [%s]"), name);
10059
10060 if (streq (name, program_interpreter))
10061 printf (_(" program interpreter"));
10062 break;
10063
10064 case DT_SONAME:
10065 printf (_("Library soname: [%s]"), name);
10066 break;
10067
10068 case DT_RPATH:
10069 printf (_("Library rpath: [%s]"), name);
10070 break;
10071
10072 case DT_RUNPATH:
10073 printf (_("Library runpath: [%s]"), name);
10074 break;
10075
10076 default:
10077 print_vma (entry->d_un.d_val, PREFIX_HEX);
10078 break;
10079 }
10080 }
10081 else
10082 print_vma (entry->d_un.d_val, PREFIX_HEX);
10083
10084 putchar ('\n');
10085 }
10086 break;
10087
10088 case DT_PLTRELSZ:
10089 case DT_RELASZ :
10090 case DT_STRSZ :
10091 case DT_RELSZ :
10092 case DT_RELAENT :
10093 case DT_SYMENT :
10094 case DT_RELENT :
10095 dynamic_info[entry->d_tag] = entry->d_un.d_val;
10096 /* Fall through. */
10097 case DT_PLTPADSZ:
10098 case DT_MOVEENT :
10099 case DT_MOVESZ :
10100 case DT_INIT_ARRAYSZ:
10101 case DT_FINI_ARRAYSZ:
10102 case DT_GNU_CONFLICTSZ:
10103 case DT_GNU_LIBLISTSZ:
10104 if (do_dynamic)
10105 {
10106 print_vma (entry->d_un.d_val, UNSIGNED);
10107 printf (_(" (bytes)\n"));
10108 }
10109 break;
10110
10111 case DT_VERDEFNUM:
10112 case DT_VERNEEDNUM:
10113 case DT_RELACOUNT:
10114 case DT_RELCOUNT:
10115 if (do_dynamic)
10116 {
10117 print_vma (entry->d_un.d_val, UNSIGNED);
10118 putchar ('\n');
10119 }
10120 break;
10121
10122 case DT_SYMINSZ:
10123 case DT_SYMINENT:
10124 case DT_SYMINFO:
10125 case DT_USED:
10126 case DT_INIT_ARRAY:
10127 case DT_FINI_ARRAY:
10128 if (do_dynamic)
10129 {
10130 if (entry->d_tag == DT_USED
10131 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
10132 {
10133 char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
10134
10135 if (*name)
10136 {
10137 printf (_("Not needed object: [%s]\n"), name);
10138 break;
10139 }
10140 }
10141
10142 print_vma (entry->d_un.d_val, PREFIX_HEX);
10143 putchar ('\n');
10144 }
10145 break;
10146
10147 case DT_BIND_NOW:
10148 /* The value of this entry is ignored. */
10149 if (do_dynamic)
10150 putchar ('\n');
10151 break;
10152
10153 case DT_GNU_PRELINKED:
10154 if (do_dynamic)
10155 {
10156 struct tm * tmp;
10157 time_t atime = entry->d_un.d_val;
10158
10159 tmp = gmtime (&atime);
10160 /* PR 17533 file: 041-1244816-0.004. */
10161 if (tmp == NULL)
10162 printf (_("<corrupt time val: %lx"),
10163 (unsigned long) atime);
10164 else
10165 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
10166 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
10167 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
10168
10169 }
10170 break;
10171
10172 case DT_GNU_HASH:
10173 dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
10174 if (do_dynamic)
10175 {
10176 print_vma (entry->d_un.d_val, PREFIX_HEX);
10177 putchar ('\n');
10178 }
10179 break;
10180
10181 default:
10182 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
10183 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
10184 entry->d_un.d_val;
10185
10186 if (do_dynamic)
10187 {
10188 switch (filedata->file_header.e_machine)
10189 {
10190 case EM_MIPS:
10191 case EM_MIPS_RS3_LE:
10192 dynamic_section_mips_val (entry);
10193 break;
10194 case EM_PARISC:
10195 dynamic_section_parisc_val (entry);
10196 break;
10197 case EM_IA_64:
10198 dynamic_section_ia64_val (entry);
10199 break;
10200 default:
10201 print_vma (entry->d_un.d_val, PREFIX_HEX);
10202 putchar ('\n');
10203 }
10204 }
10205 break;
10206 }
10207 }
10208
10209 return TRUE;
10210 }
10211
10212 static char *
10213 get_ver_flags (unsigned int flags)
10214 {
10215 static char buff[128];
10216
10217 buff[0] = 0;
10218
10219 if (flags == 0)
10220 return _("none");
10221
10222 if (flags & VER_FLG_BASE)
10223 strcat (buff, "BASE");
10224
10225 if (flags & VER_FLG_WEAK)
10226 {
10227 if (flags & VER_FLG_BASE)
10228 strcat (buff, " | ");
10229
10230 strcat (buff, "WEAK");
10231 }
10232
10233 if (flags & VER_FLG_INFO)
10234 {
10235 if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
10236 strcat (buff, " | ");
10237
10238 strcat (buff, "INFO");
10239 }
10240
10241 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
10242 {
10243 if (flags & (VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
10244 strcat (buff, " | ");
10245
10246 strcat (buff, _("<unknown>"));
10247 }
10248
10249 return buff;
10250 }
10251
10252 /* Display the contents of the version sections. */
10253
10254 static bfd_boolean
10255 process_version_sections (Filedata * filedata)
10256 {
10257 Elf_Internal_Shdr * section;
10258 unsigned i;
10259 bfd_boolean found = FALSE;
10260
10261 if (! do_version)
10262 return TRUE;
10263
10264 for (i = 0, section = filedata->section_headers;
10265 i < filedata->file_header.e_shnum;
10266 i++, section++)
10267 {
10268 switch (section->sh_type)
10269 {
10270 case SHT_GNU_verdef:
10271 {
10272 Elf_External_Verdef * edefs;
10273 unsigned long idx;
10274 unsigned long cnt;
10275 char * endbuf;
10276
10277 found = TRUE;
10278
10279 printf (ngettext ("\nVersion definition section '%s' "
10280 "contains %u entry:\n",
10281 "\nVersion definition section '%s' "
10282 "contains %u entries:\n",
10283 section->sh_info),
10284 printable_section_name (filedata, section),
10285 section->sh_info);
10286
10287 printf (_(" Addr: 0x"));
10288 printf_vma (section->sh_addr);
10289 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
10290 (unsigned long) section->sh_offset, section->sh_link,
10291 printable_section_name_from_index (filedata, section->sh_link));
10292
10293 edefs = (Elf_External_Verdef *)
10294 get_data (NULL, filedata, section->sh_offset, 1,section->sh_size,
10295 _("version definition section"));
10296 if (!edefs)
10297 break;
10298 endbuf = (char *) edefs + section->sh_size;
10299
10300 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10301 {
10302 char * vstart;
10303 Elf_External_Verdef * edef;
10304 Elf_Internal_Verdef ent;
10305 Elf_External_Verdaux * eaux;
10306 Elf_Internal_Verdaux aux;
10307 unsigned long isum;
10308 int j;
10309
10310 vstart = ((char *) edefs) + idx;
10311 if (vstart + sizeof (*edef) > endbuf)
10312 break;
10313
10314 edef = (Elf_External_Verdef *) vstart;
10315
10316 ent.vd_version = BYTE_GET (edef->vd_version);
10317 ent.vd_flags = BYTE_GET (edef->vd_flags);
10318 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
10319 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
10320 ent.vd_hash = BYTE_GET (edef->vd_hash);
10321 ent.vd_aux = BYTE_GET (edef->vd_aux);
10322 ent.vd_next = BYTE_GET (edef->vd_next);
10323
10324 printf (_(" %#06lx: Rev: %d Flags: %s"),
10325 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
10326
10327 printf (_(" Index: %d Cnt: %d "),
10328 ent.vd_ndx, ent.vd_cnt);
10329
10330 /* Check for overflow. */
10331 if (ent.vd_aux > (size_t) (endbuf - vstart))
10332 break;
10333
10334 vstart += ent.vd_aux;
10335
10336 if (vstart + sizeof (*eaux) > endbuf)
10337 break;
10338 eaux = (Elf_External_Verdaux *) vstart;
10339
10340 aux.vda_name = BYTE_GET (eaux->vda_name);
10341 aux.vda_next = BYTE_GET (eaux->vda_next);
10342
10343 if (VALID_DYNAMIC_NAME (aux.vda_name))
10344 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
10345 else
10346 printf (_("Name index: %ld\n"), aux.vda_name);
10347
10348 isum = idx + ent.vd_aux;
10349
10350 for (j = 1; j < ent.vd_cnt; j++)
10351 {
10352 if (aux.vda_next < sizeof (*eaux)
10353 && !(j == ent.vd_cnt - 1 && aux.vda_next == 0))
10354 {
10355 warn (_("Invalid vda_next field of %lx\n"),
10356 aux.vda_next);
10357 j = ent.vd_cnt;
10358 break;
10359 }
10360 /* Check for overflow. */
10361 if (aux.vda_next > (size_t) (endbuf - vstart))
10362 break;
10363
10364 isum += aux.vda_next;
10365 vstart += aux.vda_next;
10366
10367 if (vstart + sizeof (*eaux) > endbuf)
10368 break;
10369 eaux = (Elf_External_Verdaux *) vstart;
10370
10371 aux.vda_name = BYTE_GET (eaux->vda_name);
10372 aux.vda_next = BYTE_GET (eaux->vda_next);
10373
10374 if (VALID_DYNAMIC_NAME (aux.vda_name))
10375 printf (_(" %#06lx: Parent %d: %s\n"),
10376 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
10377 else
10378 printf (_(" %#06lx: Parent %d, name index: %ld\n"),
10379 isum, j, aux.vda_name);
10380 }
10381
10382 if (j < ent.vd_cnt)
10383 printf (_(" Version def aux past end of section\n"));
10384
10385 /* PR 17531:
10386 file: id:000001,src:000172+005151,op:splice,rep:2. */
10387 if (ent.vd_next < sizeof (*edef)
10388 && !(cnt == section->sh_info - 1 && ent.vd_next == 0))
10389 {
10390 warn (_("Invalid vd_next field of %lx\n"), ent.vd_next);
10391 cnt = section->sh_info;
10392 break;
10393 }
10394 if (ent.vd_next > (size_t) (endbuf - ((char *) edefs + idx)))
10395 break;
10396
10397 idx += ent.vd_next;
10398 }
10399
10400 if (cnt < section->sh_info)
10401 printf (_(" Version definition past end of section\n"));
10402
10403 free (edefs);
10404 }
10405 break;
10406
10407 case SHT_GNU_verneed:
10408 {
10409 Elf_External_Verneed * eneed;
10410 unsigned long idx;
10411 unsigned long cnt;
10412 char * endbuf;
10413
10414 found = TRUE;
10415
10416 printf (ngettext ("\nVersion needs section '%s' "
10417 "contains %u entry:\n",
10418 "\nVersion needs section '%s' "
10419 "contains %u entries:\n",
10420 section->sh_info),
10421 printable_section_name (filedata, section), section->sh_info);
10422
10423 printf (_(" Addr: 0x"));
10424 printf_vma (section->sh_addr);
10425 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
10426 (unsigned long) section->sh_offset, section->sh_link,
10427 printable_section_name_from_index (filedata, section->sh_link));
10428
10429 eneed = (Elf_External_Verneed *) get_data (NULL, filedata,
10430 section->sh_offset, 1,
10431 section->sh_size,
10432 _("Version Needs section"));
10433 if (!eneed)
10434 break;
10435 endbuf = (char *) eneed + section->sh_size;
10436
10437 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10438 {
10439 Elf_External_Verneed * entry;
10440 Elf_Internal_Verneed ent;
10441 unsigned long isum;
10442 int j;
10443 char * vstart;
10444
10445 vstart = ((char *) eneed) + idx;
10446 if (vstart + sizeof (*entry) > endbuf)
10447 break;
10448
10449 entry = (Elf_External_Verneed *) vstart;
10450
10451 ent.vn_version = BYTE_GET (entry->vn_version);
10452 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
10453 ent.vn_file = BYTE_GET (entry->vn_file);
10454 ent.vn_aux = BYTE_GET (entry->vn_aux);
10455 ent.vn_next = BYTE_GET (entry->vn_next);
10456
10457 printf (_(" %#06lx: Version: %d"), idx, ent.vn_version);
10458
10459 if (VALID_DYNAMIC_NAME (ent.vn_file))
10460 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
10461 else
10462 printf (_(" File: %lx"), ent.vn_file);
10463
10464 printf (_(" Cnt: %d\n"), ent.vn_cnt);
10465
10466 /* Check for overflow. */
10467 if (ent.vn_aux > (size_t) (endbuf - vstart))
10468 break;
10469 vstart += ent.vn_aux;
10470
10471 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
10472 {
10473 Elf_External_Vernaux * eaux;
10474 Elf_Internal_Vernaux aux;
10475
10476 if (vstart + sizeof (*eaux) > endbuf)
10477 break;
10478 eaux = (Elf_External_Vernaux *) vstart;
10479
10480 aux.vna_hash = BYTE_GET (eaux->vna_hash);
10481 aux.vna_flags = BYTE_GET (eaux->vna_flags);
10482 aux.vna_other = BYTE_GET (eaux->vna_other);
10483 aux.vna_name = BYTE_GET (eaux->vna_name);
10484 aux.vna_next = BYTE_GET (eaux->vna_next);
10485
10486 if (VALID_DYNAMIC_NAME (aux.vna_name))
10487 printf (_(" %#06lx: Name: %s"),
10488 isum, GET_DYNAMIC_NAME (aux.vna_name));
10489 else
10490 printf (_(" %#06lx: Name index: %lx"),
10491 isum, aux.vna_name);
10492
10493 printf (_(" Flags: %s Version: %d\n"),
10494 get_ver_flags (aux.vna_flags), aux.vna_other);
10495
10496 if (aux.vna_next < sizeof (*eaux)
10497 && !(j == ent.vn_cnt - 1 && aux.vna_next == 0))
10498 {
10499 warn (_("Invalid vna_next field of %lx\n"),
10500 aux.vna_next);
10501 j = ent.vn_cnt;
10502 break;
10503 }
10504 /* Check for overflow. */
10505 if (aux.vna_next > (size_t) (endbuf - vstart))
10506 break;
10507 isum += aux.vna_next;
10508 vstart += aux.vna_next;
10509 }
10510
10511 if (j < ent.vn_cnt)
10512 warn (_("Missing Version Needs auxillary information\n"));
10513
10514 if (ent.vn_next < sizeof (*entry)
10515 && !(cnt == section->sh_info - 1 && ent.vn_next == 0))
10516 {
10517 warn (_("Invalid vn_next field of %lx\n"), ent.vn_next);
10518 cnt = section->sh_info;
10519 break;
10520 }
10521 if (ent.vn_next > (size_t) (endbuf - ((char *) eneed + idx)))
10522 break;
10523 idx += ent.vn_next;
10524 }
10525
10526 if (cnt < section->sh_info)
10527 warn (_("Missing Version Needs information\n"));
10528
10529 free (eneed);
10530 }
10531 break;
10532
10533 case SHT_GNU_versym:
10534 {
10535 Elf_Internal_Shdr * link_section;
10536 size_t total;
10537 unsigned int cnt;
10538 unsigned char * edata;
10539 unsigned short * data;
10540 char * strtab;
10541 Elf_Internal_Sym * symbols;
10542 Elf_Internal_Shdr * string_sec;
10543 unsigned long num_syms;
10544 long off;
10545
10546 if (section->sh_link >= filedata->file_header.e_shnum)
10547 break;
10548
10549 link_section = filedata->section_headers + section->sh_link;
10550 total = section->sh_size / sizeof (Elf_External_Versym);
10551
10552 if (link_section->sh_link >= filedata->file_header.e_shnum)
10553 break;
10554
10555 found = TRUE;
10556
10557 symbols = GET_ELF_SYMBOLS (filedata, link_section, & num_syms);
10558 if (symbols == NULL)
10559 break;
10560
10561 string_sec = filedata->section_headers + link_section->sh_link;
10562
10563 strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
10564 string_sec->sh_size,
10565 _("version string table"));
10566 if (!strtab)
10567 {
10568 free (symbols);
10569 break;
10570 }
10571
10572 printf (ngettext ("\nVersion symbols section '%s' "
10573 "contains %lu entry:\n",
10574 "\nVersion symbols section '%s' "
10575 "contains %lu entries:\n",
10576 total),
10577 printable_section_name (filedata, section), (unsigned long) total);
10578
10579 printf (_(" Addr: "));
10580 printf_vma (section->sh_addr);
10581 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
10582 (unsigned long) section->sh_offset, section->sh_link,
10583 printable_section_name (filedata, link_section));
10584
10585 off = offset_from_vma (filedata,
10586 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10587 total * sizeof (short));
10588 edata = (unsigned char *) get_data (NULL, filedata, off, total,
10589 sizeof (short),
10590 _("version symbol data"));
10591 if (!edata)
10592 {
10593 free (strtab);
10594 free (symbols);
10595 break;
10596 }
10597
10598 data = (short unsigned int *) cmalloc (total, sizeof (short));
10599
10600 for (cnt = total; cnt --;)
10601 data[cnt] = byte_get (edata + cnt * sizeof (short),
10602 sizeof (short));
10603
10604 free (edata);
10605
10606 for (cnt = 0; cnt < total; cnt += 4)
10607 {
10608 int j, nn;
10609 char *name;
10610 char *invalid = _("*invalid*");
10611
10612 printf (" %03x:", cnt);
10613
10614 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
10615 switch (data[cnt + j])
10616 {
10617 case 0:
10618 fputs (_(" 0 (*local*) "), stdout);
10619 break;
10620
10621 case 1:
10622 fputs (_(" 1 (*global*) "), stdout);
10623 break;
10624
10625 default:
10626 nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
10627 data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
10628
10629 /* If this index value is greater than the size of the symbols
10630 array, break to avoid an out-of-bounds read. */
10631 if ((unsigned long)(cnt + j) >= num_syms)
10632 {
10633 warn (_("invalid index into symbol array\n"));
10634 break;
10635 }
10636
10637 name = NULL;
10638 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10639 {
10640 Elf_Internal_Verneed ivn;
10641 unsigned long offset;
10642
10643 offset = offset_from_vma
10644 (filedata, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10645 sizeof (Elf_External_Verneed));
10646
10647 do
10648 {
10649 Elf_Internal_Vernaux ivna;
10650 Elf_External_Verneed evn;
10651 Elf_External_Vernaux evna;
10652 unsigned long a_off;
10653
10654 if (get_data (&evn, filedata, offset, sizeof (evn), 1,
10655 _("version need")) == NULL)
10656 break;
10657
10658 ivn.vn_aux = BYTE_GET (evn.vn_aux);
10659 ivn.vn_next = BYTE_GET (evn.vn_next);
10660
10661 a_off = offset + ivn.vn_aux;
10662
10663 do
10664 {
10665 if (get_data (&evna, filedata, a_off, sizeof (evna),
10666 1, _("version need aux (2)")) == NULL)
10667 {
10668 ivna.vna_next = 0;
10669 ivna.vna_other = 0;
10670 }
10671 else
10672 {
10673 ivna.vna_next = BYTE_GET (evna.vna_next);
10674 ivna.vna_other = BYTE_GET (evna.vna_other);
10675 }
10676
10677 a_off += ivna.vna_next;
10678 }
10679 while (ivna.vna_other != data[cnt + j]
10680 && ivna.vna_next != 0);
10681
10682 if (ivna.vna_other == data[cnt + j])
10683 {
10684 ivna.vna_name = BYTE_GET (evna.vna_name);
10685
10686 if (ivna.vna_name >= string_sec->sh_size)
10687 name = invalid;
10688 else
10689 name = strtab + ivna.vna_name;
10690 break;
10691 }
10692
10693 offset += ivn.vn_next;
10694 }
10695 while (ivn.vn_next);
10696 }
10697
10698 if (data[cnt + j] != 0x8001
10699 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10700 {
10701 Elf_Internal_Verdef ivd;
10702 Elf_External_Verdef evd;
10703 unsigned long offset;
10704
10705 offset = offset_from_vma
10706 (filedata, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10707 sizeof evd);
10708
10709 do
10710 {
10711 if (get_data (&evd, filedata, offset, sizeof (evd), 1,
10712 _("version def")) == NULL)
10713 {
10714 ivd.vd_next = 0;
10715 /* PR 17531: file: 046-1082287-0.004. */
10716 ivd.vd_ndx = (data[cnt + j] & VERSYM_VERSION) + 1;
10717 break;
10718 }
10719 else
10720 {
10721 ivd.vd_next = BYTE_GET (evd.vd_next);
10722 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10723 }
10724
10725 offset += ivd.vd_next;
10726 }
10727 while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
10728 && ivd.vd_next != 0);
10729
10730 if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
10731 {
10732 Elf_External_Verdaux evda;
10733 Elf_Internal_Verdaux ivda;
10734
10735 ivd.vd_aux = BYTE_GET (evd.vd_aux);
10736
10737 if (get_data (&evda, filedata,
10738 offset - ivd.vd_next + ivd.vd_aux,
10739 sizeof (evda), 1,
10740 _("version def aux")) == NULL)
10741 break;
10742
10743 ivda.vda_name = BYTE_GET (evda.vda_name);
10744
10745 if (ivda.vda_name >= string_sec->sh_size)
10746 name = invalid;
10747 else if (name != NULL && name != invalid)
10748 name = _("*both*");
10749 else
10750 name = strtab + ivda.vda_name;
10751 }
10752 }
10753 if (name != NULL)
10754 nn += printf ("(%s%-*s",
10755 name,
10756 12 - (int) strlen (name),
10757 ")");
10758
10759 if (nn < 18)
10760 printf ("%*c", 18 - nn, ' ');
10761 }
10762
10763 putchar ('\n');
10764 }
10765
10766 free (data);
10767 free (strtab);
10768 free (symbols);
10769 }
10770 break;
10771
10772 default:
10773 break;
10774 }
10775 }
10776
10777 if (! found)
10778 printf (_("\nNo version information found in this file.\n"));
10779
10780 return TRUE;
10781 }
10782
10783 static const char *
10784 get_symbol_binding (Filedata * filedata, unsigned int binding)
10785 {
10786 static char buff[32];
10787
10788 switch (binding)
10789 {
10790 case STB_LOCAL: return "LOCAL";
10791 case STB_GLOBAL: return "GLOBAL";
10792 case STB_WEAK: return "WEAK";
10793 default:
10794 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
10795 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
10796 binding);
10797 else if (binding >= STB_LOOS && binding <= STB_HIOS)
10798 {
10799 if (binding == STB_GNU_UNIQUE
10800 && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10801 /* GNU is still using the default value 0. */
10802 || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10803 return "UNIQUE";
10804 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
10805 }
10806 else
10807 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
10808 return buff;
10809 }
10810 }
10811
10812 static const char *
10813 get_symbol_type (Filedata * filedata, unsigned int type)
10814 {
10815 static char buff[32];
10816
10817 switch (type)
10818 {
10819 case STT_NOTYPE: return "NOTYPE";
10820 case STT_OBJECT: return "OBJECT";
10821 case STT_FUNC: return "FUNC";
10822 case STT_SECTION: return "SECTION";
10823 case STT_FILE: return "FILE";
10824 case STT_COMMON: return "COMMON";
10825 case STT_TLS: return "TLS";
10826 case STT_RELC: return "RELC";
10827 case STT_SRELC: return "SRELC";
10828 default:
10829 if (type >= STT_LOPROC && type <= STT_HIPROC)
10830 {
10831 if (filedata->file_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
10832 return "THUMB_FUNC";
10833
10834 if (filedata->file_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
10835 return "REGISTER";
10836
10837 if (filedata->file_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
10838 return "PARISC_MILLI";
10839
10840 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
10841 }
10842 else if (type >= STT_LOOS && type <= STT_HIOS)
10843 {
10844 if (filedata->file_header.e_machine == EM_PARISC)
10845 {
10846 if (type == STT_HP_OPAQUE)
10847 return "HP_OPAQUE";
10848 if (type == STT_HP_STUB)
10849 return "HP_STUB";
10850 }
10851
10852 if (type == STT_GNU_IFUNC
10853 && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10854 || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
10855 /* GNU is still using the default value 0. */
10856 || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10857 return "IFUNC";
10858
10859 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
10860 }
10861 else
10862 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
10863 return buff;
10864 }
10865 }
10866
10867 static const char *
10868 get_symbol_visibility (unsigned int visibility)
10869 {
10870 switch (visibility)
10871 {
10872 case STV_DEFAULT: return "DEFAULT";
10873 case STV_INTERNAL: return "INTERNAL";
10874 case STV_HIDDEN: return "HIDDEN";
10875 case STV_PROTECTED: return "PROTECTED";
10876 default:
10877 error (_("Unrecognized visibility value: %u"), visibility);
10878 return _("<unknown>");
10879 }
10880 }
10881
10882 static const char *
10883 get_solaris_symbol_visibility (unsigned int visibility)
10884 {
10885 switch (visibility)
10886 {
10887 case 4: return "EXPORTED";
10888 case 5: return "SINGLETON";
10889 case 6: return "ELIMINATE";
10890 default: return get_symbol_visibility (visibility);
10891 }
10892 }
10893
10894 static const char *
10895 get_mips_symbol_other (unsigned int other)
10896 {
10897 switch (other)
10898 {
10899 case STO_OPTIONAL: return "OPTIONAL";
10900 case STO_MIPS_PLT: return "MIPS PLT";
10901 case STO_MIPS_PIC: return "MIPS PIC";
10902 case STO_MICROMIPS: return "MICROMIPS";
10903 case STO_MICROMIPS | STO_MIPS_PIC: return "MICROMIPS, MIPS PIC";
10904 case STO_MIPS16: return "MIPS16";
10905 default: return NULL;
10906 }
10907 }
10908
10909 static const char *
10910 get_ia64_symbol_other (Filedata * filedata, unsigned int other)
10911 {
10912 if (is_ia64_vms (filedata))
10913 {
10914 static char res[32];
10915
10916 res[0] = 0;
10917
10918 /* Function types is for images and .STB files only. */
10919 switch (filedata->file_header.e_type)
10920 {
10921 case ET_DYN:
10922 case ET_EXEC:
10923 switch (VMS_ST_FUNC_TYPE (other))
10924 {
10925 case VMS_SFT_CODE_ADDR:
10926 strcat (res, " CA");
10927 break;
10928 case VMS_SFT_SYMV_IDX:
10929 strcat (res, " VEC");
10930 break;
10931 case VMS_SFT_FD:
10932 strcat (res, " FD");
10933 break;
10934 case VMS_SFT_RESERVE:
10935 strcat (res, " RSV");
10936 break;
10937 default:
10938 warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
10939 VMS_ST_FUNC_TYPE (other));
10940 strcat (res, " <unknown>");
10941 break;
10942 }
10943 break;
10944 default:
10945 break;
10946 }
10947 switch (VMS_ST_LINKAGE (other))
10948 {
10949 case VMS_STL_IGNORE:
10950 strcat (res, " IGN");
10951 break;
10952 case VMS_STL_RESERVE:
10953 strcat (res, " RSV");
10954 break;
10955 case VMS_STL_STD:
10956 strcat (res, " STD");
10957 break;
10958 case VMS_STL_LNK:
10959 strcat (res, " LNK");
10960 break;
10961 default:
10962 warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
10963 VMS_ST_LINKAGE (other));
10964 strcat (res, " <unknown>");
10965 break;
10966 }
10967
10968 if (res[0] != 0)
10969 return res + 1;
10970 else
10971 return res;
10972 }
10973 return NULL;
10974 }
10975
10976 static const char *
10977 get_ppc64_symbol_other (unsigned int other)
10978 {
10979 if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
10980 {
10981 static char buf[32];
10982 snprintf (buf, sizeof buf, _("<localentry>: %d"),
10983 PPC64_LOCAL_ENTRY_OFFSET (other));
10984 return buf;
10985 }
10986 return NULL;
10987 }
10988
10989 static const char *
10990 get_symbol_other (Filedata * filedata, unsigned int other)
10991 {
10992 const char * result = NULL;
10993 static char buff [32];
10994
10995 if (other == 0)
10996 return "";
10997
10998 switch (filedata->file_header.e_machine)
10999 {
11000 case EM_MIPS:
11001 result = get_mips_symbol_other (other);
11002 break;
11003 case EM_IA_64:
11004 result = get_ia64_symbol_other (filedata, other);
11005 break;
11006 case EM_PPC64:
11007 result = get_ppc64_symbol_other (other);
11008 break;
11009 default:
11010 result = NULL;
11011 break;
11012 }
11013
11014 if (result)
11015 return result;
11016
11017 snprintf (buff, sizeof buff, _("<other>: %x"), other);
11018 return buff;
11019 }
11020
11021 static const char *
11022 get_symbol_index_type (Filedata * filedata, unsigned int type)
11023 {
11024 static char buff[32];
11025
11026 switch (type)
11027 {
11028 case SHN_UNDEF: return "UND";
11029 case SHN_ABS: return "ABS";
11030 case SHN_COMMON: return "COM";
11031 default:
11032 if (type == SHN_IA_64_ANSI_COMMON
11033 && filedata->file_header.e_machine == EM_IA_64
11034 && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
11035 return "ANSI_COM";
11036 else if ((filedata->file_header.e_machine == EM_X86_64
11037 || filedata->file_header.e_machine == EM_L1OM
11038 || filedata->file_header.e_machine == EM_K1OM)
11039 && type == SHN_X86_64_LCOMMON)
11040 return "LARGE_COM";
11041 else if ((type == SHN_MIPS_SCOMMON
11042 && filedata->file_header.e_machine == EM_MIPS)
11043 || (type == SHN_TIC6X_SCOMMON
11044 && filedata->file_header.e_machine == EM_TI_C6000))
11045 return "SCOM";
11046 else if (type == SHN_MIPS_SUNDEFINED
11047 && filedata->file_header.e_machine == EM_MIPS)
11048 return "SUND";
11049 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
11050 sprintf (buff, "PRC[0x%04x]", type & 0xffff);
11051 else if (type >= SHN_LOOS && type <= SHN_HIOS)
11052 sprintf (buff, "OS [0x%04x]", type & 0xffff);
11053 else if (type >= SHN_LORESERVE)
11054 sprintf (buff, "RSV[0x%04x]", type & 0xffff);
11055 else if (type >= filedata->file_header.e_shnum)
11056 sprintf (buff, _("bad section index[%3d]"), type);
11057 else
11058 sprintf (buff, "%3d", type);
11059 break;
11060 }
11061
11062 return buff;
11063 }
11064
11065 static bfd_vma *
11066 get_dynamic_data (Filedata * filedata, bfd_size_type number, unsigned int ent_size)
11067 {
11068 unsigned char * e_data;
11069 bfd_vma * i_data;
11070
11071 /* If the size_t type is smaller than the bfd_size_type, eg because
11072 you are building a 32-bit tool on a 64-bit host, then make sure
11073 that when (number) is cast to (size_t) no information is lost. */
11074 if (sizeof (size_t) < sizeof (bfd_size_type)
11075 && (bfd_size_type) ((size_t) number) != number)
11076 {
11077 error (_("Size truncation prevents reading %s elements of size %u\n"),
11078 bfd_vmatoa ("u", number), ent_size);
11079 return NULL;
11080 }
11081
11082 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
11083 attempting to allocate memory when the read is bound to fail. */
11084 if (ent_size * number > filedata->file_size)
11085 {
11086 error (_("Invalid number of dynamic entries: %s\n"),
11087 bfd_vmatoa ("u", number));
11088 return NULL;
11089 }
11090
11091 e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
11092 if (e_data == NULL)
11093 {
11094 error (_("Out of memory reading %s dynamic entries\n"),
11095 bfd_vmatoa ("u", number));
11096 return NULL;
11097 }
11098
11099 if (fread (e_data, ent_size, (size_t) number, filedata->handle) != number)
11100 {
11101 error (_("Unable to read in %s bytes of dynamic data\n"),
11102 bfd_vmatoa ("u", number * ent_size));
11103 free (e_data);
11104 return NULL;
11105 }
11106
11107 i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
11108 if (i_data == NULL)
11109 {
11110 error (_("Out of memory allocating space for %s dynamic entries\n"),
11111 bfd_vmatoa ("u", number));
11112 free (e_data);
11113 return NULL;
11114 }
11115
11116 while (number--)
11117 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
11118
11119 free (e_data);
11120
11121 return i_data;
11122 }
11123
11124 static void
11125 print_dynamic_symbol (Filedata * filedata, bfd_vma si, unsigned long hn)
11126 {
11127 Elf_Internal_Sym * psym;
11128 int n;
11129
11130 n = print_vma (si, DEC_5);
11131 if (n < 5)
11132 fputs (&" "[n], stdout);
11133 printf (" %3lu: ", hn);
11134
11135 if (dynamic_symbols == NULL || si >= num_dynamic_syms)
11136 {
11137 printf (_("<No info available for dynamic symbol number %lu>\n"),
11138 (unsigned long) si);
11139 return;
11140 }
11141
11142 psym = dynamic_symbols + si;
11143 print_vma (psym->st_value, LONG_HEX);
11144 putchar (' ');
11145 print_vma (psym->st_size, DEC_5);
11146
11147 printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
11148 printf (" %-6s", get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
11149
11150 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11151 printf (" %-7s", get_solaris_symbol_visibility (psym->st_other));
11152 else
11153 {
11154 unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11155
11156 printf (" %-7s", get_symbol_visibility (vis));
11157 /* Check to see if any other bits in the st_other field are set.
11158 Note - displaying this information disrupts the layout of the
11159 table being generated, but for the moment this case is very
11160 rare. */
11161 if (psym->st_other ^ vis)
11162 printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
11163 }
11164
11165 printf (" %3.3s ", get_symbol_index_type (filedata, psym->st_shndx));
11166 if (VALID_DYNAMIC_NAME (psym->st_name))
11167 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
11168 else
11169 printf (_(" <corrupt: %14ld>"), psym->st_name);
11170 putchar ('\n');
11171 }
11172
11173 static const char *
11174 get_symbol_version_string (Filedata * filedata,
11175 bfd_boolean is_dynsym,
11176 const char * strtab,
11177 unsigned long int strtab_size,
11178 unsigned int si,
11179 Elf_Internal_Sym * psym,
11180 enum versioned_symbol_info * sym_info,
11181 unsigned short * vna_other)
11182 {
11183 unsigned char data[2];
11184 unsigned short vers_data;
11185 unsigned long offset;
11186
11187 if (!is_dynsym
11188 || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
11189 return NULL;
11190
11191 offset = offset_from_vma (filedata, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
11192 sizeof data + si * sizeof (vers_data));
11193
11194 if (get_data (&data, filedata, offset + si * sizeof (vers_data),
11195 sizeof (data), 1, _("version data")) == NULL)
11196 return NULL;
11197
11198 vers_data = byte_get (data, 2);
11199
11200 if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data <= 1)
11201 return NULL;
11202
11203 /* Usually we'd only see verdef for defined symbols, and verneed for
11204 undefined symbols. However, symbols defined by the linker in
11205 .dynbss for variables copied from a shared library in order to
11206 avoid text relocations are defined yet have verneed. We could
11207 use a heuristic to detect the special case, for example, check
11208 for verneed first on symbols defined in SHT_NOBITS sections, but
11209 it is simpler and more reliable to just look for both verdef and
11210 verneed. .dynbss might not be mapped to a SHT_NOBITS section. */
11211
11212 if (psym->st_shndx != SHN_UNDEF
11213 && vers_data != 0x8001
11214 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
11215 {
11216 Elf_Internal_Verdef ivd;
11217 Elf_Internal_Verdaux ivda;
11218 Elf_External_Verdaux evda;
11219 unsigned long off;
11220
11221 off = offset_from_vma (filedata,
11222 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
11223 sizeof (Elf_External_Verdef));
11224
11225 do
11226 {
11227 Elf_External_Verdef evd;
11228
11229 if (get_data (&evd, filedata, off, sizeof (evd), 1,
11230 _("version def")) == NULL)
11231 {
11232 ivd.vd_ndx = 0;
11233 ivd.vd_aux = 0;
11234 ivd.vd_next = 0;
11235 }
11236 else
11237 {
11238 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
11239 ivd.vd_aux = BYTE_GET (evd.vd_aux);
11240 ivd.vd_next = BYTE_GET (evd.vd_next);
11241 }
11242
11243 off += ivd.vd_next;
11244 }
11245 while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
11246
11247 if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
11248 {
11249 off -= ivd.vd_next;
11250 off += ivd.vd_aux;
11251
11252 if (get_data (&evda, filedata, off, sizeof (evda), 1,
11253 _("version def aux")) != NULL)
11254 {
11255 ivda.vda_name = BYTE_GET (evda.vda_name);
11256
11257 if (psym->st_name != ivda.vda_name)
11258 {
11259 *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
11260 ? symbol_hidden : symbol_public);
11261 return (ivda.vda_name < strtab_size
11262 ? strtab + ivda.vda_name : _("<corrupt>"));
11263 }
11264 }
11265 }
11266 }
11267
11268 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
11269 {
11270 Elf_External_Verneed evn;
11271 Elf_Internal_Verneed ivn;
11272 Elf_Internal_Vernaux ivna;
11273
11274 offset = offset_from_vma (filedata,
11275 version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
11276 sizeof evn);
11277 do
11278 {
11279 unsigned long vna_off;
11280
11281 if (get_data (&evn, filedata, offset, sizeof (evn), 1,
11282 _("version need")) == NULL)
11283 {
11284 ivna.vna_next = 0;
11285 ivna.vna_other = 0;
11286 ivna.vna_name = 0;
11287 break;
11288 }
11289
11290 ivn.vn_aux = BYTE_GET (evn.vn_aux);
11291 ivn.vn_next = BYTE_GET (evn.vn_next);
11292
11293 vna_off = offset + ivn.vn_aux;
11294
11295 do
11296 {
11297 Elf_External_Vernaux evna;
11298
11299 if (get_data (&evna, filedata, vna_off, sizeof (evna), 1,
11300 _("version need aux (3)")) == NULL)
11301 {
11302 ivna.vna_next = 0;
11303 ivna.vna_other = 0;
11304 ivna.vna_name = 0;
11305 }
11306 else
11307 {
11308 ivna.vna_other = BYTE_GET (evna.vna_other);
11309 ivna.vna_next = BYTE_GET (evna.vna_next);
11310 ivna.vna_name = BYTE_GET (evna.vna_name);
11311 }
11312
11313 vna_off += ivna.vna_next;
11314 }
11315 while (ivna.vna_other != vers_data && ivna.vna_next != 0);
11316
11317 if (ivna.vna_other == vers_data)
11318 break;
11319
11320 offset += ivn.vn_next;
11321 }
11322 while (ivn.vn_next != 0);
11323
11324 if (ivna.vna_other == vers_data)
11325 {
11326 *sym_info = symbol_undefined;
11327 *vna_other = ivna.vna_other;
11328 return (ivna.vna_name < strtab_size
11329 ? strtab + ivna.vna_name : _("<corrupt>"));
11330 }
11331 }
11332 return NULL;
11333 }
11334
11335 /* Dump the symbol table. */
11336 static bfd_boolean
11337 process_symbol_table (Filedata * filedata)
11338 {
11339 Elf_Internal_Shdr * section;
11340 bfd_size_type nbuckets = 0;
11341 bfd_size_type nchains = 0;
11342 bfd_vma * buckets = NULL;
11343 bfd_vma * chains = NULL;
11344 bfd_vma ngnubuckets = 0;
11345 bfd_vma * gnubuckets = NULL;
11346 bfd_vma * gnuchains = NULL;
11347 bfd_vma gnusymidx = 0;
11348 bfd_size_type ngnuchains = 0;
11349
11350 if (!do_syms && !do_dyn_syms && !do_histogram)
11351 return TRUE;
11352
11353 if (dynamic_info[DT_HASH]
11354 && (do_histogram
11355 || (do_using_dynamic
11356 && !do_dyn_syms
11357 && dynamic_strings != NULL)))
11358 {
11359 unsigned char nb[8];
11360 unsigned char nc[8];
11361 unsigned int hash_ent_size = 4;
11362
11363 if ((filedata->file_header.e_machine == EM_ALPHA
11364 || filedata->file_header.e_machine == EM_S390
11365 || filedata->file_header.e_machine == EM_S390_OLD)
11366 && filedata->file_header.e_ident[EI_CLASS] == ELFCLASS64)
11367 hash_ent_size = 8;
11368
11369 if (fseek (filedata->handle,
11370 (archive_file_offset
11371 + offset_from_vma (filedata, dynamic_info[DT_HASH],
11372 sizeof nb + sizeof nc)),
11373 SEEK_SET))
11374 {
11375 error (_("Unable to seek to start of dynamic information\n"));
11376 goto no_hash;
11377 }
11378
11379 if (fread (nb, hash_ent_size, 1, filedata->handle) != 1)
11380 {
11381 error (_("Failed to read in number of buckets\n"));
11382 goto no_hash;
11383 }
11384
11385 if (fread (nc, hash_ent_size, 1, filedata->handle) != 1)
11386 {
11387 error (_("Failed to read in number of chains\n"));
11388 goto no_hash;
11389 }
11390
11391 nbuckets = byte_get (nb, hash_ent_size);
11392 nchains = byte_get (nc, hash_ent_size);
11393
11394 buckets = get_dynamic_data (filedata, nbuckets, hash_ent_size);
11395 chains = get_dynamic_data (filedata, nchains, hash_ent_size);
11396
11397 no_hash:
11398 if (buckets == NULL || chains == NULL)
11399 {
11400 if (do_using_dynamic)
11401 return FALSE;
11402 free (buckets);
11403 free (chains);
11404 buckets = NULL;
11405 chains = NULL;
11406 nbuckets = 0;
11407 nchains = 0;
11408 }
11409 }
11410
11411 if (dynamic_info_DT_GNU_HASH
11412 && (do_histogram
11413 || (do_using_dynamic
11414 && !do_dyn_syms
11415 && dynamic_strings != NULL)))
11416 {
11417 unsigned char nb[16];
11418 bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
11419 bfd_vma buckets_vma;
11420
11421 if (fseek (filedata->handle,
11422 (archive_file_offset
11423 + offset_from_vma (filedata, dynamic_info_DT_GNU_HASH,
11424 sizeof nb)),
11425 SEEK_SET))
11426 {
11427 error (_("Unable to seek to start of dynamic information\n"));
11428 goto no_gnu_hash;
11429 }
11430
11431 if (fread (nb, 16, 1, filedata->handle) != 1)
11432 {
11433 error (_("Failed to read in number of buckets\n"));
11434 goto no_gnu_hash;
11435 }
11436
11437 ngnubuckets = byte_get (nb, 4);
11438 gnusymidx = byte_get (nb + 4, 4);
11439 bitmaskwords = byte_get (nb + 8, 4);
11440 buckets_vma = dynamic_info_DT_GNU_HASH + 16;
11441 if (is_32bit_elf)
11442 buckets_vma += bitmaskwords * 4;
11443 else
11444 buckets_vma += bitmaskwords * 8;
11445
11446 if (fseek (filedata->handle,
11447 (archive_file_offset
11448 + offset_from_vma (filedata, buckets_vma, 4)),
11449 SEEK_SET))
11450 {
11451 error (_("Unable to seek to start of dynamic information\n"));
11452 goto no_gnu_hash;
11453 }
11454
11455 gnubuckets = get_dynamic_data (filedata, ngnubuckets, 4);
11456
11457 if (gnubuckets == NULL)
11458 goto no_gnu_hash;
11459
11460 for (i = 0; i < ngnubuckets; i++)
11461 if (gnubuckets[i] != 0)
11462 {
11463 if (gnubuckets[i] < gnusymidx)
11464 return FALSE;
11465
11466 if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
11467 maxchain = gnubuckets[i];
11468 }
11469
11470 if (maxchain == 0xffffffff)
11471 goto no_gnu_hash;
11472
11473 maxchain -= gnusymidx;
11474
11475 if (fseek (filedata->handle,
11476 (archive_file_offset
11477 + offset_from_vma (filedata, buckets_vma
11478 + 4 * (ngnubuckets + maxchain), 4)),
11479 SEEK_SET))
11480 {
11481 error (_("Unable to seek to start of dynamic information\n"));
11482 goto no_gnu_hash;
11483 }
11484
11485 do
11486 {
11487 if (fread (nb, 4, 1, filedata->handle) != 1)
11488 {
11489 error (_("Failed to determine last chain length\n"));
11490 goto no_gnu_hash;
11491 }
11492
11493 if (maxchain + 1 == 0)
11494 goto no_gnu_hash;
11495
11496 ++maxchain;
11497 }
11498 while ((byte_get (nb, 4) & 1) == 0);
11499
11500 if (fseek (filedata->handle,
11501 (archive_file_offset
11502 + offset_from_vma (filedata, buckets_vma + 4 * ngnubuckets, 4)),
11503 SEEK_SET))
11504 {
11505 error (_("Unable to seek to start of dynamic information\n"));
11506 goto no_gnu_hash;
11507 }
11508
11509 gnuchains = get_dynamic_data (filedata, maxchain, 4);
11510 ngnuchains = maxchain;
11511
11512 no_gnu_hash:
11513 if (gnuchains == NULL)
11514 {
11515 free (gnubuckets);
11516 gnubuckets = NULL;
11517 ngnubuckets = 0;
11518 if (do_using_dynamic)
11519 return FALSE;
11520 }
11521 }
11522
11523 if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
11524 && do_syms
11525 && do_using_dynamic
11526 && dynamic_strings != NULL
11527 && dynamic_symbols != NULL)
11528 {
11529 unsigned long hn;
11530
11531 if (dynamic_info[DT_HASH])
11532 {
11533 bfd_vma si;
11534 char *visited;
11535
11536 printf (_("\nSymbol table for image:\n"));
11537 if (is_32bit_elf)
11538 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11539 else
11540 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11541
11542 visited = xcmalloc (nchains, 1);
11543 memset (visited, 0, nchains);
11544 for (hn = 0; hn < nbuckets; hn++)
11545 {
11546 for (si = buckets[hn]; si > 0; si = chains[si])
11547 {
11548 print_dynamic_symbol (filedata, si, hn);
11549 if (si >= nchains || visited[si])
11550 {
11551 error (_("histogram chain is corrupt\n"));
11552 break;
11553 }
11554 visited[si] = 1;
11555 }
11556 }
11557 free (visited);
11558 }
11559
11560 if (dynamic_info_DT_GNU_HASH)
11561 {
11562 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
11563 if (is_32bit_elf)
11564 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11565 else
11566 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11567
11568 for (hn = 0; hn < ngnubuckets; ++hn)
11569 if (gnubuckets[hn] != 0)
11570 {
11571 bfd_vma si = gnubuckets[hn];
11572 bfd_vma off = si - gnusymidx;
11573
11574 do
11575 {
11576 print_dynamic_symbol (filedata, si, hn);
11577 si++;
11578 }
11579 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
11580 }
11581 }
11582 }
11583 else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
11584 && filedata->section_headers != NULL)
11585 {
11586 unsigned int i;
11587
11588 for (i = 0, section = filedata->section_headers;
11589 i < filedata->file_header.e_shnum;
11590 i++, section++)
11591 {
11592 unsigned int si;
11593 char * strtab = NULL;
11594 unsigned long int strtab_size = 0;
11595 Elf_Internal_Sym * symtab;
11596 Elf_Internal_Sym * psym;
11597 unsigned long num_syms;
11598
11599 if ((section->sh_type != SHT_SYMTAB
11600 && section->sh_type != SHT_DYNSYM)
11601 || (!do_syms
11602 && section->sh_type == SHT_SYMTAB))
11603 continue;
11604
11605 if (section->sh_entsize == 0)
11606 {
11607 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
11608 printable_section_name (filedata, section));
11609 continue;
11610 }
11611
11612 num_syms = section->sh_size / section->sh_entsize;
11613 printf (ngettext ("\nSymbol table '%s' contains %lu entry:\n",
11614 "\nSymbol table '%s' contains %lu entries:\n",
11615 num_syms),
11616 printable_section_name (filedata, section),
11617 num_syms);
11618
11619 if (is_32bit_elf)
11620 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
11621 else
11622 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
11623
11624 symtab = GET_ELF_SYMBOLS (filedata, section, & num_syms);
11625 if (symtab == NULL)
11626 continue;
11627
11628 if (section->sh_link == filedata->file_header.e_shstrndx)
11629 {
11630 strtab = filedata->string_table;
11631 strtab_size = filedata->string_table_length;
11632 }
11633 else if (section->sh_link < filedata->file_header.e_shnum)
11634 {
11635 Elf_Internal_Shdr * string_sec;
11636
11637 string_sec = filedata->section_headers + section->sh_link;
11638
11639 strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset,
11640 1, string_sec->sh_size,
11641 _("string table"));
11642 strtab_size = strtab != NULL ? string_sec->sh_size : 0;
11643 }
11644
11645 for (si = 0, psym = symtab; si < num_syms; si++, psym++)
11646 {
11647 const char *version_string;
11648 enum versioned_symbol_info sym_info;
11649 unsigned short vna_other;
11650
11651 printf ("%6d: ", si);
11652 print_vma (psym->st_value, LONG_HEX);
11653 putchar (' ');
11654 print_vma (psym->st_size, DEC_5);
11655 printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
11656 printf (" %-6s", get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
11657 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11658 printf (" %-7s", get_solaris_symbol_visibility (psym->st_other));
11659 else
11660 {
11661 unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11662
11663 printf (" %-7s", get_symbol_visibility (vis));
11664 /* Check to see if any other bits in the st_other field are set.
11665 Note - displaying this information disrupts the layout of the
11666 table being generated, but for the moment this case is very rare. */
11667 if (psym->st_other ^ vis)
11668 printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
11669 }
11670 printf (" %4s ", get_symbol_index_type (filedata, psym->st_shndx));
11671 print_symbol (25, psym->st_name < strtab_size
11672 ? strtab + psym->st_name : _("<corrupt>"));
11673
11674 version_string
11675 = get_symbol_version_string (filedata,
11676 section->sh_type == SHT_DYNSYM,
11677 strtab, strtab_size, si,
11678 psym, &sym_info, &vna_other);
11679 if (version_string)
11680 {
11681 if (sym_info == symbol_undefined)
11682 printf ("@%s (%d)", version_string, vna_other);
11683 else
11684 printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
11685 version_string);
11686 }
11687
11688 putchar ('\n');
11689
11690 if (ELF_ST_BIND (psym->st_info) == STB_LOCAL
11691 && si >= section->sh_info
11692 /* Irix 5 and 6 MIPS binaries are known to ignore this requirement. */
11693 && filedata->file_header.e_machine != EM_MIPS
11694 /* Solaris binaries have been found to violate this requirement as
11695 well. Not sure if this is a bug or an ABI requirement. */
11696 && filedata->file_header.e_ident[EI_OSABI] != ELFOSABI_SOLARIS)
11697 warn (_("local symbol %u found at index >= %s's sh_info value of %u\n"),
11698 si, printable_section_name (filedata, section), section->sh_info);
11699 }
11700
11701 free (symtab);
11702 if (strtab != filedata->string_table)
11703 free (strtab);
11704 }
11705 }
11706 else if (do_syms)
11707 printf
11708 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
11709
11710 if (do_histogram && buckets != NULL)
11711 {
11712 unsigned long * lengths;
11713 unsigned long * counts;
11714 unsigned long hn;
11715 bfd_vma si;
11716 unsigned long maxlength = 0;
11717 unsigned long nzero_counts = 0;
11718 unsigned long nsyms = 0;
11719 char *visited;
11720
11721 printf (ngettext ("\nHistogram for bucket list length "
11722 "(total of %lu bucket):\n",
11723 "\nHistogram for bucket list length "
11724 "(total of %lu buckets):\n",
11725 (unsigned long) nbuckets),
11726 (unsigned long) nbuckets);
11727
11728 lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
11729 if (lengths == NULL)
11730 {
11731 error (_("Out of memory allocating space for histogram buckets\n"));
11732 return FALSE;
11733 }
11734 visited = xcmalloc (nchains, 1);
11735 memset (visited, 0, nchains);
11736
11737 printf (_(" Length Number %% of total Coverage\n"));
11738 for (hn = 0; hn < nbuckets; ++hn)
11739 {
11740 for (si = buckets[hn]; si > 0; si = chains[si])
11741 {
11742 ++nsyms;
11743 if (maxlength < ++lengths[hn])
11744 ++maxlength;
11745 if (si >= nchains || visited[si])
11746 {
11747 error (_("histogram chain is corrupt\n"));
11748 break;
11749 }
11750 visited[si] = 1;
11751 }
11752 }
11753 free (visited);
11754
11755 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11756 if (counts == NULL)
11757 {
11758 free (lengths);
11759 error (_("Out of memory allocating space for histogram counts\n"));
11760 return FALSE;
11761 }
11762
11763 for (hn = 0; hn < nbuckets; ++hn)
11764 ++counts[lengths[hn]];
11765
11766 if (nbuckets > 0)
11767 {
11768 unsigned long i;
11769 printf (" 0 %-10lu (%5.1f%%)\n",
11770 counts[0], (counts[0] * 100.0) / nbuckets);
11771 for (i = 1; i <= maxlength; ++i)
11772 {
11773 nzero_counts += counts[i] * i;
11774 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11775 i, counts[i], (counts[i] * 100.0) / nbuckets,
11776 (nzero_counts * 100.0) / nsyms);
11777 }
11778 }
11779
11780 free (counts);
11781 free (lengths);
11782 }
11783
11784 if (buckets != NULL)
11785 {
11786 free (buckets);
11787 free (chains);
11788 }
11789
11790 if (do_histogram && gnubuckets != NULL)
11791 {
11792 unsigned long * lengths;
11793 unsigned long * counts;
11794 unsigned long hn;
11795 unsigned long maxlength = 0;
11796 unsigned long nzero_counts = 0;
11797 unsigned long nsyms = 0;
11798
11799 printf (ngettext ("\nHistogram for `.gnu.hash' bucket list length "
11800 "(total of %lu bucket):\n",
11801 "\nHistogram for `.gnu.hash' bucket list length "
11802 "(total of %lu buckets):\n",
11803 (unsigned long) ngnubuckets),
11804 (unsigned long) ngnubuckets);
11805
11806 lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
11807 if (lengths == NULL)
11808 {
11809 error (_("Out of memory allocating space for gnu histogram buckets\n"));
11810 return FALSE;
11811 }
11812
11813 printf (_(" Length Number %% of total Coverage\n"));
11814
11815 for (hn = 0; hn < ngnubuckets; ++hn)
11816 if (gnubuckets[hn] != 0)
11817 {
11818 bfd_vma off, length = 1;
11819
11820 for (off = gnubuckets[hn] - gnusymidx;
11821 /* PR 17531 file: 010-77222-0.004. */
11822 off < ngnuchains && (gnuchains[off] & 1) == 0;
11823 ++off)
11824 ++length;
11825 lengths[hn] = length;
11826 if (length > maxlength)
11827 maxlength = length;
11828 nsyms += length;
11829 }
11830
11831 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11832 if (counts == NULL)
11833 {
11834 free (lengths);
11835 error (_("Out of memory allocating space for gnu histogram counts\n"));
11836 return FALSE;
11837 }
11838
11839 for (hn = 0; hn < ngnubuckets; ++hn)
11840 ++counts[lengths[hn]];
11841
11842 if (ngnubuckets > 0)
11843 {
11844 unsigned long j;
11845 printf (" 0 %-10lu (%5.1f%%)\n",
11846 counts[0], (counts[0] * 100.0) / ngnubuckets);
11847 for (j = 1; j <= maxlength; ++j)
11848 {
11849 nzero_counts += counts[j] * j;
11850 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11851 j, counts[j], (counts[j] * 100.0) / ngnubuckets,
11852 (nzero_counts * 100.0) / nsyms);
11853 }
11854 }
11855
11856 free (counts);
11857 free (lengths);
11858 free (gnubuckets);
11859 free (gnuchains);
11860 }
11861
11862 return TRUE;
11863 }
11864
11865 static bfd_boolean
11866 process_syminfo (Filedata * filedata ATTRIBUTE_UNUSED)
11867 {
11868 unsigned int i;
11869
11870 if (dynamic_syminfo == NULL
11871 || !do_dynamic)
11872 /* No syminfo, this is ok. */
11873 return TRUE;
11874
11875 /* There better should be a dynamic symbol section. */
11876 if (dynamic_symbols == NULL || dynamic_strings == NULL)
11877 return FALSE;
11878
11879 if (dynamic_addr)
11880 printf (ngettext ("\nDynamic info segment at offset 0x%lx "
11881 "contains %d entry:\n",
11882 "\nDynamic info segment at offset 0x%lx "
11883 "contains %d entries:\n",
11884 dynamic_syminfo_nent),
11885 dynamic_syminfo_offset, dynamic_syminfo_nent);
11886
11887 printf (_(" Num: Name BoundTo Flags\n"));
11888 for (i = 0; i < dynamic_syminfo_nent; ++i)
11889 {
11890 unsigned short int flags = dynamic_syminfo[i].si_flags;
11891
11892 printf ("%4d: ", i);
11893 if (i >= num_dynamic_syms)
11894 printf (_("<corrupt index>"));
11895 else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
11896 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
11897 else
11898 printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
11899 putchar (' ');
11900
11901 switch (dynamic_syminfo[i].si_boundto)
11902 {
11903 case SYMINFO_BT_SELF:
11904 fputs ("SELF ", stdout);
11905 break;
11906 case SYMINFO_BT_PARENT:
11907 fputs ("PARENT ", stdout);
11908 break;
11909 default:
11910 if (dynamic_syminfo[i].si_boundto > 0
11911 && dynamic_syminfo[i].si_boundto < dynamic_nent
11912 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
11913 {
11914 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
11915 putchar (' ' );
11916 }
11917 else
11918 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
11919 break;
11920 }
11921
11922 if (flags & SYMINFO_FLG_DIRECT)
11923 printf (" DIRECT");
11924 if (flags & SYMINFO_FLG_PASSTHRU)
11925 printf (" PASSTHRU");
11926 if (flags & SYMINFO_FLG_COPY)
11927 printf (" COPY");
11928 if (flags & SYMINFO_FLG_LAZYLOAD)
11929 printf (" LAZYLOAD");
11930
11931 puts ("");
11932 }
11933
11934 return TRUE;
11935 }
11936
11937 #define IN_RANGE(START,END,ADDR,OFF) \
11938 (((ADDR) >= (START)) && ((ADDR) + (OFF) < (END)))
11939
11940 /* Check to see if the given reloc needs to be handled in a target specific
11941 manner. If so then process the reloc and return TRUE otherwise return
11942 FALSE.
11943
11944 If called with reloc == NULL, then this is a signal that reloc processing
11945 for the current section has finished, and any saved state should be
11946 discarded. */
11947
11948 static bfd_boolean
11949 target_specific_reloc_handling (Filedata * filedata,
11950 Elf_Internal_Rela * reloc,
11951 unsigned char * start,
11952 unsigned char * end,
11953 Elf_Internal_Sym * symtab,
11954 unsigned long num_syms)
11955 {
11956 unsigned int reloc_type = 0;
11957 unsigned long sym_index = 0;
11958
11959 if (reloc)
11960 {
11961 reloc_type = get_reloc_type (filedata, reloc->r_info);
11962 sym_index = get_reloc_symindex (reloc->r_info);
11963 }
11964
11965 switch (filedata->file_header.e_machine)
11966 {
11967 case EM_MSP430:
11968 case EM_MSP430_OLD:
11969 {
11970 static Elf_Internal_Sym * saved_sym = NULL;
11971
11972 if (reloc == NULL)
11973 {
11974 saved_sym = NULL;
11975 return TRUE;
11976 }
11977
11978 switch (reloc_type)
11979 {
11980 case 10: /* R_MSP430_SYM_DIFF */
11981 if (uses_msp430x_relocs (filedata))
11982 break;
11983 /* Fall through. */
11984 case 21: /* R_MSP430X_SYM_DIFF */
11985 /* PR 21139. */
11986 if (sym_index >= num_syms)
11987 error (_("MSP430 SYM_DIFF reloc contains invalid symbol index %lu\n"),
11988 sym_index);
11989 else
11990 saved_sym = symtab + sym_index;
11991 return TRUE;
11992
11993 case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
11994 case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
11995 goto handle_sym_diff;
11996
11997 case 5: /* R_MSP430_16_BYTE */
11998 case 9: /* R_MSP430_8 */
11999 if (uses_msp430x_relocs (filedata))
12000 break;
12001 goto handle_sym_diff;
12002
12003 case 2: /* R_MSP430_ABS16 */
12004 case 15: /* R_MSP430X_ABS16 */
12005 if (! uses_msp430x_relocs (filedata))
12006 break;
12007 goto handle_sym_diff;
12008
12009 handle_sym_diff:
12010 if (saved_sym != NULL)
12011 {
12012 int reloc_size = reloc_type == 1 ? 4 : 2;
12013 bfd_vma value;
12014
12015 if (sym_index >= num_syms)
12016 error (_("MSP430 reloc contains invalid symbol index %lu\n"),
12017 sym_index);
12018 else
12019 {
12020 value = reloc->r_addend + (symtab[sym_index].st_value
12021 - saved_sym->st_value);
12022
12023 if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
12024 byte_put (start + reloc->r_offset, value, reloc_size);
12025 else
12026 /* PR 21137 */
12027 error (_("MSP430 sym diff reloc contains invalid offset: 0x%lx\n"),
12028 (long) reloc->r_offset);
12029 }
12030
12031 saved_sym = NULL;
12032 return TRUE;
12033 }
12034 break;
12035
12036 default:
12037 if (saved_sym != NULL)
12038 error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
12039 break;
12040 }
12041 break;
12042 }
12043
12044 case EM_MN10300:
12045 case EM_CYGNUS_MN10300:
12046 {
12047 static Elf_Internal_Sym * saved_sym = NULL;
12048
12049 if (reloc == NULL)
12050 {
12051 saved_sym = NULL;
12052 return TRUE;
12053 }
12054
12055 switch (reloc_type)
12056 {
12057 case 34: /* R_MN10300_ALIGN */
12058 return TRUE;
12059 case 33: /* R_MN10300_SYM_DIFF */
12060 if (sym_index >= num_syms)
12061 error (_("MN10300_SYM_DIFF reloc contains invalid symbol index %lu\n"),
12062 sym_index);
12063 else
12064 saved_sym = symtab + sym_index;
12065 return TRUE;
12066
12067 case 1: /* R_MN10300_32 */
12068 case 2: /* R_MN10300_16 */
12069 if (saved_sym != NULL)
12070 {
12071 int reloc_size = reloc_type == 1 ? 4 : 2;
12072 bfd_vma value;
12073
12074 if (sym_index >= num_syms)
12075 error (_("MN10300 reloc contains invalid symbol index %lu\n"),
12076 sym_index);
12077 else
12078 {
12079 value = reloc->r_addend + (symtab[sym_index].st_value
12080 - saved_sym->st_value);
12081
12082 if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
12083 byte_put (start + reloc->r_offset, value, reloc_size);
12084 else
12085 error (_("MN10300 sym diff reloc contains invalid offset: 0x%lx\n"),
12086 (long) reloc->r_offset);
12087 }
12088
12089 saved_sym = NULL;
12090 return TRUE;
12091 }
12092 break;
12093 default:
12094 if (saved_sym != NULL)
12095 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
12096 break;
12097 }
12098 break;
12099 }
12100
12101 case EM_RL78:
12102 {
12103 static bfd_vma saved_sym1 = 0;
12104 static bfd_vma saved_sym2 = 0;
12105 static bfd_vma value;
12106
12107 if (reloc == NULL)
12108 {
12109 saved_sym1 = saved_sym2 = 0;
12110 return TRUE;
12111 }
12112
12113 switch (reloc_type)
12114 {
12115 case 0x80: /* R_RL78_SYM. */
12116 saved_sym1 = saved_sym2;
12117 if (sym_index >= num_syms)
12118 error (_("RL78_SYM reloc contains invalid symbol index %lu\n"),
12119 sym_index);
12120 else
12121 {
12122 saved_sym2 = symtab[sym_index].st_value;
12123 saved_sym2 += reloc->r_addend;
12124 }
12125 return TRUE;
12126
12127 case 0x83: /* R_RL78_OPsub. */
12128 value = saved_sym1 - saved_sym2;
12129 saved_sym2 = saved_sym1 = 0;
12130 return TRUE;
12131 break;
12132
12133 case 0x41: /* R_RL78_ABS32. */
12134 if (IN_RANGE (start, end, start + reloc->r_offset, 4))
12135 byte_put (start + reloc->r_offset, value, 4);
12136 else
12137 error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12138 (long) reloc->r_offset);
12139 value = 0;
12140 return TRUE;
12141
12142 case 0x43: /* R_RL78_ABS16. */
12143 if (IN_RANGE (start, end, start + reloc->r_offset, 2))
12144 byte_put (start + reloc->r_offset, value, 2);
12145 else
12146 error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12147 (long) reloc->r_offset);
12148 value = 0;
12149 return TRUE;
12150
12151 default:
12152 break;
12153 }
12154 break;
12155 }
12156 }
12157
12158 return FALSE;
12159 }
12160
12161 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
12162 DWARF debug sections. This is a target specific test. Note - we do not
12163 go through the whole including-target-headers-multiple-times route, (as
12164 we have already done with <elf/h8.h>) because this would become very
12165 messy and even then this function would have to contain target specific
12166 information (the names of the relocs instead of their numeric values).
12167 FIXME: This is not the correct way to solve this problem. The proper way
12168 is to have target specific reloc sizing and typing functions created by
12169 the reloc-macros.h header, in the same way that it already creates the
12170 reloc naming functions. */
12171
12172 static bfd_boolean
12173 is_32bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12174 {
12175 /* Please keep this table alpha-sorted for ease of visual lookup. */
12176 switch (filedata->file_header.e_machine)
12177 {
12178 case EM_386:
12179 case EM_IAMCU:
12180 return reloc_type == 1; /* R_386_32. */
12181 case EM_68K:
12182 return reloc_type == 1; /* R_68K_32. */
12183 case EM_860:
12184 return reloc_type == 1; /* R_860_32. */
12185 case EM_960:
12186 return reloc_type == 2; /* R_960_32. */
12187 case EM_AARCH64:
12188 return (reloc_type == 258
12189 || reloc_type == 1); /* R_AARCH64_ABS32 || R_AARCH64_P32_ABS32 */
12190 case EM_ADAPTEVA_EPIPHANY:
12191 return reloc_type == 3;
12192 case EM_ALPHA:
12193 return reloc_type == 1; /* R_ALPHA_REFLONG. */
12194 case EM_ARC:
12195 return reloc_type == 1; /* R_ARC_32. */
12196 case EM_ARC_COMPACT:
12197 case EM_ARC_COMPACT2:
12198 return reloc_type == 4; /* R_ARC_32. */
12199 case EM_ARM:
12200 return reloc_type == 2; /* R_ARM_ABS32 */
12201 case EM_AVR_OLD:
12202 case EM_AVR:
12203 return reloc_type == 1;
12204 case EM_BLACKFIN:
12205 return reloc_type == 0x12; /* R_byte4_data. */
12206 case EM_CRIS:
12207 return reloc_type == 3; /* R_CRIS_32. */
12208 case EM_CR16:
12209 return reloc_type == 3; /* R_CR16_NUM32. */
12210 case EM_CRX:
12211 return reloc_type == 15; /* R_CRX_NUM32. */
12212 case EM_CYGNUS_FRV:
12213 return reloc_type == 1;
12214 case EM_CYGNUS_D10V:
12215 case EM_D10V:
12216 return reloc_type == 6; /* R_D10V_32. */
12217 case EM_CYGNUS_D30V:
12218 case EM_D30V:
12219 return reloc_type == 12; /* R_D30V_32_NORMAL. */
12220 case EM_DLX:
12221 return reloc_type == 3; /* R_DLX_RELOC_32. */
12222 case EM_CYGNUS_FR30:
12223 case EM_FR30:
12224 return reloc_type == 3; /* R_FR30_32. */
12225 case EM_FT32:
12226 return reloc_type == 1; /* R_FT32_32. */
12227 case EM_H8S:
12228 case EM_H8_300:
12229 case EM_H8_300H:
12230 return reloc_type == 1; /* R_H8_DIR32. */
12231 case EM_IA_64:
12232 return (reloc_type == 0x64 /* R_IA64_SECREL32MSB. */
12233 || reloc_type == 0x65 /* R_IA64_SECREL32LSB. */
12234 || reloc_type == 0x24 /* R_IA64_DIR32MSB. */
12235 || reloc_type == 0x25 /* R_IA64_DIR32LSB. */);
12236 case EM_IP2K_OLD:
12237 case EM_IP2K:
12238 return reloc_type == 2; /* R_IP2K_32. */
12239 case EM_IQ2000:
12240 return reloc_type == 2; /* R_IQ2000_32. */
12241 case EM_LATTICEMICO32:
12242 return reloc_type == 3; /* R_LM32_32. */
12243 case EM_M32C_OLD:
12244 case EM_M32C:
12245 return reloc_type == 3; /* R_M32C_32. */
12246 case EM_M32R:
12247 return reloc_type == 34; /* R_M32R_32_RELA. */
12248 case EM_68HC11:
12249 case EM_68HC12:
12250 return reloc_type == 6; /* R_M68HC11_32. */
12251 case EM_MCORE:
12252 return reloc_type == 1; /* R_MCORE_ADDR32. */
12253 case EM_CYGNUS_MEP:
12254 return reloc_type == 4; /* R_MEP_32. */
12255 case EM_METAG:
12256 return reloc_type == 2; /* R_METAG_ADDR32. */
12257 case EM_MICROBLAZE:
12258 return reloc_type == 1; /* R_MICROBLAZE_32. */
12259 case EM_MIPS:
12260 return reloc_type == 2; /* R_MIPS_32. */
12261 case EM_MMIX:
12262 return reloc_type == 4; /* R_MMIX_32. */
12263 case EM_CYGNUS_MN10200:
12264 case EM_MN10200:
12265 return reloc_type == 1; /* R_MN10200_32. */
12266 case EM_CYGNUS_MN10300:
12267 case EM_MN10300:
12268 return reloc_type == 1; /* R_MN10300_32. */
12269 case EM_MOXIE:
12270 return reloc_type == 1; /* R_MOXIE_32. */
12271 case EM_MSP430_OLD:
12272 case EM_MSP430:
12273 return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32. */
12274 case EM_MT:
12275 return reloc_type == 2; /* R_MT_32. */
12276 case EM_NDS32:
12277 return reloc_type == 20; /* R_NDS32_RELA. */
12278 case EM_ALTERA_NIOS2:
12279 return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32. */
12280 case EM_NIOS32:
12281 return reloc_type == 1; /* R_NIOS_32. */
12282 case EM_OR1K:
12283 return reloc_type == 1; /* R_OR1K_32. */
12284 case EM_PARISC:
12285 return (reloc_type == 1 /* R_PARISC_DIR32. */
12286 || reloc_type == 41); /* R_PARISC_SECREL32. */
12287 case EM_PJ:
12288 case EM_PJ_OLD:
12289 return reloc_type == 1; /* R_PJ_DATA_DIR32. */
12290 case EM_PPC64:
12291 return reloc_type == 1; /* R_PPC64_ADDR32. */
12292 case EM_PPC:
12293 return reloc_type == 1; /* R_PPC_ADDR32. */
12294 case EM_TI_PRU:
12295 return reloc_type == 11; /* R_PRU_BFD_RELOC_32. */
12296 case EM_RISCV:
12297 return reloc_type == 1; /* R_RISCV_32. */
12298 case EM_RL78:
12299 return reloc_type == 1; /* R_RL78_DIR32. */
12300 case EM_RX:
12301 return reloc_type == 1; /* R_RX_DIR32. */
12302 case EM_S370:
12303 return reloc_type == 1; /* R_I370_ADDR31. */
12304 case EM_S390_OLD:
12305 case EM_S390:
12306 return reloc_type == 4; /* R_S390_32. */
12307 case EM_SCORE:
12308 return reloc_type == 8; /* R_SCORE_ABS32. */
12309 case EM_SH:
12310 return reloc_type == 1; /* R_SH_DIR32. */
12311 case EM_SPARC32PLUS:
12312 case EM_SPARCV9:
12313 case EM_SPARC:
12314 return reloc_type == 3 /* R_SPARC_32. */
12315 || reloc_type == 23; /* R_SPARC_UA32. */
12316 case EM_SPU:
12317 return reloc_type == 6; /* R_SPU_ADDR32 */
12318 case EM_TI_C6000:
12319 return reloc_type == 1; /* R_C6000_ABS32. */
12320 case EM_TILEGX:
12321 return reloc_type == 2; /* R_TILEGX_32. */
12322 case EM_TILEPRO:
12323 return reloc_type == 1; /* R_TILEPRO_32. */
12324 case EM_CYGNUS_V850:
12325 case EM_V850:
12326 return reloc_type == 6; /* R_V850_ABS32. */
12327 case EM_V800:
12328 return reloc_type == 0x33; /* R_V810_WORD. */
12329 case EM_VAX:
12330 return reloc_type == 1; /* R_VAX_32. */
12331 case EM_VISIUM:
12332 return reloc_type == 3; /* R_VISIUM_32. */
12333 case EM_WEBASSEMBLY:
12334 return reloc_type == 1; /* R_WASM32_32. */
12335 case EM_X86_64:
12336 case EM_L1OM:
12337 case EM_K1OM:
12338 return reloc_type == 10; /* R_X86_64_32. */
12339 case EM_XC16X:
12340 case EM_C166:
12341 return reloc_type == 3; /* R_XC16C_ABS_32. */
12342 case EM_XGATE:
12343 return reloc_type == 4; /* R_XGATE_32. */
12344 case EM_XSTORMY16:
12345 return reloc_type == 1; /* R_XSTROMY16_32. */
12346 case EM_XTENSA_OLD:
12347 case EM_XTENSA:
12348 return reloc_type == 1; /* R_XTENSA_32. */
12349 default:
12350 {
12351 static unsigned int prev_warn = 0;
12352
12353 /* Avoid repeating the same warning multiple times. */
12354 if (prev_warn != filedata->file_header.e_machine)
12355 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
12356 filedata->file_header.e_machine);
12357 prev_warn = filedata->file_header.e_machine;
12358 return FALSE;
12359 }
12360 }
12361 }
12362
12363 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12364 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
12365
12366 static bfd_boolean
12367 is_32bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
12368 {
12369 switch (filedata->file_header.e_machine)
12370 /* Please keep this table alpha-sorted for ease of visual lookup. */
12371 {
12372 case EM_386:
12373 case EM_IAMCU:
12374 return reloc_type == 2; /* R_386_PC32. */
12375 case EM_68K:
12376 return reloc_type == 4; /* R_68K_PC32. */
12377 case EM_AARCH64:
12378 return reloc_type == 261; /* R_AARCH64_PREL32 */
12379 case EM_ADAPTEVA_EPIPHANY:
12380 return reloc_type == 6;
12381 case EM_ALPHA:
12382 return reloc_type == 10; /* R_ALPHA_SREL32. */
12383 case EM_ARC_COMPACT:
12384 case EM_ARC_COMPACT2:
12385 return reloc_type == 49; /* R_ARC_32_PCREL. */
12386 case EM_ARM:
12387 return reloc_type == 3; /* R_ARM_REL32 */
12388 case EM_AVR_OLD:
12389 case EM_AVR:
12390 return reloc_type == 36; /* R_AVR_32_PCREL. */
12391 case EM_MICROBLAZE:
12392 return reloc_type == 2; /* R_MICROBLAZE_32_PCREL. */
12393 case EM_OR1K:
12394 return reloc_type == 9; /* R_OR1K_32_PCREL. */
12395 case EM_PARISC:
12396 return reloc_type == 9; /* R_PARISC_PCREL32. */
12397 case EM_PPC:
12398 return reloc_type == 26; /* R_PPC_REL32. */
12399 case EM_PPC64:
12400 return reloc_type == 26; /* R_PPC64_REL32. */
12401 case EM_S390_OLD:
12402 case EM_S390:
12403 return reloc_type == 5; /* R_390_PC32. */
12404 case EM_SH:
12405 return reloc_type == 2; /* R_SH_REL32. */
12406 case EM_SPARC32PLUS:
12407 case EM_SPARCV9:
12408 case EM_SPARC:
12409 return reloc_type == 6; /* R_SPARC_DISP32. */
12410 case EM_SPU:
12411 return reloc_type == 13; /* R_SPU_REL32. */
12412 case EM_TILEGX:
12413 return reloc_type == 6; /* R_TILEGX_32_PCREL. */
12414 case EM_TILEPRO:
12415 return reloc_type == 4; /* R_TILEPRO_32_PCREL. */
12416 case EM_VISIUM:
12417 return reloc_type == 6; /* R_VISIUM_32_PCREL */
12418 case EM_X86_64:
12419 case EM_L1OM:
12420 case EM_K1OM:
12421 return reloc_type == 2; /* R_X86_64_PC32. */
12422 case EM_XTENSA_OLD:
12423 case EM_XTENSA:
12424 return reloc_type == 14; /* R_XTENSA_32_PCREL. */
12425 default:
12426 /* Do not abort or issue an error message here. Not all targets use
12427 pc-relative 32-bit relocs in their DWARF debug information and we
12428 have already tested for target coverage in is_32bit_abs_reloc. A
12429 more helpful warning message will be generated by apply_relocations
12430 anyway, so just return. */
12431 return FALSE;
12432 }
12433 }
12434
12435 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12436 a 64-bit absolute RELA relocation used in DWARF debug sections. */
12437
12438 static bfd_boolean
12439 is_64bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12440 {
12441 switch (filedata->file_header.e_machine)
12442 {
12443 case EM_AARCH64:
12444 return reloc_type == 257; /* R_AARCH64_ABS64. */
12445 case EM_ALPHA:
12446 return reloc_type == 2; /* R_ALPHA_REFQUAD. */
12447 case EM_IA_64:
12448 return (reloc_type == 0x26 /* R_IA64_DIR64MSB. */
12449 || reloc_type == 0x27 /* R_IA64_DIR64LSB. */);
12450 case EM_PARISC:
12451 return reloc_type == 80; /* R_PARISC_DIR64. */
12452 case EM_PPC64:
12453 return reloc_type == 38; /* R_PPC64_ADDR64. */
12454 case EM_RISCV:
12455 return reloc_type == 2; /* R_RISCV_64. */
12456 case EM_SPARC32PLUS:
12457 case EM_SPARCV9:
12458 case EM_SPARC:
12459 return reloc_type == 32 /* R_SPARC_64. */
12460 || reloc_type == 54; /* R_SPARC_UA64. */
12461 case EM_X86_64:
12462 case EM_L1OM:
12463 case EM_K1OM:
12464 return reloc_type == 1; /* R_X86_64_64. */
12465 case EM_S390_OLD:
12466 case EM_S390:
12467 return reloc_type == 22; /* R_S390_64. */
12468 case EM_TILEGX:
12469 return reloc_type == 1; /* R_TILEGX_64. */
12470 case EM_MIPS:
12471 return reloc_type == 18; /* R_MIPS_64. */
12472 default:
12473 return FALSE;
12474 }
12475 }
12476
12477 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
12478 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
12479
12480 static bfd_boolean
12481 is_64bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
12482 {
12483 switch (filedata->file_header.e_machine)
12484 {
12485 case EM_AARCH64:
12486 return reloc_type == 260; /* R_AARCH64_PREL64. */
12487 case EM_ALPHA:
12488 return reloc_type == 11; /* R_ALPHA_SREL64. */
12489 case EM_IA_64:
12490 return (reloc_type == 0x4e /* R_IA64_PCREL64MSB. */
12491 || reloc_type == 0x4f /* R_IA64_PCREL64LSB. */);
12492 case EM_PARISC:
12493 return reloc_type == 72; /* R_PARISC_PCREL64. */
12494 case EM_PPC64:
12495 return reloc_type == 44; /* R_PPC64_REL64. */
12496 case EM_SPARC32PLUS:
12497 case EM_SPARCV9:
12498 case EM_SPARC:
12499 return reloc_type == 46; /* R_SPARC_DISP64. */
12500 case EM_X86_64:
12501 case EM_L1OM:
12502 case EM_K1OM:
12503 return reloc_type == 24; /* R_X86_64_PC64. */
12504 case EM_S390_OLD:
12505 case EM_S390:
12506 return reloc_type == 23; /* R_S390_PC64. */
12507 case EM_TILEGX:
12508 return reloc_type == 5; /* R_TILEGX_64_PCREL. */
12509 default:
12510 return FALSE;
12511 }
12512 }
12513
12514 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12515 a 24-bit absolute RELA relocation used in DWARF debug sections. */
12516
12517 static bfd_boolean
12518 is_24bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12519 {
12520 switch (filedata->file_header.e_machine)
12521 {
12522 case EM_CYGNUS_MN10200:
12523 case EM_MN10200:
12524 return reloc_type == 4; /* R_MN10200_24. */
12525 case EM_FT32:
12526 return reloc_type == 5; /* R_FT32_20. */
12527 default:
12528 return FALSE;
12529 }
12530 }
12531
12532 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12533 a 16-bit absolute RELA relocation used in DWARF debug sections. */
12534
12535 static bfd_boolean
12536 is_16bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12537 {
12538 /* Please keep this table alpha-sorted for ease of visual lookup. */
12539 switch (filedata->file_header.e_machine)
12540 {
12541 case EM_ARC:
12542 case EM_ARC_COMPACT:
12543 case EM_ARC_COMPACT2:
12544 return reloc_type == 2; /* R_ARC_16. */
12545 case EM_ADAPTEVA_EPIPHANY:
12546 return reloc_type == 5;
12547 case EM_AVR_OLD:
12548 case EM_AVR:
12549 return reloc_type == 4; /* R_AVR_16. */
12550 case EM_CYGNUS_D10V:
12551 case EM_D10V:
12552 return reloc_type == 3; /* R_D10V_16. */
12553 case EM_FT32:
12554 return reloc_type == 2; /* R_FT32_16. */
12555 case EM_H8S:
12556 case EM_H8_300:
12557 case EM_H8_300H:
12558 return reloc_type == R_H8_DIR16;
12559 case EM_IP2K_OLD:
12560 case EM_IP2K:
12561 return reloc_type == 1; /* R_IP2K_16. */
12562 case EM_M32C_OLD:
12563 case EM_M32C:
12564 return reloc_type == 1; /* R_M32C_16 */
12565 case EM_CYGNUS_MN10200:
12566 case EM_MN10200:
12567 return reloc_type == 2; /* R_MN10200_16. */
12568 case EM_CYGNUS_MN10300:
12569 case EM_MN10300:
12570 return reloc_type == 2; /* R_MN10300_16. */
12571 case EM_MSP430:
12572 if (uses_msp430x_relocs (filedata))
12573 return reloc_type == 2; /* R_MSP430_ABS16. */
12574 /* Fall through. */
12575 case EM_MSP430_OLD:
12576 return reloc_type == 5; /* R_MSP430_16_BYTE. */
12577 case EM_NDS32:
12578 return reloc_type == 19; /* R_NDS32_RELA. */
12579 case EM_ALTERA_NIOS2:
12580 return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16. */
12581 case EM_NIOS32:
12582 return reloc_type == 9; /* R_NIOS_16. */
12583 case EM_OR1K:
12584 return reloc_type == 2; /* R_OR1K_16. */
12585 case EM_TI_PRU:
12586 return reloc_type == 8; /* R_PRU_BFD_RELOC_16. */
12587 case EM_TI_C6000:
12588 return reloc_type == 2; /* R_C6000_ABS16. */
12589 case EM_VISIUM:
12590 return reloc_type == 2; /* R_VISIUM_16. */
12591 case EM_XC16X:
12592 case EM_C166:
12593 return reloc_type == 2; /* R_XC16C_ABS_16. */
12594 case EM_XGATE:
12595 return reloc_type == 3; /* R_XGATE_16. */
12596 default:
12597 return FALSE;
12598 }
12599 }
12600
12601 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12602 a 32-bit inplace add RELA relocation used in DWARF debug sections. */
12603
12604 static bfd_boolean
12605 is_32bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12606 {
12607 /* Please keep this table alpha-sorted for ease of visual lookup. */
12608 switch (filedata->file_header.e_machine)
12609 {
12610 case EM_RISCV:
12611 return reloc_type == 35; /* R_RISCV_ADD32. */
12612 default:
12613 return FALSE;
12614 }
12615 }
12616
12617 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12618 a 32-bit inplace sub RELA relocation used in DWARF debug sections. */
12619
12620 static bfd_boolean
12621 is_32bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12622 {
12623 /* Please keep this table alpha-sorted for ease of visual lookup. */
12624 switch (filedata->file_header.e_machine)
12625 {
12626 case EM_RISCV:
12627 return reloc_type == 39; /* R_RISCV_SUB32. */
12628 default:
12629 return FALSE;
12630 }
12631 }
12632
12633 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12634 a 64-bit inplace add RELA relocation used in DWARF debug sections. */
12635
12636 static bfd_boolean
12637 is_64bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12638 {
12639 /* Please keep this table alpha-sorted for ease of visual lookup. */
12640 switch (filedata->file_header.e_machine)
12641 {
12642 case EM_RISCV:
12643 return reloc_type == 36; /* R_RISCV_ADD64. */
12644 default:
12645 return FALSE;
12646 }
12647 }
12648
12649 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12650 a 64-bit inplace sub RELA relocation used in DWARF debug sections. */
12651
12652 static bfd_boolean
12653 is_64bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12654 {
12655 /* Please keep this table alpha-sorted for ease of visual lookup. */
12656 switch (filedata->file_header.e_machine)
12657 {
12658 case EM_RISCV:
12659 return reloc_type == 40; /* R_RISCV_SUB64. */
12660 default:
12661 return FALSE;
12662 }
12663 }
12664
12665 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12666 a 16-bit inplace add RELA relocation used in DWARF debug sections. */
12667
12668 static bfd_boolean
12669 is_16bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12670 {
12671 /* Please keep this table alpha-sorted for ease of visual lookup. */
12672 switch (filedata->file_header.e_machine)
12673 {
12674 case EM_RISCV:
12675 return reloc_type == 34; /* R_RISCV_ADD16. */
12676 default:
12677 return FALSE;
12678 }
12679 }
12680
12681 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12682 a 16-bit inplace sub RELA relocation used in DWARF debug sections. */
12683
12684 static bfd_boolean
12685 is_16bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12686 {
12687 /* Please keep this table alpha-sorted for ease of visual lookup. */
12688 switch (filedata->file_header.e_machine)
12689 {
12690 case EM_RISCV:
12691 return reloc_type == 38; /* R_RISCV_SUB16. */
12692 default:
12693 return FALSE;
12694 }
12695 }
12696
12697 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12698 a 8-bit inplace add RELA relocation used in DWARF debug sections. */
12699
12700 static bfd_boolean
12701 is_8bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12702 {
12703 /* Please keep this table alpha-sorted for ease of visual lookup. */
12704 switch (filedata->file_header.e_machine)
12705 {
12706 case EM_RISCV:
12707 return reloc_type == 33; /* R_RISCV_ADD8. */
12708 default:
12709 return FALSE;
12710 }
12711 }
12712
12713 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12714 a 8-bit inplace sub RELA relocation used in DWARF debug sections. */
12715
12716 static bfd_boolean
12717 is_8bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12718 {
12719 /* Please keep this table alpha-sorted for ease of visual lookup. */
12720 switch (filedata->file_header.e_machine)
12721 {
12722 case EM_RISCV:
12723 return reloc_type == 37; /* R_RISCV_SUB8. */
12724 default:
12725 return FALSE;
12726 }
12727 }
12728
12729 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
12730 relocation entries (possibly formerly used for SHT_GROUP sections). */
12731
12732 static bfd_boolean
12733 is_none_reloc (Filedata * filedata, unsigned int reloc_type)
12734 {
12735 switch (filedata->file_header.e_machine)
12736 {
12737 case EM_386: /* R_386_NONE. */
12738 case EM_68K: /* R_68K_NONE. */
12739 case EM_ADAPTEVA_EPIPHANY:
12740 case EM_ALPHA: /* R_ALPHA_NONE. */
12741 case EM_ALTERA_NIOS2: /* R_NIOS2_NONE. */
12742 case EM_ARC: /* R_ARC_NONE. */
12743 case EM_ARC_COMPACT2: /* R_ARC_NONE. */
12744 case EM_ARC_COMPACT: /* R_ARC_NONE. */
12745 case EM_ARM: /* R_ARM_NONE. */
12746 case EM_C166: /* R_XC16X_NONE. */
12747 case EM_CRIS: /* R_CRIS_NONE. */
12748 case EM_FT32: /* R_FT32_NONE. */
12749 case EM_IA_64: /* R_IA64_NONE. */
12750 case EM_K1OM: /* R_X86_64_NONE. */
12751 case EM_L1OM: /* R_X86_64_NONE. */
12752 case EM_M32R: /* R_M32R_NONE. */
12753 case EM_MIPS: /* R_MIPS_NONE. */
12754 case EM_MN10300: /* R_MN10300_NONE. */
12755 case EM_MOXIE: /* R_MOXIE_NONE. */
12756 case EM_NIOS32: /* R_NIOS_NONE. */
12757 case EM_OR1K: /* R_OR1K_NONE. */
12758 case EM_PARISC: /* R_PARISC_NONE. */
12759 case EM_PPC64: /* R_PPC64_NONE. */
12760 case EM_PPC: /* R_PPC_NONE. */
12761 case EM_RISCV: /* R_RISCV_NONE. */
12762 case EM_S390: /* R_390_NONE. */
12763 case EM_S390_OLD:
12764 case EM_SH: /* R_SH_NONE. */
12765 case EM_SPARC32PLUS:
12766 case EM_SPARC: /* R_SPARC_NONE. */
12767 case EM_SPARCV9:
12768 case EM_TILEGX: /* R_TILEGX_NONE. */
12769 case EM_TILEPRO: /* R_TILEPRO_NONE. */
12770 case EM_TI_C6000:/* R_C6000_NONE. */
12771 case EM_X86_64: /* R_X86_64_NONE. */
12772 case EM_XC16X:
12773 case EM_WEBASSEMBLY: /* R_WASM32_NONE. */
12774 return reloc_type == 0;
12775
12776 case EM_AARCH64:
12777 return reloc_type == 0 || reloc_type == 256;
12778 case EM_AVR_OLD:
12779 case EM_AVR:
12780 return (reloc_type == 0 /* R_AVR_NONE. */
12781 || reloc_type == 30 /* R_AVR_DIFF8. */
12782 || reloc_type == 31 /* R_AVR_DIFF16. */
12783 || reloc_type == 32 /* R_AVR_DIFF32. */);
12784 case EM_METAG:
12785 return reloc_type == 3; /* R_METAG_NONE. */
12786 case EM_NDS32:
12787 return (reloc_type == 0 /* R_XTENSA_NONE. */
12788 || reloc_type == 204 /* R_NDS32_DIFF8. */
12789 || reloc_type == 205 /* R_NDS32_DIFF16. */
12790 || reloc_type == 206 /* R_NDS32_DIFF32. */
12791 || reloc_type == 207 /* R_NDS32_ULEB128. */);
12792 case EM_TI_PRU:
12793 return (reloc_type == 0 /* R_PRU_NONE. */
12794 || reloc_type == 65 /* R_PRU_DIFF8. */
12795 || reloc_type == 66 /* R_PRU_DIFF16. */
12796 || reloc_type == 67 /* R_PRU_DIFF32. */);
12797 case EM_XTENSA_OLD:
12798 case EM_XTENSA:
12799 return (reloc_type == 0 /* R_XTENSA_NONE. */
12800 || reloc_type == 17 /* R_XTENSA_DIFF8. */
12801 || reloc_type == 18 /* R_XTENSA_DIFF16. */
12802 || reloc_type == 19 /* R_XTENSA_DIFF32. */);
12803 }
12804 return FALSE;
12805 }
12806
12807 /* Returns TRUE if there is a relocation against
12808 section NAME at OFFSET bytes. */
12809
12810 bfd_boolean
12811 reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
12812 {
12813 Elf_Internal_Rela * relocs;
12814 Elf_Internal_Rela * rp;
12815
12816 if (dsec == NULL || dsec->reloc_info == NULL)
12817 return FALSE;
12818
12819 relocs = (Elf_Internal_Rela *) dsec->reloc_info;
12820
12821 for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
12822 if (rp->r_offset == offset)
12823 return TRUE;
12824
12825 return FALSE;
12826 }
12827
12828 /* Apply relocations to a section.
12829 Returns TRUE upon success, FALSE otherwise.
12830 If RELOCS_RETURN is non-NULL then it is set to point to the loaded relocs.
12831 It is then the caller's responsibility to free them. NUM_RELOCS_RETURN
12832 will be set to the number of relocs loaded.
12833
12834 Note: So far support has been added only for those relocations
12835 which can be found in debug sections. FIXME: Add support for
12836 more relocations ? */
12837
12838 static bfd_boolean
12839 apply_relocations (Filedata * filedata,
12840 const Elf_Internal_Shdr * section,
12841 unsigned char * start,
12842 bfd_size_type size,
12843 void ** relocs_return,
12844 unsigned long * num_relocs_return)
12845 {
12846 Elf_Internal_Shdr * relsec;
12847 unsigned char * end = start + size;
12848 bfd_boolean res = TRUE;
12849
12850 if (relocs_return != NULL)
12851 {
12852 * (Elf_Internal_Rela **) relocs_return = NULL;
12853 * num_relocs_return = 0;
12854 }
12855
12856 if (filedata->file_header.e_type != ET_REL)
12857 /* No relocs to apply. */
12858 return TRUE;
12859
12860 /* Find the reloc section associated with the section. */
12861 for (relsec = filedata->section_headers;
12862 relsec < filedata->section_headers + filedata->file_header.e_shnum;
12863 ++relsec)
12864 {
12865 bfd_boolean is_rela;
12866 unsigned long num_relocs;
12867 Elf_Internal_Rela * relocs;
12868 Elf_Internal_Rela * rp;
12869 Elf_Internal_Shdr * symsec;
12870 Elf_Internal_Sym * symtab;
12871 unsigned long num_syms;
12872 Elf_Internal_Sym * sym;
12873
12874 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12875 || relsec->sh_info >= filedata->file_header.e_shnum
12876 || filedata->section_headers + relsec->sh_info != section
12877 || relsec->sh_size == 0
12878 || relsec->sh_link >= filedata->file_header.e_shnum)
12879 continue;
12880
12881 is_rela = relsec->sh_type == SHT_RELA;
12882
12883 if (is_rela)
12884 {
12885 if (!slurp_rela_relocs (filedata, relsec->sh_offset,
12886 relsec->sh_size, & relocs, & num_relocs))
12887 return FALSE;
12888 }
12889 else
12890 {
12891 if (!slurp_rel_relocs (filedata, relsec->sh_offset,
12892 relsec->sh_size, & relocs, & num_relocs))
12893 return FALSE;
12894 }
12895
12896 /* SH uses RELA but uses in place value instead of the addend field. */
12897 if (filedata->file_header.e_machine == EM_SH)
12898 is_rela = FALSE;
12899
12900 symsec = filedata->section_headers + relsec->sh_link;
12901 if (symsec->sh_type != SHT_SYMTAB
12902 && symsec->sh_type != SHT_DYNSYM)
12903 return FALSE;
12904 symtab = GET_ELF_SYMBOLS (filedata, symsec, & num_syms);
12905
12906 for (rp = relocs; rp < relocs + num_relocs; ++rp)
12907 {
12908 bfd_vma addend;
12909 unsigned int reloc_type;
12910 unsigned int reloc_size;
12911 bfd_boolean reloc_inplace = FALSE;
12912 bfd_boolean reloc_subtract = FALSE;
12913 unsigned char * rloc;
12914 unsigned long sym_index;
12915
12916 reloc_type = get_reloc_type (filedata, rp->r_info);
12917
12918 if (target_specific_reloc_handling (filedata, rp, start, end, symtab, num_syms))
12919 continue;
12920 else if (is_none_reloc (filedata, reloc_type))
12921 continue;
12922 else if (is_32bit_abs_reloc (filedata, reloc_type)
12923 || is_32bit_pcrel_reloc (filedata, reloc_type))
12924 reloc_size = 4;
12925 else if (is_64bit_abs_reloc (filedata, reloc_type)
12926 || is_64bit_pcrel_reloc (filedata, reloc_type))
12927 reloc_size = 8;
12928 else if (is_24bit_abs_reloc (filedata, reloc_type))
12929 reloc_size = 3;
12930 else if (is_16bit_abs_reloc (filedata, reloc_type))
12931 reloc_size = 2;
12932 else if ((reloc_subtract = is_32bit_inplace_sub_reloc (filedata,
12933 reloc_type))
12934 || is_32bit_inplace_add_reloc (filedata, reloc_type))
12935 {
12936 reloc_size = 4;
12937 reloc_inplace = TRUE;
12938 }
12939 else if ((reloc_subtract = is_64bit_inplace_sub_reloc (filedata,
12940 reloc_type))
12941 || is_64bit_inplace_add_reloc (filedata, reloc_type))
12942 {
12943 reloc_size = 8;
12944 reloc_inplace = TRUE;
12945 }
12946 else if ((reloc_subtract = is_16bit_inplace_sub_reloc (filedata,
12947 reloc_type))
12948 || is_16bit_inplace_add_reloc (filedata, reloc_type))
12949 {
12950 reloc_size = 2;
12951 reloc_inplace = TRUE;
12952 }
12953 else if ((reloc_subtract = is_8bit_inplace_sub_reloc (filedata,
12954 reloc_type))
12955 || is_8bit_inplace_add_reloc (filedata, reloc_type))
12956 {
12957 reloc_size = 1;
12958 reloc_inplace = TRUE;
12959 }
12960 else
12961 {
12962 static unsigned int prev_reloc = 0;
12963
12964 if (reloc_type != prev_reloc)
12965 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
12966 reloc_type, printable_section_name (filedata, section));
12967 prev_reloc = reloc_type;
12968 res = FALSE;
12969 continue;
12970 }
12971
12972 rloc = start + rp->r_offset;
12973 if ((rloc + reloc_size) > end || (rloc < start))
12974 {
12975 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
12976 (unsigned long) rp->r_offset,
12977 printable_section_name (filedata, section));
12978 res = FALSE;
12979 continue;
12980 }
12981
12982 sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
12983 if (sym_index >= num_syms)
12984 {
12985 warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
12986 sym_index, printable_section_name (filedata, section));
12987 res = FALSE;
12988 continue;
12989 }
12990 sym = symtab + sym_index;
12991
12992 /* If the reloc has a symbol associated with it,
12993 make sure that it is of an appropriate type.
12994
12995 Relocations against symbols without type can happen.
12996 Gcc -feliminate-dwarf2-dups may generate symbols
12997 without type for debug info.
12998
12999 Icc generates relocations against function symbols
13000 instead of local labels.
13001
13002 Relocations against object symbols can happen, eg when
13003 referencing a global array. For an example of this see
13004 the _clz.o binary in libgcc.a. */
13005 if (sym != symtab
13006 && ELF_ST_TYPE (sym->st_info) != STT_COMMON
13007 && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
13008 {
13009 warn (_("skipping unexpected symbol type %s in section %s relocation %ld\n"),
13010 get_symbol_type (filedata, ELF_ST_TYPE (sym->st_info)),
13011 printable_section_name (filedata, relsec),
13012 (long int)(rp - relocs));
13013 res = FALSE;
13014 continue;
13015 }
13016
13017 addend = 0;
13018 if (is_rela)
13019 addend += rp->r_addend;
13020 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
13021 partial_inplace. */
13022 if (!is_rela
13023 || (filedata->file_header.e_machine == EM_XTENSA
13024 && reloc_type == 1)
13025 || ((filedata->file_header.e_machine == EM_PJ
13026 || filedata->file_header.e_machine == EM_PJ_OLD)
13027 && reloc_type == 1)
13028 || ((filedata->file_header.e_machine == EM_D30V
13029 || filedata->file_header.e_machine == EM_CYGNUS_D30V)
13030 && reloc_type == 12)
13031 || reloc_inplace)
13032 addend += byte_get (rloc, reloc_size);
13033
13034 if (is_32bit_pcrel_reloc (filedata, reloc_type)
13035 || is_64bit_pcrel_reloc (filedata, reloc_type))
13036 {
13037 /* On HPPA, all pc-relative relocations are biased by 8. */
13038 if (filedata->file_header.e_machine == EM_PARISC)
13039 addend -= 8;
13040 byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
13041 reloc_size);
13042 }
13043 else if (reloc_subtract)
13044 byte_put (rloc, addend - sym->st_value, reloc_size);
13045 else
13046 byte_put (rloc, addend + sym->st_value, reloc_size);
13047 }
13048
13049 free (symtab);
13050 /* Let the target specific reloc processing code know that
13051 we have finished with these relocs. */
13052 target_specific_reloc_handling (filedata, NULL, NULL, NULL, NULL, 0);
13053
13054 if (relocs_return)
13055 {
13056 * (Elf_Internal_Rela **) relocs_return = relocs;
13057 * num_relocs_return = num_relocs;
13058 }
13059 else
13060 free (relocs);
13061
13062 break;
13063 }
13064
13065 return res;
13066 }
13067
13068 #ifdef SUPPORT_DISASSEMBLY
13069 static bfd_boolean
13070 disassemble_section (Elf_Internal_Shdr * section, Filedata * filedata)
13071 {
13072 printf (_("\nAssembly dump of section %s\n"), printable_section_name (filedata, section));
13073
13074 /* FIXME: XXX -- to be done --- XXX */
13075
13076 return TRUE;
13077 }
13078 #endif
13079
13080 /* Reads in the contents of SECTION from FILE, returning a pointer
13081 to a malloc'ed buffer or NULL if something went wrong. */
13082
13083 static char *
13084 get_section_contents (Elf_Internal_Shdr * section, Filedata * filedata)
13085 {
13086 bfd_size_type num_bytes = section->sh_size;
13087
13088 if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
13089 {
13090 printf (_("Section '%s' has no data to dump.\n"),
13091 printable_section_name (filedata, section));
13092 return NULL;
13093 }
13094
13095 return (char *) get_data (NULL, filedata, section->sh_offset, 1, num_bytes,
13096 _("section contents"));
13097 }
13098
13099 /* Uncompresses a section that was compressed using zlib, in place. */
13100
13101 static bfd_boolean
13102 uncompress_section_contents (unsigned char ** buffer,
13103 dwarf_size_type uncompressed_size,
13104 dwarf_size_type * size)
13105 {
13106 dwarf_size_type compressed_size = *size;
13107 unsigned char * compressed_buffer = *buffer;
13108 unsigned char * uncompressed_buffer;
13109 z_stream strm;
13110 int rc;
13111
13112 /* It is possible the section consists of several compressed
13113 buffers concatenated together, so we uncompress in a loop. */
13114 /* PR 18313: The state field in the z_stream structure is supposed
13115 to be invisible to the user (ie us), but some compilers will
13116 still complain about it being used without initialisation. So
13117 we first zero the entire z_stream structure and then set the fields
13118 that we need. */
13119 memset (& strm, 0, sizeof strm);
13120 strm.avail_in = compressed_size;
13121 strm.next_in = (Bytef *) compressed_buffer;
13122 strm.avail_out = uncompressed_size;
13123 uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
13124
13125 rc = inflateInit (& strm);
13126 while (strm.avail_in > 0)
13127 {
13128 if (rc != Z_OK)
13129 goto fail;
13130 strm.next_out = ((Bytef *) uncompressed_buffer
13131 + (uncompressed_size - strm.avail_out));
13132 rc = inflate (&strm, Z_FINISH);
13133 if (rc != Z_STREAM_END)
13134 goto fail;
13135 rc = inflateReset (& strm);
13136 }
13137 rc = inflateEnd (& strm);
13138 if (rc != Z_OK
13139 || strm.avail_out != 0)
13140 goto fail;
13141
13142 *buffer = uncompressed_buffer;
13143 *size = uncompressed_size;
13144 return TRUE;
13145
13146 fail:
13147 free (uncompressed_buffer);
13148 /* Indicate decompression failure. */
13149 *buffer = NULL;
13150 return FALSE;
13151 }
13152
13153 static bfd_boolean
13154 dump_section_as_strings (Elf_Internal_Shdr * section, Filedata * filedata)
13155 {
13156 Elf_Internal_Shdr * relsec;
13157 bfd_size_type num_bytes;
13158 unsigned char * data;
13159 unsigned char * end;
13160 unsigned char * real_start;
13161 unsigned char * start;
13162 bfd_boolean some_strings_shown;
13163
13164 real_start = start = (unsigned char *) get_section_contents (section, filedata);
13165 if (start == NULL)
13166 /* PR 21820: Do not fail if the section was empty. */
13167 return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
13168
13169 num_bytes = section->sh_size;
13170
13171 printf (_("\nString dump of section '%s':\n"), printable_section_name (filedata, section));
13172
13173 if (decompress_dumps)
13174 {
13175 dwarf_size_type new_size = num_bytes;
13176 dwarf_size_type uncompressed_size = 0;
13177
13178 if ((section->sh_flags & SHF_COMPRESSED) != 0)
13179 {
13180 Elf_Internal_Chdr chdr;
13181 unsigned int compression_header_size
13182 = get_compression_header (& chdr, (unsigned char *) start,
13183 num_bytes);
13184
13185 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13186 {
13187 warn (_("section '%s' has unsupported compress type: %d\n"),
13188 printable_section_name (filedata, section), chdr.ch_type);
13189 return FALSE;
13190 }
13191 else if (chdr.ch_addralign != section->sh_addralign)
13192 {
13193 warn (_("compressed section '%s' is corrupted\n"),
13194 printable_section_name (filedata, section));
13195 return FALSE;
13196 }
13197 uncompressed_size = chdr.ch_size;
13198 start += compression_header_size;
13199 new_size -= compression_header_size;
13200 }
13201 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
13202 {
13203 /* Read the zlib header. In this case, it should be "ZLIB"
13204 followed by the uncompressed section size, 8 bytes in
13205 big-endian order. */
13206 uncompressed_size = start[4]; uncompressed_size <<= 8;
13207 uncompressed_size += start[5]; uncompressed_size <<= 8;
13208 uncompressed_size += start[6]; uncompressed_size <<= 8;
13209 uncompressed_size += start[7]; uncompressed_size <<= 8;
13210 uncompressed_size += start[8]; uncompressed_size <<= 8;
13211 uncompressed_size += start[9]; uncompressed_size <<= 8;
13212 uncompressed_size += start[10]; uncompressed_size <<= 8;
13213 uncompressed_size += start[11];
13214 start += 12;
13215 new_size -= 12;
13216 }
13217
13218 if (uncompressed_size)
13219 {
13220 if (uncompress_section_contents (& start,
13221 uncompressed_size, & new_size))
13222 num_bytes = new_size;
13223 else
13224 {
13225 error (_("Unable to decompress section %s\n"),
13226 printable_section_name (filedata, section));
13227 return FALSE;
13228 }
13229 }
13230 else
13231 start = real_start;
13232 }
13233
13234 /* If the section being dumped has relocations against it the user might
13235 be expecting these relocations to have been applied. Check for this
13236 case and issue a warning message in order to avoid confusion.
13237 FIXME: Maybe we ought to have an option that dumps a section with
13238 relocs applied ? */
13239 for (relsec = filedata->section_headers;
13240 relsec < filedata->section_headers + filedata->file_header.e_shnum;
13241 ++relsec)
13242 {
13243 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13244 || relsec->sh_info >= filedata->file_header.e_shnum
13245 || filedata->section_headers + relsec->sh_info != section
13246 || relsec->sh_size == 0
13247 || relsec->sh_link >= filedata->file_header.e_shnum)
13248 continue;
13249
13250 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
13251 break;
13252 }
13253
13254 data = start;
13255 end = start + num_bytes;
13256 some_strings_shown = FALSE;
13257
13258 while (data < end)
13259 {
13260 while (!ISPRINT (* data))
13261 if (++ data >= end)
13262 break;
13263
13264 if (data < end)
13265 {
13266 size_t maxlen = end - data;
13267
13268 #ifndef __MSVCRT__
13269 /* PR 11128: Use two separate invocations in order to work
13270 around bugs in the Solaris 8 implementation of printf. */
13271 printf (" [%6tx] ", data - start);
13272 #else
13273 printf (" [%6Ix] ", (size_t) (data - start));
13274 #endif
13275 if (maxlen > 0)
13276 {
13277 print_symbol ((int) maxlen, (const char *) data);
13278 putchar ('\n');
13279 data += strnlen ((const char *) data, maxlen);
13280 }
13281 else
13282 {
13283 printf (_("<corrupt>\n"));
13284 data = end;
13285 }
13286 some_strings_shown = TRUE;
13287 }
13288 }
13289
13290 if (! some_strings_shown)
13291 printf (_(" No strings found in this section."));
13292
13293 free (real_start);
13294
13295 putchar ('\n');
13296 return TRUE;
13297 }
13298
13299 static bfd_boolean
13300 dump_section_as_bytes (Elf_Internal_Shdr * section,
13301 Filedata * filedata,
13302 bfd_boolean relocate)
13303 {
13304 Elf_Internal_Shdr * relsec;
13305 bfd_size_type bytes;
13306 bfd_size_type section_size;
13307 bfd_vma addr;
13308 unsigned char * data;
13309 unsigned char * real_start;
13310 unsigned char * start;
13311
13312 real_start = start = (unsigned char *) get_section_contents (section, filedata);
13313 if (start == NULL)
13314 /* PR 21820: Do not fail if the section was empty. */
13315 return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
13316
13317 section_size = section->sh_size;
13318
13319 printf (_("\nHex dump of section '%s':\n"), printable_section_name (filedata, section));
13320
13321 if (decompress_dumps)
13322 {
13323 dwarf_size_type new_size = section_size;
13324 dwarf_size_type uncompressed_size = 0;
13325
13326 if ((section->sh_flags & SHF_COMPRESSED) != 0)
13327 {
13328 Elf_Internal_Chdr chdr;
13329 unsigned int compression_header_size
13330 = get_compression_header (& chdr, start, section_size);
13331
13332 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13333 {
13334 warn (_("section '%s' has unsupported compress type: %d\n"),
13335 printable_section_name (filedata, section), chdr.ch_type);
13336 return FALSE;
13337 }
13338 else if (chdr.ch_addralign != section->sh_addralign)
13339 {
13340 warn (_("compressed section '%s' is corrupted\n"),
13341 printable_section_name (filedata, section));
13342 return FALSE;
13343 }
13344 uncompressed_size = chdr.ch_size;
13345 start += compression_header_size;
13346 new_size -= compression_header_size;
13347 }
13348 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
13349 {
13350 /* Read the zlib header. In this case, it should be "ZLIB"
13351 followed by the uncompressed section size, 8 bytes in
13352 big-endian order. */
13353 uncompressed_size = start[4]; uncompressed_size <<= 8;
13354 uncompressed_size += start[5]; uncompressed_size <<= 8;
13355 uncompressed_size += start[6]; uncompressed_size <<= 8;
13356 uncompressed_size += start[7]; uncompressed_size <<= 8;
13357 uncompressed_size += start[8]; uncompressed_size <<= 8;
13358 uncompressed_size += start[9]; uncompressed_size <<= 8;
13359 uncompressed_size += start[10]; uncompressed_size <<= 8;
13360 uncompressed_size += start[11];
13361 start += 12;
13362 new_size -= 12;
13363 }
13364
13365 if (uncompressed_size)
13366 {
13367 if (uncompress_section_contents (& start, uncompressed_size,
13368 & new_size))
13369 {
13370 section_size = new_size;
13371 }
13372 else
13373 {
13374 error (_("Unable to decompress section %s\n"),
13375 printable_section_name (filedata, section));
13376 /* FIXME: Print the section anyway ? */
13377 return FALSE;
13378 }
13379 }
13380 else
13381 start = real_start;
13382 }
13383
13384 if (relocate)
13385 {
13386 if (! apply_relocations (filedata, section, start, section_size, NULL, NULL))
13387 return FALSE;
13388 }
13389 else
13390 {
13391 /* If the section being dumped has relocations against it the user might
13392 be expecting these relocations to have been applied. Check for this
13393 case and issue a warning message in order to avoid confusion.
13394 FIXME: Maybe we ought to have an option that dumps a section with
13395 relocs applied ? */
13396 for (relsec = filedata->section_headers;
13397 relsec < filedata->section_headers + filedata->file_header.e_shnum;
13398 ++relsec)
13399 {
13400 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13401 || relsec->sh_info >= filedata->file_header.e_shnum
13402 || filedata->section_headers + relsec->sh_info != section
13403 || relsec->sh_size == 0
13404 || relsec->sh_link >= filedata->file_header.e_shnum)
13405 continue;
13406
13407 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
13408 break;
13409 }
13410 }
13411
13412 addr = section->sh_addr;
13413 bytes = section_size;
13414 data = start;
13415
13416 while (bytes)
13417 {
13418 int j;
13419 int k;
13420 int lbytes;
13421
13422 lbytes = (bytes > 16 ? 16 : bytes);
13423
13424 printf (" 0x%8.8lx ", (unsigned long) addr);
13425
13426 for (j = 0; j < 16; j++)
13427 {
13428 if (j < lbytes)
13429 printf ("%2.2x", data[j]);
13430 else
13431 printf (" ");
13432
13433 if ((j & 3) == 3)
13434 printf (" ");
13435 }
13436
13437 for (j = 0; j < lbytes; j++)
13438 {
13439 k = data[j];
13440 if (k >= ' ' && k < 0x7f)
13441 printf ("%c", k);
13442 else
13443 printf (".");
13444 }
13445
13446 putchar ('\n');
13447
13448 data += lbytes;
13449 addr += lbytes;
13450 bytes -= lbytes;
13451 }
13452
13453 free (real_start);
13454
13455 putchar ('\n');
13456 return TRUE;
13457 }
13458
13459 static bfd_boolean
13460 load_specific_debug_section (enum dwarf_section_display_enum debug,
13461 const Elf_Internal_Shdr * sec,
13462 void * data)
13463 {
13464 struct dwarf_section * section = &debug_displays [debug].section;
13465 char buf [64];
13466 Filedata * filedata = (Filedata *) data;
13467
13468 if (section->start != NULL)
13469 {
13470 /* If it is already loaded, do nothing. */
13471 if (streq (section->filename, filedata->file_name))
13472 return TRUE;
13473 free (section->start);
13474 }
13475
13476 snprintf (buf, sizeof (buf), _("%s section data"), section->name);
13477 section->address = sec->sh_addr;
13478 section->user_data = NULL;
13479 section->filename = filedata->file_name;
13480 section->start = (unsigned char *) get_data (NULL, filedata,
13481 sec->sh_offset, 1,
13482 sec->sh_size, buf);
13483 if (section->start == NULL)
13484 section->size = 0;
13485 else
13486 {
13487 unsigned char *start = section->start;
13488 dwarf_size_type size = sec->sh_size;
13489 dwarf_size_type uncompressed_size = 0;
13490
13491 if ((sec->sh_flags & SHF_COMPRESSED) != 0)
13492 {
13493 Elf_Internal_Chdr chdr;
13494 unsigned int compression_header_size;
13495
13496 if (size < (is_32bit_elf
13497 ? sizeof (Elf32_External_Chdr)
13498 : sizeof (Elf64_External_Chdr)))
13499 {
13500 warn (_("compressed section %s is too small to contain a compression header"),
13501 section->name);
13502 return FALSE;
13503 }
13504
13505 compression_header_size = get_compression_header (&chdr, start, size);
13506
13507 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13508 {
13509 warn (_("section '%s' has unsupported compress type: %d\n"),
13510 section->name, chdr.ch_type);
13511 return FALSE;
13512 }
13513 else if (chdr.ch_addralign != sec->sh_addralign)
13514 {
13515 warn (_("compressed section '%s' is corrupted\n"),
13516 section->name);
13517 return FALSE;
13518 }
13519 uncompressed_size = chdr.ch_size;
13520 start += compression_header_size;
13521 size -= compression_header_size;
13522 }
13523 else if (size > 12 && streq ((char *) start, "ZLIB"))
13524 {
13525 /* Read the zlib header. In this case, it should be "ZLIB"
13526 followed by the uncompressed section size, 8 bytes in
13527 big-endian order. */
13528 uncompressed_size = start[4]; uncompressed_size <<= 8;
13529 uncompressed_size += start[5]; uncompressed_size <<= 8;
13530 uncompressed_size += start[6]; uncompressed_size <<= 8;
13531 uncompressed_size += start[7]; uncompressed_size <<= 8;
13532 uncompressed_size += start[8]; uncompressed_size <<= 8;
13533 uncompressed_size += start[9]; uncompressed_size <<= 8;
13534 uncompressed_size += start[10]; uncompressed_size <<= 8;
13535 uncompressed_size += start[11];
13536 start += 12;
13537 size -= 12;
13538 }
13539
13540 if (uncompressed_size)
13541 {
13542 if (uncompress_section_contents (&start, uncompressed_size,
13543 &size))
13544 {
13545 /* Free the compressed buffer, update the section buffer
13546 and the section size if uncompress is successful. */
13547 free (section->start);
13548 section->start = start;
13549 }
13550 else
13551 {
13552 error (_("Unable to decompress section %s\n"),
13553 printable_section_name (filedata, sec));
13554 return FALSE;
13555 }
13556 }
13557
13558 section->size = size;
13559 }
13560
13561 if (section->start == NULL)
13562 return FALSE;
13563
13564 if (debug_displays [debug].relocate)
13565 {
13566 if (! apply_relocations (filedata, sec, section->start, section->size,
13567 & section->reloc_info, & section->num_relocs))
13568 return FALSE;
13569 }
13570 else
13571 {
13572 section->reloc_info = NULL;
13573 section->num_relocs = 0;
13574 }
13575
13576 return TRUE;
13577 }
13578
13579 /* If this is not NULL, load_debug_section will only look for sections
13580 within the list of sections given here. */
13581 static unsigned int * section_subset = NULL;
13582
13583 bfd_boolean
13584 load_debug_section (enum dwarf_section_display_enum debug, void * data)
13585 {
13586 struct dwarf_section * section = &debug_displays [debug].section;
13587 Elf_Internal_Shdr * sec;
13588 Filedata * filedata = (Filedata *) data;
13589
13590 /* Without section headers we cannot find any sections. */
13591 if (filedata->section_headers == NULL)
13592 return FALSE;
13593
13594 if (filedata->string_table == NULL
13595 && filedata->file_header.e_shstrndx != SHN_UNDEF
13596 && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
13597 {
13598 Elf_Internal_Shdr * strs;
13599
13600 /* Read in the string table, so that we have section names to scan. */
13601 strs = filedata->section_headers + filedata->file_header.e_shstrndx;
13602
13603 if (strs != NULL && strs->sh_size != 0)
13604 {
13605 filedata->string_table
13606 = (char *) get_data (NULL, filedata, strs->sh_offset,
13607 1, strs->sh_size, _("string table"));
13608
13609 filedata->string_table_length
13610 = filedata->string_table != NULL ? strs->sh_size : 0;
13611 }
13612 }
13613
13614 /* Locate the debug section. */
13615 sec = find_section_in_set (filedata, section->uncompressed_name, section_subset);
13616 if (sec != NULL)
13617 section->name = section->uncompressed_name;
13618 else
13619 {
13620 sec = find_section_in_set (filedata, section->compressed_name, section_subset);
13621 if (sec != NULL)
13622 section->name = section->compressed_name;
13623 }
13624 if (sec == NULL)
13625 return FALSE;
13626
13627 /* If we're loading from a subset of sections, and we've loaded
13628 a section matching this name before, it's likely that it's a
13629 different one. */
13630 if (section_subset != NULL)
13631 free_debug_section (debug);
13632
13633 return load_specific_debug_section (debug, sec, data);
13634 }
13635
13636 void
13637 free_debug_section (enum dwarf_section_display_enum debug)
13638 {
13639 struct dwarf_section * section = &debug_displays [debug].section;
13640
13641 if (section->start == NULL)
13642 return;
13643
13644 free ((char *) section->start);
13645 section->start = NULL;
13646 section->address = 0;
13647 section->size = 0;
13648 }
13649
13650 static bfd_boolean
13651 display_debug_section (int shndx, Elf_Internal_Shdr * section, Filedata * filedata)
13652 {
13653 char * name = SECTION_NAME (section);
13654 const char * print_name = printable_section_name (filedata, section);
13655 bfd_size_type length;
13656 bfd_boolean result = TRUE;
13657 int i;
13658
13659 length = section->sh_size;
13660 if (length == 0)
13661 {
13662 printf (_("\nSection '%s' has no debugging data.\n"), print_name);
13663 return TRUE;
13664 }
13665 if (section->sh_type == SHT_NOBITS)
13666 {
13667 /* There is no point in dumping the contents of a debugging section
13668 which has the NOBITS type - the bits in the file will be random.
13669 This can happen when a file containing a .eh_frame section is
13670 stripped with the --only-keep-debug command line option. */
13671 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
13672 print_name);
13673 return FALSE;
13674 }
13675
13676 if (const_strneq (name, ".gnu.linkonce.wi."))
13677 name = ".debug_info";
13678
13679 /* See if we know how to display the contents of this section. */
13680 for (i = 0; i < max; i++)
13681 {
13682 enum dwarf_section_display_enum id = (enum dwarf_section_display_enum) i;
13683 struct dwarf_section_display * display = debug_displays + i;
13684 struct dwarf_section * sec = & display->section;
13685
13686 if (streq (sec->uncompressed_name, name)
13687 || (id == line && const_strneq (name, ".debug_line."))
13688 || streq (sec->compressed_name, name))
13689 {
13690 bfd_boolean secondary = (section != find_section (filedata, name));
13691
13692 if (secondary)
13693 free_debug_section (id);
13694
13695 if (i == line && const_strneq (name, ".debug_line."))
13696 sec->name = name;
13697 else if (streq (sec->uncompressed_name, name))
13698 sec->name = sec->uncompressed_name;
13699 else
13700 sec->name = sec->compressed_name;
13701
13702 if (load_specific_debug_section (id, section, filedata))
13703 {
13704 /* If this debug section is part of a CU/TU set in a .dwp file,
13705 restrict load_debug_section to the sections in that set. */
13706 section_subset = find_cu_tu_set (filedata, shndx);
13707
13708 result &= display->display (sec, filedata);
13709
13710 section_subset = NULL;
13711
13712 if (secondary || (id != info && id != abbrev))
13713 free_debug_section (id);
13714 }
13715 break;
13716 }
13717 }
13718
13719 if (i == max)
13720 {
13721 printf (_("Unrecognized debug section: %s\n"), print_name);
13722 result = FALSE;
13723 }
13724
13725 return result;
13726 }
13727
13728 /* Set DUMP_SECTS for all sections where dumps were requested
13729 based on section name. */
13730
13731 static void
13732 initialise_dumps_byname (Filedata * filedata)
13733 {
13734 struct dump_list_entry * cur;
13735
13736 for (cur = dump_sects_byname; cur; cur = cur->next)
13737 {
13738 unsigned int i;
13739 bfd_boolean any = FALSE;
13740
13741 for (i = 0; i < filedata->file_header.e_shnum; i++)
13742 if (streq (SECTION_NAME (filedata->section_headers + i), cur->name))
13743 {
13744 request_dump_bynumber (filedata, i, cur->type);
13745 any = TRUE;
13746 }
13747
13748 if (!any)
13749 warn (_("Section '%s' was not dumped because it does not exist!\n"),
13750 cur->name);
13751 }
13752 }
13753
13754 static bfd_boolean
13755 process_section_contents (Filedata * filedata)
13756 {
13757 Elf_Internal_Shdr * section;
13758 unsigned int i;
13759 bfd_boolean res = TRUE;
13760
13761 if (! do_dump)
13762 return TRUE;
13763
13764 initialise_dumps_byname (filedata);
13765
13766 for (i = 0, section = filedata->section_headers;
13767 i < filedata->file_header.e_shnum && i < filedata->num_dump_sects;
13768 i++, section++)
13769 {
13770 dump_type dump = filedata->dump_sects[i];
13771
13772 #ifdef SUPPORT_DISASSEMBLY
13773 if (dump & DISASS_DUMP)
13774 {
13775 if (! disassemble_section (section, filedata))
13776 res = FALSE;
13777 }
13778 #endif
13779 if (dump & HEX_DUMP)
13780 {
13781 if (! dump_section_as_bytes (section, filedata, FALSE))
13782 res = FALSE;
13783 }
13784
13785 if (dump & RELOC_DUMP)
13786 {
13787 if (! dump_section_as_bytes (section, filedata, TRUE))
13788 res = FALSE;
13789 }
13790
13791 if (dump & STRING_DUMP)
13792 {
13793 if (! dump_section_as_strings (section, filedata))
13794 res = FALSE;
13795 }
13796
13797 if (dump & DEBUG_DUMP)
13798 {
13799 if (! display_debug_section (i, section, filedata))
13800 res = FALSE;
13801 }
13802 }
13803
13804 /* Check to see if the user requested a
13805 dump of a section that does not exist. */
13806 while (i < filedata->num_dump_sects)
13807 {
13808 if (filedata->dump_sects[i])
13809 {
13810 warn (_("Section %d was not dumped because it does not exist!\n"), i);
13811 res = FALSE;
13812 }
13813 i++;
13814 }
13815
13816 return res;
13817 }
13818
13819 static void
13820 process_mips_fpe_exception (int mask)
13821 {
13822 if (mask)
13823 {
13824 bfd_boolean first = TRUE;
13825
13826 if (mask & OEX_FPU_INEX)
13827 fputs ("INEX", stdout), first = FALSE;
13828 if (mask & OEX_FPU_UFLO)
13829 printf ("%sUFLO", first ? "" : "|"), first = FALSE;
13830 if (mask & OEX_FPU_OFLO)
13831 printf ("%sOFLO", first ? "" : "|"), first = FALSE;
13832 if (mask & OEX_FPU_DIV0)
13833 printf ("%sDIV0", first ? "" : "|"), first = FALSE;
13834 if (mask & OEX_FPU_INVAL)
13835 printf ("%sINVAL", first ? "" : "|");
13836 }
13837 else
13838 fputs ("0", stdout);
13839 }
13840
13841 /* Display's the value of TAG at location P. If TAG is
13842 greater than 0 it is assumed to be an unknown tag, and
13843 a message is printed to this effect. Otherwise it is
13844 assumed that a message has already been printed.
13845
13846 If the bottom bit of TAG is set it assumed to have a
13847 string value, otherwise it is assumed to have an integer
13848 value.
13849
13850 Returns an updated P pointing to the first unread byte
13851 beyond the end of TAG's value.
13852
13853 Reads at or beyond END will not be made. */
13854
13855 static unsigned char *
13856 display_tag_value (signed int tag,
13857 unsigned char * p,
13858 const unsigned char * const end)
13859 {
13860 unsigned long val;
13861
13862 if (tag > 0)
13863 printf (" Tag_unknown_%d: ", tag);
13864
13865 if (p >= end)
13866 {
13867 warn (_("<corrupt tag>\n"));
13868 }
13869 else if (tag & 1)
13870 {
13871 /* PR 17531 file: 027-19978-0.004. */
13872 size_t maxlen = (end - p) - 1;
13873
13874 putchar ('"');
13875 if (maxlen > 0)
13876 {
13877 print_symbol ((int) maxlen, (const char *) p);
13878 p += strnlen ((char *) p, maxlen) + 1;
13879 }
13880 else
13881 {
13882 printf (_("<corrupt string tag>"));
13883 p = (unsigned char *) end;
13884 }
13885 printf ("\"\n");
13886 }
13887 else
13888 {
13889 unsigned int len;
13890
13891 val = read_uleb128 (p, &len, end);
13892 p += len;
13893 printf ("%ld (0x%lx)\n", val, val);
13894 }
13895
13896 assert (p <= end);
13897 return p;
13898 }
13899
13900 /* ARC ABI attributes section. */
13901
13902 static unsigned char *
13903 display_arc_attribute (unsigned char * p,
13904 const unsigned char * const end)
13905 {
13906 unsigned int tag;
13907 unsigned int len;
13908 unsigned int val;
13909
13910 tag = read_uleb128 (p, &len, end);
13911 p += len;
13912
13913 switch (tag)
13914 {
13915 case Tag_ARC_PCS_config:
13916 val = read_uleb128 (p, &len, end);
13917 p += len;
13918 printf (" Tag_ARC_PCS_config: ");
13919 switch (val)
13920 {
13921 case 0:
13922 printf (_("Absent/Non standard\n"));
13923 break;
13924 case 1:
13925 printf (_("Bare metal/mwdt\n"));
13926 break;
13927 case 2:
13928 printf (_("Bare metal/newlib\n"));
13929 break;
13930 case 3:
13931 printf (_("Linux/uclibc\n"));
13932 break;
13933 case 4:
13934 printf (_("Linux/glibc\n"));
13935 break;
13936 default:
13937 printf (_("Unknown\n"));
13938 break;
13939 }
13940 break;
13941
13942 case Tag_ARC_CPU_base:
13943 val = read_uleb128 (p, &len, end);
13944 p += len;
13945 printf (" Tag_ARC_CPU_base: ");
13946 switch (val)
13947 {
13948 default:
13949 case TAG_CPU_NONE:
13950 printf (_("Absent\n"));
13951 break;
13952 case TAG_CPU_ARC6xx:
13953 printf ("ARC6xx\n");
13954 break;
13955 case TAG_CPU_ARC7xx:
13956 printf ("ARC7xx\n");
13957 break;
13958 case TAG_CPU_ARCEM:
13959 printf ("ARCEM\n");
13960 break;
13961 case TAG_CPU_ARCHS:
13962 printf ("ARCHS\n");
13963 break;
13964 }
13965 break;
13966
13967 case Tag_ARC_CPU_variation:
13968 val = read_uleb128 (p, &len, end);
13969 p += len;
13970 printf (" Tag_ARC_CPU_variation: ");
13971 switch (val)
13972 {
13973 default:
13974 if (val > 0 && val < 16)
13975 printf ("Core%d\n", val);
13976 else
13977 printf ("Unknown\n");
13978 break;
13979
13980 case 0:
13981 printf (_("Absent\n"));
13982 break;
13983 }
13984 break;
13985
13986 case Tag_ARC_CPU_name:
13987 printf (" Tag_ARC_CPU_name: ");
13988 p = display_tag_value (-1, p, end);
13989 break;
13990
13991 case Tag_ARC_ABI_rf16:
13992 val = read_uleb128 (p, &len, end);
13993 p += len;
13994 printf (" Tag_ARC_ABI_rf16: %s\n", val ? _("yes") : _("no"));
13995 break;
13996
13997 case Tag_ARC_ABI_osver:
13998 val = read_uleb128 (p, &len, end);
13999 p += len;
14000 printf (" Tag_ARC_ABI_osver: v%d\n", val);
14001 break;
14002
14003 case Tag_ARC_ABI_pic:
14004 case Tag_ARC_ABI_sda:
14005 val = read_uleb128 (p, &len, end);
14006 p += len;
14007 printf (tag == Tag_ARC_ABI_sda ? " Tag_ARC_ABI_sda: "
14008 : " Tag_ARC_ABI_pic: ");
14009 switch (val)
14010 {
14011 case 0:
14012 printf (_("Absent\n"));
14013 break;
14014 case 1:
14015 printf ("MWDT\n");
14016 break;
14017 case 2:
14018 printf ("GNU\n");
14019 break;
14020 default:
14021 printf (_("Unknown\n"));
14022 break;
14023 }
14024 break;
14025
14026 case Tag_ARC_ABI_tls:
14027 val = read_uleb128 (p, &len, end);
14028 p += len;
14029 printf (" Tag_ARC_ABI_tls: %s\n", val ? "r25": "none");
14030 break;
14031
14032 case Tag_ARC_ABI_enumsize:
14033 val = read_uleb128 (p, &len, end);
14034 p += len;
14035 printf (" Tag_ARC_ABI_enumsize: %s\n", val ? _("default") :
14036 _("smallest"));
14037 break;
14038
14039 case Tag_ARC_ABI_exceptions:
14040 val = read_uleb128 (p, &len, end);
14041 p += len;
14042 printf (" Tag_ARC_ABI_exceptions: %s\n", val ? _("OPTFP")
14043 : _("default"));
14044 break;
14045
14046 case Tag_ARC_ABI_double_size:
14047 val = read_uleb128 (p, &len, end);
14048 p += len;
14049 printf (" Tag_ARC_ABI_double_size: %d\n", val);
14050 break;
14051
14052 case Tag_ARC_ISA_config:
14053 printf (" Tag_ARC_ISA_config: ");
14054 p = display_tag_value (-1, p, end);
14055 break;
14056
14057 case Tag_ARC_ISA_apex:
14058 printf (" Tag_ARC_ISA_apex: ");
14059 p = display_tag_value (-1, p, end);
14060 break;
14061
14062 case Tag_ARC_ISA_mpy_option:
14063 val = read_uleb128 (p, &len, end);
14064 p += len;
14065 printf (" Tag_ARC_ISA_mpy_option: %d\n", val);
14066 break;
14067
14068 default:
14069 return display_tag_value (tag & 1, p, end);
14070 }
14071
14072 return p;
14073 }
14074
14075 /* ARM EABI attributes section. */
14076 typedef struct
14077 {
14078 unsigned int tag;
14079 const char * name;
14080 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
14081 unsigned int type;
14082 const char ** table;
14083 } arm_attr_public_tag;
14084
14085 static const char * arm_attr_tag_CPU_arch[] =
14086 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
14087 "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "v8-R", "v8-M.baseline",
14088 "v8-M.mainline"};
14089 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
14090 static const char * arm_attr_tag_THUMB_ISA_use[] =
14091 {"No", "Thumb-1", "Thumb-2", "Yes"};
14092 static const char * arm_attr_tag_FP_arch[] =
14093 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
14094 "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
14095 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
14096 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
14097 {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
14098 "NEON for ARMv8.1"};
14099 static const char * arm_attr_tag_PCS_config[] =
14100 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
14101 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
14102 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
14103 {"V6", "SB", "TLS", "Unused"};
14104 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
14105 {"Absolute", "PC-relative", "SB-relative", "None"};
14106 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
14107 {"Absolute", "PC-relative", "None"};
14108 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
14109 {"None", "direct", "GOT-indirect"};
14110 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
14111 {"None", "??? 1", "2", "??? 3", "4"};
14112 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
14113 static const char * arm_attr_tag_ABI_FP_denormal[] =
14114 {"Unused", "Needed", "Sign only"};
14115 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
14116 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
14117 static const char * arm_attr_tag_ABI_FP_number_model[] =
14118 {"Unused", "Finite", "RTABI", "IEEE 754"};
14119 static const char * arm_attr_tag_ABI_enum_size[] =
14120 {"Unused", "small", "int", "forced to int"};
14121 static const char * arm_attr_tag_ABI_HardFP_use[] =
14122 {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
14123 static const char * arm_attr_tag_ABI_VFP_args[] =
14124 {"AAPCS", "VFP registers", "custom", "compatible"};
14125 static const char * arm_attr_tag_ABI_WMMX_args[] =
14126 {"AAPCS", "WMMX registers", "custom"};
14127 static const char * arm_attr_tag_ABI_optimization_goals[] =
14128 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14129 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
14130 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
14131 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14132 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
14133 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
14134 static const char * arm_attr_tag_FP_HP_extension[] =
14135 {"Not Allowed", "Allowed"};
14136 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
14137 {"None", "IEEE 754", "Alternative Format"};
14138 static const char * arm_attr_tag_DSP_extension[] =
14139 {"Follow architecture", "Allowed"};
14140 static const char * arm_attr_tag_MPextension_use[] =
14141 {"Not Allowed", "Allowed"};
14142 static const char * arm_attr_tag_DIV_use[] =
14143 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
14144 "Allowed in v7-A with integer division extension"};
14145 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
14146 static const char * arm_attr_tag_Virtualization_use[] =
14147 {"Not Allowed", "TrustZone", "Virtualization Extensions",
14148 "TrustZone and Virtualization Extensions"};
14149 static const char * arm_attr_tag_MPextension_use_legacy[] =
14150 {"Not Allowed", "Allowed"};
14151
14152 #define LOOKUP(id, name) \
14153 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
14154 static arm_attr_public_tag arm_attr_public_tags[] =
14155 {
14156 {4, "CPU_raw_name", 1, NULL},
14157 {5, "CPU_name", 1, NULL},
14158 LOOKUP(6, CPU_arch),
14159 {7, "CPU_arch_profile", 0, NULL},
14160 LOOKUP(8, ARM_ISA_use),
14161 LOOKUP(9, THUMB_ISA_use),
14162 LOOKUP(10, FP_arch),
14163 LOOKUP(11, WMMX_arch),
14164 LOOKUP(12, Advanced_SIMD_arch),
14165 LOOKUP(13, PCS_config),
14166 LOOKUP(14, ABI_PCS_R9_use),
14167 LOOKUP(15, ABI_PCS_RW_data),
14168 LOOKUP(16, ABI_PCS_RO_data),
14169 LOOKUP(17, ABI_PCS_GOT_use),
14170 LOOKUP(18, ABI_PCS_wchar_t),
14171 LOOKUP(19, ABI_FP_rounding),
14172 LOOKUP(20, ABI_FP_denormal),
14173 LOOKUP(21, ABI_FP_exceptions),
14174 LOOKUP(22, ABI_FP_user_exceptions),
14175 LOOKUP(23, ABI_FP_number_model),
14176 {24, "ABI_align_needed", 0, NULL},
14177 {25, "ABI_align_preserved", 0, NULL},
14178 LOOKUP(26, ABI_enum_size),
14179 LOOKUP(27, ABI_HardFP_use),
14180 LOOKUP(28, ABI_VFP_args),
14181 LOOKUP(29, ABI_WMMX_args),
14182 LOOKUP(30, ABI_optimization_goals),
14183 LOOKUP(31, ABI_FP_optimization_goals),
14184 {32, "compatibility", 0, NULL},
14185 LOOKUP(34, CPU_unaligned_access),
14186 LOOKUP(36, FP_HP_extension),
14187 LOOKUP(38, ABI_FP_16bit_format),
14188 LOOKUP(42, MPextension_use),
14189 LOOKUP(44, DIV_use),
14190 LOOKUP(46, DSP_extension),
14191 {64, "nodefaults", 0, NULL},
14192 {65, "also_compatible_with", 0, NULL},
14193 LOOKUP(66, T2EE_use),
14194 {67, "conformance", 1, NULL},
14195 LOOKUP(68, Virtualization_use),
14196 LOOKUP(70, MPextension_use_legacy)
14197 };
14198 #undef LOOKUP
14199
14200 static unsigned char *
14201 display_arm_attribute (unsigned char * p,
14202 const unsigned char * const end)
14203 {
14204 unsigned int tag;
14205 unsigned int len;
14206 unsigned int val;
14207 arm_attr_public_tag * attr;
14208 unsigned i;
14209 unsigned int type;
14210
14211 tag = read_uleb128 (p, &len, end);
14212 p += len;
14213 attr = NULL;
14214 for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
14215 {
14216 if (arm_attr_public_tags[i].tag == tag)
14217 {
14218 attr = &arm_attr_public_tags[i];
14219 break;
14220 }
14221 }
14222
14223 if (attr)
14224 {
14225 printf (" Tag_%s: ", attr->name);
14226 switch (attr->type)
14227 {
14228 case 0:
14229 switch (tag)
14230 {
14231 case 7: /* Tag_CPU_arch_profile. */
14232 val = read_uleb128 (p, &len, end);
14233 p += len;
14234 switch (val)
14235 {
14236 case 0: printf (_("None\n")); break;
14237 case 'A': printf (_("Application\n")); break;
14238 case 'R': printf (_("Realtime\n")); break;
14239 case 'M': printf (_("Microcontroller\n")); break;
14240 case 'S': printf (_("Application or Realtime\n")); break;
14241 default: printf ("??? (%d)\n", val); break;
14242 }
14243 break;
14244
14245 case 24: /* Tag_align_needed. */
14246 val = read_uleb128 (p, &len, end);
14247 p += len;
14248 switch (val)
14249 {
14250 case 0: printf (_("None\n")); break;
14251 case 1: printf (_("8-byte\n")); break;
14252 case 2: printf (_("4-byte\n")); break;
14253 case 3: printf ("??? 3\n"); break;
14254 default:
14255 if (val <= 12)
14256 printf (_("8-byte and up to %d-byte extended\n"),
14257 1 << val);
14258 else
14259 printf ("??? (%d)\n", val);
14260 break;
14261 }
14262 break;
14263
14264 case 25: /* Tag_align_preserved. */
14265 val = read_uleb128 (p, &len, end);
14266 p += len;
14267 switch (val)
14268 {
14269 case 0: printf (_("None\n")); break;
14270 case 1: printf (_("8-byte, except leaf SP\n")); break;
14271 case 2: printf (_("8-byte\n")); break;
14272 case 3: printf ("??? 3\n"); break;
14273 default:
14274 if (val <= 12)
14275 printf (_("8-byte and up to %d-byte extended\n"),
14276 1 << val);
14277 else
14278 printf ("??? (%d)\n", val);
14279 break;
14280 }
14281 break;
14282
14283 case 32: /* Tag_compatibility. */
14284 {
14285 val = read_uleb128 (p, &len, end);
14286 p += len;
14287 printf (_("flag = %d, vendor = "), val);
14288 if (p < end - 1)
14289 {
14290 size_t maxlen = (end - p) - 1;
14291
14292 print_symbol ((int) maxlen, (const char *) p);
14293 p += strnlen ((char *) p, maxlen) + 1;
14294 }
14295 else
14296 {
14297 printf (_("<corrupt>"));
14298 p = (unsigned char *) end;
14299 }
14300 putchar ('\n');
14301 }
14302 break;
14303
14304 case 64: /* Tag_nodefaults. */
14305 /* PR 17531: file: 001-505008-0.01. */
14306 if (p < end)
14307 p++;
14308 printf (_("True\n"));
14309 break;
14310
14311 case 65: /* Tag_also_compatible_with. */
14312 val = read_uleb128 (p, &len, end);
14313 p += len;
14314 if (val == 6 /* Tag_CPU_arch. */)
14315 {
14316 val = read_uleb128 (p, &len, end);
14317 p += len;
14318 if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
14319 printf ("??? (%d)\n", val);
14320 else
14321 printf ("%s\n", arm_attr_tag_CPU_arch[val]);
14322 }
14323 else
14324 printf ("???\n");
14325 while (p < end && *(p++) != '\0' /* NUL terminator. */)
14326 ;
14327 break;
14328
14329 default:
14330 printf (_("<unknown: %d>\n"), tag);
14331 break;
14332 }
14333 return p;
14334
14335 case 1:
14336 return display_tag_value (-1, p, end);
14337 case 2:
14338 return display_tag_value (0, p, end);
14339
14340 default:
14341 assert (attr->type & 0x80);
14342 val = read_uleb128 (p, &len, end);
14343 p += len;
14344 type = attr->type & 0x7f;
14345 if (val >= type)
14346 printf ("??? (%d)\n", val);
14347 else
14348 printf ("%s\n", attr->table[val]);
14349 return p;
14350 }
14351 }
14352
14353 return display_tag_value (tag, p, end);
14354 }
14355
14356 static unsigned char *
14357 display_gnu_attribute (unsigned char * p,
14358 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const),
14359 const unsigned char * const end)
14360 {
14361 int tag;
14362 unsigned int len;
14363 unsigned int val;
14364
14365 tag = read_uleb128 (p, &len, end);
14366 p += len;
14367
14368 /* Tag_compatibility is the only generic GNU attribute defined at
14369 present. */
14370 if (tag == 32)
14371 {
14372 val = read_uleb128 (p, &len, end);
14373 p += len;
14374
14375 printf (_("flag = %d, vendor = "), val);
14376 if (p == end)
14377 {
14378 printf (_("<corrupt>\n"));
14379 warn (_("corrupt vendor attribute\n"));
14380 }
14381 else
14382 {
14383 if (p < end - 1)
14384 {
14385 size_t maxlen = (end - p) - 1;
14386
14387 print_symbol ((int) maxlen, (const char *) p);
14388 p += strnlen ((char *) p, maxlen) + 1;
14389 }
14390 else
14391 {
14392 printf (_("<corrupt>"));
14393 p = (unsigned char *) end;
14394 }
14395 putchar ('\n');
14396 }
14397 return p;
14398 }
14399
14400 if ((tag & 2) == 0 && display_proc_gnu_attribute)
14401 return display_proc_gnu_attribute (p, tag, end);
14402
14403 return display_tag_value (tag, p, end);
14404 }
14405
14406 static unsigned char *
14407 display_power_gnu_attribute (unsigned char * p,
14408 unsigned int tag,
14409 const unsigned char * const end)
14410 {
14411 unsigned int len;
14412 unsigned int val;
14413
14414 if (tag == Tag_GNU_Power_ABI_FP)
14415 {
14416 val = read_uleb128 (p, &len, end);
14417 p += len;
14418 printf (" Tag_GNU_Power_ABI_FP: ");
14419 if (len == 0)
14420 {
14421 printf (_("<corrupt>\n"));
14422 return p;
14423 }
14424
14425 if (val > 15)
14426 printf ("(%#x), ", val);
14427
14428 switch (val & 3)
14429 {
14430 case 0:
14431 printf (_("unspecified hard/soft float, "));
14432 break;
14433 case 1:
14434 printf (_("hard float, "));
14435 break;
14436 case 2:
14437 printf (_("soft float, "));
14438 break;
14439 case 3:
14440 printf (_("single-precision hard float, "));
14441 break;
14442 }
14443
14444 switch (val & 0xC)
14445 {
14446 case 0:
14447 printf (_("unspecified long double\n"));
14448 break;
14449 case 4:
14450 printf (_("128-bit IBM long double\n"));
14451 break;
14452 case 8:
14453 printf (_("64-bit long double\n"));
14454 break;
14455 case 12:
14456 printf (_("128-bit IEEE long double\n"));
14457 break;
14458 }
14459 return p;
14460 }
14461
14462 if (tag == Tag_GNU_Power_ABI_Vector)
14463 {
14464 val = read_uleb128 (p, &len, end);
14465 p += len;
14466 printf (" Tag_GNU_Power_ABI_Vector: ");
14467 if (len == 0)
14468 {
14469 printf (_("<corrupt>\n"));
14470 return p;
14471 }
14472
14473 if (val > 3)
14474 printf ("(%#x), ", val);
14475
14476 switch (val & 3)
14477 {
14478 case 0:
14479 printf (_("unspecified\n"));
14480 break;
14481 case 1:
14482 printf (_("generic\n"));
14483 break;
14484 case 2:
14485 printf ("AltiVec\n");
14486 break;
14487 case 3:
14488 printf ("SPE\n");
14489 break;
14490 }
14491 return p;
14492 }
14493
14494 if (tag == Tag_GNU_Power_ABI_Struct_Return)
14495 {
14496 val = read_uleb128 (p, &len, end);
14497 p += len;
14498 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
14499 if (len == 0)
14500 {
14501 printf (_("<corrupt>\n"));
14502 return p;
14503 }
14504
14505 if (val > 2)
14506 printf ("(%#x), ", val);
14507
14508 switch (val & 3)
14509 {
14510 case 0:
14511 printf (_("unspecified\n"));
14512 break;
14513 case 1:
14514 printf ("r3/r4\n");
14515 break;
14516 case 2:
14517 printf (_("memory\n"));
14518 break;
14519 case 3:
14520 printf ("???\n");
14521 break;
14522 }
14523 return p;
14524 }
14525
14526 return display_tag_value (tag & 1, p, end);
14527 }
14528
14529 static unsigned char *
14530 display_s390_gnu_attribute (unsigned char * p,
14531 unsigned int tag,
14532 const unsigned char * const end)
14533 {
14534 unsigned int len;
14535 int val;
14536
14537 if (tag == Tag_GNU_S390_ABI_Vector)
14538 {
14539 val = read_uleb128 (p, &len, end);
14540 p += len;
14541 printf (" Tag_GNU_S390_ABI_Vector: ");
14542
14543 switch (val)
14544 {
14545 case 0:
14546 printf (_("any\n"));
14547 break;
14548 case 1:
14549 printf (_("software\n"));
14550 break;
14551 case 2:
14552 printf (_("hardware\n"));
14553 break;
14554 default:
14555 printf ("??? (%d)\n", val);
14556 break;
14557 }
14558 return p;
14559 }
14560
14561 return display_tag_value (tag & 1, p, end);
14562 }
14563
14564 static void
14565 display_sparc_hwcaps (unsigned int mask)
14566 {
14567 if (mask)
14568 {
14569 bfd_boolean first = TRUE;
14570
14571 if (mask & ELF_SPARC_HWCAP_MUL32)
14572 fputs ("mul32", stdout), first = FALSE;
14573 if (mask & ELF_SPARC_HWCAP_DIV32)
14574 printf ("%sdiv32", first ? "" : "|"), first = FALSE;
14575 if (mask & ELF_SPARC_HWCAP_FSMULD)
14576 printf ("%sfsmuld", first ? "" : "|"), first = FALSE;
14577 if (mask & ELF_SPARC_HWCAP_V8PLUS)
14578 printf ("%sv8plus", first ? "" : "|"), first = FALSE;
14579 if (mask & ELF_SPARC_HWCAP_POPC)
14580 printf ("%spopc", first ? "" : "|"), first = FALSE;
14581 if (mask & ELF_SPARC_HWCAP_VIS)
14582 printf ("%svis", first ? "" : "|"), first = FALSE;
14583 if (mask & ELF_SPARC_HWCAP_VIS2)
14584 printf ("%svis2", first ? "" : "|"), first = FALSE;
14585 if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
14586 printf ("%sASIBlkInit", first ? "" : "|"), first = FALSE;
14587 if (mask & ELF_SPARC_HWCAP_FMAF)
14588 printf ("%sfmaf", first ? "" : "|"), first = FALSE;
14589 if (mask & ELF_SPARC_HWCAP_VIS3)
14590 printf ("%svis3", first ? "" : "|"), first = FALSE;
14591 if (mask & ELF_SPARC_HWCAP_HPC)
14592 printf ("%shpc", first ? "" : "|"), first = FALSE;
14593 if (mask & ELF_SPARC_HWCAP_RANDOM)
14594 printf ("%srandom", first ? "" : "|"), first = FALSE;
14595 if (mask & ELF_SPARC_HWCAP_TRANS)
14596 printf ("%strans", first ? "" : "|"), first = FALSE;
14597 if (mask & ELF_SPARC_HWCAP_FJFMAU)
14598 printf ("%sfjfmau", first ? "" : "|"), first = FALSE;
14599 if (mask & ELF_SPARC_HWCAP_IMA)
14600 printf ("%sima", first ? "" : "|"), first = FALSE;
14601 if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
14602 printf ("%scspare", first ? "" : "|"), first = FALSE;
14603 }
14604 else
14605 fputc ('0', stdout);
14606 fputc ('\n', stdout);
14607 }
14608
14609 static void
14610 display_sparc_hwcaps2 (unsigned int mask)
14611 {
14612 if (mask)
14613 {
14614 bfd_boolean first = TRUE;
14615
14616 if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
14617 fputs ("fjathplus", stdout), first = FALSE;
14618 if (mask & ELF_SPARC_HWCAP2_VIS3B)
14619 printf ("%svis3b", first ? "" : "|"), first = FALSE;
14620 if (mask & ELF_SPARC_HWCAP2_ADP)
14621 printf ("%sadp", first ? "" : "|"), first = FALSE;
14622 if (mask & ELF_SPARC_HWCAP2_SPARC5)
14623 printf ("%ssparc5", first ? "" : "|"), first = FALSE;
14624 if (mask & ELF_SPARC_HWCAP2_MWAIT)
14625 printf ("%smwait", first ? "" : "|"), first = FALSE;
14626 if (mask & ELF_SPARC_HWCAP2_XMPMUL)
14627 printf ("%sxmpmul", first ? "" : "|"), first = FALSE;
14628 if (mask & ELF_SPARC_HWCAP2_XMONT)
14629 printf ("%sxmont2", first ? "" : "|"), first = FALSE;
14630 if (mask & ELF_SPARC_HWCAP2_NSEC)
14631 printf ("%snsec", first ? "" : "|"), first = FALSE;
14632 if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
14633 printf ("%sfjathhpc", first ? "" : "|"), first = FALSE;
14634 if (mask & ELF_SPARC_HWCAP2_FJDES)
14635 printf ("%sfjdes", first ? "" : "|"), first = FALSE;
14636 if (mask & ELF_SPARC_HWCAP2_FJAES)
14637 printf ("%sfjaes", first ? "" : "|"), first = FALSE;
14638 }
14639 else
14640 fputc ('0', stdout);
14641 fputc ('\n', stdout);
14642 }
14643
14644 static unsigned char *
14645 display_sparc_gnu_attribute (unsigned char * p,
14646 unsigned int tag,
14647 const unsigned char * const end)
14648 {
14649 unsigned int len;
14650 int val;
14651
14652 if (tag == Tag_GNU_Sparc_HWCAPS)
14653 {
14654 val = read_uleb128 (p, &len, end);
14655 p += len;
14656 printf (" Tag_GNU_Sparc_HWCAPS: ");
14657 display_sparc_hwcaps (val);
14658 return p;
14659 }
14660 if (tag == Tag_GNU_Sparc_HWCAPS2)
14661 {
14662 val = read_uleb128 (p, &len, end);
14663 p += len;
14664 printf (" Tag_GNU_Sparc_HWCAPS2: ");
14665 display_sparc_hwcaps2 (val);
14666 return p;
14667 }
14668
14669 return display_tag_value (tag, p, end);
14670 }
14671
14672 static void
14673 print_mips_fp_abi_value (unsigned int val)
14674 {
14675 switch (val)
14676 {
14677 case Val_GNU_MIPS_ABI_FP_ANY:
14678 printf (_("Hard or soft float\n"));
14679 break;
14680 case Val_GNU_MIPS_ABI_FP_DOUBLE:
14681 printf (_("Hard float (double precision)\n"));
14682 break;
14683 case Val_GNU_MIPS_ABI_FP_SINGLE:
14684 printf (_("Hard float (single precision)\n"));
14685 break;
14686 case Val_GNU_MIPS_ABI_FP_SOFT:
14687 printf (_("Soft float\n"));
14688 break;
14689 case Val_GNU_MIPS_ABI_FP_OLD_64:
14690 printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
14691 break;
14692 case Val_GNU_MIPS_ABI_FP_XX:
14693 printf (_("Hard float (32-bit CPU, Any FPU)\n"));
14694 break;
14695 case Val_GNU_MIPS_ABI_FP_64:
14696 printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
14697 break;
14698 case Val_GNU_MIPS_ABI_FP_64A:
14699 printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
14700 break;
14701 case Val_GNU_MIPS_ABI_FP_NAN2008:
14702 printf (_("NaN 2008 compatibility\n"));
14703 break;
14704 default:
14705 printf ("??? (%d)\n", val);
14706 break;
14707 }
14708 }
14709
14710 static unsigned char *
14711 display_mips_gnu_attribute (unsigned char * p,
14712 unsigned int tag,
14713 const unsigned char * const end)
14714 {
14715 if (tag == Tag_GNU_MIPS_ABI_FP)
14716 {
14717 unsigned int len;
14718 unsigned int val;
14719
14720 val = read_uleb128 (p, &len, end);
14721 p += len;
14722 printf (" Tag_GNU_MIPS_ABI_FP: ");
14723
14724 print_mips_fp_abi_value (val);
14725
14726 return p;
14727 }
14728
14729 if (tag == Tag_GNU_MIPS_ABI_MSA)
14730 {
14731 unsigned int len;
14732 unsigned int val;
14733
14734 val = read_uleb128 (p, &len, end);
14735 p += len;
14736 printf (" Tag_GNU_MIPS_ABI_MSA: ");
14737
14738 switch (val)
14739 {
14740 case Val_GNU_MIPS_ABI_MSA_ANY:
14741 printf (_("Any MSA or not\n"));
14742 break;
14743 case Val_GNU_MIPS_ABI_MSA_128:
14744 printf (_("128-bit MSA\n"));
14745 break;
14746 default:
14747 printf ("??? (%d)\n", val);
14748 break;
14749 }
14750 return p;
14751 }
14752
14753 return display_tag_value (tag & 1, p, end);
14754 }
14755
14756 static unsigned char *
14757 display_tic6x_attribute (unsigned char * p,
14758 const unsigned char * const end)
14759 {
14760 unsigned int tag;
14761 unsigned int len;
14762 int val;
14763
14764 tag = read_uleb128 (p, &len, end);
14765 p += len;
14766
14767 switch (tag)
14768 {
14769 case Tag_ISA:
14770 val = read_uleb128 (p, &len, end);
14771 p += len;
14772 printf (" Tag_ISA: ");
14773
14774 switch (val)
14775 {
14776 case C6XABI_Tag_ISA_none:
14777 printf (_("None\n"));
14778 break;
14779 case C6XABI_Tag_ISA_C62X:
14780 printf ("C62x\n");
14781 break;
14782 case C6XABI_Tag_ISA_C67X:
14783 printf ("C67x\n");
14784 break;
14785 case C6XABI_Tag_ISA_C67XP:
14786 printf ("C67x+\n");
14787 break;
14788 case C6XABI_Tag_ISA_C64X:
14789 printf ("C64x\n");
14790 break;
14791 case C6XABI_Tag_ISA_C64XP:
14792 printf ("C64x+\n");
14793 break;
14794 case C6XABI_Tag_ISA_C674X:
14795 printf ("C674x\n");
14796 break;
14797 default:
14798 printf ("??? (%d)\n", val);
14799 break;
14800 }
14801 return p;
14802
14803 case Tag_ABI_wchar_t:
14804 val = read_uleb128 (p, &len, end);
14805 p += len;
14806 printf (" Tag_ABI_wchar_t: ");
14807 switch (val)
14808 {
14809 case 0:
14810 printf (_("Not used\n"));
14811 break;
14812 case 1:
14813 printf (_("2 bytes\n"));
14814 break;
14815 case 2:
14816 printf (_("4 bytes\n"));
14817 break;
14818 default:
14819 printf ("??? (%d)\n", val);
14820 break;
14821 }
14822 return p;
14823
14824 case Tag_ABI_stack_align_needed:
14825 val = read_uleb128 (p, &len, end);
14826 p += len;
14827 printf (" Tag_ABI_stack_align_needed: ");
14828 switch (val)
14829 {
14830 case 0:
14831 printf (_("8-byte\n"));
14832 break;
14833 case 1:
14834 printf (_("16-byte\n"));
14835 break;
14836 default:
14837 printf ("??? (%d)\n", val);
14838 break;
14839 }
14840 return p;
14841
14842 case Tag_ABI_stack_align_preserved:
14843 val = read_uleb128 (p, &len, end);
14844 p += len;
14845 printf (" Tag_ABI_stack_align_preserved: ");
14846 switch (val)
14847 {
14848 case 0:
14849 printf (_("8-byte\n"));
14850 break;
14851 case 1:
14852 printf (_("16-byte\n"));
14853 break;
14854 default:
14855 printf ("??? (%d)\n", val);
14856 break;
14857 }
14858 return p;
14859
14860 case Tag_ABI_DSBT:
14861 val = read_uleb128 (p, &len, end);
14862 p += len;
14863 printf (" Tag_ABI_DSBT: ");
14864 switch (val)
14865 {
14866 case 0:
14867 printf (_("DSBT addressing not used\n"));
14868 break;
14869 case 1:
14870 printf (_("DSBT addressing used\n"));
14871 break;
14872 default:
14873 printf ("??? (%d)\n", val);
14874 break;
14875 }
14876 return p;
14877
14878 case Tag_ABI_PID:
14879 val = read_uleb128 (p, &len, end);
14880 p += len;
14881 printf (" Tag_ABI_PID: ");
14882 switch (val)
14883 {
14884 case 0:
14885 printf (_("Data addressing position-dependent\n"));
14886 break;
14887 case 1:
14888 printf (_("Data addressing position-independent, GOT near DP\n"));
14889 break;
14890 case 2:
14891 printf (_("Data addressing position-independent, GOT far from DP\n"));
14892 break;
14893 default:
14894 printf ("??? (%d)\n", val);
14895 break;
14896 }
14897 return p;
14898
14899 case Tag_ABI_PIC:
14900 val = read_uleb128 (p, &len, end);
14901 p += len;
14902 printf (" Tag_ABI_PIC: ");
14903 switch (val)
14904 {
14905 case 0:
14906 printf (_("Code addressing position-dependent\n"));
14907 break;
14908 case 1:
14909 printf (_("Code addressing position-independent\n"));
14910 break;
14911 default:
14912 printf ("??? (%d)\n", val);
14913 break;
14914 }
14915 return p;
14916
14917 case Tag_ABI_array_object_alignment:
14918 val = read_uleb128 (p, &len, end);
14919 p += len;
14920 printf (" Tag_ABI_array_object_alignment: ");
14921 switch (val)
14922 {
14923 case 0:
14924 printf (_("8-byte\n"));
14925 break;
14926 case 1:
14927 printf (_("4-byte\n"));
14928 break;
14929 case 2:
14930 printf (_("16-byte\n"));
14931 break;
14932 default:
14933 printf ("??? (%d)\n", val);
14934 break;
14935 }
14936 return p;
14937
14938 case Tag_ABI_array_object_align_expected:
14939 val = read_uleb128 (p, &len, end);
14940 p += len;
14941 printf (" Tag_ABI_array_object_align_expected: ");
14942 switch (val)
14943 {
14944 case 0:
14945 printf (_("8-byte\n"));
14946 break;
14947 case 1:
14948 printf (_("4-byte\n"));
14949 break;
14950 case 2:
14951 printf (_("16-byte\n"));
14952 break;
14953 default:
14954 printf ("??? (%d)\n", val);
14955 break;
14956 }
14957 return p;
14958
14959 case Tag_ABI_compatibility:
14960 {
14961 val = read_uleb128 (p, &len, end);
14962 p += len;
14963 printf (" Tag_ABI_compatibility: ");
14964 printf (_("flag = %d, vendor = "), val);
14965 if (p < end - 1)
14966 {
14967 size_t maxlen = (end - p) - 1;
14968
14969 print_symbol ((int) maxlen, (const char *) p);
14970 p += strnlen ((char *) p, maxlen) + 1;
14971 }
14972 else
14973 {
14974 printf (_("<corrupt>"));
14975 p = (unsigned char *) end;
14976 }
14977 putchar ('\n');
14978 return p;
14979 }
14980
14981 case Tag_ABI_conformance:
14982 {
14983 printf (" Tag_ABI_conformance: \"");
14984 if (p < end - 1)
14985 {
14986 size_t maxlen = (end - p) - 1;
14987
14988 print_symbol ((int) maxlen, (const char *) p);
14989 p += strnlen ((char *) p, maxlen) + 1;
14990 }
14991 else
14992 {
14993 printf (_("<corrupt>"));
14994 p = (unsigned char *) end;
14995 }
14996 printf ("\"\n");
14997 return p;
14998 }
14999 }
15000
15001 return display_tag_value (tag, p, end);
15002 }
15003
15004 static void
15005 display_raw_attribute (unsigned char * p, unsigned char const * const end)
15006 {
15007 unsigned long addr = 0;
15008 size_t bytes = end - p;
15009
15010 assert (end > p);
15011 while (bytes)
15012 {
15013 int j;
15014 int k;
15015 int lbytes = (bytes > 16 ? 16 : bytes);
15016
15017 printf (" 0x%8.8lx ", addr);
15018
15019 for (j = 0; j < 16; j++)
15020 {
15021 if (j < lbytes)
15022 printf ("%2.2x", p[j]);
15023 else
15024 printf (" ");
15025
15026 if ((j & 3) == 3)
15027 printf (" ");
15028 }
15029
15030 for (j = 0; j < lbytes; j++)
15031 {
15032 k = p[j];
15033 if (k >= ' ' && k < 0x7f)
15034 printf ("%c", k);
15035 else
15036 printf (".");
15037 }
15038
15039 putchar ('\n');
15040
15041 p += lbytes;
15042 bytes -= lbytes;
15043 addr += lbytes;
15044 }
15045
15046 putchar ('\n');
15047 }
15048
15049 static unsigned char *
15050 display_msp430x_attribute (unsigned char * p,
15051 const unsigned char * const end)
15052 {
15053 unsigned int len;
15054 unsigned int val;
15055 unsigned int tag;
15056
15057 tag = read_uleb128 (p, & len, end);
15058 p += len;
15059
15060 switch (tag)
15061 {
15062 case OFBA_MSPABI_Tag_ISA:
15063 val = read_uleb128 (p, &len, end);
15064 p += len;
15065 printf (" Tag_ISA: ");
15066 switch (val)
15067 {
15068 case 0: printf (_("None\n")); break;
15069 case 1: printf (_("MSP430\n")); break;
15070 case 2: printf (_("MSP430X\n")); break;
15071 default: printf ("??? (%d)\n", val); break;
15072 }
15073 break;
15074
15075 case OFBA_MSPABI_Tag_Code_Model:
15076 val = read_uleb128 (p, &len, end);
15077 p += len;
15078 printf (" Tag_Code_Model: ");
15079 switch (val)
15080 {
15081 case 0: printf (_("None\n")); break;
15082 case 1: printf (_("Small\n")); break;
15083 case 2: printf (_("Large\n")); break;
15084 default: printf ("??? (%d)\n", val); break;
15085 }
15086 break;
15087
15088 case OFBA_MSPABI_Tag_Data_Model:
15089 val = read_uleb128 (p, &len, end);
15090 p += len;
15091 printf (" Tag_Data_Model: ");
15092 switch (val)
15093 {
15094 case 0: printf (_("None\n")); break;
15095 case 1: printf (_("Small\n")); break;
15096 case 2: printf (_("Large\n")); break;
15097 case 3: printf (_("Restricted Large\n")); break;
15098 default: printf ("??? (%d)\n", val); break;
15099 }
15100 break;
15101
15102 default:
15103 printf (_(" <unknown tag %d>: "), tag);
15104
15105 if (tag & 1)
15106 {
15107 putchar ('"');
15108 if (p < end - 1)
15109 {
15110 size_t maxlen = (end - p) - 1;
15111
15112 print_symbol ((int) maxlen, (const char *) p);
15113 p += strnlen ((char *) p, maxlen) + 1;
15114 }
15115 else
15116 {
15117 printf (_("<corrupt>"));
15118 p = (unsigned char *) end;
15119 }
15120 printf ("\"\n");
15121 }
15122 else
15123 {
15124 val = read_uleb128 (p, &len, end);
15125 p += len;
15126 printf ("%d (0x%x)\n", val, val);
15127 }
15128 break;
15129 }
15130
15131 assert (p <= end);
15132 return p;
15133 }
15134
15135 static bfd_boolean
15136 process_attributes (Filedata * filedata,
15137 const char * public_name,
15138 unsigned int proc_type,
15139 unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
15140 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const))
15141 {
15142 Elf_Internal_Shdr * sect;
15143 unsigned i;
15144 bfd_boolean res = TRUE;
15145
15146 /* Find the section header so that we get the size. */
15147 for (i = 0, sect = filedata->section_headers;
15148 i < filedata->file_header.e_shnum;
15149 i++, sect++)
15150 {
15151 unsigned char * contents;
15152 unsigned char * p;
15153
15154 if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
15155 continue;
15156
15157 contents = (unsigned char *) get_data (NULL, filedata, sect->sh_offset, 1,
15158 sect->sh_size, _("attributes"));
15159 if (contents == NULL)
15160 {
15161 res = FALSE;
15162 continue;
15163 }
15164
15165 p = contents;
15166 /* The first character is the version of the attributes.
15167 Currently only version 1, (aka 'A') is recognised here. */
15168 if (*p != 'A')
15169 {
15170 printf (_("Unknown attributes version '%c'(%d) - expecting 'A'\n"), *p, *p);
15171 res = FALSE;
15172 }
15173 else
15174 {
15175 bfd_vma section_len;
15176
15177 section_len = sect->sh_size - 1;
15178 p++;
15179
15180 while (section_len > 0)
15181 {
15182 bfd_vma attr_len;
15183 unsigned int namelen;
15184 bfd_boolean public_section;
15185 bfd_boolean gnu_section;
15186
15187 if (section_len <= 4)
15188 {
15189 error (_("Tag section ends prematurely\n"));
15190 res = FALSE;
15191 break;
15192 }
15193 attr_len = byte_get (p, 4);
15194 p += 4;
15195
15196 if (attr_len > section_len)
15197 {
15198 error (_("Bad attribute length (%u > %u)\n"),
15199 (unsigned) attr_len, (unsigned) section_len);
15200 attr_len = section_len;
15201 res = FALSE;
15202 }
15203 /* PR 17531: file: 001-101425-0.004 */
15204 else if (attr_len < 5)
15205 {
15206 error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
15207 res = FALSE;
15208 break;
15209 }
15210
15211 section_len -= attr_len;
15212 attr_len -= 4;
15213
15214 namelen = strnlen ((char *) p, attr_len) + 1;
15215 if (namelen == 0 || namelen >= attr_len)
15216 {
15217 error (_("Corrupt attribute section name\n"));
15218 res = FALSE;
15219 break;
15220 }
15221
15222 printf (_("Attribute Section: "));
15223 print_symbol (INT_MAX, (const char *) p);
15224 putchar ('\n');
15225
15226 if (public_name && streq ((char *) p, public_name))
15227 public_section = TRUE;
15228 else
15229 public_section = FALSE;
15230
15231 if (streq ((char *) p, "gnu"))
15232 gnu_section = TRUE;
15233 else
15234 gnu_section = FALSE;
15235
15236 p += namelen;
15237 attr_len -= namelen;
15238
15239 while (attr_len > 0 && p < contents + sect->sh_size)
15240 {
15241 int tag;
15242 int val;
15243 bfd_vma size;
15244 unsigned char * end;
15245
15246 /* PR binutils/17531: Safe handling of corrupt files. */
15247 if (attr_len < 6)
15248 {
15249 error (_("Unused bytes at end of section\n"));
15250 res = FALSE;
15251 section_len = 0;
15252 break;
15253 }
15254
15255 tag = *(p++);
15256 size = byte_get (p, 4);
15257 if (size > attr_len)
15258 {
15259 error (_("Bad subsection length (%u > %u)\n"),
15260 (unsigned) size, (unsigned) attr_len);
15261 res = FALSE;
15262 size = attr_len;
15263 }
15264 /* PR binutils/17531: Safe handling of corrupt files. */
15265 if (size < 6)
15266 {
15267 error (_("Bad subsection length (%u < 6)\n"),
15268 (unsigned) size);
15269 res = FALSE;
15270 section_len = 0;
15271 break;
15272 }
15273
15274 attr_len -= size;
15275 end = p + size - 1;
15276 assert (end <= contents + sect->sh_size);
15277 p += 4;
15278
15279 switch (tag)
15280 {
15281 case 1:
15282 printf (_("File Attributes\n"));
15283 break;
15284 case 2:
15285 printf (_("Section Attributes:"));
15286 goto do_numlist;
15287 case 3:
15288 printf (_("Symbol Attributes:"));
15289 /* Fall through. */
15290 do_numlist:
15291 for (;;)
15292 {
15293 unsigned int j;
15294
15295 val = read_uleb128 (p, &j, end);
15296 p += j;
15297 if (val == 0)
15298 break;
15299 printf (" %d", val);
15300 }
15301 printf ("\n");
15302 break;
15303 default:
15304 printf (_("Unknown tag: %d\n"), tag);
15305 public_section = FALSE;
15306 break;
15307 }
15308
15309 if (public_section && display_pub_attribute != NULL)
15310 {
15311 while (p < end)
15312 p = display_pub_attribute (p, end);
15313 assert (p == end);
15314 }
15315 else if (gnu_section && display_proc_gnu_attribute != NULL)
15316 {
15317 while (p < end)
15318 p = display_gnu_attribute (p,
15319 display_proc_gnu_attribute,
15320 end);
15321 assert (p == end);
15322 }
15323 else if (p < end)
15324 {
15325 printf (_(" Unknown attribute:\n"));
15326 display_raw_attribute (p, end);
15327 p = end;
15328 }
15329 else
15330 attr_len = 0;
15331 }
15332 }
15333 }
15334
15335 free (contents);
15336 }
15337
15338 return res;
15339 }
15340
15341 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
15342 Print the Address, Access and Initial fields of an entry at VMA ADDR
15343 and return the VMA of the next entry, or -1 if there was a problem.
15344 Does not read from DATA_END or beyond. */
15345
15346 static bfd_vma
15347 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
15348 unsigned char * data_end)
15349 {
15350 printf (" ");
15351 print_vma (addr, LONG_HEX);
15352 printf (" ");
15353 if (addr < pltgot + 0xfff0)
15354 printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
15355 else
15356 printf ("%10s", "");
15357 printf (" ");
15358 if (data == NULL)
15359 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
15360 else
15361 {
15362 bfd_vma entry;
15363 unsigned char * from = data + addr - pltgot;
15364
15365 if (from + (is_32bit_elf ? 4 : 8) > data_end)
15366 {
15367 warn (_("MIPS GOT entry extends beyond the end of available data\n"));
15368 printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
15369 return (bfd_vma) -1;
15370 }
15371 else
15372 {
15373 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
15374 print_vma (entry, LONG_HEX);
15375 }
15376 }
15377 return addr + (is_32bit_elf ? 4 : 8);
15378 }
15379
15380 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
15381 PLTGOT. Print the Address and Initial fields of an entry at VMA
15382 ADDR and return the VMA of the next entry. */
15383
15384 static bfd_vma
15385 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
15386 {
15387 printf (" ");
15388 print_vma (addr, LONG_HEX);
15389 printf (" ");
15390 if (data == NULL)
15391 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
15392 else
15393 {
15394 bfd_vma entry;
15395
15396 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
15397 print_vma (entry, LONG_HEX);
15398 }
15399 return addr + (is_32bit_elf ? 4 : 8);
15400 }
15401
15402 static void
15403 print_mips_ases (unsigned int mask)
15404 {
15405 if (mask & AFL_ASE_DSP)
15406 fputs ("\n\tDSP ASE", stdout);
15407 if (mask & AFL_ASE_DSPR2)
15408 fputs ("\n\tDSP R2 ASE", stdout);
15409 if (mask & AFL_ASE_DSPR3)
15410 fputs ("\n\tDSP R3 ASE", stdout);
15411 if (mask & AFL_ASE_EVA)
15412 fputs ("\n\tEnhanced VA Scheme", stdout);
15413 if (mask & AFL_ASE_MCU)
15414 fputs ("\n\tMCU (MicroController) ASE", stdout);
15415 if (mask & AFL_ASE_MDMX)
15416 fputs ("\n\tMDMX ASE", stdout);
15417 if (mask & AFL_ASE_MIPS3D)
15418 fputs ("\n\tMIPS-3D ASE", stdout);
15419 if (mask & AFL_ASE_MT)
15420 fputs ("\n\tMT ASE", stdout);
15421 if (mask & AFL_ASE_SMARTMIPS)
15422 fputs ("\n\tSmartMIPS ASE", stdout);
15423 if (mask & AFL_ASE_VIRT)
15424 fputs ("\n\tVZ ASE", stdout);
15425 if (mask & AFL_ASE_MSA)
15426 fputs ("\n\tMSA ASE", stdout);
15427 if (mask & AFL_ASE_MIPS16)
15428 fputs ("\n\tMIPS16 ASE", stdout);
15429 if (mask & AFL_ASE_MICROMIPS)
15430 fputs ("\n\tMICROMIPS ASE", stdout);
15431 if (mask & AFL_ASE_XPA)
15432 fputs ("\n\tXPA ASE", stdout);
15433 if (mask & AFL_ASE_MIPS16E2)
15434 fputs ("\n\tMIPS16e2 ASE", stdout);
15435 if (mask == 0)
15436 fprintf (stdout, "\n\t%s", _("None"));
15437 else if ((mask & ~AFL_ASE_MASK) != 0)
15438 fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
15439 }
15440
15441 static void
15442 print_mips_isa_ext (unsigned int isa_ext)
15443 {
15444 switch (isa_ext)
15445 {
15446 case 0:
15447 fputs (_("None"), stdout);
15448 break;
15449 case AFL_EXT_XLR:
15450 fputs ("RMI XLR", stdout);
15451 break;
15452 case AFL_EXT_OCTEON3:
15453 fputs ("Cavium Networks Octeon3", stdout);
15454 break;
15455 case AFL_EXT_OCTEON2:
15456 fputs ("Cavium Networks Octeon2", stdout);
15457 break;
15458 case AFL_EXT_OCTEONP:
15459 fputs ("Cavium Networks OcteonP", stdout);
15460 break;
15461 case AFL_EXT_LOONGSON_3A:
15462 fputs ("Loongson 3A", stdout);
15463 break;
15464 case AFL_EXT_OCTEON:
15465 fputs ("Cavium Networks Octeon", stdout);
15466 break;
15467 case AFL_EXT_5900:
15468 fputs ("Toshiba R5900", stdout);
15469 break;
15470 case AFL_EXT_4650:
15471 fputs ("MIPS R4650", stdout);
15472 break;
15473 case AFL_EXT_4010:
15474 fputs ("LSI R4010", stdout);
15475 break;
15476 case AFL_EXT_4100:
15477 fputs ("NEC VR4100", stdout);
15478 break;
15479 case AFL_EXT_3900:
15480 fputs ("Toshiba R3900", stdout);
15481 break;
15482 case AFL_EXT_10000:
15483 fputs ("MIPS R10000", stdout);
15484 break;
15485 case AFL_EXT_SB1:
15486 fputs ("Broadcom SB-1", stdout);
15487 break;
15488 case AFL_EXT_4111:
15489 fputs ("NEC VR4111/VR4181", stdout);
15490 break;
15491 case AFL_EXT_4120:
15492 fputs ("NEC VR4120", stdout);
15493 break;
15494 case AFL_EXT_5400:
15495 fputs ("NEC VR5400", stdout);
15496 break;
15497 case AFL_EXT_5500:
15498 fputs ("NEC VR5500", stdout);
15499 break;
15500 case AFL_EXT_LOONGSON_2E:
15501 fputs ("ST Microelectronics Loongson 2E", stdout);
15502 break;
15503 case AFL_EXT_LOONGSON_2F:
15504 fputs ("ST Microelectronics Loongson 2F", stdout);
15505 break;
15506 case AFL_EXT_INTERAPTIV_MR2:
15507 fputs ("Imagination interAptiv MR2", stdout);
15508 break;
15509 default:
15510 fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
15511 }
15512 }
15513
15514 static signed int
15515 get_mips_reg_size (int reg_size)
15516 {
15517 return (reg_size == AFL_REG_NONE) ? 0
15518 : (reg_size == AFL_REG_32) ? 32
15519 : (reg_size == AFL_REG_64) ? 64
15520 : (reg_size == AFL_REG_128) ? 128
15521 : -1;
15522 }
15523
15524 static bfd_boolean
15525 process_mips_specific (Filedata * filedata)
15526 {
15527 Elf_Internal_Dyn * entry;
15528 Elf_Internal_Shdr *sect = NULL;
15529 size_t liblist_offset = 0;
15530 size_t liblistno = 0;
15531 size_t conflictsno = 0;
15532 size_t options_offset = 0;
15533 size_t conflicts_offset = 0;
15534 size_t pltrelsz = 0;
15535 size_t pltrel = 0;
15536 bfd_vma pltgot = 0;
15537 bfd_vma mips_pltgot = 0;
15538 bfd_vma jmprel = 0;
15539 bfd_vma local_gotno = 0;
15540 bfd_vma gotsym = 0;
15541 bfd_vma symtabno = 0;
15542 bfd_boolean res = TRUE;
15543
15544 if (! process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
15545 display_mips_gnu_attribute))
15546 res = FALSE;
15547
15548 sect = find_section (filedata, ".MIPS.abiflags");
15549
15550 if (sect != NULL)
15551 {
15552 Elf_External_ABIFlags_v0 *abiflags_ext;
15553 Elf_Internal_ABIFlags_v0 abiflags_in;
15554
15555 if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
15556 {
15557 error (_("Corrupt MIPS ABI Flags section.\n"));
15558 res = FALSE;
15559 }
15560 else
15561 {
15562 abiflags_ext = get_data (NULL, filedata, sect->sh_offset, 1,
15563 sect->sh_size, _("MIPS ABI Flags section"));
15564 if (abiflags_ext)
15565 {
15566 abiflags_in.version = BYTE_GET (abiflags_ext->version);
15567 abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
15568 abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
15569 abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
15570 abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
15571 abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
15572 abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
15573 abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
15574 abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
15575 abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
15576 abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
15577
15578 printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
15579 printf ("\nISA: MIPS%d", abiflags_in.isa_level);
15580 if (abiflags_in.isa_rev > 1)
15581 printf ("r%d", abiflags_in.isa_rev);
15582 printf ("\nGPR size: %d",
15583 get_mips_reg_size (abiflags_in.gpr_size));
15584 printf ("\nCPR1 size: %d",
15585 get_mips_reg_size (abiflags_in.cpr1_size));
15586 printf ("\nCPR2 size: %d",
15587 get_mips_reg_size (abiflags_in.cpr2_size));
15588 fputs ("\nFP ABI: ", stdout);
15589 print_mips_fp_abi_value (abiflags_in.fp_abi);
15590 fputs ("ISA Extension: ", stdout);
15591 print_mips_isa_ext (abiflags_in.isa_ext);
15592 fputs ("\nASEs:", stdout);
15593 print_mips_ases (abiflags_in.ases);
15594 printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
15595 printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
15596 fputc ('\n', stdout);
15597 free (abiflags_ext);
15598 }
15599 }
15600 }
15601
15602 /* We have a lot of special sections. Thanks SGI! */
15603 if (dynamic_section == NULL)
15604 {
15605 /* No dynamic information available. See if there is static GOT. */
15606 sect = find_section (filedata, ".got");
15607 if (sect != NULL)
15608 {
15609 unsigned char *data_end;
15610 unsigned char *data;
15611 bfd_vma ent, end;
15612 int addr_size;
15613
15614 pltgot = sect->sh_addr;
15615
15616 ent = pltgot;
15617 addr_size = (is_32bit_elf ? 4 : 8);
15618 end = pltgot + sect->sh_size;
15619
15620 data = (unsigned char *) get_data (NULL, filedata, sect->sh_offset,
15621 end - pltgot, 1,
15622 _("Global Offset Table data"));
15623 /* PR 12855: Null data is handled gracefully throughout. */
15624 data_end = data + (end - pltgot);
15625
15626 printf (_("\nStatic GOT:\n"));
15627 printf (_(" Canonical gp value: "));
15628 print_vma (ent + 0x7ff0, LONG_HEX);
15629 printf ("\n\n");
15630
15631 /* In a dynamic binary GOT[0] is reserved for the dynamic
15632 loader to store the lazy resolver pointer, however in
15633 a static binary it may well have been omitted and GOT
15634 reduced to a table of addresses.
15635 PR 21344: Check for the entry being fully available
15636 before fetching it. */
15637 if (data
15638 && data + ent - pltgot + addr_size <= data_end
15639 && byte_get (data + ent - pltgot, addr_size) == 0)
15640 {
15641 printf (_(" Reserved entries:\n"));
15642 printf (_(" %*s %10s %*s\n"),
15643 addr_size * 2, _("Address"), _("Access"),
15644 addr_size * 2, _("Value"));
15645 ent = print_mips_got_entry (data, pltgot, ent, data_end);
15646 printf ("\n");
15647 if (ent == (bfd_vma) -1)
15648 goto sgot_print_fail;
15649
15650 /* Check for the MSB of GOT[1] being set, identifying a
15651 GNU object. This entry will be used by some runtime
15652 loaders, to store the module pointer. Otherwise this
15653 is an ordinary local entry.
15654 PR 21344: Check for the entry being fully available
15655 before fetching it. */
15656 if (data
15657 && data + ent - pltgot + addr_size <= data_end
15658 && (byte_get (data + ent - pltgot, addr_size)
15659 >> (addr_size * 8 - 1)) != 0)
15660 {
15661 ent = print_mips_got_entry (data, pltgot, ent, data_end);
15662 printf ("\n");
15663 if (ent == (bfd_vma) -1)
15664 goto sgot_print_fail;
15665 }
15666 printf ("\n");
15667 }
15668
15669 if (data != NULL && ent < end)
15670 {
15671 printf (_(" Local entries:\n"));
15672 printf (" %*s %10s %*s\n",
15673 addr_size * 2, _("Address"), _("Access"),
15674 addr_size * 2, _("Value"));
15675 while (ent < end)
15676 {
15677 ent = print_mips_got_entry (data, pltgot, ent, data_end);
15678 printf ("\n");
15679 if (ent == (bfd_vma) -1)
15680 goto sgot_print_fail;
15681 }
15682 printf ("\n");
15683 }
15684
15685 sgot_print_fail:
15686 if (data)
15687 free (data);
15688 }
15689 return res;
15690 }
15691
15692 for (entry = dynamic_section;
15693 /* PR 17531 file: 012-50589-0.004. */
15694 entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
15695 ++entry)
15696 switch (entry->d_tag)
15697 {
15698 case DT_MIPS_LIBLIST:
15699 liblist_offset
15700 = offset_from_vma (filedata, entry->d_un.d_val,
15701 liblistno * sizeof (Elf32_External_Lib));
15702 break;
15703 case DT_MIPS_LIBLISTNO:
15704 liblistno = entry->d_un.d_val;
15705 break;
15706 case DT_MIPS_OPTIONS:
15707 options_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
15708 break;
15709 case DT_MIPS_CONFLICT:
15710 conflicts_offset
15711 = offset_from_vma (filedata, entry->d_un.d_val,
15712 conflictsno * sizeof (Elf32_External_Conflict));
15713 break;
15714 case DT_MIPS_CONFLICTNO:
15715 conflictsno = entry->d_un.d_val;
15716 break;
15717 case DT_PLTGOT:
15718 pltgot = entry->d_un.d_ptr;
15719 break;
15720 case DT_MIPS_LOCAL_GOTNO:
15721 local_gotno = entry->d_un.d_val;
15722 break;
15723 case DT_MIPS_GOTSYM:
15724 gotsym = entry->d_un.d_val;
15725 break;
15726 case DT_MIPS_SYMTABNO:
15727 symtabno = entry->d_un.d_val;
15728 break;
15729 case DT_MIPS_PLTGOT:
15730 mips_pltgot = entry->d_un.d_ptr;
15731 break;
15732 case DT_PLTREL:
15733 pltrel = entry->d_un.d_val;
15734 break;
15735 case DT_PLTRELSZ:
15736 pltrelsz = entry->d_un.d_val;
15737 break;
15738 case DT_JMPREL:
15739 jmprel = entry->d_un.d_ptr;
15740 break;
15741 default:
15742 break;
15743 }
15744
15745 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
15746 {
15747 Elf32_External_Lib * elib;
15748 size_t cnt;
15749
15750 elib = (Elf32_External_Lib *) get_data (NULL, filedata, liblist_offset,
15751 liblistno,
15752 sizeof (Elf32_External_Lib),
15753 _("liblist section data"));
15754 if (elib)
15755 {
15756 printf (ngettext ("\nSection '.liblist' contains %lu entry:\n",
15757 "\nSection '.liblist' contains %lu entries:\n",
15758 (unsigned long) liblistno),
15759 (unsigned long) liblistno);
15760 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
15761 stdout);
15762
15763 for (cnt = 0; cnt < liblistno; ++cnt)
15764 {
15765 Elf32_Lib liblist;
15766 time_t atime;
15767 char timebuf[128];
15768 struct tm * tmp;
15769
15770 liblist.l_name = BYTE_GET (elib[cnt].l_name);
15771 atime = BYTE_GET (elib[cnt].l_time_stamp);
15772 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
15773 liblist.l_version = BYTE_GET (elib[cnt].l_version);
15774 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
15775
15776 tmp = gmtime (&atime);
15777 snprintf (timebuf, sizeof (timebuf),
15778 "%04u-%02u-%02uT%02u:%02u:%02u",
15779 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
15780 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
15781
15782 printf ("%3lu: ", (unsigned long) cnt);
15783 if (VALID_DYNAMIC_NAME (liblist.l_name))
15784 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
15785 else
15786 printf (_("<corrupt: %9ld>"), liblist.l_name);
15787 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
15788 liblist.l_version);
15789
15790 if (liblist.l_flags == 0)
15791 puts (_(" NONE"));
15792 else
15793 {
15794 static const struct
15795 {
15796 const char * name;
15797 int bit;
15798 }
15799 l_flags_vals[] =
15800 {
15801 { " EXACT_MATCH", LL_EXACT_MATCH },
15802 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
15803 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
15804 { " EXPORTS", LL_EXPORTS },
15805 { " DELAY_LOAD", LL_DELAY_LOAD },
15806 { " DELTA", LL_DELTA }
15807 };
15808 int flags = liblist.l_flags;
15809 size_t fcnt;
15810
15811 for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
15812 if ((flags & l_flags_vals[fcnt].bit) != 0)
15813 {
15814 fputs (l_flags_vals[fcnt].name, stdout);
15815 flags ^= l_flags_vals[fcnt].bit;
15816 }
15817 if (flags != 0)
15818 printf (" %#x", (unsigned int) flags);
15819
15820 puts ("");
15821 }
15822 }
15823
15824 free (elib);
15825 }
15826 else
15827 res = FALSE;
15828 }
15829
15830 if (options_offset != 0)
15831 {
15832 Elf_External_Options * eopt;
15833 Elf_Internal_Options * iopt;
15834 Elf_Internal_Options * option;
15835 size_t offset;
15836 int cnt;
15837 sect = filedata->section_headers;
15838
15839 /* Find the section header so that we get the size. */
15840 sect = find_section_by_type (filedata, SHT_MIPS_OPTIONS);
15841 /* PR 17533 file: 012-277276-0.004. */
15842 if (sect == NULL)
15843 {
15844 error (_("No MIPS_OPTIONS header found\n"));
15845 return FALSE;
15846 }
15847
15848 eopt = (Elf_External_Options *) get_data (NULL, filedata, options_offset, 1,
15849 sect->sh_size, _("options"));
15850 if (eopt)
15851 {
15852 iopt = (Elf_Internal_Options *)
15853 cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
15854 if (iopt == NULL)
15855 {
15856 error (_("Out of memory allocating space for MIPS options\n"));
15857 return FALSE;
15858 }
15859
15860 offset = cnt = 0;
15861 option = iopt;
15862
15863 while (offset <= sect->sh_size - sizeof (* eopt))
15864 {
15865 Elf_External_Options * eoption;
15866
15867 eoption = (Elf_External_Options *) ((char *) eopt + offset);
15868
15869 option->kind = BYTE_GET (eoption->kind);
15870 option->size = BYTE_GET (eoption->size);
15871 option->section = BYTE_GET (eoption->section);
15872 option->info = BYTE_GET (eoption->info);
15873
15874 /* PR 17531: file: ffa0fa3b. */
15875 if (option->size < sizeof (* eopt)
15876 || offset + option->size > sect->sh_size)
15877 {
15878 error (_("Invalid size (%u) for MIPS option\n"), option->size);
15879 return FALSE;
15880 }
15881 offset += option->size;
15882
15883 ++option;
15884 ++cnt;
15885 }
15886
15887 printf (ngettext ("\nSection '%s' contains %d entry:\n",
15888 "\nSection '%s' contains %d entries:\n",
15889 cnt),
15890 printable_section_name (filedata, sect), cnt);
15891
15892 option = iopt;
15893 offset = 0;
15894
15895 while (cnt-- > 0)
15896 {
15897 size_t len;
15898
15899 switch (option->kind)
15900 {
15901 case ODK_NULL:
15902 /* This shouldn't happen. */
15903 printf (" NULL %d %lx", option->section, option->info);
15904 break;
15905 case ODK_REGINFO:
15906 printf (" REGINFO ");
15907 if (filedata->file_header.e_machine == EM_MIPS)
15908 {
15909 /* 32bit form. */
15910 Elf32_External_RegInfo * ereg;
15911 Elf32_RegInfo reginfo;
15912
15913 ereg = (Elf32_External_RegInfo *) (option + 1);
15914 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
15915 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
15916 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
15917 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
15918 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
15919 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
15920
15921 printf ("GPR %08lx GP 0x%lx\n",
15922 reginfo.ri_gprmask,
15923 (unsigned long) reginfo.ri_gp_value);
15924 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
15925 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
15926 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
15927 }
15928 else
15929 {
15930 /* 64 bit form. */
15931 Elf64_External_RegInfo * ereg;
15932 Elf64_Internal_RegInfo reginfo;
15933
15934 ereg = (Elf64_External_RegInfo *) (option + 1);
15935 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
15936 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
15937 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
15938 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
15939 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
15940 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
15941
15942 printf ("GPR %08lx GP 0x",
15943 reginfo.ri_gprmask);
15944 printf_vma (reginfo.ri_gp_value);
15945 printf ("\n");
15946
15947 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
15948 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
15949 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
15950 }
15951 ++option;
15952 continue;
15953 case ODK_EXCEPTIONS:
15954 fputs (" EXCEPTIONS fpe_min(", stdout);
15955 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
15956 fputs (") fpe_max(", stdout);
15957 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
15958 fputs (")", stdout);
15959
15960 if (option->info & OEX_PAGE0)
15961 fputs (" PAGE0", stdout);
15962 if (option->info & OEX_SMM)
15963 fputs (" SMM", stdout);
15964 if (option->info & OEX_FPDBUG)
15965 fputs (" FPDBUG", stdout);
15966 if (option->info & OEX_DISMISS)
15967 fputs (" DISMISS", stdout);
15968 break;
15969 case ODK_PAD:
15970 fputs (" PAD ", stdout);
15971 if (option->info & OPAD_PREFIX)
15972 fputs (" PREFIX", stdout);
15973 if (option->info & OPAD_POSTFIX)
15974 fputs (" POSTFIX", stdout);
15975 if (option->info & OPAD_SYMBOL)
15976 fputs (" SYMBOL", stdout);
15977 break;
15978 case ODK_HWPATCH:
15979 fputs (" HWPATCH ", stdout);
15980 if (option->info & OHW_R4KEOP)
15981 fputs (" R4KEOP", stdout);
15982 if (option->info & OHW_R8KPFETCH)
15983 fputs (" R8KPFETCH", stdout);
15984 if (option->info & OHW_R5KEOP)
15985 fputs (" R5KEOP", stdout);
15986 if (option->info & OHW_R5KCVTL)
15987 fputs (" R5KCVTL", stdout);
15988 break;
15989 case ODK_FILL:
15990 fputs (" FILL ", stdout);
15991 /* XXX Print content of info word? */
15992 break;
15993 case ODK_TAGS:
15994 fputs (" TAGS ", stdout);
15995 /* XXX Print content of info word? */
15996 break;
15997 case ODK_HWAND:
15998 fputs (" HWAND ", stdout);
15999 if (option->info & OHWA0_R4KEOP_CHECKED)
16000 fputs (" R4KEOP_CHECKED", stdout);
16001 if (option->info & OHWA0_R4KEOP_CLEAN)
16002 fputs (" R4KEOP_CLEAN", stdout);
16003 break;
16004 case ODK_HWOR:
16005 fputs (" HWOR ", stdout);
16006 if (option->info & OHWA0_R4KEOP_CHECKED)
16007 fputs (" R4KEOP_CHECKED", stdout);
16008 if (option->info & OHWA0_R4KEOP_CLEAN)
16009 fputs (" R4KEOP_CLEAN", stdout);
16010 break;
16011 case ODK_GP_GROUP:
16012 printf (" GP_GROUP %#06lx self-contained %#06lx",
16013 option->info & OGP_GROUP,
16014 (option->info & OGP_SELF) >> 16);
16015 break;
16016 case ODK_IDENT:
16017 printf (" IDENT %#06lx self-contained %#06lx",
16018 option->info & OGP_GROUP,
16019 (option->info & OGP_SELF) >> 16);
16020 break;
16021 default:
16022 /* This shouldn't happen. */
16023 printf (" %3d ??? %d %lx",
16024 option->kind, option->section, option->info);
16025 break;
16026 }
16027
16028 len = sizeof (* eopt);
16029 while (len < option->size)
16030 {
16031 unsigned char datum = * ((unsigned char *) eopt + offset + len);
16032
16033 if (ISPRINT (datum))
16034 printf ("%c", datum);
16035 else
16036 printf ("\\%03o", datum);
16037 len ++;
16038 }
16039 fputs ("\n", stdout);
16040
16041 offset += option->size;
16042 ++option;
16043 }
16044
16045 free (eopt);
16046 }
16047 else
16048 res = FALSE;
16049 }
16050
16051 if (conflicts_offset != 0 && conflictsno != 0)
16052 {
16053 Elf32_Conflict * iconf;
16054 size_t cnt;
16055
16056 if (dynamic_symbols == NULL)
16057 {
16058 error (_("conflict list found without a dynamic symbol table\n"));
16059 return FALSE;
16060 }
16061
16062 /* PR 21345 - print a slightly more helpful error message
16063 if we are sure that the cmalloc will fail. */
16064 if (conflictsno * sizeof (* iconf) > filedata->file_size)
16065 {
16066 error (_("Overlarge number of conflicts detected: %lx\n"),
16067 (long) conflictsno);
16068 return FALSE;
16069 }
16070
16071 iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
16072 if (iconf == NULL)
16073 {
16074 error (_("Out of memory allocating space for dynamic conflicts\n"));
16075 return FALSE;
16076 }
16077
16078 if (is_32bit_elf)
16079 {
16080 Elf32_External_Conflict * econf32;
16081
16082 econf32 = (Elf32_External_Conflict *)
16083 get_data (NULL, filedata, conflicts_offset, conflictsno,
16084 sizeof (* econf32), _("conflict"));
16085 if (!econf32)
16086 return FALSE;
16087
16088 for (cnt = 0; cnt < conflictsno; ++cnt)
16089 iconf[cnt] = BYTE_GET (econf32[cnt]);
16090
16091 free (econf32);
16092 }
16093 else
16094 {
16095 Elf64_External_Conflict * econf64;
16096
16097 econf64 = (Elf64_External_Conflict *)
16098 get_data (NULL, filedata, conflicts_offset, conflictsno,
16099 sizeof (* econf64), _("conflict"));
16100 if (!econf64)
16101 return FALSE;
16102
16103 for (cnt = 0; cnt < conflictsno; ++cnt)
16104 iconf[cnt] = BYTE_GET (econf64[cnt]);
16105
16106 free (econf64);
16107 }
16108
16109 printf (ngettext ("\nSection '.conflict' contains %lu entry:\n",
16110 "\nSection '.conflict' contains %lu entries:\n",
16111 (unsigned long) conflictsno),
16112 (unsigned long) conflictsno);
16113 puts (_(" Num: Index Value Name"));
16114
16115 for (cnt = 0; cnt < conflictsno; ++cnt)
16116 {
16117 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
16118
16119 if (iconf[cnt] >= num_dynamic_syms)
16120 printf (_("<corrupt symbol index>"));
16121 else
16122 {
16123 Elf_Internal_Sym * psym;
16124
16125 psym = & dynamic_symbols[iconf[cnt]];
16126 print_vma (psym->st_value, FULL_HEX);
16127 putchar (' ');
16128 if (VALID_DYNAMIC_NAME (psym->st_name))
16129 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
16130 else
16131 printf (_("<corrupt: %14ld>"), psym->st_name);
16132 }
16133 putchar ('\n');
16134 }
16135
16136 free (iconf);
16137 }
16138
16139 if (pltgot != 0 && local_gotno != 0)
16140 {
16141 bfd_vma ent, local_end, global_end;
16142 size_t i, offset;
16143 unsigned char * data;
16144 unsigned char * data_end;
16145 int addr_size;
16146
16147 ent = pltgot;
16148 addr_size = (is_32bit_elf ? 4 : 8);
16149 local_end = pltgot + local_gotno * addr_size;
16150
16151 /* PR binutils/17533 file: 012-111227-0.004 */
16152 if (symtabno < gotsym)
16153 {
16154 error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
16155 (unsigned long) gotsym, (unsigned long) symtabno);
16156 return FALSE;
16157 }
16158
16159 global_end = local_end + (symtabno - gotsym) * addr_size;
16160 /* PR 17531: file: 54c91a34. */
16161 if (global_end < local_end)
16162 {
16163 error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
16164 return FALSE;
16165 }
16166
16167 offset = offset_from_vma (filedata, pltgot, global_end - pltgot);
16168 data = (unsigned char *) get_data (NULL, filedata, offset,
16169 global_end - pltgot, 1,
16170 _("Global Offset Table data"));
16171 /* PR 12855: Null data is handled gracefully throughout. */
16172 data_end = data + (global_end - pltgot);
16173
16174 printf (_("\nPrimary GOT:\n"));
16175 printf (_(" Canonical gp value: "));
16176 print_vma (pltgot + 0x7ff0, LONG_HEX);
16177 printf ("\n\n");
16178
16179 printf (_(" Reserved entries:\n"));
16180 printf (_(" %*s %10s %*s Purpose\n"),
16181 addr_size * 2, _("Address"), _("Access"),
16182 addr_size * 2, _("Initial"));
16183 ent = print_mips_got_entry (data, pltgot, ent, data_end);
16184 printf (_(" Lazy resolver\n"));
16185 if (ent == (bfd_vma) -1)
16186 goto got_print_fail;
16187
16188 /* Check for the MSB of GOT[1] being set, denoting a GNU object.
16189 This entry will be used by some runtime loaders, to store the
16190 module pointer. Otherwise this is an ordinary local entry.
16191 PR 21344: Check for the entry being fully available before
16192 fetching it. */
16193 if (data
16194 && data + ent - pltgot + addr_size <= data_end
16195 && (byte_get (data + ent - pltgot, addr_size)
16196 >> (addr_size * 8 - 1)) != 0)
16197 {
16198 ent = print_mips_got_entry (data, pltgot, ent, data_end);
16199 printf (_(" Module pointer (GNU extension)\n"));
16200 if (ent == (bfd_vma) -1)
16201 goto got_print_fail;
16202 }
16203 printf ("\n");
16204
16205 if (data != NULL && ent < local_end)
16206 {
16207 printf (_(" Local entries:\n"));
16208 printf (" %*s %10s %*s\n",
16209 addr_size * 2, _("Address"), _("Access"),
16210 addr_size * 2, _("Initial"));
16211 while (ent < local_end)
16212 {
16213 ent = print_mips_got_entry (data, pltgot, ent, data_end);
16214 printf ("\n");
16215 if (ent == (bfd_vma) -1)
16216 goto got_print_fail;
16217 }
16218 printf ("\n");
16219 }
16220
16221 if (data != NULL && gotsym < symtabno)
16222 {
16223 int sym_width;
16224
16225 printf (_(" Global entries:\n"));
16226 printf (" %*s %10s %*s %*s %-7s %3s %s\n",
16227 addr_size * 2, _("Address"),
16228 _("Access"),
16229 addr_size * 2, _("Initial"),
16230 addr_size * 2, _("Sym.Val."),
16231 _("Type"),
16232 /* Note for translators: "Ndx" = abbreviated form of "Index". */
16233 _("Ndx"), _("Name"));
16234
16235 sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
16236
16237 for (i = gotsym; i < symtabno; i++)
16238 {
16239 ent = print_mips_got_entry (data, pltgot, ent, data_end);
16240 printf (" ");
16241
16242 if (dynamic_symbols == NULL)
16243 printf (_("<no dynamic symbols>"));
16244 else if (i < num_dynamic_syms)
16245 {
16246 Elf_Internal_Sym * psym = dynamic_symbols + i;
16247
16248 print_vma (psym->st_value, LONG_HEX);
16249 printf (" %-7s %3s ",
16250 get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
16251 get_symbol_index_type (filedata, psym->st_shndx));
16252
16253 if (VALID_DYNAMIC_NAME (psym->st_name))
16254 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
16255 else
16256 printf (_("<corrupt: %14ld>"), psym->st_name);
16257 }
16258 else
16259 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
16260 (unsigned long) i);
16261
16262 printf ("\n");
16263 if (ent == (bfd_vma) -1)
16264 break;
16265 }
16266 printf ("\n");
16267 }
16268
16269 got_print_fail:
16270 if (data)
16271 free (data);
16272 }
16273
16274 if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
16275 {
16276 bfd_vma ent, end;
16277 size_t offset, rel_offset;
16278 unsigned long count, i;
16279 unsigned char * data;
16280 int addr_size, sym_width;
16281 Elf_Internal_Rela * rels;
16282
16283 rel_offset = offset_from_vma (filedata, jmprel, pltrelsz);
16284 if (pltrel == DT_RELA)
16285 {
16286 if (!slurp_rela_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
16287 return FALSE;
16288 }
16289 else
16290 {
16291 if (!slurp_rel_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
16292 return FALSE;
16293 }
16294
16295 ent = mips_pltgot;
16296 addr_size = (is_32bit_elf ? 4 : 8);
16297 end = mips_pltgot + (2 + count) * addr_size;
16298
16299 offset = offset_from_vma (filedata, mips_pltgot, end - mips_pltgot);
16300 data = (unsigned char *) get_data (NULL, filedata, offset, end - mips_pltgot,
16301 1, _("Procedure Linkage Table data"));
16302 if (data == NULL)
16303 return FALSE;
16304
16305 printf ("\nPLT GOT:\n\n");
16306 printf (_(" Reserved entries:\n"));
16307 printf (_(" %*s %*s Purpose\n"),
16308 addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
16309 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16310 printf (_(" PLT lazy resolver\n"));
16311 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16312 printf (_(" Module pointer\n"));
16313 printf ("\n");
16314
16315 printf (_(" Entries:\n"));
16316 printf (" %*s %*s %*s %-7s %3s %s\n",
16317 addr_size * 2, _("Address"),
16318 addr_size * 2, _("Initial"),
16319 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
16320 sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
16321 for (i = 0; i < count; i++)
16322 {
16323 unsigned long idx = get_reloc_symindex (rels[i].r_info);
16324
16325 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16326 printf (" ");
16327
16328 if (idx >= num_dynamic_syms)
16329 printf (_("<corrupt symbol index: %lu>"), idx);
16330 else
16331 {
16332 Elf_Internal_Sym * psym = dynamic_symbols + idx;
16333
16334 print_vma (psym->st_value, LONG_HEX);
16335 printf (" %-7s %3s ",
16336 get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
16337 get_symbol_index_type (filedata, psym->st_shndx));
16338 if (VALID_DYNAMIC_NAME (psym->st_name))
16339 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
16340 else
16341 printf (_("<corrupt: %14ld>"), psym->st_name);
16342 }
16343 printf ("\n");
16344 }
16345 printf ("\n");
16346
16347 if (data)
16348 free (data);
16349 free (rels);
16350 }
16351
16352 return res;
16353 }
16354
16355 static bfd_boolean
16356 process_nds32_specific (Filedata * filedata)
16357 {
16358 Elf_Internal_Shdr *sect = NULL;
16359
16360 sect = find_section (filedata, ".nds32_e_flags");
16361 if (sect != NULL)
16362 {
16363 unsigned int *flag;
16364
16365 printf ("\nNDS32 elf flags section:\n");
16366 flag = get_data (NULL, filedata, sect->sh_offset, 1,
16367 sect->sh_size, _("NDS32 elf flags section"));
16368
16369 if (! flag)
16370 return FALSE;
16371
16372 switch ((*flag) & 0x3)
16373 {
16374 case 0:
16375 printf ("(VEC_SIZE):\tNo entry.\n");
16376 break;
16377 case 1:
16378 printf ("(VEC_SIZE):\t4 bytes\n");
16379 break;
16380 case 2:
16381 printf ("(VEC_SIZE):\t16 bytes\n");
16382 break;
16383 case 3:
16384 printf ("(VEC_SIZE):\treserved\n");
16385 break;
16386 }
16387 }
16388
16389 return TRUE;
16390 }
16391
16392 static bfd_boolean
16393 process_gnu_liblist (Filedata * filedata)
16394 {
16395 Elf_Internal_Shdr * section;
16396 Elf_Internal_Shdr * string_sec;
16397 Elf32_External_Lib * elib;
16398 char * strtab;
16399 size_t strtab_size;
16400 size_t cnt;
16401 unsigned long num_liblist;
16402 unsigned i;
16403 bfd_boolean res = TRUE;
16404
16405 if (! do_arch)
16406 return TRUE;
16407
16408 for (i = 0, section = filedata->section_headers;
16409 i < filedata->file_header.e_shnum;
16410 i++, section++)
16411 {
16412 switch (section->sh_type)
16413 {
16414 case SHT_GNU_LIBLIST:
16415 if (section->sh_link >= filedata->file_header.e_shnum)
16416 break;
16417
16418 elib = (Elf32_External_Lib *)
16419 get_data (NULL, filedata, section->sh_offset, 1, section->sh_size,
16420 _("liblist section data"));
16421
16422 if (elib == NULL)
16423 {
16424 res = FALSE;
16425 break;
16426 }
16427
16428 string_sec = filedata->section_headers + section->sh_link;
16429 strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
16430 string_sec->sh_size,
16431 _("liblist string table"));
16432 if (strtab == NULL
16433 || section->sh_entsize != sizeof (Elf32_External_Lib))
16434 {
16435 free (elib);
16436 free (strtab);
16437 res = FALSE;
16438 break;
16439 }
16440 strtab_size = string_sec->sh_size;
16441
16442 num_liblist = section->sh_size / sizeof (Elf32_External_Lib);
16443 printf (ngettext ("\nLibrary list section '%s' contains %lu entries:\n",
16444 "\nLibrary list section '%s' contains %lu entries:\n",
16445 num_liblist),
16446 printable_section_name (filedata, section),
16447 num_liblist);
16448
16449 puts (_(" Library Time Stamp Checksum Version Flags"));
16450
16451 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
16452 ++cnt)
16453 {
16454 Elf32_Lib liblist;
16455 time_t atime;
16456 char timebuf[128];
16457 struct tm * tmp;
16458
16459 liblist.l_name = BYTE_GET (elib[cnt].l_name);
16460 atime = BYTE_GET (elib[cnt].l_time_stamp);
16461 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
16462 liblist.l_version = BYTE_GET (elib[cnt].l_version);
16463 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
16464
16465 tmp = gmtime (&atime);
16466 snprintf (timebuf, sizeof (timebuf),
16467 "%04u-%02u-%02uT%02u:%02u:%02u",
16468 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
16469 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
16470
16471 printf ("%3lu: ", (unsigned long) cnt);
16472 if (do_wide)
16473 printf ("%-20s", liblist.l_name < strtab_size
16474 ? strtab + liblist.l_name : _("<corrupt>"));
16475 else
16476 printf ("%-20.20s", liblist.l_name < strtab_size
16477 ? strtab + liblist.l_name : _("<corrupt>"));
16478 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
16479 liblist.l_version, liblist.l_flags);
16480 }
16481
16482 free (elib);
16483 free (strtab);
16484 }
16485 }
16486
16487 return res;
16488 }
16489
16490 static const char *
16491 get_note_type (Filedata * filedata, unsigned e_type)
16492 {
16493 static char buff[64];
16494
16495 if (filedata->file_header.e_type == ET_CORE)
16496 switch (e_type)
16497 {
16498 case NT_AUXV:
16499 return _("NT_AUXV (auxiliary vector)");
16500 case NT_PRSTATUS:
16501 return _("NT_PRSTATUS (prstatus structure)");
16502 case NT_FPREGSET:
16503 return _("NT_FPREGSET (floating point registers)");
16504 case NT_PRPSINFO:
16505 return _("NT_PRPSINFO (prpsinfo structure)");
16506 case NT_TASKSTRUCT:
16507 return _("NT_TASKSTRUCT (task structure)");
16508 case NT_PRXFPREG:
16509 return _("NT_PRXFPREG (user_xfpregs structure)");
16510 case NT_PPC_VMX:
16511 return _("NT_PPC_VMX (ppc Altivec registers)");
16512 case NT_PPC_VSX:
16513 return _("NT_PPC_VSX (ppc VSX registers)");
16514 case NT_PPC_TAR:
16515 return _("NT_PPC_TAR (ppc TAR register)");
16516 case NT_PPC_PPR:
16517 return _("NT_PPC_PPR (ppc PPR register)");
16518 case NT_PPC_DSCR:
16519 return _("NT_PPC_DSCR (ppc DSCR register)");
16520 case NT_PPC_EBB:
16521 return _("NT_PPC_EBB (ppc EBB registers)");
16522 case NT_PPC_PMU:
16523 return _("NT_PPC_PMU (ppc PMU registers)");
16524 case NT_PPC_TM_CGPR:
16525 return _("NT_PPC_TM_CGPR (ppc checkpointed GPR registers)");
16526 case NT_PPC_TM_CFPR:
16527 return _("NT_PPC_TM_CFPR (ppc checkpointed floating point registers)");
16528 case NT_PPC_TM_CVMX:
16529 return _("NT_PPC_TM_CVMX (ppc checkpointed Altivec registers)");
16530 case NT_PPC_TM_CVSX:
16531 return _("NT_PPC_TM_VSX (ppc checkpointed VSX registers)");
16532 case NT_PPC_TM_SPR:
16533 return _("NT_PPC_TM_SPR (ppc TM special purpose registers)");
16534 case NT_PPC_TM_CTAR:
16535 return _("NT_PPC_TM_CTAR (ppc checkpointed TAR register)");
16536 case NT_PPC_TM_CPPR:
16537 return _("NT_PPC_TM_CPPR (ppc checkpointed PPR register)");
16538 case NT_PPC_TM_CDSCR:
16539 return _("NT_PPC_TM_CDSCR (ppc checkpointed DSCR register)");
16540 case NT_386_TLS:
16541 return _("NT_386_TLS (x86 TLS information)");
16542 case NT_386_IOPERM:
16543 return _("NT_386_IOPERM (x86 I/O permissions)");
16544 case NT_X86_XSTATE:
16545 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
16546 case NT_S390_HIGH_GPRS:
16547 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
16548 case NT_S390_TIMER:
16549 return _("NT_S390_TIMER (s390 timer register)");
16550 case NT_S390_TODCMP:
16551 return _("NT_S390_TODCMP (s390 TOD comparator register)");
16552 case NT_S390_TODPREG:
16553 return _("NT_S390_TODPREG (s390 TOD programmable register)");
16554 case NT_S390_CTRS:
16555 return _("NT_S390_CTRS (s390 control registers)");
16556 case NT_S390_PREFIX:
16557 return _("NT_S390_PREFIX (s390 prefix register)");
16558 case NT_S390_LAST_BREAK:
16559 return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
16560 case NT_S390_SYSTEM_CALL:
16561 return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
16562 case NT_S390_TDB:
16563 return _("NT_S390_TDB (s390 transaction diagnostic block)");
16564 case NT_S390_VXRS_LOW:
16565 return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
16566 case NT_S390_VXRS_HIGH:
16567 return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
16568 case NT_S390_GS_CB:
16569 return _("NT_S390_GS_CB (s390 guarded-storage registers)");
16570 case NT_S390_GS_BC:
16571 return _("NT_S390_GS_BC (s390 guarded-storage broadcast control)");
16572 case NT_ARM_VFP:
16573 return _("NT_ARM_VFP (arm VFP registers)");
16574 case NT_ARM_TLS:
16575 return _("NT_ARM_TLS (AArch TLS registers)");
16576 case NT_ARM_HW_BREAK:
16577 return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
16578 case NT_ARM_HW_WATCH:
16579 return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
16580 case NT_PSTATUS:
16581 return _("NT_PSTATUS (pstatus structure)");
16582 case NT_FPREGS:
16583 return _("NT_FPREGS (floating point registers)");
16584 case NT_PSINFO:
16585 return _("NT_PSINFO (psinfo structure)");
16586 case NT_LWPSTATUS:
16587 return _("NT_LWPSTATUS (lwpstatus_t structure)");
16588 case NT_LWPSINFO:
16589 return _("NT_LWPSINFO (lwpsinfo_t structure)");
16590 case NT_WIN32PSTATUS:
16591 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
16592 case NT_SIGINFO:
16593 return _("NT_SIGINFO (siginfo_t data)");
16594 case NT_FILE:
16595 return _("NT_FILE (mapped files)");
16596 default:
16597 break;
16598 }
16599 else
16600 switch (e_type)
16601 {
16602 case NT_VERSION:
16603 return _("NT_VERSION (version)");
16604 case NT_ARCH:
16605 return _("NT_ARCH (architecture)");
16606 case NT_GNU_BUILD_ATTRIBUTE_OPEN:
16607 return _("OPEN");
16608 case NT_GNU_BUILD_ATTRIBUTE_FUNC:
16609 return _("func");
16610 default:
16611 break;
16612 }
16613
16614 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
16615 return buff;
16616 }
16617
16618 static bfd_boolean
16619 print_core_note (Elf_Internal_Note *pnote)
16620 {
16621 unsigned int addr_size = is_32bit_elf ? 4 : 8;
16622 bfd_vma count, page_size;
16623 unsigned char *descdata, *filenames, *descend;
16624
16625 if (pnote->type != NT_FILE)
16626 {
16627 if (do_wide)
16628 printf ("\n");
16629 return TRUE;
16630 }
16631
16632 #ifndef BFD64
16633 if (!is_32bit_elf)
16634 {
16635 printf (_(" Cannot decode 64-bit note in 32-bit build\n"));
16636 /* Still "successful". */
16637 return TRUE;
16638 }
16639 #endif
16640
16641 if (pnote->descsz < 2 * addr_size)
16642 {
16643 error (_(" Malformed note - too short for header\n"));
16644 return FALSE;
16645 }
16646
16647 descdata = (unsigned char *) pnote->descdata;
16648 descend = descdata + pnote->descsz;
16649
16650 if (descdata[pnote->descsz - 1] != '\0')
16651 {
16652 error (_(" Malformed note - does not end with \\0\n"));
16653 return FALSE;
16654 }
16655
16656 count = byte_get (descdata, addr_size);
16657 descdata += addr_size;
16658
16659 page_size = byte_get (descdata, addr_size);
16660 descdata += addr_size;
16661
16662 if (count > ((bfd_vma) -1 - 2 * addr_size) / (3 * addr_size)
16663 || pnote->descsz < 2 * addr_size + count * 3 * addr_size)
16664 {
16665 error (_(" Malformed note - too short for supplied file count\n"));
16666 return FALSE;
16667 }
16668
16669 printf (_(" Page size: "));
16670 print_vma (page_size, DEC);
16671 printf ("\n");
16672
16673 printf (_(" %*s%*s%*s\n"),
16674 (int) (2 + 2 * addr_size), _("Start"),
16675 (int) (4 + 2 * addr_size), _("End"),
16676 (int) (4 + 2 * addr_size), _("Page Offset"));
16677 filenames = descdata + count * 3 * addr_size;
16678 while (count-- > 0)
16679 {
16680 bfd_vma start, end, file_ofs;
16681
16682 if (filenames == descend)
16683 {
16684 error (_(" Malformed note - filenames end too early\n"));
16685 return FALSE;
16686 }
16687
16688 start = byte_get (descdata, addr_size);
16689 descdata += addr_size;
16690 end = byte_get (descdata, addr_size);
16691 descdata += addr_size;
16692 file_ofs = byte_get (descdata, addr_size);
16693 descdata += addr_size;
16694
16695 printf (" ");
16696 print_vma (start, FULL_HEX);
16697 printf (" ");
16698 print_vma (end, FULL_HEX);
16699 printf (" ");
16700 print_vma (file_ofs, FULL_HEX);
16701 printf ("\n %s\n", filenames);
16702
16703 filenames += 1 + strlen ((char *) filenames);
16704 }
16705
16706 return TRUE;
16707 }
16708
16709 static const char *
16710 get_gnu_elf_note_type (unsigned e_type)
16711 {
16712 /* NB/ Keep this switch statement in sync with print_gnu_note (). */
16713 switch (e_type)
16714 {
16715 case NT_GNU_ABI_TAG:
16716 return _("NT_GNU_ABI_TAG (ABI version tag)");
16717 case NT_GNU_HWCAP:
16718 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
16719 case NT_GNU_BUILD_ID:
16720 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
16721 case NT_GNU_GOLD_VERSION:
16722 return _("NT_GNU_GOLD_VERSION (gold version)");
16723 case NT_GNU_PROPERTY_TYPE_0:
16724 return _("NT_GNU_PROPERTY_TYPE_0");
16725 case NT_GNU_BUILD_ATTRIBUTE_OPEN:
16726 return _("NT_GNU_BUILD_ATTRIBUTE_OPEN");
16727 case NT_GNU_BUILD_ATTRIBUTE_FUNC:
16728 return _("NT_GNU_BUILD_ATTRIBUTE_FUNC");
16729 default:
16730 {
16731 static char buff[64];
16732
16733 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
16734 return buff;
16735 }
16736 }
16737 }
16738
16739 static void
16740 decode_x86_isa (unsigned int bitmask)
16741 {
16742 while (bitmask)
16743 {
16744 unsigned int bit = bitmask & (- bitmask);
16745
16746 bitmask &= ~ bit;
16747 switch (bit)
16748 {
16749 case GNU_PROPERTY_X86_ISA_1_486: printf ("i486"); break;
16750 case GNU_PROPERTY_X86_ISA_1_586: printf ("586"); break;
16751 case GNU_PROPERTY_X86_ISA_1_686: printf ("686"); break;
16752 case GNU_PROPERTY_X86_ISA_1_SSE: printf ("SSE"); break;
16753 case GNU_PROPERTY_X86_ISA_1_SSE2: printf ("SSE2"); break;
16754 case GNU_PROPERTY_X86_ISA_1_SSE3: printf ("SSE3"); break;
16755 case GNU_PROPERTY_X86_ISA_1_SSSE3: printf ("SSSE3"); break;
16756 case GNU_PROPERTY_X86_ISA_1_SSE4_1: printf ("SSE4_1"); break;
16757 case GNU_PROPERTY_X86_ISA_1_SSE4_2: printf ("SSE4_2"); break;
16758 case GNU_PROPERTY_X86_ISA_1_AVX: printf ("AVX"); break;
16759 case GNU_PROPERTY_X86_ISA_1_AVX2: printf ("AVX2"); break;
16760 case GNU_PROPERTY_X86_ISA_1_AVX512F: printf ("AVX512F"); break;
16761 case GNU_PROPERTY_X86_ISA_1_AVX512CD: printf ("AVX512CD"); break;
16762 case GNU_PROPERTY_X86_ISA_1_AVX512ER: printf ("AVX512ER"); break;
16763 case GNU_PROPERTY_X86_ISA_1_AVX512PF: printf ("AVX512PF"); break;
16764 case GNU_PROPERTY_X86_ISA_1_AVX512VL: printf ("AVX512VL"); break;
16765 case GNU_PROPERTY_X86_ISA_1_AVX512DQ: printf ("AVX512DQ"); break;
16766 case GNU_PROPERTY_X86_ISA_1_AVX512BW: printf ("AVX512BW"); break;
16767 default: printf (_("<unknown: %x>"), bit); break;
16768 }
16769 if (bitmask)
16770 printf (", ");
16771 }
16772 }
16773
16774 static void
16775 decode_x86_feature (unsigned int type, unsigned int bitmask)
16776 {
16777 while (bitmask)
16778 {
16779 unsigned int bit = bitmask & (- bitmask);
16780
16781 bitmask &= ~ bit;
16782 switch (bit)
16783 {
16784 case GNU_PROPERTY_X86_FEATURE_1_IBT:
16785 switch (type)
16786 {
16787 case GNU_PROPERTY_X86_FEATURE_1_AND:
16788 printf ("IBT");
16789 break;
16790 default:
16791 /* This should never happen. */
16792 abort ();
16793 }
16794 break;
16795 case GNU_PROPERTY_X86_FEATURE_1_SHSTK:
16796 switch (type)
16797 {
16798 case GNU_PROPERTY_X86_FEATURE_1_AND:
16799 printf ("SHSTK");
16800 break;
16801 default:
16802 /* This should never happen. */
16803 abort ();
16804 }
16805 break;
16806 default:
16807 printf (_("<unknown: %x>"), bit);
16808 break;
16809 }
16810 if (bitmask)
16811 printf (", ");
16812 }
16813 }
16814
16815 static void
16816 print_gnu_property_note (Filedata * filedata, Elf_Internal_Note * pnote)
16817 {
16818 unsigned char * ptr = (unsigned char *) pnote->descdata;
16819 unsigned char * ptr_end = ptr + pnote->descsz;
16820 unsigned int size = is_32bit_elf ? 4 : 8;
16821
16822 printf (_(" Properties: "));
16823
16824 if (pnote->descsz < 8 || (pnote->descsz % size) != 0)
16825 {
16826 printf (_("<corrupt GNU_PROPERTY_TYPE, size = %#lx>\n"), pnote->descsz);
16827 return;
16828 }
16829
16830 while (ptr < ptr_end)
16831 {
16832 unsigned int j;
16833 unsigned int type;
16834 unsigned int datasz;
16835
16836 if ((size_t) (ptr_end - ptr) < 8)
16837 {
16838 printf (_("<corrupt descsz: %#lx>\n"), pnote->descsz);
16839 break;
16840 }
16841
16842 type = byte_get (ptr, 4);
16843 datasz = byte_get (ptr + 4, 4);
16844
16845 ptr += 8;
16846
16847 if (datasz > (size_t) (ptr_end - ptr))
16848 {
16849 printf (_("<corrupt type (%#x) datasz: %#x>\n"),
16850 type, datasz);
16851 break;
16852 }
16853
16854 if (type >= GNU_PROPERTY_LOPROC && type <= GNU_PROPERTY_HIPROC)
16855 {
16856 if (filedata->file_header.e_machine == EM_X86_64
16857 || filedata->file_header.e_machine == EM_IAMCU
16858 || filedata->file_header.e_machine == EM_386)
16859 {
16860 switch (type)
16861 {
16862 case GNU_PROPERTY_X86_ISA_1_USED:
16863 printf ("x86 ISA used: ");
16864 if (datasz != 4)
16865 printf (_("<corrupt length: %#x> "), datasz);
16866 else
16867 decode_x86_isa (byte_get (ptr, 4));
16868 goto next;
16869
16870 case GNU_PROPERTY_X86_ISA_1_NEEDED:
16871 printf ("x86 ISA needed: ");
16872 if (datasz != 4)
16873 printf (_("<corrupt length: %#x> "), datasz);
16874 else
16875 decode_x86_isa (byte_get (ptr, 4));
16876 goto next;
16877
16878 case GNU_PROPERTY_X86_FEATURE_1_AND:
16879 printf ("x86 feature: ");
16880 if (datasz != 4)
16881 printf (_("<corrupt length: %#x> "), datasz);
16882 else
16883 decode_x86_feature (type, byte_get (ptr, 4));
16884 goto next;
16885
16886 default:
16887 break;
16888 }
16889 }
16890 }
16891 else
16892 {
16893 switch (type)
16894 {
16895 case GNU_PROPERTY_STACK_SIZE:
16896 printf (_("stack size: "));
16897 if (datasz != size)
16898 printf (_("<corrupt length: %#x> "), datasz);
16899 else
16900 printf ("%#lx", (unsigned long) byte_get (ptr, size));
16901 goto next;
16902
16903 case GNU_PROPERTY_NO_COPY_ON_PROTECTED:
16904 printf ("no copy on protected ");
16905 if (datasz)
16906 printf (_("<corrupt length: %#x> "), datasz);
16907 goto next;
16908
16909 default:
16910 break;
16911 }
16912 }
16913
16914 if (type < GNU_PROPERTY_LOPROC)
16915 printf (_("<unknown type %#x data: "), type);
16916 else if (type < GNU_PROPERTY_LOUSER)
16917 printf (_("<procesor-specific type %#x data: "), type);
16918 else
16919 printf (_("<application-specific type %#x data: "), type);
16920 for (j = 0; j < datasz; ++j)
16921 printf ("%02x ", ptr[j] & 0xff);
16922 printf (">");
16923
16924 next:
16925 ptr += ((datasz + (size - 1)) & ~ (size - 1));
16926 if (ptr == ptr_end)
16927 break;
16928
16929 if (do_wide)
16930 printf (", ");
16931 else
16932 printf ("\n\t");
16933 }
16934
16935 printf ("\n");
16936 }
16937
16938 static bfd_boolean
16939 print_gnu_note (Filedata * filedata, Elf_Internal_Note *pnote)
16940 {
16941 /* NB/ Keep this switch statement in sync with get_gnu_elf_note_type (). */
16942 switch (pnote->type)
16943 {
16944 case NT_GNU_BUILD_ID:
16945 {
16946 unsigned long i;
16947
16948 printf (_(" Build ID: "));
16949 for (i = 0; i < pnote->descsz; ++i)
16950 printf ("%02x", pnote->descdata[i] & 0xff);
16951 printf ("\n");
16952 }
16953 break;
16954
16955 case NT_GNU_ABI_TAG:
16956 {
16957 unsigned long os, major, minor, subminor;
16958 const char *osname;
16959
16960 /* PR 17531: file: 030-599401-0.004. */
16961 if (pnote->descsz < 16)
16962 {
16963 printf (_(" <corrupt GNU_ABI_TAG>\n"));
16964 break;
16965 }
16966
16967 os = byte_get ((unsigned char *) pnote->descdata, 4);
16968 major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
16969 minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
16970 subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
16971
16972 switch (os)
16973 {
16974 case GNU_ABI_TAG_LINUX:
16975 osname = "Linux";
16976 break;
16977 case GNU_ABI_TAG_HURD:
16978 osname = "Hurd";
16979 break;
16980 case GNU_ABI_TAG_SOLARIS:
16981 osname = "Solaris";
16982 break;
16983 case GNU_ABI_TAG_FREEBSD:
16984 osname = "FreeBSD";
16985 break;
16986 case GNU_ABI_TAG_NETBSD:
16987 osname = "NetBSD";
16988 break;
16989 case GNU_ABI_TAG_SYLLABLE:
16990 osname = "Syllable";
16991 break;
16992 case GNU_ABI_TAG_NACL:
16993 osname = "NaCl";
16994 break;
16995 default:
16996 osname = "Unknown";
16997 break;
16998 }
16999
17000 printf (_(" OS: %s, ABI: %ld.%ld.%ld\n"), osname,
17001 major, minor, subminor);
17002 }
17003 break;
17004
17005 case NT_GNU_GOLD_VERSION:
17006 {
17007 unsigned long i;
17008
17009 printf (_(" Version: "));
17010 for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
17011 printf ("%c", pnote->descdata[i]);
17012 printf ("\n");
17013 }
17014 break;
17015
17016 case NT_GNU_HWCAP:
17017 {
17018 unsigned long num_entries, mask;
17019
17020 /* Hardware capabilities information. Word 0 is the number of entries.
17021 Word 1 is a bitmask of enabled entries. The rest of the descriptor
17022 is a series of entries, where each entry is a single byte followed
17023 by a nul terminated string. The byte gives the bit number to test
17024 if enabled in the bitmask. */
17025 printf (_(" Hardware Capabilities: "));
17026 if (pnote->descsz < 8)
17027 {
17028 error (_("<corrupt GNU_HWCAP>\n"));
17029 return FALSE;
17030 }
17031 num_entries = byte_get ((unsigned char *) pnote->descdata, 4);
17032 mask = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17033 printf (_("num entries: %ld, enabled mask: %lx\n"), num_entries, mask);
17034 /* FIXME: Add code to display the entries... */
17035 }
17036 break;
17037
17038 case NT_GNU_PROPERTY_TYPE_0:
17039 print_gnu_property_note (filedata, pnote);
17040 break;
17041
17042 default:
17043 /* Handle unrecognised types. An error message should have already been
17044 created by get_gnu_elf_note_type(), so all that we need to do is to
17045 display the data. */
17046 {
17047 unsigned long i;
17048
17049 printf (_(" Description data: "));
17050 for (i = 0; i < pnote->descsz; ++i)
17051 printf ("%02x ", pnote->descdata[i] & 0xff);
17052 printf ("\n");
17053 }
17054 break;
17055 }
17056
17057 return TRUE;
17058 }
17059
17060 static const char *
17061 get_v850_elf_note_type (enum v850_notes n_type)
17062 {
17063 static char buff[64];
17064
17065 switch (n_type)
17066 {
17067 case V850_NOTE_ALIGNMENT: return _("Alignment of 8-byte objects");
17068 case V850_NOTE_DATA_SIZE: return _("Sizeof double and long double");
17069 case V850_NOTE_FPU_INFO: return _("Type of FPU support needed");
17070 case V850_NOTE_SIMD_INFO: return _("Use of SIMD instructions");
17071 case V850_NOTE_CACHE_INFO: return _("Use of cache");
17072 case V850_NOTE_MMU_INFO: return _("Use of MMU");
17073 default:
17074 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
17075 return buff;
17076 }
17077 }
17078
17079 static bfd_boolean
17080 print_v850_note (Elf_Internal_Note * pnote)
17081 {
17082 unsigned int val;
17083
17084 if (pnote->descsz != 4)
17085 return FALSE;
17086
17087 val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
17088
17089 if (val == 0)
17090 {
17091 printf (_("not set\n"));
17092 return TRUE;
17093 }
17094
17095 switch (pnote->type)
17096 {
17097 case V850_NOTE_ALIGNMENT:
17098 switch (val)
17099 {
17100 case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return TRUE;
17101 case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return TRUE;
17102 }
17103 break;
17104
17105 case V850_NOTE_DATA_SIZE:
17106 switch (val)
17107 {
17108 case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return TRUE;
17109 case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return TRUE;
17110 }
17111 break;
17112
17113 case V850_NOTE_FPU_INFO:
17114 switch (val)
17115 {
17116 case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return TRUE;
17117 case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return TRUE;
17118 }
17119 break;
17120
17121 case V850_NOTE_MMU_INFO:
17122 case V850_NOTE_CACHE_INFO:
17123 case V850_NOTE_SIMD_INFO:
17124 if (val == EF_RH850_SIMD)
17125 {
17126 printf (_("yes\n"));
17127 return TRUE;
17128 }
17129 break;
17130
17131 default:
17132 /* An 'unknown note type' message will already have been displayed. */
17133 break;
17134 }
17135
17136 printf (_("unknown value: %x\n"), val);
17137 return FALSE;
17138 }
17139
17140 static bfd_boolean
17141 process_netbsd_elf_note (Elf_Internal_Note * pnote)
17142 {
17143 unsigned int version;
17144
17145 switch (pnote->type)
17146 {
17147 case NT_NETBSD_IDENT:
17148 version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
17149 if ((version / 10000) % 100)
17150 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
17151 version, version / 100000000, (version / 1000000) % 100,
17152 (version / 10000) % 100 > 26 ? "Z" : "",
17153 'A' + (version / 10000) % 26);
17154 else
17155 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
17156 version, version / 100000000, (version / 1000000) % 100,
17157 (version / 100) % 100);
17158 return TRUE;
17159
17160 case NT_NETBSD_MARCH:
17161 printf (" NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
17162 pnote->descdata);
17163 return TRUE;
17164
17165 default:
17166 printf (" NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
17167 pnote->type);
17168 return FALSE;
17169 }
17170 }
17171
17172 static const char *
17173 get_freebsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
17174 {
17175 switch (e_type)
17176 {
17177 case NT_FREEBSD_THRMISC:
17178 return _("NT_THRMISC (thrmisc structure)");
17179 case NT_FREEBSD_PROCSTAT_PROC:
17180 return _("NT_PROCSTAT_PROC (proc data)");
17181 case NT_FREEBSD_PROCSTAT_FILES:
17182 return _("NT_PROCSTAT_FILES (files data)");
17183 case NT_FREEBSD_PROCSTAT_VMMAP:
17184 return _("NT_PROCSTAT_VMMAP (vmmap data)");
17185 case NT_FREEBSD_PROCSTAT_GROUPS:
17186 return _("NT_PROCSTAT_GROUPS (groups data)");
17187 case NT_FREEBSD_PROCSTAT_UMASK:
17188 return _("NT_PROCSTAT_UMASK (umask data)");
17189 case NT_FREEBSD_PROCSTAT_RLIMIT:
17190 return _("NT_PROCSTAT_RLIMIT (rlimit data)");
17191 case NT_FREEBSD_PROCSTAT_OSREL:
17192 return _("NT_PROCSTAT_OSREL (osreldate data)");
17193 case NT_FREEBSD_PROCSTAT_PSSTRINGS:
17194 return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
17195 case NT_FREEBSD_PROCSTAT_AUXV:
17196 return _("NT_PROCSTAT_AUXV (auxv data)");
17197 case NT_FREEBSD_PTLWPINFO:
17198 return _("NT_PTLWPINFO (ptrace_lwpinfo structure)");
17199 }
17200 return get_note_type (filedata, e_type);
17201 }
17202
17203 static const char *
17204 get_netbsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
17205 {
17206 static char buff[64];
17207
17208 if (e_type == NT_NETBSDCORE_PROCINFO)
17209 return _("NetBSD procinfo structure");
17210
17211 /* As of Jan 2002 there are no other machine-independent notes
17212 defined for NetBSD core files. If the note type is less
17213 than the start of the machine-dependent note types, we don't
17214 understand it. */
17215
17216 if (e_type < NT_NETBSDCORE_FIRSTMACH)
17217 {
17218 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17219 return buff;
17220 }
17221
17222 switch (filedata->file_header.e_machine)
17223 {
17224 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
17225 and PT_GETFPREGS == mach+2. */
17226
17227 case EM_OLD_ALPHA:
17228 case EM_ALPHA:
17229 case EM_SPARC:
17230 case EM_SPARC32PLUS:
17231 case EM_SPARCV9:
17232 switch (e_type)
17233 {
17234 case NT_NETBSDCORE_FIRSTMACH + 0:
17235 return _("PT_GETREGS (reg structure)");
17236 case NT_NETBSDCORE_FIRSTMACH + 2:
17237 return _("PT_GETFPREGS (fpreg structure)");
17238 default:
17239 break;
17240 }
17241 break;
17242
17243 /* On all other arch's, PT_GETREGS == mach+1 and
17244 PT_GETFPREGS == mach+3. */
17245 default:
17246 switch (e_type)
17247 {
17248 case NT_NETBSDCORE_FIRSTMACH + 1:
17249 return _("PT_GETREGS (reg structure)");
17250 case NT_NETBSDCORE_FIRSTMACH + 3:
17251 return _("PT_GETFPREGS (fpreg structure)");
17252 default:
17253 break;
17254 }
17255 }
17256
17257 snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
17258 e_type - NT_NETBSDCORE_FIRSTMACH);
17259 return buff;
17260 }
17261
17262 static const char *
17263 get_stapsdt_note_type (unsigned e_type)
17264 {
17265 static char buff[64];
17266
17267 switch (e_type)
17268 {
17269 case NT_STAPSDT:
17270 return _("NT_STAPSDT (SystemTap probe descriptors)");
17271
17272 default:
17273 break;
17274 }
17275
17276 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17277 return buff;
17278 }
17279
17280 static bfd_boolean
17281 print_stapsdt_note (Elf_Internal_Note *pnote)
17282 {
17283 int addr_size = is_32bit_elf ? 4 : 8;
17284 char *data = pnote->descdata;
17285 char *data_end = pnote->descdata + pnote->descsz;
17286 bfd_vma pc, base_addr, semaphore;
17287 char *provider, *probe, *arg_fmt;
17288
17289 pc = byte_get ((unsigned char *) data, addr_size);
17290 data += addr_size;
17291 base_addr = byte_get ((unsigned char *) data, addr_size);
17292 data += addr_size;
17293 semaphore = byte_get ((unsigned char *) data, addr_size);
17294 data += addr_size;
17295
17296 provider = data;
17297 data += strlen (data) + 1;
17298 probe = data;
17299 data += strlen (data) + 1;
17300 arg_fmt = data;
17301 data += strlen (data) + 1;
17302
17303 printf (_(" Provider: %s\n"), provider);
17304 printf (_(" Name: %s\n"), probe);
17305 printf (_(" Location: "));
17306 print_vma (pc, FULL_HEX);
17307 printf (_(", Base: "));
17308 print_vma (base_addr, FULL_HEX);
17309 printf (_(", Semaphore: "));
17310 print_vma (semaphore, FULL_HEX);
17311 printf ("\n");
17312 printf (_(" Arguments: %s\n"), arg_fmt);
17313
17314 return data == data_end;
17315 }
17316
17317 static const char *
17318 get_ia64_vms_note_type (unsigned e_type)
17319 {
17320 static char buff[64];
17321
17322 switch (e_type)
17323 {
17324 case NT_VMS_MHD:
17325 return _("NT_VMS_MHD (module header)");
17326 case NT_VMS_LNM:
17327 return _("NT_VMS_LNM (language name)");
17328 case NT_VMS_SRC:
17329 return _("NT_VMS_SRC (source files)");
17330 case NT_VMS_TITLE:
17331 return "NT_VMS_TITLE";
17332 case NT_VMS_EIDC:
17333 return _("NT_VMS_EIDC (consistency check)");
17334 case NT_VMS_FPMODE:
17335 return _("NT_VMS_FPMODE (FP mode)");
17336 case NT_VMS_LINKTIME:
17337 return "NT_VMS_LINKTIME";
17338 case NT_VMS_IMGNAM:
17339 return _("NT_VMS_IMGNAM (image name)");
17340 case NT_VMS_IMGID:
17341 return _("NT_VMS_IMGID (image id)");
17342 case NT_VMS_LINKID:
17343 return _("NT_VMS_LINKID (link id)");
17344 case NT_VMS_IMGBID:
17345 return _("NT_VMS_IMGBID (build id)");
17346 case NT_VMS_GSTNAM:
17347 return _("NT_VMS_GSTNAM (sym table name)");
17348 case NT_VMS_ORIG_DYN:
17349 return "NT_VMS_ORIG_DYN";
17350 case NT_VMS_PATCHTIME:
17351 return "NT_VMS_PATCHTIME";
17352 default:
17353 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17354 return buff;
17355 }
17356 }
17357
17358 static bfd_boolean
17359 print_ia64_vms_note (Elf_Internal_Note * pnote)
17360 {
17361 switch (pnote->type)
17362 {
17363 case NT_VMS_MHD:
17364 if (pnote->descsz > 36)
17365 {
17366 size_t l = strlen (pnote->descdata + 34);
17367 printf (_(" Creation date : %.17s\n"), pnote->descdata);
17368 printf (_(" Last patch date: %.17s\n"), pnote->descdata + 17);
17369 printf (_(" Module name : %s\n"), pnote->descdata + 34);
17370 printf (_(" Module version : %s\n"), pnote->descdata + 34 + l + 1);
17371 }
17372 else
17373 printf (_(" Invalid size\n"));
17374 break;
17375 case NT_VMS_LNM:
17376 printf (_(" Language: %s\n"), pnote->descdata);
17377 break;
17378 #ifdef BFD64
17379 case NT_VMS_FPMODE:
17380 printf (_(" Floating Point mode: "));
17381 printf ("0x%016" BFD_VMA_FMT "x\n",
17382 (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
17383 break;
17384 case NT_VMS_LINKTIME:
17385 printf (_(" Link time: "));
17386 print_vms_time
17387 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
17388 printf ("\n");
17389 break;
17390 case NT_VMS_PATCHTIME:
17391 printf (_(" Patch time: "));
17392 print_vms_time
17393 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
17394 printf ("\n");
17395 break;
17396 case NT_VMS_ORIG_DYN:
17397 printf (_(" Major id: %u, minor id: %u\n"),
17398 (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
17399 (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
17400 printf (_(" Last modified : "));
17401 print_vms_time
17402 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
17403 printf (_("\n Link flags : "));
17404 printf ("0x%016" BFD_VMA_FMT "x\n",
17405 (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
17406 printf (_(" Header flags: 0x%08x\n"),
17407 (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
17408 printf (_(" Image id : %s\n"), pnote->descdata + 32);
17409 break;
17410 #endif
17411 case NT_VMS_IMGNAM:
17412 printf (_(" Image name: %s\n"), pnote->descdata);
17413 break;
17414 case NT_VMS_GSTNAM:
17415 printf (_(" Global symbol table name: %s\n"), pnote->descdata);
17416 break;
17417 case NT_VMS_IMGID:
17418 printf (_(" Image id: %s\n"), pnote->descdata);
17419 break;
17420 case NT_VMS_LINKID:
17421 printf (_(" Linker id: %s\n"), pnote->descdata);
17422 break;
17423 default:
17424 return FALSE;
17425 }
17426 return TRUE;
17427 }
17428
17429 /* Find the symbol associated with a build attribute that is attached
17430 to address OFFSET. If PNAME is non-NULL then store the name of
17431 the symbol (if found) in the provided pointer, Returns NULL if a
17432 symbol could not be found. */
17433
17434 static Elf_Internal_Sym *
17435 get_symbol_for_build_attribute (Filedata * filedata,
17436 unsigned long offset,
17437 bfd_boolean is_open_attr,
17438 const char ** pname)
17439 {
17440 static Filedata * saved_filedata = NULL;
17441 static char * strtab;
17442 static unsigned long strtablen;
17443 static Elf_Internal_Sym * symtab;
17444 static unsigned long nsyms;
17445 Elf_Internal_Sym * saved_sym = NULL;
17446 Elf_Internal_Sym * sym;
17447
17448 if (filedata->section_headers != NULL
17449 && (saved_filedata == NULL || filedata != saved_filedata))
17450 {
17451 Elf_Internal_Shdr * symsec;
17452
17453 /* Load the symbol and string sections. */
17454 for (symsec = filedata->section_headers;
17455 symsec < filedata->section_headers + filedata->file_header.e_shnum;
17456 symsec ++)
17457 {
17458 if (symsec->sh_type == SHT_SYMTAB)
17459 {
17460 symtab = GET_ELF_SYMBOLS (filedata, symsec, & nsyms);
17461
17462 if (symsec->sh_link < filedata->file_header.e_shnum)
17463 {
17464 Elf_Internal_Shdr * strtab_sec = filedata->section_headers + symsec->sh_link;
17465
17466 strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
17467 1, strtab_sec->sh_size,
17468 _("string table"));
17469 strtablen = strtab != NULL ? strtab_sec->sh_size : 0;
17470 }
17471 }
17472 }
17473 saved_filedata = filedata;
17474 }
17475
17476 if (symtab == NULL || strtab == NULL)
17477 return NULL;
17478
17479 /* Find a symbol whose value matches offset. */
17480 for (sym = symtab; sym < symtab + nsyms; sym ++)
17481 if (sym->st_value == offset)
17482 {
17483 if (sym->st_name >= strtablen)
17484 /* Huh ? This should not happen. */
17485 continue;
17486
17487 if (strtab[sym->st_name] == 0)
17488 continue;
17489
17490 if (is_open_attr)
17491 {
17492 /* For OPEN attributes we prefer GLOBAL over LOCAL symbols
17493 and FILE or OBJECT symbols over NOTYPE symbols. We skip
17494 FUNC symbols entirely. */
17495 switch (ELF_ST_TYPE (sym->st_info))
17496 {
17497 case STT_OBJECT:
17498 case STT_FILE:
17499 saved_sym = sym;
17500 if (sym->st_size)
17501 {
17502 /* If the symbol has a size associated
17503 with it then we can stop searching. */
17504 sym = symtab + nsyms;
17505 }
17506 continue;
17507
17508 case STT_FUNC:
17509 /* Ignore function symbols. */
17510 continue;
17511
17512 default:
17513 break;
17514 }
17515
17516 switch (ELF_ST_BIND (sym->st_info))
17517 {
17518 case STB_GLOBAL:
17519 if (saved_sym == NULL
17520 || ELF_ST_TYPE (saved_sym->st_info) != STT_OBJECT)
17521 saved_sym = sym;
17522 break;
17523
17524 case STB_LOCAL:
17525 if (saved_sym == NULL)
17526 saved_sym = sym;
17527 break;
17528
17529 default:
17530 break;
17531 }
17532 }
17533 else
17534 {
17535 if (ELF_ST_TYPE (sym->st_info) != STT_FUNC)
17536 continue;
17537
17538 saved_sym = sym;
17539 break;
17540 }
17541 }
17542
17543 if (saved_sym && pname)
17544 * pname = strtab + saved_sym->st_name;
17545
17546 return saved_sym;
17547 }
17548
17549 static bfd_boolean
17550 print_gnu_build_attribute_description (Elf_Internal_Note * pnote,
17551 Filedata * filedata)
17552 {
17553 static unsigned long global_offset = 0;
17554 static unsigned long global_end = 0;
17555 static unsigned long func_offset = 0;
17556 static unsigned long func_end = 0;
17557
17558 Elf_Internal_Sym * sym;
17559 const char * name;
17560 unsigned long start;
17561 unsigned long end;
17562 bfd_boolean is_open_attr = pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN;
17563
17564 switch (pnote->descsz)
17565 {
17566 case 0:
17567 /* A zero-length description means that the range of
17568 the previous note of the same type should be used. */
17569 if (is_open_attr)
17570 {
17571 if (global_end > global_offset)
17572 printf (_(" Applies to region from %#lx to %#lx\n"),
17573 global_offset, global_end);
17574 else
17575 printf (_(" Applies to region from %#lx\n"), global_offset);
17576 }
17577 else
17578 {
17579 if (func_end > func_offset)
17580 printf (_(" Applies to region from %#lx to %#lx\n"), func_offset, func_end);
17581 else
17582 printf (_(" Applies to region from %#lx\n"), func_offset);
17583 }
17584 return TRUE;
17585
17586 case 4:
17587 start = byte_get ((unsigned char *) pnote->descdata, 4);
17588 end = 0;
17589 break;
17590
17591 case 8:
17592 if (is_32bit_elf)
17593 {
17594 /* FIXME: We should check that version 3+ notes are being used here... */
17595 start = byte_get ((unsigned char *) pnote->descdata, 4);
17596 end = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17597 }
17598 else
17599 {
17600 start = byte_get ((unsigned char *) pnote->descdata, 8);
17601 end = 0;
17602 }
17603 break;
17604
17605 case 16:
17606 start = byte_get ((unsigned char *) pnote->descdata, 8);
17607 end = byte_get ((unsigned char *) pnote->descdata + 8, 8);
17608 break;
17609
17610 default:
17611 error (_(" <invalid description size: %lx>\n"), pnote->descsz);
17612 printf (_(" <invalid descsz>"));
17613 return FALSE;
17614 }
17615
17616 name = NULL;
17617 sym = get_symbol_for_build_attribute (filedata, start, is_open_attr, & name);
17618
17619 if (end == 0 && sym != NULL && sym->st_size > 0)
17620 end = start + sym->st_size;
17621
17622 if (is_open_attr)
17623 {
17624 /* FIXME: Need to properly allow for section alignment. 16 is just the alignment used on x86_64. */
17625 if (global_end > 0 && start > BFD_ALIGN (global_end, 16))
17626 warn (_("Gap in build notes detected from %#lx to %#lx\n"),
17627 global_end + 1, start - 1);
17628
17629 printf (_(" Applies to region from %#lx"), start);
17630 global_offset = start;
17631
17632 if (end)
17633 {
17634 printf (_(" to %#lx"), end);
17635 global_end = end;
17636 }
17637 }
17638 else
17639 {
17640 printf (_(" Applies to region from %#lx"), start);
17641 func_offset = start;
17642
17643 if (end)
17644 {
17645 printf (_(" to %#lx"), end);
17646 func_end = end;
17647 }
17648 }
17649
17650 if (sym && name)
17651 printf (_(" (%s)"), name);
17652
17653 printf ("\n");
17654 return TRUE;
17655 }
17656
17657 static bfd_boolean
17658 print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
17659 {
17660 static const char string_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_STRING, 0 };
17661 static const char number_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC, 0 };
17662 static const char bool_expected [3] = { GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE, GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE, 0 };
17663 char name_type;
17664 char name_attribute;
17665 const char * expected_types;
17666 const char * name = pnote->namedata;
17667 const char * text;
17668 signed int left;
17669
17670 if (name == NULL || pnote->namesz < 2)
17671 {
17672 error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
17673 print_symbol (-20, _(" <corrupt name>"));
17674 return FALSE;
17675 }
17676
17677 if (do_wide)
17678 left = 28;
17679 else
17680 left = 20;
17681
17682 /* Version 2 of the spec adds a "GA" prefix to the name field. */
17683 if (name[0] == 'G' && name[1] == 'A')
17684 {
17685 if (pnote->namesz < 4)
17686 {
17687 error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
17688 print_symbol (-20, _(" <corrupt name>"));
17689 return FALSE;
17690 }
17691
17692 printf ("GA");
17693 name += 2;
17694 left -= 2;
17695 }
17696
17697 switch ((name_type = * name))
17698 {
17699 case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
17700 case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
17701 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
17702 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
17703 printf ("%c", * name);
17704 left --;
17705 break;
17706 default:
17707 error (_("unrecognised attribute type in name field: %d\n"), name_type);
17708 print_symbol (-20, _("<unknown name type>"));
17709 return FALSE;
17710 }
17711
17712 ++ name;
17713 text = NULL;
17714
17715 switch ((name_attribute = * name))
17716 {
17717 case GNU_BUILD_ATTRIBUTE_VERSION:
17718 text = _("<version>");
17719 expected_types = string_expected;
17720 ++ name;
17721 break;
17722 case GNU_BUILD_ATTRIBUTE_STACK_PROT:
17723 text = _("<stack prot>");
17724 expected_types = "!+*";
17725 ++ name;
17726 break;
17727 case GNU_BUILD_ATTRIBUTE_RELRO:
17728 text = _("<relro>");
17729 expected_types = bool_expected;
17730 ++ name;
17731 break;
17732 case GNU_BUILD_ATTRIBUTE_STACK_SIZE:
17733 text = _("<stack size>");
17734 expected_types = number_expected;
17735 ++ name;
17736 break;
17737 case GNU_BUILD_ATTRIBUTE_TOOL:
17738 text = _("<tool>");
17739 expected_types = string_expected;
17740 ++ name;
17741 break;
17742 case GNU_BUILD_ATTRIBUTE_ABI:
17743 text = _("<ABI>");
17744 expected_types = "$*";
17745 ++ name;
17746 break;
17747 case GNU_BUILD_ATTRIBUTE_PIC:
17748 text = _("<PIC>");
17749 expected_types = number_expected;
17750 ++ name;
17751 break;
17752 case GNU_BUILD_ATTRIBUTE_SHORT_ENUM:
17753 text = _("<short enum>");
17754 expected_types = bool_expected;
17755 ++ name;
17756 break;
17757 default:
17758 if (ISPRINT (* name))
17759 {
17760 int len = strnlen (name, pnote->namesz - (name - pnote->namedata)) + 1;
17761
17762 if (len > left && ! do_wide)
17763 len = left;
17764 printf ("%.*s:", len, name);
17765 left -= len;
17766 name += len;
17767 }
17768 else
17769 {
17770 static char tmpbuf [128];
17771
17772 error (_("unrecognised byte in name field: %d\n"), * name);
17773 sprintf (tmpbuf, _("<unknown:_%d>"), * name);
17774 text = tmpbuf;
17775 name ++;
17776 }
17777 expected_types = "*$!+";
17778 break;
17779 }
17780
17781 if (text)
17782 left -= printf ("%s", text);
17783
17784 if (strchr (expected_types, name_type) == NULL)
17785 warn (_("attribute does not have an expected type (%c)\n"), name_type);
17786
17787 if ((unsigned long)(name - pnote->namedata) > pnote->namesz)
17788 {
17789 error (_("corrupt name field: namesz: %lu but parsing gets to %ld\n"),
17790 (unsigned long) pnote->namesz,
17791 (long) (name - pnote->namedata));
17792 return FALSE;
17793 }
17794
17795 if (left < 1 && ! do_wide)
17796 return TRUE;
17797
17798 switch (name_type)
17799 {
17800 case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
17801 {
17802 unsigned int bytes;
17803 unsigned long long val = 0;
17804 unsigned int shift = 0;
17805 char * decoded = NULL;
17806
17807 bytes = pnote->namesz - (name - pnote->namedata);
17808 if (bytes > 0)
17809 /* The -1 is because the name field is always 0 terminated, and we
17810 want to be able to ensure that the shift in the while loop below
17811 will not overflow. */
17812 -- bytes;
17813
17814 if (bytes > sizeof (val))
17815 {
17816 error (_("corrupt numeric name field: too many bytes in the value: %x\n"),
17817 bytes);
17818 bytes = sizeof (val);
17819 }
17820 /* We do not bother to warn if bytes == 0 as this can
17821 happen with some early versions of the gcc plugin. */
17822
17823 while (bytes --)
17824 {
17825 unsigned long byte = (* name ++) & 0xff;
17826
17827 val |= byte << shift;
17828 shift += 8;
17829 }
17830
17831 switch (name_attribute)
17832 {
17833 case GNU_BUILD_ATTRIBUTE_PIC:
17834 switch (val)
17835 {
17836 case 0: decoded = "static"; break;
17837 case 1: decoded = "pic"; break;
17838 case 2: decoded = "PIC"; break;
17839 case 3: decoded = "pie"; break;
17840 case 4: decoded = "PIE"; break;
17841 default: break;
17842 }
17843 break;
17844 case GNU_BUILD_ATTRIBUTE_STACK_PROT:
17845 switch (val)
17846 {
17847 /* Based upon the SPCT_FLAG_xxx enum values in gcc/cfgexpand.c. */
17848 case 0: decoded = "off"; break;
17849 case 1: decoded = "on"; break;
17850 case 2: decoded = "all"; break;
17851 case 3: decoded = "strong"; break;
17852 case 4: decoded = "explicit"; break;
17853 default: break;
17854 }
17855 break;
17856 default:
17857 break;
17858 }
17859
17860 if (decoded != NULL)
17861 {
17862 print_symbol (-left, decoded);
17863 left = 0;
17864 }
17865 else if (val == 0)
17866 {
17867 printf ("0x0");
17868 left -= 3;
17869 }
17870 else
17871 {
17872 if (do_wide)
17873 left -= printf ("0x%llx", val);
17874 else
17875 left -= printf ("0x%-.*llx", left, val);
17876 }
17877 }
17878 break;
17879 case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
17880 left -= print_symbol (- left, name);
17881 break;
17882 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
17883 left -= print_symbol (- left, "true");
17884 break;
17885 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
17886 left -= print_symbol (- left, "false");
17887 break;
17888 }
17889
17890 if (do_wide && left > 0)
17891 printf ("%-*s", left, " ");
17892
17893 return TRUE;
17894 }
17895
17896 /* Note that by the ELF standard, the name field is already null byte
17897 terminated, and namesz includes the terminating null byte.
17898 I.E. the value of namesz for the name "FSF" is 4.
17899
17900 If the value of namesz is zero, there is no name present. */
17901
17902 static bfd_boolean
17903 process_note (Elf_Internal_Note * pnote,
17904 Filedata * filedata)
17905 {
17906 const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
17907 const char * nt;
17908
17909 if (pnote->namesz == 0)
17910 /* If there is no note name, then use the default set of
17911 note type strings. */
17912 nt = get_note_type (filedata, pnote->type);
17913
17914 else if (const_strneq (pnote->namedata, "GNU"))
17915 /* GNU-specific object file notes. */
17916 nt = get_gnu_elf_note_type (pnote->type);
17917
17918 else if (const_strneq (pnote->namedata, "FreeBSD"))
17919 /* FreeBSD-specific core file notes. */
17920 nt = get_freebsd_elfcore_note_type (filedata, pnote->type);
17921
17922 else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
17923 /* NetBSD-specific core file notes. */
17924 nt = get_netbsd_elfcore_note_type (filedata, pnote->type);
17925
17926 else if (const_strneq (pnote->namedata, "NetBSD"))
17927 /* NetBSD-specific core file notes. */
17928 return process_netbsd_elf_note (pnote);
17929
17930 else if (strneq (pnote->namedata, "SPU/", 4))
17931 {
17932 /* SPU-specific core file notes. */
17933 nt = pnote->namedata + 4;
17934 name = "SPU";
17935 }
17936
17937 else if (const_strneq (pnote->namedata, "IPF/VMS"))
17938 /* VMS/ia64-specific file notes. */
17939 nt = get_ia64_vms_note_type (pnote->type);
17940
17941 else if (const_strneq (pnote->namedata, "stapsdt"))
17942 nt = get_stapsdt_note_type (pnote->type);
17943
17944 else
17945 /* Don't recognize this note name; just use the default set of
17946 note type strings. */
17947 nt = get_note_type (filedata, pnote->type);
17948
17949 printf (" ");
17950
17951 if (((const_strneq (pnote->namedata, "GA")
17952 && strchr ("*$!+", pnote->namedata[2]) != NULL)
17953 || strchr ("*$!+", pnote->namedata[0]) != NULL)
17954 && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
17955 || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
17956 print_gnu_build_attribute_name (pnote);
17957 else
17958 print_symbol (-20, name);
17959
17960 if (do_wide)
17961 printf (" 0x%08lx\t%s\t", pnote->descsz, nt);
17962 else
17963 printf (" 0x%08lx\t%s\n", pnote->descsz, nt);
17964
17965 if (const_strneq (pnote->namedata, "IPF/VMS"))
17966 return print_ia64_vms_note (pnote);
17967 else if (const_strneq (pnote->namedata, "GNU"))
17968 return print_gnu_note (filedata, pnote);
17969 else if (const_strneq (pnote->namedata, "stapsdt"))
17970 return print_stapsdt_note (pnote);
17971 else if (const_strneq (pnote->namedata, "CORE"))
17972 return print_core_note (pnote);
17973 else if (((const_strneq (pnote->namedata, "GA")
17974 && strchr ("*$!+", pnote->namedata[2]) != NULL)
17975 || strchr ("*$!+", pnote->namedata[0]) != NULL)
17976 && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
17977 || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
17978 return print_gnu_build_attribute_description (pnote, filedata);
17979
17980 if (pnote->descsz)
17981 {
17982 unsigned long i;
17983
17984 printf (_(" description data: "));
17985 for (i = 0; i < pnote->descsz; i++)
17986 printf ("%02x ", pnote->descdata[i]);
17987 if (!do_wide)
17988 printf ("\n");
17989 }
17990
17991 if (do_wide)
17992 printf ("\n");
17993
17994 return TRUE;
17995 }
17996
17997 static bfd_boolean
17998 process_notes_at (Filedata * filedata,
17999 Elf_Internal_Shdr * section,
18000 bfd_vma offset,
18001 bfd_vma length,
18002 bfd_vma align)
18003 {
18004 Elf_External_Note * pnotes;
18005 Elf_External_Note * external;
18006 char * end;
18007 bfd_boolean res = TRUE;
18008
18009 if (length <= 0)
18010 return FALSE;
18011
18012 if (section)
18013 {
18014 pnotes = (Elf_External_Note *) get_section_contents (section, filedata);
18015 if (pnotes)
18016 {
18017 if (! apply_relocations (filedata, section, (unsigned char *) pnotes, length, NULL, NULL))
18018 return FALSE;
18019 }
18020 }
18021 else
18022 pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
18023 _("notes"));
18024
18025 if (pnotes == NULL)
18026 return FALSE;
18027
18028 external = pnotes;
18029
18030 if (section)
18031 printf (_("\nDisplaying notes found in: %s\n"), printable_section_name (filedata, section));
18032 else
18033 printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
18034 (unsigned long) offset, (unsigned long) length);
18035
18036 /* NB: Some note sections may have alignment value of 0 or 1. gABI
18037 specifies that notes should be aligned to 4 bytes in 32-bit
18038 objects and to 8 bytes in 64-bit objects. As a Linux extension,
18039 we also support 4 byte alignment in 64-bit objects. If section
18040 alignment is less than 4, we treate alignment as 4 bytes. */
18041 if (align < 4)
18042 align = 4;
18043 else if (align != 4 && align != 8)
18044 {
18045 warn (_("Corrupt note: alignment %ld, expecting 4 or 8\n"),
18046 (long) align);
18047 return FALSE;
18048 }
18049
18050 printf (_(" %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
18051
18052 end = (char *) pnotes + length;
18053 while ((char *) external < end)
18054 {
18055 Elf_Internal_Note inote;
18056 size_t min_notesz;
18057 char * next;
18058 char * temp = NULL;
18059 size_t data_remaining = end - (char *) external;
18060
18061 if (!is_ia64_vms (filedata))
18062 {
18063 /* PR binutils/15191
18064 Make sure that there is enough data to read. */
18065 min_notesz = offsetof (Elf_External_Note, name);
18066 if (data_remaining < min_notesz)
18067 {
18068 warn (ngettext ("Corrupt note: only %ld byte remains, "
18069 "not enough for a full note\n",
18070 "Corrupt note: only %ld bytes remain, "
18071 "not enough for a full note\n",
18072 data_remaining),
18073 (long) data_remaining);
18074 break;
18075 }
18076 data_remaining -= min_notesz;
18077
18078 inote.type = BYTE_GET (external->type);
18079 inote.namesz = BYTE_GET (external->namesz);
18080 inote.namedata = external->name;
18081 inote.descsz = BYTE_GET (external->descsz);
18082 inote.descdata = ((char *) external
18083 + ELF_NOTE_DESC_OFFSET (inote.namesz, align));
18084 inote.descpos = offset + (inote.descdata - (char *) pnotes);
18085 next = ((char *) external
18086 + ELF_NOTE_NEXT_OFFSET (inote.namesz, inote.descsz, align));
18087 }
18088 else
18089 {
18090 Elf64_External_VMS_Note *vms_external;
18091
18092 /* PR binutils/15191
18093 Make sure that there is enough data to read. */
18094 min_notesz = offsetof (Elf64_External_VMS_Note, name);
18095 if (data_remaining < min_notesz)
18096 {
18097 warn (ngettext ("Corrupt note: only %ld byte remains, "
18098 "not enough for a full note\n",
18099 "Corrupt note: only %ld bytes remain, "
18100 "not enough for a full note\n",
18101 data_remaining),
18102 (long) data_remaining);
18103 break;
18104 }
18105 data_remaining -= min_notesz;
18106
18107 vms_external = (Elf64_External_VMS_Note *) external;
18108 inote.type = BYTE_GET (vms_external->type);
18109 inote.namesz = BYTE_GET (vms_external->namesz);
18110 inote.namedata = vms_external->name;
18111 inote.descsz = BYTE_GET (vms_external->descsz);
18112 inote.descdata = inote.namedata + align_power (inote.namesz, 3);
18113 inote.descpos = offset + (inote.descdata - (char *) pnotes);
18114 next = inote.descdata + align_power (inote.descsz, 3);
18115 }
18116
18117 /* PR 17531: file: 3443835e. */
18118 /* PR 17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4. */
18119 if ((size_t) (inote.descdata - inote.namedata) < inote.namesz
18120 || (size_t) (inote.descdata - inote.namedata) > data_remaining
18121 || (size_t) (next - inote.descdata) < inote.descsz
18122 || ((size_t) (next - inote.descdata)
18123 > data_remaining - (size_t) (inote.descdata - inote.namedata)))
18124 {
18125 warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
18126 (unsigned long) ((char *) external - (char *) pnotes));
18127 warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx, alignment: %u\n"),
18128 inote.type, inote.namesz, inote.descsz, (int) align);
18129 break;
18130 }
18131
18132 external = (Elf_External_Note *) next;
18133
18134 /* Verify that name is null terminated. It appears that at least
18135 one version of Linux (RedHat 6.0) generates corefiles that don't
18136 comply with the ELF spec by failing to include the null byte in
18137 namesz. */
18138 if (inote.namedata[inote.namesz - 1] != '\0')
18139 {
18140 if ((size_t) (inote.descdata - inote.namedata) == inote.namesz)
18141 {
18142 temp = (char *) malloc (inote.namesz + 1);
18143 if (temp == NULL)
18144 {
18145 error (_("Out of memory allocating space for inote name\n"));
18146 res = FALSE;
18147 break;
18148 }
18149
18150 memcpy (temp, inote.namedata, inote.namesz);
18151 inote.namedata = temp;
18152 }
18153 inote.namedata[inote.namesz] = 0;
18154 }
18155
18156 if (! process_note (& inote, filedata))
18157 res = FALSE;
18158
18159 if (temp != NULL)
18160 {
18161 free (temp);
18162 temp = NULL;
18163 }
18164 }
18165
18166 free (pnotes);
18167
18168 return res;
18169 }
18170
18171 static bfd_boolean
18172 process_corefile_note_segments (Filedata * filedata)
18173 {
18174 Elf_Internal_Phdr * segment;
18175 unsigned int i;
18176 bfd_boolean res = TRUE;
18177
18178 if (! get_program_headers (filedata))
18179 return TRUE;
18180
18181 for (i = 0, segment = filedata->program_headers;
18182 i < filedata->file_header.e_phnum;
18183 i++, segment++)
18184 {
18185 if (segment->p_type == PT_NOTE)
18186 if (! process_notes_at (filedata, NULL,
18187 (bfd_vma) segment->p_offset,
18188 (bfd_vma) segment->p_filesz,
18189 (bfd_vma) segment->p_align))
18190 res = FALSE;
18191 }
18192
18193 return res;
18194 }
18195
18196 static bfd_boolean
18197 process_v850_notes (Filedata * filedata, bfd_vma offset, bfd_vma length)
18198 {
18199 Elf_External_Note * pnotes;
18200 Elf_External_Note * external;
18201 char * end;
18202 bfd_boolean res = TRUE;
18203
18204 if (length <= 0)
18205 return FALSE;
18206
18207 pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
18208 _("v850 notes"));
18209 if (pnotes == NULL)
18210 return FALSE;
18211
18212 external = pnotes;
18213 end = (char*) pnotes + length;
18214
18215 printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
18216 (unsigned long) offset, (unsigned long) length);
18217
18218 while ((char *) external + sizeof (Elf_External_Note) < end)
18219 {
18220 Elf_External_Note * next;
18221 Elf_Internal_Note inote;
18222
18223 inote.type = BYTE_GET (external->type);
18224 inote.namesz = BYTE_GET (external->namesz);
18225 inote.namedata = external->name;
18226 inote.descsz = BYTE_GET (external->descsz);
18227 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
18228 inote.descpos = offset + (inote.descdata - (char *) pnotes);
18229
18230 if (inote.descdata < (char *) pnotes || inote.descdata >= end)
18231 {
18232 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
18233 inote.descdata = inote.namedata;
18234 inote.namesz = 0;
18235 }
18236
18237 next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
18238
18239 if ( ((char *) next > end)
18240 || ((char *) next < (char *) pnotes))
18241 {
18242 warn (_("corrupt descsz found in note at offset 0x%lx\n"),
18243 (unsigned long) ((char *) external - (char *) pnotes));
18244 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
18245 inote.type, inote.namesz, inote.descsz);
18246 break;
18247 }
18248
18249 external = next;
18250
18251 /* Prevent out-of-bounds indexing. */
18252 if ( inote.namedata + inote.namesz > end
18253 || inote.namedata + inote.namesz < inote.namedata)
18254 {
18255 warn (_("corrupt namesz found in note at offset 0x%lx\n"),
18256 (unsigned long) ((char *) external - (char *) pnotes));
18257 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
18258 inote.type, inote.namesz, inote.descsz);
18259 break;
18260 }
18261
18262 printf (" %s: ", get_v850_elf_note_type (inote.type));
18263
18264 if (! print_v850_note (& inote))
18265 {
18266 res = FALSE;
18267 printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
18268 inote.namesz, inote.descsz);
18269 }
18270 }
18271
18272 free (pnotes);
18273
18274 return res;
18275 }
18276
18277 static bfd_boolean
18278 process_note_sections (Filedata * filedata)
18279 {
18280 Elf_Internal_Shdr * section;
18281 unsigned long i;
18282 unsigned int n = 0;
18283 bfd_boolean res = TRUE;
18284
18285 for (i = 0, section = filedata->section_headers;
18286 i < filedata->file_header.e_shnum && section != NULL;
18287 i++, section++)
18288 {
18289 if (section->sh_type == SHT_NOTE)
18290 {
18291 if (! process_notes_at (filedata, section,
18292 (bfd_vma) section->sh_offset,
18293 (bfd_vma) section->sh_size,
18294 (bfd_vma) section->sh_addralign))
18295 res = FALSE;
18296 n++;
18297 }
18298
18299 if (( filedata->file_header.e_machine == EM_V800
18300 || filedata->file_header.e_machine == EM_V850
18301 || filedata->file_header.e_machine == EM_CYGNUS_V850)
18302 && section->sh_type == SHT_RENESAS_INFO)
18303 {
18304 if (! process_v850_notes (filedata,
18305 (bfd_vma) section->sh_offset,
18306 (bfd_vma) section->sh_size))
18307 res = FALSE;
18308 n++;
18309 }
18310 }
18311
18312 if (n == 0)
18313 /* Try processing NOTE segments instead. */
18314 return process_corefile_note_segments (filedata);
18315
18316 return res;
18317 }
18318
18319 static bfd_boolean
18320 process_notes (Filedata * filedata)
18321 {
18322 /* If we have not been asked to display the notes then do nothing. */
18323 if (! do_notes)
18324 return TRUE;
18325
18326 if (filedata->file_header.e_type != ET_CORE)
18327 return process_note_sections (filedata);
18328
18329 /* No program headers means no NOTE segment. */
18330 if (filedata->file_header.e_phnum > 0)
18331 return process_corefile_note_segments (filedata);
18332
18333 printf (_("No note segments present in the core file.\n"));
18334 return TRUE;
18335 }
18336
18337 static unsigned char *
18338 display_public_gnu_attributes (unsigned char * start,
18339 const unsigned char * const end)
18340 {
18341 printf (_(" Unknown GNU attribute: %s\n"), start);
18342
18343 start += strnlen ((char *) start, end - start);
18344 display_raw_attribute (start, end);
18345
18346 return (unsigned char *) end;
18347 }
18348
18349 static unsigned char *
18350 display_generic_attribute (unsigned char * start,
18351 unsigned int tag,
18352 const unsigned char * const end)
18353 {
18354 if (tag == 0)
18355 return (unsigned char *) end;
18356
18357 return display_tag_value (tag, start, end);
18358 }
18359
18360 static bfd_boolean
18361 process_arch_specific (Filedata * filedata)
18362 {
18363 if (! do_arch)
18364 return TRUE;
18365
18366 switch (filedata->file_header.e_machine)
18367 {
18368 case EM_ARC:
18369 case EM_ARC_COMPACT:
18370 case EM_ARC_COMPACT2:
18371 return process_attributes (filedata, "ARC", SHT_ARC_ATTRIBUTES,
18372 display_arc_attribute,
18373 display_generic_attribute);
18374 case EM_ARM:
18375 return process_attributes (filedata, "aeabi", SHT_ARM_ATTRIBUTES,
18376 display_arm_attribute,
18377 display_generic_attribute);
18378
18379 case EM_MIPS:
18380 case EM_MIPS_RS3_LE:
18381 return process_mips_specific (filedata);
18382
18383 case EM_MSP430:
18384 return process_attributes (filedata, "mspabi", SHT_MSP430_ATTRIBUTES,
18385 display_msp430x_attribute,
18386 display_generic_attribute);
18387
18388 case EM_NDS32:
18389 return process_nds32_specific (filedata);
18390
18391 case EM_PPC:
18392 case EM_PPC64:
18393 return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
18394 display_power_gnu_attribute);
18395
18396 case EM_S390:
18397 case EM_S390_OLD:
18398 return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
18399 display_s390_gnu_attribute);
18400
18401 case EM_SPARC:
18402 case EM_SPARC32PLUS:
18403 case EM_SPARCV9:
18404 return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
18405 display_sparc_gnu_attribute);
18406
18407 case EM_TI_C6000:
18408 return process_attributes (filedata, "c6xabi", SHT_C6000_ATTRIBUTES,
18409 display_tic6x_attribute,
18410 display_generic_attribute);
18411
18412 default:
18413 return process_attributes (filedata, "gnu", SHT_GNU_ATTRIBUTES,
18414 display_public_gnu_attributes,
18415 display_generic_attribute);
18416 }
18417 }
18418
18419 static bfd_boolean
18420 get_file_header (Filedata * filedata)
18421 {
18422 /* Read in the identity array. */
18423 if (fread (filedata->file_header.e_ident, EI_NIDENT, 1, filedata->handle) != 1)
18424 return FALSE;
18425
18426 /* Determine how to read the rest of the header. */
18427 switch (filedata->file_header.e_ident[EI_DATA])
18428 {
18429 default:
18430 case ELFDATANONE:
18431 case ELFDATA2LSB:
18432 byte_get = byte_get_little_endian;
18433 byte_put = byte_put_little_endian;
18434 break;
18435 case ELFDATA2MSB:
18436 byte_get = byte_get_big_endian;
18437 byte_put = byte_put_big_endian;
18438 break;
18439 }
18440
18441 /* For now we only support 32 bit and 64 bit ELF files. */
18442 is_32bit_elf = (filedata->file_header.e_ident[EI_CLASS] != ELFCLASS64);
18443
18444 /* Read in the rest of the header. */
18445 if (is_32bit_elf)
18446 {
18447 Elf32_External_Ehdr ehdr32;
18448
18449 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, filedata->handle) != 1)
18450 return FALSE;
18451
18452 filedata->file_header.e_type = BYTE_GET (ehdr32.e_type);
18453 filedata->file_header.e_machine = BYTE_GET (ehdr32.e_machine);
18454 filedata->file_header.e_version = BYTE_GET (ehdr32.e_version);
18455 filedata->file_header.e_entry = BYTE_GET (ehdr32.e_entry);
18456 filedata->file_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
18457 filedata->file_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
18458 filedata->file_header.e_flags = BYTE_GET (ehdr32.e_flags);
18459 filedata->file_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
18460 filedata->file_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
18461 filedata->file_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
18462 filedata->file_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
18463 filedata->file_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
18464 filedata->file_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
18465 }
18466 else
18467 {
18468 Elf64_External_Ehdr ehdr64;
18469
18470 /* If we have been compiled with sizeof (bfd_vma) == 4, then
18471 we will not be able to cope with the 64bit data found in
18472 64 ELF files. Detect this now and abort before we start
18473 overwriting things. */
18474 if (sizeof (bfd_vma) < 8)
18475 {
18476 error (_("This instance of readelf has been built without support for a\n\
18477 64 bit data type and so it cannot read 64 bit ELF files.\n"));
18478 return FALSE;
18479 }
18480
18481 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, filedata->handle) != 1)
18482 return FALSE;
18483
18484 filedata->file_header.e_type = BYTE_GET (ehdr64.e_type);
18485 filedata->file_header.e_machine = BYTE_GET (ehdr64.e_machine);
18486 filedata->file_header.e_version = BYTE_GET (ehdr64.e_version);
18487 filedata->file_header.e_entry = BYTE_GET (ehdr64.e_entry);
18488 filedata->file_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
18489 filedata->file_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
18490 filedata->file_header.e_flags = BYTE_GET (ehdr64.e_flags);
18491 filedata->file_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
18492 filedata->file_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
18493 filedata->file_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
18494 filedata->file_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
18495 filedata->file_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
18496 filedata->file_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
18497 }
18498
18499 if (filedata->file_header.e_shoff)
18500 {
18501 /* There may be some extensions in the first section header. Don't
18502 bomb if we can't read it. */
18503 if (is_32bit_elf)
18504 get_32bit_section_headers (filedata, TRUE);
18505 else
18506 get_64bit_section_headers (filedata, TRUE);
18507 }
18508
18509 return TRUE;
18510 }
18511
18512 static void
18513 close_file (Filedata * filedata)
18514 {
18515 if (filedata)
18516 {
18517 if (filedata->handle)
18518 fclose (filedata->handle);
18519 free (filedata);
18520 }
18521 }
18522
18523 void
18524 close_debug_file (void * data)
18525 {
18526 close_file ((Filedata *) data);
18527 }
18528
18529 static Filedata *
18530 open_file (const char * pathname)
18531 {
18532 struct stat statbuf;
18533 Filedata * filedata = NULL;
18534
18535 if (stat (pathname, & statbuf) < 0
18536 || ! S_ISREG (statbuf.st_mode))
18537 goto fail;
18538
18539 filedata = calloc (1, sizeof * filedata);
18540 if (filedata == NULL)
18541 goto fail;
18542
18543 filedata->handle = fopen (pathname, "rb");
18544 if (filedata->handle == NULL)
18545 goto fail;
18546
18547 filedata->file_size = (bfd_size_type) statbuf.st_size;
18548 filedata->file_name = pathname;
18549
18550 if (! get_file_header (filedata))
18551 goto fail;
18552
18553 if (filedata->file_header.e_shoff)
18554 {
18555 bfd_boolean res;
18556
18557 /* Read the section headers again, this time for real. */
18558 if (is_32bit_elf)
18559 res = get_32bit_section_headers (filedata, FALSE);
18560 else
18561 res = get_64bit_section_headers (filedata, FALSE);
18562
18563 if (!res)
18564 goto fail;
18565 }
18566
18567 return filedata;
18568
18569 fail:
18570 if (filedata)
18571 {
18572 if (filedata->handle)
18573 fclose (filedata->handle);
18574 free (filedata);
18575 }
18576 return NULL;
18577 }
18578
18579 void *
18580 open_debug_file (const char * pathname)
18581 {
18582 return open_file (pathname);
18583 }
18584
18585 /* Process one ELF object file according to the command line options.
18586 This file may actually be stored in an archive. The file is
18587 positioned at the start of the ELF object. Returns TRUE if no
18588 problems were encountered, FALSE otherwise. */
18589
18590 static bfd_boolean
18591 process_object (Filedata * filedata)
18592 {
18593 Filedata * separates;
18594 unsigned int i;
18595 bfd_boolean res = TRUE;
18596
18597 if (! get_file_header (filedata))
18598 {
18599 error (_("%s: Failed to read file header\n"), filedata->file_name);
18600 return FALSE;
18601 }
18602
18603 /* Initialise per file variables. */
18604 for (i = ARRAY_SIZE (version_info); i--;)
18605 version_info[i] = 0;
18606
18607 for (i = ARRAY_SIZE (dynamic_info); i--;)
18608 dynamic_info[i] = 0;
18609 dynamic_info_DT_GNU_HASH = 0;
18610
18611 /* Process the file. */
18612 if (show_name)
18613 printf (_("\nFile: %s\n"), filedata->file_name);
18614
18615 /* Initialise the dump_sects array from the cmdline_dump_sects array.
18616 Note we do this even if cmdline_dump_sects is empty because we
18617 must make sure that the dump_sets array is zeroed out before each
18618 object file is processed. */
18619 if (filedata->num_dump_sects > cmdline.num_dump_sects)
18620 memset (filedata->dump_sects, 0, filedata->num_dump_sects * sizeof (* filedata->dump_sects));
18621
18622 if (cmdline.num_dump_sects > 0)
18623 {
18624 if (filedata->num_dump_sects == 0)
18625 /* A sneaky way of allocating the dump_sects array. */
18626 request_dump_bynumber (filedata, cmdline.num_dump_sects, 0);
18627
18628 assert (filedata->num_dump_sects >= cmdline.num_dump_sects);
18629 memcpy (filedata->dump_sects, cmdline.dump_sects,
18630 cmdline.num_dump_sects * sizeof (* filedata->dump_sects));
18631 }
18632
18633 if (! process_file_header (filedata))
18634 return FALSE;
18635
18636 if (! process_section_headers (filedata))
18637 {
18638 /* Without loaded section headers we cannot process lots of things. */
18639 do_unwind = do_version = do_dump = do_arch = FALSE;
18640
18641 if (! do_using_dynamic)
18642 do_syms = do_dyn_syms = do_reloc = FALSE;
18643 }
18644
18645 if (! process_section_groups (filedata))
18646 /* Without loaded section groups we cannot process unwind. */
18647 do_unwind = FALSE;
18648
18649 if (process_program_headers (filedata))
18650 process_dynamic_section (filedata);
18651 else
18652 res = FALSE;
18653
18654 if (! process_relocs (filedata))
18655 res = FALSE;
18656
18657 if (! process_unwind (filedata))
18658 res = FALSE;
18659
18660 if (! process_symbol_table (filedata))
18661 res = FALSE;
18662
18663 if (! process_syminfo (filedata))
18664 res = FALSE;
18665
18666 if (! process_version_sections (filedata))
18667 res = FALSE;
18668
18669 if (filedata->file_header.e_shstrndx != SHN_UNDEF)
18670 separates = load_separate_debug_file (filedata, filedata->file_name);
18671 else
18672 separates = NULL;
18673
18674 if (! process_section_contents (filedata))
18675 res = FALSE;
18676
18677 if (separates)
18678 {
18679 if (! process_section_headers (separates))
18680 res = FALSE;
18681 else if (! process_section_contents (separates))
18682 res = FALSE;
18683 }
18684
18685 if (! process_notes (filedata))
18686 res = FALSE;
18687
18688 if (! process_gnu_liblist (filedata))
18689 res = FALSE;
18690
18691 if (! process_arch_specific (filedata))
18692 res = FALSE;
18693
18694 free (filedata->program_headers);
18695 filedata->program_headers = NULL;
18696
18697 free (filedata->section_headers);
18698 filedata->section_headers = NULL;
18699
18700 free (filedata->string_table);
18701 filedata->string_table = NULL;
18702 filedata->string_table_length = 0;
18703
18704 if (dynamic_strings)
18705 {
18706 free (dynamic_strings);
18707 dynamic_strings = NULL;
18708 dynamic_strings_length = 0;
18709 }
18710
18711 if (dynamic_symbols)
18712 {
18713 free (dynamic_symbols);
18714 dynamic_symbols = NULL;
18715 num_dynamic_syms = 0;
18716 }
18717
18718 if (dynamic_syminfo)
18719 {
18720 free (dynamic_syminfo);
18721 dynamic_syminfo = NULL;
18722 }
18723
18724 if (dynamic_section)
18725 {
18726 free (dynamic_section);
18727 dynamic_section = NULL;
18728 }
18729
18730 if (section_headers_groups)
18731 {
18732 free (section_headers_groups);
18733 section_headers_groups = NULL;
18734 }
18735
18736 if (section_groups)
18737 {
18738 struct group_list * g;
18739 struct group_list * next;
18740
18741 for (i = 0; i < group_count; i++)
18742 {
18743 for (g = section_groups [i].root; g != NULL; g = next)
18744 {
18745 next = g->next;
18746 free (g);
18747 }
18748 }
18749
18750 free (section_groups);
18751 section_groups = NULL;
18752 }
18753
18754 free_debug_memory ();
18755
18756 return res;
18757 }
18758
18759 /* Process an ELF archive.
18760 On entry the file is positioned just after the ARMAG string.
18761 Returns TRUE upon success, FALSE otherwise. */
18762
18763 static bfd_boolean
18764 process_archive (Filedata * filedata, bfd_boolean is_thin_archive)
18765 {
18766 struct archive_info arch;
18767 struct archive_info nested_arch;
18768 size_t got;
18769 bfd_boolean ret = TRUE;
18770
18771 show_name = TRUE;
18772
18773 /* The ARCH structure is used to hold information about this archive. */
18774 arch.file_name = NULL;
18775 arch.file = NULL;
18776 arch.index_array = NULL;
18777 arch.sym_table = NULL;
18778 arch.longnames = NULL;
18779
18780 /* The NESTED_ARCH structure is used as a single-item cache of information
18781 about a nested archive (when members of a thin archive reside within
18782 another regular archive file). */
18783 nested_arch.file_name = NULL;
18784 nested_arch.file = NULL;
18785 nested_arch.index_array = NULL;
18786 nested_arch.sym_table = NULL;
18787 nested_arch.longnames = NULL;
18788
18789 if (setup_archive (&arch, filedata->file_name, filedata->handle,
18790 is_thin_archive, do_archive_index) != 0)
18791 {
18792 ret = FALSE;
18793 goto out;
18794 }
18795
18796 if (do_archive_index)
18797 {
18798 if (arch.sym_table == NULL)
18799 error (_("%s: unable to dump the index as none was found\n"), filedata->file_name);
18800 else
18801 {
18802 unsigned long i, l;
18803 unsigned long current_pos;
18804
18805 printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
18806 filedata->file_name, (unsigned long) arch.index_num, arch.sym_size);
18807
18808 current_pos = ftell (filedata->handle);
18809
18810 for (i = l = 0; i < arch.index_num; i++)
18811 {
18812 if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
18813 {
18814 char * member_name;
18815
18816 member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
18817
18818 if (member_name != NULL)
18819 {
18820 char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
18821
18822 if (qualified_name != NULL)
18823 {
18824 printf (_("Contents of binary %s at offset "), qualified_name);
18825 (void) print_vma (arch.index_array[i], PREFIX_HEX);
18826 putchar ('\n');
18827 free (qualified_name);
18828 }
18829 }
18830 }
18831
18832 if (l >= arch.sym_size)
18833 {
18834 error (_("%s: end of the symbol table reached before the end of the index\n"),
18835 filedata->file_name);
18836 ret = FALSE;
18837 break;
18838 }
18839 /* PR 17531: file: 0b6630b2. */
18840 printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
18841 l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
18842 }
18843
18844 if (arch.uses_64bit_indicies)
18845 l = (l + 7) & ~ 7;
18846 else
18847 l += l & 1;
18848
18849 if (l < arch.sym_size)
18850 {
18851 error (ngettext ("%s: %ld byte remains in the symbol table, "
18852 "but without corresponding entries in "
18853 "the index table\n",
18854 "%s: %ld bytes remain in the symbol table, "
18855 "but without corresponding entries in "
18856 "the index table\n",
18857 arch.sym_size - l),
18858 filedata->file_name, arch.sym_size - l);
18859 ret = FALSE;
18860 }
18861
18862 if (fseek (filedata->handle, current_pos, SEEK_SET) != 0)
18863 {
18864 error (_("%s: failed to seek back to start of object files in the archive\n"),
18865 filedata->file_name);
18866 ret = FALSE;
18867 goto out;
18868 }
18869 }
18870
18871 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
18872 && !do_segments && !do_header && !do_dump && !do_version
18873 && !do_histogram && !do_debugging && !do_arch && !do_notes
18874 && !do_section_groups && !do_dyn_syms)
18875 {
18876 ret = TRUE; /* Archive index only. */
18877 goto out;
18878 }
18879 }
18880
18881 while (1)
18882 {
18883 char * name;
18884 size_t namelen;
18885 char * qualified_name;
18886
18887 /* Read the next archive header. */
18888 if (fseek (filedata->handle, arch.next_arhdr_offset, SEEK_SET) != 0)
18889 {
18890 error (_("%s: failed to seek to next archive header\n"), filedata->file_name);
18891 return FALSE;
18892 }
18893 got = fread (&arch.arhdr, 1, sizeof arch.arhdr, filedata->handle);
18894 if (got != sizeof arch.arhdr)
18895 {
18896 if (got == 0)
18897 break;
18898 error (_("%s: failed to read archive header\n"), filedata->file_name);
18899 ret = FALSE;
18900 break;
18901 }
18902 if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
18903 {
18904 error (_("%s: did not find a valid archive header\n"), arch.file_name);
18905 ret = FALSE;
18906 break;
18907 }
18908
18909 arch.next_arhdr_offset += sizeof arch.arhdr;
18910
18911 archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
18912 if (archive_file_size & 01)
18913 ++archive_file_size;
18914
18915 name = get_archive_member_name (&arch, &nested_arch);
18916 if (name == NULL)
18917 {
18918 error (_("%s: bad archive file name\n"), filedata->file_name);
18919 ret = FALSE;
18920 break;
18921 }
18922 namelen = strlen (name);
18923
18924 qualified_name = make_qualified_name (&arch, &nested_arch, name);
18925 if (qualified_name == NULL)
18926 {
18927 error (_("%s: bad archive file name\n"), filedata->file_name);
18928 ret = FALSE;
18929 break;
18930 }
18931
18932 if (is_thin_archive && arch.nested_member_origin == 0)
18933 {
18934 /* This is a proxy for an external member of a thin archive. */
18935 Filedata * member_filedata;
18936 char * member_file_name = adjust_relative_path
18937 (filedata->file_name, name, namelen);
18938
18939 if (member_file_name == NULL)
18940 {
18941 ret = FALSE;
18942 break;
18943 }
18944
18945 member_filedata = open_file (member_file_name);
18946 if (member_filedata == NULL)
18947 {
18948 error (_("Input file '%s' is not readable.\n"), member_file_name);
18949 free (member_file_name);
18950 ret = FALSE;
18951 break;
18952 }
18953
18954 archive_file_offset = arch.nested_member_origin;
18955 member_filedata->file_name = qualified_name;
18956
18957 if (! process_object (member_filedata))
18958 ret = FALSE;
18959
18960 close_file (member_filedata);
18961 free (member_file_name);
18962 }
18963 else if (is_thin_archive)
18964 {
18965 Filedata thin_filedata;
18966
18967 memset (&thin_filedata, 0, sizeof (thin_filedata));
18968
18969 /* PR 15140: Allow for corrupt thin archives. */
18970 if (nested_arch.file == NULL)
18971 {
18972 error (_("%s: contains corrupt thin archive: %s\n"),
18973 filedata->file_name, name);
18974 ret = FALSE;
18975 break;
18976 }
18977
18978 /* This is a proxy for a member of a nested archive. */
18979 archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
18980
18981 /* The nested archive file will have been opened and setup by
18982 get_archive_member_name. */
18983 if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
18984 {
18985 error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
18986 ret = FALSE;
18987 break;
18988 }
18989
18990 thin_filedata.handle = nested_arch.file;
18991 thin_filedata.file_name = qualified_name;
18992
18993 if (! process_object (& thin_filedata))
18994 ret = FALSE;
18995 }
18996 else
18997 {
18998 archive_file_offset = arch.next_arhdr_offset;
18999 arch.next_arhdr_offset += archive_file_size;
19000
19001 filedata->file_name = qualified_name;
19002 if (! process_object (filedata))
19003 ret = FALSE;
19004 }
19005
19006 if (filedata->dump_sects != NULL)
19007 {
19008 free (filedata->dump_sects);
19009 filedata->dump_sects = NULL;
19010 filedata->num_dump_sects = 0;
19011 }
19012
19013 free (qualified_name);
19014 }
19015
19016 out:
19017 if (nested_arch.file != NULL)
19018 fclose (nested_arch.file);
19019 release_archive (&nested_arch);
19020 release_archive (&arch);
19021
19022 return ret;
19023 }
19024
19025 static bfd_boolean
19026 process_file (char * file_name)
19027 {
19028 Filedata * filedata = NULL;
19029 struct stat statbuf;
19030 char armag[SARMAG];
19031 bfd_boolean ret = TRUE;
19032
19033 if (stat (file_name, &statbuf) < 0)
19034 {
19035 if (errno == ENOENT)
19036 error (_("'%s': No such file\n"), file_name);
19037 else
19038 error (_("Could not locate '%s'. System error message: %s\n"),
19039 file_name, strerror (errno));
19040 return FALSE;
19041 }
19042
19043 if (! S_ISREG (statbuf.st_mode))
19044 {
19045 error (_("'%s' is not an ordinary file\n"), file_name);
19046 return FALSE;
19047 }
19048
19049 filedata = calloc (1, sizeof * filedata);
19050 if (filedata == NULL)
19051 {
19052 error (_("Out of memory allocating file data structure\n"));
19053 return FALSE;
19054 }
19055
19056 filedata->file_name = file_name;
19057 filedata->handle = fopen (file_name, "rb");
19058 if (filedata->handle == NULL)
19059 {
19060 error (_("Input file '%s' is not readable.\n"), file_name);
19061 free (filedata);
19062 return FALSE;
19063 }
19064
19065 if (fread (armag, SARMAG, 1, filedata->handle) != 1)
19066 {
19067 error (_("%s: Failed to read file's magic number\n"), file_name);
19068 fclose (filedata->handle);
19069 free (filedata);
19070 return FALSE;
19071 }
19072
19073 filedata->file_size = (bfd_size_type) statbuf.st_size;
19074
19075 if (memcmp (armag, ARMAG, SARMAG) == 0)
19076 {
19077 if (! process_archive (filedata, FALSE))
19078 ret = FALSE;
19079 }
19080 else if (memcmp (armag, ARMAGT, SARMAG) == 0)
19081 {
19082 if ( ! process_archive (filedata, TRUE))
19083 ret = FALSE;
19084 }
19085 else
19086 {
19087 if (do_archive_index)
19088 error (_("File %s is not an archive so its index cannot be displayed.\n"),
19089 file_name);
19090
19091 rewind (filedata->handle);
19092 archive_file_size = archive_file_offset = 0;
19093
19094 if (! process_object (filedata))
19095 ret = FALSE;
19096 }
19097
19098 fclose (filedata->handle);
19099 free (filedata);
19100
19101 return ret;
19102 }
19103
19104 #ifdef SUPPORT_DISASSEMBLY
19105 /* Needed by the i386 disassembler. For extra credit, someone could
19106 fix this so that we insert symbolic addresses here, esp for GOT/PLT
19107 symbols. */
19108
19109 void
19110 print_address (unsigned int addr, FILE * outfile)
19111 {
19112 fprintf (outfile,"0x%8.8x", addr);
19113 }
19114
19115 /* Needed by the i386 disassembler. */
19116
19117 void
19118 db_task_printsym (unsigned int addr)
19119 {
19120 print_address (addr, stderr);
19121 }
19122 #endif
19123
19124 int
19125 main (int argc, char ** argv)
19126 {
19127 int err;
19128
19129 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
19130 setlocale (LC_MESSAGES, "");
19131 #endif
19132 #if defined (HAVE_SETLOCALE)
19133 setlocale (LC_CTYPE, "");
19134 #endif
19135 bindtextdomain (PACKAGE, LOCALEDIR);
19136 textdomain (PACKAGE);
19137
19138 expandargv (&argc, &argv);
19139
19140 cmdline.file_name = "<cmdline>";
19141 parse_args (& cmdline, argc, argv);
19142
19143 if (optind < (argc - 1))
19144 show_name = TRUE;
19145 else if (optind >= argc)
19146 {
19147 warn (_("Nothing to do.\n"));
19148 usage (stderr);
19149 }
19150
19151 err = FALSE;
19152 while (optind < argc)
19153 if (! process_file (argv[optind++]))
19154 err = TRUE;
19155
19156 if (cmdline.dump_sects != NULL)
19157 free (cmdline.dump_sects);
19158
19159 return err ? EXIT_FAILURE : EXIT_SUCCESS;
19160 }