]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - binutils/readelf.c
x86: Define GNU_PROPERTY_X86_ISA_1_AVX512_BF16
[thirdparty/binutils-gdb.git] / binutils / readelf.c
1 /* readelf.c -- display contents of an ELF format file
2 Copyright (C) 1998-2019 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/csky.h"
102 #include "elf/d10v.h"
103 #include "elf/d30v.h"
104 #include "elf/dlx.h"
105 #include "elf/epiphany.h"
106 #include "elf/fr30.h"
107 #include "elf/frv.h"
108 #include "elf/ft32.h"
109 #include "elf/h8.h"
110 #include "elf/hppa.h"
111 #include "elf/i386.h"
112 #include "elf/i370.h"
113 #include "elf/i860.h"
114 #include "elf/i960.h"
115 #include "elf/ia64.h"
116 #include "elf/ip2k.h"
117 #include "elf/lm32.h"
118 #include "elf/iq2000.h"
119 #include "elf/m32c.h"
120 #include "elf/m32r.h"
121 #include "elf/m68k.h"
122 #include "elf/m68hc11.h"
123 #include "elf/s12z.h"
124 #include "elf/mcore.h"
125 #include "elf/mep.h"
126 #include "elf/metag.h"
127 #include "elf/microblaze.h"
128 #include "elf/mips.h"
129 #include "elf/mmix.h"
130 #include "elf/mn10200.h"
131 #include "elf/mn10300.h"
132 #include "elf/moxie.h"
133 #include "elf/mt.h"
134 #include "elf/msp430.h"
135 #include "elf/nds32.h"
136 #include "elf/nfp.h"
137 #include "elf/nios2.h"
138 #include "elf/or1k.h"
139 #include "elf/pj.h"
140 #include "elf/ppc.h"
141 #include "elf/ppc64.h"
142 #include "elf/pru.h"
143 #include "elf/riscv.h"
144 #include "elf/rl78.h"
145 #include "elf/rx.h"
146 #include "elf/s390.h"
147 #include "elf/score.h"
148 #include "elf/sh.h"
149 #include "elf/sparc.h"
150 #include "elf/spu.h"
151 #include "elf/tic6x.h"
152 #include "elf/tilegx.h"
153 #include "elf/tilepro.h"
154 #include "elf/v850.h"
155 #include "elf/vax.h"
156 #include "elf/visium.h"
157 #include "elf/wasm32.h"
158 #include "elf/x86-64.h"
159 #include "elf/xc16x.h"
160 #include "elf/xgate.h"
161 #include "elf/xstormy16.h"
162 #include "elf/xtensa.h"
163
164 #include "getopt.h"
165 #include "libiberty.h"
166 #include "safe-ctype.h"
167 #include "filenames.h"
168
169 #ifndef offsetof
170 #define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
171 #endif
172
173 typedef struct elf_section_list
174 {
175 Elf_Internal_Shdr * hdr;
176 struct elf_section_list * next;
177 } elf_section_list;
178
179 /* Flag bits indicating particular types of dump. */
180 #define HEX_DUMP (1 << 0) /* The -x command line switch. */
181 #define DISASS_DUMP (1 << 1) /* The -i command line switch. */
182 #define DEBUG_DUMP (1 << 2) /* The -w command line switch. */
183 #define STRING_DUMP (1 << 3) /* The -p command line switch. */
184 #define RELOC_DUMP (1 << 4) /* The -R command line switch. */
185
186 typedef unsigned char dump_type;
187
188 /* A linked list of the section names for which dumps were requested. */
189 struct dump_list_entry
190 {
191 char * name;
192 dump_type type;
193 struct dump_list_entry * next;
194 };
195
196 typedef struct filedata
197 {
198 const char * file_name;
199 FILE * handle;
200 bfd_size_type file_size;
201 Elf_Internal_Ehdr file_header;
202 Elf_Internal_Shdr * section_headers;
203 Elf_Internal_Phdr * program_headers;
204 char * string_table;
205 unsigned long string_table_length;
206 /* A dynamic array of flags indicating for which sections a dump of
207 some kind has been requested. It is reset on a per-object file
208 basis and then initialised from the cmdline_dump_sects array,
209 the results of interpreting the -w switch, and the
210 dump_sects_byname list. */
211 dump_type * dump_sects;
212 unsigned int num_dump_sects;
213 } Filedata;
214
215 char * program_name = "readelf";
216
217 static unsigned long archive_file_offset;
218 static unsigned long archive_file_size;
219 static unsigned long dynamic_addr;
220 static bfd_size_type dynamic_size;
221 static size_t dynamic_nent;
222 static char * dynamic_strings;
223 static unsigned long dynamic_strings_length;
224 static unsigned long num_dynamic_syms;
225 static Elf_Internal_Sym * dynamic_symbols;
226 static Elf_Internal_Syminfo * dynamic_syminfo;
227 static unsigned long dynamic_syminfo_offset;
228 static unsigned int dynamic_syminfo_nent;
229 static char program_interpreter[PATH_MAX];
230 static bfd_vma dynamic_info[DT_ENCODING];
231 static bfd_vma dynamic_info_DT_GNU_HASH;
232 static bfd_vma version_info[16];
233 static Elf_Internal_Dyn * dynamic_section;
234 static elf_section_list * symtab_shndx_list;
235 static bfd_boolean show_name = FALSE;
236 static bfd_boolean do_dynamic = FALSE;
237 static bfd_boolean do_syms = FALSE;
238 static bfd_boolean do_dyn_syms = FALSE;
239 static bfd_boolean do_reloc = FALSE;
240 static bfd_boolean do_sections = FALSE;
241 static bfd_boolean do_section_groups = FALSE;
242 static bfd_boolean do_section_details = FALSE;
243 static bfd_boolean do_segments = FALSE;
244 static bfd_boolean do_unwind = FALSE;
245 static bfd_boolean do_using_dynamic = FALSE;
246 static bfd_boolean do_header = FALSE;
247 static bfd_boolean do_dump = FALSE;
248 static bfd_boolean do_version = FALSE;
249 static bfd_boolean do_histogram = FALSE;
250 static bfd_boolean do_debugging = FALSE;
251 static bfd_boolean do_arch = FALSE;
252 static bfd_boolean do_notes = FALSE;
253 static bfd_boolean do_archive_index = FALSE;
254 static bfd_boolean is_32bit_elf = FALSE;
255 static bfd_boolean decompress_dumps = FALSE;
256
257 struct group_list
258 {
259 struct group_list * next;
260 unsigned int section_index;
261 };
262
263 struct group
264 {
265 struct group_list * root;
266 unsigned int group_index;
267 };
268
269 static size_t group_count;
270 static struct group * section_groups;
271 static struct group ** section_headers_groups;
272
273 /* A dynamic array of flags indicating for which sections a dump
274 has been requested via command line switches. */
275 static Filedata cmdline;
276
277 static struct dump_list_entry * dump_sects_byname;
278
279 /* How to print a vma value. */
280 typedef enum print_mode
281 {
282 HEX,
283 DEC,
284 DEC_5,
285 UNSIGNED,
286 PREFIX_HEX,
287 FULL_HEX,
288 LONG_HEX
289 }
290 print_mode;
291
292 /* Versioned symbol info. */
293 enum versioned_symbol_info
294 {
295 symbol_undefined,
296 symbol_hidden,
297 symbol_public
298 };
299
300 static const char * get_symbol_version_string
301 (Filedata *, bfd_boolean, const char *, unsigned long, unsigned,
302 Elf_Internal_Sym *, enum versioned_symbol_info *, unsigned short *);
303
304 #define UNKNOWN -1
305
306 #define SECTION_NAME(X) \
307 ((X) == NULL ? _("<none>") \
308 : filedata->string_table == NULL ? _("<no-strings>") \
309 : ((X)->sh_name >= filedata->string_table_length ? _("<corrupt>") \
310 : filedata->string_table + (X)->sh_name))
311
312 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
313
314 #define GET_ELF_SYMBOLS(file, section, sym_count) \
315 (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count) \
316 : get_64bit_elf_symbols (file, section, sym_count))
317
318 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
319 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
320 already been called and verified that the string exists. */
321 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
322
323 #define REMOVE_ARCH_BITS(ADDR) \
324 do \
325 { \
326 if (filedata->file_header.e_machine == EM_ARM) \
327 (ADDR) &= ~1; \
328 } \
329 while (0)
330 \f
331 /* Print a BFD_VMA to an internal buffer, for use in error messages.
332 BFD_FMA_FMT can't be used in translated strings. */
333
334 static const char *
335 bfd_vmatoa (char *fmtch, bfd_vma value)
336 {
337 /* bfd_vmatoa is used more then once in a printf call for output.
338 Cycle through an array of buffers. */
339 static int buf_pos = 0;
340 static struct bfd_vmatoa_buf
341 {
342 char place[64];
343 } buf[4];
344 char *ret;
345 char fmt[32];
346
347 ret = buf[buf_pos++].place;
348 buf_pos %= ARRAY_SIZE (buf);
349
350 sprintf (fmt, "%%%s%s", BFD_VMA_FMT, fmtch);
351 snprintf (ret, sizeof (buf[0].place), fmt, value);
352 return ret;
353 }
354
355 /* Retrieve NMEMB structures, each SIZE bytes long from FILEDATA starting at
356 OFFSET + the offset of the current archive member, if we are examining an
357 archive. Put the retrieved data into VAR, if it is not NULL. Otherwise
358 allocate a buffer using malloc and fill that. In either case return the
359 pointer to the start of the retrieved data or NULL if something went wrong.
360 If something does go wrong and REASON is not NULL then emit an error
361 message using REASON as part of the context. */
362
363 static void *
364 get_data (void * var,
365 Filedata * filedata,
366 unsigned long offset,
367 bfd_size_type size,
368 bfd_size_type nmemb,
369 const char * reason)
370 {
371 void * mvar;
372 bfd_size_type amt = size * nmemb;
373
374 if (size == 0 || nmemb == 0)
375 return NULL;
376
377 /* If the size_t type is smaller than the bfd_size_type, eg because
378 you are building a 32-bit tool on a 64-bit host, then make sure
379 that when the sizes are cast to (size_t) no information is lost. */
380 if (sizeof (size_t) < sizeof (bfd_size_type)
381 && ( (bfd_size_type) ((size_t) size) != size
382 || (bfd_size_type) ((size_t) nmemb) != nmemb))
383 {
384 if (reason)
385 error (_("Size truncation prevents reading %s"
386 " elements of size %s for %s\n"),
387 bfd_vmatoa ("u", nmemb), bfd_vmatoa ("u", size), reason);
388 return NULL;
389 }
390
391 /* Check for size overflow. */
392 if (amt < nmemb)
393 {
394 if (reason)
395 error (_("Size overflow prevents reading %s"
396 " elements of size %s for %s\n"),
397 bfd_vmatoa ("u", nmemb), bfd_vmatoa ("u", size), reason);
398 return NULL;
399 }
400
401 /* Be kind to memory checkers (eg valgrind, address sanitizer) by not
402 attempting to allocate memory when the read is bound to fail. */
403 if (archive_file_offset > filedata->file_size
404 || offset > filedata->file_size - archive_file_offset
405 || amt > filedata->file_size - archive_file_offset - offset)
406 {
407 if (reason)
408 error (_("Reading %s bytes extends past end of file for %s\n"),
409 bfd_vmatoa ("u", amt), reason);
410 return NULL;
411 }
412
413 if (fseek (filedata->handle, archive_file_offset + offset, SEEK_SET))
414 {
415 if (reason)
416 error (_("Unable to seek to 0x%lx for %s\n"),
417 archive_file_offset + offset, reason);
418 return NULL;
419 }
420
421 mvar = var;
422 if (mvar == NULL)
423 {
424 /* Check for overflow. */
425 if (nmemb < (~(bfd_size_type) 0 - 1) / size)
426 /* + 1 so that we can '\0' terminate invalid string table sections. */
427 mvar = malloc ((size_t) amt + 1);
428
429 if (mvar == NULL)
430 {
431 if (reason)
432 error (_("Out of memory allocating %s bytes for %s\n"),
433 bfd_vmatoa ("u", amt), reason);
434 return NULL;
435 }
436
437 ((char *) mvar)[amt] = '\0';
438 }
439
440 if (fread (mvar, (size_t) size, (size_t) nmemb, filedata->handle) != nmemb)
441 {
442 if (reason)
443 error (_("Unable to read in %s bytes of %s\n"),
444 bfd_vmatoa ("u", amt), reason);
445 if (mvar != var)
446 free (mvar);
447 return NULL;
448 }
449
450 return mvar;
451 }
452
453 /* Print a VMA value in the MODE specified.
454 Returns the number of characters displayed. */
455
456 static unsigned int
457 print_vma (bfd_vma vma, print_mode mode)
458 {
459 unsigned int nc = 0;
460
461 switch (mode)
462 {
463 case FULL_HEX:
464 nc = printf ("0x");
465 /* Fall through. */
466 case LONG_HEX:
467 #ifdef BFD64
468 if (is_32bit_elf)
469 return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
470 #endif
471 printf_vma (vma);
472 return nc + 16;
473
474 case DEC_5:
475 if (vma <= 99999)
476 return printf ("%5" BFD_VMA_FMT "d", vma);
477 /* Fall through. */
478 case PREFIX_HEX:
479 nc = printf ("0x");
480 /* Fall through. */
481 case HEX:
482 return nc + printf ("%" BFD_VMA_FMT "x", vma);
483
484 case DEC:
485 return printf ("%" BFD_VMA_FMT "d", vma);
486
487 case UNSIGNED:
488 return printf ("%" BFD_VMA_FMT "u", vma);
489
490 default:
491 /* FIXME: Report unrecognised mode ? */
492 return 0;
493 }
494 }
495
496 /* Display a symbol on stdout. Handles the display of control characters and
497 multibye characters (assuming the host environment supports them).
498
499 Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
500
501 If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
502 padding as necessary.
503
504 Returns the number of emitted characters. */
505
506 static unsigned int
507 print_symbol (signed int width, const char *symbol)
508 {
509 bfd_boolean extra_padding = FALSE;
510 signed int num_printed = 0;
511 #ifdef HAVE_MBSTATE_T
512 mbstate_t state;
513 #endif
514 unsigned int width_remaining;
515
516 if (width < 0)
517 {
518 /* Keep the width positive. This helps the code below. */
519 width = - width;
520 extra_padding = TRUE;
521 }
522 else if (width == 0)
523 return 0;
524
525 if (do_wide)
526 /* Set the remaining width to a very large value.
527 This simplifies the code below. */
528 width_remaining = INT_MAX;
529 else
530 width_remaining = width;
531
532 #ifdef HAVE_MBSTATE_T
533 /* Initialise the multibyte conversion state. */
534 memset (& state, 0, sizeof (state));
535 #endif
536
537 while (width_remaining)
538 {
539 size_t n;
540 const char c = *symbol++;
541
542 if (c == 0)
543 break;
544
545 /* Do not print control characters directly as they can affect terminal
546 settings. Such characters usually appear in the names generated
547 by the assembler for local labels. */
548 if (ISCNTRL (c))
549 {
550 if (width_remaining < 2)
551 break;
552
553 printf ("^%c", c + 0x40);
554 width_remaining -= 2;
555 num_printed += 2;
556 }
557 else if (ISPRINT (c))
558 {
559 putchar (c);
560 width_remaining --;
561 num_printed ++;
562 }
563 else
564 {
565 #ifdef HAVE_MBSTATE_T
566 wchar_t w;
567 #endif
568 /* Let printf do the hard work of displaying multibyte characters. */
569 printf ("%.1s", symbol - 1);
570 width_remaining --;
571 num_printed ++;
572
573 #ifdef HAVE_MBSTATE_T
574 /* Try to find out how many bytes made up the character that was
575 just printed. Advance the symbol pointer past the bytes that
576 were displayed. */
577 n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
578 #else
579 n = 1;
580 #endif
581 if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
582 symbol += (n - 1);
583 }
584 }
585
586 if (extra_padding && num_printed < width)
587 {
588 /* Fill in the remaining spaces. */
589 printf ("%-*s", width - num_printed, " ");
590 num_printed = width;
591 }
592
593 return num_printed;
594 }
595
596 /* Returns a pointer to a static buffer containing a printable version of
597 the given section's name. Like print_symbol, except that it does not try
598 to print multibyte characters, it just interprets them as hex values. */
599
600 static const char *
601 printable_section_name (Filedata * filedata, const Elf_Internal_Shdr * sec)
602 {
603 #define MAX_PRINT_SEC_NAME_LEN 128
604 static char sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
605 const char * name = SECTION_NAME (sec);
606 char * buf = sec_name_buf;
607 char c;
608 unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
609
610 while ((c = * name ++) != 0)
611 {
612 if (ISCNTRL (c))
613 {
614 if (remaining < 2)
615 break;
616
617 * buf ++ = '^';
618 * buf ++ = c + 0x40;
619 remaining -= 2;
620 }
621 else if (ISPRINT (c))
622 {
623 * buf ++ = c;
624 remaining -= 1;
625 }
626 else
627 {
628 static char hex[17] = "0123456789ABCDEF";
629
630 if (remaining < 4)
631 break;
632 * buf ++ = '<';
633 * buf ++ = hex[(c & 0xf0) >> 4];
634 * buf ++ = hex[c & 0x0f];
635 * buf ++ = '>';
636 remaining -= 4;
637 }
638
639 if (remaining == 0)
640 break;
641 }
642
643 * buf = 0;
644 return sec_name_buf;
645 }
646
647 static const char *
648 printable_section_name_from_index (Filedata * filedata, unsigned long ndx)
649 {
650 if (ndx >= filedata->file_header.e_shnum)
651 return _("<corrupt>");
652
653 return printable_section_name (filedata, filedata->section_headers + ndx);
654 }
655
656 /* Return a pointer to section NAME, or NULL if no such section exists. */
657
658 static Elf_Internal_Shdr *
659 find_section (Filedata * filedata, const char * name)
660 {
661 unsigned int i;
662
663 if (filedata->section_headers == NULL)
664 return NULL;
665
666 for (i = 0; i < filedata->file_header.e_shnum; i++)
667 if (streq (SECTION_NAME (filedata->section_headers + i), name))
668 return filedata->section_headers + i;
669
670 return NULL;
671 }
672
673 /* Return a pointer to a section containing ADDR, or NULL if no such
674 section exists. */
675
676 static Elf_Internal_Shdr *
677 find_section_by_address (Filedata * filedata, bfd_vma addr)
678 {
679 unsigned int i;
680
681 if (filedata->section_headers == NULL)
682 return NULL;
683
684 for (i = 0; i < filedata->file_header.e_shnum; i++)
685 {
686 Elf_Internal_Shdr *sec = filedata->section_headers + i;
687
688 if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
689 return sec;
690 }
691
692 return NULL;
693 }
694
695 static Elf_Internal_Shdr *
696 find_section_by_type (Filedata * filedata, unsigned int type)
697 {
698 unsigned int i;
699
700 if (filedata->section_headers == NULL)
701 return NULL;
702
703 for (i = 0; i < filedata->file_header.e_shnum; i++)
704 {
705 Elf_Internal_Shdr *sec = filedata->section_headers + i;
706
707 if (sec->sh_type == type)
708 return sec;
709 }
710
711 return NULL;
712 }
713
714 /* Return a pointer to section NAME, or NULL if no such section exists,
715 restricted to the list of sections given in SET. */
716
717 static Elf_Internal_Shdr *
718 find_section_in_set (Filedata * filedata, const char * name, unsigned int * set)
719 {
720 unsigned int i;
721
722 if (filedata->section_headers == NULL)
723 return NULL;
724
725 if (set != NULL)
726 {
727 while ((i = *set++) > 0)
728 {
729 /* See PR 21156 for a reproducer. */
730 if (i >= filedata->file_header.e_shnum)
731 continue; /* FIXME: Should we issue an error message ? */
732
733 if (streq (SECTION_NAME (filedata->section_headers + i), name))
734 return filedata->section_headers + i;
735 }
736 }
737
738 return find_section (filedata, name);
739 }
740
741 /* Read an unsigned LEB128 encoded value from DATA.
742 Set *LENGTH_RETURN to the number of bytes read. */
743
744 static inline unsigned long
745 read_uleb128 (unsigned char * data,
746 unsigned int * length_return,
747 const unsigned char * const end)
748 {
749 return read_leb128 (data, length_return, FALSE, end);
750 }
751
752 /* Return TRUE if the current file is for IA-64 machine and OpenVMS ABI.
753 This OS has so many departures from the ELF standard that we test it at
754 many places. */
755
756 static inline bfd_boolean
757 is_ia64_vms (Filedata * filedata)
758 {
759 return filedata->file_header.e_machine == EM_IA_64
760 && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
761 }
762
763 /* Guess the relocation size commonly used by the specific machines. */
764
765 static bfd_boolean
766 guess_is_rela (unsigned int e_machine)
767 {
768 switch (e_machine)
769 {
770 /* Targets that use REL relocations. */
771 case EM_386:
772 case EM_IAMCU:
773 case EM_960:
774 case EM_ARM:
775 case EM_D10V:
776 case EM_CYGNUS_D10V:
777 case EM_DLX:
778 case EM_MIPS:
779 case EM_MIPS_RS3_LE:
780 case EM_CYGNUS_M32R:
781 case EM_SCORE:
782 case EM_XGATE:
783 case EM_NFP:
784 return FALSE;
785
786 /* Targets that use RELA relocations. */
787 case EM_68K:
788 case EM_860:
789 case EM_AARCH64:
790 case EM_ADAPTEVA_EPIPHANY:
791 case EM_ALPHA:
792 case EM_ALTERA_NIOS2:
793 case EM_ARC:
794 case EM_ARC_COMPACT:
795 case EM_ARC_COMPACT2:
796 case EM_AVR:
797 case EM_AVR_OLD:
798 case EM_BLACKFIN:
799 case EM_CR16:
800 case EM_CRIS:
801 case EM_CRX:
802 case EM_CSKY:
803 case EM_D30V:
804 case EM_CYGNUS_D30V:
805 case EM_FR30:
806 case EM_FT32:
807 case EM_CYGNUS_FR30:
808 case EM_CYGNUS_FRV:
809 case EM_H8S:
810 case EM_H8_300:
811 case EM_H8_300H:
812 case EM_IA_64:
813 case EM_IP2K:
814 case EM_IP2K_OLD:
815 case EM_IQ2000:
816 case EM_LATTICEMICO32:
817 case EM_M32C_OLD:
818 case EM_M32C:
819 case EM_M32R:
820 case EM_MCORE:
821 case EM_CYGNUS_MEP:
822 case EM_METAG:
823 case EM_MMIX:
824 case EM_MN10200:
825 case EM_CYGNUS_MN10200:
826 case EM_MN10300:
827 case EM_CYGNUS_MN10300:
828 case EM_MOXIE:
829 case EM_MSP430:
830 case EM_MSP430_OLD:
831 case EM_MT:
832 case EM_NDS32:
833 case EM_NIOS32:
834 case EM_OR1K:
835 case EM_PPC64:
836 case EM_PPC:
837 case EM_TI_PRU:
838 case EM_RISCV:
839 case EM_RL78:
840 case EM_RX:
841 case EM_S390:
842 case EM_S390_OLD:
843 case EM_SH:
844 case EM_SPARC:
845 case EM_SPARC32PLUS:
846 case EM_SPARCV9:
847 case EM_SPU:
848 case EM_TI_C6000:
849 case EM_TILEGX:
850 case EM_TILEPRO:
851 case EM_V800:
852 case EM_V850:
853 case EM_CYGNUS_V850:
854 case EM_VAX:
855 case EM_VISIUM:
856 case EM_X86_64:
857 case EM_L1OM:
858 case EM_K1OM:
859 case EM_XSTORMY16:
860 case EM_XTENSA:
861 case EM_XTENSA_OLD:
862 case EM_MICROBLAZE:
863 case EM_MICROBLAZE_OLD:
864 case EM_WEBASSEMBLY:
865 return TRUE;
866
867 case EM_68HC05:
868 case EM_68HC08:
869 case EM_68HC11:
870 case EM_68HC16:
871 case EM_FX66:
872 case EM_ME16:
873 case EM_MMA:
874 case EM_NCPU:
875 case EM_NDR1:
876 case EM_PCP:
877 case EM_ST100:
878 case EM_ST19:
879 case EM_ST7:
880 case EM_ST9PLUS:
881 case EM_STARCORE:
882 case EM_SVX:
883 case EM_TINYJ:
884 default:
885 warn (_("Don't know about relocations on this machine architecture\n"));
886 return FALSE;
887 }
888 }
889
890 /* Load RELA type relocations from FILEDATA at REL_OFFSET extending for REL_SIZE bytes.
891 Returns TRUE upon success, FALSE otherwise. If successful then a
892 pointer to a malloc'ed buffer containing the relocs is placed in *RELASP,
893 and the number of relocs loaded is placed in *NRELASP. It is the caller's
894 responsibility to free the allocated buffer. */
895
896 static bfd_boolean
897 slurp_rela_relocs (Filedata * filedata,
898 unsigned long rel_offset,
899 unsigned long rel_size,
900 Elf_Internal_Rela ** relasp,
901 unsigned long * nrelasp)
902 {
903 Elf_Internal_Rela * relas;
904 size_t nrelas;
905 unsigned int i;
906
907 if (is_32bit_elf)
908 {
909 Elf32_External_Rela * erelas;
910
911 erelas = (Elf32_External_Rela *) get_data (NULL, filedata, rel_offset, 1,
912 rel_size, _("32-bit relocation data"));
913 if (!erelas)
914 return FALSE;
915
916 nrelas = rel_size / sizeof (Elf32_External_Rela);
917
918 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
919 sizeof (Elf_Internal_Rela));
920
921 if (relas == NULL)
922 {
923 free (erelas);
924 error (_("out of memory parsing relocs\n"));
925 return FALSE;
926 }
927
928 for (i = 0; i < nrelas; i++)
929 {
930 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
931 relas[i].r_info = BYTE_GET (erelas[i].r_info);
932 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
933 }
934
935 free (erelas);
936 }
937 else
938 {
939 Elf64_External_Rela * erelas;
940
941 erelas = (Elf64_External_Rela *) get_data (NULL, filedata, rel_offset, 1,
942 rel_size, _("64-bit relocation data"));
943 if (!erelas)
944 return FALSE;
945
946 nrelas = rel_size / sizeof (Elf64_External_Rela);
947
948 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
949 sizeof (Elf_Internal_Rela));
950
951 if (relas == NULL)
952 {
953 free (erelas);
954 error (_("out of memory parsing relocs\n"));
955 return FALSE;
956 }
957
958 for (i = 0; i < nrelas; i++)
959 {
960 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
961 relas[i].r_info = BYTE_GET (erelas[i].r_info);
962 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
963
964 /* The #ifdef BFD64 below is to prevent a compile time
965 warning. We know that if we do not have a 64 bit data
966 type that we will never execute this code anyway. */
967 #ifdef BFD64
968 if (filedata->file_header.e_machine == EM_MIPS
969 && filedata->file_header.e_ident[EI_DATA] != ELFDATA2MSB)
970 {
971 /* In little-endian objects, r_info isn't really a
972 64-bit little-endian value: it has a 32-bit
973 little-endian symbol index followed by four
974 individual byte fields. Reorder INFO
975 accordingly. */
976 bfd_vma inf = relas[i].r_info;
977 inf = (((inf & 0xffffffff) << 32)
978 | ((inf >> 56) & 0xff)
979 | ((inf >> 40) & 0xff00)
980 | ((inf >> 24) & 0xff0000)
981 | ((inf >> 8) & 0xff000000));
982 relas[i].r_info = inf;
983 }
984 #endif /* BFD64 */
985 }
986
987 free (erelas);
988 }
989
990 *relasp = relas;
991 *nrelasp = nrelas;
992 return TRUE;
993 }
994
995 /* Load REL type relocations from FILEDATA at REL_OFFSET extending for REL_SIZE bytes.
996 Returns TRUE upon success, FALSE otherwise. If successful then a
997 pointer to a malloc'ed buffer containing the relocs is placed in *RELSP,
998 and the number of relocs loaded is placed in *NRELSP. It is the caller's
999 responsibility to free the allocated buffer. */
1000
1001 static bfd_boolean
1002 slurp_rel_relocs (Filedata * filedata,
1003 unsigned long rel_offset,
1004 unsigned long rel_size,
1005 Elf_Internal_Rela ** relsp,
1006 unsigned long * nrelsp)
1007 {
1008 Elf_Internal_Rela * rels;
1009 size_t nrels;
1010 unsigned int i;
1011
1012 if (is_32bit_elf)
1013 {
1014 Elf32_External_Rel * erels;
1015
1016 erels = (Elf32_External_Rel *) get_data (NULL, filedata, rel_offset, 1,
1017 rel_size, _("32-bit relocation data"));
1018 if (!erels)
1019 return FALSE;
1020
1021 nrels = rel_size / sizeof (Elf32_External_Rel);
1022
1023 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
1024
1025 if (rels == NULL)
1026 {
1027 free (erels);
1028 error (_("out of memory parsing relocs\n"));
1029 return FALSE;
1030 }
1031
1032 for (i = 0; i < nrels; i++)
1033 {
1034 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
1035 rels[i].r_info = BYTE_GET (erels[i].r_info);
1036 rels[i].r_addend = 0;
1037 }
1038
1039 free (erels);
1040 }
1041 else
1042 {
1043 Elf64_External_Rel * erels;
1044
1045 erels = (Elf64_External_Rel *) get_data (NULL, filedata, rel_offset, 1,
1046 rel_size, _("64-bit relocation data"));
1047 if (!erels)
1048 return FALSE;
1049
1050 nrels = rel_size / sizeof (Elf64_External_Rel);
1051
1052 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
1053
1054 if (rels == NULL)
1055 {
1056 free (erels);
1057 error (_("out of memory parsing relocs\n"));
1058 return FALSE;
1059 }
1060
1061 for (i = 0; i < nrels; i++)
1062 {
1063 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
1064 rels[i].r_info = BYTE_GET (erels[i].r_info);
1065 rels[i].r_addend = 0;
1066
1067 /* The #ifdef BFD64 below is to prevent a compile time
1068 warning. We know that if we do not have a 64 bit data
1069 type that we will never execute this code anyway. */
1070 #ifdef BFD64
1071 if (filedata->file_header.e_machine == EM_MIPS
1072 && filedata->file_header.e_ident[EI_DATA] != ELFDATA2MSB)
1073 {
1074 /* In little-endian objects, r_info isn't really a
1075 64-bit little-endian value: it has a 32-bit
1076 little-endian symbol index followed by four
1077 individual byte fields. Reorder INFO
1078 accordingly. */
1079 bfd_vma inf = rels[i].r_info;
1080 inf = (((inf & 0xffffffff) << 32)
1081 | ((inf >> 56) & 0xff)
1082 | ((inf >> 40) & 0xff00)
1083 | ((inf >> 24) & 0xff0000)
1084 | ((inf >> 8) & 0xff000000));
1085 rels[i].r_info = inf;
1086 }
1087 #endif /* BFD64 */
1088 }
1089
1090 free (erels);
1091 }
1092
1093 *relsp = rels;
1094 *nrelsp = nrels;
1095 return TRUE;
1096 }
1097
1098 /* Returns the reloc type extracted from the reloc info field. */
1099
1100 static unsigned int
1101 get_reloc_type (Filedata * filedata, bfd_vma reloc_info)
1102 {
1103 if (is_32bit_elf)
1104 return ELF32_R_TYPE (reloc_info);
1105
1106 switch (filedata->file_header.e_machine)
1107 {
1108 case EM_MIPS:
1109 /* Note: We assume that reloc_info has already been adjusted for us. */
1110 return ELF64_MIPS_R_TYPE (reloc_info);
1111
1112 case EM_SPARCV9:
1113 return ELF64_R_TYPE_ID (reloc_info);
1114
1115 default:
1116 return ELF64_R_TYPE (reloc_info);
1117 }
1118 }
1119
1120 /* Return the symbol index extracted from the reloc info field. */
1121
1122 static bfd_vma
1123 get_reloc_symindex (bfd_vma reloc_info)
1124 {
1125 return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
1126 }
1127
1128 static inline bfd_boolean
1129 uses_msp430x_relocs (Filedata * filedata)
1130 {
1131 return
1132 filedata->file_header.e_machine == EM_MSP430 /* Paranoia. */
1133 /* GCC uses osabi == ELFOSBI_STANDALONE. */
1134 && (((filedata->file_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
1135 /* TI compiler uses ELFOSABI_NONE. */
1136 || (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
1137 }
1138
1139 /* Display the contents of the relocation data found at the specified
1140 offset. */
1141
1142 static bfd_boolean
1143 dump_relocations (Filedata * filedata,
1144 unsigned long rel_offset,
1145 unsigned long rel_size,
1146 Elf_Internal_Sym * symtab,
1147 unsigned long nsyms,
1148 char * strtab,
1149 unsigned long strtablen,
1150 int is_rela,
1151 bfd_boolean is_dynsym)
1152 {
1153 unsigned long i;
1154 Elf_Internal_Rela * rels;
1155 bfd_boolean res = TRUE;
1156
1157 if (is_rela == UNKNOWN)
1158 is_rela = guess_is_rela (filedata->file_header.e_machine);
1159
1160 if (is_rela)
1161 {
1162 if (!slurp_rela_relocs (filedata, rel_offset, rel_size, &rels, &rel_size))
1163 return FALSE;
1164 }
1165 else
1166 {
1167 if (!slurp_rel_relocs (filedata, rel_offset, rel_size, &rels, &rel_size))
1168 return FALSE;
1169 }
1170
1171 if (is_32bit_elf)
1172 {
1173 if (is_rela)
1174 {
1175 if (do_wide)
1176 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
1177 else
1178 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
1179 }
1180 else
1181 {
1182 if (do_wide)
1183 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
1184 else
1185 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
1186 }
1187 }
1188 else
1189 {
1190 if (is_rela)
1191 {
1192 if (do_wide)
1193 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
1194 else
1195 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
1196 }
1197 else
1198 {
1199 if (do_wide)
1200 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
1201 else
1202 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
1203 }
1204 }
1205
1206 for (i = 0; i < rel_size; i++)
1207 {
1208 const char * rtype;
1209 bfd_vma offset;
1210 bfd_vma inf;
1211 bfd_vma symtab_index;
1212 bfd_vma type;
1213
1214 offset = rels[i].r_offset;
1215 inf = rels[i].r_info;
1216
1217 type = get_reloc_type (filedata, inf);
1218 symtab_index = get_reloc_symindex (inf);
1219
1220 if (is_32bit_elf)
1221 {
1222 printf ("%8.8lx %8.8lx ",
1223 (unsigned long) offset & 0xffffffff,
1224 (unsigned long) inf & 0xffffffff);
1225 }
1226 else
1227 {
1228 #if BFD_HOST_64BIT_LONG
1229 printf (do_wide
1230 ? "%16.16lx %16.16lx "
1231 : "%12.12lx %12.12lx ",
1232 offset, inf);
1233 #elif BFD_HOST_64BIT_LONG_LONG
1234 #ifndef __MSVCRT__
1235 printf (do_wide
1236 ? "%16.16llx %16.16llx "
1237 : "%12.12llx %12.12llx ",
1238 offset, inf);
1239 #else
1240 printf (do_wide
1241 ? "%16.16I64x %16.16I64x "
1242 : "%12.12I64x %12.12I64x ",
1243 offset, inf);
1244 #endif
1245 #else
1246 printf (do_wide
1247 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1248 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
1249 _bfd_int64_high (offset),
1250 _bfd_int64_low (offset),
1251 _bfd_int64_high (inf),
1252 _bfd_int64_low (inf));
1253 #endif
1254 }
1255
1256 switch (filedata->file_header.e_machine)
1257 {
1258 default:
1259 rtype = NULL;
1260 break;
1261
1262 case EM_AARCH64:
1263 rtype = elf_aarch64_reloc_type (type);
1264 break;
1265
1266 case EM_M32R:
1267 case EM_CYGNUS_M32R:
1268 rtype = elf_m32r_reloc_type (type);
1269 break;
1270
1271 case EM_386:
1272 case EM_IAMCU:
1273 rtype = elf_i386_reloc_type (type);
1274 break;
1275
1276 case EM_68HC11:
1277 case EM_68HC12:
1278 rtype = elf_m68hc11_reloc_type (type);
1279 break;
1280
1281 case EM_S12Z:
1282 rtype = elf_s12z_reloc_type (type);
1283 break;
1284
1285 case EM_68K:
1286 rtype = elf_m68k_reloc_type (type);
1287 break;
1288
1289 case EM_960:
1290 rtype = elf_i960_reloc_type (type);
1291 break;
1292
1293 case EM_AVR:
1294 case EM_AVR_OLD:
1295 rtype = elf_avr_reloc_type (type);
1296 break;
1297
1298 case EM_OLD_SPARCV9:
1299 case EM_SPARC32PLUS:
1300 case EM_SPARCV9:
1301 case EM_SPARC:
1302 rtype = elf_sparc_reloc_type (type);
1303 break;
1304
1305 case EM_SPU:
1306 rtype = elf_spu_reloc_type (type);
1307 break;
1308
1309 case EM_V800:
1310 rtype = v800_reloc_type (type);
1311 break;
1312 case EM_V850:
1313 case EM_CYGNUS_V850:
1314 rtype = v850_reloc_type (type);
1315 break;
1316
1317 case EM_D10V:
1318 case EM_CYGNUS_D10V:
1319 rtype = elf_d10v_reloc_type (type);
1320 break;
1321
1322 case EM_D30V:
1323 case EM_CYGNUS_D30V:
1324 rtype = elf_d30v_reloc_type (type);
1325 break;
1326
1327 case EM_DLX:
1328 rtype = elf_dlx_reloc_type (type);
1329 break;
1330
1331 case EM_SH:
1332 rtype = elf_sh_reloc_type (type);
1333 break;
1334
1335 case EM_MN10300:
1336 case EM_CYGNUS_MN10300:
1337 rtype = elf_mn10300_reloc_type (type);
1338 break;
1339
1340 case EM_MN10200:
1341 case EM_CYGNUS_MN10200:
1342 rtype = elf_mn10200_reloc_type (type);
1343 break;
1344
1345 case EM_FR30:
1346 case EM_CYGNUS_FR30:
1347 rtype = elf_fr30_reloc_type (type);
1348 break;
1349
1350 case EM_CYGNUS_FRV:
1351 rtype = elf_frv_reloc_type (type);
1352 break;
1353
1354 case EM_CSKY:
1355 rtype = elf_csky_reloc_type (type);
1356 break;
1357
1358 case EM_FT32:
1359 rtype = elf_ft32_reloc_type (type);
1360 break;
1361
1362 case EM_MCORE:
1363 rtype = elf_mcore_reloc_type (type);
1364 break;
1365
1366 case EM_MMIX:
1367 rtype = elf_mmix_reloc_type (type);
1368 break;
1369
1370 case EM_MOXIE:
1371 rtype = elf_moxie_reloc_type (type);
1372 break;
1373
1374 case EM_MSP430:
1375 if (uses_msp430x_relocs (filedata))
1376 {
1377 rtype = elf_msp430x_reloc_type (type);
1378 break;
1379 }
1380 /* Fall through. */
1381 case EM_MSP430_OLD:
1382 rtype = elf_msp430_reloc_type (type);
1383 break;
1384
1385 case EM_NDS32:
1386 rtype = elf_nds32_reloc_type (type);
1387 break;
1388
1389 case EM_PPC:
1390 rtype = elf_ppc_reloc_type (type);
1391 break;
1392
1393 case EM_PPC64:
1394 rtype = elf_ppc64_reloc_type (type);
1395 break;
1396
1397 case EM_MIPS:
1398 case EM_MIPS_RS3_LE:
1399 rtype = elf_mips_reloc_type (type);
1400 break;
1401
1402 case EM_RISCV:
1403 rtype = elf_riscv_reloc_type (type);
1404 break;
1405
1406 case EM_ALPHA:
1407 rtype = elf_alpha_reloc_type (type);
1408 break;
1409
1410 case EM_ARM:
1411 rtype = elf_arm_reloc_type (type);
1412 break;
1413
1414 case EM_ARC:
1415 case EM_ARC_COMPACT:
1416 case EM_ARC_COMPACT2:
1417 rtype = elf_arc_reloc_type (type);
1418 break;
1419
1420 case EM_PARISC:
1421 rtype = elf_hppa_reloc_type (type);
1422 break;
1423
1424 case EM_H8_300:
1425 case EM_H8_300H:
1426 case EM_H8S:
1427 rtype = elf_h8_reloc_type (type);
1428 break;
1429
1430 case EM_OR1K:
1431 rtype = elf_or1k_reloc_type (type);
1432 break;
1433
1434 case EM_PJ:
1435 case EM_PJ_OLD:
1436 rtype = elf_pj_reloc_type (type);
1437 break;
1438 case EM_IA_64:
1439 rtype = elf_ia64_reloc_type (type);
1440 break;
1441
1442 case EM_CRIS:
1443 rtype = elf_cris_reloc_type (type);
1444 break;
1445
1446 case EM_860:
1447 rtype = elf_i860_reloc_type (type);
1448 break;
1449
1450 case EM_X86_64:
1451 case EM_L1OM:
1452 case EM_K1OM:
1453 rtype = elf_x86_64_reloc_type (type);
1454 break;
1455
1456 case EM_S370:
1457 rtype = i370_reloc_type (type);
1458 break;
1459
1460 case EM_S390_OLD:
1461 case EM_S390:
1462 rtype = elf_s390_reloc_type (type);
1463 break;
1464
1465 case EM_SCORE:
1466 rtype = elf_score_reloc_type (type);
1467 break;
1468
1469 case EM_XSTORMY16:
1470 rtype = elf_xstormy16_reloc_type (type);
1471 break;
1472
1473 case EM_CRX:
1474 rtype = elf_crx_reloc_type (type);
1475 break;
1476
1477 case EM_VAX:
1478 rtype = elf_vax_reloc_type (type);
1479 break;
1480
1481 case EM_VISIUM:
1482 rtype = elf_visium_reloc_type (type);
1483 break;
1484
1485 case EM_ADAPTEVA_EPIPHANY:
1486 rtype = elf_epiphany_reloc_type (type);
1487 break;
1488
1489 case EM_IP2K:
1490 case EM_IP2K_OLD:
1491 rtype = elf_ip2k_reloc_type (type);
1492 break;
1493
1494 case EM_IQ2000:
1495 rtype = elf_iq2000_reloc_type (type);
1496 break;
1497
1498 case EM_XTENSA_OLD:
1499 case EM_XTENSA:
1500 rtype = elf_xtensa_reloc_type (type);
1501 break;
1502
1503 case EM_LATTICEMICO32:
1504 rtype = elf_lm32_reloc_type (type);
1505 break;
1506
1507 case EM_M32C_OLD:
1508 case EM_M32C:
1509 rtype = elf_m32c_reloc_type (type);
1510 break;
1511
1512 case EM_MT:
1513 rtype = elf_mt_reloc_type (type);
1514 break;
1515
1516 case EM_BLACKFIN:
1517 rtype = elf_bfin_reloc_type (type);
1518 break;
1519
1520 case EM_CYGNUS_MEP:
1521 rtype = elf_mep_reloc_type (type);
1522 break;
1523
1524 case EM_CR16:
1525 rtype = elf_cr16_reloc_type (type);
1526 break;
1527
1528 case EM_MICROBLAZE:
1529 case EM_MICROBLAZE_OLD:
1530 rtype = elf_microblaze_reloc_type (type);
1531 break;
1532
1533 case EM_RL78:
1534 rtype = elf_rl78_reloc_type (type);
1535 break;
1536
1537 case EM_RX:
1538 rtype = elf_rx_reloc_type (type);
1539 break;
1540
1541 case EM_METAG:
1542 rtype = elf_metag_reloc_type (type);
1543 break;
1544
1545 case EM_XC16X:
1546 case EM_C166:
1547 rtype = elf_xc16x_reloc_type (type);
1548 break;
1549
1550 case EM_TI_C6000:
1551 rtype = elf_tic6x_reloc_type (type);
1552 break;
1553
1554 case EM_TILEGX:
1555 rtype = elf_tilegx_reloc_type (type);
1556 break;
1557
1558 case EM_TILEPRO:
1559 rtype = elf_tilepro_reloc_type (type);
1560 break;
1561
1562 case EM_WEBASSEMBLY:
1563 rtype = elf_wasm32_reloc_type (type);
1564 break;
1565
1566 case EM_XGATE:
1567 rtype = elf_xgate_reloc_type (type);
1568 break;
1569
1570 case EM_ALTERA_NIOS2:
1571 rtype = elf_nios2_reloc_type (type);
1572 break;
1573
1574 case EM_TI_PRU:
1575 rtype = elf_pru_reloc_type (type);
1576 break;
1577
1578 case EM_NFP:
1579 if (EF_NFP_MACH (filedata->file_header.e_flags) == E_NFP_MACH_3200)
1580 rtype = elf_nfp3200_reloc_type (type);
1581 else
1582 rtype = elf_nfp_reloc_type (type);
1583 break;
1584 }
1585
1586 if (rtype == NULL)
1587 printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1588 else
1589 printf (do_wide ? "%-22s" : "%-17.17s", rtype);
1590
1591 if (filedata->file_header.e_machine == EM_ALPHA
1592 && rtype != NULL
1593 && streq (rtype, "R_ALPHA_LITUSE")
1594 && is_rela)
1595 {
1596 switch (rels[i].r_addend)
1597 {
1598 case LITUSE_ALPHA_ADDR: rtype = "ADDR"; break;
1599 case LITUSE_ALPHA_BASE: rtype = "BASE"; break;
1600 case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1601 case LITUSE_ALPHA_JSR: rtype = "JSR"; break;
1602 case LITUSE_ALPHA_TLSGD: rtype = "TLSGD"; break;
1603 case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1604 case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1605 default: rtype = NULL;
1606 }
1607
1608 if (rtype)
1609 printf (" (%s)", rtype);
1610 else
1611 {
1612 putchar (' ');
1613 printf (_("<unknown addend: %lx>"),
1614 (unsigned long) rels[i].r_addend);
1615 res = FALSE;
1616 }
1617 }
1618 else if (symtab_index)
1619 {
1620 if (symtab == NULL || symtab_index >= nsyms)
1621 {
1622 error (_(" bad symbol index: %08lx in reloc"), (unsigned long) symtab_index);
1623 res = FALSE;
1624 }
1625 else
1626 {
1627 Elf_Internal_Sym * psym;
1628 const char * version_string;
1629 enum versioned_symbol_info sym_info;
1630 unsigned short vna_other;
1631
1632 psym = symtab + symtab_index;
1633
1634 version_string
1635 = get_symbol_version_string (filedata, is_dynsym,
1636 strtab, strtablen,
1637 symtab_index,
1638 psym,
1639 &sym_info,
1640 &vna_other);
1641
1642 printf (" ");
1643
1644 if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1645 {
1646 const char * name;
1647 unsigned int len;
1648 unsigned int width = is_32bit_elf ? 8 : 14;
1649
1650 /* Relocations against GNU_IFUNC symbols do not use the value
1651 of the symbol as the address to relocate against. Instead
1652 they invoke the function named by the symbol and use its
1653 result as the address for relocation.
1654
1655 To indicate this to the user, do not display the value of
1656 the symbol in the "Symbols's Value" field. Instead show
1657 its name followed by () as a hint that the symbol is
1658 invoked. */
1659
1660 if (strtab == NULL
1661 || psym->st_name == 0
1662 || psym->st_name >= strtablen)
1663 name = "??";
1664 else
1665 name = strtab + psym->st_name;
1666
1667 len = print_symbol (width, name);
1668 if (version_string)
1669 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1670 version_string);
1671 printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1672 }
1673 else
1674 {
1675 print_vma (psym->st_value, LONG_HEX);
1676
1677 printf (is_32bit_elf ? " " : " ");
1678 }
1679
1680 if (psym->st_name == 0)
1681 {
1682 const char * sec_name = "<null>";
1683 char name_buf[40];
1684
1685 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1686 {
1687 if (psym->st_shndx < filedata->file_header.e_shnum)
1688 sec_name = SECTION_NAME (filedata->section_headers + psym->st_shndx);
1689 else if (psym->st_shndx == SHN_ABS)
1690 sec_name = "ABS";
1691 else if (psym->st_shndx == SHN_COMMON)
1692 sec_name = "COMMON";
1693 else if ((filedata->file_header.e_machine == EM_MIPS
1694 && psym->st_shndx == SHN_MIPS_SCOMMON)
1695 || (filedata->file_header.e_machine == EM_TI_C6000
1696 && psym->st_shndx == SHN_TIC6X_SCOMMON))
1697 sec_name = "SCOMMON";
1698 else if (filedata->file_header.e_machine == EM_MIPS
1699 && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1700 sec_name = "SUNDEF";
1701 else if ((filedata->file_header.e_machine == EM_X86_64
1702 || filedata->file_header.e_machine == EM_L1OM
1703 || filedata->file_header.e_machine == EM_K1OM)
1704 && psym->st_shndx == SHN_X86_64_LCOMMON)
1705 sec_name = "LARGE_COMMON";
1706 else if (filedata->file_header.e_machine == EM_IA_64
1707 && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1708 && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1709 sec_name = "ANSI_COM";
1710 else if (is_ia64_vms (filedata)
1711 && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1712 sec_name = "VMS_SYMVEC";
1713 else
1714 {
1715 sprintf (name_buf, "<section 0x%x>",
1716 (unsigned int) psym->st_shndx);
1717 sec_name = name_buf;
1718 }
1719 }
1720 print_symbol (22, sec_name);
1721 }
1722 else if (strtab == NULL)
1723 printf (_("<string table index: %3ld>"), psym->st_name);
1724 else if (psym->st_name >= strtablen)
1725 {
1726 error (_("<corrupt string table index: %3ld>"), psym->st_name);
1727 res = FALSE;
1728 }
1729 else
1730 {
1731 print_symbol (22, strtab + psym->st_name);
1732 if (version_string)
1733 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1734 version_string);
1735 }
1736
1737 if (is_rela)
1738 {
1739 bfd_vma off = rels[i].r_addend;
1740
1741 if ((bfd_signed_vma) off < 0)
1742 printf (" - %" BFD_VMA_FMT "x", - off);
1743 else
1744 printf (" + %" BFD_VMA_FMT "x", off);
1745 }
1746 }
1747 }
1748 else if (is_rela)
1749 {
1750 bfd_vma off = rels[i].r_addend;
1751
1752 printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1753 if ((bfd_signed_vma) off < 0)
1754 printf ("-%" BFD_VMA_FMT "x", - off);
1755 else
1756 printf ("%" BFD_VMA_FMT "x", off);
1757 }
1758
1759 if (filedata->file_header.e_machine == EM_SPARCV9
1760 && rtype != NULL
1761 && streq (rtype, "R_SPARC_OLO10"))
1762 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1763
1764 putchar ('\n');
1765
1766 #ifdef BFD64
1767 if (! is_32bit_elf && filedata->file_header.e_machine == EM_MIPS)
1768 {
1769 bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1770 bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1771 const char * rtype2 = elf_mips_reloc_type (type2);
1772 const char * rtype3 = elf_mips_reloc_type (type3);
1773
1774 printf (" Type2: ");
1775
1776 if (rtype2 == NULL)
1777 printf (_("unrecognized: %-7lx"),
1778 (unsigned long) type2 & 0xffffffff);
1779 else
1780 printf ("%-17.17s", rtype2);
1781
1782 printf ("\n Type3: ");
1783
1784 if (rtype3 == NULL)
1785 printf (_("unrecognized: %-7lx"),
1786 (unsigned long) type3 & 0xffffffff);
1787 else
1788 printf ("%-17.17s", rtype3);
1789
1790 putchar ('\n');
1791 }
1792 #endif /* BFD64 */
1793 }
1794
1795 free (rels);
1796
1797 return res;
1798 }
1799
1800 static const char *
1801 get_aarch64_dynamic_type (unsigned long type)
1802 {
1803 switch (type)
1804 {
1805 case DT_AARCH64_BTI_PLT: return "AARCH64_BTI_PLT";
1806 case DT_AARCH64_PAC_PLT: return "AARCH64_PAC_PLT";
1807 default:
1808 return NULL;
1809 }
1810 }
1811
1812 static const char *
1813 get_mips_dynamic_type (unsigned long type)
1814 {
1815 switch (type)
1816 {
1817 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1818 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1819 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1820 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1821 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1822 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1823 case DT_MIPS_MSYM: return "MIPS_MSYM";
1824 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1825 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1826 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1827 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1828 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1829 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1830 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1831 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1832 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1833 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1834 case DT_MIPS_RLD_MAP_REL: return "MIPS_RLD_MAP_REL";
1835 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1836 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1837 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1838 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1839 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1840 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1841 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1842 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1843 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1844 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1845 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1846 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1847 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1848 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1849 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1850 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1851 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1852 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1853 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1854 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1855 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1856 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1857 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1858 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1859 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1860 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1861 case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1862 case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1863 default:
1864 return NULL;
1865 }
1866 }
1867
1868 static const char *
1869 get_sparc64_dynamic_type (unsigned long type)
1870 {
1871 switch (type)
1872 {
1873 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1874 default:
1875 return NULL;
1876 }
1877 }
1878
1879 static const char *
1880 get_ppc_dynamic_type (unsigned long type)
1881 {
1882 switch (type)
1883 {
1884 case DT_PPC_GOT: return "PPC_GOT";
1885 case DT_PPC_OPT: return "PPC_OPT";
1886 default:
1887 return NULL;
1888 }
1889 }
1890
1891 static const char *
1892 get_ppc64_dynamic_type (unsigned long type)
1893 {
1894 switch (type)
1895 {
1896 case DT_PPC64_GLINK: return "PPC64_GLINK";
1897 case DT_PPC64_OPD: return "PPC64_OPD";
1898 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
1899 case DT_PPC64_OPT: return "PPC64_OPT";
1900 default:
1901 return NULL;
1902 }
1903 }
1904
1905 static const char *
1906 get_parisc_dynamic_type (unsigned long type)
1907 {
1908 switch (type)
1909 {
1910 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1911 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1912 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1913 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1914 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1915 case DT_HP_PREINIT: return "HP_PREINIT";
1916 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1917 case DT_HP_NEEDED: return "HP_NEEDED";
1918 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1919 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1920 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1921 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1922 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1923 case DT_HP_EPLTREL: return "HP_GST_EPLTREL";
1924 case DT_HP_EPLTRELSZ: return "HP_GST_EPLTRELSZ";
1925 case DT_HP_FILTERED: return "HP_FILTERED";
1926 case DT_HP_FILTER_TLS: return "HP_FILTER_TLS";
1927 case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1928 case DT_HP_LAZYLOAD: return "HP_LAZYLOAD";
1929 case DT_HP_BIND_NOW_COUNT: return "HP_BIND_NOW_COUNT";
1930 case DT_PLT: return "PLT";
1931 case DT_PLT_SIZE: return "PLT_SIZE";
1932 case DT_DLT: return "DLT";
1933 case DT_DLT_SIZE: return "DLT_SIZE";
1934 default:
1935 return NULL;
1936 }
1937 }
1938
1939 static const char *
1940 get_ia64_dynamic_type (unsigned long type)
1941 {
1942 switch (type)
1943 {
1944 case DT_IA_64_PLT_RESERVE: return "IA_64_PLT_RESERVE";
1945 case DT_IA_64_VMS_SUBTYPE: return "VMS_SUBTYPE";
1946 case DT_IA_64_VMS_IMGIOCNT: return "VMS_IMGIOCNT";
1947 case DT_IA_64_VMS_LNKFLAGS: return "VMS_LNKFLAGS";
1948 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1949 case DT_IA_64_VMS_IDENT: return "VMS_IDENT";
1950 case DT_IA_64_VMS_NEEDED_IDENT: return "VMS_NEEDED_IDENT";
1951 case DT_IA_64_VMS_IMG_RELA_CNT: return "VMS_IMG_RELA_CNT";
1952 case DT_IA_64_VMS_SEG_RELA_CNT: return "VMS_SEG_RELA_CNT";
1953 case DT_IA_64_VMS_FIXUP_RELA_CNT: return "VMS_FIXUP_RELA_CNT";
1954 case DT_IA_64_VMS_FIXUP_NEEDED: return "VMS_FIXUP_NEEDED";
1955 case DT_IA_64_VMS_SYMVEC_CNT: return "VMS_SYMVEC_CNT";
1956 case DT_IA_64_VMS_XLATED: return "VMS_XLATED";
1957 case DT_IA_64_VMS_STACKSIZE: return "VMS_STACKSIZE";
1958 case DT_IA_64_VMS_UNWINDSZ: return "VMS_UNWINDSZ";
1959 case DT_IA_64_VMS_UNWIND_CODSEG: return "VMS_UNWIND_CODSEG";
1960 case DT_IA_64_VMS_UNWIND_INFOSEG: return "VMS_UNWIND_INFOSEG";
1961 case DT_IA_64_VMS_LINKTIME: return "VMS_LINKTIME";
1962 case DT_IA_64_VMS_SEG_NO: return "VMS_SEG_NO";
1963 case DT_IA_64_VMS_SYMVEC_OFFSET: return "VMS_SYMVEC_OFFSET";
1964 case DT_IA_64_VMS_SYMVEC_SEG: return "VMS_SYMVEC_SEG";
1965 case DT_IA_64_VMS_UNWIND_OFFSET: return "VMS_UNWIND_OFFSET";
1966 case DT_IA_64_VMS_UNWIND_SEG: return "VMS_UNWIND_SEG";
1967 case DT_IA_64_VMS_STRTAB_OFFSET: return "VMS_STRTAB_OFFSET";
1968 case DT_IA_64_VMS_SYSVER_OFFSET: return "VMS_SYSVER_OFFSET";
1969 case DT_IA_64_VMS_IMG_RELA_OFF: return "VMS_IMG_RELA_OFF";
1970 case DT_IA_64_VMS_SEG_RELA_OFF: return "VMS_SEG_RELA_OFF";
1971 case DT_IA_64_VMS_FIXUP_RELA_OFF: return "VMS_FIXUP_RELA_OFF";
1972 case DT_IA_64_VMS_PLTGOT_OFFSET: return "VMS_PLTGOT_OFFSET";
1973 case DT_IA_64_VMS_PLTGOT_SEG: return "VMS_PLTGOT_SEG";
1974 case DT_IA_64_VMS_FPMODE: return "VMS_FPMODE";
1975 default:
1976 return NULL;
1977 }
1978 }
1979
1980 static const char *
1981 get_solaris_section_type (unsigned long type)
1982 {
1983 switch (type)
1984 {
1985 case 0x6fffffee: return "SUNW_ancillary";
1986 case 0x6fffffef: return "SUNW_capchain";
1987 case 0x6ffffff0: return "SUNW_capinfo";
1988 case 0x6ffffff1: return "SUNW_symsort";
1989 case 0x6ffffff2: return "SUNW_tlssort";
1990 case 0x6ffffff3: return "SUNW_LDYNSYM";
1991 case 0x6ffffff4: return "SUNW_dof";
1992 case 0x6ffffff5: return "SUNW_cap";
1993 case 0x6ffffff6: return "SUNW_SIGNATURE";
1994 case 0x6ffffff7: return "SUNW_ANNOTATE";
1995 case 0x6ffffff8: return "SUNW_DEBUGSTR";
1996 case 0x6ffffff9: return "SUNW_DEBUG";
1997 case 0x6ffffffa: return "SUNW_move";
1998 case 0x6ffffffb: return "SUNW_COMDAT";
1999 case 0x6ffffffc: return "SUNW_syminfo";
2000 case 0x6ffffffd: return "SUNW_verdef";
2001 case 0x6ffffffe: return "SUNW_verneed";
2002 case 0x6fffffff: return "SUNW_versym";
2003 case 0x70000000: return "SPARC_GOTDATA";
2004 default: return NULL;
2005 }
2006 }
2007
2008 static const char *
2009 get_alpha_dynamic_type (unsigned long type)
2010 {
2011 switch (type)
2012 {
2013 case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
2014 default: return NULL;
2015 }
2016 }
2017
2018 static const char *
2019 get_score_dynamic_type (unsigned long type)
2020 {
2021 switch (type)
2022 {
2023 case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
2024 case DT_SCORE_LOCAL_GOTNO: return "SCORE_LOCAL_GOTNO";
2025 case DT_SCORE_SYMTABNO: return "SCORE_SYMTABNO";
2026 case DT_SCORE_GOTSYM: return "SCORE_GOTSYM";
2027 case DT_SCORE_UNREFEXTNO: return "SCORE_UNREFEXTNO";
2028 case DT_SCORE_HIPAGENO: return "SCORE_HIPAGENO";
2029 default: return NULL;
2030 }
2031 }
2032
2033 static const char *
2034 get_tic6x_dynamic_type (unsigned long type)
2035 {
2036 switch (type)
2037 {
2038 case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
2039 case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
2040 case DT_C6000_DSBT_BASE: return "C6000_DSBT_BASE";
2041 case DT_C6000_DSBT_SIZE: return "C6000_DSBT_SIZE";
2042 case DT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
2043 case DT_C6000_DSBT_INDEX: return "C6000_DSBT_INDEX";
2044 default: return NULL;
2045 }
2046 }
2047
2048 static const char *
2049 get_nios2_dynamic_type (unsigned long type)
2050 {
2051 switch (type)
2052 {
2053 case DT_NIOS2_GP: return "NIOS2_GP";
2054 default: return NULL;
2055 }
2056 }
2057
2058 static const char *
2059 get_solaris_dynamic_type (unsigned long type)
2060 {
2061 switch (type)
2062 {
2063 case 0x6000000d: return "SUNW_AUXILIARY";
2064 case 0x6000000e: return "SUNW_RTLDINF";
2065 case 0x6000000f: return "SUNW_FILTER";
2066 case 0x60000010: return "SUNW_CAP";
2067 case 0x60000011: return "SUNW_SYMTAB";
2068 case 0x60000012: return "SUNW_SYMSZ";
2069 case 0x60000013: return "SUNW_SORTENT";
2070 case 0x60000014: return "SUNW_SYMSORT";
2071 case 0x60000015: return "SUNW_SYMSORTSZ";
2072 case 0x60000016: return "SUNW_TLSSORT";
2073 case 0x60000017: return "SUNW_TLSSORTSZ";
2074 case 0x60000018: return "SUNW_CAPINFO";
2075 case 0x60000019: return "SUNW_STRPAD";
2076 case 0x6000001a: return "SUNW_CAPCHAIN";
2077 case 0x6000001b: return "SUNW_LDMACH";
2078 case 0x6000001d: return "SUNW_CAPCHAINENT";
2079 case 0x6000001f: return "SUNW_CAPCHAINSZ";
2080 case 0x60000021: return "SUNW_PARENT";
2081 case 0x60000023: return "SUNW_ASLR";
2082 case 0x60000025: return "SUNW_RELAX";
2083 case 0x60000029: return "SUNW_NXHEAP";
2084 case 0x6000002b: return "SUNW_NXSTACK";
2085
2086 case 0x70000001: return "SPARC_REGISTER";
2087 case 0x7ffffffd: return "AUXILIARY";
2088 case 0x7ffffffe: return "USED";
2089 case 0x7fffffff: return "FILTER";
2090
2091 default: return NULL;
2092 }
2093 }
2094
2095 static const char *
2096 get_dynamic_type (Filedata * filedata, unsigned long type)
2097 {
2098 static char buff[64];
2099
2100 switch (type)
2101 {
2102 case DT_NULL: return "NULL";
2103 case DT_NEEDED: return "NEEDED";
2104 case DT_PLTRELSZ: return "PLTRELSZ";
2105 case DT_PLTGOT: return "PLTGOT";
2106 case DT_HASH: return "HASH";
2107 case DT_STRTAB: return "STRTAB";
2108 case DT_SYMTAB: return "SYMTAB";
2109 case DT_RELA: return "RELA";
2110 case DT_RELASZ: return "RELASZ";
2111 case DT_RELAENT: return "RELAENT";
2112 case DT_STRSZ: return "STRSZ";
2113 case DT_SYMENT: return "SYMENT";
2114 case DT_INIT: return "INIT";
2115 case DT_FINI: return "FINI";
2116 case DT_SONAME: return "SONAME";
2117 case DT_RPATH: return "RPATH";
2118 case DT_SYMBOLIC: return "SYMBOLIC";
2119 case DT_REL: return "REL";
2120 case DT_RELSZ: return "RELSZ";
2121 case DT_RELENT: return "RELENT";
2122 case DT_PLTREL: return "PLTREL";
2123 case DT_DEBUG: return "DEBUG";
2124 case DT_TEXTREL: return "TEXTREL";
2125 case DT_JMPREL: return "JMPREL";
2126 case DT_BIND_NOW: return "BIND_NOW";
2127 case DT_INIT_ARRAY: return "INIT_ARRAY";
2128 case DT_FINI_ARRAY: return "FINI_ARRAY";
2129 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
2130 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
2131 case DT_RUNPATH: return "RUNPATH";
2132 case DT_FLAGS: return "FLAGS";
2133
2134 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2135 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
2136 case DT_SYMTAB_SHNDX: return "SYMTAB_SHNDX";
2137
2138 case DT_CHECKSUM: return "CHECKSUM";
2139 case DT_PLTPADSZ: return "PLTPADSZ";
2140 case DT_MOVEENT: return "MOVEENT";
2141 case DT_MOVESZ: return "MOVESZ";
2142 case DT_FEATURE: return "FEATURE";
2143 case DT_POSFLAG_1: return "POSFLAG_1";
2144 case DT_SYMINSZ: return "SYMINSZ";
2145 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
2146
2147 case DT_ADDRRNGLO: return "ADDRRNGLO";
2148 case DT_CONFIG: return "CONFIG";
2149 case DT_DEPAUDIT: return "DEPAUDIT";
2150 case DT_AUDIT: return "AUDIT";
2151 case DT_PLTPAD: return "PLTPAD";
2152 case DT_MOVETAB: return "MOVETAB";
2153 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
2154
2155 case DT_VERSYM: return "VERSYM";
2156
2157 case DT_TLSDESC_GOT: return "TLSDESC_GOT";
2158 case DT_TLSDESC_PLT: return "TLSDESC_PLT";
2159 case DT_RELACOUNT: return "RELACOUNT";
2160 case DT_RELCOUNT: return "RELCOUNT";
2161 case DT_FLAGS_1: return "FLAGS_1";
2162 case DT_VERDEF: return "VERDEF";
2163 case DT_VERDEFNUM: return "VERDEFNUM";
2164 case DT_VERNEED: return "VERNEED";
2165 case DT_VERNEEDNUM: return "VERNEEDNUM";
2166
2167 case DT_AUXILIARY: return "AUXILIARY";
2168 case DT_USED: return "USED";
2169 case DT_FILTER: return "FILTER";
2170
2171 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
2172 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
2173 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
2174 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
2175 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
2176 case DT_GNU_HASH: return "GNU_HASH";
2177
2178 default:
2179 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
2180 {
2181 const char * result;
2182
2183 switch (filedata->file_header.e_machine)
2184 {
2185 case EM_AARCH64:
2186 result = get_aarch64_dynamic_type (type);
2187 break;
2188 case EM_MIPS:
2189 case EM_MIPS_RS3_LE:
2190 result = get_mips_dynamic_type (type);
2191 break;
2192 case EM_SPARCV9:
2193 result = get_sparc64_dynamic_type (type);
2194 break;
2195 case EM_PPC:
2196 result = get_ppc_dynamic_type (type);
2197 break;
2198 case EM_PPC64:
2199 result = get_ppc64_dynamic_type (type);
2200 break;
2201 case EM_IA_64:
2202 result = get_ia64_dynamic_type (type);
2203 break;
2204 case EM_ALPHA:
2205 result = get_alpha_dynamic_type (type);
2206 break;
2207 case EM_SCORE:
2208 result = get_score_dynamic_type (type);
2209 break;
2210 case EM_TI_C6000:
2211 result = get_tic6x_dynamic_type (type);
2212 break;
2213 case EM_ALTERA_NIOS2:
2214 result = get_nios2_dynamic_type (type);
2215 break;
2216 default:
2217 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2218 result = get_solaris_dynamic_type (type);
2219 else
2220 result = NULL;
2221 break;
2222 }
2223
2224 if (result != NULL)
2225 return result;
2226
2227 snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
2228 }
2229 else if (((type >= DT_LOOS) && (type <= DT_HIOS))
2230 || (filedata->file_header.e_machine == EM_PARISC
2231 && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
2232 {
2233 const char * result;
2234
2235 switch (filedata->file_header.e_machine)
2236 {
2237 case EM_PARISC:
2238 result = get_parisc_dynamic_type (type);
2239 break;
2240 case EM_IA_64:
2241 result = get_ia64_dynamic_type (type);
2242 break;
2243 default:
2244 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2245 result = get_solaris_dynamic_type (type);
2246 else
2247 result = NULL;
2248 break;
2249 }
2250
2251 if (result != NULL)
2252 return result;
2253
2254 snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2255 type);
2256 }
2257 else
2258 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
2259
2260 return buff;
2261 }
2262 }
2263
2264 static char *
2265 get_file_type (unsigned e_type)
2266 {
2267 static char buff[32];
2268
2269 switch (e_type)
2270 {
2271 case ET_NONE: return _("NONE (None)");
2272 case ET_REL: return _("REL (Relocatable file)");
2273 case ET_EXEC: return _("EXEC (Executable file)");
2274 case ET_DYN: return _("DYN (Shared object file)");
2275 case ET_CORE: return _("CORE (Core file)");
2276
2277 default:
2278 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
2279 snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
2280 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
2281 snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
2282 else
2283 snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
2284 return buff;
2285 }
2286 }
2287
2288 static char *
2289 get_machine_name (unsigned e_machine)
2290 {
2291 static char buff[64]; /* XXX */
2292
2293 switch (e_machine)
2294 {
2295 /* Please keep this switch table sorted by increasing EM_ value. */
2296 /* 0 */
2297 case EM_NONE: return _("None");
2298 case EM_M32: return "WE32100";
2299 case EM_SPARC: return "Sparc";
2300 case EM_386: return "Intel 80386";
2301 case EM_68K: return "MC68000";
2302 case EM_88K: return "MC88000";
2303 case EM_IAMCU: return "Intel MCU";
2304 case EM_860: return "Intel 80860";
2305 case EM_MIPS: return "MIPS R3000";
2306 case EM_S370: return "IBM System/370";
2307 /* 10 */
2308 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
2309 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
2310 case EM_PARISC: return "HPPA";
2311 case EM_VPP550: return "Fujitsu VPP500";
2312 case EM_SPARC32PLUS: return "Sparc v8+" ;
2313 case EM_960: return "Intel 80960";
2314 case EM_PPC: return "PowerPC";
2315 /* 20 */
2316 case EM_PPC64: return "PowerPC64";
2317 case EM_S390_OLD:
2318 case EM_S390: return "IBM S/390";
2319 case EM_SPU: return "SPU";
2320 /* 30 */
2321 case EM_V800: return "Renesas V850 (using RH850 ABI)";
2322 case EM_FR20: return "Fujitsu FR20";
2323 case EM_RH32: return "TRW RH32";
2324 case EM_MCORE: return "MCORE";
2325 /* 40 */
2326 case EM_ARM: return "ARM";
2327 case EM_OLD_ALPHA: return "Digital Alpha (old)";
2328 case EM_SH: return "Renesas / SuperH SH";
2329 case EM_SPARCV9: return "Sparc v9";
2330 case EM_TRICORE: return "Siemens Tricore";
2331 case EM_ARC: return "ARC";
2332 case EM_H8_300: return "Renesas H8/300";
2333 case EM_H8_300H: return "Renesas H8/300H";
2334 case EM_H8S: return "Renesas H8S";
2335 case EM_H8_500: return "Renesas H8/500";
2336 /* 50 */
2337 case EM_IA_64: return "Intel IA-64";
2338 case EM_MIPS_X: return "Stanford MIPS-X";
2339 case EM_COLDFIRE: return "Motorola Coldfire";
2340 case EM_68HC12: return "Motorola MC68HC12 Microcontroller";
2341 case EM_MMA: return "Fujitsu Multimedia Accelerator";
2342 case EM_PCP: return "Siemens PCP";
2343 case EM_NCPU: return "Sony nCPU embedded RISC processor";
2344 case EM_NDR1: return "Denso NDR1 microprocesspr";
2345 case EM_STARCORE: return "Motorola Star*Core processor";
2346 case EM_ME16: return "Toyota ME16 processor";
2347 /* 60 */
2348 case EM_ST100: return "STMicroelectronics ST100 processor";
2349 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
2350 case EM_X86_64: return "Advanced Micro Devices X86-64";
2351 case EM_PDSP: return "Sony DSP processor";
2352 case EM_PDP10: return "Digital Equipment Corp. PDP-10";
2353 case EM_PDP11: return "Digital Equipment Corp. PDP-11";
2354 case EM_FX66: return "Siemens FX66 microcontroller";
2355 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2356 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
2357 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
2358 /* 70 */
2359 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
2360 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
2361 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
2362 case EM_SVX: return "Silicon Graphics SVx";
2363 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
2364 case EM_VAX: return "Digital VAX";
2365 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
2366 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
2367 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
2368 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
2369 /* 80 */
2370 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
2371 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
2372 case EM_PRISM: return "Vitesse Prism";
2373 case EM_AVR_OLD:
2374 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
2375 case EM_CYGNUS_FR30:
2376 case EM_FR30: return "Fujitsu FR30";
2377 case EM_CYGNUS_D10V:
2378 case EM_D10V: return "d10v";
2379 case EM_CYGNUS_D30V:
2380 case EM_D30V: return "d30v";
2381 case EM_CYGNUS_V850:
2382 case EM_V850: return "Renesas V850";
2383 case EM_CYGNUS_M32R:
2384 case EM_M32R: return "Renesas M32R (formerly Mitsubishi M32r)";
2385 case EM_CYGNUS_MN10300:
2386 case EM_MN10300: return "mn10300";
2387 /* 90 */
2388 case EM_CYGNUS_MN10200:
2389 case EM_MN10200: return "mn10200";
2390 case EM_PJ: return "picoJava";
2391 case EM_OR1K: return "OpenRISC 1000";
2392 case EM_ARC_COMPACT: return "ARCompact";
2393 case EM_XTENSA_OLD:
2394 case EM_XTENSA: return "Tensilica Xtensa Processor";
2395 case EM_VIDEOCORE: return "Alphamosaic VideoCore processor";
2396 case EM_TMM_GPP: return "Thompson Multimedia General Purpose Processor";
2397 case EM_NS32K: return "National Semiconductor 32000 series";
2398 case EM_TPC: return "Tenor Network TPC processor";
2399 case EM_SNP1K: return "Trebia SNP 1000 processor";
2400 /* 100 */
2401 case EM_ST200: return "STMicroelectronics ST200 microcontroller";
2402 case EM_IP2K_OLD:
2403 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
2404 case EM_MAX: return "MAX Processor";
2405 case EM_CR: return "National Semiconductor CompactRISC";
2406 case EM_F2MC16: return "Fujitsu F2MC16";
2407 case EM_MSP430: return "Texas Instruments msp430 microcontroller";
2408 case EM_BLACKFIN: return "Analog Devices Blackfin";
2409 case EM_SE_C33: return "S1C33 Family of Seiko Epson processors";
2410 case EM_SEP: return "Sharp embedded microprocessor";
2411 case EM_ARCA: return "Arca RISC microprocessor";
2412 /* 110 */
2413 case EM_UNICORE: return "Unicore";
2414 case EM_EXCESS: return "eXcess 16/32/64-bit configurable embedded CPU";
2415 case EM_DXP: return "Icera Semiconductor Inc. Deep Execution Processor";
2416 case EM_ALTERA_NIOS2: return "Altera Nios II";
2417 case EM_CRX: return "National Semiconductor CRX microprocessor";
2418 case EM_XGATE: return "Motorola XGATE embedded processor";
2419 case EM_C166:
2420 case EM_XC16X: return "Infineon Technologies xc16x";
2421 case EM_M16C: return "Renesas M16C series microprocessors";
2422 case EM_DSPIC30F: return "Microchip Technology dsPIC30F Digital Signal Controller";
2423 case EM_CE: return "Freescale Communication Engine RISC core";
2424 /* 120 */
2425 case EM_M32C: return "Renesas M32c";
2426 /* 130 */
2427 case EM_TSK3000: return "Altium TSK3000 core";
2428 case EM_RS08: return "Freescale RS08 embedded processor";
2429 case EM_ECOG2: return "Cyan Technology eCOG2 microprocessor";
2430 case EM_SCORE: return "SUNPLUS S+Core";
2431 case EM_DSP24: return "New Japan Radio (NJR) 24-bit DSP Processor";
2432 case EM_VIDEOCORE3: return "Broadcom VideoCore III processor";
2433 case EM_LATTICEMICO32: return "Lattice Mico32";
2434 case EM_SE_C17: return "Seiko Epson C17 family";
2435 /* 140 */
2436 case EM_TI_C6000: return "Texas Instruments TMS320C6000 DSP family";
2437 case EM_TI_C2000: return "Texas Instruments TMS320C2000 DSP family";
2438 case EM_TI_C5500: return "Texas Instruments TMS320C55x DSP family";
2439 case EM_TI_PRU: return "TI PRU I/O processor";
2440 /* 160 */
2441 case EM_MMDSP_PLUS: return "STMicroelectronics 64bit VLIW Data Signal Processor";
2442 case EM_CYPRESS_M8C: return "Cypress M8C microprocessor";
2443 case EM_R32C: return "Renesas R32C series microprocessors";
2444 case EM_TRIMEDIA: return "NXP Semiconductors TriMedia architecture family";
2445 case EM_QDSP6: return "QUALCOMM DSP6 Processor";
2446 case EM_8051: return "Intel 8051 and variants";
2447 case EM_STXP7X: return "STMicroelectronics STxP7x family";
2448 case EM_NDS32: return "Andes Technology compact code size embedded RISC processor family";
2449 case EM_ECOG1X: return "Cyan Technology eCOG1X family";
2450 case EM_MAXQ30: return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2451 /* 170 */
2452 case EM_XIMO16: return "New Japan Radio (NJR) 16-bit DSP Processor";
2453 case EM_MANIK: return "M2000 Reconfigurable RISC Microprocessor";
2454 case EM_CRAYNV2: return "Cray Inc. NV2 vector architecture";
2455 case EM_RX: return "Renesas RX";
2456 case EM_METAG: return "Imagination Technologies Meta processor architecture";
2457 case EM_MCST_ELBRUS: return "MCST Elbrus general purpose hardware architecture";
2458 case EM_ECOG16: return "Cyan Technology eCOG16 family";
2459 case EM_CR16:
2460 case EM_MICROBLAZE:
2461 case EM_MICROBLAZE_OLD: return "Xilinx MicroBlaze";
2462 case EM_ETPU: return "Freescale Extended Time Processing Unit";
2463 case EM_SLE9X: return "Infineon Technologies SLE9X core";
2464 /* 180 */
2465 case EM_L1OM: return "Intel L1OM";
2466 case EM_K1OM: return "Intel K1OM";
2467 case EM_INTEL182: return "Intel (reserved)";
2468 case EM_AARCH64: return "AArch64";
2469 case EM_ARM184: return "ARM (reserved)";
2470 case EM_AVR32: return "Atmel Corporation 32-bit microprocessor";
2471 case EM_STM8: return "STMicroeletronics STM8 8-bit microcontroller";
2472 case EM_TILE64: return "Tilera TILE64 multicore architecture family";
2473 case EM_TILEPRO: return "Tilera TILEPro multicore architecture family";
2474 /* 190 */
2475 case EM_CUDA: return "NVIDIA CUDA architecture";
2476 case EM_TILEGX: return "Tilera TILE-Gx multicore architecture family";
2477 case EM_CLOUDSHIELD: return "CloudShield architecture family";
2478 case EM_COREA_1ST: return "KIPO-KAIST Core-A 1st generation processor family";
2479 case EM_COREA_2ND: return "KIPO-KAIST Core-A 2nd generation processor family";
2480 case EM_ARC_COMPACT2: return "ARCv2";
2481 case EM_OPEN8: return "Open8 8-bit RISC soft processor core";
2482 case EM_RL78: return "Renesas RL78";
2483 case EM_VIDEOCORE5: return "Broadcom VideoCore V processor";
2484 case EM_78K0R: return "Renesas 78K0R";
2485 /* 200 */
2486 case EM_56800EX: return "Freescale 56800EX Digital Signal Controller (DSC)";
2487 case EM_BA1: return "Beyond BA1 CPU architecture";
2488 case EM_BA2: return "Beyond BA2 CPU architecture";
2489 case EM_XCORE: return "XMOS xCORE processor family";
2490 case EM_MCHP_PIC: return "Microchip 8-bit PIC(r) family";
2491 /* 210 */
2492 case EM_KM32: return "KM211 KM32 32-bit processor";
2493 case EM_KMX32: return "KM211 KMX32 32-bit processor";
2494 case EM_KMX16: return "KM211 KMX16 16-bit processor";
2495 case EM_KMX8: return "KM211 KMX8 8-bit processor";
2496 case EM_KVARC: return "KM211 KVARC processor";
2497 case EM_CDP: return "Paneve CDP architecture family";
2498 case EM_COGE: return "Cognitive Smart Memory Processor";
2499 case EM_COOL: return "Bluechip Systems CoolEngine";
2500 case EM_NORC: return "Nanoradio Optimized RISC";
2501 case EM_CSR_KALIMBA: return "CSR Kalimba architecture family";
2502 /* 220 */
2503 case EM_Z80: return "Zilog Z80";
2504 case EM_VISIUM: return "CDS VISIUMcore processor";
2505 case EM_FT32: return "FTDI Chip FT32";
2506 case EM_MOXIE: return "Moxie";
2507 case EM_AMDGPU: return "AMD GPU";
2508 case EM_RISCV: return "RISC-V";
2509 case EM_LANAI: return "Lanai 32-bit processor";
2510 case EM_BPF: return "Linux BPF";
2511 case EM_NFP: return "Netronome Flow Processor";
2512
2513 /* Large numbers... */
2514 case EM_MT: return "Morpho Techologies MT processor";
2515 case EM_ALPHA: return "Alpha";
2516 case EM_WEBASSEMBLY: return "Web Assembly";
2517 case EM_DLX: return "OpenDLX";
2518 case EM_XSTORMY16: return "Sanyo XStormy16 CPU core";
2519 case EM_IQ2000: return "Vitesse IQ2000";
2520 case EM_M32C_OLD:
2521 case EM_NIOS32: return "Altera Nios";
2522 case EM_CYGNUS_MEP: return "Toshiba MeP Media Engine";
2523 case EM_ADAPTEVA_EPIPHANY: return "Adapteva EPIPHANY";
2524 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
2525 case EM_S12Z: return "Freescale S12Z";
2526 case EM_CSKY: return "C-SKY";
2527
2528 default:
2529 snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2530 return buff;
2531 }
2532 }
2533
2534 static void
2535 decode_ARC_machine_flags (unsigned e_flags, unsigned e_machine, char buf[])
2536 {
2537 /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2. Some
2538 other compilers don't a specific architecture type in the e_flags, and
2539 instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
2540 architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
2541 architectures.
2542
2543 Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
2544 but also sets a specific architecture type in the e_flags field.
2545
2546 However, when decoding the flags we don't worry if we see an
2547 unexpected pairing, for example EM_ARC_COMPACT machine type, with
2548 ARCEM architecture type. */
2549
2550 switch (e_flags & EF_ARC_MACH_MSK)
2551 {
2552 /* We only expect these to occur for EM_ARC_COMPACT2. */
2553 case EF_ARC_CPU_ARCV2EM:
2554 strcat (buf, ", ARC EM");
2555 break;
2556 case EF_ARC_CPU_ARCV2HS:
2557 strcat (buf, ", ARC HS");
2558 break;
2559
2560 /* We only expect these to occur for EM_ARC_COMPACT. */
2561 case E_ARC_MACH_ARC600:
2562 strcat (buf, ", ARC600");
2563 break;
2564 case E_ARC_MACH_ARC601:
2565 strcat (buf, ", ARC601");
2566 break;
2567 case E_ARC_MACH_ARC700:
2568 strcat (buf, ", ARC700");
2569 break;
2570
2571 /* The only times we should end up here are (a) A corrupt ELF, (b) A
2572 new ELF with new architecture being read by an old version of
2573 readelf, or (c) An ELF built with non-GNU compiler that does not
2574 set the architecture in the e_flags. */
2575 default:
2576 if (e_machine == EM_ARC_COMPACT)
2577 strcat (buf, ", Unknown ARCompact");
2578 else
2579 strcat (buf, ", Unknown ARC");
2580 break;
2581 }
2582
2583 switch (e_flags & EF_ARC_OSABI_MSK)
2584 {
2585 case E_ARC_OSABI_ORIG:
2586 strcat (buf, ", (ABI:legacy)");
2587 break;
2588 case E_ARC_OSABI_V2:
2589 strcat (buf, ", (ABI:v2)");
2590 break;
2591 /* Only upstream 3.9+ kernels will support ARCv2 ISA. */
2592 case E_ARC_OSABI_V3:
2593 strcat (buf, ", v3 no-legacy-syscalls ABI");
2594 break;
2595 case E_ARC_OSABI_V4:
2596 strcat (buf, ", v4 ABI");
2597 break;
2598 default:
2599 strcat (buf, ", unrecognised ARC OSABI flag");
2600 break;
2601 }
2602 }
2603
2604 static void
2605 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2606 {
2607 unsigned eabi;
2608 bfd_boolean unknown = FALSE;
2609
2610 eabi = EF_ARM_EABI_VERSION (e_flags);
2611 e_flags &= ~ EF_ARM_EABIMASK;
2612
2613 /* Handle "generic" ARM flags. */
2614 if (e_flags & EF_ARM_RELEXEC)
2615 {
2616 strcat (buf, ", relocatable executable");
2617 e_flags &= ~ EF_ARM_RELEXEC;
2618 }
2619
2620 if (e_flags & EF_ARM_PIC)
2621 {
2622 strcat (buf, ", position independent");
2623 e_flags &= ~ EF_ARM_PIC;
2624 }
2625
2626 /* Now handle EABI specific flags. */
2627 switch (eabi)
2628 {
2629 default:
2630 strcat (buf, ", <unrecognized EABI>");
2631 if (e_flags)
2632 unknown = TRUE;
2633 break;
2634
2635 case EF_ARM_EABI_VER1:
2636 strcat (buf, ", Version1 EABI");
2637 while (e_flags)
2638 {
2639 unsigned flag;
2640
2641 /* Process flags one bit at a time. */
2642 flag = e_flags & - e_flags;
2643 e_flags &= ~ flag;
2644
2645 switch (flag)
2646 {
2647 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2648 strcat (buf, ", sorted symbol tables");
2649 break;
2650
2651 default:
2652 unknown = TRUE;
2653 break;
2654 }
2655 }
2656 break;
2657
2658 case EF_ARM_EABI_VER2:
2659 strcat (buf, ", Version2 EABI");
2660 while (e_flags)
2661 {
2662 unsigned flag;
2663
2664 /* Process flags one bit at a time. */
2665 flag = e_flags & - e_flags;
2666 e_flags &= ~ flag;
2667
2668 switch (flag)
2669 {
2670 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2671 strcat (buf, ", sorted symbol tables");
2672 break;
2673
2674 case EF_ARM_DYNSYMSUSESEGIDX:
2675 strcat (buf, ", dynamic symbols use segment index");
2676 break;
2677
2678 case EF_ARM_MAPSYMSFIRST:
2679 strcat (buf, ", mapping symbols precede others");
2680 break;
2681
2682 default:
2683 unknown = TRUE;
2684 break;
2685 }
2686 }
2687 break;
2688
2689 case EF_ARM_EABI_VER3:
2690 strcat (buf, ", Version3 EABI");
2691 break;
2692
2693 case EF_ARM_EABI_VER4:
2694 strcat (buf, ", Version4 EABI");
2695 while (e_flags)
2696 {
2697 unsigned flag;
2698
2699 /* Process flags one bit at a time. */
2700 flag = e_flags & - e_flags;
2701 e_flags &= ~ flag;
2702
2703 switch (flag)
2704 {
2705 case EF_ARM_BE8:
2706 strcat (buf, ", BE8");
2707 break;
2708
2709 case EF_ARM_LE8:
2710 strcat (buf, ", LE8");
2711 break;
2712
2713 default:
2714 unknown = TRUE;
2715 break;
2716 }
2717 }
2718 break;
2719
2720 case EF_ARM_EABI_VER5:
2721 strcat (buf, ", Version5 EABI");
2722 while (e_flags)
2723 {
2724 unsigned flag;
2725
2726 /* Process flags one bit at a time. */
2727 flag = e_flags & - e_flags;
2728 e_flags &= ~ flag;
2729
2730 switch (flag)
2731 {
2732 case EF_ARM_BE8:
2733 strcat (buf, ", BE8");
2734 break;
2735
2736 case EF_ARM_LE8:
2737 strcat (buf, ", LE8");
2738 break;
2739
2740 case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT. */
2741 strcat (buf, ", soft-float ABI");
2742 break;
2743
2744 case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT. */
2745 strcat (buf, ", hard-float ABI");
2746 break;
2747
2748 default:
2749 unknown = TRUE;
2750 break;
2751 }
2752 }
2753 break;
2754
2755 case EF_ARM_EABI_UNKNOWN:
2756 strcat (buf, ", GNU EABI");
2757 while (e_flags)
2758 {
2759 unsigned flag;
2760
2761 /* Process flags one bit at a time. */
2762 flag = e_flags & - e_flags;
2763 e_flags &= ~ flag;
2764
2765 switch (flag)
2766 {
2767 case EF_ARM_INTERWORK:
2768 strcat (buf, ", interworking enabled");
2769 break;
2770
2771 case EF_ARM_APCS_26:
2772 strcat (buf, ", uses APCS/26");
2773 break;
2774
2775 case EF_ARM_APCS_FLOAT:
2776 strcat (buf, ", uses APCS/float");
2777 break;
2778
2779 case EF_ARM_PIC:
2780 strcat (buf, ", position independent");
2781 break;
2782
2783 case EF_ARM_ALIGN8:
2784 strcat (buf, ", 8 bit structure alignment");
2785 break;
2786
2787 case EF_ARM_NEW_ABI:
2788 strcat (buf, ", uses new ABI");
2789 break;
2790
2791 case EF_ARM_OLD_ABI:
2792 strcat (buf, ", uses old ABI");
2793 break;
2794
2795 case EF_ARM_SOFT_FLOAT:
2796 strcat (buf, ", software FP");
2797 break;
2798
2799 case EF_ARM_VFP_FLOAT:
2800 strcat (buf, ", VFP");
2801 break;
2802
2803 case EF_ARM_MAVERICK_FLOAT:
2804 strcat (buf, ", Maverick FP");
2805 break;
2806
2807 default:
2808 unknown = TRUE;
2809 break;
2810 }
2811 }
2812 }
2813
2814 if (unknown)
2815 strcat (buf,_(", <unknown>"));
2816 }
2817
2818 static void
2819 decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2820 {
2821 --size; /* Leave space for null terminator. */
2822
2823 switch (e_flags & EF_AVR_MACH)
2824 {
2825 case E_AVR_MACH_AVR1:
2826 strncat (buf, ", avr:1", size);
2827 break;
2828 case E_AVR_MACH_AVR2:
2829 strncat (buf, ", avr:2", size);
2830 break;
2831 case E_AVR_MACH_AVR25:
2832 strncat (buf, ", avr:25", size);
2833 break;
2834 case E_AVR_MACH_AVR3:
2835 strncat (buf, ", avr:3", size);
2836 break;
2837 case E_AVR_MACH_AVR31:
2838 strncat (buf, ", avr:31", size);
2839 break;
2840 case E_AVR_MACH_AVR35:
2841 strncat (buf, ", avr:35", size);
2842 break;
2843 case E_AVR_MACH_AVR4:
2844 strncat (buf, ", avr:4", size);
2845 break;
2846 case E_AVR_MACH_AVR5:
2847 strncat (buf, ", avr:5", size);
2848 break;
2849 case E_AVR_MACH_AVR51:
2850 strncat (buf, ", avr:51", size);
2851 break;
2852 case E_AVR_MACH_AVR6:
2853 strncat (buf, ", avr:6", size);
2854 break;
2855 case E_AVR_MACH_AVRTINY:
2856 strncat (buf, ", avr:100", size);
2857 break;
2858 case E_AVR_MACH_XMEGA1:
2859 strncat (buf, ", avr:101", size);
2860 break;
2861 case E_AVR_MACH_XMEGA2:
2862 strncat (buf, ", avr:102", size);
2863 break;
2864 case E_AVR_MACH_XMEGA3:
2865 strncat (buf, ", avr:103", size);
2866 break;
2867 case E_AVR_MACH_XMEGA4:
2868 strncat (buf, ", avr:104", size);
2869 break;
2870 case E_AVR_MACH_XMEGA5:
2871 strncat (buf, ", avr:105", size);
2872 break;
2873 case E_AVR_MACH_XMEGA6:
2874 strncat (buf, ", avr:106", size);
2875 break;
2876 case E_AVR_MACH_XMEGA7:
2877 strncat (buf, ", avr:107", size);
2878 break;
2879 default:
2880 strncat (buf, ", avr:<unknown>", size);
2881 break;
2882 }
2883
2884 size -= strlen (buf);
2885 if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2886 strncat (buf, ", link-relax", size);
2887 }
2888
2889 static void
2890 decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2891 {
2892 unsigned abi;
2893 unsigned arch;
2894 unsigned config;
2895 unsigned version;
2896 bfd_boolean has_fpu = FALSE;
2897 unsigned int r = 0;
2898
2899 static const char *ABI_STRINGS[] =
2900 {
2901 "ABI v0", /* use r5 as return register; only used in N1213HC */
2902 "ABI v1", /* use r0 as return register */
2903 "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2904 "ABI v2fp", /* for FPU */
2905 "AABI",
2906 "ABI2 FP+"
2907 };
2908 static const char *VER_STRINGS[] =
2909 {
2910 "Andes ELF V1.3 or older",
2911 "Andes ELF V1.3.1",
2912 "Andes ELF V1.4"
2913 };
2914 static const char *ARCH_STRINGS[] =
2915 {
2916 "",
2917 "Andes Star v1.0",
2918 "Andes Star v2.0",
2919 "Andes Star v3.0",
2920 "Andes Star v3.0m"
2921 };
2922
2923 abi = EF_NDS_ABI & e_flags;
2924 arch = EF_NDS_ARCH & e_flags;
2925 config = EF_NDS_INST & e_flags;
2926 version = EF_NDS32_ELF_VERSION & e_flags;
2927
2928 memset (buf, 0, size);
2929
2930 switch (abi)
2931 {
2932 case E_NDS_ABI_V0:
2933 case E_NDS_ABI_V1:
2934 case E_NDS_ABI_V2:
2935 case E_NDS_ABI_V2FP:
2936 case E_NDS_ABI_AABI:
2937 case E_NDS_ABI_V2FP_PLUS:
2938 /* In case there are holes in the array. */
2939 r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2940 break;
2941
2942 default:
2943 r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2944 break;
2945 }
2946
2947 switch (version)
2948 {
2949 case E_NDS32_ELF_VER_1_2:
2950 case E_NDS32_ELF_VER_1_3:
2951 case E_NDS32_ELF_VER_1_4:
2952 r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2953 break;
2954
2955 default:
2956 r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2957 break;
2958 }
2959
2960 if (E_NDS_ABI_V0 == abi)
2961 {
2962 /* OLD ABI; only used in N1213HC, has performance extension 1. */
2963 r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2964 if (arch == E_NDS_ARCH_STAR_V1_0)
2965 r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2966 return;
2967 }
2968
2969 switch (arch)
2970 {
2971 case E_NDS_ARCH_STAR_V1_0:
2972 case E_NDS_ARCH_STAR_V2_0:
2973 case E_NDS_ARCH_STAR_V3_0:
2974 case E_NDS_ARCH_STAR_V3_M:
2975 r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2976 break;
2977
2978 default:
2979 r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2980 /* ARCH version determines how the e_flags are interpreted.
2981 If it is unknown, we cannot proceed. */
2982 return;
2983 }
2984
2985 /* Newer ABI; Now handle architecture specific flags. */
2986 if (arch == E_NDS_ARCH_STAR_V1_0)
2987 {
2988 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2989 r += snprintf (buf + r, size -r, ", MFUSR_PC");
2990
2991 if (!(config & E_NDS32_HAS_NO_MAC_INST))
2992 r += snprintf (buf + r, size -r, ", MAC");
2993
2994 if (config & E_NDS32_HAS_DIV_INST)
2995 r += snprintf (buf + r, size -r, ", DIV");
2996
2997 if (config & E_NDS32_HAS_16BIT_INST)
2998 r += snprintf (buf + r, size -r, ", 16b");
2999 }
3000 else
3001 {
3002 if (config & E_NDS32_HAS_MFUSR_PC_INST)
3003 {
3004 if (version <= E_NDS32_ELF_VER_1_3)
3005 r += snprintf (buf + r, size -r, ", [B8]");
3006 else
3007 r += snprintf (buf + r, size -r, ", EX9");
3008 }
3009
3010 if (config & E_NDS32_HAS_MAC_DX_INST)
3011 r += snprintf (buf + r, size -r, ", MAC_DX");
3012
3013 if (config & E_NDS32_HAS_DIV_DX_INST)
3014 r += snprintf (buf + r, size -r, ", DIV_DX");
3015
3016 if (config & E_NDS32_HAS_16BIT_INST)
3017 {
3018 if (version <= E_NDS32_ELF_VER_1_3)
3019 r += snprintf (buf + r, size -r, ", 16b");
3020 else
3021 r += snprintf (buf + r, size -r, ", IFC");
3022 }
3023 }
3024
3025 if (config & E_NDS32_HAS_EXT_INST)
3026 r += snprintf (buf + r, size -r, ", PERF1");
3027
3028 if (config & E_NDS32_HAS_EXT2_INST)
3029 r += snprintf (buf + r, size -r, ", PERF2");
3030
3031 if (config & E_NDS32_HAS_FPU_INST)
3032 {
3033 has_fpu = TRUE;
3034 r += snprintf (buf + r, size -r, ", FPU_SP");
3035 }
3036
3037 if (config & E_NDS32_HAS_FPU_DP_INST)
3038 {
3039 has_fpu = TRUE;
3040 r += snprintf (buf + r, size -r, ", FPU_DP");
3041 }
3042
3043 if (config & E_NDS32_HAS_FPU_MAC_INST)
3044 {
3045 has_fpu = TRUE;
3046 r += snprintf (buf + r, size -r, ", FPU_MAC");
3047 }
3048
3049 if (has_fpu)
3050 {
3051 switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
3052 {
3053 case E_NDS32_FPU_REG_8SP_4DP:
3054 r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
3055 break;
3056 case E_NDS32_FPU_REG_16SP_8DP:
3057 r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
3058 break;
3059 case E_NDS32_FPU_REG_32SP_16DP:
3060 r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
3061 break;
3062 case E_NDS32_FPU_REG_32SP_32DP:
3063 r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
3064 break;
3065 }
3066 }
3067
3068 if (config & E_NDS32_HAS_AUDIO_INST)
3069 r += snprintf (buf + r, size -r, ", AUDIO");
3070
3071 if (config & E_NDS32_HAS_STRING_INST)
3072 r += snprintf (buf + r, size -r, ", STR");
3073
3074 if (config & E_NDS32_HAS_REDUCED_REGS)
3075 r += snprintf (buf + r, size -r, ", 16REG");
3076
3077 if (config & E_NDS32_HAS_VIDEO_INST)
3078 {
3079 if (version <= E_NDS32_ELF_VER_1_3)
3080 r += snprintf (buf + r, size -r, ", VIDEO");
3081 else
3082 r += snprintf (buf + r, size -r, ", SATURATION");
3083 }
3084
3085 if (config & E_NDS32_HAS_ENCRIPT_INST)
3086 r += snprintf (buf + r, size -r, ", ENCRP");
3087
3088 if (config & E_NDS32_HAS_L2C_INST)
3089 r += snprintf (buf + r, size -r, ", L2C");
3090 }
3091
3092 static char *
3093 get_machine_flags (Filedata * filedata, unsigned e_flags, unsigned e_machine)
3094 {
3095 static char buf[1024];
3096
3097 buf[0] = '\0';
3098
3099 if (e_flags)
3100 {
3101 switch (e_machine)
3102 {
3103 default:
3104 break;
3105
3106 case EM_ARC_COMPACT2:
3107 case EM_ARC_COMPACT:
3108 decode_ARC_machine_flags (e_flags, e_machine, buf);
3109 break;
3110
3111 case EM_ARM:
3112 decode_ARM_machine_flags (e_flags, buf);
3113 break;
3114
3115 case EM_AVR:
3116 decode_AVR_machine_flags (e_flags, buf, sizeof buf);
3117 break;
3118
3119 case EM_BLACKFIN:
3120 if (e_flags & EF_BFIN_PIC)
3121 strcat (buf, ", PIC");
3122
3123 if (e_flags & EF_BFIN_FDPIC)
3124 strcat (buf, ", FDPIC");
3125
3126 if (e_flags & EF_BFIN_CODE_IN_L1)
3127 strcat (buf, ", code in L1");
3128
3129 if (e_flags & EF_BFIN_DATA_IN_L1)
3130 strcat (buf, ", data in L1");
3131
3132 break;
3133
3134 case EM_CYGNUS_FRV:
3135 switch (e_flags & EF_FRV_CPU_MASK)
3136 {
3137 case EF_FRV_CPU_GENERIC:
3138 break;
3139
3140 default:
3141 strcat (buf, ", fr???");
3142 break;
3143
3144 case EF_FRV_CPU_FR300:
3145 strcat (buf, ", fr300");
3146 break;
3147
3148 case EF_FRV_CPU_FR400:
3149 strcat (buf, ", fr400");
3150 break;
3151 case EF_FRV_CPU_FR405:
3152 strcat (buf, ", fr405");
3153 break;
3154
3155 case EF_FRV_CPU_FR450:
3156 strcat (buf, ", fr450");
3157 break;
3158
3159 case EF_FRV_CPU_FR500:
3160 strcat (buf, ", fr500");
3161 break;
3162 case EF_FRV_CPU_FR550:
3163 strcat (buf, ", fr550");
3164 break;
3165
3166 case EF_FRV_CPU_SIMPLE:
3167 strcat (buf, ", simple");
3168 break;
3169 case EF_FRV_CPU_TOMCAT:
3170 strcat (buf, ", tomcat");
3171 break;
3172 }
3173 break;
3174
3175 case EM_68K:
3176 if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
3177 strcat (buf, ", m68000");
3178 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
3179 strcat (buf, ", cpu32");
3180 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
3181 strcat (buf, ", fido_a");
3182 else
3183 {
3184 char const * isa = _("unknown");
3185 char const * mac = _("unknown mac");
3186 char const * additional = NULL;
3187
3188 switch (e_flags & EF_M68K_CF_ISA_MASK)
3189 {
3190 case EF_M68K_CF_ISA_A_NODIV:
3191 isa = "A";
3192 additional = ", nodiv";
3193 break;
3194 case EF_M68K_CF_ISA_A:
3195 isa = "A";
3196 break;
3197 case EF_M68K_CF_ISA_A_PLUS:
3198 isa = "A+";
3199 break;
3200 case EF_M68K_CF_ISA_B_NOUSP:
3201 isa = "B";
3202 additional = ", nousp";
3203 break;
3204 case EF_M68K_CF_ISA_B:
3205 isa = "B";
3206 break;
3207 case EF_M68K_CF_ISA_C:
3208 isa = "C";
3209 break;
3210 case EF_M68K_CF_ISA_C_NODIV:
3211 isa = "C";
3212 additional = ", nodiv";
3213 break;
3214 }
3215 strcat (buf, ", cf, isa ");
3216 strcat (buf, isa);
3217 if (additional)
3218 strcat (buf, additional);
3219 if (e_flags & EF_M68K_CF_FLOAT)
3220 strcat (buf, ", float");
3221 switch (e_flags & EF_M68K_CF_MAC_MASK)
3222 {
3223 case 0:
3224 mac = NULL;
3225 break;
3226 case EF_M68K_CF_MAC:
3227 mac = "mac";
3228 break;
3229 case EF_M68K_CF_EMAC:
3230 mac = "emac";
3231 break;
3232 case EF_M68K_CF_EMAC_B:
3233 mac = "emac_b";
3234 break;
3235 }
3236 if (mac)
3237 {
3238 strcat (buf, ", ");
3239 strcat (buf, mac);
3240 }
3241 }
3242 break;
3243
3244 case EM_CYGNUS_MEP:
3245 switch (e_flags & EF_MEP_CPU_MASK)
3246 {
3247 case EF_MEP_CPU_MEP: strcat (buf, ", generic MeP"); break;
3248 case EF_MEP_CPU_C2: strcat (buf, ", MeP C2"); break;
3249 case EF_MEP_CPU_C3: strcat (buf, ", MeP C3"); break;
3250 case EF_MEP_CPU_C4: strcat (buf, ", MeP C4"); break;
3251 case EF_MEP_CPU_C5: strcat (buf, ", MeP C5"); break;
3252 case EF_MEP_CPU_H1: strcat (buf, ", MeP H1"); break;
3253 default: strcat (buf, _(", <unknown MeP cpu type>")); break;
3254 }
3255
3256 switch (e_flags & EF_MEP_COP_MASK)
3257 {
3258 case EF_MEP_COP_NONE: break;
3259 case EF_MEP_COP_AVC: strcat (buf, ", AVC coprocessor"); break;
3260 case EF_MEP_COP_AVC2: strcat (buf, ", AVC2 coprocessor"); break;
3261 case EF_MEP_COP_FMAX: strcat (buf, ", FMAX coprocessor"); break;
3262 case EF_MEP_COP_IVC2: strcat (buf, ", IVC2 coprocessor"); break;
3263 default: strcat (buf, _("<unknown MeP copro type>")); break;
3264 }
3265
3266 if (e_flags & EF_MEP_LIBRARY)
3267 strcat (buf, ", Built for Library");
3268
3269 if (e_flags & EF_MEP_INDEX_MASK)
3270 sprintf (buf + strlen (buf), ", Configuration Index: %#x",
3271 e_flags & EF_MEP_INDEX_MASK);
3272
3273 if (e_flags & ~ EF_MEP_ALL_FLAGS)
3274 sprintf (buf + strlen (buf), _(", unknown flags bits: %#x"),
3275 e_flags & ~ EF_MEP_ALL_FLAGS);
3276 break;
3277
3278 case EM_PPC:
3279 if (e_flags & EF_PPC_EMB)
3280 strcat (buf, ", emb");
3281
3282 if (e_flags & EF_PPC_RELOCATABLE)
3283 strcat (buf, _(", relocatable"));
3284
3285 if (e_flags & EF_PPC_RELOCATABLE_LIB)
3286 strcat (buf, _(", relocatable-lib"));
3287 break;
3288
3289 case EM_PPC64:
3290 if (e_flags & EF_PPC64_ABI)
3291 {
3292 char abi[] = ", abiv0";
3293
3294 abi[6] += e_flags & EF_PPC64_ABI;
3295 strcat (buf, abi);
3296 }
3297 break;
3298
3299 case EM_V800:
3300 if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
3301 strcat (buf, ", RH850 ABI");
3302
3303 if (e_flags & EF_V800_850E3)
3304 strcat (buf, ", V3 architecture");
3305
3306 if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
3307 strcat (buf, ", FPU not used");
3308
3309 if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
3310 strcat (buf, ", regmode: COMMON");
3311
3312 if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
3313 strcat (buf, ", r4 not used");
3314
3315 if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
3316 strcat (buf, ", r30 not used");
3317
3318 if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
3319 strcat (buf, ", r5 not used");
3320
3321 if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
3322 strcat (buf, ", r2 not used");
3323
3324 for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
3325 {
3326 switch (e_flags & - e_flags)
3327 {
3328 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
3329 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
3330 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
3331 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
3332 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
3333 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
3334 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
3335 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
3336 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
3337 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
3338 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
3339 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
3340 default: break;
3341 }
3342 }
3343 break;
3344
3345 case EM_V850:
3346 case EM_CYGNUS_V850:
3347 switch (e_flags & EF_V850_ARCH)
3348 {
3349 case E_V850E3V5_ARCH:
3350 strcat (buf, ", v850e3v5");
3351 break;
3352 case E_V850E2V3_ARCH:
3353 strcat (buf, ", v850e2v3");
3354 break;
3355 case E_V850E2_ARCH:
3356 strcat (buf, ", v850e2");
3357 break;
3358 case E_V850E1_ARCH:
3359 strcat (buf, ", v850e1");
3360 break;
3361 case E_V850E_ARCH:
3362 strcat (buf, ", v850e");
3363 break;
3364 case E_V850_ARCH:
3365 strcat (buf, ", v850");
3366 break;
3367 default:
3368 strcat (buf, _(", unknown v850 architecture variant"));
3369 break;
3370 }
3371 break;
3372
3373 case EM_M32R:
3374 case EM_CYGNUS_M32R:
3375 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3376 strcat (buf, ", m32r");
3377 break;
3378
3379 case EM_MIPS:
3380 case EM_MIPS_RS3_LE:
3381 if (e_flags & EF_MIPS_NOREORDER)
3382 strcat (buf, ", noreorder");
3383
3384 if (e_flags & EF_MIPS_PIC)
3385 strcat (buf, ", pic");
3386
3387 if (e_flags & EF_MIPS_CPIC)
3388 strcat (buf, ", cpic");
3389
3390 if (e_flags & EF_MIPS_UCODE)
3391 strcat (buf, ", ugen_reserved");
3392
3393 if (e_flags & EF_MIPS_ABI2)
3394 strcat (buf, ", abi2");
3395
3396 if (e_flags & EF_MIPS_OPTIONS_FIRST)
3397 strcat (buf, ", odk first");
3398
3399 if (e_flags & EF_MIPS_32BITMODE)
3400 strcat (buf, ", 32bitmode");
3401
3402 if (e_flags & EF_MIPS_NAN2008)
3403 strcat (buf, ", nan2008");
3404
3405 if (e_flags & EF_MIPS_FP64)
3406 strcat (buf, ", fp64");
3407
3408 switch ((e_flags & EF_MIPS_MACH))
3409 {
3410 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3411 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3412 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
3413 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
3414 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3415 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3416 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3417 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
3418 case E_MIPS_MACH_5900: strcat (buf, ", 5900"); break;
3419 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
3420 case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
3421 case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3422 case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
3423 case E_MIPS_MACH_GS464: strcat (buf, ", gs464"); break;
3424 case E_MIPS_MACH_GS464E: strcat (buf, ", gs464e"); break;
3425 case E_MIPS_MACH_GS264E: strcat (buf, ", gs264e"); break;
3426 case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
3427 case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
3428 case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
3429 case E_MIPS_MACH_XLR: strcat (buf, ", xlr"); break;
3430 case E_MIPS_MACH_IAMR2: strcat (buf, ", interaptiv-mr2"); break;
3431 case 0:
3432 /* We simply ignore the field in this case to avoid confusion:
3433 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3434 extension. */
3435 break;
3436 default: strcat (buf, _(", unknown CPU")); break;
3437 }
3438
3439 switch ((e_flags & EF_MIPS_ABI))
3440 {
3441 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3442 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3443 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3444 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3445 case 0:
3446 /* We simply ignore the field in this case to avoid confusion:
3447 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3448 This means it is likely to be an o32 file, but not for
3449 sure. */
3450 break;
3451 default: strcat (buf, _(", unknown ABI")); break;
3452 }
3453
3454 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3455 strcat (buf, ", mdmx");
3456
3457 if (e_flags & EF_MIPS_ARCH_ASE_M16)
3458 strcat (buf, ", mips16");
3459
3460 if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3461 strcat (buf, ", micromips");
3462
3463 switch ((e_flags & EF_MIPS_ARCH))
3464 {
3465 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3466 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3467 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3468 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3469 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3470 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
3471 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
3472 case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
3473 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
3474 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
3475 case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
3476 default: strcat (buf, _(", unknown ISA")); break;
3477 }
3478 break;
3479
3480 case EM_NDS32:
3481 decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3482 break;
3483
3484 case EM_NFP:
3485 switch (EF_NFP_MACH (e_flags))
3486 {
3487 case E_NFP_MACH_3200:
3488 strcat (buf, ", NFP-32xx");
3489 break;
3490 case E_NFP_MACH_6000:
3491 strcat (buf, ", NFP-6xxx");
3492 break;
3493 }
3494 break;
3495
3496 case EM_RISCV:
3497 if (e_flags & EF_RISCV_RVC)
3498 strcat (buf, ", RVC");
3499
3500 if (e_flags & EF_RISCV_RVE)
3501 strcat (buf, ", RVE");
3502
3503 switch (e_flags & EF_RISCV_FLOAT_ABI)
3504 {
3505 case EF_RISCV_FLOAT_ABI_SOFT:
3506 strcat (buf, ", soft-float ABI");
3507 break;
3508
3509 case EF_RISCV_FLOAT_ABI_SINGLE:
3510 strcat (buf, ", single-float ABI");
3511 break;
3512
3513 case EF_RISCV_FLOAT_ABI_DOUBLE:
3514 strcat (buf, ", double-float ABI");
3515 break;
3516
3517 case EF_RISCV_FLOAT_ABI_QUAD:
3518 strcat (buf, ", quad-float ABI");
3519 break;
3520 }
3521 break;
3522
3523 case EM_SH:
3524 switch ((e_flags & EF_SH_MACH_MASK))
3525 {
3526 case EF_SH1: strcat (buf, ", sh1"); break;
3527 case EF_SH2: strcat (buf, ", sh2"); break;
3528 case EF_SH3: strcat (buf, ", sh3"); break;
3529 case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3530 case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3531 case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3532 case EF_SH3E: strcat (buf, ", sh3e"); break;
3533 case EF_SH4: strcat (buf, ", sh4"); break;
3534 case EF_SH5: strcat (buf, ", sh5"); break;
3535 case EF_SH2E: strcat (buf, ", sh2e"); break;
3536 case EF_SH4A: strcat (buf, ", sh4a"); break;
3537 case EF_SH2A: strcat (buf, ", sh2a"); break;
3538 case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3539 case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
3540 case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
3541 case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3542 case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3543 case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3544 case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3545 case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3546 case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
3547 default: strcat (buf, _(", unknown ISA")); break;
3548 }
3549
3550 if (e_flags & EF_SH_PIC)
3551 strcat (buf, ", pic");
3552
3553 if (e_flags & EF_SH_FDPIC)
3554 strcat (buf, ", fdpic");
3555 break;
3556
3557 case EM_OR1K:
3558 if (e_flags & EF_OR1K_NODELAY)
3559 strcat (buf, ", no delay");
3560 break;
3561
3562 case EM_SPARCV9:
3563 if (e_flags & EF_SPARC_32PLUS)
3564 strcat (buf, ", v8+");
3565
3566 if (e_flags & EF_SPARC_SUN_US1)
3567 strcat (buf, ", ultrasparcI");
3568
3569 if (e_flags & EF_SPARC_SUN_US3)
3570 strcat (buf, ", ultrasparcIII");
3571
3572 if (e_flags & EF_SPARC_HAL_R1)
3573 strcat (buf, ", halr1");
3574
3575 if (e_flags & EF_SPARC_LEDATA)
3576 strcat (buf, ", ledata");
3577
3578 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3579 strcat (buf, ", tso");
3580
3581 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3582 strcat (buf, ", pso");
3583
3584 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3585 strcat (buf, ", rmo");
3586 break;
3587
3588 case EM_PARISC:
3589 switch (e_flags & EF_PARISC_ARCH)
3590 {
3591 case EFA_PARISC_1_0:
3592 strcpy (buf, ", PA-RISC 1.0");
3593 break;
3594 case EFA_PARISC_1_1:
3595 strcpy (buf, ", PA-RISC 1.1");
3596 break;
3597 case EFA_PARISC_2_0:
3598 strcpy (buf, ", PA-RISC 2.0");
3599 break;
3600 default:
3601 break;
3602 }
3603 if (e_flags & EF_PARISC_TRAPNIL)
3604 strcat (buf, ", trapnil");
3605 if (e_flags & EF_PARISC_EXT)
3606 strcat (buf, ", ext");
3607 if (e_flags & EF_PARISC_LSB)
3608 strcat (buf, ", lsb");
3609 if (e_flags & EF_PARISC_WIDE)
3610 strcat (buf, ", wide");
3611 if (e_flags & EF_PARISC_NO_KABP)
3612 strcat (buf, ", no kabp");
3613 if (e_flags & EF_PARISC_LAZYSWAP)
3614 strcat (buf, ", lazyswap");
3615 break;
3616
3617 case EM_PJ:
3618 case EM_PJ_OLD:
3619 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3620 strcat (buf, ", new calling convention");
3621
3622 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3623 strcat (buf, ", gnu calling convention");
3624 break;
3625
3626 case EM_IA_64:
3627 if ((e_flags & EF_IA_64_ABI64))
3628 strcat (buf, ", 64-bit");
3629 else
3630 strcat (buf, ", 32-bit");
3631 if ((e_flags & EF_IA_64_REDUCEDFP))
3632 strcat (buf, ", reduced fp model");
3633 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3634 strcat (buf, ", no function descriptors, constant gp");
3635 else if ((e_flags & EF_IA_64_CONS_GP))
3636 strcat (buf, ", constant gp");
3637 if ((e_flags & EF_IA_64_ABSOLUTE))
3638 strcat (buf, ", absolute");
3639 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3640 {
3641 if ((e_flags & EF_IA_64_VMS_LINKAGES))
3642 strcat (buf, ", vms_linkages");
3643 switch ((e_flags & EF_IA_64_VMS_COMCOD))
3644 {
3645 case EF_IA_64_VMS_COMCOD_SUCCESS:
3646 break;
3647 case EF_IA_64_VMS_COMCOD_WARNING:
3648 strcat (buf, ", warning");
3649 break;
3650 case EF_IA_64_VMS_COMCOD_ERROR:
3651 strcat (buf, ", error");
3652 break;
3653 case EF_IA_64_VMS_COMCOD_ABORT:
3654 strcat (buf, ", abort");
3655 break;
3656 default:
3657 warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3658 e_flags & EF_IA_64_VMS_COMCOD);
3659 strcat (buf, ", <unknown>");
3660 }
3661 }
3662 break;
3663
3664 case EM_VAX:
3665 if ((e_flags & EF_VAX_NONPIC))
3666 strcat (buf, ", non-PIC");
3667 if ((e_flags & EF_VAX_DFLOAT))
3668 strcat (buf, ", D-Float");
3669 if ((e_flags & EF_VAX_GFLOAT))
3670 strcat (buf, ", G-Float");
3671 break;
3672
3673 case EM_VISIUM:
3674 if (e_flags & EF_VISIUM_ARCH_MCM)
3675 strcat (buf, ", mcm");
3676 else if (e_flags & EF_VISIUM_ARCH_MCM24)
3677 strcat (buf, ", mcm24");
3678 if (e_flags & EF_VISIUM_ARCH_GR6)
3679 strcat (buf, ", gr6");
3680 break;
3681
3682 case EM_RL78:
3683 switch (e_flags & E_FLAG_RL78_CPU_MASK)
3684 {
3685 case E_FLAG_RL78_ANY_CPU: break;
3686 case E_FLAG_RL78_G10: strcat (buf, ", G10"); break;
3687 case E_FLAG_RL78_G13: strcat (buf, ", G13"); break;
3688 case E_FLAG_RL78_G14: strcat (buf, ", G14"); break;
3689 }
3690 if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3691 strcat (buf, ", 64-bit doubles");
3692 break;
3693
3694 case EM_RX:
3695 if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3696 strcat (buf, ", 64-bit doubles");
3697 if (e_flags & E_FLAG_RX_DSP)
3698 strcat (buf, ", dsp");
3699 if (e_flags & E_FLAG_RX_PID)
3700 strcat (buf, ", pid");
3701 if (e_flags & E_FLAG_RX_ABI)
3702 strcat (buf, ", RX ABI");
3703 if (e_flags & E_FLAG_RX_SINSNS_SET)
3704 strcat (buf, e_flags & E_FLAG_RX_SINSNS_YES
3705 ? ", uses String instructions" : ", bans String instructions");
3706 if (e_flags & E_FLAG_RX_V2)
3707 strcat (buf, ", V2");
3708 if (e_flags & E_FLAG_RX_V3)
3709 strcat (buf, ", V3");
3710 break;
3711
3712 case EM_S390:
3713 if (e_flags & EF_S390_HIGH_GPRS)
3714 strcat (buf, ", highgprs");
3715 break;
3716
3717 case EM_TI_C6000:
3718 if ((e_flags & EF_C6000_REL))
3719 strcat (buf, ", relocatable module");
3720 break;
3721
3722 case EM_MSP430:
3723 strcat (buf, _(": architecture variant: "));
3724 switch (e_flags & EF_MSP430_MACH)
3725 {
3726 case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3727 case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3728 case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3729 case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3730 case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3731 case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3732 case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3733 case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3734 case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3735 case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3736 case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3737 case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3738 case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3739 case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3740 case E_MSP430_MACH_MSP430X : strcat (buf, "MSP430X"); break;
3741 default:
3742 strcat (buf, _(": unknown")); break;
3743 }
3744
3745 if (e_flags & ~ EF_MSP430_MACH)
3746 strcat (buf, _(": unknown extra flag bits also present"));
3747 }
3748 }
3749
3750 return buf;
3751 }
3752
3753 static const char *
3754 get_osabi_name (Filedata * filedata, unsigned int osabi)
3755 {
3756 static char buff[32];
3757
3758 switch (osabi)
3759 {
3760 case ELFOSABI_NONE: return "UNIX - System V";
3761 case ELFOSABI_HPUX: return "UNIX - HP-UX";
3762 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
3763 case ELFOSABI_GNU: return "UNIX - GNU";
3764 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
3765 case ELFOSABI_AIX: return "UNIX - AIX";
3766 case ELFOSABI_IRIX: return "UNIX - IRIX";
3767 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
3768 case ELFOSABI_TRU64: return "UNIX - TRU64";
3769 case ELFOSABI_MODESTO: return "Novell - Modesto";
3770 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
3771 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
3772 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
3773 case ELFOSABI_AROS: return "AROS";
3774 case ELFOSABI_FENIXOS: return "FenixOS";
3775 case ELFOSABI_CLOUDABI: return "Nuxi CloudABI";
3776 case ELFOSABI_OPENVOS: return "Stratus Technologies OpenVOS";
3777 default:
3778 if (osabi >= 64)
3779 switch (filedata->file_header.e_machine)
3780 {
3781 case EM_ARM:
3782 switch (osabi)
3783 {
3784 case ELFOSABI_ARM: return "ARM";
3785 case ELFOSABI_ARM_FDPIC: return "ARM FDPIC";
3786 default:
3787 break;
3788 }
3789 break;
3790
3791 case EM_MSP430:
3792 case EM_MSP430_OLD:
3793 case EM_VISIUM:
3794 switch (osabi)
3795 {
3796 case ELFOSABI_STANDALONE: return _("Standalone App");
3797 default:
3798 break;
3799 }
3800 break;
3801
3802 case EM_TI_C6000:
3803 switch (osabi)
3804 {
3805 case ELFOSABI_C6000_ELFABI: return _("Bare-metal C6000");
3806 case ELFOSABI_C6000_LINUX: return "Linux C6000";
3807 default:
3808 break;
3809 }
3810 break;
3811
3812 default:
3813 break;
3814 }
3815 snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3816 return buff;
3817 }
3818 }
3819
3820 static const char *
3821 get_aarch64_segment_type (unsigned long type)
3822 {
3823 switch (type)
3824 {
3825 case PT_AARCH64_ARCHEXT: return "AARCH64_ARCHEXT";
3826 default: return NULL;
3827 }
3828 }
3829
3830 static const char *
3831 get_arm_segment_type (unsigned long type)
3832 {
3833 switch (type)
3834 {
3835 case PT_ARM_EXIDX: return "EXIDX";
3836 default: return NULL;
3837 }
3838 }
3839
3840 static const char *
3841 get_s390_segment_type (unsigned long type)
3842 {
3843 switch (type)
3844 {
3845 case PT_S390_PGSTE: return "S390_PGSTE";
3846 default: return NULL;
3847 }
3848 }
3849
3850 static const char *
3851 get_mips_segment_type (unsigned long type)
3852 {
3853 switch (type)
3854 {
3855 case PT_MIPS_REGINFO: return "REGINFO";
3856 case PT_MIPS_RTPROC: return "RTPROC";
3857 case PT_MIPS_OPTIONS: return "OPTIONS";
3858 case PT_MIPS_ABIFLAGS: return "ABIFLAGS";
3859 default: return NULL;
3860 }
3861 }
3862
3863 static const char *
3864 get_parisc_segment_type (unsigned long type)
3865 {
3866 switch (type)
3867 {
3868 case PT_HP_TLS: return "HP_TLS";
3869 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
3870 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
3871 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
3872 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
3873 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
3874 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
3875 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
3876 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
3877 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
3878 case PT_HP_PARALLEL: return "HP_PARALLEL";
3879 case PT_HP_FASTBIND: return "HP_FASTBIND";
3880 case PT_HP_OPT_ANNOT: return "HP_OPT_ANNOT";
3881 case PT_HP_HSL_ANNOT: return "HP_HSL_ANNOT";
3882 case PT_HP_STACK: return "HP_STACK";
3883 case PT_HP_CORE_UTSNAME: return "HP_CORE_UTSNAME";
3884 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
3885 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
3886 case PT_PARISC_WEAKORDER: return "PARISC_WEAKORDER";
3887 default: return NULL;
3888 }
3889 }
3890
3891 static const char *
3892 get_ia64_segment_type (unsigned long type)
3893 {
3894 switch (type)
3895 {
3896 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
3897 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
3898 case PT_HP_TLS: return "HP_TLS";
3899 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
3900 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
3901 case PT_IA_64_HP_STACK: return "HP_STACK";
3902 default: return NULL;
3903 }
3904 }
3905
3906 static const char *
3907 get_tic6x_segment_type (unsigned long type)
3908 {
3909 switch (type)
3910 {
3911 case PT_C6000_PHATTR: return "C6000_PHATTR";
3912 default: return NULL;
3913 }
3914 }
3915
3916 static const char *
3917 get_solaris_segment_type (unsigned long type)
3918 {
3919 switch (type)
3920 {
3921 case 0x6464e550: return "PT_SUNW_UNWIND";
3922 case 0x6474e550: return "PT_SUNW_EH_FRAME";
3923 case 0x6ffffff7: return "PT_LOSUNW";
3924 case 0x6ffffffa: return "PT_SUNWBSS";
3925 case 0x6ffffffb: return "PT_SUNWSTACK";
3926 case 0x6ffffffc: return "PT_SUNWDTRACE";
3927 case 0x6ffffffd: return "PT_SUNWCAP";
3928 case 0x6fffffff: return "PT_HISUNW";
3929 default: return NULL;
3930 }
3931 }
3932
3933 static const char *
3934 get_segment_type (Filedata * filedata, unsigned long p_type)
3935 {
3936 static char buff[32];
3937
3938 switch (p_type)
3939 {
3940 case PT_NULL: return "NULL";
3941 case PT_LOAD: return "LOAD";
3942 case PT_DYNAMIC: return "DYNAMIC";
3943 case PT_INTERP: return "INTERP";
3944 case PT_NOTE: return "NOTE";
3945 case PT_SHLIB: return "SHLIB";
3946 case PT_PHDR: return "PHDR";
3947 case PT_TLS: return "TLS";
3948 case PT_GNU_EH_FRAME: return "GNU_EH_FRAME";
3949 case PT_GNU_STACK: return "GNU_STACK";
3950 case PT_GNU_RELRO: return "GNU_RELRO";
3951 case PT_GNU_PROPERTY: return "GNU_PROPERTY";
3952
3953 default:
3954 if (p_type >= PT_GNU_MBIND_LO && p_type <= PT_GNU_MBIND_HI)
3955 {
3956 sprintf (buff, "GNU_MBIND+%#lx",
3957 p_type - PT_GNU_MBIND_LO);
3958 }
3959 else if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3960 {
3961 const char * result;
3962
3963 switch (filedata->file_header.e_machine)
3964 {
3965 case EM_AARCH64:
3966 result = get_aarch64_segment_type (p_type);
3967 break;
3968 case EM_ARM:
3969 result = get_arm_segment_type (p_type);
3970 break;
3971 case EM_MIPS:
3972 case EM_MIPS_RS3_LE:
3973 result = get_mips_segment_type (p_type);
3974 break;
3975 case EM_PARISC:
3976 result = get_parisc_segment_type (p_type);
3977 break;
3978 case EM_IA_64:
3979 result = get_ia64_segment_type (p_type);
3980 break;
3981 case EM_TI_C6000:
3982 result = get_tic6x_segment_type (p_type);
3983 break;
3984 case EM_S390:
3985 case EM_S390_OLD:
3986 result = get_s390_segment_type (p_type);
3987 break;
3988 default:
3989 result = NULL;
3990 break;
3991 }
3992
3993 if (result != NULL)
3994 return result;
3995
3996 sprintf (buff, "LOPROC+%#lx", p_type - PT_LOPROC);
3997 }
3998 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3999 {
4000 const char * result;
4001
4002 switch (filedata->file_header.e_machine)
4003 {
4004 case EM_PARISC:
4005 result = get_parisc_segment_type (p_type);
4006 break;
4007 case EM_IA_64:
4008 result = get_ia64_segment_type (p_type);
4009 break;
4010 default:
4011 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
4012 result = get_solaris_segment_type (p_type);
4013 else
4014 result = NULL;
4015 break;
4016 }
4017
4018 if (result != NULL)
4019 return result;
4020
4021 sprintf (buff, "LOOS+%#lx", p_type - PT_LOOS);
4022 }
4023 else
4024 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
4025
4026 return buff;
4027 }
4028 }
4029
4030 static const char *
4031 get_arc_section_type_name (unsigned int sh_type)
4032 {
4033 switch (sh_type)
4034 {
4035 case SHT_ARC_ATTRIBUTES: return "ARC_ATTRIBUTES";
4036 default:
4037 break;
4038 }
4039 return NULL;
4040 }
4041
4042 static const char *
4043 get_mips_section_type_name (unsigned int sh_type)
4044 {
4045 switch (sh_type)
4046 {
4047 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
4048 case SHT_MIPS_MSYM: return "MIPS_MSYM";
4049 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
4050 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
4051 case SHT_MIPS_UCODE: return "MIPS_UCODE";
4052 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
4053 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
4054 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
4055 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
4056 case SHT_MIPS_RELD: return "MIPS_RELD";
4057 case SHT_MIPS_IFACE: return "MIPS_IFACE";
4058 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
4059 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
4060 case SHT_MIPS_SHDR: return "MIPS_SHDR";
4061 case SHT_MIPS_FDESC: return "MIPS_FDESC";
4062 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
4063 case SHT_MIPS_DENSE: return "MIPS_DENSE";
4064 case SHT_MIPS_PDESC: return "MIPS_PDESC";
4065 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
4066 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
4067 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
4068 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
4069 case SHT_MIPS_LINE: return "MIPS_LINE";
4070 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
4071 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
4072 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
4073 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
4074 case SHT_MIPS_DWARF: return "MIPS_DWARF";
4075 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
4076 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
4077 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
4078 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
4079 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
4080 case SHT_MIPS_XLATE: return "MIPS_XLATE";
4081 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
4082 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
4083 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
4084 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
4085 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
4086 case SHT_MIPS_ABIFLAGS: return "MIPS_ABIFLAGS";
4087 default:
4088 break;
4089 }
4090 return NULL;
4091 }
4092
4093 static const char *
4094 get_parisc_section_type_name (unsigned int sh_type)
4095 {
4096 switch (sh_type)
4097 {
4098 case SHT_PARISC_EXT: return "PARISC_EXT";
4099 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
4100 case SHT_PARISC_DOC: return "PARISC_DOC";
4101 case SHT_PARISC_ANNOT: return "PARISC_ANNOT";
4102 case SHT_PARISC_SYMEXTN: return "PARISC_SYMEXTN";
4103 case SHT_PARISC_STUBS: return "PARISC_STUBS";
4104 case SHT_PARISC_DLKM: return "PARISC_DLKM";
4105 default: return NULL;
4106 }
4107 }
4108
4109 static const char *
4110 get_ia64_section_type_name (Filedata * filedata, unsigned int sh_type)
4111 {
4112 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
4113 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
4114 return get_osabi_name (filedata, (sh_type & 0x00FF0000) >> 16);
4115
4116 switch (sh_type)
4117 {
4118 case SHT_IA_64_EXT: return "IA_64_EXT";
4119 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
4120 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
4121 case SHT_IA_64_VMS_TRACE: return "VMS_TRACE";
4122 case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
4123 case SHT_IA_64_VMS_DEBUG: return "VMS_DEBUG";
4124 case SHT_IA_64_VMS_DEBUG_STR: return "VMS_DEBUG_STR";
4125 case SHT_IA_64_VMS_LINKAGES: return "VMS_LINKAGES";
4126 case SHT_IA_64_VMS_SYMBOL_VECTOR: return "VMS_SYMBOL_VECTOR";
4127 case SHT_IA_64_VMS_FIXUP: return "VMS_FIXUP";
4128 default:
4129 break;
4130 }
4131 return NULL;
4132 }
4133
4134 static const char *
4135 get_x86_64_section_type_name (unsigned int sh_type)
4136 {
4137 switch (sh_type)
4138 {
4139 case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
4140 default: return NULL;
4141 }
4142 }
4143
4144 static const char *
4145 get_aarch64_section_type_name (unsigned int sh_type)
4146 {
4147 switch (sh_type)
4148 {
4149 case SHT_AARCH64_ATTRIBUTES: return "AARCH64_ATTRIBUTES";
4150 default: return NULL;
4151 }
4152 }
4153
4154 static const char *
4155 get_arm_section_type_name (unsigned int sh_type)
4156 {
4157 switch (sh_type)
4158 {
4159 case SHT_ARM_EXIDX: return "ARM_EXIDX";
4160 case SHT_ARM_PREEMPTMAP: return "ARM_PREEMPTMAP";
4161 case SHT_ARM_ATTRIBUTES: return "ARM_ATTRIBUTES";
4162 case SHT_ARM_DEBUGOVERLAY: return "ARM_DEBUGOVERLAY";
4163 case SHT_ARM_OVERLAYSECTION: return "ARM_OVERLAYSECTION";
4164 default: return NULL;
4165 }
4166 }
4167
4168 static const char *
4169 get_tic6x_section_type_name (unsigned int sh_type)
4170 {
4171 switch (sh_type)
4172 {
4173 case SHT_C6000_UNWIND: return "C6000_UNWIND";
4174 case SHT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
4175 case SHT_C6000_ATTRIBUTES: return "C6000_ATTRIBUTES";
4176 case SHT_TI_ICODE: return "TI_ICODE";
4177 case SHT_TI_XREF: return "TI_XREF";
4178 case SHT_TI_HANDLER: return "TI_HANDLER";
4179 case SHT_TI_INITINFO: return "TI_INITINFO";
4180 case SHT_TI_PHATTRS: return "TI_PHATTRS";
4181 default: return NULL;
4182 }
4183 }
4184
4185 static const char *
4186 get_msp430x_section_type_name (unsigned int sh_type)
4187 {
4188 switch (sh_type)
4189 {
4190 case SHT_MSP430_SEC_FLAGS: return "MSP430_SEC_FLAGS";
4191 case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
4192 case SHT_MSP430_ATTRIBUTES: return "MSP430_ATTRIBUTES";
4193 default: return NULL;
4194 }
4195 }
4196
4197 static const char *
4198 get_nfp_section_type_name (unsigned int sh_type)
4199 {
4200 switch (sh_type)
4201 {
4202 case SHT_NFP_MECONFIG: return "NFP_MECONFIG";
4203 case SHT_NFP_INITREG: return "NFP_INITREG";
4204 case SHT_NFP_UDEBUG: return "NFP_UDEBUG";
4205 default: return NULL;
4206 }
4207 }
4208
4209 static const char *
4210 get_v850_section_type_name (unsigned int sh_type)
4211 {
4212 switch (sh_type)
4213 {
4214 case SHT_V850_SCOMMON: return "V850 Small Common";
4215 case SHT_V850_TCOMMON: return "V850 Tiny Common";
4216 case SHT_V850_ZCOMMON: return "V850 Zero Common";
4217 case SHT_RENESAS_IOP: return "RENESAS IOP";
4218 case SHT_RENESAS_INFO: return "RENESAS INFO";
4219 default: return NULL;
4220 }
4221 }
4222
4223 static const char *
4224 get_riscv_section_type_name (unsigned int sh_type)
4225 {
4226 switch (sh_type)
4227 {
4228 case SHT_RISCV_ATTRIBUTES: return "RISCV_ATTRIBUTES";
4229 default: return NULL;
4230 }
4231 }
4232
4233 static const char *
4234 get_section_type_name (Filedata * filedata, unsigned int sh_type)
4235 {
4236 static char buff[32];
4237 const char * result;
4238
4239 switch (sh_type)
4240 {
4241 case SHT_NULL: return "NULL";
4242 case SHT_PROGBITS: return "PROGBITS";
4243 case SHT_SYMTAB: return "SYMTAB";
4244 case SHT_STRTAB: return "STRTAB";
4245 case SHT_RELA: return "RELA";
4246 case SHT_HASH: return "HASH";
4247 case SHT_DYNAMIC: return "DYNAMIC";
4248 case SHT_NOTE: return "NOTE";
4249 case SHT_NOBITS: return "NOBITS";
4250 case SHT_REL: return "REL";
4251 case SHT_SHLIB: return "SHLIB";
4252 case SHT_DYNSYM: return "DYNSYM";
4253 case SHT_INIT_ARRAY: return "INIT_ARRAY";
4254 case SHT_FINI_ARRAY: return "FINI_ARRAY";
4255 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
4256 case SHT_GNU_HASH: return "GNU_HASH";
4257 case SHT_GROUP: return "GROUP";
4258 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICES";
4259 case SHT_GNU_verdef: return "VERDEF";
4260 case SHT_GNU_verneed: return "VERNEED";
4261 case SHT_GNU_versym: return "VERSYM";
4262 case 0x6ffffff0: return "VERSYM";
4263 case 0x6ffffffc: return "VERDEF";
4264 case 0x7ffffffd: return "AUXILIARY";
4265 case 0x7fffffff: return "FILTER";
4266 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
4267
4268 default:
4269 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
4270 {
4271 switch (filedata->file_header.e_machine)
4272 {
4273 case EM_ARC:
4274 case EM_ARC_COMPACT:
4275 case EM_ARC_COMPACT2:
4276 result = get_arc_section_type_name (sh_type);
4277 break;
4278 case EM_MIPS:
4279 case EM_MIPS_RS3_LE:
4280 result = get_mips_section_type_name (sh_type);
4281 break;
4282 case EM_PARISC:
4283 result = get_parisc_section_type_name (sh_type);
4284 break;
4285 case EM_IA_64:
4286 result = get_ia64_section_type_name (filedata, sh_type);
4287 break;
4288 case EM_X86_64:
4289 case EM_L1OM:
4290 case EM_K1OM:
4291 result = get_x86_64_section_type_name (sh_type);
4292 break;
4293 case EM_AARCH64:
4294 result = get_aarch64_section_type_name (sh_type);
4295 break;
4296 case EM_ARM:
4297 result = get_arm_section_type_name (sh_type);
4298 break;
4299 case EM_TI_C6000:
4300 result = get_tic6x_section_type_name (sh_type);
4301 break;
4302 case EM_MSP430:
4303 result = get_msp430x_section_type_name (sh_type);
4304 break;
4305 case EM_NFP:
4306 result = get_nfp_section_type_name (sh_type);
4307 break;
4308 case EM_V800:
4309 case EM_V850:
4310 case EM_CYGNUS_V850:
4311 result = get_v850_section_type_name (sh_type);
4312 break;
4313 case EM_RISCV:
4314 result = get_riscv_section_type_name (sh_type);
4315 break;
4316 default:
4317 result = NULL;
4318 break;
4319 }
4320
4321 if (result != NULL)
4322 return result;
4323
4324 sprintf (buff, "LOPROC+%#x", sh_type - SHT_LOPROC);
4325 }
4326 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
4327 {
4328 switch (filedata->file_header.e_machine)
4329 {
4330 case EM_IA_64:
4331 result = get_ia64_section_type_name (filedata, sh_type);
4332 break;
4333 default:
4334 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
4335 result = get_solaris_section_type (sh_type);
4336 else
4337 {
4338 switch (sh_type)
4339 {
4340 case SHT_GNU_INCREMENTAL_INPUTS: result = "GNU_INCREMENTAL_INPUTS"; break;
4341 case SHT_GNU_ATTRIBUTES: result = "GNU_ATTRIBUTES"; break;
4342 case SHT_GNU_HASH: result = "GNU_HASH"; break;
4343 case SHT_GNU_LIBLIST: result = "GNU_LIBLIST"; break;
4344 default:
4345 result = NULL;
4346 break;
4347 }
4348 }
4349 break;
4350 }
4351
4352 if (result != NULL)
4353 return result;
4354
4355 sprintf (buff, "LOOS+%#x", sh_type - SHT_LOOS);
4356 }
4357 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
4358 {
4359 switch (filedata->file_header.e_machine)
4360 {
4361 case EM_V800:
4362 case EM_V850:
4363 case EM_CYGNUS_V850:
4364 result = get_v850_section_type_name (sh_type);
4365 break;
4366 default:
4367 result = NULL;
4368 break;
4369 }
4370
4371 if (result != NULL)
4372 return result;
4373
4374 sprintf (buff, "LOUSER+%#x", sh_type - SHT_LOUSER);
4375 }
4376 else
4377 /* This message is probably going to be displayed in a 15
4378 character wide field, so put the hex value first. */
4379 snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
4380
4381 return buff;
4382 }
4383 }
4384
4385 #define OPTION_DEBUG_DUMP 512
4386 #define OPTION_DYN_SYMS 513
4387 #define OPTION_DWARF_DEPTH 514
4388 #define OPTION_DWARF_START 515
4389 #define OPTION_DWARF_CHECK 516
4390
4391 static struct option options[] =
4392 {
4393 {"all", no_argument, 0, 'a'},
4394 {"file-header", no_argument, 0, 'h'},
4395 {"program-headers", no_argument, 0, 'l'},
4396 {"headers", no_argument, 0, 'e'},
4397 {"histogram", no_argument, 0, 'I'},
4398 {"segments", no_argument, 0, 'l'},
4399 {"sections", no_argument, 0, 'S'},
4400 {"section-headers", no_argument, 0, 'S'},
4401 {"section-groups", no_argument, 0, 'g'},
4402 {"section-details", no_argument, 0, 't'},
4403 {"full-section-name",no_argument, 0, 'N'},
4404 {"symbols", no_argument, 0, 's'},
4405 {"syms", no_argument, 0, 's'},
4406 {"dyn-syms", no_argument, 0, OPTION_DYN_SYMS},
4407 {"relocs", no_argument, 0, 'r'},
4408 {"notes", no_argument, 0, 'n'},
4409 {"dynamic", no_argument, 0, 'd'},
4410 {"arch-specific", no_argument, 0, 'A'},
4411 {"version-info", no_argument, 0, 'V'},
4412 {"use-dynamic", no_argument, 0, 'D'},
4413 {"unwind", no_argument, 0, 'u'},
4414 {"archive-index", no_argument, 0, 'c'},
4415 {"hex-dump", required_argument, 0, 'x'},
4416 {"relocated-dump", required_argument, 0, 'R'},
4417 {"string-dump", required_argument, 0, 'p'},
4418 {"decompress", no_argument, 0, 'z'},
4419 #ifdef SUPPORT_DISASSEMBLY
4420 {"instruction-dump", required_argument, 0, 'i'},
4421 #endif
4422 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
4423
4424 {"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH},
4425 {"dwarf-start", required_argument, 0, OPTION_DWARF_START},
4426 {"dwarf-check", no_argument, 0, OPTION_DWARF_CHECK},
4427
4428 {"version", no_argument, 0, 'v'},
4429 {"wide", no_argument, 0, 'W'},
4430 {"help", no_argument, 0, 'H'},
4431 {0, no_argument, 0, 0}
4432 };
4433
4434 static void
4435 usage (FILE * stream)
4436 {
4437 fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
4438 fprintf (stream, _(" Display information about the contents of ELF format files\n"));
4439 fprintf (stream, _(" Options are:\n\
4440 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4441 -h --file-header Display the ELF file header\n\
4442 -l --program-headers Display the program headers\n\
4443 --segments An alias for --program-headers\n\
4444 -S --section-headers Display the sections' header\n\
4445 --sections An alias for --section-headers\n\
4446 -g --section-groups Display the section groups\n\
4447 -t --section-details Display the section details\n\
4448 -e --headers Equivalent to: -h -l -S\n\
4449 -s --syms Display the symbol table\n\
4450 --symbols An alias for --syms\n\
4451 --dyn-syms Display the dynamic symbol table\n\
4452 -n --notes Display the core notes (if present)\n\
4453 -r --relocs Display the relocations (if present)\n\
4454 -u --unwind Display the unwind info (if present)\n\
4455 -d --dynamic Display the dynamic section (if present)\n\
4456 -V --version-info Display the version sections (if present)\n\
4457 -A --arch-specific Display architecture specific information (if any)\n\
4458 -c --archive-index Display the symbol/file index in an archive\n\
4459 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
4460 -x --hex-dump=<number|name>\n\
4461 Dump the contents of section <number|name> as bytes\n\
4462 -p --string-dump=<number|name>\n\
4463 Dump the contents of section <number|name> as strings\n\
4464 -R --relocated-dump=<number|name>\n\
4465 Dump the contents of section <number|name> as relocated bytes\n\
4466 -z --decompress Decompress section before dumping it\n\
4467 -w[lLiaprmfFsoRtUuTgAckK] or\n\
4468 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
4469 =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
4470 =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4471 =addr,=cu_index,=links,=follow-links]\n\
4472 Display the contents of DWARF debug sections\n"));
4473 fprintf (stream, _("\
4474 --dwarf-depth=N Do not display DIEs at depth N or greater\n\
4475 --dwarf-start=N Display DIEs starting with N, at the same depth\n\
4476 or deeper\n"));
4477 #ifdef SUPPORT_DISASSEMBLY
4478 fprintf (stream, _("\
4479 -i --instruction-dump=<number|name>\n\
4480 Disassemble the contents of section <number|name>\n"));
4481 #endif
4482 fprintf (stream, _("\
4483 -I --histogram Display histogram of bucket list lengths\n\
4484 -W --wide Allow output width to exceed 80 characters\n\
4485 @<file> Read options from <file>\n\
4486 -H --help Display this information\n\
4487 -v --version Display the version number of readelf\n"));
4488
4489 if (REPORT_BUGS_TO[0] && stream == stdout)
4490 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
4491
4492 exit (stream == stdout ? 0 : 1);
4493 }
4494
4495 /* Record the fact that the user wants the contents of section number
4496 SECTION to be displayed using the method(s) encoded as flags bits
4497 in TYPE. Note, TYPE can be zero if we are creating the array for
4498 the first time. */
4499
4500 static void
4501 request_dump_bynumber (Filedata * filedata, unsigned int section, dump_type type)
4502 {
4503 if (section >= filedata->num_dump_sects)
4504 {
4505 dump_type * new_dump_sects;
4506
4507 new_dump_sects = (dump_type *) calloc (section + 1,
4508 sizeof (* new_dump_sects));
4509
4510 if (new_dump_sects == NULL)
4511 error (_("Out of memory allocating dump request table.\n"));
4512 else
4513 {
4514 if (filedata->dump_sects)
4515 {
4516 /* Copy current flag settings. */
4517 memcpy (new_dump_sects, filedata->dump_sects,
4518 filedata->num_dump_sects * sizeof (* new_dump_sects));
4519
4520 free (filedata->dump_sects);
4521 }
4522
4523 filedata->dump_sects = new_dump_sects;
4524 filedata->num_dump_sects = section + 1;
4525 }
4526 }
4527
4528 if (filedata->dump_sects)
4529 filedata->dump_sects[section] |= type;
4530 }
4531
4532 /* Request a dump by section name. */
4533
4534 static void
4535 request_dump_byname (const char * section, dump_type type)
4536 {
4537 struct dump_list_entry * new_request;
4538
4539 new_request = (struct dump_list_entry *)
4540 malloc (sizeof (struct dump_list_entry));
4541 if (!new_request)
4542 error (_("Out of memory allocating dump request table.\n"));
4543
4544 new_request->name = strdup (section);
4545 if (!new_request->name)
4546 error (_("Out of memory allocating dump request table.\n"));
4547
4548 new_request->type = type;
4549
4550 new_request->next = dump_sects_byname;
4551 dump_sects_byname = new_request;
4552 }
4553
4554 static inline void
4555 request_dump (Filedata * filedata, dump_type type)
4556 {
4557 int section;
4558 char * cp;
4559
4560 do_dump++;
4561 section = strtoul (optarg, & cp, 0);
4562
4563 if (! *cp && section >= 0)
4564 request_dump_bynumber (filedata, section, type);
4565 else
4566 request_dump_byname (optarg, type);
4567 }
4568
4569 static void
4570 parse_args (Filedata * filedata, int argc, char ** argv)
4571 {
4572 int c;
4573
4574 if (argc < 2)
4575 usage (stderr);
4576
4577 while ((c = getopt_long
4578 (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
4579 {
4580 switch (c)
4581 {
4582 case 0:
4583 /* Long options. */
4584 break;
4585 case 'H':
4586 usage (stdout);
4587 break;
4588
4589 case 'a':
4590 do_syms = TRUE;
4591 do_reloc = TRUE;
4592 do_unwind = TRUE;
4593 do_dynamic = TRUE;
4594 do_header = TRUE;
4595 do_sections = TRUE;
4596 do_section_groups = TRUE;
4597 do_segments = TRUE;
4598 do_version = TRUE;
4599 do_histogram = TRUE;
4600 do_arch = TRUE;
4601 do_notes = TRUE;
4602 break;
4603 case 'g':
4604 do_section_groups = TRUE;
4605 break;
4606 case 't':
4607 case 'N':
4608 do_sections = TRUE;
4609 do_section_details = TRUE;
4610 break;
4611 case 'e':
4612 do_header = TRUE;
4613 do_sections = TRUE;
4614 do_segments = TRUE;
4615 break;
4616 case 'A':
4617 do_arch = TRUE;
4618 break;
4619 case 'D':
4620 do_using_dynamic = TRUE;
4621 break;
4622 case 'r':
4623 do_reloc = TRUE;
4624 break;
4625 case 'u':
4626 do_unwind = TRUE;
4627 break;
4628 case 'h':
4629 do_header = TRUE;
4630 break;
4631 case 'l':
4632 do_segments = TRUE;
4633 break;
4634 case 's':
4635 do_syms = TRUE;
4636 break;
4637 case 'S':
4638 do_sections = TRUE;
4639 break;
4640 case 'd':
4641 do_dynamic = TRUE;
4642 break;
4643 case 'I':
4644 do_histogram = TRUE;
4645 break;
4646 case 'n':
4647 do_notes = TRUE;
4648 break;
4649 case 'c':
4650 do_archive_index = TRUE;
4651 break;
4652 case 'x':
4653 request_dump (filedata, HEX_DUMP);
4654 break;
4655 case 'p':
4656 request_dump (filedata, STRING_DUMP);
4657 break;
4658 case 'R':
4659 request_dump (filedata, RELOC_DUMP);
4660 break;
4661 case 'z':
4662 decompress_dumps = TRUE;
4663 break;
4664 case 'w':
4665 do_dump = TRUE;
4666 if (optarg == 0)
4667 {
4668 do_debugging = TRUE;
4669 dwarf_select_sections_all ();
4670 }
4671 else
4672 {
4673 do_debugging = FALSE;
4674 dwarf_select_sections_by_letters (optarg);
4675 }
4676 break;
4677 case OPTION_DEBUG_DUMP:
4678 do_dump = TRUE;
4679 if (optarg == 0)
4680 do_debugging = TRUE;
4681 else
4682 {
4683 do_debugging = FALSE;
4684 dwarf_select_sections_by_names (optarg);
4685 }
4686 break;
4687 case OPTION_DWARF_DEPTH:
4688 {
4689 char *cp;
4690
4691 dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4692 }
4693 break;
4694 case OPTION_DWARF_START:
4695 {
4696 char *cp;
4697
4698 dwarf_start_die = strtoul (optarg, & cp, 0);
4699 }
4700 break;
4701 case OPTION_DWARF_CHECK:
4702 dwarf_check = TRUE;
4703 break;
4704 case OPTION_DYN_SYMS:
4705 do_dyn_syms = TRUE;
4706 break;
4707 #ifdef SUPPORT_DISASSEMBLY
4708 case 'i':
4709 request_dump (filedata, DISASS_DUMP);
4710 break;
4711 #endif
4712 case 'v':
4713 print_version (program_name);
4714 break;
4715 case 'V':
4716 do_version = TRUE;
4717 break;
4718 case 'W':
4719 do_wide = TRUE;
4720 break;
4721 default:
4722 /* xgettext:c-format */
4723 error (_("Invalid option '-%c'\n"), c);
4724 /* Fall through. */
4725 case '?':
4726 usage (stderr);
4727 }
4728 }
4729
4730 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
4731 && !do_segments && !do_header && !do_dump && !do_version
4732 && !do_histogram && !do_debugging && !do_arch && !do_notes
4733 && !do_section_groups && !do_archive_index
4734 && !do_dyn_syms)
4735 usage (stderr);
4736 }
4737
4738 static const char *
4739 get_elf_class (unsigned int elf_class)
4740 {
4741 static char buff[32];
4742
4743 switch (elf_class)
4744 {
4745 case ELFCLASSNONE: return _("none");
4746 case ELFCLASS32: return "ELF32";
4747 case ELFCLASS64: return "ELF64";
4748 default:
4749 snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
4750 return buff;
4751 }
4752 }
4753
4754 static const char *
4755 get_data_encoding (unsigned int encoding)
4756 {
4757 static char buff[32];
4758
4759 switch (encoding)
4760 {
4761 case ELFDATANONE: return _("none");
4762 case ELFDATA2LSB: return _("2's complement, little endian");
4763 case ELFDATA2MSB: return _("2's complement, big endian");
4764 default:
4765 snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
4766 return buff;
4767 }
4768 }
4769
4770 /* Decode the data held in 'filedata->file_header'. */
4771
4772 static bfd_boolean
4773 process_file_header (Filedata * filedata)
4774 {
4775 Elf_Internal_Ehdr * header = & filedata->file_header;
4776
4777 if ( header->e_ident[EI_MAG0] != ELFMAG0
4778 || header->e_ident[EI_MAG1] != ELFMAG1
4779 || header->e_ident[EI_MAG2] != ELFMAG2
4780 || header->e_ident[EI_MAG3] != ELFMAG3)
4781 {
4782 error
4783 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4784 return FALSE;
4785 }
4786
4787 init_dwarf_regnames (header->e_machine);
4788
4789 if (do_header)
4790 {
4791 unsigned i;
4792
4793 printf (_("ELF Header:\n"));
4794 printf (_(" Magic: "));
4795 for (i = 0; i < EI_NIDENT; i++)
4796 printf ("%2.2x ", header->e_ident[i]);
4797 printf ("\n");
4798 printf (_(" Class: %s\n"),
4799 get_elf_class (header->e_ident[EI_CLASS]));
4800 printf (_(" Data: %s\n"),
4801 get_data_encoding (header->e_ident[EI_DATA]));
4802 printf (_(" Version: %d%s\n"),
4803 header->e_ident[EI_VERSION],
4804 (header->e_ident[EI_VERSION] == EV_CURRENT
4805 ? _(" (current)")
4806 : (header->e_ident[EI_VERSION] != EV_NONE
4807 ? _(" <unknown>")
4808 : "")));
4809 printf (_(" OS/ABI: %s\n"),
4810 get_osabi_name (filedata, header->e_ident[EI_OSABI]));
4811 printf (_(" ABI Version: %d\n"),
4812 header->e_ident[EI_ABIVERSION]);
4813 printf (_(" Type: %s\n"),
4814 get_file_type (header->e_type));
4815 printf (_(" Machine: %s\n"),
4816 get_machine_name (header->e_machine));
4817 printf (_(" Version: 0x%lx\n"),
4818 header->e_version);
4819
4820 printf (_(" Entry point address: "));
4821 print_vma (header->e_entry, PREFIX_HEX);
4822 printf (_("\n Start of program headers: "));
4823 print_vma (header->e_phoff, DEC);
4824 printf (_(" (bytes into file)\n Start of section headers: "));
4825 print_vma (header->e_shoff, DEC);
4826 printf (_(" (bytes into file)\n"));
4827
4828 printf (_(" Flags: 0x%lx%s\n"),
4829 header->e_flags,
4830 get_machine_flags (filedata, header->e_flags, header->e_machine));
4831 printf (_(" Size of this header: %u (bytes)\n"),
4832 header->e_ehsize);
4833 printf (_(" Size of program headers: %u (bytes)\n"),
4834 header->e_phentsize);
4835 printf (_(" Number of program headers: %u"),
4836 header->e_phnum);
4837 if (filedata->section_headers != NULL
4838 && header->e_phnum == PN_XNUM
4839 && filedata->section_headers[0].sh_info != 0)
4840 {
4841 header->e_phnum = filedata->section_headers[0].sh_info;
4842 printf (" (%u)", header->e_phnum);
4843 }
4844 putc ('\n', stdout);
4845 printf (_(" Size of section headers: %u (bytes)\n"),
4846 header->e_shentsize);
4847 printf (_(" Number of section headers: %u"),
4848 header->e_shnum);
4849 if (filedata->section_headers != NULL && header->e_shnum == SHN_UNDEF)
4850 {
4851 header->e_shnum = filedata->section_headers[0].sh_size;
4852 printf (" (%u)", header->e_shnum);
4853 }
4854 putc ('\n', stdout);
4855 printf (_(" Section header string table index: %u"),
4856 header->e_shstrndx);
4857 if (filedata->section_headers != NULL
4858 && header->e_shstrndx == (SHN_XINDEX & 0xffff))
4859 {
4860 header->e_shstrndx = filedata->section_headers[0].sh_link;
4861 printf (" (%u)", header->e_shstrndx);
4862 }
4863 if (header->e_shstrndx != SHN_UNDEF
4864 && header->e_shstrndx >= header->e_shnum)
4865 {
4866 header->e_shstrndx = SHN_UNDEF;
4867 printf (_(" <corrupt: out of range>"));
4868 }
4869 putc ('\n', stdout);
4870 }
4871
4872 if (filedata->section_headers != NULL)
4873 {
4874 if (header->e_phnum == PN_XNUM
4875 && filedata->section_headers[0].sh_info != 0)
4876 header->e_phnum = filedata->section_headers[0].sh_info;
4877 if (header->e_shnum == SHN_UNDEF)
4878 header->e_shnum = filedata->section_headers[0].sh_size;
4879 if (header->e_shstrndx == (SHN_XINDEX & 0xffff))
4880 header->e_shstrndx = filedata->section_headers[0].sh_link;
4881 if (header->e_shstrndx >= header->e_shnum)
4882 header->e_shstrndx = SHN_UNDEF;
4883 free (filedata->section_headers);
4884 filedata->section_headers = NULL;
4885 }
4886
4887 return TRUE;
4888 }
4889
4890 /* Read in the program headers from FILEDATA and store them in PHEADERS.
4891 Returns TRUE upon success, FALSE otherwise. Loads 32-bit headers. */
4892
4893 static bfd_boolean
4894 get_32bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
4895 {
4896 Elf32_External_Phdr * phdrs;
4897 Elf32_External_Phdr * external;
4898 Elf_Internal_Phdr * internal;
4899 unsigned int i;
4900 unsigned int size = filedata->file_header.e_phentsize;
4901 unsigned int num = filedata->file_header.e_phnum;
4902
4903 /* PR binutils/17531: Cope with unexpected section header sizes. */
4904 if (size == 0 || num == 0)
4905 return FALSE;
4906 if (size < sizeof * phdrs)
4907 {
4908 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4909 return FALSE;
4910 }
4911 if (size > sizeof * phdrs)
4912 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4913
4914 phdrs = (Elf32_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
4915 size, num, _("program headers"));
4916 if (phdrs == NULL)
4917 return FALSE;
4918
4919 for (i = 0, internal = pheaders, external = phdrs;
4920 i < filedata->file_header.e_phnum;
4921 i++, internal++, external++)
4922 {
4923 internal->p_type = BYTE_GET (external->p_type);
4924 internal->p_offset = BYTE_GET (external->p_offset);
4925 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4926 internal->p_paddr = BYTE_GET (external->p_paddr);
4927 internal->p_filesz = BYTE_GET (external->p_filesz);
4928 internal->p_memsz = BYTE_GET (external->p_memsz);
4929 internal->p_flags = BYTE_GET (external->p_flags);
4930 internal->p_align = BYTE_GET (external->p_align);
4931 }
4932
4933 free (phdrs);
4934 return TRUE;
4935 }
4936
4937 /* Read in the program headers from FILEDATA and store them in PHEADERS.
4938 Returns TRUE upon success, FALSE otherwise. Loads 64-bit headers. */
4939
4940 static bfd_boolean
4941 get_64bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
4942 {
4943 Elf64_External_Phdr * phdrs;
4944 Elf64_External_Phdr * external;
4945 Elf_Internal_Phdr * internal;
4946 unsigned int i;
4947 unsigned int size = filedata->file_header.e_phentsize;
4948 unsigned int num = filedata->file_header.e_phnum;
4949
4950 /* PR binutils/17531: Cope with unexpected section header sizes. */
4951 if (size == 0 || num == 0)
4952 return FALSE;
4953 if (size < sizeof * phdrs)
4954 {
4955 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4956 return FALSE;
4957 }
4958 if (size > sizeof * phdrs)
4959 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4960
4961 phdrs = (Elf64_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
4962 size, num, _("program headers"));
4963 if (!phdrs)
4964 return FALSE;
4965
4966 for (i = 0, internal = pheaders, external = phdrs;
4967 i < filedata->file_header.e_phnum;
4968 i++, internal++, external++)
4969 {
4970 internal->p_type = BYTE_GET (external->p_type);
4971 internal->p_flags = BYTE_GET (external->p_flags);
4972 internal->p_offset = BYTE_GET (external->p_offset);
4973 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4974 internal->p_paddr = BYTE_GET (external->p_paddr);
4975 internal->p_filesz = BYTE_GET (external->p_filesz);
4976 internal->p_memsz = BYTE_GET (external->p_memsz);
4977 internal->p_align = BYTE_GET (external->p_align);
4978 }
4979
4980 free (phdrs);
4981 return TRUE;
4982 }
4983
4984 /* Returns TRUE if the program headers were read into `program_headers'. */
4985
4986 static bfd_boolean
4987 get_program_headers (Filedata * filedata)
4988 {
4989 Elf_Internal_Phdr * phdrs;
4990
4991 /* Check cache of prior read. */
4992 if (filedata->program_headers != NULL)
4993 return TRUE;
4994
4995 /* Be kind to memory checkers by looking for
4996 e_phnum values which we know must be invalid. */
4997 if (filedata->file_header.e_phnum
4998 * (is_32bit_elf ? sizeof (Elf32_External_Phdr) : sizeof (Elf64_External_Phdr))
4999 >= filedata->file_size)
5000 {
5001 error (_("Too many program headers - %#x - the file is not that big\n"),
5002 filedata->file_header.e_phnum);
5003 return FALSE;
5004 }
5005
5006 phdrs = (Elf_Internal_Phdr *) cmalloc (filedata->file_header.e_phnum,
5007 sizeof (Elf_Internal_Phdr));
5008 if (phdrs == NULL)
5009 {
5010 error (_("Out of memory reading %u program headers\n"),
5011 filedata->file_header.e_phnum);
5012 return FALSE;
5013 }
5014
5015 if (is_32bit_elf
5016 ? get_32bit_program_headers (filedata, phdrs)
5017 : get_64bit_program_headers (filedata, phdrs))
5018 {
5019 filedata->program_headers = phdrs;
5020 return TRUE;
5021 }
5022
5023 free (phdrs);
5024 return FALSE;
5025 }
5026
5027 /* Returns TRUE if the program headers were loaded. */
5028
5029 static bfd_boolean
5030 process_program_headers (Filedata * filedata)
5031 {
5032 Elf_Internal_Phdr * segment;
5033 unsigned int i;
5034 Elf_Internal_Phdr * previous_load = NULL;
5035
5036 if (filedata->file_header.e_phnum == 0)
5037 {
5038 /* PR binutils/12467. */
5039 if (filedata->file_header.e_phoff != 0)
5040 {
5041 warn (_("possibly corrupt ELF header - it has a non-zero program"
5042 " header offset, but no program headers\n"));
5043 return FALSE;
5044 }
5045 else if (do_segments)
5046 printf (_("\nThere are no program headers in this file.\n"));
5047 return TRUE;
5048 }
5049
5050 if (do_segments && !do_header)
5051 {
5052 printf (_("\nElf file type is %s\n"), get_file_type (filedata->file_header.e_type));
5053 printf (_("Entry point 0x%s\n"), bfd_vmatoa ("x", filedata->file_header.e_entry));
5054 printf (ngettext ("There is %d program header, starting at offset %s\n",
5055 "There are %d program headers, starting at offset %s\n",
5056 filedata->file_header.e_phnum),
5057 filedata->file_header.e_phnum,
5058 bfd_vmatoa ("u", filedata->file_header.e_phoff));
5059 }
5060
5061 if (! get_program_headers (filedata))
5062 return TRUE;
5063
5064 if (do_segments)
5065 {
5066 if (filedata->file_header.e_phnum > 1)
5067 printf (_("\nProgram Headers:\n"));
5068 else
5069 printf (_("\nProgram Headers:\n"));
5070
5071 if (is_32bit_elf)
5072 printf
5073 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
5074 else if (do_wide)
5075 printf
5076 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
5077 else
5078 {
5079 printf
5080 (_(" Type Offset VirtAddr PhysAddr\n"));
5081 printf
5082 (_(" FileSiz MemSiz Flags Align\n"));
5083 }
5084 }
5085
5086 dynamic_addr = 0;
5087 dynamic_size = 0;
5088
5089 for (i = 0, segment = filedata->program_headers;
5090 i < filedata->file_header.e_phnum;
5091 i++, segment++)
5092 {
5093 if (do_segments)
5094 {
5095 printf (" %-14.14s ", get_segment_type (filedata, segment->p_type));
5096
5097 if (is_32bit_elf)
5098 {
5099 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
5100 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
5101 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
5102 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
5103 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
5104 printf ("%c%c%c ",
5105 (segment->p_flags & PF_R ? 'R' : ' '),
5106 (segment->p_flags & PF_W ? 'W' : ' '),
5107 (segment->p_flags & PF_X ? 'E' : ' '));
5108 printf ("%#lx", (unsigned long) segment->p_align);
5109 }
5110 else if (do_wide)
5111 {
5112 if ((unsigned long) segment->p_offset == segment->p_offset)
5113 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
5114 else
5115 {
5116 print_vma (segment->p_offset, FULL_HEX);
5117 putchar (' ');
5118 }
5119
5120 print_vma (segment->p_vaddr, FULL_HEX);
5121 putchar (' ');
5122 print_vma (segment->p_paddr, FULL_HEX);
5123 putchar (' ');
5124
5125 if ((unsigned long) segment->p_filesz == segment->p_filesz)
5126 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
5127 else
5128 {
5129 print_vma (segment->p_filesz, FULL_HEX);
5130 putchar (' ');
5131 }
5132
5133 if ((unsigned long) segment->p_memsz == segment->p_memsz)
5134 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
5135 else
5136 {
5137 print_vma (segment->p_memsz, FULL_HEX);
5138 }
5139
5140 printf (" %c%c%c ",
5141 (segment->p_flags & PF_R ? 'R' : ' '),
5142 (segment->p_flags & PF_W ? 'W' : ' '),
5143 (segment->p_flags & PF_X ? 'E' : ' '));
5144
5145 if ((unsigned long) segment->p_align == segment->p_align)
5146 printf ("%#lx", (unsigned long) segment->p_align);
5147 else
5148 {
5149 print_vma (segment->p_align, PREFIX_HEX);
5150 }
5151 }
5152 else
5153 {
5154 print_vma (segment->p_offset, FULL_HEX);
5155 putchar (' ');
5156 print_vma (segment->p_vaddr, FULL_HEX);
5157 putchar (' ');
5158 print_vma (segment->p_paddr, FULL_HEX);
5159 printf ("\n ");
5160 print_vma (segment->p_filesz, FULL_HEX);
5161 putchar (' ');
5162 print_vma (segment->p_memsz, FULL_HEX);
5163 printf (" %c%c%c ",
5164 (segment->p_flags & PF_R ? 'R' : ' '),
5165 (segment->p_flags & PF_W ? 'W' : ' '),
5166 (segment->p_flags & PF_X ? 'E' : ' '));
5167 print_vma (segment->p_align, PREFIX_HEX);
5168 }
5169
5170 putc ('\n', stdout);
5171 }
5172
5173 switch (segment->p_type)
5174 {
5175 case PT_LOAD:
5176 #if 0 /* Do not warn about out of order PT_LOAD segments. Although officially
5177 required by the ELF standard, several programs, including the Linux
5178 kernel, make use of non-ordered segments. */
5179 if (previous_load
5180 && previous_load->p_vaddr > segment->p_vaddr)
5181 error (_("LOAD segments must be sorted in order of increasing VirtAddr\n"));
5182 #endif
5183 if (segment->p_memsz < segment->p_filesz)
5184 error (_("the segment's file size is larger than its memory size\n"));
5185 previous_load = segment;
5186 break;
5187
5188 case PT_PHDR:
5189 /* PR 20815 - Verify that the program header is loaded into memory. */
5190 if (i > 0 && previous_load != NULL)
5191 error (_("the PHDR segment must occur before any LOAD segment\n"));
5192 if (filedata->file_header.e_machine != EM_PARISC)
5193 {
5194 unsigned int j;
5195
5196 for (j = 1; j < filedata->file_header.e_phnum; j++)
5197 if (filedata->program_headers[j].p_vaddr <= segment->p_vaddr
5198 && (filedata->program_headers[j].p_vaddr
5199 + filedata->program_headers[j].p_memsz)
5200 >= (segment->p_vaddr + segment->p_filesz))
5201 break;
5202 if (j == filedata->file_header.e_phnum)
5203 error (_("the PHDR segment is not covered by a LOAD segment\n"));
5204 }
5205 break;
5206
5207 case PT_DYNAMIC:
5208 if (dynamic_addr)
5209 error (_("more than one dynamic segment\n"));
5210
5211 /* By default, assume that the .dynamic section is the first
5212 section in the DYNAMIC segment. */
5213 dynamic_addr = segment->p_offset;
5214 dynamic_size = segment->p_filesz;
5215
5216 /* Try to locate the .dynamic section. If there is
5217 a section header table, we can easily locate it. */
5218 if (filedata->section_headers != NULL)
5219 {
5220 Elf_Internal_Shdr * sec;
5221
5222 sec = find_section (filedata, ".dynamic");
5223 if (sec == NULL || sec->sh_size == 0)
5224 {
5225 /* A corresponding .dynamic section is expected, but on
5226 IA-64/OpenVMS it is OK for it to be missing. */
5227 if (!is_ia64_vms (filedata))
5228 error (_("no .dynamic section in the dynamic segment\n"));
5229 break;
5230 }
5231
5232 if (sec->sh_type == SHT_NOBITS)
5233 {
5234 dynamic_size = 0;
5235 break;
5236 }
5237
5238 dynamic_addr = sec->sh_offset;
5239 dynamic_size = sec->sh_size;
5240
5241 if (dynamic_addr < segment->p_offset
5242 || dynamic_addr > segment->p_offset + segment->p_filesz)
5243 warn (_("the .dynamic section is not contained"
5244 " within the dynamic segment\n"));
5245 else if (dynamic_addr > segment->p_offset)
5246 warn (_("the .dynamic section is not the first section"
5247 " in the dynamic segment.\n"));
5248 }
5249
5250 /* PR binutils/17512: Avoid corrupt dynamic section info in the
5251 segment. Check this after matching against the section headers
5252 so we don't warn on debuginfo file (which have NOBITS .dynamic
5253 sections). */
5254 if (dynamic_addr > filedata->file_size
5255 || dynamic_size > filedata->file_size - dynamic_addr)
5256 {
5257 error (_("the dynamic segment offset + size exceeds the size of the file\n"));
5258 dynamic_addr = dynamic_size = 0;
5259 }
5260 break;
5261
5262 case PT_INTERP:
5263 if (fseek (filedata->handle, archive_file_offset + (long) segment->p_offset,
5264 SEEK_SET))
5265 error (_("Unable to find program interpreter name\n"));
5266 else
5267 {
5268 char fmt [32];
5269 int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
5270
5271 if (ret >= (int) sizeof (fmt) || ret < 0)
5272 error (_("Internal error: failed to create format string to display program interpreter\n"));
5273
5274 program_interpreter[0] = 0;
5275 if (fscanf (filedata->handle, fmt, program_interpreter) <= 0)
5276 error (_("Unable to read program interpreter name\n"));
5277
5278 if (do_segments)
5279 printf (_(" [Requesting program interpreter: %s]\n"),
5280 program_interpreter);
5281 }
5282 break;
5283 }
5284 }
5285
5286 if (do_segments
5287 && filedata->section_headers != NULL
5288 && filedata->string_table != NULL)
5289 {
5290 printf (_("\n Section to Segment mapping:\n"));
5291 printf (_(" Segment Sections...\n"));
5292
5293 for (i = 0; i < filedata->file_header.e_phnum; i++)
5294 {
5295 unsigned int j;
5296 Elf_Internal_Shdr * section;
5297
5298 segment = filedata->program_headers + i;
5299 section = filedata->section_headers + 1;
5300
5301 printf (" %2.2d ", i);
5302
5303 for (j = 1; j < filedata->file_header.e_shnum; j++, section++)
5304 {
5305 if (!ELF_TBSS_SPECIAL (section, segment)
5306 && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
5307 printf ("%s ", printable_section_name (filedata, section));
5308 }
5309
5310 putc ('\n',stdout);
5311 }
5312 }
5313
5314 return TRUE;
5315 }
5316
5317
5318 /* Find the file offset corresponding to VMA by using the program headers. */
5319
5320 static long
5321 offset_from_vma (Filedata * filedata, bfd_vma vma, bfd_size_type size)
5322 {
5323 Elf_Internal_Phdr * seg;
5324
5325 if (! get_program_headers (filedata))
5326 {
5327 warn (_("Cannot interpret virtual addresses without program headers.\n"));
5328 return (long) vma;
5329 }
5330
5331 for (seg = filedata->program_headers;
5332 seg < filedata->program_headers + filedata->file_header.e_phnum;
5333 ++seg)
5334 {
5335 if (seg->p_type != PT_LOAD)
5336 continue;
5337
5338 if (vma >= (seg->p_vaddr & -seg->p_align)
5339 && vma + size <= seg->p_vaddr + seg->p_filesz)
5340 return vma - seg->p_vaddr + seg->p_offset;
5341 }
5342
5343 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
5344 (unsigned long) vma);
5345 return (long) vma;
5346 }
5347
5348
5349 /* Allocate memory and load the sections headers into FILEDATA->filedata->section_headers.
5350 If PROBE is true, this is just a probe and we do not generate any error
5351 messages if the load fails. */
5352
5353 static bfd_boolean
5354 get_32bit_section_headers (Filedata * filedata, bfd_boolean probe)
5355 {
5356 Elf32_External_Shdr * shdrs;
5357 Elf_Internal_Shdr * internal;
5358 unsigned int i;
5359 unsigned int size = filedata->file_header.e_shentsize;
5360 unsigned int num = probe ? 1 : filedata->file_header.e_shnum;
5361
5362 /* PR binutils/17531: Cope with unexpected section header sizes. */
5363 if (size == 0 || num == 0)
5364 return FALSE;
5365 if (size < sizeof * shdrs)
5366 {
5367 if (! probe)
5368 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5369 return FALSE;
5370 }
5371 if (!probe && size > sizeof * shdrs)
5372 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5373
5374 shdrs = (Elf32_External_Shdr *) get_data (NULL, filedata, filedata->file_header.e_shoff,
5375 size, num,
5376 probe ? NULL : _("section headers"));
5377 if (shdrs == NULL)
5378 return FALSE;
5379
5380 free (filedata->section_headers);
5381 filedata->section_headers = (Elf_Internal_Shdr *)
5382 cmalloc (num, sizeof (Elf_Internal_Shdr));
5383 if (filedata->section_headers == NULL)
5384 {
5385 if (!probe)
5386 error (_("Out of memory reading %u section headers\n"), num);
5387 free (shdrs);
5388 return FALSE;
5389 }
5390
5391 for (i = 0, internal = filedata->section_headers;
5392 i < num;
5393 i++, internal++)
5394 {
5395 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5396 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
5397 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5398 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5399 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5400 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5401 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5402 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5403 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5404 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
5405 if (!probe && internal->sh_link > num)
5406 warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5407 if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5408 warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5409 }
5410
5411 free (shdrs);
5412 return TRUE;
5413 }
5414
5415 /* Like get_32bit_section_headers, except that it fetches 64-bit headers. */
5416
5417 static bfd_boolean
5418 get_64bit_section_headers (Filedata * filedata, bfd_boolean probe)
5419 {
5420 Elf64_External_Shdr * shdrs;
5421 Elf_Internal_Shdr * internal;
5422 unsigned int i;
5423 unsigned int size = filedata->file_header.e_shentsize;
5424 unsigned int num = probe ? 1 : filedata->file_header.e_shnum;
5425
5426 /* PR binutils/17531: Cope with unexpected section header sizes. */
5427 if (size == 0 || num == 0)
5428 return FALSE;
5429
5430 if (size < sizeof * shdrs)
5431 {
5432 if (! probe)
5433 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5434 return FALSE;
5435 }
5436
5437 if (! probe && size > sizeof * shdrs)
5438 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5439
5440 shdrs = (Elf64_External_Shdr *) get_data (NULL, filedata,
5441 filedata->file_header.e_shoff,
5442 size, num,
5443 probe ? NULL : _("section headers"));
5444 if (shdrs == NULL)
5445 return FALSE;
5446
5447 free (filedata->section_headers);
5448 filedata->section_headers = (Elf_Internal_Shdr *)
5449 cmalloc (num, sizeof (Elf_Internal_Shdr));
5450 if (filedata->section_headers == NULL)
5451 {
5452 if (! probe)
5453 error (_("Out of memory reading %u section headers\n"), num);
5454 free (shdrs);
5455 return FALSE;
5456 }
5457
5458 for (i = 0, internal = filedata->section_headers;
5459 i < num;
5460 i++, internal++)
5461 {
5462 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5463 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
5464 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5465 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5466 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5467 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
5468 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5469 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5470 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5471 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5472 if (!probe && internal->sh_link > num)
5473 warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5474 if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5475 warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5476 }
5477
5478 free (shdrs);
5479 return TRUE;
5480 }
5481
5482 static Elf_Internal_Sym *
5483 get_32bit_elf_symbols (Filedata * filedata,
5484 Elf_Internal_Shdr * section,
5485 unsigned long * num_syms_return)
5486 {
5487 unsigned long number = 0;
5488 Elf32_External_Sym * esyms = NULL;
5489 Elf_External_Sym_Shndx * shndx = NULL;
5490 Elf_Internal_Sym * isyms = NULL;
5491 Elf_Internal_Sym * psym;
5492 unsigned int j;
5493 elf_section_list * entry;
5494
5495 if (section->sh_size == 0)
5496 {
5497 if (num_syms_return != NULL)
5498 * num_syms_return = 0;
5499 return NULL;
5500 }
5501
5502 /* Run some sanity checks first. */
5503 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5504 {
5505 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5506 printable_section_name (filedata, section),
5507 (unsigned long) section->sh_entsize);
5508 goto exit_point;
5509 }
5510
5511 if (section->sh_size > filedata->file_size)
5512 {
5513 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5514 printable_section_name (filedata, section),
5515 (unsigned long) section->sh_size);
5516 goto exit_point;
5517 }
5518
5519 number = section->sh_size / section->sh_entsize;
5520
5521 if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
5522 {
5523 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5524 (unsigned long) section->sh_size,
5525 printable_section_name (filedata, section),
5526 (unsigned long) section->sh_entsize);
5527 goto exit_point;
5528 }
5529
5530 esyms = (Elf32_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
5531 section->sh_size, _("symbols"));
5532 if (esyms == NULL)
5533 goto exit_point;
5534
5535 shndx = NULL;
5536 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5537 {
5538 if (entry->hdr->sh_link != (unsigned long) (section - filedata->section_headers))
5539 continue;
5540
5541 if (shndx != NULL)
5542 {
5543 error (_("Multiple symbol table index sections associated with the same symbol section\n"));
5544 free (shndx);
5545 }
5546
5547 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
5548 entry->hdr->sh_offset,
5549 1, entry->hdr->sh_size,
5550 _("symbol table section indices"));
5551 if (shndx == NULL)
5552 goto exit_point;
5553
5554 /* PR17531: file: heap-buffer-overflow */
5555 if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5556 {
5557 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5558 printable_section_name (filedata, entry->hdr),
5559 (unsigned long) entry->hdr->sh_size,
5560 (unsigned long) section->sh_size);
5561 goto exit_point;
5562 }
5563 }
5564
5565 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5566
5567 if (isyms == NULL)
5568 {
5569 error (_("Out of memory reading %lu symbols\n"),
5570 (unsigned long) number);
5571 goto exit_point;
5572 }
5573
5574 for (j = 0, psym = isyms; j < number; j++, psym++)
5575 {
5576 psym->st_name = BYTE_GET (esyms[j].st_name);
5577 psym->st_value = BYTE_GET (esyms[j].st_value);
5578 psym->st_size = BYTE_GET (esyms[j].st_size);
5579 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5580 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5581 psym->st_shndx
5582 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5583 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5584 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5585 psym->st_info = BYTE_GET (esyms[j].st_info);
5586 psym->st_other = BYTE_GET (esyms[j].st_other);
5587 }
5588
5589 exit_point:
5590 free (shndx);
5591 free (esyms);
5592
5593 if (num_syms_return != NULL)
5594 * num_syms_return = isyms == NULL ? 0 : number;
5595
5596 return isyms;
5597 }
5598
5599 static Elf_Internal_Sym *
5600 get_64bit_elf_symbols (Filedata * filedata,
5601 Elf_Internal_Shdr * section,
5602 unsigned long * num_syms_return)
5603 {
5604 unsigned long number = 0;
5605 Elf64_External_Sym * esyms = NULL;
5606 Elf_External_Sym_Shndx * shndx = NULL;
5607 Elf_Internal_Sym * isyms = NULL;
5608 Elf_Internal_Sym * psym;
5609 unsigned int j;
5610 elf_section_list * entry;
5611
5612 if (section->sh_size == 0)
5613 {
5614 if (num_syms_return != NULL)
5615 * num_syms_return = 0;
5616 return NULL;
5617 }
5618
5619 /* Run some sanity checks first. */
5620 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5621 {
5622 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5623 printable_section_name (filedata, section),
5624 (unsigned long) section->sh_entsize);
5625 goto exit_point;
5626 }
5627
5628 if (section->sh_size > filedata->file_size)
5629 {
5630 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5631 printable_section_name (filedata, section),
5632 (unsigned long) section->sh_size);
5633 goto exit_point;
5634 }
5635
5636 number = section->sh_size / section->sh_entsize;
5637
5638 if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5639 {
5640 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5641 (unsigned long) section->sh_size,
5642 printable_section_name (filedata, section),
5643 (unsigned long) section->sh_entsize);
5644 goto exit_point;
5645 }
5646
5647 esyms = (Elf64_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
5648 section->sh_size, _("symbols"));
5649 if (!esyms)
5650 goto exit_point;
5651
5652 shndx = NULL;
5653 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5654 {
5655 if (entry->hdr->sh_link != (unsigned long) (section - filedata->section_headers))
5656 continue;
5657
5658 if (shndx != NULL)
5659 {
5660 error (_("Multiple symbol table index sections associated with the same symbol section\n"));
5661 free (shndx);
5662 }
5663
5664 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
5665 entry->hdr->sh_offset,
5666 1, entry->hdr->sh_size,
5667 _("symbol table section indices"));
5668 if (shndx == NULL)
5669 goto exit_point;
5670
5671 /* PR17531: file: heap-buffer-overflow */
5672 if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5673 {
5674 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5675 printable_section_name (filedata, entry->hdr),
5676 (unsigned long) entry->hdr->sh_size,
5677 (unsigned long) section->sh_size);
5678 goto exit_point;
5679 }
5680 }
5681
5682 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5683
5684 if (isyms == NULL)
5685 {
5686 error (_("Out of memory reading %lu symbols\n"),
5687 (unsigned long) number);
5688 goto exit_point;
5689 }
5690
5691 for (j = 0, psym = isyms; j < number; j++, psym++)
5692 {
5693 psym->st_name = BYTE_GET (esyms[j].st_name);
5694 psym->st_info = BYTE_GET (esyms[j].st_info);
5695 psym->st_other = BYTE_GET (esyms[j].st_other);
5696 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5697
5698 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5699 psym->st_shndx
5700 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5701 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5702 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5703
5704 psym->st_value = BYTE_GET (esyms[j].st_value);
5705 psym->st_size = BYTE_GET (esyms[j].st_size);
5706 }
5707
5708 exit_point:
5709 free (shndx);
5710 free (esyms);
5711
5712 if (num_syms_return != NULL)
5713 * num_syms_return = isyms == NULL ? 0 : number;
5714
5715 return isyms;
5716 }
5717
5718 static const char *
5719 get_elf_section_flags (Filedata * filedata, bfd_vma sh_flags)
5720 {
5721 static char buff[1024];
5722 char * p = buff;
5723 unsigned int field_size = is_32bit_elf ? 8 : 16;
5724 signed int sindex;
5725 unsigned int size = sizeof (buff) - (field_size + 4 + 1);
5726 bfd_vma os_flags = 0;
5727 bfd_vma proc_flags = 0;
5728 bfd_vma unknown_flags = 0;
5729 static const struct
5730 {
5731 const char * str;
5732 unsigned int len;
5733 }
5734 flags [] =
5735 {
5736 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
5737 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
5738 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
5739 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
5740 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
5741 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
5742 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5743 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5744 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
5745 /* 9 */ { STRING_COMMA_LEN ("TLS") },
5746 /* IA-64 specific. */
5747 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5748 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5749 /* IA-64 OpenVMS specific. */
5750 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5751 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5752 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5753 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5754 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5755 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
5756 /* Generic. */
5757 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
5758 /* SPARC specific. */
5759 /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
5760 /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5761 /* ARM specific. */
5762 /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
5763 /* 22 */ { STRING_COMMA_LEN ("ARM_PURECODE") },
5764 /* 23 */ { STRING_COMMA_LEN ("COMDEF") },
5765 /* GNU specific. */
5766 /* 24 */ { STRING_COMMA_LEN ("GNU_MBIND") },
5767 /* VLE specific. */
5768 /* 25 */ { STRING_COMMA_LEN ("VLE") },
5769 };
5770
5771 if (do_section_details)
5772 {
5773 sprintf (buff, "[%*.*lx]: ",
5774 field_size, field_size, (unsigned long) sh_flags);
5775 p += field_size + 4;
5776 }
5777
5778 while (sh_flags)
5779 {
5780 bfd_vma flag;
5781
5782 flag = sh_flags & - sh_flags;
5783 sh_flags &= ~ flag;
5784
5785 if (do_section_details)
5786 {
5787 switch (flag)
5788 {
5789 case SHF_WRITE: sindex = 0; break;
5790 case SHF_ALLOC: sindex = 1; break;
5791 case SHF_EXECINSTR: sindex = 2; break;
5792 case SHF_MERGE: sindex = 3; break;
5793 case SHF_STRINGS: sindex = 4; break;
5794 case SHF_INFO_LINK: sindex = 5; break;
5795 case SHF_LINK_ORDER: sindex = 6; break;
5796 case SHF_OS_NONCONFORMING: sindex = 7; break;
5797 case SHF_GROUP: sindex = 8; break;
5798 case SHF_TLS: sindex = 9; break;
5799 case SHF_EXCLUDE: sindex = 18; break;
5800 case SHF_COMPRESSED: sindex = 20; break;
5801 case SHF_GNU_MBIND: sindex = 24; break;
5802
5803 default:
5804 sindex = -1;
5805 switch (filedata->file_header.e_machine)
5806 {
5807 case EM_IA_64:
5808 if (flag == SHF_IA_64_SHORT)
5809 sindex = 10;
5810 else if (flag == SHF_IA_64_NORECOV)
5811 sindex = 11;
5812 #ifdef BFD64
5813 else if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5814 switch (flag)
5815 {
5816 case SHF_IA_64_VMS_GLOBAL: sindex = 12; break;
5817 case SHF_IA_64_VMS_OVERLAID: sindex = 13; break;
5818 case SHF_IA_64_VMS_SHARED: sindex = 14; break;
5819 case SHF_IA_64_VMS_VECTOR: sindex = 15; break;
5820 case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5821 case SHF_IA_64_VMS_PROTECTED: sindex = 17; break;
5822 default: break;
5823 }
5824 #endif
5825 break;
5826
5827 case EM_386:
5828 case EM_IAMCU:
5829 case EM_X86_64:
5830 case EM_L1OM:
5831 case EM_K1OM:
5832 case EM_OLD_SPARCV9:
5833 case EM_SPARC32PLUS:
5834 case EM_SPARCV9:
5835 case EM_SPARC:
5836 if (flag == SHF_ORDERED)
5837 sindex = 19;
5838 break;
5839
5840 case EM_ARM:
5841 switch (flag)
5842 {
5843 case SHF_ENTRYSECT: sindex = 21; break;
5844 case SHF_ARM_PURECODE: sindex = 22; break;
5845 case SHF_COMDEF: sindex = 23; break;
5846 default: break;
5847 }
5848 break;
5849 case EM_PPC:
5850 if (flag == SHF_PPC_VLE)
5851 sindex = 25;
5852 break;
5853
5854 default:
5855 break;
5856 }
5857 }
5858
5859 if (sindex != -1)
5860 {
5861 if (p != buff + field_size + 4)
5862 {
5863 if (size < (10 + 2))
5864 {
5865 warn (_("Internal error: not enough buffer room for section flag info"));
5866 return _("<unknown>");
5867 }
5868 size -= 2;
5869 *p++ = ',';
5870 *p++ = ' ';
5871 }
5872
5873 size -= flags [sindex].len;
5874 p = stpcpy (p, flags [sindex].str);
5875 }
5876 else if (flag & SHF_MASKOS)
5877 os_flags |= flag;
5878 else if (flag & SHF_MASKPROC)
5879 proc_flags |= flag;
5880 else
5881 unknown_flags |= flag;
5882 }
5883 else
5884 {
5885 switch (flag)
5886 {
5887 case SHF_WRITE: *p = 'W'; break;
5888 case SHF_ALLOC: *p = 'A'; break;
5889 case SHF_EXECINSTR: *p = 'X'; break;
5890 case SHF_MERGE: *p = 'M'; break;
5891 case SHF_STRINGS: *p = 'S'; break;
5892 case SHF_INFO_LINK: *p = 'I'; break;
5893 case SHF_LINK_ORDER: *p = 'L'; break;
5894 case SHF_OS_NONCONFORMING: *p = 'O'; break;
5895 case SHF_GROUP: *p = 'G'; break;
5896 case SHF_TLS: *p = 'T'; break;
5897 case SHF_EXCLUDE: *p = 'E'; break;
5898 case SHF_COMPRESSED: *p = 'C'; break;
5899 case SHF_GNU_MBIND: *p = 'D'; break;
5900
5901 default:
5902 if ((filedata->file_header.e_machine == EM_X86_64
5903 || filedata->file_header.e_machine == EM_L1OM
5904 || filedata->file_header.e_machine == EM_K1OM)
5905 && flag == SHF_X86_64_LARGE)
5906 *p = 'l';
5907 else if (filedata->file_header.e_machine == EM_ARM
5908 && flag == SHF_ARM_PURECODE)
5909 *p = 'y';
5910 else if (filedata->file_header.e_machine == EM_PPC
5911 && flag == SHF_PPC_VLE)
5912 *p = 'v';
5913 else if (flag & SHF_MASKOS)
5914 {
5915 *p = 'o';
5916 sh_flags &= ~ SHF_MASKOS;
5917 }
5918 else if (flag & SHF_MASKPROC)
5919 {
5920 *p = 'p';
5921 sh_flags &= ~ SHF_MASKPROC;
5922 }
5923 else
5924 *p = 'x';
5925 break;
5926 }
5927 p++;
5928 }
5929 }
5930
5931 if (do_section_details)
5932 {
5933 if (os_flags)
5934 {
5935 size -= 5 + field_size;
5936 if (p != buff + field_size + 4)
5937 {
5938 if (size < (2 + 1))
5939 {
5940 warn (_("Internal error: not enough buffer room for section flag info"));
5941 return _("<unknown>");
5942 }
5943 size -= 2;
5944 *p++ = ',';
5945 *p++ = ' ';
5946 }
5947 sprintf (p, "OS (%*.*lx)", field_size, field_size,
5948 (unsigned long) os_flags);
5949 p += 5 + field_size;
5950 }
5951 if (proc_flags)
5952 {
5953 size -= 7 + field_size;
5954 if (p != buff + field_size + 4)
5955 {
5956 if (size < (2 + 1))
5957 {
5958 warn (_("Internal error: not enough buffer room for section flag info"));
5959 return _("<unknown>");
5960 }
5961 size -= 2;
5962 *p++ = ',';
5963 *p++ = ' ';
5964 }
5965 sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5966 (unsigned long) proc_flags);
5967 p += 7 + field_size;
5968 }
5969 if (unknown_flags)
5970 {
5971 size -= 10 + field_size;
5972 if (p != buff + field_size + 4)
5973 {
5974 if (size < (2 + 1))
5975 {
5976 warn (_("Internal error: not enough buffer room for section flag info"));
5977 return _("<unknown>");
5978 }
5979 size -= 2;
5980 *p++ = ',';
5981 *p++ = ' ';
5982 }
5983 sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
5984 (unsigned long) unknown_flags);
5985 p += 10 + field_size;
5986 }
5987 }
5988
5989 *p = '\0';
5990 return buff;
5991 }
5992
5993 static unsigned int
5994 get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf, bfd_size_type size)
5995 {
5996 if (is_32bit_elf)
5997 {
5998 Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
5999
6000 if (size < sizeof (* echdr))
6001 {
6002 error (_("Compressed section is too small even for a compression header\n"));
6003 return 0;
6004 }
6005
6006 chdr->ch_type = BYTE_GET (echdr->ch_type);
6007 chdr->ch_size = BYTE_GET (echdr->ch_size);
6008 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
6009 return sizeof (*echdr);
6010 }
6011 else
6012 {
6013 Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) buf;
6014
6015 if (size < sizeof (* echdr))
6016 {
6017 error (_("Compressed section is too small even for a compression header\n"));
6018 return 0;
6019 }
6020
6021 chdr->ch_type = BYTE_GET (echdr->ch_type);
6022 chdr->ch_size = BYTE_GET (echdr->ch_size);
6023 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
6024 return sizeof (*echdr);
6025 }
6026 }
6027
6028 static bfd_boolean
6029 process_section_headers (Filedata * filedata)
6030 {
6031 Elf_Internal_Shdr * section;
6032 unsigned int i;
6033
6034 filedata->section_headers = NULL;
6035
6036 if (filedata->file_header.e_shnum == 0)
6037 {
6038 /* PR binutils/12467. */
6039 if (filedata->file_header.e_shoff != 0)
6040 {
6041 warn (_("possibly corrupt ELF file header - it has a non-zero"
6042 " section header offset, but no section headers\n"));
6043 return FALSE;
6044 }
6045 else if (do_sections)
6046 printf (_("\nThere are no sections in this file.\n"));
6047
6048 return TRUE;
6049 }
6050
6051 if (do_sections && !do_header)
6052 printf (ngettext ("There is %d section header, "
6053 "starting at offset 0x%lx:\n",
6054 "There are %d section headers, "
6055 "starting at offset 0x%lx:\n",
6056 filedata->file_header.e_shnum),
6057 filedata->file_header.e_shnum,
6058 (unsigned long) filedata->file_header.e_shoff);
6059
6060 if (is_32bit_elf)
6061 {
6062 if (! get_32bit_section_headers (filedata, FALSE))
6063 return FALSE;
6064 }
6065 else
6066 {
6067 if (! get_64bit_section_headers (filedata, FALSE))
6068 return FALSE;
6069 }
6070
6071 /* Read in the string table, so that we have names to display. */
6072 if (filedata->file_header.e_shstrndx != SHN_UNDEF
6073 && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
6074 {
6075 section = filedata->section_headers + filedata->file_header.e_shstrndx;
6076
6077 if (section->sh_size != 0)
6078 {
6079 filedata->string_table = (char *) get_data (NULL, filedata, section->sh_offset,
6080 1, section->sh_size,
6081 _("string table"));
6082
6083 filedata->string_table_length = filedata->string_table != NULL ? section->sh_size : 0;
6084 }
6085 }
6086
6087 /* Scan the sections for the dynamic symbol table
6088 and dynamic string table and debug sections. */
6089 dynamic_symbols = NULL;
6090 dynamic_strings = NULL;
6091 dynamic_syminfo = NULL;
6092 symtab_shndx_list = NULL;
6093
6094 eh_addr_size = is_32bit_elf ? 4 : 8;
6095 switch (filedata->file_header.e_machine)
6096 {
6097 case EM_MIPS:
6098 case EM_MIPS_RS3_LE:
6099 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
6100 FDE addresses. However, the ABI also has a semi-official ILP32
6101 variant for which the normal FDE address size rules apply.
6102
6103 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
6104 section, where XX is the size of longs in bits. Unfortunately,
6105 earlier compilers provided no way of distinguishing ILP32 objects
6106 from LP64 objects, so if there's any doubt, we should assume that
6107 the official LP64 form is being used. */
6108 if ((filedata->file_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
6109 && find_section (filedata, ".gcc_compiled_long32") == NULL)
6110 eh_addr_size = 8;
6111 break;
6112
6113 case EM_H8_300:
6114 case EM_H8_300H:
6115 switch (filedata->file_header.e_flags & EF_H8_MACH)
6116 {
6117 case E_H8_MACH_H8300:
6118 case E_H8_MACH_H8300HN:
6119 case E_H8_MACH_H8300SN:
6120 case E_H8_MACH_H8300SXN:
6121 eh_addr_size = 2;
6122 break;
6123 case E_H8_MACH_H8300H:
6124 case E_H8_MACH_H8300S:
6125 case E_H8_MACH_H8300SX:
6126 eh_addr_size = 4;
6127 break;
6128 }
6129 break;
6130
6131 case EM_M32C_OLD:
6132 case EM_M32C:
6133 switch (filedata->file_header.e_flags & EF_M32C_CPU_MASK)
6134 {
6135 case EF_M32C_CPU_M16C:
6136 eh_addr_size = 2;
6137 break;
6138 }
6139 break;
6140 }
6141
6142 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
6143 do \
6144 { \
6145 bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64; \
6146 if (section->sh_entsize != expected_entsize) \
6147 { \
6148 char buf[40]; \
6149 sprintf_vma (buf, section->sh_entsize); \
6150 /* Note: coded this way so that there is a single string for \
6151 translation. */ \
6152 error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
6153 error (_("(Using the expected size of %u for the rest of this dump)\n"), \
6154 (unsigned) expected_entsize); \
6155 section->sh_entsize = expected_entsize; \
6156 } \
6157 } \
6158 while (0)
6159
6160 #define CHECK_ENTSIZE(section, i, type) \
6161 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
6162 sizeof (Elf64_External_##type))
6163
6164 for (i = 0, section = filedata->section_headers;
6165 i < filedata->file_header.e_shnum;
6166 i++, section++)
6167 {
6168 char * name = SECTION_NAME (section);
6169
6170 if (section->sh_type == SHT_DYNSYM)
6171 {
6172 if (dynamic_symbols != NULL)
6173 {
6174 error (_("File contains multiple dynamic symbol tables\n"));
6175 continue;
6176 }
6177
6178 CHECK_ENTSIZE (section, i, Sym);
6179 dynamic_symbols = GET_ELF_SYMBOLS (filedata, section, & num_dynamic_syms);
6180 }
6181 else if (section->sh_type == SHT_STRTAB
6182 && streq (name, ".dynstr"))
6183 {
6184 if (dynamic_strings != NULL)
6185 {
6186 error (_("File contains multiple dynamic string tables\n"));
6187 continue;
6188 }
6189
6190 dynamic_strings = (char *) get_data (NULL, filedata, section->sh_offset,
6191 1, section->sh_size,
6192 _("dynamic strings"));
6193 dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
6194 }
6195 else if (section->sh_type == SHT_SYMTAB_SHNDX)
6196 {
6197 elf_section_list * entry = xmalloc (sizeof * entry);
6198
6199 entry->hdr = section;
6200 entry->next = symtab_shndx_list;
6201 symtab_shndx_list = entry;
6202 }
6203 else if (section->sh_type == SHT_SYMTAB)
6204 CHECK_ENTSIZE (section, i, Sym);
6205 else if (section->sh_type == SHT_GROUP)
6206 CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
6207 else if (section->sh_type == SHT_REL)
6208 CHECK_ENTSIZE (section, i, Rel);
6209 else if (section->sh_type == SHT_RELA)
6210 CHECK_ENTSIZE (section, i, Rela);
6211 else if ((do_debugging || do_debug_info || do_debug_abbrevs
6212 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
6213 || do_debug_aranges || do_debug_frames || do_debug_macinfo
6214 || do_debug_str || do_debug_loc || do_debug_ranges
6215 || do_debug_addr || do_debug_cu_index || do_debug_links)
6216 && (const_strneq (name, ".debug_")
6217 || const_strneq (name, ".zdebug_")))
6218 {
6219 if (name[1] == 'z')
6220 name += sizeof (".zdebug_") - 1;
6221 else
6222 name += sizeof (".debug_") - 1;
6223
6224 if (do_debugging
6225 || (do_debug_info && const_strneq (name, "info"))
6226 || (do_debug_info && const_strneq (name, "types"))
6227 || (do_debug_abbrevs && const_strneq (name, "abbrev"))
6228 || (do_debug_lines && strcmp (name, "line") == 0)
6229 || (do_debug_lines && const_strneq (name, "line."))
6230 || (do_debug_pubnames && const_strneq (name, "pubnames"))
6231 || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
6232 || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
6233 || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
6234 || (do_debug_aranges && const_strneq (name, "aranges"))
6235 || (do_debug_ranges && const_strneq (name, "ranges"))
6236 || (do_debug_ranges && const_strneq (name, "rnglists"))
6237 || (do_debug_frames && const_strneq (name, "frame"))
6238 || (do_debug_macinfo && const_strneq (name, "macinfo"))
6239 || (do_debug_macinfo && const_strneq (name, "macro"))
6240 || (do_debug_str && const_strneq (name, "str"))
6241 || (do_debug_loc && const_strneq (name, "loc"))
6242 || (do_debug_loc && const_strneq (name, "loclists"))
6243 || (do_debug_addr && const_strneq (name, "addr"))
6244 || (do_debug_cu_index && const_strneq (name, "cu_index"))
6245 || (do_debug_cu_index && const_strneq (name, "tu_index"))
6246 )
6247 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6248 }
6249 /* Linkonce section to be combined with .debug_info at link time. */
6250 else if ((do_debugging || do_debug_info)
6251 && const_strneq (name, ".gnu.linkonce.wi."))
6252 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6253 else if (do_debug_frames && streq (name, ".eh_frame"))
6254 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6255 else if (do_gdb_index && (streq (name, ".gdb_index")
6256 || streq (name, ".debug_names")))
6257 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6258 /* Trace sections for Itanium VMS. */
6259 else if ((do_debugging || do_trace_info || do_trace_abbrevs
6260 || do_trace_aranges)
6261 && const_strneq (name, ".trace_"))
6262 {
6263 name += sizeof (".trace_") - 1;
6264
6265 if (do_debugging
6266 || (do_trace_info && streq (name, "info"))
6267 || (do_trace_abbrevs && streq (name, "abbrev"))
6268 || (do_trace_aranges && streq (name, "aranges"))
6269 )
6270 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6271 }
6272 else if ((do_debugging || do_debug_links)
6273 && (const_strneq (name, ".gnu_debuglink")
6274 || const_strneq (name, ".gnu_debugaltlink")))
6275 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6276 }
6277
6278 if (! do_sections)
6279 return TRUE;
6280
6281 if (filedata->file_header.e_shnum > 1)
6282 printf (_("\nSection Headers:\n"));
6283 else
6284 printf (_("\nSection Header:\n"));
6285
6286 if (is_32bit_elf)
6287 {
6288 if (do_section_details)
6289 {
6290 printf (_(" [Nr] Name\n"));
6291 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
6292 }
6293 else
6294 printf
6295 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
6296 }
6297 else if (do_wide)
6298 {
6299 if (do_section_details)
6300 {
6301 printf (_(" [Nr] Name\n"));
6302 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
6303 }
6304 else
6305 printf
6306 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
6307 }
6308 else
6309 {
6310 if (do_section_details)
6311 {
6312 printf (_(" [Nr] Name\n"));
6313 printf (_(" Type Address Offset Link\n"));
6314 printf (_(" Size EntSize Info Align\n"));
6315 }
6316 else
6317 {
6318 printf (_(" [Nr] Name Type Address Offset\n"));
6319 printf (_(" Size EntSize Flags Link Info Align\n"));
6320 }
6321 }
6322
6323 if (do_section_details)
6324 printf (_(" Flags\n"));
6325
6326 for (i = 0, section = filedata->section_headers;
6327 i < filedata->file_header.e_shnum;
6328 i++, section++)
6329 {
6330 /* Run some sanity checks on the section header. */
6331
6332 /* Check the sh_link field. */
6333 switch (section->sh_type)
6334 {
6335 case SHT_REL:
6336 case SHT_RELA:
6337 if (section->sh_link == 0
6338 && (filedata->file_header.e_type == ET_EXEC
6339 || filedata->file_header.e_type == ET_DYN))
6340 /* A dynamic relocation section where all entries use a
6341 zero symbol index need not specify a symtab section. */
6342 break;
6343 /* Fall through. */
6344 case SHT_SYMTAB_SHNDX:
6345 case SHT_GROUP:
6346 case SHT_HASH:
6347 case SHT_GNU_HASH:
6348 case SHT_GNU_versym:
6349 if (section->sh_link == 0
6350 || section->sh_link >= filedata->file_header.e_shnum
6351 || (filedata->section_headers[section->sh_link].sh_type != SHT_SYMTAB
6352 && filedata->section_headers[section->sh_link].sh_type != SHT_DYNSYM))
6353 warn (_("[%2u]: Link field (%u) should index a symtab section.\n"),
6354 i, section->sh_link);
6355 break;
6356
6357 case SHT_DYNAMIC:
6358 case SHT_SYMTAB:
6359 case SHT_DYNSYM:
6360 case SHT_GNU_verneed:
6361 case SHT_GNU_verdef:
6362 case SHT_GNU_LIBLIST:
6363 if (section->sh_link == 0
6364 || section->sh_link >= filedata->file_header.e_shnum
6365 || filedata->section_headers[section->sh_link].sh_type != SHT_STRTAB)
6366 warn (_("[%2u]: Link field (%u) should index a string section.\n"),
6367 i, section->sh_link);
6368 break;
6369
6370 case SHT_INIT_ARRAY:
6371 case SHT_FINI_ARRAY:
6372 case SHT_PREINIT_ARRAY:
6373 if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6374 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6375 i, section->sh_link);
6376 break;
6377
6378 default:
6379 /* FIXME: Add support for target specific section types. */
6380 #if 0 /* Currently we do not check other section types as there are too
6381 many special cases. Stab sections for example have a type
6382 of SHT_PROGBITS but an sh_link field that links to the .stabstr
6383 section. */
6384 if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6385 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6386 i, section->sh_link);
6387 #endif
6388 break;
6389 }
6390
6391 /* Check the sh_info field. */
6392 switch (section->sh_type)
6393 {
6394 case SHT_REL:
6395 case SHT_RELA:
6396 if (section->sh_info == 0
6397 && (filedata->file_header.e_type == ET_EXEC
6398 || filedata->file_header.e_type == ET_DYN))
6399 /* Dynamic relocations apply to segments, so they do not
6400 need to specify the section they relocate. */
6401 break;
6402 if (section->sh_info == 0
6403 || section->sh_info >= filedata->file_header.e_shnum
6404 || (filedata->section_headers[section->sh_info].sh_type != SHT_PROGBITS
6405 && filedata->section_headers[section->sh_info].sh_type != SHT_NOBITS
6406 && filedata->section_headers[section->sh_info].sh_type != SHT_NOTE
6407 && filedata->section_headers[section->sh_info].sh_type != SHT_INIT_ARRAY
6408 && filedata->section_headers[section->sh_info].sh_type != SHT_FINI_ARRAY
6409 && filedata->section_headers[section->sh_info].sh_type != SHT_PREINIT_ARRAY
6410 /* FIXME: Are other section types valid ? */
6411 && filedata->section_headers[section->sh_info].sh_type < SHT_LOOS))
6412 warn (_("[%2u]: Info field (%u) should index a relocatable section.\n"),
6413 i, section->sh_info);
6414 break;
6415
6416 case SHT_DYNAMIC:
6417 case SHT_HASH:
6418 case SHT_SYMTAB_SHNDX:
6419 case SHT_INIT_ARRAY:
6420 case SHT_FINI_ARRAY:
6421 case SHT_PREINIT_ARRAY:
6422 if (section->sh_info != 0)
6423 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6424 i, section->sh_info);
6425 break;
6426
6427 case SHT_GROUP:
6428 case SHT_SYMTAB:
6429 case SHT_DYNSYM:
6430 /* A symbol index - we assume that it is valid. */
6431 break;
6432
6433 default:
6434 /* FIXME: Add support for target specific section types. */
6435 if (section->sh_type == SHT_NOBITS)
6436 /* NOBITS section headers with non-zero sh_info fields can be
6437 created when a binary is stripped of everything but its debug
6438 information. The stripped sections have their headers
6439 preserved but their types set to SHT_NOBITS. So do not check
6440 this type of section. */
6441 ;
6442 else if (section->sh_flags & SHF_INFO_LINK)
6443 {
6444 if (section->sh_info < 1 || section->sh_info >= filedata->file_header.e_shnum)
6445 warn (_("[%2u]: Expected link to another section in info field"), i);
6446 }
6447 else if (section->sh_type < SHT_LOOS
6448 && (section->sh_flags & SHF_GNU_MBIND) == 0
6449 && section->sh_info != 0)
6450 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6451 i, section->sh_info);
6452 break;
6453 }
6454
6455 /* Check the sh_size field. */
6456 if (section->sh_size > filedata->file_size
6457 && section->sh_type != SHT_NOBITS
6458 && section->sh_type != SHT_NULL
6459 && section->sh_type < SHT_LOOS)
6460 warn (_("Size of section %u is larger than the entire file!\n"), i);
6461
6462 printf (" [%2u] ", i);
6463 if (do_section_details)
6464 printf ("%s\n ", printable_section_name (filedata, section));
6465 else
6466 print_symbol (-17, SECTION_NAME (section));
6467
6468 printf (do_wide ? " %-15s " : " %-15.15s ",
6469 get_section_type_name (filedata, section->sh_type));
6470
6471 if (is_32bit_elf)
6472 {
6473 const char * link_too_big = NULL;
6474
6475 print_vma (section->sh_addr, LONG_HEX);
6476
6477 printf ( " %6.6lx %6.6lx %2.2lx",
6478 (unsigned long) section->sh_offset,
6479 (unsigned long) section->sh_size,
6480 (unsigned long) section->sh_entsize);
6481
6482 if (do_section_details)
6483 fputs (" ", stdout);
6484 else
6485 printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6486
6487 if (section->sh_link >= filedata->file_header.e_shnum)
6488 {
6489 link_too_big = "";
6490 /* The sh_link value is out of range. Normally this indicates
6491 an error but it can have special values in Solaris binaries. */
6492 switch (filedata->file_header.e_machine)
6493 {
6494 case EM_386:
6495 case EM_IAMCU:
6496 case EM_X86_64:
6497 case EM_L1OM:
6498 case EM_K1OM:
6499 case EM_OLD_SPARCV9:
6500 case EM_SPARC32PLUS:
6501 case EM_SPARCV9:
6502 case EM_SPARC:
6503 if (section->sh_link == (SHN_BEFORE & 0xffff))
6504 link_too_big = "BEFORE";
6505 else if (section->sh_link == (SHN_AFTER & 0xffff))
6506 link_too_big = "AFTER";
6507 break;
6508 default:
6509 break;
6510 }
6511 }
6512
6513 if (do_section_details)
6514 {
6515 if (link_too_big != NULL && * link_too_big)
6516 printf ("<%s> ", link_too_big);
6517 else
6518 printf ("%2u ", section->sh_link);
6519 printf ("%3u %2lu\n", section->sh_info,
6520 (unsigned long) section->sh_addralign);
6521 }
6522 else
6523 printf ("%2u %3u %2lu\n",
6524 section->sh_link,
6525 section->sh_info,
6526 (unsigned long) section->sh_addralign);
6527
6528 if (link_too_big && ! * link_too_big)
6529 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
6530 i, section->sh_link);
6531 }
6532 else if (do_wide)
6533 {
6534 print_vma (section->sh_addr, LONG_HEX);
6535
6536 if ((long) section->sh_offset == section->sh_offset)
6537 printf (" %6.6lx", (unsigned long) section->sh_offset);
6538 else
6539 {
6540 putchar (' ');
6541 print_vma (section->sh_offset, LONG_HEX);
6542 }
6543
6544 if ((unsigned long) section->sh_size == section->sh_size)
6545 printf (" %6.6lx", (unsigned long) section->sh_size);
6546 else
6547 {
6548 putchar (' ');
6549 print_vma (section->sh_size, LONG_HEX);
6550 }
6551
6552 if ((unsigned long) section->sh_entsize == section->sh_entsize)
6553 printf (" %2.2lx", (unsigned long) section->sh_entsize);
6554 else
6555 {
6556 putchar (' ');
6557 print_vma (section->sh_entsize, LONG_HEX);
6558 }
6559
6560 if (do_section_details)
6561 fputs (" ", stdout);
6562 else
6563 printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6564
6565 printf ("%2u %3u ", section->sh_link, section->sh_info);
6566
6567 if ((unsigned long) section->sh_addralign == section->sh_addralign)
6568 printf ("%2lu\n", (unsigned long) section->sh_addralign);
6569 else
6570 {
6571 print_vma (section->sh_addralign, DEC);
6572 putchar ('\n');
6573 }
6574 }
6575 else if (do_section_details)
6576 {
6577 putchar (' ');
6578 print_vma (section->sh_addr, LONG_HEX);
6579 if ((long) section->sh_offset == section->sh_offset)
6580 printf (" %16.16lx", (unsigned long) section->sh_offset);
6581 else
6582 {
6583 printf (" ");
6584 print_vma (section->sh_offset, LONG_HEX);
6585 }
6586 printf (" %u\n ", section->sh_link);
6587 print_vma (section->sh_size, LONG_HEX);
6588 putchar (' ');
6589 print_vma (section->sh_entsize, LONG_HEX);
6590
6591 printf (" %-16u %lu\n",
6592 section->sh_info,
6593 (unsigned long) section->sh_addralign);
6594 }
6595 else
6596 {
6597 putchar (' ');
6598 print_vma (section->sh_addr, LONG_HEX);
6599 if ((long) section->sh_offset == section->sh_offset)
6600 printf (" %8.8lx", (unsigned long) section->sh_offset);
6601 else
6602 {
6603 printf (" ");
6604 print_vma (section->sh_offset, LONG_HEX);
6605 }
6606 printf ("\n ");
6607 print_vma (section->sh_size, LONG_HEX);
6608 printf (" ");
6609 print_vma (section->sh_entsize, LONG_HEX);
6610
6611 printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6612
6613 printf (" %2u %3u %lu\n",
6614 section->sh_link,
6615 section->sh_info,
6616 (unsigned long) section->sh_addralign);
6617 }
6618
6619 if (do_section_details)
6620 {
6621 printf (" %s\n", get_elf_section_flags (filedata, section->sh_flags));
6622 if ((section->sh_flags & SHF_COMPRESSED) != 0)
6623 {
6624 /* Minimum section size is 12 bytes for 32-bit compression
6625 header + 12 bytes for compressed data header. */
6626 unsigned char buf[24];
6627
6628 assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
6629 if (get_data (&buf, filedata, section->sh_offset, 1,
6630 sizeof (buf), _("compression header")))
6631 {
6632 Elf_Internal_Chdr chdr;
6633
6634 (void) get_compression_header (&chdr, buf, sizeof (buf));
6635
6636 if (chdr.ch_type == ELFCOMPRESS_ZLIB)
6637 printf (" ZLIB, ");
6638 else
6639 printf (_(" [<unknown>: 0x%x], "),
6640 chdr.ch_type);
6641 print_vma (chdr.ch_size, LONG_HEX);
6642 printf (", %lu\n", (unsigned long) chdr.ch_addralign);
6643 }
6644 }
6645 }
6646 }
6647
6648 if (!do_section_details)
6649 {
6650 /* The ordering of the letters shown here matches the ordering of the
6651 corresponding SHF_xxx values, and hence the order in which these
6652 letters will be displayed to the user. */
6653 printf (_("Key to Flags:\n\
6654 W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6655 L (link order), O (extra OS processing required), G (group), T (TLS),\n\
6656 C (compressed), x (unknown), o (OS specific), E (exclude),\n "));
6657 if (filedata->file_header.e_machine == EM_X86_64
6658 || filedata->file_header.e_machine == EM_L1OM
6659 || filedata->file_header.e_machine == EM_K1OM)
6660 printf (_("l (large), "));
6661 else if (filedata->file_header.e_machine == EM_ARM)
6662 printf (_("y (purecode), "));
6663 else if (filedata->file_header.e_machine == EM_PPC)
6664 printf (_("v (VLE), "));
6665 printf ("p (processor specific)\n");
6666 }
6667
6668 return TRUE;
6669 }
6670
6671 static const char *
6672 get_group_flags (unsigned int flags)
6673 {
6674 static char buff[128];
6675
6676 if (flags == 0)
6677 return "";
6678 else if (flags == GRP_COMDAT)
6679 return "COMDAT ";
6680
6681 snprintf (buff, 14, _("[0x%x: "), flags);
6682
6683 flags &= ~ GRP_COMDAT;
6684 if (flags & GRP_MASKOS)
6685 {
6686 strcat (buff, "<OS specific>");
6687 flags &= ~ GRP_MASKOS;
6688 }
6689
6690 if (flags & GRP_MASKPROC)
6691 {
6692 strcat (buff, "<PROC specific>");
6693 flags &= ~ GRP_MASKPROC;
6694 }
6695
6696 if (flags)
6697 strcat (buff, "<unknown>");
6698
6699 strcat (buff, "]");
6700 return buff;
6701 }
6702
6703 static bfd_boolean
6704 process_section_groups (Filedata * filedata)
6705 {
6706 Elf_Internal_Shdr * section;
6707 unsigned int i;
6708 struct group * group;
6709 Elf_Internal_Shdr * symtab_sec;
6710 Elf_Internal_Shdr * strtab_sec;
6711 Elf_Internal_Sym * symtab;
6712 unsigned long num_syms;
6713 char * strtab;
6714 size_t strtab_size;
6715
6716 /* Don't process section groups unless needed. */
6717 if (!do_unwind && !do_section_groups)
6718 return TRUE;
6719
6720 if (filedata->file_header.e_shnum == 0)
6721 {
6722 if (do_section_groups)
6723 printf (_("\nThere are no sections to group in this file.\n"));
6724
6725 return TRUE;
6726 }
6727
6728 if (filedata->section_headers == NULL)
6729 {
6730 error (_("Section headers are not available!\n"));
6731 /* PR 13622: This can happen with a corrupt ELF header. */
6732 return FALSE;
6733 }
6734
6735 section_headers_groups = (struct group **) calloc (filedata->file_header.e_shnum,
6736 sizeof (struct group *));
6737
6738 if (section_headers_groups == NULL)
6739 {
6740 error (_("Out of memory reading %u section group headers\n"),
6741 filedata->file_header.e_shnum);
6742 return FALSE;
6743 }
6744
6745 /* Scan the sections for the group section. */
6746 group_count = 0;
6747 for (i = 0, section = filedata->section_headers;
6748 i < filedata->file_header.e_shnum;
6749 i++, section++)
6750 if (section->sh_type == SHT_GROUP)
6751 group_count++;
6752
6753 if (group_count == 0)
6754 {
6755 if (do_section_groups)
6756 printf (_("\nThere are no section groups in this file.\n"));
6757
6758 return TRUE;
6759 }
6760
6761 section_groups = (struct group *) calloc (group_count, sizeof (struct group));
6762
6763 if (section_groups == NULL)
6764 {
6765 error (_("Out of memory reading %lu groups\n"),
6766 (unsigned long) group_count);
6767 return FALSE;
6768 }
6769
6770 symtab_sec = NULL;
6771 strtab_sec = NULL;
6772 symtab = NULL;
6773 num_syms = 0;
6774 strtab = NULL;
6775 strtab_size = 0;
6776 for (i = 0, section = filedata->section_headers, group = section_groups;
6777 i < filedata->file_header.e_shnum;
6778 i++, section++)
6779 {
6780 if (section->sh_type == SHT_GROUP)
6781 {
6782 const char * name = printable_section_name (filedata, section);
6783 const char * group_name;
6784 unsigned char * start;
6785 unsigned char * indices;
6786 unsigned int entry, j, size;
6787 Elf_Internal_Shdr * sec;
6788 Elf_Internal_Sym * sym;
6789
6790 /* Get the symbol table. */
6791 if (section->sh_link >= filedata->file_header.e_shnum
6792 || ((sec = filedata->section_headers + section->sh_link)->sh_type
6793 != SHT_SYMTAB))
6794 {
6795 error (_("Bad sh_link in group section `%s'\n"), name);
6796 continue;
6797 }
6798
6799 if (symtab_sec != sec)
6800 {
6801 symtab_sec = sec;
6802 if (symtab)
6803 free (symtab);
6804 symtab = GET_ELF_SYMBOLS (filedata, symtab_sec, & num_syms);
6805 }
6806
6807 if (symtab == NULL)
6808 {
6809 error (_("Corrupt header in group section `%s'\n"), name);
6810 continue;
6811 }
6812
6813 if (section->sh_info >= num_syms)
6814 {
6815 error (_("Bad sh_info in group section `%s'\n"), name);
6816 continue;
6817 }
6818
6819 sym = symtab + section->sh_info;
6820
6821 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6822 {
6823 if (sym->st_shndx == 0
6824 || sym->st_shndx >= filedata->file_header.e_shnum)
6825 {
6826 error (_("Bad sh_info in group section `%s'\n"), name);
6827 continue;
6828 }
6829
6830 group_name = SECTION_NAME (filedata->section_headers + sym->st_shndx);
6831 strtab_sec = NULL;
6832 if (strtab)
6833 free (strtab);
6834 strtab = NULL;
6835 strtab_size = 0;
6836 }
6837 else
6838 {
6839 /* Get the string table. */
6840 if (symtab_sec->sh_link >= filedata->file_header.e_shnum)
6841 {
6842 strtab_sec = NULL;
6843 if (strtab)
6844 free (strtab);
6845 strtab = NULL;
6846 strtab_size = 0;
6847 }
6848 else if (strtab_sec
6849 != (sec = filedata->section_headers + symtab_sec->sh_link))
6850 {
6851 strtab_sec = sec;
6852 if (strtab)
6853 free (strtab);
6854
6855 strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
6856 1, strtab_sec->sh_size,
6857 _("string table"));
6858 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
6859 }
6860 group_name = sym->st_name < strtab_size
6861 ? strtab + sym->st_name : _("<corrupt>");
6862 }
6863
6864 /* PR 17531: file: loop. */
6865 if (section->sh_entsize > section->sh_size)
6866 {
6867 error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6868 printable_section_name (filedata, section),
6869 (unsigned long) section->sh_entsize,
6870 (unsigned long) section->sh_size);
6871 break;
6872 }
6873
6874 start = (unsigned char *) get_data (NULL, filedata, section->sh_offset,
6875 1, section->sh_size,
6876 _("section data"));
6877 if (start == NULL)
6878 continue;
6879
6880 indices = start;
6881 size = (section->sh_size / section->sh_entsize) - 1;
6882 entry = byte_get (indices, 4);
6883 indices += 4;
6884
6885 if (do_section_groups)
6886 {
6887 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
6888 get_group_flags (entry), i, name, group_name, size);
6889
6890 printf (_(" [Index] Name\n"));
6891 }
6892
6893 group->group_index = i;
6894
6895 for (j = 0; j < size; j++)
6896 {
6897 struct group_list * g;
6898
6899 entry = byte_get (indices, 4);
6900 indices += 4;
6901
6902 if (entry >= filedata->file_header.e_shnum)
6903 {
6904 static unsigned num_group_errors = 0;
6905
6906 if (num_group_errors ++ < 10)
6907 {
6908 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6909 entry, i, filedata->file_header.e_shnum - 1);
6910 if (num_group_errors == 10)
6911 warn (_("Further error messages about overlarge group section indices suppressed\n"));
6912 }
6913 continue;
6914 }
6915
6916 if (section_headers_groups [entry] != NULL)
6917 {
6918 if (entry)
6919 {
6920 static unsigned num_errs = 0;
6921
6922 if (num_errs ++ < 10)
6923 {
6924 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6925 entry, i,
6926 section_headers_groups [entry]->group_index);
6927 if (num_errs == 10)
6928 warn (_("Further error messages about already contained group sections suppressed\n"));
6929 }
6930 continue;
6931 }
6932 else
6933 {
6934 /* Intel C/C++ compiler may put section 0 in a
6935 section group. We just warn it the first time
6936 and ignore it afterwards. */
6937 static bfd_boolean warned = FALSE;
6938 if (!warned)
6939 {
6940 error (_("section 0 in group section [%5u]\n"),
6941 section_headers_groups [entry]->group_index);
6942 warned = TRUE;
6943 }
6944 }
6945 }
6946
6947 section_headers_groups [entry] = group;
6948
6949 if (do_section_groups)
6950 {
6951 sec = filedata->section_headers + entry;
6952 printf (" [%5u] %s\n", entry, printable_section_name (filedata, sec));
6953 }
6954
6955 g = (struct group_list *) xmalloc (sizeof (struct group_list));
6956 g->section_index = entry;
6957 g->next = group->root;
6958 group->root = g;
6959 }
6960
6961 if (start)
6962 free (start);
6963
6964 group++;
6965 }
6966 }
6967
6968 if (symtab)
6969 free (symtab);
6970 if (strtab)
6971 free (strtab);
6972 return TRUE;
6973 }
6974
6975 /* Data used to display dynamic fixups. */
6976
6977 struct ia64_vms_dynfixup
6978 {
6979 bfd_vma needed_ident; /* Library ident number. */
6980 bfd_vma needed; /* Index in the dstrtab of the library name. */
6981 bfd_vma fixup_needed; /* Index of the library. */
6982 bfd_vma fixup_rela_cnt; /* Number of fixups. */
6983 bfd_vma fixup_rela_off; /* Fixups offset in the dynamic segment. */
6984 };
6985
6986 /* Data used to display dynamic relocations. */
6987
6988 struct ia64_vms_dynimgrela
6989 {
6990 bfd_vma img_rela_cnt; /* Number of relocations. */
6991 bfd_vma img_rela_off; /* Reloc offset in the dynamic segment. */
6992 };
6993
6994 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6995 library). */
6996
6997 static bfd_boolean
6998 dump_ia64_vms_dynamic_fixups (Filedata * filedata,
6999 struct ia64_vms_dynfixup * fixup,
7000 const char * strtab,
7001 unsigned int strtab_sz)
7002 {
7003 Elf64_External_VMS_IMAGE_FIXUP * imfs;
7004 long i;
7005 const char * lib_name;
7006
7007 imfs = get_data (NULL, filedata, dynamic_addr + fixup->fixup_rela_off,
7008 1, fixup->fixup_rela_cnt * sizeof (*imfs),
7009 _("dynamic section image fixups"));
7010 if (!imfs)
7011 return FALSE;
7012
7013 if (fixup->needed < strtab_sz)
7014 lib_name = strtab + fixup->needed;
7015 else
7016 {
7017 warn (_("corrupt library name index of 0x%lx found in dynamic entry"),
7018 (unsigned long) fixup->needed);
7019 lib_name = "???";
7020 }
7021 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
7022 (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
7023 printf
7024 (_("Seg Offset Type SymVec DataType\n"));
7025
7026 for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
7027 {
7028 unsigned int type;
7029 const char *rtype;
7030
7031 printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
7032 printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
7033 type = BYTE_GET (imfs [i].type);
7034 rtype = elf_ia64_reloc_type (type);
7035 if (rtype == NULL)
7036 printf (" 0x%08x ", type);
7037 else
7038 printf (" %-32s ", rtype);
7039 printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
7040 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
7041 }
7042
7043 free (imfs);
7044 return TRUE;
7045 }
7046
7047 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
7048
7049 static bfd_boolean
7050 dump_ia64_vms_dynamic_relocs (Filedata * filedata, struct ia64_vms_dynimgrela *imgrela)
7051 {
7052 Elf64_External_VMS_IMAGE_RELA *imrs;
7053 long i;
7054
7055 imrs = get_data (NULL, filedata, dynamic_addr + imgrela->img_rela_off,
7056 1, imgrela->img_rela_cnt * sizeof (*imrs),
7057 _("dynamic section image relocations"));
7058 if (!imrs)
7059 return FALSE;
7060
7061 printf (_("\nImage relocs\n"));
7062 printf
7063 (_("Seg Offset Type Addend Seg Sym Off\n"));
7064
7065 for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
7066 {
7067 unsigned int type;
7068 const char *rtype;
7069
7070 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
7071 printf ("%08" BFD_VMA_FMT "x ",
7072 (bfd_vma) BYTE_GET (imrs [i].rela_offset));
7073 type = BYTE_GET (imrs [i].type);
7074 rtype = elf_ia64_reloc_type (type);
7075 if (rtype == NULL)
7076 printf ("0x%08x ", type);
7077 else
7078 printf ("%-31s ", rtype);
7079 print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
7080 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
7081 printf ("%08" BFD_VMA_FMT "x\n",
7082 (bfd_vma) BYTE_GET (imrs [i].sym_offset));
7083 }
7084
7085 free (imrs);
7086 return TRUE;
7087 }
7088
7089 /* Display IA-64 OpenVMS dynamic relocations and fixups. */
7090
7091 static bfd_boolean
7092 process_ia64_vms_dynamic_relocs (Filedata * filedata)
7093 {
7094 struct ia64_vms_dynfixup fixup;
7095 struct ia64_vms_dynimgrela imgrela;
7096 Elf_Internal_Dyn *entry;
7097 bfd_vma strtab_off = 0;
7098 bfd_vma strtab_sz = 0;
7099 char *strtab = NULL;
7100 bfd_boolean res = TRUE;
7101
7102 memset (&fixup, 0, sizeof (fixup));
7103 memset (&imgrela, 0, sizeof (imgrela));
7104
7105 /* Note: the order of the entries is specified by the OpenVMS specs. */
7106 for (entry = dynamic_section;
7107 entry < dynamic_section + dynamic_nent;
7108 entry++)
7109 {
7110 switch (entry->d_tag)
7111 {
7112 case DT_IA_64_VMS_STRTAB_OFFSET:
7113 strtab_off = entry->d_un.d_val;
7114 break;
7115 case DT_STRSZ:
7116 strtab_sz = entry->d_un.d_val;
7117 if (strtab == NULL)
7118 strtab = get_data (NULL, filedata, dynamic_addr + strtab_off,
7119 1, strtab_sz, _("dynamic string section"));
7120 break;
7121
7122 case DT_IA_64_VMS_NEEDED_IDENT:
7123 fixup.needed_ident = entry->d_un.d_val;
7124 break;
7125 case DT_NEEDED:
7126 fixup.needed = entry->d_un.d_val;
7127 break;
7128 case DT_IA_64_VMS_FIXUP_NEEDED:
7129 fixup.fixup_needed = entry->d_un.d_val;
7130 break;
7131 case DT_IA_64_VMS_FIXUP_RELA_CNT:
7132 fixup.fixup_rela_cnt = entry->d_un.d_val;
7133 break;
7134 case DT_IA_64_VMS_FIXUP_RELA_OFF:
7135 fixup.fixup_rela_off = entry->d_un.d_val;
7136 if (! dump_ia64_vms_dynamic_fixups (filedata, &fixup, strtab, strtab_sz))
7137 res = FALSE;
7138 break;
7139 case DT_IA_64_VMS_IMG_RELA_CNT:
7140 imgrela.img_rela_cnt = entry->d_un.d_val;
7141 break;
7142 case DT_IA_64_VMS_IMG_RELA_OFF:
7143 imgrela.img_rela_off = entry->d_un.d_val;
7144 if (! dump_ia64_vms_dynamic_relocs (filedata, &imgrela))
7145 res = FALSE;
7146 break;
7147
7148 default:
7149 break;
7150 }
7151 }
7152
7153 if (strtab != NULL)
7154 free (strtab);
7155
7156 return res;
7157 }
7158
7159 static struct
7160 {
7161 const char * name;
7162 int reloc;
7163 int size;
7164 int rela;
7165 }
7166 dynamic_relocations [] =
7167 {
7168 { "REL", DT_REL, DT_RELSZ, FALSE },
7169 { "RELA", DT_RELA, DT_RELASZ, TRUE },
7170 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
7171 };
7172
7173 /* Process the reloc section. */
7174
7175 static bfd_boolean
7176 process_relocs (Filedata * filedata)
7177 {
7178 unsigned long rel_size;
7179 unsigned long rel_offset;
7180
7181 if (!do_reloc)
7182 return TRUE;
7183
7184 if (do_using_dynamic)
7185 {
7186 int is_rela;
7187 const char * name;
7188 bfd_boolean has_dynamic_reloc;
7189 unsigned int i;
7190
7191 has_dynamic_reloc = FALSE;
7192
7193 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
7194 {
7195 is_rela = dynamic_relocations [i].rela;
7196 name = dynamic_relocations [i].name;
7197 rel_size = dynamic_info [dynamic_relocations [i].size];
7198 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
7199
7200 if (rel_size)
7201 has_dynamic_reloc = TRUE;
7202
7203 if (is_rela == UNKNOWN)
7204 {
7205 if (dynamic_relocations [i].reloc == DT_JMPREL)
7206 switch (dynamic_info[DT_PLTREL])
7207 {
7208 case DT_REL:
7209 is_rela = FALSE;
7210 break;
7211 case DT_RELA:
7212 is_rela = TRUE;
7213 break;
7214 }
7215 }
7216
7217 if (rel_size)
7218 {
7219 printf
7220 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
7221 name, rel_offset, rel_size);
7222
7223 dump_relocations (filedata,
7224 offset_from_vma (filedata, rel_offset, rel_size),
7225 rel_size,
7226 dynamic_symbols, num_dynamic_syms,
7227 dynamic_strings, dynamic_strings_length,
7228 is_rela, TRUE /* is_dynamic */);
7229 }
7230 }
7231
7232 if (is_ia64_vms (filedata))
7233 if (process_ia64_vms_dynamic_relocs (filedata))
7234 has_dynamic_reloc = TRUE;
7235
7236 if (! has_dynamic_reloc)
7237 printf (_("\nThere are no dynamic relocations in this file.\n"));
7238 }
7239 else
7240 {
7241 Elf_Internal_Shdr * section;
7242 unsigned long i;
7243 bfd_boolean found = FALSE;
7244
7245 for (i = 0, section = filedata->section_headers;
7246 i < filedata->file_header.e_shnum;
7247 i++, section++)
7248 {
7249 if ( section->sh_type != SHT_RELA
7250 && section->sh_type != SHT_REL)
7251 continue;
7252
7253 rel_offset = section->sh_offset;
7254 rel_size = section->sh_size;
7255
7256 if (rel_size)
7257 {
7258 Elf_Internal_Shdr * strsec;
7259 int is_rela;
7260 unsigned long num_rela;
7261
7262 printf (_("\nRelocation section "));
7263
7264 if (filedata->string_table == NULL)
7265 printf ("%d", section->sh_name);
7266 else
7267 printf ("'%s'", printable_section_name (filedata, section));
7268
7269 num_rela = rel_size / section->sh_entsize;
7270 printf (ngettext (" at offset 0x%lx contains %lu entry:\n",
7271 " at offset 0x%lx contains %lu entries:\n",
7272 num_rela),
7273 rel_offset, num_rela);
7274
7275 is_rela = section->sh_type == SHT_RELA;
7276
7277 if (section->sh_link != 0
7278 && section->sh_link < filedata->file_header.e_shnum)
7279 {
7280 Elf_Internal_Shdr * symsec;
7281 Elf_Internal_Sym * symtab;
7282 unsigned long nsyms;
7283 unsigned long strtablen = 0;
7284 char * strtab = NULL;
7285
7286 symsec = filedata->section_headers + section->sh_link;
7287 if (symsec->sh_type != SHT_SYMTAB
7288 && symsec->sh_type != SHT_DYNSYM)
7289 continue;
7290
7291 symtab = GET_ELF_SYMBOLS (filedata, symsec, & nsyms);
7292
7293 if (symtab == NULL)
7294 continue;
7295
7296 if (symsec->sh_link != 0
7297 && symsec->sh_link < filedata->file_header.e_shnum)
7298 {
7299 strsec = filedata->section_headers + symsec->sh_link;
7300
7301 strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
7302 1, strsec->sh_size,
7303 _("string table"));
7304 strtablen = strtab == NULL ? 0 : strsec->sh_size;
7305 }
7306
7307 dump_relocations (filedata, rel_offset, rel_size,
7308 symtab, nsyms, strtab, strtablen,
7309 is_rela,
7310 symsec->sh_type == SHT_DYNSYM);
7311 if (strtab)
7312 free (strtab);
7313 free (symtab);
7314 }
7315 else
7316 dump_relocations (filedata, rel_offset, rel_size,
7317 NULL, 0, NULL, 0, is_rela,
7318 FALSE /* is_dynamic */);
7319
7320 found = TRUE;
7321 }
7322 }
7323
7324 if (! found)
7325 {
7326 /* Users sometimes forget the -D option, so try to be helpful. */
7327 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
7328 {
7329 if (dynamic_info [dynamic_relocations [i].size])
7330 {
7331 printf (_("\nThere are no static relocations in this file."));
7332 printf (_("\nTo see the dynamic relocations add --use-dynamic to the command line.\n"));
7333
7334 break;
7335 }
7336 }
7337 if (i == ARRAY_SIZE (dynamic_relocations))
7338 printf (_("\nThere are no relocations in this file.\n"));
7339 }
7340 }
7341
7342 return TRUE;
7343 }
7344
7345 /* An absolute address consists of a section and an offset. If the
7346 section is NULL, the offset itself is the address, otherwise, the
7347 address equals to LOAD_ADDRESS(section) + offset. */
7348
7349 struct absaddr
7350 {
7351 unsigned short section;
7352 bfd_vma offset;
7353 };
7354
7355 #define ABSADDR(a) \
7356 ((a).section \
7357 ? filedata->section_headers [(a).section].sh_addr + (a).offset \
7358 : (a).offset)
7359
7360 /* Find the nearest symbol at or below ADDR. Returns the symbol
7361 name, if found, and the offset from the symbol to ADDR. */
7362
7363 static void
7364 find_symbol_for_address (Filedata * filedata,
7365 Elf_Internal_Sym * symtab,
7366 unsigned long nsyms,
7367 const char * strtab,
7368 unsigned long strtab_size,
7369 struct absaddr addr,
7370 const char ** symname,
7371 bfd_vma * offset)
7372 {
7373 bfd_vma dist = 0x100000;
7374 Elf_Internal_Sym * sym;
7375 Elf_Internal_Sym * beg;
7376 Elf_Internal_Sym * end;
7377 Elf_Internal_Sym * best = NULL;
7378
7379 REMOVE_ARCH_BITS (addr.offset);
7380 beg = symtab;
7381 end = symtab + nsyms;
7382
7383 while (beg < end)
7384 {
7385 bfd_vma value;
7386
7387 sym = beg + (end - beg) / 2;
7388
7389 value = sym->st_value;
7390 REMOVE_ARCH_BITS (value);
7391
7392 if (sym->st_name != 0
7393 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
7394 && addr.offset >= value
7395 && addr.offset - value < dist)
7396 {
7397 best = sym;
7398 dist = addr.offset - value;
7399 if (!dist)
7400 break;
7401 }
7402
7403 if (addr.offset < value)
7404 end = sym;
7405 else
7406 beg = sym + 1;
7407 }
7408
7409 if (best)
7410 {
7411 *symname = (best->st_name >= strtab_size
7412 ? _("<corrupt>") : strtab + best->st_name);
7413 *offset = dist;
7414 return;
7415 }
7416
7417 *symname = NULL;
7418 *offset = addr.offset;
7419 }
7420
7421 static /* signed */ int
7422 symcmp (const void *p, const void *q)
7423 {
7424 Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
7425 Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
7426
7427 return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
7428 }
7429
7430 /* Process the unwind section. */
7431
7432 #include "unwind-ia64.h"
7433
7434 struct ia64_unw_table_entry
7435 {
7436 struct absaddr start;
7437 struct absaddr end;
7438 struct absaddr info;
7439 };
7440
7441 struct ia64_unw_aux_info
7442 {
7443 struct ia64_unw_table_entry * table; /* Unwind table. */
7444 unsigned long table_len; /* Length of unwind table. */
7445 unsigned char * info; /* Unwind info. */
7446 unsigned long info_size; /* Size of unwind info. */
7447 bfd_vma info_addr; /* Starting address of unwind info. */
7448 bfd_vma seg_base; /* Starting address of segment. */
7449 Elf_Internal_Sym * symtab; /* The symbol table. */
7450 unsigned long nsyms; /* Number of symbols. */
7451 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7452 unsigned long nfuns; /* Number of entries in funtab. */
7453 char * strtab; /* The string table. */
7454 unsigned long strtab_size; /* Size of string table. */
7455 };
7456
7457 static bfd_boolean
7458 dump_ia64_unwind (Filedata * filedata, struct ia64_unw_aux_info * aux)
7459 {
7460 struct ia64_unw_table_entry * tp;
7461 unsigned long j, nfuns;
7462 int in_body;
7463 bfd_boolean res = TRUE;
7464
7465 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7466 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7467 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7468 aux->funtab[nfuns++] = aux->symtab[j];
7469 aux->nfuns = nfuns;
7470 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7471
7472 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7473 {
7474 bfd_vma stamp;
7475 bfd_vma offset;
7476 const unsigned char * dp;
7477 const unsigned char * head;
7478 const unsigned char * end;
7479 const char * procname;
7480
7481 find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
7482 aux->strtab_size, tp->start, &procname, &offset);
7483
7484 fputs ("\n<", stdout);
7485
7486 if (procname)
7487 {
7488 fputs (procname, stdout);
7489
7490 if (offset)
7491 printf ("+%lx", (unsigned long) offset);
7492 }
7493
7494 fputs (">: [", stdout);
7495 print_vma (tp->start.offset, PREFIX_HEX);
7496 fputc ('-', stdout);
7497 print_vma (tp->end.offset, PREFIX_HEX);
7498 printf ("], info at +0x%lx\n",
7499 (unsigned long) (tp->info.offset - aux->seg_base));
7500
7501 /* PR 17531: file: 86232b32. */
7502 if (aux->info == NULL)
7503 continue;
7504
7505 /* PR 17531: file: 0997b4d1. */
7506 if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
7507 {
7508 warn (_("Invalid offset %lx in table entry %ld\n"),
7509 (long) tp->info.offset, (long) (tp - aux->table));
7510 res = FALSE;
7511 continue;
7512 }
7513
7514 head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
7515 stamp = byte_get ((unsigned char *) head, sizeof (stamp));
7516
7517 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
7518 (unsigned) UNW_VER (stamp),
7519 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
7520 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
7521 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
7522 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
7523
7524 if (UNW_VER (stamp) != 1)
7525 {
7526 printf (_("\tUnknown version.\n"));
7527 continue;
7528 }
7529
7530 in_body = 0;
7531 end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
7532 /* PR 17531: file: 16ceda89. */
7533 if (end > aux->info + aux->info_size)
7534 end = aux->info + aux->info_size;
7535 for (dp = head + 8; dp < end;)
7536 dp = unw_decode (dp, in_body, & in_body, end);
7537 }
7538
7539 free (aux->funtab);
7540
7541 return res;
7542 }
7543
7544 static bfd_boolean
7545 slurp_ia64_unwind_table (Filedata * filedata,
7546 struct ia64_unw_aux_info * aux,
7547 Elf_Internal_Shdr * sec)
7548 {
7549 unsigned long size, nrelas, i;
7550 Elf_Internal_Phdr * seg;
7551 struct ia64_unw_table_entry * tep;
7552 Elf_Internal_Shdr * relsec;
7553 Elf_Internal_Rela * rela;
7554 Elf_Internal_Rela * rp;
7555 unsigned char * table;
7556 unsigned char * tp;
7557 Elf_Internal_Sym * sym;
7558 const char * relname;
7559
7560 aux->table_len = 0;
7561
7562 /* First, find the starting address of the segment that includes
7563 this section: */
7564
7565 if (filedata->file_header.e_phnum)
7566 {
7567 if (! get_program_headers (filedata))
7568 return FALSE;
7569
7570 for (seg = filedata->program_headers;
7571 seg < filedata->program_headers + filedata->file_header.e_phnum;
7572 ++seg)
7573 {
7574 if (seg->p_type != PT_LOAD)
7575 continue;
7576
7577 if (sec->sh_addr >= seg->p_vaddr
7578 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7579 {
7580 aux->seg_base = seg->p_vaddr;
7581 break;
7582 }
7583 }
7584 }
7585
7586 /* Second, build the unwind table from the contents of the unwind section: */
7587 size = sec->sh_size;
7588 table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
7589 _("unwind table"));
7590 if (!table)
7591 return FALSE;
7592
7593 aux->table_len = size / (3 * eh_addr_size);
7594 aux->table = (struct ia64_unw_table_entry *)
7595 xcmalloc (aux->table_len, sizeof (aux->table[0]));
7596 tep = aux->table;
7597
7598 for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
7599 {
7600 tep->start.section = SHN_UNDEF;
7601 tep->end.section = SHN_UNDEF;
7602 tep->info.section = SHN_UNDEF;
7603 tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7604 tep->end.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7605 tep->info.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7606 tep->start.offset += aux->seg_base;
7607 tep->end.offset += aux->seg_base;
7608 tep->info.offset += aux->seg_base;
7609 }
7610 free (table);
7611
7612 /* Third, apply any relocations to the unwind table: */
7613 for (relsec = filedata->section_headers;
7614 relsec < filedata->section_headers + filedata->file_header.e_shnum;
7615 ++relsec)
7616 {
7617 if (relsec->sh_type != SHT_RELA
7618 || relsec->sh_info >= filedata->file_header.e_shnum
7619 || filedata->section_headers + relsec->sh_info != sec)
7620 continue;
7621
7622 if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
7623 & rela, & nrelas))
7624 {
7625 free (aux->table);
7626 aux->table = NULL;
7627 aux->table_len = 0;
7628 return FALSE;
7629 }
7630
7631 for (rp = rela; rp < rela + nrelas; ++rp)
7632 {
7633 unsigned int sym_ndx;
7634 unsigned int r_type = get_reloc_type (filedata, rp->r_info);
7635 relname = elf_ia64_reloc_type (r_type);
7636
7637 /* PR 17531: file: 9fa67536. */
7638 if (relname == NULL)
7639 {
7640 warn (_("Skipping unknown relocation type: %u\n"), r_type);
7641 continue;
7642 }
7643
7644 if (! const_strneq (relname, "R_IA64_SEGREL"))
7645 {
7646 warn (_("Skipping unexpected relocation type: %s\n"), relname);
7647 continue;
7648 }
7649
7650 i = rp->r_offset / (3 * eh_addr_size);
7651
7652 /* PR 17531: file: 5bc8d9bf. */
7653 if (i >= aux->table_len)
7654 {
7655 warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
7656 continue;
7657 }
7658
7659 sym_ndx = get_reloc_symindex (rp->r_info);
7660 if (sym_ndx >= aux->nsyms)
7661 {
7662 warn (_("Skipping reloc with invalid symbol index: %u\n"),
7663 sym_ndx);
7664 continue;
7665 }
7666 sym = aux->symtab + sym_ndx;
7667
7668 switch (rp->r_offset / eh_addr_size % 3)
7669 {
7670 case 0:
7671 aux->table[i].start.section = sym->st_shndx;
7672 aux->table[i].start.offset = rp->r_addend + sym->st_value;
7673 break;
7674 case 1:
7675 aux->table[i].end.section = sym->st_shndx;
7676 aux->table[i].end.offset = rp->r_addend + sym->st_value;
7677 break;
7678 case 2:
7679 aux->table[i].info.section = sym->st_shndx;
7680 aux->table[i].info.offset = rp->r_addend + sym->st_value;
7681 break;
7682 default:
7683 break;
7684 }
7685 }
7686
7687 free (rela);
7688 }
7689
7690 return TRUE;
7691 }
7692
7693 static bfd_boolean
7694 ia64_process_unwind (Filedata * filedata)
7695 {
7696 Elf_Internal_Shdr * sec;
7697 Elf_Internal_Shdr * unwsec = NULL;
7698 Elf_Internal_Shdr * strsec;
7699 unsigned long i, unwcount = 0, unwstart = 0;
7700 struct ia64_unw_aux_info aux;
7701 bfd_boolean res = TRUE;
7702
7703 memset (& aux, 0, sizeof (aux));
7704
7705 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
7706 {
7707 if (sec->sh_type == SHT_SYMTAB
7708 && sec->sh_link < filedata->file_header.e_shnum)
7709 {
7710 aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
7711
7712 strsec = filedata->section_headers + sec->sh_link;
7713 if (aux.strtab != NULL)
7714 {
7715 error (_("Multiple auxillary string tables encountered\n"));
7716 free (aux.strtab);
7717 res = FALSE;
7718 }
7719 aux.strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
7720 1, strsec->sh_size,
7721 _("string table"));
7722 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7723 }
7724 else if (sec->sh_type == SHT_IA_64_UNWIND)
7725 unwcount++;
7726 }
7727
7728 if (!unwcount)
7729 printf (_("\nThere are no unwind sections in this file.\n"));
7730
7731 while (unwcount-- > 0)
7732 {
7733 char * suffix;
7734 size_t len, len2;
7735
7736 for (i = unwstart, sec = filedata->section_headers + unwstart, unwsec = NULL;
7737 i < filedata->file_header.e_shnum; ++i, ++sec)
7738 if (sec->sh_type == SHT_IA_64_UNWIND)
7739 {
7740 unwsec = sec;
7741 break;
7742 }
7743 /* We have already counted the number of SHT_IA64_UNWIND
7744 sections so the loop above should never fail. */
7745 assert (unwsec != NULL);
7746
7747 unwstart = i + 1;
7748 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
7749
7750 if ((unwsec->sh_flags & SHF_GROUP) != 0)
7751 {
7752 /* We need to find which section group it is in. */
7753 struct group_list * g;
7754
7755 if (section_headers_groups == NULL
7756 || section_headers_groups [i] == NULL)
7757 i = filedata->file_header.e_shnum;
7758 else
7759 {
7760 g = section_headers_groups [i]->root;
7761
7762 for (; g != NULL; g = g->next)
7763 {
7764 sec = filedata->section_headers + g->section_index;
7765
7766 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
7767 break;
7768 }
7769
7770 if (g == NULL)
7771 i = filedata->file_header.e_shnum;
7772 }
7773 }
7774 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
7775 {
7776 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
7777 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
7778 suffix = SECTION_NAME (unwsec) + len;
7779 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum;
7780 ++i, ++sec)
7781 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
7782 && streq (SECTION_NAME (sec) + len2, suffix))
7783 break;
7784 }
7785 else
7786 {
7787 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
7788 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
7789 len = sizeof (ELF_STRING_ia64_unwind) - 1;
7790 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
7791 suffix = "";
7792 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
7793 suffix = SECTION_NAME (unwsec) + len;
7794 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum;
7795 ++i, ++sec)
7796 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
7797 && streq (SECTION_NAME (sec) + len2, suffix))
7798 break;
7799 }
7800
7801 if (i == filedata->file_header.e_shnum)
7802 {
7803 printf (_("\nCould not find unwind info section for "));
7804
7805 if (filedata->string_table == NULL)
7806 printf ("%d", unwsec->sh_name);
7807 else
7808 printf ("'%s'", printable_section_name (filedata, unwsec));
7809 }
7810 else
7811 {
7812 aux.info_addr = sec->sh_addr;
7813 aux.info = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1,
7814 sec->sh_size,
7815 _("unwind info"));
7816 aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
7817
7818 printf (_("\nUnwind section "));
7819
7820 if (filedata->string_table == NULL)
7821 printf ("%d", unwsec->sh_name);
7822 else
7823 printf ("'%s'", printable_section_name (filedata, unwsec));
7824
7825 printf (_(" at offset 0x%lx contains %lu entries:\n"),
7826 (unsigned long) unwsec->sh_offset,
7827 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
7828
7829 if (slurp_ia64_unwind_table (filedata, & aux, unwsec)
7830 && aux.table_len > 0)
7831 dump_ia64_unwind (filedata, & aux);
7832
7833 if (aux.table)
7834 free ((char *) aux.table);
7835 if (aux.info)
7836 free ((char *) aux.info);
7837 aux.table = NULL;
7838 aux.info = NULL;
7839 }
7840 }
7841
7842 if (aux.symtab)
7843 free (aux.symtab);
7844 if (aux.strtab)
7845 free ((char *) aux.strtab);
7846
7847 return res;
7848 }
7849
7850 struct hppa_unw_table_entry
7851 {
7852 struct absaddr start;
7853 struct absaddr end;
7854 unsigned int Cannot_unwind:1; /* 0 */
7855 unsigned int Millicode:1; /* 1 */
7856 unsigned int Millicode_save_sr0:1; /* 2 */
7857 unsigned int Region_description:2; /* 3..4 */
7858 unsigned int reserved1:1; /* 5 */
7859 unsigned int Entry_SR:1; /* 6 */
7860 unsigned int Entry_FR:4; /* Number saved 7..10 */
7861 unsigned int Entry_GR:5; /* Number saved 11..15 */
7862 unsigned int Args_stored:1; /* 16 */
7863 unsigned int Variable_Frame:1; /* 17 */
7864 unsigned int Separate_Package_Body:1; /* 18 */
7865 unsigned int Frame_Extension_Millicode:1; /* 19 */
7866 unsigned int Stack_Overflow_Check:1; /* 20 */
7867 unsigned int Two_Instruction_SP_Increment:1; /* 21 */
7868 unsigned int Ada_Region:1; /* 22 */
7869 unsigned int cxx_info:1; /* 23 */
7870 unsigned int cxx_try_catch:1; /* 24 */
7871 unsigned int sched_entry_seq:1; /* 25 */
7872 unsigned int reserved2:1; /* 26 */
7873 unsigned int Save_SP:1; /* 27 */
7874 unsigned int Save_RP:1; /* 28 */
7875 unsigned int Save_MRP_in_frame:1; /* 29 */
7876 unsigned int extn_ptr_defined:1; /* 30 */
7877 unsigned int Cleanup_defined:1; /* 31 */
7878
7879 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
7880 unsigned int HP_UX_interrupt_marker:1; /* 1 */
7881 unsigned int Large_frame:1; /* 2 */
7882 unsigned int Pseudo_SP_Set:1; /* 3 */
7883 unsigned int reserved4:1; /* 4 */
7884 unsigned int Total_frame_size:27; /* 5..31 */
7885 };
7886
7887 struct hppa_unw_aux_info
7888 {
7889 struct hppa_unw_table_entry * table; /* Unwind table. */
7890 unsigned long table_len; /* Length of unwind table. */
7891 bfd_vma seg_base; /* Starting address of segment. */
7892 Elf_Internal_Sym * symtab; /* The symbol table. */
7893 unsigned long nsyms; /* Number of symbols. */
7894 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7895 unsigned long nfuns; /* Number of entries in funtab. */
7896 char * strtab; /* The string table. */
7897 unsigned long strtab_size; /* Size of string table. */
7898 };
7899
7900 static bfd_boolean
7901 dump_hppa_unwind (Filedata * filedata, struct hppa_unw_aux_info * aux)
7902 {
7903 struct hppa_unw_table_entry * tp;
7904 unsigned long j, nfuns;
7905 bfd_boolean res = TRUE;
7906
7907 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7908 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7909 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7910 aux->funtab[nfuns++] = aux->symtab[j];
7911 aux->nfuns = nfuns;
7912 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7913
7914 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7915 {
7916 bfd_vma offset;
7917 const char * procname;
7918
7919 find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
7920 aux->strtab_size, tp->start, &procname,
7921 &offset);
7922
7923 fputs ("\n<", stdout);
7924
7925 if (procname)
7926 {
7927 fputs (procname, stdout);
7928
7929 if (offset)
7930 printf ("+%lx", (unsigned long) offset);
7931 }
7932
7933 fputs (">: [", stdout);
7934 print_vma (tp->start.offset, PREFIX_HEX);
7935 fputc ('-', stdout);
7936 print_vma (tp->end.offset, PREFIX_HEX);
7937 printf ("]\n\t");
7938
7939 #define PF(_m) if (tp->_m) printf (#_m " ");
7940 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
7941 PF(Cannot_unwind);
7942 PF(Millicode);
7943 PF(Millicode_save_sr0);
7944 /* PV(Region_description); */
7945 PF(Entry_SR);
7946 PV(Entry_FR);
7947 PV(Entry_GR);
7948 PF(Args_stored);
7949 PF(Variable_Frame);
7950 PF(Separate_Package_Body);
7951 PF(Frame_Extension_Millicode);
7952 PF(Stack_Overflow_Check);
7953 PF(Two_Instruction_SP_Increment);
7954 PF(Ada_Region);
7955 PF(cxx_info);
7956 PF(cxx_try_catch);
7957 PF(sched_entry_seq);
7958 PF(Save_SP);
7959 PF(Save_RP);
7960 PF(Save_MRP_in_frame);
7961 PF(extn_ptr_defined);
7962 PF(Cleanup_defined);
7963 PF(MPE_XL_interrupt_marker);
7964 PF(HP_UX_interrupt_marker);
7965 PF(Large_frame);
7966 PF(Pseudo_SP_Set);
7967 PV(Total_frame_size);
7968 #undef PF
7969 #undef PV
7970 }
7971
7972 printf ("\n");
7973
7974 free (aux->funtab);
7975
7976 return res;
7977 }
7978
7979 static bfd_boolean
7980 slurp_hppa_unwind_table (Filedata * filedata,
7981 struct hppa_unw_aux_info * aux,
7982 Elf_Internal_Shdr * sec)
7983 {
7984 unsigned long size, unw_ent_size, nentries, nrelas, i;
7985 Elf_Internal_Phdr * seg;
7986 struct hppa_unw_table_entry * tep;
7987 Elf_Internal_Shdr * relsec;
7988 Elf_Internal_Rela * rela;
7989 Elf_Internal_Rela * rp;
7990 unsigned char * table;
7991 unsigned char * tp;
7992 Elf_Internal_Sym * sym;
7993 const char * relname;
7994
7995 /* First, find the starting address of the segment that includes
7996 this section. */
7997 if (filedata->file_header.e_phnum)
7998 {
7999 if (! get_program_headers (filedata))
8000 return FALSE;
8001
8002 for (seg = filedata->program_headers;
8003 seg < filedata->program_headers + filedata->file_header.e_phnum;
8004 ++seg)
8005 {
8006 if (seg->p_type != PT_LOAD)
8007 continue;
8008
8009 if (sec->sh_addr >= seg->p_vaddr
8010 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
8011 {
8012 aux->seg_base = seg->p_vaddr;
8013 break;
8014 }
8015 }
8016 }
8017
8018 /* Second, build the unwind table from the contents of the unwind
8019 section. */
8020 size = sec->sh_size;
8021 table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
8022 _("unwind table"));
8023 if (!table)
8024 return FALSE;
8025
8026 unw_ent_size = 16;
8027 nentries = size / unw_ent_size;
8028 size = unw_ent_size * nentries;
8029
8030 tep = aux->table = (struct hppa_unw_table_entry *)
8031 xcmalloc (nentries, sizeof (aux->table[0]));
8032
8033 for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
8034 {
8035 unsigned int tmp1, tmp2;
8036
8037 tep->start.section = SHN_UNDEF;
8038 tep->end.section = SHN_UNDEF;
8039
8040 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
8041 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
8042 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
8043 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
8044
8045 tep->start.offset += aux->seg_base;
8046 tep->end.offset += aux->seg_base;
8047
8048 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
8049 tep->Millicode = (tmp1 >> 30) & 0x1;
8050 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
8051 tep->Region_description = (tmp1 >> 27) & 0x3;
8052 tep->reserved1 = (tmp1 >> 26) & 0x1;
8053 tep->Entry_SR = (tmp1 >> 25) & 0x1;
8054 tep->Entry_FR = (tmp1 >> 21) & 0xf;
8055 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
8056 tep->Args_stored = (tmp1 >> 15) & 0x1;
8057 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
8058 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
8059 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
8060 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
8061 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
8062 tep->Ada_Region = (tmp1 >> 9) & 0x1;
8063 tep->cxx_info = (tmp1 >> 8) & 0x1;
8064 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
8065 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
8066 tep->reserved2 = (tmp1 >> 5) & 0x1;
8067 tep->Save_SP = (tmp1 >> 4) & 0x1;
8068 tep->Save_RP = (tmp1 >> 3) & 0x1;
8069 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
8070 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
8071 tep->Cleanup_defined = tmp1 & 0x1;
8072
8073 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
8074 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
8075 tep->Large_frame = (tmp2 >> 29) & 0x1;
8076 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
8077 tep->reserved4 = (tmp2 >> 27) & 0x1;
8078 tep->Total_frame_size = tmp2 & 0x7ffffff;
8079 }
8080 free (table);
8081
8082 /* Third, apply any relocations to the unwind table. */
8083 for (relsec = filedata->section_headers;
8084 relsec < filedata->section_headers + filedata->file_header.e_shnum;
8085 ++relsec)
8086 {
8087 if (relsec->sh_type != SHT_RELA
8088 || relsec->sh_info >= filedata->file_header.e_shnum
8089 || filedata->section_headers + relsec->sh_info != sec)
8090 continue;
8091
8092 if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
8093 & rela, & nrelas))
8094 return FALSE;
8095
8096 for (rp = rela; rp < rela + nrelas; ++rp)
8097 {
8098 unsigned int sym_ndx;
8099 unsigned int r_type = get_reloc_type (filedata, rp->r_info);
8100 relname = elf_hppa_reloc_type (r_type);
8101
8102 if (relname == NULL)
8103 {
8104 warn (_("Skipping unknown relocation type: %u\n"), r_type);
8105 continue;
8106 }
8107
8108 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
8109 if (! const_strneq (relname, "R_PARISC_SEGREL"))
8110 {
8111 warn (_("Skipping unexpected relocation type: %s\n"), relname);
8112 continue;
8113 }
8114
8115 i = rp->r_offset / unw_ent_size;
8116 if (i >= aux->table_len)
8117 {
8118 warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
8119 continue;
8120 }
8121
8122 sym_ndx = get_reloc_symindex (rp->r_info);
8123 if (sym_ndx >= aux->nsyms)
8124 {
8125 warn (_("Skipping reloc with invalid symbol index: %u\n"),
8126 sym_ndx);
8127 continue;
8128 }
8129 sym = aux->symtab + sym_ndx;
8130
8131 switch ((rp->r_offset % unw_ent_size) / 4)
8132 {
8133 case 0:
8134 aux->table[i].start.section = sym->st_shndx;
8135 aux->table[i].start.offset = sym->st_value + rp->r_addend;
8136 break;
8137 case 1:
8138 aux->table[i].end.section = sym->st_shndx;
8139 aux->table[i].end.offset = sym->st_value + rp->r_addend;
8140 break;
8141 default:
8142 break;
8143 }
8144 }
8145
8146 free (rela);
8147 }
8148
8149 aux->table_len = nentries;
8150
8151 return TRUE;
8152 }
8153
8154 static bfd_boolean
8155 hppa_process_unwind (Filedata * filedata)
8156 {
8157 struct hppa_unw_aux_info aux;
8158 Elf_Internal_Shdr * unwsec = NULL;
8159 Elf_Internal_Shdr * strsec;
8160 Elf_Internal_Shdr * sec;
8161 unsigned long i;
8162 bfd_boolean res = TRUE;
8163
8164 if (filedata->string_table == NULL)
8165 return FALSE;
8166
8167 memset (& aux, 0, sizeof (aux));
8168
8169 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
8170 {
8171 if (sec->sh_type == SHT_SYMTAB
8172 && sec->sh_link < filedata->file_header.e_shnum)
8173 {
8174 aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
8175
8176 strsec = filedata->section_headers + sec->sh_link;
8177 if (aux.strtab != NULL)
8178 {
8179 error (_("Multiple auxillary string tables encountered\n"));
8180 free (aux.strtab);
8181 res = FALSE;
8182 }
8183 aux.strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
8184 1, strsec->sh_size,
8185 _("string table"));
8186 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8187 }
8188 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
8189 unwsec = sec;
8190 }
8191
8192 if (!unwsec)
8193 printf (_("\nThere are no unwind sections in this file.\n"));
8194
8195 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
8196 {
8197 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
8198 {
8199 unsigned long num_unwind = sec->sh_size / 16;
8200
8201 printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
8202 "contains %lu entry:\n",
8203 "\nUnwind section '%s' at offset 0x%lx "
8204 "contains %lu entries:\n",
8205 num_unwind),
8206 printable_section_name (filedata, sec),
8207 (unsigned long) sec->sh_offset,
8208 num_unwind);
8209
8210 if (! slurp_hppa_unwind_table (filedata, &aux, sec))
8211 res = FALSE;
8212
8213 if (res && aux.table_len > 0)
8214 {
8215 if (! dump_hppa_unwind (filedata, &aux))
8216 res = FALSE;
8217 }
8218
8219 if (aux.table)
8220 free ((char *) aux.table);
8221 aux.table = NULL;
8222 }
8223 }
8224
8225 if (aux.symtab)
8226 free (aux.symtab);
8227 if (aux.strtab)
8228 free ((char *) aux.strtab);
8229
8230 return res;
8231 }
8232
8233 struct arm_section
8234 {
8235 unsigned char * data; /* The unwind data. */
8236 Elf_Internal_Shdr * sec; /* The cached unwind section header. */
8237 Elf_Internal_Rela * rela; /* The cached relocations for this section. */
8238 unsigned long nrelas; /* The number of relocations. */
8239 unsigned int rel_type; /* REL or RELA ? */
8240 Elf_Internal_Rela * next_rela; /* Cyclic pointer to the next reloc to process. */
8241 };
8242
8243 struct arm_unw_aux_info
8244 {
8245 Filedata * filedata; /* The file containing the unwind sections. */
8246 Elf_Internal_Sym * symtab; /* The file's symbol table. */
8247 unsigned long nsyms; /* Number of symbols. */
8248 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
8249 unsigned long nfuns; /* Number of these symbols. */
8250 char * strtab; /* The file's string table. */
8251 unsigned long strtab_size; /* Size of string table. */
8252 };
8253
8254 static const char *
8255 arm_print_vma_and_name (Filedata * filedata,
8256 struct arm_unw_aux_info * aux,
8257 bfd_vma fn,
8258 struct absaddr addr)
8259 {
8260 const char *procname;
8261 bfd_vma sym_offset;
8262
8263 if (addr.section == SHN_UNDEF)
8264 addr.offset = fn;
8265
8266 find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
8267 aux->strtab_size, addr, &procname,
8268 &sym_offset);
8269
8270 print_vma (fn, PREFIX_HEX);
8271
8272 if (procname)
8273 {
8274 fputs (" <", stdout);
8275 fputs (procname, stdout);
8276
8277 if (sym_offset)
8278 printf ("+0x%lx", (unsigned long) sym_offset);
8279 fputc ('>', stdout);
8280 }
8281
8282 return procname;
8283 }
8284
8285 static void
8286 arm_free_section (struct arm_section *arm_sec)
8287 {
8288 if (arm_sec->data != NULL)
8289 free (arm_sec->data);
8290
8291 if (arm_sec->rela != NULL)
8292 free (arm_sec->rela);
8293 }
8294
8295 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
8296 cached section and install SEC instead.
8297 2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
8298 and return its valued in * WORDP, relocating if necessary.
8299 3) Update the NEXT_RELA field in ARM_SEC and store the section index and
8300 relocation's offset in ADDR.
8301 4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
8302 into the string table of the symbol associated with the reloc. If no
8303 reloc was applied store -1 there.
8304 5) Return TRUE upon success, FALSE otherwise. */
8305
8306 static bfd_boolean
8307 get_unwind_section_word (Filedata * filedata,
8308 struct arm_unw_aux_info * aux,
8309 struct arm_section * arm_sec,
8310 Elf_Internal_Shdr * sec,
8311 bfd_vma word_offset,
8312 unsigned int * wordp,
8313 struct absaddr * addr,
8314 bfd_vma * sym_name)
8315 {
8316 Elf_Internal_Rela *rp;
8317 Elf_Internal_Sym *sym;
8318 const char * relname;
8319 unsigned int word;
8320 bfd_boolean wrapped;
8321
8322 if (sec == NULL || arm_sec == NULL)
8323 return FALSE;
8324
8325 addr->section = SHN_UNDEF;
8326 addr->offset = 0;
8327
8328 if (sym_name != NULL)
8329 *sym_name = (bfd_vma) -1;
8330
8331 /* If necessary, update the section cache. */
8332 if (sec != arm_sec->sec)
8333 {
8334 Elf_Internal_Shdr *relsec;
8335
8336 arm_free_section (arm_sec);
8337
8338 arm_sec->sec = sec;
8339 arm_sec->data = get_data (NULL, aux->filedata, sec->sh_offset, 1,
8340 sec->sh_size, _("unwind data"));
8341 arm_sec->rela = NULL;
8342 arm_sec->nrelas = 0;
8343
8344 for (relsec = filedata->section_headers;
8345 relsec < filedata->section_headers + filedata->file_header.e_shnum;
8346 ++relsec)
8347 {
8348 if (relsec->sh_info >= filedata->file_header.e_shnum
8349 || filedata->section_headers + relsec->sh_info != sec
8350 /* PR 15745: Check the section type as well. */
8351 || (relsec->sh_type != SHT_REL
8352 && relsec->sh_type != SHT_RELA))
8353 continue;
8354
8355 arm_sec->rel_type = relsec->sh_type;
8356 if (relsec->sh_type == SHT_REL)
8357 {
8358 if (!slurp_rel_relocs (aux->filedata, relsec->sh_offset,
8359 relsec->sh_size,
8360 & arm_sec->rela, & arm_sec->nrelas))
8361 return FALSE;
8362 }
8363 else /* relsec->sh_type == SHT_RELA */
8364 {
8365 if (!slurp_rela_relocs (aux->filedata, relsec->sh_offset,
8366 relsec->sh_size,
8367 & arm_sec->rela, & arm_sec->nrelas))
8368 return FALSE;
8369 }
8370 break;
8371 }
8372
8373 arm_sec->next_rela = arm_sec->rela;
8374 }
8375
8376 /* If there is no unwind data we can do nothing. */
8377 if (arm_sec->data == NULL)
8378 return FALSE;
8379
8380 /* If the offset is invalid then fail. */
8381 if (/* PR 21343 *//* PR 18879 */
8382 sec->sh_size < 4
8383 || word_offset > (sec->sh_size - 4)
8384 || ((bfd_signed_vma) word_offset) < 0)
8385 return FALSE;
8386
8387 /* Get the word at the required offset. */
8388 word = byte_get (arm_sec->data + word_offset, 4);
8389
8390 /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128. */
8391 if (arm_sec->rela == NULL)
8392 {
8393 * wordp = word;
8394 return TRUE;
8395 }
8396
8397 /* Look through the relocs to find the one that applies to the provided offset. */
8398 wrapped = FALSE;
8399 for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
8400 {
8401 bfd_vma prelval, offset;
8402
8403 if (rp->r_offset > word_offset && !wrapped)
8404 {
8405 rp = arm_sec->rela;
8406 wrapped = TRUE;
8407 }
8408 if (rp->r_offset > word_offset)
8409 break;
8410
8411 if (rp->r_offset & 3)
8412 {
8413 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
8414 (unsigned long) rp->r_offset);
8415 continue;
8416 }
8417
8418 if (rp->r_offset < word_offset)
8419 continue;
8420
8421 /* PR 17531: file: 027-161405-0.004 */
8422 if (aux->symtab == NULL)
8423 continue;
8424
8425 if (arm_sec->rel_type == SHT_REL)
8426 {
8427 offset = word & 0x7fffffff;
8428 if (offset & 0x40000000)
8429 offset |= ~ (bfd_vma) 0x7fffffff;
8430 }
8431 else if (arm_sec->rel_type == SHT_RELA)
8432 offset = rp->r_addend;
8433 else
8434 {
8435 error (_("Unknown section relocation type %d encountered\n"),
8436 arm_sec->rel_type);
8437 break;
8438 }
8439
8440 /* PR 17531 file: 027-1241568-0.004. */
8441 if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
8442 {
8443 error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
8444 (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
8445 break;
8446 }
8447
8448 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
8449 offset += sym->st_value;
8450 prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
8451
8452 /* Check that we are processing the expected reloc type. */
8453 if (filedata->file_header.e_machine == EM_ARM)
8454 {
8455 relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
8456 if (relname == NULL)
8457 {
8458 warn (_("Skipping unknown ARM relocation type: %d\n"),
8459 (int) ELF32_R_TYPE (rp->r_info));
8460 continue;
8461 }
8462
8463 if (streq (relname, "R_ARM_NONE"))
8464 continue;
8465
8466 if (! streq (relname, "R_ARM_PREL31"))
8467 {
8468 warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
8469 continue;
8470 }
8471 }
8472 else if (filedata->file_header.e_machine == EM_TI_C6000)
8473 {
8474 relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
8475 if (relname == NULL)
8476 {
8477 warn (_("Skipping unknown C6000 relocation type: %d\n"),
8478 (int) ELF32_R_TYPE (rp->r_info));
8479 continue;
8480 }
8481
8482 if (streq (relname, "R_C6000_NONE"))
8483 continue;
8484
8485 if (! streq (relname, "R_C6000_PREL31"))
8486 {
8487 warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
8488 continue;
8489 }
8490
8491 prelval >>= 1;
8492 }
8493 else
8494 {
8495 /* This function currently only supports ARM and TI unwinders. */
8496 warn (_("Only TI and ARM unwinders are currently supported\n"));
8497 break;
8498 }
8499
8500 word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
8501 addr->section = sym->st_shndx;
8502 addr->offset = offset;
8503
8504 if (sym_name)
8505 * sym_name = sym->st_name;
8506 break;
8507 }
8508
8509 *wordp = word;
8510 arm_sec->next_rela = rp;
8511
8512 return TRUE;
8513 }
8514
8515 static const char *tic6x_unwind_regnames[16] =
8516 {
8517 "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
8518 "A14", "A13", "A12", "A11", "A10",
8519 "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
8520 };
8521
8522 static void
8523 decode_tic6x_unwind_regmask (unsigned int mask)
8524 {
8525 int i;
8526
8527 for (i = 12; mask; mask >>= 1, i--)
8528 {
8529 if (mask & 1)
8530 {
8531 fputs (tic6x_unwind_regnames[i], stdout);
8532 if (mask > 1)
8533 fputs (", ", stdout);
8534 }
8535 }
8536 }
8537
8538 #define ADVANCE \
8539 if (remaining == 0 && more_words) \
8540 { \
8541 data_offset += 4; \
8542 if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec, \
8543 data_offset, & word, & addr, NULL)) \
8544 return FALSE; \
8545 remaining = 4; \
8546 more_words--; \
8547 } \
8548
8549 #define GET_OP(OP) \
8550 ADVANCE; \
8551 if (remaining) \
8552 { \
8553 remaining--; \
8554 (OP) = word >> 24; \
8555 word <<= 8; \
8556 } \
8557 else \
8558 { \
8559 printf (_("[Truncated opcode]\n")); \
8560 return FALSE; \
8561 } \
8562 printf ("0x%02x ", OP)
8563
8564 static bfd_boolean
8565 decode_arm_unwind_bytecode (Filedata * filedata,
8566 struct arm_unw_aux_info * aux,
8567 unsigned int word,
8568 unsigned int remaining,
8569 unsigned int more_words,
8570 bfd_vma data_offset,
8571 Elf_Internal_Shdr * data_sec,
8572 struct arm_section * data_arm_sec)
8573 {
8574 struct absaddr addr;
8575 bfd_boolean res = TRUE;
8576
8577 /* Decode the unwinding instructions. */
8578 while (1)
8579 {
8580 unsigned int op, op2;
8581
8582 ADVANCE;
8583 if (remaining == 0)
8584 break;
8585 remaining--;
8586 op = word >> 24;
8587 word <<= 8;
8588
8589 printf (" 0x%02x ", op);
8590
8591 if ((op & 0xc0) == 0x00)
8592 {
8593 int offset = ((op & 0x3f) << 2) + 4;
8594
8595 printf (" vsp = vsp + %d", offset);
8596 }
8597 else if ((op & 0xc0) == 0x40)
8598 {
8599 int offset = ((op & 0x3f) << 2) + 4;
8600
8601 printf (" vsp = vsp - %d", offset);
8602 }
8603 else if ((op & 0xf0) == 0x80)
8604 {
8605 GET_OP (op2);
8606 if (op == 0x80 && op2 == 0)
8607 printf (_("Refuse to unwind"));
8608 else
8609 {
8610 unsigned int mask = ((op & 0x0f) << 8) | op2;
8611 bfd_boolean first = TRUE;
8612 int i;
8613
8614 printf ("pop {");
8615 for (i = 0; i < 12; i++)
8616 if (mask & (1 << i))
8617 {
8618 if (first)
8619 first = FALSE;
8620 else
8621 printf (", ");
8622 printf ("r%d", 4 + i);
8623 }
8624 printf ("}");
8625 }
8626 }
8627 else if ((op & 0xf0) == 0x90)
8628 {
8629 if (op == 0x9d || op == 0x9f)
8630 printf (_(" [Reserved]"));
8631 else
8632 printf (" vsp = r%d", op & 0x0f);
8633 }
8634 else if ((op & 0xf0) == 0xa0)
8635 {
8636 int end = 4 + (op & 0x07);
8637 bfd_boolean first = TRUE;
8638 int i;
8639
8640 printf (" pop {");
8641 for (i = 4; i <= end; i++)
8642 {
8643 if (first)
8644 first = FALSE;
8645 else
8646 printf (", ");
8647 printf ("r%d", i);
8648 }
8649 if (op & 0x08)
8650 {
8651 if (!first)
8652 printf (", ");
8653 printf ("r14");
8654 }
8655 printf ("}");
8656 }
8657 else if (op == 0xb0)
8658 printf (_(" finish"));
8659 else if (op == 0xb1)
8660 {
8661 GET_OP (op2);
8662 if (op2 == 0 || (op2 & 0xf0) != 0)
8663 printf (_("[Spare]"));
8664 else
8665 {
8666 unsigned int mask = op2 & 0x0f;
8667 bfd_boolean first = TRUE;
8668 int i;
8669
8670 printf ("pop {");
8671 for (i = 0; i < 12; i++)
8672 if (mask & (1 << i))
8673 {
8674 if (first)
8675 first = FALSE;
8676 else
8677 printf (", ");
8678 printf ("r%d", i);
8679 }
8680 printf ("}");
8681 }
8682 }
8683 else if (op == 0xb2)
8684 {
8685 unsigned char buf[9];
8686 unsigned int i, len;
8687 unsigned long offset;
8688
8689 for (i = 0; i < sizeof (buf); i++)
8690 {
8691 GET_OP (buf[i]);
8692 if ((buf[i] & 0x80) == 0)
8693 break;
8694 }
8695 if (i == sizeof (buf))
8696 {
8697 error (_("corrupt change to vsp"));
8698 res = FALSE;
8699 }
8700 else
8701 {
8702 offset = read_uleb128 (buf, &len, buf + i + 1);
8703 assert (len == i + 1);
8704 offset = offset * 4 + 0x204;
8705 printf ("vsp = vsp + %ld", offset);
8706 }
8707 }
8708 else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
8709 {
8710 unsigned int first, last;
8711
8712 GET_OP (op2);
8713 first = op2 >> 4;
8714 last = op2 & 0x0f;
8715 if (op == 0xc8)
8716 first = first + 16;
8717 printf ("pop {D%d", first);
8718 if (last)
8719 printf ("-D%d", first + last);
8720 printf ("}");
8721 }
8722 else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
8723 {
8724 unsigned int count = op & 0x07;
8725
8726 printf ("pop {D8");
8727 if (count)
8728 printf ("-D%d", 8 + count);
8729 printf ("}");
8730 }
8731 else if (op >= 0xc0 && op <= 0xc5)
8732 {
8733 unsigned int count = op & 0x07;
8734
8735 printf (" pop {wR10");
8736 if (count)
8737 printf ("-wR%d", 10 + count);
8738 printf ("}");
8739 }
8740 else if (op == 0xc6)
8741 {
8742 unsigned int first, last;
8743
8744 GET_OP (op2);
8745 first = op2 >> 4;
8746 last = op2 & 0x0f;
8747 printf ("pop {wR%d", first);
8748 if (last)
8749 printf ("-wR%d", first + last);
8750 printf ("}");
8751 }
8752 else if (op == 0xc7)
8753 {
8754 GET_OP (op2);
8755 if (op2 == 0 || (op2 & 0xf0) != 0)
8756 printf (_("[Spare]"));
8757 else
8758 {
8759 unsigned int mask = op2 & 0x0f;
8760 bfd_boolean first = TRUE;
8761 int i;
8762
8763 printf ("pop {");
8764 for (i = 0; i < 4; i++)
8765 if (mask & (1 << i))
8766 {
8767 if (first)
8768 first = FALSE;
8769 else
8770 printf (", ");
8771 printf ("wCGR%d", i);
8772 }
8773 printf ("}");
8774 }
8775 }
8776 else
8777 {
8778 printf (_(" [unsupported opcode]"));
8779 res = FALSE;
8780 }
8781
8782 printf ("\n");
8783 }
8784
8785 return res;
8786 }
8787
8788 static bfd_boolean
8789 decode_tic6x_unwind_bytecode (Filedata * filedata,
8790 struct arm_unw_aux_info * aux,
8791 unsigned int word,
8792 unsigned int remaining,
8793 unsigned int more_words,
8794 bfd_vma data_offset,
8795 Elf_Internal_Shdr * data_sec,
8796 struct arm_section * data_arm_sec)
8797 {
8798 struct absaddr addr;
8799
8800 /* Decode the unwinding instructions. */
8801 while (1)
8802 {
8803 unsigned int op, op2;
8804
8805 ADVANCE;
8806 if (remaining == 0)
8807 break;
8808 remaining--;
8809 op = word >> 24;
8810 word <<= 8;
8811
8812 printf (" 0x%02x ", op);
8813
8814 if ((op & 0xc0) == 0x00)
8815 {
8816 int offset = ((op & 0x3f) << 3) + 8;
8817 printf (" sp = sp + %d", offset);
8818 }
8819 else if ((op & 0xc0) == 0x80)
8820 {
8821 GET_OP (op2);
8822 if (op == 0x80 && op2 == 0)
8823 printf (_("Refuse to unwind"));
8824 else
8825 {
8826 unsigned int mask = ((op & 0x1f) << 8) | op2;
8827 if (op & 0x20)
8828 printf ("pop compact {");
8829 else
8830 printf ("pop {");
8831
8832 decode_tic6x_unwind_regmask (mask);
8833 printf("}");
8834 }
8835 }
8836 else if ((op & 0xf0) == 0xc0)
8837 {
8838 unsigned int reg;
8839 unsigned int nregs;
8840 unsigned int i;
8841 const char *name;
8842 struct
8843 {
8844 unsigned int offset;
8845 unsigned int reg;
8846 } regpos[16];
8847
8848 /* Scan entire instruction first so that GET_OP output is not
8849 interleaved with disassembly. */
8850 nregs = 0;
8851 for (i = 0; nregs < (op & 0xf); i++)
8852 {
8853 GET_OP (op2);
8854 reg = op2 >> 4;
8855 if (reg != 0xf)
8856 {
8857 regpos[nregs].offset = i * 2;
8858 regpos[nregs].reg = reg;
8859 nregs++;
8860 }
8861
8862 reg = op2 & 0xf;
8863 if (reg != 0xf)
8864 {
8865 regpos[nregs].offset = i * 2 + 1;
8866 regpos[nregs].reg = reg;
8867 nregs++;
8868 }
8869 }
8870
8871 printf (_("pop frame {"));
8872 if (nregs == 0)
8873 {
8874 printf (_("*corrupt* - no registers specified"));
8875 }
8876 else
8877 {
8878 reg = nregs - 1;
8879 for (i = i * 2; i > 0; i--)
8880 {
8881 if (regpos[reg].offset == i - 1)
8882 {
8883 name = tic6x_unwind_regnames[regpos[reg].reg];
8884 if (reg > 0)
8885 reg--;
8886 }
8887 else
8888 name = _("[pad]");
8889
8890 fputs (name, stdout);
8891 if (i > 1)
8892 printf (", ");
8893 }
8894 }
8895
8896 printf ("}");
8897 }
8898 else if (op == 0xd0)
8899 printf (" MOV FP, SP");
8900 else if (op == 0xd1)
8901 printf (" __c6xabi_pop_rts");
8902 else if (op == 0xd2)
8903 {
8904 unsigned char buf[9];
8905 unsigned int i, len;
8906 unsigned long offset;
8907
8908 for (i = 0; i < sizeof (buf); i++)
8909 {
8910 GET_OP (buf[i]);
8911 if ((buf[i] & 0x80) == 0)
8912 break;
8913 }
8914 /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2. */
8915 if (i == sizeof (buf))
8916 {
8917 warn (_("Corrupt stack pointer adjustment detected\n"));
8918 return FALSE;
8919 }
8920
8921 offset = read_uleb128 (buf, &len, buf + i + 1);
8922 assert (len == i + 1);
8923 offset = offset * 8 + 0x408;
8924 printf (_("sp = sp + %ld"), offset);
8925 }
8926 else if ((op & 0xf0) == 0xe0)
8927 {
8928 if ((op & 0x0f) == 7)
8929 printf (" RETURN");
8930 else
8931 printf (" MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
8932 }
8933 else
8934 {
8935 printf (_(" [unsupported opcode]"));
8936 }
8937 putchar ('\n');
8938 }
8939
8940 return TRUE;
8941 }
8942
8943 static bfd_vma
8944 arm_expand_prel31 (Filedata * filedata, bfd_vma word, bfd_vma where)
8945 {
8946 bfd_vma offset;
8947
8948 offset = word & 0x7fffffff;
8949 if (offset & 0x40000000)
8950 offset |= ~ (bfd_vma) 0x7fffffff;
8951
8952 if (filedata->file_header.e_machine == EM_TI_C6000)
8953 offset <<= 1;
8954
8955 return offset + where;
8956 }
8957
8958 static bfd_boolean
8959 decode_arm_unwind (Filedata * filedata,
8960 struct arm_unw_aux_info * aux,
8961 unsigned int word,
8962 unsigned int remaining,
8963 bfd_vma data_offset,
8964 Elf_Internal_Shdr * data_sec,
8965 struct arm_section * data_arm_sec)
8966 {
8967 int per_index;
8968 unsigned int more_words = 0;
8969 struct absaddr addr;
8970 bfd_vma sym_name = (bfd_vma) -1;
8971 bfd_boolean res = TRUE;
8972
8973 if (remaining == 0)
8974 {
8975 /* Fetch the first word.
8976 Note - when decoding an object file the address extracted
8977 here will always be 0. So we also pass in the sym_name
8978 parameter so that we can find the symbol associated with
8979 the personality routine. */
8980 if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec, data_offset,
8981 & word, & addr, & sym_name))
8982 return FALSE;
8983
8984 remaining = 4;
8985 }
8986
8987 if ((word & 0x80000000) == 0)
8988 {
8989 /* Expand prel31 for personality routine. */
8990 bfd_vma fn;
8991 const char *procname;
8992
8993 fn = arm_expand_prel31 (filedata, word, data_sec->sh_addr + data_offset);
8994 printf (_(" Personality routine: "));
8995 if (fn == 0
8996 && addr.section == SHN_UNDEF && addr.offset == 0
8997 && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
8998 {
8999 procname = aux->strtab + sym_name;
9000 print_vma (fn, PREFIX_HEX);
9001 if (procname)
9002 {
9003 fputs (" <", stdout);
9004 fputs (procname, stdout);
9005 fputc ('>', stdout);
9006 }
9007 }
9008 else
9009 procname = arm_print_vma_and_name (filedata, aux, fn, addr);
9010 fputc ('\n', stdout);
9011
9012 /* The GCC personality routines use the standard compact
9013 encoding, starting with one byte giving the number of
9014 words. */
9015 if (procname != NULL
9016 && (const_strneq (procname, "__gcc_personality_v0")
9017 || const_strneq (procname, "__gxx_personality_v0")
9018 || const_strneq (procname, "__gcj_personality_v0")
9019 || const_strneq (procname, "__gnu_objc_personality_v0")))
9020 {
9021 remaining = 0;
9022 more_words = 1;
9023 ADVANCE;
9024 if (!remaining)
9025 {
9026 printf (_(" [Truncated data]\n"));
9027 return FALSE;
9028 }
9029 more_words = word >> 24;
9030 word <<= 8;
9031 remaining--;
9032 per_index = -1;
9033 }
9034 else
9035 return TRUE;
9036 }
9037 else
9038 {
9039 /* ARM EHABI Section 6.3:
9040
9041 An exception-handling table entry for the compact model looks like:
9042
9043 31 30-28 27-24 23-0
9044 -- ----- ----- ----
9045 1 0 index Data for personalityRoutine[index] */
9046
9047 if (filedata->file_header.e_machine == EM_ARM
9048 && (word & 0x70000000))
9049 {
9050 warn (_("Corrupt ARM compact model table entry: %x \n"), word);
9051 res = FALSE;
9052 }
9053
9054 per_index = (word >> 24) & 0x7f;
9055 printf (_(" Compact model index: %d\n"), per_index);
9056 if (per_index == 0)
9057 {
9058 more_words = 0;
9059 word <<= 8;
9060 remaining--;
9061 }
9062 else if (per_index < 3)
9063 {
9064 more_words = (word >> 16) & 0xff;
9065 word <<= 16;
9066 remaining -= 2;
9067 }
9068 }
9069
9070 switch (filedata->file_header.e_machine)
9071 {
9072 case EM_ARM:
9073 if (per_index < 3)
9074 {
9075 if (! decode_arm_unwind_bytecode (filedata, aux, word, remaining, more_words,
9076 data_offset, data_sec, data_arm_sec))
9077 res = FALSE;
9078 }
9079 else
9080 {
9081 warn (_("Unknown ARM compact model index encountered\n"));
9082 printf (_(" [reserved]\n"));
9083 res = FALSE;
9084 }
9085 break;
9086
9087 case EM_TI_C6000:
9088 if (per_index < 3)
9089 {
9090 if (! decode_tic6x_unwind_bytecode (filedata, aux, word, remaining, more_words,
9091 data_offset, data_sec, data_arm_sec))
9092 res = FALSE;
9093 }
9094 else if (per_index < 5)
9095 {
9096 if (((word >> 17) & 0x7f) == 0x7f)
9097 printf (_(" Restore stack from frame pointer\n"));
9098 else
9099 printf (_(" Stack increment %d\n"), (word >> 14) & 0x1fc);
9100 printf (_(" Registers restored: "));
9101 if (per_index == 4)
9102 printf (" (compact) ");
9103 decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
9104 putchar ('\n');
9105 printf (_(" Return register: %s\n"),
9106 tic6x_unwind_regnames[word & 0xf]);
9107 }
9108 else
9109 printf (_(" [reserved (%d)]\n"), per_index);
9110 break;
9111
9112 default:
9113 error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
9114 filedata->file_header.e_machine);
9115 res = FALSE;
9116 }
9117
9118 /* Decode the descriptors. Not implemented. */
9119
9120 return res;
9121 }
9122
9123 static bfd_boolean
9124 dump_arm_unwind (Filedata * filedata,
9125 struct arm_unw_aux_info * aux,
9126 Elf_Internal_Shdr * exidx_sec)
9127 {
9128 struct arm_section exidx_arm_sec, extab_arm_sec;
9129 unsigned int i, exidx_len;
9130 unsigned long j, nfuns;
9131 bfd_boolean res = TRUE;
9132
9133 memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
9134 memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
9135 exidx_len = exidx_sec->sh_size / 8;
9136
9137 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
9138 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
9139 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
9140 aux->funtab[nfuns++] = aux->symtab[j];
9141 aux->nfuns = nfuns;
9142 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
9143
9144 for (i = 0; i < exidx_len; i++)
9145 {
9146 unsigned int exidx_fn, exidx_entry;
9147 struct absaddr fn_addr, entry_addr;
9148 bfd_vma fn;
9149
9150 fputc ('\n', stdout);
9151
9152 if (! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
9153 8 * i, & exidx_fn, & fn_addr, NULL)
9154 || ! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
9155 8 * i + 4, & exidx_entry, & entry_addr, NULL))
9156 {
9157 free (aux->funtab);
9158 arm_free_section (& exidx_arm_sec);
9159 arm_free_section (& extab_arm_sec);
9160 return FALSE;
9161 }
9162
9163 /* ARM EHABI, Section 5:
9164 An index table entry consists of 2 words.
9165 The first word contains a prel31 offset to the start of a function, with bit 31 clear. */
9166 if (exidx_fn & 0x80000000)
9167 {
9168 warn (_("corrupt index table entry: %x\n"), exidx_fn);
9169 res = FALSE;
9170 }
9171
9172 fn = arm_expand_prel31 (filedata, exidx_fn, exidx_sec->sh_addr + 8 * i);
9173
9174 arm_print_vma_and_name (filedata, aux, fn, fn_addr);
9175 fputs (": ", stdout);
9176
9177 if (exidx_entry == 1)
9178 {
9179 print_vma (exidx_entry, PREFIX_HEX);
9180 fputs (" [cantunwind]\n", stdout);
9181 }
9182 else if (exidx_entry & 0x80000000)
9183 {
9184 print_vma (exidx_entry, PREFIX_HEX);
9185 fputc ('\n', stdout);
9186 decode_arm_unwind (filedata, aux, exidx_entry, 4, 0, NULL, NULL);
9187 }
9188 else
9189 {
9190 bfd_vma table, table_offset = 0;
9191 Elf_Internal_Shdr *table_sec;
9192
9193 fputs ("@", stdout);
9194 table = arm_expand_prel31 (filedata, exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
9195 print_vma (table, PREFIX_HEX);
9196 printf ("\n");
9197
9198 /* Locate the matching .ARM.extab. */
9199 if (entry_addr.section != SHN_UNDEF
9200 && entry_addr.section < filedata->file_header.e_shnum)
9201 {
9202 table_sec = filedata->section_headers + entry_addr.section;
9203 table_offset = entry_addr.offset;
9204 /* PR 18879 */
9205 if (table_offset > table_sec->sh_size
9206 || ((bfd_signed_vma) table_offset) < 0)
9207 {
9208 warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
9209 (unsigned long) table_offset,
9210 printable_section_name (filedata, table_sec));
9211 res = FALSE;
9212 continue;
9213 }
9214 }
9215 else
9216 {
9217 table_sec = find_section_by_address (filedata, table);
9218 if (table_sec != NULL)
9219 table_offset = table - table_sec->sh_addr;
9220 }
9221
9222 if (table_sec == NULL)
9223 {
9224 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
9225 (unsigned long) table);
9226 res = FALSE;
9227 continue;
9228 }
9229
9230 if (! decode_arm_unwind (filedata, aux, 0, 0, table_offset, table_sec,
9231 &extab_arm_sec))
9232 res = FALSE;
9233 }
9234 }
9235
9236 printf ("\n");
9237
9238 free (aux->funtab);
9239 arm_free_section (&exidx_arm_sec);
9240 arm_free_section (&extab_arm_sec);
9241
9242 return res;
9243 }
9244
9245 /* Used for both ARM and C6X unwinding tables. */
9246
9247 static bfd_boolean
9248 arm_process_unwind (Filedata * filedata)
9249 {
9250 struct arm_unw_aux_info aux;
9251 Elf_Internal_Shdr *unwsec = NULL;
9252 Elf_Internal_Shdr *strsec;
9253 Elf_Internal_Shdr *sec;
9254 unsigned long i;
9255 unsigned int sec_type;
9256 bfd_boolean res = TRUE;
9257
9258 switch (filedata->file_header.e_machine)
9259 {
9260 case EM_ARM:
9261 sec_type = SHT_ARM_EXIDX;
9262 break;
9263
9264 case EM_TI_C6000:
9265 sec_type = SHT_C6000_UNWIND;
9266 break;
9267
9268 default:
9269 error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
9270 filedata->file_header.e_machine);
9271 return FALSE;
9272 }
9273
9274 if (filedata->string_table == NULL)
9275 return FALSE;
9276
9277 memset (& aux, 0, sizeof (aux));
9278 aux.filedata = filedata;
9279
9280 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
9281 {
9282 if (sec->sh_type == SHT_SYMTAB && sec->sh_link < filedata->file_header.e_shnum)
9283 {
9284 aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
9285
9286 strsec = filedata->section_headers + sec->sh_link;
9287
9288 /* PR binutils/17531 file: 011-12666-0.004. */
9289 if (aux.strtab != NULL)
9290 {
9291 error (_("Multiple string tables found in file.\n"));
9292 free (aux.strtab);
9293 res = FALSE;
9294 }
9295 aux.strtab = get_data (NULL, filedata, strsec->sh_offset,
9296 1, strsec->sh_size, _("string table"));
9297 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
9298 }
9299 else if (sec->sh_type == sec_type)
9300 unwsec = sec;
9301 }
9302
9303 if (unwsec == NULL)
9304 printf (_("\nThere are no unwind sections in this file.\n"));
9305 else
9306 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
9307 {
9308 if (sec->sh_type == sec_type)
9309 {
9310 unsigned long num_unwind = sec->sh_size / (2 * eh_addr_size);
9311 printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
9312 "contains %lu entry:\n",
9313 "\nUnwind section '%s' at offset 0x%lx "
9314 "contains %lu entries:\n",
9315 num_unwind),
9316 printable_section_name (filedata, sec),
9317 (unsigned long) sec->sh_offset,
9318 num_unwind);
9319
9320 if (! dump_arm_unwind (filedata, &aux, sec))
9321 res = FALSE;
9322 }
9323 }
9324
9325 if (aux.symtab)
9326 free (aux.symtab);
9327 if (aux.strtab)
9328 free ((char *) aux.strtab);
9329
9330 return res;
9331 }
9332
9333 static bfd_boolean
9334 process_unwind (Filedata * filedata)
9335 {
9336 struct unwind_handler
9337 {
9338 unsigned int machtype;
9339 bfd_boolean (* handler)(Filedata *);
9340 } handlers[] =
9341 {
9342 { EM_ARM, arm_process_unwind },
9343 { EM_IA_64, ia64_process_unwind },
9344 { EM_PARISC, hppa_process_unwind },
9345 { EM_TI_C6000, arm_process_unwind },
9346 { 0, NULL }
9347 };
9348 int i;
9349
9350 if (!do_unwind)
9351 return TRUE;
9352
9353 for (i = 0; handlers[i].handler != NULL; i++)
9354 if (filedata->file_header.e_machine == handlers[i].machtype)
9355 return handlers[i].handler (filedata);
9356
9357 printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
9358 get_machine_name (filedata->file_header.e_machine));
9359 return TRUE;
9360 }
9361
9362 static void
9363 dynamic_section_aarch64_val (Elf_Internal_Dyn * entry)
9364 {
9365 switch (entry->d_tag)
9366 {
9367 case DT_AARCH64_BTI_PLT:
9368 case DT_AARCH64_PAC_PLT:
9369 break;
9370 default:
9371 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9372 break;
9373 }
9374 putchar ('\n');
9375 }
9376
9377 static void
9378 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
9379 {
9380 switch (entry->d_tag)
9381 {
9382 case DT_MIPS_FLAGS:
9383 if (entry->d_un.d_val == 0)
9384 printf (_("NONE"));
9385 else
9386 {
9387 static const char * opts[] =
9388 {
9389 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
9390 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
9391 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
9392 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
9393 "RLD_ORDER_SAFE"
9394 };
9395 unsigned int cnt;
9396 bfd_boolean first = TRUE;
9397
9398 for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
9399 if (entry->d_un.d_val & (1 << cnt))
9400 {
9401 printf ("%s%s", first ? "" : " ", opts[cnt]);
9402 first = FALSE;
9403 }
9404 }
9405 break;
9406
9407 case DT_MIPS_IVERSION:
9408 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9409 printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
9410 else
9411 {
9412 char buf[40];
9413 sprintf_vma (buf, entry->d_un.d_ptr);
9414 /* Note: coded this way so that there is a single string for translation. */
9415 printf (_("<corrupt: %s>"), buf);
9416 }
9417 break;
9418
9419 case DT_MIPS_TIME_STAMP:
9420 {
9421 char timebuf[128];
9422 struct tm * tmp;
9423 time_t atime = entry->d_un.d_val;
9424
9425 tmp = gmtime (&atime);
9426 /* PR 17531: file: 6accc532. */
9427 if (tmp == NULL)
9428 snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
9429 else
9430 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
9431 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9432 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9433 printf (_("Time Stamp: %s"), timebuf);
9434 }
9435 break;
9436
9437 case DT_MIPS_RLD_VERSION:
9438 case DT_MIPS_LOCAL_GOTNO:
9439 case DT_MIPS_CONFLICTNO:
9440 case DT_MIPS_LIBLISTNO:
9441 case DT_MIPS_SYMTABNO:
9442 case DT_MIPS_UNREFEXTNO:
9443 case DT_MIPS_HIPAGENO:
9444 case DT_MIPS_DELTA_CLASS_NO:
9445 case DT_MIPS_DELTA_INSTANCE_NO:
9446 case DT_MIPS_DELTA_RELOC_NO:
9447 case DT_MIPS_DELTA_SYM_NO:
9448 case DT_MIPS_DELTA_CLASSSYM_NO:
9449 case DT_MIPS_COMPACT_SIZE:
9450 print_vma (entry->d_un.d_val, DEC);
9451 break;
9452
9453 default:
9454 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9455 }
9456 putchar ('\n');
9457 }
9458
9459 static void
9460 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
9461 {
9462 switch (entry->d_tag)
9463 {
9464 case DT_HP_DLD_FLAGS:
9465 {
9466 static struct
9467 {
9468 long int bit;
9469 const char * str;
9470 }
9471 flags[] =
9472 {
9473 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
9474 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
9475 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
9476 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
9477 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
9478 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
9479 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
9480 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
9481 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
9482 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
9483 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
9484 { DT_HP_GST, "HP_GST" },
9485 { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
9486 { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
9487 { DT_HP_NODELETE, "HP_NODELETE" },
9488 { DT_HP_GROUP, "HP_GROUP" },
9489 { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
9490 };
9491 bfd_boolean first = TRUE;
9492 size_t cnt;
9493 bfd_vma val = entry->d_un.d_val;
9494
9495 for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
9496 if (val & flags[cnt].bit)
9497 {
9498 if (! first)
9499 putchar (' ');
9500 fputs (flags[cnt].str, stdout);
9501 first = FALSE;
9502 val ^= flags[cnt].bit;
9503 }
9504
9505 if (val != 0 || first)
9506 {
9507 if (! first)
9508 putchar (' ');
9509 print_vma (val, HEX);
9510 }
9511 }
9512 break;
9513
9514 default:
9515 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9516 break;
9517 }
9518 putchar ('\n');
9519 }
9520
9521 #ifdef BFD64
9522
9523 /* VMS vs Unix time offset and factor. */
9524
9525 #define VMS_EPOCH_OFFSET 35067168000000000LL
9526 #define VMS_GRANULARITY_FACTOR 10000000
9527
9528 /* Display a VMS time in a human readable format. */
9529
9530 static void
9531 print_vms_time (bfd_int64_t vmstime)
9532 {
9533 struct tm *tm;
9534 time_t unxtime;
9535
9536 unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
9537 tm = gmtime (&unxtime);
9538 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
9539 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
9540 tm->tm_hour, tm->tm_min, tm->tm_sec);
9541 }
9542 #endif /* BFD64 */
9543
9544 static void
9545 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
9546 {
9547 switch (entry->d_tag)
9548 {
9549 case DT_IA_64_PLT_RESERVE:
9550 /* First 3 slots reserved. */
9551 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9552 printf (" -- ");
9553 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
9554 break;
9555
9556 case DT_IA_64_VMS_LINKTIME:
9557 #ifdef BFD64
9558 print_vms_time (entry->d_un.d_val);
9559 #endif
9560 break;
9561
9562 case DT_IA_64_VMS_LNKFLAGS:
9563 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9564 if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
9565 printf (" CALL_DEBUG");
9566 if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
9567 printf (" NOP0BUFS");
9568 if (entry->d_un.d_val & VMS_LF_P0IMAGE)
9569 printf (" P0IMAGE");
9570 if (entry->d_un.d_val & VMS_LF_MKTHREADS)
9571 printf (" MKTHREADS");
9572 if (entry->d_un.d_val & VMS_LF_UPCALLS)
9573 printf (" UPCALLS");
9574 if (entry->d_un.d_val & VMS_LF_IMGSTA)
9575 printf (" IMGSTA");
9576 if (entry->d_un.d_val & VMS_LF_INITIALIZE)
9577 printf (" INITIALIZE");
9578 if (entry->d_un.d_val & VMS_LF_MAIN)
9579 printf (" MAIN");
9580 if (entry->d_un.d_val & VMS_LF_EXE_INIT)
9581 printf (" EXE_INIT");
9582 if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
9583 printf (" TBK_IN_IMG");
9584 if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
9585 printf (" DBG_IN_IMG");
9586 if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
9587 printf (" TBK_IN_DSF");
9588 if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
9589 printf (" DBG_IN_DSF");
9590 if (entry->d_un.d_val & VMS_LF_SIGNATURES)
9591 printf (" SIGNATURES");
9592 if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
9593 printf (" REL_SEG_OFF");
9594 break;
9595
9596 default:
9597 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9598 break;
9599 }
9600 putchar ('\n');
9601 }
9602
9603 static bfd_boolean
9604 get_32bit_dynamic_section (Filedata * filedata)
9605 {
9606 Elf32_External_Dyn * edyn;
9607 Elf32_External_Dyn * ext;
9608 Elf_Internal_Dyn * entry;
9609
9610 edyn = (Elf32_External_Dyn *) get_data (NULL, filedata, dynamic_addr, 1,
9611 dynamic_size, _("dynamic section"));
9612 if (!edyn)
9613 return FALSE;
9614
9615 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9616 might not have the luxury of section headers. Look for the DT_NULL
9617 terminator to determine the number of entries. */
9618 for (ext = edyn, dynamic_nent = 0;
9619 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9620 ext++)
9621 {
9622 dynamic_nent++;
9623 if (BYTE_GET (ext->d_tag) == DT_NULL)
9624 break;
9625 }
9626
9627 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9628 sizeof (* entry));
9629 if (dynamic_section == NULL)
9630 {
9631 error (_("Out of memory allocating space for %lu dynamic entries\n"),
9632 (unsigned long) dynamic_nent);
9633 free (edyn);
9634 return FALSE;
9635 }
9636
9637 for (ext = edyn, entry = dynamic_section;
9638 entry < dynamic_section + dynamic_nent;
9639 ext++, entry++)
9640 {
9641 entry->d_tag = BYTE_GET (ext->d_tag);
9642 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9643 }
9644
9645 free (edyn);
9646
9647 return TRUE;
9648 }
9649
9650 static bfd_boolean
9651 get_64bit_dynamic_section (Filedata * filedata)
9652 {
9653 Elf64_External_Dyn * edyn;
9654 Elf64_External_Dyn * ext;
9655 Elf_Internal_Dyn * entry;
9656
9657 /* Read in the data. */
9658 edyn = (Elf64_External_Dyn *) get_data (NULL, filedata, dynamic_addr, 1,
9659 dynamic_size, _("dynamic section"));
9660 if (!edyn)
9661 return FALSE;
9662
9663 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9664 might not have the luxury of section headers. Look for the DT_NULL
9665 terminator to determine the number of entries. */
9666 for (ext = edyn, dynamic_nent = 0;
9667 /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer. */
9668 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9669 ext++)
9670 {
9671 dynamic_nent++;
9672 if (BYTE_GET (ext->d_tag) == DT_NULL)
9673 break;
9674 }
9675
9676 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9677 sizeof (* entry));
9678 if (dynamic_section == NULL)
9679 {
9680 error (_("Out of memory allocating space for %lu dynamic entries\n"),
9681 (unsigned long) dynamic_nent);
9682 free (edyn);
9683 return FALSE;
9684 }
9685
9686 /* Convert from external to internal formats. */
9687 for (ext = edyn, entry = dynamic_section;
9688 entry < dynamic_section + dynamic_nent;
9689 ext++, entry++)
9690 {
9691 entry->d_tag = BYTE_GET (ext->d_tag);
9692 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9693 }
9694
9695 free (edyn);
9696
9697 return TRUE;
9698 }
9699
9700 static void
9701 print_dynamic_flags (bfd_vma flags)
9702 {
9703 bfd_boolean first = TRUE;
9704
9705 while (flags)
9706 {
9707 bfd_vma flag;
9708
9709 flag = flags & - flags;
9710 flags &= ~ flag;
9711
9712 if (first)
9713 first = FALSE;
9714 else
9715 putc (' ', stdout);
9716
9717 switch (flag)
9718 {
9719 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
9720 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
9721 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
9722 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
9723 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
9724 default: fputs (_("unknown"), stdout); break;
9725 }
9726 }
9727 puts ("");
9728 }
9729
9730 /* Parse and display the contents of the dynamic section. */
9731
9732 static bfd_boolean
9733 process_dynamic_section (Filedata * filedata)
9734 {
9735 Elf_Internal_Dyn * entry;
9736
9737 if (dynamic_size == 0)
9738 {
9739 if (do_dynamic)
9740 printf (_("\nThere is no dynamic section in this file.\n"));
9741
9742 return TRUE;
9743 }
9744
9745 if (is_32bit_elf)
9746 {
9747 if (! get_32bit_dynamic_section (filedata))
9748 return FALSE;
9749 }
9750 else
9751 {
9752 if (! get_64bit_dynamic_section (filedata))
9753 return FALSE;
9754 }
9755
9756 /* Find the appropriate symbol table. */
9757 if (dynamic_symbols == NULL)
9758 {
9759 for (entry = dynamic_section;
9760 entry < dynamic_section + dynamic_nent;
9761 ++entry)
9762 {
9763 Elf_Internal_Shdr section;
9764
9765 if (entry->d_tag != DT_SYMTAB)
9766 continue;
9767
9768 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
9769
9770 /* Since we do not know how big the symbol table is,
9771 we default to reading in the entire file (!) and
9772 processing that. This is overkill, I know, but it
9773 should work. */
9774 section.sh_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
9775 if ((bfd_size_type) section.sh_offset > filedata->file_size)
9776 {
9777 /* See PR 21379 for a reproducer. */
9778 error (_("Invalid DT_SYMTAB entry: %lx"), (long) section.sh_offset);
9779 return FALSE;
9780 }
9781
9782 if (archive_file_offset != 0)
9783 section.sh_size = archive_file_size - section.sh_offset;
9784 else
9785 section.sh_size = filedata->file_size - section.sh_offset;
9786
9787 if (is_32bit_elf)
9788 section.sh_entsize = sizeof (Elf32_External_Sym);
9789 else
9790 section.sh_entsize = sizeof (Elf64_External_Sym);
9791 section.sh_name = filedata->string_table_length;
9792
9793 if (dynamic_symbols != NULL)
9794 {
9795 error (_("Multiple dynamic symbol table sections found\n"));
9796 free (dynamic_symbols);
9797 }
9798 dynamic_symbols = GET_ELF_SYMBOLS (filedata, &section, & num_dynamic_syms);
9799 if (num_dynamic_syms < 1)
9800 {
9801 error (_("Unable to determine the number of symbols to load\n"));
9802 continue;
9803 }
9804 }
9805 }
9806
9807 /* Similarly find a string table. */
9808 if (dynamic_strings == NULL)
9809 {
9810 for (entry = dynamic_section;
9811 entry < dynamic_section + dynamic_nent;
9812 ++entry)
9813 {
9814 unsigned long offset;
9815 long str_tab_len;
9816
9817 if (entry->d_tag != DT_STRTAB)
9818 continue;
9819
9820 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
9821
9822 /* Since we do not know how big the string table is,
9823 we default to reading in the entire file (!) and
9824 processing that. This is overkill, I know, but it
9825 should work. */
9826
9827 offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
9828
9829 if (archive_file_offset != 0)
9830 str_tab_len = archive_file_size - offset;
9831 else
9832 str_tab_len = filedata->file_size - offset;
9833
9834 if (str_tab_len < 1)
9835 {
9836 error
9837 (_("Unable to determine the length of the dynamic string table\n"));
9838 continue;
9839 }
9840
9841 if (dynamic_strings != NULL)
9842 {
9843 error (_("Multiple dynamic string tables found\n"));
9844 free (dynamic_strings);
9845 }
9846
9847 dynamic_strings = (char *) get_data (NULL, filedata, offset, 1,
9848 str_tab_len,
9849 _("dynamic string table"));
9850 dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
9851 }
9852 }
9853
9854 /* And find the syminfo section if available. */
9855 if (dynamic_syminfo == NULL)
9856 {
9857 unsigned long syminsz = 0;
9858
9859 for (entry = dynamic_section;
9860 entry < dynamic_section + dynamic_nent;
9861 ++entry)
9862 {
9863 if (entry->d_tag == DT_SYMINENT)
9864 {
9865 /* Note: these braces are necessary to avoid a syntax
9866 error from the SunOS4 C compiler. */
9867 /* PR binutils/17531: A corrupt file can trigger this test.
9868 So do not use an assert, instead generate an error message. */
9869 if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
9870 error (_("Bad value (%d) for SYMINENT entry\n"),
9871 (int) entry->d_un.d_val);
9872 }
9873 else if (entry->d_tag == DT_SYMINSZ)
9874 syminsz = entry->d_un.d_val;
9875 else if (entry->d_tag == DT_SYMINFO)
9876 dynamic_syminfo_offset = offset_from_vma (filedata, entry->d_un.d_val,
9877 syminsz);
9878 }
9879
9880 if (dynamic_syminfo_offset != 0 && syminsz != 0)
9881 {
9882 Elf_External_Syminfo * extsyminfo;
9883 Elf_External_Syminfo * extsym;
9884 Elf_Internal_Syminfo * syminfo;
9885
9886 /* There is a syminfo section. Read the data. */
9887 extsyminfo = (Elf_External_Syminfo *)
9888 get_data (NULL, filedata, dynamic_syminfo_offset, 1, syminsz,
9889 _("symbol information"));
9890 if (!extsyminfo)
9891 return FALSE;
9892
9893 if (dynamic_syminfo != NULL)
9894 {
9895 error (_("Multiple dynamic symbol information sections found\n"));
9896 free (dynamic_syminfo);
9897 }
9898 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
9899 if (dynamic_syminfo == NULL)
9900 {
9901 error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9902 (unsigned long) syminsz);
9903 return FALSE;
9904 }
9905
9906 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
9907 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
9908 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
9909 ++syminfo, ++extsym)
9910 {
9911 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
9912 syminfo->si_flags = BYTE_GET (extsym->si_flags);
9913 }
9914
9915 free (extsyminfo);
9916 }
9917 }
9918
9919 if (do_dynamic && dynamic_addr)
9920 printf (ngettext ("\nDynamic section at offset 0x%lx "
9921 "contains %lu entry:\n",
9922 "\nDynamic section at offset 0x%lx "
9923 "contains %lu entries:\n",
9924 dynamic_nent),
9925 dynamic_addr, (unsigned long) dynamic_nent);
9926 if (do_dynamic)
9927 printf (_(" Tag Type Name/Value\n"));
9928
9929 for (entry = dynamic_section;
9930 entry < dynamic_section + dynamic_nent;
9931 entry++)
9932 {
9933 if (do_dynamic)
9934 {
9935 const char * dtype;
9936
9937 putchar (' ');
9938 print_vma (entry->d_tag, FULL_HEX);
9939 dtype = get_dynamic_type (filedata, entry->d_tag);
9940 printf (" (%s)%*s", dtype,
9941 ((is_32bit_elf ? 27 : 19) - (int) strlen (dtype)), " ");
9942 }
9943
9944 switch (entry->d_tag)
9945 {
9946 case DT_FLAGS:
9947 if (do_dynamic)
9948 print_dynamic_flags (entry->d_un.d_val);
9949 break;
9950
9951 case DT_AUXILIARY:
9952 case DT_FILTER:
9953 case DT_CONFIG:
9954 case DT_DEPAUDIT:
9955 case DT_AUDIT:
9956 if (do_dynamic)
9957 {
9958 switch (entry->d_tag)
9959 {
9960 case DT_AUXILIARY:
9961 printf (_("Auxiliary library"));
9962 break;
9963
9964 case DT_FILTER:
9965 printf (_("Filter library"));
9966 break;
9967
9968 case DT_CONFIG:
9969 printf (_("Configuration file"));
9970 break;
9971
9972 case DT_DEPAUDIT:
9973 printf (_("Dependency audit library"));
9974 break;
9975
9976 case DT_AUDIT:
9977 printf (_("Audit library"));
9978 break;
9979 }
9980
9981 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9982 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
9983 else
9984 {
9985 printf (": ");
9986 print_vma (entry->d_un.d_val, PREFIX_HEX);
9987 putchar ('\n');
9988 }
9989 }
9990 break;
9991
9992 case DT_FEATURE:
9993 if (do_dynamic)
9994 {
9995 printf (_("Flags:"));
9996
9997 if (entry->d_un.d_val == 0)
9998 printf (_(" None\n"));
9999 else
10000 {
10001 unsigned long int val = entry->d_un.d_val;
10002
10003 if (val & DTF_1_PARINIT)
10004 {
10005 printf (" PARINIT");
10006 val ^= DTF_1_PARINIT;
10007 }
10008 if (val & DTF_1_CONFEXP)
10009 {
10010 printf (" CONFEXP");
10011 val ^= DTF_1_CONFEXP;
10012 }
10013 if (val != 0)
10014 printf (" %lx", val);
10015 puts ("");
10016 }
10017 }
10018 break;
10019
10020 case DT_POSFLAG_1:
10021 if (do_dynamic)
10022 {
10023 printf (_("Flags:"));
10024
10025 if (entry->d_un.d_val == 0)
10026 printf (_(" None\n"));
10027 else
10028 {
10029 unsigned long int val = entry->d_un.d_val;
10030
10031 if (val & DF_P1_LAZYLOAD)
10032 {
10033 printf (" LAZYLOAD");
10034 val ^= DF_P1_LAZYLOAD;
10035 }
10036 if (val & DF_P1_GROUPPERM)
10037 {
10038 printf (" GROUPPERM");
10039 val ^= DF_P1_GROUPPERM;
10040 }
10041 if (val != 0)
10042 printf (" %lx", val);
10043 puts ("");
10044 }
10045 }
10046 break;
10047
10048 case DT_FLAGS_1:
10049 if (do_dynamic)
10050 {
10051 printf (_("Flags:"));
10052 if (entry->d_un.d_val == 0)
10053 printf (_(" None\n"));
10054 else
10055 {
10056 unsigned long int val = entry->d_un.d_val;
10057
10058 if (val & DF_1_NOW)
10059 {
10060 printf (" NOW");
10061 val ^= DF_1_NOW;
10062 }
10063 if (val & DF_1_GLOBAL)
10064 {
10065 printf (" GLOBAL");
10066 val ^= DF_1_GLOBAL;
10067 }
10068 if (val & DF_1_GROUP)
10069 {
10070 printf (" GROUP");
10071 val ^= DF_1_GROUP;
10072 }
10073 if (val & DF_1_NODELETE)
10074 {
10075 printf (" NODELETE");
10076 val ^= DF_1_NODELETE;
10077 }
10078 if (val & DF_1_LOADFLTR)
10079 {
10080 printf (" LOADFLTR");
10081 val ^= DF_1_LOADFLTR;
10082 }
10083 if (val & DF_1_INITFIRST)
10084 {
10085 printf (" INITFIRST");
10086 val ^= DF_1_INITFIRST;
10087 }
10088 if (val & DF_1_NOOPEN)
10089 {
10090 printf (" NOOPEN");
10091 val ^= DF_1_NOOPEN;
10092 }
10093 if (val & DF_1_ORIGIN)
10094 {
10095 printf (" ORIGIN");
10096 val ^= DF_1_ORIGIN;
10097 }
10098 if (val & DF_1_DIRECT)
10099 {
10100 printf (" DIRECT");
10101 val ^= DF_1_DIRECT;
10102 }
10103 if (val & DF_1_TRANS)
10104 {
10105 printf (" TRANS");
10106 val ^= DF_1_TRANS;
10107 }
10108 if (val & DF_1_INTERPOSE)
10109 {
10110 printf (" INTERPOSE");
10111 val ^= DF_1_INTERPOSE;
10112 }
10113 if (val & DF_1_NODEFLIB)
10114 {
10115 printf (" NODEFLIB");
10116 val ^= DF_1_NODEFLIB;
10117 }
10118 if (val & DF_1_NODUMP)
10119 {
10120 printf (" NODUMP");
10121 val ^= DF_1_NODUMP;
10122 }
10123 if (val & DF_1_CONFALT)
10124 {
10125 printf (" CONFALT");
10126 val ^= DF_1_CONFALT;
10127 }
10128 if (val & DF_1_ENDFILTEE)
10129 {
10130 printf (" ENDFILTEE");
10131 val ^= DF_1_ENDFILTEE;
10132 }
10133 if (val & DF_1_DISPRELDNE)
10134 {
10135 printf (" DISPRELDNE");
10136 val ^= DF_1_DISPRELDNE;
10137 }
10138 if (val & DF_1_DISPRELPND)
10139 {
10140 printf (" DISPRELPND");
10141 val ^= DF_1_DISPRELPND;
10142 }
10143 if (val & DF_1_NODIRECT)
10144 {
10145 printf (" NODIRECT");
10146 val ^= DF_1_NODIRECT;
10147 }
10148 if (val & DF_1_IGNMULDEF)
10149 {
10150 printf (" IGNMULDEF");
10151 val ^= DF_1_IGNMULDEF;
10152 }
10153 if (val & DF_1_NOKSYMS)
10154 {
10155 printf (" NOKSYMS");
10156 val ^= DF_1_NOKSYMS;
10157 }
10158 if (val & DF_1_NOHDR)
10159 {
10160 printf (" NOHDR");
10161 val ^= DF_1_NOHDR;
10162 }
10163 if (val & DF_1_EDITED)
10164 {
10165 printf (" EDITED");
10166 val ^= DF_1_EDITED;
10167 }
10168 if (val & DF_1_NORELOC)
10169 {
10170 printf (" NORELOC");
10171 val ^= DF_1_NORELOC;
10172 }
10173 if (val & DF_1_SYMINTPOSE)
10174 {
10175 printf (" SYMINTPOSE");
10176 val ^= DF_1_SYMINTPOSE;
10177 }
10178 if (val & DF_1_GLOBAUDIT)
10179 {
10180 printf (" GLOBAUDIT");
10181 val ^= DF_1_GLOBAUDIT;
10182 }
10183 if (val & DF_1_SINGLETON)
10184 {
10185 printf (" SINGLETON");
10186 val ^= DF_1_SINGLETON;
10187 }
10188 if (val & DF_1_STUB)
10189 {
10190 printf (" STUB");
10191 val ^= DF_1_STUB;
10192 }
10193 if (val & DF_1_PIE)
10194 {
10195 printf (" PIE");
10196 val ^= DF_1_PIE;
10197 }
10198 if (val & DF_1_KMOD)
10199 {
10200 printf (" KMOD");
10201 val ^= DF_1_KMOD;
10202 }
10203 if (val & DF_1_WEAKFILTER)
10204 {
10205 printf (" WEAKFILTER");
10206 val ^= DF_1_WEAKFILTER;
10207 }
10208 if (val & DF_1_NOCOMMON)
10209 {
10210 printf (" NOCOMMON");
10211 val ^= DF_1_NOCOMMON;
10212 }
10213 if (val != 0)
10214 printf (" %lx", val);
10215 puts ("");
10216 }
10217 }
10218 break;
10219
10220 case DT_PLTREL:
10221 dynamic_info[entry->d_tag] = entry->d_un.d_val;
10222 if (do_dynamic)
10223 puts (get_dynamic_type (filedata, entry->d_un.d_val));
10224 break;
10225
10226 case DT_NULL :
10227 case DT_NEEDED :
10228 case DT_PLTGOT :
10229 case DT_HASH :
10230 case DT_STRTAB :
10231 case DT_SYMTAB :
10232 case DT_RELA :
10233 case DT_INIT :
10234 case DT_FINI :
10235 case DT_SONAME :
10236 case DT_RPATH :
10237 case DT_SYMBOLIC:
10238 case DT_REL :
10239 case DT_DEBUG :
10240 case DT_TEXTREL :
10241 case DT_JMPREL :
10242 case DT_RUNPATH :
10243 dynamic_info[entry->d_tag] = entry->d_un.d_val;
10244
10245 if (do_dynamic)
10246 {
10247 char * name;
10248
10249 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
10250 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
10251 else
10252 name = NULL;
10253
10254 if (name)
10255 {
10256 switch (entry->d_tag)
10257 {
10258 case DT_NEEDED:
10259 printf (_("Shared library: [%s]"), name);
10260
10261 if (streq (name, program_interpreter))
10262 printf (_(" program interpreter"));
10263 break;
10264
10265 case DT_SONAME:
10266 printf (_("Library soname: [%s]"), name);
10267 break;
10268
10269 case DT_RPATH:
10270 printf (_("Library rpath: [%s]"), name);
10271 break;
10272
10273 case DT_RUNPATH:
10274 printf (_("Library runpath: [%s]"), name);
10275 break;
10276
10277 default:
10278 print_vma (entry->d_un.d_val, PREFIX_HEX);
10279 break;
10280 }
10281 }
10282 else
10283 print_vma (entry->d_un.d_val, PREFIX_HEX);
10284
10285 putchar ('\n');
10286 }
10287 break;
10288
10289 case DT_PLTRELSZ:
10290 case DT_RELASZ :
10291 case DT_STRSZ :
10292 case DT_RELSZ :
10293 case DT_RELAENT :
10294 case DT_SYMENT :
10295 case DT_RELENT :
10296 dynamic_info[entry->d_tag] = entry->d_un.d_val;
10297 /* Fall through. */
10298 case DT_PLTPADSZ:
10299 case DT_MOVEENT :
10300 case DT_MOVESZ :
10301 case DT_INIT_ARRAYSZ:
10302 case DT_FINI_ARRAYSZ:
10303 case DT_GNU_CONFLICTSZ:
10304 case DT_GNU_LIBLISTSZ:
10305 if (do_dynamic)
10306 {
10307 print_vma (entry->d_un.d_val, UNSIGNED);
10308 printf (_(" (bytes)\n"));
10309 }
10310 break;
10311
10312 case DT_VERDEFNUM:
10313 case DT_VERNEEDNUM:
10314 case DT_RELACOUNT:
10315 case DT_RELCOUNT:
10316 if (do_dynamic)
10317 {
10318 print_vma (entry->d_un.d_val, UNSIGNED);
10319 putchar ('\n');
10320 }
10321 break;
10322
10323 case DT_SYMINSZ:
10324 case DT_SYMINENT:
10325 case DT_SYMINFO:
10326 case DT_USED:
10327 case DT_INIT_ARRAY:
10328 case DT_FINI_ARRAY:
10329 if (do_dynamic)
10330 {
10331 if (entry->d_tag == DT_USED
10332 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
10333 {
10334 char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
10335
10336 if (*name)
10337 {
10338 printf (_("Not needed object: [%s]\n"), name);
10339 break;
10340 }
10341 }
10342
10343 print_vma (entry->d_un.d_val, PREFIX_HEX);
10344 putchar ('\n');
10345 }
10346 break;
10347
10348 case DT_BIND_NOW:
10349 /* The value of this entry is ignored. */
10350 if (do_dynamic)
10351 putchar ('\n');
10352 break;
10353
10354 case DT_GNU_PRELINKED:
10355 if (do_dynamic)
10356 {
10357 struct tm * tmp;
10358 time_t atime = entry->d_un.d_val;
10359
10360 tmp = gmtime (&atime);
10361 /* PR 17533 file: 041-1244816-0.004. */
10362 if (tmp == NULL)
10363 printf (_("<corrupt time val: %lx"),
10364 (unsigned long) atime);
10365 else
10366 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
10367 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
10368 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
10369
10370 }
10371 break;
10372
10373 case DT_GNU_HASH:
10374 dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
10375 if (do_dynamic)
10376 {
10377 print_vma (entry->d_un.d_val, PREFIX_HEX);
10378 putchar ('\n');
10379 }
10380 break;
10381
10382 default:
10383 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
10384 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
10385 entry->d_un.d_val;
10386
10387 if (do_dynamic)
10388 {
10389 switch (filedata->file_header.e_machine)
10390 {
10391 case EM_AARCH64:
10392 dynamic_section_aarch64_val (entry);
10393 break;
10394 case EM_MIPS:
10395 case EM_MIPS_RS3_LE:
10396 dynamic_section_mips_val (entry);
10397 break;
10398 case EM_PARISC:
10399 dynamic_section_parisc_val (entry);
10400 break;
10401 case EM_IA_64:
10402 dynamic_section_ia64_val (entry);
10403 break;
10404 default:
10405 print_vma (entry->d_un.d_val, PREFIX_HEX);
10406 putchar ('\n');
10407 }
10408 }
10409 break;
10410 }
10411 }
10412
10413 return TRUE;
10414 }
10415
10416 static char *
10417 get_ver_flags (unsigned int flags)
10418 {
10419 static char buff[128];
10420
10421 buff[0] = 0;
10422
10423 if (flags == 0)
10424 return _("none");
10425
10426 if (flags & VER_FLG_BASE)
10427 strcat (buff, "BASE");
10428
10429 if (flags & VER_FLG_WEAK)
10430 {
10431 if (flags & VER_FLG_BASE)
10432 strcat (buff, " | ");
10433
10434 strcat (buff, "WEAK");
10435 }
10436
10437 if (flags & VER_FLG_INFO)
10438 {
10439 if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
10440 strcat (buff, " | ");
10441
10442 strcat (buff, "INFO");
10443 }
10444
10445 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
10446 {
10447 if (flags & (VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
10448 strcat (buff, " | ");
10449
10450 strcat (buff, _("<unknown>"));
10451 }
10452
10453 return buff;
10454 }
10455
10456 /* Display the contents of the version sections. */
10457
10458 static bfd_boolean
10459 process_version_sections (Filedata * filedata)
10460 {
10461 Elf_Internal_Shdr * section;
10462 unsigned i;
10463 bfd_boolean found = FALSE;
10464
10465 if (! do_version)
10466 return TRUE;
10467
10468 for (i = 0, section = filedata->section_headers;
10469 i < filedata->file_header.e_shnum;
10470 i++, section++)
10471 {
10472 switch (section->sh_type)
10473 {
10474 case SHT_GNU_verdef:
10475 {
10476 Elf_External_Verdef * edefs;
10477 unsigned long idx;
10478 unsigned long cnt;
10479 char * endbuf;
10480
10481 found = TRUE;
10482
10483 printf (ngettext ("\nVersion definition section '%s' "
10484 "contains %u entry:\n",
10485 "\nVersion definition section '%s' "
10486 "contains %u entries:\n",
10487 section->sh_info),
10488 printable_section_name (filedata, section),
10489 section->sh_info);
10490
10491 printf (_(" Addr: 0x"));
10492 printf_vma (section->sh_addr);
10493 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
10494 (unsigned long) section->sh_offset, section->sh_link,
10495 printable_section_name_from_index (filedata, section->sh_link));
10496
10497 edefs = (Elf_External_Verdef *)
10498 get_data (NULL, filedata, section->sh_offset, 1,section->sh_size,
10499 _("version definition section"));
10500 if (!edefs)
10501 break;
10502 endbuf = (char *) edefs + section->sh_size;
10503
10504 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10505 {
10506 char * vstart;
10507 Elf_External_Verdef * edef;
10508 Elf_Internal_Verdef ent;
10509 Elf_External_Verdaux * eaux;
10510 Elf_Internal_Verdaux aux;
10511 unsigned long isum;
10512 int j;
10513
10514 vstart = ((char *) edefs) + idx;
10515 if (vstart + sizeof (*edef) > endbuf)
10516 break;
10517
10518 edef = (Elf_External_Verdef *) vstart;
10519
10520 ent.vd_version = BYTE_GET (edef->vd_version);
10521 ent.vd_flags = BYTE_GET (edef->vd_flags);
10522 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
10523 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
10524 ent.vd_hash = BYTE_GET (edef->vd_hash);
10525 ent.vd_aux = BYTE_GET (edef->vd_aux);
10526 ent.vd_next = BYTE_GET (edef->vd_next);
10527
10528 printf (_(" %#06lx: Rev: %d Flags: %s"),
10529 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
10530
10531 printf (_(" Index: %d Cnt: %d "),
10532 ent.vd_ndx, ent.vd_cnt);
10533
10534 /* Check for overflow. */
10535 if (ent.vd_aux > (size_t) (endbuf - vstart))
10536 break;
10537
10538 vstart += ent.vd_aux;
10539
10540 if (vstart + sizeof (*eaux) > endbuf)
10541 break;
10542 eaux = (Elf_External_Verdaux *) vstart;
10543
10544 aux.vda_name = BYTE_GET (eaux->vda_name);
10545 aux.vda_next = BYTE_GET (eaux->vda_next);
10546
10547 if (VALID_DYNAMIC_NAME (aux.vda_name))
10548 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
10549 else
10550 printf (_("Name index: %ld\n"), aux.vda_name);
10551
10552 isum = idx + ent.vd_aux;
10553
10554 for (j = 1; j < ent.vd_cnt; j++)
10555 {
10556 if (aux.vda_next < sizeof (*eaux)
10557 && !(j == ent.vd_cnt - 1 && aux.vda_next == 0))
10558 {
10559 warn (_("Invalid vda_next field of %lx\n"),
10560 aux.vda_next);
10561 j = ent.vd_cnt;
10562 break;
10563 }
10564 /* Check for overflow. */
10565 if (aux.vda_next > (size_t) (endbuf - vstart))
10566 break;
10567
10568 isum += aux.vda_next;
10569 vstart += aux.vda_next;
10570
10571 if (vstart + sizeof (*eaux) > endbuf)
10572 break;
10573 eaux = (Elf_External_Verdaux *) vstart;
10574
10575 aux.vda_name = BYTE_GET (eaux->vda_name);
10576 aux.vda_next = BYTE_GET (eaux->vda_next);
10577
10578 if (VALID_DYNAMIC_NAME (aux.vda_name))
10579 printf (_(" %#06lx: Parent %d: %s\n"),
10580 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
10581 else
10582 printf (_(" %#06lx: Parent %d, name index: %ld\n"),
10583 isum, j, aux.vda_name);
10584 }
10585
10586 if (j < ent.vd_cnt)
10587 printf (_(" Version def aux past end of section\n"));
10588
10589 /* PR 17531:
10590 file: id:000001,src:000172+005151,op:splice,rep:2. */
10591 if (ent.vd_next < sizeof (*edef)
10592 && !(cnt == section->sh_info - 1 && ent.vd_next == 0))
10593 {
10594 warn (_("Invalid vd_next field of %lx\n"), ent.vd_next);
10595 cnt = section->sh_info;
10596 break;
10597 }
10598 if (ent.vd_next > (size_t) (endbuf - ((char *) edefs + idx)))
10599 break;
10600
10601 idx += ent.vd_next;
10602 }
10603
10604 if (cnt < section->sh_info)
10605 printf (_(" Version definition past end of section\n"));
10606
10607 free (edefs);
10608 }
10609 break;
10610
10611 case SHT_GNU_verneed:
10612 {
10613 Elf_External_Verneed * eneed;
10614 unsigned long idx;
10615 unsigned long cnt;
10616 char * endbuf;
10617
10618 found = TRUE;
10619
10620 printf (ngettext ("\nVersion needs section '%s' "
10621 "contains %u entry:\n",
10622 "\nVersion needs section '%s' "
10623 "contains %u entries:\n",
10624 section->sh_info),
10625 printable_section_name (filedata, section), section->sh_info);
10626
10627 printf (_(" Addr: 0x"));
10628 printf_vma (section->sh_addr);
10629 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
10630 (unsigned long) section->sh_offset, section->sh_link,
10631 printable_section_name_from_index (filedata, section->sh_link));
10632
10633 eneed = (Elf_External_Verneed *) get_data (NULL, filedata,
10634 section->sh_offset, 1,
10635 section->sh_size,
10636 _("Version Needs section"));
10637 if (!eneed)
10638 break;
10639 endbuf = (char *) eneed + section->sh_size;
10640
10641 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10642 {
10643 Elf_External_Verneed * entry;
10644 Elf_Internal_Verneed ent;
10645 unsigned long isum;
10646 int j;
10647 char * vstart;
10648
10649 vstart = ((char *) eneed) + idx;
10650 if (vstart + sizeof (*entry) > endbuf)
10651 break;
10652
10653 entry = (Elf_External_Verneed *) vstart;
10654
10655 ent.vn_version = BYTE_GET (entry->vn_version);
10656 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
10657 ent.vn_file = BYTE_GET (entry->vn_file);
10658 ent.vn_aux = BYTE_GET (entry->vn_aux);
10659 ent.vn_next = BYTE_GET (entry->vn_next);
10660
10661 printf (_(" %#06lx: Version: %d"), idx, ent.vn_version);
10662
10663 if (VALID_DYNAMIC_NAME (ent.vn_file))
10664 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
10665 else
10666 printf (_(" File: %lx"), ent.vn_file);
10667
10668 printf (_(" Cnt: %d\n"), ent.vn_cnt);
10669
10670 /* Check for overflow. */
10671 if (ent.vn_aux > (size_t) (endbuf - vstart))
10672 break;
10673 vstart += ent.vn_aux;
10674
10675 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
10676 {
10677 Elf_External_Vernaux * eaux;
10678 Elf_Internal_Vernaux aux;
10679
10680 if (vstart + sizeof (*eaux) > endbuf)
10681 break;
10682 eaux = (Elf_External_Vernaux *) vstart;
10683
10684 aux.vna_hash = BYTE_GET (eaux->vna_hash);
10685 aux.vna_flags = BYTE_GET (eaux->vna_flags);
10686 aux.vna_other = BYTE_GET (eaux->vna_other);
10687 aux.vna_name = BYTE_GET (eaux->vna_name);
10688 aux.vna_next = BYTE_GET (eaux->vna_next);
10689
10690 if (VALID_DYNAMIC_NAME (aux.vna_name))
10691 printf (_(" %#06lx: Name: %s"),
10692 isum, GET_DYNAMIC_NAME (aux.vna_name));
10693 else
10694 printf (_(" %#06lx: Name index: %lx"),
10695 isum, aux.vna_name);
10696
10697 printf (_(" Flags: %s Version: %d\n"),
10698 get_ver_flags (aux.vna_flags), aux.vna_other);
10699
10700 if (aux.vna_next < sizeof (*eaux)
10701 && !(j == ent.vn_cnt - 1 && aux.vna_next == 0))
10702 {
10703 warn (_("Invalid vna_next field of %lx\n"),
10704 aux.vna_next);
10705 j = ent.vn_cnt;
10706 break;
10707 }
10708 /* Check for overflow. */
10709 if (aux.vna_next > (size_t) (endbuf - vstart))
10710 break;
10711 isum += aux.vna_next;
10712 vstart += aux.vna_next;
10713 }
10714
10715 if (j < ent.vn_cnt)
10716 warn (_("Missing Version Needs auxillary information\n"));
10717
10718 if (ent.vn_next < sizeof (*entry)
10719 && !(cnt == section->sh_info - 1 && ent.vn_next == 0))
10720 {
10721 warn (_("Invalid vn_next field of %lx\n"), ent.vn_next);
10722 cnt = section->sh_info;
10723 break;
10724 }
10725 if (ent.vn_next > (size_t) (endbuf - ((char *) eneed + idx)))
10726 break;
10727 idx += ent.vn_next;
10728 }
10729
10730 if (cnt < section->sh_info)
10731 warn (_("Missing Version Needs information\n"));
10732
10733 free (eneed);
10734 }
10735 break;
10736
10737 case SHT_GNU_versym:
10738 {
10739 Elf_Internal_Shdr * link_section;
10740 size_t total;
10741 unsigned int cnt;
10742 unsigned char * edata;
10743 unsigned short * data;
10744 char * strtab;
10745 Elf_Internal_Sym * symbols;
10746 Elf_Internal_Shdr * string_sec;
10747 unsigned long num_syms;
10748 long off;
10749
10750 if (section->sh_link >= filedata->file_header.e_shnum)
10751 break;
10752
10753 link_section = filedata->section_headers + section->sh_link;
10754 total = section->sh_size / sizeof (Elf_External_Versym);
10755
10756 if (link_section->sh_link >= filedata->file_header.e_shnum)
10757 break;
10758
10759 found = TRUE;
10760
10761 symbols = GET_ELF_SYMBOLS (filedata, link_section, & num_syms);
10762 if (symbols == NULL)
10763 break;
10764
10765 string_sec = filedata->section_headers + link_section->sh_link;
10766
10767 strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
10768 string_sec->sh_size,
10769 _("version string table"));
10770 if (!strtab)
10771 {
10772 free (symbols);
10773 break;
10774 }
10775
10776 printf (ngettext ("\nVersion symbols section '%s' "
10777 "contains %lu entry:\n",
10778 "\nVersion symbols section '%s' "
10779 "contains %lu entries:\n",
10780 total),
10781 printable_section_name (filedata, section), (unsigned long) total);
10782
10783 printf (_(" Addr: "));
10784 printf_vma (section->sh_addr);
10785 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
10786 (unsigned long) section->sh_offset, section->sh_link,
10787 printable_section_name (filedata, link_section));
10788
10789 off = offset_from_vma (filedata,
10790 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10791 total * sizeof (short));
10792 edata = (unsigned char *) get_data (NULL, filedata, off, total,
10793 sizeof (short),
10794 _("version symbol data"));
10795 if (!edata)
10796 {
10797 free (strtab);
10798 free (symbols);
10799 break;
10800 }
10801
10802 data = (short unsigned int *) cmalloc (total, sizeof (short));
10803
10804 for (cnt = total; cnt --;)
10805 data[cnt] = byte_get (edata + cnt * sizeof (short),
10806 sizeof (short));
10807
10808 free (edata);
10809
10810 for (cnt = 0; cnt < total; cnt += 4)
10811 {
10812 int j, nn;
10813 char *name;
10814 char *invalid = _("*invalid*");
10815
10816 printf (" %03x:", cnt);
10817
10818 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
10819 switch (data[cnt + j])
10820 {
10821 case 0:
10822 fputs (_(" 0 (*local*) "), stdout);
10823 break;
10824
10825 case 1:
10826 fputs (_(" 1 (*global*) "), stdout);
10827 break;
10828
10829 default:
10830 nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
10831 data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
10832
10833 /* If this index value is greater than the size of the symbols
10834 array, break to avoid an out-of-bounds read. */
10835 if ((unsigned long)(cnt + j) >= num_syms)
10836 {
10837 warn (_("invalid index into symbol array\n"));
10838 break;
10839 }
10840
10841 name = NULL;
10842 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10843 {
10844 Elf_Internal_Verneed ivn;
10845 unsigned long offset;
10846
10847 offset = offset_from_vma
10848 (filedata, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10849 sizeof (Elf_External_Verneed));
10850
10851 do
10852 {
10853 Elf_Internal_Vernaux ivna;
10854 Elf_External_Verneed evn;
10855 Elf_External_Vernaux evna;
10856 unsigned long a_off;
10857
10858 if (get_data (&evn, filedata, offset, sizeof (evn), 1,
10859 _("version need")) == NULL)
10860 break;
10861
10862 ivn.vn_aux = BYTE_GET (evn.vn_aux);
10863 ivn.vn_next = BYTE_GET (evn.vn_next);
10864
10865 a_off = offset + ivn.vn_aux;
10866
10867 do
10868 {
10869 if (get_data (&evna, filedata, a_off, sizeof (evna),
10870 1, _("version need aux (2)")) == NULL)
10871 {
10872 ivna.vna_next = 0;
10873 ivna.vna_other = 0;
10874 }
10875 else
10876 {
10877 ivna.vna_next = BYTE_GET (evna.vna_next);
10878 ivna.vna_other = BYTE_GET (evna.vna_other);
10879 }
10880
10881 a_off += ivna.vna_next;
10882 }
10883 while (ivna.vna_other != data[cnt + j]
10884 && ivna.vna_next != 0);
10885
10886 if (ivna.vna_other == data[cnt + j])
10887 {
10888 ivna.vna_name = BYTE_GET (evna.vna_name);
10889
10890 if (ivna.vna_name >= string_sec->sh_size)
10891 name = invalid;
10892 else
10893 name = strtab + ivna.vna_name;
10894 break;
10895 }
10896
10897 offset += ivn.vn_next;
10898 }
10899 while (ivn.vn_next);
10900 }
10901
10902 if (data[cnt + j] != 0x8001
10903 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10904 {
10905 Elf_Internal_Verdef ivd;
10906 Elf_External_Verdef evd;
10907 unsigned long offset;
10908
10909 offset = offset_from_vma
10910 (filedata, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10911 sizeof evd);
10912
10913 do
10914 {
10915 if (get_data (&evd, filedata, offset, sizeof (evd), 1,
10916 _("version def")) == NULL)
10917 {
10918 ivd.vd_next = 0;
10919 /* PR 17531: file: 046-1082287-0.004. */
10920 ivd.vd_ndx = (data[cnt + j] & VERSYM_VERSION) + 1;
10921 break;
10922 }
10923 else
10924 {
10925 ivd.vd_next = BYTE_GET (evd.vd_next);
10926 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10927 }
10928
10929 offset += ivd.vd_next;
10930 }
10931 while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
10932 && ivd.vd_next != 0);
10933
10934 if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
10935 {
10936 Elf_External_Verdaux evda;
10937 Elf_Internal_Verdaux ivda;
10938
10939 ivd.vd_aux = BYTE_GET (evd.vd_aux);
10940
10941 if (get_data (&evda, filedata,
10942 offset - ivd.vd_next + ivd.vd_aux,
10943 sizeof (evda), 1,
10944 _("version def aux")) == NULL)
10945 break;
10946
10947 ivda.vda_name = BYTE_GET (evda.vda_name);
10948
10949 if (ivda.vda_name >= string_sec->sh_size)
10950 name = invalid;
10951 else if (name != NULL && name != invalid)
10952 name = _("*both*");
10953 else
10954 name = strtab + ivda.vda_name;
10955 }
10956 }
10957 if (name != NULL)
10958 nn += printf ("(%s%-*s",
10959 name,
10960 12 - (int) strlen (name),
10961 ")");
10962
10963 if (nn < 18)
10964 printf ("%*c", 18 - nn, ' ');
10965 }
10966
10967 putchar ('\n');
10968 }
10969
10970 free (data);
10971 free (strtab);
10972 free (symbols);
10973 }
10974 break;
10975
10976 default:
10977 break;
10978 }
10979 }
10980
10981 if (! found)
10982 printf (_("\nNo version information found in this file.\n"));
10983
10984 return TRUE;
10985 }
10986
10987 static const char *
10988 get_symbol_binding (Filedata * filedata, unsigned int binding)
10989 {
10990 static char buff[32];
10991
10992 switch (binding)
10993 {
10994 case STB_LOCAL: return "LOCAL";
10995 case STB_GLOBAL: return "GLOBAL";
10996 case STB_WEAK: return "WEAK";
10997 default:
10998 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
10999 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
11000 binding);
11001 else if (binding >= STB_LOOS && binding <= STB_HIOS)
11002 {
11003 if (binding == STB_GNU_UNIQUE
11004 && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
11005 /* GNU is still using the default value 0. */
11006 || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
11007 return "UNIQUE";
11008 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
11009 }
11010 else
11011 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
11012 return buff;
11013 }
11014 }
11015
11016 static const char *
11017 get_symbol_type (Filedata * filedata, unsigned int type)
11018 {
11019 static char buff[32];
11020
11021 switch (type)
11022 {
11023 case STT_NOTYPE: return "NOTYPE";
11024 case STT_OBJECT: return "OBJECT";
11025 case STT_FUNC: return "FUNC";
11026 case STT_SECTION: return "SECTION";
11027 case STT_FILE: return "FILE";
11028 case STT_COMMON: return "COMMON";
11029 case STT_TLS: return "TLS";
11030 case STT_RELC: return "RELC";
11031 case STT_SRELC: return "SRELC";
11032 default:
11033 if (type >= STT_LOPROC && type <= STT_HIPROC)
11034 {
11035 if (filedata->file_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
11036 return "THUMB_FUNC";
11037
11038 if (filedata->file_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
11039 return "REGISTER";
11040
11041 if (filedata->file_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
11042 return "PARISC_MILLI";
11043
11044 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
11045 }
11046 else if (type >= STT_LOOS && type <= STT_HIOS)
11047 {
11048 if (filedata->file_header.e_machine == EM_PARISC)
11049 {
11050 if (type == STT_HP_OPAQUE)
11051 return "HP_OPAQUE";
11052 if (type == STT_HP_STUB)
11053 return "HP_STUB";
11054 }
11055
11056 if (type == STT_GNU_IFUNC
11057 && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
11058 || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
11059 /* GNU is still using the default value 0. */
11060 || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
11061 return "IFUNC";
11062
11063 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
11064 }
11065 else
11066 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
11067 return buff;
11068 }
11069 }
11070
11071 static const char *
11072 get_symbol_visibility (unsigned int visibility)
11073 {
11074 switch (visibility)
11075 {
11076 case STV_DEFAULT: return "DEFAULT";
11077 case STV_INTERNAL: return "INTERNAL";
11078 case STV_HIDDEN: return "HIDDEN";
11079 case STV_PROTECTED: return "PROTECTED";
11080 default:
11081 error (_("Unrecognized visibility value: %u"), visibility);
11082 return _("<unknown>");
11083 }
11084 }
11085
11086 static const char *
11087 get_solaris_symbol_visibility (unsigned int visibility)
11088 {
11089 switch (visibility)
11090 {
11091 case 4: return "EXPORTED";
11092 case 5: return "SINGLETON";
11093 case 6: return "ELIMINATE";
11094 default: return get_symbol_visibility (visibility);
11095 }
11096 }
11097
11098 static const char *
11099 get_mips_symbol_other (unsigned int other)
11100 {
11101 switch (other)
11102 {
11103 case STO_OPTIONAL: return "OPTIONAL";
11104 case STO_MIPS_PLT: return "MIPS PLT";
11105 case STO_MIPS_PIC: return "MIPS PIC";
11106 case STO_MICROMIPS: return "MICROMIPS";
11107 case STO_MICROMIPS | STO_MIPS_PIC: return "MICROMIPS, MIPS PIC";
11108 case STO_MIPS16: return "MIPS16";
11109 default: return NULL;
11110 }
11111 }
11112
11113 static const char *
11114 get_ia64_symbol_other (Filedata * filedata, unsigned int other)
11115 {
11116 if (is_ia64_vms (filedata))
11117 {
11118 static char res[32];
11119
11120 res[0] = 0;
11121
11122 /* Function types is for images and .STB files only. */
11123 switch (filedata->file_header.e_type)
11124 {
11125 case ET_DYN:
11126 case ET_EXEC:
11127 switch (VMS_ST_FUNC_TYPE (other))
11128 {
11129 case VMS_SFT_CODE_ADDR:
11130 strcat (res, " CA");
11131 break;
11132 case VMS_SFT_SYMV_IDX:
11133 strcat (res, " VEC");
11134 break;
11135 case VMS_SFT_FD:
11136 strcat (res, " FD");
11137 break;
11138 case VMS_SFT_RESERVE:
11139 strcat (res, " RSV");
11140 break;
11141 default:
11142 warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
11143 VMS_ST_FUNC_TYPE (other));
11144 strcat (res, " <unknown>");
11145 break;
11146 }
11147 break;
11148 default:
11149 break;
11150 }
11151 switch (VMS_ST_LINKAGE (other))
11152 {
11153 case VMS_STL_IGNORE:
11154 strcat (res, " IGN");
11155 break;
11156 case VMS_STL_RESERVE:
11157 strcat (res, " RSV");
11158 break;
11159 case VMS_STL_STD:
11160 strcat (res, " STD");
11161 break;
11162 case VMS_STL_LNK:
11163 strcat (res, " LNK");
11164 break;
11165 default:
11166 warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
11167 VMS_ST_LINKAGE (other));
11168 strcat (res, " <unknown>");
11169 break;
11170 }
11171
11172 if (res[0] != 0)
11173 return res + 1;
11174 else
11175 return res;
11176 }
11177 return NULL;
11178 }
11179
11180 static const char *
11181 get_ppc64_symbol_other (unsigned int other)
11182 {
11183 if ((other & ~STO_PPC64_LOCAL_MASK) != 0)
11184 return NULL;
11185
11186 other >>= STO_PPC64_LOCAL_BIT;
11187 if (other <= 6)
11188 {
11189 static char buf[32];
11190 if (other >= 2)
11191 other = ppc64_decode_local_entry (other);
11192 snprintf (buf, sizeof buf, _("<localentry>: %d"), other);
11193 return buf;
11194 }
11195 return NULL;
11196 }
11197
11198 static const char *
11199 get_symbol_other (Filedata * filedata, unsigned int other)
11200 {
11201 const char * result = NULL;
11202 static char buff [32];
11203
11204 if (other == 0)
11205 return "";
11206
11207 switch (filedata->file_header.e_machine)
11208 {
11209 case EM_MIPS:
11210 result = get_mips_symbol_other (other);
11211 break;
11212 case EM_IA_64:
11213 result = get_ia64_symbol_other (filedata, other);
11214 break;
11215 case EM_PPC64:
11216 result = get_ppc64_symbol_other (other);
11217 break;
11218 default:
11219 result = NULL;
11220 break;
11221 }
11222
11223 if (result)
11224 return result;
11225
11226 snprintf (buff, sizeof buff, _("<other>: %x"), other);
11227 return buff;
11228 }
11229
11230 static const char *
11231 get_symbol_index_type (Filedata * filedata, unsigned int type)
11232 {
11233 static char buff[32];
11234
11235 switch (type)
11236 {
11237 case SHN_UNDEF: return "UND";
11238 case SHN_ABS: return "ABS";
11239 case SHN_COMMON: return "COM";
11240 default:
11241 if (type == SHN_IA_64_ANSI_COMMON
11242 && filedata->file_header.e_machine == EM_IA_64
11243 && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
11244 return "ANSI_COM";
11245 else if ((filedata->file_header.e_machine == EM_X86_64
11246 || filedata->file_header.e_machine == EM_L1OM
11247 || filedata->file_header.e_machine == EM_K1OM)
11248 && type == SHN_X86_64_LCOMMON)
11249 return "LARGE_COM";
11250 else if ((type == SHN_MIPS_SCOMMON
11251 && filedata->file_header.e_machine == EM_MIPS)
11252 || (type == SHN_TIC6X_SCOMMON
11253 && filedata->file_header.e_machine == EM_TI_C6000))
11254 return "SCOM";
11255 else if (type == SHN_MIPS_SUNDEFINED
11256 && filedata->file_header.e_machine == EM_MIPS)
11257 return "SUND";
11258 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
11259 sprintf (buff, "PRC[0x%04x]", type & 0xffff);
11260 else if (type >= SHN_LOOS && type <= SHN_HIOS)
11261 sprintf (buff, "OS [0x%04x]", type & 0xffff);
11262 else if (type >= SHN_LORESERVE)
11263 sprintf (buff, "RSV[0x%04x]", type & 0xffff);
11264 else if (type >= filedata->file_header.e_shnum)
11265 sprintf (buff, _("bad section index[%3d]"), type);
11266 else
11267 sprintf (buff, "%3d", type);
11268 break;
11269 }
11270
11271 return buff;
11272 }
11273
11274 static bfd_vma *
11275 get_dynamic_data (Filedata * filedata, bfd_size_type number, unsigned int ent_size)
11276 {
11277 unsigned char * e_data;
11278 bfd_vma * i_data;
11279
11280 /* If the size_t type is smaller than the bfd_size_type, eg because
11281 you are building a 32-bit tool on a 64-bit host, then make sure
11282 that when (number) is cast to (size_t) no information is lost. */
11283 if (sizeof (size_t) < sizeof (bfd_size_type)
11284 && (bfd_size_type) ((size_t) number) != number)
11285 {
11286 error (_("Size truncation prevents reading %s elements of size %u\n"),
11287 bfd_vmatoa ("u", number), ent_size);
11288 return NULL;
11289 }
11290
11291 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
11292 attempting to allocate memory when the read is bound to fail. */
11293 if (ent_size * number > filedata->file_size)
11294 {
11295 error (_("Invalid number of dynamic entries: %s\n"),
11296 bfd_vmatoa ("u", number));
11297 return NULL;
11298 }
11299
11300 e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
11301 if (e_data == NULL)
11302 {
11303 error (_("Out of memory reading %s dynamic entries\n"),
11304 bfd_vmatoa ("u", number));
11305 return NULL;
11306 }
11307
11308 if (fread (e_data, ent_size, (size_t) number, filedata->handle) != number)
11309 {
11310 error (_("Unable to read in %s bytes of dynamic data\n"),
11311 bfd_vmatoa ("u", number * ent_size));
11312 free (e_data);
11313 return NULL;
11314 }
11315
11316 i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
11317 if (i_data == NULL)
11318 {
11319 error (_("Out of memory allocating space for %s dynamic entries\n"),
11320 bfd_vmatoa ("u", number));
11321 free (e_data);
11322 return NULL;
11323 }
11324
11325 while (number--)
11326 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
11327
11328 free (e_data);
11329
11330 return i_data;
11331 }
11332
11333 static void
11334 print_dynamic_symbol (Filedata * filedata, bfd_vma si, unsigned long hn)
11335 {
11336 Elf_Internal_Sym * psym;
11337 int n;
11338
11339 n = print_vma (si, DEC_5);
11340 if (n < 5)
11341 fputs (&" "[n], stdout);
11342 printf (" %3lu: ", hn);
11343
11344 if (dynamic_symbols == NULL || si >= num_dynamic_syms)
11345 {
11346 printf (_("<No info available for dynamic symbol number %lu>\n"),
11347 (unsigned long) si);
11348 return;
11349 }
11350
11351 psym = dynamic_symbols + si;
11352 print_vma (psym->st_value, LONG_HEX);
11353 putchar (' ');
11354 print_vma (psym->st_size, DEC_5);
11355
11356 printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
11357 printf (" %-6s", get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
11358
11359 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11360 printf (" %-7s", get_solaris_symbol_visibility (psym->st_other));
11361 else
11362 {
11363 unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11364
11365 printf (" %-7s", get_symbol_visibility (vis));
11366 /* Check to see if any other bits in the st_other field are set.
11367 Note - displaying this information disrupts the layout of the
11368 table being generated, but for the moment this case is very
11369 rare. */
11370 if (psym->st_other ^ vis)
11371 printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
11372 }
11373
11374 printf (" %3.3s ", get_symbol_index_type (filedata, psym->st_shndx));
11375 if (VALID_DYNAMIC_NAME (psym->st_name))
11376 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
11377 else
11378 printf (_(" <corrupt: %14ld>"), psym->st_name);
11379 putchar ('\n');
11380 }
11381
11382 static const char *
11383 get_symbol_version_string (Filedata * filedata,
11384 bfd_boolean is_dynsym,
11385 const char * strtab,
11386 unsigned long int strtab_size,
11387 unsigned int si,
11388 Elf_Internal_Sym * psym,
11389 enum versioned_symbol_info * sym_info,
11390 unsigned short * vna_other)
11391 {
11392 unsigned char data[2];
11393 unsigned short vers_data;
11394 unsigned long offset;
11395 unsigned short max_vd_ndx;
11396
11397 if (!is_dynsym
11398 || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
11399 return NULL;
11400
11401 offset = offset_from_vma (filedata, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
11402 sizeof data + si * sizeof (vers_data));
11403
11404 if (get_data (&data, filedata, offset + si * sizeof (vers_data),
11405 sizeof (data), 1, _("version data")) == NULL)
11406 return NULL;
11407
11408 vers_data = byte_get (data, 2);
11409
11410 if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data == 0)
11411 return NULL;
11412
11413 max_vd_ndx = 0;
11414
11415 /* Usually we'd only see verdef for defined symbols, and verneed for
11416 undefined symbols. However, symbols defined by the linker in
11417 .dynbss for variables copied from a shared library in order to
11418 avoid text relocations are defined yet have verneed. We could
11419 use a heuristic to detect the special case, for example, check
11420 for verneed first on symbols defined in SHT_NOBITS sections, but
11421 it is simpler and more reliable to just look for both verdef and
11422 verneed. .dynbss might not be mapped to a SHT_NOBITS section. */
11423
11424 if (psym->st_shndx != SHN_UNDEF
11425 && vers_data != 0x8001
11426 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
11427 {
11428 Elf_Internal_Verdef ivd;
11429 Elf_Internal_Verdaux ivda;
11430 Elf_External_Verdaux evda;
11431 unsigned long off;
11432
11433 off = offset_from_vma (filedata,
11434 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
11435 sizeof (Elf_External_Verdef));
11436
11437 do
11438 {
11439 Elf_External_Verdef evd;
11440
11441 if (get_data (&evd, filedata, off, sizeof (evd), 1,
11442 _("version def")) == NULL)
11443 {
11444 ivd.vd_ndx = 0;
11445 ivd.vd_aux = 0;
11446 ivd.vd_next = 0;
11447 ivd.vd_flags = 0;
11448 }
11449 else
11450 {
11451 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
11452 ivd.vd_aux = BYTE_GET (evd.vd_aux);
11453 ivd.vd_next = BYTE_GET (evd.vd_next);
11454 ivd.vd_flags = BYTE_GET (evd.vd_flags);
11455 }
11456
11457 if ((ivd.vd_ndx & VERSYM_VERSION) > max_vd_ndx)
11458 max_vd_ndx = ivd.vd_ndx & VERSYM_VERSION;
11459
11460 off += ivd.vd_next;
11461 }
11462 while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
11463
11464 if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
11465 {
11466 if (ivd.vd_ndx == 1 && ivd.vd_flags == VER_FLG_BASE)
11467 return NULL;
11468
11469 off -= ivd.vd_next;
11470 off += ivd.vd_aux;
11471
11472 if (get_data (&evda, filedata, off, sizeof (evda), 1,
11473 _("version def aux")) != NULL)
11474 {
11475 ivda.vda_name = BYTE_GET (evda.vda_name);
11476
11477 if (psym->st_name != ivda.vda_name)
11478 {
11479 *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
11480 ? symbol_hidden : symbol_public);
11481 return (ivda.vda_name < strtab_size
11482 ? strtab + ivda.vda_name : _("<corrupt>"));
11483 }
11484 }
11485 }
11486 }
11487
11488 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
11489 {
11490 Elf_External_Verneed evn;
11491 Elf_Internal_Verneed ivn;
11492 Elf_Internal_Vernaux ivna;
11493
11494 offset = offset_from_vma (filedata,
11495 version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
11496 sizeof evn);
11497 do
11498 {
11499 unsigned long vna_off;
11500
11501 if (get_data (&evn, filedata, offset, sizeof (evn), 1,
11502 _("version need")) == NULL)
11503 {
11504 ivna.vna_next = 0;
11505 ivna.vna_other = 0;
11506 ivna.vna_name = 0;
11507 break;
11508 }
11509
11510 ivn.vn_aux = BYTE_GET (evn.vn_aux);
11511 ivn.vn_next = BYTE_GET (evn.vn_next);
11512
11513 vna_off = offset + ivn.vn_aux;
11514
11515 do
11516 {
11517 Elf_External_Vernaux evna;
11518
11519 if (get_data (&evna, filedata, vna_off, sizeof (evna), 1,
11520 _("version need aux (3)")) == NULL)
11521 {
11522 ivna.vna_next = 0;
11523 ivna.vna_other = 0;
11524 ivna.vna_name = 0;
11525 }
11526 else
11527 {
11528 ivna.vna_other = BYTE_GET (evna.vna_other);
11529 ivna.vna_next = BYTE_GET (evna.vna_next);
11530 ivna.vna_name = BYTE_GET (evna.vna_name);
11531 }
11532
11533 vna_off += ivna.vna_next;
11534 }
11535 while (ivna.vna_other != vers_data && ivna.vna_next != 0);
11536
11537 if (ivna.vna_other == vers_data)
11538 break;
11539
11540 offset += ivn.vn_next;
11541 }
11542 while (ivn.vn_next != 0);
11543
11544 if (ivna.vna_other == vers_data)
11545 {
11546 *sym_info = symbol_undefined;
11547 *vna_other = ivna.vna_other;
11548 return (ivna.vna_name < strtab_size
11549 ? strtab + ivna.vna_name : _("<corrupt>"));
11550 }
11551 else if ((max_vd_ndx || (vers_data & VERSYM_VERSION) != 1)
11552 && (vers_data & VERSYM_VERSION) > max_vd_ndx)
11553 return _("<corrupt>");
11554 }
11555 return NULL;
11556 }
11557
11558 /* Dump the symbol table. */
11559 static bfd_boolean
11560 process_symbol_table (Filedata * filedata)
11561 {
11562 Elf_Internal_Shdr * section;
11563 bfd_size_type nbuckets = 0;
11564 bfd_size_type nchains = 0;
11565 bfd_vma * buckets = NULL;
11566 bfd_vma * chains = NULL;
11567 bfd_vma ngnubuckets = 0;
11568 bfd_vma * gnubuckets = NULL;
11569 bfd_vma * gnuchains = NULL;
11570 bfd_vma gnusymidx = 0;
11571 bfd_size_type ngnuchains = 0;
11572
11573 if (!do_syms && !do_dyn_syms && !do_histogram)
11574 return TRUE;
11575
11576 if (dynamic_info[DT_HASH]
11577 && (do_histogram
11578 || (do_using_dynamic
11579 && !do_dyn_syms
11580 && dynamic_strings != NULL)))
11581 {
11582 unsigned char nb[8];
11583 unsigned char nc[8];
11584 unsigned int hash_ent_size = 4;
11585
11586 if ((filedata->file_header.e_machine == EM_ALPHA
11587 || filedata->file_header.e_machine == EM_S390
11588 || filedata->file_header.e_machine == EM_S390_OLD)
11589 && filedata->file_header.e_ident[EI_CLASS] == ELFCLASS64)
11590 hash_ent_size = 8;
11591
11592 if (fseek (filedata->handle,
11593 (archive_file_offset
11594 + offset_from_vma (filedata, dynamic_info[DT_HASH],
11595 sizeof nb + sizeof nc)),
11596 SEEK_SET))
11597 {
11598 error (_("Unable to seek to start of dynamic information\n"));
11599 goto no_hash;
11600 }
11601
11602 if (fread (nb, hash_ent_size, 1, filedata->handle) != 1)
11603 {
11604 error (_("Failed to read in number of buckets\n"));
11605 goto no_hash;
11606 }
11607
11608 if (fread (nc, hash_ent_size, 1, filedata->handle) != 1)
11609 {
11610 error (_("Failed to read in number of chains\n"));
11611 goto no_hash;
11612 }
11613
11614 nbuckets = byte_get (nb, hash_ent_size);
11615 nchains = byte_get (nc, hash_ent_size);
11616
11617 buckets = get_dynamic_data (filedata, nbuckets, hash_ent_size);
11618 chains = get_dynamic_data (filedata, nchains, hash_ent_size);
11619
11620 no_hash:
11621 if (buckets == NULL || chains == NULL)
11622 {
11623 if (do_using_dynamic)
11624 return FALSE;
11625 free (buckets);
11626 free (chains);
11627 buckets = NULL;
11628 chains = NULL;
11629 nbuckets = 0;
11630 nchains = 0;
11631 }
11632 }
11633
11634 if (dynamic_info_DT_GNU_HASH
11635 && (do_histogram
11636 || (do_using_dynamic
11637 && !do_dyn_syms
11638 && dynamic_strings != NULL)))
11639 {
11640 unsigned char nb[16];
11641 bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
11642 bfd_vma buckets_vma;
11643
11644 if (fseek (filedata->handle,
11645 (archive_file_offset
11646 + offset_from_vma (filedata, dynamic_info_DT_GNU_HASH,
11647 sizeof nb)),
11648 SEEK_SET))
11649 {
11650 error (_("Unable to seek to start of dynamic information\n"));
11651 goto no_gnu_hash;
11652 }
11653
11654 if (fread (nb, 16, 1, filedata->handle) != 1)
11655 {
11656 error (_("Failed to read in number of buckets\n"));
11657 goto no_gnu_hash;
11658 }
11659
11660 ngnubuckets = byte_get (nb, 4);
11661 gnusymidx = byte_get (nb + 4, 4);
11662 bitmaskwords = byte_get (nb + 8, 4);
11663 buckets_vma = dynamic_info_DT_GNU_HASH + 16;
11664 if (is_32bit_elf)
11665 buckets_vma += bitmaskwords * 4;
11666 else
11667 buckets_vma += bitmaskwords * 8;
11668
11669 if (fseek (filedata->handle,
11670 (archive_file_offset
11671 + offset_from_vma (filedata, buckets_vma, 4)),
11672 SEEK_SET))
11673 {
11674 error (_("Unable to seek to start of dynamic information\n"));
11675 goto no_gnu_hash;
11676 }
11677
11678 gnubuckets = get_dynamic_data (filedata, ngnubuckets, 4);
11679
11680 if (gnubuckets == NULL)
11681 goto no_gnu_hash;
11682
11683 for (i = 0; i < ngnubuckets; i++)
11684 if (gnubuckets[i] != 0)
11685 {
11686 if (gnubuckets[i] < gnusymidx)
11687 return FALSE;
11688
11689 if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
11690 maxchain = gnubuckets[i];
11691 }
11692
11693 if (maxchain == 0xffffffff)
11694 goto no_gnu_hash;
11695
11696 maxchain -= gnusymidx;
11697
11698 if (fseek (filedata->handle,
11699 (archive_file_offset
11700 + offset_from_vma (filedata, buckets_vma
11701 + 4 * (ngnubuckets + maxchain), 4)),
11702 SEEK_SET))
11703 {
11704 error (_("Unable to seek to start of dynamic information\n"));
11705 goto no_gnu_hash;
11706 }
11707
11708 do
11709 {
11710 if (fread (nb, 4, 1, filedata->handle) != 1)
11711 {
11712 error (_("Failed to determine last chain length\n"));
11713 goto no_gnu_hash;
11714 }
11715
11716 if (maxchain + 1 == 0)
11717 goto no_gnu_hash;
11718
11719 ++maxchain;
11720 }
11721 while ((byte_get (nb, 4) & 1) == 0);
11722
11723 if (fseek (filedata->handle,
11724 (archive_file_offset
11725 + offset_from_vma (filedata, buckets_vma + 4 * ngnubuckets, 4)),
11726 SEEK_SET))
11727 {
11728 error (_("Unable to seek to start of dynamic information\n"));
11729 goto no_gnu_hash;
11730 }
11731
11732 gnuchains = get_dynamic_data (filedata, maxchain, 4);
11733 ngnuchains = maxchain;
11734
11735 no_gnu_hash:
11736 if (gnuchains == NULL)
11737 {
11738 free (gnubuckets);
11739 gnubuckets = NULL;
11740 ngnubuckets = 0;
11741 if (do_using_dynamic)
11742 return FALSE;
11743 }
11744 }
11745
11746 if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
11747 && do_syms
11748 && do_using_dynamic
11749 && dynamic_strings != NULL
11750 && dynamic_symbols != NULL)
11751 {
11752 unsigned long hn;
11753
11754 if (dynamic_info[DT_HASH])
11755 {
11756 bfd_vma si;
11757 char *visited;
11758
11759 printf (_("\nSymbol table for image:\n"));
11760 if (is_32bit_elf)
11761 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11762 else
11763 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11764
11765 visited = xcmalloc (nchains, 1);
11766 memset (visited, 0, nchains);
11767 for (hn = 0; hn < nbuckets; hn++)
11768 {
11769 for (si = buckets[hn]; si > 0; si = chains[si])
11770 {
11771 print_dynamic_symbol (filedata, si, hn);
11772 if (si >= nchains || visited[si])
11773 {
11774 error (_("histogram chain is corrupt\n"));
11775 break;
11776 }
11777 visited[si] = 1;
11778 }
11779 }
11780 free (visited);
11781 }
11782
11783 if (dynamic_info_DT_GNU_HASH)
11784 {
11785 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
11786 if (is_32bit_elf)
11787 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11788 else
11789 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11790
11791 for (hn = 0; hn < ngnubuckets; ++hn)
11792 if (gnubuckets[hn] != 0)
11793 {
11794 bfd_vma si = gnubuckets[hn];
11795 bfd_vma off = si - gnusymidx;
11796
11797 do
11798 {
11799 print_dynamic_symbol (filedata, si, hn);
11800 si++;
11801 }
11802 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
11803 }
11804 }
11805 }
11806 else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
11807 && filedata->section_headers != NULL)
11808 {
11809 unsigned int i;
11810
11811 for (i = 0, section = filedata->section_headers;
11812 i < filedata->file_header.e_shnum;
11813 i++, section++)
11814 {
11815 unsigned int si;
11816 char * strtab = NULL;
11817 unsigned long int strtab_size = 0;
11818 Elf_Internal_Sym * symtab;
11819 Elf_Internal_Sym * psym;
11820 unsigned long num_syms;
11821
11822 if ((section->sh_type != SHT_SYMTAB
11823 && section->sh_type != SHT_DYNSYM)
11824 || (!do_syms
11825 && section->sh_type == SHT_SYMTAB))
11826 continue;
11827
11828 if (section->sh_entsize == 0)
11829 {
11830 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
11831 printable_section_name (filedata, section));
11832 continue;
11833 }
11834
11835 num_syms = section->sh_size / section->sh_entsize;
11836 printf (ngettext ("\nSymbol table '%s' contains %lu entry:\n",
11837 "\nSymbol table '%s' contains %lu entries:\n",
11838 num_syms),
11839 printable_section_name (filedata, section),
11840 num_syms);
11841
11842 if (is_32bit_elf)
11843 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
11844 else
11845 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
11846
11847 symtab = GET_ELF_SYMBOLS (filedata, section, & num_syms);
11848 if (symtab == NULL)
11849 continue;
11850
11851 if (section->sh_link == filedata->file_header.e_shstrndx)
11852 {
11853 strtab = filedata->string_table;
11854 strtab_size = filedata->string_table_length;
11855 }
11856 else if (section->sh_link < filedata->file_header.e_shnum)
11857 {
11858 Elf_Internal_Shdr * string_sec;
11859
11860 string_sec = filedata->section_headers + section->sh_link;
11861
11862 strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset,
11863 1, string_sec->sh_size,
11864 _("string table"));
11865 strtab_size = strtab != NULL ? string_sec->sh_size : 0;
11866 }
11867
11868 for (si = 0, psym = symtab; si < num_syms; si++, psym++)
11869 {
11870 const char *version_string;
11871 enum versioned_symbol_info sym_info;
11872 unsigned short vna_other;
11873
11874 printf ("%6d: ", si);
11875 print_vma (psym->st_value, LONG_HEX);
11876 putchar (' ');
11877 print_vma (psym->st_size, DEC_5);
11878 printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
11879 printf (" %-6s", get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
11880 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11881 printf (" %-7s", get_solaris_symbol_visibility (psym->st_other));
11882 else
11883 {
11884 unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11885
11886 printf (" %-7s", get_symbol_visibility (vis));
11887 /* Check to see if any other bits in the st_other field are set.
11888 Note - displaying this information disrupts the layout of the
11889 table being generated, but for the moment this case is very rare. */
11890 if (psym->st_other ^ vis)
11891 printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
11892 }
11893 printf (" %4s ", get_symbol_index_type (filedata, psym->st_shndx));
11894 print_symbol (25, psym->st_name < strtab_size
11895 ? strtab + psym->st_name : _("<corrupt>"));
11896
11897 version_string
11898 = get_symbol_version_string (filedata,
11899 section->sh_type == SHT_DYNSYM,
11900 strtab, strtab_size, si,
11901 psym, &sym_info, &vna_other);
11902 if (version_string)
11903 {
11904 if (sym_info == symbol_undefined)
11905 printf ("@%s (%d)", version_string, vna_other);
11906 else
11907 printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
11908 version_string);
11909 }
11910
11911 putchar ('\n');
11912
11913 if (ELF_ST_BIND (psym->st_info) == STB_LOCAL
11914 && si >= section->sh_info
11915 /* Irix 5 and 6 MIPS binaries are known to ignore this requirement. */
11916 && filedata->file_header.e_machine != EM_MIPS
11917 /* Solaris binaries have been found to violate this requirement as
11918 well. Not sure if this is a bug or an ABI requirement. */
11919 && filedata->file_header.e_ident[EI_OSABI] != ELFOSABI_SOLARIS)
11920 warn (_("local symbol %u found at index >= %s's sh_info value of %u\n"),
11921 si, printable_section_name (filedata, section), section->sh_info);
11922 }
11923
11924 free (symtab);
11925 if (strtab != filedata->string_table)
11926 free (strtab);
11927 }
11928 }
11929 else if (do_syms)
11930 printf
11931 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
11932
11933 if (do_histogram && buckets != NULL)
11934 {
11935 unsigned long * lengths;
11936 unsigned long * counts;
11937 unsigned long hn;
11938 bfd_vma si;
11939 unsigned long maxlength = 0;
11940 unsigned long nzero_counts = 0;
11941 unsigned long nsyms = 0;
11942 char *visited;
11943
11944 printf (ngettext ("\nHistogram for bucket list length "
11945 "(total of %lu bucket):\n",
11946 "\nHistogram for bucket list length "
11947 "(total of %lu buckets):\n",
11948 (unsigned long) nbuckets),
11949 (unsigned long) nbuckets);
11950
11951 lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
11952 if (lengths == NULL)
11953 {
11954 error (_("Out of memory allocating space for histogram buckets\n"));
11955 return FALSE;
11956 }
11957 visited = xcmalloc (nchains, 1);
11958 memset (visited, 0, nchains);
11959
11960 printf (_(" Length Number %% of total Coverage\n"));
11961 for (hn = 0; hn < nbuckets; ++hn)
11962 {
11963 for (si = buckets[hn]; si > 0; si = chains[si])
11964 {
11965 ++nsyms;
11966 if (maxlength < ++lengths[hn])
11967 ++maxlength;
11968 if (si >= nchains || visited[si])
11969 {
11970 error (_("histogram chain is corrupt\n"));
11971 break;
11972 }
11973 visited[si] = 1;
11974 }
11975 }
11976 free (visited);
11977
11978 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11979 if (counts == NULL)
11980 {
11981 free (lengths);
11982 error (_("Out of memory allocating space for histogram counts\n"));
11983 return FALSE;
11984 }
11985
11986 for (hn = 0; hn < nbuckets; ++hn)
11987 ++counts[lengths[hn]];
11988
11989 if (nbuckets > 0)
11990 {
11991 unsigned long i;
11992 printf (" 0 %-10lu (%5.1f%%)\n",
11993 counts[0], (counts[0] * 100.0) / nbuckets);
11994 for (i = 1; i <= maxlength; ++i)
11995 {
11996 nzero_counts += counts[i] * i;
11997 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11998 i, counts[i], (counts[i] * 100.0) / nbuckets,
11999 (nzero_counts * 100.0) / nsyms);
12000 }
12001 }
12002
12003 free (counts);
12004 free (lengths);
12005 }
12006
12007 if (buckets != NULL)
12008 {
12009 free (buckets);
12010 free (chains);
12011 }
12012
12013 if (do_histogram && gnubuckets != NULL)
12014 {
12015 unsigned long * lengths;
12016 unsigned long * counts;
12017 unsigned long hn;
12018 unsigned long maxlength = 0;
12019 unsigned long nzero_counts = 0;
12020 unsigned long nsyms = 0;
12021
12022 printf (ngettext ("\nHistogram for `.gnu.hash' bucket list length "
12023 "(total of %lu bucket):\n",
12024 "\nHistogram for `.gnu.hash' bucket list length "
12025 "(total of %lu buckets):\n",
12026 (unsigned long) ngnubuckets),
12027 (unsigned long) ngnubuckets);
12028
12029 lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
12030 if (lengths == NULL)
12031 {
12032 error (_("Out of memory allocating space for gnu histogram buckets\n"));
12033 return FALSE;
12034 }
12035
12036 printf (_(" Length Number %% of total Coverage\n"));
12037
12038 for (hn = 0; hn < ngnubuckets; ++hn)
12039 if (gnubuckets[hn] != 0)
12040 {
12041 bfd_vma off, length = 1;
12042
12043 for (off = gnubuckets[hn] - gnusymidx;
12044 /* PR 17531 file: 010-77222-0.004. */
12045 off < ngnuchains && (gnuchains[off] & 1) == 0;
12046 ++off)
12047 ++length;
12048 lengths[hn] = length;
12049 if (length > maxlength)
12050 maxlength = length;
12051 nsyms += length;
12052 }
12053
12054 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
12055 if (counts == NULL)
12056 {
12057 free (lengths);
12058 error (_("Out of memory allocating space for gnu histogram counts\n"));
12059 return FALSE;
12060 }
12061
12062 for (hn = 0; hn < ngnubuckets; ++hn)
12063 ++counts[lengths[hn]];
12064
12065 if (ngnubuckets > 0)
12066 {
12067 unsigned long j;
12068 printf (" 0 %-10lu (%5.1f%%)\n",
12069 counts[0], (counts[0] * 100.0) / ngnubuckets);
12070 for (j = 1; j <= maxlength; ++j)
12071 {
12072 nzero_counts += counts[j] * j;
12073 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
12074 j, counts[j], (counts[j] * 100.0) / ngnubuckets,
12075 (nzero_counts * 100.0) / nsyms);
12076 }
12077 }
12078
12079 free (counts);
12080 free (lengths);
12081 free (gnubuckets);
12082 free (gnuchains);
12083 }
12084
12085 return TRUE;
12086 }
12087
12088 static bfd_boolean
12089 process_syminfo (Filedata * filedata ATTRIBUTE_UNUSED)
12090 {
12091 unsigned int i;
12092
12093 if (dynamic_syminfo == NULL
12094 || !do_dynamic)
12095 /* No syminfo, this is ok. */
12096 return TRUE;
12097
12098 /* There better should be a dynamic symbol section. */
12099 if (dynamic_symbols == NULL || dynamic_strings == NULL)
12100 return FALSE;
12101
12102 if (dynamic_addr)
12103 printf (ngettext ("\nDynamic info segment at offset 0x%lx "
12104 "contains %d entry:\n",
12105 "\nDynamic info segment at offset 0x%lx "
12106 "contains %d entries:\n",
12107 dynamic_syminfo_nent),
12108 dynamic_syminfo_offset, dynamic_syminfo_nent);
12109
12110 printf (_(" Num: Name BoundTo Flags\n"));
12111 for (i = 0; i < dynamic_syminfo_nent; ++i)
12112 {
12113 unsigned short int flags = dynamic_syminfo[i].si_flags;
12114
12115 printf ("%4d: ", i);
12116 if (i >= num_dynamic_syms)
12117 printf (_("<corrupt index>"));
12118 else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
12119 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
12120 else
12121 printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
12122 putchar (' ');
12123
12124 switch (dynamic_syminfo[i].si_boundto)
12125 {
12126 case SYMINFO_BT_SELF:
12127 fputs ("SELF ", stdout);
12128 break;
12129 case SYMINFO_BT_PARENT:
12130 fputs ("PARENT ", stdout);
12131 break;
12132 default:
12133 if (dynamic_syminfo[i].si_boundto > 0
12134 && dynamic_syminfo[i].si_boundto < dynamic_nent
12135 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
12136 {
12137 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
12138 putchar (' ' );
12139 }
12140 else
12141 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
12142 break;
12143 }
12144
12145 if (flags & SYMINFO_FLG_DIRECT)
12146 printf (" DIRECT");
12147 if (flags & SYMINFO_FLG_PASSTHRU)
12148 printf (" PASSTHRU");
12149 if (flags & SYMINFO_FLG_COPY)
12150 printf (" COPY");
12151 if (flags & SYMINFO_FLG_LAZYLOAD)
12152 printf (" LAZYLOAD");
12153
12154 puts ("");
12155 }
12156
12157 return TRUE;
12158 }
12159
12160 #define IN_RANGE(START,END,ADDR,OFF) \
12161 (((ADDR) >= (START)) && ((ADDR) + (OFF) < (END)))
12162
12163 /* Check to see if the given reloc needs to be handled in a target specific
12164 manner. If so then process the reloc and return TRUE otherwise return
12165 FALSE.
12166
12167 If called with reloc == NULL, then this is a signal that reloc processing
12168 for the current section has finished, and any saved state should be
12169 discarded. */
12170
12171 static bfd_boolean
12172 target_specific_reloc_handling (Filedata * filedata,
12173 Elf_Internal_Rela * reloc,
12174 unsigned char * start,
12175 unsigned char * end,
12176 Elf_Internal_Sym * symtab,
12177 unsigned long num_syms)
12178 {
12179 unsigned int reloc_type = 0;
12180 unsigned long sym_index = 0;
12181
12182 if (reloc)
12183 {
12184 reloc_type = get_reloc_type (filedata, reloc->r_info);
12185 sym_index = get_reloc_symindex (reloc->r_info);
12186 }
12187
12188 switch (filedata->file_header.e_machine)
12189 {
12190 case EM_MSP430:
12191 case EM_MSP430_OLD:
12192 {
12193 static Elf_Internal_Sym * saved_sym = NULL;
12194
12195 if (reloc == NULL)
12196 {
12197 saved_sym = NULL;
12198 return TRUE;
12199 }
12200
12201 switch (reloc_type)
12202 {
12203 case 10: /* R_MSP430_SYM_DIFF */
12204 if (uses_msp430x_relocs (filedata))
12205 break;
12206 /* Fall through. */
12207 case 21: /* R_MSP430X_SYM_DIFF */
12208 /* PR 21139. */
12209 if (sym_index >= num_syms)
12210 error (_("MSP430 SYM_DIFF reloc contains invalid symbol index %lu\n"),
12211 sym_index);
12212 else
12213 saved_sym = symtab + sym_index;
12214 return TRUE;
12215
12216 case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
12217 case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
12218 goto handle_sym_diff;
12219
12220 case 5: /* R_MSP430_16_BYTE */
12221 case 9: /* R_MSP430_8 */
12222 if (uses_msp430x_relocs (filedata))
12223 break;
12224 goto handle_sym_diff;
12225
12226 case 2: /* R_MSP430_ABS16 */
12227 case 15: /* R_MSP430X_ABS16 */
12228 if (! uses_msp430x_relocs (filedata))
12229 break;
12230 goto handle_sym_diff;
12231
12232 handle_sym_diff:
12233 if (saved_sym != NULL)
12234 {
12235 int reloc_size = reloc_type == 1 ? 4 : 2;
12236 bfd_vma value;
12237
12238 if (sym_index >= num_syms)
12239 error (_("MSP430 reloc contains invalid symbol index %lu\n"),
12240 sym_index);
12241 else
12242 {
12243 value = reloc->r_addend + (symtab[sym_index].st_value
12244 - saved_sym->st_value);
12245
12246 if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
12247 byte_put (start + reloc->r_offset, value, reloc_size);
12248 else
12249 /* PR 21137 */
12250 error (_("MSP430 sym diff reloc contains invalid offset: 0x%lx\n"),
12251 (long) reloc->r_offset);
12252 }
12253
12254 saved_sym = NULL;
12255 return TRUE;
12256 }
12257 break;
12258
12259 default:
12260 if (saved_sym != NULL)
12261 error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
12262 break;
12263 }
12264 break;
12265 }
12266
12267 case EM_MN10300:
12268 case EM_CYGNUS_MN10300:
12269 {
12270 static Elf_Internal_Sym * saved_sym = NULL;
12271
12272 if (reloc == NULL)
12273 {
12274 saved_sym = NULL;
12275 return TRUE;
12276 }
12277
12278 switch (reloc_type)
12279 {
12280 case 34: /* R_MN10300_ALIGN */
12281 return TRUE;
12282 case 33: /* R_MN10300_SYM_DIFF */
12283 if (sym_index >= num_syms)
12284 error (_("MN10300_SYM_DIFF reloc contains invalid symbol index %lu\n"),
12285 sym_index);
12286 else
12287 saved_sym = symtab + sym_index;
12288 return TRUE;
12289
12290 case 1: /* R_MN10300_32 */
12291 case 2: /* R_MN10300_16 */
12292 if (saved_sym != NULL)
12293 {
12294 int reloc_size = reloc_type == 1 ? 4 : 2;
12295 bfd_vma value;
12296
12297 if (sym_index >= num_syms)
12298 error (_("MN10300 reloc contains invalid symbol index %lu\n"),
12299 sym_index);
12300 else
12301 {
12302 value = reloc->r_addend + (symtab[sym_index].st_value
12303 - saved_sym->st_value);
12304
12305 if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
12306 byte_put (start + reloc->r_offset, value, reloc_size);
12307 else
12308 error (_("MN10300 sym diff reloc contains invalid offset: 0x%lx\n"),
12309 (long) reloc->r_offset);
12310 }
12311
12312 saved_sym = NULL;
12313 return TRUE;
12314 }
12315 break;
12316 default:
12317 if (saved_sym != NULL)
12318 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
12319 break;
12320 }
12321 break;
12322 }
12323
12324 case EM_RL78:
12325 {
12326 static bfd_vma saved_sym1 = 0;
12327 static bfd_vma saved_sym2 = 0;
12328 static bfd_vma value;
12329
12330 if (reloc == NULL)
12331 {
12332 saved_sym1 = saved_sym2 = 0;
12333 return TRUE;
12334 }
12335
12336 switch (reloc_type)
12337 {
12338 case 0x80: /* R_RL78_SYM. */
12339 saved_sym1 = saved_sym2;
12340 if (sym_index >= num_syms)
12341 error (_("RL78_SYM reloc contains invalid symbol index %lu\n"),
12342 sym_index);
12343 else
12344 {
12345 saved_sym2 = symtab[sym_index].st_value;
12346 saved_sym2 += reloc->r_addend;
12347 }
12348 return TRUE;
12349
12350 case 0x83: /* R_RL78_OPsub. */
12351 value = saved_sym1 - saved_sym2;
12352 saved_sym2 = saved_sym1 = 0;
12353 return TRUE;
12354 break;
12355
12356 case 0x41: /* R_RL78_ABS32. */
12357 if (IN_RANGE (start, end, start + reloc->r_offset, 4))
12358 byte_put (start + reloc->r_offset, value, 4);
12359 else
12360 error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12361 (long) reloc->r_offset);
12362 value = 0;
12363 return TRUE;
12364
12365 case 0x43: /* R_RL78_ABS16. */
12366 if (IN_RANGE (start, end, start + reloc->r_offset, 2))
12367 byte_put (start + reloc->r_offset, value, 2);
12368 else
12369 error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12370 (long) reloc->r_offset);
12371 value = 0;
12372 return TRUE;
12373
12374 default:
12375 break;
12376 }
12377 break;
12378 }
12379 }
12380
12381 return FALSE;
12382 }
12383
12384 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
12385 DWARF debug sections. This is a target specific test. Note - we do not
12386 go through the whole including-target-headers-multiple-times route, (as
12387 we have already done with <elf/h8.h>) because this would become very
12388 messy and even then this function would have to contain target specific
12389 information (the names of the relocs instead of their numeric values).
12390 FIXME: This is not the correct way to solve this problem. The proper way
12391 is to have target specific reloc sizing and typing functions created by
12392 the reloc-macros.h header, in the same way that it already creates the
12393 reloc naming functions. */
12394
12395 static bfd_boolean
12396 is_32bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12397 {
12398 /* Please keep this table alpha-sorted for ease of visual lookup. */
12399 switch (filedata->file_header.e_machine)
12400 {
12401 case EM_386:
12402 case EM_IAMCU:
12403 return reloc_type == 1; /* R_386_32. */
12404 case EM_68K:
12405 return reloc_type == 1; /* R_68K_32. */
12406 case EM_860:
12407 return reloc_type == 1; /* R_860_32. */
12408 case EM_960:
12409 return reloc_type == 2; /* R_960_32. */
12410 case EM_AARCH64:
12411 return (reloc_type == 258
12412 || reloc_type == 1); /* R_AARCH64_ABS32 || R_AARCH64_P32_ABS32 */
12413 case EM_ADAPTEVA_EPIPHANY:
12414 return reloc_type == 3;
12415 case EM_ALPHA:
12416 return reloc_type == 1; /* R_ALPHA_REFLONG. */
12417 case EM_ARC:
12418 return reloc_type == 1; /* R_ARC_32. */
12419 case EM_ARC_COMPACT:
12420 case EM_ARC_COMPACT2:
12421 return reloc_type == 4; /* R_ARC_32. */
12422 case EM_ARM:
12423 return reloc_type == 2; /* R_ARM_ABS32 */
12424 case EM_AVR_OLD:
12425 case EM_AVR:
12426 return reloc_type == 1;
12427 case EM_BLACKFIN:
12428 return reloc_type == 0x12; /* R_byte4_data. */
12429 case EM_CRIS:
12430 return reloc_type == 3; /* R_CRIS_32. */
12431 case EM_CR16:
12432 return reloc_type == 3; /* R_CR16_NUM32. */
12433 case EM_CRX:
12434 return reloc_type == 15; /* R_CRX_NUM32. */
12435 case EM_CSKY:
12436 return reloc_type == 1; /* R_CKCORE_ADDR32. */
12437 case EM_CYGNUS_FRV:
12438 return reloc_type == 1;
12439 case EM_CYGNUS_D10V:
12440 case EM_D10V:
12441 return reloc_type == 6; /* R_D10V_32. */
12442 case EM_CYGNUS_D30V:
12443 case EM_D30V:
12444 return reloc_type == 12; /* R_D30V_32_NORMAL. */
12445 case EM_DLX:
12446 return reloc_type == 3; /* R_DLX_RELOC_32. */
12447 case EM_CYGNUS_FR30:
12448 case EM_FR30:
12449 return reloc_type == 3; /* R_FR30_32. */
12450 case EM_FT32:
12451 return reloc_type == 1; /* R_FT32_32. */
12452 case EM_H8S:
12453 case EM_H8_300:
12454 case EM_H8_300H:
12455 return reloc_type == 1; /* R_H8_DIR32. */
12456 case EM_IA_64:
12457 return (reloc_type == 0x64 /* R_IA64_SECREL32MSB. */
12458 || reloc_type == 0x65 /* R_IA64_SECREL32LSB. */
12459 || reloc_type == 0x24 /* R_IA64_DIR32MSB. */
12460 || reloc_type == 0x25 /* R_IA64_DIR32LSB. */);
12461 case EM_IP2K_OLD:
12462 case EM_IP2K:
12463 return reloc_type == 2; /* R_IP2K_32. */
12464 case EM_IQ2000:
12465 return reloc_type == 2; /* R_IQ2000_32. */
12466 case EM_LATTICEMICO32:
12467 return reloc_type == 3; /* R_LM32_32. */
12468 case EM_M32C_OLD:
12469 case EM_M32C:
12470 return reloc_type == 3; /* R_M32C_32. */
12471 case EM_M32R:
12472 return reloc_type == 34; /* R_M32R_32_RELA. */
12473 case EM_68HC11:
12474 case EM_68HC12:
12475 return reloc_type == 6; /* R_M68HC11_32. */
12476 case EM_S12Z:
12477 return reloc_type == 7 || /* R_S12Z_EXT32 */
12478 reloc_type == 6; /* R_S12Z_CW32. */
12479 case EM_MCORE:
12480 return reloc_type == 1; /* R_MCORE_ADDR32. */
12481 case EM_CYGNUS_MEP:
12482 return reloc_type == 4; /* R_MEP_32. */
12483 case EM_METAG:
12484 return reloc_type == 2; /* R_METAG_ADDR32. */
12485 case EM_MICROBLAZE:
12486 return reloc_type == 1; /* R_MICROBLAZE_32. */
12487 case EM_MIPS:
12488 return reloc_type == 2; /* R_MIPS_32. */
12489 case EM_MMIX:
12490 return reloc_type == 4; /* R_MMIX_32. */
12491 case EM_CYGNUS_MN10200:
12492 case EM_MN10200:
12493 return reloc_type == 1; /* R_MN10200_32. */
12494 case EM_CYGNUS_MN10300:
12495 case EM_MN10300:
12496 return reloc_type == 1; /* R_MN10300_32. */
12497 case EM_MOXIE:
12498 return reloc_type == 1; /* R_MOXIE_32. */
12499 case EM_MSP430_OLD:
12500 case EM_MSP430:
12501 return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32. */
12502 case EM_MT:
12503 return reloc_type == 2; /* R_MT_32. */
12504 case EM_NDS32:
12505 return reloc_type == 20; /* R_NDS32_RELA. */
12506 case EM_ALTERA_NIOS2:
12507 return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32. */
12508 case EM_NIOS32:
12509 return reloc_type == 1; /* R_NIOS_32. */
12510 case EM_OR1K:
12511 return reloc_type == 1; /* R_OR1K_32. */
12512 case EM_PARISC:
12513 return (reloc_type == 1 /* R_PARISC_DIR32. */
12514 || reloc_type == 2 /* R_PARISC_DIR21L. */
12515 || reloc_type == 41); /* R_PARISC_SECREL32. */
12516 case EM_PJ:
12517 case EM_PJ_OLD:
12518 return reloc_type == 1; /* R_PJ_DATA_DIR32. */
12519 case EM_PPC64:
12520 return reloc_type == 1; /* R_PPC64_ADDR32. */
12521 case EM_PPC:
12522 return reloc_type == 1; /* R_PPC_ADDR32. */
12523 case EM_TI_PRU:
12524 return reloc_type == 11; /* R_PRU_BFD_RELOC_32. */
12525 case EM_RISCV:
12526 return reloc_type == 1; /* R_RISCV_32. */
12527 case EM_RL78:
12528 return reloc_type == 1; /* R_RL78_DIR32. */
12529 case EM_RX:
12530 return reloc_type == 1; /* R_RX_DIR32. */
12531 case EM_S370:
12532 return reloc_type == 1; /* R_I370_ADDR31. */
12533 case EM_S390_OLD:
12534 case EM_S390:
12535 return reloc_type == 4; /* R_S390_32. */
12536 case EM_SCORE:
12537 return reloc_type == 8; /* R_SCORE_ABS32. */
12538 case EM_SH:
12539 return reloc_type == 1; /* R_SH_DIR32. */
12540 case EM_SPARC32PLUS:
12541 case EM_SPARCV9:
12542 case EM_SPARC:
12543 return reloc_type == 3 /* R_SPARC_32. */
12544 || reloc_type == 23; /* R_SPARC_UA32. */
12545 case EM_SPU:
12546 return reloc_type == 6; /* R_SPU_ADDR32 */
12547 case EM_TI_C6000:
12548 return reloc_type == 1; /* R_C6000_ABS32. */
12549 case EM_TILEGX:
12550 return reloc_type == 2; /* R_TILEGX_32. */
12551 case EM_TILEPRO:
12552 return reloc_type == 1; /* R_TILEPRO_32. */
12553 case EM_CYGNUS_V850:
12554 case EM_V850:
12555 return reloc_type == 6; /* R_V850_ABS32. */
12556 case EM_V800:
12557 return reloc_type == 0x33; /* R_V810_WORD. */
12558 case EM_VAX:
12559 return reloc_type == 1; /* R_VAX_32. */
12560 case EM_VISIUM:
12561 return reloc_type == 3; /* R_VISIUM_32. */
12562 case EM_WEBASSEMBLY:
12563 return reloc_type == 1; /* R_WASM32_32. */
12564 case EM_X86_64:
12565 case EM_L1OM:
12566 case EM_K1OM:
12567 return reloc_type == 10; /* R_X86_64_32. */
12568 case EM_XC16X:
12569 case EM_C166:
12570 return reloc_type == 3; /* R_XC16C_ABS_32. */
12571 case EM_XGATE:
12572 return reloc_type == 4; /* R_XGATE_32. */
12573 case EM_XSTORMY16:
12574 return reloc_type == 1; /* R_XSTROMY16_32. */
12575 case EM_XTENSA_OLD:
12576 case EM_XTENSA:
12577 return reloc_type == 1; /* R_XTENSA_32. */
12578 default:
12579 {
12580 static unsigned int prev_warn = 0;
12581
12582 /* Avoid repeating the same warning multiple times. */
12583 if (prev_warn != filedata->file_header.e_machine)
12584 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
12585 filedata->file_header.e_machine);
12586 prev_warn = filedata->file_header.e_machine;
12587 return FALSE;
12588 }
12589 }
12590 }
12591
12592 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12593 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
12594
12595 static bfd_boolean
12596 is_32bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
12597 {
12598 switch (filedata->file_header.e_machine)
12599 /* Please keep this table alpha-sorted for ease of visual lookup. */
12600 {
12601 case EM_386:
12602 case EM_IAMCU:
12603 return reloc_type == 2; /* R_386_PC32. */
12604 case EM_68K:
12605 return reloc_type == 4; /* R_68K_PC32. */
12606 case EM_AARCH64:
12607 return reloc_type == 261; /* R_AARCH64_PREL32 */
12608 case EM_ADAPTEVA_EPIPHANY:
12609 return reloc_type == 6;
12610 case EM_ALPHA:
12611 return reloc_type == 10; /* R_ALPHA_SREL32. */
12612 case EM_ARC_COMPACT:
12613 case EM_ARC_COMPACT2:
12614 return reloc_type == 49; /* R_ARC_32_PCREL. */
12615 case EM_ARM:
12616 return reloc_type == 3; /* R_ARM_REL32 */
12617 case EM_AVR_OLD:
12618 case EM_AVR:
12619 return reloc_type == 36; /* R_AVR_32_PCREL. */
12620 case EM_MICROBLAZE:
12621 return reloc_type == 2; /* R_MICROBLAZE_32_PCREL. */
12622 case EM_OR1K:
12623 return reloc_type == 9; /* R_OR1K_32_PCREL. */
12624 case EM_PARISC:
12625 return reloc_type == 9; /* R_PARISC_PCREL32. */
12626 case EM_PPC:
12627 return reloc_type == 26; /* R_PPC_REL32. */
12628 case EM_PPC64:
12629 return reloc_type == 26; /* R_PPC64_REL32. */
12630 case EM_RISCV:
12631 return reloc_type == 57; /* R_RISCV_32_PCREL. */
12632 case EM_S390_OLD:
12633 case EM_S390:
12634 return reloc_type == 5; /* R_390_PC32. */
12635 case EM_SH:
12636 return reloc_type == 2; /* R_SH_REL32. */
12637 case EM_SPARC32PLUS:
12638 case EM_SPARCV9:
12639 case EM_SPARC:
12640 return reloc_type == 6; /* R_SPARC_DISP32. */
12641 case EM_SPU:
12642 return reloc_type == 13; /* R_SPU_REL32. */
12643 case EM_TILEGX:
12644 return reloc_type == 6; /* R_TILEGX_32_PCREL. */
12645 case EM_TILEPRO:
12646 return reloc_type == 4; /* R_TILEPRO_32_PCREL. */
12647 case EM_VISIUM:
12648 return reloc_type == 6; /* R_VISIUM_32_PCREL */
12649 case EM_X86_64:
12650 case EM_L1OM:
12651 case EM_K1OM:
12652 return reloc_type == 2; /* R_X86_64_PC32. */
12653 case EM_XTENSA_OLD:
12654 case EM_XTENSA:
12655 return reloc_type == 14; /* R_XTENSA_32_PCREL. */
12656 default:
12657 /* Do not abort or issue an error message here. Not all targets use
12658 pc-relative 32-bit relocs in their DWARF debug information and we
12659 have already tested for target coverage in is_32bit_abs_reloc. A
12660 more helpful warning message will be generated by apply_relocations
12661 anyway, so just return. */
12662 return FALSE;
12663 }
12664 }
12665
12666 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12667 a 64-bit absolute RELA relocation used in DWARF debug sections. */
12668
12669 static bfd_boolean
12670 is_64bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12671 {
12672 switch (filedata->file_header.e_machine)
12673 {
12674 case EM_AARCH64:
12675 return reloc_type == 257; /* R_AARCH64_ABS64. */
12676 case EM_ALPHA:
12677 return reloc_type == 2; /* R_ALPHA_REFQUAD. */
12678 case EM_IA_64:
12679 return (reloc_type == 0x26 /* R_IA64_DIR64MSB. */
12680 || reloc_type == 0x27 /* R_IA64_DIR64LSB. */);
12681 case EM_PARISC:
12682 return reloc_type == 80; /* R_PARISC_DIR64. */
12683 case EM_PPC64:
12684 return reloc_type == 38; /* R_PPC64_ADDR64. */
12685 case EM_RISCV:
12686 return reloc_type == 2; /* R_RISCV_64. */
12687 case EM_SPARC32PLUS:
12688 case EM_SPARCV9:
12689 case EM_SPARC:
12690 return reloc_type == 32 /* R_SPARC_64. */
12691 || reloc_type == 54; /* R_SPARC_UA64. */
12692 case EM_X86_64:
12693 case EM_L1OM:
12694 case EM_K1OM:
12695 return reloc_type == 1; /* R_X86_64_64. */
12696 case EM_S390_OLD:
12697 case EM_S390:
12698 return reloc_type == 22; /* R_S390_64. */
12699 case EM_TILEGX:
12700 return reloc_type == 1; /* R_TILEGX_64. */
12701 case EM_MIPS:
12702 return reloc_type == 18; /* R_MIPS_64. */
12703 default:
12704 return FALSE;
12705 }
12706 }
12707
12708 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
12709 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
12710
12711 static bfd_boolean
12712 is_64bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
12713 {
12714 switch (filedata->file_header.e_machine)
12715 {
12716 case EM_AARCH64:
12717 return reloc_type == 260; /* R_AARCH64_PREL64. */
12718 case EM_ALPHA:
12719 return reloc_type == 11; /* R_ALPHA_SREL64. */
12720 case EM_IA_64:
12721 return (reloc_type == 0x4e /* R_IA64_PCREL64MSB. */
12722 || reloc_type == 0x4f /* R_IA64_PCREL64LSB. */);
12723 case EM_PARISC:
12724 return reloc_type == 72; /* R_PARISC_PCREL64. */
12725 case EM_PPC64:
12726 return reloc_type == 44; /* R_PPC64_REL64. */
12727 case EM_SPARC32PLUS:
12728 case EM_SPARCV9:
12729 case EM_SPARC:
12730 return reloc_type == 46; /* R_SPARC_DISP64. */
12731 case EM_X86_64:
12732 case EM_L1OM:
12733 case EM_K1OM:
12734 return reloc_type == 24; /* R_X86_64_PC64. */
12735 case EM_S390_OLD:
12736 case EM_S390:
12737 return reloc_type == 23; /* R_S390_PC64. */
12738 case EM_TILEGX:
12739 return reloc_type == 5; /* R_TILEGX_64_PCREL. */
12740 default:
12741 return FALSE;
12742 }
12743 }
12744
12745 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12746 a 24-bit absolute RELA relocation used in DWARF debug sections. */
12747
12748 static bfd_boolean
12749 is_24bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12750 {
12751 switch (filedata->file_header.e_machine)
12752 {
12753 case EM_CYGNUS_MN10200:
12754 case EM_MN10200:
12755 return reloc_type == 4; /* R_MN10200_24. */
12756 case EM_FT32:
12757 return reloc_type == 5; /* R_FT32_20. */
12758 default:
12759 return FALSE;
12760 }
12761 }
12762
12763 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12764 a 16-bit absolute RELA relocation used in DWARF debug sections. */
12765
12766 static bfd_boolean
12767 is_16bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12768 {
12769 /* Please keep this table alpha-sorted for ease of visual lookup. */
12770 switch (filedata->file_header.e_machine)
12771 {
12772 case EM_ARC:
12773 case EM_ARC_COMPACT:
12774 case EM_ARC_COMPACT2:
12775 return reloc_type == 2; /* R_ARC_16. */
12776 case EM_ADAPTEVA_EPIPHANY:
12777 return reloc_type == 5;
12778 case EM_AVR_OLD:
12779 case EM_AVR:
12780 return reloc_type == 4; /* R_AVR_16. */
12781 case EM_CYGNUS_D10V:
12782 case EM_D10V:
12783 return reloc_type == 3; /* R_D10V_16. */
12784 case EM_FT32:
12785 return reloc_type == 2; /* R_FT32_16. */
12786 case EM_H8S:
12787 case EM_H8_300:
12788 case EM_H8_300H:
12789 return reloc_type == R_H8_DIR16;
12790 case EM_IP2K_OLD:
12791 case EM_IP2K:
12792 return reloc_type == 1; /* R_IP2K_16. */
12793 case EM_M32C_OLD:
12794 case EM_M32C:
12795 return reloc_type == 1; /* R_M32C_16 */
12796 case EM_CYGNUS_MN10200:
12797 case EM_MN10200:
12798 return reloc_type == 2; /* R_MN10200_16. */
12799 case EM_CYGNUS_MN10300:
12800 case EM_MN10300:
12801 return reloc_type == 2; /* R_MN10300_16. */
12802 case EM_MSP430:
12803 if (uses_msp430x_relocs (filedata))
12804 return reloc_type == 2; /* R_MSP430_ABS16. */
12805 /* Fall through. */
12806 case EM_MSP430_OLD:
12807 return reloc_type == 5; /* R_MSP430_16_BYTE. */
12808 case EM_NDS32:
12809 return reloc_type == 19; /* R_NDS32_RELA. */
12810 case EM_ALTERA_NIOS2:
12811 return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16. */
12812 case EM_NIOS32:
12813 return reloc_type == 9; /* R_NIOS_16. */
12814 case EM_OR1K:
12815 return reloc_type == 2; /* R_OR1K_16. */
12816 case EM_RISCV:
12817 return reloc_type == 55; /* R_RISCV_SET16. */
12818 case EM_TI_PRU:
12819 return reloc_type == 8; /* R_PRU_BFD_RELOC_16. */
12820 case EM_TI_C6000:
12821 return reloc_type == 2; /* R_C6000_ABS16. */
12822 case EM_VISIUM:
12823 return reloc_type == 2; /* R_VISIUM_16. */
12824 case EM_XC16X:
12825 case EM_C166:
12826 return reloc_type == 2; /* R_XC16C_ABS_16. */
12827 case EM_XGATE:
12828 return reloc_type == 3; /* R_XGATE_16. */
12829 default:
12830 return FALSE;
12831 }
12832 }
12833
12834 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12835 a 8-bit absolute RELA relocation used in DWARF debug sections. */
12836
12837 static bfd_boolean
12838 is_8bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12839 {
12840 switch (filedata->file_header.e_machine)
12841 {
12842 case EM_RISCV:
12843 return reloc_type == 54; /* R_RISCV_SET8. */
12844 default:
12845 return FALSE;
12846 }
12847 }
12848
12849 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12850 a 6-bit absolute RELA relocation used in DWARF debug sections. */
12851
12852 static bfd_boolean
12853 is_6bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12854 {
12855 switch (filedata->file_header.e_machine)
12856 {
12857 case EM_RISCV:
12858 return reloc_type == 53; /* R_RISCV_SET6. */
12859 default:
12860 return FALSE;
12861 }
12862 }
12863
12864 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12865 a 32-bit inplace add RELA relocation used in DWARF debug sections. */
12866
12867 static bfd_boolean
12868 is_32bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12869 {
12870 /* Please keep this table alpha-sorted for ease of visual lookup. */
12871 switch (filedata->file_header.e_machine)
12872 {
12873 case EM_RISCV:
12874 return reloc_type == 35; /* R_RISCV_ADD32. */
12875 default:
12876 return FALSE;
12877 }
12878 }
12879
12880 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12881 a 32-bit inplace sub RELA relocation used in DWARF debug sections. */
12882
12883 static bfd_boolean
12884 is_32bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12885 {
12886 /* Please keep this table alpha-sorted for ease of visual lookup. */
12887 switch (filedata->file_header.e_machine)
12888 {
12889 case EM_RISCV:
12890 return reloc_type == 39; /* R_RISCV_SUB32. */
12891 default:
12892 return FALSE;
12893 }
12894 }
12895
12896 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12897 a 64-bit inplace add RELA relocation used in DWARF debug sections. */
12898
12899 static bfd_boolean
12900 is_64bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12901 {
12902 /* Please keep this table alpha-sorted for ease of visual lookup. */
12903 switch (filedata->file_header.e_machine)
12904 {
12905 case EM_RISCV:
12906 return reloc_type == 36; /* R_RISCV_ADD64. */
12907 default:
12908 return FALSE;
12909 }
12910 }
12911
12912 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12913 a 64-bit inplace sub RELA relocation used in DWARF debug sections. */
12914
12915 static bfd_boolean
12916 is_64bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12917 {
12918 /* Please keep this table alpha-sorted for ease of visual lookup. */
12919 switch (filedata->file_header.e_machine)
12920 {
12921 case EM_RISCV:
12922 return reloc_type == 40; /* R_RISCV_SUB64. */
12923 default:
12924 return FALSE;
12925 }
12926 }
12927
12928 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12929 a 16-bit inplace add RELA relocation used in DWARF debug sections. */
12930
12931 static bfd_boolean
12932 is_16bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12933 {
12934 /* Please keep this table alpha-sorted for ease of visual lookup. */
12935 switch (filedata->file_header.e_machine)
12936 {
12937 case EM_RISCV:
12938 return reloc_type == 34; /* R_RISCV_ADD16. */
12939 default:
12940 return FALSE;
12941 }
12942 }
12943
12944 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12945 a 16-bit inplace sub RELA relocation used in DWARF debug sections. */
12946
12947 static bfd_boolean
12948 is_16bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12949 {
12950 /* Please keep this table alpha-sorted for ease of visual lookup. */
12951 switch (filedata->file_header.e_machine)
12952 {
12953 case EM_RISCV:
12954 return reloc_type == 38; /* R_RISCV_SUB16. */
12955 default:
12956 return FALSE;
12957 }
12958 }
12959
12960 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12961 a 8-bit inplace add RELA relocation used in DWARF debug sections. */
12962
12963 static bfd_boolean
12964 is_8bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12965 {
12966 /* Please keep this table alpha-sorted for ease of visual lookup. */
12967 switch (filedata->file_header.e_machine)
12968 {
12969 case EM_RISCV:
12970 return reloc_type == 33; /* R_RISCV_ADD8. */
12971 default:
12972 return FALSE;
12973 }
12974 }
12975
12976 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12977 a 8-bit inplace sub RELA relocation used in DWARF debug sections. */
12978
12979 static bfd_boolean
12980 is_8bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12981 {
12982 /* Please keep this table alpha-sorted for ease of visual lookup. */
12983 switch (filedata->file_header.e_machine)
12984 {
12985 case EM_RISCV:
12986 return reloc_type == 37; /* R_RISCV_SUB8. */
12987 default:
12988 return FALSE;
12989 }
12990 }
12991
12992 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12993 a 6-bit inplace sub RELA relocation used in DWARF debug sections. */
12994
12995 static bfd_boolean
12996 is_6bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12997 {
12998 switch (filedata->file_header.e_machine)
12999 {
13000 case EM_RISCV:
13001 return reloc_type == 52; /* R_RISCV_SUB6. */
13002 default:
13003 return FALSE;
13004 }
13005 }
13006
13007 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
13008 relocation entries (possibly formerly used for SHT_GROUP sections). */
13009
13010 static bfd_boolean
13011 is_none_reloc (Filedata * filedata, unsigned int reloc_type)
13012 {
13013 switch (filedata->file_header.e_machine)
13014 {
13015 case EM_386: /* R_386_NONE. */
13016 case EM_68K: /* R_68K_NONE. */
13017 case EM_ADAPTEVA_EPIPHANY:
13018 case EM_ALPHA: /* R_ALPHA_NONE. */
13019 case EM_ALTERA_NIOS2: /* R_NIOS2_NONE. */
13020 case EM_ARC: /* R_ARC_NONE. */
13021 case EM_ARC_COMPACT2: /* R_ARC_NONE. */
13022 case EM_ARC_COMPACT: /* R_ARC_NONE. */
13023 case EM_ARM: /* R_ARM_NONE. */
13024 case EM_C166: /* R_XC16X_NONE. */
13025 case EM_CRIS: /* R_CRIS_NONE. */
13026 case EM_FT32: /* R_FT32_NONE. */
13027 case EM_IA_64: /* R_IA64_NONE. */
13028 case EM_K1OM: /* R_X86_64_NONE. */
13029 case EM_L1OM: /* R_X86_64_NONE. */
13030 case EM_M32R: /* R_M32R_NONE. */
13031 case EM_MIPS: /* R_MIPS_NONE. */
13032 case EM_MN10300: /* R_MN10300_NONE. */
13033 case EM_MOXIE: /* R_MOXIE_NONE. */
13034 case EM_NIOS32: /* R_NIOS_NONE. */
13035 case EM_OR1K: /* R_OR1K_NONE. */
13036 case EM_PARISC: /* R_PARISC_NONE. */
13037 case EM_PPC64: /* R_PPC64_NONE. */
13038 case EM_PPC: /* R_PPC_NONE. */
13039 case EM_RISCV: /* R_RISCV_NONE. */
13040 case EM_S390: /* R_390_NONE. */
13041 case EM_S390_OLD:
13042 case EM_SH: /* R_SH_NONE. */
13043 case EM_SPARC32PLUS:
13044 case EM_SPARC: /* R_SPARC_NONE. */
13045 case EM_SPARCV9:
13046 case EM_TILEGX: /* R_TILEGX_NONE. */
13047 case EM_TILEPRO: /* R_TILEPRO_NONE. */
13048 case EM_TI_C6000:/* R_C6000_NONE. */
13049 case EM_X86_64: /* R_X86_64_NONE. */
13050 case EM_XC16X:
13051 case EM_WEBASSEMBLY: /* R_WASM32_NONE. */
13052 return reloc_type == 0;
13053
13054 case EM_AARCH64:
13055 return reloc_type == 0 || reloc_type == 256;
13056 case EM_AVR_OLD:
13057 case EM_AVR:
13058 return (reloc_type == 0 /* R_AVR_NONE. */
13059 || reloc_type == 30 /* R_AVR_DIFF8. */
13060 || reloc_type == 31 /* R_AVR_DIFF16. */
13061 || reloc_type == 32 /* R_AVR_DIFF32. */);
13062 case EM_METAG:
13063 return reloc_type == 3; /* R_METAG_NONE. */
13064 case EM_NDS32:
13065 return (reloc_type == 0 /* R_XTENSA_NONE. */
13066 || reloc_type == 204 /* R_NDS32_DIFF8. */
13067 || reloc_type == 205 /* R_NDS32_DIFF16. */
13068 || reloc_type == 206 /* R_NDS32_DIFF32. */
13069 || reloc_type == 207 /* R_NDS32_ULEB128. */);
13070 case EM_TI_PRU:
13071 return (reloc_type == 0 /* R_PRU_NONE. */
13072 || reloc_type == 65 /* R_PRU_DIFF8. */
13073 || reloc_type == 66 /* R_PRU_DIFF16. */
13074 || reloc_type == 67 /* R_PRU_DIFF32. */);
13075 case EM_XTENSA_OLD:
13076 case EM_XTENSA:
13077 return (reloc_type == 0 /* R_XTENSA_NONE. */
13078 || reloc_type == 17 /* R_XTENSA_DIFF8. */
13079 || reloc_type == 18 /* R_XTENSA_DIFF16. */
13080 || reloc_type == 19 /* R_XTENSA_DIFF32. */);
13081 }
13082 return FALSE;
13083 }
13084
13085 /* Returns TRUE if there is a relocation against
13086 section NAME at OFFSET bytes. */
13087
13088 bfd_boolean
13089 reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
13090 {
13091 Elf_Internal_Rela * relocs;
13092 Elf_Internal_Rela * rp;
13093
13094 if (dsec == NULL || dsec->reloc_info == NULL)
13095 return FALSE;
13096
13097 relocs = (Elf_Internal_Rela *) dsec->reloc_info;
13098
13099 for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
13100 if (rp->r_offset == offset)
13101 return TRUE;
13102
13103 return FALSE;
13104 }
13105
13106 /* Apply relocations to a section.
13107 Returns TRUE upon success, FALSE otherwise.
13108 If RELOCS_RETURN is non-NULL then it is set to point to the loaded relocs.
13109 It is then the caller's responsibility to free them. NUM_RELOCS_RETURN
13110 will be set to the number of relocs loaded.
13111
13112 Note: So far support has been added only for those relocations
13113 which can be found in debug sections. FIXME: Add support for
13114 more relocations ? */
13115
13116 static bfd_boolean
13117 apply_relocations (Filedata * filedata,
13118 const Elf_Internal_Shdr * section,
13119 unsigned char * start,
13120 bfd_size_type size,
13121 void ** relocs_return,
13122 unsigned long * num_relocs_return)
13123 {
13124 Elf_Internal_Shdr * relsec;
13125 unsigned char * end = start + size;
13126
13127 if (relocs_return != NULL)
13128 {
13129 * (Elf_Internal_Rela **) relocs_return = NULL;
13130 * num_relocs_return = 0;
13131 }
13132
13133 if (filedata->file_header.e_type != ET_REL)
13134 /* No relocs to apply. */
13135 return TRUE;
13136
13137 /* Find the reloc section associated with the section. */
13138 for (relsec = filedata->section_headers;
13139 relsec < filedata->section_headers + filedata->file_header.e_shnum;
13140 ++relsec)
13141 {
13142 bfd_boolean is_rela;
13143 unsigned long num_relocs;
13144 Elf_Internal_Rela * relocs;
13145 Elf_Internal_Rela * rp;
13146 Elf_Internal_Shdr * symsec;
13147 Elf_Internal_Sym * symtab;
13148 unsigned long num_syms;
13149 Elf_Internal_Sym * sym;
13150
13151 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13152 || relsec->sh_info >= filedata->file_header.e_shnum
13153 || filedata->section_headers + relsec->sh_info != section
13154 || relsec->sh_size == 0
13155 || relsec->sh_link >= filedata->file_header.e_shnum)
13156 continue;
13157
13158 is_rela = relsec->sh_type == SHT_RELA;
13159
13160 if (is_rela)
13161 {
13162 if (!slurp_rela_relocs (filedata, relsec->sh_offset,
13163 relsec->sh_size, & relocs, & num_relocs))
13164 return FALSE;
13165 }
13166 else
13167 {
13168 if (!slurp_rel_relocs (filedata, relsec->sh_offset,
13169 relsec->sh_size, & relocs, & num_relocs))
13170 return FALSE;
13171 }
13172
13173 /* SH uses RELA but uses in place value instead of the addend field. */
13174 if (filedata->file_header.e_machine == EM_SH)
13175 is_rela = FALSE;
13176
13177 symsec = filedata->section_headers + relsec->sh_link;
13178 if (symsec->sh_type != SHT_SYMTAB
13179 && symsec->sh_type != SHT_DYNSYM)
13180 return FALSE;
13181 symtab = GET_ELF_SYMBOLS (filedata, symsec, & num_syms);
13182
13183 for (rp = relocs; rp < relocs + num_relocs; ++rp)
13184 {
13185 bfd_vma addend;
13186 unsigned int reloc_type;
13187 unsigned int reloc_size;
13188 bfd_boolean reloc_inplace = FALSE;
13189 bfd_boolean reloc_subtract = FALSE;
13190 unsigned char * rloc;
13191 unsigned long sym_index;
13192
13193 reloc_type = get_reloc_type (filedata, rp->r_info);
13194
13195 if (target_specific_reloc_handling (filedata, rp, start, end, symtab, num_syms))
13196 continue;
13197 else if (is_none_reloc (filedata, reloc_type))
13198 continue;
13199 else if (is_32bit_abs_reloc (filedata, reloc_type)
13200 || is_32bit_pcrel_reloc (filedata, reloc_type))
13201 reloc_size = 4;
13202 else if (is_64bit_abs_reloc (filedata, reloc_type)
13203 || is_64bit_pcrel_reloc (filedata, reloc_type))
13204 reloc_size = 8;
13205 else if (is_24bit_abs_reloc (filedata, reloc_type))
13206 reloc_size = 3;
13207 else if (is_16bit_abs_reloc (filedata, reloc_type))
13208 reloc_size = 2;
13209 else if (is_8bit_abs_reloc (filedata, reloc_type)
13210 || is_6bit_abs_reloc (filedata, reloc_type))
13211 reloc_size = 1;
13212 else if ((reloc_subtract = is_32bit_inplace_sub_reloc (filedata,
13213 reloc_type))
13214 || is_32bit_inplace_add_reloc (filedata, reloc_type))
13215 {
13216 reloc_size = 4;
13217 reloc_inplace = TRUE;
13218 }
13219 else if ((reloc_subtract = is_64bit_inplace_sub_reloc (filedata,
13220 reloc_type))
13221 || is_64bit_inplace_add_reloc (filedata, reloc_type))
13222 {
13223 reloc_size = 8;
13224 reloc_inplace = TRUE;
13225 }
13226 else if ((reloc_subtract = is_16bit_inplace_sub_reloc (filedata,
13227 reloc_type))
13228 || is_16bit_inplace_add_reloc (filedata, reloc_type))
13229 {
13230 reloc_size = 2;
13231 reloc_inplace = TRUE;
13232 }
13233 else if ((reloc_subtract = is_8bit_inplace_sub_reloc (filedata,
13234 reloc_type))
13235 || is_8bit_inplace_add_reloc (filedata, reloc_type))
13236 {
13237 reloc_size = 1;
13238 reloc_inplace = TRUE;
13239 }
13240 else if ((reloc_subtract = is_6bit_inplace_sub_reloc (filedata,
13241 reloc_type)))
13242 {
13243 reloc_size = 1;
13244 reloc_inplace = TRUE;
13245 }
13246 else
13247 {
13248 static unsigned int prev_reloc = 0;
13249
13250 if (reloc_type != prev_reloc)
13251 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
13252 reloc_type, printable_section_name (filedata, section));
13253 prev_reloc = reloc_type;
13254 continue;
13255 }
13256
13257 rloc = start + rp->r_offset;
13258 if ((rloc + reloc_size) > end || (rloc < start))
13259 {
13260 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
13261 (unsigned long) rp->r_offset,
13262 printable_section_name (filedata, section));
13263 continue;
13264 }
13265
13266 sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
13267 if (sym_index >= num_syms)
13268 {
13269 warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
13270 sym_index, printable_section_name (filedata, section));
13271 continue;
13272 }
13273 sym = symtab + sym_index;
13274
13275 /* If the reloc has a symbol associated with it,
13276 make sure that it is of an appropriate type.
13277
13278 Relocations against symbols without type can happen.
13279 Gcc -feliminate-dwarf2-dups may generate symbols
13280 without type for debug info.
13281
13282 Icc generates relocations against function symbols
13283 instead of local labels.
13284
13285 Relocations against object symbols can happen, eg when
13286 referencing a global array. For an example of this see
13287 the _clz.o binary in libgcc.a. */
13288 if (sym != symtab
13289 && ELF_ST_TYPE (sym->st_info) != STT_COMMON
13290 && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
13291 {
13292 warn (_("skipping unexpected symbol type %s in section %s relocation %ld\n"),
13293 get_symbol_type (filedata, ELF_ST_TYPE (sym->st_info)),
13294 printable_section_name (filedata, relsec),
13295 (long int)(rp - relocs));
13296 continue;
13297 }
13298
13299 addend = 0;
13300 if (is_rela)
13301 addend += rp->r_addend;
13302 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
13303 partial_inplace. */
13304 if (!is_rela
13305 || (filedata->file_header.e_machine == EM_XTENSA
13306 && reloc_type == 1)
13307 || ((filedata->file_header.e_machine == EM_PJ
13308 || filedata->file_header.e_machine == EM_PJ_OLD)
13309 && reloc_type == 1)
13310 || ((filedata->file_header.e_machine == EM_D30V
13311 || filedata->file_header.e_machine == EM_CYGNUS_D30V)
13312 && reloc_type == 12)
13313 || reloc_inplace)
13314 {
13315 if (is_6bit_inplace_sub_reloc (filedata, reloc_type))
13316 addend += byte_get (rloc, reloc_size) & 0x3f;
13317 else
13318 addend += byte_get (rloc, reloc_size);
13319 }
13320
13321 if (is_32bit_pcrel_reloc (filedata, reloc_type)
13322 || is_64bit_pcrel_reloc (filedata, reloc_type))
13323 {
13324 /* On HPPA, all pc-relative relocations are biased by 8. */
13325 if (filedata->file_header.e_machine == EM_PARISC)
13326 addend -= 8;
13327 byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
13328 reloc_size);
13329 }
13330 else if (is_6bit_abs_reloc (filedata, reloc_type)
13331 || is_6bit_inplace_sub_reloc (filedata, reloc_type))
13332 {
13333 if (reloc_subtract)
13334 addend -= sym->st_value;
13335 else
13336 addend += sym->st_value;
13337 addend = (addend & 0x3f) | (byte_get (rloc, reloc_size) & 0xc0);
13338 byte_put (rloc, addend, reloc_size);
13339 }
13340 else if (reloc_subtract)
13341 byte_put (rloc, addend - sym->st_value, reloc_size);
13342 else
13343 byte_put (rloc, addend + sym->st_value, reloc_size);
13344 }
13345
13346 free (symtab);
13347 /* Let the target specific reloc processing code know that
13348 we have finished with these relocs. */
13349 target_specific_reloc_handling (filedata, NULL, NULL, NULL, NULL, 0);
13350
13351 if (relocs_return)
13352 {
13353 * (Elf_Internal_Rela **) relocs_return = relocs;
13354 * num_relocs_return = num_relocs;
13355 }
13356 else
13357 free (relocs);
13358
13359 break;
13360 }
13361
13362 return TRUE;
13363 }
13364
13365 #ifdef SUPPORT_DISASSEMBLY
13366 static bfd_boolean
13367 disassemble_section (Elf_Internal_Shdr * section, Filedata * filedata)
13368 {
13369 printf (_("\nAssembly dump of section %s\n"), printable_section_name (filedata, section));
13370
13371 /* FIXME: XXX -- to be done --- XXX */
13372
13373 return TRUE;
13374 }
13375 #endif
13376
13377 /* Reads in the contents of SECTION from FILE, returning a pointer
13378 to a malloc'ed buffer or NULL if something went wrong. */
13379
13380 static char *
13381 get_section_contents (Elf_Internal_Shdr * section, Filedata * filedata)
13382 {
13383 bfd_size_type num_bytes = section->sh_size;
13384
13385 if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
13386 {
13387 printf (_("Section '%s' has no data to dump.\n"),
13388 printable_section_name (filedata, section));
13389 return NULL;
13390 }
13391
13392 return (char *) get_data (NULL, filedata, section->sh_offset, 1, num_bytes,
13393 _("section contents"));
13394 }
13395
13396 /* Uncompresses a section that was compressed using zlib, in place. */
13397
13398 static bfd_boolean
13399 uncompress_section_contents (unsigned char ** buffer,
13400 dwarf_size_type uncompressed_size,
13401 dwarf_size_type * size)
13402 {
13403 dwarf_size_type compressed_size = *size;
13404 unsigned char * compressed_buffer = *buffer;
13405 unsigned char * uncompressed_buffer;
13406 z_stream strm;
13407 int rc;
13408
13409 /* It is possible the section consists of several compressed
13410 buffers concatenated together, so we uncompress in a loop. */
13411 /* PR 18313: The state field in the z_stream structure is supposed
13412 to be invisible to the user (ie us), but some compilers will
13413 still complain about it being used without initialisation. So
13414 we first zero the entire z_stream structure and then set the fields
13415 that we need. */
13416 memset (& strm, 0, sizeof strm);
13417 strm.avail_in = compressed_size;
13418 strm.next_in = (Bytef *) compressed_buffer;
13419 strm.avail_out = uncompressed_size;
13420 uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
13421
13422 rc = inflateInit (& strm);
13423 while (strm.avail_in > 0)
13424 {
13425 if (rc != Z_OK)
13426 goto fail;
13427 strm.next_out = ((Bytef *) uncompressed_buffer
13428 + (uncompressed_size - strm.avail_out));
13429 rc = inflate (&strm, Z_FINISH);
13430 if (rc != Z_STREAM_END)
13431 goto fail;
13432 rc = inflateReset (& strm);
13433 }
13434 rc = inflateEnd (& strm);
13435 if (rc != Z_OK
13436 || strm.avail_out != 0)
13437 goto fail;
13438
13439 *buffer = uncompressed_buffer;
13440 *size = uncompressed_size;
13441 return TRUE;
13442
13443 fail:
13444 free (uncompressed_buffer);
13445 /* Indicate decompression failure. */
13446 *buffer = NULL;
13447 return FALSE;
13448 }
13449
13450 static bfd_boolean
13451 dump_section_as_strings (Elf_Internal_Shdr * section, Filedata * filedata)
13452 {
13453 Elf_Internal_Shdr * relsec;
13454 bfd_size_type num_bytes;
13455 unsigned char * data;
13456 unsigned char * end;
13457 unsigned char * real_start;
13458 unsigned char * start;
13459 bfd_boolean some_strings_shown;
13460
13461 real_start = start = (unsigned char *) get_section_contents (section, filedata);
13462 if (start == NULL)
13463 /* PR 21820: Do not fail if the section was empty. */
13464 return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
13465
13466 num_bytes = section->sh_size;
13467
13468 printf (_("\nString dump of section '%s':\n"), printable_section_name (filedata, section));
13469
13470 if (decompress_dumps)
13471 {
13472 dwarf_size_type new_size = num_bytes;
13473 dwarf_size_type uncompressed_size = 0;
13474
13475 if ((section->sh_flags & SHF_COMPRESSED) != 0)
13476 {
13477 Elf_Internal_Chdr chdr;
13478 unsigned int compression_header_size
13479 = get_compression_header (& chdr, (unsigned char *) start,
13480 num_bytes);
13481
13482 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13483 {
13484 warn (_("section '%s' has unsupported compress type: %d\n"),
13485 printable_section_name (filedata, section), chdr.ch_type);
13486 return FALSE;
13487 }
13488 uncompressed_size = chdr.ch_size;
13489 start += compression_header_size;
13490 new_size -= compression_header_size;
13491 }
13492 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
13493 {
13494 /* Read the zlib header. In this case, it should be "ZLIB"
13495 followed by the uncompressed section size, 8 bytes in
13496 big-endian order. */
13497 uncompressed_size = start[4]; uncompressed_size <<= 8;
13498 uncompressed_size += start[5]; uncompressed_size <<= 8;
13499 uncompressed_size += start[6]; uncompressed_size <<= 8;
13500 uncompressed_size += start[7]; uncompressed_size <<= 8;
13501 uncompressed_size += start[8]; uncompressed_size <<= 8;
13502 uncompressed_size += start[9]; uncompressed_size <<= 8;
13503 uncompressed_size += start[10]; uncompressed_size <<= 8;
13504 uncompressed_size += start[11];
13505 start += 12;
13506 new_size -= 12;
13507 }
13508
13509 if (uncompressed_size)
13510 {
13511 if (uncompress_section_contents (& start,
13512 uncompressed_size, & new_size))
13513 num_bytes = new_size;
13514 else
13515 {
13516 error (_("Unable to decompress section %s\n"),
13517 printable_section_name (filedata, section));
13518 return FALSE;
13519 }
13520 }
13521 else
13522 start = real_start;
13523 }
13524
13525 /* If the section being dumped has relocations against it the user might
13526 be expecting these relocations to have been applied. Check for this
13527 case and issue a warning message in order to avoid confusion.
13528 FIXME: Maybe we ought to have an option that dumps a section with
13529 relocs applied ? */
13530 for (relsec = filedata->section_headers;
13531 relsec < filedata->section_headers + filedata->file_header.e_shnum;
13532 ++relsec)
13533 {
13534 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13535 || relsec->sh_info >= filedata->file_header.e_shnum
13536 || filedata->section_headers + relsec->sh_info != section
13537 || relsec->sh_size == 0
13538 || relsec->sh_link >= filedata->file_header.e_shnum)
13539 continue;
13540
13541 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
13542 break;
13543 }
13544
13545 data = start;
13546 end = start + num_bytes;
13547 some_strings_shown = FALSE;
13548
13549 while (data < end)
13550 {
13551 while (!ISPRINT (* data))
13552 if (++ data >= end)
13553 break;
13554
13555 if (data < end)
13556 {
13557 size_t maxlen = end - data;
13558
13559 #ifndef __MSVCRT__
13560 /* PR 11128: Use two separate invocations in order to work
13561 around bugs in the Solaris 8 implementation of printf. */
13562 printf (" [%6tx] ", data - start);
13563 #else
13564 printf (" [%6Ix] ", (size_t) (data - start));
13565 #endif
13566 if (maxlen > 0)
13567 {
13568 print_symbol ((int) maxlen, (const char *) data);
13569 putchar ('\n');
13570 data += strnlen ((const char *) data, maxlen);
13571 }
13572 else
13573 {
13574 printf (_("<corrupt>\n"));
13575 data = end;
13576 }
13577 some_strings_shown = TRUE;
13578 }
13579 }
13580
13581 if (! some_strings_shown)
13582 printf (_(" No strings found in this section."));
13583
13584 free (real_start);
13585
13586 putchar ('\n');
13587 return TRUE;
13588 }
13589
13590 static bfd_boolean
13591 dump_section_as_bytes (Elf_Internal_Shdr * section,
13592 Filedata * filedata,
13593 bfd_boolean relocate)
13594 {
13595 Elf_Internal_Shdr * relsec;
13596 bfd_size_type bytes;
13597 bfd_size_type section_size;
13598 bfd_vma addr;
13599 unsigned char * data;
13600 unsigned char * real_start;
13601 unsigned char * start;
13602
13603 real_start = start = (unsigned char *) get_section_contents (section, filedata);
13604 if (start == NULL)
13605 /* PR 21820: Do not fail if the section was empty. */
13606 return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
13607
13608 section_size = section->sh_size;
13609
13610 printf (_("\nHex dump of section '%s':\n"), printable_section_name (filedata, section));
13611
13612 if (decompress_dumps)
13613 {
13614 dwarf_size_type new_size = section_size;
13615 dwarf_size_type uncompressed_size = 0;
13616
13617 if ((section->sh_flags & SHF_COMPRESSED) != 0)
13618 {
13619 Elf_Internal_Chdr chdr;
13620 unsigned int compression_header_size
13621 = get_compression_header (& chdr, start, section_size);
13622
13623 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13624 {
13625 warn (_("section '%s' has unsupported compress type: %d\n"),
13626 printable_section_name (filedata, section), chdr.ch_type);
13627 return FALSE;
13628 }
13629 uncompressed_size = chdr.ch_size;
13630 start += compression_header_size;
13631 new_size -= compression_header_size;
13632 }
13633 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
13634 {
13635 /* Read the zlib header. In this case, it should be "ZLIB"
13636 followed by the uncompressed section size, 8 bytes in
13637 big-endian order. */
13638 uncompressed_size = start[4]; uncompressed_size <<= 8;
13639 uncompressed_size += start[5]; uncompressed_size <<= 8;
13640 uncompressed_size += start[6]; uncompressed_size <<= 8;
13641 uncompressed_size += start[7]; uncompressed_size <<= 8;
13642 uncompressed_size += start[8]; uncompressed_size <<= 8;
13643 uncompressed_size += start[9]; uncompressed_size <<= 8;
13644 uncompressed_size += start[10]; uncompressed_size <<= 8;
13645 uncompressed_size += start[11];
13646 start += 12;
13647 new_size -= 12;
13648 }
13649
13650 if (uncompressed_size)
13651 {
13652 if (uncompress_section_contents (& start, uncompressed_size,
13653 & new_size))
13654 {
13655 section_size = new_size;
13656 }
13657 else
13658 {
13659 error (_("Unable to decompress section %s\n"),
13660 printable_section_name (filedata, section));
13661 /* FIXME: Print the section anyway ? */
13662 return FALSE;
13663 }
13664 }
13665 else
13666 start = real_start;
13667 }
13668
13669 if (relocate)
13670 {
13671 if (! apply_relocations (filedata, section, start, section_size, NULL, NULL))
13672 return FALSE;
13673 }
13674 else
13675 {
13676 /* If the section being dumped has relocations against it the user might
13677 be expecting these relocations to have been applied. Check for this
13678 case and issue a warning message in order to avoid confusion.
13679 FIXME: Maybe we ought to have an option that dumps a section with
13680 relocs applied ? */
13681 for (relsec = filedata->section_headers;
13682 relsec < filedata->section_headers + filedata->file_header.e_shnum;
13683 ++relsec)
13684 {
13685 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13686 || relsec->sh_info >= filedata->file_header.e_shnum
13687 || filedata->section_headers + relsec->sh_info != section
13688 || relsec->sh_size == 0
13689 || relsec->sh_link >= filedata->file_header.e_shnum)
13690 continue;
13691
13692 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
13693 break;
13694 }
13695 }
13696
13697 addr = section->sh_addr;
13698 bytes = section_size;
13699 data = start;
13700
13701 while (bytes)
13702 {
13703 int j;
13704 int k;
13705 int lbytes;
13706
13707 lbytes = (bytes > 16 ? 16 : bytes);
13708
13709 printf (" 0x%8.8lx ", (unsigned long) addr);
13710
13711 for (j = 0; j < 16; j++)
13712 {
13713 if (j < lbytes)
13714 printf ("%2.2x", data[j]);
13715 else
13716 printf (" ");
13717
13718 if ((j & 3) == 3)
13719 printf (" ");
13720 }
13721
13722 for (j = 0; j < lbytes; j++)
13723 {
13724 k = data[j];
13725 if (k >= ' ' && k < 0x7f)
13726 printf ("%c", k);
13727 else
13728 printf (".");
13729 }
13730
13731 putchar ('\n');
13732
13733 data += lbytes;
13734 addr += lbytes;
13735 bytes -= lbytes;
13736 }
13737
13738 free (real_start);
13739
13740 putchar ('\n');
13741 return TRUE;
13742 }
13743
13744 static bfd_boolean
13745 load_specific_debug_section (enum dwarf_section_display_enum debug,
13746 const Elf_Internal_Shdr * sec,
13747 void * data)
13748 {
13749 struct dwarf_section * section = &debug_displays [debug].section;
13750 char buf [64];
13751 Filedata * filedata = (Filedata *) data;
13752
13753 if (section->start != NULL)
13754 {
13755 /* If it is already loaded, do nothing. */
13756 if (streq (section->filename, filedata->file_name))
13757 return TRUE;
13758 free (section->start);
13759 }
13760
13761 snprintf (buf, sizeof (buf), _("%s section data"), section->name);
13762 section->address = sec->sh_addr;
13763 section->user_data = NULL;
13764 section->filename = filedata->file_name;
13765 section->start = (unsigned char *) get_data (NULL, filedata,
13766 sec->sh_offset, 1,
13767 sec->sh_size, buf);
13768 if (section->start == NULL)
13769 section->size = 0;
13770 else
13771 {
13772 unsigned char *start = section->start;
13773 dwarf_size_type size = sec->sh_size;
13774 dwarf_size_type uncompressed_size = 0;
13775
13776 if ((sec->sh_flags & SHF_COMPRESSED) != 0)
13777 {
13778 Elf_Internal_Chdr chdr;
13779 unsigned int compression_header_size;
13780
13781 if (size < (is_32bit_elf
13782 ? sizeof (Elf32_External_Chdr)
13783 : sizeof (Elf64_External_Chdr)))
13784 {
13785 warn (_("compressed section %s is too small to contain a compression header"),
13786 section->name);
13787 return FALSE;
13788 }
13789
13790 compression_header_size = get_compression_header (&chdr, start, size);
13791
13792 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13793 {
13794 warn (_("section '%s' has unsupported compress type: %d\n"),
13795 section->name, chdr.ch_type);
13796 return FALSE;
13797 }
13798 uncompressed_size = chdr.ch_size;
13799 start += compression_header_size;
13800 size -= compression_header_size;
13801 }
13802 else if (size > 12 && streq ((char *) start, "ZLIB"))
13803 {
13804 /* Read the zlib header. In this case, it should be "ZLIB"
13805 followed by the uncompressed section size, 8 bytes in
13806 big-endian order. */
13807 uncompressed_size = start[4]; uncompressed_size <<= 8;
13808 uncompressed_size += start[5]; uncompressed_size <<= 8;
13809 uncompressed_size += start[6]; uncompressed_size <<= 8;
13810 uncompressed_size += start[7]; uncompressed_size <<= 8;
13811 uncompressed_size += start[8]; uncompressed_size <<= 8;
13812 uncompressed_size += start[9]; uncompressed_size <<= 8;
13813 uncompressed_size += start[10]; uncompressed_size <<= 8;
13814 uncompressed_size += start[11];
13815 start += 12;
13816 size -= 12;
13817 }
13818
13819 if (uncompressed_size)
13820 {
13821 if (uncompress_section_contents (&start, uncompressed_size,
13822 &size))
13823 {
13824 /* Free the compressed buffer, update the section buffer
13825 and the section size if uncompress is successful. */
13826 free (section->start);
13827 section->start = start;
13828 }
13829 else
13830 {
13831 error (_("Unable to decompress section %s\n"),
13832 printable_section_name (filedata, sec));
13833 return FALSE;
13834 }
13835 }
13836
13837 section->size = size;
13838 }
13839
13840 if (section->start == NULL)
13841 return FALSE;
13842
13843 if (debug_displays [debug].relocate)
13844 {
13845 if (! apply_relocations (filedata, sec, section->start, section->size,
13846 & section->reloc_info, & section->num_relocs))
13847 return FALSE;
13848 }
13849 else
13850 {
13851 section->reloc_info = NULL;
13852 section->num_relocs = 0;
13853 }
13854
13855 return TRUE;
13856 }
13857
13858 /* If this is not NULL, load_debug_section will only look for sections
13859 within the list of sections given here. */
13860 static unsigned int * section_subset = NULL;
13861
13862 bfd_boolean
13863 load_debug_section (enum dwarf_section_display_enum debug, void * data)
13864 {
13865 struct dwarf_section * section = &debug_displays [debug].section;
13866 Elf_Internal_Shdr * sec;
13867 Filedata * filedata = (Filedata *) data;
13868
13869 /* Without section headers we cannot find any sections. */
13870 if (filedata->section_headers == NULL)
13871 return FALSE;
13872
13873 if (filedata->string_table == NULL
13874 && filedata->file_header.e_shstrndx != SHN_UNDEF
13875 && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
13876 {
13877 Elf_Internal_Shdr * strs;
13878
13879 /* Read in the string table, so that we have section names to scan. */
13880 strs = filedata->section_headers + filedata->file_header.e_shstrndx;
13881
13882 if (strs != NULL && strs->sh_size != 0)
13883 {
13884 filedata->string_table
13885 = (char *) get_data (NULL, filedata, strs->sh_offset,
13886 1, strs->sh_size, _("string table"));
13887
13888 filedata->string_table_length
13889 = filedata->string_table != NULL ? strs->sh_size : 0;
13890 }
13891 }
13892
13893 /* Locate the debug section. */
13894 sec = find_section_in_set (filedata, section->uncompressed_name, section_subset);
13895 if (sec != NULL)
13896 section->name = section->uncompressed_name;
13897 else
13898 {
13899 sec = find_section_in_set (filedata, section->compressed_name, section_subset);
13900 if (sec != NULL)
13901 section->name = section->compressed_name;
13902 }
13903 if (sec == NULL)
13904 return FALSE;
13905
13906 /* If we're loading from a subset of sections, and we've loaded
13907 a section matching this name before, it's likely that it's a
13908 different one. */
13909 if (section_subset != NULL)
13910 free_debug_section (debug);
13911
13912 return load_specific_debug_section (debug, sec, data);
13913 }
13914
13915 void
13916 free_debug_section (enum dwarf_section_display_enum debug)
13917 {
13918 struct dwarf_section * section = &debug_displays [debug].section;
13919
13920 if (section->start == NULL)
13921 return;
13922
13923 free ((char *) section->start);
13924 section->start = NULL;
13925 section->address = 0;
13926 section->size = 0;
13927 }
13928
13929 static bfd_boolean
13930 display_debug_section (int shndx, Elf_Internal_Shdr * section, Filedata * filedata)
13931 {
13932 char * name = SECTION_NAME (section);
13933 const char * print_name = printable_section_name (filedata, section);
13934 bfd_size_type length;
13935 bfd_boolean result = TRUE;
13936 int i;
13937
13938 length = section->sh_size;
13939 if (length == 0)
13940 {
13941 printf (_("\nSection '%s' has no debugging data.\n"), print_name);
13942 return TRUE;
13943 }
13944 if (section->sh_type == SHT_NOBITS)
13945 {
13946 /* There is no point in dumping the contents of a debugging section
13947 which has the NOBITS type - the bits in the file will be random.
13948 This can happen when a file containing a .eh_frame section is
13949 stripped with the --only-keep-debug command line option. */
13950 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
13951 print_name);
13952 return FALSE;
13953 }
13954
13955 if (const_strneq (name, ".gnu.linkonce.wi."))
13956 name = ".debug_info";
13957
13958 /* See if we know how to display the contents of this section. */
13959 for (i = 0; i < max; i++)
13960 {
13961 enum dwarf_section_display_enum id = (enum dwarf_section_display_enum) i;
13962 struct dwarf_section_display * display = debug_displays + i;
13963 struct dwarf_section * sec = & display->section;
13964
13965 if (streq (sec->uncompressed_name, name)
13966 || (id == line && const_strneq (name, ".debug_line."))
13967 || streq (sec->compressed_name, name))
13968 {
13969 bfd_boolean secondary = (section != find_section (filedata, name));
13970
13971 if (secondary)
13972 free_debug_section (id);
13973
13974 if (i == line && const_strneq (name, ".debug_line."))
13975 sec->name = name;
13976 else if (streq (sec->uncompressed_name, name))
13977 sec->name = sec->uncompressed_name;
13978 else
13979 sec->name = sec->compressed_name;
13980
13981 if (load_specific_debug_section (id, section, filedata))
13982 {
13983 /* If this debug section is part of a CU/TU set in a .dwp file,
13984 restrict load_debug_section to the sections in that set. */
13985 section_subset = find_cu_tu_set (filedata, shndx);
13986
13987 result &= display->display (sec, filedata);
13988
13989 section_subset = NULL;
13990
13991 if (secondary || (id != info && id != abbrev))
13992 free_debug_section (id);
13993 }
13994 break;
13995 }
13996 }
13997
13998 if (i == max)
13999 {
14000 printf (_("Unrecognized debug section: %s\n"), print_name);
14001 result = FALSE;
14002 }
14003
14004 return result;
14005 }
14006
14007 /* Set DUMP_SECTS for all sections where dumps were requested
14008 based on section name. */
14009
14010 static void
14011 initialise_dumps_byname (Filedata * filedata)
14012 {
14013 struct dump_list_entry * cur;
14014
14015 for (cur = dump_sects_byname; cur; cur = cur->next)
14016 {
14017 unsigned int i;
14018 bfd_boolean any = FALSE;
14019
14020 for (i = 0; i < filedata->file_header.e_shnum; i++)
14021 if (streq (SECTION_NAME (filedata->section_headers + i), cur->name))
14022 {
14023 request_dump_bynumber (filedata, i, cur->type);
14024 any = TRUE;
14025 }
14026
14027 if (!any)
14028 warn (_("Section '%s' was not dumped because it does not exist!\n"),
14029 cur->name);
14030 }
14031 }
14032
14033 static bfd_boolean
14034 process_section_contents (Filedata * filedata)
14035 {
14036 Elf_Internal_Shdr * section;
14037 unsigned int i;
14038 bfd_boolean res = TRUE;
14039
14040 if (! do_dump)
14041 return TRUE;
14042
14043 initialise_dumps_byname (filedata);
14044
14045 for (i = 0, section = filedata->section_headers;
14046 i < filedata->file_header.e_shnum && i < filedata->num_dump_sects;
14047 i++, section++)
14048 {
14049 dump_type dump = filedata->dump_sects[i];
14050
14051 #ifdef SUPPORT_DISASSEMBLY
14052 if (dump & DISASS_DUMP)
14053 {
14054 if (! disassemble_section (section, filedata))
14055 res = FALSE;
14056 }
14057 #endif
14058 if (dump & HEX_DUMP)
14059 {
14060 if (! dump_section_as_bytes (section, filedata, FALSE))
14061 res = FALSE;
14062 }
14063
14064 if (dump & RELOC_DUMP)
14065 {
14066 if (! dump_section_as_bytes (section, filedata, TRUE))
14067 res = FALSE;
14068 }
14069
14070 if (dump & STRING_DUMP)
14071 {
14072 if (! dump_section_as_strings (section, filedata))
14073 res = FALSE;
14074 }
14075
14076 if (dump & DEBUG_DUMP)
14077 {
14078 if (! display_debug_section (i, section, filedata))
14079 res = FALSE;
14080 }
14081 }
14082
14083 /* Check to see if the user requested a
14084 dump of a section that does not exist. */
14085 while (i < filedata->num_dump_sects)
14086 {
14087 if (filedata->dump_sects[i])
14088 {
14089 warn (_("Section %d was not dumped because it does not exist!\n"), i);
14090 res = FALSE;
14091 }
14092 i++;
14093 }
14094
14095 return res;
14096 }
14097
14098 static void
14099 process_mips_fpe_exception (int mask)
14100 {
14101 if (mask)
14102 {
14103 bfd_boolean first = TRUE;
14104
14105 if (mask & OEX_FPU_INEX)
14106 fputs ("INEX", stdout), first = FALSE;
14107 if (mask & OEX_FPU_UFLO)
14108 printf ("%sUFLO", first ? "" : "|"), first = FALSE;
14109 if (mask & OEX_FPU_OFLO)
14110 printf ("%sOFLO", first ? "" : "|"), first = FALSE;
14111 if (mask & OEX_FPU_DIV0)
14112 printf ("%sDIV0", first ? "" : "|"), first = FALSE;
14113 if (mask & OEX_FPU_INVAL)
14114 printf ("%sINVAL", first ? "" : "|");
14115 }
14116 else
14117 fputs ("0", stdout);
14118 }
14119
14120 /* Display's the value of TAG at location P. If TAG is
14121 greater than 0 it is assumed to be an unknown tag, and
14122 a message is printed to this effect. Otherwise it is
14123 assumed that a message has already been printed.
14124
14125 If the bottom bit of TAG is set it assumed to have a
14126 string value, otherwise it is assumed to have an integer
14127 value.
14128
14129 Returns an updated P pointing to the first unread byte
14130 beyond the end of TAG's value.
14131
14132 Reads at or beyond END will not be made. */
14133
14134 static unsigned char *
14135 display_tag_value (signed int tag,
14136 unsigned char * p,
14137 const unsigned char * const end)
14138 {
14139 unsigned long val;
14140
14141 if (tag > 0)
14142 printf (" Tag_unknown_%d: ", tag);
14143
14144 if (p >= end)
14145 {
14146 warn (_("<corrupt tag>\n"));
14147 }
14148 else if (tag & 1)
14149 {
14150 /* PR 17531 file: 027-19978-0.004. */
14151 size_t maxlen = (end - p) - 1;
14152
14153 putchar ('"');
14154 if (maxlen > 0)
14155 {
14156 print_symbol ((int) maxlen, (const char *) p);
14157 p += strnlen ((char *) p, maxlen) + 1;
14158 }
14159 else
14160 {
14161 printf (_("<corrupt string tag>"));
14162 p = (unsigned char *) end;
14163 }
14164 printf ("\"\n");
14165 }
14166 else
14167 {
14168 unsigned int len;
14169
14170 val = read_uleb128 (p, &len, end);
14171 p += len;
14172 printf ("%ld (0x%lx)\n", val, val);
14173 }
14174
14175 assert (p <= end);
14176 return p;
14177 }
14178
14179 /* ARC ABI attributes section. */
14180
14181 static unsigned char *
14182 display_arc_attribute (unsigned char * p,
14183 const unsigned char * const end)
14184 {
14185 unsigned int tag;
14186 unsigned int len;
14187 unsigned int val;
14188
14189 tag = read_uleb128 (p, &len, end);
14190 p += len;
14191
14192 switch (tag)
14193 {
14194 case Tag_ARC_PCS_config:
14195 val = read_uleb128 (p, &len, end);
14196 p += len;
14197 printf (" Tag_ARC_PCS_config: ");
14198 switch (val)
14199 {
14200 case 0:
14201 printf (_("Absent/Non standard\n"));
14202 break;
14203 case 1:
14204 printf (_("Bare metal/mwdt\n"));
14205 break;
14206 case 2:
14207 printf (_("Bare metal/newlib\n"));
14208 break;
14209 case 3:
14210 printf (_("Linux/uclibc\n"));
14211 break;
14212 case 4:
14213 printf (_("Linux/glibc\n"));
14214 break;
14215 default:
14216 printf (_("Unknown\n"));
14217 break;
14218 }
14219 break;
14220
14221 case Tag_ARC_CPU_base:
14222 val = read_uleb128 (p, &len, end);
14223 p += len;
14224 printf (" Tag_ARC_CPU_base: ");
14225 switch (val)
14226 {
14227 default:
14228 case TAG_CPU_NONE:
14229 printf (_("Absent\n"));
14230 break;
14231 case TAG_CPU_ARC6xx:
14232 printf ("ARC6xx\n");
14233 break;
14234 case TAG_CPU_ARC7xx:
14235 printf ("ARC7xx\n");
14236 break;
14237 case TAG_CPU_ARCEM:
14238 printf ("ARCEM\n");
14239 break;
14240 case TAG_CPU_ARCHS:
14241 printf ("ARCHS\n");
14242 break;
14243 }
14244 break;
14245
14246 case Tag_ARC_CPU_variation:
14247 val = read_uleb128 (p, &len, end);
14248 p += len;
14249 printf (" Tag_ARC_CPU_variation: ");
14250 switch (val)
14251 {
14252 default:
14253 if (val > 0 && val < 16)
14254 printf ("Core%d\n", val);
14255 else
14256 printf ("Unknown\n");
14257 break;
14258
14259 case 0:
14260 printf (_("Absent\n"));
14261 break;
14262 }
14263 break;
14264
14265 case Tag_ARC_CPU_name:
14266 printf (" Tag_ARC_CPU_name: ");
14267 p = display_tag_value (-1, p, end);
14268 break;
14269
14270 case Tag_ARC_ABI_rf16:
14271 val = read_uleb128 (p, &len, end);
14272 p += len;
14273 printf (" Tag_ARC_ABI_rf16: %s\n", val ? _("yes") : _("no"));
14274 break;
14275
14276 case Tag_ARC_ABI_osver:
14277 val = read_uleb128 (p, &len, end);
14278 p += len;
14279 printf (" Tag_ARC_ABI_osver: v%d\n", val);
14280 break;
14281
14282 case Tag_ARC_ABI_pic:
14283 case Tag_ARC_ABI_sda:
14284 val = read_uleb128 (p, &len, end);
14285 p += len;
14286 printf (tag == Tag_ARC_ABI_sda ? " Tag_ARC_ABI_sda: "
14287 : " Tag_ARC_ABI_pic: ");
14288 switch (val)
14289 {
14290 case 0:
14291 printf (_("Absent\n"));
14292 break;
14293 case 1:
14294 printf ("MWDT\n");
14295 break;
14296 case 2:
14297 printf ("GNU\n");
14298 break;
14299 default:
14300 printf (_("Unknown\n"));
14301 break;
14302 }
14303 break;
14304
14305 case Tag_ARC_ABI_tls:
14306 val = read_uleb128 (p, &len, end);
14307 p += len;
14308 printf (" Tag_ARC_ABI_tls: %s\n", val ? "r25": "none");
14309 break;
14310
14311 case Tag_ARC_ABI_enumsize:
14312 val = read_uleb128 (p, &len, end);
14313 p += len;
14314 printf (" Tag_ARC_ABI_enumsize: %s\n", val ? _("default") :
14315 _("smallest"));
14316 break;
14317
14318 case Tag_ARC_ABI_exceptions:
14319 val = read_uleb128 (p, &len, end);
14320 p += len;
14321 printf (" Tag_ARC_ABI_exceptions: %s\n", val ? _("OPTFP")
14322 : _("default"));
14323 break;
14324
14325 case Tag_ARC_ABI_double_size:
14326 val = read_uleb128 (p, &len, end);
14327 p += len;
14328 printf (" Tag_ARC_ABI_double_size: %d\n", val);
14329 break;
14330
14331 case Tag_ARC_ISA_config:
14332 printf (" Tag_ARC_ISA_config: ");
14333 p = display_tag_value (-1, p, end);
14334 break;
14335
14336 case Tag_ARC_ISA_apex:
14337 printf (" Tag_ARC_ISA_apex: ");
14338 p = display_tag_value (-1, p, end);
14339 break;
14340
14341 case Tag_ARC_ISA_mpy_option:
14342 val = read_uleb128 (p, &len, end);
14343 p += len;
14344 printf (" Tag_ARC_ISA_mpy_option: %d\n", val);
14345 break;
14346
14347 case Tag_ARC_ATR_version:
14348 val = read_uleb128 (p, &len, end);
14349 p += len;
14350 printf (" Tag_ARC_ATR_version: %d\n", val);
14351 break;
14352
14353 default:
14354 return display_tag_value (tag & 1, p, end);
14355 }
14356
14357 return p;
14358 }
14359
14360 /* ARM EABI attributes section. */
14361 typedef struct
14362 {
14363 unsigned int tag;
14364 const char * name;
14365 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
14366 unsigned int type;
14367 const char ** table;
14368 } arm_attr_public_tag;
14369
14370 static const char * arm_attr_tag_CPU_arch[] =
14371 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
14372 "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "v8-R", "v8-M.baseline",
14373 "v8-M.mainline"};
14374 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
14375 static const char * arm_attr_tag_THUMB_ISA_use[] =
14376 {"No", "Thumb-1", "Thumb-2", "Yes"};
14377 static const char * arm_attr_tag_FP_arch[] =
14378 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
14379 "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
14380 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
14381 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
14382 {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
14383 "NEON for ARMv8.1"};
14384 static const char * arm_attr_tag_PCS_config[] =
14385 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
14386 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
14387 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
14388 {"V6", "SB", "TLS", "Unused"};
14389 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
14390 {"Absolute", "PC-relative", "SB-relative", "None"};
14391 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
14392 {"Absolute", "PC-relative", "None"};
14393 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
14394 {"None", "direct", "GOT-indirect"};
14395 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
14396 {"None", "??? 1", "2", "??? 3", "4"};
14397 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
14398 static const char * arm_attr_tag_ABI_FP_denormal[] =
14399 {"Unused", "Needed", "Sign only"};
14400 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
14401 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
14402 static const char * arm_attr_tag_ABI_FP_number_model[] =
14403 {"Unused", "Finite", "RTABI", "IEEE 754"};
14404 static const char * arm_attr_tag_ABI_enum_size[] =
14405 {"Unused", "small", "int", "forced to int"};
14406 static const char * arm_attr_tag_ABI_HardFP_use[] =
14407 {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
14408 static const char * arm_attr_tag_ABI_VFP_args[] =
14409 {"AAPCS", "VFP registers", "custom", "compatible"};
14410 static const char * arm_attr_tag_ABI_WMMX_args[] =
14411 {"AAPCS", "WMMX registers", "custom"};
14412 static const char * arm_attr_tag_ABI_optimization_goals[] =
14413 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14414 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
14415 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
14416 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14417 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
14418 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
14419 static const char * arm_attr_tag_FP_HP_extension[] =
14420 {"Not Allowed", "Allowed"};
14421 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
14422 {"None", "IEEE 754", "Alternative Format"};
14423 static const char * arm_attr_tag_DSP_extension[] =
14424 {"Follow architecture", "Allowed"};
14425 static const char * arm_attr_tag_MPextension_use[] =
14426 {"Not Allowed", "Allowed"};
14427 static const char * arm_attr_tag_DIV_use[] =
14428 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
14429 "Allowed in v7-A with integer division extension"};
14430 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
14431 static const char * arm_attr_tag_Virtualization_use[] =
14432 {"Not Allowed", "TrustZone", "Virtualization Extensions",
14433 "TrustZone and Virtualization Extensions"};
14434 static const char * arm_attr_tag_MPextension_use_legacy[] =
14435 {"Not Allowed", "Allowed"};
14436
14437 #define LOOKUP(id, name) \
14438 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
14439 static arm_attr_public_tag arm_attr_public_tags[] =
14440 {
14441 {4, "CPU_raw_name", 1, NULL},
14442 {5, "CPU_name", 1, NULL},
14443 LOOKUP(6, CPU_arch),
14444 {7, "CPU_arch_profile", 0, NULL},
14445 LOOKUP(8, ARM_ISA_use),
14446 LOOKUP(9, THUMB_ISA_use),
14447 LOOKUP(10, FP_arch),
14448 LOOKUP(11, WMMX_arch),
14449 LOOKUP(12, Advanced_SIMD_arch),
14450 LOOKUP(13, PCS_config),
14451 LOOKUP(14, ABI_PCS_R9_use),
14452 LOOKUP(15, ABI_PCS_RW_data),
14453 LOOKUP(16, ABI_PCS_RO_data),
14454 LOOKUP(17, ABI_PCS_GOT_use),
14455 LOOKUP(18, ABI_PCS_wchar_t),
14456 LOOKUP(19, ABI_FP_rounding),
14457 LOOKUP(20, ABI_FP_denormal),
14458 LOOKUP(21, ABI_FP_exceptions),
14459 LOOKUP(22, ABI_FP_user_exceptions),
14460 LOOKUP(23, ABI_FP_number_model),
14461 {24, "ABI_align_needed", 0, NULL},
14462 {25, "ABI_align_preserved", 0, NULL},
14463 LOOKUP(26, ABI_enum_size),
14464 LOOKUP(27, ABI_HardFP_use),
14465 LOOKUP(28, ABI_VFP_args),
14466 LOOKUP(29, ABI_WMMX_args),
14467 LOOKUP(30, ABI_optimization_goals),
14468 LOOKUP(31, ABI_FP_optimization_goals),
14469 {32, "compatibility", 0, NULL},
14470 LOOKUP(34, CPU_unaligned_access),
14471 LOOKUP(36, FP_HP_extension),
14472 LOOKUP(38, ABI_FP_16bit_format),
14473 LOOKUP(42, MPextension_use),
14474 LOOKUP(44, DIV_use),
14475 LOOKUP(46, DSP_extension),
14476 {64, "nodefaults", 0, NULL},
14477 {65, "also_compatible_with", 0, NULL},
14478 LOOKUP(66, T2EE_use),
14479 {67, "conformance", 1, NULL},
14480 LOOKUP(68, Virtualization_use),
14481 LOOKUP(70, MPextension_use_legacy)
14482 };
14483 #undef LOOKUP
14484
14485 static unsigned char *
14486 display_arm_attribute (unsigned char * p,
14487 const unsigned char * const end)
14488 {
14489 unsigned int tag;
14490 unsigned int len;
14491 unsigned int val;
14492 arm_attr_public_tag * attr;
14493 unsigned i;
14494 unsigned int type;
14495
14496 tag = read_uleb128 (p, &len, end);
14497 p += len;
14498 attr = NULL;
14499 for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
14500 {
14501 if (arm_attr_public_tags[i].tag == tag)
14502 {
14503 attr = &arm_attr_public_tags[i];
14504 break;
14505 }
14506 }
14507
14508 if (attr)
14509 {
14510 printf (" Tag_%s: ", attr->name);
14511 switch (attr->type)
14512 {
14513 case 0:
14514 switch (tag)
14515 {
14516 case 7: /* Tag_CPU_arch_profile. */
14517 val = read_uleb128 (p, &len, end);
14518 p += len;
14519 switch (val)
14520 {
14521 case 0: printf (_("None\n")); break;
14522 case 'A': printf (_("Application\n")); break;
14523 case 'R': printf (_("Realtime\n")); break;
14524 case 'M': printf (_("Microcontroller\n")); break;
14525 case 'S': printf (_("Application or Realtime\n")); break;
14526 default: printf ("??? (%d)\n", val); break;
14527 }
14528 break;
14529
14530 case 24: /* Tag_align_needed. */
14531 val = read_uleb128 (p, &len, end);
14532 p += len;
14533 switch (val)
14534 {
14535 case 0: printf (_("None\n")); break;
14536 case 1: printf (_("8-byte\n")); break;
14537 case 2: printf (_("4-byte\n")); break;
14538 case 3: printf ("??? 3\n"); break;
14539 default:
14540 if (val <= 12)
14541 printf (_("8-byte and up to %d-byte extended\n"),
14542 1 << val);
14543 else
14544 printf ("??? (%d)\n", val);
14545 break;
14546 }
14547 break;
14548
14549 case 25: /* Tag_align_preserved. */
14550 val = read_uleb128 (p, &len, end);
14551 p += len;
14552 switch (val)
14553 {
14554 case 0: printf (_("None\n")); break;
14555 case 1: printf (_("8-byte, except leaf SP\n")); break;
14556 case 2: printf (_("8-byte\n")); break;
14557 case 3: printf ("??? 3\n"); break;
14558 default:
14559 if (val <= 12)
14560 printf (_("8-byte and up to %d-byte extended\n"),
14561 1 << val);
14562 else
14563 printf ("??? (%d)\n", val);
14564 break;
14565 }
14566 break;
14567
14568 case 32: /* Tag_compatibility. */
14569 {
14570 val = read_uleb128 (p, &len, end);
14571 p += len;
14572 printf (_("flag = %d, vendor = "), val);
14573 if (p < end - 1)
14574 {
14575 size_t maxlen = (end - p) - 1;
14576
14577 print_symbol ((int) maxlen, (const char *) p);
14578 p += strnlen ((char *) p, maxlen) + 1;
14579 }
14580 else
14581 {
14582 printf (_("<corrupt>"));
14583 p = (unsigned char *) end;
14584 }
14585 putchar ('\n');
14586 }
14587 break;
14588
14589 case 64: /* Tag_nodefaults. */
14590 /* PR 17531: file: 001-505008-0.01. */
14591 if (p < end)
14592 p++;
14593 printf (_("True\n"));
14594 break;
14595
14596 case 65: /* Tag_also_compatible_with. */
14597 val = read_uleb128 (p, &len, end);
14598 p += len;
14599 if (val == 6 /* Tag_CPU_arch. */)
14600 {
14601 val = read_uleb128 (p, &len, end);
14602 p += len;
14603 if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
14604 printf ("??? (%d)\n", val);
14605 else
14606 printf ("%s\n", arm_attr_tag_CPU_arch[val]);
14607 }
14608 else
14609 printf ("???\n");
14610 while (p < end && *(p++) != '\0' /* NUL terminator. */)
14611 ;
14612 break;
14613
14614 default:
14615 printf (_("<unknown: %d>\n"), tag);
14616 break;
14617 }
14618 return p;
14619
14620 case 1:
14621 return display_tag_value (-1, p, end);
14622 case 2:
14623 return display_tag_value (0, p, end);
14624
14625 default:
14626 assert (attr->type & 0x80);
14627 val = read_uleb128 (p, &len, end);
14628 p += len;
14629 type = attr->type & 0x7f;
14630 if (val >= type)
14631 printf ("??? (%d)\n", val);
14632 else
14633 printf ("%s\n", attr->table[val]);
14634 return p;
14635 }
14636 }
14637
14638 return display_tag_value (tag, p, end);
14639 }
14640
14641 static unsigned char *
14642 display_gnu_attribute (unsigned char * p,
14643 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const),
14644 const unsigned char * const end)
14645 {
14646 int tag;
14647 unsigned int len;
14648 unsigned int val;
14649
14650 tag = read_uleb128 (p, &len, end);
14651 p += len;
14652
14653 /* Tag_compatibility is the only generic GNU attribute defined at
14654 present. */
14655 if (tag == 32)
14656 {
14657 val = read_uleb128 (p, &len, end);
14658 p += len;
14659
14660 printf (_("flag = %d, vendor = "), val);
14661 if (p == end)
14662 {
14663 printf (_("<corrupt>\n"));
14664 warn (_("corrupt vendor attribute\n"));
14665 }
14666 else
14667 {
14668 if (p < end - 1)
14669 {
14670 size_t maxlen = (end - p) - 1;
14671
14672 print_symbol ((int) maxlen, (const char *) p);
14673 p += strnlen ((char *) p, maxlen) + 1;
14674 }
14675 else
14676 {
14677 printf (_("<corrupt>"));
14678 p = (unsigned char *) end;
14679 }
14680 putchar ('\n');
14681 }
14682 return p;
14683 }
14684
14685 if ((tag & 2) == 0 && display_proc_gnu_attribute)
14686 return display_proc_gnu_attribute (p, tag, end);
14687
14688 return display_tag_value (tag, p, end);
14689 }
14690
14691 static unsigned char *
14692 display_power_gnu_attribute (unsigned char * p,
14693 unsigned int tag,
14694 const unsigned char * const end)
14695 {
14696 unsigned int len;
14697 unsigned int val;
14698
14699 if (tag == Tag_GNU_Power_ABI_FP)
14700 {
14701 val = read_uleb128 (p, &len, end);
14702 p += len;
14703 printf (" Tag_GNU_Power_ABI_FP: ");
14704 if (len == 0)
14705 {
14706 printf (_("<corrupt>\n"));
14707 return p;
14708 }
14709
14710 if (val > 15)
14711 printf ("(%#x), ", val);
14712
14713 switch (val & 3)
14714 {
14715 case 0:
14716 printf (_("unspecified hard/soft float, "));
14717 break;
14718 case 1:
14719 printf (_("hard float, "));
14720 break;
14721 case 2:
14722 printf (_("soft float, "));
14723 break;
14724 case 3:
14725 printf (_("single-precision hard float, "));
14726 break;
14727 }
14728
14729 switch (val & 0xC)
14730 {
14731 case 0:
14732 printf (_("unspecified long double\n"));
14733 break;
14734 case 4:
14735 printf (_("128-bit IBM long double\n"));
14736 break;
14737 case 8:
14738 printf (_("64-bit long double\n"));
14739 break;
14740 case 12:
14741 printf (_("128-bit IEEE long double\n"));
14742 break;
14743 }
14744 return p;
14745 }
14746
14747 if (tag == Tag_GNU_Power_ABI_Vector)
14748 {
14749 val = read_uleb128 (p, &len, end);
14750 p += len;
14751 printf (" Tag_GNU_Power_ABI_Vector: ");
14752 if (len == 0)
14753 {
14754 printf (_("<corrupt>\n"));
14755 return p;
14756 }
14757
14758 if (val > 3)
14759 printf ("(%#x), ", val);
14760
14761 switch (val & 3)
14762 {
14763 case 0:
14764 printf (_("unspecified\n"));
14765 break;
14766 case 1:
14767 printf (_("generic\n"));
14768 break;
14769 case 2:
14770 printf ("AltiVec\n");
14771 break;
14772 case 3:
14773 printf ("SPE\n");
14774 break;
14775 }
14776 return p;
14777 }
14778
14779 if (tag == Tag_GNU_Power_ABI_Struct_Return)
14780 {
14781 val = read_uleb128 (p, &len, end);
14782 p += len;
14783 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
14784 if (len == 0)
14785 {
14786 printf (_("<corrupt>\n"));
14787 return p;
14788 }
14789
14790 if (val > 2)
14791 printf ("(%#x), ", val);
14792
14793 switch (val & 3)
14794 {
14795 case 0:
14796 printf (_("unspecified\n"));
14797 break;
14798 case 1:
14799 printf ("r3/r4\n");
14800 break;
14801 case 2:
14802 printf (_("memory\n"));
14803 break;
14804 case 3:
14805 printf ("???\n");
14806 break;
14807 }
14808 return p;
14809 }
14810
14811 return display_tag_value (tag & 1, p, end);
14812 }
14813
14814 static unsigned char *
14815 display_s390_gnu_attribute (unsigned char * p,
14816 unsigned int tag,
14817 const unsigned char * const end)
14818 {
14819 unsigned int len;
14820 int val;
14821
14822 if (tag == Tag_GNU_S390_ABI_Vector)
14823 {
14824 val = read_uleb128 (p, &len, end);
14825 p += len;
14826 printf (" Tag_GNU_S390_ABI_Vector: ");
14827
14828 switch (val)
14829 {
14830 case 0:
14831 printf (_("any\n"));
14832 break;
14833 case 1:
14834 printf (_("software\n"));
14835 break;
14836 case 2:
14837 printf (_("hardware\n"));
14838 break;
14839 default:
14840 printf ("??? (%d)\n", val);
14841 break;
14842 }
14843 return p;
14844 }
14845
14846 return display_tag_value (tag & 1, p, end);
14847 }
14848
14849 static void
14850 display_sparc_hwcaps (unsigned int mask)
14851 {
14852 if (mask)
14853 {
14854 bfd_boolean first = TRUE;
14855
14856 if (mask & ELF_SPARC_HWCAP_MUL32)
14857 fputs ("mul32", stdout), first = FALSE;
14858 if (mask & ELF_SPARC_HWCAP_DIV32)
14859 printf ("%sdiv32", first ? "" : "|"), first = FALSE;
14860 if (mask & ELF_SPARC_HWCAP_FSMULD)
14861 printf ("%sfsmuld", first ? "" : "|"), first = FALSE;
14862 if (mask & ELF_SPARC_HWCAP_V8PLUS)
14863 printf ("%sv8plus", first ? "" : "|"), first = FALSE;
14864 if (mask & ELF_SPARC_HWCAP_POPC)
14865 printf ("%spopc", first ? "" : "|"), first = FALSE;
14866 if (mask & ELF_SPARC_HWCAP_VIS)
14867 printf ("%svis", first ? "" : "|"), first = FALSE;
14868 if (mask & ELF_SPARC_HWCAP_VIS2)
14869 printf ("%svis2", first ? "" : "|"), first = FALSE;
14870 if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
14871 printf ("%sASIBlkInit", first ? "" : "|"), first = FALSE;
14872 if (mask & ELF_SPARC_HWCAP_FMAF)
14873 printf ("%sfmaf", first ? "" : "|"), first = FALSE;
14874 if (mask & ELF_SPARC_HWCAP_VIS3)
14875 printf ("%svis3", first ? "" : "|"), first = FALSE;
14876 if (mask & ELF_SPARC_HWCAP_HPC)
14877 printf ("%shpc", first ? "" : "|"), first = FALSE;
14878 if (mask & ELF_SPARC_HWCAP_RANDOM)
14879 printf ("%srandom", first ? "" : "|"), first = FALSE;
14880 if (mask & ELF_SPARC_HWCAP_TRANS)
14881 printf ("%strans", first ? "" : "|"), first = FALSE;
14882 if (mask & ELF_SPARC_HWCAP_FJFMAU)
14883 printf ("%sfjfmau", first ? "" : "|"), first = FALSE;
14884 if (mask & ELF_SPARC_HWCAP_IMA)
14885 printf ("%sima", first ? "" : "|"), first = FALSE;
14886 if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
14887 printf ("%scspare", first ? "" : "|"), first = FALSE;
14888 }
14889 else
14890 fputc ('0', stdout);
14891 fputc ('\n', stdout);
14892 }
14893
14894 static void
14895 display_sparc_hwcaps2 (unsigned int mask)
14896 {
14897 if (mask)
14898 {
14899 bfd_boolean first = TRUE;
14900
14901 if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
14902 fputs ("fjathplus", stdout), first = FALSE;
14903 if (mask & ELF_SPARC_HWCAP2_VIS3B)
14904 printf ("%svis3b", first ? "" : "|"), first = FALSE;
14905 if (mask & ELF_SPARC_HWCAP2_ADP)
14906 printf ("%sadp", first ? "" : "|"), first = FALSE;
14907 if (mask & ELF_SPARC_HWCAP2_SPARC5)
14908 printf ("%ssparc5", first ? "" : "|"), first = FALSE;
14909 if (mask & ELF_SPARC_HWCAP2_MWAIT)
14910 printf ("%smwait", first ? "" : "|"), first = FALSE;
14911 if (mask & ELF_SPARC_HWCAP2_XMPMUL)
14912 printf ("%sxmpmul", first ? "" : "|"), first = FALSE;
14913 if (mask & ELF_SPARC_HWCAP2_XMONT)
14914 printf ("%sxmont2", first ? "" : "|"), first = FALSE;
14915 if (mask & ELF_SPARC_HWCAP2_NSEC)
14916 printf ("%snsec", first ? "" : "|"), first = FALSE;
14917 if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
14918 printf ("%sfjathhpc", first ? "" : "|"), first = FALSE;
14919 if (mask & ELF_SPARC_HWCAP2_FJDES)
14920 printf ("%sfjdes", first ? "" : "|"), first = FALSE;
14921 if (mask & ELF_SPARC_HWCAP2_FJAES)
14922 printf ("%sfjaes", first ? "" : "|"), first = FALSE;
14923 }
14924 else
14925 fputc ('0', stdout);
14926 fputc ('\n', stdout);
14927 }
14928
14929 static unsigned char *
14930 display_sparc_gnu_attribute (unsigned char * p,
14931 unsigned int tag,
14932 const unsigned char * const end)
14933 {
14934 unsigned int len;
14935 int val;
14936
14937 if (tag == Tag_GNU_Sparc_HWCAPS)
14938 {
14939 val = read_uleb128 (p, &len, end);
14940 p += len;
14941 printf (" Tag_GNU_Sparc_HWCAPS: ");
14942 display_sparc_hwcaps (val);
14943 return p;
14944 }
14945 if (tag == Tag_GNU_Sparc_HWCAPS2)
14946 {
14947 val = read_uleb128 (p, &len, end);
14948 p += len;
14949 printf (" Tag_GNU_Sparc_HWCAPS2: ");
14950 display_sparc_hwcaps2 (val);
14951 return p;
14952 }
14953
14954 return display_tag_value (tag, p, end);
14955 }
14956
14957 static void
14958 print_mips_fp_abi_value (unsigned int val)
14959 {
14960 switch (val)
14961 {
14962 case Val_GNU_MIPS_ABI_FP_ANY:
14963 printf (_("Hard or soft float\n"));
14964 break;
14965 case Val_GNU_MIPS_ABI_FP_DOUBLE:
14966 printf (_("Hard float (double precision)\n"));
14967 break;
14968 case Val_GNU_MIPS_ABI_FP_SINGLE:
14969 printf (_("Hard float (single precision)\n"));
14970 break;
14971 case Val_GNU_MIPS_ABI_FP_SOFT:
14972 printf (_("Soft float\n"));
14973 break;
14974 case Val_GNU_MIPS_ABI_FP_OLD_64:
14975 printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
14976 break;
14977 case Val_GNU_MIPS_ABI_FP_XX:
14978 printf (_("Hard float (32-bit CPU, Any FPU)\n"));
14979 break;
14980 case Val_GNU_MIPS_ABI_FP_64:
14981 printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
14982 break;
14983 case Val_GNU_MIPS_ABI_FP_64A:
14984 printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
14985 break;
14986 case Val_GNU_MIPS_ABI_FP_NAN2008:
14987 printf (_("NaN 2008 compatibility\n"));
14988 break;
14989 default:
14990 printf ("??? (%d)\n", val);
14991 break;
14992 }
14993 }
14994
14995 static unsigned char *
14996 display_mips_gnu_attribute (unsigned char * p,
14997 unsigned int tag,
14998 const unsigned char * const end)
14999 {
15000 if (tag == Tag_GNU_MIPS_ABI_FP)
15001 {
15002 unsigned int len;
15003 unsigned int val;
15004
15005 val = read_uleb128 (p, &len, end);
15006 p += len;
15007 printf (" Tag_GNU_MIPS_ABI_FP: ");
15008
15009 print_mips_fp_abi_value (val);
15010
15011 return p;
15012 }
15013
15014 if (tag == Tag_GNU_MIPS_ABI_MSA)
15015 {
15016 unsigned int len;
15017 unsigned int val;
15018
15019 val = read_uleb128 (p, &len, end);
15020 p += len;
15021 printf (" Tag_GNU_MIPS_ABI_MSA: ");
15022
15023 switch (val)
15024 {
15025 case Val_GNU_MIPS_ABI_MSA_ANY:
15026 printf (_("Any MSA or not\n"));
15027 break;
15028 case Val_GNU_MIPS_ABI_MSA_128:
15029 printf (_("128-bit MSA\n"));
15030 break;
15031 default:
15032 printf ("??? (%d)\n", val);
15033 break;
15034 }
15035 return p;
15036 }
15037
15038 return display_tag_value (tag & 1, p, end);
15039 }
15040
15041 static unsigned char *
15042 display_tic6x_attribute (unsigned char * p,
15043 const unsigned char * const end)
15044 {
15045 unsigned int tag;
15046 unsigned int len;
15047 int val;
15048
15049 tag = read_uleb128 (p, &len, end);
15050 p += len;
15051
15052 switch (tag)
15053 {
15054 case Tag_ISA:
15055 val = read_uleb128 (p, &len, end);
15056 p += len;
15057 printf (" Tag_ISA: ");
15058
15059 switch (val)
15060 {
15061 case C6XABI_Tag_ISA_none:
15062 printf (_("None\n"));
15063 break;
15064 case C6XABI_Tag_ISA_C62X:
15065 printf ("C62x\n");
15066 break;
15067 case C6XABI_Tag_ISA_C67X:
15068 printf ("C67x\n");
15069 break;
15070 case C6XABI_Tag_ISA_C67XP:
15071 printf ("C67x+\n");
15072 break;
15073 case C6XABI_Tag_ISA_C64X:
15074 printf ("C64x\n");
15075 break;
15076 case C6XABI_Tag_ISA_C64XP:
15077 printf ("C64x+\n");
15078 break;
15079 case C6XABI_Tag_ISA_C674X:
15080 printf ("C674x\n");
15081 break;
15082 default:
15083 printf ("??? (%d)\n", val);
15084 break;
15085 }
15086 return p;
15087
15088 case Tag_ABI_wchar_t:
15089 val = read_uleb128 (p, &len, end);
15090 p += len;
15091 printf (" Tag_ABI_wchar_t: ");
15092 switch (val)
15093 {
15094 case 0:
15095 printf (_("Not used\n"));
15096 break;
15097 case 1:
15098 printf (_("2 bytes\n"));
15099 break;
15100 case 2:
15101 printf (_("4 bytes\n"));
15102 break;
15103 default:
15104 printf ("??? (%d)\n", val);
15105 break;
15106 }
15107 return p;
15108
15109 case Tag_ABI_stack_align_needed:
15110 val = read_uleb128 (p, &len, end);
15111 p += len;
15112 printf (" Tag_ABI_stack_align_needed: ");
15113 switch (val)
15114 {
15115 case 0:
15116 printf (_("8-byte\n"));
15117 break;
15118 case 1:
15119 printf (_("16-byte\n"));
15120 break;
15121 default:
15122 printf ("??? (%d)\n", val);
15123 break;
15124 }
15125 return p;
15126
15127 case Tag_ABI_stack_align_preserved:
15128 val = read_uleb128 (p, &len, end);
15129 p += len;
15130 printf (" Tag_ABI_stack_align_preserved: ");
15131 switch (val)
15132 {
15133 case 0:
15134 printf (_("8-byte\n"));
15135 break;
15136 case 1:
15137 printf (_("16-byte\n"));
15138 break;
15139 default:
15140 printf ("??? (%d)\n", val);
15141 break;
15142 }
15143 return p;
15144
15145 case Tag_ABI_DSBT:
15146 val = read_uleb128 (p, &len, end);
15147 p += len;
15148 printf (" Tag_ABI_DSBT: ");
15149 switch (val)
15150 {
15151 case 0:
15152 printf (_("DSBT addressing not used\n"));
15153 break;
15154 case 1:
15155 printf (_("DSBT addressing used\n"));
15156 break;
15157 default:
15158 printf ("??? (%d)\n", val);
15159 break;
15160 }
15161 return p;
15162
15163 case Tag_ABI_PID:
15164 val = read_uleb128 (p, &len, end);
15165 p += len;
15166 printf (" Tag_ABI_PID: ");
15167 switch (val)
15168 {
15169 case 0:
15170 printf (_("Data addressing position-dependent\n"));
15171 break;
15172 case 1:
15173 printf (_("Data addressing position-independent, GOT near DP\n"));
15174 break;
15175 case 2:
15176 printf (_("Data addressing position-independent, GOT far from DP\n"));
15177 break;
15178 default:
15179 printf ("??? (%d)\n", val);
15180 break;
15181 }
15182 return p;
15183
15184 case Tag_ABI_PIC:
15185 val = read_uleb128 (p, &len, end);
15186 p += len;
15187 printf (" Tag_ABI_PIC: ");
15188 switch (val)
15189 {
15190 case 0:
15191 printf (_("Code addressing position-dependent\n"));
15192 break;
15193 case 1:
15194 printf (_("Code addressing position-independent\n"));
15195 break;
15196 default:
15197 printf ("??? (%d)\n", val);
15198 break;
15199 }
15200 return p;
15201
15202 case Tag_ABI_array_object_alignment:
15203 val = read_uleb128 (p, &len, end);
15204 p += len;
15205 printf (" Tag_ABI_array_object_alignment: ");
15206 switch (val)
15207 {
15208 case 0:
15209 printf (_("8-byte\n"));
15210 break;
15211 case 1:
15212 printf (_("4-byte\n"));
15213 break;
15214 case 2:
15215 printf (_("16-byte\n"));
15216 break;
15217 default:
15218 printf ("??? (%d)\n", val);
15219 break;
15220 }
15221 return p;
15222
15223 case Tag_ABI_array_object_align_expected:
15224 val = read_uleb128 (p, &len, end);
15225 p += len;
15226 printf (" Tag_ABI_array_object_align_expected: ");
15227 switch (val)
15228 {
15229 case 0:
15230 printf (_("8-byte\n"));
15231 break;
15232 case 1:
15233 printf (_("4-byte\n"));
15234 break;
15235 case 2:
15236 printf (_("16-byte\n"));
15237 break;
15238 default:
15239 printf ("??? (%d)\n", val);
15240 break;
15241 }
15242 return p;
15243
15244 case Tag_ABI_compatibility:
15245 {
15246 val = read_uleb128 (p, &len, end);
15247 p += len;
15248 printf (" Tag_ABI_compatibility: ");
15249 printf (_("flag = %d, vendor = "), val);
15250 if (p < end - 1)
15251 {
15252 size_t maxlen = (end - p) - 1;
15253
15254 print_symbol ((int) maxlen, (const char *) p);
15255 p += strnlen ((char *) p, maxlen) + 1;
15256 }
15257 else
15258 {
15259 printf (_("<corrupt>"));
15260 p = (unsigned char *) end;
15261 }
15262 putchar ('\n');
15263 return p;
15264 }
15265
15266 case Tag_ABI_conformance:
15267 {
15268 printf (" Tag_ABI_conformance: \"");
15269 if (p < end - 1)
15270 {
15271 size_t maxlen = (end - p) - 1;
15272
15273 print_symbol ((int) maxlen, (const char *) p);
15274 p += strnlen ((char *) p, maxlen) + 1;
15275 }
15276 else
15277 {
15278 printf (_("<corrupt>"));
15279 p = (unsigned char *) end;
15280 }
15281 printf ("\"\n");
15282 return p;
15283 }
15284 }
15285
15286 return display_tag_value (tag, p, end);
15287 }
15288
15289 static void
15290 display_raw_attribute (unsigned char * p, unsigned char const * const end)
15291 {
15292 unsigned long addr = 0;
15293 size_t bytes = end - p;
15294
15295 assert (end >= p);
15296 while (bytes)
15297 {
15298 int j;
15299 int k;
15300 int lbytes = (bytes > 16 ? 16 : bytes);
15301
15302 printf (" 0x%8.8lx ", addr);
15303
15304 for (j = 0; j < 16; j++)
15305 {
15306 if (j < lbytes)
15307 printf ("%2.2x", p[j]);
15308 else
15309 printf (" ");
15310
15311 if ((j & 3) == 3)
15312 printf (" ");
15313 }
15314
15315 for (j = 0; j < lbytes; j++)
15316 {
15317 k = p[j];
15318 if (k >= ' ' && k < 0x7f)
15319 printf ("%c", k);
15320 else
15321 printf (".");
15322 }
15323
15324 putchar ('\n');
15325
15326 p += lbytes;
15327 bytes -= lbytes;
15328 addr += lbytes;
15329 }
15330
15331 putchar ('\n');
15332 }
15333
15334 static unsigned char *
15335 display_msp430x_attribute (unsigned char * p,
15336 const unsigned char * const end)
15337 {
15338 unsigned int len;
15339 unsigned int val;
15340 unsigned int tag;
15341
15342 tag = read_uleb128 (p, & len, end);
15343 p += len;
15344
15345 switch (tag)
15346 {
15347 case OFBA_MSPABI_Tag_ISA:
15348 val = read_uleb128 (p, &len, end);
15349 p += len;
15350 printf (" Tag_ISA: ");
15351 switch (val)
15352 {
15353 case 0: printf (_("None\n")); break;
15354 case 1: printf (_("MSP430\n")); break;
15355 case 2: printf (_("MSP430X\n")); break;
15356 default: printf ("??? (%d)\n", val); break;
15357 }
15358 break;
15359
15360 case OFBA_MSPABI_Tag_Code_Model:
15361 val = read_uleb128 (p, &len, end);
15362 p += len;
15363 printf (" Tag_Code_Model: ");
15364 switch (val)
15365 {
15366 case 0: printf (_("None\n")); break;
15367 case 1: printf (_("Small\n")); break;
15368 case 2: printf (_("Large\n")); break;
15369 default: printf ("??? (%d)\n", val); break;
15370 }
15371 break;
15372
15373 case OFBA_MSPABI_Tag_Data_Model:
15374 val = read_uleb128 (p, &len, end);
15375 p += len;
15376 printf (" Tag_Data_Model: ");
15377 switch (val)
15378 {
15379 case 0: printf (_("None\n")); break;
15380 case 1: printf (_("Small\n")); break;
15381 case 2: printf (_("Large\n")); break;
15382 case 3: printf (_("Restricted Large\n")); break;
15383 default: printf ("??? (%d)\n", val); break;
15384 }
15385 break;
15386
15387 default:
15388 printf (_(" <unknown tag %d>: "), tag);
15389
15390 if (tag & 1)
15391 {
15392 putchar ('"');
15393 if (p < end - 1)
15394 {
15395 size_t maxlen = (end - p) - 1;
15396
15397 print_symbol ((int) maxlen, (const char *) p);
15398 p += strnlen ((char *) p, maxlen) + 1;
15399 }
15400 else
15401 {
15402 printf (_("<corrupt>"));
15403 p = (unsigned char *) end;
15404 }
15405 printf ("\"\n");
15406 }
15407 else
15408 {
15409 val = read_uleb128 (p, &len, end);
15410 p += len;
15411 printf ("%d (0x%x)\n", val, val);
15412 }
15413 break;
15414 }
15415
15416 assert (p <= end);
15417 return p;
15418 }
15419
15420 struct riscv_attr_tag_t {
15421 const char *name;
15422 int tag;
15423 };
15424
15425 static struct riscv_attr_tag_t riscv_attr_tag[] =
15426 {
15427 #define T(tag) {"Tag_RISCV_" #tag, Tag_RISCV_##tag}
15428 T(arch),
15429 T(priv_spec),
15430 T(priv_spec_minor),
15431 T(priv_spec_revision),
15432 T(unaligned_access),
15433 T(stack_align),
15434 #undef T
15435 };
15436
15437 static unsigned char *
15438 display_riscv_attribute (unsigned char *p,
15439 const unsigned char * const end)
15440 {
15441 unsigned int len;
15442 int val;
15443 int tag;
15444 struct riscv_attr_tag_t *attr = NULL;
15445 unsigned i;
15446
15447 tag = read_uleb128 (p, &len, end);
15448 p += len;
15449
15450 /* Find the name of attribute. */
15451 for (i = 0; i < ARRAY_SIZE (riscv_attr_tag); i++)
15452 {
15453 if (riscv_attr_tag[i].tag == tag)
15454 {
15455 attr = &riscv_attr_tag[i];
15456 break;
15457 }
15458 }
15459
15460 if (attr)
15461 printf (" %s: ", attr->name);
15462 else
15463 return display_tag_value (tag, p, end);
15464
15465 switch (tag)
15466 {
15467 case Tag_RISCV_priv_spec:
15468 case Tag_RISCV_priv_spec_minor:
15469 case Tag_RISCV_priv_spec_revision:
15470 val = read_uleb128 (p, &len, end);
15471 p += len;
15472 printf (_("%d\n"), val);
15473 break;
15474 case Tag_RISCV_unaligned_access:
15475 val = read_uleb128 (p, &len, end);
15476 p += len;
15477 switch (val)
15478 {
15479 case 0:
15480 printf (_("No unaligned access\n"));
15481 break;
15482 case 1:
15483 printf (_("Unaligned access\n"));
15484 break;
15485 }
15486 break;
15487 case Tag_RISCV_stack_align:
15488 val = read_uleb128 (p, &len, end);
15489 p += len;
15490 printf (_("%d-bytes\n"), val);
15491 break;
15492 case Tag_RISCV_arch:
15493 p = display_tag_value (-1, p, end);
15494 break;
15495 default:
15496 return display_tag_value (tag, p, end);
15497 }
15498
15499 return p;
15500 }
15501
15502 static bfd_boolean
15503 process_attributes (Filedata * filedata,
15504 const char * public_name,
15505 unsigned int proc_type,
15506 unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
15507 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const))
15508 {
15509 Elf_Internal_Shdr * sect;
15510 unsigned i;
15511 bfd_boolean res = TRUE;
15512
15513 /* Find the section header so that we get the size. */
15514 for (i = 0, sect = filedata->section_headers;
15515 i < filedata->file_header.e_shnum;
15516 i++, sect++)
15517 {
15518 unsigned char * contents;
15519 unsigned char * p;
15520
15521 if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
15522 continue;
15523
15524 contents = (unsigned char *) get_data (NULL, filedata, sect->sh_offset, 1,
15525 sect->sh_size, _("attributes"));
15526 if (contents == NULL)
15527 {
15528 res = FALSE;
15529 continue;
15530 }
15531
15532 p = contents;
15533 /* The first character is the version of the attributes.
15534 Currently only version 1, (aka 'A') is recognised here. */
15535 if (*p != 'A')
15536 {
15537 printf (_("Unknown attributes version '%c'(%d) - expecting 'A'\n"), *p, *p);
15538 res = FALSE;
15539 }
15540 else
15541 {
15542 bfd_vma section_len;
15543
15544 section_len = sect->sh_size - 1;
15545 p++;
15546
15547 while (section_len > 0)
15548 {
15549 bfd_vma attr_len;
15550 unsigned int namelen;
15551 bfd_boolean public_section;
15552 bfd_boolean gnu_section;
15553
15554 if (section_len <= 4)
15555 {
15556 error (_("Tag section ends prematurely\n"));
15557 res = FALSE;
15558 break;
15559 }
15560 attr_len = byte_get (p, 4);
15561 p += 4;
15562
15563 if (attr_len > section_len)
15564 {
15565 error (_("Bad attribute length (%u > %u)\n"),
15566 (unsigned) attr_len, (unsigned) section_len);
15567 attr_len = section_len;
15568 res = FALSE;
15569 }
15570 /* PR 17531: file: 001-101425-0.004 */
15571 else if (attr_len < 5)
15572 {
15573 error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
15574 res = FALSE;
15575 break;
15576 }
15577
15578 section_len -= attr_len;
15579 attr_len -= 4;
15580
15581 namelen = strnlen ((char *) p, attr_len) + 1;
15582 if (namelen == 0 || namelen >= attr_len)
15583 {
15584 error (_("Corrupt attribute section name\n"));
15585 res = FALSE;
15586 break;
15587 }
15588
15589 printf (_("Attribute Section: "));
15590 print_symbol (INT_MAX, (const char *) p);
15591 putchar ('\n');
15592
15593 if (public_name && streq ((char *) p, public_name))
15594 public_section = TRUE;
15595 else
15596 public_section = FALSE;
15597
15598 if (streq ((char *) p, "gnu"))
15599 gnu_section = TRUE;
15600 else
15601 gnu_section = FALSE;
15602
15603 p += namelen;
15604 attr_len -= namelen;
15605
15606 while (attr_len > 0 && p < contents + sect->sh_size)
15607 {
15608 int tag;
15609 int val;
15610 bfd_vma size;
15611 unsigned char * end;
15612
15613 /* PR binutils/17531: Safe handling of corrupt files. */
15614 if (attr_len < 6)
15615 {
15616 error (_("Unused bytes at end of section\n"));
15617 res = FALSE;
15618 section_len = 0;
15619 break;
15620 }
15621
15622 tag = *(p++);
15623 size = byte_get (p, 4);
15624 if (size > attr_len)
15625 {
15626 error (_("Bad subsection length (%u > %u)\n"),
15627 (unsigned) size, (unsigned) attr_len);
15628 res = FALSE;
15629 size = attr_len;
15630 }
15631 /* PR binutils/17531: Safe handling of corrupt files. */
15632 if (size < 6)
15633 {
15634 error (_("Bad subsection length (%u < 6)\n"),
15635 (unsigned) size);
15636 res = FALSE;
15637 section_len = 0;
15638 break;
15639 }
15640
15641 attr_len -= size;
15642 end = p + size - 1;
15643 assert (end <= contents + sect->sh_size);
15644 p += 4;
15645
15646 switch (tag)
15647 {
15648 case 1:
15649 printf (_("File Attributes\n"));
15650 break;
15651 case 2:
15652 printf (_("Section Attributes:"));
15653 goto do_numlist;
15654 case 3:
15655 printf (_("Symbol Attributes:"));
15656 /* Fall through. */
15657 do_numlist:
15658 for (;;)
15659 {
15660 unsigned int j;
15661
15662 val = read_uleb128 (p, &j, end);
15663 p += j;
15664 if (val == 0)
15665 break;
15666 printf (" %d", val);
15667 }
15668 printf ("\n");
15669 break;
15670 default:
15671 printf (_("Unknown tag: %d\n"), tag);
15672 public_section = FALSE;
15673 break;
15674 }
15675
15676 if (public_section && display_pub_attribute != NULL)
15677 {
15678 while (p < end)
15679 p = display_pub_attribute (p, end);
15680 assert (p == end);
15681 }
15682 else if (gnu_section && display_proc_gnu_attribute != NULL)
15683 {
15684 while (p < end)
15685 p = display_gnu_attribute (p,
15686 display_proc_gnu_attribute,
15687 end);
15688 assert (p == end);
15689 }
15690 else if (p < end)
15691 {
15692 printf (_(" Unknown attribute:\n"));
15693 display_raw_attribute (p, end);
15694 p = end;
15695 }
15696 else
15697 attr_len = 0;
15698 }
15699 }
15700 }
15701
15702 free (contents);
15703 }
15704
15705 return res;
15706 }
15707
15708 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
15709 Print the Address, Access and Initial fields of an entry at VMA ADDR
15710 and return the VMA of the next entry, or -1 if there was a problem.
15711 Does not read from DATA_END or beyond. */
15712
15713 static bfd_vma
15714 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
15715 unsigned char * data_end)
15716 {
15717 printf (" ");
15718 print_vma (addr, LONG_HEX);
15719 printf (" ");
15720 if (addr < pltgot + 0xfff0)
15721 printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
15722 else
15723 printf ("%10s", "");
15724 printf (" ");
15725 if (data == NULL)
15726 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
15727 else
15728 {
15729 bfd_vma entry;
15730 unsigned char * from = data + addr - pltgot;
15731
15732 if (from + (is_32bit_elf ? 4 : 8) > data_end)
15733 {
15734 warn (_("MIPS GOT entry extends beyond the end of available data\n"));
15735 printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
15736 return (bfd_vma) -1;
15737 }
15738 else
15739 {
15740 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
15741 print_vma (entry, LONG_HEX);
15742 }
15743 }
15744 return addr + (is_32bit_elf ? 4 : 8);
15745 }
15746
15747 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
15748 PLTGOT. Print the Address and Initial fields of an entry at VMA
15749 ADDR and return the VMA of the next entry. */
15750
15751 static bfd_vma
15752 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
15753 {
15754 printf (" ");
15755 print_vma (addr, LONG_HEX);
15756 printf (" ");
15757 if (data == NULL)
15758 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
15759 else
15760 {
15761 bfd_vma entry;
15762
15763 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
15764 print_vma (entry, LONG_HEX);
15765 }
15766 return addr + (is_32bit_elf ? 4 : 8);
15767 }
15768
15769 static void
15770 print_mips_ases (unsigned int mask)
15771 {
15772 if (mask & AFL_ASE_DSP)
15773 fputs ("\n\tDSP ASE", stdout);
15774 if (mask & AFL_ASE_DSPR2)
15775 fputs ("\n\tDSP R2 ASE", stdout);
15776 if (mask & AFL_ASE_DSPR3)
15777 fputs ("\n\tDSP R3 ASE", stdout);
15778 if (mask & AFL_ASE_EVA)
15779 fputs ("\n\tEnhanced VA Scheme", stdout);
15780 if (mask & AFL_ASE_MCU)
15781 fputs ("\n\tMCU (MicroController) ASE", stdout);
15782 if (mask & AFL_ASE_MDMX)
15783 fputs ("\n\tMDMX ASE", stdout);
15784 if (mask & AFL_ASE_MIPS3D)
15785 fputs ("\n\tMIPS-3D ASE", stdout);
15786 if (mask & AFL_ASE_MT)
15787 fputs ("\n\tMT ASE", stdout);
15788 if (mask & AFL_ASE_SMARTMIPS)
15789 fputs ("\n\tSmartMIPS ASE", stdout);
15790 if (mask & AFL_ASE_VIRT)
15791 fputs ("\n\tVZ ASE", stdout);
15792 if (mask & AFL_ASE_MSA)
15793 fputs ("\n\tMSA ASE", stdout);
15794 if (mask & AFL_ASE_MIPS16)
15795 fputs ("\n\tMIPS16 ASE", stdout);
15796 if (mask & AFL_ASE_MICROMIPS)
15797 fputs ("\n\tMICROMIPS ASE", stdout);
15798 if (mask & AFL_ASE_XPA)
15799 fputs ("\n\tXPA ASE", stdout);
15800 if (mask & AFL_ASE_MIPS16E2)
15801 fputs ("\n\tMIPS16e2 ASE", stdout);
15802 if (mask & AFL_ASE_CRC)
15803 fputs ("\n\tCRC ASE", stdout);
15804 if (mask & AFL_ASE_GINV)
15805 fputs ("\n\tGINV ASE", stdout);
15806 if (mask & AFL_ASE_LOONGSON_MMI)
15807 fputs ("\n\tLoongson MMI ASE", stdout);
15808 if (mask & AFL_ASE_LOONGSON_CAM)
15809 fputs ("\n\tLoongson CAM ASE", stdout);
15810 if (mask & AFL_ASE_LOONGSON_EXT)
15811 fputs ("\n\tLoongson EXT ASE", stdout);
15812 if (mask & AFL_ASE_LOONGSON_EXT2)
15813 fputs ("\n\tLoongson EXT2 ASE", stdout);
15814 if (mask == 0)
15815 fprintf (stdout, "\n\t%s", _("None"));
15816 else if ((mask & ~AFL_ASE_MASK) != 0)
15817 fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
15818 }
15819
15820 static void
15821 print_mips_isa_ext (unsigned int isa_ext)
15822 {
15823 switch (isa_ext)
15824 {
15825 case 0:
15826 fputs (_("None"), stdout);
15827 break;
15828 case AFL_EXT_XLR:
15829 fputs ("RMI XLR", stdout);
15830 break;
15831 case AFL_EXT_OCTEON3:
15832 fputs ("Cavium Networks Octeon3", stdout);
15833 break;
15834 case AFL_EXT_OCTEON2:
15835 fputs ("Cavium Networks Octeon2", stdout);
15836 break;
15837 case AFL_EXT_OCTEONP:
15838 fputs ("Cavium Networks OcteonP", stdout);
15839 break;
15840 case AFL_EXT_OCTEON:
15841 fputs ("Cavium Networks Octeon", stdout);
15842 break;
15843 case AFL_EXT_5900:
15844 fputs ("Toshiba R5900", stdout);
15845 break;
15846 case AFL_EXT_4650:
15847 fputs ("MIPS R4650", stdout);
15848 break;
15849 case AFL_EXT_4010:
15850 fputs ("LSI R4010", stdout);
15851 break;
15852 case AFL_EXT_4100:
15853 fputs ("NEC VR4100", stdout);
15854 break;
15855 case AFL_EXT_3900:
15856 fputs ("Toshiba R3900", stdout);
15857 break;
15858 case AFL_EXT_10000:
15859 fputs ("MIPS R10000", stdout);
15860 break;
15861 case AFL_EXT_SB1:
15862 fputs ("Broadcom SB-1", stdout);
15863 break;
15864 case AFL_EXT_4111:
15865 fputs ("NEC VR4111/VR4181", stdout);
15866 break;
15867 case AFL_EXT_4120:
15868 fputs ("NEC VR4120", stdout);
15869 break;
15870 case AFL_EXT_5400:
15871 fputs ("NEC VR5400", stdout);
15872 break;
15873 case AFL_EXT_5500:
15874 fputs ("NEC VR5500", stdout);
15875 break;
15876 case AFL_EXT_LOONGSON_2E:
15877 fputs ("ST Microelectronics Loongson 2E", stdout);
15878 break;
15879 case AFL_EXT_LOONGSON_2F:
15880 fputs ("ST Microelectronics Loongson 2F", stdout);
15881 break;
15882 case AFL_EXT_INTERAPTIV_MR2:
15883 fputs ("Imagination interAptiv MR2", stdout);
15884 break;
15885 default:
15886 fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
15887 }
15888 }
15889
15890 static signed int
15891 get_mips_reg_size (int reg_size)
15892 {
15893 return (reg_size == AFL_REG_NONE) ? 0
15894 : (reg_size == AFL_REG_32) ? 32
15895 : (reg_size == AFL_REG_64) ? 64
15896 : (reg_size == AFL_REG_128) ? 128
15897 : -1;
15898 }
15899
15900 static bfd_boolean
15901 process_mips_specific (Filedata * filedata)
15902 {
15903 Elf_Internal_Dyn * entry;
15904 Elf_Internal_Shdr *sect = NULL;
15905 size_t liblist_offset = 0;
15906 size_t liblistno = 0;
15907 size_t conflictsno = 0;
15908 size_t options_offset = 0;
15909 size_t conflicts_offset = 0;
15910 size_t pltrelsz = 0;
15911 size_t pltrel = 0;
15912 bfd_vma pltgot = 0;
15913 bfd_vma mips_pltgot = 0;
15914 bfd_vma jmprel = 0;
15915 bfd_vma local_gotno = 0;
15916 bfd_vma gotsym = 0;
15917 bfd_vma symtabno = 0;
15918 bfd_boolean res = TRUE;
15919
15920 if (! process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
15921 display_mips_gnu_attribute))
15922 res = FALSE;
15923
15924 sect = find_section (filedata, ".MIPS.abiflags");
15925
15926 if (sect != NULL)
15927 {
15928 Elf_External_ABIFlags_v0 *abiflags_ext;
15929 Elf_Internal_ABIFlags_v0 abiflags_in;
15930
15931 if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
15932 {
15933 error (_("Corrupt MIPS ABI Flags section.\n"));
15934 res = FALSE;
15935 }
15936 else
15937 {
15938 abiflags_ext = get_data (NULL, filedata, sect->sh_offset, 1,
15939 sect->sh_size, _("MIPS ABI Flags section"));
15940 if (abiflags_ext)
15941 {
15942 abiflags_in.version = BYTE_GET (abiflags_ext->version);
15943 abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
15944 abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
15945 abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
15946 abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
15947 abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
15948 abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
15949 abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
15950 abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
15951 abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
15952 abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
15953
15954 printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
15955 printf ("\nISA: MIPS%d", abiflags_in.isa_level);
15956 if (abiflags_in.isa_rev > 1)
15957 printf ("r%d", abiflags_in.isa_rev);
15958 printf ("\nGPR size: %d",
15959 get_mips_reg_size (abiflags_in.gpr_size));
15960 printf ("\nCPR1 size: %d",
15961 get_mips_reg_size (abiflags_in.cpr1_size));
15962 printf ("\nCPR2 size: %d",
15963 get_mips_reg_size (abiflags_in.cpr2_size));
15964 fputs ("\nFP ABI: ", stdout);
15965 print_mips_fp_abi_value (abiflags_in.fp_abi);
15966 fputs ("ISA Extension: ", stdout);
15967 print_mips_isa_ext (abiflags_in.isa_ext);
15968 fputs ("\nASEs:", stdout);
15969 print_mips_ases (abiflags_in.ases);
15970 printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
15971 printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
15972 fputc ('\n', stdout);
15973 free (abiflags_ext);
15974 }
15975 }
15976 }
15977
15978 /* We have a lot of special sections. Thanks SGI! */
15979 if (dynamic_section == NULL)
15980 {
15981 /* No dynamic information available. See if there is static GOT. */
15982 sect = find_section (filedata, ".got");
15983 if (sect != NULL)
15984 {
15985 unsigned char *data_end;
15986 unsigned char *data;
15987 bfd_vma ent, end;
15988 int addr_size;
15989
15990 pltgot = sect->sh_addr;
15991
15992 ent = pltgot;
15993 addr_size = (is_32bit_elf ? 4 : 8);
15994 end = pltgot + sect->sh_size;
15995
15996 data = (unsigned char *) get_data (NULL, filedata, sect->sh_offset,
15997 end - pltgot, 1,
15998 _("Global Offset Table data"));
15999 /* PR 12855: Null data is handled gracefully throughout. */
16000 data_end = data + (end - pltgot);
16001
16002 printf (_("\nStatic GOT:\n"));
16003 printf (_(" Canonical gp value: "));
16004 print_vma (ent + 0x7ff0, LONG_HEX);
16005 printf ("\n\n");
16006
16007 /* In a dynamic binary GOT[0] is reserved for the dynamic
16008 loader to store the lazy resolver pointer, however in
16009 a static binary it may well have been omitted and GOT
16010 reduced to a table of addresses.
16011 PR 21344: Check for the entry being fully available
16012 before fetching it. */
16013 if (data
16014 && data + ent - pltgot + addr_size <= data_end
16015 && byte_get (data + ent - pltgot, addr_size) == 0)
16016 {
16017 printf (_(" Reserved entries:\n"));
16018 printf (_(" %*s %10s %*s\n"),
16019 addr_size * 2, _("Address"), _("Access"),
16020 addr_size * 2, _("Value"));
16021 ent = print_mips_got_entry (data, pltgot, ent, data_end);
16022 printf ("\n");
16023 if (ent == (bfd_vma) -1)
16024 goto sgot_print_fail;
16025
16026 /* Check for the MSB of GOT[1] being set, identifying a
16027 GNU object. This entry will be used by some runtime
16028 loaders, to store the module pointer. Otherwise this
16029 is an ordinary local entry.
16030 PR 21344: Check for the entry being fully available
16031 before fetching it. */
16032 if (data
16033 && data + ent - pltgot + addr_size <= data_end
16034 && (byte_get (data + ent - pltgot, addr_size)
16035 >> (addr_size * 8 - 1)) != 0)
16036 {
16037 ent = print_mips_got_entry (data, pltgot, ent, data_end);
16038 printf ("\n");
16039 if (ent == (bfd_vma) -1)
16040 goto sgot_print_fail;
16041 }
16042 printf ("\n");
16043 }
16044
16045 if (data != NULL && ent < end)
16046 {
16047 printf (_(" Local entries:\n"));
16048 printf (" %*s %10s %*s\n",
16049 addr_size * 2, _("Address"), _("Access"),
16050 addr_size * 2, _("Value"));
16051 while (ent < end)
16052 {
16053 ent = print_mips_got_entry (data, pltgot, ent, data_end);
16054 printf ("\n");
16055 if (ent == (bfd_vma) -1)
16056 goto sgot_print_fail;
16057 }
16058 printf ("\n");
16059 }
16060
16061 sgot_print_fail:
16062 if (data)
16063 free (data);
16064 }
16065 return res;
16066 }
16067
16068 for (entry = dynamic_section;
16069 /* PR 17531 file: 012-50589-0.004. */
16070 entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
16071 ++entry)
16072 switch (entry->d_tag)
16073 {
16074 case DT_MIPS_LIBLIST:
16075 liblist_offset
16076 = offset_from_vma (filedata, entry->d_un.d_val,
16077 liblistno * sizeof (Elf32_External_Lib));
16078 break;
16079 case DT_MIPS_LIBLISTNO:
16080 liblistno = entry->d_un.d_val;
16081 break;
16082 case DT_MIPS_OPTIONS:
16083 options_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
16084 break;
16085 case DT_MIPS_CONFLICT:
16086 conflicts_offset
16087 = offset_from_vma (filedata, entry->d_un.d_val,
16088 conflictsno * sizeof (Elf32_External_Conflict));
16089 break;
16090 case DT_MIPS_CONFLICTNO:
16091 conflictsno = entry->d_un.d_val;
16092 break;
16093 case DT_PLTGOT:
16094 pltgot = entry->d_un.d_ptr;
16095 break;
16096 case DT_MIPS_LOCAL_GOTNO:
16097 local_gotno = entry->d_un.d_val;
16098 break;
16099 case DT_MIPS_GOTSYM:
16100 gotsym = entry->d_un.d_val;
16101 break;
16102 case DT_MIPS_SYMTABNO:
16103 symtabno = entry->d_un.d_val;
16104 break;
16105 case DT_MIPS_PLTGOT:
16106 mips_pltgot = entry->d_un.d_ptr;
16107 break;
16108 case DT_PLTREL:
16109 pltrel = entry->d_un.d_val;
16110 break;
16111 case DT_PLTRELSZ:
16112 pltrelsz = entry->d_un.d_val;
16113 break;
16114 case DT_JMPREL:
16115 jmprel = entry->d_un.d_ptr;
16116 break;
16117 default:
16118 break;
16119 }
16120
16121 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
16122 {
16123 Elf32_External_Lib * elib;
16124 size_t cnt;
16125
16126 elib = (Elf32_External_Lib *) get_data (NULL, filedata, liblist_offset,
16127 liblistno,
16128 sizeof (Elf32_External_Lib),
16129 _("liblist section data"));
16130 if (elib)
16131 {
16132 printf (ngettext ("\nSection '.liblist' contains %lu entry:\n",
16133 "\nSection '.liblist' contains %lu entries:\n",
16134 (unsigned long) liblistno),
16135 (unsigned long) liblistno);
16136 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
16137 stdout);
16138
16139 for (cnt = 0; cnt < liblistno; ++cnt)
16140 {
16141 Elf32_Lib liblist;
16142 time_t atime;
16143 char timebuf[128];
16144 struct tm * tmp;
16145
16146 liblist.l_name = BYTE_GET (elib[cnt].l_name);
16147 atime = BYTE_GET (elib[cnt].l_time_stamp);
16148 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
16149 liblist.l_version = BYTE_GET (elib[cnt].l_version);
16150 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
16151
16152 tmp = gmtime (&atime);
16153 snprintf (timebuf, sizeof (timebuf),
16154 "%04u-%02u-%02uT%02u:%02u:%02u",
16155 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
16156 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
16157
16158 printf ("%3lu: ", (unsigned long) cnt);
16159 if (VALID_DYNAMIC_NAME (liblist.l_name))
16160 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
16161 else
16162 printf (_("<corrupt: %9ld>"), liblist.l_name);
16163 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
16164 liblist.l_version);
16165
16166 if (liblist.l_flags == 0)
16167 puts (_(" NONE"));
16168 else
16169 {
16170 static const struct
16171 {
16172 const char * name;
16173 int bit;
16174 }
16175 l_flags_vals[] =
16176 {
16177 { " EXACT_MATCH", LL_EXACT_MATCH },
16178 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
16179 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
16180 { " EXPORTS", LL_EXPORTS },
16181 { " DELAY_LOAD", LL_DELAY_LOAD },
16182 { " DELTA", LL_DELTA }
16183 };
16184 int flags = liblist.l_flags;
16185 size_t fcnt;
16186
16187 for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
16188 if ((flags & l_flags_vals[fcnt].bit) != 0)
16189 {
16190 fputs (l_flags_vals[fcnt].name, stdout);
16191 flags ^= l_flags_vals[fcnt].bit;
16192 }
16193 if (flags != 0)
16194 printf (" %#x", (unsigned int) flags);
16195
16196 puts ("");
16197 }
16198 }
16199
16200 free (elib);
16201 }
16202 else
16203 res = FALSE;
16204 }
16205
16206 if (options_offset != 0)
16207 {
16208 Elf_External_Options * eopt;
16209 Elf_Internal_Options * iopt;
16210 Elf_Internal_Options * option;
16211 size_t offset;
16212 int cnt;
16213 sect = filedata->section_headers;
16214
16215 /* Find the section header so that we get the size. */
16216 sect = find_section_by_type (filedata, SHT_MIPS_OPTIONS);
16217 /* PR 17533 file: 012-277276-0.004. */
16218 if (sect == NULL)
16219 {
16220 error (_("No MIPS_OPTIONS header found\n"));
16221 return FALSE;
16222 }
16223 /* PR 24243 */
16224 if (sect->sh_size < sizeof (* eopt))
16225 {
16226 error (_("The MIPS options section is too small.\n"));
16227 return FALSE;
16228 }
16229
16230 eopt = (Elf_External_Options *) get_data (NULL, filedata, options_offset, 1,
16231 sect->sh_size, _("options"));
16232 if (eopt)
16233 {
16234 iopt = (Elf_Internal_Options *)
16235 cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
16236 if (iopt == NULL)
16237 {
16238 error (_("Out of memory allocating space for MIPS options\n"));
16239 return FALSE;
16240 }
16241
16242 offset = cnt = 0;
16243 option = iopt;
16244
16245 while (offset <= sect->sh_size - sizeof (* eopt))
16246 {
16247 Elf_External_Options * eoption;
16248
16249 eoption = (Elf_External_Options *) ((char *) eopt + offset);
16250
16251 option->kind = BYTE_GET (eoption->kind);
16252 option->size = BYTE_GET (eoption->size);
16253 option->section = BYTE_GET (eoption->section);
16254 option->info = BYTE_GET (eoption->info);
16255
16256 /* PR 17531: file: ffa0fa3b. */
16257 if (option->size < sizeof (* eopt)
16258 || offset + option->size > sect->sh_size)
16259 {
16260 error (_("Invalid size (%u) for MIPS option\n"), option->size);
16261 return FALSE;
16262 }
16263 offset += option->size;
16264
16265 ++option;
16266 ++cnt;
16267 }
16268
16269 printf (ngettext ("\nSection '%s' contains %d entry:\n",
16270 "\nSection '%s' contains %d entries:\n",
16271 cnt),
16272 printable_section_name (filedata, sect), cnt);
16273
16274 option = iopt;
16275 offset = 0;
16276
16277 while (cnt-- > 0)
16278 {
16279 size_t len;
16280
16281 switch (option->kind)
16282 {
16283 case ODK_NULL:
16284 /* This shouldn't happen. */
16285 printf (" NULL %d %lx", option->section, option->info);
16286 break;
16287 case ODK_REGINFO:
16288 printf (" REGINFO ");
16289 if (filedata->file_header.e_machine == EM_MIPS)
16290 {
16291 /* 32bit form. */
16292 Elf32_External_RegInfo * ereg;
16293 Elf32_RegInfo reginfo;
16294
16295 ereg = (Elf32_External_RegInfo *) (option + 1);
16296 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
16297 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
16298 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
16299 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
16300 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
16301 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
16302
16303 printf ("GPR %08lx GP 0x%lx\n",
16304 reginfo.ri_gprmask,
16305 (unsigned long) reginfo.ri_gp_value);
16306 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
16307 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
16308 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
16309 }
16310 else
16311 {
16312 /* 64 bit form. */
16313 Elf64_External_RegInfo * ereg;
16314 Elf64_Internal_RegInfo reginfo;
16315
16316 ereg = (Elf64_External_RegInfo *) (option + 1);
16317 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
16318 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
16319 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
16320 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
16321 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
16322 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
16323
16324 printf ("GPR %08lx GP 0x",
16325 reginfo.ri_gprmask);
16326 printf_vma (reginfo.ri_gp_value);
16327 printf ("\n");
16328
16329 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
16330 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
16331 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
16332 }
16333 ++option;
16334 continue;
16335 case ODK_EXCEPTIONS:
16336 fputs (" EXCEPTIONS fpe_min(", stdout);
16337 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
16338 fputs (") fpe_max(", stdout);
16339 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
16340 fputs (")", stdout);
16341
16342 if (option->info & OEX_PAGE0)
16343 fputs (" PAGE0", stdout);
16344 if (option->info & OEX_SMM)
16345 fputs (" SMM", stdout);
16346 if (option->info & OEX_FPDBUG)
16347 fputs (" FPDBUG", stdout);
16348 if (option->info & OEX_DISMISS)
16349 fputs (" DISMISS", stdout);
16350 break;
16351 case ODK_PAD:
16352 fputs (" PAD ", stdout);
16353 if (option->info & OPAD_PREFIX)
16354 fputs (" PREFIX", stdout);
16355 if (option->info & OPAD_POSTFIX)
16356 fputs (" POSTFIX", stdout);
16357 if (option->info & OPAD_SYMBOL)
16358 fputs (" SYMBOL", stdout);
16359 break;
16360 case ODK_HWPATCH:
16361 fputs (" HWPATCH ", stdout);
16362 if (option->info & OHW_R4KEOP)
16363 fputs (" R4KEOP", stdout);
16364 if (option->info & OHW_R8KPFETCH)
16365 fputs (" R8KPFETCH", stdout);
16366 if (option->info & OHW_R5KEOP)
16367 fputs (" R5KEOP", stdout);
16368 if (option->info & OHW_R5KCVTL)
16369 fputs (" R5KCVTL", stdout);
16370 break;
16371 case ODK_FILL:
16372 fputs (" FILL ", stdout);
16373 /* XXX Print content of info word? */
16374 break;
16375 case ODK_TAGS:
16376 fputs (" TAGS ", stdout);
16377 /* XXX Print content of info word? */
16378 break;
16379 case ODK_HWAND:
16380 fputs (" HWAND ", stdout);
16381 if (option->info & OHWA0_R4KEOP_CHECKED)
16382 fputs (" R4KEOP_CHECKED", stdout);
16383 if (option->info & OHWA0_R4KEOP_CLEAN)
16384 fputs (" R4KEOP_CLEAN", stdout);
16385 break;
16386 case ODK_HWOR:
16387 fputs (" HWOR ", stdout);
16388 if (option->info & OHWA0_R4KEOP_CHECKED)
16389 fputs (" R4KEOP_CHECKED", stdout);
16390 if (option->info & OHWA0_R4KEOP_CLEAN)
16391 fputs (" R4KEOP_CLEAN", stdout);
16392 break;
16393 case ODK_GP_GROUP:
16394 printf (" GP_GROUP %#06lx self-contained %#06lx",
16395 option->info & OGP_GROUP,
16396 (option->info & OGP_SELF) >> 16);
16397 break;
16398 case ODK_IDENT:
16399 printf (" IDENT %#06lx self-contained %#06lx",
16400 option->info & OGP_GROUP,
16401 (option->info & OGP_SELF) >> 16);
16402 break;
16403 default:
16404 /* This shouldn't happen. */
16405 printf (" %3d ??? %d %lx",
16406 option->kind, option->section, option->info);
16407 break;
16408 }
16409
16410 len = sizeof (* eopt);
16411 while (len < option->size)
16412 {
16413 unsigned char datum = * ((unsigned char *) eopt + offset + len);
16414
16415 if (ISPRINT (datum))
16416 printf ("%c", datum);
16417 else
16418 printf ("\\%03o", datum);
16419 len ++;
16420 }
16421 fputs ("\n", stdout);
16422
16423 offset += option->size;
16424 ++option;
16425 }
16426
16427 free (eopt);
16428 }
16429 else
16430 res = FALSE;
16431 }
16432
16433 if (conflicts_offset != 0 && conflictsno != 0)
16434 {
16435 Elf32_Conflict * iconf;
16436 size_t cnt;
16437
16438 if (dynamic_symbols == NULL)
16439 {
16440 error (_("conflict list found without a dynamic symbol table\n"));
16441 return FALSE;
16442 }
16443
16444 /* PR 21345 - print a slightly more helpful error message
16445 if we are sure that the cmalloc will fail. */
16446 if (conflictsno * sizeof (* iconf) > filedata->file_size)
16447 {
16448 error (_("Overlarge number of conflicts detected: %lx\n"),
16449 (long) conflictsno);
16450 return FALSE;
16451 }
16452
16453 iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
16454 if (iconf == NULL)
16455 {
16456 error (_("Out of memory allocating space for dynamic conflicts\n"));
16457 return FALSE;
16458 }
16459
16460 if (is_32bit_elf)
16461 {
16462 Elf32_External_Conflict * econf32;
16463
16464 econf32 = (Elf32_External_Conflict *)
16465 get_data (NULL, filedata, conflicts_offset, conflictsno,
16466 sizeof (* econf32), _("conflict"));
16467 if (!econf32)
16468 return FALSE;
16469
16470 for (cnt = 0; cnt < conflictsno; ++cnt)
16471 iconf[cnt] = BYTE_GET (econf32[cnt]);
16472
16473 free (econf32);
16474 }
16475 else
16476 {
16477 Elf64_External_Conflict * econf64;
16478
16479 econf64 = (Elf64_External_Conflict *)
16480 get_data (NULL, filedata, conflicts_offset, conflictsno,
16481 sizeof (* econf64), _("conflict"));
16482 if (!econf64)
16483 return FALSE;
16484
16485 for (cnt = 0; cnt < conflictsno; ++cnt)
16486 iconf[cnt] = BYTE_GET (econf64[cnt]);
16487
16488 free (econf64);
16489 }
16490
16491 printf (ngettext ("\nSection '.conflict' contains %lu entry:\n",
16492 "\nSection '.conflict' contains %lu entries:\n",
16493 (unsigned long) conflictsno),
16494 (unsigned long) conflictsno);
16495 puts (_(" Num: Index Value Name"));
16496
16497 for (cnt = 0; cnt < conflictsno; ++cnt)
16498 {
16499 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
16500
16501 if (iconf[cnt] >= num_dynamic_syms)
16502 printf (_("<corrupt symbol index>"));
16503 else
16504 {
16505 Elf_Internal_Sym * psym;
16506
16507 psym = & dynamic_symbols[iconf[cnt]];
16508 print_vma (psym->st_value, FULL_HEX);
16509 putchar (' ');
16510 if (VALID_DYNAMIC_NAME (psym->st_name))
16511 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
16512 else
16513 printf (_("<corrupt: %14ld>"), psym->st_name);
16514 }
16515 putchar ('\n');
16516 }
16517
16518 free (iconf);
16519 }
16520
16521 if (pltgot != 0 && local_gotno != 0)
16522 {
16523 bfd_vma ent, local_end, global_end;
16524 size_t i, offset;
16525 unsigned char * data;
16526 unsigned char * data_end;
16527 int addr_size;
16528
16529 ent = pltgot;
16530 addr_size = (is_32bit_elf ? 4 : 8);
16531 local_end = pltgot + local_gotno * addr_size;
16532
16533 /* PR binutils/17533 file: 012-111227-0.004 */
16534 if (symtabno < gotsym)
16535 {
16536 error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
16537 (unsigned long) gotsym, (unsigned long) symtabno);
16538 return FALSE;
16539 }
16540
16541 global_end = local_end + (symtabno - gotsym) * addr_size;
16542 /* PR 17531: file: 54c91a34. */
16543 if (global_end < local_end)
16544 {
16545 error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
16546 return FALSE;
16547 }
16548
16549 offset = offset_from_vma (filedata, pltgot, global_end - pltgot);
16550 data = (unsigned char *) get_data (NULL, filedata, offset,
16551 global_end - pltgot, 1,
16552 _("Global Offset Table data"));
16553 /* PR 12855: Null data is handled gracefully throughout. */
16554 data_end = data + (global_end - pltgot);
16555
16556 printf (_("\nPrimary GOT:\n"));
16557 printf (_(" Canonical gp value: "));
16558 print_vma (pltgot + 0x7ff0, LONG_HEX);
16559 printf ("\n\n");
16560
16561 printf (_(" Reserved entries:\n"));
16562 printf (_(" %*s %10s %*s Purpose\n"),
16563 addr_size * 2, _("Address"), _("Access"),
16564 addr_size * 2, _("Initial"));
16565 ent = print_mips_got_entry (data, pltgot, ent, data_end);
16566 printf (_(" Lazy resolver\n"));
16567 if (ent == (bfd_vma) -1)
16568 goto got_print_fail;
16569
16570 /* Check for the MSB of GOT[1] being set, denoting a GNU object.
16571 This entry will be used by some runtime loaders, to store the
16572 module pointer. Otherwise this is an ordinary local entry.
16573 PR 21344: Check for the entry being fully available before
16574 fetching it. */
16575 if (data
16576 && data + ent - pltgot + addr_size <= data_end
16577 && (byte_get (data + ent - pltgot, addr_size)
16578 >> (addr_size * 8 - 1)) != 0)
16579 {
16580 ent = print_mips_got_entry (data, pltgot, ent, data_end);
16581 printf (_(" Module pointer (GNU extension)\n"));
16582 if (ent == (bfd_vma) -1)
16583 goto got_print_fail;
16584 }
16585 printf ("\n");
16586
16587 if (data != NULL && ent < local_end)
16588 {
16589 printf (_(" Local entries:\n"));
16590 printf (" %*s %10s %*s\n",
16591 addr_size * 2, _("Address"), _("Access"),
16592 addr_size * 2, _("Initial"));
16593 while (ent < local_end)
16594 {
16595 ent = print_mips_got_entry (data, pltgot, ent, data_end);
16596 printf ("\n");
16597 if (ent == (bfd_vma) -1)
16598 goto got_print_fail;
16599 }
16600 printf ("\n");
16601 }
16602
16603 if (data != NULL && gotsym < symtabno)
16604 {
16605 int sym_width;
16606
16607 printf (_(" Global entries:\n"));
16608 printf (" %*s %10s %*s %*s %-7s %3s %s\n",
16609 addr_size * 2, _("Address"),
16610 _("Access"),
16611 addr_size * 2, _("Initial"),
16612 addr_size * 2, _("Sym.Val."),
16613 _("Type"),
16614 /* Note for translators: "Ndx" = abbreviated form of "Index". */
16615 _("Ndx"), _("Name"));
16616
16617 sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
16618
16619 for (i = gotsym; i < symtabno; i++)
16620 {
16621 ent = print_mips_got_entry (data, pltgot, ent, data_end);
16622 printf (" ");
16623
16624 if (dynamic_symbols == NULL)
16625 printf (_("<no dynamic symbols>"));
16626 else if (i < num_dynamic_syms)
16627 {
16628 Elf_Internal_Sym * psym = dynamic_symbols + i;
16629
16630 print_vma (psym->st_value, LONG_HEX);
16631 printf (" %-7s %3s ",
16632 get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
16633 get_symbol_index_type (filedata, psym->st_shndx));
16634
16635 if (VALID_DYNAMIC_NAME (psym->st_name))
16636 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
16637 else
16638 printf (_("<corrupt: %14ld>"), psym->st_name);
16639 }
16640 else
16641 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
16642 (unsigned long) i);
16643
16644 printf ("\n");
16645 if (ent == (bfd_vma) -1)
16646 break;
16647 }
16648 printf ("\n");
16649 }
16650
16651 got_print_fail:
16652 if (data)
16653 free (data);
16654 }
16655
16656 if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
16657 {
16658 bfd_vma ent, end;
16659 size_t offset, rel_offset;
16660 unsigned long count, i;
16661 unsigned char * data;
16662 int addr_size, sym_width;
16663 Elf_Internal_Rela * rels;
16664
16665 rel_offset = offset_from_vma (filedata, jmprel, pltrelsz);
16666 if (pltrel == DT_RELA)
16667 {
16668 if (!slurp_rela_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
16669 return FALSE;
16670 }
16671 else
16672 {
16673 if (!slurp_rel_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
16674 return FALSE;
16675 }
16676
16677 ent = mips_pltgot;
16678 addr_size = (is_32bit_elf ? 4 : 8);
16679 end = mips_pltgot + (2 + count) * addr_size;
16680
16681 offset = offset_from_vma (filedata, mips_pltgot, end - mips_pltgot);
16682 data = (unsigned char *) get_data (NULL, filedata, offset, end - mips_pltgot,
16683 1, _("Procedure Linkage Table data"));
16684 if (data == NULL)
16685 return FALSE;
16686
16687 printf ("\nPLT GOT:\n\n");
16688 printf (_(" Reserved entries:\n"));
16689 printf (_(" %*s %*s Purpose\n"),
16690 addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
16691 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16692 printf (_(" PLT lazy resolver\n"));
16693 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16694 printf (_(" Module pointer\n"));
16695 printf ("\n");
16696
16697 printf (_(" Entries:\n"));
16698 printf (" %*s %*s %*s %-7s %3s %s\n",
16699 addr_size * 2, _("Address"),
16700 addr_size * 2, _("Initial"),
16701 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
16702 sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
16703 for (i = 0; i < count; i++)
16704 {
16705 unsigned long idx = get_reloc_symindex (rels[i].r_info);
16706
16707 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16708 printf (" ");
16709
16710 if (idx >= num_dynamic_syms)
16711 printf (_("<corrupt symbol index: %lu>"), idx);
16712 else
16713 {
16714 Elf_Internal_Sym * psym = dynamic_symbols + idx;
16715
16716 print_vma (psym->st_value, LONG_HEX);
16717 printf (" %-7s %3s ",
16718 get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
16719 get_symbol_index_type (filedata, psym->st_shndx));
16720 if (VALID_DYNAMIC_NAME (psym->st_name))
16721 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
16722 else
16723 printf (_("<corrupt: %14ld>"), psym->st_name);
16724 }
16725 printf ("\n");
16726 }
16727 printf ("\n");
16728
16729 if (data)
16730 free (data);
16731 free (rels);
16732 }
16733
16734 return res;
16735 }
16736
16737 static bfd_boolean
16738 process_nds32_specific (Filedata * filedata)
16739 {
16740 Elf_Internal_Shdr *sect = NULL;
16741
16742 sect = find_section (filedata, ".nds32_e_flags");
16743 if (sect != NULL)
16744 {
16745 unsigned int *flag;
16746
16747 printf ("\nNDS32 elf flags section:\n");
16748 flag = get_data (NULL, filedata, sect->sh_offset, 1,
16749 sect->sh_size, _("NDS32 elf flags section"));
16750
16751 if (! flag)
16752 return FALSE;
16753
16754 switch ((*flag) & 0x3)
16755 {
16756 case 0:
16757 printf ("(VEC_SIZE):\tNo entry.\n");
16758 break;
16759 case 1:
16760 printf ("(VEC_SIZE):\t4 bytes\n");
16761 break;
16762 case 2:
16763 printf ("(VEC_SIZE):\t16 bytes\n");
16764 break;
16765 case 3:
16766 printf ("(VEC_SIZE):\treserved\n");
16767 break;
16768 }
16769 }
16770
16771 return TRUE;
16772 }
16773
16774 static bfd_boolean
16775 process_gnu_liblist (Filedata * filedata)
16776 {
16777 Elf_Internal_Shdr * section;
16778 Elf_Internal_Shdr * string_sec;
16779 Elf32_External_Lib * elib;
16780 char * strtab;
16781 size_t strtab_size;
16782 size_t cnt;
16783 unsigned long num_liblist;
16784 unsigned i;
16785 bfd_boolean res = TRUE;
16786
16787 if (! do_arch)
16788 return TRUE;
16789
16790 for (i = 0, section = filedata->section_headers;
16791 i < filedata->file_header.e_shnum;
16792 i++, section++)
16793 {
16794 switch (section->sh_type)
16795 {
16796 case SHT_GNU_LIBLIST:
16797 if (section->sh_link >= filedata->file_header.e_shnum)
16798 break;
16799
16800 elib = (Elf32_External_Lib *)
16801 get_data (NULL, filedata, section->sh_offset, 1, section->sh_size,
16802 _("liblist section data"));
16803
16804 if (elib == NULL)
16805 {
16806 res = FALSE;
16807 break;
16808 }
16809
16810 string_sec = filedata->section_headers + section->sh_link;
16811 strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
16812 string_sec->sh_size,
16813 _("liblist string table"));
16814 if (strtab == NULL
16815 || section->sh_entsize != sizeof (Elf32_External_Lib))
16816 {
16817 free (elib);
16818 free (strtab);
16819 res = FALSE;
16820 break;
16821 }
16822 strtab_size = string_sec->sh_size;
16823
16824 num_liblist = section->sh_size / sizeof (Elf32_External_Lib);
16825 printf (ngettext ("\nLibrary list section '%s' contains %lu entries:\n",
16826 "\nLibrary list section '%s' contains %lu entries:\n",
16827 num_liblist),
16828 printable_section_name (filedata, section),
16829 num_liblist);
16830
16831 puts (_(" Library Time Stamp Checksum Version Flags"));
16832
16833 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
16834 ++cnt)
16835 {
16836 Elf32_Lib liblist;
16837 time_t atime;
16838 char timebuf[128];
16839 struct tm * tmp;
16840
16841 liblist.l_name = BYTE_GET (elib[cnt].l_name);
16842 atime = BYTE_GET (elib[cnt].l_time_stamp);
16843 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
16844 liblist.l_version = BYTE_GET (elib[cnt].l_version);
16845 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
16846
16847 tmp = gmtime (&atime);
16848 snprintf (timebuf, sizeof (timebuf),
16849 "%04u-%02u-%02uT%02u:%02u:%02u",
16850 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
16851 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
16852
16853 printf ("%3lu: ", (unsigned long) cnt);
16854 if (do_wide)
16855 printf ("%-20s", liblist.l_name < strtab_size
16856 ? strtab + liblist.l_name : _("<corrupt>"));
16857 else
16858 printf ("%-20.20s", liblist.l_name < strtab_size
16859 ? strtab + liblist.l_name : _("<corrupt>"));
16860 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
16861 liblist.l_version, liblist.l_flags);
16862 }
16863
16864 free (elib);
16865 free (strtab);
16866 }
16867 }
16868
16869 return res;
16870 }
16871
16872 static const char *
16873 get_note_type (Filedata * filedata, unsigned e_type)
16874 {
16875 static char buff[64];
16876
16877 if (filedata->file_header.e_type == ET_CORE)
16878 switch (e_type)
16879 {
16880 case NT_AUXV:
16881 return _("NT_AUXV (auxiliary vector)");
16882 case NT_PRSTATUS:
16883 return _("NT_PRSTATUS (prstatus structure)");
16884 case NT_FPREGSET:
16885 return _("NT_FPREGSET (floating point registers)");
16886 case NT_PRPSINFO:
16887 return _("NT_PRPSINFO (prpsinfo structure)");
16888 case NT_TASKSTRUCT:
16889 return _("NT_TASKSTRUCT (task structure)");
16890 case NT_PRXFPREG:
16891 return _("NT_PRXFPREG (user_xfpregs structure)");
16892 case NT_PPC_VMX:
16893 return _("NT_PPC_VMX (ppc Altivec registers)");
16894 case NT_PPC_VSX:
16895 return _("NT_PPC_VSX (ppc VSX registers)");
16896 case NT_PPC_TAR:
16897 return _("NT_PPC_TAR (ppc TAR register)");
16898 case NT_PPC_PPR:
16899 return _("NT_PPC_PPR (ppc PPR register)");
16900 case NT_PPC_DSCR:
16901 return _("NT_PPC_DSCR (ppc DSCR register)");
16902 case NT_PPC_EBB:
16903 return _("NT_PPC_EBB (ppc EBB registers)");
16904 case NT_PPC_PMU:
16905 return _("NT_PPC_PMU (ppc PMU registers)");
16906 case NT_PPC_TM_CGPR:
16907 return _("NT_PPC_TM_CGPR (ppc checkpointed GPR registers)");
16908 case NT_PPC_TM_CFPR:
16909 return _("NT_PPC_TM_CFPR (ppc checkpointed floating point registers)");
16910 case NT_PPC_TM_CVMX:
16911 return _("NT_PPC_TM_CVMX (ppc checkpointed Altivec registers)");
16912 case NT_PPC_TM_CVSX:
16913 return _("NT_PPC_TM_CVSX (ppc checkpointed VSX registers)");
16914 case NT_PPC_TM_SPR:
16915 return _("NT_PPC_TM_SPR (ppc TM special purpose registers)");
16916 case NT_PPC_TM_CTAR:
16917 return _("NT_PPC_TM_CTAR (ppc checkpointed TAR register)");
16918 case NT_PPC_TM_CPPR:
16919 return _("NT_PPC_TM_CPPR (ppc checkpointed PPR register)");
16920 case NT_PPC_TM_CDSCR:
16921 return _("NT_PPC_TM_CDSCR (ppc checkpointed DSCR register)");
16922 case NT_386_TLS:
16923 return _("NT_386_TLS (x86 TLS information)");
16924 case NT_386_IOPERM:
16925 return _("NT_386_IOPERM (x86 I/O permissions)");
16926 case NT_X86_XSTATE:
16927 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
16928 case NT_S390_HIGH_GPRS:
16929 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
16930 case NT_S390_TIMER:
16931 return _("NT_S390_TIMER (s390 timer register)");
16932 case NT_S390_TODCMP:
16933 return _("NT_S390_TODCMP (s390 TOD comparator register)");
16934 case NT_S390_TODPREG:
16935 return _("NT_S390_TODPREG (s390 TOD programmable register)");
16936 case NT_S390_CTRS:
16937 return _("NT_S390_CTRS (s390 control registers)");
16938 case NT_S390_PREFIX:
16939 return _("NT_S390_PREFIX (s390 prefix register)");
16940 case NT_S390_LAST_BREAK:
16941 return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
16942 case NT_S390_SYSTEM_CALL:
16943 return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
16944 case NT_S390_TDB:
16945 return _("NT_S390_TDB (s390 transaction diagnostic block)");
16946 case NT_S390_VXRS_LOW:
16947 return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
16948 case NT_S390_VXRS_HIGH:
16949 return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
16950 case NT_S390_GS_CB:
16951 return _("NT_S390_GS_CB (s390 guarded-storage registers)");
16952 case NT_S390_GS_BC:
16953 return _("NT_S390_GS_BC (s390 guarded-storage broadcast control)");
16954 case NT_ARM_VFP:
16955 return _("NT_ARM_VFP (arm VFP registers)");
16956 case NT_ARM_TLS:
16957 return _("NT_ARM_TLS (AArch TLS registers)");
16958 case NT_ARM_HW_BREAK:
16959 return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
16960 case NT_ARM_HW_WATCH:
16961 return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
16962 case NT_PSTATUS:
16963 return _("NT_PSTATUS (pstatus structure)");
16964 case NT_FPREGS:
16965 return _("NT_FPREGS (floating point registers)");
16966 case NT_PSINFO:
16967 return _("NT_PSINFO (psinfo structure)");
16968 case NT_LWPSTATUS:
16969 return _("NT_LWPSTATUS (lwpstatus_t structure)");
16970 case NT_LWPSINFO:
16971 return _("NT_LWPSINFO (lwpsinfo_t structure)");
16972 case NT_WIN32PSTATUS:
16973 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
16974 case NT_SIGINFO:
16975 return _("NT_SIGINFO (siginfo_t data)");
16976 case NT_FILE:
16977 return _("NT_FILE (mapped files)");
16978 default:
16979 break;
16980 }
16981 else
16982 switch (e_type)
16983 {
16984 case NT_VERSION:
16985 return _("NT_VERSION (version)");
16986 case NT_ARCH:
16987 return _("NT_ARCH (architecture)");
16988 case NT_GNU_BUILD_ATTRIBUTE_OPEN:
16989 return _("OPEN");
16990 case NT_GNU_BUILD_ATTRIBUTE_FUNC:
16991 return _("func");
16992 default:
16993 break;
16994 }
16995
16996 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
16997 return buff;
16998 }
16999
17000 static bfd_boolean
17001 print_core_note (Elf_Internal_Note *pnote)
17002 {
17003 unsigned int addr_size = is_32bit_elf ? 4 : 8;
17004 bfd_vma count, page_size;
17005 unsigned char *descdata, *filenames, *descend;
17006
17007 if (pnote->type != NT_FILE)
17008 {
17009 if (do_wide)
17010 printf ("\n");
17011 return TRUE;
17012 }
17013
17014 #ifndef BFD64
17015 if (!is_32bit_elf)
17016 {
17017 printf (_(" Cannot decode 64-bit note in 32-bit build\n"));
17018 /* Still "successful". */
17019 return TRUE;
17020 }
17021 #endif
17022
17023 if (pnote->descsz < 2 * addr_size)
17024 {
17025 error (_(" Malformed note - too short for header\n"));
17026 return FALSE;
17027 }
17028
17029 descdata = (unsigned char *) pnote->descdata;
17030 descend = descdata + pnote->descsz;
17031
17032 if (descdata[pnote->descsz - 1] != '\0')
17033 {
17034 error (_(" Malformed note - does not end with \\0\n"));
17035 return FALSE;
17036 }
17037
17038 count = byte_get (descdata, addr_size);
17039 descdata += addr_size;
17040
17041 page_size = byte_get (descdata, addr_size);
17042 descdata += addr_size;
17043
17044 if (count > ((bfd_vma) -1 - 2 * addr_size) / (3 * addr_size)
17045 || pnote->descsz < 2 * addr_size + count * 3 * addr_size)
17046 {
17047 error (_(" Malformed note - too short for supplied file count\n"));
17048 return FALSE;
17049 }
17050
17051 printf (_(" Page size: "));
17052 print_vma (page_size, DEC);
17053 printf ("\n");
17054
17055 printf (_(" %*s%*s%*s\n"),
17056 (int) (2 + 2 * addr_size), _("Start"),
17057 (int) (4 + 2 * addr_size), _("End"),
17058 (int) (4 + 2 * addr_size), _("Page Offset"));
17059 filenames = descdata + count * 3 * addr_size;
17060 while (count-- > 0)
17061 {
17062 bfd_vma start, end, file_ofs;
17063
17064 if (filenames == descend)
17065 {
17066 error (_(" Malformed note - filenames end too early\n"));
17067 return FALSE;
17068 }
17069
17070 start = byte_get (descdata, addr_size);
17071 descdata += addr_size;
17072 end = byte_get (descdata, addr_size);
17073 descdata += addr_size;
17074 file_ofs = byte_get (descdata, addr_size);
17075 descdata += addr_size;
17076
17077 printf (" ");
17078 print_vma (start, FULL_HEX);
17079 printf (" ");
17080 print_vma (end, FULL_HEX);
17081 printf (" ");
17082 print_vma (file_ofs, FULL_HEX);
17083 printf ("\n %s\n", filenames);
17084
17085 filenames += 1 + strlen ((char *) filenames);
17086 }
17087
17088 return TRUE;
17089 }
17090
17091 static const char *
17092 get_gnu_elf_note_type (unsigned e_type)
17093 {
17094 /* NB/ Keep this switch statement in sync with print_gnu_note (). */
17095 switch (e_type)
17096 {
17097 case NT_GNU_ABI_TAG:
17098 return _("NT_GNU_ABI_TAG (ABI version tag)");
17099 case NT_GNU_HWCAP:
17100 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
17101 case NT_GNU_BUILD_ID:
17102 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
17103 case NT_GNU_GOLD_VERSION:
17104 return _("NT_GNU_GOLD_VERSION (gold version)");
17105 case NT_GNU_PROPERTY_TYPE_0:
17106 return _("NT_GNU_PROPERTY_TYPE_0");
17107 case NT_GNU_BUILD_ATTRIBUTE_OPEN:
17108 return _("NT_GNU_BUILD_ATTRIBUTE_OPEN");
17109 case NT_GNU_BUILD_ATTRIBUTE_FUNC:
17110 return _("NT_GNU_BUILD_ATTRIBUTE_FUNC");
17111 default:
17112 {
17113 static char buff[64];
17114
17115 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17116 return buff;
17117 }
17118 }
17119 }
17120
17121 static void
17122 decode_x86_compat_isa (unsigned int bitmask)
17123 {
17124 while (bitmask)
17125 {
17126 unsigned int bit = bitmask & (- bitmask);
17127
17128 bitmask &= ~ bit;
17129 switch (bit)
17130 {
17131 case GNU_PROPERTY_X86_COMPAT_ISA_1_486:
17132 printf ("i486");
17133 break;
17134 case GNU_PROPERTY_X86_COMPAT_ISA_1_586:
17135 printf ("586");
17136 break;
17137 case GNU_PROPERTY_X86_COMPAT_ISA_1_686:
17138 printf ("686");
17139 break;
17140 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE:
17141 printf ("SSE");
17142 break;
17143 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE2:
17144 printf ("SSE2");
17145 break;
17146 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE3:
17147 printf ("SSE3");
17148 break;
17149 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSSE3:
17150 printf ("SSSE3");
17151 break;
17152 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_1:
17153 printf ("SSE4_1");
17154 break;
17155 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_2:
17156 printf ("SSE4_2");
17157 break;
17158 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX:
17159 printf ("AVX");
17160 break;
17161 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX2:
17162 printf ("AVX2");
17163 break;
17164 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512F:
17165 printf ("AVX512F");
17166 break;
17167 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512CD:
17168 printf ("AVX512CD");
17169 break;
17170 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512ER:
17171 printf ("AVX512ER");
17172 break;
17173 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512PF:
17174 printf ("AVX512PF");
17175 break;
17176 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512VL:
17177 printf ("AVX512VL");
17178 break;
17179 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512DQ:
17180 printf ("AVX512DQ");
17181 break;
17182 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512BW:
17183 printf ("AVX512BW");
17184 break;
17185 default:
17186 printf (_("<unknown: %x>"), bit);
17187 break;
17188 }
17189 if (bitmask)
17190 printf (", ");
17191 }
17192 }
17193
17194 static void
17195 decode_x86_isa (unsigned int bitmask)
17196 {
17197 if (!bitmask)
17198 {
17199 printf (_("<None>"));
17200 return;
17201 }
17202
17203 while (bitmask)
17204 {
17205 unsigned int bit = bitmask & (- bitmask);
17206
17207 bitmask &= ~ bit;
17208 switch (bit)
17209 {
17210 case GNU_PROPERTY_X86_ISA_1_CMOV:
17211 printf ("CMOV");
17212 break;
17213 case GNU_PROPERTY_X86_ISA_1_SSE:
17214 printf ("SSE");
17215 break;
17216 case GNU_PROPERTY_X86_ISA_1_SSE2:
17217 printf ("SSE2");
17218 break;
17219 case GNU_PROPERTY_X86_ISA_1_SSE3:
17220 printf ("SSE3");
17221 break;
17222 case GNU_PROPERTY_X86_ISA_1_SSSE3:
17223 printf ("SSSE3");
17224 break;
17225 case GNU_PROPERTY_X86_ISA_1_SSE4_1:
17226 printf ("SSE4_1");
17227 break;
17228 case GNU_PROPERTY_X86_ISA_1_SSE4_2:
17229 printf ("SSE4_2");
17230 break;
17231 case GNU_PROPERTY_X86_ISA_1_AVX:
17232 printf ("AVX");
17233 break;
17234 case GNU_PROPERTY_X86_ISA_1_AVX2:
17235 printf ("AVX2");
17236 break;
17237 case GNU_PROPERTY_X86_ISA_1_FMA:
17238 printf ("FMA");
17239 break;
17240 case GNU_PROPERTY_X86_ISA_1_AVX512F:
17241 printf ("AVX512F");
17242 break;
17243 case GNU_PROPERTY_X86_ISA_1_AVX512CD:
17244 printf ("AVX512CD");
17245 break;
17246 case GNU_PROPERTY_X86_ISA_1_AVX512ER:
17247 printf ("AVX512ER");
17248 break;
17249 case GNU_PROPERTY_X86_ISA_1_AVX512PF:
17250 printf ("AVX512PF");
17251 break;
17252 case GNU_PROPERTY_X86_ISA_1_AVX512VL:
17253 printf ("AVX512VL");
17254 break;
17255 case GNU_PROPERTY_X86_ISA_1_AVX512DQ:
17256 printf ("AVX512DQ");
17257 break;
17258 case GNU_PROPERTY_X86_ISA_1_AVX512BW:
17259 printf ("AVX512BW");
17260 break;
17261 case GNU_PROPERTY_X86_ISA_1_AVX512_4FMAPS:
17262 printf ("AVX512_4FMAPS");
17263 break;
17264 case GNU_PROPERTY_X86_ISA_1_AVX512_4VNNIW:
17265 printf ("AVX512_4VNNIW");
17266 break;
17267 case GNU_PROPERTY_X86_ISA_1_AVX512_BITALG:
17268 printf ("AVX512_BITALG");
17269 break;
17270 case GNU_PROPERTY_X86_ISA_1_AVX512_IFMA:
17271 printf ("AVX512_IFMA");
17272 break;
17273 case GNU_PROPERTY_X86_ISA_1_AVX512_VBMI:
17274 printf ("AVX512_VBMI");
17275 break;
17276 case GNU_PROPERTY_X86_ISA_1_AVX512_VBMI2:
17277 printf ("AVX512_VBMI2");
17278 break;
17279 case GNU_PROPERTY_X86_ISA_1_AVX512_VNNI:
17280 printf ("AVX512_VNNI");
17281 break;
17282 case GNU_PROPERTY_X86_ISA_1_AVX512_BF16:
17283 printf ("AVX512_BF16");
17284 break;
17285 default:
17286 printf (_("<unknown: %x>"), bit);
17287 break;
17288 }
17289 if (bitmask)
17290 printf (", ");
17291 }
17292 }
17293
17294 static void
17295 decode_x86_feature_1 (unsigned int bitmask)
17296 {
17297 if (!bitmask)
17298 {
17299 printf (_("<None>"));
17300 return;
17301 }
17302
17303 while (bitmask)
17304 {
17305 unsigned int bit = bitmask & (- bitmask);
17306
17307 bitmask &= ~ bit;
17308 switch (bit)
17309 {
17310 case GNU_PROPERTY_X86_FEATURE_1_IBT:
17311 printf ("IBT");
17312 break;
17313 case GNU_PROPERTY_X86_FEATURE_1_SHSTK:
17314 printf ("SHSTK");
17315 break;
17316 default:
17317 printf (_("<unknown: %x>"), bit);
17318 break;
17319 }
17320 if (bitmask)
17321 printf (", ");
17322 }
17323 }
17324
17325 static void
17326 decode_x86_feature_2 (unsigned int bitmask)
17327 {
17328 if (!bitmask)
17329 {
17330 printf (_("<None>"));
17331 return;
17332 }
17333
17334 while (bitmask)
17335 {
17336 unsigned int bit = bitmask & (- bitmask);
17337
17338 bitmask &= ~ bit;
17339 switch (bit)
17340 {
17341 case GNU_PROPERTY_X86_FEATURE_2_X86:
17342 printf ("x86");
17343 break;
17344 case GNU_PROPERTY_X86_FEATURE_2_X87:
17345 printf ("x87");
17346 break;
17347 case GNU_PROPERTY_X86_FEATURE_2_MMX:
17348 printf ("MMX");
17349 break;
17350 case GNU_PROPERTY_X86_FEATURE_2_XMM:
17351 printf ("XMM");
17352 break;
17353 case GNU_PROPERTY_X86_FEATURE_2_YMM:
17354 printf ("YMM");
17355 break;
17356 case GNU_PROPERTY_X86_FEATURE_2_ZMM:
17357 printf ("ZMM");
17358 break;
17359 case GNU_PROPERTY_X86_FEATURE_2_FXSR:
17360 printf ("FXSR");
17361 break;
17362 case GNU_PROPERTY_X86_FEATURE_2_XSAVE:
17363 printf ("XSAVE");
17364 break;
17365 case GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT:
17366 printf ("XSAVEOPT");
17367 break;
17368 case GNU_PROPERTY_X86_FEATURE_2_XSAVEC:
17369 printf ("XSAVEC");
17370 break;
17371 default:
17372 printf (_("<unknown: %x>"), bit);
17373 break;
17374 }
17375 if (bitmask)
17376 printf (", ");
17377 }
17378 }
17379
17380 static void
17381 decode_aarch64_feature_1_and (unsigned int bitmask)
17382 {
17383 while (bitmask)
17384 {
17385 unsigned int bit = bitmask & (- bitmask);
17386
17387 bitmask &= ~ bit;
17388 switch (bit)
17389 {
17390 case GNU_PROPERTY_AARCH64_FEATURE_1_BTI:
17391 printf ("BTI");
17392 break;
17393
17394 case GNU_PROPERTY_AARCH64_FEATURE_1_PAC:
17395 printf ("PAC");
17396 break;
17397
17398 default:
17399 printf (_("<unknown: %x>"), bit);
17400 break;
17401 }
17402 if (bitmask)
17403 printf (", ");
17404 }
17405 }
17406
17407 static void
17408 print_gnu_property_note (Filedata * filedata, Elf_Internal_Note * pnote)
17409 {
17410 unsigned char * ptr = (unsigned char *) pnote->descdata;
17411 unsigned char * ptr_end = ptr + pnote->descsz;
17412 unsigned int size = is_32bit_elf ? 4 : 8;
17413
17414 printf (_(" Properties: "));
17415
17416 if (pnote->descsz < 8 || (pnote->descsz % size) != 0)
17417 {
17418 printf (_("<corrupt GNU_PROPERTY_TYPE, size = %#lx>\n"), pnote->descsz);
17419 return;
17420 }
17421
17422 while (ptr < ptr_end)
17423 {
17424 unsigned int j;
17425 unsigned int type;
17426 unsigned int datasz;
17427
17428 if ((size_t) (ptr_end - ptr) < 8)
17429 {
17430 printf (_("<corrupt descsz: %#lx>\n"), pnote->descsz);
17431 break;
17432 }
17433
17434 type = byte_get (ptr, 4);
17435 datasz = byte_get (ptr + 4, 4);
17436
17437 ptr += 8;
17438
17439 if (datasz > (size_t) (ptr_end - ptr))
17440 {
17441 printf (_("<corrupt type (%#x) datasz: %#x>\n"),
17442 type, datasz);
17443 break;
17444 }
17445
17446 if (type >= GNU_PROPERTY_LOPROC && type <= GNU_PROPERTY_HIPROC)
17447 {
17448 if (filedata->file_header.e_machine == EM_X86_64
17449 || filedata->file_header.e_machine == EM_IAMCU
17450 || filedata->file_header.e_machine == EM_386)
17451 {
17452 unsigned int bitmask;
17453
17454 if (datasz == 4)
17455 bitmask = byte_get (ptr, 4);
17456 else
17457 bitmask = 0;
17458
17459 switch (type)
17460 {
17461 case GNU_PROPERTY_X86_ISA_1_USED:
17462 if (datasz != 4)
17463 printf (_("x86 ISA used: <corrupt length: %#x> "),
17464 datasz);
17465 else
17466 {
17467 printf ("x86 ISA used: ");
17468 decode_x86_isa (bitmask);
17469 }
17470 goto next;
17471
17472 case GNU_PROPERTY_X86_ISA_1_NEEDED:
17473 if (datasz != 4)
17474 printf (_("x86 ISA needed: <corrupt length: %#x> "),
17475 datasz);
17476 else
17477 {
17478 printf ("x86 ISA needed: ");
17479 decode_x86_isa (bitmask);
17480 }
17481 goto next;
17482
17483 case GNU_PROPERTY_X86_FEATURE_1_AND:
17484 if (datasz != 4)
17485 printf (_("x86 feature: <corrupt length: %#x> "),
17486 datasz);
17487 else
17488 {
17489 printf ("x86 feature: ");
17490 decode_x86_feature_1 (bitmask);
17491 }
17492 goto next;
17493
17494 case GNU_PROPERTY_X86_FEATURE_2_USED:
17495 if (datasz != 4)
17496 printf (_("x86 feature used: <corrupt length: %#x> "),
17497 datasz);
17498 else
17499 {
17500 printf ("x86 feature used: ");
17501 decode_x86_feature_2 (bitmask);
17502 }
17503 goto next;
17504
17505 case GNU_PROPERTY_X86_FEATURE_2_NEEDED:
17506 if (datasz != 4)
17507 printf (_("x86 feature needed: <corrupt length: %#x> "), datasz);
17508 else
17509 {
17510 printf ("x86 feature needed: ");
17511 decode_x86_feature_2 (bitmask);
17512 }
17513 goto next;
17514
17515 case GNU_PROPERTY_X86_COMPAT_ISA_1_USED:
17516 if (datasz != 4)
17517 printf (_("x86 ISA used: <corrupt length: %#x> "),
17518 datasz);
17519 else
17520 {
17521 printf ("x86 ISA used: ");
17522 decode_x86_compat_isa (bitmask);
17523 }
17524 goto next;
17525
17526 case GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED:
17527 if (datasz != 4)
17528 printf (_("x86 ISA needed: <corrupt length: %#x> "),
17529 datasz);
17530 else
17531 {
17532 printf ("x86 ISA needed: ");
17533 decode_x86_compat_isa (bitmask);
17534 }
17535 goto next;
17536
17537 default:
17538 break;
17539 }
17540 }
17541 else if (filedata->file_header.e_machine == EM_AARCH64)
17542 {
17543 if (type == GNU_PROPERTY_AARCH64_FEATURE_1_AND)
17544 {
17545 printf ("AArch64 feature: ");
17546 if (datasz != 4)
17547 printf (_("<corrupt length: %#x> "), datasz);
17548 else
17549 decode_aarch64_feature_1_and (byte_get (ptr, 4));
17550 goto next;
17551 }
17552 }
17553 }
17554 else
17555 {
17556 switch (type)
17557 {
17558 case GNU_PROPERTY_STACK_SIZE:
17559 printf (_("stack size: "));
17560 if (datasz != size)
17561 printf (_("<corrupt length: %#x> "), datasz);
17562 else
17563 printf ("%#lx", (unsigned long) byte_get (ptr, size));
17564 goto next;
17565
17566 case GNU_PROPERTY_NO_COPY_ON_PROTECTED:
17567 printf ("no copy on protected ");
17568 if (datasz)
17569 printf (_("<corrupt length: %#x> "), datasz);
17570 goto next;
17571
17572 default:
17573 break;
17574 }
17575 }
17576
17577 if (type < GNU_PROPERTY_LOPROC)
17578 printf (_("<unknown type %#x data: "), type);
17579 else if (type < GNU_PROPERTY_LOUSER)
17580 printf (_("<procesor-specific type %#x data: "), type);
17581 else
17582 printf (_("<application-specific type %#x data: "), type);
17583 for (j = 0; j < datasz; ++j)
17584 printf ("%02x ", ptr[j] & 0xff);
17585 printf (">");
17586
17587 next:
17588 ptr += ((datasz + (size - 1)) & ~ (size - 1));
17589 if (ptr == ptr_end)
17590 break;
17591
17592 if (do_wide)
17593 printf (", ");
17594 else
17595 printf ("\n\t");
17596 }
17597
17598 printf ("\n");
17599 }
17600
17601 static bfd_boolean
17602 print_gnu_note (Filedata * filedata, Elf_Internal_Note *pnote)
17603 {
17604 /* NB/ Keep this switch statement in sync with get_gnu_elf_note_type (). */
17605 switch (pnote->type)
17606 {
17607 case NT_GNU_BUILD_ID:
17608 {
17609 unsigned long i;
17610
17611 printf (_(" Build ID: "));
17612 for (i = 0; i < pnote->descsz; ++i)
17613 printf ("%02x", pnote->descdata[i] & 0xff);
17614 printf ("\n");
17615 }
17616 break;
17617
17618 case NT_GNU_ABI_TAG:
17619 {
17620 unsigned long os, major, minor, subminor;
17621 const char *osname;
17622
17623 /* PR 17531: file: 030-599401-0.004. */
17624 if (pnote->descsz < 16)
17625 {
17626 printf (_(" <corrupt GNU_ABI_TAG>\n"));
17627 break;
17628 }
17629
17630 os = byte_get ((unsigned char *) pnote->descdata, 4);
17631 major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17632 minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
17633 subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
17634
17635 switch (os)
17636 {
17637 case GNU_ABI_TAG_LINUX:
17638 osname = "Linux";
17639 break;
17640 case GNU_ABI_TAG_HURD:
17641 osname = "Hurd";
17642 break;
17643 case GNU_ABI_TAG_SOLARIS:
17644 osname = "Solaris";
17645 break;
17646 case GNU_ABI_TAG_FREEBSD:
17647 osname = "FreeBSD";
17648 break;
17649 case GNU_ABI_TAG_NETBSD:
17650 osname = "NetBSD";
17651 break;
17652 case GNU_ABI_TAG_SYLLABLE:
17653 osname = "Syllable";
17654 break;
17655 case GNU_ABI_TAG_NACL:
17656 osname = "NaCl";
17657 break;
17658 default:
17659 osname = "Unknown";
17660 break;
17661 }
17662
17663 printf (_(" OS: %s, ABI: %ld.%ld.%ld\n"), osname,
17664 major, minor, subminor);
17665 }
17666 break;
17667
17668 case NT_GNU_GOLD_VERSION:
17669 {
17670 unsigned long i;
17671
17672 printf (_(" Version: "));
17673 for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
17674 printf ("%c", pnote->descdata[i]);
17675 printf ("\n");
17676 }
17677 break;
17678
17679 case NT_GNU_HWCAP:
17680 {
17681 unsigned long num_entries, mask;
17682
17683 /* Hardware capabilities information. Word 0 is the number of entries.
17684 Word 1 is a bitmask of enabled entries. The rest of the descriptor
17685 is a series of entries, where each entry is a single byte followed
17686 by a nul terminated string. The byte gives the bit number to test
17687 if enabled in the bitmask. */
17688 printf (_(" Hardware Capabilities: "));
17689 if (pnote->descsz < 8)
17690 {
17691 error (_("<corrupt GNU_HWCAP>\n"));
17692 return FALSE;
17693 }
17694 num_entries = byte_get ((unsigned char *) pnote->descdata, 4);
17695 mask = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17696 printf (_("num entries: %ld, enabled mask: %lx\n"), num_entries, mask);
17697 /* FIXME: Add code to display the entries... */
17698 }
17699 break;
17700
17701 case NT_GNU_PROPERTY_TYPE_0:
17702 print_gnu_property_note (filedata, pnote);
17703 break;
17704
17705 default:
17706 /* Handle unrecognised types. An error message should have already been
17707 created by get_gnu_elf_note_type(), so all that we need to do is to
17708 display the data. */
17709 {
17710 unsigned long i;
17711
17712 printf (_(" Description data: "));
17713 for (i = 0; i < pnote->descsz; ++i)
17714 printf ("%02x ", pnote->descdata[i] & 0xff);
17715 printf ("\n");
17716 }
17717 break;
17718 }
17719
17720 return TRUE;
17721 }
17722
17723 static const char *
17724 get_v850_elf_note_type (enum v850_notes n_type)
17725 {
17726 static char buff[64];
17727
17728 switch (n_type)
17729 {
17730 case V850_NOTE_ALIGNMENT: return _("Alignment of 8-byte objects");
17731 case V850_NOTE_DATA_SIZE: return _("Sizeof double and long double");
17732 case V850_NOTE_FPU_INFO: return _("Type of FPU support needed");
17733 case V850_NOTE_SIMD_INFO: return _("Use of SIMD instructions");
17734 case V850_NOTE_CACHE_INFO: return _("Use of cache");
17735 case V850_NOTE_MMU_INFO: return _("Use of MMU");
17736 default:
17737 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
17738 return buff;
17739 }
17740 }
17741
17742 static bfd_boolean
17743 print_v850_note (Elf_Internal_Note * pnote)
17744 {
17745 unsigned int val;
17746
17747 if (pnote->descsz != 4)
17748 return FALSE;
17749
17750 val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
17751
17752 if (val == 0)
17753 {
17754 printf (_("not set\n"));
17755 return TRUE;
17756 }
17757
17758 switch (pnote->type)
17759 {
17760 case V850_NOTE_ALIGNMENT:
17761 switch (val)
17762 {
17763 case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return TRUE;
17764 case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return TRUE;
17765 }
17766 break;
17767
17768 case V850_NOTE_DATA_SIZE:
17769 switch (val)
17770 {
17771 case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return TRUE;
17772 case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return TRUE;
17773 }
17774 break;
17775
17776 case V850_NOTE_FPU_INFO:
17777 switch (val)
17778 {
17779 case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return TRUE;
17780 case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return TRUE;
17781 }
17782 break;
17783
17784 case V850_NOTE_MMU_INFO:
17785 case V850_NOTE_CACHE_INFO:
17786 case V850_NOTE_SIMD_INFO:
17787 if (val == EF_RH850_SIMD)
17788 {
17789 printf (_("yes\n"));
17790 return TRUE;
17791 }
17792 break;
17793
17794 default:
17795 /* An 'unknown note type' message will already have been displayed. */
17796 break;
17797 }
17798
17799 printf (_("unknown value: %x\n"), val);
17800 return FALSE;
17801 }
17802
17803 static bfd_boolean
17804 process_netbsd_elf_note (Elf_Internal_Note * pnote)
17805 {
17806 unsigned int version;
17807
17808 switch (pnote->type)
17809 {
17810 case NT_NETBSD_IDENT:
17811 version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
17812 if ((version / 10000) % 100)
17813 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
17814 version, version / 100000000, (version / 1000000) % 100,
17815 (version / 10000) % 100 > 26 ? "Z" : "",
17816 'A' + (version / 10000) % 26);
17817 else
17818 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
17819 version, version / 100000000, (version / 1000000) % 100,
17820 (version / 100) % 100);
17821 return TRUE;
17822
17823 case NT_NETBSD_MARCH:
17824 printf (" NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
17825 pnote->descdata);
17826 return TRUE;
17827
17828 default:
17829 printf (" NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
17830 pnote->type);
17831 return FALSE;
17832 }
17833 }
17834
17835 static const char *
17836 get_freebsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
17837 {
17838 switch (e_type)
17839 {
17840 case NT_FREEBSD_THRMISC:
17841 return _("NT_THRMISC (thrmisc structure)");
17842 case NT_FREEBSD_PROCSTAT_PROC:
17843 return _("NT_PROCSTAT_PROC (proc data)");
17844 case NT_FREEBSD_PROCSTAT_FILES:
17845 return _("NT_PROCSTAT_FILES (files data)");
17846 case NT_FREEBSD_PROCSTAT_VMMAP:
17847 return _("NT_PROCSTAT_VMMAP (vmmap data)");
17848 case NT_FREEBSD_PROCSTAT_GROUPS:
17849 return _("NT_PROCSTAT_GROUPS (groups data)");
17850 case NT_FREEBSD_PROCSTAT_UMASK:
17851 return _("NT_PROCSTAT_UMASK (umask data)");
17852 case NT_FREEBSD_PROCSTAT_RLIMIT:
17853 return _("NT_PROCSTAT_RLIMIT (rlimit data)");
17854 case NT_FREEBSD_PROCSTAT_OSREL:
17855 return _("NT_PROCSTAT_OSREL (osreldate data)");
17856 case NT_FREEBSD_PROCSTAT_PSSTRINGS:
17857 return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
17858 case NT_FREEBSD_PROCSTAT_AUXV:
17859 return _("NT_PROCSTAT_AUXV (auxv data)");
17860 case NT_FREEBSD_PTLWPINFO:
17861 return _("NT_PTLWPINFO (ptrace_lwpinfo structure)");
17862 }
17863 return get_note_type (filedata, e_type);
17864 }
17865
17866 static const char *
17867 get_netbsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
17868 {
17869 static char buff[64];
17870
17871 if (e_type == NT_NETBSDCORE_PROCINFO)
17872 return _("NetBSD procinfo structure");
17873
17874 /* As of Jan 2002 there are no other machine-independent notes
17875 defined for NetBSD core files. If the note type is less
17876 than the start of the machine-dependent note types, we don't
17877 understand it. */
17878
17879 if (e_type < NT_NETBSDCORE_FIRSTMACH)
17880 {
17881 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17882 return buff;
17883 }
17884
17885 switch (filedata->file_header.e_machine)
17886 {
17887 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
17888 and PT_GETFPREGS == mach+2. */
17889
17890 case EM_OLD_ALPHA:
17891 case EM_ALPHA:
17892 case EM_SPARC:
17893 case EM_SPARC32PLUS:
17894 case EM_SPARCV9:
17895 switch (e_type)
17896 {
17897 case NT_NETBSDCORE_FIRSTMACH + 0:
17898 return _("PT_GETREGS (reg structure)");
17899 case NT_NETBSDCORE_FIRSTMACH + 2:
17900 return _("PT_GETFPREGS (fpreg structure)");
17901 default:
17902 break;
17903 }
17904 break;
17905
17906 /* On all other arch's, PT_GETREGS == mach+1 and
17907 PT_GETFPREGS == mach+3. */
17908 default:
17909 switch (e_type)
17910 {
17911 case NT_NETBSDCORE_FIRSTMACH + 1:
17912 return _("PT_GETREGS (reg structure)");
17913 case NT_NETBSDCORE_FIRSTMACH + 3:
17914 return _("PT_GETFPREGS (fpreg structure)");
17915 default:
17916 break;
17917 }
17918 }
17919
17920 snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
17921 e_type - NT_NETBSDCORE_FIRSTMACH);
17922 return buff;
17923 }
17924
17925 static const char *
17926 get_stapsdt_note_type (unsigned e_type)
17927 {
17928 static char buff[64];
17929
17930 switch (e_type)
17931 {
17932 case NT_STAPSDT:
17933 return _("NT_STAPSDT (SystemTap probe descriptors)");
17934
17935 default:
17936 break;
17937 }
17938
17939 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17940 return buff;
17941 }
17942
17943 static bfd_boolean
17944 print_stapsdt_note (Elf_Internal_Note *pnote)
17945 {
17946 size_t len, maxlen;
17947 unsigned long addr_size = is_32bit_elf ? 4 : 8;
17948 char *data = pnote->descdata;
17949 char *data_end = pnote->descdata + pnote->descsz;
17950 bfd_vma pc, base_addr, semaphore;
17951 char *provider, *probe, *arg_fmt;
17952
17953 if (pnote->descsz < (addr_size * 3))
17954 goto stapdt_note_too_small;
17955
17956 pc = byte_get ((unsigned char *) data, addr_size);
17957 data += addr_size;
17958
17959 base_addr = byte_get ((unsigned char *) data, addr_size);
17960 data += addr_size;
17961
17962 semaphore = byte_get ((unsigned char *) data, addr_size);
17963 data += addr_size;
17964
17965 if (data >= data_end)
17966 goto stapdt_note_too_small;
17967 maxlen = data_end - data;
17968 len = strnlen (data, maxlen);
17969 if (len < maxlen)
17970 {
17971 provider = data;
17972 data += len + 1;
17973 }
17974 else
17975 goto stapdt_note_too_small;
17976
17977 if (data >= data_end)
17978 goto stapdt_note_too_small;
17979 maxlen = data_end - data;
17980 len = strnlen (data, maxlen);
17981 if (len < maxlen)
17982 {
17983 probe = data;
17984 data += len + 1;
17985 }
17986 else
17987 goto stapdt_note_too_small;
17988
17989 if (data >= data_end)
17990 goto stapdt_note_too_small;
17991 maxlen = data_end - data;
17992 len = strnlen (data, maxlen);
17993 if (len < maxlen)
17994 {
17995 arg_fmt = data;
17996 data += len + 1;
17997 }
17998 else
17999 goto stapdt_note_too_small;
18000
18001 printf (_(" Provider: %s\n"), provider);
18002 printf (_(" Name: %s\n"), probe);
18003 printf (_(" Location: "));
18004 print_vma (pc, FULL_HEX);
18005 printf (_(", Base: "));
18006 print_vma (base_addr, FULL_HEX);
18007 printf (_(", Semaphore: "));
18008 print_vma (semaphore, FULL_HEX);
18009 printf ("\n");
18010 printf (_(" Arguments: %s\n"), arg_fmt);
18011
18012 return data == data_end;
18013
18014 stapdt_note_too_small:
18015 printf (_(" <corrupt - note is too small>\n"));
18016 error (_("corrupt stapdt note - the data size is too small\n"));
18017 return FALSE;
18018 }
18019
18020 static const char *
18021 get_ia64_vms_note_type (unsigned e_type)
18022 {
18023 static char buff[64];
18024
18025 switch (e_type)
18026 {
18027 case NT_VMS_MHD:
18028 return _("NT_VMS_MHD (module header)");
18029 case NT_VMS_LNM:
18030 return _("NT_VMS_LNM (language name)");
18031 case NT_VMS_SRC:
18032 return _("NT_VMS_SRC (source files)");
18033 case NT_VMS_TITLE:
18034 return "NT_VMS_TITLE";
18035 case NT_VMS_EIDC:
18036 return _("NT_VMS_EIDC (consistency check)");
18037 case NT_VMS_FPMODE:
18038 return _("NT_VMS_FPMODE (FP mode)");
18039 case NT_VMS_LINKTIME:
18040 return "NT_VMS_LINKTIME";
18041 case NT_VMS_IMGNAM:
18042 return _("NT_VMS_IMGNAM (image name)");
18043 case NT_VMS_IMGID:
18044 return _("NT_VMS_IMGID (image id)");
18045 case NT_VMS_LINKID:
18046 return _("NT_VMS_LINKID (link id)");
18047 case NT_VMS_IMGBID:
18048 return _("NT_VMS_IMGBID (build id)");
18049 case NT_VMS_GSTNAM:
18050 return _("NT_VMS_GSTNAM (sym table name)");
18051 case NT_VMS_ORIG_DYN:
18052 return "NT_VMS_ORIG_DYN";
18053 case NT_VMS_PATCHTIME:
18054 return "NT_VMS_PATCHTIME";
18055 default:
18056 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
18057 return buff;
18058 }
18059 }
18060
18061 static bfd_boolean
18062 print_ia64_vms_note (Elf_Internal_Note * pnote)
18063 {
18064 int maxlen = pnote->descsz;
18065
18066 if (maxlen < 2 || (unsigned long) maxlen != pnote->descsz)
18067 goto desc_size_fail;
18068
18069 switch (pnote->type)
18070 {
18071 case NT_VMS_MHD:
18072 if (maxlen <= 36)
18073 goto desc_size_fail;
18074
18075 int l = (int) strnlen (pnote->descdata + 34, maxlen - 34);
18076
18077 printf (_(" Creation date : %.17s\n"), pnote->descdata);
18078 printf (_(" Last patch date: %.17s\n"), pnote->descdata + 17);
18079 if (l + 34 < maxlen)
18080 {
18081 printf (_(" Module name : %s\n"), pnote->descdata + 34);
18082 if (l + 35 < maxlen)
18083 printf (_(" Module version : %s\n"), pnote->descdata + 34 + l + 1);
18084 else
18085 printf (_(" Module version : <missing>\n"));
18086 }
18087 else
18088 {
18089 printf (_(" Module name : <missing>\n"));
18090 printf (_(" Module version : <missing>\n"));
18091 }
18092 break;
18093
18094 case NT_VMS_LNM:
18095 printf (_(" Language: %.*s\n"), maxlen, pnote->descdata);
18096 break;
18097
18098 #ifdef BFD64
18099 case NT_VMS_FPMODE:
18100 printf (_(" Floating Point mode: "));
18101 if (maxlen < 8)
18102 goto desc_size_fail;
18103 /* FIXME: Generate an error if descsz > 8 ? */
18104
18105 printf ("0x%016" BFD_VMA_FMT "x\n",
18106 (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
18107 break;
18108
18109 case NT_VMS_LINKTIME:
18110 printf (_(" Link time: "));
18111 if (maxlen < 8)
18112 goto desc_size_fail;
18113 /* FIXME: Generate an error if descsz > 8 ? */
18114
18115 print_vms_time
18116 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
18117 printf ("\n");
18118 break;
18119
18120 case NT_VMS_PATCHTIME:
18121 printf (_(" Patch time: "));
18122 if (maxlen < 8)
18123 goto desc_size_fail;
18124 /* FIXME: Generate an error if descsz > 8 ? */
18125
18126 print_vms_time
18127 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
18128 printf ("\n");
18129 break;
18130
18131 case NT_VMS_ORIG_DYN:
18132 if (maxlen < 34)
18133 goto desc_size_fail;
18134
18135 printf (_(" Major id: %u, minor id: %u\n"),
18136 (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
18137 (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
18138 printf (_(" Last modified : "));
18139 print_vms_time
18140 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
18141 printf (_("\n Link flags : "));
18142 printf ("0x%016" BFD_VMA_FMT "x\n",
18143 (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
18144 printf (_(" Header flags: 0x%08x\n"),
18145 (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
18146 printf (_(" Image id : %.*s\n"), maxlen - 32, pnote->descdata + 32);
18147 break;
18148 #endif
18149
18150 case NT_VMS_IMGNAM:
18151 printf (_(" Image name: %.*s\n"), maxlen, pnote->descdata);
18152 break;
18153
18154 case NT_VMS_GSTNAM:
18155 printf (_(" Global symbol table name: %.*s\n"), maxlen, pnote->descdata);
18156 break;
18157
18158 case NT_VMS_IMGID:
18159 printf (_(" Image id: %.*s\n"), maxlen, pnote->descdata);
18160 break;
18161
18162 case NT_VMS_LINKID:
18163 printf (_(" Linker id: %.*s\n"), maxlen, pnote->descdata);
18164 break;
18165
18166 default:
18167 return FALSE;
18168 }
18169
18170 return TRUE;
18171
18172 desc_size_fail:
18173 printf (_(" <corrupt - data size is too small>\n"));
18174 error (_("corrupt IA64 note: data size is too small\n"));
18175 return FALSE;
18176 }
18177
18178 /* Find the symbol associated with a build attribute that is attached
18179 to address OFFSET. If PNAME is non-NULL then store the name of
18180 the symbol (if found) in the provided pointer, Returns NULL if a
18181 symbol could not be found. */
18182
18183 static Elf_Internal_Sym *
18184 get_symbol_for_build_attribute (Filedata * filedata,
18185 unsigned long offset,
18186 bfd_boolean is_open_attr,
18187 const char ** pname)
18188 {
18189 static Filedata * saved_filedata = NULL;
18190 static char * strtab;
18191 static unsigned long strtablen;
18192 static Elf_Internal_Sym * symtab;
18193 static unsigned long nsyms;
18194 Elf_Internal_Sym * saved_sym = NULL;
18195 Elf_Internal_Sym * sym;
18196
18197 if (filedata->section_headers != NULL
18198 && (saved_filedata == NULL || filedata != saved_filedata))
18199 {
18200 Elf_Internal_Shdr * symsec;
18201
18202 /* Load the symbol and string sections. */
18203 for (symsec = filedata->section_headers;
18204 symsec < filedata->section_headers + filedata->file_header.e_shnum;
18205 symsec ++)
18206 {
18207 if (symsec->sh_type == SHT_SYMTAB)
18208 {
18209 symtab = GET_ELF_SYMBOLS (filedata, symsec, & nsyms);
18210
18211 if (symsec->sh_link < filedata->file_header.e_shnum)
18212 {
18213 Elf_Internal_Shdr * strtab_sec = filedata->section_headers + symsec->sh_link;
18214
18215 strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
18216 1, strtab_sec->sh_size,
18217 _("string table"));
18218 strtablen = strtab != NULL ? strtab_sec->sh_size : 0;
18219 }
18220 }
18221 }
18222 saved_filedata = filedata;
18223 }
18224
18225 if (symtab == NULL || strtab == NULL)
18226 return NULL;
18227
18228 /* Find a symbol whose value matches offset. */
18229 for (sym = symtab; sym < symtab + nsyms; sym ++)
18230 if (sym->st_value == offset)
18231 {
18232 if (sym->st_name >= strtablen)
18233 /* Huh ? This should not happen. */
18234 continue;
18235
18236 if (strtab[sym->st_name] == 0)
18237 continue;
18238
18239 /* The AArch64 and ARM architectures define mapping symbols
18240 (eg $d, $x, $t) which we want to ignore. */
18241 if (strtab[sym->st_name] == '$'
18242 && strtab[sym->st_name + 1] != 0
18243 && strtab[sym->st_name + 2] == 0)
18244 continue;
18245
18246 if (is_open_attr)
18247 {
18248 /* For OPEN attributes we prefer GLOBAL over LOCAL symbols
18249 and FILE or OBJECT symbols over NOTYPE symbols. We skip
18250 FUNC symbols entirely. */
18251 switch (ELF_ST_TYPE (sym->st_info))
18252 {
18253 case STT_OBJECT:
18254 case STT_FILE:
18255 saved_sym = sym;
18256 if (sym->st_size)
18257 {
18258 /* If the symbol has a size associated
18259 with it then we can stop searching. */
18260 sym = symtab + nsyms;
18261 }
18262 continue;
18263
18264 case STT_FUNC:
18265 /* Ignore function symbols. */
18266 continue;
18267
18268 default:
18269 break;
18270 }
18271
18272 switch (ELF_ST_BIND (sym->st_info))
18273 {
18274 case STB_GLOBAL:
18275 if (saved_sym == NULL
18276 || ELF_ST_TYPE (saved_sym->st_info) != STT_OBJECT)
18277 saved_sym = sym;
18278 break;
18279
18280 case STB_LOCAL:
18281 if (saved_sym == NULL)
18282 saved_sym = sym;
18283 break;
18284
18285 default:
18286 break;
18287 }
18288 }
18289 else
18290 {
18291 if (ELF_ST_TYPE (sym->st_info) != STT_FUNC)
18292 continue;
18293
18294 saved_sym = sym;
18295 break;
18296 }
18297 }
18298
18299 if (saved_sym && pname)
18300 * pname = strtab + saved_sym->st_name;
18301
18302 return saved_sym;
18303 }
18304
18305 /* Returns true iff addr1 and addr2 are in the same section. */
18306
18307 static bfd_boolean
18308 same_section (Filedata * filedata, unsigned long addr1, unsigned long addr2)
18309 {
18310 Elf_Internal_Shdr * a1;
18311 Elf_Internal_Shdr * a2;
18312
18313 a1 = find_section_by_address (filedata, addr1);
18314 a2 = find_section_by_address (filedata, addr2);
18315
18316 return a1 == a2 && a1 != NULL;
18317 }
18318
18319 static bfd_boolean
18320 print_gnu_build_attribute_description (Elf_Internal_Note * pnote,
18321 Filedata * filedata)
18322 {
18323 static unsigned long global_offset = 0;
18324 static unsigned long global_end = 0;
18325 static unsigned long func_offset = 0;
18326 static unsigned long func_end = 0;
18327
18328 Elf_Internal_Sym * sym;
18329 const char * name;
18330 unsigned long start;
18331 unsigned long end;
18332 bfd_boolean is_open_attr = pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN;
18333
18334 switch (pnote->descsz)
18335 {
18336 case 0:
18337 /* A zero-length description means that the range of
18338 the previous note of the same type should be used. */
18339 if (is_open_attr)
18340 {
18341 if (global_end > global_offset)
18342 printf (_(" Applies to region from %#lx to %#lx\n"),
18343 global_offset, global_end);
18344 else
18345 printf (_(" Applies to region from %#lx\n"), global_offset);
18346 }
18347 else
18348 {
18349 if (func_end > func_offset)
18350 printf (_(" Applies to region from %#lx to %#lx\n"), func_offset, func_end);
18351 else
18352 printf (_(" Applies to region from %#lx\n"), func_offset);
18353 }
18354 return TRUE;
18355
18356 case 4:
18357 start = byte_get ((unsigned char *) pnote->descdata, 4);
18358 end = 0;
18359 break;
18360
18361 case 8:
18362 if (is_32bit_elf)
18363 {
18364 /* FIXME: We should check that version 3+ notes are being used here... */
18365 start = byte_get ((unsigned char *) pnote->descdata, 4);
18366 end = byte_get ((unsigned char *) pnote->descdata + 4, 4);
18367 }
18368 else
18369 {
18370 start = byte_get ((unsigned char *) pnote->descdata, 8);
18371 end = 0;
18372 }
18373 break;
18374
18375 case 16:
18376 start = byte_get ((unsigned char *) pnote->descdata, 8);
18377 end = byte_get ((unsigned char *) pnote->descdata + 8, 8);
18378 break;
18379
18380 default:
18381 error (_(" <invalid description size: %lx>\n"), pnote->descsz);
18382 printf (_(" <invalid descsz>"));
18383 return FALSE;
18384 }
18385
18386 name = NULL;
18387 sym = get_symbol_for_build_attribute (filedata, start, is_open_attr, & name);
18388 /* As of version 5 of the annobin plugin, filename symbols are biased by 2
18389 in order to avoid them being confused with the start address of the
18390 first function in the file... */
18391 if (sym == NULL && is_open_attr)
18392 sym = get_symbol_for_build_attribute (filedata, start + 2, is_open_attr,
18393 & name);
18394
18395 if (end == 0 && sym != NULL && sym->st_size > 0)
18396 end = start + sym->st_size;
18397
18398 if (is_open_attr)
18399 {
18400 /* FIXME: Need to properly allow for section alignment.
18401 16 is just the alignment used on x86_64. */
18402 if (global_end > 0
18403 && start > BFD_ALIGN (global_end, 16)
18404 /* Build notes are not guaranteed to be organised in order of
18405 increasing address, but we should find the all of the notes
18406 for one section in the same place. */
18407 && same_section (filedata, start, global_end))
18408 warn (_("Gap in build notes detected from %#lx to %#lx\n"),
18409 global_end + 1, start - 1);
18410
18411 printf (_(" Applies to region from %#lx"), start);
18412 global_offset = start;
18413
18414 if (end)
18415 {
18416 printf (_(" to %#lx"), end);
18417 global_end = end;
18418 }
18419 }
18420 else
18421 {
18422 printf (_(" Applies to region from %#lx"), start);
18423 func_offset = start;
18424
18425 if (end)
18426 {
18427 printf (_(" to %#lx"), end);
18428 func_end = end;
18429 }
18430 }
18431
18432 if (sym && name)
18433 printf (_(" (%s)"), name);
18434
18435 printf ("\n");
18436 return TRUE;
18437 }
18438
18439 static bfd_boolean
18440 print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
18441 {
18442 static const char string_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_STRING, 0 };
18443 static const char number_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC, 0 };
18444 static const char bool_expected [3] = { GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE, GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE, 0 };
18445 char name_type;
18446 char name_attribute;
18447 const char * expected_types;
18448 const char * name = pnote->namedata;
18449 const char * text;
18450 signed int left;
18451
18452 if (name == NULL || pnote->namesz < 2)
18453 {
18454 error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
18455 print_symbol (-20, _(" <corrupt name>"));
18456 return FALSE;
18457 }
18458
18459 if (do_wide)
18460 left = 28;
18461 else
18462 left = 20;
18463
18464 /* Version 2 of the spec adds a "GA" prefix to the name field. */
18465 if (name[0] == 'G' && name[1] == 'A')
18466 {
18467 if (pnote->namesz < 4)
18468 {
18469 error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
18470 print_symbol (-20, _(" <corrupt name>"));
18471 return FALSE;
18472 }
18473
18474 printf ("GA");
18475 name += 2;
18476 left -= 2;
18477 }
18478
18479 switch ((name_type = * name))
18480 {
18481 case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
18482 case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
18483 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
18484 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
18485 printf ("%c", * name);
18486 left --;
18487 break;
18488 default:
18489 error (_("unrecognised attribute type in name field: %d\n"), name_type);
18490 print_symbol (-20, _("<unknown name type>"));
18491 return FALSE;
18492 }
18493
18494 ++ name;
18495 text = NULL;
18496
18497 switch ((name_attribute = * name))
18498 {
18499 case GNU_BUILD_ATTRIBUTE_VERSION:
18500 text = _("<version>");
18501 expected_types = string_expected;
18502 ++ name;
18503 break;
18504 case GNU_BUILD_ATTRIBUTE_STACK_PROT:
18505 text = _("<stack prot>");
18506 expected_types = "!+*";
18507 ++ name;
18508 break;
18509 case GNU_BUILD_ATTRIBUTE_RELRO:
18510 text = _("<relro>");
18511 expected_types = bool_expected;
18512 ++ name;
18513 break;
18514 case GNU_BUILD_ATTRIBUTE_STACK_SIZE:
18515 text = _("<stack size>");
18516 expected_types = number_expected;
18517 ++ name;
18518 break;
18519 case GNU_BUILD_ATTRIBUTE_TOOL:
18520 text = _("<tool>");
18521 expected_types = string_expected;
18522 ++ name;
18523 break;
18524 case GNU_BUILD_ATTRIBUTE_ABI:
18525 text = _("<ABI>");
18526 expected_types = "$*";
18527 ++ name;
18528 break;
18529 case GNU_BUILD_ATTRIBUTE_PIC:
18530 text = _("<PIC>");
18531 expected_types = number_expected;
18532 ++ name;
18533 break;
18534 case GNU_BUILD_ATTRIBUTE_SHORT_ENUM:
18535 text = _("<short enum>");
18536 expected_types = bool_expected;
18537 ++ name;
18538 break;
18539 default:
18540 if (ISPRINT (* name))
18541 {
18542 int len = strnlen (name, pnote->namesz - (name - pnote->namedata)) + 1;
18543
18544 if (len > left && ! do_wide)
18545 len = left;
18546 printf ("%.*s:", len, name);
18547 left -= len;
18548 name += len;
18549 }
18550 else
18551 {
18552 static char tmpbuf [128];
18553
18554 error (_("unrecognised byte in name field: %d\n"), * name);
18555 sprintf (tmpbuf, _("<unknown:_%d>"), * name);
18556 text = tmpbuf;
18557 name ++;
18558 }
18559 expected_types = "*$!+";
18560 break;
18561 }
18562
18563 if (text)
18564 left -= printf ("%s", text);
18565
18566 if (strchr (expected_types, name_type) == NULL)
18567 warn (_("attribute does not have an expected type (%c)\n"), name_type);
18568
18569 if ((unsigned long)(name - pnote->namedata) > pnote->namesz)
18570 {
18571 error (_("corrupt name field: namesz: %lu but parsing gets to %ld\n"),
18572 (unsigned long) pnote->namesz,
18573 (long) (name - pnote->namedata));
18574 return FALSE;
18575 }
18576
18577 if (left < 1 && ! do_wide)
18578 return TRUE;
18579
18580 switch (name_type)
18581 {
18582 case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
18583 {
18584 unsigned int bytes;
18585 unsigned long long val = 0;
18586 unsigned int shift = 0;
18587 char * decoded = NULL;
18588
18589 bytes = pnote->namesz - (name - pnote->namedata);
18590 if (bytes > 0)
18591 /* The -1 is because the name field is always 0 terminated, and we
18592 want to be able to ensure that the shift in the while loop below
18593 will not overflow. */
18594 -- bytes;
18595
18596 if (bytes > sizeof (val))
18597 {
18598 error (_("corrupt numeric name field: too many bytes in the value: %x\n"),
18599 bytes);
18600 bytes = sizeof (val);
18601 }
18602 /* We do not bother to warn if bytes == 0 as this can
18603 happen with some early versions of the gcc plugin. */
18604
18605 while (bytes --)
18606 {
18607 unsigned long byte = (* name ++) & 0xff;
18608
18609 val |= byte << shift;
18610 shift += 8;
18611 }
18612
18613 switch (name_attribute)
18614 {
18615 case GNU_BUILD_ATTRIBUTE_PIC:
18616 switch (val)
18617 {
18618 case 0: decoded = "static"; break;
18619 case 1: decoded = "pic"; break;
18620 case 2: decoded = "PIC"; break;
18621 case 3: decoded = "pie"; break;
18622 case 4: decoded = "PIE"; break;
18623 default: break;
18624 }
18625 break;
18626 case GNU_BUILD_ATTRIBUTE_STACK_PROT:
18627 switch (val)
18628 {
18629 /* Based upon the SPCT_FLAG_xxx enum values in gcc/cfgexpand.c. */
18630 case 0: decoded = "off"; break;
18631 case 1: decoded = "on"; break;
18632 case 2: decoded = "all"; break;
18633 case 3: decoded = "strong"; break;
18634 case 4: decoded = "explicit"; break;
18635 default: break;
18636 }
18637 break;
18638 default:
18639 break;
18640 }
18641
18642 if (decoded != NULL)
18643 {
18644 print_symbol (-left, decoded);
18645 left = 0;
18646 }
18647 else if (val == 0)
18648 {
18649 printf ("0x0");
18650 left -= 3;
18651 }
18652 else
18653 {
18654 if (do_wide)
18655 left -= printf ("0x%llx", val);
18656 else
18657 left -= printf ("0x%-.*llx", left, val);
18658 }
18659 }
18660 break;
18661 case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
18662 left -= print_symbol (- left, name);
18663 break;
18664 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
18665 left -= print_symbol (- left, "true");
18666 break;
18667 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
18668 left -= print_symbol (- left, "false");
18669 break;
18670 }
18671
18672 if (do_wide && left > 0)
18673 printf ("%-*s", left, " ");
18674
18675 return TRUE;
18676 }
18677
18678 /* Note that by the ELF standard, the name field is already null byte
18679 terminated, and namesz includes the terminating null byte.
18680 I.E. the value of namesz for the name "FSF" is 4.
18681
18682 If the value of namesz is zero, there is no name present. */
18683
18684 static bfd_boolean
18685 process_note (Elf_Internal_Note * pnote,
18686 Filedata * filedata)
18687 {
18688 const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
18689 const char * nt;
18690
18691 if (pnote->namesz == 0)
18692 /* If there is no note name, then use the default set of
18693 note type strings. */
18694 nt = get_note_type (filedata, pnote->type);
18695
18696 else if (const_strneq (pnote->namedata, "GNU"))
18697 /* GNU-specific object file notes. */
18698 nt = get_gnu_elf_note_type (pnote->type);
18699
18700 else if (const_strneq (pnote->namedata, "FreeBSD"))
18701 /* FreeBSD-specific core file notes. */
18702 nt = get_freebsd_elfcore_note_type (filedata, pnote->type);
18703
18704 else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
18705 /* NetBSD-specific core file notes. */
18706 nt = get_netbsd_elfcore_note_type (filedata, pnote->type);
18707
18708 else if (const_strneq (pnote->namedata, "NetBSD"))
18709 /* NetBSD-specific core file notes. */
18710 return process_netbsd_elf_note (pnote);
18711
18712 else if (strneq (pnote->namedata, "SPU/", 4))
18713 {
18714 /* SPU-specific core file notes. */
18715 nt = pnote->namedata + 4;
18716 name = "SPU";
18717 }
18718
18719 else if (const_strneq (pnote->namedata, "IPF/VMS"))
18720 /* VMS/ia64-specific file notes. */
18721 nt = get_ia64_vms_note_type (pnote->type);
18722
18723 else if (const_strneq (pnote->namedata, "stapsdt"))
18724 nt = get_stapsdt_note_type (pnote->type);
18725
18726 else
18727 /* Don't recognize this note name; just use the default set of
18728 note type strings. */
18729 nt = get_note_type (filedata, pnote->type);
18730
18731 printf (" ");
18732
18733 if (((const_strneq (pnote->namedata, "GA")
18734 && strchr ("*$!+", pnote->namedata[2]) != NULL)
18735 || strchr ("*$!+", pnote->namedata[0]) != NULL)
18736 && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
18737 || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
18738 print_gnu_build_attribute_name (pnote);
18739 else
18740 print_symbol (-20, name);
18741
18742 if (do_wide)
18743 printf (" 0x%08lx\t%s\t", pnote->descsz, nt);
18744 else
18745 printf (" 0x%08lx\t%s\n", pnote->descsz, nt);
18746
18747 if (const_strneq (pnote->namedata, "IPF/VMS"))
18748 return print_ia64_vms_note (pnote);
18749 else if (const_strneq (pnote->namedata, "GNU"))
18750 return print_gnu_note (filedata, pnote);
18751 else if (const_strneq (pnote->namedata, "stapsdt"))
18752 return print_stapsdt_note (pnote);
18753 else if (const_strneq (pnote->namedata, "CORE"))
18754 return print_core_note (pnote);
18755 else if (((const_strneq (pnote->namedata, "GA")
18756 && strchr ("*$!+", pnote->namedata[2]) != NULL)
18757 || strchr ("*$!+", pnote->namedata[0]) != NULL)
18758 && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
18759 || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
18760 return print_gnu_build_attribute_description (pnote, filedata);
18761
18762 if (pnote->descsz)
18763 {
18764 unsigned long i;
18765
18766 printf (_(" description data: "));
18767 for (i = 0; i < pnote->descsz; i++)
18768 printf ("%02x ", pnote->descdata[i]);
18769 if (!do_wide)
18770 printf ("\n");
18771 }
18772
18773 if (do_wide)
18774 printf ("\n");
18775
18776 return TRUE;
18777 }
18778
18779 static bfd_boolean
18780 process_notes_at (Filedata * filedata,
18781 Elf_Internal_Shdr * section,
18782 bfd_vma offset,
18783 bfd_vma length,
18784 bfd_vma align)
18785 {
18786 Elf_External_Note * pnotes;
18787 Elf_External_Note * external;
18788 char * end;
18789 bfd_boolean res = TRUE;
18790
18791 if (length <= 0)
18792 return FALSE;
18793
18794 if (section)
18795 {
18796 pnotes = (Elf_External_Note *) get_section_contents (section, filedata);
18797 if (pnotes)
18798 {
18799 if (! apply_relocations (filedata, section, (unsigned char *) pnotes, length, NULL, NULL))
18800 return FALSE;
18801 }
18802 }
18803 else
18804 pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
18805 _("notes"));
18806
18807 if (pnotes == NULL)
18808 return FALSE;
18809
18810 external = pnotes;
18811
18812 if (section)
18813 printf (_("\nDisplaying notes found in: %s\n"), printable_section_name (filedata, section));
18814 else
18815 printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
18816 (unsigned long) offset, (unsigned long) length);
18817
18818 /* NB: Some note sections may have alignment value of 0 or 1. gABI
18819 specifies that notes should be aligned to 4 bytes in 32-bit
18820 objects and to 8 bytes in 64-bit objects. As a Linux extension,
18821 we also support 4 byte alignment in 64-bit objects. If section
18822 alignment is less than 4, we treate alignment as 4 bytes. */
18823 if (align < 4)
18824 align = 4;
18825 else if (align != 4 && align != 8)
18826 {
18827 warn (_("Corrupt note: alignment %ld, expecting 4 or 8\n"),
18828 (long) align);
18829 return FALSE;
18830 }
18831
18832 printf (_(" %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
18833
18834 end = (char *) pnotes + length;
18835 while ((char *) external < end)
18836 {
18837 Elf_Internal_Note inote;
18838 size_t min_notesz;
18839 char * next;
18840 char * temp = NULL;
18841 size_t data_remaining = end - (char *) external;
18842
18843 if (!is_ia64_vms (filedata))
18844 {
18845 /* PR binutils/15191
18846 Make sure that there is enough data to read. */
18847 min_notesz = offsetof (Elf_External_Note, name);
18848 if (data_remaining < min_notesz)
18849 {
18850 warn (ngettext ("Corrupt note: only %ld byte remains, "
18851 "not enough for a full note\n",
18852 "Corrupt note: only %ld bytes remain, "
18853 "not enough for a full note\n",
18854 data_remaining),
18855 (long) data_remaining);
18856 break;
18857 }
18858 data_remaining -= min_notesz;
18859
18860 inote.type = BYTE_GET (external->type);
18861 inote.namesz = BYTE_GET (external->namesz);
18862 inote.namedata = external->name;
18863 inote.descsz = BYTE_GET (external->descsz);
18864 inote.descdata = ((char *) external
18865 + ELF_NOTE_DESC_OFFSET (inote.namesz, align));
18866 inote.descpos = offset + (inote.descdata - (char *) pnotes);
18867 next = ((char *) external
18868 + ELF_NOTE_NEXT_OFFSET (inote.namesz, inote.descsz, align));
18869 }
18870 else
18871 {
18872 Elf64_External_VMS_Note *vms_external;
18873
18874 /* PR binutils/15191
18875 Make sure that there is enough data to read. */
18876 min_notesz = offsetof (Elf64_External_VMS_Note, name);
18877 if (data_remaining < min_notesz)
18878 {
18879 warn (ngettext ("Corrupt note: only %ld byte remains, "
18880 "not enough for a full note\n",
18881 "Corrupt note: only %ld bytes remain, "
18882 "not enough for a full note\n",
18883 data_remaining),
18884 (long) data_remaining);
18885 break;
18886 }
18887 data_remaining -= min_notesz;
18888
18889 vms_external = (Elf64_External_VMS_Note *) external;
18890 inote.type = BYTE_GET (vms_external->type);
18891 inote.namesz = BYTE_GET (vms_external->namesz);
18892 inote.namedata = vms_external->name;
18893 inote.descsz = BYTE_GET (vms_external->descsz);
18894 inote.descdata = inote.namedata + align_power (inote.namesz, 3);
18895 inote.descpos = offset + (inote.descdata - (char *) pnotes);
18896 next = inote.descdata + align_power (inote.descsz, 3);
18897 }
18898
18899 /* PR 17531: file: 3443835e. */
18900 /* PR 17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4. */
18901 if ((size_t) (inote.descdata - inote.namedata) < inote.namesz
18902 || (size_t) (inote.descdata - inote.namedata) > data_remaining
18903 || (size_t) (next - inote.descdata) < inote.descsz
18904 || ((size_t) (next - inote.descdata)
18905 > data_remaining - (size_t) (inote.descdata - inote.namedata)))
18906 {
18907 warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
18908 (unsigned long) ((char *) external - (char *) pnotes));
18909 warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx, alignment: %u\n"),
18910 inote.type, inote.namesz, inote.descsz, (int) align);
18911 break;
18912 }
18913
18914 external = (Elf_External_Note *) next;
18915
18916 /* Verify that name is null terminated. It appears that at least
18917 one version of Linux (RedHat 6.0) generates corefiles that don't
18918 comply with the ELF spec by failing to include the null byte in
18919 namesz. */
18920 if (inote.namesz > 0 && inote.namedata[inote.namesz - 1] != '\0')
18921 {
18922 if ((size_t) (inote.descdata - inote.namedata) == inote.namesz)
18923 {
18924 temp = (char *) malloc (inote.namesz + 1);
18925 if (temp == NULL)
18926 {
18927 error (_("Out of memory allocating space for inote name\n"));
18928 res = FALSE;
18929 break;
18930 }
18931
18932 memcpy (temp, inote.namedata, inote.namesz);
18933 inote.namedata = temp;
18934 }
18935 inote.namedata[inote.namesz] = 0;
18936 }
18937
18938 if (! process_note (& inote, filedata))
18939 res = FALSE;
18940
18941 if (temp != NULL)
18942 {
18943 free (temp);
18944 temp = NULL;
18945 }
18946 }
18947
18948 free (pnotes);
18949
18950 return res;
18951 }
18952
18953 static bfd_boolean
18954 process_corefile_note_segments (Filedata * filedata)
18955 {
18956 Elf_Internal_Phdr * segment;
18957 unsigned int i;
18958 bfd_boolean res = TRUE;
18959
18960 if (! get_program_headers (filedata))
18961 return TRUE;
18962
18963 for (i = 0, segment = filedata->program_headers;
18964 i < filedata->file_header.e_phnum;
18965 i++, segment++)
18966 {
18967 if (segment->p_type == PT_NOTE)
18968 if (! process_notes_at (filedata, NULL,
18969 (bfd_vma) segment->p_offset,
18970 (bfd_vma) segment->p_filesz,
18971 (bfd_vma) segment->p_align))
18972 res = FALSE;
18973 }
18974
18975 return res;
18976 }
18977
18978 static bfd_boolean
18979 process_v850_notes (Filedata * filedata, bfd_vma offset, bfd_vma length)
18980 {
18981 Elf_External_Note * pnotes;
18982 Elf_External_Note * external;
18983 char * end;
18984 bfd_boolean res = TRUE;
18985
18986 if (length <= 0)
18987 return FALSE;
18988
18989 pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
18990 _("v850 notes"));
18991 if (pnotes == NULL)
18992 return FALSE;
18993
18994 external = pnotes;
18995 end = (char*) pnotes + length;
18996
18997 printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
18998 (unsigned long) offset, (unsigned long) length);
18999
19000 while ((char *) external + sizeof (Elf_External_Note) < end)
19001 {
19002 Elf_External_Note * next;
19003 Elf_Internal_Note inote;
19004
19005 inote.type = BYTE_GET (external->type);
19006 inote.namesz = BYTE_GET (external->namesz);
19007 inote.namedata = external->name;
19008 inote.descsz = BYTE_GET (external->descsz);
19009 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
19010 inote.descpos = offset + (inote.descdata - (char *) pnotes);
19011
19012 if (inote.descdata < (char *) pnotes || inote.descdata >= end)
19013 {
19014 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
19015 inote.descdata = inote.namedata;
19016 inote.namesz = 0;
19017 }
19018
19019 next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
19020
19021 if ( ((char *) next > end)
19022 || ((char *) next < (char *) pnotes))
19023 {
19024 warn (_("corrupt descsz found in note at offset 0x%lx\n"),
19025 (unsigned long) ((char *) external - (char *) pnotes));
19026 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
19027 inote.type, inote.namesz, inote.descsz);
19028 break;
19029 }
19030
19031 external = next;
19032
19033 /* Prevent out-of-bounds indexing. */
19034 if ( inote.namedata + inote.namesz > end
19035 || inote.namedata + inote.namesz < inote.namedata)
19036 {
19037 warn (_("corrupt namesz found in note at offset 0x%lx\n"),
19038 (unsigned long) ((char *) external - (char *) pnotes));
19039 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
19040 inote.type, inote.namesz, inote.descsz);
19041 break;
19042 }
19043
19044 printf (" %s: ", get_v850_elf_note_type (inote.type));
19045
19046 if (! print_v850_note (& inote))
19047 {
19048 res = FALSE;
19049 printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
19050 inote.namesz, inote.descsz);
19051 }
19052 }
19053
19054 free (pnotes);
19055
19056 return res;
19057 }
19058
19059 static bfd_boolean
19060 process_note_sections (Filedata * filedata)
19061 {
19062 Elf_Internal_Shdr * section;
19063 unsigned long i;
19064 unsigned int n = 0;
19065 bfd_boolean res = TRUE;
19066
19067 for (i = 0, section = filedata->section_headers;
19068 i < filedata->file_header.e_shnum && section != NULL;
19069 i++, section++)
19070 {
19071 if (section->sh_type == SHT_NOTE)
19072 {
19073 if (! process_notes_at (filedata, section,
19074 (bfd_vma) section->sh_offset,
19075 (bfd_vma) section->sh_size,
19076 (bfd_vma) section->sh_addralign))
19077 res = FALSE;
19078 n++;
19079 }
19080
19081 if (( filedata->file_header.e_machine == EM_V800
19082 || filedata->file_header.e_machine == EM_V850
19083 || filedata->file_header.e_machine == EM_CYGNUS_V850)
19084 && section->sh_type == SHT_RENESAS_INFO)
19085 {
19086 if (! process_v850_notes (filedata,
19087 (bfd_vma) section->sh_offset,
19088 (bfd_vma) section->sh_size))
19089 res = FALSE;
19090 n++;
19091 }
19092 }
19093
19094 if (n == 0)
19095 /* Try processing NOTE segments instead. */
19096 return process_corefile_note_segments (filedata);
19097
19098 return res;
19099 }
19100
19101 static bfd_boolean
19102 process_notes (Filedata * filedata)
19103 {
19104 /* If we have not been asked to display the notes then do nothing. */
19105 if (! do_notes)
19106 return TRUE;
19107
19108 if (filedata->file_header.e_type != ET_CORE)
19109 return process_note_sections (filedata);
19110
19111 /* No program headers means no NOTE segment. */
19112 if (filedata->file_header.e_phnum > 0)
19113 return process_corefile_note_segments (filedata);
19114
19115 printf (_("No note segments present in the core file.\n"));
19116 return TRUE;
19117 }
19118
19119 static unsigned char *
19120 display_public_gnu_attributes (unsigned char * start,
19121 const unsigned char * const end)
19122 {
19123 printf (_(" Unknown GNU attribute: %s\n"), start);
19124
19125 start += strnlen ((char *) start, end - start);
19126 display_raw_attribute (start, end);
19127
19128 return (unsigned char *) end;
19129 }
19130
19131 static unsigned char *
19132 display_generic_attribute (unsigned char * start,
19133 unsigned int tag,
19134 const unsigned char * const end)
19135 {
19136 if (tag == 0)
19137 return (unsigned char *) end;
19138
19139 return display_tag_value (tag, start, end);
19140 }
19141
19142 static bfd_boolean
19143 process_arch_specific (Filedata * filedata)
19144 {
19145 if (! do_arch)
19146 return TRUE;
19147
19148 switch (filedata->file_header.e_machine)
19149 {
19150 case EM_ARC:
19151 case EM_ARC_COMPACT:
19152 case EM_ARC_COMPACT2:
19153 return process_attributes (filedata, "ARC", SHT_ARC_ATTRIBUTES,
19154 display_arc_attribute,
19155 display_generic_attribute);
19156 case EM_ARM:
19157 return process_attributes (filedata, "aeabi", SHT_ARM_ATTRIBUTES,
19158 display_arm_attribute,
19159 display_generic_attribute);
19160
19161 case EM_MIPS:
19162 case EM_MIPS_RS3_LE:
19163 return process_mips_specific (filedata);
19164
19165 case EM_MSP430:
19166 return process_attributes (filedata, "mspabi", SHT_MSP430_ATTRIBUTES,
19167 display_msp430x_attribute,
19168 display_generic_attribute);
19169
19170 case EM_RISCV:
19171 return process_attributes (filedata, "riscv", SHT_RISCV_ATTRIBUTES,
19172 display_riscv_attribute,
19173 display_generic_attribute);
19174
19175 case EM_NDS32:
19176 return process_nds32_specific (filedata);
19177
19178 case EM_PPC:
19179 case EM_PPC64:
19180 return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
19181 display_power_gnu_attribute);
19182
19183 case EM_S390:
19184 case EM_S390_OLD:
19185 return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
19186 display_s390_gnu_attribute);
19187
19188 case EM_SPARC:
19189 case EM_SPARC32PLUS:
19190 case EM_SPARCV9:
19191 return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
19192 display_sparc_gnu_attribute);
19193
19194 case EM_TI_C6000:
19195 return process_attributes (filedata, "c6xabi", SHT_C6000_ATTRIBUTES,
19196 display_tic6x_attribute,
19197 display_generic_attribute);
19198
19199 default:
19200 return process_attributes (filedata, "gnu", SHT_GNU_ATTRIBUTES,
19201 display_public_gnu_attributes,
19202 display_generic_attribute);
19203 }
19204 }
19205
19206 static bfd_boolean
19207 get_file_header (Filedata * filedata)
19208 {
19209 /* Read in the identity array. */
19210 if (fread (filedata->file_header.e_ident, EI_NIDENT, 1, filedata->handle) != 1)
19211 return FALSE;
19212
19213 /* Determine how to read the rest of the header. */
19214 switch (filedata->file_header.e_ident[EI_DATA])
19215 {
19216 default:
19217 case ELFDATANONE:
19218 case ELFDATA2LSB:
19219 byte_get = byte_get_little_endian;
19220 byte_put = byte_put_little_endian;
19221 break;
19222 case ELFDATA2MSB:
19223 byte_get = byte_get_big_endian;
19224 byte_put = byte_put_big_endian;
19225 break;
19226 }
19227
19228 /* For now we only support 32 bit and 64 bit ELF files. */
19229 is_32bit_elf = (filedata->file_header.e_ident[EI_CLASS] != ELFCLASS64);
19230
19231 /* Read in the rest of the header. */
19232 if (is_32bit_elf)
19233 {
19234 Elf32_External_Ehdr ehdr32;
19235
19236 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, filedata->handle) != 1)
19237 return FALSE;
19238
19239 filedata->file_header.e_type = BYTE_GET (ehdr32.e_type);
19240 filedata->file_header.e_machine = BYTE_GET (ehdr32.e_machine);
19241 filedata->file_header.e_version = BYTE_GET (ehdr32.e_version);
19242 filedata->file_header.e_entry = BYTE_GET (ehdr32.e_entry);
19243 filedata->file_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
19244 filedata->file_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
19245 filedata->file_header.e_flags = BYTE_GET (ehdr32.e_flags);
19246 filedata->file_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
19247 filedata->file_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
19248 filedata->file_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
19249 filedata->file_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
19250 filedata->file_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
19251 filedata->file_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
19252 }
19253 else
19254 {
19255 Elf64_External_Ehdr ehdr64;
19256
19257 /* If we have been compiled with sizeof (bfd_vma) == 4, then
19258 we will not be able to cope with the 64bit data found in
19259 64 ELF files. Detect this now and abort before we start
19260 overwriting things. */
19261 if (sizeof (bfd_vma) < 8)
19262 {
19263 error (_("This instance of readelf has been built without support for a\n\
19264 64 bit data type and so it cannot read 64 bit ELF files.\n"));
19265 return FALSE;
19266 }
19267
19268 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, filedata->handle) != 1)
19269 return FALSE;
19270
19271 filedata->file_header.e_type = BYTE_GET (ehdr64.e_type);
19272 filedata->file_header.e_machine = BYTE_GET (ehdr64.e_machine);
19273 filedata->file_header.e_version = BYTE_GET (ehdr64.e_version);
19274 filedata->file_header.e_entry = BYTE_GET (ehdr64.e_entry);
19275 filedata->file_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
19276 filedata->file_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
19277 filedata->file_header.e_flags = BYTE_GET (ehdr64.e_flags);
19278 filedata->file_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
19279 filedata->file_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
19280 filedata->file_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
19281 filedata->file_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
19282 filedata->file_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
19283 filedata->file_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
19284 }
19285
19286 if (filedata->file_header.e_shoff)
19287 {
19288 /* There may be some extensions in the first section header. Don't
19289 bomb if we can't read it. */
19290 if (is_32bit_elf)
19291 get_32bit_section_headers (filedata, TRUE);
19292 else
19293 get_64bit_section_headers (filedata, TRUE);
19294 }
19295
19296 return TRUE;
19297 }
19298
19299 static void
19300 close_file (Filedata * filedata)
19301 {
19302 if (filedata)
19303 {
19304 if (filedata->handle)
19305 fclose (filedata->handle);
19306 free (filedata);
19307 }
19308 }
19309
19310 void
19311 close_debug_file (void * data)
19312 {
19313 close_file ((Filedata *) data);
19314 }
19315
19316 static Filedata *
19317 open_file (const char * pathname)
19318 {
19319 struct stat statbuf;
19320 Filedata * filedata = NULL;
19321
19322 if (stat (pathname, & statbuf) < 0
19323 || ! S_ISREG (statbuf.st_mode))
19324 goto fail;
19325
19326 filedata = calloc (1, sizeof * filedata);
19327 if (filedata == NULL)
19328 goto fail;
19329
19330 filedata->handle = fopen (pathname, "rb");
19331 if (filedata->handle == NULL)
19332 goto fail;
19333
19334 filedata->file_size = (bfd_size_type) statbuf.st_size;
19335 filedata->file_name = pathname;
19336
19337 if (! get_file_header (filedata))
19338 goto fail;
19339
19340 if (filedata->file_header.e_shoff)
19341 {
19342 bfd_boolean res;
19343
19344 /* Read the section headers again, this time for real. */
19345 if (is_32bit_elf)
19346 res = get_32bit_section_headers (filedata, FALSE);
19347 else
19348 res = get_64bit_section_headers (filedata, FALSE);
19349
19350 if (!res)
19351 goto fail;
19352 }
19353
19354 return filedata;
19355
19356 fail:
19357 if (filedata)
19358 {
19359 if (filedata->handle)
19360 fclose (filedata->handle);
19361 free (filedata);
19362 }
19363 return NULL;
19364 }
19365
19366 void *
19367 open_debug_file (const char * pathname)
19368 {
19369 return open_file (pathname);
19370 }
19371
19372 /* Process one ELF object file according to the command line options.
19373 This file may actually be stored in an archive. The file is
19374 positioned at the start of the ELF object. Returns TRUE if no
19375 problems were encountered, FALSE otherwise. */
19376
19377 static bfd_boolean
19378 process_object (Filedata * filedata)
19379 {
19380 bfd_boolean have_separate_files;
19381 unsigned int i;
19382 bfd_boolean res = TRUE;
19383
19384 if (! get_file_header (filedata))
19385 {
19386 error (_("%s: Failed to read file header\n"), filedata->file_name);
19387 return FALSE;
19388 }
19389
19390 /* Initialise per file variables. */
19391 for (i = ARRAY_SIZE (version_info); i--;)
19392 version_info[i] = 0;
19393
19394 for (i = ARRAY_SIZE (dynamic_info); i--;)
19395 dynamic_info[i] = 0;
19396 dynamic_info_DT_GNU_HASH = 0;
19397
19398 /* Process the file. */
19399 if (show_name)
19400 printf (_("\nFile: %s\n"), filedata->file_name);
19401
19402 /* Initialise the dump_sects array from the cmdline_dump_sects array.
19403 Note we do this even if cmdline_dump_sects is empty because we
19404 must make sure that the dump_sets array is zeroed out before each
19405 object file is processed. */
19406 if (filedata->num_dump_sects > cmdline.num_dump_sects)
19407 memset (filedata->dump_sects, 0, filedata->num_dump_sects * sizeof (* filedata->dump_sects));
19408
19409 if (cmdline.num_dump_sects > 0)
19410 {
19411 if (filedata->num_dump_sects == 0)
19412 /* A sneaky way of allocating the dump_sects array. */
19413 request_dump_bynumber (filedata, cmdline.num_dump_sects, 0);
19414
19415 assert (filedata->num_dump_sects >= cmdline.num_dump_sects);
19416 memcpy (filedata->dump_sects, cmdline.dump_sects,
19417 cmdline.num_dump_sects * sizeof (* filedata->dump_sects));
19418 }
19419
19420 if (! process_file_header (filedata))
19421 return FALSE;
19422
19423 if (! process_section_headers (filedata))
19424 {
19425 /* Without loaded section headers we cannot process lots of things. */
19426 do_unwind = do_version = do_dump = do_arch = FALSE;
19427
19428 if (! do_using_dynamic)
19429 do_syms = do_dyn_syms = do_reloc = FALSE;
19430 }
19431
19432 if (! process_section_groups (filedata))
19433 /* Without loaded section groups we cannot process unwind. */
19434 do_unwind = FALSE;
19435
19436 if (process_program_headers (filedata))
19437 process_dynamic_section (filedata);
19438 else
19439 res = FALSE;
19440
19441 if (! process_relocs (filedata))
19442 res = FALSE;
19443
19444 if (! process_unwind (filedata))
19445 res = FALSE;
19446
19447 if (! process_symbol_table (filedata))
19448 res = FALSE;
19449
19450 if (! process_syminfo (filedata))
19451 res = FALSE;
19452
19453 if (! process_version_sections (filedata))
19454 res = FALSE;
19455
19456 if (filedata->file_header.e_shstrndx != SHN_UNDEF)
19457 have_separate_files = load_separate_debug_files (filedata, filedata->file_name);
19458 else
19459 have_separate_files = FALSE;
19460
19461 if (! process_section_contents (filedata))
19462 res = FALSE;
19463
19464 if (have_separate_files)
19465 {
19466 separate_info * d;
19467
19468 for (d = first_separate_info; d != NULL; d = d->next)
19469 {
19470 if (! process_section_headers (d->handle))
19471 res = FALSE;
19472 else if (! process_section_contents (d->handle))
19473 res = FALSE;
19474 }
19475
19476 /* The file handles are closed by the call to free_debug_memory() below. */
19477 }
19478
19479 if (! process_notes (filedata))
19480 res = FALSE;
19481
19482 if (! process_gnu_liblist (filedata))
19483 res = FALSE;
19484
19485 if (! process_arch_specific (filedata))
19486 res = FALSE;
19487
19488 free (filedata->program_headers);
19489 filedata->program_headers = NULL;
19490
19491 free (filedata->section_headers);
19492 filedata->section_headers = NULL;
19493
19494 free (filedata->string_table);
19495 filedata->string_table = NULL;
19496 filedata->string_table_length = 0;
19497
19498 if (dynamic_strings)
19499 {
19500 free (dynamic_strings);
19501 dynamic_strings = NULL;
19502 dynamic_strings_length = 0;
19503 }
19504
19505 if (dynamic_symbols)
19506 {
19507 free (dynamic_symbols);
19508 dynamic_symbols = NULL;
19509 num_dynamic_syms = 0;
19510 }
19511
19512 if (dynamic_syminfo)
19513 {
19514 free (dynamic_syminfo);
19515 dynamic_syminfo = NULL;
19516 }
19517
19518 if (dynamic_section)
19519 {
19520 free (dynamic_section);
19521 dynamic_section = NULL;
19522 }
19523
19524 if (section_headers_groups)
19525 {
19526 free (section_headers_groups);
19527 section_headers_groups = NULL;
19528 }
19529
19530 if (section_groups)
19531 {
19532 struct group_list * g;
19533 struct group_list * next;
19534
19535 for (i = 0; i < group_count; i++)
19536 {
19537 for (g = section_groups [i].root; g != NULL; g = next)
19538 {
19539 next = g->next;
19540 free (g);
19541 }
19542 }
19543
19544 free (section_groups);
19545 section_groups = NULL;
19546 }
19547
19548 free_debug_memory ();
19549
19550 return res;
19551 }
19552
19553 /* Process an ELF archive.
19554 On entry the file is positioned just after the ARMAG string.
19555 Returns TRUE upon success, FALSE otherwise. */
19556
19557 static bfd_boolean
19558 process_archive (Filedata * filedata, bfd_boolean is_thin_archive)
19559 {
19560 struct archive_info arch;
19561 struct archive_info nested_arch;
19562 size_t got;
19563 bfd_boolean ret = TRUE;
19564
19565 show_name = TRUE;
19566
19567 /* The ARCH structure is used to hold information about this archive. */
19568 arch.file_name = NULL;
19569 arch.file = NULL;
19570 arch.index_array = NULL;
19571 arch.sym_table = NULL;
19572 arch.longnames = NULL;
19573
19574 /* The NESTED_ARCH structure is used as a single-item cache of information
19575 about a nested archive (when members of a thin archive reside within
19576 another regular archive file). */
19577 nested_arch.file_name = NULL;
19578 nested_arch.file = NULL;
19579 nested_arch.index_array = NULL;
19580 nested_arch.sym_table = NULL;
19581 nested_arch.longnames = NULL;
19582
19583 if (setup_archive (&arch, filedata->file_name, filedata->handle,
19584 is_thin_archive, do_archive_index) != 0)
19585 {
19586 ret = FALSE;
19587 goto out;
19588 }
19589
19590 if (do_archive_index)
19591 {
19592 if (arch.sym_table == NULL)
19593 error (_("%s: unable to dump the index as none was found\n"), filedata->file_name);
19594 else
19595 {
19596 unsigned long i, l;
19597 unsigned long current_pos;
19598
19599 printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
19600 filedata->file_name, (unsigned long) arch.index_num, arch.sym_size);
19601
19602 current_pos = ftell (filedata->handle);
19603
19604 for (i = l = 0; i < arch.index_num; i++)
19605 {
19606 if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
19607 {
19608 char * member_name;
19609
19610 member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
19611
19612 if (member_name != NULL)
19613 {
19614 char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
19615
19616 if (qualified_name != NULL)
19617 {
19618 printf (_("Contents of binary %s at offset "), qualified_name);
19619 (void) print_vma (arch.index_array[i], PREFIX_HEX);
19620 putchar ('\n');
19621 free (qualified_name);
19622 }
19623 }
19624 }
19625
19626 if (l >= arch.sym_size)
19627 {
19628 error (_("%s: end of the symbol table reached before the end of the index\n"),
19629 filedata->file_name);
19630 ret = FALSE;
19631 break;
19632 }
19633 /* PR 17531: file: 0b6630b2. */
19634 printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
19635 l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
19636 }
19637
19638 if (arch.uses_64bit_indices)
19639 l = (l + 7) & ~ 7;
19640 else
19641 l += l & 1;
19642
19643 if (l < arch.sym_size)
19644 {
19645 error (ngettext ("%s: %ld byte remains in the symbol table, "
19646 "but without corresponding entries in "
19647 "the index table\n",
19648 "%s: %ld bytes remain in the symbol table, "
19649 "but without corresponding entries in "
19650 "the index table\n",
19651 arch.sym_size - l),
19652 filedata->file_name, arch.sym_size - l);
19653 ret = FALSE;
19654 }
19655
19656 if (fseek (filedata->handle, current_pos, SEEK_SET) != 0)
19657 {
19658 error (_("%s: failed to seek back to start of object files in the archive\n"),
19659 filedata->file_name);
19660 ret = FALSE;
19661 goto out;
19662 }
19663 }
19664
19665 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
19666 && !do_segments && !do_header && !do_dump && !do_version
19667 && !do_histogram && !do_debugging && !do_arch && !do_notes
19668 && !do_section_groups && !do_dyn_syms)
19669 {
19670 ret = TRUE; /* Archive index only. */
19671 goto out;
19672 }
19673 }
19674
19675 while (1)
19676 {
19677 char * name;
19678 size_t namelen;
19679 char * qualified_name;
19680
19681 /* Read the next archive header. */
19682 if (fseek (filedata->handle, arch.next_arhdr_offset, SEEK_SET) != 0)
19683 {
19684 error (_("%s: failed to seek to next archive header\n"), arch.file_name);
19685 return FALSE;
19686 }
19687 got = fread (&arch.arhdr, 1, sizeof arch.arhdr, filedata->handle);
19688 if (got != sizeof arch.arhdr)
19689 {
19690 if (got == 0)
19691 break;
19692 /* PR 24049 - we cannot use filedata->file_name as this will
19693 have already been freed. */
19694 error (_("%s: failed to read archive header\n"), arch.file_name);
19695
19696 ret = FALSE;
19697 break;
19698 }
19699 if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
19700 {
19701 error (_("%s: did not find a valid archive header\n"), arch.file_name);
19702 ret = FALSE;
19703 break;
19704 }
19705
19706 arch.next_arhdr_offset += sizeof arch.arhdr;
19707
19708 archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
19709 if (archive_file_size & 01)
19710 ++archive_file_size;
19711
19712 name = get_archive_member_name (&arch, &nested_arch);
19713 if (name == NULL)
19714 {
19715 error (_("%s: bad archive file name\n"), arch.file_name);
19716 ret = FALSE;
19717 break;
19718 }
19719 namelen = strlen (name);
19720
19721 qualified_name = make_qualified_name (&arch, &nested_arch, name);
19722 if (qualified_name == NULL)
19723 {
19724 error (_("%s: bad archive file name\n"), arch.file_name);
19725 ret = FALSE;
19726 break;
19727 }
19728
19729 if (is_thin_archive && arch.nested_member_origin == 0)
19730 {
19731 /* This is a proxy for an external member of a thin archive. */
19732 Filedata * member_filedata;
19733 char * member_file_name = adjust_relative_path
19734 (filedata->file_name, name, namelen);
19735
19736 if (member_file_name == NULL)
19737 {
19738 ret = FALSE;
19739 break;
19740 }
19741
19742 member_filedata = open_file (member_file_name);
19743 if (member_filedata == NULL)
19744 {
19745 error (_("Input file '%s' is not readable.\n"), member_file_name);
19746 free (member_file_name);
19747 ret = FALSE;
19748 break;
19749 }
19750
19751 archive_file_offset = arch.nested_member_origin;
19752 member_filedata->file_name = qualified_name;
19753
19754 if (! process_object (member_filedata))
19755 ret = FALSE;
19756
19757 close_file (member_filedata);
19758 free (member_file_name);
19759 }
19760 else if (is_thin_archive)
19761 {
19762 Filedata thin_filedata;
19763
19764 memset (&thin_filedata, 0, sizeof (thin_filedata));
19765
19766 /* PR 15140: Allow for corrupt thin archives. */
19767 if (nested_arch.file == NULL)
19768 {
19769 error (_("%s: contains corrupt thin archive: %s\n"),
19770 qualified_name, name);
19771 ret = FALSE;
19772 break;
19773 }
19774
19775 /* This is a proxy for a member of a nested archive. */
19776 archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
19777
19778 /* The nested archive file will have been opened and setup by
19779 get_archive_member_name. */
19780 if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
19781 {
19782 error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
19783 ret = FALSE;
19784 break;
19785 }
19786
19787 thin_filedata.handle = nested_arch.file;
19788 thin_filedata.file_name = qualified_name;
19789
19790 if (! process_object (& thin_filedata))
19791 ret = FALSE;
19792 }
19793 else
19794 {
19795 archive_file_offset = arch.next_arhdr_offset;
19796 arch.next_arhdr_offset += archive_file_size;
19797
19798 filedata->file_name = qualified_name;
19799 if (! process_object (filedata))
19800 ret = FALSE;
19801 }
19802
19803 if (filedata->dump_sects != NULL)
19804 {
19805 free (filedata->dump_sects);
19806 filedata->dump_sects = NULL;
19807 filedata->num_dump_sects = 0;
19808 }
19809
19810 free (qualified_name);
19811 }
19812
19813 out:
19814 if (nested_arch.file != NULL)
19815 fclose (nested_arch.file);
19816 release_archive (&nested_arch);
19817 release_archive (&arch);
19818
19819 return ret;
19820 }
19821
19822 static bfd_boolean
19823 process_file (char * file_name)
19824 {
19825 Filedata * filedata = NULL;
19826 struct stat statbuf;
19827 char armag[SARMAG];
19828 bfd_boolean ret = TRUE;
19829
19830 if (stat (file_name, &statbuf) < 0)
19831 {
19832 if (errno == ENOENT)
19833 error (_("'%s': No such file\n"), file_name);
19834 else
19835 error (_("Could not locate '%s'. System error message: %s\n"),
19836 file_name, strerror (errno));
19837 return FALSE;
19838 }
19839
19840 if (! S_ISREG (statbuf.st_mode))
19841 {
19842 error (_("'%s' is not an ordinary file\n"), file_name);
19843 return FALSE;
19844 }
19845
19846 filedata = calloc (1, sizeof * filedata);
19847 if (filedata == NULL)
19848 {
19849 error (_("Out of memory allocating file data structure\n"));
19850 return FALSE;
19851 }
19852
19853 filedata->file_name = file_name;
19854 filedata->handle = fopen (file_name, "rb");
19855 if (filedata->handle == NULL)
19856 {
19857 error (_("Input file '%s' is not readable.\n"), file_name);
19858 free (filedata);
19859 return FALSE;
19860 }
19861
19862 if (fread (armag, SARMAG, 1, filedata->handle) != 1)
19863 {
19864 error (_("%s: Failed to read file's magic number\n"), file_name);
19865 fclose (filedata->handle);
19866 free (filedata);
19867 return FALSE;
19868 }
19869
19870 filedata->file_size = (bfd_size_type) statbuf.st_size;
19871
19872 if (memcmp (armag, ARMAG, SARMAG) == 0)
19873 {
19874 if (! process_archive (filedata, FALSE))
19875 ret = FALSE;
19876 }
19877 else if (memcmp (armag, ARMAGT, SARMAG) == 0)
19878 {
19879 if ( ! process_archive (filedata, TRUE))
19880 ret = FALSE;
19881 }
19882 else
19883 {
19884 if (do_archive_index)
19885 error (_("File %s is not an archive so its index cannot be displayed.\n"),
19886 file_name);
19887
19888 rewind (filedata->handle);
19889 archive_file_size = archive_file_offset = 0;
19890
19891 if (! process_object (filedata))
19892 ret = FALSE;
19893 }
19894
19895 fclose (filedata->handle);
19896 free (filedata);
19897
19898 return ret;
19899 }
19900
19901 #ifdef SUPPORT_DISASSEMBLY
19902 /* Needed by the i386 disassembler. For extra credit, someone could
19903 fix this so that we insert symbolic addresses here, esp for GOT/PLT
19904 symbols. */
19905
19906 void
19907 print_address (unsigned int addr, FILE * outfile)
19908 {
19909 fprintf (outfile,"0x%8.8x", addr);
19910 }
19911
19912 /* Needed by the i386 disassembler. */
19913
19914 void
19915 db_task_printsym (unsigned int addr)
19916 {
19917 print_address (addr, stderr);
19918 }
19919 #endif
19920
19921 int
19922 main (int argc, char ** argv)
19923 {
19924 int err;
19925
19926 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
19927 setlocale (LC_MESSAGES, "");
19928 #endif
19929 #if defined (HAVE_SETLOCALE)
19930 setlocale (LC_CTYPE, "");
19931 #endif
19932 bindtextdomain (PACKAGE, LOCALEDIR);
19933 textdomain (PACKAGE);
19934
19935 expandargv (&argc, &argv);
19936
19937 cmdline.file_name = "<cmdline>";
19938 parse_args (& cmdline, argc, argv);
19939
19940 if (optind < (argc - 1))
19941 show_name = TRUE;
19942 else if (optind >= argc)
19943 {
19944 warn (_("Nothing to do.\n"));
19945 usage (stderr);
19946 }
19947
19948 err = FALSE;
19949 while (optind < argc)
19950 if (! process_file (argv[optind++]))
19951 err = TRUE;
19952
19953 if (cmdline.dump_sects != NULL)
19954 free (cmdline.dump_sects);
19955
19956 return err ? EXIT_FAILURE : EXIT_SUCCESS;
19957 }