]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - binutils/readelf.c
[MIPS] Add Loongson 3A1000 proccessor support.
[thirdparty/binutils-gdb.git] / binutils / readelf.c
1 /* readelf.c -- display contents of an ELF format file
2 Copyright (C) 1998-2018 Free Software Foundation, Inc.
3
4 Originally developed by Eric Youngdale <eric@andante.jic.com>
5 Modifications by Nick Clifton <nickc@redhat.com>
6
7 This file is part of GNU Binutils.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
22 02110-1301, USA. */
23 \f
24 /* The difference between readelf and objdump:
25
26 Both programs are capable of displaying the contents of ELF format files,
27 so why does the binutils project have two file dumpers ?
28
29 The reason is that objdump sees an ELF file through a BFD filter of the
30 world; if BFD has a bug where, say, it disagrees about a machine constant
31 in e_flags, then the odds are good that it will remain internally
32 consistent. The linker sees it the BFD way, objdump sees it the BFD way,
33 GAS sees it the BFD way. There was need for a tool to go find out what
34 the file actually says.
35
36 This is why the readelf program does not link against the BFD library - it
37 exists as an independent program to help verify the correct working of BFD.
38
39 There is also the case that readelf can provide more information about an
40 ELF file than is provided by objdump. In particular it can display DWARF
41 debugging information which (at the moment) objdump cannot. */
42 \f
43 #include "sysdep.h"
44 #include <assert.h>
45 #include <time.h>
46 #include <zlib.h>
47 #ifdef HAVE_WCHAR_H
48 #include <wchar.h>
49 #endif
50
51 #if __GNUC__ >= 2
52 /* Define BFD64 here, even if our default architecture is 32 bit ELF
53 as this will allow us to read in and parse 64bit and 32bit ELF files.
54 Only do this if we believe that the compiler can support a 64 bit
55 data type. For now we only rely on GCC being able to do this. */
56 #define BFD64
57 #endif
58
59 #include "bfd.h"
60 #include "bucomm.h"
61 #include "elfcomm.h"
62 #include "dwarf.h"
63
64 #include "elf/common.h"
65 #include "elf/external.h"
66 #include "elf/internal.h"
67
68
69 /* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
70 we can obtain the H8 reloc numbers. We need these for the
71 get_reloc_size() function. We include h8.h again after defining
72 RELOC_MACROS_GEN_FUNC so that we get the naming function as well. */
73
74 #include "elf/h8.h"
75 #undef _ELF_H8_H
76
77 /* Undo the effects of #including reloc-macros.h. */
78
79 #undef START_RELOC_NUMBERS
80 #undef RELOC_NUMBER
81 #undef FAKE_RELOC
82 #undef EMPTY_RELOC
83 #undef END_RELOC_NUMBERS
84 #undef _RELOC_MACROS_H
85
86 /* The following headers use the elf/reloc-macros.h file to
87 automatically generate relocation recognition functions
88 such as elf_mips_reloc_type() */
89
90 #define RELOC_MACROS_GEN_FUNC
91
92 #include "elf/aarch64.h"
93 #include "elf/alpha.h"
94 #include "elf/arc.h"
95 #include "elf/arm.h"
96 #include "elf/avr.h"
97 #include "elf/bfin.h"
98 #include "elf/cr16.h"
99 #include "elf/cris.h"
100 #include "elf/crx.h"
101 #include "elf/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 chekers (eg valgrind, address sanitizer) by not
402 attempting to allocate memory when the read is bound to fail. */
403 if (amt > filedata->file_size
404 || offset + archive_file_offset + amt > filedata->file_size)
405 {
406 if (reason)
407 error (_("Reading %s bytes extends past end of file for %s\n"),
408 bfd_vmatoa ("u", amt), reason);
409 return NULL;
410 }
411
412 if (fseek (filedata->handle, archive_file_offset + offset, SEEK_SET))
413 {
414 if (reason)
415 error (_("Unable to seek to 0x%lx for %s\n"),
416 archive_file_offset + offset, reason);
417 return NULL;
418 }
419
420 mvar = var;
421 if (mvar == NULL)
422 {
423 /* Check for overflow. */
424 if (nmemb < (~(bfd_size_type) 0 - 1) / size)
425 /* + 1 so that we can '\0' terminate invalid string table sections. */
426 mvar = malloc ((size_t) amt + 1);
427
428 if (mvar == NULL)
429 {
430 if (reason)
431 error (_("Out of memory allocating %s bytes for %s\n"),
432 bfd_vmatoa ("u", amt), reason);
433 return NULL;
434 }
435
436 ((char *) mvar)[amt] = '\0';
437 }
438
439 if (fread (mvar, (size_t) size, (size_t) nmemb, filedata->handle) != nmemb)
440 {
441 if (reason)
442 error (_("Unable to read in %s bytes of %s\n"),
443 bfd_vmatoa ("u", amt), reason);
444 if (mvar != var)
445 free (mvar);
446 return NULL;
447 }
448
449 return mvar;
450 }
451
452 /* Print a VMA value in the MODE specified.
453 Returns the number of characters displayed. */
454
455 static unsigned int
456 print_vma (bfd_vma vma, print_mode mode)
457 {
458 unsigned int nc = 0;
459
460 switch (mode)
461 {
462 case FULL_HEX:
463 nc = printf ("0x");
464 /* Fall through. */
465 case LONG_HEX:
466 #ifdef BFD64
467 if (is_32bit_elf)
468 return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
469 #endif
470 printf_vma (vma);
471 return nc + 16;
472
473 case DEC_5:
474 if (vma <= 99999)
475 return printf ("%5" BFD_VMA_FMT "d", vma);
476 /* Fall through. */
477 case PREFIX_HEX:
478 nc = printf ("0x");
479 /* Fall through. */
480 case HEX:
481 return nc + printf ("%" BFD_VMA_FMT "x", vma);
482
483 case DEC:
484 return printf ("%" BFD_VMA_FMT "d", vma);
485
486 case UNSIGNED:
487 return printf ("%" BFD_VMA_FMT "u", vma);
488
489 default:
490 /* FIXME: Report unrecognised mode ? */
491 return 0;
492 }
493 }
494
495 /* Display a symbol on stdout. Handles the display of control characters and
496 multibye characters (assuming the host environment supports them).
497
498 Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
499
500 If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
501 padding as necessary.
502
503 Returns the number of emitted characters. */
504
505 static unsigned int
506 print_symbol (signed int width, const char *symbol)
507 {
508 bfd_boolean extra_padding = FALSE;
509 signed int num_printed = 0;
510 #ifdef HAVE_MBSTATE_T
511 mbstate_t state;
512 #endif
513 unsigned int width_remaining;
514
515 if (width < 0)
516 {
517 /* Keep the width positive. This helps the code below. */
518 width = - width;
519 extra_padding = TRUE;
520 }
521 else if (width == 0)
522 return 0;
523
524 if (do_wide)
525 /* Set the remaining width to a very large value.
526 This simplifies the code below. */
527 width_remaining = INT_MAX;
528 else
529 width_remaining = width;
530
531 #ifdef HAVE_MBSTATE_T
532 /* Initialise the multibyte conversion state. */
533 memset (& state, 0, sizeof (state));
534 #endif
535
536 while (width_remaining)
537 {
538 size_t n;
539 const char c = *symbol++;
540
541 if (c == 0)
542 break;
543
544 /* Do not print control characters directly as they can affect terminal
545 settings. Such characters usually appear in the names generated
546 by the assembler for local labels. */
547 if (ISCNTRL (c))
548 {
549 if (width_remaining < 2)
550 break;
551
552 printf ("^%c", c + 0x40);
553 width_remaining -= 2;
554 num_printed += 2;
555 }
556 else if (ISPRINT (c))
557 {
558 putchar (c);
559 width_remaining --;
560 num_printed ++;
561 }
562 else
563 {
564 #ifdef HAVE_MBSTATE_T
565 wchar_t w;
566 #endif
567 /* Let printf do the hard work of displaying multibyte characters. */
568 printf ("%.1s", symbol - 1);
569 width_remaining --;
570 num_printed ++;
571
572 #ifdef HAVE_MBSTATE_T
573 /* Try to find out how many bytes made up the character that was
574 just printed. Advance the symbol pointer past the bytes that
575 were displayed. */
576 n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
577 #else
578 n = 1;
579 #endif
580 if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
581 symbol += (n - 1);
582 }
583 }
584
585 if (extra_padding && num_printed < width)
586 {
587 /* Fill in the remaining spaces. */
588 printf ("%-*s", width - num_printed, " ");
589 num_printed = width;
590 }
591
592 return num_printed;
593 }
594
595 /* Returns a pointer to a static buffer containing a printable version of
596 the given section's name. Like print_symbol, except that it does not try
597 to print multibyte characters, it just interprets them as hex values. */
598
599 static const char *
600 printable_section_name (Filedata * filedata, const Elf_Internal_Shdr * sec)
601 {
602 #define MAX_PRINT_SEC_NAME_LEN 128
603 static char sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
604 const char * name = SECTION_NAME (sec);
605 char * buf = sec_name_buf;
606 char c;
607 unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
608
609 while ((c = * name ++) != 0)
610 {
611 if (ISCNTRL (c))
612 {
613 if (remaining < 2)
614 break;
615
616 * buf ++ = '^';
617 * buf ++ = c + 0x40;
618 remaining -= 2;
619 }
620 else if (ISPRINT (c))
621 {
622 * buf ++ = c;
623 remaining -= 1;
624 }
625 else
626 {
627 static char hex[17] = "0123456789ABCDEF";
628
629 if (remaining < 4)
630 break;
631 * buf ++ = '<';
632 * buf ++ = hex[(c & 0xf0) >> 4];
633 * buf ++ = hex[c & 0x0f];
634 * buf ++ = '>';
635 remaining -= 4;
636 }
637
638 if (remaining == 0)
639 break;
640 }
641
642 * buf = 0;
643 return sec_name_buf;
644 }
645
646 static const char *
647 printable_section_name_from_index (Filedata * filedata, unsigned long ndx)
648 {
649 if (ndx >= filedata->file_header.e_shnum)
650 return _("<corrupt>");
651
652 return printable_section_name (filedata, filedata->section_headers + ndx);
653 }
654
655 /* Return a pointer to section NAME, or NULL if no such section exists. */
656
657 static Elf_Internal_Shdr *
658 find_section (Filedata * filedata, const char * name)
659 {
660 unsigned int i;
661
662 if (filedata->section_headers == NULL)
663 return NULL;
664
665 for (i = 0; i < filedata->file_header.e_shnum; i++)
666 if (streq (SECTION_NAME (filedata->section_headers + i), name))
667 return filedata->section_headers + i;
668
669 return NULL;
670 }
671
672 /* Return a pointer to a section containing ADDR, or NULL if no such
673 section exists. */
674
675 static Elf_Internal_Shdr *
676 find_section_by_address (Filedata * filedata, bfd_vma addr)
677 {
678 unsigned int i;
679
680 if (filedata->section_headers == NULL)
681 return NULL;
682
683 for (i = 0; i < filedata->file_header.e_shnum; i++)
684 {
685 Elf_Internal_Shdr *sec = filedata->section_headers + i;
686
687 if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
688 return sec;
689 }
690
691 return NULL;
692 }
693
694 static Elf_Internal_Shdr *
695 find_section_by_type (Filedata * filedata, unsigned int type)
696 {
697 unsigned int i;
698
699 if (filedata->section_headers == NULL)
700 return NULL;
701
702 for (i = 0; i < filedata->file_header.e_shnum; i++)
703 {
704 Elf_Internal_Shdr *sec = filedata->section_headers + i;
705
706 if (sec->sh_type == type)
707 return sec;
708 }
709
710 return NULL;
711 }
712
713 /* Return a pointer to section NAME, or NULL if no such section exists,
714 restricted to the list of sections given in SET. */
715
716 static Elf_Internal_Shdr *
717 find_section_in_set (Filedata * filedata, const char * name, unsigned int * set)
718 {
719 unsigned int i;
720
721 if (filedata->section_headers == NULL)
722 return NULL;
723
724 if (set != NULL)
725 {
726 while ((i = *set++) > 0)
727 {
728 /* See PR 21156 for a reproducer. */
729 if (i >= filedata->file_header.e_shnum)
730 continue; /* FIXME: Should we issue an error message ? */
731
732 if (streq (SECTION_NAME (filedata->section_headers + i), name))
733 return filedata->section_headers + i;
734 }
735 }
736
737 return find_section (filedata, name);
738 }
739
740 /* Read an unsigned LEB128 encoded value from DATA.
741 Set *LENGTH_RETURN to the number of bytes read. */
742
743 static inline unsigned long
744 read_uleb128 (unsigned char * data,
745 unsigned int * length_return,
746 const unsigned char * const end)
747 {
748 return read_leb128 (data, length_return, FALSE, end);
749 }
750
751 /* Return TRUE if the current file is for IA-64 machine and OpenVMS ABI.
752 This OS has so many departures from the ELF standard that we test it at
753 many places. */
754
755 static inline bfd_boolean
756 is_ia64_vms (Filedata * filedata)
757 {
758 return filedata->file_header.e_machine == EM_IA_64
759 && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
760 }
761
762 /* Guess the relocation size commonly used by the specific machines. */
763
764 static bfd_boolean
765 guess_is_rela (unsigned int e_machine)
766 {
767 switch (e_machine)
768 {
769 /* Targets that use REL relocations. */
770 case EM_386:
771 case EM_IAMCU:
772 case EM_960:
773 case EM_ARM:
774 case EM_D10V:
775 case EM_CYGNUS_D10V:
776 case EM_DLX:
777 case EM_MIPS:
778 case EM_MIPS_RS3_LE:
779 case EM_CYGNUS_M32R:
780 case EM_SCORE:
781 case EM_XGATE:
782 case EM_NFP:
783 return FALSE;
784
785 /* Targets that use RELA relocations. */
786 case EM_68K:
787 case EM_860:
788 case EM_AARCH64:
789 case EM_ADAPTEVA_EPIPHANY:
790 case EM_ALPHA:
791 case EM_ALTERA_NIOS2:
792 case EM_ARC:
793 case EM_ARC_COMPACT:
794 case EM_ARC_COMPACT2:
795 case EM_AVR:
796 case EM_AVR_OLD:
797 case EM_BLACKFIN:
798 case EM_CR16:
799 case EM_CRIS:
800 case EM_CRX:
801 case EM_CSKY:
802 case EM_D30V:
803 case EM_CYGNUS_D30V:
804 case EM_FR30:
805 case EM_FT32:
806 case EM_CYGNUS_FR30:
807 case EM_CYGNUS_FRV:
808 case EM_H8S:
809 case EM_H8_300:
810 case EM_H8_300H:
811 case EM_IA_64:
812 case EM_IP2K:
813 case EM_IP2K_OLD:
814 case EM_IQ2000:
815 case EM_LATTICEMICO32:
816 case EM_M32C_OLD:
817 case EM_M32C:
818 case EM_M32R:
819 case EM_MCORE:
820 case EM_CYGNUS_MEP:
821 case EM_METAG:
822 case EM_MMIX:
823 case EM_MN10200:
824 case EM_CYGNUS_MN10200:
825 case EM_MN10300:
826 case EM_CYGNUS_MN10300:
827 case EM_MOXIE:
828 case EM_MSP430:
829 case EM_MSP430_OLD:
830 case EM_MT:
831 case EM_NDS32:
832 case EM_NIOS32:
833 case EM_OR1K:
834 case EM_PPC64:
835 case EM_PPC:
836 case EM_TI_PRU:
837 case EM_RISCV:
838 case EM_RL78:
839 case EM_RX:
840 case EM_S390:
841 case EM_S390_OLD:
842 case EM_SH:
843 case EM_SPARC:
844 case EM_SPARC32PLUS:
845 case EM_SPARCV9:
846 case EM_SPU:
847 case EM_TI_C6000:
848 case EM_TILEGX:
849 case EM_TILEPRO:
850 case EM_V800:
851 case EM_V850:
852 case EM_CYGNUS_V850:
853 case EM_VAX:
854 case EM_VISIUM:
855 case EM_X86_64:
856 case EM_L1OM:
857 case EM_K1OM:
858 case EM_XSTORMY16:
859 case EM_XTENSA:
860 case EM_XTENSA_OLD:
861 case EM_MICROBLAZE:
862 case EM_MICROBLAZE_OLD:
863 case EM_WEBASSEMBLY:
864 return TRUE;
865
866 case EM_68HC05:
867 case EM_68HC08:
868 case EM_68HC11:
869 case EM_68HC16:
870 case EM_FX66:
871 case EM_ME16:
872 case EM_MMA:
873 case EM_NCPU:
874 case EM_NDR1:
875 case EM_PCP:
876 case EM_ST100:
877 case EM_ST19:
878 case EM_ST7:
879 case EM_ST9PLUS:
880 case EM_STARCORE:
881 case EM_SVX:
882 case EM_TINYJ:
883 default:
884 warn (_("Don't know about relocations on this machine architecture\n"));
885 return FALSE;
886 }
887 }
888
889 /* Load RELA type relocations from FILEDATA at REL_OFFSET extending for REL_SIZE bytes.
890 Returns TRUE upon success, FALSE otherwise. If successful then a
891 pointer to a malloc'ed buffer containing the relocs is placed in *RELASP,
892 and the number of relocs loaded is placed in *NRELASP. It is the caller's
893 responsibility to free the allocated buffer. */
894
895 static bfd_boolean
896 slurp_rela_relocs (Filedata * filedata,
897 unsigned long rel_offset,
898 unsigned long rel_size,
899 Elf_Internal_Rela ** relasp,
900 unsigned long * nrelasp)
901 {
902 Elf_Internal_Rela * relas;
903 size_t nrelas;
904 unsigned int i;
905
906 if (is_32bit_elf)
907 {
908 Elf32_External_Rela * erelas;
909
910 erelas = (Elf32_External_Rela *) get_data (NULL, filedata, rel_offset, 1,
911 rel_size, _("32-bit relocation data"));
912 if (!erelas)
913 return FALSE;
914
915 nrelas = rel_size / sizeof (Elf32_External_Rela);
916
917 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
918 sizeof (Elf_Internal_Rela));
919
920 if (relas == NULL)
921 {
922 free (erelas);
923 error (_("out of memory parsing relocs\n"));
924 return FALSE;
925 }
926
927 for (i = 0; i < nrelas; i++)
928 {
929 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
930 relas[i].r_info = BYTE_GET (erelas[i].r_info);
931 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
932 }
933
934 free (erelas);
935 }
936 else
937 {
938 Elf64_External_Rela * erelas;
939
940 erelas = (Elf64_External_Rela *) get_data (NULL, filedata, rel_offset, 1,
941 rel_size, _("64-bit relocation data"));
942 if (!erelas)
943 return FALSE;
944
945 nrelas = rel_size / sizeof (Elf64_External_Rela);
946
947 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
948 sizeof (Elf_Internal_Rela));
949
950 if (relas == NULL)
951 {
952 free (erelas);
953 error (_("out of memory parsing relocs\n"));
954 return FALSE;
955 }
956
957 for (i = 0; i < nrelas; i++)
958 {
959 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
960 relas[i].r_info = BYTE_GET (erelas[i].r_info);
961 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
962
963 /* The #ifdef BFD64 below is to prevent a compile time
964 warning. We know that if we do not have a 64 bit data
965 type that we will never execute this code anyway. */
966 #ifdef BFD64
967 if (filedata->file_header.e_machine == EM_MIPS
968 && filedata->file_header.e_ident[EI_DATA] != ELFDATA2MSB)
969 {
970 /* In little-endian objects, r_info isn't really a
971 64-bit little-endian value: it has a 32-bit
972 little-endian symbol index followed by four
973 individual byte fields. Reorder INFO
974 accordingly. */
975 bfd_vma inf = relas[i].r_info;
976 inf = (((inf & 0xffffffff) << 32)
977 | ((inf >> 56) & 0xff)
978 | ((inf >> 40) & 0xff00)
979 | ((inf >> 24) & 0xff0000)
980 | ((inf >> 8) & 0xff000000));
981 relas[i].r_info = inf;
982 }
983 #endif /* BFD64 */
984 }
985
986 free (erelas);
987 }
988
989 *relasp = relas;
990 *nrelasp = nrelas;
991 return TRUE;
992 }
993
994 /* Load REL type relocations from FILEDATA at REL_OFFSET extending for REL_SIZE bytes.
995 Returns TRUE upon success, FALSE otherwise. If successful then a
996 pointer to a malloc'ed buffer containing the relocs is placed in *RELSP,
997 and the number of relocs loaded is placed in *NRELSP. It is the caller's
998 responsibility to free the allocated buffer. */
999
1000 static bfd_boolean
1001 slurp_rel_relocs (Filedata * filedata,
1002 unsigned long rel_offset,
1003 unsigned long rel_size,
1004 Elf_Internal_Rela ** relsp,
1005 unsigned long * nrelsp)
1006 {
1007 Elf_Internal_Rela * rels;
1008 size_t nrels;
1009 unsigned int i;
1010
1011 if (is_32bit_elf)
1012 {
1013 Elf32_External_Rel * erels;
1014
1015 erels = (Elf32_External_Rel *) get_data (NULL, filedata, rel_offset, 1,
1016 rel_size, _("32-bit relocation data"));
1017 if (!erels)
1018 return FALSE;
1019
1020 nrels = rel_size / sizeof (Elf32_External_Rel);
1021
1022 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
1023
1024 if (rels == NULL)
1025 {
1026 free (erels);
1027 error (_("out of memory parsing relocs\n"));
1028 return FALSE;
1029 }
1030
1031 for (i = 0; i < nrels; i++)
1032 {
1033 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
1034 rels[i].r_info = BYTE_GET (erels[i].r_info);
1035 rels[i].r_addend = 0;
1036 }
1037
1038 free (erels);
1039 }
1040 else
1041 {
1042 Elf64_External_Rel * erels;
1043
1044 erels = (Elf64_External_Rel *) get_data (NULL, filedata, rel_offset, 1,
1045 rel_size, _("64-bit relocation data"));
1046 if (!erels)
1047 return FALSE;
1048
1049 nrels = rel_size / sizeof (Elf64_External_Rel);
1050
1051 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
1052
1053 if (rels == NULL)
1054 {
1055 free (erels);
1056 error (_("out of memory parsing relocs\n"));
1057 return FALSE;
1058 }
1059
1060 for (i = 0; i < nrels; i++)
1061 {
1062 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
1063 rels[i].r_info = BYTE_GET (erels[i].r_info);
1064 rels[i].r_addend = 0;
1065
1066 /* The #ifdef BFD64 below is to prevent a compile time
1067 warning. We know that if we do not have a 64 bit data
1068 type that we will never execute this code anyway. */
1069 #ifdef BFD64
1070 if (filedata->file_header.e_machine == EM_MIPS
1071 && filedata->file_header.e_ident[EI_DATA] != ELFDATA2MSB)
1072 {
1073 /* In little-endian objects, r_info isn't really a
1074 64-bit little-endian value: it has a 32-bit
1075 little-endian symbol index followed by four
1076 individual byte fields. Reorder INFO
1077 accordingly. */
1078 bfd_vma inf = rels[i].r_info;
1079 inf = (((inf & 0xffffffff) << 32)
1080 | ((inf >> 56) & 0xff)
1081 | ((inf >> 40) & 0xff00)
1082 | ((inf >> 24) & 0xff0000)
1083 | ((inf >> 8) & 0xff000000));
1084 rels[i].r_info = inf;
1085 }
1086 #endif /* BFD64 */
1087 }
1088
1089 free (erels);
1090 }
1091
1092 *relsp = rels;
1093 *nrelsp = nrels;
1094 return TRUE;
1095 }
1096
1097 /* Returns the reloc type extracted from the reloc info field. */
1098
1099 static unsigned int
1100 get_reloc_type (Filedata * filedata, bfd_vma reloc_info)
1101 {
1102 if (is_32bit_elf)
1103 return ELF32_R_TYPE (reloc_info);
1104
1105 switch (filedata->file_header.e_machine)
1106 {
1107 case EM_MIPS:
1108 /* Note: We assume that reloc_info has already been adjusted for us. */
1109 return ELF64_MIPS_R_TYPE (reloc_info);
1110
1111 case EM_SPARCV9:
1112 return ELF64_R_TYPE_ID (reloc_info);
1113
1114 default:
1115 return ELF64_R_TYPE (reloc_info);
1116 }
1117 }
1118
1119 /* Return the symbol index extracted from the reloc info field. */
1120
1121 static bfd_vma
1122 get_reloc_symindex (bfd_vma reloc_info)
1123 {
1124 return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
1125 }
1126
1127 static inline bfd_boolean
1128 uses_msp430x_relocs (Filedata * filedata)
1129 {
1130 return
1131 filedata->file_header.e_machine == EM_MSP430 /* Paranoia. */
1132 /* GCC uses osabi == ELFOSBI_STANDALONE. */
1133 && (((filedata->file_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
1134 /* TI compiler uses ELFOSABI_NONE. */
1135 || (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
1136 }
1137
1138 /* Display the contents of the relocation data found at the specified
1139 offset. */
1140
1141 static bfd_boolean
1142 dump_relocations (Filedata * filedata,
1143 unsigned long rel_offset,
1144 unsigned long rel_size,
1145 Elf_Internal_Sym * symtab,
1146 unsigned long nsyms,
1147 char * strtab,
1148 unsigned long strtablen,
1149 int is_rela,
1150 bfd_boolean is_dynsym)
1151 {
1152 unsigned long i;
1153 Elf_Internal_Rela * rels;
1154 bfd_boolean res = TRUE;
1155
1156 if (is_rela == UNKNOWN)
1157 is_rela = guess_is_rela (filedata->file_header.e_machine);
1158
1159 if (is_rela)
1160 {
1161 if (!slurp_rela_relocs (filedata, rel_offset, rel_size, &rels, &rel_size))
1162 return FALSE;
1163 }
1164 else
1165 {
1166 if (!slurp_rel_relocs (filedata, rel_offset, rel_size, &rels, &rel_size))
1167 return FALSE;
1168 }
1169
1170 if (is_32bit_elf)
1171 {
1172 if (is_rela)
1173 {
1174 if (do_wide)
1175 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
1176 else
1177 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
1178 }
1179 else
1180 {
1181 if (do_wide)
1182 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
1183 else
1184 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
1185 }
1186 }
1187 else
1188 {
1189 if (is_rela)
1190 {
1191 if (do_wide)
1192 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
1193 else
1194 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
1195 }
1196 else
1197 {
1198 if (do_wide)
1199 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
1200 else
1201 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
1202 }
1203 }
1204
1205 for (i = 0; i < rel_size; i++)
1206 {
1207 const char * rtype;
1208 bfd_vma offset;
1209 bfd_vma inf;
1210 bfd_vma symtab_index;
1211 bfd_vma type;
1212
1213 offset = rels[i].r_offset;
1214 inf = rels[i].r_info;
1215
1216 type = get_reloc_type (filedata, inf);
1217 symtab_index = get_reloc_symindex (inf);
1218
1219 if (is_32bit_elf)
1220 {
1221 printf ("%8.8lx %8.8lx ",
1222 (unsigned long) offset & 0xffffffff,
1223 (unsigned long) inf & 0xffffffff);
1224 }
1225 else
1226 {
1227 #if BFD_HOST_64BIT_LONG
1228 printf (do_wide
1229 ? "%16.16lx %16.16lx "
1230 : "%12.12lx %12.12lx ",
1231 offset, inf);
1232 #elif BFD_HOST_64BIT_LONG_LONG
1233 #ifndef __MSVCRT__
1234 printf (do_wide
1235 ? "%16.16llx %16.16llx "
1236 : "%12.12llx %12.12llx ",
1237 offset, inf);
1238 #else
1239 printf (do_wide
1240 ? "%16.16I64x %16.16I64x "
1241 : "%12.12I64x %12.12I64x ",
1242 offset, inf);
1243 #endif
1244 #else
1245 printf (do_wide
1246 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1247 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
1248 _bfd_int64_high (offset),
1249 _bfd_int64_low (offset),
1250 _bfd_int64_high (inf),
1251 _bfd_int64_low (inf));
1252 #endif
1253 }
1254
1255 switch (filedata->file_header.e_machine)
1256 {
1257 default:
1258 rtype = NULL;
1259 break;
1260
1261 case EM_AARCH64:
1262 rtype = elf_aarch64_reloc_type (type);
1263 break;
1264
1265 case EM_M32R:
1266 case EM_CYGNUS_M32R:
1267 rtype = elf_m32r_reloc_type (type);
1268 break;
1269
1270 case EM_386:
1271 case EM_IAMCU:
1272 rtype = elf_i386_reloc_type (type);
1273 break;
1274
1275 case EM_68HC11:
1276 case EM_68HC12:
1277 rtype = elf_m68hc11_reloc_type (type);
1278 break;
1279
1280 case EM_S12Z:
1281 rtype = elf_s12z_reloc_type (type);
1282 break;
1283
1284 case EM_68K:
1285 rtype = elf_m68k_reloc_type (type);
1286 break;
1287
1288 case EM_960:
1289 rtype = elf_i960_reloc_type (type);
1290 break;
1291
1292 case EM_AVR:
1293 case EM_AVR_OLD:
1294 rtype = elf_avr_reloc_type (type);
1295 break;
1296
1297 case EM_OLD_SPARCV9:
1298 case EM_SPARC32PLUS:
1299 case EM_SPARCV9:
1300 case EM_SPARC:
1301 rtype = elf_sparc_reloc_type (type);
1302 break;
1303
1304 case EM_SPU:
1305 rtype = elf_spu_reloc_type (type);
1306 break;
1307
1308 case EM_V800:
1309 rtype = v800_reloc_type (type);
1310 break;
1311 case EM_V850:
1312 case EM_CYGNUS_V850:
1313 rtype = v850_reloc_type (type);
1314 break;
1315
1316 case EM_D10V:
1317 case EM_CYGNUS_D10V:
1318 rtype = elf_d10v_reloc_type (type);
1319 break;
1320
1321 case EM_D30V:
1322 case EM_CYGNUS_D30V:
1323 rtype = elf_d30v_reloc_type (type);
1324 break;
1325
1326 case EM_DLX:
1327 rtype = elf_dlx_reloc_type (type);
1328 break;
1329
1330 case EM_SH:
1331 rtype = elf_sh_reloc_type (type);
1332 break;
1333
1334 case EM_MN10300:
1335 case EM_CYGNUS_MN10300:
1336 rtype = elf_mn10300_reloc_type (type);
1337 break;
1338
1339 case EM_MN10200:
1340 case EM_CYGNUS_MN10200:
1341 rtype = elf_mn10200_reloc_type (type);
1342 break;
1343
1344 case EM_FR30:
1345 case EM_CYGNUS_FR30:
1346 rtype = elf_fr30_reloc_type (type);
1347 break;
1348
1349 case EM_CYGNUS_FRV:
1350 rtype = elf_frv_reloc_type (type);
1351 break;
1352
1353 case EM_CSKY:
1354 rtype = elf_csky_reloc_type (type);
1355 break;
1356
1357 case EM_FT32:
1358 rtype = elf_ft32_reloc_type (type);
1359 break;
1360
1361 case EM_MCORE:
1362 rtype = elf_mcore_reloc_type (type);
1363 break;
1364
1365 case EM_MMIX:
1366 rtype = elf_mmix_reloc_type (type);
1367 break;
1368
1369 case EM_MOXIE:
1370 rtype = elf_moxie_reloc_type (type);
1371 break;
1372
1373 case EM_MSP430:
1374 if (uses_msp430x_relocs (filedata))
1375 {
1376 rtype = elf_msp430x_reloc_type (type);
1377 break;
1378 }
1379 /* Fall through. */
1380 case EM_MSP430_OLD:
1381 rtype = elf_msp430_reloc_type (type);
1382 break;
1383
1384 case EM_NDS32:
1385 rtype = elf_nds32_reloc_type (type);
1386 break;
1387
1388 case EM_PPC:
1389 rtype = elf_ppc_reloc_type (type);
1390 break;
1391
1392 case EM_PPC64:
1393 rtype = elf_ppc64_reloc_type (type);
1394 break;
1395
1396 case EM_MIPS:
1397 case EM_MIPS_RS3_LE:
1398 rtype = elf_mips_reloc_type (type);
1399 break;
1400
1401 case EM_RISCV:
1402 rtype = elf_riscv_reloc_type (type);
1403 break;
1404
1405 case EM_ALPHA:
1406 rtype = elf_alpha_reloc_type (type);
1407 break;
1408
1409 case EM_ARM:
1410 rtype = elf_arm_reloc_type (type);
1411 break;
1412
1413 case EM_ARC:
1414 case EM_ARC_COMPACT:
1415 case EM_ARC_COMPACT2:
1416 rtype = elf_arc_reloc_type (type);
1417 break;
1418
1419 case EM_PARISC:
1420 rtype = elf_hppa_reloc_type (type);
1421 break;
1422
1423 case EM_H8_300:
1424 case EM_H8_300H:
1425 case EM_H8S:
1426 rtype = elf_h8_reloc_type (type);
1427 break;
1428
1429 case EM_OR1K:
1430 rtype = elf_or1k_reloc_type (type);
1431 break;
1432
1433 case EM_PJ:
1434 case EM_PJ_OLD:
1435 rtype = elf_pj_reloc_type (type);
1436 break;
1437 case EM_IA_64:
1438 rtype = elf_ia64_reloc_type (type);
1439 break;
1440
1441 case EM_CRIS:
1442 rtype = elf_cris_reloc_type (type);
1443 break;
1444
1445 case EM_860:
1446 rtype = elf_i860_reloc_type (type);
1447 break;
1448
1449 case EM_X86_64:
1450 case EM_L1OM:
1451 case EM_K1OM:
1452 rtype = elf_x86_64_reloc_type (type);
1453 break;
1454
1455 case EM_S370:
1456 rtype = i370_reloc_type (type);
1457 break;
1458
1459 case EM_S390_OLD:
1460 case EM_S390:
1461 rtype = elf_s390_reloc_type (type);
1462 break;
1463
1464 case EM_SCORE:
1465 rtype = elf_score_reloc_type (type);
1466 break;
1467
1468 case EM_XSTORMY16:
1469 rtype = elf_xstormy16_reloc_type (type);
1470 break;
1471
1472 case EM_CRX:
1473 rtype = elf_crx_reloc_type (type);
1474 break;
1475
1476 case EM_VAX:
1477 rtype = elf_vax_reloc_type (type);
1478 break;
1479
1480 case EM_VISIUM:
1481 rtype = elf_visium_reloc_type (type);
1482 break;
1483
1484 case EM_ADAPTEVA_EPIPHANY:
1485 rtype = elf_epiphany_reloc_type (type);
1486 break;
1487
1488 case EM_IP2K:
1489 case EM_IP2K_OLD:
1490 rtype = elf_ip2k_reloc_type (type);
1491 break;
1492
1493 case EM_IQ2000:
1494 rtype = elf_iq2000_reloc_type (type);
1495 break;
1496
1497 case EM_XTENSA_OLD:
1498 case EM_XTENSA:
1499 rtype = elf_xtensa_reloc_type (type);
1500 break;
1501
1502 case EM_LATTICEMICO32:
1503 rtype = elf_lm32_reloc_type (type);
1504 break;
1505
1506 case EM_M32C_OLD:
1507 case EM_M32C:
1508 rtype = elf_m32c_reloc_type (type);
1509 break;
1510
1511 case EM_MT:
1512 rtype = elf_mt_reloc_type (type);
1513 break;
1514
1515 case EM_BLACKFIN:
1516 rtype = elf_bfin_reloc_type (type);
1517 break;
1518
1519 case EM_CYGNUS_MEP:
1520 rtype = elf_mep_reloc_type (type);
1521 break;
1522
1523 case EM_CR16:
1524 rtype = elf_cr16_reloc_type (type);
1525 break;
1526
1527 case EM_MICROBLAZE:
1528 case EM_MICROBLAZE_OLD:
1529 rtype = elf_microblaze_reloc_type (type);
1530 break;
1531
1532 case EM_RL78:
1533 rtype = elf_rl78_reloc_type (type);
1534 break;
1535
1536 case EM_RX:
1537 rtype = elf_rx_reloc_type (type);
1538 break;
1539
1540 case EM_METAG:
1541 rtype = elf_metag_reloc_type (type);
1542 break;
1543
1544 case EM_XC16X:
1545 case EM_C166:
1546 rtype = elf_xc16x_reloc_type (type);
1547 break;
1548
1549 case EM_TI_C6000:
1550 rtype = elf_tic6x_reloc_type (type);
1551 break;
1552
1553 case EM_TILEGX:
1554 rtype = elf_tilegx_reloc_type (type);
1555 break;
1556
1557 case EM_TILEPRO:
1558 rtype = elf_tilepro_reloc_type (type);
1559 break;
1560
1561 case EM_WEBASSEMBLY:
1562 rtype = elf_wasm32_reloc_type (type);
1563 break;
1564
1565 case EM_XGATE:
1566 rtype = elf_xgate_reloc_type (type);
1567 break;
1568
1569 case EM_ALTERA_NIOS2:
1570 rtype = elf_nios2_reloc_type (type);
1571 break;
1572
1573 case EM_TI_PRU:
1574 rtype = elf_pru_reloc_type (type);
1575 break;
1576
1577 case EM_NFP:
1578 if (EF_NFP_MACH (filedata->file_header.e_flags) == E_NFP_MACH_3200)
1579 rtype = elf_nfp3200_reloc_type (type);
1580 else
1581 rtype = elf_nfp_reloc_type (type);
1582 break;
1583 }
1584
1585 if (rtype == NULL)
1586 printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1587 else
1588 printf (do_wide ? "%-22s" : "%-17.17s", rtype);
1589
1590 if (filedata->file_header.e_machine == EM_ALPHA
1591 && rtype != NULL
1592 && streq (rtype, "R_ALPHA_LITUSE")
1593 && is_rela)
1594 {
1595 switch (rels[i].r_addend)
1596 {
1597 case LITUSE_ALPHA_ADDR: rtype = "ADDR"; break;
1598 case LITUSE_ALPHA_BASE: rtype = "BASE"; break;
1599 case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1600 case LITUSE_ALPHA_JSR: rtype = "JSR"; break;
1601 case LITUSE_ALPHA_TLSGD: rtype = "TLSGD"; break;
1602 case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1603 case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1604 default: rtype = NULL;
1605 }
1606
1607 if (rtype)
1608 printf (" (%s)", rtype);
1609 else
1610 {
1611 putchar (' ');
1612 printf (_("<unknown addend: %lx>"),
1613 (unsigned long) rels[i].r_addend);
1614 res = FALSE;
1615 }
1616 }
1617 else if (symtab_index)
1618 {
1619 if (symtab == NULL || symtab_index >= nsyms)
1620 {
1621 error (_(" bad symbol index: %08lx in reloc"), (unsigned long) symtab_index);
1622 res = FALSE;
1623 }
1624 else
1625 {
1626 Elf_Internal_Sym * psym;
1627 const char * version_string;
1628 enum versioned_symbol_info sym_info;
1629 unsigned short vna_other;
1630
1631 psym = symtab + symtab_index;
1632
1633 version_string
1634 = get_symbol_version_string (filedata, is_dynsym,
1635 strtab, strtablen,
1636 symtab_index,
1637 psym,
1638 &sym_info,
1639 &vna_other);
1640
1641 printf (" ");
1642
1643 if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1644 {
1645 const char * name;
1646 unsigned int len;
1647 unsigned int width = is_32bit_elf ? 8 : 14;
1648
1649 /* Relocations against GNU_IFUNC symbols do not use the value
1650 of the symbol as the address to relocate against. Instead
1651 they invoke the function named by the symbol and use its
1652 result as the address for relocation.
1653
1654 To indicate this to the user, do not display the value of
1655 the symbol in the "Symbols's Value" field. Instead show
1656 its name followed by () as a hint that the symbol is
1657 invoked. */
1658
1659 if (strtab == NULL
1660 || psym->st_name == 0
1661 || psym->st_name >= strtablen)
1662 name = "??";
1663 else
1664 name = strtab + psym->st_name;
1665
1666 len = print_symbol (width, name);
1667 if (version_string)
1668 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1669 version_string);
1670 printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1671 }
1672 else
1673 {
1674 print_vma (psym->st_value, LONG_HEX);
1675
1676 printf (is_32bit_elf ? " " : " ");
1677 }
1678
1679 if (psym->st_name == 0)
1680 {
1681 const char * sec_name = "<null>";
1682 char name_buf[40];
1683
1684 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1685 {
1686 if (psym->st_shndx < filedata->file_header.e_shnum)
1687 sec_name = SECTION_NAME (filedata->section_headers + psym->st_shndx);
1688 else if (psym->st_shndx == SHN_ABS)
1689 sec_name = "ABS";
1690 else if (psym->st_shndx == SHN_COMMON)
1691 sec_name = "COMMON";
1692 else if ((filedata->file_header.e_machine == EM_MIPS
1693 && psym->st_shndx == SHN_MIPS_SCOMMON)
1694 || (filedata->file_header.e_machine == EM_TI_C6000
1695 && psym->st_shndx == SHN_TIC6X_SCOMMON))
1696 sec_name = "SCOMMON";
1697 else if (filedata->file_header.e_machine == EM_MIPS
1698 && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1699 sec_name = "SUNDEF";
1700 else if ((filedata->file_header.e_machine == EM_X86_64
1701 || filedata->file_header.e_machine == EM_L1OM
1702 || filedata->file_header.e_machine == EM_K1OM)
1703 && psym->st_shndx == SHN_X86_64_LCOMMON)
1704 sec_name = "LARGE_COMMON";
1705 else if (filedata->file_header.e_machine == EM_IA_64
1706 && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1707 && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1708 sec_name = "ANSI_COM";
1709 else if (is_ia64_vms (filedata)
1710 && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1711 sec_name = "VMS_SYMVEC";
1712 else
1713 {
1714 sprintf (name_buf, "<section 0x%x>",
1715 (unsigned int) psym->st_shndx);
1716 sec_name = name_buf;
1717 }
1718 }
1719 print_symbol (22, sec_name);
1720 }
1721 else if (strtab == NULL)
1722 printf (_("<string table index: %3ld>"), psym->st_name);
1723 else if (psym->st_name >= strtablen)
1724 {
1725 error (_("<corrupt string table index: %3ld>"), psym->st_name);
1726 res = FALSE;
1727 }
1728 else
1729 {
1730 print_symbol (22, strtab + psym->st_name);
1731 if (version_string)
1732 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1733 version_string);
1734 }
1735
1736 if (is_rela)
1737 {
1738 bfd_vma off = rels[i].r_addend;
1739
1740 if ((bfd_signed_vma) off < 0)
1741 printf (" - %" BFD_VMA_FMT "x", - off);
1742 else
1743 printf (" + %" BFD_VMA_FMT "x", off);
1744 }
1745 }
1746 }
1747 else if (is_rela)
1748 {
1749 bfd_vma off = rels[i].r_addend;
1750
1751 printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1752 if ((bfd_signed_vma) off < 0)
1753 printf ("-%" BFD_VMA_FMT "x", - off);
1754 else
1755 printf ("%" BFD_VMA_FMT "x", off);
1756 }
1757
1758 if (filedata->file_header.e_machine == EM_SPARCV9
1759 && rtype != NULL
1760 && streq (rtype, "R_SPARC_OLO10"))
1761 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1762
1763 putchar ('\n');
1764
1765 #ifdef BFD64
1766 if (! is_32bit_elf && filedata->file_header.e_machine == EM_MIPS)
1767 {
1768 bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1769 bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1770 const char * rtype2 = elf_mips_reloc_type (type2);
1771 const char * rtype3 = elf_mips_reloc_type (type3);
1772
1773 printf (" Type2: ");
1774
1775 if (rtype2 == NULL)
1776 printf (_("unrecognized: %-7lx"),
1777 (unsigned long) type2 & 0xffffffff);
1778 else
1779 printf ("%-17.17s", rtype2);
1780
1781 printf ("\n Type3: ");
1782
1783 if (rtype3 == NULL)
1784 printf (_("unrecognized: %-7lx"),
1785 (unsigned long) type3 & 0xffffffff);
1786 else
1787 printf ("%-17.17s", rtype3);
1788
1789 putchar ('\n');
1790 }
1791 #endif /* BFD64 */
1792 }
1793
1794 free (rels);
1795
1796 return res;
1797 }
1798
1799 static const char *
1800 get_mips_dynamic_type (unsigned long type)
1801 {
1802 switch (type)
1803 {
1804 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1805 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1806 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1807 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1808 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1809 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1810 case DT_MIPS_MSYM: return "MIPS_MSYM";
1811 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1812 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1813 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1814 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1815 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1816 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1817 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1818 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1819 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1820 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1821 case DT_MIPS_RLD_MAP_REL: return "MIPS_RLD_MAP_REL";
1822 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1823 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1824 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1825 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1826 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1827 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1828 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1829 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1830 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1831 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1832 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1833 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1834 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1835 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1836 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1837 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1838 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1839 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1840 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1841 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1842 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1843 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1844 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1845 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1846 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1847 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1848 case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1849 case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1850 default:
1851 return NULL;
1852 }
1853 }
1854
1855 static const char *
1856 get_sparc64_dynamic_type (unsigned long type)
1857 {
1858 switch (type)
1859 {
1860 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1861 default:
1862 return NULL;
1863 }
1864 }
1865
1866 static const char *
1867 get_ppc_dynamic_type (unsigned long type)
1868 {
1869 switch (type)
1870 {
1871 case DT_PPC_GOT: return "PPC_GOT";
1872 case DT_PPC_OPT: return "PPC_OPT";
1873 default:
1874 return NULL;
1875 }
1876 }
1877
1878 static const char *
1879 get_ppc64_dynamic_type (unsigned long type)
1880 {
1881 switch (type)
1882 {
1883 case DT_PPC64_GLINK: return "PPC64_GLINK";
1884 case DT_PPC64_OPD: return "PPC64_OPD";
1885 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
1886 case DT_PPC64_OPT: return "PPC64_OPT";
1887 default:
1888 return NULL;
1889 }
1890 }
1891
1892 static const char *
1893 get_parisc_dynamic_type (unsigned long type)
1894 {
1895 switch (type)
1896 {
1897 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1898 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1899 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1900 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1901 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1902 case DT_HP_PREINIT: return "HP_PREINIT";
1903 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1904 case DT_HP_NEEDED: return "HP_NEEDED";
1905 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1906 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1907 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1908 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1909 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1910 case DT_HP_EPLTREL: return "HP_GST_EPLTREL";
1911 case DT_HP_EPLTRELSZ: return "HP_GST_EPLTRELSZ";
1912 case DT_HP_FILTERED: return "HP_FILTERED";
1913 case DT_HP_FILTER_TLS: return "HP_FILTER_TLS";
1914 case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1915 case DT_HP_LAZYLOAD: return "HP_LAZYLOAD";
1916 case DT_HP_BIND_NOW_COUNT: return "HP_BIND_NOW_COUNT";
1917 case DT_PLT: return "PLT";
1918 case DT_PLT_SIZE: return "PLT_SIZE";
1919 case DT_DLT: return "DLT";
1920 case DT_DLT_SIZE: return "DLT_SIZE";
1921 default:
1922 return NULL;
1923 }
1924 }
1925
1926 static const char *
1927 get_ia64_dynamic_type (unsigned long type)
1928 {
1929 switch (type)
1930 {
1931 case DT_IA_64_PLT_RESERVE: return "IA_64_PLT_RESERVE";
1932 case DT_IA_64_VMS_SUBTYPE: return "VMS_SUBTYPE";
1933 case DT_IA_64_VMS_IMGIOCNT: return "VMS_IMGIOCNT";
1934 case DT_IA_64_VMS_LNKFLAGS: return "VMS_LNKFLAGS";
1935 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1936 case DT_IA_64_VMS_IDENT: return "VMS_IDENT";
1937 case DT_IA_64_VMS_NEEDED_IDENT: return "VMS_NEEDED_IDENT";
1938 case DT_IA_64_VMS_IMG_RELA_CNT: return "VMS_IMG_RELA_CNT";
1939 case DT_IA_64_VMS_SEG_RELA_CNT: return "VMS_SEG_RELA_CNT";
1940 case DT_IA_64_VMS_FIXUP_RELA_CNT: return "VMS_FIXUP_RELA_CNT";
1941 case DT_IA_64_VMS_FIXUP_NEEDED: return "VMS_FIXUP_NEEDED";
1942 case DT_IA_64_VMS_SYMVEC_CNT: return "VMS_SYMVEC_CNT";
1943 case DT_IA_64_VMS_XLATED: return "VMS_XLATED";
1944 case DT_IA_64_VMS_STACKSIZE: return "VMS_STACKSIZE";
1945 case DT_IA_64_VMS_UNWINDSZ: return "VMS_UNWINDSZ";
1946 case DT_IA_64_VMS_UNWIND_CODSEG: return "VMS_UNWIND_CODSEG";
1947 case DT_IA_64_VMS_UNWIND_INFOSEG: return "VMS_UNWIND_INFOSEG";
1948 case DT_IA_64_VMS_LINKTIME: return "VMS_LINKTIME";
1949 case DT_IA_64_VMS_SEG_NO: return "VMS_SEG_NO";
1950 case DT_IA_64_VMS_SYMVEC_OFFSET: return "VMS_SYMVEC_OFFSET";
1951 case DT_IA_64_VMS_SYMVEC_SEG: return "VMS_SYMVEC_SEG";
1952 case DT_IA_64_VMS_UNWIND_OFFSET: return "VMS_UNWIND_OFFSET";
1953 case DT_IA_64_VMS_UNWIND_SEG: return "VMS_UNWIND_SEG";
1954 case DT_IA_64_VMS_STRTAB_OFFSET: return "VMS_STRTAB_OFFSET";
1955 case DT_IA_64_VMS_SYSVER_OFFSET: return "VMS_SYSVER_OFFSET";
1956 case DT_IA_64_VMS_IMG_RELA_OFF: return "VMS_IMG_RELA_OFF";
1957 case DT_IA_64_VMS_SEG_RELA_OFF: return "VMS_SEG_RELA_OFF";
1958 case DT_IA_64_VMS_FIXUP_RELA_OFF: return "VMS_FIXUP_RELA_OFF";
1959 case DT_IA_64_VMS_PLTGOT_OFFSET: return "VMS_PLTGOT_OFFSET";
1960 case DT_IA_64_VMS_PLTGOT_SEG: return "VMS_PLTGOT_SEG";
1961 case DT_IA_64_VMS_FPMODE: return "VMS_FPMODE";
1962 default:
1963 return NULL;
1964 }
1965 }
1966
1967 static const char *
1968 get_solaris_section_type (unsigned long type)
1969 {
1970 switch (type)
1971 {
1972 case 0x6fffffee: return "SUNW_ancillary";
1973 case 0x6fffffef: return "SUNW_capchain";
1974 case 0x6ffffff0: return "SUNW_capinfo";
1975 case 0x6ffffff1: return "SUNW_symsort";
1976 case 0x6ffffff2: return "SUNW_tlssort";
1977 case 0x6ffffff3: return "SUNW_LDYNSYM";
1978 case 0x6ffffff4: return "SUNW_dof";
1979 case 0x6ffffff5: return "SUNW_cap";
1980 case 0x6ffffff6: return "SUNW_SIGNATURE";
1981 case 0x6ffffff7: return "SUNW_ANNOTATE";
1982 case 0x6ffffff8: return "SUNW_DEBUGSTR";
1983 case 0x6ffffff9: return "SUNW_DEBUG";
1984 case 0x6ffffffa: return "SUNW_move";
1985 case 0x6ffffffb: return "SUNW_COMDAT";
1986 case 0x6ffffffc: return "SUNW_syminfo";
1987 case 0x6ffffffd: return "SUNW_verdef";
1988 case 0x6ffffffe: return "SUNW_verneed";
1989 case 0x6fffffff: return "SUNW_versym";
1990 case 0x70000000: return "SPARC_GOTDATA";
1991 default: return NULL;
1992 }
1993 }
1994
1995 static const char *
1996 get_alpha_dynamic_type (unsigned long type)
1997 {
1998 switch (type)
1999 {
2000 case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
2001 default: return NULL;
2002 }
2003 }
2004
2005 static const char *
2006 get_score_dynamic_type (unsigned long type)
2007 {
2008 switch (type)
2009 {
2010 case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
2011 case DT_SCORE_LOCAL_GOTNO: return "SCORE_LOCAL_GOTNO";
2012 case DT_SCORE_SYMTABNO: return "SCORE_SYMTABNO";
2013 case DT_SCORE_GOTSYM: return "SCORE_GOTSYM";
2014 case DT_SCORE_UNREFEXTNO: return "SCORE_UNREFEXTNO";
2015 case DT_SCORE_HIPAGENO: return "SCORE_HIPAGENO";
2016 default: return NULL;
2017 }
2018 }
2019
2020 static const char *
2021 get_tic6x_dynamic_type (unsigned long type)
2022 {
2023 switch (type)
2024 {
2025 case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
2026 case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
2027 case DT_C6000_DSBT_BASE: return "C6000_DSBT_BASE";
2028 case DT_C6000_DSBT_SIZE: return "C6000_DSBT_SIZE";
2029 case DT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
2030 case DT_C6000_DSBT_INDEX: return "C6000_DSBT_INDEX";
2031 default: return NULL;
2032 }
2033 }
2034
2035 static const char *
2036 get_nios2_dynamic_type (unsigned long type)
2037 {
2038 switch (type)
2039 {
2040 case DT_NIOS2_GP: return "NIOS2_GP";
2041 default: return NULL;
2042 }
2043 }
2044
2045 static const char *
2046 get_solaris_dynamic_type (unsigned long type)
2047 {
2048 switch (type)
2049 {
2050 case 0x6000000d: return "SUNW_AUXILIARY";
2051 case 0x6000000e: return "SUNW_RTLDINF";
2052 case 0x6000000f: return "SUNW_FILTER";
2053 case 0x60000010: return "SUNW_CAP";
2054 case 0x60000011: return "SUNW_SYMTAB";
2055 case 0x60000012: return "SUNW_SYMSZ";
2056 case 0x60000013: return "SUNW_SORTENT";
2057 case 0x60000014: return "SUNW_SYMSORT";
2058 case 0x60000015: return "SUNW_SYMSORTSZ";
2059 case 0x60000016: return "SUNW_TLSSORT";
2060 case 0x60000017: return "SUNW_TLSSORTSZ";
2061 case 0x60000018: return "SUNW_CAPINFO";
2062 case 0x60000019: return "SUNW_STRPAD";
2063 case 0x6000001a: return "SUNW_CAPCHAIN";
2064 case 0x6000001b: return "SUNW_LDMACH";
2065 case 0x6000001d: return "SUNW_CAPCHAINENT";
2066 case 0x6000001f: return "SUNW_CAPCHAINSZ";
2067 case 0x60000021: return "SUNW_PARENT";
2068 case 0x60000023: return "SUNW_ASLR";
2069 case 0x60000025: return "SUNW_RELAX";
2070 case 0x60000029: return "SUNW_NXHEAP";
2071 case 0x6000002b: return "SUNW_NXSTACK";
2072
2073 case 0x70000001: return "SPARC_REGISTER";
2074 case 0x7ffffffd: return "AUXILIARY";
2075 case 0x7ffffffe: return "USED";
2076 case 0x7fffffff: return "FILTER";
2077
2078 default: return NULL;
2079 }
2080 }
2081
2082 static const char *
2083 get_dynamic_type (Filedata * filedata, unsigned long type)
2084 {
2085 static char buff[64];
2086
2087 switch (type)
2088 {
2089 case DT_NULL: return "NULL";
2090 case DT_NEEDED: return "NEEDED";
2091 case DT_PLTRELSZ: return "PLTRELSZ";
2092 case DT_PLTGOT: return "PLTGOT";
2093 case DT_HASH: return "HASH";
2094 case DT_STRTAB: return "STRTAB";
2095 case DT_SYMTAB: return "SYMTAB";
2096 case DT_RELA: return "RELA";
2097 case DT_RELASZ: return "RELASZ";
2098 case DT_RELAENT: return "RELAENT";
2099 case DT_STRSZ: return "STRSZ";
2100 case DT_SYMENT: return "SYMENT";
2101 case DT_INIT: return "INIT";
2102 case DT_FINI: return "FINI";
2103 case DT_SONAME: return "SONAME";
2104 case DT_RPATH: return "RPATH";
2105 case DT_SYMBOLIC: return "SYMBOLIC";
2106 case DT_REL: return "REL";
2107 case DT_RELSZ: return "RELSZ";
2108 case DT_RELENT: return "RELENT";
2109 case DT_PLTREL: return "PLTREL";
2110 case DT_DEBUG: return "DEBUG";
2111 case DT_TEXTREL: return "TEXTREL";
2112 case DT_JMPREL: return "JMPREL";
2113 case DT_BIND_NOW: return "BIND_NOW";
2114 case DT_INIT_ARRAY: return "INIT_ARRAY";
2115 case DT_FINI_ARRAY: return "FINI_ARRAY";
2116 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
2117 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
2118 case DT_RUNPATH: return "RUNPATH";
2119 case DT_FLAGS: return "FLAGS";
2120
2121 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2122 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
2123 case DT_SYMTAB_SHNDX: return "SYMTAB_SHNDX";
2124
2125 case DT_CHECKSUM: return "CHECKSUM";
2126 case DT_PLTPADSZ: return "PLTPADSZ";
2127 case DT_MOVEENT: return "MOVEENT";
2128 case DT_MOVESZ: return "MOVESZ";
2129 case DT_FEATURE: return "FEATURE";
2130 case DT_POSFLAG_1: return "POSFLAG_1";
2131 case DT_SYMINSZ: return "SYMINSZ";
2132 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
2133
2134 case DT_ADDRRNGLO: return "ADDRRNGLO";
2135 case DT_CONFIG: return "CONFIG";
2136 case DT_DEPAUDIT: return "DEPAUDIT";
2137 case DT_AUDIT: return "AUDIT";
2138 case DT_PLTPAD: return "PLTPAD";
2139 case DT_MOVETAB: return "MOVETAB";
2140 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
2141
2142 case DT_VERSYM: return "VERSYM";
2143
2144 case DT_TLSDESC_GOT: return "TLSDESC_GOT";
2145 case DT_TLSDESC_PLT: return "TLSDESC_PLT";
2146 case DT_RELACOUNT: return "RELACOUNT";
2147 case DT_RELCOUNT: return "RELCOUNT";
2148 case DT_FLAGS_1: return "FLAGS_1";
2149 case DT_VERDEF: return "VERDEF";
2150 case DT_VERDEFNUM: return "VERDEFNUM";
2151 case DT_VERNEED: return "VERNEED";
2152 case DT_VERNEEDNUM: return "VERNEEDNUM";
2153
2154 case DT_AUXILIARY: return "AUXILIARY";
2155 case DT_USED: return "USED";
2156 case DT_FILTER: return "FILTER";
2157
2158 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
2159 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
2160 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
2161 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
2162 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
2163 case DT_GNU_HASH: return "GNU_HASH";
2164
2165 default:
2166 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
2167 {
2168 const char * result;
2169
2170 switch (filedata->file_header.e_machine)
2171 {
2172 case EM_MIPS:
2173 case EM_MIPS_RS3_LE:
2174 result = get_mips_dynamic_type (type);
2175 break;
2176 case EM_SPARCV9:
2177 result = get_sparc64_dynamic_type (type);
2178 break;
2179 case EM_PPC:
2180 result = get_ppc_dynamic_type (type);
2181 break;
2182 case EM_PPC64:
2183 result = get_ppc64_dynamic_type (type);
2184 break;
2185 case EM_IA_64:
2186 result = get_ia64_dynamic_type (type);
2187 break;
2188 case EM_ALPHA:
2189 result = get_alpha_dynamic_type (type);
2190 break;
2191 case EM_SCORE:
2192 result = get_score_dynamic_type (type);
2193 break;
2194 case EM_TI_C6000:
2195 result = get_tic6x_dynamic_type (type);
2196 break;
2197 case EM_ALTERA_NIOS2:
2198 result = get_nios2_dynamic_type (type);
2199 break;
2200 default:
2201 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2202 result = get_solaris_dynamic_type (type);
2203 else
2204 result = NULL;
2205 break;
2206 }
2207
2208 if (result != NULL)
2209 return result;
2210
2211 snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
2212 }
2213 else if (((type >= DT_LOOS) && (type <= DT_HIOS))
2214 || (filedata->file_header.e_machine == EM_PARISC
2215 && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
2216 {
2217 const char * result;
2218
2219 switch (filedata->file_header.e_machine)
2220 {
2221 case EM_PARISC:
2222 result = get_parisc_dynamic_type (type);
2223 break;
2224 case EM_IA_64:
2225 result = get_ia64_dynamic_type (type);
2226 break;
2227 default:
2228 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2229 result = get_solaris_dynamic_type (type);
2230 else
2231 result = NULL;
2232 break;
2233 }
2234
2235 if (result != NULL)
2236 return result;
2237
2238 snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2239 type);
2240 }
2241 else
2242 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
2243
2244 return buff;
2245 }
2246 }
2247
2248 static char *
2249 get_file_type (unsigned e_type)
2250 {
2251 static char buff[32];
2252
2253 switch (e_type)
2254 {
2255 case ET_NONE: return _("NONE (None)");
2256 case ET_REL: return _("REL (Relocatable file)");
2257 case ET_EXEC: return _("EXEC (Executable file)");
2258 case ET_DYN: return _("DYN (Shared object file)");
2259 case ET_CORE: return _("CORE (Core file)");
2260
2261 default:
2262 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
2263 snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
2264 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
2265 snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
2266 else
2267 snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
2268 return buff;
2269 }
2270 }
2271
2272 static char *
2273 get_machine_name (unsigned e_machine)
2274 {
2275 static char buff[64]; /* XXX */
2276
2277 switch (e_machine)
2278 {
2279 /* Please keep this switch table sorted by increasing EM_ value. */
2280 /* 0 */
2281 case EM_NONE: return _("None");
2282 case EM_M32: return "WE32100";
2283 case EM_SPARC: return "Sparc";
2284 case EM_386: return "Intel 80386";
2285 case EM_68K: return "MC68000";
2286 case EM_88K: return "MC88000";
2287 case EM_IAMCU: return "Intel MCU";
2288 case EM_860: return "Intel 80860";
2289 case EM_MIPS: return "MIPS R3000";
2290 case EM_S370: return "IBM System/370";
2291 /* 10 */
2292 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
2293 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
2294 case EM_PARISC: return "HPPA";
2295 case EM_VPP550: return "Fujitsu VPP500";
2296 case EM_SPARC32PLUS: return "Sparc v8+" ;
2297 case EM_960: return "Intel 80960";
2298 case EM_PPC: return "PowerPC";
2299 /* 20 */
2300 case EM_PPC64: return "PowerPC64";
2301 case EM_S390_OLD:
2302 case EM_S390: return "IBM S/390";
2303 case EM_SPU: return "SPU";
2304 /* 30 */
2305 case EM_V800: return "Renesas V850 (using RH850 ABI)";
2306 case EM_FR20: return "Fujitsu FR20";
2307 case EM_RH32: return "TRW RH32";
2308 case EM_MCORE: return "MCORE";
2309 /* 40 */
2310 case EM_ARM: return "ARM";
2311 case EM_OLD_ALPHA: return "Digital Alpha (old)";
2312 case EM_SH: return "Renesas / SuperH SH";
2313 case EM_SPARCV9: return "Sparc v9";
2314 case EM_TRICORE: return "Siemens Tricore";
2315 case EM_ARC: return "ARC";
2316 case EM_H8_300: return "Renesas H8/300";
2317 case EM_H8_300H: return "Renesas H8/300H";
2318 case EM_H8S: return "Renesas H8S";
2319 case EM_H8_500: return "Renesas H8/500";
2320 /* 50 */
2321 case EM_IA_64: return "Intel IA-64";
2322 case EM_MIPS_X: return "Stanford MIPS-X";
2323 case EM_COLDFIRE: return "Motorola Coldfire";
2324 case EM_68HC12: return "Motorola MC68HC12 Microcontroller";
2325 case EM_MMA: return "Fujitsu Multimedia Accelerator";
2326 case EM_PCP: return "Siemens PCP";
2327 case EM_NCPU: return "Sony nCPU embedded RISC processor";
2328 case EM_NDR1: return "Denso NDR1 microprocesspr";
2329 case EM_STARCORE: return "Motorola Star*Core processor";
2330 case EM_ME16: return "Toyota ME16 processor";
2331 /* 60 */
2332 case EM_ST100: return "STMicroelectronics ST100 processor";
2333 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
2334 case EM_X86_64: return "Advanced Micro Devices X86-64";
2335 case EM_PDSP: return "Sony DSP processor";
2336 case EM_PDP10: return "Digital Equipment Corp. PDP-10";
2337 case EM_PDP11: return "Digital Equipment Corp. PDP-11";
2338 case EM_FX66: return "Siemens FX66 microcontroller";
2339 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2340 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
2341 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
2342 /* 70 */
2343 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
2344 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
2345 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
2346 case EM_SVX: return "Silicon Graphics SVx";
2347 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
2348 case EM_VAX: return "Digital VAX";
2349 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
2350 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
2351 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
2352 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
2353 /* 80 */
2354 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
2355 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
2356 case EM_PRISM: return "Vitesse Prism";
2357 case EM_AVR_OLD:
2358 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
2359 case EM_CYGNUS_FR30:
2360 case EM_FR30: return "Fujitsu FR30";
2361 case EM_CYGNUS_D10V:
2362 case EM_D10V: return "d10v";
2363 case EM_CYGNUS_D30V:
2364 case EM_D30V: return "d30v";
2365 case EM_CYGNUS_V850:
2366 case EM_V850: return "Renesas V850";
2367 case EM_CYGNUS_M32R:
2368 case EM_M32R: return "Renesas M32R (formerly Mitsubishi M32r)";
2369 case EM_CYGNUS_MN10300:
2370 case EM_MN10300: return "mn10300";
2371 /* 90 */
2372 case EM_CYGNUS_MN10200:
2373 case EM_MN10200: return "mn10200";
2374 case EM_PJ: return "picoJava";
2375 case EM_OR1K: return "OpenRISC 1000";
2376 case EM_ARC_COMPACT: return "ARCompact";
2377 case EM_XTENSA_OLD:
2378 case EM_XTENSA: return "Tensilica Xtensa Processor";
2379 case EM_VIDEOCORE: return "Alphamosaic VideoCore processor";
2380 case EM_TMM_GPP: return "Thompson Multimedia General Purpose Processor";
2381 case EM_NS32K: return "National Semiconductor 32000 series";
2382 case EM_TPC: return "Tenor Network TPC processor";
2383 case EM_SNP1K: return "Trebia SNP 1000 processor";
2384 /* 100 */
2385 case EM_ST200: return "STMicroelectronics ST200 microcontroller";
2386 case EM_IP2K_OLD:
2387 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
2388 case EM_MAX: return "MAX Processor";
2389 case EM_CR: return "National Semiconductor CompactRISC";
2390 case EM_F2MC16: return "Fujitsu F2MC16";
2391 case EM_MSP430: return "Texas Instruments msp430 microcontroller";
2392 case EM_BLACKFIN: return "Analog Devices Blackfin";
2393 case EM_SE_C33: return "S1C33 Family of Seiko Epson processors";
2394 case EM_SEP: return "Sharp embedded microprocessor";
2395 case EM_ARCA: return "Arca RISC microprocessor";
2396 /* 110 */
2397 case EM_UNICORE: return "Unicore";
2398 case EM_EXCESS: return "eXcess 16/32/64-bit configurable embedded CPU";
2399 case EM_DXP: return "Icera Semiconductor Inc. Deep Execution Processor";
2400 case EM_ALTERA_NIOS2: return "Altera Nios II";
2401 case EM_CRX: return "National Semiconductor CRX microprocessor";
2402 case EM_XGATE: return "Motorola XGATE embedded processor";
2403 case EM_C166:
2404 case EM_XC16X: return "Infineon Technologies xc16x";
2405 case EM_M16C: return "Renesas M16C series microprocessors";
2406 case EM_DSPIC30F: return "Microchip Technology dsPIC30F Digital Signal Controller";
2407 case EM_CE: return "Freescale Communication Engine RISC core";
2408 /* 120 */
2409 case EM_M32C: return "Renesas M32c";
2410 /* 130 */
2411 case EM_TSK3000: return "Altium TSK3000 core";
2412 case EM_RS08: return "Freescale RS08 embedded processor";
2413 case EM_ECOG2: return "Cyan Technology eCOG2 microprocessor";
2414 case EM_SCORE: return "SUNPLUS S+Core";
2415 case EM_DSP24: return "New Japan Radio (NJR) 24-bit DSP Processor";
2416 case EM_VIDEOCORE3: return "Broadcom VideoCore III processor";
2417 case EM_LATTICEMICO32: return "Lattice Mico32";
2418 case EM_SE_C17: return "Seiko Epson C17 family";
2419 /* 140 */
2420 case EM_TI_C6000: return "Texas Instruments TMS320C6000 DSP family";
2421 case EM_TI_C2000: return "Texas Instruments TMS320C2000 DSP family";
2422 case EM_TI_C5500: return "Texas Instruments TMS320C55x DSP family";
2423 case EM_TI_PRU: return "TI PRU I/O processor";
2424 /* 160 */
2425 case EM_MMDSP_PLUS: return "STMicroelectronics 64bit VLIW Data Signal Processor";
2426 case EM_CYPRESS_M8C: return "Cypress M8C microprocessor";
2427 case EM_R32C: return "Renesas R32C series microprocessors";
2428 case EM_TRIMEDIA: return "NXP Semiconductors TriMedia architecture family";
2429 case EM_QDSP6: return "QUALCOMM DSP6 Processor";
2430 case EM_8051: return "Intel 8051 and variants";
2431 case EM_STXP7X: return "STMicroelectronics STxP7x family";
2432 case EM_NDS32: return "Andes Technology compact code size embedded RISC processor family";
2433 case EM_ECOG1X: return "Cyan Technology eCOG1X family";
2434 case EM_MAXQ30: return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2435 /* 170 */
2436 case EM_XIMO16: return "New Japan Radio (NJR) 16-bit DSP Processor";
2437 case EM_MANIK: return "M2000 Reconfigurable RISC Microprocessor";
2438 case EM_CRAYNV2: return "Cray Inc. NV2 vector architecture";
2439 case EM_RX: return "Renesas RX";
2440 case EM_METAG: return "Imagination Technologies Meta processor architecture";
2441 case EM_MCST_ELBRUS: return "MCST Elbrus general purpose hardware architecture";
2442 case EM_ECOG16: return "Cyan Technology eCOG16 family";
2443 case EM_CR16:
2444 case EM_MICROBLAZE:
2445 case EM_MICROBLAZE_OLD: return "Xilinx MicroBlaze";
2446 case EM_ETPU: return "Freescale Extended Time Processing Unit";
2447 case EM_SLE9X: return "Infineon Technologies SLE9X core";
2448 /* 180 */
2449 case EM_L1OM: return "Intel L1OM";
2450 case EM_K1OM: return "Intel K1OM";
2451 case EM_INTEL182: return "Intel (reserved)";
2452 case EM_AARCH64: return "AArch64";
2453 case EM_ARM184: return "ARM (reserved)";
2454 case EM_AVR32: return "Atmel Corporation 32-bit microprocessor";
2455 case EM_STM8: return "STMicroeletronics STM8 8-bit microcontroller";
2456 case EM_TILE64: return "Tilera TILE64 multicore architecture family";
2457 case EM_TILEPRO: return "Tilera TILEPro multicore architecture family";
2458 /* 190 */
2459 case EM_CUDA: return "NVIDIA CUDA architecture";
2460 case EM_TILEGX: return "Tilera TILE-Gx multicore architecture family";
2461 case EM_CLOUDSHIELD: return "CloudShield architecture family";
2462 case EM_COREA_1ST: return "KIPO-KAIST Core-A 1st generation processor family";
2463 case EM_COREA_2ND: return "KIPO-KAIST Core-A 2nd generation processor family";
2464 case EM_ARC_COMPACT2: return "ARCv2";
2465 case EM_OPEN8: return "Open8 8-bit RISC soft processor core";
2466 case EM_RL78: return "Renesas RL78";
2467 case EM_VIDEOCORE5: return "Broadcom VideoCore V processor";
2468 case EM_78K0R: return "Renesas 78K0R";
2469 /* 200 */
2470 case EM_56800EX: return "Freescale 56800EX Digital Signal Controller (DSC)";
2471 case EM_BA1: return "Beyond BA1 CPU architecture";
2472 case EM_BA2: return "Beyond BA2 CPU architecture";
2473 case EM_XCORE: return "XMOS xCORE processor family";
2474 case EM_MCHP_PIC: return "Microchip 8-bit PIC(r) family";
2475 /* 210 */
2476 case EM_KM32: return "KM211 KM32 32-bit processor";
2477 case EM_KMX32: return "KM211 KMX32 32-bit processor";
2478 case EM_KMX16: return "KM211 KMX16 16-bit processor";
2479 case EM_KMX8: return "KM211 KMX8 8-bit processor";
2480 case EM_KVARC: return "KM211 KVARC processor";
2481 case EM_CDP: return "Paneve CDP architecture family";
2482 case EM_COGE: return "Cognitive Smart Memory Processor";
2483 case EM_COOL: return "Bluechip Systems CoolEngine";
2484 case EM_NORC: return "Nanoradio Optimized RISC";
2485 case EM_CSR_KALIMBA: return "CSR Kalimba architecture family";
2486 /* 220 */
2487 case EM_Z80: return "Zilog Z80";
2488 case EM_VISIUM: return "CDS VISIUMcore processor";
2489 case EM_FT32: return "FTDI Chip FT32";
2490 case EM_MOXIE: return "Moxie";
2491 case EM_AMDGPU: return "AMD GPU";
2492 case EM_RISCV: return "RISC-V";
2493 case EM_LANAI: return "Lanai 32-bit processor";
2494 case EM_BPF: return "Linux BPF";
2495 case EM_NFP: return "Netronome Flow Processor";
2496
2497 /* Large numbers... */
2498 case EM_MT: return "Morpho Techologies MT processor";
2499 case EM_ALPHA: return "Alpha";
2500 case EM_WEBASSEMBLY: return "Web Assembly";
2501 case EM_DLX: return "OpenDLX";
2502 case EM_XSTORMY16: return "Sanyo XStormy16 CPU core";
2503 case EM_IQ2000: return "Vitesse IQ2000";
2504 case EM_M32C_OLD:
2505 case EM_NIOS32: return "Altera Nios";
2506 case EM_CYGNUS_MEP: return "Toshiba MeP Media Engine";
2507 case EM_ADAPTEVA_EPIPHANY: return "Adapteva EPIPHANY";
2508 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
2509 case EM_S12Z: return "Freescale S12Z";
2510 case EM_CSKY: return "C-SKY";
2511
2512 default:
2513 snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2514 return buff;
2515 }
2516 }
2517
2518 static void
2519 decode_ARC_machine_flags (unsigned e_flags, unsigned e_machine, char buf[])
2520 {
2521 /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2. Some
2522 other compilers don't a specific architecture type in the e_flags, and
2523 instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
2524 architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
2525 architectures.
2526
2527 Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
2528 but also sets a specific architecture type in the e_flags field.
2529
2530 However, when decoding the flags we don't worry if we see an
2531 unexpected pairing, for example EM_ARC_COMPACT machine type, with
2532 ARCEM architecture type. */
2533
2534 switch (e_flags & EF_ARC_MACH_MSK)
2535 {
2536 /* We only expect these to occur for EM_ARC_COMPACT2. */
2537 case EF_ARC_CPU_ARCV2EM:
2538 strcat (buf, ", ARC EM");
2539 break;
2540 case EF_ARC_CPU_ARCV2HS:
2541 strcat (buf, ", ARC HS");
2542 break;
2543
2544 /* We only expect these to occur for EM_ARC_COMPACT. */
2545 case E_ARC_MACH_ARC600:
2546 strcat (buf, ", ARC600");
2547 break;
2548 case E_ARC_MACH_ARC601:
2549 strcat (buf, ", ARC601");
2550 break;
2551 case E_ARC_MACH_ARC700:
2552 strcat (buf, ", ARC700");
2553 break;
2554
2555 /* The only times we should end up here are (a) A corrupt ELF, (b) A
2556 new ELF with new architecture being read by an old version of
2557 readelf, or (c) An ELF built with non-GNU compiler that does not
2558 set the architecture in the e_flags. */
2559 default:
2560 if (e_machine == EM_ARC_COMPACT)
2561 strcat (buf, ", Unknown ARCompact");
2562 else
2563 strcat (buf, ", Unknown ARC");
2564 break;
2565 }
2566
2567 switch (e_flags & EF_ARC_OSABI_MSK)
2568 {
2569 case E_ARC_OSABI_ORIG:
2570 strcat (buf, ", (ABI:legacy)");
2571 break;
2572 case E_ARC_OSABI_V2:
2573 strcat (buf, ", (ABI:v2)");
2574 break;
2575 /* Only upstream 3.9+ kernels will support ARCv2 ISA. */
2576 case E_ARC_OSABI_V3:
2577 strcat (buf, ", v3 no-legacy-syscalls ABI");
2578 break;
2579 case E_ARC_OSABI_V4:
2580 strcat (buf, ", v4 ABI");
2581 break;
2582 default:
2583 strcat (buf, ", unrecognised ARC OSABI flag");
2584 break;
2585 }
2586 }
2587
2588 static void
2589 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2590 {
2591 unsigned eabi;
2592 bfd_boolean unknown = FALSE;
2593
2594 eabi = EF_ARM_EABI_VERSION (e_flags);
2595 e_flags &= ~ EF_ARM_EABIMASK;
2596
2597 /* Handle "generic" ARM flags. */
2598 if (e_flags & EF_ARM_RELEXEC)
2599 {
2600 strcat (buf, ", relocatable executable");
2601 e_flags &= ~ EF_ARM_RELEXEC;
2602 }
2603
2604 if (e_flags & EF_ARM_PIC)
2605 {
2606 strcat (buf, ", position independent");
2607 e_flags &= ~ EF_ARM_PIC;
2608 }
2609
2610 /* Now handle EABI specific flags. */
2611 switch (eabi)
2612 {
2613 default:
2614 strcat (buf, ", <unrecognized EABI>");
2615 if (e_flags)
2616 unknown = TRUE;
2617 break;
2618
2619 case EF_ARM_EABI_VER1:
2620 strcat (buf, ", Version1 EABI");
2621 while (e_flags)
2622 {
2623 unsigned flag;
2624
2625 /* Process flags one bit at a time. */
2626 flag = e_flags & - e_flags;
2627 e_flags &= ~ flag;
2628
2629 switch (flag)
2630 {
2631 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2632 strcat (buf, ", sorted symbol tables");
2633 break;
2634
2635 default:
2636 unknown = TRUE;
2637 break;
2638 }
2639 }
2640 break;
2641
2642 case EF_ARM_EABI_VER2:
2643 strcat (buf, ", Version2 EABI");
2644 while (e_flags)
2645 {
2646 unsigned flag;
2647
2648 /* Process flags one bit at a time. */
2649 flag = e_flags & - e_flags;
2650 e_flags &= ~ flag;
2651
2652 switch (flag)
2653 {
2654 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2655 strcat (buf, ", sorted symbol tables");
2656 break;
2657
2658 case EF_ARM_DYNSYMSUSESEGIDX:
2659 strcat (buf, ", dynamic symbols use segment index");
2660 break;
2661
2662 case EF_ARM_MAPSYMSFIRST:
2663 strcat (buf, ", mapping symbols precede others");
2664 break;
2665
2666 default:
2667 unknown = TRUE;
2668 break;
2669 }
2670 }
2671 break;
2672
2673 case EF_ARM_EABI_VER3:
2674 strcat (buf, ", Version3 EABI");
2675 break;
2676
2677 case EF_ARM_EABI_VER4:
2678 strcat (buf, ", Version4 EABI");
2679 while (e_flags)
2680 {
2681 unsigned flag;
2682
2683 /* Process flags one bit at a time. */
2684 flag = e_flags & - e_flags;
2685 e_flags &= ~ flag;
2686
2687 switch (flag)
2688 {
2689 case EF_ARM_BE8:
2690 strcat (buf, ", BE8");
2691 break;
2692
2693 case EF_ARM_LE8:
2694 strcat (buf, ", LE8");
2695 break;
2696
2697 default:
2698 unknown = TRUE;
2699 break;
2700 }
2701 }
2702 break;
2703
2704 case EF_ARM_EABI_VER5:
2705 strcat (buf, ", Version5 EABI");
2706 while (e_flags)
2707 {
2708 unsigned flag;
2709
2710 /* Process flags one bit at a time. */
2711 flag = e_flags & - e_flags;
2712 e_flags &= ~ flag;
2713
2714 switch (flag)
2715 {
2716 case EF_ARM_BE8:
2717 strcat (buf, ", BE8");
2718 break;
2719
2720 case EF_ARM_LE8:
2721 strcat (buf, ", LE8");
2722 break;
2723
2724 case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT. */
2725 strcat (buf, ", soft-float ABI");
2726 break;
2727
2728 case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT. */
2729 strcat (buf, ", hard-float ABI");
2730 break;
2731
2732 default:
2733 unknown = TRUE;
2734 break;
2735 }
2736 }
2737 break;
2738
2739 case EF_ARM_EABI_UNKNOWN:
2740 strcat (buf, ", GNU EABI");
2741 while (e_flags)
2742 {
2743 unsigned flag;
2744
2745 /* Process flags one bit at a time. */
2746 flag = e_flags & - e_flags;
2747 e_flags &= ~ flag;
2748
2749 switch (flag)
2750 {
2751 case EF_ARM_INTERWORK:
2752 strcat (buf, ", interworking enabled");
2753 break;
2754
2755 case EF_ARM_APCS_26:
2756 strcat (buf, ", uses APCS/26");
2757 break;
2758
2759 case EF_ARM_APCS_FLOAT:
2760 strcat (buf, ", uses APCS/float");
2761 break;
2762
2763 case EF_ARM_PIC:
2764 strcat (buf, ", position independent");
2765 break;
2766
2767 case EF_ARM_ALIGN8:
2768 strcat (buf, ", 8 bit structure alignment");
2769 break;
2770
2771 case EF_ARM_NEW_ABI:
2772 strcat (buf, ", uses new ABI");
2773 break;
2774
2775 case EF_ARM_OLD_ABI:
2776 strcat (buf, ", uses old ABI");
2777 break;
2778
2779 case EF_ARM_SOFT_FLOAT:
2780 strcat (buf, ", software FP");
2781 break;
2782
2783 case EF_ARM_VFP_FLOAT:
2784 strcat (buf, ", VFP");
2785 break;
2786
2787 case EF_ARM_MAVERICK_FLOAT:
2788 strcat (buf, ", Maverick FP");
2789 break;
2790
2791 default:
2792 unknown = TRUE;
2793 break;
2794 }
2795 }
2796 }
2797
2798 if (unknown)
2799 strcat (buf,_(", <unknown>"));
2800 }
2801
2802 static void
2803 decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2804 {
2805 --size; /* Leave space for null terminator. */
2806
2807 switch (e_flags & EF_AVR_MACH)
2808 {
2809 case E_AVR_MACH_AVR1:
2810 strncat (buf, ", avr:1", size);
2811 break;
2812 case E_AVR_MACH_AVR2:
2813 strncat (buf, ", avr:2", size);
2814 break;
2815 case E_AVR_MACH_AVR25:
2816 strncat (buf, ", avr:25", size);
2817 break;
2818 case E_AVR_MACH_AVR3:
2819 strncat (buf, ", avr:3", size);
2820 break;
2821 case E_AVR_MACH_AVR31:
2822 strncat (buf, ", avr:31", size);
2823 break;
2824 case E_AVR_MACH_AVR35:
2825 strncat (buf, ", avr:35", size);
2826 break;
2827 case E_AVR_MACH_AVR4:
2828 strncat (buf, ", avr:4", size);
2829 break;
2830 case E_AVR_MACH_AVR5:
2831 strncat (buf, ", avr:5", size);
2832 break;
2833 case E_AVR_MACH_AVR51:
2834 strncat (buf, ", avr:51", size);
2835 break;
2836 case E_AVR_MACH_AVR6:
2837 strncat (buf, ", avr:6", size);
2838 break;
2839 case E_AVR_MACH_AVRTINY:
2840 strncat (buf, ", avr:100", size);
2841 break;
2842 case E_AVR_MACH_XMEGA1:
2843 strncat (buf, ", avr:101", size);
2844 break;
2845 case E_AVR_MACH_XMEGA2:
2846 strncat (buf, ", avr:102", size);
2847 break;
2848 case E_AVR_MACH_XMEGA3:
2849 strncat (buf, ", avr:103", size);
2850 break;
2851 case E_AVR_MACH_XMEGA4:
2852 strncat (buf, ", avr:104", size);
2853 break;
2854 case E_AVR_MACH_XMEGA5:
2855 strncat (buf, ", avr:105", size);
2856 break;
2857 case E_AVR_MACH_XMEGA6:
2858 strncat (buf, ", avr:106", size);
2859 break;
2860 case E_AVR_MACH_XMEGA7:
2861 strncat (buf, ", avr:107", size);
2862 break;
2863 default:
2864 strncat (buf, ", avr:<unknown>", size);
2865 break;
2866 }
2867
2868 size -= strlen (buf);
2869 if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2870 strncat (buf, ", link-relax", size);
2871 }
2872
2873 static void
2874 decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2875 {
2876 unsigned abi;
2877 unsigned arch;
2878 unsigned config;
2879 unsigned version;
2880 bfd_boolean has_fpu = FALSE;
2881 unsigned int r = 0;
2882
2883 static const char *ABI_STRINGS[] =
2884 {
2885 "ABI v0", /* use r5 as return register; only used in N1213HC */
2886 "ABI v1", /* use r0 as return register */
2887 "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2888 "ABI v2fp", /* for FPU */
2889 "AABI",
2890 "ABI2 FP+"
2891 };
2892 static const char *VER_STRINGS[] =
2893 {
2894 "Andes ELF V1.3 or older",
2895 "Andes ELF V1.3.1",
2896 "Andes ELF V1.4"
2897 };
2898 static const char *ARCH_STRINGS[] =
2899 {
2900 "",
2901 "Andes Star v1.0",
2902 "Andes Star v2.0",
2903 "Andes Star v3.0",
2904 "Andes Star v3.0m"
2905 };
2906
2907 abi = EF_NDS_ABI & e_flags;
2908 arch = EF_NDS_ARCH & e_flags;
2909 config = EF_NDS_INST & e_flags;
2910 version = EF_NDS32_ELF_VERSION & e_flags;
2911
2912 memset (buf, 0, size);
2913
2914 switch (abi)
2915 {
2916 case E_NDS_ABI_V0:
2917 case E_NDS_ABI_V1:
2918 case E_NDS_ABI_V2:
2919 case E_NDS_ABI_V2FP:
2920 case E_NDS_ABI_AABI:
2921 case E_NDS_ABI_V2FP_PLUS:
2922 /* In case there are holes in the array. */
2923 r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2924 break;
2925
2926 default:
2927 r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2928 break;
2929 }
2930
2931 switch (version)
2932 {
2933 case E_NDS32_ELF_VER_1_2:
2934 case E_NDS32_ELF_VER_1_3:
2935 case E_NDS32_ELF_VER_1_4:
2936 r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2937 break;
2938
2939 default:
2940 r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2941 break;
2942 }
2943
2944 if (E_NDS_ABI_V0 == abi)
2945 {
2946 /* OLD ABI; only used in N1213HC, has performance extension 1. */
2947 r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2948 if (arch == E_NDS_ARCH_STAR_V1_0)
2949 r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2950 return;
2951 }
2952
2953 switch (arch)
2954 {
2955 case E_NDS_ARCH_STAR_V1_0:
2956 case E_NDS_ARCH_STAR_V2_0:
2957 case E_NDS_ARCH_STAR_V3_0:
2958 case E_NDS_ARCH_STAR_V3_M:
2959 r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2960 break;
2961
2962 default:
2963 r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2964 /* ARCH version determines how the e_flags are interpreted.
2965 If it is unknown, we cannot proceed. */
2966 return;
2967 }
2968
2969 /* Newer ABI; Now handle architecture specific flags. */
2970 if (arch == E_NDS_ARCH_STAR_V1_0)
2971 {
2972 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2973 r += snprintf (buf + r, size -r, ", MFUSR_PC");
2974
2975 if (!(config & E_NDS32_HAS_NO_MAC_INST))
2976 r += snprintf (buf + r, size -r, ", MAC");
2977
2978 if (config & E_NDS32_HAS_DIV_INST)
2979 r += snprintf (buf + r, size -r, ", DIV");
2980
2981 if (config & E_NDS32_HAS_16BIT_INST)
2982 r += snprintf (buf + r, size -r, ", 16b");
2983 }
2984 else
2985 {
2986 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2987 {
2988 if (version <= E_NDS32_ELF_VER_1_3)
2989 r += snprintf (buf + r, size -r, ", [B8]");
2990 else
2991 r += snprintf (buf + r, size -r, ", EX9");
2992 }
2993
2994 if (config & E_NDS32_HAS_MAC_DX_INST)
2995 r += snprintf (buf + r, size -r, ", MAC_DX");
2996
2997 if (config & E_NDS32_HAS_DIV_DX_INST)
2998 r += snprintf (buf + r, size -r, ", DIV_DX");
2999
3000 if (config & E_NDS32_HAS_16BIT_INST)
3001 {
3002 if (version <= E_NDS32_ELF_VER_1_3)
3003 r += snprintf (buf + r, size -r, ", 16b");
3004 else
3005 r += snprintf (buf + r, size -r, ", IFC");
3006 }
3007 }
3008
3009 if (config & E_NDS32_HAS_EXT_INST)
3010 r += snprintf (buf + r, size -r, ", PERF1");
3011
3012 if (config & E_NDS32_HAS_EXT2_INST)
3013 r += snprintf (buf + r, size -r, ", PERF2");
3014
3015 if (config & E_NDS32_HAS_FPU_INST)
3016 {
3017 has_fpu = TRUE;
3018 r += snprintf (buf + r, size -r, ", FPU_SP");
3019 }
3020
3021 if (config & E_NDS32_HAS_FPU_DP_INST)
3022 {
3023 has_fpu = TRUE;
3024 r += snprintf (buf + r, size -r, ", FPU_DP");
3025 }
3026
3027 if (config & E_NDS32_HAS_FPU_MAC_INST)
3028 {
3029 has_fpu = TRUE;
3030 r += snprintf (buf + r, size -r, ", FPU_MAC");
3031 }
3032
3033 if (has_fpu)
3034 {
3035 switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
3036 {
3037 case E_NDS32_FPU_REG_8SP_4DP:
3038 r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
3039 break;
3040 case E_NDS32_FPU_REG_16SP_8DP:
3041 r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
3042 break;
3043 case E_NDS32_FPU_REG_32SP_16DP:
3044 r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
3045 break;
3046 case E_NDS32_FPU_REG_32SP_32DP:
3047 r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
3048 break;
3049 }
3050 }
3051
3052 if (config & E_NDS32_HAS_AUDIO_INST)
3053 r += snprintf (buf + r, size -r, ", AUDIO");
3054
3055 if (config & E_NDS32_HAS_STRING_INST)
3056 r += snprintf (buf + r, size -r, ", STR");
3057
3058 if (config & E_NDS32_HAS_REDUCED_REGS)
3059 r += snprintf (buf + r, size -r, ", 16REG");
3060
3061 if (config & E_NDS32_HAS_VIDEO_INST)
3062 {
3063 if (version <= E_NDS32_ELF_VER_1_3)
3064 r += snprintf (buf + r, size -r, ", VIDEO");
3065 else
3066 r += snprintf (buf + r, size -r, ", SATURATION");
3067 }
3068
3069 if (config & E_NDS32_HAS_ENCRIPT_INST)
3070 r += snprintf (buf + r, size -r, ", ENCRP");
3071
3072 if (config & E_NDS32_HAS_L2C_INST)
3073 r += snprintf (buf + r, size -r, ", L2C");
3074 }
3075
3076 static char *
3077 get_machine_flags (Filedata * filedata, unsigned e_flags, unsigned e_machine)
3078 {
3079 static char buf[1024];
3080
3081 buf[0] = '\0';
3082
3083 if (e_flags)
3084 {
3085 switch (e_machine)
3086 {
3087 default:
3088 break;
3089
3090 case EM_ARC_COMPACT2:
3091 case EM_ARC_COMPACT:
3092 decode_ARC_machine_flags (e_flags, e_machine, buf);
3093 break;
3094
3095 case EM_ARM:
3096 decode_ARM_machine_flags (e_flags, buf);
3097 break;
3098
3099 case EM_AVR:
3100 decode_AVR_machine_flags (e_flags, buf, sizeof buf);
3101 break;
3102
3103 case EM_BLACKFIN:
3104 if (e_flags & EF_BFIN_PIC)
3105 strcat (buf, ", PIC");
3106
3107 if (e_flags & EF_BFIN_FDPIC)
3108 strcat (buf, ", FDPIC");
3109
3110 if (e_flags & EF_BFIN_CODE_IN_L1)
3111 strcat (buf, ", code in L1");
3112
3113 if (e_flags & EF_BFIN_DATA_IN_L1)
3114 strcat (buf, ", data in L1");
3115
3116 break;
3117
3118 case EM_CYGNUS_FRV:
3119 switch (e_flags & EF_FRV_CPU_MASK)
3120 {
3121 case EF_FRV_CPU_GENERIC:
3122 break;
3123
3124 default:
3125 strcat (buf, ", fr???");
3126 break;
3127
3128 case EF_FRV_CPU_FR300:
3129 strcat (buf, ", fr300");
3130 break;
3131
3132 case EF_FRV_CPU_FR400:
3133 strcat (buf, ", fr400");
3134 break;
3135 case EF_FRV_CPU_FR405:
3136 strcat (buf, ", fr405");
3137 break;
3138
3139 case EF_FRV_CPU_FR450:
3140 strcat (buf, ", fr450");
3141 break;
3142
3143 case EF_FRV_CPU_FR500:
3144 strcat (buf, ", fr500");
3145 break;
3146 case EF_FRV_CPU_FR550:
3147 strcat (buf, ", fr550");
3148 break;
3149
3150 case EF_FRV_CPU_SIMPLE:
3151 strcat (buf, ", simple");
3152 break;
3153 case EF_FRV_CPU_TOMCAT:
3154 strcat (buf, ", tomcat");
3155 break;
3156 }
3157 break;
3158
3159 case EM_68K:
3160 if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
3161 strcat (buf, ", m68000");
3162 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
3163 strcat (buf, ", cpu32");
3164 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
3165 strcat (buf, ", fido_a");
3166 else
3167 {
3168 char const * isa = _("unknown");
3169 char const * mac = _("unknown mac");
3170 char const * additional = NULL;
3171
3172 switch (e_flags & EF_M68K_CF_ISA_MASK)
3173 {
3174 case EF_M68K_CF_ISA_A_NODIV:
3175 isa = "A";
3176 additional = ", nodiv";
3177 break;
3178 case EF_M68K_CF_ISA_A:
3179 isa = "A";
3180 break;
3181 case EF_M68K_CF_ISA_A_PLUS:
3182 isa = "A+";
3183 break;
3184 case EF_M68K_CF_ISA_B_NOUSP:
3185 isa = "B";
3186 additional = ", nousp";
3187 break;
3188 case EF_M68K_CF_ISA_B:
3189 isa = "B";
3190 break;
3191 case EF_M68K_CF_ISA_C:
3192 isa = "C";
3193 break;
3194 case EF_M68K_CF_ISA_C_NODIV:
3195 isa = "C";
3196 additional = ", nodiv";
3197 break;
3198 }
3199 strcat (buf, ", cf, isa ");
3200 strcat (buf, isa);
3201 if (additional)
3202 strcat (buf, additional);
3203 if (e_flags & EF_M68K_CF_FLOAT)
3204 strcat (buf, ", float");
3205 switch (e_flags & EF_M68K_CF_MAC_MASK)
3206 {
3207 case 0:
3208 mac = NULL;
3209 break;
3210 case EF_M68K_CF_MAC:
3211 mac = "mac";
3212 break;
3213 case EF_M68K_CF_EMAC:
3214 mac = "emac";
3215 break;
3216 case EF_M68K_CF_EMAC_B:
3217 mac = "emac_b";
3218 break;
3219 }
3220 if (mac)
3221 {
3222 strcat (buf, ", ");
3223 strcat (buf, mac);
3224 }
3225 }
3226 break;
3227
3228 case EM_CYGNUS_MEP:
3229 switch (e_flags & EF_MEP_CPU_MASK)
3230 {
3231 case EF_MEP_CPU_MEP: strcat (buf, ", generic MeP"); break;
3232 case EF_MEP_CPU_C2: strcat (buf, ", MeP C2"); break;
3233 case EF_MEP_CPU_C3: strcat (buf, ", MeP C3"); break;
3234 case EF_MEP_CPU_C4: strcat (buf, ", MeP C4"); break;
3235 case EF_MEP_CPU_C5: strcat (buf, ", MeP C5"); break;
3236 case EF_MEP_CPU_H1: strcat (buf, ", MeP H1"); break;
3237 default: strcat (buf, _(", <unknown MeP cpu type>")); break;
3238 }
3239
3240 switch (e_flags & EF_MEP_COP_MASK)
3241 {
3242 case EF_MEP_COP_NONE: break;
3243 case EF_MEP_COP_AVC: strcat (buf, ", AVC coprocessor"); break;
3244 case EF_MEP_COP_AVC2: strcat (buf, ", AVC2 coprocessor"); break;
3245 case EF_MEP_COP_FMAX: strcat (buf, ", FMAX coprocessor"); break;
3246 case EF_MEP_COP_IVC2: strcat (buf, ", IVC2 coprocessor"); break;
3247 default: strcat (buf, _("<unknown MeP copro type>")); break;
3248 }
3249
3250 if (e_flags & EF_MEP_LIBRARY)
3251 strcat (buf, ", Built for Library");
3252
3253 if (e_flags & EF_MEP_INDEX_MASK)
3254 sprintf (buf + strlen (buf), ", Configuration Index: %#x",
3255 e_flags & EF_MEP_INDEX_MASK);
3256
3257 if (e_flags & ~ EF_MEP_ALL_FLAGS)
3258 sprintf (buf + strlen (buf), _(", unknown flags bits: %#x"),
3259 e_flags & ~ EF_MEP_ALL_FLAGS);
3260 break;
3261
3262 case EM_PPC:
3263 if (e_flags & EF_PPC_EMB)
3264 strcat (buf, ", emb");
3265
3266 if (e_flags & EF_PPC_RELOCATABLE)
3267 strcat (buf, _(", relocatable"));
3268
3269 if (e_flags & EF_PPC_RELOCATABLE_LIB)
3270 strcat (buf, _(", relocatable-lib"));
3271 break;
3272
3273 case EM_PPC64:
3274 if (e_flags & EF_PPC64_ABI)
3275 {
3276 char abi[] = ", abiv0";
3277
3278 abi[6] += e_flags & EF_PPC64_ABI;
3279 strcat (buf, abi);
3280 }
3281 break;
3282
3283 case EM_V800:
3284 if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
3285 strcat (buf, ", RH850 ABI");
3286
3287 if (e_flags & EF_V800_850E3)
3288 strcat (buf, ", V3 architecture");
3289
3290 if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
3291 strcat (buf, ", FPU not used");
3292
3293 if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
3294 strcat (buf, ", regmode: COMMON");
3295
3296 if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
3297 strcat (buf, ", r4 not used");
3298
3299 if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
3300 strcat (buf, ", r30 not used");
3301
3302 if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
3303 strcat (buf, ", r5 not used");
3304
3305 if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
3306 strcat (buf, ", r2 not used");
3307
3308 for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
3309 {
3310 switch (e_flags & - e_flags)
3311 {
3312 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
3313 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
3314 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
3315 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
3316 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
3317 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
3318 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
3319 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
3320 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
3321 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
3322 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
3323 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
3324 default: break;
3325 }
3326 }
3327 break;
3328
3329 case EM_V850:
3330 case EM_CYGNUS_V850:
3331 switch (e_flags & EF_V850_ARCH)
3332 {
3333 case E_V850E3V5_ARCH:
3334 strcat (buf, ", v850e3v5");
3335 break;
3336 case E_V850E2V3_ARCH:
3337 strcat (buf, ", v850e2v3");
3338 break;
3339 case E_V850E2_ARCH:
3340 strcat (buf, ", v850e2");
3341 break;
3342 case E_V850E1_ARCH:
3343 strcat (buf, ", v850e1");
3344 break;
3345 case E_V850E_ARCH:
3346 strcat (buf, ", v850e");
3347 break;
3348 case E_V850_ARCH:
3349 strcat (buf, ", v850");
3350 break;
3351 default:
3352 strcat (buf, _(", unknown v850 architecture variant"));
3353 break;
3354 }
3355 break;
3356
3357 case EM_M32R:
3358 case EM_CYGNUS_M32R:
3359 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3360 strcat (buf, ", m32r");
3361 break;
3362
3363 case EM_MIPS:
3364 case EM_MIPS_RS3_LE:
3365 if (e_flags & EF_MIPS_NOREORDER)
3366 strcat (buf, ", noreorder");
3367
3368 if (e_flags & EF_MIPS_PIC)
3369 strcat (buf, ", pic");
3370
3371 if (e_flags & EF_MIPS_CPIC)
3372 strcat (buf, ", cpic");
3373
3374 if (e_flags & EF_MIPS_UCODE)
3375 strcat (buf, ", ugen_reserved");
3376
3377 if (e_flags & EF_MIPS_ABI2)
3378 strcat (buf, ", abi2");
3379
3380 if (e_flags & EF_MIPS_OPTIONS_FIRST)
3381 strcat (buf, ", odk first");
3382
3383 if (e_flags & EF_MIPS_32BITMODE)
3384 strcat (buf, ", 32bitmode");
3385
3386 if (e_flags & EF_MIPS_NAN2008)
3387 strcat (buf, ", nan2008");
3388
3389 if (e_flags & EF_MIPS_FP64)
3390 strcat (buf, ", fp64");
3391
3392 switch ((e_flags & EF_MIPS_MACH))
3393 {
3394 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3395 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3396 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
3397 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
3398 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3399 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3400 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3401 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
3402 case E_MIPS_MACH_5900: strcat (buf, ", 5900"); break;
3403 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
3404 case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
3405 case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3406 case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
3407 case E_MIPS_MACH_GS464: strcat (buf, ", gs464"); break;
3408 case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
3409 case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
3410 case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
3411 case E_MIPS_MACH_XLR: strcat (buf, ", xlr"); break;
3412 case E_MIPS_MACH_IAMR2: strcat (buf, ", interaptiv-mr2"); break;
3413 case 0:
3414 /* We simply ignore the field in this case to avoid confusion:
3415 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3416 extension. */
3417 break;
3418 default: strcat (buf, _(", unknown CPU")); break;
3419 }
3420
3421 switch ((e_flags & EF_MIPS_ABI))
3422 {
3423 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3424 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3425 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3426 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3427 case 0:
3428 /* We simply ignore the field in this case to avoid confusion:
3429 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3430 This means it is likely to be an o32 file, but not for
3431 sure. */
3432 break;
3433 default: strcat (buf, _(", unknown ABI")); break;
3434 }
3435
3436 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3437 strcat (buf, ", mdmx");
3438
3439 if (e_flags & EF_MIPS_ARCH_ASE_M16)
3440 strcat (buf, ", mips16");
3441
3442 if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3443 strcat (buf, ", micromips");
3444
3445 switch ((e_flags & EF_MIPS_ARCH))
3446 {
3447 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3448 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3449 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3450 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3451 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3452 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
3453 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
3454 case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
3455 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
3456 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
3457 case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
3458 default: strcat (buf, _(", unknown ISA")); break;
3459 }
3460 break;
3461
3462 case EM_NDS32:
3463 decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3464 break;
3465
3466 case EM_NFP:
3467 switch (EF_NFP_MACH (e_flags))
3468 {
3469 case E_NFP_MACH_3200:
3470 strcat (buf, ", NFP-32xx");
3471 break;
3472 case E_NFP_MACH_6000:
3473 strcat (buf, ", NFP-6xxx");
3474 break;
3475 }
3476 break;
3477
3478 case EM_RISCV:
3479 if (e_flags & EF_RISCV_RVC)
3480 strcat (buf, ", RVC");
3481
3482 if (e_flags & EF_RISCV_RVE)
3483 strcat (buf, ", RVE");
3484
3485 switch (e_flags & EF_RISCV_FLOAT_ABI)
3486 {
3487 case EF_RISCV_FLOAT_ABI_SOFT:
3488 strcat (buf, ", soft-float ABI");
3489 break;
3490
3491 case EF_RISCV_FLOAT_ABI_SINGLE:
3492 strcat (buf, ", single-float ABI");
3493 break;
3494
3495 case EF_RISCV_FLOAT_ABI_DOUBLE:
3496 strcat (buf, ", double-float ABI");
3497 break;
3498
3499 case EF_RISCV_FLOAT_ABI_QUAD:
3500 strcat (buf, ", quad-float ABI");
3501 break;
3502 }
3503 break;
3504
3505 case EM_SH:
3506 switch ((e_flags & EF_SH_MACH_MASK))
3507 {
3508 case EF_SH1: strcat (buf, ", sh1"); break;
3509 case EF_SH2: strcat (buf, ", sh2"); break;
3510 case EF_SH3: strcat (buf, ", sh3"); break;
3511 case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3512 case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3513 case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3514 case EF_SH3E: strcat (buf, ", sh3e"); break;
3515 case EF_SH4: strcat (buf, ", sh4"); break;
3516 case EF_SH5: strcat (buf, ", sh5"); break;
3517 case EF_SH2E: strcat (buf, ", sh2e"); break;
3518 case EF_SH4A: strcat (buf, ", sh4a"); break;
3519 case EF_SH2A: strcat (buf, ", sh2a"); break;
3520 case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3521 case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
3522 case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
3523 case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3524 case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3525 case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3526 case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3527 case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3528 case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
3529 default: strcat (buf, _(", unknown ISA")); break;
3530 }
3531
3532 if (e_flags & EF_SH_PIC)
3533 strcat (buf, ", pic");
3534
3535 if (e_flags & EF_SH_FDPIC)
3536 strcat (buf, ", fdpic");
3537 break;
3538
3539 case EM_OR1K:
3540 if (e_flags & EF_OR1K_NODELAY)
3541 strcat (buf, ", no delay");
3542 break;
3543
3544 case EM_SPARCV9:
3545 if (e_flags & EF_SPARC_32PLUS)
3546 strcat (buf, ", v8+");
3547
3548 if (e_flags & EF_SPARC_SUN_US1)
3549 strcat (buf, ", ultrasparcI");
3550
3551 if (e_flags & EF_SPARC_SUN_US3)
3552 strcat (buf, ", ultrasparcIII");
3553
3554 if (e_flags & EF_SPARC_HAL_R1)
3555 strcat (buf, ", halr1");
3556
3557 if (e_flags & EF_SPARC_LEDATA)
3558 strcat (buf, ", ledata");
3559
3560 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3561 strcat (buf, ", tso");
3562
3563 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3564 strcat (buf, ", pso");
3565
3566 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3567 strcat (buf, ", rmo");
3568 break;
3569
3570 case EM_PARISC:
3571 switch (e_flags & EF_PARISC_ARCH)
3572 {
3573 case EFA_PARISC_1_0:
3574 strcpy (buf, ", PA-RISC 1.0");
3575 break;
3576 case EFA_PARISC_1_1:
3577 strcpy (buf, ", PA-RISC 1.1");
3578 break;
3579 case EFA_PARISC_2_0:
3580 strcpy (buf, ", PA-RISC 2.0");
3581 break;
3582 default:
3583 break;
3584 }
3585 if (e_flags & EF_PARISC_TRAPNIL)
3586 strcat (buf, ", trapnil");
3587 if (e_flags & EF_PARISC_EXT)
3588 strcat (buf, ", ext");
3589 if (e_flags & EF_PARISC_LSB)
3590 strcat (buf, ", lsb");
3591 if (e_flags & EF_PARISC_WIDE)
3592 strcat (buf, ", wide");
3593 if (e_flags & EF_PARISC_NO_KABP)
3594 strcat (buf, ", no kabp");
3595 if (e_flags & EF_PARISC_LAZYSWAP)
3596 strcat (buf, ", lazyswap");
3597 break;
3598
3599 case EM_PJ:
3600 case EM_PJ_OLD:
3601 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3602 strcat (buf, ", new calling convention");
3603
3604 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3605 strcat (buf, ", gnu calling convention");
3606 break;
3607
3608 case EM_IA_64:
3609 if ((e_flags & EF_IA_64_ABI64))
3610 strcat (buf, ", 64-bit");
3611 else
3612 strcat (buf, ", 32-bit");
3613 if ((e_flags & EF_IA_64_REDUCEDFP))
3614 strcat (buf, ", reduced fp model");
3615 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3616 strcat (buf, ", no function descriptors, constant gp");
3617 else if ((e_flags & EF_IA_64_CONS_GP))
3618 strcat (buf, ", constant gp");
3619 if ((e_flags & EF_IA_64_ABSOLUTE))
3620 strcat (buf, ", absolute");
3621 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3622 {
3623 if ((e_flags & EF_IA_64_VMS_LINKAGES))
3624 strcat (buf, ", vms_linkages");
3625 switch ((e_flags & EF_IA_64_VMS_COMCOD))
3626 {
3627 case EF_IA_64_VMS_COMCOD_SUCCESS:
3628 break;
3629 case EF_IA_64_VMS_COMCOD_WARNING:
3630 strcat (buf, ", warning");
3631 break;
3632 case EF_IA_64_VMS_COMCOD_ERROR:
3633 strcat (buf, ", error");
3634 break;
3635 case EF_IA_64_VMS_COMCOD_ABORT:
3636 strcat (buf, ", abort");
3637 break;
3638 default:
3639 warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3640 e_flags & EF_IA_64_VMS_COMCOD);
3641 strcat (buf, ", <unknown>");
3642 }
3643 }
3644 break;
3645
3646 case EM_VAX:
3647 if ((e_flags & EF_VAX_NONPIC))
3648 strcat (buf, ", non-PIC");
3649 if ((e_flags & EF_VAX_DFLOAT))
3650 strcat (buf, ", D-Float");
3651 if ((e_flags & EF_VAX_GFLOAT))
3652 strcat (buf, ", G-Float");
3653 break;
3654
3655 case EM_VISIUM:
3656 if (e_flags & EF_VISIUM_ARCH_MCM)
3657 strcat (buf, ", mcm");
3658 else if (e_flags & EF_VISIUM_ARCH_MCM24)
3659 strcat (buf, ", mcm24");
3660 if (e_flags & EF_VISIUM_ARCH_GR6)
3661 strcat (buf, ", gr6");
3662 break;
3663
3664 case EM_RL78:
3665 switch (e_flags & E_FLAG_RL78_CPU_MASK)
3666 {
3667 case E_FLAG_RL78_ANY_CPU: break;
3668 case E_FLAG_RL78_G10: strcat (buf, ", G10"); break;
3669 case E_FLAG_RL78_G13: strcat (buf, ", G13"); break;
3670 case E_FLAG_RL78_G14: strcat (buf, ", G14"); break;
3671 }
3672 if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3673 strcat (buf, ", 64-bit doubles");
3674 break;
3675
3676 case EM_RX:
3677 if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3678 strcat (buf, ", 64-bit doubles");
3679 if (e_flags & E_FLAG_RX_DSP)
3680 strcat (buf, ", dsp");
3681 if (e_flags & E_FLAG_RX_PID)
3682 strcat (buf, ", pid");
3683 if (e_flags & E_FLAG_RX_ABI)
3684 strcat (buf, ", RX ABI");
3685 if (e_flags & E_FLAG_RX_SINSNS_SET)
3686 strcat (buf, e_flags & E_FLAG_RX_SINSNS_YES
3687 ? ", uses String instructions" : ", bans String instructions");
3688 if (e_flags & E_FLAG_RX_V2)
3689 strcat (buf, ", V2");
3690 break;
3691
3692 case EM_S390:
3693 if (e_flags & EF_S390_HIGH_GPRS)
3694 strcat (buf, ", highgprs");
3695 break;
3696
3697 case EM_TI_C6000:
3698 if ((e_flags & EF_C6000_REL))
3699 strcat (buf, ", relocatable module");
3700 break;
3701
3702 case EM_MSP430:
3703 strcat (buf, _(": architecture variant: "));
3704 switch (e_flags & EF_MSP430_MACH)
3705 {
3706 case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3707 case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3708 case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3709 case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3710 case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3711 case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3712 case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3713 case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3714 case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3715 case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3716 case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3717 case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3718 case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3719 case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3720 case E_MSP430_MACH_MSP430X : strcat (buf, "MSP430X"); break;
3721 default:
3722 strcat (buf, _(": unknown")); break;
3723 }
3724
3725 if (e_flags & ~ EF_MSP430_MACH)
3726 strcat (buf, _(": unknown extra flag bits also present"));
3727 }
3728 }
3729
3730 return buf;
3731 }
3732
3733 static const char *
3734 get_osabi_name (Filedata * filedata, unsigned int osabi)
3735 {
3736 static char buff[32];
3737
3738 switch (osabi)
3739 {
3740 case ELFOSABI_NONE: return "UNIX - System V";
3741 case ELFOSABI_HPUX: return "UNIX - HP-UX";
3742 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
3743 case ELFOSABI_GNU: return "UNIX - GNU";
3744 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
3745 case ELFOSABI_AIX: return "UNIX - AIX";
3746 case ELFOSABI_IRIX: return "UNIX - IRIX";
3747 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
3748 case ELFOSABI_TRU64: return "UNIX - TRU64";
3749 case ELFOSABI_MODESTO: return "Novell - Modesto";
3750 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
3751 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
3752 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
3753 case ELFOSABI_AROS: return "AROS";
3754 case ELFOSABI_FENIXOS: return "FenixOS";
3755 case ELFOSABI_CLOUDABI: return "Nuxi CloudABI";
3756 case ELFOSABI_OPENVOS: return "Stratus Technologies OpenVOS";
3757 default:
3758 if (osabi >= 64)
3759 switch (filedata->file_header.e_machine)
3760 {
3761 case EM_ARM:
3762 switch (osabi)
3763 {
3764 case ELFOSABI_ARM: return "ARM";
3765 case ELFOSABI_ARM_FDPIC: return "ARM FDPIC";
3766 default:
3767 break;
3768 }
3769 break;
3770
3771 case EM_MSP430:
3772 case EM_MSP430_OLD:
3773 case EM_VISIUM:
3774 switch (osabi)
3775 {
3776 case ELFOSABI_STANDALONE: return _("Standalone App");
3777 default:
3778 break;
3779 }
3780 break;
3781
3782 case EM_TI_C6000:
3783 switch (osabi)
3784 {
3785 case ELFOSABI_C6000_ELFABI: return _("Bare-metal C6000");
3786 case ELFOSABI_C6000_LINUX: return "Linux C6000";
3787 default:
3788 break;
3789 }
3790 break;
3791
3792 default:
3793 break;
3794 }
3795 snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3796 return buff;
3797 }
3798 }
3799
3800 static const char *
3801 get_aarch64_segment_type (unsigned long type)
3802 {
3803 switch (type)
3804 {
3805 case PT_AARCH64_ARCHEXT: return "AARCH64_ARCHEXT";
3806 default: return NULL;
3807 }
3808 }
3809
3810 static const char *
3811 get_arm_segment_type (unsigned long type)
3812 {
3813 switch (type)
3814 {
3815 case PT_ARM_EXIDX: return "EXIDX";
3816 default: return NULL;
3817 }
3818 }
3819
3820 static const char *
3821 get_s390_segment_type (unsigned long type)
3822 {
3823 switch (type)
3824 {
3825 case PT_S390_PGSTE: return "S390_PGSTE";
3826 default: return NULL;
3827 }
3828 }
3829
3830 static const char *
3831 get_mips_segment_type (unsigned long type)
3832 {
3833 switch (type)
3834 {
3835 case PT_MIPS_REGINFO: return "REGINFO";
3836 case PT_MIPS_RTPROC: return "RTPROC";
3837 case PT_MIPS_OPTIONS: return "OPTIONS";
3838 case PT_MIPS_ABIFLAGS: return "ABIFLAGS";
3839 default: return NULL;
3840 }
3841 }
3842
3843 static const char *
3844 get_parisc_segment_type (unsigned long type)
3845 {
3846 switch (type)
3847 {
3848 case PT_HP_TLS: return "HP_TLS";
3849 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
3850 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
3851 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
3852 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
3853 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
3854 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
3855 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
3856 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
3857 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
3858 case PT_HP_PARALLEL: return "HP_PARALLEL";
3859 case PT_HP_FASTBIND: return "HP_FASTBIND";
3860 case PT_HP_OPT_ANNOT: return "HP_OPT_ANNOT";
3861 case PT_HP_HSL_ANNOT: return "HP_HSL_ANNOT";
3862 case PT_HP_STACK: return "HP_STACK";
3863 case PT_HP_CORE_UTSNAME: return "HP_CORE_UTSNAME";
3864 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
3865 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
3866 case PT_PARISC_WEAKORDER: return "PARISC_WEAKORDER";
3867 default: return NULL;
3868 }
3869 }
3870
3871 static const char *
3872 get_ia64_segment_type (unsigned long type)
3873 {
3874 switch (type)
3875 {
3876 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
3877 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
3878 case PT_HP_TLS: return "HP_TLS";
3879 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
3880 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
3881 case PT_IA_64_HP_STACK: return "HP_STACK";
3882 default: return NULL;
3883 }
3884 }
3885
3886 static const char *
3887 get_tic6x_segment_type (unsigned long type)
3888 {
3889 switch (type)
3890 {
3891 case PT_C6000_PHATTR: return "C6000_PHATTR";
3892 default: return NULL;
3893 }
3894 }
3895
3896 static const char *
3897 get_solaris_segment_type (unsigned long type)
3898 {
3899 switch (type)
3900 {
3901 case 0x6464e550: return "PT_SUNW_UNWIND";
3902 case 0x6474e550: return "PT_SUNW_EH_FRAME";
3903 case 0x6ffffff7: return "PT_LOSUNW";
3904 case 0x6ffffffa: return "PT_SUNWBSS";
3905 case 0x6ffffffb: return "PT_SUNWSTACK";
3906 case 0x6ffffffc: return "PT_SUNWDTRACE";
3907 case 0x6ffffffd: return "PT_SUNWCAP";
3908 case 0x6fffffff: return "PT_HISUNW";
3909 default: return NULL;
3910 }
3911 }
3912
3913 static const char *
3914 get_segment_type (Filedata * filedata, unsigned long p_type)
3915 {
3916 static char buff[32];
3917
3918 switch (p_type)
3919 {
3920 case PT_NULL: return "NULL";
3921 case PT_LOAD: return "LOAD";
3922 case PT_DYNAMIC: return "DYNAMIC";
3923 case PT_INTERP: return "INTERP";
3924 case PT_NOTE: return "NOTE";
3925 case PT_SHLIB: return "SHLIB";
3926 case PT_PHDR: return "PHDR";
3927 case PT_TLS: return "TLS";
3928 case PT_GNU_EH_FRAME: return "GNU_EH_FRAME";
3929 case PT_GNU_STACK: return "GNU_STACK";
3930 case PT_GNU_RELRO: return "GNU_RELRO";
3931
3932 default:
3933 if (p_type >= PT_GNU_MBIND_LO && p_type <= PT_GNU_MBIND_HI)
3934 {
3935 sprintf (buff, "GNU_MBIND+%#lx",
3936 p_type - PT_GNU_MBIND_LO);
3937 }
3938 else if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3939 {
3940 const char * result;
3941
3942 switch (filedata->file_header.e_machine)
3943 {
3944 case EM_AARCH64:
3945 result = get_aarch64_segment_type (p_type);
3946 break;
3947 case EM_ARM:
3948 result = get_arm_segment_type (p_type);
3949 break;
3950 case EM_MIPS:
3951 case EM_MIPS_RS3_LE:
3952 result = get_mips_segment_type (p_type);
3953 break;
3954 case EM_PARISC:
3955 result = get_parisc_segment_type (p_type);
3956 break;
3957 case EM_IA_64:
3958 result = get_ia64_segment_type (p_type);
3959 break;
3960 case EM_TI_C6000:
3961 result = get_tic6x_segment_type (p_type);
3962 break;
3963 case EM_S390:
3964 case EM_S390_OLD:
3965 result = get_s390_segment_type (p_type);
3966 break;
3967 default:
3968 result = NULL;
3969 break;
3970 }
3971
3972 if (result != NULL)
3973 return result;
3974
3975 sprintf (buff, "LOPROC+%#lx", p_type - PT_LOPROC);
3976 }
3977 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3978 {
3979 const char * result;
3980
3981 switch (filedata->file_header.e_machine)
3982 {
3983 case EM_PARISC:
3984 result = get_parisc_segment_type (p_type);
3985 break;
3986 case EM_IA_64:
3987 result = get_ia64_segment_type (p_type);
3988 break;
3989 default:
3990 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
3991 result = get_solaris_segment_type (p_type);
3992 else
3993 result = NULL;
3994 break;
3995 }
3996
3997 if (result != NULL)
3998 return result;
3999
4000 sprintf (buff, "LOOS+%#lx", p_type - PT_LOOS);
4001 }
4002 else
4003 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
4004
4005 return buff;
4006 }
4007 }
4008
4009 static const char *
4010 get_arc_section_type_name (unsigned int sh_type)
4011 {
4012 switch (sh_type)
4013 {
4014 case SHT_ARC_ATTRIBUTES: return "ARC_ATTRIBUTES";
4015 default:
4016 break;
4017 }
4018 return NULL;
4019 }
4020
4021 static const char *
4022 get_mips_section_type_name (unsigned int sh_type)
4023 {
4024 switch (sh_type)
4025 {
4026 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
4027 case SHT_MIPS_MSYM: return "MIPS_MSYM";
4028 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
4029 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
4030 case SHT_MIPS_UCODE: return "MIPS_UCODE";
4031 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
4032 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
4033 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
4034 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
4035 case SHT_MIPS_RELD: return "MIPS_RELD";
4036 case SHT_MIPS_IFACE: return "MIPS_IFACE";
4037 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
4038 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
4039 case SHT_MIPS_SHDR: return "MIPS_SHDR";
4040 case SHT_MIPS_FDESC: return "MIPS_FDESC";
4041 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
4042 case SHT_MIPS_DENSE: return "MIPS_DENSE";
4043 case SHT_MIPS_PDESC: return "MIPS_PDESC";
4044 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
4045 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
4046 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
4047 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
4048 case SHT_MIPS_LINE: return "MIPS_LINE";
4049 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
4050 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
4051 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
4052 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
4053 case SHT_MIPS_DWARF: return "MIPS_DWARF";
4054 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
4055 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
4056 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
4057 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
4058 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
4059 case SHT_MIPS_XLATE: return "MIPS_XLATE";
4060 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
4061 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
4062 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
4063 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
4064 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
4065 case SHT_MIPS_ABIFLAGS: return "MIPS_ABIFLAGS";
4066 default:
4067 break;
4068 }
4069 return NULL;
4070 }
4071
4072 static const char *
4073 get_parisc_section_type_name (unsigned int sh_type)
4074 {
4075 switch (sh_type)
4076 {
4077 case SHT_PARISC_EXT: return "PARISC_EXT";
4078 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
4079 case SHT_PARISC_DOC: return "PARISC_DOC";
4080 case SHT_PARISC_ANNOT: return "PARISC_ANNOT";
4081 case SHT_PARISC_SYMEXTN: return "PARISC_SYMEXTN";
4082 case SHT_PARISC_STUBS: return "PARISC_STUBS";
4083 case SHT_PARISC_DLKM: return "PARISC_DLKM";
4084 default: return NULL;
4085 }
4086 }
4087
4088 static const char *
4089 get_ia64_section_type_name (Filedata * filedata, unsigned int sh_type)
4090 {
4091 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
4092 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
4093 return get_osabi_name (filedata, (sh_type & 0x00FF0000) >> 16);
4094
4095 switch (sh_type)
4096 {
4097 case SHT_IA_64_EXT: return "IA_64_EXT";
4098 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
4099 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
4100 case SHT_IA_64_VMS_TRACE: return "VMS_TRACE";
4101 case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
4102 case SHT_IA_64_VMS_DEBUG: return "VMS_DEBUG";
4103 case SHT_IA_64_VMS_DEBUG_STR: return "VMS_DEBUG_STR";
4104 case SHT_IA_64_VMS_LINKAGES: return "VMS_LINKAGES";
4105 case SHT_IA_64_VMS_SYMBOL_VECTOR: return "VMS_SYMBOL_VECTOR";
4106 case SHT_IA_64_VMS_FIXUP: return "VMS_FIXUP";
4107 default:
4108 break;
4109 }
4110 return NULL;
4111 }
4112
4113 static const char *
4114 get_x86_64_section_type_name (unsigned int sh_type)
4115 {
4116 switch (sh_type)
4117 {
4118 case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
4119 default: return NULL;
4120 }
4121 }
4122
4123 static const char *
4124 get_aarch64_section_type_name (unsigned int sh_type)
4125 {
4126 switch (sh_type)
4127 {
4128 case SHT_AARCH64_ATTRIBUTES: return "AARCH64_ATTRIBUTES";
4129 default: return NULL;
4130 }
4131 }
4132
4133 static const char *
4134 get_arm_section_type_name (unsigned int sh_type)
4135 {
4136 switch (sh_type)
4137 {
4138 case SHT_ARM_EXIDX: return "ARM_EXIDX";
4139 case SHT_ARM_PREEMPTMAP: return "ARM_PREEMPTMAP";
4140 case SHT_ARM_ATTRIBUTES: return "ARM_ATTRIBUTES";
4141 case SHT_ARM_DEBUGOVERLAY: return "ARM_DEBUGOVERLAY";
4142 case SHT_ARM_OVERLAYSECTION: return "ARM_OVERLAYSECTION";
4143 default: return NULL;
4144 }
4145 }
4146
4147 static const char *
4148 get_tic6x_section_type_name (unsigned int sh_type)
4149 {
4150 switch (sh_type)
4151 {
4152 case SHT_C6000_UNWIND: return "C6000_UNWIND";
4153 case SHT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
4154 case SHT_C6000_ATTRIBUTES: return "C6000_ATTRIBUTES";
4155 case SHT_TI_ICODE: return "TI_ICODE";
4156 case SHT_TI_XREF: return "TI_XREF";
4157 case SHT_TI_HANDLER: return "TI_HANDLER";
4158 case SHT_TI_INITINFO: return "TI_INITINFO";
4159 case SHT_TI_PHATTRS: return "TI_PHATTRS";
4160 default: return NULL;
4161 }
4162 }
4163
4164 static const char *
4165 get_msp430x_section_type_name (unsigned int sh_type)
4166 {
4167 switch (sh_type)
4168 {
4169 case SHT_MSP430_SEC_FLAGS: return "MSP430_SEC_FLAGS";
4170 case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
4171 case SHT_MSP430_ATTRIBUTES: return "MSP430_ATTRIBUTES";
4172 default: return NULL;
4173 }
4174 }
4175
4176 static const char *
4177 get_nfp_section_type_name (unsigned int sh_type)
4178 {
4179 switch (sh_type)
4180 {
4181 case SHT_NFP_MECONFIG: return "NFP_MECONFIG";
4182 case SHT_NFP_INITREG: return "NFP_INITREG";
4183 case SHT_NFP_UDEBUG: return "NFP_UDEBUG";
4184 default: return NULL;
4185 }
4186 }
4187
4188 static const char *
4189 get_v850_section_type_name (unsigned int sh_type)
4190 {
4191 switch (sh_type)
4192 {
4193 case SHT_V850_SCOMMON: return "V850 Small Common";
4194 case SHT_V850_TCOMMON: return "V850 Tiny Common";
4195 case SHT_V850_ZCOMMON: return "V850 Zero Common";
4196 case SHT_RENESAS_IOP: return "RENESAS IOP";
4197 case SHT_RENESAS_INFO: return "RENESAS INFO";
4198 default: return NULL;
4199 }
4200 }
4201
4202 static const char *
4203 get_section_type_name (Filedata * filedata, unsigned int sh_type)
4204 {
4205 static char buff[32];
4206 const char * result;
4207
4208 switch (sh_type)
4209 {
4210 case SHT_NULL: return "NULL";
4211 case SHT_PROGBITS: return "PROGBITS";
4212 case SHT_SYMTAB: return "SYMTAB";
4213 case SHT_STRTAB: return "STRTAB";
4214 case SHT_RELA: return "RELA";
4215 case SHT_HASH: return "HASH";
4216 case SHT_DYNAMIC: return "DYNAMIC";
4217 case SHT_NOTE: return "NOTE";
4218 case SHT_NOBITS: return "NOBITS";
4219 case SHT_REL: return "REL";
4220 case SHT_SHLIB: return "SHLIB";
4221 case SHT_DYNSYM: return "DYNSYM";
4222 case SHT_INIT_ARRAY: return "INIT_ARRAY";
4223 case SHT_FINI_ARRAY: return "FINI_ARRAY";
4224 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
4225 case SHT_GNU_HASH: return "GNU_HASH";
4226 case SHT_GROUP: return "GROUP";
4227 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICES";
4228 case SHT_GNU_verdef: return "VERDEF";
4229 case SHT_GNU_verneed: return "VERNEED";
4230 case SHT_GNU_versym: return "VERSYM";
4231 case 0x6ffffff0: return "VERSYM";
4232 case 0x6ffffffc: return "VERDEF";
4233 case 0x7ffffffd: return "AUXILIARY";
4234 case 0x7fffffff: return "FILTER";
4235 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
4236
4237 default:
4238 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
4239 {
4240 switch (filedata->file_header.e_machine)
4241 {
4242 case EM_ARC:
4243 case EM_ARC_COMPACT:
4244 case EM_ARC_COMPACT2:
4245 result = get_arc_section_type_name (sh_type);
4246 break;
4247 case EM_MIPS:
4248 case EM_MIPS_RS3_LE:
4249 result = get_mips_section_type_name (sh_type);
4250 break;
4251 case EM_PARISC:
4252 result = get_parisc_section_type_name (sh_type);
4253 break;
4254 case EM_IA_64:
4255 result = get_ia64_section_type_name (filedata, sh_type);
4256 break;
4257 case EM_X86_64:
4258 case EM_L1OM:
4259 case EM_K1OM:
4260 result = get_x86_64_section_type_name (sh_type);
4261 break;
4262 case EM_AARCH64:
4263 result = get_aarch64_section_type_name (sh_type);
4264 break;
4265 case EM_ARM:
4266 result = get_arm_section_type_name (sh_type);
4267 break;
4268 case EM_TI_C6000:
4269 result = get_tic6x_section_type_name (sh_type);
4270 break;
4271 case EM_MSP430:
4272 result = get_msp430x_section_type_name (sh_type);
4273 break;
4274 case EM_NFP:
4275 result = get_nfp_section_type_name (sh_type);
4276 break;
4277 case EM_V800:
4278 case EM_V850:
4279 case EM_CYGNUS_V850:
4280 result = get_v850_section_type_name (sh_type);
4281 break;
4282 default:
4283 result = NULL;
4284 break;
4285 }
4286
4287 if (result != NULL)
4288 return result;
4289
4290 sprintf (buff, "LOPROC+%#x", sh_type - SHT_LOPROC);
4291 }
4292 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
4293 {
4294 switch (filedata->file_header.e_machine)
4295 {
4296 case EM_IA_64:
4297 result = get_ia64_section_type_name (filedata, sh_type);
4298 break;
4299 default:
4300 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
4301 result = get_solaris_section_type (sh_type);
4302 else
4303 {
4304 switch (sh_type)
4305 {
4306 case SHT_GNU_INCREMENTAL_INPUTS: result = "GNU_INCREMENTAL_INPUTS"; break;
4307 case SHT_GNU_ATTRIBUTES: result = "GNU_ATTRIBUTES"; break;
4308 case SHT_GNU_HASH: result = "GNU_HASH"; break;
4309 case SHT_GNU_LIBLIST: result = "GNU_LIBLIST"; break;
4310 default:
4311 result = NULL;
4312 break;
4313 }
4314 }
4315 break;
4316 }
4317
4318 if (result != NULL)
4319 return result;
4320
4321 sprintf (buff, "LOOS+%#x", sh_type - SHT_LOOS);
4322 }
4323 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
4324 {
4325 switch (filedata->file_header.e_machine)
4326 {
4327 case EM_V800:
4328 case EM_V850:
4329 case EM_CYGNUS_V850:
4330 result = get_v850_section_type_name (sh_type);
4331 break;
4332 default:
4333 result = NULL;
4334 break;
4335 }
4336
4337 if (result != NULL)
4338 return result;
4339
4340 sprintf (buff, "LOUSER+%#x", sh_type - SHT_LOUSER);
4341 }
4342 else
4343 /* This message is probably going to be displayed in a 15
4344 character wide field, so put the hex value first. */
4345 snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
4346
4347 return buff;
4348 }
4349 }
4350
4351 #define OPTION_DEBUG_DUMP 512
4352 #define OPTION_DYN_SYMS 513
4353 #define OPTION_DWARF_DEPTH 514
4354 #define OPTION_DWARF_START 515
4355 #define OPTION_DWARF_CHECK 516
4356
4357 static struct option options[] =
4358 {
4359 {"all", no_argument, 0, 'a'},
4360 {"file-header", no_argument, 0, 'h'},
4361 {"program-headers", no_argument, 0, 'l'},
4362 {"headers", no_argument, 0, 'e'},
4363 {"histogram", no_argument, 0, 'I'},
4364 {"segments", no_argument, 0, 'l'},
4365 {"sections", no_argument, 0, 'S'},
4366 {"section-headers", no_argument, 0, 'S'},
4367 {"section-groups", no_argument, 0, 'g'},
4368 {"section-details", no_argument, 0, 't'},
4369 {"full-section-name",no_argument, 0, 'N'},
4370 {"symbols", no_argument, 0, 's'},
4371 {"syms", no_argument, 0, 's'},
4372 {"dyn-syms", no_argument, 0, OPTION_DYN_SYMS},
4373 {"relocs", no_argument, 0, 'r'},
4374 {"notes", no_argument, 0, 'n'},
4375 {"dynamic", no_argument, 0, 'd'},
4376 {"arch-specific", no_argument, 0, 'A'},
4377 {"version-info", no_argument, 0, 'V'},
4378 {"use-dynamic", no_argument, 0, 'D'},
4379 {"unwind", no_argument, 0, 'u'},
4380 {"archive-index", no_argument, 0, 'c'},
4381 {"hex-dump", required_argument, 0, 'x'},
4382 {"relocated-dump", required_argument, 0, 'R'},
4383 {"string-dump", required_argument, 0, 'p'},
4384 {"decompress", no_argument, 0, 'z'},
4385 #ifdef SUPPORT_DISASSEMBLY
4386 {"instruction-dump", required_argument, 0, 'i'},
4387 #endif
4388 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
4389
4390 {"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH},
4391 {"dwarf-start", required_argument, 0, OPTION_DWARF_START},
4392 {"dwarf-check", no_argument, 0, OPTION_DWARF_CHECK},
4393
4394 {"version", no_argument, 0, 'v'},
4395 {"wide", no_argument, 0, 'W'},
4396 {"help", no_argument, 0, 'H'},
4397 {0, no_argument, 0, 0}
4398 };
4399
4400 static void
4401 usage (FILE * stream)
4402 {
4403 fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
4404 fprintf (stream, _(" Display information about the contents of ELF format files\n"));
4405 fprintf (stream, _(" Options are:\n\
4406 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4407 -h --file-header Display the ELF file header\n\
4408 -l --program-headers Display the program headers\n\
4409 --segments An alias for --program-headers\n\
4410 -S --section-headers Display the sections' header\n\
4411 --sections An alias for --section-headers\n\
4412 -g --section-groups Display the section groups\n\
4413 -t --section-details Display the section details\n\
4414 -e --headers Equivalent to: -h -l -S\n\
4415 -s --syms Display the symbol table\n\
4416 --symbols An alias for --syms\n\
4417 --dyn-syms Display the dynamic symbol table\n\
4418 -n --notes Display the core notes (if present)\n\
4419 -r --relocs Display the relocations (if present)\n\
4420 -u --unwind Display the unwind info (if present)\n\
4421 -d --dynamic Display the dynamic section (if present)\n\
4422 -V --version-info Display the version sections (if present)\n\
4423 -A --arch-specific Display architecture specific information (if any)\n\
4424 -c --archive-index Display the symbol/file index in an archive\n\
4425 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
4426 -x --hex-dump=<number|name>\n\
4427 Dump the contents of section <number|name> as bytes\n\
4428 -p --string-dump=<number|name>\n\
4429 Dump the contents of section <number|name> as strings\n\
4430 -R --relocated-dump=<number|name>\n\
4431 Dump the contents of section <number|name> as relocated bytes\n\
4432 -z --decompress Decompress section before dumping it\n\
4433 -w[lLiaprmfFsoRtUuTgAckK] or\n\
4434 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
4435 =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
4436 =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4437 =addr,=cu_index,=links,=follow-links]\n\
4438 Display the contents of DWARF debug sections\n"));
4439 fprintf (stream, _("\
4440 --dwarf-depth=N Do not display DIEs at depth N or greater\n\
4441 --dwarf-start=N Display DIEs starting with N, at the same depth\n\
4442 or deeper\n"));
4443 #ifdef SUPPORT_DISASSEMBLY
4444 fprintf (stream, _("\
4445 -i --instruction-dump=<number|name>\n\
4446 Disassemble the contents of section <number|name>\n"));
4447 #endif
4448 fprintf (stream, _("\
4449 -I --histogram Display histogram of bucket list lengths\n\
4450 -W --wide Allow output width to exceed 80 characters\n\
4451 @<file> Read options from <file>\n\
4452 -H --help Display this information\n\
4453 -v --version Display the version number of readelf\n"));
4454
4455 if (REPORT_BUGS_TO[0] && stream == stdout)
4456 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
4457
4458 exit (stream == stdout ? 0 : 1);
4459 }
4460
4461 /* Record the fact that the user wants the contents of section number
4462 SECTION to be displayed using the method(s) encoded as flags bits
4463 in TYPE. Note, TYPE can be zero if we are creating the array for
4464 the first time. */
4465
4466 static void
4467 request_dump_bynumber (Filedata * filedata, unsigned int section, dump_type type)
4468 {
4469 if (section >= filedata->num_dump_sects)
4470 {
4471 dump_type * new_dump_sects;
4472
4473 new_dump_sects = (dump_type *) calloc (section + 1,
4474 sizeof (* new_dump_sects));
4475
4476 if (new_dump_sects == NULL)
4477 error (_("Out of memory allocating dump request table.\n"));
4478 else
4479 {
4480 if (filedata->dump_sects)
4481 {
4482 /* Copy current flag settings. */
4483 memcpy (new_dump_sects, filedata->dump_sects,
4484 filedata->num_dump_sects * sizeof (* new_dump_sects));
4485
4486 free (filedata->dump_sects);
4487 }
4488
4489 filedata->dump_sects = new_dump_sects;
4490 filedata->num_dump_sects = section + 1;
4491 }
4492 }
4493
4494 if (filedata->dump_sects)
4495 filedata->dump_sects[section] |= type;
4496 }
4497
4498 /* Request a dump by section name. */
4499
4500 static void
4501 request_dump_byname (const char * section, dump_type type)
4502 {
4503 struct dump_list_entry * new_request;
4504
4505 new_request = (struct dump_list_entry *)
4506 malloc (sizeof (struct dump_list_entry));
4507 if (!new_request)
4508 error (_("Out of memory allocating dump request table.\n"));
4509
4510 new_request->name = strdup (section);
4511 if (!new_request->name)
4512 error (_("Out of memory allocating dump request table.\n"));
4513
4514 new_request->type = type;
4515
4516 new_request->next = dump_sects_byname;
4517 dump_sects_byname = new_request;
4518 }
4519
4520 static inline void
4521 request_dump (Filedata * filedata, dump_type type)
4522 {
4523 int section;
4524 char * cp;
4525
4526 do_dump++;
4527 section = strtoul (optarg, & cp, 0);
4528
4529 if (! *cp && section >= 0)
4530 request_dump_bynumber (filedata, section, type);
4531 else
4532 request_dump_byname (optarg, type);
4533 }
4534
4535 static void
4536 parse_args (Filedata * filedata, int argc, char ** argv)
4537 {
4538 int c;
4539
4540 if (argc < 2)
4541 usage (stderr);
4542
4543 while ((c = getopt_long
4544 (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
4545 {
4546 switch (c)
4547 {
4548 case 0:
4549 /* Long options. */
4550 break;
4551 case 'H':
4552 usage (stdout);
4553 break;
4554
4555 case 'a':
4556 do_syms = TRUE;
4557 do_reloc = TRUE;
4558 do_unwind = TRUE;
4559 do_dynamic = TRUE;
4560 do_header = TRUE;
4561 do_sections = TRUE;
4562 do_section_groups = TRUE;
4563 do_segments = TRUE;
4564 do_version = TRUE;
4565 do_histogram = TRUE;
4566 do_arch = TRUE;
4567 do_notes = TRUE;
4568 break;
4569 case 'g':
4570 do_section_groups = TRUE;
4571 break;
4572 case 't':
4573 case 'N':
4574 do_sections = TRUE;
4575 do_section_details = TRUE;
4576 break;
4577 case 'e':
4578 do_header = TRUE;
4579 do_sections = TRUE;
4580 do_segments = TRUE;
4581 break;
4582 case 'A':
4583 do_arch = TRUE;
4584 break;
4585 case 'D':
4586 do_using_dynamic = TRUE;
4587 break;
4588 case 'r':
4589 do_reloc = TRUE;
4590 break;
4591 case 'u':
4592 do_unwind = TRUE;
4593 break;
4594 case 'h':
4595 do_header = TRUE;
4596 break;
4597 case 'l':
4598 do_segments = TRUE;
4599 break;
4600 case 's':
4601 do_syms = TRUE;
4602 break;
4603 case 'S':
4604 do_sections = TRUE;
4605 break;
4606 case 'd':
4607 do_dynamic = TRUE;
4608 break;
4609 case 'I':
4610 do_histogram = TRUE;
4611 break;
4612 case 'n':
4613 do_notes = TRUE;
4614 break;
4615 case 'c':
4616 do_archive_index = TRUE;
4617 break;
4618 case 'x':
4619 request_dump (filedata, HEX_DUMP);
4620 break;
4621 case 'p':
4622 request_dump (filedata, STRING_DUMP);
4623 break;
4624 case 'R':
4625 request_dump (filedata, RELOC_DUMP);
4626 break;
4627 case 'z':
4628 decompress_dumps = TRUE;
4629 break;
4630 case 'w':
4631 do_dump = TRUE;
4632 if (optarg == 0)
4633 {
4634 do_debugging = TRUE;
4635 dwarf_select_sections_all ();
4636 }
4637 else
4638 {
4639 do_debugging = FALSE;
4640 dwarf_select_sections_by_letters (optarg);
4641 }
4642 break;
4643 case OPTION_DEBUG_DUMP:
4644 do_dump = TRUE;
4645 if (optarg == 0)
4646 do_debugging = TRUE;
4647 else
4648 {
4649 do_debugging = FALSE;
4650 dwarf_select_sections_by_names (optarg);
4651 }
4652 break;
4653 case OPTION_DWARF_DEPTH:
4654 {
4655 char *cp;
4656
4657 dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4658 }
4659 break;
4660 case OPTION_DWARF_START:
4661 {
4662 char *cp;
4663
4664 dwarf_start_die = strtoul (optarg, & cp, 0);
4665 }
4666 break;
4667 case OPTION_DWARF_CHECK:
4668 dwarf_check = TRUE;
4669 break;
4670 case OPTION_DYN_SYMS:
4671 do_dyn_syms = TRUE;
4672 break;
4673 #ifdef SUPPORT_DISASSEMBLY
4674 case 'i':
4675 request_dump (filedata, DISASS_DUMP);
4676 break;
4677 #endif
4678 case 'v':
4679 print_version (program_name);
4680 break;
4681 case 'V':
4682 do_version = TRUE;
4683 break;
4684 case 'W':
4685 do_wide = TRUE;
4686 break;
4687 default:
4688 /* xgettext:c-format */
4689 error (_("Invalid option '-%c'\n"), c);
4690 /* Fall through. */
4691 case '?':
4692 usage (stderr);
4693 }
4694 }
4695
4696 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
4697 && !do_segments && !do_header && !do_dump && !do_version
4698 && !do_histogram && !do_debugging && !do_arch && !do_notes
4699 && !do_section_groups && !do_archive_index
4700 && !do_dyn_syms)
4701 usage (stderr);
4702 }
4703
4704 static const char *
4705 get_elf_class (unsigned int elf_class)
4706 {
4707 static char buff[32];
4708
4709 switch (elf_class)
4710 {
4711 case ELFCLASSNONE: return _("none");
4712 case ELFCLASS32: return "ELF32";
4713 case ELFCLASS64: return "ELF64";
4714 default:
4715 snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
4716 return buff;
4717 }
4718 }
4719
4720 static const char *
4721 get_data_encoding (unsigned int encoding)
4722 {
4723 static char buff[32];
4724
4725 switch (encoding)
4726 {
4727 case ELFDATANONE: return _("none");
4728 case ELFDATA2LSB: return _("2's complement, little endian");
4729 case ELFDATA2MSB: return _("2's complement, big endian");
4730 default:
4731 snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
4732 return buff;
4733 }
4734 }
4735
4736 /* Decode the data held in 'filedata->file_header'. */
4737
4738 static bfd_boolean
4739 process_file_header (Filedata * filedata)
4740 {
4741 Elf_Internal_Ehdr * header = & filedata->file_header;
4742
4743 if ( header->e_ident[EI_MAG0] != ELFMAG0
4744 || header->e_ident[EI_MAG1] != ELFMAG1
4745 || header->e_ident[EI_MAG2] != ELFMAG2
4746 || header->e_ident[EI_MAG3] != ELFMAG3)
4747 {
4748 error
4749 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4750 return FALSE;
4751 }
4752
4753 init_dwarf_regnames (header->e_machine);
4754
4755 if (do_header)
4756 {
4757 unsigned i;
4758
4759 printf (_("ELF Header:\n"));
4760 printf (_(" Magic: "));
4761 for (i = 0; i < EI_NIDENT; i++)
4762 printf ("%2.2x ", header->e_ident[i]);
4763 printf ("\n");
4764 printf (_(" Class: %s\n"),
4765 get_elf_class (header->e_ident[EI_CLASS]));
4766 printf (_(" Data: %s\n"),
4767 get_data_encoding (header->e_ident[EI_DATA]));
4768 printf (_(" Version: %d%s\n"),
4769 header->e_ident[EI_VERSION],
4770 (header->e_ident[EI_VERSION] == EV_CURRENT
4771 ? _(" (current)")
4772 : (header->e_ident[EI_VERSION] != EV_NONE
4773 ? _(" <unknown>")
4774 : "")));
4775 printf (_(" OS/ABI: %s\n"),
4776 get_osabi_name (filedata, header->e_ident[EI_OSABI]));
4777 printf (_(" ABI Version: %d\n"),
4778 header->e_ident[EI_ABIVERSION]);
4779 printf (_(" Type: %s\n"),
4780 get_file_type (header->e_type));
4781 printf (_(" Machine: %s\n"),
4782 get_machine_name (header->e_machine));
4783 printf (_(" Version: 0x%lx\n"),
4784 header->e_version);
4785
4786 printf (_(" Entry point address: "));
4787 print_vma (header->e_entry, PREFIX_HEX);
4788 printf (_("\n Start of program headers: "));
4789 print_vma (header->e_phoff, DEC);
4790 printf (_(" (bytes into file)\n Start of section headers: "));
4791 print_vma (header->e_shoff, DEC);
4792 printf (_(" (bytes into file)\n"));
4793
4794 printf (_(" Flags: 0x%lx%s\n"),
4795 header->e_flags,
4796 get_machine_flags (filedata, header->e_flags, header->e_machine));
4797 printf (_(" Size of this header: %u (bytes)\n"),
4798 header->e_ehsize);
4799 printf (_(" Size of program headers: %u (bytes)\n"),
4800 header->e_phentsize);
4801 printf (_(" Number of program headers: %u"),
4802 header->e_phnum);
4803 if (filedata->section_headers != NULL
4804 && header->e_phnum == PN_XNUM
4805 && filedata->section_headers[0].sh_info != 0)
4806 {
4807 header->e_phnum = filedata->section_headers[0].sh_info;
4808 printf (" (%u)", header->e_phnum);
4809 }
4810 putc ('\n', stdout);
4811 printf (_(" Size of section headers: %u (bytes)\n"),
4812 header->e_shentsize);
4813 printf (_(" Number of section headers: %u"),
4814 header->e_shnum);
4815 if (filedata->section_headers != NULL && header->e_shnum == SHN_UNDEF)
4816 {
4817 header->e_shnum = filedata->section_headers[0].sh_size;
4818 printf (" (%u)", header->e_shnum);
4819 }
4820 putc ('\n', stdout);
4821 printf (_(" Section header string table index: %u"),
4822 header->e_shstrndx);
4823 if (filedata->section_headers != NULL
4824 && header->e_shstrndx == (SHN_XINDEX & 0xffff))
4825 {
4826 header->e_shstrndx = filedata->section_headers[0].sh_link;
4827 printf (" (%u)", header->e_shstrndx);
4828 }
4829 if (header->e_shstrndx != SHN_UNDEF
4830 && header->e_shstrndx >= header->e_shnum)
4831 {
4832 header->e_shstrndx = SHN_UNDEF;
4833 printf (_(" <corrupt: out of range>"));
4834 }
4835 putc ('\n', stdout);
4836 }
4837
4838 if (filedata->section_headers != NULL)
4839 {
4840 if (header->e_phnum == PN_XNUM
4841 && filedata->section_headers[0].sh_info != 0)
4842 header->e_phnum = filedata->section_headers[0].sh_info;
4843 if (header->e_shnum == SHN_UNDEF)
4844 header->e_shnum = filedata->section_headers[0].sh_size;
4845 if (header->e_shstrndx == (SHN_XINDEX & 0xffff))
4846 header->e_shstrndx = filedata->section_headers[0].sh_link;
4847 if (header->e_shstrndx >= header->e_shnum)
4848 header->e_shstrndx = SHN_UNDEF;
4849 free (filedata->section_headers);
4850 filedata->section_headers = NULL;
4851 }
4852
4853 return TRUE;
4854 }
4855
4856 /* Read in the program headers from FILEDATA and store them in PHEADERS.
4857 Returns TRUE upon success, FALSE otherwise. Loads 32-bit headers. */
4858
4859 static bfd_boolean
4860 get_32bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
4861 {
4862 Elf32_External_Phdr * phdrs;
4863 Elf32_External_Phdr * external;
4864 Elf_Internal_Phdr * internal;
4865 unsigned int i;
4866 unsigned int size = filedata->file_header.e_phentsize;
4867 unsigned int num = filedata->file_header.e_phnum;
4868
4869 /* PR binutils/17531: Cope with unexpected section header sizes. */
4870 if (size == 0 || num == 0)
4871 return FALSE;
4872 if (size < sizeof * phdrs)
4873 {
4874 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4875 return FALSE;
4876 }
4877 if (size > sizeof * phdrs)
4878 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4879
4880 phdrs = (Elf32_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
4881 size, num, _("program headers"));
4882 if (phdrs == NULL)
4883 return FALSE;
4884
4885 for (i = 0, internal = pheaders, external = phdrs;
4886 i < filedata->file_header.e_phnum;
4887 i++, internal++, external++)
4888 {
4889 internal->p_type = BYTE_GET (external->p_type);
4890 internal->p_offset = BYTE_GET (external->p_offset);
4891 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4892 internal->p_paddr = BYTE_GET (external->p_paddr);
4893 internal->p_filesz = BYTE_GET (external->p_filesz);
4894 internal->p_memsz = BYTE_GET (external->p_memsz);
4895 internal->p_flags = BYTE_GET (external->p_flags);
4896 internal->p_align = BYTE_GET (external->p_align);
4897 }
4898
4899 free (phdrs);
4900 return TRUE;
4901 }
4902
4903 /* Read in the program headers from FILEDATA and store them in PHEADERS.
4904 Returns TRUE upon success, FALSE otherwise. Loads 64-bit headers. */
4905
4906 static bfd_boolean
4907 get_64bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
4908 {
4909 Elf64_External_Phdr * phdrs;
4910 Elf64_External_Phdr * external;
4911 Elf_Internal_Phdr * internal;
4912 unsigned int i;
4913 unsigned int size = filedata->file_header.e_phentsize;
4914 unsigned int num = filedata->file_header.e_phnum;
4915
4916 /* PR binutils/17531: Cope with unexpected section header sizes. */
4917 if (size == 0 || num == 0)
4918 return FALSE;
4919 if (size < sizeof * phdrs)
4920 {
4921 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4922 return FALSE;
4923 }
4924 if (size > sizeof * phdrs)
4925 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4926
4927 phdrs = (Elf64_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
4928 size, num, _("program headers"));
4929 if (!phdrs)
4930 return FALSE;
4931
4932 for (i = 0, internal = pheaders, external = phdrs;
4933 i < filedata->file_header.e_phnum;
4934 i++, internal++, external++)
4935 {
4936 internal->p_type = BYTE_GET (external->p_type);
4937 internal->p_flags = BYTE_GET (external->p_flags);
4938 internal->p_offset = BYTE_GET (external->p_offset);
4939 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4940 internal->p_paddr = BYTE_GET (external->p_paddr);
4941 internal->p_filesz = BYTE_GET (external->p_filesz);
4942 internal->p_memsz = BYTE_GET (external->p_memsz);
4943 internal->p_align = BYTE_GET (external->p_align);
4944 }
4945
4946 free (phdrs);
4947 return TRUE;
4948 }
4949
4950 /* Returns TRUE if the program headers were read into `program_headers'. */
4951
4952 static bfd_boolean
4953 get_program_headers (Filedata * filedata)
4954 {
4955 Elf_Internal_Phdr * phdrs;
4956
4957 /* Check cache of prior read. */
4958 if (filedata->program_headers != NULL)
4959 return TRUE;
4960
4961 /* Be kind to memory checkers by looking for
4962 e_phnum values which we know must be invalid. */
4963 if (filedata->file_header.e_phnum
4964 * (is_32bit_elf ? sizeof (Elf32_External_Phdr) : sizeof (Elf64_External_Phdr))
4965 >= filedata->file_size)
4966 {
4967 error (_("Too many program headers - %#x - the file is not that big\n"),
4968 filedata->file_header.e_phnum);
4969 return FALSE;
4970 }
4971
4972 phdrs = (Elf_Internal_Phdr *) cmalloc (filedata->file_header.e_phnum,
4973 sizeof (Elf_Internal_Phdr));
4974 if (phdrs == NULL)
4975 {
4976 error (_("Out of memory reading %u program headers\n"),
4977 filedata->file_header.e_phnum);
4978 return FALSE;
4979 }
4980
4981 if (is_32bit_elf
4982 ? get_32bit_program_headers (filedata, phdrs)
4983 : get_64bit_program_headers (filedata, phdrs))
4984 {
4985 filedata->program_headers = phdrs;
4986 return TRUE;
4987 }
4988
4989 free (phdrs);
4990 return FALSE;
4991 }
4992
4993 /* Returns TRUE if the program headers were loaded. */
4994
4995 static bfd_boolean
4996 process_program_headers (Filedata * filedata)
4997 {
4998 Elf_Internal_Phdr * segment;
4999 unsigned int i;
5000 Elf_Internal_Phdr * previous_load = NULL;
5001
5002 if (filedata->file_header.e_phnum == 0)
5003 {
5004 /* PR binutils/12467. */
5005 if (filedata->file_header.e_phoff != 0)
5006 {
5007 warn (_("possibly corrupt ELF header - it has a non-zero program"
5008 " header offset, but no program headers\n"));
5009 return FALSE;
5010 }
5011 else if (do_segments)
5012 printf (_("\nThere are no program headers in this file.\n"));
5013 return TRUE;
5014 }
5015
5016 if (do_segments && !do_header)
5017 {
5018 printf (_("\nElf file type is %s\n"), get_file_type (filedata->file_header.e_type));
5019 printf (_("Entry point 0x%s\n"), bfd_vmatoa ("x", filedata->file_header.e_entry));
5020 printf (ngettext ("There is %d program header, starting at offset %s\n",
5021 "There are %d program headers, starting at offset %s\n",
5022 filedata->file_header.e_phnum),
5023 filedata->file_header.e_phnum,
5024 bfd_vmatoa ("u", filedata->file_header.e_phoff));
5025 }
5026
5027 if (! get_program_headers (filedata))
5028 return TRUE;
5029
5030 if (do_segments)
5031 {
5032 if (filedata->file_header.e_phnum > 1)
5033 printf (_("\nProgram Headers:\n"));
5034 else
5035 printf (_("\nProgram Headers:\n"));
5036
5037 if (is_32bit_elf)
5038 printf
5039 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
5040 else if (do_wide)
5041 printf
5042 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
5043 else
5044 {
5045 printf
5046 (_(" Type Offset VirtAddr PhysAddr\n"));
5047 printf
5048 (_(" FileSiz MemSiz Flags Align\n"));
5049 }
5050 }
5051
5052 dynamic_addr = 0;
5053 dynamic_size = 0;
5054
5055 for (i = 0, segment = filedata->program_headers;
5056 i < filedata->file_header.e_phnum;
5057 i++, segment++)
5058 {
5059 if (do_segments)
5060 {
5061 printf (" %-14.14s ", get_segment_type (filedata, segment->p_type));
5062
5063 if (is_32bit_elf)
5064 {
5065 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
5066 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
5067 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
5068 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
5069 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
5070 printf ("%c%c%c ",
5071 (segment->p_flags & PF_R ? 'R' : ' '),
5072 (segment->p_flags & PF_W ? 'W' : ' '),
5073 (segment->p_flags & PF_X ? 'E' : ' '));
5074 printf ("%#lx", (unsigned long) segment->p_align);
5075 }
5076 else if (do_wide)
5077 {
5078 if ((unsigned long) segment->p_offset == segment->p_offset)
5079 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
5080 else
5081 {
5082 print_vma (segment->p_offset, FULL_HEX);
5083 putchar (' ');
5084 }
5085
5086 print_vma (segment->p_vaddr, FULL_HEX);
5087 putchar (' ');
5088 print_vma (segment->p_paddr, FULL_HEX);
5089 putchar (' ');
5090
5091 if ((unsigned long) segment->p_filesz == segment->p_filesz)
5092 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
5093 else
5094 {
5095 print_vma (segment->p_filesz, FULL_HEX);
5096 putchar (' ');
5097 }
5098
5099 if ((unsigned long) segment->p_memsz == segment->p_memsz)
5100 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
5101 else
5102 {
5103 print_vma (segment->p_memsz, FULL_HEX);
5104 }
5105
5106 printf (" %c%c%c ",
5107 (segment->p_flags & PF_R ? 'R' : ' '),
5108 (segment->p_flags & PF_W ? 'W' : ' '),
5109 (segment->p_flags & PF_X ? 'E' : ' '));
5110
5111 if ((unsigned long) segment->p_align == segment->p_align)
5112 printf ("%#lx", (unsigned long) segment->p_align);
5113 else
5114 {
5115 print_vma (segment->p_align, PREFIX_HEX);
5116 }
5117 }
5118 else
5119 {
5120 print_vma (segment->p_offset, FULL_HEX);
5121 putchar (' ');
5122 print_vma (segment->p_vaddr, FULL_HEX);
5123 putchar (' ');
5124 print_vma (segment->p_paddr, FULL_HEX);
5125 printf ("\n ");
5126 print_vma (segment->p_filesz, FULL_HEX);
5127 putchar (' ');
5128 print_vma (segment->p_memsz, FULL_HEX);
5129 printf (" %c%c%c ",
5130 (segment->p_flags & PF_R ? 'R' : ' '),
5131 (segment->p_flags & PF_W ? 'W' : ' '),
5132 (segment->p_flags & PF_X ? 'E' : ' '));
5133 print_vma (segment->p_align, PREFIX_HEX);
5134 }
5135
5136 putc ('\n', stdout);
5137 }
5138
5139 switch (segment->p_type)
5140 {
5141 case PT_LOAD:
5142 #if 0 /* Do not warn about out of order PT_LOAD segments. Although officially
5143 required by the ELF standard, several programs, including the Linux
5144 kernel, make use of non-ordered segments. */
5145 if (previous_load
5146 && previous_load->p_vaddr > segment->p_vaddr)
5147 error (_("LOAD segments must be sorted in order of increasing VirtAddr\n"));
5148 #endif
5149 if (segment->p_memsz < segment->p_filesz)
5150 error (_("the segment's file size is larger than its memory size\n"));
5151 previous_load = segment;
5152 break;
5153
5154 case PT_PHDR:
5155 /* PR 20815 - Verify that the program header is loaded into memory. */
5156 if (i > 0 && previous_load != NULL)
5157 error (_("the PHDR segment must occur before any LOAD segment\n"));
5158 if (filedata->file_header.e_machine != EM_PARISC)
5159 {
5160 unsigned int j;
5161
5162 for (j = 1; j < filedata->file_header.e_phnum; j++)
5163 if (filedata->program_headers[j].p_vaddr <= segment->p_vaddr
5164 && (filedata->program_headers[j].p_vaddr
5165 + filedata->program_headers[j].p_memsz)
5166 >= (segment->p_vaddr + segment->p_filesz))
5167 break;
5168 if (j == filedata->file_header.e_phnum)
5169 error (_("the PHDR segment is not covered by a LOAD segment\n"));
5170 }
5171 break;
5172
5173 case PT_DYNAMIC:
5174 if (dynamic_addr)
5175 error (_("more than one dynamic segment\n"));
5176
5177 /* By default, assume that the .dynamic section is the first
5178 section in the DYNAMIC segment. */
5179 dynamic_addr = segment->p_offset;
5180 dynamic_size = segment->p_filesz;
5181
5182 /* Try to locate the .dynamic section. If there is
5183 a section header table, we can easily locate it. */
5184 if (filedata->section_headers != NULL)
5185 {
5186 Elf_Internal_Shdr * sec;
5187
5188 sec = find_section (filedata, ".dynamic");
5189 if (sec == NULL || sec->sh_size == 0)
5190 {
5191 /* A corresponding .dynamic section is expected, but on
5192 IA-64/OpenVMS it is OK for it to be missing. */
5193 if (!is_ia64_vms (filedata))
5194 error (_("no .dynamic section in the dynamic segment\n"));
5195 break;
5196 }
5197
5198 if (sec->sh_type == SHT_NOBITS)
5199 {
5200 dynamic_size = 0;
5201 break;
5202 }
5203
5204 dynamic_addr = sec->sh_offset;
5205 dynamic_size = sec->sh_size;
5206
5207 if (dynamic_addr < segment->p_offset
5208 || dynamic_addr > segment->p_offset + segment->p_filesz)
5209 warn (_("the .dynamic section is not contained"
5210 " within the dynamic segment\n"));
5211 else if (dynamic_addr > segment->p_offset)
5212 warn (_("the .dynamic section is not the first section"
5213 " in the dynamic segment.\n"));
5214 }
5215
5216 /* PR binutils/17512: Avoid corrupt dynamic section info in the
5217 segment. Check this after matching against the section headers
5218 so we don't warn on debuginfo file (which have NOBITS .dynamic
5219 sections). */
5220 if (dynamic_addr + dynamic_size >= filedata->file_size)
5221 {
5222 error (_("the dynamic segment offset + size exceeds the size of the file\n"));
5223 dynamic_addr = dynamic_size = 0;
5224 }
5225 break;
5226
5227 case PT_INTERP:
5228 if (fseek (filedata->handle, archive_file_offset + (long) segment->p_offset,
5229 SEEK_SET))
5230 error (_("Unable to find program interpreter name\n"));
5231 else
5232 {
5233 char fmt [32];
5234 int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
5235
5236 if (ret >= (int) sizeof (fmt) || ret < 0)
5237 error (_("Internal error: failed to create format string to display program interpreter\n"));
5238
5239 program_interpreter[0] = 0;
5240 if (fscanf (filedata->handle, fmt, program_interpreter) <= 0)
5241 error (_("Unable to read program interpreter name\n"));
5242
5243 if (do_segments)
5244 printf (_(" [Requesting program interpreter: %s]\n"),
5245 program_interpreter);
5246 }
5247 break;
5248 }
5249 }
5250
5251 if (do_segments
5252 && filedata->section_headers != NULL
5253 && filedata->string_table != NULL)
5254 {
5255 printf (_("\n Section to Segment mapping:\n"));
5256 printf (_(" Segment Sections...\n"));
5257
5258 for (i = 0; i < filedata->file_header.e_phnum; i++)
5259 {
5260 unsigned int j;
5261 Elf_Internal_Shdr * section;
5262
5263 segment = filedata->program_headers + i;
5264 section = filedata->section_headers + 1;
5265
5266 printf (" %2.2d ", i);
5267
5268 for (j = 1; j < filedata->file_header.e_shnum; j++, section++)
5269 {
5270 if (!ELF_TBSS_SPECIAL (section, segment)
5271 && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
5272 printf ("%s ", printable_section_name (filedata, section));
5273 }
5274
5275 putc ('\n',stdout);
5276 }
5277 }
5278
5279 return TRUE;
5280 }
5281
5282
5283 /* Find the file offset corresponding to VMA by using the program headers. */
5284
5285 static long
5286 offset_from_vma (Filedata * filedata, bfd_vma vma, bfd_size_type size)
5287 {
5288 Elf_Internal_Phdr * seg;
5289
5290 if (! get_program_headers (filedata))
5291 {
5292 warn (_("Cannot interpret virtual addresses without program headers.\n"));
5293 return (long) vma;
5294 }
5295
5296 for (seg = filedata->program_headers;
5297 seg < filedata->program_headers + filedata->file_header.e_phnum;
5298 ++seg)
5299 {
5300 if (seg->p_type != PT_LOAD)
5301 continue;
5302
5303 if (vma >= (seg->p_vaddr & -seg->p_align)
5304 && vma + size <= seg->p_vaddr + seg->p_filesz)
5305 return vma - seg->p_vaddr + seg->p_offset;
5306 }
5307
5308 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
5309 (unsigned long) vma);
5310 return (long) vma;
5311 }
5312
5313
5314 /* Allocate memory and load the sections headers into FILEDATA->filedata->section_headers.
5315 If PROBE is true, this is just a probe and we do not generate any error
5316 messages if the load fails. */
5317
5318 static bfd_boolean
5319 get_32bit_section_headers (Filedata * filedata, bfd_boolean probe)
5320 {
5321 Elf32_External_Shdr * shdrs;
5322 Elf_Internal_Shdr * internal;
5323 unsigned int i;
5324 unsigned int size = filedata->file_header.e_shentsize;
5325 unsigned int num = probe ? 1 : filedata->file_header.e_shnum;
5326
5327 /* PR binutils/17531: Cope with unexpected section header sizes. */
5328 if (size == 0 || num == 0)
5329 return FALSE;
5330 if (size < sizeof * shdrs)
5331 {
5332 if (! probe)
5333 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5334 return FALSE;
5335 }
5336 if (!probe && size > sizeof * shdrs)
5337 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5338
5339 shdrs = (Elf32_External_Shdr *) get_data (NULL, filedata, filedata->file_header.e_shoff,
5340 size, num,
5341 probe ? NULL : _("section headers"));
5342 if (shdrs == NULL)
5343 return FALSE;
5344
5345 free (filedata->section_headers);
5346 filedata->section_headers = (Elf_Internal_Shdr *)
5347 cmalloc (num, sizeof (Elf_Internal_Shdr));
5348 if (filedata->section_headers == NULL)
5349 {
5350 if (!probe)
5351 error (_("Out of memory reading %u section headers\n"), num);
5352 free (shdrs);
5353 return FALSE;
5354 }
5355
5356 for (i = 0, internal = filedata->section_headers;
5357 i < num;
5358 i++, internal++)
5359 {
5360 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5361 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
5362 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5363 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5364 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5365 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5366 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5367 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5368 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5369 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
5370 if (!probe && internal->sh_link > num)
5371 warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5372 if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5373 warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5374 }
5375
5376 free (shdrs);
5377 return TRUE;
5378 }
5379
5380 /* Like get_32bit_section_headers, except that it fetches 64-bit headers. */
5381
5382 static bfd_boolean
5383 get_64bit_section_headers (Filedata * filedata, bfd_boolean probe)
5384 {
5385 Elf64_External_Shdr * shdrs;
5386 Elf_Internal_Shdr * internal;
5387 unsigned int i;
5388 unsigned int size = filedata->file_header.e_shentsize;
5389 unsigned int num = probe ? 1 : filedata->file_header.e_shnum;
5390
5391 /* PR binutils/17531: Cope with unexpected section header sizes. */
5392 if (size == 0 || num == 0)
5393 return FALSE;
5394
5395 if (size < sizeof * shdrs)
5396 {
5397 if (! probe)
5398 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5399 return FALSE;
5400 }
5401
5402 if (! probe && size > sizeof * shdrs)
5403 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5404
5405 shdrs = (Elf64_External_Shdr *) get_data (NULL, filedata,
5406 filedata->file_header.e_shoff,
5407 size, num,
5408 probe ? NULL : _("section headers"));
5409 if (shdrs == NULL)
5410 return FALSE;
5411
5412 free (filedata->section_headers);
5413 filedata->section_headers = (Elf_Internal_Shdr *)
5414 cmalloc (num, sizeof (Elf_Internal_Shdr));
5415 if (filedata->section_headers == NULL)
5416 {
5417 if (! probe)
5418 error (_("Out of memory reading %u section headers\n"), num);
5419 free (shdrs);
5420 return FALSE;
5421 }
5422
5423 for (i = 0, internal = filedata->section_headers;
5424 i < num;
5425 i++, internal++)
5426 {
5427 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5428 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
5429 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5430 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5431 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5432 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
5433 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5434 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5435 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5436 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5437 if (!probe && internal->sh_link > num)
5438 warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5439 if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5440 warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5441 }
5442
5443 free (shdrs);
5444 return TRUE;
5445 }
5446
5447 static Elf_Internal_Sym *
5448 get_32bit_elf_symbols (Filedata * filedata,
5449 Elf_Internal_Shdr * section,
5450 unsigned long * num_syms_return)
5451 {
5452 unsigned long number = 0;
5453 Elf32_External_Sym * esyms = NULL;
5454 Elf_External_Sym_Shndx * shndx = NULL;
5455 Elf_Internal_Sym * isyms = NULL;
5456 Elf_Internal_Sym * psym;
5457 unsigned int j;
5458 elf_section_list * entry;
5459
5460 if (section->sh_size == 0)
5461 {
5462 if (num_syms_return != NULL)
5463 * num_syms_return = 0;
5464 return NULL;
5465 }
5466
5467 /* Run some sanity checks first. */
5468 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5469 {
5470 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5471 printable_section_name (filedata, section),
5472 (unsigned long) section->sh_entsize);
5473 goto exit_point;
5474 }
5475
5476 if (section->sh_size > filedata->file_size)
5477 {
5478 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5479 printable_section_name (filedata, section),
5480 (unsigned long) section->sh_size);
5481 goto exit_point;
5482 }
5483
5484 number = section->sh_size / section->sh_entsize;
5485
5486 if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
5487 {
5488 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5489 (unsigned long) section->sh_size,
5490 printable_section_name (filedata, section),
5491 (unsigned long) section->sh_entsize);
5492 goto exit_point;
5493 }
5494
5495 esyms = (Elf32_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
5496 section->sh_size, _("symbols"));
5497 if (esyms == NULL)
5498 goto exit_point;
5499
5500 shndx = NULL;
5501 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5502 {
5503 if (entry->hdr->sh_link != (unsigned long) (section - filedata->section_headers))
5504 continue;
5505
5506 if (shndx != NULL)
5507 {
5508 error (_("Multiple symbol table index sections associated with the same symbol section\n"));
5509 free (shndx);
5510 }
5511
5512 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
5513 entry->hdr->sh_offset,
5514 1, entry->hdr->sh_size,
5515 _("symbol table section indices"));
5516 if (shndx == NULL)
5517 goto exit_point;
5518
5519 /* PR17531: file: heap-buffer-overflow */
5520 if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5521 {
5522 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5523 printable_section_name (filedata, entry->hdr),
5524 (unsigned long) entry->hdr->sh_size,
5525 (unsigned long) section->sh_size);
5526 goto exit_point;
5527 }
5528 }
5529
5530 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5531
5532 if (isyms == NULL)
5533 {
5534 error (_("Out of memory reading %lu symbols\n"),
5535 (unsigned long) number);
5536 goto exit_point;
5537 }
5538
5539 for (j = 0, psym = isyms; j < number; j++, psym++)
5540 {
5541 psym->st_name = BYTE_GET (esyms[j].st_name);
5542 psym->st_value = BYTE_GET (esyms[j].st_value);
5543 psym->st_size = BYTE_GET (esyms[j].st_size);
5544 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5545 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5546 psym->st_shndx
5547 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5548 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5549 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5550 psym->st_info = BYTE_GET (esyms[j].st_info);
5551 psym->st_other = BYTE_GET (esyms[j].st_other);
5552 }
5553
5554 exit_point:
5555 free (shndx);
5556 free (esyms);
5557
5558 if (num_syms_return != NULL)
5559 * num_syms_return = isyms == NULL ? 0 : number;
5560
5561 return isyms;
5562 }
5563
5564 static Elf_Internal_Sym *
5565 get_64bit_elf_symbols (Filedata * filedata,
5566 Elf_Internal_Shdr * section,
5567 unsigned long * num_syms_return)
5568 {
5569 unsigned long number = 0;
5570 Elf64_External_Sym * esyms = NULL;
5571 Elf_External_Sym_Shndx * shndx = NULL;
5572 Elf_Internal_Sym * isyms = NULL;
5573 Elf_Internal_Sym * psym;
5574 unsigned int j;
5575 elf_section_list * entry;
5576
5577 if (section->sh_size == 0)
5578 {
5579 if (num_syms_return != NULL)
5580 * num_syms_return = 0;
5581 return NULL;
5582 }
5583
5584 /* Run some sanity checks first. */
5585 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5586 {
5587 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5588 printable_section_name (filedata, section),
5589 (unsigned long) section->sh_entsize);
5590 goto exit_point;
5591 }
5592
5593 if (section->sh_size > filedata->file_size)
5594 {
5595 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5596 printable_section_name (filedata, section),
5597 (unsigned long) section->sh_size);
5598 goto exit_point;
5599 }
5600
5601 number = section->sh_size / section->sh_entsize;
5602
5603 if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5604 {
5605 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5606 (unsigned long) section->sh_size,
5607 printable_section_name (filedata, section),
5608 (unsigned long) section->sh_entsize);
5609 goto exit_point;
5610 }
5611
5612 esyms = (Elf64_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
5613 section->sh_size, _("symbols"));
5614 if (!esyms)
5615 goto exit_point;
5616
5617 shndx = NULL;
5618 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5619 {
5620 if (entry->hdr->sh_link != (unsigned long) (section - filedata->section_headers))
5621 continue;
5622
5623 if (shndx != NULL)
5624 {
5625 error (_("Multiple symbol table index sections associated with the same symbol section\n"));
5626 free (shndx);
5627 }
5628
5629 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
5630 entry->hdr->sh_offset,
5631 1, entry->hdr->sh_size,
5632 _("symbol table section indices"));
5633 if (shndx == NULL)
5634 goto exit_point;
5635
5636 /* PR17531: file: heap-buffer-overflow */
5637 if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5638 {
5639 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5640 printable_section_name (filedata, entry->hdr),
5641 (unsigned long) entry->hdr->sh_size,
5642 (unsigned long) section->sh_size);
5643 goto exit_point;
5644 }
5645 }
5646
5647 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5648
5649 if (isyms == NULL)
5650 {
5651 error (_("Out of memory reading %lu symbols\n"),
5652 (unsigned long) number);
5653 goto exit_point;
5654 }
5655
5656 for (j = 0, psym = isyms; j < number; j++, psym++)
5657 {
5658 psym->st_name = BYTE_GET (esyms[j].st_name);
5659 psym->st_info = BYTE_GET (esyms[j].st_info);
5660 psym->st_other = BYTE_GET (esyms[j].st_other);
5661 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5662
5663 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5664 psym->st_shndx
5665 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5666 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5667 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5668
5669 psym->st_value = BYTE_GET (esyms[j].st_value);
5670 psym->st_size = BYTE_GET (esyms[j].st_size);
5671 }
5672
5673 exit_point:
5674 free (shndx);
5675 free (esyms);
5676
5677 if (num_syms_return != NULL)
5678 * num_syms_return = isyms == NULL ? 0 : number;
5679
5680 return isyms;
5681 }
5682
5683 static const char *
5684 get_elf_section_flags (Filedata * filedata, bfd_vma sh_flags)
5685 {
5686 static char buff[1024];
5687 char * p = buff;
5688 unsigned int field_size = is_32bit_elf ? 8 : 16;
5689 signed int sindex;
5690 unsigned int size = sizeof (buff) - (field_size + 4 + 1);
5691 bfd_vma os_flags = 0;
5692 bfd_vma proc_flags = 0;
5693 bfd_vma unknown_flags = 0;
5694 static const struct
5695 {
5696 const char * str;
5697 unsigned int len;
5698 }
5699 flags [] =
5700 {
5701 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
5702 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
5703 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
5704 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
5705 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
5706 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
5707 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5708 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5709 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
5710 /* 9 */ { STRING_COMMA_LEN ("TLS") },
5711 /* IA-64 specific. */
5712 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5713 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5714 /* IA-64 OpenVMS specific. */
5715 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5716 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5717 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5718 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5719 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5720 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
5721 /* Generic. */
5722 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
5723 /* SPARC specific. */
5724 /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
5725 /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5726 /* ARM specific. */
5727 /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
5728 /* 22 */ { STRING_COMMA_LEN ("ARM_PURECODE") },
5729 /* 23 */ { STRING_COMMA_LEN ("COMDEF") },
5730 /* GNU specific. */
5731 /* 24 */ { STRING_COMMA_LEN ("GNU_MBIND") },
5732 /* VLE specific. */
5733 /* 25 */ { STRING_COMMA_LEN ("VLE") },
5734 };
5735
5736 if (do_section_details)
5737 {
5738 sprintf (buff, "[%*.*lx]: ",
5739 field_size, field_size, (unsigned long) sh_flags);
5740 p += field_size + 4;
5741 }
5742
5743 while (sh_flags)
5744 {
5745 bfd_vma flag;
5746
5747 flag = sh_flags & - sh_flags;
5748 sh_flags &= ~ flag;
5749
5750 if (do_section_details)
5751 {
5752 switch (flag)
5753 {
5754 case SHF_WRITE: sindex = 0; break;
5755 case SHF_ALLOC: sindex = 1; break;
5756 case SHF_EXECINSTR: sindex = 2; break;
5757 case SHF_MERGE: sindex = 3; break;
5758 case SHF_STRINGS: sindex = 4; break;
5759 case SHF_INFO_LINK: sindex = 5; break;
5760 case SHF_LINK_ORDER: sindex = 6; break;
5761 case SHF_OS_NONCONFORMING: sindex = 7; break;
5762 case SHF_GROUP: sindex = 8; break;
5763 case SHF_TLS: sindex = 9; break;
5764 case SHF_EXCLUDE: sindex = 18; break;
5765 case SHF_COMPRESSED: sindex = 20; break;
5766 case SHF_GNU_MBIND: sindex = 24; break;
5767
5768 default:
5769 sindex = -1;
5770 switch (filedata->file_header.e_machine)
5771 {
5772 case EM_IA_64:
5773 if (flag == SHF_IA_64_SHORT)
5774 sindex = 10;
5775 else if (flag == SHF_IA_64_NORECOV)
5776 sindex = 11;
5777 #ifdef BFD64
5778 else if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5779 switch (flag)
5780 {
5781 case SHF_IA_64_VMS_GLOBAL: sindex = 12; break;
5782 case SHF_IA_64_VMS_OVERLAID: sindex = 13; break;
5783 case SHF_IA_64_VMS_SHARED: sindex = 14; break;
5784 case SHF_IA_64_VMS_VECTOR: sindex = 15; break;
5785 case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5786 case SHF_IA_64_VMS_PROTECTED: sindex = 17; break;
5787 default: break;
5788 }
5789 #endif
5790 break;
5791
5792 case EM_386:
5793 case EM_IAMCU:
5794 case EM_X86_64:
5795 case EM_L1OM:
5796 case EM_K1OM:
5797 case EM_OLD_SPARCV9:
5798 case EM_SPARC32PLUS:
5799 case EM_SPARCV9:
5800 case EM_SPARC:
5801 if (flag == SHF_ORDERED)
5802 sindex = 19;
5803 break;
5804
5805 case EM_ARM:
5806 switch (flag)
5807 {
5808 case SHF_ENTRYSECT: sindex = 21; break;
5809 case SHF_ARM_PURECODE: sindex = 22; break;
5810 case SHF_COMDEF: sindex = 23; break;
5811 default: break;
5812 }
5813 break;
5814 case EM_PPC:
5815 if (flag == SHF_PPC_VLE)
5816 sindex = 25;
5817 break;
5818
5819 default:
5820 break;
5821 }
5822 }
5823
5824 if (sindex != -1)
5825 {
5826 if (p != buff + field_size + 4)
5827 {
5828 if (size < (10 + 2))
5829 {
5830 warn (_("Internal error: not enough buffer room for section flag info"));
5831 return _("<unknown>");
5832 }
5833 size -= 2;
5834 *p++ = ',';
5835 *p++ = ' ';
5836 }
5837
5838 size -= flags [sindex].len;
5839 p = stpcpy (p, flags [sindex].str);
5840 }
5841 else if (flag & SHF_MASKOS)
5842 os_flags |= flag;
5843 else if (flag & SHF_MASKPROC)
5844 proc_flags |= flag;
5845 else
5846 unknown_flags |= flag;
5847 }
5848 else
5849 {
5850 switch (flag)
5851 {
5852 case SHF_WRITE: *p = 'W'; break;
5853 case SHF_ALLOC: *p = 'A'; break;
5854 case SHF_EXECINSTR: *p = 'X'; break;
5855 case SHF_MERGE: *p = 'M'; break;
5856 case SHF_STRINGS: *p = 'S'; break;
5857 case SHF_INFO_LINK: *p = 'I'; break;
5858 case SHF_LINK_ORDER: *p = 'L'; break;
5859 case SHF_OS_NONCONFORMING: *p = 'O'; break;
5860 case SHF_GROUP: *p = 'G'; break;
5861 case SHF_TLS: *p = 'T'; break;
5862 case SHF_EXCLUDE: *p = 'E'; break;
5863 case SHF_COMPRESSED: *p = 'C'; break;
5864 case SHF_GNU_MBIND: *p = 'D'; break;
5865
5866 default:
5867 if ((filedata->file_header.e_machine == EM_X86_64
5868 || filedata->file_header.e_machine == EM_L1OM
5869 || filedata->file_header.e_machine == EM_K1OM)
5870 && flag == SHF_X86_64_LARGE)
5871 *p = 'l';
5872 else if (filedata->file_header.e_machine == EM_ARM
5873 && flag == SHF_ARM_PURECODE)
5874 *p = 'y';
5875 else if (filedata->file_header.e_machine == EM_PPC
5876 && flag == SHF_PPC_VLE)
5877 *p = 'v';
5878 else if (flag & SHF_MASKOS)
5879 {
5880 *p = 'o';
5881 sh_flags &= ~ SHF_MASKOS;
5882 }
5883 else if (flag & SHF_MASKPROC)
5884 {
5885 *p = 'p';
5886 sh_flags &= ~ SHF_MASKPROC;
5887 }
5888 else
5889 *p = 'x';
5890 break;
5891 }
5892 p++;
5893 }
5894 }
5895
5896 if (do_section_details)
5897 {
5898 if (os_flags)
5899 {
5900 size -= 5 + field_size;
5901 if (p != buff + field_size + 4)
5902 {
5903 if (size < (2 + 1))
5904 {
5905 warn (_("Internal error: not enough buffer room for section flag info"));
5906 return _("<unknown>");
5907 }
5908 size -= 2;
5909 *p++ = ',';
5910 *p++ = ' ';
5911 }
5912 sprintf (p, "OS (%*.*lx)", field_size, field_size,
5913 (unsigned long) os_flags);
5914 p += 5 + field_size;
5915 }
5916 if (proc_flags)
5917 {
5918 size -= 7 + field_size;
5919 if (p != buff + field_size + 4)
5920 {
5921 if (size < (2 + 1))
5922 {
5923 warn (_("Internal error: not enough buffer room for section flag info"));
5924 return _("<unknown>");
5925 }
5926 size -= 2;
5927 *p++ = ',';
5928 *p++ = ' ';
5929 }
5930 sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5931 (unsigned long) proc_flags);
5932 p += 7 + field_size;
5933 }
5934 if (unknown_flags)
5935 {
5936 size -= 10 + field_size;
5937 if (p != buff + field_size + 4)
5938 {
5939 if (size < (2 + 1))
5940 {
5941 warn (_("Internal error: not enough buffer room for section flag info"));
5942 return _("<unknown>");
5943 }
5944 size -= 2;
5945 *p++ = ',';
5946 *p++ = ' ';
5947 }
5948 sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
5949 (unsigned long) unknown_flags);
5950 p += 10 + field_size;
5951 }
5952 }
5953
5954 *p = '\0';
5955 return buff;
5956 }
5957
5958 static unsigned int
5959 get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf, bfd_size_type size)
5960 {
5961 if (is_32bit_elf)
5962 {
5963 Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
5964
5965 if (size < sizeof (* echdr))
5966 {
5967 error (_("Compressed section is too small even for a compression header\n"));
5968 return 0;
5969 }
5970
5971 chdr->ch_type = BYTE_GET (echdr->ch_type);
5972 chdr->ch_size = BYTE_GET (echdr->ch_size);
5973 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5974 return sizeof (*echdr);
5975 }
5976 else
5977 {
5978 Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) buf;
5979
5980 if (size < sizeof (* echdr))
5981 {
5982 error (_("Compressed section is too small even for a compression header\n"));
5983 return 0;
5984 }
5985
5986 chdr->ch_type = BYTE_GET (echdr->ch_type);
5987 chdr->ch_size = BYTE_GET (echdr->ch_size);
5988 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5989 return sizeof (*echdr);
5990 }
5991 }
5992
5993 static bfd_boolean
5994 process_section_headers (Filedata * filedata)
5995 {
5996 Elf_Internal_Shdr * section;
5997 unsigned int i;
5998
5999 filedata->section_headers = NULL;
6000
6001 if (filedata->file_header.e_shnum == 0)
6002 {
6003 /* PR binutils/12467. */
6004 if (filedata->file_header.e_shoff != 0)
6005 {
6006 warn (_("possibly corrupt ELF file header - it has a non-zero"
6007 " section header offset, but no section headers\n"));
6008 return FALSE;
6009 }
6010 else if (do_sections)
6011 printf (_("\nThere are no sections in this file.\n"));
6012
6013 return TRUE;
6014 }
6015
6016 if (do_sections && !do_header)
6017 printf (ngettext ("There is %d section header, "
6018 "starting at offset 0x%lx:\n",
6019 "There are %d section headers, "
6020 "starting at offset 0x%lx:\n",
6021 filedata->file_header.e_shnum),
6022 filedata->file_header.e_shnum,
6023 (unsigned long) filedata->file_header.e_shoff);
6024
6025 if (is_32bit_elf)
6026 {
6027 if (! get_32bit_section_headers (filedata, FALSE))
6028 return FALSE;
6029 }
6030 else
6031 {
6032 if (! get_64bit_section_headers (filedata, FALSE))
6033 return FALSE;
6034 }
6035
6036 /* Read in the string table, so that we have names to display. */
6037 if (filedata->file_header.e_shstrndx != SHN_UNDEF
6038 && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
6039 {
6040 section = filedata->section_headers + filedata->file_header.e_shstrndx;
6041
6042 if (section->sh_size != 0)
6043 {
6044 filedata->string_table = (char *) get_data (NULL, filedata, section->sh_offset,
6045 1, section->sh_size,
6046 _("string table"));
6047
6048 filedata->string_table_length = filedata->string_table != NULL ? section->sh_size : 0;
6049 }
6050 }
6051
6052 /* Scan the sections for the dynamic symbol table
6053 and dynamic string table and debug sections. */
6054 dynamic_symbols = NULL;
6055 dynamic_strings = NULL;
6056 dynamic_syminfo = NULL;
6057 symtab_shndx_list = NULL;
6058
6059 eh_addr_size = is_32bit_elf ? 4 : 8;
6060 switch (filedata->file_header.e_machine)
6061 {
6062 case EM_MIPS:
6063 case EM_MIPS_RS3_LE:
6064 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
6065 FDE addresses. However, the ABI also has a semi-official ILP32
6066 variant for which the normal FDE address size rules apply.
6067
6068 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
6069 section, where XX is the size of longs in bits. Unfortunately,
6070 earlier compilers provided no way of distinguishing ILP32 objects
6071 from LP64 objects, so if there's any doubt, we should assume that
6072 the official LP64 form is being used. */
6073 if ((filedata->file_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
6074 && find_section (filedata, ".gcc_compiled_long32") == NULL)
6075 eh_addr_size = 8;
6076 break;
6077
6078 case EM_H8_300:
6079 case EM_H8_300H:
6080 switch (filedata->file_header.e_flags & EF_H8_MACH)
6081 {
6082 case E_H8_MACH_H8300:
6083 case E_H8_MACH_H8300HN:
6084 case E_H8_MACH_H8300SN:
6085 case E_H8_MACH_H8300SXN:
6086 eh_addr_size = 2;
6087 break;
6088 case E_H8_MACH_H8300H:
6089 case E_H8_MACH_H8300S:
6090 case E_H8_MACH_H8300SX:
6091 eh_addr_size = 4;
6092 break;
6093 }
6094 break;
6095
6096 case EM_M32C_OLD:
6097 case EM_M32C:
6098 switch (filedata->file_header.e_flags & EF_M32C_CPU_MASK)
6099 {
6100 case EF_M32C_CPU_M16C:
6101 eh_addr_size = 2;
6102 break;
6103 }
6104 break;
6105 }
6106
6107 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
6108 do \
6109 { \
6110 bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64; \
6111 if (section->sh_entsize != expected_entsize) \
6112 { \
6113 char buf[40]; \
6114 sprintf_vma (buf, section->sh_entsize); \
6115 /* Note: coded this way so that there is a single string for \
6116 translation. */ \
6117 error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
6118 error (_("(Using the expected size of %u for the rest of this dump)\n"), \
6119 (unsigned) expected_entsize); \
6120 section->sh_entsize = expected_entsize; \
6121 } \
6122 } \
6123 while (0)
6124
6125 #define CHECK_ENTSIZE(section, i, type) \
6126 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
6127 sizeof (Elf64_External_##type))
6128
6129 for (i = 0, section = filedata->section_headers;
6130 i < filedata->file_header.e_shnum;
6131 i++, section++)
6132 {
6133 char * name = SECTION_NAME (section);
6134
6135 if (section->sh_type == SHT_DYNSYM)
6136 {
6137 if (dynamic_symbols != NULL)
6138 {
6139 error (_("File contains multiple dynamic symbol tables\n"));
6140 continue;
6141 }
6142
6143 CHECK_ENTSIZE (section, i, Sym);
6144 dynamic_symbols = GET_ELF_SYMBOLS (filedata, section, & num_dynamic_syms);
6145 }
6146 else if (section->sh_type == SHT_STRTAB
6147 && streq (name, ".dynstr"))
6148 {
6149 if (dynamic_strings != NULL)
6150 {
6151 error (_("File contains multiple dynamic string tables\n"));
6152 continue;
6153 }
6154
6155 dynamic_strings = (char *) get_data (NULL, filedata, section->sh_offset,
6156 1, section->sh_size,
6157 _("dynamic strings"));
6158 dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
6159 }
6160 else if (section->sh_type == SHT_SYMTAB_SHNDX)
6161 {
6162 elf_section_list * entry = xmalloc (sizeof * entry);
6163
6164 entry->hdr = section;
6165 entry->next = symtab_shndx_list;
6166 symtab_shndx_list = entry;
6167 }
6168 else if (section->sh_type == SHT_SYMTAB)
6169 CHECK_ENTSIZE (section, i, Sym);
6170 else if (section->sh_type == SHT_GROUP)
6171 CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
6172 else if (section->sh_type == SHT_REL)
6173 CHECK_ENTSIZE (section, i, Rel);
6174 else if (section->sh_type == SHT_RELA)
6175 CHECK_ENTSIZE (section, i, Rela);
6176 else if ((do_debugging || do_debug_info || do_debug_abbrevs
6177 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
6178 || do_debug_aranges || do_debug_frames || do_debug_macinfo
6179 || do_debug_str || do_debug_loc || do_debug_ranges
6180 || do_debug_addr || do_debug_cu_index || do_debug_links)
6181 && (const_strneq (name, ".debug_")
6182 || const_strneq (name, ".zdebug_")))
6183 {
6184 if (name[1] == 'z')
6185 name += sizeof (".zdebug_") - 1;
6186 else
6187 name += sizeof (".debug_") - 1;
6188
6189 if (do_debugging
6190 || (do_debug_info && const_strneq (name, "info"))
6191 || (do_debug_info && const_strneq (name, "types"))
6192 || (do_debug_abbrevs && const_strneq (name, "abbrev"))
6193 || (do_debug_lines && strcmp (name, "line") == 0)
6194 || (do_debug_lines && const_strneq (name, "line."))
6195 || (do_debug_pubnames && const_strneq (name, "pubnames"))
6196 || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
6197 || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
6198 || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
6199 || (do_debug_aranges && const_strneq (name, "aranges"))
6200 || (do_debug_ranges && const_strneq (name, "ranges"))
6201 || (do_debug_ranges && const_strneq (name, "rnglists"))
6202 || (do_debug_frames && const_strneq (name, "frame"))
6203 || (do_debug_macinfo && const_strneq (name, "macinfo"))
6204 || (do_debug_macinfo && const_strneq (name, "macro"))
6205 || (do_debug_str && const_strneq (name, "str"))
6206 || (do_debug_loc && const_strneq (name, "loc"))
6207 || (do_debug_loc && const_strneq (name, "loclists"))
6208 || (do_debug_addr && const_strneq (name, "addr"))
6209 || (do_debug_cu_index && const_strneq (name, "cu_index"))
6210 || (do_debug_cu_index && const_strneq (name, "tu_index"))
6211 )
6212 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6213 }
6214 /* Linkonce section to be combined with .debug_info at link time. */
6215 else if ((do_debugging || do_debug_info)
6216 && const_strneq (name, ".gnu.linkonce.wi."))
6217 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6218 else if (do_debug_frames && streq (name, ".eh_frame"))
6219 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6220 else if (do_gdb_index && (streq (name, ".gdb_index")
6221 || streq (name, ".debug_names")))
6222 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6223 /* Trace sections for Itanium VMS. */
6224 else if ((do_debugging || do_trace_info || do_trace_abbrevs
6225 || do_trace_aranges)
6226 && const_strneq (name, ".trace_"))
6227 {
6228 name += sizeof (".trace_") - 1;
6229
6230 if (do_debugging
6231 || (do_trace_info && streq (name, "info"))
6232 || (do_trace_abbrevs && streq (name, "abbrev"))
6233 || (do_trace_aranges && streq (name, "aranges"))
6234 )
6235 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6236 }
6237 else if ((do_debugging || do_debug_links)
6238 && (const_strneq (name, ".gnu_debuglink")
6239 || const_strneq (name, ".gnu_debugaltlink")))
6240 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6241 }
6242
6243 if (! do_sections)
6244 return TRUE;
6245
6246 if (filedata->file_header.e_shnum > 1)
6247 printf (_("\nSection Headers:\n"));
6248 else
6249 printf (_("\nSection Header:\n"));
6250
6251 if (is_32bit_elf)
6252 {
6253 if (do_section_details)
6254 {
6255 printf (_(" [Nr] Name\n"));
6256 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
6257 }
6258 else
6259 printf
6260 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
6261 }
6262 else if (do_wide)
6263 {
6264 if (do_section_details)
6265 {
6266 printf (_(" [Nr] Name\n"));
6267 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
6268 }
6269 else
6270 printf
6271 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
6272 }
6273 else
6274 {
6275 if (do_section_details)
6276 {
6277 printf (_(" [Nr] Name\n"));
6278 printf (_(" Type Address Offset Link\n"));
6279 printf (_(" Size EntSize Info Align\n"));
6280 }
6281 else
6282 {
6283 printf (_(" [Nr] Name Type Address Offset\n"));
6284 printf (_(" Size EntSize Flags Link Info Align\n"));
6285 }
6286 }
6287
6288 if (do_section_details)
6289 printf (_(" Flags\n"));
6290
6291 for (i = 0, section = filedata->section_headers;
6292 i < filedata->file_header.e_shnum;
6293 i++, section++)
6294 {
6295 /* Run some sanity checks on the section header. */
6296
6297 /* Check the sh_link field. */
6298 switch (section->sh_type)
6299 {
6300 case SHT_SYMTAB_SHNDX:
6301 case SHT_GROUP:
6302 case SHT_HASH:
6303 case SHT_GNU_HASH:
6304 case SHT_GNU_versym:
6305 case SHT_REL:
6306 case SHT_RELA:
6307 if (section->sh_link < 1
6308 || section->sh_link >= filedata->file_header.e_shnum
6309 || (filedata->section_headers[section->sh_link].sh_type != SHT_SYMTAB
6310 && filedata->section_headers[section->sh_link].sh_type != SHT_DYNSYM))
6311 warn (_("[%2u]: Link field (%u) should index a symtab section.\n"),
6312 i, section->sh_link);
6313 break;
6314
6315 case SHT_DYNAMIC:
6316 case SHT_SYMTAB:
6317 case SHT_DYNSYM:
6318 case SHT_GNU_verneed:
6319 case SHT_GNU_verdef:
6320 case SHT_GNU_LIBLIST:
6321 if (section->sh_link < 1
6322 || section->sh_link >= filedata->file_header.e_shnum
6323 || filedata->section_headers[section->sh_link].sh_type != SHT_STRTAB)
6324 warn (_("[%2u]: Link field (%u) should index a string section.\n"),
6325 i, section->sh_link);
6326 break;
6327
6328 case SHT_INIT_ARRAY:
6329 case SHT_FINI_ARRAY:
6330 case SHT_PREINIT_ARRAY:
6331 if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6332 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6333 i, section->sh_link);
6334 break;
6335
6336 default:
6337 /* FIXME: Add support for target specific section types. */
6338 #if 0 /* Currently we do not check other section types as there are too
6339 many special cases. Stab sections for example have a type
6340 of SHT_PROGBITS but an sh_link field that links to the .stabstr
6341 section. */
6342 if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6343 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6344 i, section->sh_link);
6345 #endif
6346 break;
6347 }
6348
6349 /* Check the sh_info field. */
6350 switch (section->sh_type)
6351 {
6352 case SHT_REL:
6353 case SHT_RELA:
6354 if (section->sh_info < 1
6355 || section->sh_info >= filedata->file_header.e_shnum
6356 || (filedata->section_headers[section->sh_info].sh_type != SHT_PROGBITS
6357 && filedata->section_headers[section->sh_info].sh_type != SHT_NOBITS
6358 && filedata->section_headers[section->sh_info].sh_type != SHT_NOTE
6359 && filedata->section_headers[section->sh_info].sh_type != SHT_INIT_ARRAY
6360 /* FIXME: Are other section types valid ? */
6361 && filedata->section_headers[section->sh_info].sh_type < SHT_LOOS))
6362 {
6363 if (section->sh_info == 0
6364 && (filedata->file_header.e_type == ET_EXEC
6365 || filedata->file_header.e_type == ET_DYN
6366 /* These next two tests may be redundant, but
6367 they have been left in for paranoia's sake. */
6368 || streq (SECTION_NAME (section), ".rel.dyn")
6369 || streq (SECTION_NAME (section), ".rela.dyn")))
6370 /* Dynamic relocations apply to segments, not sections, so
6371 they do not need an sh_info value. */
6372 ;
6373 else
6374 warn (_("[%2u]: Info field (%u) should index a relocatable section.\n"),
6375 i, section->sh_info);
6376 }
6377 break;
6378
6379 case SHT_DYNAMIC:
6380 case SHT_HASH:
6381 case SHT_SYMTAB_SHNDX:
6382 case SHT_INIT_ARRAY:
6383 case SHT_FINI_ARRAY:
6384 case SHT_PREINIT_ARRAY:
6385 if (section->sh_info != 0)
6386 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6387 i, section->sh_info);
6388 break;
6389
6390 case SHT_GROUP:
6391 case SHT_SYMTAB:
6392 case SHT_DYNSYM:
6393 /* A symbol index - we assume that it is valid. */
6394 break;
6395
6396 default:
6397 /* FIXME: Add support for target specific section types. */
6398 if (section->sh_type == SHT_NOBITS)
6399 /* NOBITS section headers with non-zero sh_info fields can be
6400 created when a binary is stripped of everything but its debug
6401 information. The stripped sections have their headers
6402 preserved but their types set to SHT_NOBITS. So do not check
6403 this type of section. */
6404 ;
6405 else if (section->sh_flags & SHF_INFO_LINK)
6406 {
6407 if (section->sh_info < 1 || section->sh_info >= filedata->file_header.e_shnum)
6408 warn (_("[%2u]: Expected link to another section in info field"), i);
6409 }
6410 else if (section->sh_type < SHT_LOOS
6411 && (section->sh_flags & SHF_GNU_MBIND) == 0
6412 && section->sh_info != 0)
6413 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6414 i, section->sh_info);
6415 break;
6416 }
6417
6418 /* Check the sh_size field. */
6419 if (section->sh_size > filedata->file_size
6420 && section->sh_type != SHT_NOBITS
6421 && section->sh_type != SHT_NULL
6422 && section->sh_type < SHT_LOOS)
6423 warn (_("Size of section %u is larger than the entire file!\n"), i);
6424
6425 printf (" [%2u] ", i);
6426 if (do_section_details)
6427 printf ("%s\n ", printable_section_name (filedata, section));
6428 else
6429 print_symbol (-17, SECTION_NAME (section));
6430
6431 printf (do_wide ? " %-15s " : " %-15.15s ",
6432 get_section_type_name (filedata, section->sh_type));
6433
6434 if (is_32bit_elf)
6435 {
6436 const char * link_too_big = NULL;
6437
6438 print_vma (section->sh_addr, LONG_HEX);
6439
6440 printf ( " %6.6lx %6.6lx %2.2lx",
6441 (unsigned long) section->sh_offset,
6442 (unsigned long) section->sh_size,
6443 (unsigned long) section->sh_entsize);
6444
6445 if (do_section_details)
6446 fputs (" ", stdout);
6447 else
6448 printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6449
6450 if (section->sh_link >= filedata->file_header.e_shnum)
6451 {
6452 link_too_big = "";
6453 /* The sh_link value is out of range. Normally this indicates
6454 an error but it can have special values in Solaris binaries. */
6455 switch (filedata->file_header.e_machine)
6456 {
6457 case EM_386:
6458 case EM_IAMCU:
6459 case EM_X86_64:
6460 case EM_L1OM:
6461 case EM_K1OM:
6462 case EM_OLD_SPARCV9:
6463 case EM_SPARC32PLUS:
6464 case EM_SPARCV9:
6465 case EM_SPARC:
6466 if (section->sh_link == (SHN_BEFORE & 0xffff))
6467 link_too_big = "BEFORE";
6468 else if (section->sh_link == (SHN_AFTER & 0xffff))
6469 link_too_big = "AFTER";
6470 break;
6471 default:
6472 break;
6473 }
6474 }
6475
6476 if (do_section_details)
6477 {
6478 if (link_too_big != NULL && * link_too_big)
6479 printf ("<%s> ", link_too_big);
6480 else
6481 printf ("%2u ", section->sh_link);
6482 printf ("%3u %2lu\n", section->sh_info,
6483 (unsigned long) section->sh_addralign);
6484 }
6485 else
6486 printf ("%2u %3u %2lu\n",
6487 section->sh_link,
6488 section->sh_info,
6489 (unsigned long) section->sh_addralign);
6490
6491 if (link_too_big && ! * link_too_big)
6492 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
6493 i, section->sh_link);
6494 }
6495 else if (do_wide)
6496 {
6497 print_vma (section->sh_addr, LONG_HEX);
6498
6499 if ((long) section->sh_offset == section->sh_offset)
6500 printf (" %6.6lx", (unsigned long) section->sh_offset);
6501 else
6502 {
6503 putchar (' ');
6504 print_vma (section->sh_offset, LONG_HEX);
6505 }
6506
6507 if ((unsigned long) section->sh_size == section->sh_size)
6508 printf (" %6.6lx", (unsigned long) section->sh_size);
6509 else
6510 {
6511 putchar (' ');
6512 print_vma (section->sh_size, LONG_HEX);
6513 }
6514
6515 if ((unsigned long) section->sh_entsize == section->sh_entsize)
6516 printf (" %2.2lx", (unsigned long) section->sh_entsize);
6517 else
6518 {
6519 putchar (' ');
6520 print_vma (section->sh_entsize, LONG_HEX);
6521 }
6522
6523 if (do_section_details)
6524 fputs (" ", stdout);
6525 else
6526 printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6527
6528 printf ("%2u %3u ", section->sh_link, section->sh_info);
6529
6530 if ((unsigned long) section->sh_addralign == section->sh_addralign)
6531 printf ("%2lu\n", (unsigned long) section->sh_addralign);
6532 else
6533 {
6534 print_vma (section->sh_addralign, DEC);
6535 putchar ('\n');
6536 }
6537 }
6538 else if (do_section_details)
6539 {
6540 putchar (' ');
6541 print_vma (section->sh_addr, LONG_HEX);
6542 if ((long) section->sh_offset == section->sh_offset)
6543 printf (" %16.16lx", (unsigned long) section->sh_offset);
6544 else
6545 {
6546 printf (" ");
6547 print_vma (section->sh_offset, LONG_HEX);
6548 }
6549 printf (" %u\n ", section->sh_link);
6550 print_vma (section->sh_size, LONG_HEX);
6551 putchar (' ');
6552 print_vma (section->sh_entsize, LONG_HEX);
6553
6554 printf (" %-16u %lu\n",
6555 section->sh_info,
6556 (unsigned long) section->sh_addralign);
6557 }
6558 else
6559 {
6560 putchar (' ');
6561 print_vma (section->sh_addr, LONG_HEX);
6562 if ((long) section->sh_offset == section->sh_offset)
6563 printf (" %8.8lx", (unsigned long) section->sh_offset);
6564 else
6565 {
6566 printf (" ");
6567 print_vma (section->sh_offset, LONG_HEX);
6568 }
6569 printf ("\n ");
6570 print_vma (section->sh_size, LONG_HEX);
6571 printf (" ");
6572 print_vma (section->sh_entsize, LONG_HEX);
6573
6574 printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6575
6576 printf (" %2u %3u %lu\n",
6577 section->sh_link,
6578 section->sh_info,
6579 (unsigned long) section->sh_addralign);
6580 }
6581
6582 if (do_section_details)
6583 {
6584 printf (" %s\n", get_elf_section_flags (filedata, section->sh_flags));
6585 if ((section->sh_flags & SHF_COMPRESSED) != 0)
6586 {
6587 /* Minimum section size is 12 bytes for 32-bit compression
6588 header + 12 bytes for compressed data header. */
6589 unsigned char buf[24];
6590
6591 assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
6592 if (get_data (&buf, filedata, section->sh_offset, 1,
6593 sizeof (buf), _("compression header")))
6594 {
6595 Elf_Internal_Chdr chdr;
6596
6597 (void) get_compression_header (&chdr, buf, sizeof (buf));
6598
6599 if (chdr.ch_type == ELFCOMPRESS_ZLIB)
6600 printf (" ZLIB, ");
6601 else
6602 printf (_(" [<unknown>: 0x%x], "),
6603 chdr.ch_type);
6604 print_vma (chdr.ch_size, LONG_HEX);
6605 printf (", %lu\n", (unsigned long) chdr.ch_addralign);
6606 }
6607 }
6608 }
6609 }
6610
6611 if (!do_section_details)
6612 {
6613 /* The ordering of the letters shown here matches the ordering of the
6614 corresponding SHF_xxx values, and hence the order in which these
6615 letters will be displayed to the user. */
6616 printf (_("Key to Flags:\n\
6617 W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6618 L (link order), O (extra OS processing required), G (group), T (TLS),\n\
6619 C (compressed), x (unknown), o (OS specific), E (exclude),\n "));
6620 if (filedata->file_header.e_machine == EM_X86_64
6621 || filedata->file_header.e_machine == EM_L1OM
6622 || filedata->file_header.e_machine == EM_K1OM)
6623 printf (_("l (large), "));
6624 else if (filedata->file_header.e_machine == EM_ARM)
6625 printf (_("y (purecode), "));
6626 else if (filedata->file_header.e_machine == EM_PPC)
6627 printf (_("v (VLE), "));
6628 printf ("p (processor specific)\n");
6629 }
6630
6631 return TRUE;
6632 }
6633
6634 static const char *
6635 get_group_flags (unsigned int flags)
6636 {
6637 static char buff[128];
6638
6639 if (flags == 0)
6640 return "";
6641 else if (flags == GRP_COMDAT)
6642 return "COMDAT ";
6643
6644 snprintf (buff, 14, _("[0x%x: "), flags);
6645
6646 flags &= ~ GRP_COMDAT;
6647 if (flags & GRP_MASKOS)
6648 {
6649 strcat (buff, "<OS specific>");
6650 flags &= ~ GRP_MASKOS;
6651 }
6652
6653 if (flags & GRP_MASKPROC)
6654 {
6655 strcat (buff, "<PROC specific>");
6656 flags &= ~ GRP_MASKPROC;
6657 }
6658
6659 if (flags)
6660 strcat (buff, "<unknown>");
6661
6662 strcat (buff, "]");
6663 return buff;
6664 }
6665
6666 static bfd_boolean
6667 process_section_groups (Filedata * filedata)
6668 {
6669 Elf_Internal_Shdr * section;
6670 unsigned int i;
6671 struct group * group;
6672 Elf_Internal_Shdr * symtab_sec;
6673 Elf_Internal_Shdr * strtab_sec;
6674 Elf_Internal_Sym * symtab;
6675 unsigned long num_syms;
6676 char * strtab;
6677 size_t strtab_size;
6678
6679 /* Don't process section groups unless needed. */
6680 if (!do_unwind && !do_section_groups)
6681 return TRUE;
6682
6683 if (filedata->file_header.e_shnum == 0)
6684 {
6685 if (do_section_groups)
6686 printf (_("\nThere are no sections to group in this file.\n"));
6687
6688 return TRUE;
6689 }
6690
6691 if (filedata->section_headers == NULL)
6692 {
6693 error (_("Section headers are not available!\n"));
6694 /* PR 13622: This can happen with a corrupt ELF header. */
6695 return FALSE;
6696 }
6697
6698 section_headers_groups = (struct group **) calloc (filedata->file_header.e_shnum,
6699 sizeof (struct group *));
6700
6701 if (section_headers_groups == NULL)
6702 {
6703 error (_("Out of memory reading %u section group headers\n"),
6704 filedata->file_header.e_shnum);
6705 return FALSE;
6706 }
6707
6708 /* Scan the sections for the group section. */
6709 group_count = 0;
6710 for (i = 0, section = filedata->section_headers;
6711 i < filedata->file_header.e_shnum;
6712 i++, section++)
6713 if (section->sh_type == SHT_GROUP)
6714 group_count++;
6715
6716 if (group_count == 0)
6717 {
6718 if (do_section_groups)
6719 printf (_("\nThere are no section groups in this file.\n"));
6720
6721 return TRUE;
6722 }
6723
6724 section_groups = (struct group *) calloc (group_count, sizeof (struct group));
6725
6726 if (section_groups == NULL)
6727 {
6728 error (_("Out of memory reading %lu groups\n"),
6729 (unsigned long) group_count);
6730 return FALSE;
6731 }
6732
6733 symtab_sec = NULL;
6734 strtab_sec = NULL;
6735 symtab = NULL;
6736 num_syms = 0;
6737 strtab = NULL;
6738 strtab_size = 0;
6739 for (i = 0, section = filedata->section_headers, group = section_groups;
6740 i < filedata->file_header.e_shnum;
6741 i++, section++)
6742 {
6743 if (section->sh_type == SHT_GROUP)
6744 {
6745 const char * name = printable_section_name (filedata, section);
6746 const char * group_name;
6747 unsigned char * start;
6748 unsigned char * indices;
6749 unsigned int entry, j, size;
6750 Elf_Internal_Shdr * sec;
6751 Elf_Internal_Sym * sym;
6752
6753 /* Get the symbol table. */
6754 if (section->sh_link >= filedata->file_header.e_shnum
6755 || ((sec = filedata->section_headers + section->sh_link)->sh_type
6756 != SHT_SYMTAB))
6757 {
6758 error (_("Bad sh_link in group section `%s'\n"), name);
6759 continue;
6760 }
6761
6762 if (symtab_sec != sec)
6763 {
6764 symtab_sec = sec;
6765 if (symtab)
6766 free (symtab);
6767 symtab = GET_ELF_SYMBOLS (filedata, symtab_sec, & num_syms);
6768 }
6769
6770 if (symtab == NULL)
6771 {
6772 error (_("Corrupt header in group section `%s'\n"), name);
6773 continue;
6774 }
6775
6776 if (section->sh_info >= num_syms)
6777 {
6778 error (_("Bad sh_info in group section `%s'\n"), name);
6779 continue;
6780 }
6781
6782 sym = symtab + section->sh_info;
6783
6784 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6785 {
6786 if (sym->st_shndx == 0
6787 || sym->st_shndx >= filedata->file_header.e_shnum)
6788 {
6789 error (_("Bad sh_info in group section `%s'\n"), name);
6790 continue;
6791 }
6792
6793 group_name = SECTION_NAME (filedata->section_headers + sym->st_shndx);
6794 strtab_sec = NULL;
6795 if (strtab)
6796 free (strtab);
6797 strtab = NULL;
6798 strtab_size = 0;
6799 }
6800 else
6801 {
6802 /* Get the string table. */
6803 if (symtab_sec->sh_link >= filedata->file_header.e_shnum)
6804 {
6805 strtab_sec = NULL;
6806 if (strtab)
6807 free (strtab);
6808 strtab = NULL;
6809 strtab_size = 0;
6810 }
6811 else if (strtab_sec
6812 != (sec = filedata->section_headers + symtab_sec->sh_link))
6813 {
6814 strtab_sec = sec;
6815 if (strtab)
6816 free (strtab);
6817
6818 strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
6819 1, strtab_sec->sh_size,
6820 _("string table"));
6821 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
6822 }
6823 group_name = sym->st_name < strtab_size
6824 ? strtab + sym->st_name : _("<corrupt>");
6825 }
6826
6827 /* PR 17531: file: loop. */
6828 if (section->sh_entsize > section->sh_size)
6829 {
6830 error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6831 printable_section_name (filedata, section),
6832 (unsigned long) section->sh_entsize,
6833 (unsigned long) section->sh_size);
6834 break;
6835 }
6836
6837 start = (unsigned char *) get_data (NULL, filedata, section->sh_offset,
6838 1, section->sh_size,
6839 _("section data"));
6840 if (start == NULL)
6841 continue;
6842
6843 indices = start;
6844 size = (section->sh_size / section->sh_entsize) - 1;
6845 entry = byte_get (indices, 4);
6846 indices += 4;
6847
6848 if (do_section_groups)
6849 {
6850 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
6851 get_group_flags (entry), i, name, group_name, size);
6852
6853 printf (_(" [Index] Name\n"));
6854 }
6855
6856 group->group_index = i;
6857
6858 for (j = 0; j < size; j++)
6859 {
6860 struct group_list * g;
6861
6862 entry = byte_get (indices, 4);
6863 indices += 4;
6864
6865 if (entry >= filedata->file_header.e_shnum)
6866 {
6867 static unsigned num_group_errors = 0;
6868
6869 if (num_group_errors ++ < 10)
6870 {
6871 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6872 entry, i, filedata->file_header.e_shnum - 1);
6873 if (num_group_errors == 10)
6874 warn (_("Further error messages about overlarge group section indices suppressed\n"));
6875 }
6876 continue;
6877 }
6878
6879 if (section_headers_groups [entry] != NULL)
6880 {
6881 if (entry)
6882 {
6883 static unsigned num_errs = 0;
6884
6885 if (num_errs ++ < 10)
6886 {
6887 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6888 entry, i,
6889 section_headers_groups [entry]->group_index);
6890 if (num_errs == 10)
6891 warn (_("Further error messages about already contained group sections suppressed\n"));
6892 }
6893 continue;
6894 }
6895 else
6896 {
6897 /* Intel C/C++ compiler may put section 0 in a
6898 section group. We just warn it the first time
6899 and ignore it afterwards. */
6900 static bfd_boolean warned = FALSE;
6901 if (!warned)
6902 {
6903 error (_("section 0 in group section [%5u]\n"),
6904 section_headers_groups [entry]->group_index);
6905 warned = TRUE;
6906 }
6907 }
6908 }
6909
6910 section_headers_groups [entry] = group;
6911
6912 if (do_section_groups)
6913 {
6914 sec = filedata->section_headers + entry;
6915 printf (" [%5u] %s\n", entry, printable_section_name (filedata, sec));
6916 }
6917
6918 g = (struct group_list *) xmalloc (sizeof (struct group_list));
6919 g->section_index = entry;
6920 g->next = group->root;
6921 group->root = g;
6922 }
6923
6924 if (start)
6925 free (start);
6926
6927 group++;
6928 }
6929 }
6930
6931 if (symtab)
6932 free (symtab);
6933 if (strtab)
6934 free (strtab);
6935 return TRUE;
6936 }
6937
6938 /* Data used to display dynamic fixups. */
6939
6940 struct ia64_vms_dynfixup
6941 {
6942 bfd_vma needed_ident; /* Library ident number. */
6943 bfd_vma needed; /* Index in the dstrtab of the library name. */
6944 bfd_vma fixup_needed; /* Index of the library. */
6945 bfd_vma fixup_rela_cnt; /* Number of fixups. */
6946 bfd_vma fixup_rela_off; /* Fixups offset in the dynamic segment. */
6947 };
6948
6949 /* Data used to display dynamic relocations. */
6950
6951 struct ia64_vms_dynimgrela
6952 {
6953 bfd_vma img_rela_cnt; /* Number of relocations. */
6954 bfd_vma img_rela_off; /* Reloc offset in the dynamic segment. */
6955 };
6956
6957 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6958 library). */
6959
6960 static bfd_boolean
6961 dump_ia64_vms_dynamic_fixups (Filedata * filedata,
6962 struct ia64_vms_dynfixup * fixup,
6963 const char * strtab,
6964 unsigned int strtab_sz)
6965 {
6966 Elf64_External_VMS_IMAGE_FIXUP * imfs;
6967 long i;
6968 const char * lib_name;
6969
6970 imfs = get_data (NULL, filedata, dynamic_addr + fixup->fixup_rela_off,
6971 1, fixup->fixup_rela_cnt * sizeof (*imfs),
6972 _("dynamic section image fixups"));
6973 if (!imfs)
6974 return FALSE;
6975
6976 if (fixup->needed < strtab_sz)
6977 lib_name = strtab + fixup->needed;
6978 else
6979 {
6980 warn (_("corrupt library name index of 0x%lx found in dynamic entry"),
6981 (unsigned long) fixup->needed);
6982 lib_name = "???";
6983 }
6984 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
6985 (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
6986 printf
6987 (_("Seg Offset Type SymVec DataType\n"));
6988
6989 for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
6990 {
6991 unsigned int type;
6992 const char *rtype;
6993
6994 printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
6995 printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
6996 type = BYTE_GET (imfs [i].type);
6997 rtype = elf_ia64_reloc_type (type);
6998 if (rtype == NULL)
6999 printf (" 0x%08x ", type);
7000 else
7001 printf (" %-32s ", rtype);
7002 printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
7003 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
7004 }
7005
7006 free (imfs);
7007 return TRUE;
7008 }
7009
7010 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
7011
7012 static bfd_boolean
7013 dump_ia64_vms_dynamic_relocs (Filedata * filedata, struct ia64_vms_dynimgrela *imgrela)
7014 {
7015 Elf64_External_VMS_IMAGE_RELA *imrs;
7016 long i;
7017
7018 imrs = get_data (NULL, filedata, dynamic_addr + imgrela->img_rela_off,
7019 1, imgrela->img_rela_cnt * sizeof (*imrs),
7020 _("dynamic section image relocations"));
7021 if (!imrs)
7022 return FALSE;
7023
7024 printf (_("\nImage relocs\n"));
7025 printf
7026 (_("Seg Offset Type Addend Seg Sym Off\n"));
7027
7028 for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
7029 {
7030 unsigned int type;
7031 const char *rtype;
7032
7033 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
7034 printf ("%08" BFD_VMA_FMT "x ",
7035 (bfd_vma) BYTE_GET (imrs [i].rela_offset));
7036 type = BYTE_GET (imrs [i].type);
7037 rtype = elf_ia64_reloc_type (type);
7038 if (rtype == NULL)
7039 printf ("0x%08x ", type);
7040 else
7041 printf ("%-31s ", rtype);
7042 print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
7043 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
7044 printf ("%08" BFD_VMA_FMT "x\n",
7045 (bfd_vma) BYTE_GET (imrs [i].sym_offset));
7046 }
7047
7048 free (imrs);
7049 return TRUE;
7050 }
7051
7052 /* Display IA-64 OpenVMS dynamic relocations and fixups. */
7053
7054 static bfd_boolean
7055 process_ia64_vms_dynamic_relocs (Filedata * filedata)
7056 {
7057 struct ia64_vms_dynfixup fixup;
7058 struct ia64_vms_dynimgrela imgrela;
7059 Elf_Internal_Dyn *entry;
7060 bfd_vma strtab_off = 0;
7061 bfd_vma strtab_sz = 0;
7062 char *strtab = NULL;
7063 bfd_boolean res = TRUE;
7064
7065 memset (&fixup, 0, sizeof (fixup));
7066 memset (&imgrela, 0, sizeof (imgrela));
7067
7068 /* Note: the order of the entries is specified by the OpenVMS specs. */
7069 for (entry = dynamic_section;
7070 entry < dynamic_section + dynamic_nent;
7071 entry++)
7072 {
7073 switch (entry->d_tag)
7074 {
7075 case DT_IA_64_VMS_STRTAB_OFFSET:
7076 strtab_off = entry->d_un.d_val;
7077 break;
7078 case DT_STRSZ:
7079 strtab_sz = entry->d_un.d_val;
7080 if (strtab == NULL)
7081 strtab = get_data (NULL, filedata, dynamic_addr + strtab_off,
7082 1, strtab_sz, _("dynamic string section"));
7083 break;
7084
7085 case DT_IA_64_VMS_NEEDED_IDENT:
7086 fixup.needed_ident = entry->d_un.d_val;
7087 break;
7088 case DT_NEEDED:
7089 fixup.needed = entry->d_un.d_val;
7090 break;
7091 case DT_IA_64_VMS_FIXUP_NEEDED:
7092 fixup.fixup_needed = entry->d_un.d_val;
7093 break;
7094 case DT_IA_64_VMS_FIXUP_RELA_CNT:
7095 fixup.fixup_rela_cnt = entry->d_un.d_val;
7096 break;
7097 case DT_IA_64_VMS_FIXUP_RELA_OFF:
7098 fixup.fixup_rela_off = entry->d_un.d_val;
7099 if (! dump_ia64_vms_dynamic_fixups (filedata, &fixup, strtab, strtab_sz))
7100 res = FALSE;
7101 break;
7102 case DT_IA_64_VMS_IMG_RELA_CNT:
7103 imgrela.img_rela_cnt = entry->d_un.d_val;
7104 break;
7105 case DT_IA_64_VMS_IMG_RELA_OFF:
7106 imgrela.img_rela_off = entry->d_un.d_val;
7107 if (! dump_ia64_vms_dynamic_relocs (filedata, &imgrela))
7108 res = FALSE;
7109 break;
7110
7111 default:
7112 break;
7113 }
7114 }
7115
7116 if (strtab != NULL)
7117 free (strtab);
7118
7119 return res;
7120 }
7121
7122 static struct
7123 {
7124 const char * name;
7125 int reloc;
7126 int size;
7127 int rela;
7128 }
7129 dynamic_relocations [] =
7130 {
7131 { "REL", DT_REL, DT_RELSZ, FALSE },
7132 { "RELA", DT_RELA, DT_RELASZ, TRUE },
7133 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
7134 };
7135
7136 /* Process the reloc section. */
7137
7138 static bfd_boolean
7139 process_relocs (Filedata * filedata)
7140 {
7141 unsigned long rel_size;
7142 unsigned long rel_offset;
7143
7144 if (!do_reloc)
7145 return TRUE;
7146
7147 if (do_using_dynamic)
7148 {
7149 int is_rela;
7150 const char * name;
7151 bfd_boolean has_dynamic_reloc;
7152 unsigned int i;
7153
7154 has_dynamic_reloc = FALSE;
7155
7156 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
7157 {
7158 is_rela = dynamic_relocations [i].rela;
7159 name = dynamic_relocations [i].name;
7160 rel_size = dynamic_info [dynamic_relocations [i].size];
7161 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
7162
7163 if (rel_size)
7164 has_dynamic_reloc = TRUE;
7165
7166 if (is_rela == UNKNOWN)
7167 {
7168 if (dynamic_relocations [i].reloc == DT_JMPREL)
7169 switch (dynamic_info[DT_PLTREL])
7170 {
7171 case DT_REL:
7172 is_rela = FALSE;
7173 break;
7174 case DT_RELA:
7175 is_rela = TRUE;
7176 break;
7177 }
7178 }
7179
7180 if (rel_size)
7181 {
7182 printf
7183 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
7184 name, rel_offset, rel_size);
7185
7186 dump_relocations (filedata,
7187 offset_from_vma (filedata, rel_offset, rel_size),
7188 rel_size,
7189 dynamic_symbols, num_dynamic_syms,
7190 dynamic_strings, dynamic_strings_length,
7191 is_rela, TRUE /* is_dynamic */);
7192 }
7193 }
7194
7195 if (is_ia64_vms (filedata))
7196 if (process_ia64_vms_dynamic_relocs (filedata))
7197 has_dynamic_reloc = TRUE;
7198
7199 if (! has_dynamic_reloc)
7200 printf (_("\nThere are no dynamic relocations in this file.\n"));
7201 }
7202 else
7203 {
7204 Elf_Internal_Shdr * section;
7205 unsigned long i;
7206 bfd_boolean found = FALSE;
7207
7208 for (i = 0, section = filedata->section_headers;
7209 i < filedata->file_header.e_shnum;
7210 i++, section++)
7211 {
7212 if ( section->sh_type != SHT_RELA
7213 && section->sh_type != SHT_REL)
7214 continue;
7215
7216 rel_offset = section->sh_offset;
7217 rel_size = section->sh_size;
7218
7219 if (rel_size)
7220 {
7221 Elf_Internal_Shdr * strsec;
7222 int is_rela;
7223 unsigned long num_rela;
7224
7225 printf (_("\nRelocation section "));
7226
7227 if (filedata->string_table == NULL)
7228 printf ("%d", section->sh_name);
7229 else
7230 printf ("'%s'", printable_section_name (filedata, section));
7231
7232 num_rela = rel_size / section->sh_entsize;
7233 printf (ngettext (" at offset 0x%lx contains %lu entry:\n",
7234 " at offset 0x%lx contains %lu entries:\n",
7235 num_rela),
7236 rel_offset, num_rela);
7237
7238 is_rela = section->sh_type == SHT_RELA;
7239
7240 if (section->sh_link != 0
7241 && section->sh_link < filedata->file_header.e_shnum)
7242 {
7243 Elf_Internal_Shdr * symsec;
7244 Elf_Internal_Sym * symtab;
7245 unsigned long nsyms;
7246 unsigned long strtablen = 0;
7247 char * strtab = NULL;
7248
7249 symsec = filedata->section_headers + section->sh_link;
7250 if (symsec->sh_type != SHT_SYMTAB
7251 && symsec->sh_type != SHT_DYNSYM)
7252 continue;
7253
7254 symtab = GET_ELF_SYMBOLS (filedata, symsec, & nsyms);
7255
7256 if (symtab == NULL)
7257 continue;
7258
7259 if (symsec->sh_link != 0
7260 && symsec->sh_link < filedata->file_header.e_shnum)
7261 {
7262 strsec = filedata->section_headers + symsec->sh_link;
7263
7264 strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
7265 1, strsec->sh_size,
7266 _("string table"));
7267 strtablen = strtab == NULL ? 0 : strsec->sh_size;
7268 }
7269
7270 dump_relocations (filedata, rel_offset, rel_size,
7271 symtab, nsyms, strtab, strtablen,
7272 is_rela,
7273 symsec->sh_type == SHT_DYNSYM);
7274 if (strtab)
7275 free (strtab);
7276 free (symtab);
7277 }
7278 else
7279 dump_relocations (filedata, rel_offset, rel_size,
7280 NULL, 0, NULL, 0, is_rela,
7281 FALSE /* is_dynamic */);
7282
7283 found = TRUE;
7284 }
7285 }
7286
7287 if (! found)
7288 {
7289 /* Users sometimes forget the -D option, so try to be helpful. */
7290 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
7291 {
7292 if (dynamic_info [dynamic_relocations [i].size])
7293 {
7294 printf (_("\nThere are no static relocations in this file."));
7295 printf (_("\nTo see the dynamic relocations add --use-dynamic to the command line.\n"));
7296
7297 break;
7298 }
7299 }
7300 if (i == ARRAY_SIZE (dynamic_relocations))
7301 printf (_("\nThere are no relocations in this file.\n"));
7302 }
7303 }
7304
7305 return TRUE;
7306 }
7307
7308 /* An absolute address consists of a section and an offset. If the
7309 section is NULL, the offset itself is the address, otherwise, the
7310 address equals to LOAD_ADDRESS(section) + offset. */
7311
7312 struct absaddr
7313 {
7314 unsigned short section;
7315 bfd_vma offset;
7316 };
7317
7318 #define ABSADDR(a) \
7319 ((a).section \
7320 ? filedata->section_headers [(a).section].sh_addr + (a).offset \
7321 : (a).offset)
7322
7323 /* Find the nearest symbol at or below ADDR. Returns the symbol
7324 name, if found, and the offset from the symbol to ADDR. */
7325
7326 static void
7327 find_symbol_for_address (Filedata * filedata,
7328 Elf_Internal_Sym * symtab,
7329 unsigned long nsyms,
7330 const char * strtab,
7331 unsigned long strtab_size,
7332 struct absaddr addr,
7333 const char ** symname,
7334 bfd_vma * offset)
7335 {
7336 bfd_vma dist = 0x100000;
7337 Elf_Internal_Sym * sym;
7338 Elf_Internal_Sym * beg;
7339 Elf_Internal_Sym * end;
7340 Elf_Internal_Sym * best = NULL;
7341
7342 REMOVE_ARCH_BITS (addr.offset);
7343 beg = symtab;
7344 end = symtab + nsyms;
7345
7346 while (beg < end)
7347 {
7348 bfd_vma value;
7349
7350 sym = beg + (end - beg) / 2;
7351
7352 value = sym->st_value;
7353 REMOVE_ARCH_BITS (value);
7354
7355 if (sym->st_name != 0
7356 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
7357 && addr.offset >= value
7358 && addr.offset - value < dist)
7359 {
7360 best = sym;
7361 dist = addr.offset - value;
7362 if (!dist)
7363 break;
7364 }
7365
7366 if (addr.offset < value)
7367 end = sym;
7368 else
7369 beg = sym + 1;
7370 }
7371
7372 if (best)
7373 {
7374 *symname = (best->st_name >= strtab_size
7375 ? _("<corrupt>") : strtab + best->st_name);
7376 *offset = dist;
7377 return;
7378 }
7379
7380 *symname = NULL;
7381 *offset = addr.offset;
7382 }
7383
7384 static /* signed */ int
7385 symcmp (const void *p, const void *q)
7386 {
7387 Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
7388 Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
7389
7390 return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
7391 }
7392
7393 /* Process the unwind section. */
7394
7395 #include "unwind-ia64.h"
7396
7397 struct ia64_unw_table_entry
7398 {
7399 struct absaddr start;
7400 struct absaddr end;
7401 struct absaddr info;
7402 };
7403
7404 struct ia64_unw_aux_info
7405 {
7406 struct ia64_unw_table_entry * table; /* Unwind table. */
7407 unsigned long table_len; /* Length of unwind table. */
7408 unsigned char * info; /* Unwind info. */
7409 unsigned long info_size; /* Size of unwind info. */
7410 bfd_vma info_addr; /* Starting address of unwind info. */
7411 bfd_vma seg_base; /* Starting address of segment. */
7412 Elf_Internal_Sym * symtab; /* The symbol table. */
7413 unsigned long nsyms; /* Number of symbols. */
7414 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7415 unsigned long nfuns; /* Number of entries in funtab. */
7416 char * strtab; /* The string table. */
7417 unsigned long strtab_size; /* Size of string table. */
7418 };
7419
7420 static bfd_boolean
7421 dump_ia64_unwind (Filedata * filedata, struct ia64_unw_aux_info * aux)
7422 {
7423 struct ia64_unw_table_entry * tp;
7424 unsigned long j, nfuns;
7425 int in_body;
7426 bfd_boolean res = TRUE;
7427
7428 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7429 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7430 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7431 aux->funtab[nfuns++] = aux->symtab[j];
7432 aux->nfuns = nfuns;
7433 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7434
7435 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7436 {
7437 bfd_vma stamp;
7438 bfd_vma offset;
7439 const unsigned char * dp;
7440 const unsigned char * head;
7441 const unsigned char * end;
7442 const char * procname;
7443
7444 find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
7445 aux->strtab_size, tp->start, &procname, &offset);
7446
7447 fputs ("\n<", stdout);
7448
7449 if (procname)
7450 {
7451 fputs (procname, stdout);
7452
7453 if (offset)
7454 printf ("+%lx", (unsigned long) offset);
7455 }
7456
7457 fputs (">: [", stdout);
7458 print_vma (tp->start.offset, PREFIX_HEX);
7459 fputc ('-', stdout);
7460 print_vma (tp->end.offset, PREFIX_HEX);
7461 printf ("], info at +0x%lx\n",
7462 (unsigned long) (tp->info.offset - aux->seg_base));
7463
7464 /* PR 17531: file: 86232b32. */
7465 if (aux->info == NULL)
7466 continue;
7467
7468 /* PR 17531: file: 0997b4d1. */
7469 if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
7470 {
7471 warn (_("Invalid offset %lx in table entry %ld\n"),
7472 (long) tp->info.offset, (long) (tp - aux->table));
7473 res = FALSE;
7474 continue;
7475 }
7476
7477 head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
7478 stamp = byte_get ((unsigned char *) head, sizeof (stamp));
7479
7480 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
7481 (unsigned) UNW_VER (stamp),
7482 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
7483 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
7484 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
7485 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
7486
7487 if (UNW_VER (stamp) != 1)
7488 {
7489 printf (_("\tUnknown version.\n"));
7490 continue;
7491 }
7492
7493 in_body = 0;
7494 end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
7495 /* PR 17531: file: 16ceda89. */
7496 if (end > aux->info + aux->info_size)
7497 end = aux->info + aux->info_size;
7498 for (dp = head + 8; dp < end;)
7499 dp = unw_decode (dp, in_body, & in_body, end);
7500 }
7501
7502 free (aux->funtab);
7503
7504 return res;
7505 }
7506
7507 static bfd_boolean
7508 slurp_ia64_unwind_table (Filedata * filedata,
7509 struct ia64_unw_aux_info * aux,
7510 Elf_Internal_Shdr * sec)
7511 {
7512 unsigned long size, nrelas, i;
7513 Elf_Internal_Phdr * seg;
7514 struct ia64_unw_table_entry * tep;
7515 Elf_Internal_Shdr * relsec;
7516 Elf_Internal_Rela * rela;
7517 Elf_Internal_Rela * rp;
7518 unsigned char * table;
7519 unsigned char * tp;
7520 Elf_Internal_Sym * sym;
7521 const char * relname;
7522
7523 aux->table_len = 0;
7524
7525 /* First, find the starting address of the segment that includes
7526 this section: */
7527
7528 if (filedata->file_header.e_phnum)
7529 {
7530 if (! get_program_headers (filedata))
7531 return FALSE;
7532
7533 for (seg = filedata->program_headers;
7534 seg < filedata->program_headers + filedata->file_header.e_phnum;
7535 ++seg)
7536 {
7537 if (seg->p_type != PT_LOAD)
7538 continue;
7539
7540 if (sec->sh_addr >= seg->p_vaddr
7541 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7542 {
7543 aux->seg_base = seg->p_vaddr;
7544 break;
7545 }
7546 }
7547 }
7548
7549 /* Second, build the unwind table from the contents of the unwind section: */
7550 size = sec->sh_size;
7551 table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
7552 _("unwind table"));
7553 if (!table)
7554 return FALSE;
7555
7556 aux->table_len = size / (3 * eh_addr_size);
7557 aux->table = (struct ia64_unw_table_entry *)
7558 xcmalloc (aux->table_len, sizeof (aux->table[0]));
7559 tep = aux->table;
7560
7561 for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
7562 {
7563 tep->start.section = SHN_UNDEF;
7564 tep->end.section = SHN_UNDEF;
7565 tep->info.section = SHN_UNDEF;
7566 tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7567 tep->end.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7568 tep->info.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7569 tep->start.offset += aux->seg_base;
7570 tep->end.offset += aux->seg_base;
7571 tep->info.offset += aux->seg_base;
7572 }
7573 free (table);
7574
7575 /* Third, apply any relocations to the unwind table: */
7576 for (relsec = filedata->section_headers;
7577 relsec < filedata->section_headers + filedata->file_header.e_shnum;
7578 ++relsec)
7579 {
7580 if (relsec->sh_type != SHT_RELA
7581 || relsec->sh_info >= filedata->file_header.e_shnum
7582 || filedata->section_headers + relsec->sh_info != sec)
7583 continue;
7584
7585 if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
7586 & rela, & nrelas))
7587 {
7588 free (aux->table);
7589 aux->table = NULL;
7590 aux->table_len = 0;
7591 return FALSE;
7592 }
7593
7594 for (rp = rela; rp < rela + nrelas; ++rp)
7595 {
7596 relname = elf_ia64_reloc_type (get_reloc_type (filedata, rp->r_info));
7597 sym = aux->symtab + get_reloc_symindex (rp->r_info);
7598
7599 /* PR 17531: file: 9fa67536. */
7600 if (relname == NULL)
7601 {
7602 warn (_("Skipping unknown relocation type: %u\n"),
7603 get_reloc_type (filedata, rp->r_info));
7604 continue;
7605 }
7606
7607 if (! const_strneq (relname, "R_IA64_SEGREL"))
7608 {
7609 warn (_("Skipping unexpected relocation type: %s\n"), relname);
7610 continue;
7611 }
7612
7613 i = rp->r_offset / (3 * eh_addr_size);
7614
7615 /* PR 17531: file: 5bc8d9bf. */
7616 if (i >= aux->table_len)
7617 {
7618 warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
7619 continue;
7620 }
7621
7622 switch (rp->r_offset / eh_addr_size % 3)
7623 {
7624 case 0:
7625 aux->table[i].start.section = sym->st_shndx;
7626 aux->table[i].start.offset = rp->r_addend + sym->st_value;
7627 break;
7628 case 1:
7629 aux->table[i].end.section = sym->st_shndx;
7630 aux->table[i].end.offset = rp->r_addend + sym->st_value;
7631 break;
7632 case 2:
7633 aux->table[i].info.section = sym->st_shndx;
7634 aux->table[i].info.offset = rp->r_addend + sym->st_value;
7635 break;
7636 default:
7637 break;
7638 }
7639 }
7640
7641 free (rela);
7642 }
7643
7644 return TRUE;
7645 }
7646
7647 static bfd_boolean
7648 ia64_process_unwind (Filedata * filedata)
7649 {
7650 Elf_Internal_Shdr * sec;
7651 Elf_Internal_Shdr * unwsec = NULL;
7652 Elf_Internal_Shdr * strsec;
7653 unsigned long i, unwcount = 0, unwstart = 0;
7654 struct ia64_unw_aux_info aux;
7655 bfd_boolean res = TRUE;
7656
7657 memset (& aux, 0, sizeof (aux));
7658
7659 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
7660 {
7661 if (sec->sh_type == SHT_SYMTAB
7662 && sec->sh_link < filedata->file_header.e_shnum)
7663 {
7664 aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
7665
7666 strsec = filedata->section_headers + sec->sh_link;
7667 if (aux.strtab != NULL)
7668 {
7669 error (_("Multiple auxillary string tables encountered\n"));
7670 free (aux.strtab);
7671 res = FALSE;
7672 }
7673 aux.strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
7674 1, strsec->sh_size,
7675 _("string table"));
7676 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7677 }
7678 else if (sec->sh_type == SHT_IA_64_UNWIND)
7679 unwcount++;
7680 }
7681
7682 if (!unwcount)
7683 printf (_("\nThere are no unwind sections in this file.\n"));
7684
7685 while (unwcount-- > 0)
7686 {
7687 char * suffix;
7688 size_t len, len2;
7689
7690 for (i = unwstart, sec = filedata->section_headers + unwstart, unwsec = NULL;
7691 i < filedata->file_header.e_shnum; ++i, ++sec)
7692 if (sec->sh_type == SHT_IA_64_UNWIND)
7693 {
7694 unwsec = sec;
7695 break;
7696 }
7697 /* We have already counted the number of SHT_IA64_UNWIND
7698 sections so the loop above should never fail. */
7699 assert (unwsec != NULL);
7700
7701 unwstart = i + 1;
7702 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
7703
7704 if ((unwsec->sh_flags & SHF_GROUP) != 0)
7705 {
7706 /* We need to find which section group it is in. */
7707 struct group_list * g;
7708
7709 if (section_headers_groups == NULL
7710 || section_headers_groups [i] == NULL)
7711 i = filedata->file_header.e_shnum;
7712 else
7713 {
7714 g = section_headers_groups [i]->root;
7715
7716 for (; g != NULL; g = g->next)
7717 {
7718 sec = filedata->section_headers + g->section_index;
7719
7720 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
7721 break;
7722 }
7723
7724 if (g == NULL)
7725 i = filedata->file_header.e_shnum;
7726 }
7727 }
7728 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
7729 {
7730 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
7731 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
7732 suffix = SECTION_NAME (unwsec) + len;
7733 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum;
7734 ++i, ++sec)
7735 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
7736 && streq (SECTION_NAME (sec) + len2, suffix))
7737 break;
7738 }
7739 else
7740 {
7741 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
7742 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
7743 len = sizeof (ELF_STRING_ia64_unwind) - 1;
7744 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
7745 suffix = "";
7746 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
7747 suffix = SECTION_NAME (unwsec) + len;
7748 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum;
7749 ++i, ++sec)
7750 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
7751 && streq (SECTION_NAME (sec) + len2, suffix))
7752 break;
7753 }
7754
7755 if (i == filedata->file_header.e_shnum)
7756 {
7757 printf (_("\nCould not find unwind info section for "));
7758
7759 if (filedata->string_table == NULL)
7760 printf ("%d", unwsec->sh_name);
7761 else
7762 printf ("'%s'", printable_section_name (filedata, unwsec));
7763 }
7764 else
7765 {
7766 aux.info_addr = sec->sh_addr;
7767 aux.info = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1,
7768 sec->sh_size,
7769 _("unwind info"));
7770 aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
7771
7772 printf (_("\nUnwind section "));
7773
7774 if (filedata->string_table == NULL)
7775 printf ("%d", unwsec->sh_name);
7776 else
7777 printf ("'%s'", printable_section_name (filedata, unwsec));
7778
7779 printf (_(" at offset 0x%lx contains %lu entries:\n"),
7780 (unsigned long) unwsec->sh_offset,
7781 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
7782
7783 if (slurp_ia64_unwind_table (filedata, & aux, unwsec)
7784 && aux.table_len > 0)
7785 dump_ia64_unwind (filedata, & aux);
7786
7787 if (aux.table)
7788 free ((char *) aux.table);
7789 if (aux.info)
7790 free ((char *) aux.info);
7791 aux.table = NULL;
7792 aux.info = NULL;
7793 }
7794 }
7795
7796 if (aux.symtab)
7797 free (aux.symtab);
7798 if (aux.strtab)
7799 free ((char *) aux.strtab);
7800
7801 return res;
7802 }
7803
7804 struct hppa_unw_table_entry
7805 {
7806 struct absaddr start;
7807 struct absaddr end;
7808 unsigned int Cannot_unwind:1; /* 0 */
7809 unsigned int Millicode:1; /* 1 */
7810 unsigned int Millicode_save_sr0:1; /* 2 */
7811 unsigned int Region_description:2; /* 3..4 */
7812 unsigned int reserved1:1; /* 5 */
7813 unsigned int Entry_SR:1; /* 6 */
7814 unsigned int Entry_FR:4; /* Number saved 7..10 */
7815 unsigned int Entry_GR:5; /* Number saved 11..15 */
7816 unsigned int Args_stored:1; /* 16 */
7817 unsigned int Variable_Frame:1; /* 17 */
7818 unsigned int Separate_Package_Body:1; /* 18 */
7819 unsigned int Frame_Extension_Millicode:1; /* 19 */
7820 unsigned int Stack_Overflow_Check:1; /* 20 */
7821 unsigned int Two_Instruction_SP_Increment:1; /* 21 */
7822 unsigned int Ada_Region:1; /* 22 */
7823 unsigned int cxx_info:1; /* 23 */
7824 unsigned int cxx_try_catch:1; /* 24 */
7825 unsigned int sched_entry_seq:1; /* 25 */
7826 unsigned int reserved2:1; /* 26 */
7827 unsigned int Save_SP:1; /* 27 */
7828 unsigned int Save_RP:1; /* 28 */
7829 unsigned int Save_MRP_in_frame:1; /* 29 */
7830 unsigned int extn_ptr_defined:1; /* 30 */
7831 unsigned int Cleanup_defined:1; /* 31 */
7832
7833 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
7834 unsigned int HP_UX_interrupt_marker:1; /* 1 */
7835 unsigned int Large_frame:1; /* 2 */
7836 unsigned int Pseudo_SP_Set:1; /* 3 */
7837 unsigned int reserved4:1; /* 4 */
7838 unsigned int Total_frame_size:27; /* 5..31 */
7839 };
7840
7841 struct hppa_unw_aux_info
7842 {
7843 struct hppa_unw_table_entry * table; /* Unwind table. */
7844 unsigned long table_len; /* Length of unwind table. */
7845 bfd_vma seg_base; /* Starting address of segment. */
7846 Elf_Internal_Sym * symtab; /* The symbol table. */
7847 unsigned long nsyms; /* Number of symbols. */
7848 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7849 unsigned long nfuns; /* Number of entries in funtab. */
7850 char * strtab; /* The string table. */
7851 unsigned long strtab_size; /* Size of string table. */
7852 };
7853
7854 static bfd_boolean
7855 dump_hppa_unwind (Filedata * filedata, struct hppa_unw_aux_info * aux)
7856 {
7857 struct hppa_unw_table_entry * tp;
7858 unsigned long j, nfuns;
7859 bfd_boolean res = TRUE;
7860
7861 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7862 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7863 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7864 aux->funtab[nfuns++] = aux->symtab[j];
7865 aux->nfuns = nfuns;
7866 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7867
7868 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7869 {
7870 bfd_vma offset;
7871 const char * procname;
7872
7873 find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
7874 aux->strtab_size, tp->start, &procname,
7875 &offset);
7876
7877 fputs ("\n<", stdout);
7878
7879 if (procname)
7880 {
7881 fputs (procname, stdout);
7882
7883 if (offset)
7884 printf ("+%lx", (unsigned long) offset);
7885 }
7886
7887 fputs (">: [", stdout);
7888 print_vma (tp->start.offset, PREFIX_HEX);
7889 fputc ('-', stdout);
7890 print_vma (tp->end.offset, PREFIX_HEX);
7891 printf ("]\n\t");
7892
7893 #define PF(_m) if (tp->_m) printf (#_m " ");
7894 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
7895 PF(Cannot_unwind);
7896 PF(Millicode);
7897 PF(Millicode_save_sr0);
7898 /* PV(Region_description); */
7899 PF(Entry_SR);
7900 PV(Entry_FR);
7901 PV(Entry_GR);
7902 PF(Args_stored);
7903 PF(Variable_Frame);
7904 PF(Separate_Package_Body);
7905 PF(Frame_Extension_Millicode);
7906 PF(Stack_Overflow_Check);
7907 PF(Two_Instruction_SP_Increment);
7908 PF(Ada_Region);
7909 PF(cxx_info);
7910 PF(cxx_try_catch);
7911 PF(sched_entry_seq);
7912 PF(Save_SP);
7913 PF(Save_RP);
7914 PF(Save_MRP_in_frame);
7915 PF(extn_ptr_defined);
7916 PF(Cleanup_defined);
7917 PF(MPE_XL_interrupt_marker);
7918 PF(HP_UX_interrupt_marker);
7919 PF(Large_frame);
7920 PF(Pseudo_SP_Set);
7921 PV(Total_frame_size);
7922 #undef PF
7923 #undef PV
7924 }
7925
7926 printf ("\n");
7927
7928 free (aux->funtab);
7929
7930 return res;
7931 }
7932
7933 static bfd_boolean
7934 slurp_hppa_unwind_table (Filedata * filedata,
7935 struct hppa_unw_aux_info * aux,
7936 Elf_Internal_Shdr * sec)
7937 {
7938 unsigned long size, unw_ent_size, nentries, nrelas, i;
7939 Elf_Internal_Phdr * seg;
7940 struct hppa_unw_table_entry * tep;
7941 Elf_Internal_Shdr * relsec;
7942 Elf_Internal_Rela * rela;
7943 Elf_Internal_Rela * rp;
7944 unsigned char * table;
7945 unsigned char * tp;
7946 Elf_Internal_Sym * sym;
7947 const char * relname;
7948
7949 /* First, find the starting address of the segment that includes
7950 this section. */
7951 if (filedata->file_header.e_phnum)
7952 {
7953 if (! get_program_headers (filedata))
7954 return FALSE;
7955
7956 for (seg = filedata->program_headers;
7957 seg < filedata->program_headers + filedata->file_header.e_phnum;
7958 ++seg)
7959 {
7960 if (seg->p_type != PT_LOAD)
7961 continue;
7962
7963 if (sec->sh_addr >= seg->p_vaddr
7964 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7965 {
7966 aux->seg_base = seg->p_vaddr;
7967 break;
7968 }
7969 }
7970 }
7971
7972 /* Second, build the unwind table from the contents of the unwind
7973 section. */
7974 size = sec->sh_size;
7975 table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
7976 _("unwind table"));
7977 if (!table)
7978 return FALSE;
7979
7980 unw_ent_size = 16;
7981 nentries = size / unw_ent_size;
7982 size = unw_ent_size * nentries;
7983
7984 tep = aux->table = (struct hppa_unw_table_entry *)
7985 xcmalloc (nentries, sizeof (aux->table[0]));
7986
7987 for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
7988 {
7989 unsigned int tmp1, tmp2;
7990
7991 tep->start.section = SHN_UNDEF;
7992 tep->end.section = SHN_UNDEF;
7993
7994 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
7995 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
7996 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
7997 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
7998
7999 tep->start.offset += aux->seg_base;
8000 tep->end.offset += aux->seg_base;
8001
8002 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
8003 tep->Millicode = (tmp1 >> 30) & 0x1;
8004 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
8005 tep->Region_description = (tmp1 >> 27) & 0x3;
8006 tep->reserved1 = (tmp1 >> 26) & 0x1;
8007 tep->Entry_SR = (tmp1 >> 25) & 0x1;
8008 tep->Entry_FR = (tmp1 >> 21) & 0xf;
8009 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
8010 tep->Args_stored = (tmp1 >> 15) & 0x1;
8011 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
8012 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
8013 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
8014 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
8015 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
8016 tep->Ada_Region = (tmp1 >> 9) & 0x1;
8017 tep->cxx_info = (tmp1 >> 8) & 0x1;
8018 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
8019 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
8020 tep->reserved2 = (tmp1 >> 5) & 0x1;
8021 tep->Save_SP = (tmp1 >> 4) & 0x1;
8022 tep->Save_RP = (tmp1 >> 3) & 0x1;
8023 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
8024 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
8025 tep->Cleanup_defined = tmp1 & 0x1;
8026
8027 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
8028 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
8029 tep->Large_frame = (tmp2 >> 29) & 0x1;
8030 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
8031 tep->reserved4 = (tmp2 >> 27) & 0x1;
8032 tep->Total_frame_size = tmp2 & 0x7ffffff;
8033 }
8034 free (table);
8035
8036 /* Third, apply any relocations to the unwind table. */
8037 for (relsec = filedata->section_headers;
8038 relsec < filedata->section_headers + filedata->file_header.e_shnum;
8039 ++relsec)
8040 {
8041 if (relsec->sh_type != SHT_RELA
8042 || relsec->sh_info >= filedata->file_header.e_shnum
8043 || filedata->section_headers + relsec->sh_info != sec)
8044 continue;
8045
8046 if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
8047 & rela, & nrelas))
8048 return FALSE;
8049
8050 for (rp = rela; rp < rela + nrelas; ++rp)
8051 {
8052 relname = elf_hppa_reloc_type (get_reloc_type (filedata, rp->r_info));
8053 sym = aux->symtab + get_reloc_symindex (rp->r_info);
8054
8055 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
8056 if (! const_strneq (relname, "R_PARISC_SEGREL"))
8057 {
8058 warn (_("Skipping unexpected relocation type %s\n"), relname);
8059 continue;
8060 }
8061
8062 i = rp->r_offset / unw_ent_size;
8063
8064 switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
8065 {
8066 case 0:
8067 aux->table[i].start.section = sym->st_shndx;
8068 aux->table[i].start.offset = sym->st_value + rp->r_addend;
8069 break;
8070 case 1:
8071 aux->table[i].end.section = sym->st_shndx;
8072 aux->table[i].end.offset = sym->st_value + rp->r_addend;
8073 break;
8074 default:
8075 break;
8076 }
8077 }
8078
8079 free (rela);
8080 }
8081
8082 aux->table_len = nentries;
8083
8084 return TRUE;
8085 }
8086
8087 static bfd_boolean
8088 hppa_process_unwind (Filedata * filedata)
8089 {
8090 struct hppa_unw_aux_info aux;
8091 Elf_Internal_Shdr * unwsec = NULL;
8092 Elf_Internal_Shdr * strsec;
8093 Elf_Internal_Shdr * sec;
8094 unsigned long i;
8095 bfd_boolean res = TRUE;
8096
8097 if (filedata->string_table == NULL)
8098 return FALSE;
8099
8100 memset (& aux, 0, sizeof (aux));
8101
8102 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
8103 {
8104 if (sec->sh_type == SHT_SYMTAB
8105 && sec->sh_link < filedata->file_header.e_shnum)
8106 {
8107 aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
8108
8109 strsec = filedata->section_headers + sec->sh_link;
8110 if (aux.strtab != NULL)
8111 {
8112 error (_("Multiple auxillary string tables encountered\n"));
8113 free (aux.strtab);
8114 res = FALSE;
8115 }
8116 aux.strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
8117 1, strsec->sh_size,
8118 _("string table"));
8119 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8120 }
8121 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
8122 unwsec = sec;
8123 }
8124
8125 if (!unwsec)
8126 printf (_("\nThere are no unwind sections in this file.\n"));
8127
8128 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
8129 {
8130 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
8131 {
8132 unsigned long num_unwind = sec->sh_size / (2 * eh_addr_size + 8);
8133
8134 printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
8135 "contains %lu entry:\n",
8136 "\nUnwind section '%s' at offset 0x%lx "
8137 "contains %lu entries:\n",
8138 num_unwind),
8139 printable_section_name (filedata, sec),
8140 (unsigned long) sec->sh_offset,
8141 num_unwind);
8142
8143 if (! slurp_hppa_unwind_table (filedata, &aux, sec))
8144 res = FALSE;
8145
8146 if (res && aux.table_len > 0)
8147 {
8148 if (! dump_hppa_unwind (filedata, &aux))
8149 res = FALSE;
8150 }
8151
8152 if (aux.table)
8153 free ((char *) aux.table);
8154 aux.table = NULL;
8155 }
8156 }
8157
8158 if (aux.symtab)
8159 free (aux.symtab);
8160 if (aux.strtab)
8161 free ((char *) aux.strtab);
8162
8163 return res;
8164 }
8165
8166 struct arm_section
8167 {
8168 unsigned char * data; /* The unwind data. */
8169 Elf_Internal_Shdr * sec; /* The cached unwind section header. */
8170 Elf_Internal_Rela * rela; /* The cached relocations for this section. */
8171 unsigned long nrelas; /* The number of relocations. */
8172 unsigned int rel_type; /* REL or RELA ? */
8173 Elf_Internal_Rela * next_rela; /* Cyclic pointer to the next reloc to process. */
8174 };
8175
8176 struct arm_unw_aux_info
8177 {
8178 Filedata * filedata; /* The file containing the unwind sections. */
8179 Elf_Internal_Sym * symtab; /* The file's symbol table. */
8180 unsigned long nsyms; /* Number of symbols. */
8181 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
8182 unsigned long nfuns; /* Number of these symbols. */
8183 char * strtab; /* The file's string table. */
8184 unsigned long strtab_size; /* Size of string table. */
8185 };
8186
8187 static const char *
8188 arm_print_vma_and_name (Filedata * filedata,
8189 struct arm_unw_aux_info * aux,
8190 bfd_vma fn,
8191 struct absaddr addr)
8192 {
8193 const char *procname;
8194 bfd_vma sym_offset;
8195
8196 if (addr.section == SHN_UNDEF)
8197 addr.offset = fn;
8198
8199 find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
8200 aux->strtab_size, addr, &procname,
8201 &sym_offset);
8202
8203 print_vma (fn, PREFIX_HEX);
8204
8205 if (procname)
8206 {
8207 fputs (" <", stdout);
8208 fputs (procname, stdout);
8209
8210 if (sym_offset)
8211 printf ("+0x%lx", (unsigned long) sym_offset);
8212 fputc ('>', stdout);
8213 }
8214
8215 return procname;
8216 }
8217
8218 static void
8219 arm_free_section (struct arm_section *arm_sec)
8220 {
8221 if (arm_sec->data != NULL)
8222 free (arm_sec->data);
8223
8224 if (arm_sec->rela != NULL)
8225 free (arm_sec->rela);
8226 }
8227
8228 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
8229 cached section and install SEC instead.
8230 2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
8231 and return its valued in * WORDP, relocating if necessary.
8232 3) Update the NEXT_RELA field in ARM_SEC and store the section index and
8233 relocation's offset in ADDR.
8234 4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
8235 into the string table of the symbol associated with the reloc. If no
8236 reloc was applied store -1 there.
8237 5) Return TRUE upon success, FALSE otherwise. */
8238
8239 static bfd_boolean
8240 get_unwind_section_word (Filedata * filedata,
8241 struct arm_unw_aux_info * aux,
8242 struct arm_section * arm_sec,
8243 Elf_Internal_Shdr * sec,
8244 bfd_vma word_offset,
8245 unsigned int * wordp,
8246 struct absaddr * addr,
8247 bfd_vma * sym_name)
8248 {
8249 Elf_Internal_Rela *rp;
8250 Elf_Internal_Sym *sym;
8251 const char * relname;
8252 unsigned int word;
8253 bfd_boolean wrapped;
8254
8255 if (sec == NULL || arm_sec == NULL)
8256 return FALSE;
8257
8258 addr->section = SHN_UNDEF;
8259 addr->offset = 0;
8260
8261 if (sym_name != NULL)
8262 *sym_name = (bfd_vma) -1;
8263
8264 /* If necessary, update the section cache. */
8265 if (sec != arm_sec->sec)
8266 {
8267 Elf_Internal_Shdr *relsec;
8268
8269 arm_free_section (arm_sec);
8270
8271 arm_sec->sec = sec;
8272 arm_sec->data = get_data (NULL, aux->filedata, sec->sh_offset, 1,
8273 sec->sh_size, _("unwind data"));
8274 arm_sec->rela = NULL;
8275 arm_sec->nrelas = 0;
8276
8277 for (relsec = filedata->section_headers;
8278 relsec < filedata->section_headers + filedata->file_header.e_shnum;
8279 ++relsec)
8280 {
8281 if (relsec->sh_info >= filedata->file_header.e_shnum
8282 || filedata->section_headers + relsec->sh_info != sec
8283 /* PR 15745: Check the section type as well. */
8284 || (relsec->sh_type != SHT_REL
8285 && relsec->sh_type != SHT_RELA))
8286 continue;
8287
8288 arm_sec->rel_type = relsec->sh_type;
8289 if (relsec->sh_type == SHT_REL)
8290 {
8291 if (!slurp_rel_relocs (aux->filedata, relsec->sh_offset,
8292 relsec->sh_size,
8293 & arm_sec->rela, & arm_sec->nrelas))
8294 return FALSE;
8295 }
8296 else /* relsec->sh_type == SHT_RELA */
8297 {
8298 if (!slurp_rela_relocs (aux->filedata, relsec->sh_offset,
8299 relsec->sh_size,
8300 & arm_sec->rela, & arm_sec->nrelas))
8301 return FALSE;
8302 }
8303 break;
8304 }
8305
8306 arm_sec->next_rela = arm_sec->rela;
8307 }
8308
8309 /* If there is no unwind data we can do nothing. */
8310 if (arm_sec->data == NULL)
8311 return FALSE;
8312
8313 /* If the offset is invalid then fail. */
8314 if (/* PR 21343 *//* PR 18879 */
8315 sec->sh_size < 4
8316 || word_offset > (sec->sh_size - 4)
8317 || ((bfd_signed_vma) word_offset) < 0)
8318 return FALSE;
8319
8320 /* Get the word at the required offset. */
8321 word = byte_get (arm_sec->data + word_offset, 4);
8322
8323 /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128. */
8324 if (arm_sec->rela == NULL)
8325 {
8326 * wordp = word;
8327 return TRUE;
8328 }
8329
8330 /* Look through the relocs to find the one that applies to the provided offset. */
8331 wrapped = FALSE;
8332 for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
8333 {
8334 bfd_vma prelval, offset;
8335
8336 if (rp->r_offset > word_offset && !wrapped)
8337 {
8338 rp = arm_sec->rela;
8339 wrapped = TRUE;
8340 }
8341 if (rp->r_offset > word_offset)
8342 break;
8343
8344 if (rp->r_offset & 3)
8345 {
8346 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
8347 (unsigned long) rp->r_offset);
8348 continue;
8349 }
8350
8351 if (rp->r_offset < word_offset)
8352 continue;
8353
8354 /* PR 17531: file: 027-161405-0.004 */
8355 if (aux->symtab == NULL)
8356 continue;
8357
8358 if (arm_sec->rel_type == SHT_REL)
8359 {
8360 offset = word & 0x7fffffff;
8361 if (offset & 0x40000000)
8362 offset |= ~ (bfd_vma) 0x7fffffff;
8363 }
8364 else if (arm_sec->rel_type == SHT_RELA)
8365 offset = rp->r_addend;
8366 else
8367 {
8368 error (_("Unknown section relocation type %d encountered\n"),
8369 arm_sec->rel_type);
8370 break;
8371 }
8372
8373 /* PR 17531 file: 027-1241568-0.004. */
8374 if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
8375 {
8376 error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
8377 (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
8378 break;
8379 }
8380
8381 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
8382 offset += sym->st_value;
8383 prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
8384
8385 /* Check that we are processing the expected reloc type. */
8386 if (filedata->file_header.e_machine == EM_ARM)
8387 {
8388 relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
8389 if (relname == NULL)
8390 {
8391 warn (_("Skipping unknown ARM relocation type: %d\n"),
8392 (int) ELF32_R_TYPE (rp->r_info));
8393 continue;
8394 }
8395
8396 if (streq (relname, "R_ARM_NONE"))
8397 continue;
8398
8399 if (! streq (relname, "R_ARM_PREL31"))
8400 {
8401 warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
8402 continue;
8403 }
8404 }
8405 else if (filedata->file_header.e_machine == EM_TI_C6000)
8406 {
8407 relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
8408 if (relname == NULL)
8409 {
8410 warn (_("Skipping unknown C6000 relocation type: %d\n"),
8411 (int) ELF32_R_TYPE (rp->r_info));
8412 continue;
8413 }
8414
8415 if (streq (relname, "R_C6000_NONE"))
8416 continue;
8417
8418 if (! streq (relname, "R_C6000_PREL31"))
8419 {
8420 warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
8421 continue;
8422 }
8423
8424 prelval >>= 1;
8425 }
8426 else
8427 {
8428 /* This function currently only supports ARM and TI unwinders. */
8429 warn (_("Only TI and ARM unwinders are currently supported\n"));
8430 break;
8431 }
8432
8433 word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
8434 addr->section = sym->st_shndx;
8435 addr->offset = offset;
8436
8437 if (sym_name)
8438 * sym_name = sym->st_name;
8439 break;
8440 }
8441
8442 *wordp = word;
8443 arm_sec->next_rela = rp;
8444
8445 return TRUE;
8446 }
8447
8448 static const char *tic6x_unwind_regnames[16] =
8449 {
8450 "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
8451 "A14", "A13", "A12", "A11", "A10",
8452 "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
8453 };
8454
8455 static void
8456 decode_tic6x_unwind_regmask (unsigned int mask)
8457 {
8458 int i;
8459
8460 for (i = 12; mask; mask >>= 1, i--)
8461 {
8462 if (mask & 1)
8463 {
8464 fputs (tic6x_unwind_regnames[i], stdout);
8465 if (mask > 1)
8466 fputs (", ", stdout);
8467 }
8468 }
8469 }
8470
8471 #define ADVANCE \
8472 if (remaining == 0 && more_words) \
8473 { \
8474 data_offset += 4; \
8475 if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec, \
8476 data_offset, & word, & addr, NULL)) \
8477 return FALSE; \
8478 remaining = 4; \
8479 more_words--; \
8480 } \
8481
8482 #define GET_OP(OP) \
8483 ADVANCE; \
8484 if (remaining) \
8485 { \
8486 remaining--; \
8487 (OP) = word >> 24; \
8488 word <<= 8; \
8489 } \
8490 else \
8491 { \
8492 printf (_("[Truncated opcode]\n")); \
8493 return FALSE; \
8494 } \
8495 printf ("0x%02x ", OP)
8496
8497 static bfd_boolean
8498 decode_arm_unwind_bytecode (Filedata * filedata,
8499 struct arm_unw_aux_info * aux,
8500 unsigned int word,
8501 unsigned int remaining,
8502 unsigned int more_words,
8503 bfd_vma data_offset,
8504 Elf_Internal_Shdr * data_sec,
8505 struct arm_section * data_arm_sec)
8506 {
8507 struct absaddr addr;
8508 bfd_boolean res = TRUE;
8509
8510 /* Decode the unwinding instructions. */
8511 while (1)
8512 {
8513 unsigned int op, op2;
8514
8515 ADVANCE;
8516 if (remaining == 0)
8517 break;
8518 remaining--;
8519 op = word >> 24;
8520 word <<= 8;
8521
8522 printf (" 0x%02x ", op);
8523
8524 if ((op & 0xc0) == 0x00)
8525 {
8526 int offset = ((op & 0x3f) << 2) + 4;
8527
8528 printf (" vsp = vsp + %d", offset);
8529 }
8530 else if ((op & 0xc0) == 0x40)
8531 {
8532 int offset = ((op & 0x3f) << 2) + 4;
8533
8534 printf (" vsp = vsp - %d", offset);
8535 }
8536 else if ((op & 0xf0) == 0x80)
8537 {
8538 GET_OP (op2);
8539 if (op == 0x80 && op2 == 0)
8540 printf (_("Refuse to unwind"));
8541 else
8542 {
8543 unsigned int mask = ((op & 0x0f) << 8) | op2;
8544 bfd_boolean first = TRUE;
8545 int i;
8546
8547 printf ("pop {");
8548 for (i = 0; i < 12; i++)
8549 if (mask & (1 << i))
8550 {
8551 if (first)
8552 first = FALSE;
8553 else
8554 printf (", ");
8555 printf ("r%d", 4 + i);
8556 }
8557 printf ("}");
8558 }
8559 }
8560 else if ((op & 0xf0) == 0x90)
8561 {
8562 if (op == 0x9d || op == 0x9f)
8563 printf (_(" [Reserved]"));
8564 else
8565 printf (" vsp = r%d", op & 0x0f);
8566 }
8567 else if ((op & 0xf0) == 0xa0)
8568 {
8569 int end = 4 + (op & 0x07);
8570 bfd_boolean first = TRUE;
8571 int i;
8572
8573 printf (" pop {");
8574 for (i = 4; i <= end; i++)
8575 {
8576 if (first)
8577 first = FALSE;
8578 else
8579 printf (", ");
8580 printf ("r%d", i);
8581 }
8582 if (op & 0x08)
8583 {
8584 if (!first)
8585 printf (", ");
8586 printf ("r14");
8587 }
8588 printf ("}");
8589 }
8590 else if (op == 0xb0)
8591 printf (_(" finish"));
8592 else if (op == 0xb1)
8593 {
8594 GET_OP (op2);
8595 if (op2 == 0 || (op2 & 0xf0) != 0)
8596 printf (_("[Spare]"));
8597 else
8598 {
8599 unsigned int mask = op2 & 0x0f;
8600 bfd_boolean first = TRUE;
8601 int i;
8602
8603 printf ("pop {");
8604 for (i = 0; i < 12; i++)
8605 if (mask & (1 << i))
8606 {
8607 if (first)
8608 first = FALSE;
8609 else
8610 printf (", ");
8611 printf ("r%d", i);
8612 }
8613 printf ("}");
8614 }
8615 }
8616 else if (op == 0xb2)
8617 {
8618 unsigned char buf[9];
8619 unsigned int i, len;
8620 unsigned long offset;
8621
8622 for (i = 0; i < sizeof (buf); i++)
8623 {
8624 GET_OP (buf[i]);
8625 if ((buf[i] & 0x80) == 0)
8626 break;
8627 }
8628 if (i == sizeof (buf))
8629 {
8630 error (_("corrupt change to vsp"));
8631 res = FALSE;
8632 }
8633 else
8634 {
8635 offset = read_uleb128 (buf, &len, buf + i + 1);
8636 assert (len == i + 1);
8637 offset = offset * 4 + 0x204;
8638 printf ("vsp = vsp + %ld", offset);
8639 }
8640 }
8641 else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
8642 {
8643 unsigned int first, last;
8644
8645 GET_OP (op2);
8646 first = op2 >> 4;
8647 last = op2 & 0x0f;
8648 if (op == 0xc8)
8649 first = first + 16;
8650 printf ("pop {D%d", first);
8651 if (last)
8652 printf ("-D%d", first + last);
8653 printf ("}");
8654 }
8655 else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
8656 {
8657 unsigned int count = op & 0x07;
8658
8659 printf ("pop {D8");
8660 if (count)
8661 printf ("-D%d", 8 + count);
8662 printf ("}");
8663 }
8664 else if (op >= 0xc0 && op <= 0xc5)
8665 {
8666 unsigned int count = op & 0x07;
8667
8668 printf (" pop {wR10");
8669 if (count)
8670 printf ("-wR%d", 10 + count);
8671 printf ("}");
8672 }
8673 else if (op == 0xc6)
8674 {
8675 unsigned int first, last;
8676
8677 GET_OP (op2);
8678 first = op2 >> 4;
8679 last = op2 & 0x0f;
8680 printf ("pop {wR%d", first);
8681 if (last)
8682 printf ("-wR%d", first + last);
8683 printf ("}");
8684 }
8685 else if (op == 0xc7)
8686 {
8687 GET_OP (op2);
8688 if (op2 == 0 || (op2 & 0xf0) != 0)
8689 printf (_("[Spare]"));
8690 else
8691 {
8692 unsigned int mask = op2 & 0x0f;
8693 bfd_boolean first = TRUE;
8694 int i;
8695
8696 printf ("pop {");
8697 for (i = 0; i < 4; i++)
8698 if (mask & (1 << i))
8699 {
8700 if (first)
8701 first = FALSE;
8702 else
8703 printf (", ");
8704 printf ("wCGR%d", i);
8705 }
8706 printf ("}");
8707 }
8708 }
8709 else
8710 {
8711 printf (_(" [unsupported opcode]"));
8712 res = FALSE;
8713 }
8714
8715 printf ("\n");
8716 }
8717
8718 return res;
8719 }
8720
8721 static bfd_boolean
8722 decode_tic6x_unwind_bytecode (Filedata * filedata,
8723 struct arm_unw_aux_info * aux,
8724 unsigned int word,
8725 unsigned int remaining,
8726 unsigned int more_words,
8727 bfd_vma data_offset,
8728 Elf_Internal_Shdr * data_sec,
8729 struct arm_section * data_arm_sec)
8730 {
8731 struct absaddr addr;
8732
8733 /* Decode the unwinding instructions. */
8734 while (1)
8735 {
8736 unsigned int op, op2;
8737
8738 ADVANCE;
8739 if (remaining == 0)
8740 break;
8741 remaining--;
8742 op = word >> 24;
8743 word <<= 8;
8744
8745 printf (" 0x%02x ", op);
8746
8747 if ((op & 0xc0) == 0x00)
8748 {
8749 int offset = ((op & 0x3f) << 3) + 8;
8750 printf (" sp = sp + %d", offset);
8751 }
8752 else if ((op & 0xc0) == 0x80)
8753 {
8754 GET_OP (op2);
8755 if (op == 0x80 && op2 == 0)
8756 printf (_("Refuse to unwind"));
8757 else
8758 {
8759 unsigned int mask = ((op & 0x1f) << 8) | op2;
8760 if (op & 0x20)
8761 printf ("pop compact {");
8762 else
8763 printf ("pop {");
8764
8765 decode_tic6x_unwind_regmask (mask);
8766 printf("}");
8767 }
8768 }
8769 else if ((op & 0xf0) == 0xc0)
8770 {
8771 unsigned int reg;
8772 unsigned int nregs;
8773 unsigned int i;
8774 const char *name;
8775 struct
8776 {
8777 unsigned int offset;
8778 unsigned int reg;
8779 } regpos[16];
8780
8781 /* Scan entire instruction first so that GET_OP output is not
8782 interleaved with disassembly. */
8783 nregs = 0;
8784 for (i = 0; nregs < (op & 0xf); i++)
8785 {
8786 GET_OP (op2);
8787 reg = op2 >> 4;
8788 if (reg != 0xf)
8789 {
8790 regpos[nregs].offset = i * 2;
8791 regpos[nregs].reg = reg;
8792 nregs++;
8793 }
8794
8795 reg = op2 & 0xf;
8796 if (reg != 0xf)
8797 {
8798 regpos[nregs].offset = i * 2 + 1;
8799 regpos[nregs].reg = reg;
8800 nregs++;
8801 }
8802 }
8803
8804 printf (_("pop frame {"));
8805 reg = nregs - 1;
8806 for (i = i * 2; i > 0; i--)
8807 {
8808 if (regpos[reg].offset == i - 1)
8809 {
8810 name = tic6x_unwind_regnames[regpos[reg].reg];
8811 if (reg > 0)
8812 reg--;
8813 }
8814 else
8815 name = _("[pad]");
8816
8817 fputs (name, stdout);
8818 if (i > 1)
8819 printf (", ");
8820 }
8821
8822 printf ("}");
8823 }
8824 else if (op == 0xd0)
8825 printf (" MOV FP, SP");
8826 else if (op == 0xd1)
8827 printf (" __c6xabi_pop_rts");
8828 else if (op == 0xd2)
8829 {
8830 unsigned char buf[9];
8831 unsigned int i, len;
8832 unsigned long offset;
8833
8834 for (i = 0; i < sizeof (buf); i++)
8835 {
8836 GET_OP (buf[i]);
8837 if ((buf[i] & 0x80) == 0)
8838 break;
8839 }
8840 /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2. */
8841 if (i == sizeof (buf))
8842 {
8843 warn (_("Corrupt stack pointer adjustment detected\n"));
8844 return FALSE;
8845 }
8846
8847 offset = read_uleb128 (buf, &len, buf + i + 1);
8848 assert (len == i + 1);
8849 offset = offset * 8 + 0x408;
8850 printf (_("sp = sp + %ld"), offset);
8851 }
8852 else if ((op & 0xf0) == 0xe0)
8853 {
8854 if ((op & 0x0f) == 7)
8855 printf (" RETURN");
8856 else
8857 printf (" MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
8858 }
8859 else
8860 {
8861 printf (_(" [unsupported opcode]"));
8862 }
8863 putchar ('\n');
8864 }
8865
8866 return TRUE;
8867 }
8868
8869 static bfd_vma
8870 arm_expand_prel31 (Filedata * filedata, bfd_vma word, bfd_vma where)
8871 {
8872 bfd_vma offset;
8873
8874 offset = word & 0x7fffffff;
8875 if (offset & 0x40000000)
8876 offset |= ~ (bfd_vma) 0x7fffffff;
8877
8878 if (filedata->file_header.e_machine == EM_TI_C6000)
8879 offset <<= 1;
8880
8881 return offset + where;
8882 }
8883
8884 static bfd_boolean
8885 decode_arm_unwind (Filedata * filedata,
8886 struct arm_unw_aux_info * aux,
8887 unsigned int word,
8888 unsigned int remaining,
8889 bfd_vma data_offset,
8890 Elf_Internal_Shdr * data_sec,
8891 struct arm_section * data_arm_sec)
8892 {
8893 int per_index;
8894 unsigned int more_words = 0;
8895 struct absaddr addr;
8896 bfd_vma sym_name = (bfd_vma) -1;
8897 bfd_boolean res = TRUE;
8898
8899 if (remaining == 0)
8900 {
8901 /* Fetch the first word.
8902 Note - when decoding an object file the address extracted
8903 here will always be 0. So we also pass in the sym_name
8904 parameter so that we can find the symbol associated with
8905 the personality routine. */
8906 if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec, data_offset,
8907 & word, & addr, & sym_name))
8908 return FALSE;
8909
8910 remaining = 4;
8911 }
8912
8913 if ((word & 0x80000000) == 0)
8914 {
8915 /* Expand prel31 for personality routine. */
8916 bfd_vma fn;
8917 const char *procname;
8918
8919 fn = arm_expand_prel31 (filedata, word, data_sec->sh_addr + data_offset);
8920 printf (_(" Personality routine: "));
8921 if (fn == 0
8922 && addr.section == SHN_UNDEF && addr.offset == 0
8923 && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
8924 {
8925 procname = aux->strtab + sym_name;
8926 print_vma (fn, PREFIX_HEX);
8927 if (procname)
8928 {
8929 fputs (" <", stdout);
8930 fputs (procname, stdout);
8931 fputc ('>', stdout);
8932 }
8933 }
8934 else
8935 procname = arm_print_vma_and_name (filedata, aux, fn, addr);
8936 fputc ('\n', stdout);
8937
8938 /* The GCC personality routines use the standard compact
8939 encoding, starting with one byte giving the number of
8940 words. */
8941 if (procname != NULL
8942 && (const_strneq (procname, "__gcc_personality_v0")
8943 || const_strneq (procname, "__gxx_personality_v0")
8944 || const_strneq (procname, "__gcj_personality_v0")
8945 || const_strneq (procname, "__gnu_objc_personality_v0")))
8946 {
8947 remaining = 0;
8948 more_words = 1;
8949 ADVANCE;
8950 if (!remaining)
8951 {
8952 printf (_(" [Truncated data]\n"));
8953 return FALSE;
8954 }
8955 more_words = word >> 24;
8956 word <<= 8;
8957 remaining--;
8958 per_index = -1;
8959 }
8960 else
8961 return TRUE;
8962 }
8963 else
8964 {
8965 /* ARM EHABI Section 6.3:
8966
8967 An exception-handling table entry for the compact model looks like:
8968
8969 31 30-28 27-24 23-0
8970 -- ----- ----- ----
8971 1 0 index Data for personalityRoutine[index] */
8972
8973 if (filedata->file_header.e_machine == EM_ARM
8974 && (word & 0x70000000))
8975 {
8976 warn (_("Corrupt ARM compact model table entry: %x \n"), word);
8977 res = FALSE;
8978 }
8979
8980 per_index = (word >> 24) & 0x7f;
8981 printf (_(" Compact model index: %d\n"), per_index);
8982 if (per_index == 0)
8983 {
8984 more_words = 0;
8985 word <<= 8;
8986 remaining--;
8987 }
8988 else if (per_index < 3)
8989 {
8990 more_words = (word >> 16) & 0xff;
8991 word <<= 16;
8992 remaining -= 2;
8993 }
8994 }
8995
8996 switch (filedata->file_header.e_machine)
8997 {
8998 case EM_ARM:
8999 if (per_index < 3)
9000 {
9001 if (! decode_arm_unwind_bytecode (filedata, aux, word, remaining, more_words,
9002 data_offset, data_sec, data_arm_sec))
9003 res = FALSE;
9004 }
9005 else
9006 {
9007 warn (_("Unknown ARM compact model index encountered\n"));
9008 printf (_(" [reserved]\n"));
9009 res = FALSE;
9010 }
9011 break;
9012
9013 case EM_TI_C6000:
9014 if (per_index < 3)
9015 {
9016 if (! decode_tic6x_unwind_bytecode (filedata, aux, word, remaining, more_words,
9017 data_offset, data_sec, data_arm_sec))
9018 res = FALSE;
9019 }
9020 else if (per_index < 5)
9021 {
9022 if (((word >> 17) & 0x7f) == 0x7f)
9023 printf (_(" Restore stack from frame pointer\n"));
9024 else
9025 printf (_(" Stack increment %d\n"), (word >> 14) & 0x1fc);
9026 printf (_(" Registers restored: "));
9027 if (per_index == 4)
9028 printf (" (compact) ");
9029 decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
9030 putchar ('\n');
9031 printf (_(" Return register: %s\n"),
9032 tic6x_unwind_regnames[word & 0xf]);
9033 }
9034 else
9035 printf (_(" [reserved (%d)]\n"), per_index);
9036 break;
9037
9038 default:
9039 error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
9040 filedata->file_header.e_machine);
9041 res = FALSE;
9042 }
9043
9044 /* Decode the descriptors. Not implemented. */
9045
9046 return res;
9047 }
9048
9049 static bfd_boolean
9050 dump_arm_unwind (Filedata * filedata,
9051 struct arm_unw_aux_info * aux,
9052 Elf_Internal_Shdr * exidx_sec)
9053 {
9054 struct arm_section exidx_arm_sec, extab_arm_sec;
9055 unsigned int i, exidx_len;
9056 unsigned long j, nfuns;
9057 bfd_boolean res = TRUE;
9058
9059 memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
9060 memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
9061 exidx_len = exidx_sec->sh_size / 8;
9062
9063 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
9064 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
9065 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
9066 aux->funtab[nfuns++] = aux->symtab[j];
9067 aux->nfuns = nfuns;
9068 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
9069
9070 for (i = 0; i < exidx_len; i++)
9071 {
9072 unsigned int exidx_fn, exidx_entry;
9073 struct absaddr fn_addr, entry_addr;
9074 bfd_vma fn;
9075
9076 fputc ('\n', stdout);
9077
9078 if (! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
9079 8 * i, & exidx_fn, & fn_addr, NULL)
9080 || ! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
9081 8 * i + 4, & exidx_entry, & entry_addr, NULL))
9082 {
9083 free (aux->funtab);
9084 arm_free_section (& exidx_arm_sec);
9085 arm_free_section (& extab_arm_sec);
9086 return FALSE;
9087 }
9088
9089 /* ARM EHABI, Section 5:
9090 An index table entry consists of 2 words.
9091 The first word contains a prel31 offset to the start of a function, with bit 31 clear. */
9092 if (exidx_fn & 0x80000000)
9093 {
9094 warn (_("corrupt index table entry: %x\n"), exidx_fn);
9095 res = FALSE;
9096 }
9097
9098 fn = arm_expand_prel31 (filedata, exidx_fn, exidx_sec->sh_addr + 8 * i);
9099
9100 arm_print_vma_and_name (filedata, aux, fn, fn_addr);
9101 fputs (": ", stdout);
9102
9103 if (exidx_entry == 1)
9104 {
9105 print_vma (exidx_entry, PREFIX_HEX);
9106 fputs (" [cantunwind]\n", stdout);
9107 }
9108 else if (exidx_entry & 0x80000000)
9109 {
9110 print_vma (exidx_entry, PREFIX_HEX);
9111 fputc ('\n', stdout);
9112 decode_arm_unwind (filedata, aux, exidx_entry, 4, 0, NULL, NULL);
9113 }
9114 else
9115 {
9116 bfd_vma table, table_offset = 0;
9117 Elf_Internal_Shdr *table_sec;
9118
9119 fputs ("@", stdout);
9120 table = arm_expand_prel31 (filedata, exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
9121 print_vma (table, PREFIX_HEX);
9122 printf ("\n");
9123
9124 /* Locate the matching .ARM.extab. */
9125 if (entry_addr.section != SHN_UNDEF
9126 && entry_addr.section < filedata->file_header.e_shnum)
9127 {
9128 table_sec = filedata->section_headers + entry_addr.section;
9129 table_offset = entry_addr.offset;
9130 /* PR 18879 */
9131 if (table_offset > table_sec->sh_size
9132 || ((bfd_signed_vma) table_offset) < 0)
9133 {
9134 warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
9135 (unsigned long) table_offset,
9136 printable_section_name (filedata, table_sec));
9137 res = FALSE;
9138 continue;
9139 }
9140 }
9141 else
9142 {
9143 table_sec = find_section_by_address (filedata, table);
9144 if (table_sec != NULL)
9145 table_offset = table - table_sec->sh_addr;
9146 }
9147
9148 if (table_sec == NULL)
9149 {
9150 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
9151 (unsigned long) table);
9152 res = FALSE;
9153 continue;
9154 }
9155
9156 if (! decode_arm_unwind (filedata, aux, 0, 0, table_offset, table_sec,
9157 &extab_arm_sec))
9158 res = FALSE;
9159 }
9160 }
9161
9162 printf ("\n");
9163
9164 free (aux->funtab);
9165 arm_free_section (&exidx_arm_sec);
9166 arm_free_section (&extab_arm_sec);
9167
9168 return res;
9169 }
9170
9171 /* Used for both ARM and C6X unwinding tables. */
9172
9173 static bfd_boolean
9174 arm_process_unwind (Filedata * filedata)
9175 {
9176 struct arm_unw_aux_info aux;
9177 Elf_Internal_Shdr *unwsec = NULL;
9178 Elf_Internal_Shdr *strsec;
9179 Elf_Internal_Shdr *sec;
9180 unsigned long i;
9181 unsigned int sec_type;
9182 bfd_boolean res = TRUE;
9183
9184 switch (filedata->file_header.e_machine)
9185 {
9186 case EM_ARM:
9187 sec_type = SHT_ARM_EXIDX;
9188 break;
9189
9190 case EM_TI_C6000:
9191 sec_type = SHT_C6000_UNWIND;
9192 break;
9193
9194 default:
9195 error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
9196 filedata->file_header.e_machine);
9197 return FALSE;
9198 }
9199
9200 if (filedata->string_table == NULL)
9201 return FALSE;
9202
9203 memset (& aux, 0, sizeof (aux));
9204 aux.filedata = filedata;
9205
9206 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
9207 {
9208 if (sec->sh_type == SHT_SYMTAB && sec->sh_link < filedata->file_header.e_shnum)
9209 {
9210 aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
9211
9212 strsec = filedata->section_headers + sec->sh_link;
9213
9214 /* PR binutils/17531 file: 011-12666-0.004. */
9215 if (aux.strtab != NULL)
9216 {
9217 error (_("Multiple string tables found in file.\n"));
9218 free (aux.strtab);
9219 res = FALSE;
9220 }
9221 aux.strtab = get_data (NULL, filedata, strsec->sh_offset,
9222 1, strsec->sh_size, _("string table"));
9223 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
9224 }
9225 else if (sec->sh_type == sec_type)
9226 unwsec = sec;
9227 }
9228
9229 if (unwsec == NULL)
9230 printf (_("\nThere are no unwind sections in this file.\n"));
9231 else
9232 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
9233 {
9234 if (sec->sh_type == sec_type)
9235 {
9236 unsigned long num_unwind = sec->sh_size / (2 * eh_addr_size);
9237 printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
9238 "contains %lu entry:\n",
9239 "\nUnwind section '%s' at offset 0x%lx "
9240 "contains %lu entries:\n",
9241 num_unwind),
9242 printable_section_name (filedata, sec),
9243 (unsigned long) sec->sh_offset,
9244 num_unwind);
9245
9246 if (! dump_arm_unwind (filedata, &aux, sec))
9247 res = FALSE;
9248 }
9249 }
9250
9251 if (aux.symtab)
9252 free (aux.symtab);
9253 if (aux.strtab)
9254 free ((char *) aux.strtab);
9255
9256 return res;
9257 }
9258
9259 static bfd_boolean
9260 process_unwind (Filedata * filedata)
9261 {
9262 struct unwind_handler
9263 {
9264 unsigned int machtype;
9265 bfd_boolean (* handler)(Filedata *);
9266 } handlers[] =
9267 {
9268 { EM_ARM, arm_process_unwind },
9269 { EM_IA_64, ia64_process_unwind },
9270 { EM_PARISC, hppa_process_unwind },
9271 { EM_TI_C6000, arm_process_unwind },
9272 { 0, NULL }
9273 };
9274 int i;
9275
9276 if (!do_unwind)
9277 return TRUE;
9278
9279 for (i = 0; handlers[i].handler != NULL; i++)
9280 if (filedata->file_header.e_machine == handlers[i].machtype)
9281 return handlers[i].handler (filedata);
9282
9283 printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
9284 get_machine_name (filedata->file_header.e_machine));
9285 return TRUE;
9286 }
9287
9288 static void
9289 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
9290 {
9291 switch (entry->d_tag)
9292 {
9293 case DT_MIPS_FLAGS:
9294 if (entry->d_un.d_val == 0)
9295 printf (_("NONE"));
9296 else
9297 {
9298 static const char * opts[] =
9299 {
9300 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
9301 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
9302 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
9303 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
9304 "RLD_ORDER_SAFE"
9305 };
9306 unsigned int cnt;
9307 bfd_boolean first = TRUE;
9308
9309 for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
9310 if (entry->d_un.d_val & (1 << cnt))
9311 {
9312 printf ("%s%s", first ? "" : " ", opts[cnt]);
9313 first = FALSE;
9314 }
9315 }
9316 break;
9317
9318 case DT_MIPS_IVERSION:
9319 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9320 printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
9321 else
9322 {
9323 char buf[40];
9324 sprintf_vma (buf, entry->d_un.d_ptr);
9325 /* Note: coded this way so that there is a single string for translation. */
9326 printf (_("<corrupt: %s>"), buf);
9327 }
9328 break;
9329
9330 case DT_MIPS_TIME_STAMP:
9331 {
9332 char timebuf[128];
9333 struct tm * tmp;
9334 time_t atime = entry->d_un.d_val;
9335
9336 tmp = gmtime (&atime);
9337 /* PR 17531: file: 6accc532. */
9338 if (tmp == NULL)
9339 snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
9340 else
9341 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
9342 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9343 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9344 printf (_("Time Stamp: %s"), timebuf);
9345 }
9346 break;
9347
9348 case DT_MIPS_RLD_VERSION:
9349 case DT_MIPS_LOCAL_GOTNO:
9350 case DT_MIPS_CONFLICTNO:
9351 case DT_MIPS_LIBLISTNO:
9352 case DT_MIPS_SYMTABNO:
9353 case DT_MIPS_UNREFEXTNO:
9354 case DT_MIPS_HIPAGENO:
9355 case DT_MIPS_DELTA_CLASS_NO:
9356 case DT_MIPS_DELTA_INSTANCE_NO:
9357 case DT_MIPS_DELTA_RELOC_NO:
9358 case DT_MIPS_DELTA_SYM_NO:
9359 case DT_MIPS_DELTA_CLASSSYM_NO:
9360 case DT_MIPS_COMPACT_SIZE:
9361 print_vma (entry->d_un.d_val, DEC);
9362 break;
9363
9364 default:
9365 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9366 }
9367 putchar ('\n');
9368 }
9369
9370 static void
9371 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
9372 {
9373 switch (entry->d_tag)
9374 {
9375 case DT_HP_DLD_FLAGS:
9376 {
9377 static struct
9378 {
9379 long int bit;
9380 const char * str;
9381 }
9382 flags[] =
9383 {
9384 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
9385 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
9386 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
9387 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
9388 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
9389 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
9390 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
9391 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
9392 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
9393 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
9394 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
9395 { DT_HP_GST, "HP_GST" },
9396 { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
9397 { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
9398 { DT_HP_NODELETE, "HP_NODELETE" },
9399 { DT_HP_GROUP, "HP_GROUP" },
9400 { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
9401 };
9402 bfd_boolean first = TRUE;
9403 size_t cnt;
9404 bfd_vma val = entry->d_un.d_val;
9405
9406 for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
9407 if (val & flags[cnt].bit)
9408 {
9409 if (! first)
9410 putchar (' ');
9411 fputs (flags[cnt].str, stdout);
9412 first = FALSE;
9413 val ^= flags[cnt].bit;
9414 }
9415
9416 if (val != 0 || first)
9417 {
9418 if (! first)
9419 putchar (' ');
9420 print_vma (val, HEX);
9421 }
9422 }
9423 break;
9424
9425 default:
9426 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9427 break;
9428 }
9429 putchar ('\n');
9430 }
9431
9432 #ifdef BFD64
9433
9434 /* VMS vs Unix time offset and factor. */
9435
9436 #define VMS_EPOCH_OFFSET 35067168000000000LL
9437 #define VMS_GRANULARITY_FACTOR 10000000
9438
9439 /* Display a VMS time in a human readable format. */
9440
9441 static void
9442 print_vms_time (bfd_int64_t vmstime)
9443 {
9444 struct tm *tm;
9445 time_t unxtime;
9446
9447 unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
9448 tm = gmtime (&unxtime);
9449 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
9450 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
9451 tm->tm_hour, tm->tm_min, tm->tm_sec);
9452 }
9453 #endif /* BFD64 */
9454
9455 static void
9456 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
9457 {
9458 switch (entry->d_tag)
9459 {
9460 case DT_IA_64_PLT_RESERVE:
9461 /* First 3 slots reserved. */
9462 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9463 printf (" -- ");
9464 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
9465 break;
9466
9467 case DT_IA_64_VMS_LINKTIME:
9468 #ifdef BFD64
9469 print_vms_time (entry->d_un.d_val);
9470 #endif
9471 break;
9472
9473 case DT_IA_64_VMS_LNKFLAGS:
9474 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9475 if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
9476 printf (" CALL_DEBUG");
9477 if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
9478 printf (" NOP0BUFS");
9479 if (entry->d_un.d_val & VMS_LF_P0IMAGE)
9480 printf (" P0IMAGE");
9481 if (entry->d_un.d_val & VMS_LF_MKTHREADS)
9482 printf (" MKTHREADS");
9483 if (entry->d_un.d_val & VMS_LF_UPCALLS)
9484 printf (" UPCALLS");
9485 if (entry->d_un.d_val & VMS_LF_IMGSTA)
9486 printf (" IMGSTA");
9487 if (entry->d_un.d_val & VMS_LF_INITIALIZE)
9488 printf (" INITIALIZE");
9489 if (entry->d_un.d_val & VMS_LF_MAIN)
9490 printf (" MAIN");
9491 if (entry->d_un.d_val & VMS_LF_EXE_INIT)
9492 printf (" EXE_INIT");
9493 if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
9494 printf (" TBK_IN_IMG");
9495 if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
9496 printf (" DBG_IN_IMG");
9497 if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
9498 printf (" TBK_IN_DSF");
9499 if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
9500 printf (" DBG_IN_DSF");
9501 if (entry->d_un.d_val & VMS_LF_SIGNATURES)
9502 printf (" SIGNATURES");
9503 if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
9504 printf (" REL_SEG_OFF");
9505 break;
9506
9507 default:
9508 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9509 break;
9510 }
9511 putchar ('\n');
9512 }
9513
9514 static bfd_boolean
9515 get_32bit_dynamic_section (Filedata * filedata)
9516 {
9517 Elf32_External_Dyn * edyn;
9518 Elf32_External_Dyn * ext;
9519 Elf_Internal_Dyn * entry;
9520
9521 edyn = (Elf32_External_Dyn *) get_data (NULL, filedata, dynamic_addr, 1,
9522 dynamic_size, _("dynamic section"));
9523 if (!edyn)
9524 return FALSE;
9525
9526 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9527 might not have the luxury of section headers. Look for the DT_NULL
9528 terminator to determine the number of entries. */
9529 for (ext = edyn, dynamic_nent = 0;
9530 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9531 ext++)
9532 {
9533 dynamic_nent++;
9534 if (BYTE_GET (ext->d_tag) == DT_NULL)
9535 break;
9536 }
9537
9538 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9539 sizeof (* entry));
9540 if (dynamic_section == NULL)
9541 {
9542 error (_("Out of memory allocating space for %lu dynamic entries\n"),
9543 (unsigned long) dynamic_nent);
9544 free (edyn);
9545 return FALSE;
9546 }
9547
9548 for (ext = edyn, entry = dynamic_section;
9549 entry < dynamic_section + dynamic_nent;
9550 ext++, entry++)
9551 {
9552 entry->d_tag = BYTE_GET (ext->d_tag);
9553 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9554 }
9555
9556 free (edyn);
9557
9558 return TRUE;
9559 }
9560
9561 static bfd_boolean
9562 get_64bit_dynamic_section (Filedata * filedata)
9563 {
9564 Elf64_External_Dyn * edyn;
9565 Elf64_External_Dyn * ext;
9566 Elf_Internal_Dyn * entry;
9567
9568 /* Read in the data. */
9569 edyn = (Elf64_External_Dyn *) get_data (NULL, filedata, dynamic_addr, 1,
9570 dynamic_size, _("dynamic section"));
9571 if (!edyn)
9572 return FALSE;
9573
9574 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9575 might not have the luxury of section headers. Look for the DT_NULL
9576 terminator to determine the number of entries. */
9577 for (ext = edyn, dynamic_nent = 0;
9578 /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer. */
9579 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9580 ext++)
9581 {
9582 dynamic_nent++;
9583 if (BYTE_GET (ext->d_tag) == DT_NULL)
9584 break;
9585 }
9586
9587 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9588 sizeof (* entry));
9589 if (dynamic_section == NULL)
9590 {
9591 error (_("Out of memory allocating space for %lu dynamic entries\n"),
9592 (unsigned long) dynamic_nent);
9593 free (edyn);
9594 return FALSE;
9595 }
9596
9597 /* Convert from external to internal formats. */
9598 for (ext = edyn, entry = dynamic_section;
9599 entry < dynamic_section + dynamic_nent;
9600 ext++, entry++)
9601 {
9602 entry->d_tag = BYTE_GET (ext->d_tag);
9603 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9604 }
9605
9606 free (edyn);
9607
9608 return TRUE;
9609 }
9610
9611 static void
9612 print_dynamic_flags (bfd_vma flags)
9613 {
9614 bfd_boolean first = TRUE;
9615
9616 while (flags)
9617 {
9618 bfd_vma flag;
9619
9620 flag = flags & - flags;
9621 flags &= ~ flag;
9622
9623 if (first)
9624 first = FALSE;
9625 else
9626 putc (' ', stdout);
9627
9628 switch (flag)
9629 {
9630 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
9631 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
9632 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
9633 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
9634 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
9635 default: fputs (_("unknown"), stdout); break;
9636 }
9637 }
9638 puts ("");
9639 }
9640
9641 /* Parse and display the contents of the dynamic section. */
9642
9643 static bfd_boolean
9644 process_dynamic_section (Filedata * filedata)
9645 {
9646 Elf_Internal_Dyn * entry;
9647
9648 if (dynamic_size == 0)
9649 {
9650 if (do_dynamic)
9651 printf (_("\nThere is no dynamic section in this file.\n"));
9652
9653 return TRUE;
9654 }
9655
9656 if (is_32bit_elf)
9657 {
9658 if (! get_32bit_dynamic_section (filedata))
9659 return FALSE;
9660 }
9661 else
9662 {
9663 if (! get_64bit_dynamic_section (filedata))
9664 return FALSE;
9665 }
9666
9667 /* Find the appropriate symbol table. */
9668 if (dynamic_symbols == NULL)
9669 {
9670 for (entry = dynamic_section;
9671 entry < dynamic_section + dynamic_nent;
9672 ++entry)
9673 {
9674 Elf_Internal_Shdr section;
9675
9676 if (entry->d_tag != DT_SYMTAB)
9677 continue;
9678
9679 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
9680
9681 /* Since we do not know how big the symbol table is,
9682 we default to reading in the entire file (!) and
9683 processing that. This is overkill, I know, but it
9684 should work. */
9685 section.sh_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
9686 if ((bfd_size_type) section.sh_offset > filedata->file_size)
9687 {
9688 /* See PR 21379 for a reproducer. */
9689 error (_("Invalid DT_SYMTAB entry: %lx"), (long) section.sh_offset);
9690 return FALSE;
9691 }
9692
9693 if (archive_file_offset != 0)
9694 section.sh_size = archive_file_size - section.sh_offset;
9695 else
9696 section.sh_size = filedata->file_size - section.sh_offset;
9697
9698 if (is_32bit_elf)
9699 section.sh_entsize = sizeof (Elf32_External_Sym);
9700 else
9701 section.sh_entsize = sizeof (Elf64_External_Sym);
9702 section.sh_name = filedata->string_table_length;
9703
9704 if (dynamic_symbols != NULL)
9705 {
9706 error (_("Multiple dynamic symbol table sections found\n"));
9707 free (dynamic_symbols);
9708 }
9709 dynamic_symbols = GET_ELF_SYMBOLS (filedata, &section, & num_dynamic_syms);
9710 if (num_dynamic_syms < 1)
9711 {
9712 error (_("Unable to determine the number of symbols to load\n"));
9713 continue;
9714 }
9715 }
9716 }
9717
9718 /* Similarly find a string table. */
9719 if (dynamic_strings == NULL)
9720 {
9721 for (entry = dynamic_section;
9722 entry < dynamic_section + dynamic_nent;
9723 ++entry)
9724 {
9725 unsigned long offset;
9726 long str_tab_len;
9727
9728 if (entry->d_tag != DT_STRTAB)
9729 continue;
9730
9731 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
9732
9733 /* Since we do not know how big the string table is,
9734 we default to reading in the entire file (!) and
9735 processing that. This is overkill, I know, but it
9736 should work. */
9737
9738 offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
9739
9740 if (archive_file_offset != 0)
9741 str_tab_len = archive_file_size - offset;
9742 else
9743 str_tab_len = filedata->file_size - offset;
9744
9745 if (str_tab_len < 1)
9746 {
9747 error
9748 (_("Unable to determine the length of the dynamic string table\n"));
9749 continue;
9750 }
9751
9752 if (dynamic_strings != NULL)
9753 {
9754 error (_("Multiple dynamic string tables found\n"));
9755 free (dynamic_strings);
9756 }
9757
9758 dynamic_strings = (char *) get_data (NULL, filedata, offset, 1,
9759 str_tab_len,
9760 _("dynamic string table"));
9761 dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
9762 }
9763 }
9764
9765 /* And find the syminfo section if available. */
9766 if (dynamic_syminfo == NULL)
9767 {
9768 unsigned long syminsz = 0;
9769
9770 for (entry = dynamic_section;
9771 entry < dynamic_section + dynamic_nent;
9772 ++entry)
9773 {
9774 if (entry->d_tag == DT_SYMINENT)
9775 {
9776 /* Note: these braces are necessary to avoid a syntax
9777 error from the SunOS4 C compiler. */
9778 /* PR binutils/17531: A corrupt file can trigger this test.
9779 So do not use an assert, instead generate an error message. */
9780 if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
9781 error (_("Bad value (%d) for SYMINENT entry\n"),
9782 (int) entry->d_un.d_val);
9783 }
9784 else if (entry->d_tag == DT_SYMINSZ)
9785 syminsz = entry->d_un.d_val;
9786 else if (entry->d_tag == DT_SYMINFO)
9787 dynamic_syminfo_offset = offset_from_vma (filedata, entry->d_un.d_val,
9788 syminsz);
9789 }
9790
9791 if (dynamic_syminfo_offset != 0 && syminsz != 0)
9792 {
9793 Elf_External_Syminfo * extsyminfo;
9794 Elf_External_Syminfo * extsym;
9795 Elf_Internal_Syminfo * syminfo;
9796
9797 /* There is a syminfo section. Read the data. */
9798 extsyminfo = (Elf_External_Syminfo *)
9799 get_data (NULL, filedata, dynamic_syminfo_offset, 1, syminsz,
9800 _("symbol information"));
9801 if (!extsyminfo)
9802 return FALSE;
9803
9804 if (dynamic_syminfo != NULL)
9805 {
9806 error (_("Multiple dynamic symbol information sections found\n"));
9807 free (dynamic_syminfo);
9808 }
9809 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
9810 if (dynamic_syminfo == NULL)
9811 {
9812 error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9813 (unsigned long) syminsz);
9814 return FALSE;
9815 }
9816
9817 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
9818 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
9819 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
9820 ++syminfo, ++extsym)
9821 {
9822 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
9823 syminfo->si_flags = BYTE_GET (extsym->si_flags);
9824 }
9825
9826 free (extsyminfo);
9827 }
9828 }
9829
9830 if (do_dynamic && dynamic_addr)
9831 printf (ngettext ("\nDynamic section at offset 0x%lx "
9832 "contains %lu entry:\n",
9833 "\nDynamic section at offset 0x%lx "
9834 "contains %lu entries:\n",
9835 dynamic_nent),
9836 dynamic_addr, (unsigned long) dynamic_nent);
9837 if (do_dynamic)
9838 printf (_(" Tag Type Name/Value\n"));
9839
9840 for (entry = dynamic_section;
9841 entry < dynamic_section + dynamic_nent;
9842 entry++)
9843 {
9844 if (do_dynamic)
9845 {
9846 const char * dtype;
9847
9848 putchar (' ');
9849 print_vma (entry->d_tag, FULL_HEX);
9850 dtype = get_dynamic_type (filedata, entry->d_tag);
9851 printf (" (%s)%*s", dtype,
9852 ((is_32bit_elf ? 27 : 19) - (int) strlen (dtype)), " ");
9853 }
9854
9855 switch (entry->d_tag)
9856 {
9857 case DT_FLAGS:
9858 if (do_dynamic)
9859 print_dynamic_flags (entry->d_un.d_val);
9860 break;
9861
9862 case DT_AUXILIARY:
9863 case DT_FILTER:
9864 case DT_CONFIG:
9865 case DT_DEPAUDIT:
9866 case DT_AUDIT:
9867 if (do_dynamic)
9868 {
9869 switch (entry->d_tag)
9870 {
9871 case DT_AUXILIARY:
9872 printf (_("Auxiliary library"));
9873 break;
9874
9875 case DT_FILTER:
9876 printf (_("Filter library"));
9877 break;
9878
9879 case DT_CONFIG:
9880 printf (_("Configuration file"));
9881 break;
9882
9883 case DT_DEPAUDIT:
9884 printf (_("Dependency audit library"));
9885 break;
9886
9887 case DT_AUDIT:
9888 printf (_("Audit library"));
9889 break;
9890 }
9891
9892 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9893 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
9894 else
9895 {
9896 printf (": ");
9897 print_vma (entry->d_un.d_val, PREFIX_HEX);
9898 putchar ('\n');
9899 }
9900 }
9901 break;
9902
9903 case DT_FEATURE:
9904 if (do_dynamic)
9905 {
9906 printf (_("Flags:"));
9907
9908 if (entry->d_un.d_val == 0)
9909 printf (_(" None\n"));
9910 else
9911 {
9912 unsigned long int val = entry->d_un.d_val;
9913
9914 if (val & DTF_1_PARINIT)
9915 {
9916 printf (" PARINIT");
9917 val ^= DTF_1_PARINIT;
9918 }
9919 if (val & DTF_1_CONFEXP)
9920 {
9921 printf (" CONFEXP");
9922 val ^= DTF_1_CONFEXP;
9923 }
9924 if (val != 0)
9925 printf (" %lx", val);
9926 puts ("");
9927 }
9928 }
9929 break;
9930
9931 case DT_POSFLAG_1:
9932 if (do_dynamic)
9933 {
9934 printf (_("Flags:"));
9935
9936 if (entry->d_un.d_val == 0)
9937 printf (_(" None\n"));
9938 else
9939 {
9940 unsigned long int val = entry->d_un.d_val;
9941
9942 if (val & DF_P1_LAZYLOAD)
9943 {
9944 printf (" LAZYLOAD");
9945 val ^= DF_P1_LAZYLOAD;
9946 }
9947 if (val & DF_P1_GROUPPERM)
9948 {
9949 printf (" GROUPPERM");
9950 val ^= DF_P1_GROUPPERM;
9951 }
9952 if (val != 0)
9953 printf (" %lx", val);
9954 puts ("");
9955 }
9956 }
9957 break;
9958
9959 case DT_FLAGS_1:
9960 if (do_dynamic)
9961 {
9962 printf (_("Flags:"));
9963 if (entry->d_un.d_val == 0)
9964 printf (_(" None\n"));
9965 else
9966 {
9967 unsigned long int val = entry->d_un.d_val;
9968
9969 if (val & DF_1_NOW)
9970 {
9971 printf (" NOW");
9972 val ^= DF_1_NOW;
9973 }
9974 if (val & DF_1_GLOBAL)
9975 {
9976 printf (" GLOBAL");
9977 val ^= DF_1_GLOBAL;
9978 }
9979 if (val & DF_1_GROUP)
9980 {
9981 printf (" GROUP");
9982 val ^= DF_1_GROUP;
9983 }
9984 if (val & DF_1_NODELETE)
9985 {
9986 printf (" NODELETE");
9987 val ^= DF_1_NODELETE;
9988 }
9989 if (val & DF_1_LOADFLTR)
9990 {
9991 printf (" LOADFLTR");
9992 val ^= DF_1_LOADFLTR;
9993 }
9994 if (val & DF_1_INITFIRST)
9995 {
9996 printf (" INITFIRST");
9997 val ^= DF_1_INITFIRST;
9998 }
9999 if (val & DF_1_NOOPEN)
10000 {
10001 printf (" NOOPEN");
10002 val ^= DF_1_NOOPEN;
10003 }
10004 if (val & DF_1_ORIGIN)
10005 {
10006 printf (" ORIGIN");
10007 val ^= DF_1_ORIGIN;
10008 }
10009 if (val & DF_1_DIRECT)
10010 {
10011 printf (" DIRECT");
10012 val ^= DF_1_DIRECT;
10013 }
10014 if (val & DF_1_TRANS)
10015 {
10016 printf (" TRANS");
10017 val ^= DF_1_TRANS;
10018 }
10019 if (val & DF_1_INTERPOSE)
10020 {
10021 printf (" INTERPOSE");
10022 val ^= DF_1_INTERPOSE;
10023 }
10024 if (val & DF_1_NODEFLIB)
10025 {
10026 printf (" NODEFLIB");
10027 val ^= DF_1_NODEFLIB;
10028 }
10029 if (val & DF_1_NODUMP)
10030 {
10031 printf (" NODUMP");
10032 val ^= DF_1_NODUMP;
10033 }
10034 if (val & DF_1_CONFALT)
10035 {
10036 printf (" CONFALT");
10037 val ^= DF_1_CONFALT;
10038 }
10039 if (val & DF_1_ENDFILTEE)
10040 {
10041 printf (" ENDFILTEE");
10042 val ^= DF_1_ENDFILTEE;
10043 }
10044 if (val & DF_1_DISPRELDNE)
10045 {
10046 printf (" DISPRELDNE");
10047 val ^= DF_1_DISPRELDNE;
10048 }
10049 if (val & DF_1_DISPRELPND)
10050 {
10051 printf (" DISPRELPND");
10052 val ^= DF_1_DISPRELPND;
10053 }
10054 if (val & DF_1_NODIRECT)
10055 {
10056 printf (" NODIRECT");
10057 val ^= DF_1_NODIRECT;
10058 }
10059 if (val & DF_1_IGNMULDEF)
10060 {
10061 printf (" IGNMULDEF");
10062 val ^= DF_1_IGNMULDEF;
10063 }
10064 if (val & DF_1_NOKSYMS)
10065 {
10066 printf (" NOKSYMS");
10067 val ^= DF_1_NOKSYMS;
10068 }
10069 if (val & DF_1_NOHDR)
10070 {
10071 printf (" NOHDR");
10072 val ^= DF_1_NOHDR;
10073 }
10074 if (val & DF_1_EDITED)
10075 {
10076 printf (" EDITED");
10077 val ^= DF_1_EDITED;
10078 }
10079 if (val & DF_1_NORELOC)
10080 {
10081 printf (" NORELOC");
10082 val ^= DF_1_NORELOC;
10083 }
10084 if (val & DF_1_SYMINTPOSE)
10085 {
10086 printf (" SYMINTPOSE");
10087 val ^= DF_1_SYMINTPOSE;
10088 }
10089 if (val & DF_1_GLOBAUDIT)
10090 {
10091 printf (" GLOBAUDIT");
10092 val ^= DF_1_GLOBAUDIT;
10093 }
10094 if (val & DF_1_SINGLETON)
10095 {
10096 printf (" SINGLETON");
10097 val ^= DF_1_SINGLETON;
10098 }
10099 if (val & DF_1_STUB)
10100 {
10101 printf (" STUB");
10102 val ^= DF_1_STUB;
10103 }
10104 if (val & DF_1_PIE)
10105 {
10106 printf (" PIE");
10107 val ^= DF_1_PIE;
10108 }
10109 if (val & DF_1_KMOD)
10110 {
10111 printf (" KMOD");
10112 val ^= DF_1_KMOD;
10113 }
10114 if (val & DF_1_WEAKFILTER)
10115 {
10116 printf (" WEAKFILTER");
10117 val ^= DF_1_WEAKFILTER;
10118 }
10119 if (val & DF_1_NOCOMMON)
10120 {
10121 printf (" NOCOMMON");
10122 val ^= DF_1_NOCOMMON;
10123 }
10124 if (val != 0)
10125 printf (" %lx", val);
10126 puts ("");
10127 }
10128 }
10129 break;
10130
10131 case DT_PLTREL:
10132 dynamic_info[entry->d_tag] = entry->d_un.d_val;
10133 if (do_dynamic)
10134 puts (get_dynamic_type (filedata, entry->d_un.d_val));
10135 break;
10136
10137 case DT_NULL :
10138 case DT_NEEDED :
10139 case DT_PLTGOT :
10140 case DT_HASH :
10141 case DT_STRTAB :
10142 case DT_SYMTAB :
10143 case DT_RELA :
10144 case DT_INIT :
10145 case DT_FINI :
10146 case DT_SONAME :
10147 case DT_RPATH :
10148 case DT_SYMBOLIC:
10149 case DT_REL :
10150 case DT_DEBUG :
10151 case DT_TEXTREL :
10152 case DT_JMPREL :
10153 case DT_RUNPATH :
10154 dynamic_info[entry->d_tag] = entry->d_un.d_val;
10155
10156 if (do_dynamic)
10157 {
10158 char * name;
10159
10160 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
10161 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
10162 else
10163 name = NULL;
10164
10165 if (name)
10166 {
10167 switch (entry->d_tag)
10168 {
10169 case DT_NEEDED:
10170 printf (_("Shared library: [%s]"), name);
10171
10172 if (streq (name, program_interpreter))
10173 printf (_(" program interpreter"));
10174 break;
10175
10176 case DT_SONAME:
10177 printf (_("Library soname: [%s]"), name);
10178 break;
10179
10180 case DT_RPATH:
10181 printf (_("Library rpath: [%s]"), name);
10182 break;
10183
10184 case DT_RUNPATH:
10185 printf (_("Library runpath: [%s]"), name);
10186 break;
10187
10188 default:
10189 print_vma (entry->d_un.d_val, PREFIX_HEX);
10190 break;
10191 }
10192 }
10193 else
10194 print_vma (entry->d_un.d_val, PREFIX_HEX);
10195
10196 putchar ('\n');
10197 }
10198 break;
10199
10200 case DT_PLTRELSZ:
10201 case DT_RELASZ :
10202 case DT_STRSZ :
10203 case DT_RELSZ :
10204 case DT_RELAENT :
10205 case DT_SYMENT :
10206 case DT_RELENT :
10207 dynamic_info[entry->d_tag] = entry->d_un.d_val;
10208 /* Fall through. */
10209 case DT_PLTPADSZ:
10210 case DT_MOVEENT :
10211 case DT_MOVESZ :
10212 case DT_INIT_ARRAYSZ:
10213 case DT_FINI_ARRAYSZ:
10214 case DT_GNU_CONFLICTSZ:
10215 case DT_GNU_LIBLISTSZ:
10216 if (do_dynamic)
10217 {
10218 print_vma (entry->d_un.d_val, UNSIGNED);
10219 printf (_(" (bytes)\n"));
10220 }
10221 break;
10222
10223 case DT_VERDEFNUM:
10224 case DT_VERNEEDNUM:
10225 case DT_RELACOUNT:
10226 case DT_RELCOUNT:
10227 if (do_dynamic)
10228 {
10229 print_vma (entry->d_un.d_val, UNSIGNED);
10230 putchar ('\n');
10231 }
10232 break;
10233
10234 case DT_SYMINSZ:
10235 case DT_SYMINENT:
10236 case DT_SYMINFO:
10237 case DT_USED:
10238 case DT_INIT_ARRAY:
10239 case DT_FINI_ARRAY:
10240 if (do_dynamic)
10241 {
10242 if (entry->d_tag == DT_USED
10243 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
10244 {
10245 char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
10246
10247 if (*name)
10248 {
10249 printf (_("Not needed object: [%s]\n"), name);
10250 break;
10251 }
10252 }
10253
10254 print_vma (entry->d_un.d_val, PREFIX_HEX);
10255 putchar ('\n');
10256 }
10257 break;
10258
10259 case DT_BIND_NOW:
10260 /* The value of this entry is ignored. */
10261 if (do_dynamic)
10262 putchar ('\n');
10263 break;
10264
10265 case DT_GNU_PRELINKED:
10266 if (do_dynamic)
10267 {
10268 struct tm * tmp;
10269 time_t atime = entry->d_un.d_val;
10270
10271 tmp = gmtime (&atime);
10272 /* PR 17533 file: 041-1244816-0.004. */
10273 if (tmp == NULL)
10274 printf (_("<corrupt time val: %lx"),
10275 (unsigned long) atime);
10276 else
10277 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
10278 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
10279 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
10280
10281 }
10282 break;
10283
10284 case DT_GNU_HASH:
10285 dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
10286 if (do_dynamic)
10287 {
10288 print_vma (entry->d_un.d_val, PREFIX_HEX);
10289 putchar ('\n');
10290 }
10291 break;
10292
10293 default:
10294 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
10295 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
10296 entry->d_un.d_val;
10297
10298 if (do_dynamic)
10299 {
10300 switch (filedata->file_header.e_machine)
10301 {
10302 case EM_MIPS:
10303 case EM_MIPS_RS3_LE:
10304 dynamic_section_mips_val (entry);
10305 break;
10306 case EM_PARISC:
10307 dynamic_section_parisc_val (entry);
10308 break;
10309 case EM_IA_64:
10310 dynamic_section_ia64_val (entry);
10311 break;
10312 default:
10313 print_vma (entry->d_un.d_val, PREFIX_HEX);
10314 putchar ('\n');
10315 }
10316 }
10317 break;
10318 }
10319 }
10320
10321 return TRUE;
10322 }
10323
10324 static char *
10325 get_ver_flags (unsigned int flags)
10326 {
10327 static char buff[128];
10328
10329 buff[0] = 0;
10330
10331 if (flags == 0)
10332 return _("none");
10333
10334 if (flags & VER_FLG_BASE)
10335 strcat (buff, "BASE");
10336
10337 if (flags & VER_FLG_WEAK)
10338 {
10339 if (flags & VER_FLG_BASE)
10340 strcat (buff, " | ");
10341
10342 strcat (buff, "WEAK");
10343 }
10344
10345 if (flags & VER_FLG_INFO)
10346 {
10347 if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
10348 strcat (buff, " | ");
10349
10350 strcat (buff, "INFO");
10351 }
10352
10353 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
10354 {
10355 if (flags & (VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
10356 strcat (buff, " | ");
10357
10358 strcat (buff, _("<unknown>"));
10359 }
10360
10361 return buff;
10362 }
10363
10364 /* Display the contents of the version sections. */
10365
10366 static bfd_boolean
10367 process_version_sections (Filedata * filedata)
10368 {
10369 Elf_Internal_Shdr * section;
10370 unsigned i;
10371 bfd_boolean found = FALSE;
10372
10373 if (! do_version)
10374 return TRUE;
10375
10376 for (i = 0, section = filedata->section_headers;
10377 i < filedata->file_header.e_shnum;
10378 i++, section++)
10379 {
10380 switch (section->sh_type)
10381 {
10382 case SHT_GNU_verdef:
10383 {
10384 Elf_External_Verdef * edefs;
10385 unsigned long idx;
10386 unsigned long cnt;
10387 char * endbuf;
10388
10389 found = TRUE;
10390
10391 printf (ngettext ("\nVersion definition section '%s' "
10392 "contains %u entry:\n",
10393 "\nVersion definition section '%s' "
10394 "contains %u entries:\n",
10395 section->sh_info),
10396 printable_section_name (filedata, section),
10397 section->sh_info);
10398
10399 printf (_(" Addr: 0x"));
10400 printf_vma (section->sh_addr);
10401 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
10402 (unsigned long) section->sh_offset, section->sh_link,
10403 printable_section_name_from_index (filedata, section->sh_link));
10404
10405 edefs = (Elf_External_Verdef *)
10406 get_data (NULL, filedata, section->sh_offset, 1,section->sh_size,
10407 _("version definition section"));
10408 if (!edefs)
10409 break;
10410 endbuf = (char *) edefs + section->sh_size;
10411
10412 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10413 {
10414 char * vstart;
10415 Elf_External_Verdef * edef;
10416 Elf_Internal_Verdef ent;
10417 Elf_External_Verdaux * eaux;
10418 Elf_Internal_Verdaux aux;
10419 unsigned long isum;
10420 int j;
10421
10422 vstart = ((char *) edefs) + idx;
10423 if (vstart + sizeof (*edef) > endbuf)
10424 break;
10425
10426 edef = (Elf_External_Verdef *) vstart;
10427
10428 ent.vd_version = BYTE_GET (edef->vd_version);
10429 ent.vd_flags = BYTE_GET (edef->vd_flags);
10430 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
10431 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
10432 ent.vd_hash = BYTE_GET (edef->vd_hash);
10433 ent.vd_aux = BYTE_GET (edef->vd_aux);
10434 ent.vd_next = BYTE_GET (edef->vd_next);
10435
10436 printf (_(" %#06lx: Rev: %d Flags: %s"),
10437 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
10438
10439 printf (_(" Index: %d Cnt: %d "),
10440 ent.vd_ndx, ent.vd_cnt);
10441
10442 /* Check for overflow. */
10443 if (ent.vd_aux > (size_t) (endbuf - vstart))
10444 break;
10445
10446 vstart += ent.vd_aux;
10447
10448 if (vstart + sizeof (*eaux) > endbuf)
10449 break;
10450 eaux = (Elf_External_Verdaux *) vstart;
10451
10452 aux.vda_name = BYTE_GET (eaux->vda_name);
10453 aux.vda_next = BYTE_GET (eaux->vda_next);
10454
10455 if (VALID_DYNAMIC_NAME (aux.vda_name))
10456 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
10457 else
10458 printf (_("Name index: %ld\n"), aux.vda_name);
10459
10460 isum = idx + ent.vd_aux;
10461
10462 for (j = 1; j < ent.vd_cnt; j++)
10463 {
10464 if (aux.vda_next < sizeof (*eaux)
10465 && !(j == ent.vd_cnt - 1 && aux.vda_next == 0))
10466 {
10467 warn (_("Invalid vda_next field of %lx\n"),
10468 aux.vda_next);
10469 j = ent.vd_cnt;
10470 break;
10471 }
10472 /* Check for overflow. */
10473 if (aux.vda_next > (size_t) (endbuf - vstart))
10474 break;
10475
10476 isum += aux.vda_next;
10477 vstart += aux.vda_next;
10478
10479 if (vstart + sizeof (*eaux) > endbuf)
10480 break;
10481 eaux = (Elf_External_Verdaux *) vstart;
10482
10483 aux.vda_name = BYTE_GET (eaux->vda_name);
10484 aux.vda_next = BYTE_GET (eaux->vda_next);
10485
10486 if (VALID_DYNAMIC_NAME (aux.vda_name))
10487 printf (_(" %#06lx: Parent %d: %s\n"),
10488 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
10489 else
10490 printf (_(" %#06lx: Parent %d, name index: %ld\n"),
10491 isum, j, aux.vda_name);
10492 }
10493
10494 if (j < ent.vd_cnt)
10495 printf (_(" Version def aux past end of section\n"));
10496
10497 /* PR 17531:
10498 file: id:000001,src:000172+005151,op:splice,rep:2. */
10499 if (ent.vd_next < sizeof (*edef)
10500 && !(cnt == section->sh_info - 1 && ent.vd_next == 0))
10501 {
10502 warn (_("Invalid vd_next field of %lx\n"), ent.vd_next);
10503 cnt = section->sh_info;
10504 break;
10505 }
10506 if (ent.vd_next > (size_t) (endbuf - ((char *) edefs + idx)))
10507 break;
10508
10509 idx += ent.vd_next;
10510 }
10511
10512 if (cnt < section->sh_info)
10513 printf (_(" Version definition past end of section\n"));
10514
10515 free (edefs);
10516 }
10517 break;
10518
10519 case SHT_GNU_verneed:
10520 {
10521 Elf_External_Verneed * eneed;
10522 unsigned long idx;
10523 unsigned long cnt;
10524 char * endbuf;
10525
10526 found = TRUE;
10527
10528 printf (ngettext ("\nVersion needs section '%s' "
10529 "contains %u entry:\n",
10530 "\nVersion needs section '%s' "
10531 "contains %u entries:\n",
10532 section->sh_info),
10533 printable_section_name (filedata, section), section->sh_info);
10534
10535 printf (_(" Addr: 0x"));
10536 printf_vma (section->sh_addr);
10537 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
10538 (unsigned long) section->sh_offset, section->sh_link,
10539 printable_section_name_from_index (filedata, section->sh_link));
10540
10541 eneed = (Elf_External_Verneed *) get_data (NULL, filedata,
10542 section->sh_offset, 1,
10543 section->sh_size,
10544 _("Version Needs section"));
10545 if (!eneed)
10546 break;
10547 endbuf = (char *) eneed + section->sh_size;
10548
10549 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10550 {
10551 Elf_External_Verneed * entry;
10552 Elf_Internal_Verneed ent;
10553 unsigned long isum;
10554 int j;
10555 char * vstart;
10556
10557 vstart = ((char *) eneed) + idx;
10558 if (vstart + sizeof (*entry) > endbuf)
10559 break;
10560
10561 entry = (Elf_External_Verneed *) vstart;
10562
10563 ent.vn_version = BYTE_GET (entry->vn_version);
10564 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
10565 ent.vn_file = BYTE_GET (entry->vn_file);
10566 ent.vn_aux = BYTE_GET (entry->vn_aux);
10567 ent.vn_next = BYTE_GET (entry->vn_next);
10568
10569 printf (_(" %#06lx: Version: %d"), idx, ent.vn_version);
10570
10571 if (VALID_DYNAMIC_NAME (ent.vn_file))
10572 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
10573 else
10574 printf (_(" File: %lx"), ent.vn_file);
10575
10576 printf (_(" Cnt: %d\n"), ent.vn_cnt);
10577
10578 /* Check for overflow. */
10579 if (ent.vn_aux > (size_t) (endbuf - vstart))
10580 break;
10581 vstart += ent.vn_aux;
10582
10583 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
10584 {
10585 Elf_External_Vernaux * eaux;
10586 Elf_Internal_Vernaux aux;
10587
10588 if (vstart + sizeof (*eaux) > endbuf)
10589 break;
10590 eaux = (Elf_External_Vernaux *) vstart;
10591
10592 aux.vna_hash = BYTE_GET (eaux->vna_hash);
10593 aux.vna_flags = BYTE_GET (eaux->vna_flags);
10594 aux.vna_other = BYTE_GET (eaux->vna_other);
10595 aux.vna_name = BYTE_GET (eaux->vna_name);
10596 aux.vna_next = BYTE_GET (eaux->vna_next);
10597
10598 if (VALID_DYNAMIC_NAME (aux.vna_name))
10599 printf (_(" %#06lx: Name: %s"),
10600 isum, GET_DYNAMIC_NAME (aux.vna_name));
10601 else
10602 printf (_(" %#06lx: Name index: %lx"),
10603 isum, aux.vna_name);
10604
10605 printf (_(" Flags: %s Version: %d\n"),
10606 get_ver_flags (aux.vna_flags), aux.vna_other);
10607
10608 if (aux.vna_next < sizeof (*eaux)
10609 && !(j == ent.vn_cnt - 1 && aux.vna_next == 0))
10610 {
10611 warn (_("Invalid vna_next field of %lx\n"),
10612 aux.vna_next);
10613 j = ent.vn_cnt;
10614 break;
10615 }
10616 /* Check for overflow. */
10617 if (aux.vna_next > (size_t) (endbuf - vstart))
10618 break;
10619 isum += aux.vna_next;
10620 vstart += aux.vna_next;
10621 }
10622
10623 if (j < ent.vn_cnt)
10624 warn (_("Missing Version Needs auxillary information\n"));
10625
10626 if (ent.vn_next < sizeof (*entry)
10627 && !(cnt == section->sh_info - 1 && ent.vn_next == 0))
10628 {
10629 warn (_("Invalid vn_next field of %lx\n"), ent.vn_next);
10630 cnt = section->sh_info;
10631 break;
10632 }
10633 if (ent.vn_next > (size_t) (endbuf - ((char *) eneed + idx)))
10634 break;
10635 idx += ent.vn_next;
10636 }
10637
10638 if (cnt < section->sh_info)
10639 warn (_("Missing Version Needs information\n"));
10640
10641 free (eneed);
10642 }
10643 break;
10644
10645 case SHT_GNU_versym:
10646 {
10647 Elf_Internal_Shdr * link_section;
10648 size_t total;
10649 unsigned int cnt;
10650 unsigned char * edata;
10651 unsigned short * data;
10652 char * strtab;
10653 Elf_Internal_Sym * symbols;
10654 Elf_Internal_Shdr * string_sec;
10655 unsigned long num_syms;
10656 long off;
10657
10658 if (section->sh_link >= filedata->file_header.e_shnum)
10659 break;
10660
10661 link_section = filedata->section_headers + section->sh_link;
10662 total = section->sh_size / sizeof (Elf_External_Versym);
10663
10664 if (link_section->sh_link >= filedata->file_header.e_shnum)
10665 break;
10666
10667 found = TRUE;
10668
10669 symbols = GET_ELF_SYMBOLS (filedata, link_section, & num_syms);
10670 if (symbols == NULL)
10671 break;
10672
10673 string_sec = filedata->section_headers + link_section->sh_link;
10674
10675 strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
10676 string_sec->sh_size,
10677 _("version string table"));
10678 if (!strtab)
10679 {
10680 free (symbols);
10681 break;
10682 }
10683
10684 printf (ngettext ("\nVersion symbols section '%s' "
10685 "contains %lu entry:\n",
10686 "\nVersion symbols section '%s' "
10687 "contains %lu entries:\n",
10688 total),
10689 printable_section_name (filedata, section), (unsigned long) total);
10690
10691 printf (_(" Addr: "));
10692 printf_vma (section->sh_addr);
10693 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
10694 (unsigned long) section->sh_offset, section->sh_link,
10695 printable_section_name (filedata, link_section));
10696
10697 off = offset_from_vma (filedata,
10698 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10699 total * sizeof (short));
10700 edata = (unsigned char *) get_data (NULL, filedata, off, total,
10701 sizeof (short),
10702 _("version symbol data"));
10703 if (!edata)
10704 {
10705 free (strtab);
10706 free (symbols);
10707 break;
10708 }
10709
10710 data = (short unsigned int *) cmalloc (total, sizeof (short));
10711
10712 for (cnt = total; cnt --;)
10713 data[cnt] = byte_get (edata + cnt * sizeof (short),
10714 sizeof (short));
10715
10716 free (edata);
10717
10718 for (cnt = 0; cnt < total; cnt += 4)
10719 {
10720 int j, nn;
10721 char *name;
10722 char *invalid = _("*invalid*");
10723
10724 printf (" %03x:", cnt);
10725
10726 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
10727 switch (data[cnt + j])
10728 {
10729 case 0:
10730 fputs (_(" 0 (*local*) "), stdout);
10731 break;
10732
10733 case 1:
10734 fputs (_(" 1 (*global*) "), stdout);
10735 break;
10736
10737 default:
10738 nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
10739 data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
10740
10741 /* If this index value is greater than the size of the symbols
10742 array, break to avoid an out-of-bounds read. */
10743 if ((unsigned long)(cnt + j) >= num_syms)
10744 {
10745 warn (_("invalid index into symbol array\n"));
10746 break;
10747 }
10748
10749 name = NULL;
10750 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10751 {
10752 Elf_Internal_Verneed ivn;
10753 unsigned long offset;
10754
10755 offset = offset_from_vma
10756 (filedata, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10757 sizeof (Elf_External_Verneed));
10758
10759 do
10760 {
10761 Elf_Internal_Vernaux ivna;
10762 Elf_External_Verneed evn;
10763 Elf_External_Vernaux evna;
10764 unsigned long a_off;
10765
10766 if (get_data (&evn, filedata, offset, sizeof (evn), 1,
10767 _("version need")) == NULL)
10768 break;
10769
10770 ivn.vn_aux = BYTE_GET (evn.vn_aux);
10771 ivn.vn_next = BYTE_GET (evn.vn_next);
10772
10773 a_off = offset + ivn.vn_aux;
10774
10775 do
10776 {
10777 if (get_data (&evna, filedata, a_off, sizeof (evna),
10778 1, _("version need aux (2)")) == NULL)
10779 {
10780 ivna.vna_next = 0;
10781 ivna.vna_other = 0;
10782 }
10783 else
10784 {
10785 ivna.vna_next = BYTE_GET (evna.vna_next);
10786 ivna.vna_other = BYTE_GET (evna.vna_other);
10787 }
10788
10789 a_off += ivna.vna_next;
10790 }
10791 while (ivna.vna_other != data[cnt + j]
10792 && ivna.vna_next != 0);
10793
10794 if (ivna.vna_other == data[cnt + j])
10795 {
10796 ivna.vna_name = BYTE_GET (evna.vna_name);
10797
10798 if (ivna.vna_name >= string_sec->sh_size)
10799 name = invalid;
10800 else
10801 name = strtab + ivna.vna_name;
10802 break;
10803 }
10804
10805 offset += ivn.vn_next;
10806 }
10807 while (ivn.vn_next);
10808 }
10809
10810 if (data[cnt + j] != 0x8001
10811 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10812 {
10813 Elf_Internal_Verdef ivd;
10814 Elf_External_Verdef evd;
10815 unsigned long offset;
10816
10817 offset = offset_from_vma
10818 (filedata, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10819 sizeof evd);
10820
10821 do
10822 {
10823 if (get_data (&evd, filedata, offset, sizeof (evd), 1,
10824 _("version def")) == NULL)
10825 {
10826 ivd.vd_next = 0;
10827 /* PR 17531: file: 046-1082287-0.004. */
10828 ivd.vd_ndx = (data[cnt + j] & VERSYM_VERSION) + 1;
10829 break;
10830 }
10831 else
10832 {
10833 ivd.vd_next = BYTE_GET (evd.vd_next);
10834 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10835 }
10836
10837 offset += ivd.vd_next;
10838 }
10839 while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
10840 && ivd.vd_next != 0);
10841
10842 if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
10843 {
10844 Elf_External_Verdaux evda;
10845 Elf_Internal_Verdaux ivda;
10846
10847 ivd.vd_aux = BYTE_GET (evd.vd_aux);
10848
10849 if (get_data (&evda, filedata,
10850 offset - ivd.vd_next + ivd.vd_aux,
10851 sizeof (evda), 1,
10852 _("version def aux")) == NULL)
10853 break;
10854
10855 ivda.vda_name = BYTE_GET (evda.vda_name);
10856
10857 if (ivda.vda_name >= string_sec->sh_size)
10858 name = invalid;
10859 else if (name != NULL && name != invalid)
10860 name = _("*both*");
10861 else
10862 name = strtab + ivda.vda_name;
10863 }
10864 }
10865 if (name != NULL)
10866 nn += printf ("(%s%-*s",
10867 name,
10868 12 - (int) strlen (name),
10869 ")");
10870
10871 if (nn < 18)
10872 printf ("%*c", 18 - nn, ' ');
10873 }
10874
10875 putchar ('\n');
10876 }
10877
10878 free (data);
10879 free (strtab);
10880 free (symbols);
10881 }
10882 break;
10883
10884 default:
10885 break;
10886 }
10887 }
10888
10889 if (! found)
10890 printf (_("\nNo version information found in this file.\n"));
10891
10892 return TRUE;
10893 }
10894
10895 static const char *
10896 get_symbol_binding (Filedata * filedata, unsigned int binding)
10897 {
10898 static char buff[32];
10899
10900 switch (binding)
10901 {
10902 case STB_LOCAL: return "LOCAL";
10903 case STB_GLOBAL: return "GLOBAL";
10904 case STB_WEAK: return "WEAK";
10905 default:
10906 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
10907 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
10908 binding);
10909 else if (binding >= STB_LOOS && binding <= STB_HIOS)
10910 {
10911 if (binding == STB_GNU_UNIQUE
10912 && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10913 /* GNU is still using the default value 0. */
10914 || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10915 return "UNIQUE";
10916 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
10917 }
10918 else
10919 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
10920 return buff;
10921 }
10922 }
10923
10924 static const char *
10925 get_symbol_type (Filedata * filedata, unsigned int type)
10926 {
10927 static char buff[32];
10928
10929 switch (type)
10930 {
10931 case STT_NOTYPE: return "NOTYPE";
10932 case STT_OBJECT: return "OBJECT";
10933 case STT_FUNC: return "FUNC";
10934 case STT_SECTION: return "SECTION";
10935 case STT_FILE: return "FILE";
10936 case STT_COMMON: return "COMMON";
10937 case STT_TLS: return "TLS";
10938 case STT_RELC: return "RELC";
10939 case STT_SRELC: return "SRELC";
10940 default:
10941 if (type >= STT_LOPROC && type <= STT_HIPROC)
10942 {
10943 if (filedata->file_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
10944 return "THUMB_FUNC";
10945
10946 if (filedata->file_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
10947 return "REGISTER";
10948
10949 if (filedata->file_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
10950 return "PARISC_MILLI";
10951
10952 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
10953 }
10954 else if (type >= STT_LOOS && type <= STT_HIOS)
10955 {
10956 if (filedata->file_header.e_machine == EM_PARISC)
10957 {
10958 if (type == STT_HP_OPAQUE)
10959 return "HP_OPAQUE";
10960 if (type == STT_HP_STUB)
10961 return "HP_STUB";
10962 }
10963
10964 if (type == STT_GNU_IFUNC
10965 && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10966 || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
10967 /* GNU is still using the default value 0. */
10968 || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10969 return "IFUNC";
10970
10971 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
10972 }
10973 else
10974 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
10975 return buff;
10976 }
10977 }
10978
10979 static const char *
10980 get_symbol_visibility (unsigned int visibility)
10981 {
10982 switch (visibility)
10983 {
10984 case STV_DEFAULT: return "DEFAULT";
10985 case STV_INTERNAL: return "INTERNAL";
10986 case STV_HIDDEN: return "HIDDEN";
10987 case STV_PROTECTED: return "PROTECTED";
10988 default:
10989 error (_("Unrecognized visibility value: %u"), visibility);
10990 return _("<unknown>");
10991 }
10992 }
10993
10994 static const char *
10995 get_solaris_symbol_visibility (unsigned int visibility)
10996 {
10997 switch (visibility)
10998 {
10999 case 4: return "EXPORTED";
11000 case 5: return "SINGLETON";
11001 case 6: return "ELIMINATE";
11002 default: return get_symbol_visibility (visibility);
11003 }
11004 }
11005
11006 static const char *
11007 get_mips_symbol_other (unsigned int other)
11008 {
11009 switch (other)
11010 {
11011 case STO_OPTIONAL: return "OPTIONAL";
11012 case STO_MIPS_PLT: return "MIPS PLT";
11013 case STO_MIPS_PIC: return "MIPS PIC";
11014 case STO_MICROMIPS: return "MICROMIPS";
11015 case STO_MICROMIPS | STO_MIPS_PIC: return "MICROMIPS, MIPS PIC";
11016 case STO_MIPS16: return "MIPS16";
11017 default: return NULL;
11018 }
11019 }
11020
11021 static const char *
11022 get_ia64_symbol_other (Filedata * filedata, unsigned int other)
11023 {
11024 if (is_ia64_vms (filedata))
11025 {
11026 static char res[32];
11027
11028 res[0] = 0;
11029
11030 /* Function types is for images and .STB files only. */
11031 switch (filedata->file_header.e_type)
11032 {
11033 case ET_DYN:
11034 case ET_EXEC:
11035 switch (VMS_ST_FUNC_TYPE (other))
11036 {
11037 case VMS_SFT_CODE_ADDR:
11038 strcat (res, " CA");
11039 break;
11040 case VMS_SFT_SYMV_IDX:
11041 strcat (res, " VEC");
11042 break;
11043 case VMS_SFT_FD:
11044 strcat (res, " FD");
11045 break;
11046 case VMS_SFT_RESERVE:
11047 strcat (res, " RSV");
11048 break;
11049 default:
11050 warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
11051 VMS_ST_FUNC_TYPE (other));
11052 strcat (res, " <unknown>");
11053 break;
11054 }
11055 break;
11056 default:
11057 break;
11058 }
11059 switch (VMS_ST_LINKAGE (other))
11060 {
11061 case VMS_STL_IGNORE:
11062 strcat (res, " IGN");
11063 break;
11064 case VMS_STL_RESERVE:
11065 strcat (res, " RSV");
11066 break;
11067 case VMS_STL_STD:
11068 strcat (res, " STD");
11069 break;
11070 case VMS_STL_LNK:
11071 strcat (res, " LNK");
11072 break;
11073 default:
11074 warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
11075 VMS_ST_LINKAGE (other));
11076 strcat (res, " <unknown>");
11077 break;
11078 }
11079
11080 if (res[0] != 0)
11081 return res + 1;
11082 else
11083 return res;
11084 }
11085 return NULL;
11086 }
11087
11088 static const char *
11089 get_ppc64_symbol_other (unsigned int other)
11090 {
11091 if ((other & ~STO_PPC64_LOCAL_MASK) != 0)
11092 return NULL;
11093
11094 other >>= STO_PPC64_LOCAL_BIT;
11095 if (other <= 6)
11096 {
11097 static char buf[32];
11098 if (other >= 2)
11099 other = ppc64_decode_local_entry (other);
11100 snprintf (buf, sizeof buf, _("<localentry>: %d"), other);
11101 return buf;
11102 }
11103 return NULL;
11104 }
11105
11106 static const char *
11107 get_symbol_other (Filedata * filedata, unsigned int other)
11108 {
11109 const char * result = NULL;
11110 static char buff [32];
11111
11112 if (other == 0)
11113 return "";
11114
11115 switch (filedata->file_header.e_machine)
11116 {
11117 case EM_MIPS:
11118 result = get_mips_symbol_other (other);
11119 break;
11120 case EM_IA_64:
11121 result = get_ia64_symbol_other (filedata, other);
11122 break;
11123 case EM_PPC64:
11124 result = get_ppc64_symbol_other (other);
11125 break;
11126 default:
11127 result = NULL;
11128 break;
11129 }
11130
11131 if (result)
11132 return result;
11133
11134 snprintf (buff, sizeof buff, _("<other>: %x"), other);
11135 return buff;
11136 }
11137
11138 static const char *
11139 get_symbol_index_type (Filedata * filedata, unsigned int type)
11140 {
11141 static char buff[32];
11142
11143 switch (type)
11144 {
11145 case SHN_UNDEF: return "UND";
11146 case SHN_ABS: return "ABS";
11147 case SHN_COMMON: return "COM";
11148 default:
11149 if (type == SHN_IA_64_ANSI_COMMON
11150 && filedata->file_header.e_machine == EM_IA_64
11151 && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
11152 return "ANSI_COM";
11153 else if ((filedata->file_header.e_machine == EM_X86_64
11154 || filedata->file_header.e_machine == EM_L1OM
11155 || filedata->file_header.e_machine == EM_K1OM)
11156 && type == SHN_X86_64_LCOMMON)
11157 return "LARGE_COM";
11158 else if ((type == SHN_MIPS_SCOMMON
11159 && filedata->file_header.e_machine == EM_MIPS)
11160 || (type == SHN_TIC6X_SCOMMON
11161 && filedata->file_header.e_machine == EM_TI_C6000))
11162 return "SCOM";
11163 else if (type == SHN_MIPS_SUNDEFINED
11164 && filedata->file_header.e_machine == EM_MIPS)
11165 return "SUND";
11166 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
11167 sprintf (buff, "PRC[0x%04x]", type & 0xffff);
11168 else if (type >= SHN_LOOS && type <= SHN_HIOS)
11169 sprintf (buff, "OS [0x%04x]", type & 0xffff);
11170 else if (type >= SHN_LORESERVE)
11171 sprintf (buff, "RSV[0x%04x]", type & 0xffff);
11172 else if (type >= filedata->file_header.e_shnum)
11173 sprintf (buff, _("bad section index[%3d]"), type);
11174 else
11175 sprintf (buff, "%3d", type);
11176 break;
11177 }
11178
11179 return buff;
11180 }
11181
11182 static bfd_vma *
11183 get_dynamic_data (Filedata * filedata, bfd_size_type number, unsigned int ent_size)
11184 {
11185 unsigned char * e_data;
11186 bfd_vma * i_data;
11187
11188 /* If the size_t type is smaller than the bfd_size_type, eg because
11189 you are building a 32-bit tool on a 64-bit host, then make sure
11190 that when (number) is cast to (size_t) no information is lost. */
11191 if (sizeof (size_t) < sizeof (bfd_size_type)
11192 && (bfd_size_type) ((size_t) number) != number)
11193 {
11194 error (_("Size truncation prevents reading %s elements of size %u\n"),
11195 bfd_vmatoa ("u", number), ent_size);
11196 return NULL;
11197 }
11198
11199 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
11200 attempting to allocate memory when the read is bound to fail. */
11201 if (ent_size * number > filedata->file_size)
11202 {
11203 error (_("Invalid number of dynamic entries: %s\n"),
11204 bfd_vmatoa ("u", number));
11205 return NULL;
11206 }
11207
11208 e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
11209 if (e_data == NULL)
11210 {
11211 error (_("Out of memory reading %s dynamic entries\n"),
11212 bfd_vmatoa ("u", number));
11213 return NULL;
11214 }
11215
11216 if (fread (e_data, ent_size, (size_t) number, filedata->handle) != number)
11217 {
11218 error (_("Unable to read in %s bytes of dynamic data\n"),
11219 bfd_vmatoa ("u", number * ent_size));
11220 free (e_data);
11221 return NULL;
11222 }
11223
11224 i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
11225 if (i_data == NULL)
11226 {
11227 error (_("Out of memory allocating space for %s dynamic entries\n"),
11228 bfd_vmatoa ("u", number));
11229 free (e_data);
11230 return NULL;
11231 }
11232
11233 while (number--)
11234 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
11235
11236 free (e_data);
11237
11238 return i_data;
11239 }
11240
11241 static void
11242 print_dynamic_symbol (Filedata * filedata, bfd_vma si, unsigned long hn)
11243 {
11244 Elf_Internal_Sym * psym;
11245 int n;
11246
11247 n = print_vma (si, DEC_5);
11248 if (n < 5)
11249 fputs (&" "[n], stdout);
11250 printf (" %3lu: ", hn);
11251
11252 if (dynamic_symbols == NULL || si >= num_dynamic_syms)
11253 {
11254 printf (_("<No info available for dynamic symbol number %lu>\n"),
11255 (unsigned long) si);
11256 return;
11257 }
11258
11259 psym = dynamic_symbols + si;
11260 print_vma (psym->st_value, LONG_HEX);
11261 putchar (' ');
11262 print_vma (psym->st_size, DEC_5);
11263
11264 printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
11265 printf (" %-6s", get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
11266
11267 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11268 printf (" %-7s", get_solaris_symbol_visibility (psym->st_other));
11269 else
11270 {
11271 unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11272
11273 printf (" %-7s", get_symbol_visibility (vis));
11274 /* Check to see if any other bits in the st_other field are set.
11275 Note - displaying this information disrupts the layout of the
11276 table being generated, but for the moment this case is very
11277 rare. */
11278 if (psym->st_other ^ vis)
11279 printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
11280 }
11281
11282 printf (" %3.3s ", get_symbol_index_type (filedata, psym->st_shndx));
11283 if (VALID_DYNAMIC_NAME (psym->st_name))
11284 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
11285 else
11286 printf (_(" <corrupt: %14ld>"), psym->st_name);
11287 putchar ('\n');
11288 }
11289
11290 static const char *
11291 get_symbol_version_string (Filedata * filedata,
11292 bfd_boolean is_dynsym,
11293 const char * strtab,
11294 unsigned long int strtab_size,
11295 unsigned int si,
11296 Elf_Internal_Sym * psym,
11297 enum versioned_symbol_info * sym_info,
11298 unsigned short * vna_other)
11299 {
11300 unsigned char data[2];
11301 unsigned short vers_data;
11302 unsigned long offset;
11303 unsigned short max_vd_ndx;
11304
11305 if (!is_dynsym
11306 || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
11307 return NULL;
11308
11309 offset = offset_from_vma (filedata, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
11310 sizeof data + si * sizeof (vers_data));
11311
11312 if (get_data (&data, filedata, offset + si * sizeof (vers_data),
11313 sizeof (data), 1, _("version data")) == NULL)
11314 return NULL;
11315
11316 vers_data = byte_get (data, 2);
11317
11318 if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data == 0)
11319 return NULL;
11320
11321 max_vd_ndx = 0;
11322
11323 /* Usually we'd only see verdef for defined symbols, and verneed for
11324 undefined symbols. However, symbols defined by the linker in
11325 .dynbss for variables copied from a shared library in order to
11326 avoid text relocations are defined yet have verneed. We could
11327 use a heuristic to detect the special case, for example, check
11328 for verneed first on symbols defined in SHT_NOBITS sections, but
11329 it is simpler and more reliable to just look for both verdef and
11330 verneed. .dynbss might not be mapped to a SHT_NOBITS section. */
11331
11332 if (psym->st_shndx != SHN_UNDEF
11333 && vers_data != 0x8001
11334 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
11335 {
11336 Elf_Internal_Verdef ivd;
11337 Elf_Internal_Verdaux ivda;
11338 Elf_External_Verdaux evda;
11339 unsigned long off;
11340
11341 off = offset_from_vma (filedata,
11342 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
11343 sizeof (Elf_External_Verdef));
11344
11345 do
11346 {
11347 Elf_External_Verdef evd;
11348
11349 if (get_data (&evd, filedata, off, sizeof (evd), 1,
11350 _("version def")) == NULL)
11351 {
11352 ivd.vd_ndx = 0;
11353 ivd.vd_aux = 0;
11354 ivd.vd_next = 0;
11355 ivd.vd_flags = 0;
11356 }
11357 else
11358 {
11359 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
11360 ivd.vd_aux = BYTE_GET (evd.vd_aux);
11361 ivd.vd_next = BYTE_GET (evd.vd_next);
11362 ivd.vd_flags = BYTE_GET (evd.vd_flags);
11363 }
11364
11365 if ((ivd.vd_ndx & VERSYM_VERSION) > max_vd_ndx)
11366 max_vd_ndx = ivd.vd_ndx & VERSYM_VERSION;
11367
11368 off += ivd.vd_next;
11369 }
11370 while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
11371
11372 if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
11373 {
11374 if (ivd.vd_ndx == 1 && ivd.vd_flags == VER_FLG_BASE)
11375 return NULL;
11376
11377 off -= ivd.vd_next;
11378 off += ivd.vd_aux;
11379
11380 if (get_data (&evda, filedata, off, sizeof (evda), 1,
11381 _("version def aux")) != NULL)
11382 {
11383 ivda.vda_name = BYTE_GET (evda.vda_name);
11384
11385 if (psym->st_name != ivda.vda_name)
11386 {
11387 *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
11388 ? symbol_hidden : symbol_public);
11389 return (ivda.vda_name < strtab_size
11390 ? strtab + ivda.vda_name : _("<corrupt>"));
11391 }
11392 }
11393 }
11394 }
11395
11396 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
11397 {
11398 Elf_External_Verneed evn;
11399 Elf_Internal_Verneed ivn;
11400 Elf_Internal_Vernaux ivna;
11401
11402 offset = offset_from_vma (filedata,
11403 version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
11404 sizeof evn);
11405 do
11406 {
11407 unsigned long vna_off;
11408
11409 if (get_data (&evn, filedata, offset, sizeof (evn), 1,
11410 _("version need")) == NULL)
11411 {
11412 ivna.vna_next = 0;
11413 ivna.vna_other = 0;
11414 ivna.vna_name = 0;
11415 break;
11416 }
11417
11418 ivn.vn_aux = BYTE_GET (evn.vn_aux);
11419 ivn.vn_next = BYTE_GET (evn.vn_next);
11420
11421 vna_off = offset + ivn.vn_aux;
11422
11423 do
11424 {
11425 Elf_External_Vernaux evna;
11426
11427 if (get_data (&evna, filedata, vna_off, sizeof (evna), 1,
11428 _("version need aux (3)")) == NULL)
11429 {
11430 ivna.vna_next = 0;
11431 ivna.vna_other = 0;
11432 ivna.vna_name = 0;
11433 }
11434 else
11435 {
11436 ivna.vna_other = BYTE_GET (evna.vna_other);
11437 ivna.vna_next = BYTE_GET (evna.vna_next);
11438 ivna.vna_name = BYTE_GET (evna.vna_name);
11439 }
11440
11441 vna_off += ivna.vna_next;
11442 }
11443 while (ivna.vna_other != vers_data && ivna.vna_next != 0);
11444
11445 if (ivna.vna_other == vers_data)
11446 break;
11447
11448 offset += ivn.vn_next;
11449 }
11450 while (ivn.vn_next != 0);
11451
11452 if (ivna.vna_other == vers_data)
11453 {
11454 *sym_info = symbol_undefined;
11455 *vna_other = ivna.vna_other;
11456 return (ivna.vna_name < strtab_size
11457 ? strtab + ivna.vna_name : _("<corrupt>"));
11458 }
11459 else if ((max_vd_ndx || (vers_data & VERSYM_VERSION) != 1)
11460 && (vers_data & VERSYM_VERSION) > max_vd_ndx)
11461 return _("<corrupt>");
11462 }
11463 return NULL;
11464 }
11465
11466 /* Dump the symbol table. */
11467 static bfd_boolean
11468 process_symbol_table (Filedata * filedata)
11469 {
11470 Elf_Internal_Shdr * section;
11471 bfd_size_type nbuckets = 0;
11472 bfd_size_type nchains = 0;
11473 bfd_vma * buckets = NULL;
11474 bfd_vma * chains = NULL;
11475 bfd_vma ngnubuckets = 0;
11476 bfd_vma * gnubuckets = NULL;
11477 bfd_vma * gnuchains = NULL;
11478 bfd_vma gnusymidx = 0;
11479 bfd_size_type ngnuchains = 0;
11480
11481 if (!do_syms && !do_dyn_syms && !do_histogram)
11482 return TRUE;
11483
11484 if (dynamic_info[DT_HASH]
11485 && (do_histogram
11486 || (do_using_dynamic
11487 && !do_dyn_syms
11488 && dynamic_strings != NULL)))
11489 {
11490 unsigned char nb[8];
11491 unsigned char nc[8];
11492 unsigned int hash_ent_size = 4;
11493
11494 if ((filedata->file_header.e_machine == EM_ALPHA
11495 || filedata->file_header.e_machine == EM_S390
11496 || filedata->file_header.e_machine == EM_S390_OLD)
11497 && filedata->file_header.e_ident[EI_CLASS] == ELFCLASS64)
11498 hash_ent_size = 8;
11499
11500 if (fseek (filedata->handle,
11501 (archive_file_offset
11502 + offset_from_vma (filedata, dynamic_info[DT_HASH],
11503 sizeof nb + sizeof nc)),
11504 SEEK_SET))
11505 {
11506 error (_("Unable to seek to start of dynamic information\n"));
11507 goto no_hash;
11508 }
11509
11510 if (fread (nb, hash_ent_size, 1, filedata->handle) != 1)
11511 {
11512 error (_("Failed to read in number of buckets\n"));
11513 goto no_hash;
11514 }
11515
11516 if (fread (nc, hash_ent_size, 1, filedata->handle) != 1)
11517 {
11518 error (_("Failed to read in number of chains\n"));
11519 goto no_hash;
11520 }
11521
11522 nbuckets = byte_get (nb, hash_ent_size);
11523 nchains = byte_get (nc, hash_ent_size);
11524
11525 buckets = get_dynamic_data (filedata, nbuckets, hash_ent_size);
11526 chains = get_dynamic_data (filedata, nchains, hash_ent_size);
11527
11528 no_hash:
11529 if (buckets == NULL || chains == NULL)
11530 {
11531 if (do_using_dynamic)
11532 return FALSE;
11533 free (buckets);
11534 free (chains);
11535 buckets = NULL;
11536 chains = NULL;
11537 nbuckets = 0;
11538 nchains = 0;
11539 }
11540 }
11541
11542 if (dynamic_info_DT_GNU_HASH
11543 && (do_histogram
11544 || (do_using_dynamic
11545 && !do_dyn_syms
11546 && dynamic_strings != NULL)))
11547 {
11548 unsigned char nb[16];
11549 bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
11550 bfd_vma buckets_vma;
11551
11552 if (fseek (filedata->handle,
11553 (archive_file_offset
11554 + offset_from_vma (filedata, dynamic_info_DT_GNU_HASH,
11555 sizeof nb)),
11556 SEEK_SET))
11557 {
11558 error (_("Unable to seek to start of dynamic information\n"));
11559 goto no_gnu_hash;
11560 }
11561
11562 if (fread (nb, 16, 1, filedata->handle) != 1)
11563 {
11564 error (_("Failed to read in number of buckets\n"));
11565 goto no_gnu_hash;
11566 }
11567
11568 ngnubuckets = byte_get (nb, 4);
11569 gnusymidx = byte_get (nb + 4, 4);
11570 bitmaskwords = byte_get (nb + 8, 4);
11571 buckets_vma = dynamic_info_DT_GNU_HASH + 16;
11572 if (is_32bit_elf)
11573 buckets_vma += bitmaskwords * 4;
11574 else
11575 buckets_vma += bitmaskwords * 8;
11576
11577 if (fseek (filedata->handle,
11578 (archive_file_offset
11579 + offset_from_vma (filedata, buckets_vma, 4)),
11580 SEEK_SET))
11581 {
11582 error (_("Unable to seek to start of dynamic information\n"));
11583 goto no_gnu_hash;
11584 }
11585
11586 gnubuckets = get_dynamic_data (filedata, ngnubuckets, 4);
11587
11588 if (gnubuckets == NULL)
11589 goto no_gnu_hash;
11590
11591 for (i = 0; i < ngnubuckets; i++)
11592 if (gnubuckets[i] != 0)
11593 {
11594 if (gnubuckets[i] < gnusymidx)
11595 return FALSE;
11596
11597 if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
11598 maxchain = gnubuckets[i];
11599 }
11600
11601 if (maxchain == 0xffffffff)
11602 goto no_gnu_hash;
11603
11604 maxchain -= gnusymidx;
11605
11606 if (fseek (filedata->handle,
11607 (archive_file_offset
11608 + offset_from_vma (filedata, buckets_vma
11609 + 4 * (ngnubuckets + maxchain), 4)),
11610 SEEK_SET))
11611 {
11612 error (_("Unable to seek to start of dynamic information\n"));
11613 goto no_gnu_hash;
11614 }
11615
11616 do
11617 {
11618 if (fread (nb, 4, 1, filedata->handle) != 1)
11619 {
11620 error (_("Failed to determine last chain length\n"));
11621 goto no_gnu_hash;
11622 }
11623
11624 if (maxchain + 1 == 0)
11625 goto no_gnu_hash;
11626
11627 ++maxchain;
11628 }
11629 while ((byte_get (nb, 4) & 1) == 0);
11630
11631 if (fseek (filedata->handle,
11632 (archive_file_offset
11633 + offset_from_vma (filedata, buckets_vma + 4 * ngnubuckets, 4)),
11634 SEEK_SET))
11635 {
11636 error (_("Unable to seek to start of dynamic information\n"));
11637 goto no_gnu_hash;
11638 }
11639
11640 gnuchains = get_dynamic_data (filedata, maxchain, 4);
11641 ngnuchains = maxchain;
11642
11643 no_gnu_hash:
11644 if (gnuchains == NULL)
11645 {
11646 free (gnubuckets);
11647 gnubuckets = NULL;
11648 ngnubuckets = 0;
11649 if (do_using_dynamic)
11650 return FALSE;
11651 }
11652 }
11653
11654 if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
11655 && do_syms
11656 && do_using_dynamic
11657 && dynamic_strings != NULL
11658 && dynamic_symbols != NULL)
11659 {
11660 unsigned long hn;
11661
11662 if (dynamic_info[DT_HASH])
11663 {
11664 bfd_vma si;
11665 char *visited;
11666
11667 printf (_("\nSymbol table for image:\n"));
11668 if (is_32bit_elf)
11669 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11670 else
11671 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11672
11673 visited = xcmalloc (nchains, 1);
11674 memset (visited, 0, nchains);
11675 for (hn = 0; hn < nbuckets; hn++)
11676 {
11677 for (si = buckets[hn]; si > 0; si = chains[si])
11678 {
11679 print_dynamic_symbol (filedata, si, hn);
11680 if (si >= nchains || visited[si])
11681 {
11682 error (_("histogram chain is corrupt\n"));
11683 break;
11684 }
11685 visited[si] = 1;
11686 }
11687 }
11688 free (visited);
11689 }
11690
11691 if (dynamic_info_DT_GNU_HASH)
11692 {
11693 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
11694 if (is_32bit_elf)
11695 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11696 else
11697 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11698
11699 for (hn = 0; hn < ngnubuckets; ++hn)
11700 if (gnubuckets[hn] != 0)
11701 {
11702 bfd_vma si = gnubuckets[hn];
11703 bfd_vma off = si - gnusymidx;
11704
11705 do
11706 {
11707 print_dynamic_symbol (filedata, si, hn);
11708 si++;
11709 }
11710 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
11711 }
11712 }
11713 }
11714 else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
11715 && filedata->section_headers != NULL)
11716 {
11717 unsigned int i;
11718
11719 for (i = 0, section = filedata->section_headers;
11720 i < filedata->file_header.e_shnum;
11721 i++, section++)
11722 {
11723 unsigned int si;
11724 char * strtab = NULL;
11725 unsigned long int strtab_size = 0;
11726 Elf_Internal_Sym * symtab;
11727 Elf_Internal_Sym * psym;
11728 unsigned long num_syms;
11729
11730 if ((section->sh_type != SHT_SYMTAB
11731 && section->sh_type != SHT_DYNSYM)
11732 || (!do_syms
11733 && section->sh_type == SHT_SYMTAB))
11734 continue;
11735
11736 if (section->sh_entsize == 0)
11737 {
11738 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
11739 printable_section_name (filedata, section));
11740 continue;
11741 }
11742
11743 num_syms = section->sh_size / section->sh_entsize;
11744 printf (ngettext ("\nSymbol table '%s' contains %lu entry:\n",
11745 "\nSymbol table '%s' contains %lu entries:\n",
11746 num_syms),
11747 printable_section_name (filedata, section),
11748 num_syms);
11749
11750 if (is_32bit_elf)
11751 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
11752 else
11753 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
11754
11755 symtab = GET_ELF_SYMBOLS (filedata, section, & num_syms);
11756 if (symtab == NULL)
11757 continue;
11758
11759 if (section->sh_link == filedata->file_header.e_shstrndx)
11760 {
11761 strtab = filedata->string_table;
11762 strtab_size = filedata->string_table_length;
11763 }
11764 else if (section->sh_link < filedata->file_header.e_shnum)
11765 {
11766 Elf_Internal_Shdr * string_sec;
11767
11768 string_sec = filedata->section_headers + section->sh_link;
11769
11770 strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset,
11771 1, string_sec->sh_size,
11772 _("string table"));
11773 strtab_size = strtab != NULL ? string_sec->sh_size : 0;
11774 }
11775
11776 for (si = 0, psym = symtab; si < num_syms; si++, psym++)
11777 {
11778 const char *version_string;
11779 enum versioned_symbol_info sym_info;
11780 unsigned short vna_other;
11781
11782 printf ("%6d: ", si);
11783 print_vma (psym->st_value, LONG_HEX);
11784 putchar (' ');
11785 print_vma (psym->st_size, DEC_5);
11786 printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
11787 printf (" %-6s", get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
11788 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11789 printf (" %-7s", get_solaris_symbol_visibility (psym->st_other));
11790 else
11791 {
11792 unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11793
11794 printf (" %-7s", get_symbol_visibility (vis));
11795 /* Check to see if any other bits in the st_other field are set.
11796 Note - displaying this information disrupts the layout of the
11797 table being generated, but for the moment this case is very rare. */
11798 if (psym->st_other ^ vis)
11799 printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
11800 }
11801 printf (" %4s ", get_symbol_index_type (filedata, psym->st_shndx));
11802 print_symbol (25, psym->st_name < strtab_size
11803 ? strtab + psym->st_name : _("<corrupt>"));
11804
11805 version_string
11806 = get_symbol_version_string (filedata,
11807 section->sh_type == SHT_DYNSYM,
11808 strtab, strtab_size, si,
11809 psym, &sym_info, &vna_other);
11810 if (version_string)
11811 {
11812 if (sym_info == symbol_undefined)
11813 printf ("@%s (%d)", version_string, vna_other);
11814 else
11815 printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
11816 version_string);
11817 }
11818
11819 putchar ('\n');
11820
11821 if (ELF_ST_BIND (psym->st_info) == STB_LOCAL
11822 && si >= section->sh_info
11823 /* Irix 5 and 6 MIPS binaries are known to ignore this requirement. */
11824 && filedata->file_header.e_machine != EM_MIPS
11825 /* Solaris binaries have been found to violate this requirement as
11826 well. Not sure if this is a bug or an ABI requirement. */
11827 && filedata->file_header.e_ident[EI_OSABI] != ELFOSABI_SOLARIS)
11828 warn (_("local symbol %u found at index >= %s's sh_info value of %u\n"),
11829 si, printable_section_name (filedata, section), section->sh_info);
11830 }
11831
11832 free (symtab);
11833 if (strtab != filedata->string_table)
11834 free (strtab);
11835 }
11836 }
11837 else if (do_syms)
11838 printf
11839 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
11840
11841 if (do_histogram && buckets != NULL)
11842 {
11843 unsigned long * lengths;
11844 unsigned long * counts;
11845 unsigned long hn;
11846 bfd_vma si;
11847 unsigned long maxlength = 0;
11848 unsigned long nzero_counts = 0;
11849 unsigned long nsyms = 0;
11850 char *visited;
11851
11852 printf (ngettext ("\nHistogram for bucket list length "
11853 "(total of %lu bucket):\n",
11854 "\nHistogram for bucket list length "
11855 "(total of %lu buckets):\n",
11856 (unsigned long) nbuckets),
11857 (unsigned long) nbuckets);
11858
11859 lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
11860 if (lengths == NULL)
11861 {
11862 error (_("Out of memory allocating space for histogram buckets\n"));
11863 return FALSE;
11864 }
11865 visited = xcmalloc (nchains, 1);
11866 memset (visited, 0, nchains);
11867
11868 printf (_(" Length Number %% of total Coverage\n"));
11869 for (hn = 0; hn < nbuckets; ++hn)
11870 {
11871 for (si = buckets[hn]; si > 0; si = chains[si])
11872 {
11873 ++nsyms;
11874 if (maxlength < ++lengths[hn])
11875 ++maxlength;
11876 if (si >= nchains || visited[si])
11877 {
11878 error (_("histogram chain is corrupt\n"));
11879 break;
11880 }
11881 visited[si] = 1;
11882 }
11883 }
11884 free (visited);
11885
11886 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11887 if (counts == NULL)
11888 {
11889 free (lengths);
11890 error (_("Out of memory allocating space for histogram counts\n"));
11891 return FALSE;
11892 }
11893
11894 for (hn = 0; hn < nbuckets; ++hn)
11895 ++counts[lengths[hn]];
11896
11897 if (nbuckets > 0)
11898 {
11899 unsigned long i;
11900 printf (" 0 %-10lu (%5.1f%%)\n",
11901 counts[0], (counts[0] * 100.0) / nbuckets);
11902 for (i = 1; i <= maxlength; ++i)
11903 {
11904 nzero_counts += counts[i] * i;
11905 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11906 i, counts[i], (counts[i] * 100.0) / nbuckets,
11907 (nzero_counts * 100.0) / nsyms);
11908 }
11909 }
11910
11911 free (counts);
11912 free (lengths);
11913 }
11914
11915 if (buckets != NULL)
11916 {
11917 free (buckets);
11918 free (chains);
11919 }
11920
11921 if (do_histogram && gnubuckets != NULL)
11922 {
11923 unsigned long * lengths;
11924 unsigned long * counts;
11925 unsigned long hn;
11926 unsigned long maxlength = 0;
11927 unsigned long nzero_counts = 0;
11928 unsigned long nsyms = 0;
11929
11930 printf (ngettext ("\nHistogram for `.gnu.hash' bucket list length "
11931 "(total of %lu bucket):\n",
11932 "\nHistogram for `.gnu.hash' bucket list length "
11933 "(total of %lu buckets):\n",
11934 (unsigned long) ngnubuckets),
11935 (unsigned long) ngnubuckets);
11936
11937 lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
11938 if (lengths == NULL)
11939 {
11940 error (_("Out of memory allocating space for gnu histogram buckets\n"));
11941 return FALSE;
11942 }
11943
11944 printf (_(" Length Number %% of total Coverage\n"));
11945
11946 for (hn = 0; hn < ngnubuckets; ++hn)
11947 if (gnubuckets[hn] != 0)
11948 {
11949 bfd_vma off, length = 1;
11950
11951 for (off = gnubuckets[hn] - gnusymidx;
11952 /* PR 17531 file: 010-77222-0.004. */
11953 off < ngnuchains && (gnuchains[off] & 1) == 0;
11954 ++off)
11955 ++length;
11956 lengths[hn] = length;
11957 if (length > maxlength)
11958 maxlength = length;
11959 nsyms += length;
11960 }
11961
11962 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11963 if (counts == NULL)
11964 {
11965 free (lengths);
11966 error (_("Out of memory allocating space for gnu histogram counts\n"));
11967 return FALSE;
11968 }
11969
11970 for (hn = 0; hn < ngnubuckets; ++hn)
11971 ++counts[lengths[hn]];
11972
11973 if (ngnubuckets > 0)
11974 {
11975 unsigned long j;
11976 printf (" 0 %-10lu (%5.1f%%)\n",
11977 counts[0], (counts[0] * 100.0) / ngnubuckets);
11978 for (j = 1; j <= maxlength; ++j)
11979 {
11980 nzero_counts += counts[j] * j;
11981 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11982 j, counts[j], (counts[j] * 100.0) / ngnubuckets,
11983 (nzero_counts * 100.0) / nsyms);
11984 }
11985 }
11986
11987 free (counts);
11988 free (lengths);
11989 free (gnubuckets);
11990 free (gnuchains);
11991 }
11992
11993 return TRUE;
11994 }
11995
11996 static bfd_boolean
11997 process_syminfo (Filedata * filedata ATTRIBUTE_UNUSED)
11998 {
11999 unsigned int i;
12000
12001 if (dynamic_syminfo == NULL
12002 || !do_dynamic)
12003 /* No syminfo, this is ok. */
12004 return TRUE;
12005
12006 /* There better should be a dynamic symbol section. */
12007 if (dynamic_symbols == NULL || dynamic_strings == NULL)
12008 return FALSE;
12009
12010 if (dynamic_addr)
12011 printf (ngettext ("\nDynamic info segment at offset 0x%lx "
12012 "contains %d entry:\n",
12013 "\nDynamic info segment at offset 0x%lx "
12014 "contains %d entries:\n",
12015 dynamic_syminfo_nent),
12016 dynamic_syminfo_offset, dynamic_syminfo_nent);
12017
12018 printf (_(" Num: Name BoundTo Flags\n"));
12019 for (i = 0; i < dynamic_syminfo_nent; ++i)
12020 {
12021 unsigned short int flags = dynamic_syminfo[i].si_flags;
12022
12023 printf ("%4d: ", i);
12024 if (i >= num_dynamic_syms)
12025 printf (_("<corrupt index>"));
12026 else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
12027 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
12028 else
12029 printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
12030 putchar (' ');
12031
12032 switch (dynamic_syminfo[i].si_boundto)
12033 {
12034 case SYMINFO_BT_SELF:
12035 fputs ("SELF ", stdout);
12036 break;
12037 case SYMINFO_BT_PARENT:
12038 fputs ("PARENT ", stdout);
12039 break;
12040 default:
12041 if (dynamic_syminfo[i].si_boundto > 0
12042 && dynamic_syminfo[i].si_boundto < dynamic_nent
12043 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
12044 {
12045 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
12046 putchar (' ' );
12047 }
12048 else
12049 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
12050 break;
12051 }
12052
12053 if (flags & SYMINFO_FLG_DIRECT)
12054 printf (" DIRECT");
12055 if (flags & SYMINFO_FLG_PASSTHRU)
12056 printf (" PASSTHRU");
12057 if (flags & SYMINFO_FLG_COPY)
12058 printf (" COPY");
12059 if (flags & SYMINFO_FLG_LAZYLOAD)
12060 printf (" LAZYLOAD");
12061
12062 puts ("");
12063 }
12064
12065 return TRUE;
12066 }
12067
12068 #define IN_RANGE(START,END,ADDR,OFF) \
12069 (((ADDR) >= (START)) && ((ADDR) + (OFF) < (END)))
12070
12071 /* Check to see if the given reloc needs to be handled in a target specific
12072 manner. If so then process the reloc and return TRUE otherwise return
12073 FALSE.
12074
12075 If called with reloc == NULL, then this is a signal that reloc processing
12076 for the current section has finished, and any saved state should be
12077 discarded. */
12078
12079 static bfd_boolean
12080 target_specific_reloc_handling (Filedata * filedata,
12081 Elf_Internal_Rela * reloc,
12082 unsigned char * start,
12083 unsigned char * end,
12084 Elf_Internal_Sym * symtab,
12085 unsigned long num_syms)
12086 {
12087 unsigned int reloc_type = 0;
12088 unsigned long sym_index = 0;
12089
12090 if (reloc)
12091 {
12092 reloc_type = get_reloc_type (filedata, reloc->r_info);
12093 sym_index = get_reloc_symindex (reloc->r_info);
12094 }
12095
12096 switch (filedata->file_header.e_machine)
12097 {
12098 case EM_MSP430:
12099 case EM_MSP430_OLD:
12100 {
12101 static Elf_Internal_Sym * saved_sym = NULL;
12102
12103 if (reloc == NULL)
12104 {
12105 saved_sym = NULL;
12106 return TRUE;
12107 }
12108
12109 switch (reloc_type)
12110 {
12111 case 10: /* R_MSP430_SYM_DIFF */
12112 if (uses_msp430x_relocs (filedata))
12113 break;
12114 /* Fall through. */
12115 case 21: /* R_MSP430X_SYM_DIFF */
12116 /* PR 21139. */
12117 if (sym_index >= num_syms)
12118 error (_("MSP430 SYM_DIFF reloc contains invalid symbol index %lu\n"),
12119 sym_index);
12120 else
12121 saved_sym = symtab + sym_index;
12122 return TRUE;
12123
12124 case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
12125 case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
12126 goto handle_sym_diff;
12127
12128 case 5: /* R_MSP430_16_BYTE */
12129 case 9: /* R_MSP430_8 */
12130 if (uses_msp430x_relocs (filedata))
12131 break;
12132 goto handle_sym_diff;
12133
12134 case 2: /* R_MSP430_ABS16 */
12135 case 15: /* R_MSP430X_ABS16 */
12136 if (! uses_msp430x_relocs (filedata))
12137 break;
12138 goto handle_sym_diff;
12139
12140 handle_sym_diff:
12141 if (saved_sym != NULL)
12142 {
12143 int reloc_size = reloc_type == 1 ? 4 : 2;
12144 bfd_vma value;
12145
12146 if (sym_index >= num_syms)
12147 error (_("MSP430 reloc contains invalid symbol index %lu\n"),
12148 sym_index);
12149 else
12150 {
12151 value = reloc->r_addend + (symtab[sym_index].st_value
12152 - saved_sym->st_value);
12153
12154 if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
12155 byte_put (start + reloc->r_offset, value, reloc_size);
12156 else
12157 /* PR 21137 */
12158 error (_("MSP430 sym diff reloc contains invalid offset: 0x%lx\n"),
12159 (long) reloc->r_offset);
12160 }
12161
12162 saved_sym = NULL;
12163 return TRUE;
12164 }
12165 break;
12166
12167 default:
12168 if (saved_sym != NULL)
12169 error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
12170 break;
12171 }
12172 break;
12173 }
12174
12175 case EM_MN10300:
12176 case EM_CYGNUS_MN10300:
12177 {
12178 static Elf_Internal_Sym * saved_sym = NULL;
12179
12180 if (reloc == NULL)
12181 {
12182 saved_sym = NULL;
12183 return TRUE;
12184 }
12185
12186 switch (reloc_type)
12187 {
12188 case 34: /* R_MN10300_ALIGN */
12189 return TRUE;
12190 case 33: /* R_MN10300_SYM_DIFF */
12191 if (sym_index >= num_syms)
12192 error (_("MN10300_SYM_DIFF reloc contains invalid symbol index %lu\n"),
12193 sym_index);
12194 else
12195 saved_sym = symtab + sym_index;
12196 return TRUE;
12197
12198 case 1: /* R_MN10300_32 */
12199 case 2: /* R_MN10300_16 */
12200 if (saved_sym != NULL)
12201 {
12202 int reloc_size = reloc_type == 1 ? 4 : 2;
12203 bfd_vma value;
12204
12205 if (sym_index >= num_syms)
12206 error (_("MN10300 reloc contains invalid symbol index %lu\n"),
12207 sym_index);
12208 else
12209 {
12210 value = reloc->r_addend + (symtab[sym_index].st_value
12211 - saved_sym->st_value);
12212
12213 if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
12214 byte_put (start + reloc->r_offset, value, reloc_size);
12215 else
12216 error (_("MN10300 sym diff reloc contains invalid offset: 0x%lx\n"),
12217 (long) reloc->r_offset);
12218 }
12219
12220 saved_sym = NULL;
12221 return TRUE;
12222 }
12223 break;
12224 default:
12225 if (saved_sym != NULL)
12226 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
12227 break;
12228 }
12229 break;
12230 }
12231
12232 case EM_RL78:
12233 {
12234 static bfd_vma saved_sym1 = 0;
12235 static bfd_vma saved_sym2 = 0;
12236 static bfd_vma value;
12237
12238 if (reloc == NULL)
12239 {
12240 saved_sym1 = saved_sym2 = 0;
12241 return TRUE;
12242 }
12243
12244 switch (reloc_type)
12245 {
12246 case 0x80: /* R_RL78_SYM. */
12247 saved_sym1 = saved_sym2;
12248 if (sym_index >= num_syms)
12249 error (_("RL78_SYM reloc contains invalid symbol index %lu\n"),
12250 sym_index);
12251 else
12252 {
12253 saved_sym2 = symtab[sym_index].st_value;
12254 saved_sym2 += reloc->r_addend;
12255 }
12256 return TRUE;
12257
12258 case 0x83: /* R_RL78_OPsub. */
12259 value = saved_sym1 - saved_sym2;
12260 saved_sym2 = saved_sym1 = 0;
12261 return TRUE;
12262 break;
12263
12264 case 0x41: /* R_RL78_ABS32. */
12265 if (IN_RANGE (start, end, start + reloc->r_offset, 4))
12266 byte_put (start + reloc->r_offset, value, 4);
12267 else
12268 error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12269 (long) reloc->r_offset);
12270 value = 0;
12271 return TRUE;
12272
12273 case 0x43: /* R_RL78_ABS16. */
12274 if (IN_RANGE (start, end, start + reloc->r_offset, 2))
12275 byte_put (start + reloc->r_offset, value, 2);
12276 else
12277 error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12278 (long) reloc->r_offset);
12279 value = 0;
12280 return TRUE;
12281
12282 default:
12283 break;
12284 }
12285 break;
12286 }
12287 }
12288
12289 return FALSE;
12290 }
12291
12292 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
12293 DWARF debug sections. This is a target specific test. Note - we do not
12294 go through the whole including-target-headers-multiple-times route, (as
12295 we have already done with <elf/h8.h>) because this would become very
12296 messy and even then this function would have to contain target specific
12297 information (the names of the relocs instead of their numeric values).
12298 FIXME: This is not the correct way to solve this problem. The proper way
12299 is to have target specific reloc sizing and typing functions created by
12300 the reloc-macros.h header, in the same way that it already creates the
12301 reloc naming functions. */
12302
12303 static bfd_boolean
12304 is_32bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12305 {
12306 /* Please keep this table alpha-sorted for ease of visual lookup. */
12307 switch (filedata->file_header.e_machine)
12308 {
12309 case EM_386:
12310 case EM_IAMCU:
12311 return reloc_type == 1; /* R_386_32. */
12312 case EM_68K:
12313 return reloc_type == 1; /* R_68K_32. */
12314 case EM_860:
12315 return reloc_type == 1; /* R_860_32. */
12316 case EM_960:
12317 return reloc_type == 2; /* R_960_32. */
12318 case EM_AARCH64:
12319 return (reloc_type == 258
12320 || reloc_type == 1); /* R_AARCH64_ABS32 || R_AARCH64_P32_ABS32 */
12321 case EM_ADAPTEVA_EPIPHANY:
12322 return reloc_type == 3;
12323 case EM_ALPHA:
12324 return reloc_type == 1; /* R_ALPHA_REFLONG. */
12325 case EM_ARC:
12326 return reloc_type == 1; /* R_ARC_32. */
12327 case EM_ARC_COMPACT:
12328 case EM_ARC_COMPACT2:
12329 return reloc_type == 4; /* R_ARC_32. */
12330 case EM_ARM:
12331 return reloc_type == 2; /* R_ARM_ABS32 */
12332 case EM_AVR_OLD:
12333 case EM_AVR:
12334 return reloc_type == 1;
12335 case EM_BLACKFIN:
12336 return reloc_type == 0x12; /* R_byte4_data. */
12337 case EM_CRIS:
12338 return reloc_type == 3; /* R_CRIS_32. */
12339 case EM_CR16:
12340 return reloc_type == 3; /* R_CR16_NUM32. */
12341 case EM_CRX:
12342 return reloc_type == 15; /* R_CRX_NUM32. */
12343 case EM_CSKY:
12344 return reloc_type == 1; /* R_CKCORE_ADDR32. */
12345 case EM_CYGNUS_FRV:
12346 return reloc_type == 1;
12347 case EM_CYGNUS_D10V:
12348 case EM_D10V:
12349 return reloc_type == 6; /* R_D10V_32. */
12350 case EM_CYGNUS_D30V:
12351 case EM_D30V:
12352 return reloc_type == 12; /* R_D30V_32_NORMAL. */
12353 case EM_DLX:
12354 return reloc_type == 3; /* R_DLX_RELOC_32. */
12355 case EM_CYGNUS_FR30:
12356 case EM_FR30:
12357 return reloc_type == 3; /* R_FR30_32. */
12358 case EM_FT32:
12359 return reloc_type == 1; /* R_FT32_32. */
12360 case EM_H8S:
12361 case EM_H8_300:
12362 case EM_H8_300H:
12363 return reloc_type == 1; /* R_H8_DIR32. */
12364 case EM_IA_64:
12365 return (reloc_type == 0x64 /* R_IA64_SECREL32MSB. */
12366 || reloc_type == 0x65 /* R_IA64_SECREL32LSB. */
12367 || reloc_type == 0x24 /* R_IA64_DIR32MSB. */
12368 || reloc_type == 0x25 /* R_IA64_DIR32LSB. */);
12369 case EM_IP2K_OLD:
12370 case EM_IP2K:
12371 return reloc_type == 2; /* R_IP2K_32. */
12372 case EM_IQ2000:
12373 return reloc_type == 2; /* R_IQ2000_32. */
12374 case EM_LATTICEMICO32:
12375 return reloc_type == 3; /* R_LM32_32. */
12376 case EM_M32C_OLD:
12377 case EM_M32C:
12378 return reloc_type == 3; /* R_M32C_32. */
12379 case EM_M32R:
12380 return reloc_type == 34; /* R_M32R_32_RELA. */
12381 case EM_68HC11:
12382 case EM_68HC12:
12383 return reloc_type == 6; /* R_M68HC11_32. */
12384 case EM_S12Z:
12385 return reloc_type == 6; /* R_S12Z_EXT32. */
12386 case EM_MCORE:
12387 return reloc_type == 1; /* R_MCORE_ADDR32. */
12388 case EM_CYGNUS_MEP:
12389 return reloc_type == 4; /* R_MEP_32. */
12390 case EM_METAG:
12391 return reloc_type == 2; /* R_METAG_ADDR32. */
12392 case EM_MICROBLAZE:
12393 return reloc_type == 1; /* R_MICROBLAZE_32. */
12394 case EM_MIPS:
12395 return reloc_type == 2; /* R_MIPS_32. */
12396 case EM_MMIX:
12397 return reloc_type == 4; /* R_MMIX_32. */
12398 case EM_CYGNUS_MN10200:
12399 case EM_MN10200:
12400 return reloc_type == 1; /* R_MN10200_32. */
12401 case EM_CYGNUS_MN10300:
12402 case EM_MN10300:
12403 return reloc_type == 1; /* R_MN10300_32. */
12404 case EM_MOXIE:
12405 return reloc_type == 1; /* R_MOXIE_32. */
12406 case EM_MSP430_OLD:
12407 case EM_MSP430:
12408 return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32. */
12409 case EM_MT:
12410 return reloc_type == 2; /* R_MT_32. */
12411 case EM_NDS32:
12412 return reloc_type == 20; /* R_NDS32_RELA. */
12413 case EM_ALTERA_NIOS2:
12414 return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32. */
12415 case EM_NIOS32:
12416 return reloc_type == 1; /* R_NIOS_32. */
12417 case EM_OR1K:
12418 return reloc_type == 1; /* R_OR1K_32. */
12419 case EM_PARISC:
12420 return (reloc_type == 1 /* R_PARISC_DIR32. */
12421 || reloc_type == 2 /* R_PARISC_DIR21L. */
12422 || reloc_type == 41); /* R_PARISC_SECREL32. */
12423 case EM_PJ:
12424 case EM_PJ_OLD:
12425 return reloc_type == 1; /* R_PJ_DATA_DIR32. */
12426 case EM_PPC64:
12427 return reloc_type == 1; /* R_PPC64_ADDR32. */
12428 case EM_PPC:
12429 return reloc_type == 1; /* R_PPC_ADDR32. */
12430 case EM_TI_PRU:
12431 return reloc_type == 11; /* R_PRU_BFD_RELOC_32. */
12432 case EM_RISCV:
12433 return reloc_type == 1; /* R_RISCV_32. */
12434 case EM_RL78:
12435 return reloc_type == 1; /* R_RL78_DIR32. */
12436 case EM_RX:
12437 return reloc_type == 1; /* R_RX_DIR32. */
12438 case EM_S370:
12439 return reloc_type == 1; /* R_I370_ADDR31. */
12440 case EM_S390_OLD:
12441 case EM_S390:
12442 return reloc_type == 4; /* R_S390_32. */
12443 case EM_SCORE:
12444 return reloc_type == 8; /* R_SCORE_ABS32. */
12445 case EM_SH:
12446 return reloc_type == 1; /* R_SH_DIR32. */
12447 case EM_SPARC32PLUS:
12448 case EM_SPARCV9:
12449 case EM_SPARC:
12450 return reloc_type == 3 /* R_SPARC_32. */
12451 || reloc_type == 23; /* R_SPARC_UA32. */
12452 case EM_SPU:
12453 return reloc_type == 6; /* R_SPU_ADDR32 */
12454 case EM_TI_C6000:
12455 return reloc_type == 1; /* R_C6000_ABS32. */
12456 case EM_TILEGX:
12457 return reloc_type == 2; /* R_TILEGX_32. */
12458 case EM_TILEPRO:
12459 return reloc_type == 1; /* R_TILEPRO_32. */
12460 case EM_CYGNUS_V850:
12461 case EM_V850:
12462 return reloc_type == 6; /* R_V850_ABS32. */
12463 case EM_V800:
12464 return reloc_type == 0x33; /* R_V810_WORD. */
12465 case EM_VAX:
12466 return reloc_type == 1; /* R_VAX_32. */
12467 case EM_VISIUM:
12468 return reloc_type == 3; /* R_VISIUM_32. */
12469 case EM_WEBASSEMBLY:
12470 return reloc_type == 1; /* R_WASM32_32. */
12471 case EM_X86_64:
12472 case EM_L1OM:
12473 case EM_K1OM:
12474 return reloc_type == 10; /* R_X86_64_32. */
12475 case EM_XC16X:
12476 case EM_C166:
12477 return reloc_type == 3; /* R_XC16C_ABS_32. */
12478 case EM_XGATE:
12479 return reloc_type == 4; /* R_XGATE_32. */
12480 case EM_XSTORMY16:
12481 return reloc_type == 1; /* R_XSTROMY16_32. */
12482 case EM_XTENSA_OLD:
12483 case EM_XTENSA:
12484 return reloc_type == 1; /* R_XTENSA_32. */
12485 default:
12486 {
12487 static unsigned int prev_warn = 0;
12488
12489 /* Avoid repeating the same warning multiple times. */
12490 if (prev_warn != filedata->file_header.e_machine)
12491 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
12492 filedata->file_header.e_machine);
12493 prev_warn = filedata->file_header.e_machine;
12494 return FALSE;
12495 }
12496 }
12497 }
12498
12499 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12500 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
12501
12502 static bfd_boolean
12503 is_32bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
12504 {
12505 switch (filedata->file_header.e_machine)
12506 /* Please keep this table alpha-sorted for ease of visual lookup. */
12507 {
12508 case EM_386:
12509 case EM_IAMCU:
12510 return reloc_type == 2; /* R_386_PC32. */
12511 case EM_68K:
12512 return reloc_type == 4; /* R_68K_PC32. */
12513 case EM_AARCH64:
12514 return reloc_type == 261; /* R_AARCH64_PREL32 */
12515 case EM_ADAPTEVA_EPIPHANY:
12516 return reloc_type == 6;
12517 case EM_ALPHA:
12518 return reloc_type == 10; /* R_ALPHA_SREL32. */
12519 case EM_ARC_COMPACT:
12520 case EM_ARC_COMPACT2:
12521 return reloc_type == 49; /* R_ARC_32_PCREL. */
12522 case EM_ARM:
12523 return reloc_type == 3; /* R_ARM_REL32 */
12524 case EM_AVR_OLD:
12525 case EM_AVR:
12526 return reloc_type == 36; /* R_AVR_32_PCREL. */
12527 case EM_MICROBLAZE:
12528 return reloc_type == 2; /* R_MICROBLAZE_32_PCREL. */
12529 case EM_OR1K:
12530 return reloc_type == 9; /* R_OR1K_32_PCREL. */
12531 case EM_PARISC:
12532 return reloc_type == 9; /* R_PARISC_PCREL32. */
12533 case EM_PPC:
12534 return reloc_type == 26; /* R_PPC_REL32. */
12535 case EM_PPC64:
12536 return reloc_type == 26; /* R_PPC64_REL32. */
12537 case EM_S390_OLD:
12538 case EM_S390:
12539 return reloc_type == 5; /* R_390_PC32. */
12540 case EM_SH:
12541 return reloc_type == 2; /* R_SH_REL32. */
12542 case EM_SPARC32PLUS:
12543 case EM_SPARCV9:
12544 case EM_SPARC:
12545 return reloc_type == 6; /* R_SPARC_DISP32. */
12546 case EM_SPU:
12547 return reloc_type == 13; /* R_SPU_REL32. */
12548 case EM_TILEGX:
12549 return reloc_type == 6; /* R_TILEGX_32_PCREL. */
12550 case EM_TILEPRO:
12551 return reloc_type == 4; /* R_TILEPRO_32_PCREL. */
12552 case EM_VISIUM:
12553 return reloc_type == 6; /* R_VISIUM_32_PCREL */
12554 case EM_X86_64:
12555 case EM_L1OM:
12556 case EM_K1OM:
12557 return reloc_type == 2; /* R_X86_64_PC32. */
12558 case EM_XTENSA_OLD:
12559 case EM_XTENSA:
12560 return reloc_type == 14; /* R_XTENSA_32_PCREL. */
12561 default:
12562 /* Do not abort or issue an error message here. Not all targets use
12563 pc-relative 32-bit relocs in their DWARF debug information and we
12564 have already tested for target coverage in is_32bit_abs_reloc. A
12565 more helpful warning message will be generated by apply_relocations
12566 anyway, so just return. */
12567 return FALSE;
12568 }
12569 }
12570
12571 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12572 a 64-bit absolute RELA relocation used in DWARF debug sections. */
12573
12574 static bfd_boolean
12575 is_64bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12576 {
12577 switch (filedata->file_header.e_machine)
12578 {
12579 case EM_AARCH64:
12580 return reloc_type == 257; /* R_AARCH64_ABS64. */
12581 case EM_ALPHA:
12582 return reloc_type == 2; /* R_ALPHA_REFQUAD. */
12583 case EM_IA_64:
12584 return (reloc_type == 0x26 /* R_IA64_DIR64MSB. */
12585 || reloc_type == 0x27 /* R_IA64_DIR64LSB. */);
12586 case EM_PARISC:
12587 return reloc_type == 80; /* R_PARISC_DIR64. */
12588 case EM_PPC64:
12589 return reloc_type == 38; /* R_PPC64_ADDR64. */
12590 case EM_RISCV:
12591 return reloc_type == 2; /* R_RISCV_64. */
12592 case EM_SPARC32PLUS:
12593 case EM_SPARCV9:
12594 case EM_SPARC:
12595 return reloc_type == 32 /* R_SPARC_64. */
12596 || reloc_type == 54; /* R_SPARC_UA64. */
12597 case EM_X86_64:
12598 case EM_L1OM:
12599 case EM_K1OM:
12600 return reloc_type == 1; /* R_X86_64_64. */
12601 case EM_S390_OLD:
12602 case EM_S390:
12603 return reloc_type == 22; /* R_S390_64. */
12604 case EM_TILEGX:
12605 return reloc_type == 1; /* R_TILEGX_64. */
12606 case EM_MIPS:
12607 return reloc_type == 18; /* R_MIPS_64. */
12608 default:
12609 return FALSE;
12610 }
12611 }
12612
12613 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
12614 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
12615
12616 static bfd_boolean
12617 is_64bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
12618 {
12619 switch (filedata->file_header.e_machine)
12620 {
12621 case EM_AARCH64:
12622 return reloc_type == 260; /* R_AARCH64_PREL64. */
12623 case EM_ALPHA:
12624 return reloc_type == 11; /* R_ALPHA_SREL64. */
12625 case EM_IA_64:
12626 return (reloc_type == 0x4e /* R_IA64_PCREL64MSB. */
12627 || reloc_type == 0x4f /* R_IA64_PCREL64LSB. */);
12628 case EM_PARISC:
12629 return reloc_type == 72; /* R_PARISC_PCREL64. */
12630 case EM_PPC64:
12631 return reloc_type == 44; /* R_PPC64_REL64. */
12632 case EM_SPARC32PLUS:
12633 case EM_SPARCV9:
12634 case EM_SPARC:
12635 return reloc_type == 46; /* R_SPARC_DISP64. */
12636 case EM_X86_64:
12637 case EM_L1OM:
12638 case EM_K1OM:
12639 return reloc_type == 24; /* R_X86_64_PC64. */
12640 case EM_S390_OLD:
12641 case EM_S390:
12642 return reloc_type == 23; /* R_S390_PC64. */
12643 case EM_TILEGX:
12644 return reloc_type == 5; /* R_TILEGX_64_PCREL. */
12645 default:
12646 return FALSE;
12647 }
12648 }
12649
12650 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12651 a 24-bit absolute RELA relocation used in DWARF debug sections. */
12652
12653 static bfd_boolean
12654 is_24bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12655 {
12656 switch (filedata->file_header.e_machine)
12657 {
12658 case EM_CYGNUS_MN10200:
12659 case EM_MN10200:
12660 return reloc_type == 4; /* R_MN10200_24. */
12661 case EM_FT32:
12662 return reloc_type == 5; /* R_FT32_20. */
12663 default:
12664 return FALSE;
12665 }
12666 }
12667
12668 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12669 a 16-bit absolute RELA relocation used in DWARF debug sections. */
12670
12671 static bfd_boolean
12672 is_16bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12673 {
12674 /* Please keep this table alpha-sorted for ease of visual lookup. */
12675 switch (filedata->file_header.e_machine)
12676 {
12677 case EM_ARC:
12678 case EM_ARC_COMPACT:
12679 case EM_ARC_COMPACT2:
12680 return reloc_type == 2; /* R_ARC_16. */
12681 case EM_ADAPTEVA_EPIPHANY:
12682 return reloc_type == 5;
12683 case EM_AVR_OLD:
12684 case EM_AVR:
12685 return reloc_type == 4; /* R_AVR_16. */
12686 case EM_CYGNUS_D10V:
12687 case EM_D10V:
12688 return reloc_type == 3; /* R_D10V_16. */
12689 case EM_FT32:
12690 return reloc_type == 2; /* R_FT32_16. */
12691 case EM_H8S:
12692 case EM_H8_300:
12693 case EM_H8_300H:
12694 return reloc_type == R_H8_DIR16;
12695 case EM_IP2K_OLD:
12696 case EM_IP2K:
12697 return reloc_type == 1; /* R_IP2K_16. */
12698 case EM_M32C_OLD:
12699 case EM_M32C:
12700 return reloc_type == 1; /* R_M32C_16 */
12701 case EM_CYGNUS_MN10200:
12702 case EM_MN10200:
12703 return reloc_type == 2; /* R_MN10200_16. */
12704 case EM_CYGNUS_MN10300:
12705 case EM_MN10300:
12706 return reloc_type == 2; /* R_MN10300_16. */
12707 case EM_MSP430:
12708 if (uses_msp430x_relocs (filedata))
12709 return reloc_type == 2; /* R_MSP430_ABS16. */
12710 /* Fall through. */
12711 case EM_MSP430_OLD:
12712 return reloc_type == 5; /* R_MSP430_16_BYTE. */
12713 case EM_NDS32:
12714 return reloc_type == 19; /* R_NDS32_RELA. */
12715 case EM_ALTERA_NIOS2:
12716 return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16. */
12717 case EM_NIOS32:
12718 return reloc_type == 9; /* R_NIOS_16. */
12719 case EM_OR1K:
12720 return reloc_type == 2; /* R_OR1K_16. */
12721 case EM_RISCV:
12722 return reloc_type == 55; /* R_RISCV_SET16. */
12723 case EM_TI_PRU:
12724 return reloc_type == 8; /* R_PRU_BFD_RELOC_16. */
12725 case EM_TI_C6000:
12726 return reloc_type == 2; /* R_C6000_ABS16. */
12727 case EM_VISIUM:
12728 return reloc_type == 2; /* R_VISIUM_16. */
12729 case EM_XC16X:
12730 case EM_C166:
12731 return reloc_type == 2; /* R_XC16C_ABS_16. */
12732 case EM_XGATE:
12733 return reloc_type == 3; /* R_XGATE_16. */
12734 default:
12735 return FALSE;
12736 }
12737 }
12738
12739 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12740 a 8-bit absolute RELA relocation used in DWARF debug sections. */
12741
12742 static bfd_boolean
12743 is_8bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12744 {
12745 switch (filedata->file_header.e_machine)
12746 {
12747 case EM_RISCV:
12748 return reloc_type == 54; /* R_RISCV_SET8. */
12749 default:
12750 return FALSE;
12751 }
12752 }
12753
12754 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12755 a 6-bit absolute RELA relocation used in DWARF debug sections. */
12756
12757 static bfd_boolean
12758 is_6bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12759 {
12760 switch (filedata->file_header.e_machine)
12761 {
12762 case EM_RISCV:
12763 return reloc_type == 53; /* R_RISCV_SET6. */
12764 default:
12765 return FALSE;
12766 }
12767 }
12768
12769 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12770 a 32-bit inplace add RELA relocation used in DWARF debug sections. */
12771
12772 static bfd_boolean
12773 is_32bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12774 {
12775 /* Please keep this table alpha-sorted for ease of visual lookup. */
12776 switch (filedata->file_header.e_machine)
12777 {
12778 case EM_RISCV:
12779 return reloc_type == 35; /* R_RISCV_ADD32. */
12780 default:
12781 return FALSE;
12782 }
12783 }
12784
12785 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12786 a 32-bit inplace sub RELA relocation used in DWARF debug sections. */
12787
12788 static bfd_boolean
12789 is_32bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12790 {
12791 /* Please keep this table alpha-sorted for ease of visual lookup. */
12792 switch (filedata->file_header.e_machine)
12793 {
12794 case EM_RISCV:
12795 return reloc_type == 39; /* R_RISCV_SUB32. */
12796 default:
12797 return FALSE;
12798 }
12799 }
12800
12801 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12802 a 64-bit inplace add RELA relocation used in DWARF debug sections. */
12803
12804 static bfd_boolean
12805 is_64bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12806 {
12807 /* Please keep this table alpha-sorted for ease of visual lookup. */
12808 switch (filedata->file_header.e_machine)
12809 {
12810 case EM_RISCV:
12811 return reloc_type == 36; /* R_RISCV_ADD64. */
12812 default:
12813 return FALSE;
12814 }
12815 }
12816
12817 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12818 a 64-bit inplace sub RELA relocation used in DWARF debug sections. */
12819
12820 static bfd_boolean
12821 is_64bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12822 {
12823 /* Please keep this table alpha-sorted for ease of visual lookup. */
12824 switch (filedata->file_header.e_machine)
12825 {
12826 case EM_RISCV:
12827 return reloc_type == 40; /* R_RISCV_SUB64. */
12828 default:
12829 return FALSE;
12830 }
12831 }
12832
12833 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12834 a 16-bit inplace add RELA relocation used in DWARF debug sections. */
12835
12836 static bfd_boolean
12837 is_16bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12838 {
12839 /* Please keep this table alpha-sorted for ease of visual lookup. */
12840 switch (filedata->file_header.e_machine)
12841 {
12842 case EM_RISCV:
12843 return reloc_type == 34; /* R_RISCV_ADD16. */
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 16-bit inplace sub RELA relocation used in DWARF debug sections. */
12851
12852 static bfd_boolean
12853 is_16bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12854 {
12855 /* Please keep this table alpha-sorted for ease of visual lookup. */
12856 switch (filedata->file_header.e_machine)
12857 {
12858 case EM_RISCV:
12859 return reloc_type == 38; /* R_RISCV_SUB16. */
12860 default:
12861 return FALSE;
12862 }
12863 }
12864
12865 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12866 a 8-bit inplace add RELA relocation used in DWARF debug sections. */
12867
12868 static bfd_boolean
12869 is_8bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12870 {
12871 /* Please keep this table alpha-sorted for ease of visual lookup. */
12872 switch (filedata->file_header.e_machine)
12873 {
12874 case EM_RISCV:
12875 return reloc_type == 33; /* R_RISCV_ADD8. */
12876 default:
12877 return FALSE;
12878 }
12879 }
12880
12881 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12882 a 8-bit inplace sub RELA relocation used in DWARF debug sections. */
12883
12884 static bfd_boolean
12885 is_8bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12886 {
12887 /* Please keep this table alpha-sorted for ease of visual lookup. */
12888 switch (filedata->file_header.e_machine)
12889 {
12890 case EM_RISCV:
12891 return reloc_type == 37; /* R_RISCV_SUB8. */
12892 default:
12893 return FALSE;
12894 }
12895 }
12896
12897 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12898 a 6-bit inplace sub RELA relocation used in DWARF debug sections. */
12899
12900 static bfd_boolean
12901 is_6bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12902 {
12903 switch (filedata->file_header.e_machine)
12904 {
12905 case EM_RISCV:
12906 return reloc_type == 52; /* R_RISCV_SUB6. */
12907 default:
12908 return FALSE;
12909 }
12910 }
12911
12912 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
12913 relocation entries (possibly formerly used for SHT_GROUP sections). */
12914
12915 static bfd_boolean
12916 is_none_reloc (Filedata * filedata, unsigned int reloc_type)
12917 {
12918 switch (filedata->file_header.e_machine)
12919 {
12920 case EM_386: /* R_386_NONE. */
12921 case EM_68K: /* R_68K_NONE. */
12922 case EM_ADAPTEVA_EPIPHANY:
12923 case EM_ALPHA: /* R_ALPHA_NONE. */
12924 case EM_ALTERA_NIOS2: /* R_NIOS2_NONE. */
12925 case EM_ARC: /* R_ARC_NONE. */
12926 case EM_ARC_COMPACT2: /* R_ARC_NONE. */
12927 case EM_ARC_COMPACT: /* R_ARC_NONE. */
12928 case EM_ARM: /* R_ARM_NONE. */
12929 case EM_C166: /* R_XC16X_NONE. */
12930 case EM_CRIS: /* R_CRIS_NONE. */
12931 case EM_FT32: /* R_FT32_NONE. */
12932 case EM_IA_64: /* R_IA64_NONE. */
12933 case EM_K1OM: /* R_X86_64_NONE. */
12934 case EM_L1OM: /* R_X86_64_NONE. */
12935 case EM_M32R: /* R_M32R_NONE. */
12936 case EM_MIPS: /* R_MIPS_NONE. */
12937 case EM_MN10300: /* R_MN10300_NONE. */
12938 case EM_MOXIE: /* R_MOXIE_NONE. */
12939 case EM_NIOS32: /* R_NIOS_NONE. */
12940 case EM_OR1K: /* R_OR1K_NONE. */
12941 case EM_PARISC: /* R_PARISC_NONE. */
12942 case EM_PPC64: /* R_PPC64_NONE. */
12943 case EM_PPC: /* R_PPC_NONE. */
12944 case EM_RISCV: /* R_RISCV_NONE. */
12945 case EM_S390: /* R_390_NONE. */
12946 case EM_S390_OLD:
12947 case EM_SH: /* R_SH_NONE. */
12948 case EM_SPARC32PLUS:
12949 case EM_SPARC: /* R_SPARC_NONE. */
12950 case EM_SPARCV9:
12951 case EM_TILEGX: /* R_TILEGX_NONE. */
12952 case EM_TILEPRO: /* R_TILEPRO_NONE. */
12953 case EM_TI_C6000:/* R_C6000_NONE. */
12954 case EM_X86_64: /* R_X86_64_NONE. */
12955 case EM_XC16X:
12956 case EM_WEBASSEMBLY: /* R_WASM32_NONE. */
12957 return reloc_type == 0;
12958
12959 case EM_AARCH64:
12960 return reloc_type == 0 || reloc_type == 256;
12961 case EM_AVR_OLD:
12962 case EM_AVR:
12963 return (reloc_type == 0 /* R_AVR_NONE. */
12964 || reloc_type == 30 /* R_AVR_DIFF8. */
12965 || reloc_type == 31 /* R_AVR_DIFF16. */
12966 || reloc_type == 32 /* R_AVR_DIFF32. */);
12967 case EM_METAG:
12968 return reloc_type == 3; /* R_METAG_NONE. */
12969 case EM_NDS32:
12970 return (reloc_type == 0 /* R_XTENSA_NONE. */
12971 || reloc_type == 204 /* R_NDS32_DIFF8. */
12972 || reloc_type == 205 /* R_NDS32_DIFF16. */
12973 || reloc_type == 206 /* R_NDS32_DIFF32. */
12974 || reloc_type == 207 /* R_NDS32_ULEB128. */);
12975 case EM_TI_PRU:
12976 return (reloc_type == 0 /* R_PRU_NONE. */
12977 || reloc_type == 65 /* R_PRU_DIFF8. */
12978 || reloc_type == 66 /* R_PRU_DIFF16. */
12979 || reloc_type == 67 /* R_PRU_DIFF32. */);
12980 case EM_XTENSA_OLD:
12981 case EM_XTENSA:
12982 return (reloc_type == 0 /* R_XTENSA_NONE. */
12983 || reloc_type == 17 /* R_XTENSA_DIFF8. */
12984 || reloc_type == 18 /* R_XTENSA_DIFF16. */
12985 || reloc_type == 19 /* R_XTENSA_DIFF32. */);
12986 }
12987 return FALSE;
12988 }
12989
12990 /* Returns TRUE if there is a relocation against
12991 section NAME at OFFSET bytes. */
12992
12993 bfd_boolean
12994 reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
12995 {
12996 Elf_Internal_Rela * relocs;
12997 Elf_Internal_Rela * rp;
12998
12999 if (dsec == NULL || dsec->reloc_info == NULL)
13000 return FALSE;
13001
13002 relocs = (Elf_Internal_Rela *) dsec->reloc_info;
13003
13004 for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
13005 if (rp->r_offset == offset)
13006 return TRUE;
13007
13008 return FALSE;
13009 }
13010
13011 /* Apply relocations to a section.
13012 Returns TRUE upon success, FALSE otherwise.
13013 If RELOCS_RETURN is non-NULL then it is set to point to the loaded relocs.
13014 It is then the caller's responsibility to free them. NUM_RELOCS_RETURN
13015 will be set to the number of relocs loaded.
13016
13017 Note: So far support has been added only for those relocations
13018 which can be found in debug sections. FIXME: Add support for
13019 more relocations ? */
13020
13021 static bfd_boolean
13022 apply_relocations (Filedata * filedata,
13023 const Elf_Internal_Shdr * section,
13024 unsigned char * start,
13025 bfd_size_type size,
13026 void ** relocs_return,
13027 unsigned long * num_relocs_return)
13028 {
13029 Elf_Internal_Shdr * relsec;
13030 unsigned char * end = start + size;
13031 bfd_boolean res = TRUE;
13032
13033 if (relocs_return != NULL)
13034 {
13035 * (Elf_Internal_Rela **) relocs_return = NULL;
13036 * num_relocs_return = 0;
13037 }
13038
13039 if (filedata->file_header.e_type != ET_REL)
13040 /* No relocs to apply. */
13041 return TRUE;
13042
13043 /* Find the reloc section associated with the section. */
13044 for (relsec = filedata->section_headers;
13045 relsec < filedata->section_headers + filedata->file_header.e_shnum;
13046 ++relsec)
13047 {
13048 bfd_boolean is_rela;
13049 unsigned long num_relocs;
13050 Elf_Internal_Rela * relocs;
13051 Elf_Internal_Rela * rp;
13052 Elf_Internal_Shdr * symsec;
13053 Elf_Internal_Sym * symtab;
13054 unsigned long num_syms;
13055 Elf_Internal_Sym * sym;
13056
13057 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13058 || relsec->sh_info >= filedata->file_header.e_shnum
13059 || filedata->section_headers + relsec->sh_info != section
13060 || relsec->sh_size == 0
13061 || relsec->sh_link >= filedata->file_header.e_shnum)
13062 continue;
13063
13064 is_rela = relsec->sh_type == SHT_RELA;
13065
13066 if (is_rela)
13067 {
13068 if (!slurp_rela_relocs (filedata, relsec->sh_offset,
13069 relsec->sh_size, & relocs, & num_relocs))
13070 return FALSE;
13071 }
13072 else
13073 {
13074 if (!slurp_rel_relocs (filedata, relsec->sh_offset,
13075 relsec->sh_size, & relocs, & num_relocs))
13076 return FALSE;
13077 }
13078
13079 /* SH uses RELA but uses in place value instead of the addend field. */
13080 if (filedata->file_header.e_machine == EM_SH)
13081 is_rela = FALSE;
13082
13083 symsec = filedata->section_headers + relsec->sh_link;
13084 if (symsec->sh_type != SHT_SYMTAB
13085 && symsec->sh_type != SHT_DYNSYM)
13086 return FALSE;
13087 symtab = GET_ELF_SYMBOLS (filedata, symsec, & num_syms);
13088
13089 for (rp = relocs; rp < relocs + num_relocs; ++rp)
13090 {
13091 bfd_vma addend;
13092 unsigned int reloc_type;
13093 unsigned int reloc_size;
13094 bfd_boolean reloc_inplace = FALSE;
13095 bfd_boolean reloc_subtract = FALSE;
13096 unsigned char * rloc;
13097 unsigned long sym_index;
13098
13099 reloc_type = get_reloc_type (filedata, rp->r_info);
13100
13101 if (target_specific_reloc_handling (filedata, rp, start, end, symtab, num_syms))
13102 continue;
13103 else if (is_none_reloc (filedata, reloc_type))
13104 continue;
13105 else if (is_32bit_abs_reloc (filedata, reloc_type)
13106 || is_32bit_pcrel_reloc (filedata, reloc_type))
13107 reloc_size = 4;
13108 else if (is_64bit_abs_reloc (filedata, reloc_type)
13109 || is_64bit_pcrel_reloc (filedata, reloc_type))
13110 reloc_size = 8;
13111 else if (is_24bit_abs_reloc (filedata, reloc_type))
13112 reloc_size = 3;
13113 else if (is_16bit_abs_reloc (filedata, reloc_type))
13114 reloc_size = 2;
13115 else if (is_8bit_abs_reloc (filedata, reloc_type)
13116 || is_6bit_abs_reloc (filedata, reloc_type))
13117 reloc_size = 1;
13118 else if ((reloc_subtract = is_32bit_inplace_sub_reloc (filedata,
13119 reloc_type))
13120 || is_32bit_inplace_add_reloc (filedata, reloc_type))
13121 {
13122 reloc_size = 4;
13123 reloc_inplace = TRUE;
13124 }
13125 else if ((reloc_subtract = is_64bit_inplace_sub_reloc (filedata,
13126 reloc_type))
13127 || is_64bit_inplace_add_reloc (filedata, reloc_type))
13128 {
13129 reloc_size = 8;
13130 reloc_inplace = TRUE;
13131 }
13132 else if ((reloc_subtract = is_16bit_inplace_sub_reloc (filedata,
13133 reloc_type))
13134 || is_16bit_inplace_add_reloc (filedata, reloc_type))
13135 {
13136 reloc_size = 2;
13137 reloc_inplace = TRUE;
13138 }
13139 else if ((reloc_subtract = is_8bit_inplace_sub_reloc (filedata,
13140 reloc_type))
13141 || is_8bit_inplace_add_reloc (filedata, reloc_type))
13142 {
13143 reloc_size = 1;
13144 reloc_inplace = TRUE;
13145 }
13146 else if ((reloc_subtract = is_6bit_inplace_sub_reloc (filedata,
13147 reloc_type)))
13148 {
13149 reloc_size = 1;
13150 reloc_inplace = TRUE;
13151 }
13152 else
13153 {
13154 static unsigned int prev_reloc = 0;
13155
13156 if (reloc_type != prev_reloc)
13157 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
13158 reloc_type, printable_section_name (filedata, section));
13159 prev_reloc = reloc_type;
13160 res = FALSE;
13161 continue;
13162 }
13163
13164 rloc = start + rp->r_offset;
13165 if ((rloc + reloc_size) > end || (rloc < start))
13166 {
13167 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
13168 (unsigned long) rp->r_offset,
13169 printable_section_name (filedata, section));
13170 res = FALSE;
13171 continue;
13172 }
13173
13174 sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
13175 if (sym_index >= num_syms)
13176 {
13177 warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
13178 sym_index, printable_section_name (filedata, section));
13179 res = FALSE;
13180 continue;
13181 }
13182 sym = symtab + sym_index;
13183
13184 /* If the reloc has a symbol associated with it,
13185 make sure that it is of an appropriate type.
13186
13187 Relocations against symbols without type can happen.
13188 Gcc -feliminate-dwarf2-dups may generate symbols
13189 without type for debug info.
13190
13191 Icc generates relocations against function symbols
13192 instead of local labels.
13193
13194 Relocations against object symbols can happen, eg when
13195 referencing a global array. For an example of this see
13196 the _clz.o binary in libgcc.a. */
13197 if (sym != symtab
13198 && ELF_ST_TYPE (sym->st_info) != STT_COMMON
13199 && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
13200 {
13201 warn (_("skipping unexpected symbol type %s in section %s relocation %ld\n"),
13202 get_symbol_type (filedata, ELF_ST_TYPE (sym->st_info)),
13203 printable_section_name (filedata, relsec),
13204 (long int)(rp - relocs));
13205 res = FALSE;
13206 continue;
13207 }
13208
13209 addend = 0;
13210 if (is_rela)
13211 addend += rp->r_addend;
13212 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
13213 partial_inplace. */
13214 if (!is_rela
13215 || (filedata->file_header.e_machine == EM_XTENSA
13216 && reloc_type == 1)
13217 || ((filedata->file_header.e_machine == EM_PJ
13218 || filedata->file_header.e_machine == EM_PJ_OLD)
13219 && reloc_type == 1)
13220 || ((filedata->file_header.e_machine == EM_D30V
13221 || filedata->file_header.e_machine == EM_CYGNUS_D30V)
13222 && reloc_type == 12)
13223 || reloc_inplace)
13224 {
13225 if (is_6bit_inplace_sub_reloc (filedata, reloc_type))
13226 addend += byte_get (rloc, reloc_size) & 0x3f;
13227 else
13228 addend += byte_get (rloc, reloc_size);
13229 }
13230
13231 if (is_32bit_pcrel_reloc (filedata, reloc_type)
13232 || is_64bit_pcrel_reloc (filedata, reloc_type))
13233 {
13234 /* On HPPA, all pc-relative relocations are biased by 8. */
13235 if (filedata->file_header.e_machine == EM_PARISC)
13236 addend -= 8;
13237 byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
13238 reloc_size);
13239 }
13240 else if (is_6bit_abs_reloc (filedata, reloc_type)
13241 || is_6bit_inplace_sub_reloc (filedata, reloc_type))
13242 {
13243 if (reloc_subtract)
13244 addend -= sym->st_value;
13245 else
13246 addend += sym->st_value;
13247 addend = (addend & 0x3f) | (byte_get (rloc, reloc_size) & 0xc0);
13248 byte_put (rloc, addend, reloc_size);
13249 }
13250 else if (reloc_subtract)
13251 byte_put (rloc, addend - sym->st_value, reloc_size);
13252 else
13253 byte_put (rloc, addend + sym->st_value, reloc_size);
13254 }
13255
13256 free (symtab);
13257 /* Let the target specific reloc processing code know that
13258 we have finished with these relocs. */
13259 target_specific_reloc_handling (filedata, NULL, NULL, NULL, NULL, 0);
13260
13261 if (relocs_return)
13262 {
13263 * (Elf_Internal_Rela **) relocs_return = relocs;
13264 * num_relocs_return = num_relocs;
13265 }
13266 else
13267 free (relocs);
13268
13269 break;
13270 }
13271
13272 return res;
13273 }
13274
13275 #ifdef SUPPORT_DISASSEMBLY
13276 static bfd_boolean
13277 disassemble_section (Elf_Internal_Shdr * section, Filedata * filedata)
13278 {
13279 printf (_("\nAssembly dump of section %s\n"), printable_section_name (filedata, section));
13280
13281 /* FIXME: XXX -- to be done --- XXX */
13282
13283 return TRUE;
13284 }
13285 #endif
13286
13287 /* Reads in the contents of SECTION from FILE, returning a pointer
13288 to a malloc'ed buffer or NULL if something went wrong. */
13289
13290 static char *
13291 get_section_contents (Elf_Internal_Shdr * section, Filedata * filedata)
13292 {
13293 bfd_size_type num_bytes = section->sh_size;
13294
13295 if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
13296 {
13297 printf (_("Section '%s' has no data to dump.\n"),
13298 printable_section_name (filedata, section));
13299 return NULL;
13300 }
13301
13302 return (char *) get_data (NULL, filedata, section->sh_offset, 1, num_bytes,
13303 _("section contents"));
13304 }
13305
13306 /* Uncompresses a section that was compressed using zlib, in place. */
13307
13308 static bfd_boolean
13309 uncompress_section_contents (unsigned char ** buffer,
13310 dwarf_size_type uncompressed_size,
13311 dwarf_size_type * size)
13312 {
13313 dwarf_size_type compressed_size = *size;
13314 unsigned char * compressed_buffer = *buffer;
13315 unsigned char * uncompressed_buffer;
13316 z_stream strm;
13317 int rc;
13318
13319 /* It is possible the section consists of several compressed
13320 buffers concatenated together, so we uncompress in a loop. */
13321 /* PR 18313: The state field in the z_stream structure is supposed
13322 to be invisible to the user (ie us), but some compilers will
13323 still complain about it being used without initialisation. So
13324 we first zero the entire z_stream structure and then set the fields
13325 that we need. */
13326 memset (& strm, 0, sizeof strm);
13327 strm.avail_in = compressed_size;
13328 strm.next_in = (Bytef *) compressed_buffer;
13329 strm.avail_out = uncompressed_size;
13330 uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
13331
13332 rc = inflateInit (& strm);
13333 while (strm.avail_in > 0)
13334 {
13335 if (rc != Z_OK)
13336 goto fail;
13337 strm.next_out = ((Bytef *) uncompressed_buffer
13338 + (uncompressed_size - strm.avail_out));
13339 rc = inflate (&strm, Z_FINISH);
13340 if (rc != Z_STREAM_END)
13341 goto fail;
13342 rc = inflateReset (& strm);
13343 }
13344 rc = inflateEnd (& strm);
13345 if (rc != Z_OK
13346 || strm.avail_out != 0)
13347 goto fail;
13348
13349 *buffer = uncompressed_buffer;
13350 *size = uncompressed_size;
13351 return TRUE;
13352
13353 fail:
13354 free (uncompressed_buffer);
13355 /* Indicate decompression failure. */
13356 *buffer = NULL;
13357 return FALSE;
13358 }
13359
13360 static bfd_boolean
13361 dump_section_as_strings (Elf_Internal_Shdr * section, Filedata * filedata)
13362 {
13363 Elf_Internal_Shdr * relsec;
13364 bfd_size_type num_bytes;
13365 unsigned char * data;
13366 unsigned char * end;
13367 unsigned char * real_start;
13368 unsigned char * start;
13369 bfd_boolean some_strings_shown;
13370
13371 real_start = start = (unsigned char *) get_section_contents (section, filedata);
13372 if (start == NULL)
13373 /* PR 21820: Do not fail if the section was empty. */
13374 return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
13375
13376 num_bytes = section->sh_size;
13377
13378 printf (_("\nString dump of section '%s':\n"), printable_section_name (filedata, section));
13379
13380 if (decompress_dumps)
13381 {
13382 dwarf_size_type new_size = num_bytes;
13383 dwarf_size_type uncompressed_size = 0;
13384
13385 if ((section->sh_flags & SHF_COMPRESSED) != 0)
13386 {
13387 Elf_Internal_Chdr chdr;
13388 unsigned int compression_header_size
13389 = get_compression_header (& chdr, (unsigned char *) start,
13390 num_bytes);
13391
13392 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13393 {
13394 warn (_("section '%s' has unsupported compress type: %d\n"),
13395 printable_section_name (filedata, section), chdr.ch_type);
13396 return FALSE;
13397 }
13398 else if (chdr.ch_addralign != section->sh_addralign)
13399 {
13400 warn (_("compressed section '%s' is corrupted\n"),
13401 printable_section_name (filedata, section));
13402 return FALSE;
13403 }
13404 uncompressed_size = chdr.ch_size;
13405 start += compression_header_size;
13406 new_size -= compression_header_size;
13407 }
13408 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
13409 {
13410 /* Read the zlib header. In this case, it should be "ZLIB"
13411 followed by the uncompressed section size, 8 bytes in
13412 big-endian order. */
13413 uncompressed_size = start[4]; uncompressed_size <<= 8;
13414 uncompressed_size += start[5]; uncompressed_size <<= 8;
13415 uncompressed_size += start[6]; uncompressed_size <<= 8;
13416 uncompressed_size += start[7]; uncompressed_size <<= 8;
13417 uncompressed_size += start[8]; uncompressed_size <<= 8;
13418 uncompressed_size += start[9]; uncompressed_size <<= 8;
13419 uncompressed_size += start[10]; uncompressed_size <<= 8;
13420 uncompressed_size += start[11];
13421 start += 12;
13422 new_size -= 12;
13423 }
13424
13425 if (uncompressed_size)
13426 {
13427 if (uncompress_section_contents (& start,
13428 uncompressed_size, & new_size))
13429 num_bytes = new_size;
13430 else
13431 {
13432 error (_("Unable to decompress section %s\n"),
13433 printable_section_name (filedata, section));
13434 return FALSE;
13435 }
13436 }
13437 else
13438 start = real_start;
13439 }
13440
13441 /* If the section being dumped has relocations against it the user might
13442 be expecting these relocations to have been applied. Check for this
13443 case and issue a warning message in order to avoid confusion.
13444 FIXME: Maybe we ought to have an option that dumps a section with
13445 relocs applied ? */
13446 for (relsec = filedata->section_headers;
13447 relsec < filedata->section_headers + filedata->file_header.e_shnum;
13448 ++relsec)
13449 {
13450 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13451 || relsec->sh_info >= filedata->file_header.e_shnum
13452 || filedata->section_headers + relsec->sh_info != section
13453 || relsec->sh_size == 0
13454 || relsec->sh_link >= filedata->file_header.e_shnum)
13455 continue;
13456
13457 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
13458 break;
13459 }
13460
13461 data = start;
13462 end = start + num_bytes;
13463 some_strings_shown = FALSE;
13464
13465 while (data < end)
13466 {
13467 while (!ISPRINT (* data))
13468 if (++ data >= end)
13469 break;
13470
13471 if (data < end)
13472 {
13473 size_t maxlen = end - data;
13474
13475 #ifndef __MSVCRT__
13476 /* PR 11128: Use two separate invocations in order to work
13477 around bugs in the Solaris 8 implementation of printf. */
13478 printf (" [%6tx] ", data - start);
13479 #else
13480 printf (" [%6Ix] ", (size_t) (data - start));
13481 #endif
13482 if (maxlen > 0)
13483 {
13484 print_symbol ((int) maxlen, (const char *) data);
13485 putchar ('\n');
13486 data += strnlen ((const char *) data, maxlen);
13487 }
13488 else
13489 {
13490 printf (_("<corrupt>\n"));
13491 data = end;
13492 }
13493 some_strings_shown = TRUE;
13494 }
13495 }
13496
13497 if (! some_strings_shown)
13498 printf (_(" No strings found in this section."));
13499
13500 free (real_start);
13501
13502 putchar ('\n');
13503 return TRUE;
13504 }
13505
13506 static bfd_boolean
13507 dump_section_as_bytes (Elf_Internal_Shdr * section,
13508 Filedata * filedata,
13509 bfd_boolean relocate)
13510 {
13511 Elf_Internal_Shdr * relsec;
13512 bfd_size_type bytes;
13513 bfd_size_type section_size;
13514 bfd_vma addr;
13515 unsigned char * data;
13516 unsigned char * real_start;
13517 unsigned char * start;
13518
13519 real_start = start = (unsigned char *) get_section_contents (section, filedata);
13520 if (start == NULL)
13521 /* PR 21820: Do not fail if the section was empty. */
13522 return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
13523
13524 section_size = section->sh_size;
13525
13526 printf (_("\nHex dump of section '%s':\n"), printable_section_name (filedata, section));
13527
13528 if (decompress_dumps)
13529 {
13530 dwarf_size_type new_size = section_size;
13531 dwarf_size_type uncompressed_size = 0;
13532
13533 if ((section->sh_flags & SHF_COMPRESSED) != 0)
13534 {
13535 Elf_Internal_Chdr chdr;
13536 unsigned int compression_header_size
13537 = get_compression_header (& chdr, start, section_size);
13538
13539 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13540 {
13541 warn (_("section '%s' has unsupported compress type: %d\n"),
13542 printable_section_name (filedata, section), chdr.ch_type);
13543 return FALSE;
13544 }
13545 else if (chdr.ch_addralign != section->sh_addralign)
13546 {
13547 warn (_("compressed section '%s' is corrupted\n"),
13548 printable_section_name (filedata, section));
13549 return FALSE;
13550 }
13551 uncompressed_size = chdr.ch_size;
13552 start += compression_header_size;
13553 new_size -= compression_header_size;
13554 }
13555 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
13556 {
13557 /* Read the zlib header. In this case, it should be "ZLIB"
13558 followed by the uncompressed section size, 8 bytes in
13559 big-endian order. */
13560 uncompressed_size = start[4]; uncompressed_size <<= 8;
13561 uncompressed_size += start[5]; uncompressed_size <<= 8;
13562 uncompressed_size += start[6]; uncompressed_size <<= 8;
13563 uncompressed_size += start[7]; uncompressed_size <<= 8;
13564 uncompressed_size += start[8]; uncompressed_size <<= 8;
13565 uncompressed_size += start[9]; uncompressed_size <<= 8;
13566 uncompressed_size += start[10]; uncompressed_size <<= 8;
13567 uncompressed_size += start[11];
13568 start += 12;
13569 new_size -= 12;
13570 }
13571
13572 if (uncompressed_size)
13573 {
13574 if (uncompress_section_contents (& start, uncompressed_size,
13575 & new_size))
13576 {
13577 section_size = new_size;
13578 }
13579 else
13580 {
13581 error (_("Unable to decompress section %s\n"),
13582 printable_section_name (filedata, section));
13583 /* FIXME: Print the section anyway ? */
13584 return FALSE;
13585 }
13586 }
13587 else
13588 start = real_start;
13589 }
13590
13591 if (relocate)
13592 {
13593 if (! apply_relocations (filedata, section, start, section_size, NULL, NULL))
13594 return FALSE;
13595 }
13596 else
13597 {
13598 /* If the section being dumped has relocations against it the user might
13599 be expecting these relocations to have been applied. Check for this
13600 case and issue a warning message in order to avoid confusion.
13601 FIXME: Maybe we ought to have an option that dumps a section with
13602 relocs applied ? */
13603 for (relsec = filedata->section_headers;
13604 relsec < filedata->section_headers + filedata->file_header.e_shnum;
13605 ++relsec)
13606 {
13607 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13608 || relsec->sh_info >= filedata->file_header.e_shnum
13609 || filedata->section_headers + relsec->sh_info != section
13610 || relsec->sh_size == 0
13611 || relsec->sh_link >= filedata->file_header.e_shnum)
13612 continue;
13613
13614 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
13615 break;
13616 }
13617 }
13618
13619 addr = section->sh_addr;
13620 bytes = section_size;
13621 data = start;
13622
13623 while (bytes)
13624 {
13625 int j;
13626 int k;
13627 int lbytes;
13628
13629 lbytes = (bytes > 16 ? 16 : bytes);
13630
13631 printf (" 0x%8.8lx ", (unsigned long) addr);
13632
13633 for (j = 0; j < 16; j++)
13634 {
13635 if (j < lbytes)
13636 printf ("%2.2x", data[j]);
13637 else
13638 printf (" ");
13639
13640 if ((j & 3) == 3)
13641 printf (" ");
13642 }
13643
13644 for (j = 0; j < lbytes; j++)
13645 {
13646 k = data[j];
13647 if (k >= ' ' && k < 0x7f)
13648 printf ("%c", k);
13649 else
13650 printf (".");
13651 }
13652
13653 putchar ('\n');
13654
13655 data += lbytes;
13656 addr += lbytes;
13657 bytes -= lbytes;
13658 }
13659
13660 free (real_start);
13661
13662 putchar ('\n');
13663 return TRUE;
13664 }
13665
13666 static bfd_boolean
13667 load_specific_debug_section (enum dwarf_section_display_enum debug,
13668 const Elf_Internal_Shdr * sec,
13669 void * data)
13670 {
13671 struct dwarf_section * section = &debug_displays [debug].section;
13672 char buf [64];
13673 Filedata * filedata = (Filedata *) data;
13674
13675 if (section->start != NULL)
13676 {
13677 /* If it is already loaded, do nothing. */
13678 if (streq (section->filename, filedata->file_name))
13679 return TRUE;
13680 free (section->start);
13681 }
13682
13683 snprintf (buf, sizeof (buf), _("%s section data"), section->name);
13684 section->address = sec->sh_addr;
13685 section->user_data = NULL;
13686 section->filename = filedata->file_name;
13687 section->start = (unsigned char *) get_data (NULL, filedata,
13688 sec->sh_offset, 1,
13689 sec->sh_size, buf);
13690 if (section->start == NULL)
13691 section->size = 0;
13692 else
13693 {
13694 unsigned char *start = section->start;
13695 dwarf_size_type size = sec->sh_size;
13696 dwarf_size_type uncompressed_size = 0;
13697
13698 if ((sec->sh_flags & SHF_COMPRESSED) != 0)
13699 {
13700 Elf_Internal_Chdr chdr;
13701 unsigned int compression_header_size;
13702
13703 if (size < (is_32bit_elf
13704 ? sizeof (Elf32_External_Chdr)
13705 : sizeof (Elf64_External_Chdr)))
13706 {
13707 warn (_("compressed section %s is too small to contain a compression header"),
13708 section->name);
13709 return FALSE;
13710 }
13711
13712 compression_header_size = get_compression_header (&chdr, start, size);
13713
13714 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13715 {
13716 warn (_("section '%s' has unsupported compress type: %d\n"),
13717 section->name, chdr.ch_type);
13718 return FALSE;
13719 }
13720 else if (chdr.ch_addralign != sec->sh_addralign)
13721 {
13722 warn (_("compressed section '%s' is corrupted\n"),
13723 section->name);
13724 return FALSE;
13725 }
13726 uncompressed_size = chdr.ch_size;
13727 start += compression_header_size;
13728 size -= compression_header_size;
13729 }
13730 else if (size > 12 && streq ((char *) start, "ZLIB"))
13731 {
13732 /* Read the zlib header. In this case, it should be "ZLIB"
13733 followed by the uncompressed section size, 8 bytes in
13734 big-endian order. */
13735 uncompressed_size = start[4]; uncompressed_size <<= 8;
13736 uncompressed_size += start[5]; uncompressed_size <<= 8;
13737 uncompressed_size += start[6]; uncompressed_size <<= 8;
13738 uncompressed_size += start[7]; uncompressed_size <<= 8;
13739 uncompressed_size += start[8]; uncompressed_size <<= 8;
13740 uncompressed_size += start[9]; uncompressed_size <<= 8;
13741 uncompressed_size += start[10]; uncompressed_size <<= 8;
13742 uncompressed_size += start[11];
13743 start += 12;
13744 size -= 12;
13745 }
13746
13747 if (uncompressed_size)
13748 {
13749 if (uncompress_section_contents (&start, uncompressed_size,
13750 &size))
13751 {
13752 /* Free the compressed buffer, update the section buffer
13753 and the section size if uncompress is successful. */
13754 free (section->start);
13755 section->start = start;
13756 }
13757 else
13758 {
13759 error (_("Unable to decompress section %s\n"),
13760 printable_section_name (filedata, sec));
13761 return FALSE;
13762 }
13763 }
13764
13765 section->size = size;
13766 }
13767
13768 if (section->start == NULL)
13769 return FALSE;
13770
13771 if (debug_displays [debug].relocate)
13772 {
13773 if (! apply_relocations (filedata, sec, section->start, section->size,
13774 & section->reloc_info, & section->num_relocs))
13775 return FALSE;
13776 }
13777 else
13778 {
13779 section->reloc_info = NULL;
13780 section->num_relocs = 0;
13781 }
13782
13783 return TRUE;
13784 }
13785
13786 /* If this is not NULL, load_debug_section will only look for sections
13787 within the list of sections given here. */
13788 static unsigned int * section_subset = NULL;
13789
13790 bfd_boolean
13791 load_debug_section (enum dwarf_section_display_enum debug, void * data)
13792 {
13793 struct dwarf_section * section = &debug_displays [debug].section;
13794 Elf_Internal_Shdr * sec;
13795 Filedata * filedata = (Filedata *) data;
13796
13797 /* Without section headers we cannot find any sections. */
13798 if (filedata->section_headers == NULL)
13799 return FALSE;
13800
13801 if (filedata->string_table == NULL
13802 && filedata->file_header.e_shstrndx != SHN_UNDEF
13803 && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
13804 {
13805 Elf_Internal_Shdr * strs;
13806
13807 /* Read in the string table, so that we have section names to scan. */
13808 strs = filedata->section_headers + filedata->file_header.e_shstrndx;
13809
13810 if (strs != NULL && strs->sh_size != 0)
13811 {
13812 filedata->string_table
13813 = (char *) get_data (NULL, filedata, strs->sh_offset,
13814 1, strs->sh_size, _("string table"));
13815
13816 filedata->string_table_length
13817 = filedata->string_table != NULL ? strs->sh_size : 0;
13818 }
13819 }
13820
13821 /* Locate the debug section. */
13822 sec = find_section_in_set (filedata, section->uncompressed_name, section_subset);
13823 if (sec != NULL)
13824 section->name = section->uncompressed_name;
13825 else
13826 {
13827 sec = find_section_in_set (filedata, section->compressed_name, section_subset);
13828 if (sec != NULL)
13829 section->name = section->compressed_name;
13830 }
13831 if (sec == NULL)
13832 return FALSE;
13833
13834 /* If we're loading from a subset of sections, and we've loaded
13835 a section matching this name before, it's likely that it's a
13836 different one. */
13837 if (section_subset != NULL)
13838 free_debug_section (debug);
13839
13840 return load_specific_debug_section (debug, sec, data);
13841 }
13842
13843 void
13844 free_debug_section (enum dwarf_section_display_enum debug)
13845 {
13846 struct dwarf_section * section = &debug_displays [debug].section;
13847
13848 if (section->start == NULL)
13849 return;
13850
13851 free ((char *) section->start);
13852 section->start = NULL;
13853 section->address = 0;
13854 section->size = 0;
13855 }
13856
13857 static bfd_boolean
13858 display_debug_section (int shndx, Elf_Internal_Shdr * section, Filedata * filedata)
13859 {
13860 char * name = SECTION_NAME (section);
13861 const char * print_name = printable_section_name (filedata, section);
13862 bfd_size_type length;
13863 bfd_boolean result = TRUE;
13864 int i;
13865
13866 length = section->sh_size;
13867 if (length == 0)
13868 {
13869 printf (_("\nSection '%s' has no debugging data.\n"), print_name);
13870 return TRUE;
13871 }
13872 if (section->sh_type == SHT_NOBITS)
13873 {
13874 /* There is no point in dumping the contents of a debugging section
13875 which has the NOBITS type - the bits in the file will be random.
13876 This can happen when a file containing a .eh_frame section is
13877 stripped with the --only-keep-debug command line option. */
13878 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
13879 print_name);
13880 return FALSE;
13881 }
13882
13883 if (const_strneq (name, ".gnu.linkonce.wi."))
13884 name = ".debug_info";
13885
13886 /* See if we know how to display the contents of this section. */
13887 for (i = 0; i < max; i++)
13888 {
13889 enum dwarf_section_display_enum id = (enum dwarf_section_display_enum) i;
13890 struct dwarf_section_display * display = debug_displays + i;
13891 struct dwarf_section * sec = & display->section;
13892
13893 if (streq (sec->uncompressed_name, name)
13894 || (id == line && const_strneq (name, ".debug_line."))
13895 || streq (sec->compressed_name, name))
13896 {
13897 bfd_boolean secondary = (section != find_section (filedata, name));
13898
13899 if (secondary)
13900 free_debug_section (id);
13901
13902 if (i == line && const_strneq (name, ".debug_line."))
13903 sec->name = name;
13904 else if (streq (sec->uncompressed_name, name))
13905 sec->name = sec->uncompressed_name;
13906 else
13907 sec->name = sec->compressed_name;
13908
13909 if (load_specific_debug_section (id, section, filedata))
13910 {
13911 /* If this debug section is part of a CU/TU set in a .dwp file,
13912 restrict load_debug_section to the sections in that set. */
13913 section_subset = find_cu_tu_set (filedata, shndx);
13914
13915 result &= display->display (sec, filedata);
13916
13917 section_subset = NULL;
13918
13919 if (secondary || (id != info && id != abbrev))
13920 free_debug_section (id);
13921 }
13922 break;
13923 }
13924 }
13925
13926 if (i == max)
13927 {
13928 printf (_("Unrecognized debug section: %s\n"), print_name);
13929 result = FALSE;
13930 }
13931
13932 return result;
13933 }
13934
13935 /* Set DUMP_SECTS for all sections where dumps were requested
13936 based on section name. */
13937
13938 static void
13939 initialise_dumps_byname (Filedata * filedata)
13940 {
13941 struct dump_list_entry * cur;
13942
13943 for (cur = dump_sects_byname; cur; cur = cur->next)
13944 {
13945 unsigned int i;
13946 bfd_boolean any = FALSE;
13947
13948 for (i = 0; i < filedata->file_header.e_shnum; i++)
13949 if (streq (SECTION_NAME (filedata->section_headers + i), cur->name))
13950 {
13951 request_dump_bynumber (filedata, i, cur->type);
13952 any = TRUE;
13953 }
13954
13955 if (!any)
13956 warn (_("Section '%s' was not dumped because it does not exist!\n"),
13957 cur->name);
13958 }
13959 }
13960
13961 static bfd_boolean
13962 process_section_contents (Filedata * filedata)
13963 {
13964 Elf_Internal_Shdr * section;
13965 unsigned int i;
13966 bfd_boolean res = TRUE;
13967
13968 if (! do_dump)
13969 return TRUE;
13970
13971 initialise_dumps_byname (filedata);
13972
13973 for (i = 0, section = filedata->section_headers;
13974 i < filedata->file_header.e_shnum && i < filedata->num_dump_sects;
13975 i++, section++)
13976 {
13977 dump_type dump = filedata->dump_sects[i];
13978
13979 #ifdef SUPPORT_DISASSEMBLY
13980 if (dump & DISASS_DUMP)
13981 {
13982 if (! disassemble_section (section, filedata))
13983 res = FALSE;
13984 }
13985 #endif
13986 if (dump & HEX_DUMP)
13987 {
13988 if (! dump_section_as_bytes (section, filedata, FALSE))
13989 res = FALSE;
13990 }
13991
13992 if (dump & RELOC_DUMP)
13993 {
13994 if (! dump_section_as_bytes (section, filedata, TRUE))
13995 res = FALSE;
13996 }
13997
13998 if (dump & STRING_DUMP)
13999 {
14000 if (! dump_section_as_strings (section, filedata))
14001 res = FALSE;
14002 }
14003
14004 if (dump & DEBUG_DUMP)
14005 {
14006 if (! display_debug_section (i, section, filedata))
14007 res = FALSE;
14008 }
14009 }
14010
14011 /* Check to see if the user requested a
14012 dump of a section that does not exist. */
14013 while (i < filedata->num_dump_sects)
14014 {
14015 if (filedata->dump_sects[i])
14016 {
14017 warn (_("Section %d was not dumped because it does not exist!\n"), i);
14018 res = FALSE;
14019 }
14020 i++;
14021 }
14022
14023 return res;
14024 }
14025
14026 static void
14027 process_mips_fpe_exception (int mask)
14028 {
14029 if (mask)
14030 {
14031 bfd_boolean first = TRUE;
14032
14033 if (mask & OEX_FPU_INEX)
14034 fputs ("INEX", stdout), first = FALSE;
14035 if (mask & OEX_FPU_UFLO)
14036 printf ("%sUFLO", first ? "" : "|"), first = FALSE;
14037 if (mask & OEX_FPU_OFLO)
14038 printf ("%sOFLO", first ? "" : "|"), first = FALSE;
14039 if (mask & OEX_FPU_DIV0)
14040 printf ("%sDIV0", first ? "" : "|"), first = FALSE;
14041 if (mask & OEX_FPU_INVAL)
14042 printf ("%sINVAL", first ? "" : "|");
14043 }
14044 else
14045 fputs ("0", stdout);
14046 }
14047
14048 /* Display's the value of TAG at location P. If TAG is
14049 greater than 0 it is assumed to be an unknown tag, and
14050 a message is printed to this effect. Otherwise it is
14051 assumed that a message has already been printed.
14052
14053 If the bottom bit of TAG is set it assumed to have a
14054 string value, otherwise it is assumed to have an integer
14055 value.
14056
14057 Returns an updated P pointing to the first unread byte
14058 beyond the end of TAG's value.
14059
14060 Reads at or beyond END will not be made. */
14061
14062 static unsigned char *
14063 display_tag_value (signed int tag,
14064 unsigned char * p,
14065 const unsigned char * const end)
14066 {
14067 unsigned long val;
14068
14069 if (tag > 0)
14070 printf (" Tag_unknown_%d: ", tag);
14071
14072 if (p >= end)
14073 {
14074 warn (_("<corrupt tag>\n"));
14075 }
14076 else if (tag & 1)
14077 {
14078 /* PR 17531 file: 027-19978-0.004. */
14079 size_t maxlen = (end - p) - 1;
14080
14081 putchar ('"');
14082 if (maxlen > 0)
14083 {
14084 print_symbol ((int) maxlen, (const char *) p);
14085 p += strnlen ((char *) p, maxlen) + 1;
14086 }
14087 else
14088 {
14089 printf (_("<corrupt string tag>"));
14090 p = (unsigned char *) end;
14091 }
14092 printf ("\"\n");
14093 }
14094 else
14095 {
14096 unsigned int len;
14097
14098 val = read_uleb128 (p, &len, end);
14099 p += len;
14100 printf ("%ld (0x%lx)\n", val, val);
14101 }
14102
14103 assert (p <= end);
14104 return p;
14105 }
14106
14107 /* ARC ABI attributes section. */
14108
14109 static unsigned char *
14110 display_arc_attribute (unsigned char * p,
14111 const unsigned char * const end)
14112 {
14113 unsigned int tag;
14114 unsigned int len;
14115 unsigned int val;
14116
14117 tag = read_uleb128 (p, &len, end);
14118 p += len;
14119
14120 switch (tag)
14121 {
14122 case Tag_ARC_PCS_config:
14123 val = read_uleb128 (p, &len, end);
14124 p += len;
14125 printf (" Tag_ARC_PCS_config: ");
14126 switch (val)
14127 {
14128 case 0:
14129 printf (_("Absent/Non standard\n"));
14130 break;
14131 case 1:
14132 printf (_("Bare metal/mwdt\n"));
14133 break;
14134 case 2:
14135 printf (_("Bare metal/newlib\n"));
14136 break;
14137 case 3:
14138 printf (_("Linux/uclibc\n"));
14139 break;
14140 case 4:
14141 printf (_("Linux/glibc\n"));
14142 break;
14143 default:
14144 printf (_("Unknown\n"));
14145 break;
14146 }
14147 break;
14148
14149 case Tag_ARC_CPU_base:
14150 val = read_uleb128 (p, &len, end);
14151 p += len;
14152 printf (" Tag_ARC_CPU_base: ");
14153 switch (val)
14154 {
14155 default:
14156 case TAG_CPU_NONE:
14157 printf (_("Absent\n"));
14158 break;
14159 case TAG_CPU_ARC6xx:
14160 printf ("ARC6xx\n");
14161 break;
14162 case TAG_CPU_ARC7xx:
14163 printf ("ARC7xx\n");
14164 break;
14165 case TAG_CPU_ARCEM:
14166 printf ("ARCEM\n");
14167 break;
14168 case TAG_CPU_ARCHS:
14169 printf ("ARCHS\n");
14170 break;
14171 }
14172 break;
14173
14174 case Tag_ARC_CPU_variation:
14175 val = read_uleb128 (p, &len, end);
14176 p += len;
14177 printf (" Tag_ARC_CPU_variation: ");
14178 switch (val)
14179 {
14180 default:
14181 if (val > 0 && val < 16)
14182 printf ("Core%d\n", val);
14183 else
14184 printf ("Unknown\n");
14185 break;
14186
14187 case 0:
14188 printf (_("Absent\n"));
14189 break;
14190 }
14191 break;
14192
14193 case Tag_ARC_CPU_name:
14194 printf (" Tag_ARC_CPU_name: ");
14195 p = display_tag_value (-1, p, end);
14196 break;
14197
14198 case Tag_ARC_ABI_rf16:
14199 val = read_uleb128 (p, &len, end);
14200 p += len;
14201 printf (" Tag_ARC_ABI_rf16: %s\n", val ? _("yes") : _("no"));
14202 break;
14203
14204 case Tag_ARC_ABI_osver:
14205 val = read_uleb128 (p, &len, end);
14206 p += len;
14207 printf (" Tag_ARC_ABI_osver: v%d\n", val);
14208 break;
14209
14210 case Tag_ARC_ABI_pic:
14211 case Tag_ARC_ABI_sda:
14212 val = read_uleb128 (p, &len, end);
14213 p += len;
14214 printf (tag == Tag_ARC_ABI_sda ? " Tag_ARC_ABI_sda: "
14215 : " Tag_ARC_ABI_pic: ");
14216 switch (val)
14217 {
14218 case 0:
14219 printf (_("Absent\n"));
14220 break;
14221 case 1:
14222 printf ("MWDT\n");
14223 break;
14224 case 2:
14225 printf ("GNU\n");
14226 break;
14227 default:
14228 printf (_("Unknown\n"));
14229 break;
14230 }
14231 break;
14232
14233 case Tag_ARC_ABI_tls:
14234 val = read_uleb128 (p, &len, end);
14235 p += len;
14236 printf (" Tag_ARC_ABI_tls: %s\n", val ? "r25": "none");
14237 break;
14238
14239 case Tag_ARC_ABI_enumsize:
14240 val = read_uleb128 (p, &len, end);
14241 p += len;
14242 printf (" Tag_ARC_ABI_enumsize: %s\n", val ? _("default") :
14243 _("smallest"));
14244 break;
14245
14246 case Tag_ARC_ABI_exceptions:
14247 val = read_uleb128 (p, &len, end);
14248 p += len;
14249 printf (" Tag_ARC_ABI_exceptions: %s\n", val ? _("OPTFP")
14250 : _("default"));
14251 break;
14252
14253 case Tag_ARC_ABI_double_size:
14254 val = read_uleb128 (p, &len, end);
14255 p += len;
14256 printf (" Tag_ARC_ABI_double_size: %d\n", val);
14257 break;
14258
14259 case Tag_ARC_ISA_config:
14260 printf (" Tag_ARC_ISA_config: ");
14261 p = display_tag_value (-1, p, end);
14262 break;
14263
14264 case Tag_ARC_ISA_apex:
14265 printf (" Tag_ARC_ISA_apex: ");
14266 p = display_tag_value (-1, p, end);
14267 break;
14268
14269 case Tag_ARC_ISA_mpy_option:
14270 val = read_uleb128 (p, &len, end);
14271 p += len;
14272 printf (" Tag_ARC_ISA_mpy_option: %d\n", val);
14273 break;
14274
14275 case Tag_ARC_ATR_version:
14276 val = read_uleb128 (p, &len, end);
14277 p += len;
14278 printf (" Tag_ARC_ATR_version: %d\n", val);
14279 break;
14280
14281 default:
14282 return display_tag_value (tag & 1, p, end);
14283 }
14284
14285 return p;
14286 }
14287
14288 /* ARM EABI attributes section. */
14289 typedef struct
14290 {
14291 unsigned int tag;
14292 const char * name;
14293 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
14294 unsigned int type;
14295 const char ** table;
14296 } arm_attr_public_tag;
14297
14298 static const char * arm_attr_tag_CPU_arch[] =
14299 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
14300 "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "v8-R", "v8-M.baseline",
14301 "v8-M.mainline"};
14302 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
14303 static const char * arm_attr_tag_THUMB_ISA_use[] =
14304 {"No", "Thumb-1", "Thumb-2", "Yes"};
14305 static const char * arm_attr_tag_FP_arch[] =
14306 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
14307 "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
14308 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
14309 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
14310 {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
14311 "NEON for ARMv8.1"};
14312 static const char * arm_attr_tag_PCS_config[] =
14313 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
14314 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
14315 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
14316 {"V6", "SB", "TLS", "Unused"};
14317 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
14318 {"Absolute", "PC-relative", "SB-relative", "None"};
14319 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
14320 {"Absolute", "PC-relative", "None"};
14321 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
14322 {"None", "direct", "GOT-indirect"};
14323 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
14324 {"None", "??? 1", "2", "??? 3", "4"};
14325 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
14326 static const char * arm_attr_tag_ABI_FP_denormal[] =
14327 {"Unused", "Needed", "Sign only"};
14328 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
14329 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
14330 static const char * arm_attr_tag_ABI_FP_number_model[] =
14331 {"Unused", "Finite", "RTABI", "IEEE 754"};
14332 static const char * arm_attr_tag_ABI_enum_size[] =
14333 {"Unused", "small", "int", "forced to int"};
14334 static const char * arm_attr_tag_ABI_HardFP_use[] =
14335 {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
14336 static const char * arm_attr_tag_ABI_VFP_args[] =
14337 {"AAPCS", "VFP registers", "custom", "compatible"};
14338 static const char * arm_attr_tag_ABI_WMMX_args[] =
14339 {"AAPCS", "WMMX registers", "custom"};
14340 static const char * arm_attr_tag_ABI_optimization_goals[] =
14341 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14342 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
14343 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
14344 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14345 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
14346 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
14347 static const char * arm_attr_tag_FP_HP_extension[] =
14348 {"Not Allowed", "Allowed"};
14349 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
14350 {"None", "IEEE 754", "Alternative Format"};
14351 static const char * arm_attr_tag_DSP_extension[] =
14352 {"Follow architecture", "Allowed"};
14353 static const char * arm_attr_tag_MPextension_use[] =
14354 {"Not Allowed", "Allowed"};
14355 static const char * arm_attr_tag_DIV_use[] =
14356 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
14357 "Allowed in v7-A with integer division extension"};
14358 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
14359 static const char * arm_attr_tag_Virtualization_use[] =
14360 {"Not Allowed", "TrustZone", "Virtualization Extensions",
14361 "TrustZone and Virtualization Extensions"};
14362 static const char * arm_attr_tag_MPextension_use_legacy[] =
14363 {"Not Allowed", "Allowed"};
14364
14365 #define LOOKUP(id, name) \
14366 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
14367 static arm_attr_public_tag arm_attr_public_tags[] =
14368 {
14369 {4, "CPU_raw_name", 1, NULL},
14370 {5, "CPU_name", 1, NULL},
14371 LOOKUP(6, CPU_arch),
14372 {7, "CPU_arch_profile", 0, NULL},
14373 LOOKUP(8, ARM_ISA_use),
14374 LOOKUP(9, THUMB_ISA_use),
14375 LOOKUP(10, FP_arch),
14376 LOOKUP(11, WMMX_arch),
14377 LOOKUP(12, Advanced_SIMD_arch),
14378 LOOKUP(13, PCS_config),
14379 LOOKUP(14, ABI_PCS_R9_use),
14380 LOOKUP(15, ABI_PCS_RW_data),
14381 LOOKUP(16, ABI_PCS_RO_data),
14382 LOOKUP(17, ABI_PCS_GOT_use),
14383 LOOKUP(18, ABI_PCS_wchar_t),
14384 LOOKUP(19, ABI_FP_rounding),
14385 LOOKUP(20, ABI_FP_denormal),
14386 LOOKUP(21, ABI_FP_exceptions),
14387 LOOKUP(22, ABI_FP_user_exceptions),
14388 LOOKUP(23, ABI_FP_number_model),
14389 {24, "ABI_align_needed", 0, NULL},
14390 {25, "ABI_align_preserved", 0, NULL},
14391 LOOKUP(26, ABI_enum_size),
14392 LOOKUP(27, ABI_HardFP_use),
14393 LOOKUP(28, ABI_VFP_args),
14394 LOOKUP(29, ABI_WMMX_args),
14395 LOOKUP(30, ABI_optimization_goals),
14396 LOOKUP(31, ABI_FP_optimization_goals),
14397 {32, "compatibility", 0, NULL},
14398 LOOKUP(34, CPU_unaligned_access),
14399 LOOKUP(36, FP_HP_extension),
14400 LOOKUP(38, ABI_FP_16bit_format),
14401 LOOKUP(42, MPextension_use),
14402 LOOKUP(44, DIV_use),
14403 LOOKUP(46, DSP_extension),
14404 {64, "nodefaults", 0, NULL},
14405 {65, "also_compatible_with", 0, NULL},
14406 LOOKUP(66, T2EE_use),
14407 {67, "conformance", 1, NULL},
14408 LOOKUP(68, Virtualization_use),
14409 LOOKUP(70, MPextension_use_legacy)
14410 };
14411 #undef LOOKUP
14412
14413 static unsigned char *
14414 display_arm_attribute (unsigned char * p,
14415 const unsigned char * const end)
14416 {
14417 unsigned int tag;
14418 unsigned int len;
14419 unsigned int val;
14420 arm_attr_public_tag * attr;
14421 unsigned i;
14422 unsigned int type;
14423
14424 tag = read_uleb128 (p, &len, end);
14425 p += len;
14426 attr = NULL;
14427 for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
14428 {
14429 if (arm_attr_public_tags[i].tag == tag)
14430 {
14431 attr = &arm_attr_public_tags[i];
14432 break;
14433 }
14434 }
14435
14436 if (attr)
14437 {
14438 printf (" Tag_%s: ", attr->name);
14439 switch (attr->type)
14440 {
14441 case 0:
14442 switch (tag)
14443 {
14444 case 7: /* Tag_CPU_arch_profile. */
14445 val = read_uleb128 (p, &len, end);
14446 p += len;
14447 switch (val)
14448 {
14449 case 0: printf (_("None\n")); break;
14450 case 'A': printf (_("Application\n")); break;
14451 case 'R': printf (_("Realtime\n")); break;
14452 case 'M': printf (_("Microcontroller\n")); break;
14453 case 'S': printf (_("Application or Realtime\n")); break;
14454 default: printf ("??? (%d)\n", val); break;
14455 }
14456 break;
14457
14458 case 24: /* Tag_align_needed. */
14459 val = read_uleb128 (p, &len, end);
14460 p += len;
14461 switch (val)
14462 {
14463 case 0: printf (_("None\n")); break;
14464 case 1: printf (_("8-byte\n")); break;
14465 case 2: printf (_("4-byte\n")); break;
14466 case 3: printf ("??? 3\n"); break;
14467 default:
14468 if (val <= 12)
14469 printf (_("8-byte and up to %d-byte extended\n"),
14470 1 << val);
14471 else
14472 printf ("??? (%d)\n", val);
14473 break;
14474 }
14475 break;
14476
14477 case 25: /* Tag_align_preserved. */
14478 val = read_uleb128 (p, &len, end);
14479 p += len;
14480 switch (val)
14481 {
14482 case 0: printf (_("None\n")); break;
14483 case 1: printf (_("8-byte, except leaf SP\n")); break;
14484 case 2: printf (_("8-byte\n")); break;
14485 case 3: printf ("??? 3\n"); break;
14486 default:
14487 if (val <= 12)
14488 printf (_("8-byte and up to %d-byte extended\n"),
14489 1 << val);
14490 else
14491 printf ("??? (%d)\n", val);
14492 break;
14493 }
14494 break;
14495
14496 case 32: /* Tag_compatibility. */
14497 {
14498 val = read_uleb128 (p, &len, end);
14499 p += len;
14500 printf (_("flag = %d, vendor = "), val);
14501 if (p < end - 1)
14502 {
14503 size_t maxlen = (end - p) - 1;
14504
14505 print_symbol ((int) maxlen, (const char *) p);
14506 p += strnlen ((char *) p, maxlen) + 1;
14507 }
14508 else
14509 {
14510 printf (_("<corrupt>"));
14511 p = (unsigned char *) end;
14512 }
14513 putchar ('\n');
14514 }
14515 break;
14516
14517 case 64: /* Tag_nodefaults. */
14518 /* PR 17531: file: 001-505008-0.01. */
14519 if (p < end)
14520 p++;
14521 printf (_("True\n"));
14522 break;
14523
14524 case 65: /* Tag_also_compatible_with. */
14525 val = read_uleb128 (p, &len, end);
14526 p += len;
14527 if (val == 6 /* Tag_CPU_arch. */)
14528 {
14529 val = read_uleb128 (p, &len, end);
14530 p += len;
14531 if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
14532 printf ("??? (%d)\n", val);
14533 else
14534 printf ("%s\n", arm_attr_tag_CPU_arch[val]);
14535 }
14536 else
14537 printf ("???\n");
14538 while (p < end && *(p++) != '\0' /* NUL terminator. */)
14539 ;
14540 break;
14541
14542 default:
14543 printf (_("<unknown: %d>\n"), tag);
14544 break;
14545 }
14546 return p;
14547
14548 case 1:
14549 return display_tag_value (-1, p, end);
14550 case 2:
14551 return display_tag_value (0, p, end);
14552
14553 default:
14554 assert (attr->type & 0x80);
14555 val = read_uleb128 (p, &len, end);
14556 p += len;
14557 type = attr->type & 0x7f;
14558 if (val >= type)
14559 printf ("??? (%d)\n", val);
14560 else
14561 printf ("%s\n", attr->table[val]);
14562 return p;
14563 }
14564 }
14565
14566 return display_tag_value (tag, p, end);
14567 }
14568
14569 static unsigned char *
14570 display_gnu_attribute (unsigned char * p,
14571 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const),
14572 const unsigned char * const end)
14573 {
14574 int tag;
14575 unsigned int len;
14576 unsigned int val;
14577
14578 tag = read_uleb128 (p, &len, end);
14579 p += len;
14580
14581 /* Tag_compatibility is the only generic GNU attribute defined at
14582 present. */
14583 if (tag == 32)
14584 {
14585 val = read_uleb128 (p, &len, end);
14586 p += len;
14587
14588 printf (_("flag = %d, vendor = "), val);
14589 if (p == end)
14590 {
14591 printf (_("<corrupt>\n"));
14592 warn (_("corrupt vendor attribute\n"));
14593 }
14594 else
14595 {
14596 if (p < end - 1)
14597 {
14598 size_t maxlen = (end - p) - 1;
14599
14600 print_symbol ((int) maxlen, (const char *) p);
14601 p += strnlen ((char *) p, maxlen) + 1;
14602 }
14603 else
14604 {
14605 printf (_("<corrupt>"));
14606 p = (unsigned char *) end;
14607 }
14608 putchar ('\n');
14609 }
14610 return p;
14611 }
14612
14613 if ((tag & 2) == 0 && display_proc_gnu_attribute)
14614 return display_proc_gnu_attribute (p, tag, end);
14615
14616 return display_tag_value (tag, p, end);
14617 }
14618
14619 static unsigned char *
14620 display_power_gnu_attribute (unsigned char * p,
14621 unsigned int tag,
14622 const unsigned char * const end)
14623 {
14624 unsigned int len;
14625 unsigned int val;
14626
14627 if (tag == Tag_GNU_Power_ABI_FP)
14628 {
14629 val = read_uleb128 (p, &len, end);
14630 p += len;
14631 printf (" Tag_GNU_Power_ABI_FP: ");
14632 if (len == 0)
14633 {
14634 printf (_("<corrupt>\n"));
14635 return p;
14636 }
14637
14638 if (val > 15)
14639 printf ("(%#x), ", val);
14640
14641 switch (val & 3)
14642 {
14643 case 0:
14644 printf (_("unspecified hard/soft float, "));
14645 break;
14646 case 1:
14647 printf (_("hard float, "));
14648 break;
14649 case 2:
14650 printf (_("soft float, "));
14651 break;
14652 case 3:
14653 printf (_("single-precision hard float, "));
14654 break;
14655 }
14656
14657 switch (val & 0xC)
14658 {
14659 case 0:
14660 printf (_("unspecified long double\n"));
14661 break;
14662 case 4:
14663 printf (_("128-bit IBM long double\n"));
14664 break;
14665 case 8:
14666 printf (_("64-bit long double\n"));
14667 break;
14668 case 12:
14669 printf (_("128-bit IEEE long double\n"));
14670 break;
14671 }
14672 return p;
14673 }
14674
14675 if (tag == Tag_GNU_Power_ABI_Vector)
14676 {
14677 val = read_uleb128 (p, &len, end);
14678 p += len;
14679 printf (" Tag_GNU_Power_ABI_Vector: ");
14680 if (len == 0)
14681 {
14682 printf (_("<corrupt>\n"));
14683 return p;
14684 }
14685
14686 if (val > 3)
14687 printf ("(%#x), ", val);
14688
14689 switch (val & 3)
14690 {
14691 case 0:
14692 printf (_("unspecified\n"));
14693 break;
14694 case 1:
14695 printf (_("generic\n"));
14696 break;
14697 case 2:
14698 printf ("AltiVec\n");
14699 break;
14700 case 3:
14701 printf ("SPE\n");
14702 break;
14703 }
14704 return p;
14705 }
14706
14707 if (tag == Tag_GNU_Power_ABI_Struct_Return)
14708 {
14709 val = read_uleb128 (p, &len, end);
14710 p += len;
14711 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
14712 if (len == 0)
14713 {
14714 printf (_("<corrupt>\n"));
14715 return p;
14716 }
14717
14718 if (val > 2)
14719 printf ("(%#x), ", val);
14720
14721 switch (val & 3)
14722 {
14723 case 0:
14724 printf (_("unspecified\n"));
14725 break;
14726 case 1:
14727 printf ("r3/r4\n");
14728 break;
14729 case 2:
14730 printf (_("memory\n"));
14731 break;
14732 case 3:
14733 printf ("???\n");
14734 break;
14735 }
14736 return p;
14737 }
14738
14739 return display_tag_value (tag & 1, p, end);
14740 }
14741
14742 static unsigned char *
14743 display_s390_gnu_attribute (unsigned char * p,
14744 unsigned int tag,
14745 const unsigned char * const end)
14746 {
14747 unsigned int len;
14748 int val;
14749
14750 if (tag == Tag_GNU_S390_ABI_Vector)
14751 {
14752 val = read_uleb128 (p, &len, end);
14753 p += len;
14754 printf (" Tag_GNU_S390_ABI_Vector: ");
14755
14756 switch (val)
14757 {
14758 case 0:
14759 printf (_("any\n"));
14760 break;
14761 case 1:
14762 printf (_("software\n"));
14763 break;
14764 case 2:
14765 printf (_("hardware\n"));
14766 break;
14767 default:
14768 printf ("??? (%d)\n", val);
14769 break;
14770 }
14771 return p;
14772 }
14773
14774 return display_tag_value (tag & 1, p, end);
14775 }
14776
14777 static void
14778 display_sparc_hwcaps (unsigned int mask)
14779 {
14780 if (mask)
14781 {
14782 bfd_boolean first = TRUE;
14783
14784 if (mask & ELF_SPARC_HWCAP_MUL32)
14785 fputs ("mul32", stdout), first = FALSE;
14786 if (mask & ELF_SPARC_HWCAP_DIV32)
14787 printf ("%sdiv32", first ? "" : "|"), first = FALSE;
14788 if (mask & ELF_SPARC_HWCAP_FSMULD)
14789 printf ("%sfsmuld", first ? "" : "|"), first = FALSE;
14790 if (mask & ELF_SPARC_HWCAP_V8PLUS)
14791 printf ("%sv8plus", first ? "" : "|"), first = FALSE;
14792 if (mask & ELF_SPARC_HWCAP_POPC)
14793 printf ("%spopc", first ? "" : "|"), first = FALSE;
14794 if (mask & ELF_SPARC_HWCAP_VIS)
14795 printf ("%svis", first ? "" : "|"), first = FALSE;
14796 if (mask & ELF_SPARC_HWCAP_VIS2)
14797 printf ("%svis2", first ? "" : "|"), first = FALSE;
14798 if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
14799 printf ("%sASIBlkInit", first ? "" : "|"), first = FALSE;
14800 if (mask & ELF_SPARC_HWCAP_FMAF)
14801 printf ("%sfmaf", first ? "" : "|"), first = FALSE;
14802 if (mask & ELF_SPARC_HWCAP_VIS3)
14803 printf ("%svis3", first ? "" : "|"), first = FALSE;
14804 if (mask & ELF_SPARC_HWCAP_HPC)
14805 printf ("%shpc", first ? "" : "|"), first = FALSE;
14806 if (mask & ELF_SPARC_HWCAP_RANDOM)
14807 printf ("%srandom", first ? "" : "|"), first = FALSE;
14808 if (mask & ELF_SPARC_HWCAP_TRANS)
14809 printf ("%strans", first ? "" : "|"), first = FALSE;
14810 if (mask & ELF_SPARC_HWCAP_FJFMAU)
14811 printf ("%sfjfmau", first ? "" : "|"), first = FALSE;
14812 if (mask & ELF_SPARC_HWCAP_IMA)
14813 printf ("%sima", first ? "" : "|"), first = FALSE;
14814 if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
14815 printf ("%scspare", first ? "" : "|"), first = FALSE;
14816 }
14817 else
14818 fputc ('0', stdout);
14819 fputc ('\n', stdout);
14820 }
14821
14822 static void
14823 display_sparc_hwcaps2 (unsigned int mask)
14824 {
14825 if (mask)
14826 {
14827 bfd_boolean first = TRUE;
14828
14829 if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
14830 fputs ("fjathplus", stdout), first = FALSE;
14831 if (mask & ELF_SPARC_HWCAP2_VIS3B)
14832 printf ("%svis3b", first ? "" : "|"), first = FALSE;
14833 if (mask & ELF_SPARC_HWCAP2_ADP)
14834 printf ("%sadp", first ? "" : "|"), first = FALSE;
14835 if (mask & ELF_SPARC_HWCAP2_SPARC5)
14836 printf ("%ssparc5", first ? "" : "|"), first = FALSE;
14837 if (mask & ELF_SPARC_HWCAP2_MWAIT)
14838 printf ("%smwait", first ? "" : "|"), first = FALSE;
14839 if (mask & ELF_SPARC_HWCAP2_XMPMUL)
14840 printf ("%sxmpmul", first ? "" : "|"), first = FALSE;
14841 if (mask & ELF_SPARC_HWCAP2_XMONT)
14842 printf ("%sxmont2", first ? "" : "|"), first = FALSE;
14843 if (mask & ELF_SPARC_HWCAP2_NSEC)
14844 printf ("%snsec", first ? "" : "|"), first = FALSE;
14845 if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
14846 printf ("%sfjathhpc", first ? "" : "|"), first = FALSE;
14847 if (mask & ELF_SPARC_HWCAP2_FJDES)
14848 printf ("%sfjdes", first ? "" : "|"), first = FALSE;
14849 if (mask & ELF_SPARC_HWCAP2_FJAES)
14850 printf ("%sfjaes", first ? "" : "|"), first = FALSE;
14851 }
14852 else
14853 fputc ('0', stdout);
14854 fputc ('\n', stdout);
14855 }
14856
14857 static unsigned char *
14858 display_sparc_gnu_attribute (unsigned char * p,
14859 unsigned int tag,
14860 const unsigned char * const end)
14861 {
14862 unsigned int len;
14863 int val;
14864
14865 if (tag == Tag_GNU_Sparc_HWCAPS)
14866 {
14867 val = read_uleb128 (p, &len, end);
14868 p += len;
14869 printf (" Tag_GNU_Sparc_HWCAPS: ");
14870 display_sparc_hwcaps (val);
14871 return p;
14872 }
14873 if (tag == Tag_GNU_Sparc_HWCAPS2)
14874 {
14875 val = read_uleb128 (p, &len, end);
14876 p += len;
14877 printf (" Tag_GNU_Sparc_HWCAPS2: ");
14878 display_sparc_hwcaps2 (val);
14879 return p;
14880 }
14881
14882 return display_tag_value (tag, p, end);
14883 }
14884
14885 static void
14886 print_mips_fp_abi_value (unsigned int val)
14887 {
14888 switch (val)
14889 {
14890 case Val_GNU_MIPS_ABI_FP_ANY:
14891 printf (_("Hard or soft float\n"));
14892 break;
14893 case Val_GNU_MIPS_ABI_FP_DOUBLE:
14894 printf (_("Hard float (double precision)\n"));
14895 break;
14896 case Val_GNU_MIPS_ABI_FP_SINGLE:
14897 printf (_("Hard float (single precision)\n"));
14898 break;
14899 case Val_GNU_MIPS_ABI_FP_SOFT:
14900 printf (_("Soft float\n"));
14901 break;
14902 case Val_GNU_MIPS_ABI_FP_OLD_64:
14903 printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
14904 break;
14905 case Val_GNU_MIPS_ABI_FP_XX:
14906 printf (_("Hard float (32-bit CPU, Any FPU)\n"));
14907 break;
14908 case Val_GNU_MIPS_ABI_FP_64:
14909 printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
14910 break;
14911 case Val_GNU_MIPS_ABI_FP_64A:
14912 printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
14913 break;
14914 case Val_GNU_MIPS_ABI_FP_NAN2008:
14915 printf (_("NaN 2008 compatibility\n"));
14916 break;
14917 default:
14918 printf ("??? (%d)\n", val);
14919 break;
14920 }
14921 }
14922
14923 static unsigned char *
14924 display_mips_gnu_attribute (unsigned char * p,
14925 unsigned int tag,
14926 const unsigned char * const end)
14927 {
14928 if (tag == Tag_GNU_MIPS_ABI_FP)
14929 {
14930 unsigned int len;
14931 unsigned int val;
14932
14933 val = read_uleb128 (p, &len, end);
14934 p += len;
14935 printf (" Tag_GNU_MIPS_ABI_FP: ");
14936
14937 print_mips_fp_abi_value (val);
14938
14939 return p;
14940 }
14941
14942 if (tag == Tag_GNU_MIPS_ABI_MSA)
14943 {
14944 unsigned int len;
14945 unsigned int val;
14946
14947 val = read_uleb128 (p, &len, end);
14948 p += len;
14949 printf (" Tag_GNU_MIPS_ABI_MSA: ");
14950
14951 switch (val)
14952 {
14953 case Val_GNU_MIPS_ABI_MSA_ANY:
14954 printf (_("Any MSA or not\n"));
14955 break;
14956 case Val_GNU_MIPS_ABI_MSA_128:
14957 printf (_("128-bit MSA\n"));
14958 break;
14959 default:
14960 printf ("??? (%d)\n", val);
14961 break;
14962 }
14963 return p;
14964 }
14965
14966 return display_tag_value (tag & 1, p, end);
14967 }
14968
14969 static unsigned char *
14970 display_tic6x_attribute (unsigned char * p,
14971 const unsigned char * const end)
14972 {
14973 unsigned int tag;
14974 unsigned int len;
14975 int val;
14976
14977 tag = read_uleb128 (p, &len, end);
14978 p += len;
14979
14980 switch (tag)
14981 {
14982 case Tag_ISA:
14983 val = read_uleb128 (p, &len, end);
14984 p += len;
14985 printf (" Tag_ISA: ");
14986
14987 switch (val)
14988 {
14989 case C6XABI_Tag_ISA_none:
14990 printf (_("None\n"));
14991 break;
14992 case C6XABI_Tag_ISA_C62X:
14993 printf ("C62x\n");
14994 break;
14995 case C6XABI_Tag_ISA_C67X:
14996 printf ("C67x\n");
14997 break;
14998 case C6XABI_Tag_ISA_C67XP:
14999 printf ("C67x+\n");
15000 break;
15001 case C6XABI_Tag_ISA_C64X:
15002 printf ("C64x\n");
15003 break;
15004 case C6XABI_Tag_ISA_C64XP:
15005 printf ("C64x+\n");
15006 break;
15007 case C6XABI_Tag_ISA_C674X:
15008 printf ("C674x\n");
15009 break;
15010 default:
15011 printf ("??? (%d)\n", val);
15012 break;
15013 }
15014 return p;
15015
15016 case Tag_ABI_wchar_t:
15017 val = read_uleb128 (p, &len, end);
15018 p += len;
15019 printf (" Tag_ABI_wchar_t: ");
15020 switch (val)
15021 {
15022 case 0:
15023 printf (_("Not used\n"));
15024 break;
15025 case 1:
15026 printf (_("2 bytes\n"));
15027 break;
15028 case 2:
15029 printf (_("4 bytes\n"));
15030 break;
15031 default:
15032 printf ("??? (%d)\n", val);
15033 break;
15034 }
15035 return p;
15036
15037 case Tag_ABI_stack_align_needed:
15038 val = read_uleb128 (p, &len, end);
15039 p += len;
15040 printf (" Tag_ABI_stack_align_needed: ");
15041 switch (val)
15042 {
15043 case 0:
15044 printf (_("8-byte\n"));
15045 break;
15046 case 1:
15047 printf (_("16-byte\n"));
15048 break;
15049 default:
15050 printf ("??? (%d)\n", val);
15051 break;
15052 }
15053 return p;
15054
15055 case Tag_ABI_stack_align_preserved:
15056 val = read_uleb128 (p, &len, end);
15057 p += len;
15058 printf (" Tag_ABI_stack_align_preserved: ");
15059 switch (val)
15060 {
15061 case 0:
15062 printf (_("8-byte\n"));
15063 break;
15064 case 1:
15065 printf (_("16-byte\n"));
15066 break;
15067 default:
15068 printf ("??? (%d)\n", val);
15069 break;
15070 }
15071 return p;
15072
15073 case Tag_ABI_DSBT:
15074 val = read_uleb128 (p, &len, end);
15075 p += len;
15076 printf (" Tag_ABI_DSBT: ");
15077 switch (val)
15078 {
15079 case 0:
15080 printf (_("DSBT addressing not used\n"));
15081 break;
15082 case 1:
15083 printf (_("DSBT addressing used\n"));
15084 break;
15085 default:
15086 printf ("??? (%d)\n", val);
15087 break;
15088 }
15089 return p;
15090
15091 case Tag_ABI_PID:
15092 val = read_uleb128 (p, &len, end);
15093 p += len;
15094 printf (" Tag_ABI_PID: ");
15095 switch (val)
15096 {
15097 case 0:
15098 printf (_("Data addressing position-dependent\n"));
15099 break;
15100 case 1:
15101 printf (_("Data addressing position-independent, GOT near DP\n"));
15102 break;
15103 case 2:
15104 printf (_("Data addressing position-independent, GOT far from DP\n"));
15105 break;
15106 default:
15107 printf ("??? (%d)\n", val);
15108 break;
15109 }
15110 return p;
15111
15112 case Tag_ABI_PIC:
15113 val = read_uleb128 (p, &len, end);
15114 p += len;
15115 printf (" Tag_ABI_PIC: ");
15116 switch (val)
15117 {
15118 case 0:
15119 printf (_("Code addressing position-dependent\n"));
15120 break;
15121 case 1:
15122 printf (_("Code addressing position-independent\n"));
15123 break;
15124 default:
15125 printf ("??? (%d)\n", val);
15126 break;
15127 }
15128 return p;
15129
15130 case Tag_ABI_array_object_alignment:
15131 val = read_uleb128 (p, &len, end);
15132 p += len;
15133 printf (" Tag_ABI_array_object_alignment: ");
15134 switch (val)
15135 {
15136 case 0:
15137 printf (_("8-byte\n"));
15138 break;
15139 case 1:
15140 printf (_("4-byte\n"));
15141 break;
15142 case 2:
15143 printf (_("16-byte\n"));
15144 break;
15145 default:
15146 printf ("??? (%d)\n", val);
15147 break;
15148 }
15149 return p;
15150
15151 case Tag_ABI_array_object_align_expected:
15152 val = read_uleb128 (p, &len, end);
15153 p += len;
15154 printf (" Tag_ABI_array_object_align_expected: ");
15155 switch (val)
15156 {
15157 case 0:
15158 printf (_("8-byte\n"));
15159 break;
15160 case 1:
15161 printf (_("4-byte\n"));
15162 break;
15163 case 2:
15164 printf (_("16-byte\n"));
15165 break;
15166 default:
15167 printf ("??? (%d)\n", val);
15168 break;
15169 }
15170 return p;
15171
15172 case Tag_ABI_compatibility:
15173 {
15174 val = read_uleb128 (p, &len, end);
15175 p += len;
15176 printf (" Tag_ABI_compatibility: ");
15177 printf (_("flag = %d, vendor = "), val);
15178 if (p < end - 1)
15179 {
15180 size_t maxlen = (end - p) - 1;
15181
15182 print_symbol ((int) maxlen, (const char *) p);
15183 p += strnlen ((char *) p, maxlen) + 1;
15184 }
15185 else
15186 {
15187 printf (_("<corrupt>"));
15188 p = (unsigned char *) end;
15189 }
15190 putchar ('\n');
15191 return p;
15192 }
15193
15194 case Tag_ABI_conformance:
15195 {
15196 printf (" Tag_ABI_conformance: \"");
15197 if (p < end - 1)
15198 {
15199 size_t maxlen = (end - p) - 1;
15200
15201 print_symbol ((int) maxlen, (const char *) p);
15202 p += strnlen ((char *) p, maxlen) + 1;
15203 }
15204 else
15205 {
15206 printf (_("<corrupt>"));
15207 p = (unsigned char *) end;
15208 }
15209 printf ("\"\n");
15210 return p;
15211 }
15212 }
15213
15214 return display_tag_value (tag, p, end);
15215 }
15216
15217 static void
15218 display_raw_attribute (unsigned char * p, unsigned char const * const end)
15219 {
15220 unsigned long addr = 0;
15221 size_t bytes = end - p;
15222
15223 assert (end > p);
15224 while (bytes)
15225 {
15226 int j;
15227 int k;
15228 int lbytes = (bytes > 16 ? 16 : bytes);
15229
15230 printf (" 0x%8.8lx ", addr);
15231
15232 for (j = 0; j < 16; j++)
15233 {
15234 if (j < lbytes)
15235 printf ("%2.2x", p[j]);
15236 else
15237 printf (" ");
15238
15239 if ((j & 3) == 3)
15240 printf (" ");
15241 }
15242
15243 for (j = 0; j < lbytes; j++)
15244 {
15245 k = p[j];
15246 if (k >= ' ' && k < 0x7f)
15247 printf ("%c", k);
15248 else
15249 printf (".");
15250 }
15251
15252 putchar ('\n');
15253
15254 p += lbytes;
15255 bytes -= lbytes;
15256 addr += lbytes;
15257 }
15258
15259 putchar ('\n');
15260 }
15261
15262 static unsigned char *
15263 display_msp430x_attribute (unsigned char * p,
15264 const unsigned char * const end)
15265 {
15266 unsigned int len;
15267 unsigned int val;
15268 unsigned int tag;
15269
15270 tag = read_uleb128 (p, & len, end);
15271 p += len;
15272
15273 switch (tag)
15274 {
15275 case OFBA_MSPABI_Tag_ISA:
15276 val = read_uleb128 (p, &len, end);
15277 p += len;
15278 printf (" Tag_ISA: ");
15279 switch (val)
15280 {
15281 case 0: printf (_("None\n")); break;
15282 case 1: printf (_("MSP430\n")); break;
15283 case 2: printf (_("MSP430X\n")); break;
15284 default: printf ("??? (%d)\n", val); break;
15285 }
15286 break;
15287
15288 case OFBA_MSPABI_Tag_Code_Model:
15289 val = read_uleb128 (p, &len, end);
15290 p += len;
15291 printf (" Tag_Code_Model: ");
15292 switch (val)
15293 {
15294 case 0: printf (_("None\n")); break;
15295 case 1: printf (_("Small\n")); break;
15296 case 2: printf (_("Large\n")); break;
15297 default: printf ("??? (%d)\n", val); break;
15298 }
15299 break;
15300
15301 case OFBA_MSPABI_Tag_Data_Model:
15302 val = read_uleb128 (p, &len, end);
15303 p += len;
15304 printf (" Tag_Data_Model: ");
15305 switch (val)
15306 {
15307 case 0: printf (_("None\n")); break;
15308 case 1: printf (_("Small\n")); break;
15309 case 2: printf (_("Large\n")); break;
15310 case 3: printf (_("Restricted Large\n")); break;
15311 default: printf ("??? (%d)\n", val); break;
15312 }
15313 break;
15314
15315 default:
15316 printf (_(" <unknown tag %d>: "), tag);
15317
15318 if (tag & 1)
15319 {
15320 putchar ('"');
15321 if (p < end - 1)
15322 {
15323 size_t maxlen = (end - p) - 1;
15324
15325 print_symbol ((int) maxlen, (const char *) p);
15326 p += strnlen ((char *) p, maxlen) + 1;
15327 }
15328 else
15329 {
15330 printf (_("<corrupt>"));
15331 p = (unsigned char *) end;
15332 }
15333 printf ("\"\n");
15334 }
15335 else
15336 {
15337 val = read_uleb128 (p, &len, end);
15338 p += len;
15339 printf ("%d (0x%x)\n", val, val);
15340 }
15341 break;
15342 }
15343
15344 assert (p <= end);
15345 return p;
15346 }
15347
15348 static bfd_boolean
15349 process_attributes (Filedata * filedata,
15350 const char * public_name,
15351 unsigned int proc_type,
15352 unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
15353 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const))
15354 {
15355 Elf_Internal_Shdr * sect;
15356 unsigned i;
15357 bfd_boolean res = TRUE;
15358
15359 /* Find the section header so that we get the size. */
15360 for (i = 0, sect = filedata->section_headers;
15361 i < filedata->file_header.e_shnum;
15362 i++, sect++)
15363 {
15364 unsigned char * contents;
15365 unsigned char * p;
15366
15367 if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
15368 continue;
15369
15370 contents = (unsigned char *) get_data (NULL, filedata, sect->sh_offset, 1,
15371 sect->sh_size, _("attributes"));
15372 if (contents == NULL)
15373 {
15374 res = FALSE;
15375 continue;
15376 }
15377
15378 p = contents;
15379 /* The first character is the version of the attributes.
15380 Currently only version 1, (aka 'A') is recognised here. */
15381 if (*p != 'A')
15382 {
15383 printf (_("Unknown attributes version '%c'(%d) - expecting 'A'\n"), *p, *p);
15384 res = FALSE;
15385 }
15386 else
15387 {
15388 bfd_vma section_len;
15389
15390 section_len = sect->sh_size - 1;
15391 p++;
15392
15393 while (section_len > 0)
15394 {
15395 bfd_vma attr_len;
15396 unsigned int namelen;
15397 bfd_boolean public_section;
15398 bfd_boolean gnu_section;
15399
15400 if (section_len <= 4)
15401 {
15402 error (_("Tag section ends prematurely\n"));
15403 res = FALSE;
15404 break;
15405 }
15406 attr_len = byte_get (p, 4);
15407 p += 4;
15408
15409 if (attr_len > section_len)
15410 {
15411 error (_("Bad attribute length (%u > %u)\n"),
15412 (unsigned) attr_len, (unsigned) section_len);
15413 attr_len = section_len;
15414 res = FALSE;
15415 }
15416 /* PR 17531: file: 001-101425-0.004 */
15417 else if (attr_len < 5)
15418 {
15419 error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
15420 res = FALSE;
15421 break;
15422 }
15423
15424 section_len -= attr_len;
15425 attr_len -= 4;
15426
15427 namelen = strnlen ((char *) p, attr_len) + 1;
15428 if (namelen == 0 || namelen >= attr_len)
15429 {
15430 error (_("Corrupt attribute section name\n"));
15431 res = FALSE;
15432 break;
15433 }
15434
15435 printf (_("Attribute Section: "));
15436 print_symbol (INT_MAX, (const char *) p);
15437 putchar ('\n');
15438
15439 if (public_name && streq ((char *) p, public_name))
15440 public_section = TRUE;
15441 else
15442 public_section = FALSE;
15443
15444 if (streq ((char *) p, "gnu"))
15445 gnu_section = TRUE;
15446 else
15447 gnu_section = FALSE;
15448
15449 p += namelen;
15450 attr_len -= namelen;
15451
15452 while (attr_len > 0 && p < contents + sect->sh_size)
15453 {
15454 int tag;
15455 int val;
15456 bfd_vma size;
15457 unsigned char * end;
15458
15459 /* PR binutils/17531: Safe handling of corrupt files. */
15460 if (attr_len < 6)
15461 {
15462 error (_("Unused bytes at end of section\n"));
15463 res = FALSE;
15464 section_len = 0;
15465 break;
15466 }
15467
15468 tag = *(p++);
15469 size = byte_get (p, 4);
15470 if (size > attr_len)
15471 {
15472 error (_("Bad subsection length (%u > %u)\n"),
15473 (unsigned) size, (unsigned) attr_len);
15474 res = FALSE;
15475 size = attr_len;
15476 }
15477 /* PR binutils/17531: Safe handling of corrupt files. */
15478 if (size < 6)
15479 {
15480 error (_("Bad subsection length (%u < 6)\n"),
15481 (unsigned) size);
15482 res = FALSE;
15483 section_len = 0;
15484 break;
15485 }
15486
15487 attr_len -= size;
15488 end = p + size - 1;
15489 assert (end <= contents + sect->sh_size);
15490 p += 4;
15491
15492 switch (tag)
15493 {
15494 case 1:
15495 printf (_("File Attributes\n"));
15496 break;
15497 case 2:
15498 printf (_("Section Attributes:"));
15499 goto do_numlist;
15500 case 3:
15501 printf (_("Symbol Attributes:"));
15502 /* Fall through. */
15503 do_numlist:
15504 for (;;)
15505 {
15506 unsigned int j;
15507
15508 val = read_uleb128 (p, &j, end);
15509 p += j;
15510 if (val == 0)
15511 break;
15512 printf (" %d", val);
15513 }
15514 printf ("\n");
15515 break;
15516 default:
15517 printf (_("Unknown tag: %d\n"), tag);
15518 public_section = FALSE;
15519 break;
15520 }
15521
15522 if (public_section && display_pub_attribute != NULL)
15523 {
15524 while (p < end)
15525 p = display_pub_attribute (p, end);
15526 assert (p == end);
15527 }
15528 else if (gnu_section && display_proc_gnu_attribute != NULL)
15529 {
15530 while (p < end)
15531 p = display_gnu_attribute (p,
15532 display_proc_gnu_attribute,
15533 end);
15534 assert (p == end);
15535 }
15536 else if (p < end)
15537 {
15538 printf (_(" Unknown attribute:\n"));
15539 display_raw_attribute (p, end);
15540 p = end;
15541 }
15542 else
15543 attr_len = 0;
15544 }
15545 }
15546 }
15547
15548 free (contents);
15549 }
15550
15551 return res;
15552 }
15553
15554 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
15555 Print the Address, Access and Initial fields of an entry at VMA ADDR
15556 and return the VMA of the next entry, or -1 if there was a problem.
15557 Does not read from DATA_END or beyond. */
15558
15559 static bfd_vma
15560 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
15561 unsigned char * data_end)
15562 {
15563 printf (" ");
15564 print_vma (addr, LONG_HEX);
15565 printf (" ");
15566 if (addr < pltgot + 0xfff0)
15567 printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
15568 else
15569 printf ("%10s", "");
15570 printf (" ");
15571 if (data == NULL)
15572 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
15573 else
15574 {
15575 bfd_vma entry;
15576 unsigned char * from = data + addr - pltgot;
15577
15578 if (from + (is_32bit_elf ? 4 : 8) > data_end)
15579 {
15580 warn (_("MIPS GOT entry extends beyond the end of available data\n"));
15581 printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
15582 return (bfd_vma) -1;
15583 }
15584 else
15585 {
15586 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
15587 print_vma (entry, LONG_HEX);
15588 }
15589 }
15590 return addr + (is_32bit_elf ? 4 : 8);
15591 }
15592
15593 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
15594 PLTGOT. Print the Address and Initial fields of an entry at VMA
15595 ADDR and return the VMA of the next entry. */
15596
15597 static bfd_vma
15598 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
15599 {
15600 printf (" ");
15601 print_vma (addr, LONG_HEX);
15602 printf (" ");
15603 if (data == NULL)
15604 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
15605 else
15606 {
15607 bfd_vma entry;
15608
15609 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
15610 print_vma (entry, LONG_HEX);
15611 }
15612 return addr + (is_32bit_elf ? 4 : 8);
15613 }
15614
15615 static void
15616 print_mips_ases (unsigned int mask)
15617 {
15618 if (mask & AFL_ASE_DSP)
15619 fputs ("\n\tDSP ASE", stdout);
15620 if (mask & AFL_ASE_DSPR2)
15621 fputs ("\n\tDSP R2 ASE", stdout);
15622 if (mask & AFL_ASE_DSPR3)
15623 fputs ("\n\tDSP R3 ASE", stdout);
15624 if (mask & AFL_ASE_EVA)
15625 fputs ("\n\tEnhanced VA Scheme", stdout);
15626 if (mask & AFL_ASE_MCU)
15627 fputs ("\n\tMCU (MicroController) ASE", stdout);
15628 if (mask & AFL_ASE_MDMX)
15629 fputs ("\n\tMDMX ASE", stdout);
15630 if (mask & AFL_ASE_MIPS3D)
15631 fputs ("\n\tMIPS-3D ASE", stdout);
15632 if (mask & AFL_ASE_MT)
15633 fputs ("\n\tMT ASE", stdout);
15634 if (mask & AFL_ASE_SMARTMIPS)
15635 fputs ("\n\tSmartMIPS ASE", stdout);
15636 if (mask & AFL_ASE_VIRT)
15637 fputs ("\n\tVZ ASE", stdout);
15638 if (mask & AFL_ASE_MSA)
15639 fputs ("\n\tMSA ASE", stdout);
15640 if (mask & AFL_ASE_MIPS16)
15641 fputs ("\n\tMIPS16 ASE", stdout);
15642 if (mask & AFL_ASE_MICROMIPS)
15643 fputs ("\n\tMICROMIPS ASE", stdout);
15644 if (mask & AFL_ASE_XPA)
15645 fputs ("\n\tXPA ASE", stdout);
15646 if (mask & AFL_ASE_MIPS16E2)
15647 fputs ("\n\tMIPS16e2 ASE", stdout);
15648 if (mask & AFL_ASE_CRC)
15649 fputs ("\n\tCRC ASE", stdout);
15650 if (mask & AFL_ASE_GINV)
15651 fputs ("\n\tGINV ASE", stdout);
15652 if (mask & AFL_ASE_LOONGSON_MMI)
15653 fputs ("\n\tLoongson MMI ASE", stdout);
15654 if (mask & AFL_ASE_LOONGSON_CAM)
15655 fputs ("\n\tLoongson CAM ASE", stdout);
15656 if (mask & AFL_ASE_LOONGSON_EXT)
15657 fputs ("\n\tLoongson EXT ASE", stdout);
15658 if (mask & AFL_ASE_LOONGSON_EXT2)
15659 fputs ("\n\tLoongson EXT2 ASE", stdout);
15660 if (mask == 0)
15661 fprintf (stdout, "\n\t%s", _("None"));
15662 else if ((mask & ~AFL_ASE_MASK) != 0)
15663 fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
15664 }
15665
15666 static void
15667 print_mips_isa_ext (unsigned int isa_ext)
15668 {
15669 switch (isa_ext)
15670 {
15671 case 0:
15672 fputs (_("None"), stdout);
15673 break;
15674 case AFL_EXT_XLR:
15675 fputs ("RMI XLR", stdout);
15676 break;
15677 case AFL_EXT_OCTEON3:
15678 fputs ("Cavium Networks Octeon3", stdout);
15679 break;
15680 case AFL_EXT_OCTEON2:
15681 fputs ("Cavium Networks Octeon2", stdout);
15682 break;
15683 case AFL_EXT_OCTEONP:
15684 fputs ("Cavium Networks OcteonP", stdout);
15685 break;
15686 case AFL_EXT_OCTEON:
15687 fputs ("Cavium Networks Octeon", stdout);
15688 break;
15689 case AFL_EXT_5900:
15690 fputs ("Toshiba R5900", stdout);
15691 break;
15692 case AFL_EXT_4650:
15693 fputs ("MIPS R4650", stdout);
15694 break;
15695 case AFL_EXT_4010:
15696 fputs ("LSI R4010", stdout);
15697 break;
15698 case AFL_EXT_4100:
15699 fputs ("NEC VR4100", stdout);
15700 break;
15701 case AFL_EXT_3900:
15702 fputs ("Toshiba R3900", stdout);
15703 break;
15704 case AFL_EXT_10000:
15705 fputs ("MIPS R10000", stdout);
15706 break;
15707 case AFL_EXT_SB1:
15708 fputs ("Broadcom SB-1", stdout);
15709 break;
15710 case AFL_EXT_4111:
15711 fputs ("NEC VR4111/VR4181", stdout);
15712 break;
15713 case AFL_EXT_4120:
15714 fputs ("NEC VR4120", stdout);
15715 break;
15716 case AFL_EXT_5400:
15717 fputs ("NEC VR5400", stdout);
15718 break;
15719 case AFL_EXT_5500:
15720 fputs ("NEC VR5500", stdout);
15721 break;
15722 case AFL_EXT_LOONGSON_2E:
15723 fputs ("ST Microelectronics Loongson 2E", stdout);
15724 break;
15725 case AFL_EXT_LOONGSON_2F:
15726 fputs ("ST Microelectronics Loongson 2F", stdout);
15727 break;
15728 case AFL_EXT_INTERAPTIV_MR2:
15729 fputs ("Imagination interAptiv MR2", stdout);
15730 break;
15731 default:
15732 fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
15733 }
15734 }
15735
15736 static signed int
15737 get_mips_reg_size (int reg_size)
15738 {
15739 return (reg_size == AFL_REG_NONE) ? 0
15740 : (reg_size == AFL_REG_32) ? 32
15741 : (reg_size == AFL_REG_64) ? 64
15742 : (reg_size == AFL_REG_128) ? 128
15743 : -1;
15744 }
15745
15746 static bfd_boolean
15747 process_mips_specific (Filedata * filedata)
15748 {
15749 Elf_Internal_Dyn * entry;
15750 Elf_Internal_Shdr *sect = NULL;
15751 size_t liblist_offset = 0;
15752 size_t liblistno = 0;
15753 size_t conflictsno = 0;
15754 size_t options_offset = 0;
15755 size_t conflicts_offset = 0;
15756 size_t pltrelsz = 0;
15757 size_t pltrel = 0;
15758 bfd_vma pltgot = 0;
15759 bfd_vma mips_pltgot = 0;
15760 bfd_vma jmprel = 0;
15761 bfd_vma local_gotno = 0;
15762 bfd_vma gotsym = 0;
15763 bfd_vma symtabno = 0;
15764 bfd_boolean res = TRUE;
15765
15766 if (! process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
15767 display_mips_gnu_attribute))
15768 res = FALSE;
15769
15770 sect = find_section (filedata, ".MIPS.abiflags");
15771
15772 if (sect != NULL)
15773 {
15774 Elf_External_ABIFlags_v0 *abiflags_ext;
15775 Elf_Internal_ABIFlags_v0 abiflags_in;
15776
15777 if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
15778 {
15779 error (_("Corrupt MIPS ABI Flags section.\n"));
15780 res = FALSE;
15781 }
15782 else
15783 {
15784 abiflags_ext = get_data (NULL, filedata, sect->sh_offset, 1,
15785 sect->sh_size, _("MIPS ABI Flags section"));
15786 if (abiflags_ext)
15787 {
15788 abiflags_in.version = BYTE_GET (abiflags_ext->version);
15789 abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
15790 abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
15791 abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
15792 abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
15793 abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
15794 abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
15795 abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
15796 abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
15797 abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
15798 abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
15799
15800 printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
15801 printf ("\nISA: MIPS%d", abiflags_in.isa_level);
15802 if (abiflags_in.isa_rev > 1)
15803 printf ("r%d", abiflags_in.isa_rev);
15804 printf ("\nGPR size: %d",
15805 get_mips_reg_size (abiflags_in.gpr_size));
15806 printf ("\nCPR1 size: %d",
15807 get_mips_reg_size (abiflags_in.cpr1_size));
15808 printf ("\nCPR2 size: %d",
15809 get_mips_reg_size (abiflags_in.cpr2_size));
15810 fputs ("\nFP ABI: ", stdout);
15811 print_mips_fp_abi_value (abiflags_in.fp_abi);
15812 fputs ("ISA Extension: ", stdout);
15813 print_mips_isa_ext (abiflags_in.isa_ext);
15814 fputs ("\nASEs:", stdout);
15815 print_mips_ases (abiflags_in.ases);
15816 printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
15817 printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
15818 fputc ('\n', stdout);
15819 free (abiflags_ext);
15820 }
15821 }
15822 }
15823
15824 /* We have a lot of special sections. Thanks SGI! */
15825 if (dynamic_section == NULL)
15826 {
15827 /* No dynamic information available. See if there is static GOT. */
15828 sect = find_section (filedata, ".got");
15829 if (sect != NULL)
15830 {
15831 unsigned char *data_end;
15832 unsigned char *data;
15833 bfd_vma ent, end;
15834 int addr_size;
15835
15836 pltgot = sect->sh_addr;
15837
15838 ent = pltgot;
15839 addr_size = (is_32bit_elf ? 4 : 8);
15840 end = pltgot + sect->sh_size;
15841
15842 data = (unsigned char *) get_data (NULL, filedata, sect->sh_offset,
15843 end - pltgot, 1,
15844 _("Global Offset Table data"));
15845 /* PR 12855: Null data is handled gracefully throughout. */
15846 data_end = data + (end - pltgot);
15847
15848 printf (_("\nStatic GOT:\n"));
15849 printf (_(" Canonical gp value: "));
15850 print_vma (ent + 0x7ff0, LONG_HEX);
15851 printf ("\n\n");
15852
15853 /* In a dynamic binary GOT[0] is reserved for the dynamic
15854 loader to store the lazy resolver pointer, however in
15855 a static binary it may well have been omitted and GOT
15856 reduced to a table of addresses.
15857 PR 21344: Check for the entry being fully available
15858 before fetching it. */
15859 if (data
15860 && data + ent - pltgot + addr_size <= data_end
15861 && byte_get (data + ent - pltgot, addr_size) == 0)
15862 {
15863 printf (_(" Reserved entries:\n"));
15864 printf (_(" %*s %10s %*s\n"),
15865 addr_size * 2, _("Address"), _("Access"),
15866 addr_size * 2, _("Value"));
15867 ent = print_mips_got_entry (data, pltgot, ent, data_end);
15868 printf ("\n");
15869 if (ent == (bfd_vma) -1)
15870 goto sgot_print_fail;
15871
15872 /* Check for the MSB of GOT[1] being set, identifying a
15873 GNU object. This entry will be used by some runtime
15874 loaders, to store the module pointer. Otherwise this
15875 is an ordinary local entry.
15876 PR 21344: Check for the entry being fully available
15877 before fetching it. */
15878 if (data
15879 && data + ent - pltgot + addr_size <= data_end
15880 && (byte_get (data + ent - pltgot, addr_size)
15881 >> (addr_size * 8 - 1)) != 0)
15882 {
15883 ent = print_mips_got_entry (data, pltgot, ent, data_end);
15884 printf ("\n");
15885 if (ent == (bfd_vma) -1)
15886 goto sgot_print_fail;
15887 }
15888 printf ("\n");
15889 }
15890
15891 if (data != NULL && ent < end)
15892 {
15893 printf (_(" Local entries:\n"));
15894 printf (" %*s %10s %*s\n",
15895 addr_size * 2, _("Address"), _("Access"),
15896 addr_size * 2, _("Value"));
15897 while (ent < end)
15898 {
15899 ent = print_mips_got_entry (data, pltgot, ent, data_end);
15900 printf ("\n");
15901 if (ent == (bfd_vma) -1)
15902 goto sgot_print_fail;
15903 }
15904 printf ("\n");
15905 }
15906
15907 sgot_print_fail:
15908 if (data)
15909 free (data);
15910 }
15911 return res;
15912 }
15913
15914 for (entry = dynamic_section;
15915 /* PR 17531 file: 012-50589-0.004. */
15916 entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
15917 ++entry)
15918 switch (entry->d_tag)
15919 {
15920 case DT_MIPS_LIBLIST:
15921 liblist_offset
15922 = offset_from_vma (filedata, entry->d_un.d_val,
15923 liblistno * sizeof (Elf32_External_Lib));
15924 break;
15925 case DT_MIPS_LIBLISTNO:
15926 liblistno = entry->d_un.d_val;
15927 break;
15928 case DT_MIPS_OPTIONS:
15929 options_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
15930 break;
15931 case DT_MIPS_CONFLICT:
15932 conflicts_offset
15933 = offset_from_vma (filedata, entry->d_un.d_val,
15934 conflictsno * sizeof (Elf32_External_Conflict));
15935 break;
15936 case DT_MIPS_CONFLICTNO:
15937 conflictsno = entry->d_un.d_val;
15938 break;
15939 case DT_PLTGOT:
15940 pltgot = entry->d_un.d_ptr;
15941 break;
15942 case DT_MIPS_LOCAL_GOTNO:
15943 local_gotno = entry->d_un.d_val;
15944 break;
15945 case DT_MIPS_GOTSYM:
15946 gotsym = entry->d_un.d_val;
15947 break;
15948 case DT_MIPS_SYMTABNO:
15949 symtabno = entry->d_un.d_val;
15950 break;
15951 case DT_MIPS_PLTGOT:
15952 mips_pltgot = entry->d_un.d_ptr;
15953 break;
15954 case DT_PLTREL:
15955 pltrel = entry->d_un.d_val;
15956 break;
15957 case DT_PLTRELSZ:
15958 pltrelsz = entry->d_un.d_val;
15959 break;
15960 case DT_JMPREL:
15961 jmprel = entry->d_un.d_ptr;
15962 break;
15963 default:
15964 break;
15965 }
15966
15967 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
15968 {
15969 Elf32_External_Lib * elib;
15970 size_t cnt;
15971
15972 elib = (Elf32_External_Lib *) get_data (NULL, filedata, liblist_offset,
15973 liblistno,
15974 sizeof (Elf32_External_Lib),
15975 _("liblist section data"));
15976 if (elib)
15977 {
15978 printf (ngettext ("\nSection '.liblist' contains %lu entry:\n",
15979 "\nSection '.liblist' contains %lu entries:\n",
15980 (unsigned long) liblistno),
15981 (unsigned long) liblistno);
15982 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
15983 stdout);
15984
15985 for (cnt = 0; cnt < liblistno; ++cnt)
15986 {
15987 Elf32_Lib liblist;
15988 time_t atime;
15989 char timebuf[128];
15990 struct tm * tmp;
15991
15992 liblist.l_name = BYTE_GET (elib[cnt].l_name);
15993 atime = BYTE_GET (elib[cnt].l_time_stamp);
15994 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
15995 liblist.l_version = BYTE_GET (elib[cnt].l_version);
15996 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
15997
15998 tmp = gmtime (&atime);
15999 snprintf (timebuf, sizeof (timebuf),
16000 "%04u-%02u-%02uT%02u:%02u:%02u",
16001 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
16002 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
16003
16004 printf ("%3lu: ", (unsigned long) cnt);
16005 if (VALID_DYNAMIC_NAME (liblist.l_name))
16006 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
16007 else
16008 printf (_("<corrupt: %9ld>"), liblist.l_name);
16009 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
16010 liblist.l_version);
16011
16012 if (liblist.l_flags == 0)
16013 puts (_(" NONE"));
16014 else
16015 {
16016 static const struct
16017 {
16018 const char * name;
16019 int bit;
16020 }
16021 l_flags_vals[] =
16022 {
16023 { " EXACT_MATCH", LL_EXACT_MATCH },
16024 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
16025 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
16026 { " EXPORTS", LL_EXPORTS },
16027 { " DELAY_LOAD", LL_DELAY_LOAD },
16028 { " DELTA", LL_DELTA }
16029 };
16030 int flags = liblist.l_flags;
16031 size_t fcnt;
16032
16033 for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
16034 if ((flags & l_flags_vals[fcnt].bit) != 0)
16035 {
16036 fputs (l_flags_vals[fcnt].name, stdout);
16037 flags ^= l_flags_vals[fcnt].bit;
16038 }
16039 if (flags != 0)
16040 printf (" %#x", (unsigned int) flags);
16041
16042 puts ("");
16043 }
16044 }
16045
16046 free (elib);
16047 }
16048 else
16049 res = FALSE;
16050 }
16051
16052 if (options_offset != 0)
16053 {
16054 Elf_External_Options * eopt;
16055 Elf_Internal_Options * iopt;
16056 Elf_Internal_Options * option;
16057 size_t offset;
16058 int cnt;
16059 sect = filedata->section_headers;
16060
16061 /* Find the section header so that we get the size. */
16062 sect = find_section_by_type (filedata, SHT_MIPS_OPTIONS);
16063 /* PR 17533 file: 012-277276-0.004. */
16064 if (sect == NULL)
16065 {
16066 error (_("No MIPS_OPTIONS header found\n"));
16067 return FALSE;
16068 }
16069
16070 eopt = (Elf_External_Options *) get_data (NULL, filedata, options_offset, 1,
16071 sect->sh_size, _("options"));
16072 if (eopt)
16073 {
16074 iopt = (Elf_Internal_Options *)
16075 cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
16076 if (iopt == NULL)
16077 {
16078 error (_("Out of memory allocating space for MIPS options\n"));
16079 return FALSE;
16080 }
16081
16082 offset = cnt = 0;
16083 option = iopt;
16084
16085 while (offset <= sect->sh_size - sizeof (* eopt))
16086 {
16087 Elf_External_Options * eoption;
16088
16089 eoption = (Elf_External_Options *) ((char *) eopt + offset);
16090
16091 option->kind = BYTE_GET (eoption->kind);
16092 option->size = BYTE_GET (eoption->size);
16093 option->section = BYTE_GET (eoption->section);
16094 option->info = BYTE_GET (eoption->info);
16095
16096 /* PR 17531: file: ffa0fa3b. */
16097 if (option->size < sizeof (* eopt)
16098 || offset + option->size > sect->sh_size)
16099 {
16100 error (_("Invalid size (%u) for MIPS option\n"), option->size);
16101 return FALSE;
16102 }
16103 offset += option->size;
16104
16105 ++option;
16106 ++cnt;
16107 }
16108
16109 printf (ngettext ("\nSection '%s' contains %d entry:\n",
16110 "\nSection '%s' contains %d entries:\n",
16111 cnt),
16112 printable_section_name (filedata, sect), cnt);
16113
16114 option = iopt;
16115 offset = 0;
16116
16117 while (cnt-- > 0)
16118 {
16119 size_t len;
16120
16121 switch (option->kind)
16122 {
16123 case ODK_NULL:
16124 /* This shouldn't happen. */
16125 printf (" NULL %d %lx", option->section, option->info);
16126 break;
16127 case ODK_REGINFO:
16128 printf (" REGINFO ");
16129 if (filedata->file_header.e_machine == EM_MIPS)
16130 {
16131 /* 32bit form. */
16132 Elf32_External_RegInfo * ereg;
16133 Elf32_RegInfo reginfo;
16134
16135 ereg = (Elf32_External_RegInfo *) (option + 1);
16136 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
16137 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
16138 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
16139 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
16140 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
16141 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
16142
16143 printf ("GPR %08lx GP 0x%lx\n",
16144 reginfo.ri_gprmask,
16145 (unsigned long) reginfo.ri_gp_value);
16146 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
16147 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
16148 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
16149 }
16150 else
16151 {
16152 /* 64 bit form. */
16153 Elf64_External_RegInfo * ereg;
16154 Elf64_Internal_RegInfo reginfo;
16155
16156 ereg = (Elf64_External_RegInfo *) (option + 1);
16157 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
16158 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
16159 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
16160 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
16161 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
16162 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
16163
16164 printf ("GPR %08lx GP 0x",
16165 reginfo.ri_gprmask);
16166 printf_vma (reginfo.ri_gp_value);
16167 printf ("\n");
16168
16169 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
16170 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
16171 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
16172 }
16173 ++option;
16174 continue;
16175 case ODK_EXCEPTIONS:
16176 fputs (" EXCEPTIONS fpe_min(", stdout);
16177 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
16178 fputs (") fpe_max(", stdout);
16179 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
16180 fputs (")", stdout);
16181
16182 if (option->info & OEX_PAGE0)
16183 fputs (" PAGE0", stdout);
16184 if (option->info & OEX_SMM)
16185 fputs (" SMM", stdout);
16186 if (option->info & OEX_FPDBUG)
16187 fputs (" FPDBUG", stdout);
16188 if (option->info & OEX_DISMISS)
16189 fputs (" DISMISS", stdout);
16190 break;
16191 case ODK_PAD:
16192 fputs (" PAD ", stdout);
16193 if (option->info & OPAD_PREFIX)
16194 fputs (" PREFIX", stdout);
16195 if (option->info & OPAD_POSTFIX)
16196 fputs (" POSTFIX", stdout);
16197 if (option->info & OPAD_SYMBOL)
16198 fputs (" SYMBOL", stdout);
16199 break;
16200 case ODK_HWPATCH:
16201 fputs (" HWPATCH ", stdout);
16202 if (option->info & OHW_R4KEOP)
16203 fputs (" R4KEOP", stdout);
16204 if (option->info & OHW_R8KPFETCH)
16205 fputs (" R8KPFETCH", stdout);
16206 if (option->info & OHW_R5KEOP)
16207 fputs (" R5KEOP", stdout);
16208 if (option->info & OHW_R5KCVTL)
16209 fputs (" R5KCVTL", stdout);
16210 break;
16211 case ODK_FILL:
16212 fputs (" FILL ", stdout);
16213 /* XXX Print content of info word? */
16214 break;
16215 case ODK_TAGS:
16216 fputs (" TAGS ", stdout);
16217 /* XXX Print content of info word? */
16218 break;
16219 case ODK_HWAND:
16220 fputs (" HWAND ", stdout);
16221 if (option->info & OHWA0_R4KEOP_CHECKED)
16222 fputs (" R4KEOP_CHECKED", stdout);
16223 if (option->info & OHWA0_R4KEOP_CLEAN)
16224 fputs (" R4KEOP_CLEAN", stdout);
16225 break;
16226 case ODK_HWOR:
16227 fputs (" HWOR ", stdout);
16228 if (option->info & OHWA0_R4KEOP_CHECKED)
16229 fputs (" R4KEOP_CHECKED", stdout);
16230 if (option->info & OHWA0_R4KEOP_CLEAN)
16231 fputs (" R4KEOP_CLEAN", stdout);
16232 break;
16233 case ODK_GP_GROUP:
16234 printf (" GP_GROUP %#06lx self-contained %#06lx",
16235 option->info & OGP_GROUP,
16236 (option->info & OGP_SELF) >> 16);
16237 break;
16238 case ODK_IDENT:
16239 printf (" IDENT %#06lx self-contained %#06lx",
16240 option->info & OGP_GROUP,
16241 (option->info & OGP_SELF) >> 16);
16242 break;
16243 default:
16244 /* This shouldn't happen. */
16245 printf (" %3d ??? %d %lx",
16246 option->kind, option->section, option->info);
16247 break;
16248 }
16249
16250 len = sizeof (* eopt);
16251 while (len < option->size)
16252 {
16253 unsigned char datum = * ((unsigned char *) eopt + offset + len);
16254
16255 if (ISPRINT (datum))
16256 printf ("%c", datum);
16257 else
16258 printf ("\\%03o", datum);
16259 len ++;
16260 }
16261 fputs ("\n", stdout);
16262
16263 offset += option->size;
16264 ++option;
16265 }
16266
16267 free (eopt);
16268 }
16269 else
16270 res = FALSE;
16271 }
16272
16273 if (conflicts_offset != 0 && conflictsno != 0)
16274 {
16275 Elf32_Conflict * iconf;
16276 size_t cnt;
16277
16278 if (dynamic_symbols == NULL)
16279 {
16280 error (_("conflict list found without a dynamic symbol table\n"));
16281 return FALSE;
16282 }
16283
16284 /* PR 21345 - print a slightly more helpful error message
16285 if we are sure that the cmalloc will fail. */
16286 if (conflictsno * sizeof (* iconf) > filedata->file_size)
16287 {
16288 error (_("Overlarge number of conflicts detected: %lx\n"),
16289 (long) conflictsno);
16290 return FALSE;
16291 }
16292
16293 iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
16294 if (iconf == NULL)
16295 {
16296 error (_("Out of memory allocating space for dynamic conflicts\n"));
16297 return FALSE;
16298 }
16299
16300 if (is_32bit_elf)
16301 {
16302 Elf32_External_Conflict * econf32;
16303
16304 econf32 = (Elf32_External_Conflict *)
16305 get_data (NULL, filedata, conflicts_offset, conflictsno,
16306 sizeof (* econf32), _("conflict"));
16307 if (!econf32)
16308 return FALSE;
16309
16310 for (cnt = 0; cnt < conflictsno; ++cnt)
16311 iconf[cnt] = BYTE_GET (econf32[cnt]);
16312
16313 free (econf32);
16314 }
16315 else
16316 {
16317 Elf64_External_Conflict * econf64;
16318
16319 econf64 = (Elf64_External_Conflict *)
16320 get_data (NULL, filedata, conflicts_offset, conflictsno,
16321 sizeof (* econf64), _("conflict"));
16322 if (!econf64)
16323 return FALSE;
16324
16325 for (cnt = 0; cnt < conflictsno; ++cnt)
16326 iconf[cnt] = BYTE_GET (econf64[cnt]);
16327
16328 free (econf64);
16329 }
16330
16331 printf (ngettext ("\nSection '.conflict' contains %lu entry:\n",
16332 "\nSection '.conflict' contains %lu entries:\n",
16333 (unsigned long) conflictsno),
16334 (unsigned long) conflictsno);
16335 puts (_(" Num: Index Value Name"));
16336
16337 for (cnt = 0; cnt < conflictsno; ++cnt)
16338 {
16339 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
16340
16341 if (iconf[cnt] >= num_dynamic_syms)
16342 printf (_("<corrupt symbol index>"));
16343 else
16344 {
16345 Elf_Internal_Sym * psym;
16346
16347 psym = & dynamic_symbols[iconf[cnt]];
16348 print_vma (psym->st_value, FULL_HEX);
16349 putchar (' ');
16350 if (VALID_DYNAMIC_NAME (psym->st_name))
16351 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
16352 else
16353 printf (_("<corrupt: %14ld>"), psym->st_name);
16354 }
16355 putchar ('\n');
16356 }
16357
16358 free (iconf);
16359 }
16360
16361 if (pltgot != 0 && local_gotno != 0)
16362 {
16363 bfd_vma ent, local_end, global_end;
16364 size_t i, offset;
16365 unsigned char * data;
16366 unsigned char * data_end;
16367 int addr_size;
16368
16369 ent = pltgot;
16370 addr_size = (is_32bit_elf ? 4 : 8);
16371 local_end = pltgot + local_gotno * addr_size;
16372
16373 /* PR binutils/17533 file: 012-111227-0.004 */
16374 if (symtabno < gotsym)
16375 {
16376 error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
16377 (unsigned long) gotsym, (unsigned long) symtabno);
16378 return FALSE;
16379 }
16380
16381 global_end = local_end + (symtabno - gotsym) * addr_size;
16382 /* PR 17531: file: 54c91a34. */
16383 if (global_end < local_end)
16384 {
16385 error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
16386 return FALSE;
16387 }
16388
16389 offset = offset_from_vma (filedata, pltgot, global_end - pltgot);
16390 data = (unsigned char *) get_data (NULL, filedata, offset,
16391 global_end - pltgot, 1,
16392 _("Global Offset Table data"));
16393 /* PR 12855: Null data is handled gracefully throughout. */
16394 data_end = data + (global_end - pltgot);
16395
16396 printf (_("\nPrimary GOT:\n"));
16397 printf (_(" Canonical gp value: "));
16398 print_vma (pltgot + 0x7ff0, LONG_HEX);
16399 printf ("\n\n");
16400
16401 printf (_(" Reserved entries:\n"));
16402 printf (_(" %*s %10s %*s Purpose\n"),
16403 addr_size * 2, _("Address"), _("Access"),
16404 addr_size * 2, _("Initial"));
16405 ent = print_mips_got_entry (data, pltgot, ent, data_end);
16406 printf (_(" Lazy resolver\n"));
16407 if (ent == (bfd_vma) -1)
16408 goto got_print_fail;
16409
16410 /* Check for the MSB of GOT[1] being set, denoting a GNU object.
16411 This entry will be used by some runtime loaders, to store the
16412 module pointer. Otherwise this is an ordinary local entry.
16413 PR 21344: Check for the entry being fully available before
16414 fetching it. */
16415 if (data
16416 && data + ent - pltgot + addr_size <= data_end
16417 && (byte_get (data + ent - pltgot, addr_size)
16418 >> (addr_size * 8 - 1)) != 0)
16419 {
16420 ent = print_mips_got_entry (data, pltgot, ent, data_end);
16421 printf (_(" Module pointer (GNU extension)\n"));
16422 if (ent == (bfd_vma) -1)
16423 goto got_print_fail;
16424 }
16425 printf ("\n");
16426
16427 if (data != NULL && ent < local_end)
16428 {
16429 printf (_(" Local entries:\n"));
16430 printf (" %*s %10s %*s\n",
16431 addr_size * 2, _("Address"), _("Access"),
16432 addr_size * 2, _("Initial"));
16433 while (ent < local_end)
16434 {
16435 ent = print_mips_got_entry (data, pltgot, ent, data_end);
16436 printf ("\n");
16437 if (ent == (bfd_vma) -1)
16438 goto got_print_fail;
16439 }
16440 printf ("\n");
16441 }
16442
16443 if (data != NULL && gotsym < symtabno)
16444 {
16445 int sym_width;
16446
16447 printf (_(" Global entries:\n"));
16448 printf (" %*s %10s %*s %*s %-7s %3s %s\n",
16449 addr_size * 2, _("Address"),
16450 _("Access"),
16451 addr_size * 2, _("Initial"),
16452 addr_size * 2, _("Sym.Val."),
16453 _("Type"),
16454 /* Note for translators: "Ndx" = abbreviated form of "Index". */
16455 _("Ndx"), _("Name"));
16456
16457 sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
16458
16459 for (i = gotsym; i < symtabno; i++)
16460 {
16461 ent = print_mips_got_entry (data, pltgot, ent, data_end);
16462 printf (" ");
16463
16464 if (dynamic_symbols == NULL)
16465 printf (_("<no dynamic symbols>"));
16466 else if (i < num_dynamic_syms)
16467 {
16468 Elf_Internal_Sym * psym = dynamic_symbols + i;
16469
16470 print_vma (psym->st_value, LONG_HEX);
16471 printf (" %-7s %3s ",
16472 get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
16473 get_symbol_index_type (filedata, psym->st_shndx));
16474
16475 if (VALID_DYNAMIC_NAME (psym->st_name))
16476 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
16477 else
16478 printf (_("<corrupt: %14ld>"), psym->st_name);
16479 }
16480 else
16481 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
16482 (unsigned long) i);
16483
16484 printf ("\n");
16485 if (ent == (bfd_vma) -1)
16486 break;
16487 }
16488 printf ("\n");
16489 }
16490
16491 got_print_fail:
16492 if (data)
16493 free (data);
16494 }
16495
16496 if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
16497 {
16498 bfd_vma ent, end;
16499 size_t offset, rel_offset;
16500 unsigned long count, i;
16501 unsigned char * data;
16502 int addr_size, sym_width;
16503 Elf_Internal_Rela * rels;
16504
16505 rel_offset = offset_from_vma (filedata, jmprel, pltrelsz);
16506 if (pltrel == DT_RELA)
16507 {
16508 if (!slurp_rela_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
16509 return FALSE;
16510 }
16511 else
16512 {
16513 if (!slurp_rel_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
16514 return FALSE;
16515 }
16516
16517 ent = mips_pltgot;
16518 addr_size = (is_32bit_elf ? 4 : 8);
16519 end = mips_pltgot + (2 + count) * addr_size;
16520
16521 offset = offset_from_vma (filedata, mips_pltgot, end - mips_pltgot);
16522 data = (unsigned char *) get_data (NULL, filedata, offset, end - mips_pltgot,
16523 1, _("Procedure Linkage Table data"));
16524 if (data == NULL)
16525 return FALSE;
16526
16527 printf ("\nPLT GOT:\n\n");
16528 printf (_(" Reserved entries:\n"));
16529 printf (_(" %*s %*s Purpose\n"),
16530 addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
16531 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16532 printf (_(" PLT lazy resolver\n"));
16533 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16534 printf (_(" Module pointer\n"));
16535 printf ("\n");
16536
16537 printf (_(" Entries:\n"));
16538 printf (" %*s %*s %*s %-7s %3s %s\n",
16539 addr_size * 2, _("Address"),
16540 addr_size * 2, _("Initial"),
16541 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
16542 sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
16543 for (i = 0; i < count; i++)
16544 {
16545 unsigned long idx = get_reloc_symindex (rels[i].r_info);
16546
16547 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16548 printf (" ");
16549
16550 if (idx >= num_dynamic_syms)
16551 printf (_("<corrupt symbol index: %lu>"), idx);
16552 else
16553 {
16554 Elf_Internal_Sym * psym = dynamic_symbols + idx;
16555
16556 print_vma (psym->st_value, LONG_HEX);
16557 printf (" %-7s %3s ",
16558 get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
16559 get_symbol_index_type (filedata, psym->st_shndx));
16560 if (VALID_DYNAMIC_NAME (psym->st_name))
16561 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
16562 else
16563 printf (_("<corrupt: %14ld>"), psym->st_name);
16564 }
16565 printf ("\n");
16566 }
16567 printf ("\n");
16568
16569 if (data)
16570 free (data);
16571 free (rels);
16572 }
16573
16574 return res;
16575 }
16576
16577 static bfd_boolean
16578 process_nds32_specific (Filedata * filedata)
16579 {
16580 Elf_Internal_Shdr *sect = NULL;
16581
16582 sect = find_section (filedata, ".nds32_e_flags");
16583 if (sect != NULL)
16584 {
16585 unsigned int *flag;
16586
16587 printf ("\nNDS32 elf flags section:\n");
16588 flag = get_data (NULL, filedata, sect->sh_offset, 1,
16589 sect->sh_size, _("NDS32 elf flags section"));
16590
16591 if (! flag)
16592 return FALSE;
16593
16594 switch ((*flag) & 0x3)
16595 {
16596 case 0:
16597 printf ("(VEC_SIZE):\tNo entry.\n");
16598 break;
16599 case 1:
16600 printf ("(VEC_SIZE):\t4 bytes\n");
16601 break;
16602 case 2:
16603 printf ("(VEC_SIZE):\t16 bytes\n");
16604 break;
16605 case 3:
16606 printf ("(VEC_SIZE):\treserved\n");
16607 break;
16608 }
16609 }
16610
16611 return TRUE;
16612 }
16613
16614 static bfd_boolean
16615 process_gnu_liblist (Filedata * filedata)
16616 {
16617 Elf_Internal_Shdr * section;
16618 Elf_Internal_Shdr * string_sec;
16619 Elf32_External_Lib * elib;
16620 char * strtab;
16621 size_t strtab_size;
16622 size_t cnt;
16623 unsigned long num_liblist;
16624 unsigned i;
16625 bfd_boolean res = TRUE;
16626
16627 if (! do_arch)
16628 return TRUE;
16629
16630 for (i = 0, section = filedata->section_headers;
16631 i < filedata->file_header.e_shnum;
16632 i++, section++)
16633 {
16634 switch (section->sh_type)
16635 {
16636 case SHT_GNU_LIBLIST:
16637 if (section->sh_link >= filedata->file_header.e_shnum)
16638 break;
16639
16640 elib = (Elf32_External_Lib *)
16641 get_data (NULL, filedata, section->sh_offset, 1, section->sh_size,
16642 _("liblist section data"));
16643
16644 if (elib == NULL)
16645 {
16646 res = FALSE;
16647 break;
16648 }
16649
16650 string_sec = filedata->section_headers + section->sh_link;
16651 strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
16652 string_sec->sh_size,
16653 _("liblist string table"));
16654 if (strtab == NULL
16655 || section->sh_entsize != sizeof (Elf32_External_Lib))
16656 {
16657 free (elib);
16658 free (strtab);
16659 res = FALSE;
16660 break;
16661 }
16662 strtab_size = string_sec->sh_size;
16663
16664 num_liblist = section->sh_size / sizeof (Elf32_External_Lib);
16665 printf (ngettext ("\nLibrary list section '%s' contains %lu entries:\n",
16666 "\nLibrary list section '%s' contains %lu entries:\n",
16667 num_liblist),
16668 printable_section_name (filedata, section),
16669 num_liblist);
16670
16671 puts (_(" Library Time Stamp Checksum Version Flags"));
16672
16673 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
16674 ++cnt)
16675 {
16676 Elf32_Lib liblist;
16677 time_t atime;
16678 char timebuf[128];
16679 struct tm * tmp;
16680
16681 liblist.l_name = BYTE_GET (elib[cnt].l_name);
16682 atime = BYTE_GET (elib[cnt].l_time_stamp);
16683 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
16684 liblist.l_version = BYTE_GET (elib[cnt].l_version);
16685 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
16686
16687 tmp = gmtime (&atime);
16688 snprintf (timebuf, sizeof (timebuf),
16689 "%04u-%02u-%02uT%02u:%02u:%02u",
16690 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
16691 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
16692
16693 printf ("%3lu: ", (unsigned long) cnt);
16694 if (do_wide)
16695 printf ("%-20s", liblist.l_name < strtab_size
16696 ? strtab + liblist.l_name : _("<corrupt>"));
16697 else
16698 printf ("%-20.20s", liblist.l_name < strtab_size
16699 ? strtab + liblist.l_name : _("<corrupt>"));
16700 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
16701 liblist.l_version, liblist.l_flags);
16702 }
16703
16704 free (elib);
16705 free (strtab);
16706 }
16707 }
16708
16709 return res;
16710 }
16711
16712 static const char *
16713 get_note_type (Filedata * filedata, unsigned e_type)
16714 {
16715 static char buff[64];
16716
16717 if (filedata->file_header.e_type == ET_CORE)
16718 switch (e_type)
16719 {
16720 case NT_AUXV:
16721 return _("NT_AUXV (auxiliary vector)");
16722 case NT_PRSTATUS:
16723 return _("NT_PRSTATUS (prstatus structure)");
16724 case NT_FPREGSET:
16725 return _("NT_FPREGSET (floating point registers)");
16726 case NT_PRPSINFO:
16727 return _("NT_PRPSINFO (prpsinfo structure)");
16728 case NT_TASKSTRUCT:
16729 return _("NT_TASKSTRUCT (task structure)");
16730 case NT_PRXFPREG:
16731 return _("NT_PRXFPREG (user_xfpregs structure)");
16732 case NT_PPC_VMX:
16733 return _("NT_PPC_VMX (ppc Altivec registers)");
16734 case NT_PPC_VSX:
16735 return _("NT_PPC_VSX (ppc VSX registers)");
16736 case NT_PPC_TAR:
16737 return _("NT_PPC_TAR (ppc TAR register)");
16738 case NT_PPC_PPR:
16739 return _("NT_PPC_PPR (ppc PPR register)");
16740 case NT_PPC_DSCR:
16741 return _("NT_PPC_DSCR (ppc DSCR register)");
16742 case NT_PPC_EBB:
16743 return _("NT_PPC_EBB (ppc EBB registers)");
16744 case NT_PPC_PMU:
16745 return _("NT_PPC_PMU (ppc PMU registers)");
16746 case NT_PPC_TM_CGPR:
16747 return _("NT_PPC_TM_CGPR (ppc checkpointed GPR registers)");
16748 case NT_PPC_TM_CFPR:
16749 return _("NT_PPC_TM_CFPR (ppc checkpointed floating point registers)");
16750 case NT_PPC_TM_CVMX:
16751 return _("NT_PPC_TM_CVMX (ppc checkpointed Altivec registers)");
16752 case NT_PPC_TM_CVSX:
16753 return _("NT_PPC_TM_CVSX (ppc checkpointed VSX registers)");
16754 case NT_PPC_TM_SPR:
16755 return _("NT_PPC_TM_SPR (ppc TM special purpose registers)");
16756 case NT_PPC_TM_CTAR:
16757 return _("NT_PPC_TM_CTAR (ppc checkpointed TAR register)");
16758 case NT_PPC_TM_CPPR:
16759 return _("NT_PPC_TM_CPPR (ppc checkpointed PPR register)");
16760 case NT_PPC_TM_CDSCR:
16761 return _("NT_PPC_TM_CDSCR (ppc checkpointed DSCR register)");
16762 case NT_386_TLS:
16763 return _("NT_386_TLS (x86 TLS information)");
16764 case NT_386_IOPERM:
16765 return _("NT_386_IOPERM (x86 I/O permissions)");
16766 case NT_X86_XSTATE:
16767 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
16768 case NT_S390_HIGH_GPRS:
16769 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
16770 case NT_S390_TIMER:
16771 return _("NT_S390_TIMER (s390 timer register)");
16772 case NT_S390_TODCMP:
16773 return _("NT_S390_TODCMP (s390 TOD comparator register)");
16774 case NT_S390_TODPREG:
16775 return _("NT_S390_TODPREG (s390 TOD programmable register)");
16776 case NT_S390_CTRS:
16777 return _("NT_S390_CTRS (s390 control registers)");
16778 case NT_S390_PREFIX:
16779 return _("NT_S390_PREFIX (s390 prefix register)");
16780 case NT_S390_LAST_BREAK:
16781 return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
16782 case NT_S390_SYSTEM_CALL:
16783 return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
16784 case NT_S390_TDB:
16785 return _("NT_S390_TDB (s390 transaction diagnostic block)");
16786 case NT_S390_VXRS_LOW:
16787 return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
16788 case NT_S390_VXRS_HIGH:
16789 return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
16790 case NT_S390_GS_CB:
16791 return _("NT_S390_GS_CB (s390 guarded-storage registers)");
16792 case NT_S390_GS_BC:
16793 return _("NT_S390_GS_BC (s390 guarded-storage broadcast control)");
16794 case NT_ARM_VFP:
16795 return _("NT_ARM_VFP (arm VFP registers)");
16796 case NT_ARM_TLS:
16797 return _("NT_ARM_TLS (AArch TLS registers)");
16798 case NT_ARM_HW_BREAK:
16799 return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
16800 case NT_ARM_HW_WATCH:
16801 return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
16802 case NT_PSTATUS:
16803 return _("NT_PSTATUS (pstatus structure)");
16804 case NT_FPREGS:
16805 return _("NT_FPREGS (floating point registers)");
16806 case NT_PSINFO:
16807 return _("NT_PSINFO (psinfo structure)");
16808 case NT_LWPSTATUS:
16809 return _("NT_LWPSTATUS (lwpstatus_t structure)");
16810 case NT_LWPSINFO:
16811 return _("NT_LWPSINFO (lwpsinfo_t structure)");
16812 case NT_WIN32PSTATUS:
16813 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
16814 case NT_SIGINFO:
16815 return _("NT_SIGINFO (siginfo_t data)");
16816 case NT_FILE:
16817 return _("NT_FILE (mapped files)");
16818 default:
16819 break;
16820 }
16821 else
16822 switch (e_type)
16823 {
16824 case NT_VERSION:
16825 return _("NT_VERSION (version)");
16826 case NT_ARCH:
16827 return _("NT_ARCH (architecture)");
16828 case NT_GNU_BUILD_ATTRIBUTE_OPEN:
16829 return _("OPEN");
16830 case NT_GNU_BUILD_ATTRIBUTE_FUNC:
16831 return _("func");
16832 default:
16833 break;
16834 }
16835
16836 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
16837 return buff;
16838 }
16839
16840 static bfd_boolean
16841 print_core_note (Elf_Internal_Note *pnote)
16842 {
16843 unsigned int addr_size = is_32bit_elf ? 4 : 8;
16844 bfd_vma count, page_size;
16845 unsigned char *descdata, *filenames, *descend;
16846
16847 if (pnote->type != NT_FILE)
16848 {
16849 if (do_wide)
16850 printf ("\n");
16851 return TRUE;
16852 }
16853
16854 #ifndef BFD64
16855 if (!is_32bit_elf)
16856 {
16857 printf (_(" Cannot decode 64-bit note in 32-bit build\n"));
16858 /* Still "successful". */
16859 return TRUE;
16860 }
16861 #endif
16862
16863 if (pnote->descsz < 2 * addr_size)
16864 {
16865 error (_(" Malformed note - too short for header\n"));
16866 return FALSE;
16867 }
16868
16869 descdata = (unsigned char *) pnote->descdata;
16870 descend = descdata + pnote->descsz;
16871
16872 if (descdata[pnote->descsz - 1] != '\0')
16873 {
16874 error (_(" Malformed note - does not end with \\0\n"));
16875 return FALSE;
16876 }
16877
16878 count = byte_get (descdata, addr_size);
16879 descdata += addr_size;
16880
16881 page_size = byte_get (descdata, addr_size);
16882 descdata += addr_size;
16883
16884 if (count > ((bfd_vma) -1 - 2 * addr_size) / (3 * addr_size)
16885 || pnote->descsz < 2 * addr_size + count * 3 * addr_size)
16886 {
16887 error (_(" Malformed note - too short for supplied file count\n"));
16888 return FALSE;
16889 }
16890
16891 printf (_(" Page size: "));
16892 print_vma (page_size, DEC);
16893 printf ("\n");
16894
16895 printf (_(" %*s%*s%*s\n"),
16896 (int) (2 + 2 * addr_size), _("Start"),
16897 (int) (4 + 2 * addr_size), _("End"),
16898 (int) (4 + 2 * addr_size), _("Page Offset"));
16899 filenames = descdata + count * 3 * addr_size;
16900 while (count-- > 0)
16901 {
16902 bfd_vma start, end, file_ofs;
16903
16904 if (filenames == descend)
16905 {
16906 error (_(" Malformed note - filenames end too early\n"));
16907 return FALSE;
16908 }
16909
16910 start = byte_get (descdata, addr_size);
16911 descdata += addr_size;
16912 end = byte_get (descdata, addr_size);
16913 descdata += addr_size;
16914 file_ofs = byte_get (descdata, addr_size);
16915 descdata += addr_size;
16916
16917 printf (" ");
16918 print_vma (start, FULL_HEX);
16919 printf (" ");
16920 print_vma (end, FULL_HEX);
16921 printf (" ");
16922 print_vma (file_ofs, FULL_HEX);
16923 printf ("\n %s\n", filenames);
16924
16925 filenames += 1 + strlen ((char *) filenames);
16926 }
16927
16928 return TRUE;
16929 }
16930
16931 static const char *
16932 get_gnu_elf_note_type (unsigned e_type)
16933 {
16934 /* NB/ Keep this switch statement in sync with print_gnu_note (). */
16935 switch (e_type)
16936 {
16937 case NT_GNU_ABI_TAG:
16938 return _("NT_GNU_ABI_TAG (ABI version tag)");
16939 case NT_GNU_HWCAP:
16940 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
16941 case NT_GNU_BUILD_ID:
16942 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
16943 case NT_GNU_GOLD_VERSION:
16944 return _("NT_GNU_GOLD_VERSION (gold version)");
16945 case NT_GNU_PROPERTY_TYPE_0:
16946 return _("NT_GNU_PROPERTY_TYPE_0");
16947 case NT_GNU_BUILD_ATTRIBUTE_OPEN:
16948 return _("NT_GNU_BUILD_ATTRIBUTE_OPEN");
16949 case NT_GNU_BUILD_ATTRIBUTE_FUNC:
16950 return _("NT_GNU_BUILD_ATTRIBUTE_FUNC");
16951 default:
16952 {
16953 static char buff[64];
16954
16955 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
16956 return buff;
16957 }
16958 }
16959 }
16960
16961 static void
16962 decode_x86_compat_isa (unsigned int bitmask)
16963 {
16964 while (bitmask)
16965 {
16966 unsigned int bit = bitmask & (- bitmask);
16967
16968 bitmask &= ~ bit;
16969 switch (bit)
16970 {
16971 case GNU_PROPERTY_X86_COMPAT_ISA_1_486:
16972 printf ("i486");
16973 break;
16974 case GNU_PROPERTY_X86_COMPAT_ISA_1_586:
16975 printf ("586");
16976 break;
16977 case GNU_PROPERTY_X86_COMPAT_ISA_1_686:
16978 printf ("686");
16979 break;
16980 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE:
16981 printf ("SSE");
16982 break;
16983 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE2:
16984 printf ("SSE2");
16985 break;
16986 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE3:
16987 printf ("SSE3");
16988 break;
16989 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSSE3:
16990 printf ("SSSE3");
16991 break;
16992 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_1:
16993 printf ("SSE4_1");
16994 break;
16995 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_2:
16996 printf ("SSE4_2");
16997 break;
16998 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX:
16999 printf ("AVX");
17000 break;
17001 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX2:
17002 printf ("AVX2");
17003 break;
17004 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512F:
17005 printf ("AVX512F");
17006 break;
17007 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512CD:
17008 printf ("AVX512CD");
17009 break;
17010 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512ER:
17011 printf ("AVX512ER");
17012 break;
17013 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512PF:
17014 printf ("AVX512PF");
17015 break;
17016 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512VL:
17017 printf ("AVX512VL");
17018 break;
17019 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512DQ:
17020 printf ("AVX512DQ");
17021 break;
17022 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512BW:
17023 printf ("AVX512BW");
17024 break;
17025 default:
17026 printf (_("<unknown: %x>"), bit);
17027 break;
17028 }
17029 if (bitmask)
17030 printf (", ");
17031 }
17032 }
17033
17034 static void
17035 decode_x86_isa (unsigned int bitmask)
17036 {
17037 if (bitmask == GNU_PROPERTY_X86_UINT32_VALID)
17038 {
17039 printf (_("<None>"));
17040 return;
17041 }
17042 else
17043 bitmask &= ~GNU_PROPERTY_X86_UINT32_VALID;
17044
17045 while (bitmask)
17046 {
17047 unsigned int bit = bitmask & (- bitmask);
17048
17049 bitmask &= ~ bit;
17050 switch (bit)
17051 {
17052 case GNU_PROPERTY_X86_ISA_1_CMOV:
17053 printf ("CMOV");
17054 break;
17055 case GNU_PROPERTY_X86_ISA_1_SSE:
17056 printf ("SSE");
17057 break;
17058 case GNU_PROPERTY_X86_ISA_1_SSE2:
17059 printf ("SSE2");
17060 break;
17061 case GNU_PROPERTY_X86_ISA_1_SSE3:
17062 printf ("SSE3");
17063 break;
17064 case GNU_PROPERTY_X86_ISA_1_SSSE3:
17065 printf ("SSSE3");
17066 break;
17067 case GNU_PROPERTY_X86_ISA_1_SSE4_1:
17068 printf ("SSE4_1");
17069 break;
17070 case GNU_PROPERTY_X86_ISA_1_SSE4_2:
17071 printf ("SSE4_2");
17072 break;
17073 case GNU_PROPERTY_X86_ISA_1_AVX:
17074 printf ("AVX");
17075 break;
17076 case GNU_PROPERTY_X86_ISA_1_AVX2:
17077 printf ("AVX2");
17078 break;
17079 case GNU_PROPERTY_X86_ISA_1_FMA:
17080 printf ("FMA");
17081 break;
17082 case GNU_PROPERTY_X86_ISA_1_AVX512F:
17083 printf ("AVX512F");
17084 break;
17085 case GNU_PROPERTY_X86_ISA_1_AVX512CD:
17086 printf ("AVX512CD");
17087 break;
17088 case GNU_PROPERTY_X86_ISA_1_AVX512ER:
17089 printf ("AVX512ER");
17090 break;
17091 case GNU_PROPERTY_X86_ISA_1_AVX512PF:
17092 printf ("AVX512PF");
17093 break;
17094 case GNU_PROPERTY_X86_ISA_1_AVX512VL:
17095 printf ("AVX512VL");
17096 break;
17097 case GNU_PROPERTY_X86_ISA_1_AVX512DQ:
17098 printf ("AVX512DQ");
17099 break;
17100 case GNU_PROPERTY_X86_ISA_1_AVX512BW:
17101 printf ("AVX512BW");
17102 break;
17103 case GNU_PROPERTY_X86_ISA_1_AVX512_4FMAPS:
17104 printf ("AVX512_4FMAPS");
17105 break;
17106 case GNU_PROPERTY_X86_ISA_1_AVX512_4VNNIW:
17107 printf ("AVX512_4VNNIW");
17108 break;
17109 case GNU_PROPERTY_X86_ISA_1_AVX512_BITALG:
17110 printf ("AVX512_BITALG");
17111 break;
17112 case GNU_PROPERTY_X86_ISA_1_AVX512_IFMA:
17113 printf ("AVX512_IFMA");
17114 break;
17115 case GNU_PROPERTY_X86_ISA_1_AVX512_VBMI:
17116 printf ("AVX512_VBMI");
17117 break;
17118 case GNU_PROPERTY_X86_ISA_1_AVX512_VBMI2:
17119 printf ("AVX512_VBMI2");
17120 break;
17121 case GNU_PROPERTY_X86_ISA_1_AVX512_VNNI:
17122 printf ("AVX512_VNNI");
17123 break;
17124 default:
17125 printf (_("<unknown: %x>"), bit);
17126 break;
17127 }
17128 if (bitmask)
17129 printf (", ");
17130 }
17131 }
17132
17133 static void
17134 decode_x86_feature_1 (unsigned int bitmask)
17135 {
17136 if (bitmask == GNU_PROPERTY_X86_UINT32_VALID)
17137 {
17138 printf (_("<None>"));
17139 return;
17140 }
17141 else
17142 bitmask &= ~GNU_PROPERTY_X86_UINT32_VALID;
17143
17144 while (bitmask)
17145 {
17146 unsigned int bit = bitmask & (- bitmask);
17147
17148 bitmask &= ~ bit;
17149 switch (bit)
17150 {
17151 case GNU_PROPERTY_X86_FEATURE_1_IBT:
17152 printf ("IBT");
17153 break;
17154 case GNU_PROPERTY_X86_FEATURE_1_SHSTK:
17155 printf ("SHSTK");
17156 break;
17157 default:
17158 printf (_("<unknown: %x>"), bit);
17159 break;
17160 }
17161 if (bitmask)
17162 printf (", ");
17163 }
17164 }
17165
17166 static void
17167 decode_x86_feature_2 (unsigned int bitmask)
17168 {
17169 if (bitmask == GNU_PROPERTY_X86_UINT32_VALID)
17170 {
17171 printf (_("<None>"));
17172 return;
17173 }
17174 else
17175 bitmask &= ~GNU_PROPERTY_X86_UINT32_VALID;
17176
17177 while (bitmask)
17178 {
17179 unsigned int bit = bitmask & (- bitmask);
17180
17181 bitmask &= ~ bit;
17182 switch (bit)
17183 {
17184 case GNU_PROPERTY_X86_FEATURE_2_X86:
17185 printf ("x86");
17186 break;
17187 case GNU_PROPERTY_X86_FEATURE_2_X87:
17188 printf ("x87");
17189 break;
17190 case GNU_PROPERTY_X86_FEATURE_2_MMX:
17191 printf ("MMX");
17192 break;
17193 case GNU_PROPERTY_X86_FEATURE_2_XMM:
17194 printf ("XMM");
17195 break;
17196 case GNU_PROPERTY_X86_FEATURE_2_YMM:
17197 printf ("YMM");
17198 break;
17199 case GNU_PROPERTY_X86_FEATURE_2_ZMM:
17200 printf ("ZMM");
17201 break;
17202 case GNU_PROPERTY_X86_FEATURE_2_FXSR:
17203 printf ("FXSR");
17204 break;
17205 case GNU_PROPERTY_X86_FEATURE_2_XSAVE:
17206 printf ("XSAVE");
17207 break;
17208 case GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT:
17209 printf ("XSAVEOPT");
17210 break;
17211 case GNU_PROPERTY_X86_FEATURE_2_XSAVEC:
17212 printf ("XSAVEC");
17213 break;
17214 default:
17215 printf (_("<unknown: %x>"), bit);
17216 break;
17217 }
17218 if (bitmask)
17219 printf (", ");
17220 }
17221 }
17222
17223 static void
17224 print_gnu_property_note (Filedata * filedata, Elf_Internal_Note * pnote)
17225 {
17226 unsigned char * ptr = (unsigned char *) pnote->descdata;
17227 unsigned char * ptr_end = ptr + pnote->descsz;
17228 unsigned int size = is_32bit_elf ? 4 : 8;
17229
17230 printf (_(" Properties: "));
17231
17232 if (pnote->descsz < 8 || (pnote->descsz % size) != 0)
17233 {
17234 printf (_("<corrupt GNU_PROPERTY_TYPE, size = %#lx>\n"), pnote->descsz);
17235 return;
17236 }
17237
17238 while (ptr < ptr_end)
17239 {
17240 unsigned int j;
17241 unsigned int type;
17242 unsigned int datasz;
17243
17244 if ((size_t) (ptr_end - ptr) < 8)
17245 {
17246 printf (_("<corrupt descsz: %#lx>\n"), pnote->descsz);
17247 break;
17248 }
17249
17250 type = byte_get (ptr, 4);
17251 datasz = byte_get (ptr + 4, 4);
17252
17253 ptr += 8;
17254
17255 if (datasz > (size_t) (ptr_end - ptr))
17256 {
17257 printf (_("<corrupt type (%#x) datasz: %#x>\n"),
17258 type, datasz);
17259 break;
17260 }
17261
17262 if (type >= GNU_PROPERTY_LOPROC && type <= GNU_PROPERTY_HIPROC)
17263 {
17264 if (filedata->file_header.e_machine == EM_X86_64
17265 || filedata->file_header.e_machine == EM_IAMCU
17266 || filedata->file_header.e_machine == EM_386)
17267 {
17268 unsigned int bitmask;
17269
17270 if (datasz == 4)
17271 {
17272 bitmask = byte_get (ptr, 4);
17273 if ((filedata->file_header.e_type == ET_EXEC
17274 || filedata->file_header.e_type == ET_DYN)
17275 && !(bitmask & GNU_PROPERTY_X86_UINT32_VALID))
17276 printf ("Invalid ");
17277 }
17278 else
17279 bitmask = 0;
17280
17281 switch (type)
17282 {
17283 case GNU_PROPERTY_X86_ISA_1_USED:
17284 if (datasz != 4)
17285 printf (_("x86 ISA used: <corrupt length: %#x> "),
17286 datasz);
17287 else
17288 {
17289 printf ("x86 ISA used: ");
17290 decode_x86_isa (bitmask);
17291 }
17292 goto next;
17293
17294 case GNU_PROPERTY_X86_ISA_1_NEEDED:
17295 if (datasz != 4)
17296 printf (_("x86 ISA needed: <corrupt length: %#x> "),
17297 datasz);
17298 else
17299 {
17300 printf ("x86 ISA needed: ");
17301 decode_x86_isa (bitmask);
17302 }
17303 goto next;
17304
17305 case GNU_PROPERTY_X86_FEATURE_1_AND:
17306 if (datasz != 4)
17307 printf (_("x86 feature: <corrupt length: %#x> "),
17308 datasz);
17309 else
17310 {
17311 printf ("x86 feature: ");
17312 decode_x86_feature_1 (bitmask);
17313 }
17314 goto next;
17315
17316 case GNU_PROPERTY_X86_FEATURE_2_USED:
17317 if (datasz != 4)
17318 printf (_("x86 feature used: <corrupt length: %#x> "),
17319 datasz);
17320 else
17321 {
17322 printf ("x86 feature used: ");
17323 decode_x86_feature_2 (bitmask);
17324 }
17325 goto next;
17326
17327 case GNU_PROPERTY_X86_FEATURE_2_NEEDED:
17328 if (datasz != 4)
17329 printf (_("x86 feature needed: <corrupt length: %#x> "), datasz);
17330 else
17331 {
17332 printf ("x86 feature needed: ");
17333 decode_x86_feature_2 (bitmask);
17334 }
17335 goto next;
17336
17337 case GNU_PROPERTY_X86_COMPAT_ISA_1_USED:
17338 if (datasz != 4)
17339 printf (_("x86 ISA used: <corrupt length: %#x> "),
17340 datasz);
17341 else
17342 {
17343 printf ("x86 ISA used: ");
17344 decode_x86_compat_isa (bitmask);
17345 }
17346 goto next;
17347
17348 case GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED:
17349 if (datasz != 4)
17350 printf (_("x86 ISA needed: <corrupt length: %#x> "),
17351 datasz);
17352 else
17353 {
17354 printf ("x86 ISA needed: ");
17355 decode_x86_compat_isa (bitmask);
17356 }
17357 goto next;
17358
17359 default:
17360 break;
17361 }
17362 }
17363 }
17364 else
17365 {
17366 switch (type)
17367 {
17368 case GNU_PROPERTY_STACK_SIZE:
17369 printf (_("stack size: "));
17370 if (datasz != size)
17371 printf (_("<corrupt length: %#x> "), datasz);
17372 else
17373 printf ("%#lx", (unsigned long) byte_get (ptr, size));
17374 goto next;
17375
17376 case GNU_PROPERTY_NO_COPY_ON_PROTECTED:
17377 printf ("no copy on protected ");
17378 if (datasz)
17379 printf (_("<corrupt length: %#x> "), datasz);
17380 goto next;
17381
17382 default:
17383 break;
17384 }
17385 }
17386
17387 if (type < GNU_PROPERTY_LOPROC)
17388 printf (_("<unknown type %#x data: "), type);
17389 else if (type < GNU_PROPERTY_LOUSER)
17390 printf (_("<procesor-specific type %#x data: "), type);
17391 else
17392 printf (_("<application-specific type %#x data: "), type);
17393 for (j = 0; j < datasz; ++j)
17394 printf ("%02x ", ptr[j] & 0xff);
17395 printf (">");
17396
17397 next:
17398 ptr += ((datasz + (size - 1)) & ~ (size - 1));
17399 if (ptr == ptr_end)
17400 break;
17401
17402 if (do_wide)
17403 printf (", ");
17404 else
17405 printf ("\n\t");
17406 }
17407
17408 printf ("\n");
17409 }
17410
17411 static bfd_boolean
17412 print_gnu_note (Filedata * filedata, Elf_Internal_Note *pnote)
17413 {
17414 /* NB/ Keep this switch statement in sync with get_gnu_elf_note_type (). */
17415 switch (pnote->type)
17416 {
17417 case NT_GNU_BUILD_ID:
17418 {
17419 unsigned long i;
17420
17421 printf (_(" Build ID: "));
17422 for (i = 0; i < pnote->descsz; ++i)
17423 printf ("%02x", pnote->descdata[i] & 0xff);
17424 printf ("\n");
17425 }
17426 break;
17427
17428 case NT_GNU_ABI_TAG:
17429 {
17430 unsigned long os, major, minor, subminor;
17431 const char *osname;
17432
17433 /* PR 17531: file: 030-599401-0.004. */
17434 if (pnote->descsz < 16)
17435 {
17436 printf (_(" <corrupt GNU_ABI_TAG>\n"));
17437 break;
17438 }
17439
17440 os = byte_get ((unsigned char *) pnote->descdata, 4);
17441 major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17442 minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
17443 subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
17444
17445 switch (os)
17446 {
17447 case GNU_ABI_TAG_LINUX:
17448 osname = "Linux";
17449 break;
17450 case GNU_ABI_TAG_HURD:
17451 osname = "Hurd";
17452 break;
17453 case GNU_ABI_TAG_SOLARIS:
17454 osname = "Solaris";
17455 break;
17456 case GNU_ABI_TAG_FREEBSD:
17457 osname = "FreeBSD";
17458 break;
17459 case GNU_ABI_TAG_NETBSD:
17460 osname = "NetBSD";
17461 break;
17462 case GNU_ABI_TAG_SYLLABLE:
17463 osname = "Syllable";
17464 break;
17465 case GNU_ABI_TAG_NACL:
17466 osname = "NaCl";
17467 break;
17468 default:
17469 osname = "Unknown";
17470 break;
17471 }
17472
17473 printf (_(" OS: %s, ABI: %ld.%ld.%ld\n"), osname,
17474 major, minor, subminor);
17475 }
17476 break;
17477
17478 case NT_GNU_GOLD_VERSION:
17479 {
17480 unsigned long i;
17481
17482 printf (_(" Version: "));
17483 for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
17484 printf ("%c", pnote->descdata[i]);
17485 printf ("\n");
17486 }
17487 break;
17488
17489 case NT_GNU_HWCAP:
17490 {
17491 unsigned long num_entries, mask;
17492
17493 /* Hardware capabilities information. Word 0 is the number of entries.
17494 Word 1 is a bitmask of enabled entries. The rest of the descriptor
17495 is a series of entries, where each entry is a single byte followed
17496 by a nul terminated string. The byte gives the bit number to test
17497 if enabled in the bitmask. */
17498 printf (_(" Hardware Capabilities: "));
17499 if (pnote->descsz < 8)
17500 {
17501 error (_("<corrupt GNU_HWCAP>\n"));
17502 return FALSE;
17503 }
17504 num_entries = byte_get ((unsigned char *) pnote->descdata, 4);
17505 mask = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17506 printf (_("num entries: %ld, enabled mask: %lx\n"), num_entries, mask);
17507 /* FIXME: Add code to display the entries... */
17508 }
17509 break;
17510
17511 case NT_GNU_PROPERTY_TYPE_0:
17512 print_gnu_property_note (filedata, pnote);
17513 break;
17514
17515 default:
17516 /* Handle unrecognised types. An error message should have already been
17517 created by get_gnu_elf_note_type(), so all that we need to do is to
17518 display the data. */
17519 {
17520 unsigned long i;
17521
17522 printf (_(" Description data: "));
17523 for (i = 0; i < pnote->descsz; ++i)
17524 printf ("%02x ", pnote->descdata[i] & 0xff);
17525 printf ("\n");
17526 }
17527 break;
17528 }
17529
17530 return TRUE;
17531 }
17532
17533 static const char *
17534 get_v850_elf_note_type (enum v850_notes n_type)
17535 {
17536 static char buff[64];
17537
17538 switch (n_type)
17539 {
17540 case V850_NOTE_ALIGNMENT: return _("Alignment of 8-byte objects");
17541 case V850_NOTE_DATA_SIZE: return _("Sizeof double and long double");
17542 case V850_NOTE_FPU_INFO: return _("Type of FPU support needed");
17543 case V850_NOTE_SIMD_INFO: return _("Use of SIMD instructions");
17544 case V850_NOTE_CACHE_INFO: return _("Use of cache");
17545 case V850_NOTE_MMU_INFO: return _("Use of MMU");
17546 default:
17547 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
17548 return buff;
17549 }
17550 }
17551
17552 static bfd_boolean
17553 print_v850_note (Elf_Internal_Note * pnote)
17554 {
17555 unsigned int val;
17556
17557 if (pnote->descsz != 4)
17558 return FALSE;
17559
17560 val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
17561
17562 if (val == 0)
17563 {
17564 printf (_("not set\n"));
17565 return TRUE;
17566 }
17567
17568 switch (pnote->type)
17569 {
17570 case V850_NOTE_ALIGNMENT:
17571 switch (val)
17572 {
17573 case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return TRUE;
17574 case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return TRUE;
17575 }
17576 break;
17577
17578 case V850_NOTE_DATA_SIZE:
17579 switch (val)
17580 {
17581 case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return TRUE;
17582 case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return TRUE;
17583 }
17584 break;
17585
17586 case V850_NOTE_FPU_INFO:
17587 switch (val)
17588 {
17589 case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return TRUE;
17590 case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return TRUE;
17591 }
17592 break;
17593
17594 case V850_NOTE_MMU_INFO:
17595 case V850_NOTE_CACHE_INFO:
17596 case V850_NOTE_SIMD_INFO:
17597 if (val == EF_RH850_SIMD)
17598 {
17599 printf (_("yes\n"));
17600 return TRUE;
17601 }
17602 break;
17603
17604 default:
17605 /* An 'unknown note type' message will already have been displayed. */
17606 break;
17607 }
17608
17609 printf (_("unknown value: %x\n"), val);
17610 return FALSE;
17611 }
17612
17613 static bfd_boolean
17614 process_netbsd_elf_note (Elf_Internal_Note * pnote)
17615 {
17616 unsigned int version;
17617
17618 switch (pnote->type)
17619 {
17620 case NT_NETBSD_IDENT:
17621 version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
17622 if ((version / 10000) % 100)
17623 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
17624 version, version / 100000000, (version / 1000000) % 100,
17625 (version / 10000) % 100 > 26 ? "Z" : "",
17626 'A' + (version / 10000) % 26);
17627 else
17628 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
17629 version, version / 100000000, (version / 1000000) % 100,
17630 (version / 100) % 100);
17631 return TRUE;
17632
17633 case NT_NETBSD_MARCH:
17634 printf (" NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
17635 pnote->descdata);
17636 return TRUE;
17637
17638 default:
17639 printf (" NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
17640 pnote->type);
17641 return FALSE;
17642 }
17643 }
17644
17645 static const char *
17646 get_freebsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
17647 {
17648 switch (e_type)
17649 {
17650 case NT_FREEBSD_THRMISC:
17651 return _("NT_THRMISC (thrmisc structure)");
17652 case NT_FREEBSD_PROCSTAT_PROC:
17653 return _("NT_PROCSTAT_PROC (proc data)");
17654 case NT_FREEBSD_PROCSTAT_FILES:
17655 return _("NT_PROCSTAT_FILES (files data)");
17656 case NT_FREEBSD_PROCSTAT_VMMAP:
17657 return _("NT_PROCSTAT_VMMAP (vmmap data)");
17658 case NT_FREEBSD_PROCSTAT_GROUPS:
17659 return _("NT_PROCSTAT_GROUPS (groups data)");
17660 case NT_FREEBSD_PROCSTAT_UMASK:
17661 return _("NT_PROCSTAT_UMASK (umask data)");
17662 case NT_FREEBSD_PROCSTAT_RLIMIT:
17663 return _("NT_PROCSTAT_RLIMIT (rlimit data)");
17664 case NT_FREEBSD_PROCSTAT_OSREL:
17665 return _("NT_PROCSTAT_OSREL (osreldate data)");
17666 case NT_FREEBSD_PROCSTAT_PSSTRINGS:
17667 return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
17668 case NT_FREEBSD_PROCSTAT_AUXV:
17669 return _("NT_PROCSTAT_AUXV (auxv data)");
17670 case NT_FREEBSD_PTLWPINFO:
17671 return _("NT_PTLWPINFO (ptrace_lwpinfo structure)");
17672 }
17673 return get_note_type (filedata, e_type);
17674 }
17675
17676 static const char *
17677 get_netbsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
17678 {
17679 static char buff[64];
17680
17681 if (e_type == NT_NETBSDCORE_PROCINFO)
17682 return _("NetBSD procinfo structure");
17683
17684 /* As of Jan 2002 there are no other machine-independent notes
17685 defined for NetBSD core files. If the note type is less
17686 than the start of the machine-dependent note types, we don't
17687 understand it. */
17688
17689 if (e_type < NT_NETBSDCORE_FIRSTMACH)
17690 {
17691 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17692 return buff;
17693 }
17694
17695 switch (filedata->file_header.e_machine)
17696 {
17697 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
17698 and PT_GETFPREGS == mach+2. */
17699
17700 case EM_OLD_ALPHA:
17701 case EM_ALPHA:
17702 case EM_SPARC:
17703 case EM_SPARC32PLUS:
17704 case EM_SPARCV9:
17705 switch (e_type)
17706 {
17707 case NT_NETBSDCORE_FIRSTMACH + 0:
17708 return _("PT_GETREGS (reg structure)");
17709 case NT_NETBSDCORE_FIRSTMACH + 2:
17710 return _("PT_GETFPREGS (fpreg structure)");
17711 default:
17712 break;
17713 }
17714 break;
17715
17716 /* On all other arch's, PT_GETREGS == mach+1 and
17717 PT_GETFPREGS == mach+3. */
17718 default:
17719 switch (e_type)
17720 {
17721 case NT_NETBSDCORE_FIRSTMACH + 1:
17722 return _("PT_GETREGS (reg structure)");
17723 case NT_NETBSDCORE_FIRSTMACH + 3:
17724 return _("PT_GETFPREGS (fpreg structure)");
17725 default:
17726 break;
17727 }
17728 }
17729
17730 snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
17731 e_type - NT_NETBSDCORE_FIRSTMACH);
17732 return buff;
17733 }
17734
17735 static const char *
17736 get_stapsdt_note_type (unsigned e_type)
17737 {
17738 static char buff[64];
17739
17740 switch (e_type)
17741 {
17742 case NT_STAPSDT:
17743 return _("NT_STAPSDT (SystemTap probe descriptors)");
17744
17745 default:
17746 break;
17747 }
17748
17749 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17750 return buff;
17751 }
17752
17753 static bfd_boolean
17754 print_stapsdt_note (Elf_Internal_Note *pnote)
17755 {
17756 int addr_size = is_32bit_elf ? 4 : 8;
17757 char *data = pnote->descdata;
17758 char *data_end = pnote->descdata + pnote->descsz;
17759 bfd_vma pc, base_addr, semaphore;
17760 char *provider, *probe, *arg_fmt;
17761
17762 pc = byte_get ((unsigned char *) data, addr_size);
17763 data += addr_size;
17764 base_addr = byte_get ((unsigned char *) data, addr_size);
17765 data += addr_size;
17766 semaphore = byte_get ((unsigned char *) data, addr_size);
17767 data += addr_size;
17768
17769 provider = data;
17770 data += strlen (data) + 1;
17771 probe = data;
17772 data += strlen (data) + 1;
17773 arg_fmt = data;
17774 data += strlen (data) + 1;
17775
17776 printf (_(" Provider: %s\n"), provider);
17777 printf (_(" Name: %s\n"), probe);
17778 printf (_(" Location: "));
17779 print_vma (pc, FULL_HEX);
17780 printf (_(", Base: "));
17781 print_vma (base_addr, FULL_HEX);
17782 printf (_(", Semaphore: "));
17783 print_vma (semaphore, FULL_HEX);
17784 printf ("\n");
17785 printf (_(" Arguments: %s\n"), arg_fmt);
17786
17787 return data == data_end;
17788 }
17789
17790 static const char *
17791 get_ia64_vms_note_type (unsigned e_type)
17792 {
17793 static char buff[64];
17794
17795 switch (e_type)
17796 {
17797 case NT_VMS_MHD:
17798 return _("NT_VMS_MHD (module header)");
17799 case NT_VMS_LNM:
17800 return _("NT_VMS_LNM (language name)");
17801 case NT_VMS_SRC:
17802 return _("NT_VMS_SRC (source files)");
17803 case NT_VMS_TITLE:
17804 return "NT_VMS_TITLE";
17805 case NT_VMS_EIDC:
17806 return _("NT_VMS_EIDC (consistency check)");
17807 case NT_VMS_FPMODE:
17808 return _("NT_VMS_FPMODE (FP mode)");
17809 case NT_VMS_LINKTIME:
17810 return "NT_VMS_LINKTIME";
17811 case NT_VMS_IMGNAM:
17812 return _("NT_VMS_IMGNAM (image name)");
17813 case NT_VMS_IMGID:
17814 return _("NT_VMS_IMGID (image id)");
17815 case NT_VMS_LINKID:
17816 return _("NT_VMS_LINKID (link id)");
17817 case NT_VMS_IMGBID:
17818 return _("NT_VMS_IMGBID (build id)");
17819 case NT_VMS_GSTNAM:
17820 return _("NT_VMS_GSTNAM (sym table name)");
17821 case NT_VMS_ORIG_DYN:
17822 return "NT_VMS_ORIG_DYN";
17823 case NT_VMS_PATCHTIME:
17824 return "NT_VMS_PATCHTIME";
17825 default:
17826 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17827 return buff;
17828 }
17829 }
17830
17831 static bfd_boolean
17832 print_ia64_vms_note (Elf_Internal_Note * pnote)
17833 {
17834 switch (pnote->type)
17835 {
17836 case NT_VMS_MHD:
17837 if (pnote->descsz > 36)
17838 {
17839 size_t l = strlen (pnote->descdata + 34);
17840 printf (_(" Creation date : %.17s\n"), pnote->descdata);
17841 printf (_(" Last patch date: %.17s\n"), pnote->descdata + 17);
17842 printf (_(" Module name : %s\n"), pnote->descdata + 34);
17843 printf (_(" Module version : %s\n"), pnote->descdata + 34 + l + 1);
17844 }
17845 else
17846 printf (_(" Invalid size\n"));
17847 break;
17848 case NT_VMS_LNM:
17849 printf (_(" Language: %s\n"), pnote->descdata);
17850 break;
17851 #ifdef BFD64
17852 case NT_VMS_FPMODE:
17853 printf (_(" Floating Point mode: "));
17854 printf ("0x%016" BFD_VMA_FMT "x\n",
17855 (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
17856 break;
17857 case NT_VMS_LINKTIME:
17858 printf (_(" Link time: "));
17859 print_vms_time
17860 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
17861 printf ("\n");
17862 break;
17863 case NT_VMS_PATCHTIME:
17864 printf (_(" Patch time: "));
17865 print_vms_time
17866 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
17867 printf ("\n");
17868 break;
17869 case NT_VMS_ORIG_DYN:
17870 printf (_(" Major id: %u, minor id: %u\n"),
17871 (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
17872 (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
17873 printf (_(" Last modified : "));
17874 print_vms_time
17875 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
17876 printf (_("\n Link flags : "));
17877 printf ("0x%016" BFD_VMA_FMT "x\n",
17878 (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
17879 printf (_(" Header flags: 0x%08x\n"),
17880 (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
17881 printf (_(" Image id : %s\n"), pnote->descdata + 32);
17882 break;
17883 #endif
17884 case NT_VMS_IMGNAM:
17885 printf (_(" Image name: %s\n"), pnote->descdata);
17886 break;
17887 case NT_VMS_GSTNAM:
17888 printf (_(" Global symbol table name: %s\n"), pnote->descdata);
17889 break;
17890 case NT_VMS_IMGID:
17891 printf (_(" Image id: %s\n"), pnote->descdata);
17892 break;
17893 case NT_VMS_LINKID:
17894 printf (_(" Linker id: %s\n"), pnote->descdata);
17895 break;
17896 default:
17897 return FALSE;
17898 }
17899 return TRUE;
17900 }
17901
17902 /* Find the symbol associated with a build attribute that is attached
17903 to address OFFSET. If PNAME is non-NULL then store the name of
17904 the symbol (if found) in the provided pointer, Returns NULL if a
17905 symbol could not be found. */
17906
17907 static Elf_Internal_Sym *
17908 get_symbol_for_build_attribute (Filedata * filedata,
17909 unsigned long offset,
17910 bfd_boolean is_open_attr,
17911 const char ** pname)
17912 {
17913 static Filedata * saved_filedata = NULL;
17914 static char * strtab;
17915 static unsigned long strtablen;
17916 static Elf_Internal_Sym * symtab;
17917 static unsigned long nsyms;
17918 Elf_Internal_Sym * saved_sym = NULL;
17919 Elf_Internal_Sym * sym;
17920
17921 if (filedata->section_headers != NULL
17922 && (saved_filedata == NULL || filedata != saved_filedata))
17923 {
17924 Elf_Internal_Shdr * symsec;
17925
17926 /* Load the symbol and string sections. */
17927 for (symsec = filedata->section_headers;
17928 symsec < filedata->section_headers + filedata->file_header.e_shnum;
17929 symsec ++)
17930 {
17931 if (symsec->sh_type == SHT_SYMTAB)
17932 {
17933 symtab = GET_ELF_SYMBOLS (filedata, symsec, & nsyms);
17934
17935 if (symsec->sh_link < filedata->file_header.e_shnum)
17936 {
17937 Elf_Internal_Shdr * strtab_sec = filedata->section_headers + symsec->sh_link;
17938
17939 strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
17940 1, strtab_sec->sh_size,
17941 _("string table"));
17942 strtablen = strtab != NULL ? strtab_sec->sh_size : 0;
17943 }
17944 }
17945 }
17946 saved_filedata = filedata;
17947 }
17948
17949 if (symtab == NULL || strtab == NULL)
17950 return NULL;
17951
17952 /* Find a symbol whose value matches offset. */
17953 for (sym = symtab; sym < symtab + nsyms; sym ++)
17954 if (sym->st_value == offset)
17955 {
17956 if (sym->st_name >= strtablen)
17957 /* Huh ? This should not happen. */
17958 continue;
17959
17960 if (strtab[sym->st_name] == 0)
17961 continue;
17962
17963 /* The AArch64 and ARM architectures define mapping symbols
17964 (eg $d, $x, $t) which we want to ignore. */
17965 if (strtab[sym->st_name] == '$'
17966 && strtab[sym->st_name + 1] != 0
17967 && strtab[sym->st_name + 2] == 0)
17968 continue;
17969
17970 if (is_open_attr)
17971 {
17972 /* For OPEN attributes we prefer GLOBAL over LOCAL symbols
17973 and FILE or OBJECT symbols over NOTYPE symbols. We skip
17974 FUNC symbols entirely. */
17975 switch (ELF_ST_TYPE (sym->st_info))
17976 {
17977 case STT_OBJECT:
17978 case STT_FILE:
17979 saved_sym = sym;
17980 if (sym->st_size)
17981 {
17982 /* If the symbol has a size associated
17983 with it then we can stop searching. */
17984 sym = symtab + nsyms;
17985 }
17986 continue;
17987
17988 case STT_FUNC:
17989 /* Ignore function symbols. */
17990 continue;
17991
17992 default:
17993 break;
17994 }
17995
17996 switch (ELF_ST_BIND (sym->st_info))
17997 {
17998 case STB_GLOBAL:
17999 if (saved_sym == NULL
18000 || ELF_ST_TYPE (saved_sym->st_info) != STT_OBJECT)
18001 saved_sym = sym;
18002 break;
18003
18004 case STB_LOCAL:
18005 if (saved_sym == NULL)
18006 saved_sym = sym;
18007 break;
18008
18009 default:
18010 break;
18011 }
18012 }
18013 else
18014 {
18015 if (ELF_ST_TYPE (sym->st_info) != STT_FUNC)
18016 continue;
18017
18018 saved_sym = sym;
18019 break;
18020 }
18021 }
18022
18023 if (saved_sym && pname)
18024 * pname = strtab + saved_sym->st_name;
18025
18026 return saved_sym;
18027 }
18028
18029 /* Returns true iff addr1 and addr2 are in the same section. */
18030
18031 static bfd_boolean
18032 same_section (Filedata * filedata, unsigned long addr1, unsigned long addr2)
18033 {
18034 Elf_Internal_Shdr * a1;
18035 Elf_Internal_Shdr * a2;
18036
18037 a1 = find_section_by_address (filedata, addr1);
18038 a2 = find_section_by_address (filedata, addr2);
18039
18040 return a1 == a2 && a1 != NULL;
18041 }
18042
18043 static bfd_boolean
18044 print_gnu_build_attribute_description (Elf_Internal_Note * pnote,
18045 Filedata * filedata)
18046 {
18047 static unsigned long global_offset = 0;
18048 static unsigned long global_end = 0;
18049 static unsigned long func_offset = 0;
18050 static unsigned long func_end = 0;
18051
18052 Elf_Internal_Sym * sym;
18053 const char * name;
18054 unsigned long start;
18055 unsigned long end;
18056 bfd_boolean is_open_attr = pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN;
18057
18058 switch (pnote->descsz)
18059 {
18060 case 0:
18061 /* A zero-length description means that the range of
18062 the previous note of the same type should be used. */
18063 if (is_open_attr)
18064 {
18065 if (global_end > global_offset)
18066 printf (_(" Applies to region from %#lx to %#lx\n"),
18067 global_offset, global_end);
18068 else
18069 printf (_(" Applies to region from %#lx\n"), global_offset);
18070 }
18071 else
18072 {
18073 if (func_end > func_offset)
18074 printf (_(" Applies to region from %#lx to %#lx\n"), func_offset, func_end);
18075 else
18076 printf (_(" Applies to region from %#lx\n"), func_offset);
18077 }
18078 return TRUE;
18079
18080 case 4:
18081 start = byte_get ((unsigned char *) pnote->descdata, 4);
18082 end = 0;
18083 break;
18084
18085 case 8:
18086 if (is_32bit_elf)
18087 {
18088 /* FIXME: We should check that version 3+ notes are being used here... */
18089 start = byte_get ((unsigned char *) pnote->descdata, 4);
18090 end = byte_get ((unsigned char *) pnote->descdata + 4, 4);
18091 }
18092 else
18093 {
18094 start = byte_get ((unsigned char *) pnote->descdata, 8);
18095 end = 0;
18096 }
18097 break;
18098
18099 case 16:
18100 start = byte_get ((unsigned char *) pnote->descdata, 8);
18101 end = byte_get ((unsigned char *) pnote->descdata + 8, 8);
18102 break;
18103
18104 default:
18105 error (_(" <invalid description size: %lx>\n"), pnote->descsz);
18106 printf (_(" <invalid descsz>"));
18107 return FALSE;
18108 }
18109
18110 name = NULL;
18111 sym = get_symbol_for_build_attribute (filedata, start, is_open_attr, & name);
18112 /* As of version 5 of the annobin plugin, filename symbols are biased by 2
18113 in order to avoid them being confused with the start address of the
18114 first function in the file... */
18115 if (sym == NULL && is_open_attr)
18116 sym = get_symbol_for_build_attribute (filedata, start + 2, is_open_attr,
18117 & name);
18118
18119 if (end == 0 && sym != NULL && sym->st_size > 0)
18120 end = start + sym->st_size;
18121
18122 if (is_open_attr)
18123 {
18124 /* FIXME: Need to properly allow for section alignment.
18125 16 is just the alignment used on x86_64. */
18126 if (global_end > 0
18127 && start > BFD_ALIGN (global_end, 16)
18128 /* Build notes are not guaranteed to be organised in order of
18129 increasing address, but we should find the all of the notes
18130 for one section in the same place. */
18131 && same_section (filedata, start, global_end))
18132 warn (_("Gap in build notes detected from %#lx to %#lx\n"),
18133 global_end + 1, start - 1);
18134
18135 printf (_(" Applies to region from %#lx"), start);
18136 global_offset = start;
18137
18138 if (end)
18139 {
18140 printf (_(" to %#lx"), end);
18141 global_end = end;
18142 }
18143 }
18144 else
18145 {
18146 printf (_(" Applies to region from %#lx"), start);
18147 func_offset = start;
18148
18149 if (end)
18150 {
18151 printf (_(" to %#lx"), end);
18152 func_end = end;
18153 }
18154 }
18155
18156 if (sym && name)
18157 printf (_(" (%s)"), name);
18158
18159 printf ("\n");
18160 return TRUE;
18161 }
18162
18163 static bfd_boolean
18164 print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
18165 {
18166 static const char string_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_STRING, 0 };
18167 static const char number_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC, 0 };
18168 static const char bool_expected [3] = { GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE, GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE, 0 };
18169 char name_type;
18170 char name_attribute;
18171 const char * expected_types;
18172 const char * name = pnote->namedata;
18173 const char * text;
18174 signed int left;
18175
18176 if (name == NULL || pnote->namesz < 2)
18177 {
18178 error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
18179 print_symbol (-20, _(" <corrupt name>"));
18180 return FALSE;
18181 }
18182
18183 if (do_wide)
18184 left = 28;
18185 else
18186 left = 20;
18187
18188 /* Version 2 of the spec adds a "GA" prefix to the name field. */
18189 if (name[0] == 'G' && name[1] == 'A')
18190 {
18191 if (pnote->namesz < 4)
18192 {
18193 error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
18194 print_symbol (-20, _(" <corrupt name>"));
18195 return FALSE;
18196 }
18197
18198 printf ("GA");
18199 name += 2;
18200 left -= 2;
18201 }
18202
18203 switch ((name_type = * name))
18204 {
18205 case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
18206 case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
18207 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
18208 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
18209 printf ("%c", * name);
18210 left --;
18211 break;
18212 default:
18213 error (_("unrecognised attribute type in name field: %d\n"), name_type);
18214 print_symbol (-20, _("<unknown name type>"));
18215 return FALSE;
18216 }
18217
18218 ++ name;
18219 text = NULL;
18220
18221 switch ((name_attribute = * name))
18222 {
18223 case GNU_BUILD_ATTRIBUTE_VERSION:
18224 text = _("<version>");
18225 expected_types = string_expected;
18226 ++ name;
18227 break;
18228 case GNU_BUILD_ATTRIBUTE_STACK_PROT:
18229 text = _("<stack prot>");
18230 expected_types = "!+*";
18231 ++ name;
18232 break;
18233 case GNU_BUILD_ATTRIBUTE_RELRO:
18234 text = _("<relro>");
18235 expected_types = bool_expected;
18236 ++ name;
18237 break;
18238 case GNU_BUILD_ATTRIBUTE_STACK_SIZE:
18239 text = _("<stack size>");
18240 expected_types = number_expected;
18241 ++ name;
18242 break;
18243 case GNU_BUILD_ATTRIBUTE_TOOL:
18244 text = _("<tool>");
18245 expected_types = string_expected;
18246 ++ name;
18247 break;
18248 case GNU_BUILD_ATTRIBUTE_ABI:
18249 text = _("<ABI>");
18250 expected_types = "$*";
18251 ++ name;
18252 break;
18253 case GNU_BUILD_ATTRIBUTE_PIC:
18254 text = _("<PIC>");
18255 expected_types = number_expected;
18256 ++ name;
18257 break;
18258 case GNU_BUILD_ATTRIBUTE_SHORT_ENUM:
18259 text = _("<short enum>");
18260 expected_types = bool_expected;
18261 ++ name;
18262 break;
18263 default:
18264 if (ISPRINT (* name))
18265 {
18266 int len = strnlen (name, pnote->namesz - (name - pnote->namedata)) + 1;
18267
18268 if (len > left && ! do_wide)
18269 len = left;
18270 printf ("%.*s:", len, name);
18271 left -= len;
18272 name += len;
18273 }
18274 else
18275 {
18276 static char tmpbuf [128];
18277
18278 error (_("unrecognised byte in name field: %d\n"), * name);
18279 sprintf (tmpbuf, _("<unknown:_%d>"), * name);
18280 text = tmpbuf;
18281 name ++;
18282 }
18283 expected_types = "*$!+";
18284 break;
18285 }
18286
18287 if (text)
18288 left -= printf ("%s", text);
18289
18290 if (strchr (expected_types, name_type) == NULL)
18291 warn (_("attribute does not have an expected type (%c)\n"), name_type);
18292
18293 if ((unsigned long)(name - pnote->namedata) > pnote->namesz)
18294 {
18295 error (_("corrupt name field: namesz: %lu but parsing gets to %ld\n"),
18296 (unsigned long) pnote->namesz,
18297 (long) (name - pnote->namedata));
18298 return FALSE;
18299 }
18300
18301 if (left < 1 && ! do_wide)
18302 return TRUE;
18303
18304 switch (name_type)
18305 {
18306 case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
18307 {
18308 unsigned int bytes;
18309 unsigned long long val = 0;
18310 unsigned int shift = 0;
18311 char * decoded = NULL;
18312
18313 bytes = pnote->namesz - (name - pnote->namedata);
18314 if (bytes > 0)
18315 /* The -1 is because the name field is always 0 terminated, and we
18316 want to be able to ensure that the shift in the while loop below
18317 will not overflow. */
18318 -- bytes;
18319
18320 if (bytes > sizeof (val))
18321 {
18322 error (_("corrupt numeric name field: too many bytes in the value: %x\n"),
18323 bytes);
18324 bytes = sizeof (val);
18325 }
18326 /* We do not bother to warn if bytes == 0 as this can
18327 happen with some early versions of the gcc plugin. */
18328
18329 while (bytes --)
18330 {
18331 unsigned long byte = (* name ++) & 0xff;
18332
18333 val |= byte << shift;
18334 shift += 8;
18335 }
18336
18337 switch (name_attribute)
18338 {
18339 case GNU_BUILD_ATTRIBUTE_PIC:
18340 switch (val)
18341 {
18342 case 0: decoded = "static"; break;
18343 case 1: decoded = "pic"; break;
18344 case 2: decoded = "PIC"; break;
18345 case 3: decoded = "pie"; break;
18346 case 4: decoded = "PIE"; break;
18347 default: break;
18348 }
18349 break;
18350 case GNU_BUILD_ATTRIBUTE_STACK_PROT:
18351 switch (val)
18352 {
18353 /* Based upon the SPCT_FLAG_xxx enum values in gcc/cfgexpand.c. */
18354 case 0: decoded = "off"; break;
18355 case 1: decoded = "on"; break;
18356 case 2: decoded = "all"; break;
18357 case 3: decoded = "strong"; break;
18358 case 4: decoded = "explicit"; break;
18359 default: break;
18360 }
18361 break;
18362 default:
18363 break;
18364 }
18365
18366 if (decoded != NULL)
18367 {
18368 print_symbol (-left, decoded);
18369 left = 0;
18370 }
18371 else if (val == 0)
18372 {
18373 printf ("0x0");
18374 left -= 3;
18375 }
18376 else
18377 {
18378 if (do_wide)
18379 left -= printf ("0x%llx", val);
18380 else
18381 left -= printf ("0x%-.*llx", left, val);
18382 }
18383 }
18384 break;
18385 case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
18386 left -= print_symbol (- left, name);
18387 break;
18388 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
18389 left -= print_symbol (- left, "true");
18390 break;
18391 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
18392 left -= print_symbol (- left, "false");
18393 break;
18394 }
18395
18396 if (do_wide && left > 0)
18397 printf ("%-*s", left, " ");
18398
18399 return TRUE;
18400 }
18401
18402 /* Note that by the ELF standard, the name field is already null byte
18403 terminated, and namesz includes the terminating null byte.
18404 I.E. the value of namesz for the name "FSF" is 4.
18405
18406 If the value of namesz is zero, there is no name present. */
18407
18408 static bfd_boolean
18409 process_note (Elf_Internal_Note * pnote,
18410 Filedata * filedata)
18411 {
18412 const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
18413 const char * nt;
18414
18415 if (pnote->namesz == 0)
18416 /* If there is no note name, then use the default set of
18417 note type strings. */
18418 nt = get_note_type (filedata, pnote->type);
18419
18420 else if (const_strneq (pnote->namedata, "GNU"))
18421 /* GNU-specific object file notes. */
18422 nt = get_gnu_elf_note_type (pnote->type);
18423
18424 else if (const_strneq (pnote->namedata, "FreeBSD"))
18425 /* FreeBSD-specific core file notes. */
18426 nt = get_freebsd_elfcore_note_type (filedata, pnote->type);
18427
18428 else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
18429 /* NetBSD-specific core file notes. */
18430 nt = get_netbsd_elfcore_note_type (filedata, pnote->type);
18431
18432 else if (const_strneq (pnote->namedata, "NetBSD"))
18433 /* NetBSD-specific core file notes. */
18434 return process_netbsd_elf_note (pnote);
18435
18436 else if (strneq (pnote->namedata, "SPU/", 4))
18437 {
18438 /* SPU-specific core file notes. */
18439 nt = pnote->namedata + 4;
18440 name = "SPU";
18441 }
18442
18443 else if (const_strneq (pnote->namedata, "IPF/VMS"))
18444 /* VMS/ia64-specific file notes. */
18445 nt = get_ia64_vms_note_type (pnote->type);
18446
18447 else if (const_strneq (pnote->namedata, "stapsdt"))
18448 nt = get_stapsdt_note_type (pnote->type);
18449
18450 else
18451 /* Don't recognize this note name; just use the default set of
18452 note type strings. */
18453 nt = get_note_type (filedata, pnote->type);
18454
18455 printf (" ");
18456
18457 if (((const_strneq (pnote->namedata, "GA")
18458 && strchr ("*$!+", pnote->namedata[2]) != NULL)
18459 || strchr ("*$!+", pnote->namedata[0]) != NULL)
18460 && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
18461 || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
18462 print_gnu_build_attribute_name (pnote);
18463 else
18464 print_symbol (-20, name);
18465
18466 if (do_wide)
18467 printf (" 0x%08lx\t%s\t", pnote->descsz, nt);
18468 else
18469 printf (" 0x%08lx\t%s\n", pnote->descsz, nt);
18470
18471 if (const_strneq (pnote->namedata, "IPF/VMS"))
18472 return print_ia64_vms_note (pnote);
18473 else if (const_strneq (pnote->namedata, "GNU"))
18474 return print_gnu_note (filedata, pnote);
18475 else if (const_strneq (pnote->namedata, "stapsdt"))
18476 return print_stapsdt_note (pnote);
18477 else if (const_strneq (pnote->namedata, "CORE"))
18478 return print_core_note (pnote);
18479 else if (((const_strneq (pnote->namedata, "GA")
18480 && strchr ("*$!+", pnote->namedata[2]) != NULL)
18481 || strchr ("*$!+", pnote->namedata[0]) != NULL)
18482 && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
18483 || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
18484 return print_gnu_build_attribute_description (pnote, filedata);
18485
18486 if (pnote->descsz)
18487 {
18488 unsigned long i;
18489
18490 printf (_(" description data: "));
18491 for (i = 0; i < pnote->descsz; i++)
18492 printf ("%02x ", pnote->descdata[i]);
18493 if (!do_wide)
18494 printf ("\n");
18495 }
18496
18497 if (do_wide)
18498 printf ("\n");
18499
18500 return TRUE;
18501 }
18502
18503 static bfd_boolean
18504 process_notes_at (Filedata * filedata,
18505 Elf_Internal_Shdr * section,
18506 bfd_vma offset,
18507 bfd_vma length,
18508 bfd_vma align)
18509 {
18510 Elf_External_Note * pnotes;
18511 Elf_External_Note * external;
18512 char * end;
18513 bfd_boolean res = TRUE;
18514
18515 if (length <= 0)
18516 return FALSE;
18517
18518 if (section)
18519 {
18520 pnotes = (Elf_External_Note *) get_section_contents (section, filedata);
18521 if (pnotes)
18522 {
18523 if (! apply_relocations (filedata, section, (unsigned char *) pnotes, length, NULL, NULL))
18524 return FALSE;
18525 }
18526 }
18527 else
18528 pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
18529 _("notes"));
18530
18531 if (pnotes == NULL)
18532 return FALSE;
18533
18534 external = pnotes;
18535
18536 if (section)
18537 printf (_("\nDisplaying notes found in: %s\n"), printable_section_name (filedata, section));
18538 else
18539 printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
18540 (unsigned long) offset, (unsigned long) length);
18541
18542 /* NB: Some note sections may have alignment value of 0 or 1. gABI
18543 specifies that notes should be aligned to 4 bytes in 32-bit
18544 objects and to 8 bytes in 64-bit objects. As a Linux extension,
18545 we also support 4 byte alignment in 64-bit objects. If section
18546 alignment is less than 4, we treate alignment as 4 bytes. */
18547 if (align < 4)
18548 align = 4;
18549 else if (align != 4 && align != 8)
18550 {
18551 warn (_("Corrupt note: alignment %ld, expecting 4 or 8\n"),
18552 (long) align);
18553 return FALSE;
18554 }
18555
18556 printf (_(" %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
18557
18558 end = (char *) pnotes + length;
18559 while ((char *) external < end)
18560 {
18561 Elf_Internal_Note inote;
18562 size_t min_notesz;
18563 char * next;
18564 char * temp = NULL;
18565 size_t data_remaining = end - (char *) external;
18566
18567 if (!is_ia64_vms (filedata))
18568 {
18569 /* PR binutils/15191
18570 Make sure that there is enough data to read. */
18571 min_notesz = offsetof (Elf_External_Note, name);
18572 if (data_remaining < min_notesz)
18573 {
18574 warn (ngettext ("Corrupt note: only %ld byte remains, "
18575 "not enough for a full note\n",
18576 "Corrupt note: only %ld bytes remain, "
18577 "not enough for a full note\n",
18578 data_remaining),
18579 (long) data_remaining);
18580 break;
18581 }
18582 data_remaining -= min_notesz;
18583
18584 inote.type = BYTE_GET (external->type);
18585 inote.namesz = BYTE_GET (external->namesz);
18586 inote.namedata = external->name;
18587 inote.descsz = BYTE_GET (external->descsz);
18588 inote.descdata = ((char *) external
18589 + ELF_NOTE_DESC_OFFSET (inote.namesz, align));
18590 inote.descpos = offset + (inote.descdata - (char *) pnotes);
18591 next = ((char *) external
18592 + ELF_NOTE_NEXT_OFFSET (inote.namesz, inote.descsz, align));
18593 }
18594 else
18595 {
18596 Elf64_External_VMS_Note *vms_external;
18597
18598 /* PR binutils/15191
18599 Make sure that there is enough data to read. */
18600 min_notesz = offsetof (Elf64_External_VMS_Note, name);
18601 if (data_remaining < min_notesz)
18602 {
18603 warn (ngettext ("Corrupt note: only %ld byte remains, "
18604 "not enough for a full note\n",
18605 "Corrupt note: only %ld bytes remain, "
18606 "not enough for a full note\n",
18607 data_remaining),
18608 (long) data_remaining);
18609 break;
18610 }
18611 data_remaining -= min_notesz;
18612
18613 vms_external = (Elf64_External_VMS_Note *) external;
18614 inote.type = BYTE_GET (vms_external->type);
18615 inote.namesz = BYTE_GET (vms_external->namesz);
18616 inote.namedata = vms_external->name;
18617 inote.descsz = BYTE_GET (vms_external->descsz);
18618 inote.descdata = inote.namedata + align_power (inote.namesz, 3);
18619 inote.descpos = offset + (inote.descdata - (char *) pnotes);
18620 next = inote.descdata + align_power (inote.descsz, 3);
18621 }
18622
18623 /* PR 17531: file: 3443835e. */
18624 /* PR 17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4. */
18625 if ((size_t) (inote.descdata - inote.namedata) < inote.namesz
18626 || (size_t) (inote.descdata - inote.namedata) > data_remaining
18627 || (size_t) (next - inote.descdata) < inote.descsz
18628 || ((size_t) (next - inote.descdata)
18629 > data_remaining - (size_t) (inote.descdata - inote.namedata)))
18630 {
18631 warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
18632 (unsigned long) ((char *) external - (char *) pnotes));
18633 warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx, alignment: %u\n"),
18634 inote.type, inote.namesz, inote.descsz, (int) align);
18635 break;
18636 }
18637
18638 external = (Elf_External_Note *) next;
18639
18640 /* Verify that name is null terminated. It appears that at least
18641 one version of Linux (RedHat 6.0) generates corefiles that don't
18642 comply with the ELF spec by failing to include the null byte in
18643 namesz. */
18644 if (inote.namedata[inote.namesz - 1] != '\0')
18645 {
18646 if ((size_t) (inote.descdata - inote.namedata) == inote.namesz)
18647 {
18648 temp = (char *) malloc (inote.namesz + 1);
18649 if (temp == NULL)
18650 {
18651 error (_("Out of memory allocating space for inote name\n"));
18652 res = FALSE;
18653 break;
18654 }
18655
18656 memcpy (temp, inote.namedata, inote.namesz);
18657 inote.namedata = temp;
18658 }
18659 inote.namedata[inote.namesz] = 0;
18660 }
18661
18662 if (! process_note (& inote, filedata))
18663 res = FALSE;
18664
18665 if (temp != NULL)
18666 {
18667 free (temp);
18668 temp = NULL;
18669 }
18670 }
18671
18672 free (pnotes);
18673
18674 return res;
18675 }
18676
18677 static bfd_boolean
18678 process_corefile_note_segments (Filedata * filedata)
18679 {
18680 Elf_Internal_Phdr * segment;
18681 unsigned int i;
18682 bfd_boolean res = TRUE;
18683
18684 if (! get_program_headers (filedata))
18685 return TRUE;
18686
18687 for (i = 0, segment = filedata->program_headers;
18688 i < filedata->file_header.e_phnum;
18689 i++, segment++)
18690 {
18691 if (segment->p_type == PT_NOTE)
18692 if (! process_notes_at (filedata, NULL,
18693 (bfd_vma) segment->p_offset,
18694 (bfd_vma) segment->p_filesz,
18695 (bfd_vma) segment->p_align))
18696 res = FALSE;
18697 }
18698
18699 return res;
18700 }
18701
18702 static bfd_boolean
18703 process_v850_notes (Filedata * filedata, bfd_vma offset, bfd_vma length)
18704 {
18705 Elf_External_Note * pnotes;
18706 Elf_External_Note * external;
18707 char * end;
18708 bfd_boolean res = TRUE;
18709
18710 if (length <= 0)
18711 return FALSE;
18712
18713 pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
18714 _("v850 notes"));
18715 if (pnotes == NULL)
18716 return FALSE;
18717
18718 external = pnotes;
18719 end = (char*) pnotes + length;
18720
18721 printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
18722 (unsigned long) offset, (unsigned long) length);
18723
18724 while ((char *) external + sizeof (Elf_External_Note) < end)
18725 {
18726 Elf_External_Note * next;
18727 Elf_Internal_Note inote;
18728
18729 inote.type = BYTE_GET (external->type);
18730 inote.namesz = BYTE_GET (external->namesz);
18731 inote.namedata = external->name;
18732 inote.descsz = BYTE_GET (external->descsz);
18733 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
18734 inote.descpos = offset + (inote.descdata - (char *) pnotes);
18735
18736 if (inote.descdata < (char *) pnotes || inote.descdata >= end)
18737 {
18738 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
18739 inote.descdata = inote.namedata;
18740 inote.namesz = 0;
18741 }
18742
18743 next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
18744
18745 if ( ((char *) next > end)
18746 || ((char *) next < (char *) pnotes))
18747 {
18748 warn (_("corrupt descsz found in note at offset 0x%lx\n"),
18749 (unsigned long) ((char *) external - (char *) pnotes));
18750 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
18751 inote.type, inote.namesz, inote.descsz);
18752 break;
18753 }
18754
18755 external = next;
18756
18757 /* Prevent out-of-bounds indexing. */
18758 if ( inote.namedata + inote.namesz > end
18759 || inote.namedata + inote.namesz < inote.namedata)
18760 {
18761 warn (_("corrupt namesz found in note at offset 0x%lx\n"),
18762 (unsigned long) ((char *) external - (char *) pnotes));
18763 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
18764 inote.type, inote.namesz, inote.descsz);
18765 break;
18766 }
18767
18768 printf (" %s: ", get_v850_elf_note_type (inote.type));
18769
18770 if (! print_v850_note (& inote))
18771 {
18772 res = FALSE;
18773 printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
18774 inote.namesz, inote.descsz);
18775 }
18776 }
18777
18778 free (pnotes);
18779
18780 return res;
18781 }
18782
18783 static bfd_boolean
18784 process_note_sections (Filedata * filedata)
18785 {
18786 Elf_Internal_Shdr * section;
18787 unsigned long i;
18788 unsigned int n = 0;
18789 bfd_boolean res = TRUE;
18790
18791 for (i = 0, section = filedata->section_headers;
18792 i < filedata->file_header.e_shnum && section != NULL;
18793 i++, section++)
18794 {
18795 if (section->sh_type == SHT_NOTE)
18796 {
18797 if (! process_notes_at (filedata, section,
18798 (bfd_vma) section->sh_offset,
18799 (bfd_vma) section->sh_size,
18800 (bfd_vma) section->sh_addralign))
18801 res = FALSE;
18802 n++;
18803 }
18804
18805 if (( filedata->file_header.e_machine == EM_V800
18806 || filedata->file_header.e_machine == EM_V850
18807 || filedata->file_header.e_machine == EM_CYGNUS_V850)
18808 && section->sh_type == SHT_RENESAS_INFO)
18809 {
18810 if (! process_v850_notes (filedata,
18811 (bfd_vma) section->sh_offset,
18812 (bfd_vma) section->sh_size))
18813 res = FALSE;
18814 n++;
18815 }
18816 }
18817
18818 if (n == 0)
18819 /* Try processing NOTE segments instead. */
18820 return process_corefile_note_segments (filedata);
18821
18822 return res;
18823 }
18824
18825 static bfd_boolean
18826 process_notes (Filedata * filedata)
18827 {
18828 /* If we have not been asked to display the notes then do nothing. */
18829 if (! do_notes)
18830 return TRUE;
18831
18832 if (filedata->file_header.e_type != ET_CORE)
18833 return process_note_sections (filedata);
18834
18835 /* No program headers means no NOTE segment. */
18836 if (filedata->file_header.e_phnum > 0)
18837 return process_corefile_note_segments (filedata);
18838
18839 printf (_("No note segments present in the core file.\n"));
18840 return TRUE;
18841 }
18842
18843 static unsigned char *
18844 display_public_gnu_attributes (unsigned char * start,
18845 const unsigned char * const end)
18846 {
18847 printf (_(" Unknown GNU attribute: %s\n"), start);
18848
18849 start += strnlen ((char *) start, end - start);
18850 display_raw_attribute (start, end);
18851
18852 return (unsigned char *) end;
18853 }
18854
18855 static unsigned char *
18856 display_generic_attribute (unsigned char * start,
18857 unsigned int tag,
18858 const unsigned char * const end)
18859 {
18860 if (tag == 0)
18861 return (unsigned char *) end;
18862
18863 return display_tag_value (tag, start, end);
18864 }
18865
18866 static bfd_boolean
18867 process_arch_specific (Filedata * filedata)
18868 {
18869 if (! do_arch)
18870 return TRUE;
18871
18872 switch (filedata->file_header.e_machine)
18873 {
18874 case EM_ARC:
18875 case EM_ARC_COMPACT:
18876 case EM_ARC_COMPACT2:
18877 return process_attributes (filedata, "ARC", SHT_ARC_ATTRIBUTES,
18878 display_arc_attribute,
18879 display_generic_attribute);
18880 case EM_ARM:
18881 return process_attributes (filedata, "aeabi", SHT_ARM_ATTRIBUTES,
18882 display_arm_attribute,
18883 display_generic_attribute);
18884
18885 case EM_MIPS:
18886 case EM_MIPS_RS3_LE:
18887 return process_mips_specific (filedata);
18888
18889 case EM_MSP430:
18890 return process_attributes (filedata, "mspabi", SHT_MSP430_ATTRIBUTES,
18891 display_msp430x_attribute,
18892 display_generic_attribute);
18893
18894 case EM_NDS32:
18895 return process_nds32_specific (filedata);
18896
18897 case EM_PPC:
18898 case EM_PPC64:
18899 return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
18900 display_power_gnu_attribute);
18901
18902 case EM_S390:
18903 case EM_S390_OLD:
18904 return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
18905 display_s390_gnu_attribute);
18906
18907 case EM_SPARC:
18908 case EM_SPARC32PLUS:
18909 case EM_SPARCV9:
18910 return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
18911 display_sparc_gnu_attribute);
18912
18913 case EM_TI_C6000:
18914 return process_attributes (filedata, "c6xabi", SHT_C6000_ATTRIBUTES,
18915 display_tic6x_attribute,
18916 display_generic_attribute);
18917
18918 default:
18919 return process_attributes (filedata, "gnu", SHT_GNU_ATTRIBUTES,
18920 display_public_gnu_attributes,
18921 display_generic_attribute);
18922 }
18923 }
18924
18925 static bfd_boolean
18926 get_file_header (Filedata * filedata)
18927 {
18928 /* Read in the identity array. */
18929 if (fread (filedata->file_header.e_ident, EI_NIDENT, 1, filedata->handle) != 1)
18930 return FALSE;
18931
18932 /* Determine how to read the rest of the header. */
18933 switch (filedata->file_header.e_ident[EI_DATA])
18934 {
18935 default:
18936 case ELFDATANONE:
18937 case ELFDATA2LSB:
18938 byte_get = byte_get_little_endian;
18939 byte_put = byte_put_little_endian;
18940 break;
18941 case ELFDATA2MSB:
18942 byte_get = byte_get_big_endian;
18943 byte_put = byte_put_big_endian;
18944 break;
18945 }
18946
18947 /* For now we only support 32 bit and 64 bit ELF files. */
18948 is_32bit_elf = (filedata->file_header.e_ident[EI_CLASS] != ELFCLASS64);
18949
18950 /* Read in the rest of the header. */
18951 if (is_32bit_elf)
18952 {
18953 Elf32_External_Ehdr ehdr32;
18954
18955 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, filedata->handle) != 1)
18956 return FALSE;
18957
18958 filedata->file_header.e_type = BYTE_GET (ehdr32.e_type);
18959 filedata->file_header.e_machine = BYTE_GET (ehdr32.e_machine);
18960 filedata->file_header.e_version = BYTE_GET (ehdr32.e_version);
18961 filedata->file_header.e_entry = BYTE_GET (ehdr32.e_entry);
18962 filedata->file_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
18963 filedata->file_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
18964 filedata->file_header.e_flags = BYTE_GET (ehdr32.e_flags);
18965 filedata->file_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
18966 filedata->file_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
18967 filedata->file_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
18968 filedata->file_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
18969 filedata->file_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
18970 filedata->file_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
18971 }
18972 else
18973 {
18974 Elf64_External_Ehdr ehdr64;
18975
18976 /* If we have been compiled with sizeof (bfd_vma) == 4, then
18977 we will not be able to cope with the 64bit data found in
18978 64 ELF files. Detect this now and abort before we start
18979 overwriting things. */
18980 if (sizeof (bfd_vma) < 8)
18981 {
18982 error (_("This instance of readelf has been built without support for a\n\
18983 64 bit data type and so it cannot read 64 bit ELF files.\n"));
18984 return FALSE;
18985 }
18986
18987 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, filedata->handle) != 1)
18988 return FALSE;
18989
18990 filedata->file_header.e_type = BYTE_GET (ehdr64.e_type);
18991 filedata->file_header.e_machine = BYTE_GET (ehdr64.e_machine);
18992 filedata->file_header.e_version = BYTE_GET (ehdr64.e_version);
18993 filedata->file_header.e_entry = BYTE_GET (ehdr64.e_entry);
18994 filedata->file_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
18995 filedata->file_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
18996 filedata->file_header.e_flags = BYTE_GET (ehdr64.e_flags);
18997 filedata->file_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
18998 filedata->file_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
18999 filedata->file_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
19000 filedata->file_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
19001 filedata->file_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
19002 filedata->file_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
19003 }
19004
19005 if (filedata->file_header.e_shoff)
19006 {
19007 /* There may be some extensions in the first section header. Don't
19008 bomb if we can't read it. */
19009 if (is_32bit_elf)
19010 get_32bit_section_headers (filedata, TRUE);
19011 else
19012 get_64bit_section_headers (filedata, TRUE);
19013 }
19014
19015 return TRUE;
19016 }
19017
19018 static void
19019 close_file (Filedata * filedata)
19020 {
19021 if (filedata)
19022 {
19023 if (filedata->handle)
19024 fclose (filedata->handle);
19025 free (filedata);
19026 }
19027 }
19028
19029 void
19030 close_debug_file (void * data)
19031 {
19032 close_file ((Filedata *) data);
19033 }
19034
19035 static Filedata *
19036 open_file (const char * pathname)
19037 {
19038 struct stat statbuf;
19039 Filedata * filedata = NULL;
19040
19041 if (stat (pathname, & statbuf) < 0
19042 || ! S_ISREG (statbuf.st_mode))
19043 goto fail;
19044
19045 filedata = calloc (1, sizeof * filedata);
19046 if (filedata == NULL)
19047 goto fail;
19048
19049 filedata->handle = fopen (pathname, "rb");
19050 if (filedata->handle == NULL)
19051 goto fail;
19052
19053 filedata->file_size = (bfd_size_type) statbuf.st_size;
19054 filedata->file_name = pathname;
19055
19056 if (! get_file_header (filedata))
19057 goto fail;
19058
19059 if (filedata->file_header.e_shoff)
19060 {
19061 bfd_boolean res;
19062
19063 /* Read the section headers again, this time for real. */
19064 if (is_32bit_elf)
19065 res = get_32bit_section_headers (filedata, FALSE);
19066 else
19067 res = get_64bit_section_headers (filedata, FALSE);
19068
19069 if (!res)
19070 goto fail;
19071 }
19072
19073 return filedata;
19074
19075 fail:
19076 if (filedata)
19077 {
19078 if (filedata->handle)
19079 fclose (filedata->handle);
19080 free (filedata);
19081 }
19082 return NULL;
19083 }
19084
19085 void *
19086 open_debug_file (const char * pathname)
19087 {
19088 return open_file (pathname);
19089 }
19090
19091 /* Process one ELF object file according to the command line options.
19092 This file may actually be stored in an archive. The file is
19093 positioned at the start of the ELF object. Returns TRUE if no
19094 problems were encountered, FALSE otherwise. */
19095
19096 static bfd_boolean
19097 process_object (Filedata * filedata)
19098 {
19099 Filedata * separates;
19100 unsigned int i;
19101 bfd_boolean res = TRUE;
19102
19103 if (! get_file_header (filedata))
19104 {
19105 error (_("%s: Failed to read file header\n"), filedata->file_name);
19106 return FALSE;
19107 }
19108
19109 /* Initialise per file variables. */
19110 for (i = ARRAY_SIZE (version_info); i--;)
19111 version_info[i] = 0;
19112
19113 for (i = ARRAY_SIZE (dynamic_info); i--;)
19114 dynamic_info[i] = 0;
19115 dynamic_info_DT_GNU_HASH = 0;
19116
19117 /* Process the file. */
19118 if (show_name)
19119 printf (_("\nFile: %s\n"), filedata->file_name);
19120
19121 /* Initialise the dump_sects array from the cmdline_dump_sects array.
19122 Note we do this even if cmdline_dump_sects is empty because we
19123 must make sure that the dump_sets array is zeroed out before each
19124 object file is processed. */
19125 if (filedata->num_dump_sects > cmdline.num_dump_sects)
19126 memset (filedata->dump_sects, 0, filedata->num_dump_sects * sizeof (* filedata->dump_sects));
19127
19128 if (cmdline.num_dump_sects > 0)
19129 {
19130 if (filedata->num_dump_sects == 0)
19131 /* A sneaky way of allocating the dump_sects array. */
19132 request_dump_bynumber (filedata, cmdline.num_dump_sects, 0);
19133
19134 assert (filedata->num_dump_sects >= cmdline.num_dump_sects);
19135 memcpy (filedata->dump_sects, cmdline.dump_sects,
19136 cmdline.num_dump_sects * sizeof (* filedata->dump_sects));
19137 }
19138
19139 if (! process_file_header (filedata))
19140 return FALSE;
19141
19142 if (! process_section_headers (filedata))
19143 {
19144 /* Without loaded section headers we cannot process lots of things. */
19145 do_unwind = do_version = do_dump = do_arch = FALSE;
19146
19147 if (! do_using_dynamic)
19148 do_syms = do_dyn_syms = do_reloc = FALSE;
19149 }
19150
19151 if (! process_section_groups (filedata))
19152 /* Without loaded section groups we cannot process unwind. */
19153 do_unwind = FALSE;
19154
19155 if (process_program_headers (filedata))
19156 process_dynamic_section (filedata);
19157 else
19158 res = FALSE;
19159
19160 if (! process_relocs (filedata))
19161 res = FALSE;
19162
19163 if (! process_unwind (filedata))
19164 res = FALSE;
19165
19166 if (! process_symbol_table (filedata))
19167 res = FALSE;
19168
19169 if (! process_syminfo (filedata))
19170 res = FALSE;
19171
19172 if (! process_version_sections (filedata))
19173 res = FALSE;
19174
19175 if (filedata->file_header.e_shstrndx != SHN_UNDEF)
19176 separates = load_separate_debug_file (filedata, filedata->file_name);
19177 else
19178 separates = NULL;
19179
19180 if (! process_section_contents (filedata))
19181 res = FALSE;
19182
19183 if (separates)
19184 {
19185 if (! process_section_headers (separates))
19186 res = FALSE;
19187 else if (! process_section_contents (separates))
19188 res = FALSE;
19189 }
19190
19191 if (! process_notes (filedata))
19192 res = FALSE;
19193
19194 if (! process_gnu_liblist (filedata))
19195 res = FALSE;
19196
19197 if (! process_arch_specific (filedata))
19198 res = FALSE;
19199
19200 free (filedata->program_headers);
19201 filedata->program_headers = NULL;
19202
19203 free (filedata->section_headers);
19204 filedata->section_headers = NULL;
19205
19206 free (filedata->string_table);
19207 filedata->string_table = NULL;
19208 filedata->string_table_length = 0;
19209
19210 if (dynamic_strings)
19211 {
19212 free (dynamic_strings);
19213 dynamic_strings = NULL;
19214 dynamic_strings_length = 0;
19215 }
19216
19217 if (dynamic_symbols)
19218 {
19219 free (dynamic_symbols);
19220 dynamic_symbols = NULL;
19221 num_dynamic_syms = 0;
19222 }
19223
19224 if (dynamic_syminfo)
19225 {
19226 free (dynamic_syminfo);
19227 dynamic_syminfo = NULL;
19228 }
19229
19230 if (dynamic_section)
19231 {
19232 free (dynamic_section);
19233 dynamic_section = NULL;
19234 }
19235
19236 if (section_headers_groups)
19237 {
19238 free (section_headers_groups);
19239 section_headers_groups = NULL;
19240 }
19241
19242 if (section_groups)
19243 {
19244 struct group_list * g;
19245 struct group_list * next;
19246
19247 for (i = 0; i < group_count; i++)
19248 {
19249 for (g = section_groups [i].root; g != NULL; g = next)
19250 {
19251 next = g->next;
19252 free (g);
19253 }
19254 }
19255
19256 free (section_groups);
19257 section_groups = NULL;
19258 }
19259
19260 free_debug_memory ();
19261
19262 return res;
19263 }
19264
19265 /* Process an ELF archive.
19266 On entry the file is positioned just after the ARMAG string.
19267 Returns TRUE upon success, FALSE otherwise. */
19268
19269 static bfd_boolean
19270 process_archive (Filedata * filedata, bfd_boolean is_thin_archive)
19271 {
19272 struct archive_info arch;
19273 struct archive_info nested_arch;
19274 size_t got;
19275 bfd_boolean ret = TRUE;
19276
19277 show_name = TRUE;
19278
19279 /* The ARCH structure is used to hold information about this archive. */
19280 arch.file_name = NULL;
19281 arch.file = NULL;
19282 arch.index_array = NULL;
19283 arch.sym_table = NULL;
19284 arch.longnames = NULL;
19285
19286 /* The NESTED_ARCH structure is used as a single-item cache of information
19287 about a nested archive (when members of a thin archive reside within
19288 another regular archive file). */
19289 nested_arch.file_name = NULL;
19290 nested_arch.file = NULL;
19291 nested_arch.index_array = NULL;
19292 nested_arch.sym_table = NULL;
19293 nested_arch.longnames = NULL;
19294
19295 if (setup_archive (&arch, filedata->file_name, filedata->handle,
19296 is_thin_archive, do_archive_index) != 0)
19297 {
19298 ret = FALSE;
19299 goto out;
19300 }
19301
19302 if (do_archive_index)
19303 {
19304 if (arch.sym_table == NULL)
19305 error (_("%s: unable to dump the index as none was found\n"), filedata->file_name);
19306 else
19307 {
19308 unsigned long i, l;
19309 unsigned long current_pos;
19310
19311 printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
19312 filedata->file_name, (unsigned long) arch.index_num, arch.sym_size);
19313
19314 current_pos = ftell (filedata->handle);
19315
19316 for (i = l = 0; i < arch.index_num; i++)
19317 {
19318 if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
19319 {
19320 char * member_name;
19321
19322 member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
19323
19324 if (member_name != NULL)
19325 {
19326 char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
19327
19328 if (qualified_name != NULL)
19329 {
19330 printf (_("Contents of binary %s at offset "), qualified_name);
19331 (void) print_vma (arch.index_array[i], PREFIX_HEX);
19332 putchar ('\n');
19333 free (qualified_name);
19334 }
19335 }
19336 }
19337
19338 if (l >= arch.sym_size)
19339 {
19340 error (_("%s: end of the symbol table reached before the end of the index\n"),
19341 filedata->file_name);
19342 ret = FALSE;
19343 break;
19344 }
19345 /* PR 17531: file: 0b6630b2. */
19346 printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
19347 l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
19348 }
19349
19350 if (arch.uses_64bit_indices)
19351 l = (l + 7) & ~ 7;
19352 else
19353 l += l & 1;
19354
19355 if (l < arch.sym_size)
19356 {
19357 error (ngettext ("%s: %ld byte remains in the symbol table, "
19358 "but without corresponding entries in "
19359 "the index table\n",
19360 "%s: %ld bytes remain in the symbol table, "
19361 "but without corresponding entries in "
19362 "the index table\n",
19363 arch.sym_size - l),
19364 filedata->file_name, arch.sym_size - l);
19365 ret = FALSE;
19366 }
19367
19368 if (fseek (filedata->handle, current_pos, SEEK_SET) != 0)
19369 {
19370 error (_("%s: failed to seek back to start of object files in the archive\n"),
19371 filedata->file_name);
19372 ret = FALSE;
19373 goto out;
19374 }
19375 }
19376
19377 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
19378 && !do_segments && !do_header && !do_dump && !do_version
19379 && !do_histogram && !do_debugging && !do_arch && !do_notes
19380 && !do_section_groups && !do_dyn_syms)
19381 {
19382 ret = TRUE; /* Archive index only. */
19383 goto out;
19384 }
19385 }
19386
19387 while (1)
19388 {
19389 char * name;
19390 size_t namelen;
19391 char * qualified_name;
19392
19393 /* Read the next archive header. */
19394 if (fseek (filedata->handle, arch.next_arhdr_offset, SEEK_SET) != 0)
19395 {
19396 error (_("%s: failed to seek to next archive header\n"), filedata->file_name);
19397 return FALSE;
19398 }
19399 got = fread (&arch.arhdr, 1, sizeof arch.arhdr, filedata->handle);
19400 if (got != sizeof arch.arhdr)
19401 {
19402 if (got == 0)
19403 break;
19404 error (_("%s: failed to read archive header\n"), filedata->file_name);
19405 ret = FALSE;
19406 break;
19407 }
19408 if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
19409 {
19410 error (_("%s: did not find a valid archive header\n"), arch.file_name);
19411 ret = FALSE;
19412 break;
19413 }
19414
19415 arch.next_arhdr_offset += sizeof arch.arhdr;
19416
19417 archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
19418 if (archive_file_size & 01)
19419 ++archive_file_size;
19420
19421 name = get_archive_member_name (&arch, &nested_arch);
19422 if (name == NULL)
19423 {
19424 error (_("%s: bad archive file name\n"), filedata->file_name);
19425 ret = FALSE;
19426 break;
19427 }
19428 namelen = strlen (name);
19429
19430 qualified_name = make_qualified_name (&arch, &nested_arch, name);
19431 if (qualified_name == NULL)
19432 {
19433 error (_("%s: bad archive file name\n"), filedata->file_name);
19434 ret = FALSE;
19435 break;
19436 }
19437
19438 if (is_thin_archive && arch.nested_member_origin == 0)
19439 {
19440 /* This is a proxy for an external member of a thin archive. */
19441 Filedata * member_filedata;
19442 char * member_file_name = adjust_relative_path
19443 (filedata->file_name, name, namelen);
19444
19445 if (member_file_name == NULL)
19446 {
19447 ret = FALSE;
19448 break;
19449 }
19450
19451 member_filedata = open_file (member_file_name);
19452 if (member_filedata == NULL)
19453 {
19454 error (_("Input file '%s' is not readable.\n"), member_file_name);
19455 free (member_file_name);
19456 ret = FALSE;
19457 break;
19458 }
19459
19460 archive_file_offset = arch.nested_member_origin;
19461 member_filedata->file_name = qualified_name;
19462
19463 if (! process_object (member_filedata))
19464 ret = FALSE;
19465
19466 close_file (member_filedata);
19467 free (member_file_name);
19468 }
19469 else if (is_thin_archive)
19470 {
19471 Filedata thin_filedata;
19472
19473 memset (&thin_filedata, 0, sizeof (thin_filedata));
19474
19475 /* PR 15140: Allow for corrupt thin archives. */
19476 if (nested_arch.file == NULL)
19477 {
19478 error (_("%s: contains corrupt thin archive: %s\n"),
19479 filedata->file_name, name);
19480 ret = FALSE;
19481 break;
19482 }
19483
19484 /* This is a proxy for a member of a nested archive. */
19485 archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
19486
19487 /* The nested archive file will have been opened and setup by
19488 get_archive_member_name. */
19489 if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
19490 {
19491 error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
19492 ret = FALSE;
19493 break;
19494 }
19495
19496 thin_filedata.handle = nested_arch.file;
19497 thin_filedata.file_name = qualified_name;
19498
19499 if (! process_object (& thin_filedata))
19500 ret = FALSE;
19501 }
19502 else
19503 {
19504 archive_file_offset = arch.next_arhdr_offset;
19505 arch.next_arhdr_offset += archive_file_size;
19506
19507 filedata->file_name = qualified_name;
19508 if (! process_object (filedata))
19509 ret = FALSE;
19510 }
19511
19512 if (filedata->dump_sects != NULL)
19513 {
19514 free (filedata->dump_sects);
19515 filedata->dump_sects = NULL;
19516 filedata->num_dump_sects = 0;
19517 }
19518
19519 free (qualified_name);
19520 }
19521
19522 out:
19523 if (nested_arch.file != NULL)
19524 fclose (nested_arch.file);
19525 release_archive (&nested_arch);
19526 release_archive (&arch);
19527
19528 return ret;
19529 }
19530
19531 static bfd_boolean
19532 process_file (char * file_name)
19533 {
19534 Filedata * filedata = NULL;
19535 struct stat statbuf;
19536 char armag[SARMAG];
19537 bfd_boolean ret = TRUE;
19538
19539 if (stat (file_name, &statbuf) < 0)
19540 {
19541 if (errno == ENOENT)
19542 error (_("'%s': No such file\n"), file_name);
19543 else
19544 error (_("Could not locate '%s'. System error message: %s\n"),
19545 file_name, strerror (errno));
19546 return FALSE;
19547 }
19548
19549 if (! S_ISREG (statbuf.st_mode))
19550 {
19551 error (_("'%s' is not an ordinary file\n"), file_name);
19552 return FALSE;
19553 }
19554
19555 filedata = calloc (1, sizeof * filedata);
19556 if (filedata == NULL)
19557 {
19558 error (_("Out of memory allocating file data structure\n"));
19559 return FALSE;
19560 }
19561
19562 filedata->file_name = file_name;
19563 filedata->handle = fopen (file_name, "rb");
19564 if (filedata->handle == NULL)
19565 {
19566 error (_("Input file '%s' is not readable.\n"), file_name);
19567 free (filedata);
19568 return FALSE;
19569 }
19570
19571 if (fread (armag, SARMAG, 1, filedata->handle) != 1)
19572 {
19573 error (_("%s: Failed to read file's magic number\n"), file_name);
19574 fclose (filedata->handle);
19575 free (filedata);
19576 return FALSE;
19577 }
19578
19579 filedata->file_size = (bfd_size_type) statbuf.st_size;
19580
19581 if (memcmp (armag, ARMAG, SARMAG) == 0)
19582 {
19583 if (! process_archive (filedata, FALSE))
19584 ret = FALSE;
19585 }
19586 else if (memcmp (armag, ARMAGT, SARMAG) == 0)
19587 {
19588 if ( ! process_archive (filedata, TRUE))
19589 ret = FALSE;
19590 }
19591 else
19592 {
19593 if (do_archive_index)
19594 error (_("File %s is not an archive so its index cannot be displayed.\n"),
19595 file_name);
19596
19597 rewind (filedata->handle);
19598 archive_file_size = archive_file_offset = 0;
19599
19600 if (! process_object (filedata))
19601 ret = FALSE;
19602 }
19603
19604 fclose (filedata->handle);
19605 free (filedata);
19606
19607 return ret;
19608 }
19609
19610 #ifdef SUPPORT_DISASSEMBLY
19611 /* Needed by the i386 disassembler. For extra credit, someone could
19612 fix this so that we insert symbolic addresses here, esp for GOT/PLT
19613 symbols. */
19614
19615 void
19616 print_address (unsigned int addr, FILE * outfile)
19617 {
19618 fprintf (outfile,"0x%8.8x", addr);
19619 }
19620
19621 /* Needed by the i386 disassembler. */
19622
19623 void
19624 db_task_printsym (unsigned int addr)
19625 {
19626 print_address (addr, stderr);
19627 }
19628 #endif
19629
19630 int
19631 main (int argc, char ** argv)
19632 {
19633 int err;
19634
19635 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
19636 setlocale (LC_MESSAGES, "");
19637 #endif
19638 #if defined (HAVE_SETLOCALE)
19639 setlocale (LC_CTYPE, "");
19640 #endif
19641 bindtextdomain (PACKAGE, LOCALEDIR);
19642 textdomain (PACKAGE);
19643
19644 expandargv (&argc, &argv);
19645
19646 cmdline.file_name = "<cmdline>";
19647 parse_args (& cmdline, argc, argv);
19648
19649 if (optind < (argc - 1))
19650 show_name = TRUE;
19651 else if (optind >= argc)
19652 {
19653 warn (_("Nothing to do.\n"));
19654 usage (stderr);
19655 }
19656
19657 err = FALSE;
19658 while (optind < argc)
19659 if (! process_file (argv[optind++]))
19660 err = TRUE;
19661
19662 if (cmdline.dump_sects != NULL)
19663 free (cmdline.dump_sects);
19664
19665 return err ? EXIT_FAILURE : EXIT_SUCCESS;
19666 }