]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - binutils/readelf.c
DT_FLAGS_1: Add Solaris bits
[thirdparty/binutils-gdb.git] / binutils / readelf.c
1 /* readelf.c -- display contents of an ELF format file
2 Copyright (C) 1998-2018 Free Software Foundation, Inc.
3
4 Originally developed by Eric Youngdale <eric@andante.jic.com>
5 Modifications by Nick Clifton <nickc@redhat.com>
6
7 This file is part of GNU Binutils.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
22 02110-1301, USA. */
23 \f
24 /* The difference between readelf and objdump:
25
26 Both programs are capable of displaying the contents of ELF format files,
27 so why does the binutils project have two file dumpers ?
28
29 The reason is that objdump sees an ELF file through a BFD filter of the
30 world; if BFD has a bug where, say, it disagrees about a machine constant
31 in e_flags, then the odds are good that it will remain internally
32 consistent. The linker sees it the BFD way, objdump sees it the BFD way,
33 GAS sees it the BFD way. There was need for a tool to go find out what
34 the file actually says.
35
36 This is why the readelf program does not link against the BFD library - it
37 exists as an independent program to help verify the correct working of BFD.
38
39 There is also the case that readelf can provide more information about an
40 ELF file than is provided by objdump. In particular it can display DWARF
41 debugging information which (at the moment) objdump cannot. */
42 \f
43 #include "sysdep.h"
44 #include <assert.h>
45 #include <time.h>
46 #include <zlib.h>
47 #ifdef HAVE_WCHAR_H
48 #include <wchar.h>
49 #endif
50
51 #if __GNUC__ >= 2
52 /* Define BFD64 here, even if our default architecture is 32 bit ELF
53 as this will allow us to read in and parse 64bit and 32bit ELF files.
54 Only do this if we believe that the compiler can support a 64 bit
55 data type. For now we only rely on GCC being able to do this. */
56 #define BFD64
57 #endif
58
59 #include "bfd.h"
60 #include "bucomm.h"
61 #include "elfcomm.h"
62 #include "dwarf.h"
63
64 #include "elf/common.h"
65 #include "elf/external.h"
66 #include "elf/internal.h"
67
68
69 /* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
70 we can obtain the H8 reloc numbers. We need these for the
71 get_reloc_size() function. We include h8.h again after defining
72 RELOC_MACROS_GEN_FUNC so that we get the naming function as well. */
73
74 #include "elf/h8.h"
75 #undef _ELF_H8_H
76
77 /* Undo the effects of #including reloc-macros.h. */
78
79 #undef START_RELOC_NUMBERS
80 #undef RELOC_NUMBER
81 #undef FAKE_RELOC
82 #undef EMPTY_RELOC
83 #undef END_RELOC_NUMBERS
84 #undef _RELOC_MACROS_H
85
86 /* The following headers use the elf/reloc-macros.h file to
87 automatically generate relocation recognition functions
88 such as elf_mips_reloc_type() */
89
90 #define RELOC_MACROS_GEN_FUNC
91
92 #include "elf/aarch64.h"
93 #include "elf/alpha.h"
94 #include "elf/arc.h"
95 #include "elf/arm.h"
96 #include "elf/avr.h"
97 #include "elf/bfin.h"
98 #include "elf/cr16.h"
99 #include "elf/cris.h"
100 #include "elf/crx.h"
101 #include "elf/d10v.h"
102 #include "elf/d30v.h"
103 #include "elf/dlx.h"
104 #include "elf/epiphany.h"
105 #include "elf/fr30.h"
106 #include "elf/frv.h"
107 #include "elf/ft32.h"
108 #include "elf/h8.h"
109 #include "elf/hppa.h"
110 #include "elf/i386.h"
111 #include "elf/i370.h"
112 #include "elf/i860.h"
113 #include "elf/i960.h"
114 #include "elf/ia64.h"
115 #include "elf/ip2k.h"
116 #include "elf/lm32.h"
117 #include "elf/iq2000.h"
118 #include "elf/m32c.h"
119 #include "elf/m32r.h"
120 #include "elf/m68k.h"
121 #include "elf/m68hc11.h"
122 #include "elf/mcore.h"
123 #include "elf/mep.h"
124 #include "elf/metag.h"
125 #include "elf/microblaze.h"
126 #include "elf/mips.h"
127 #include "elf/mmix.h"
128 #include "elf/mn10200.h"
129 #include "elf/mn10300.h"
130 #include "elf/moxie.h"
131 #include "elf/mt.h"
132 #include "elf/msp430.h"
133 #include "elf/nds32.h"
134 #include "elf/nios2.h"
135 #include "elf/or1k.h"
136 #include "elf/pj.h"
137 #include "elf/ppc.h"
138 #include "elf/ppc64.h"
139 #include "elf/pru.h"
140 #include "elf/riscv.h"
141 #include "elf/rl78.h"
142 #include "elf/rx.h"
143 #include "elf/s390.h"
144 #include "elf/score.h"
145 #include "elf/sh.h"
146 #include "elf/sparc.h"
147 #include "elf/spu.h"
148 #include "elf/tic6x.h"
149 #include "elf/tilegx.h"
150 #include "elf/tilepro.h"
151 #include "elf/v850.h"
152 #include "elf/vax.h"
153 #include "elf/visium.h"
154 #include "elf/wasm32.h"
155 #include "elf/x86-64.h"
156 #include "elf/xc16x.h"
157 #include "elf/xgate.h"
158 #include "elf/xstormy16.h"
159 #include "elf/xtensa.h"
160
161 #include "getopt.h"
162 #include "libiberty.h"
163 #include "safe-ctype.h"
164 #include "filenames.h"
165
166 #ifndef offsetof
167 #define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
168 #endif
169
170 typedef struct elf_section_list
171 {
172 Elf_Internal_Shdr * hdr;
173 struct elf_section_list * next;
174 } elf_section_list;
175
176 /* Flag bits indicating particular types of dump. */
177 #define HEX_DUMP (1 << 0) /* The -x command line switch. */
178 #define DISASS_DUMP (1 << 1) /* The -i command line switch. */
179 #define DEBUG_DUMP (1 << 2) /* The -w command line switch. */
180 #define STRING_DUMP (1 << 3) /* The -p command line switch. */
181 #define RELOC_DUMP (1 << 4) /* The -R command line switch. */
182
183 typedef unsigned char dump_type;
184
185 /* A linked list of the section names for which dumps were requested. */
186 struct dump_list_entry
187 {
188 char * name;
189 dump_type type;
190 struct dump_list_entry * next;
191 };
192
193 typedef struct filedata
194 {
195 const char * file_name;
196 FILE * handle;
197 bfd_size_type file_size;
198 Elf_Internal_Ehdr file_header;
199 Elf_Internal_Shdr * section_headers;
200 Elf_Internal_Phdr * program_headers;
201 char * string_table;
202 unsigned long string_table_length;
203 /* A dynamic array of flags indicating for which sections a dump of
204 some kind has been requested. It is reset on a per-object file
205 basis and then initialised from the cmdline_dump_sects array,
206 the results of interpreting the -w switch, and the
207 dump_sects_byname list. */
208 dump_type * dump_sects;
209 unsigned int num_dump_sects;
210 } Filedata;
211
212 char * program_name = "readelf";
213
214 static unsigned long archive_file_offset;
215 static unsigned long archive_file_size;
216 static unsigned long dynamic_addr;
217 static bfd_size_type dynamic_size;
218 static size_t dynamic_nent;
219 static char * dynamic_strings;
220 static unsigned long dynamic_strings_length;
221 static unsigned long num_dynamic_syms;
222 static Elf_Internal_Sym * dynamic_symbols;
223 static Elf_Internal_Syminfo * dynamic_syminfo;
224 static unsigned long dynamic_syminfo_offset;
225 static unsigned int dynamic_syminfo_nent;
226 static char program_interpreter[PATH_MAX];
227 static bfd_vma dynamic_info[DT_ENCODING];
228 static bfd_vma dynamic_info_DT_GNU_HASH;
229 static bfd_vma version_info[16];
230 static Elf_Internal_Dyn * dynamic_section;
231 static elf_section_list * symtab_shndx_list;
232 static bfd_boolean show_name = FALSE;
233 static bfd_boolean do_dynamic = FALSE;
234 static bfd_boolean do_syms = FALSE;
235 static bfd_boolean do_dyn_syms = FALSE;
236 static bfd_boolean do_reloc = FALSE;
237 static bfd_boolean do_sections = FALSE;
238 static bfd_boolean do_section_groups = FALSE;
239 static bfd_boolean do_section_details = FALSE;
240 static bfd_boolean do_segments = FALSE;
241 static bfd_boolean do_unwind = FALSE;
242 static bfd_boolean do_using_dynamic = FALSE;
243 static bfd_boolean do_header = FALSE;
244 static bfd_boolean do_dump = FALSE;
245 static bfd_boolean do_version = FALSE;
246 static bfd_boolean do_histogram = FALSE;
247 static bfd_boolean do_debugging = FALSE;
248 static bfd_boolean do_arch = FALSE;
249 static bfd_boolean do_notes = FALSE;
250 static bfd_boolean do_archive_index = FALSE;
251 static bfd_boolean is_32bit_elf = FALSE;
252 static bfd_boolean decompress_dumps = FALSE;
253
254 struct group_list
255 {
256 struct group_list * next;
257 unsigned int section_index;
258 };
259
260 struct group
261 {
262 struct group_list * root;
263 unsigned int group_index;
264 };
265
266 static size_t group_count;
267 static struct group * section_groups;
268 static struct group ** section_headers_groups;
269
270 /* A dynamic array of flags indicating for which sections a dump
271 has been requested via command line switches. */
272 static Filedata cmdline;
273
274 static struct dump_list_entry * dump_sects_byname;
275
276 /* How to print a vma value. */
277 typedef enum print_mode
278 {
279 HEX,
280 DEC,
281 DEC_5,
282 UNSIGNED,
283 PREFIX_HEX,
284 FULL_HEX,
285 LONG_HEX
286 }
287 print_mode;
288
289 /* Versioned symbol info. */
290 enum versioned_symbol_info
291 {
292 symbol_undefined,
293 symbol_hidden,
294 symbol_public
295 };
296
297 static const char * get_symbol_version_string
298 (Filedata *, bfd_boolean, const char *, unsigned long, unsigned,
299 Elf_Internal_Sym *, enum versioned_symbol_info *, unsigned short *);
300
301 #define UNKNOWN -1
302
303 #define SECTION_NAME(X) \
304 ((X) == NULL ? _("<none>") \
305 : filedata->string_table == NULL ? _("<no-strings>") \
306 : ((X)->sh_name >= filedata->string_table_length ? _("<corrupt>") \
307 : filedata->string_table + (X)->sh_name))
308
309 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
310
311 #define GET_ELF_SYMBOLS(file, section, sym_count) \
312 (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count) \
313 : get_64bit_elf_symbols (file, section, sym_count))
314
315 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
316 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
317 already been called and verified that the string exists. */
318 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
319
320 #define REMOVE_ARCH_BITS(ADDR) \
321 do \
322 { \
323 if (filedata->file_header.e_machine == EM_ARM) \
324 (ADDR) &= ~1; \
325 } \
326 while (0)
327 \f
328 /* Print a BFD_VMA to an internal buffer, for use in error messages.
329 BFD_FMA_FMT can't be used in translated strings. */
330
331 static const char *
332 bfd_vmatoa (char *fmtch, bfd_vma value)
333 {
334 /* bfd_vmatoa is used more then once in a printf call for output.
335 Cycle through an array of buffers. */
336 static int buf_pos = 0;
337 static struct bfd_vmatoa_buf
338 {
339 char place[64];
340 } buf[4];
341 char *ret;
342 char fmt[32];
343
344 ret = buf[buf_pos++].place;
345 buf_pos %= ARRAY_SIZE (buf);
346
347 sprintf (fmt, "%%%s%s", BFD_VMA_FMT, fmtch);
348 snprintf (ret, sizeof (buf[0].place), fmt, value);
349 return ret;
350 }
351
352 /* Retrieve NMEMB structures, each SIZE bytes long from FILEDATA starting at
353 OFFSET + the offset of the current archive member, if we are examining an
354 archive. Put the retrieved data into VAR, if it is not NULL. Otherwise
355 allocate a buffer using malloc and fill that. In either case return the
356 pointer to the start of the retrieved data or NULL if something went wrong.
357 If something does go wrong and REASON is not NULL then emit an error
358 message using REASON as part of the context. */
359
360 static void *
361 get_data (void * var,
362 Filedata * filedata,
363 unsigned long offset,
364 bfd_size_type size,
365 bfd_size_type nmemb,
366 const char * reason)
367 {
368 void * mvar;
369 bfd_size_type amt = size * nmemb;
370
371 if (size == 0 || nmemb == 0)
372 return NULL;
373
374 /* If the size_t type is smaller than the bfd_size_type, eg because
375 you are building a 32-bit tool on a 64-bit host, then make sure
376 that when the sizes are cast to (size_t) no information is lost. */
377 if (sizeof (size_t) < sizeof (bfd_size_type)
378 && ( (bfd_size_type) ((size_t) size) != size
379 || (bfd_size_type) ((size_t) nmemb) != nmemb))
380 {
381 if (reason)
382 error (_("Size truncation prevents reading %s"
383 " elements of size %s for %s\n"),
384 bfd_vmatoa ("u", nmemb), bfd_vmatoa ("u", size), reason);
385 return NULL;
386 }
387
388 /* Check for size overflow. */
389 if (amt < nmemb)
390 {
391 if (reason)
392 error (_("Size overflow prevents reading %s"
393 " elements of size %s for %s\n"),
394 bfd_vmatoa ("u", nmemb), bfd_vmatoa ("u", size), reason);
395 return NULL;
396 }
397
398 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
399 attempting to allocate memory when the read is bound to fail. */
400 if (amt > filedata->file_size
401 || offset + archive_file_offset + amt > filedata->file_size)
402 {
403 if (reason)
404 error (_("Reading %s bytes extends past end of file for %s\n"),
405 bfd_vmatoa ("u", amt), reason);
406 return NULL;
407 }
408
409 if (fseek (filedata->handle, archive_file_offset + offset, SEEK_SET))
410 {
411 if (reason)
412 error (_("Unable to seek to 0x%lx for %s\n"),
413 archive_file_offset + offset, reason);
414 return NULL;
415 }
416
417 mvar = var;
418 if (mvar == NULL)
419 {
420 /* Check for overflow. */
421 if (nmemb < (~(bfd_size_type) 0 - 1) / size)
422 /* + 1 so that we can '\0' terminate invalid string table sections. */
423 mvar = malloc ((size_t) amt + 1);
424
425 if (mvar == NULL)
426 {
427 if (reason)
428 error (_("Out of memory allocating %s bytes for %s\n"),
429 bfd_vmatoa ("u", amt), reason);
430 return NULL;
431 }
432
433 ((char *) mvar)[amt] = '\0';
434 }
435
436 if (fread (mvar, (size_t) size, (size_t) nmemb, filedata->handle) != nmemb)
437 {
438 if (reason)
439 error (_("Unable to read in %s bytes of %s\n"),
440 bfd_vmatoa ("u", amt), reason);
441 if (mvar != var)
442 free (mvar);
443 return NULL;
444 }
445
446 return mvar;
447 }
448
449 /* Print a VMA value in the MODE specified.
450 Returns the number of characters displayed. */
451
452 static unsigned int
453 print_vma (bfd_vma vma, print_mode mode)
454 {
455 unsigned int nc = 0;
456
457 switch (mode)
458 {
459 case FULL_HEX:
460 nc = printf ("0x");
461 /* Fall through. */
462 case LONG_HEX:
463 #ifdef BFD64
464 if (is_32bit_elf)
465 return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
466 #endif
467 printf_vma (vma);
468 return nc + 16;
469
470 case DEC_5:
471 if (vma <= 99999)
472 return printf ("%5" BFD_VMA_FMT "d", vma);
473 /* Fall through. */
474 case PREFIX_HEX:
475 nc = printf ("0x");
476 /* Fall through. */
477 case HEX:
478 return nc + printf ("%" BFD_VMA_FMT "x", vma);
479
480 case DEC:
481 return printf ("%" BFD_VMA_FMT "d", vma);
482
483 case UNSIGNED:
484 return printf ("%" BFD_VMA_FMT "u", vma);
485
486 default:
487 /* FIXME: Report unrecognised mode ? */
488 return 0;
489 }
490 }
491
492 /* Display a symbol on stdout. Handles the display of control characters and
493 multibye characters (assuming the host environment supports them).
494
495 Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
496
497 If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
498 padding as necessary.
499
500 Returns the number of emitted characters. */
501
502 static unsigned int
503 print_symbol (signed int width, const char *symbol)
504 {
505 bfd_boolean extra_padding = FALSE;
506 signed int num_printed = 0;
507 #ifdef HAVE_MBSTATE_T
508 mbstate_t state;
509 #endif
510 unsigned int width_remaining;
511
512 if (width < 0)
513 {
514 /* Keep the width positive. This helps the code below. */
515 width = - width;
516 extra_padding = TRUE;
517 }
518 assert (width != 0);
519
520 if (do_wide)
521 /* Set the remaining width to a very large value.
522 This simplifies the code below. */
523 width_remaining = INT_MAX;
524 else
525 width_remaining = width;
526
527 #ifdef HAVE_MBSTATE_T
528 /* Initialise the multibyte conversion state. */
529 memset (& state, 0, sizeof (state));
530 #endif
531
532 while (width_remaining)
533 {
534 size_t n;
535 const char c = *symbol++;
536
537 if (c == 0)
538 break;
539
540 /* Do not print control characters directly as they can affect terminal
541 settings. Such characters usually appear in the names generated
542 by the assembler for local labels. */
543 if (ISCNTRL (c))
544 {
545 if (width_remaining < 2)
546 break;
547
548 printf ("^%c", c + 0x40);
549 width_remaining -= 2;
550 num_printed += 2;
551 }
552 else if (ISPRINT (c))
553 {
554 putchar (c);
555 width_remaining --;
556 num_printed ++;
557 }
558 else
559 {
560 #ifdef HAVE_MBSTATE_T
561 wchar_t w;
562 #endif
563 /* Let printf do the hard work of displaying multibyte characters. */
564 printf ("%.1s", symbol - 1);
565 width_remaining --;
566 num_printed ++;
567
568 #ifdef HAVE_MBSTATE_T
569 /* Try to find out how many bytes made up the character that was
570 just printed. Advance the symbol pointer past the bytes that
571 were displayed. */
572 n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
573 #else
574 n = 1;
575 #endif
576 if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
577 symbol += (n - 1);
578 }
579 }
580
581 if (extra_padding && num_printed < width)
582 {
583 /* Fill in the remaining spaces. */
584 printf ("%-*s", width - num_printed, " ");
585 num_printed = width;
586 }
587
588 return num_printed;
589 }
590
591 /* Returns a pointer to a static buffer containing a printable version of
592 the given section's name. Like print_symbol, except that it does not try
593 to print multibyte characters, it just interprets them as hex values. */
594
595 static const char *
596 printable_section_name (Filedata * filedata, const Elf_Internal_Shdr * sec)
597 {
598 #define MAX_PRINT_SEC_NAME_LEN 128
599 static char sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
600 const char * name = SECTION_NAME (sec);
601 char * buf = sec_name_buf;
602 char c;
603 unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
604
605 while ((c = * name ++) != 0)
606 {
607 if (ISCNTRL (c))
608 {
609 if (remaining < 2)
610 break;
611
612 * buf ++ = '^';
613 * buf ++ = c + 0x40;
614 remaining -= 2;
615 }
616 else if (ISPRINT (c))
617 {
618 * buf ++ = c;
619 remaining -= 1;
620 }
621 else
622 {
623 static char hex[17] = "0123456789ABCDEF";
624
625 if (remaining < 4)
626 break;
627 * buf ++ = '<';
628 * buf ++ = hex[(c & 0xf0) >> 4];
629 * buf ++ = hex[c & 0x0f];
630 * buf ++ = '>';
631 remaining -= 4;
632 }
633
634 if (remaining == 0)
635 break;
636 }
637
638 * buf = 0;
639 return sec_name_buf;
640 }
641
642 static const char *
643 printable_section_name_from_index (Filedata * filedata, unsigned long ndx)
644 {
645 if (ndx >= filedata->file_header.e_shnum)
646 return _("<corrupt>");
647
648 return printable_section_name (filedata, filedata->section_headers + ndx);
649 }
650
651 /* Return a pointer to section NAME, or NULL if no such section exists. */
652
653 static Elf_Internal_Shdr *
654 find_section (Filedata * filedata, const char * name)
655 {
656 unsigned int i;
657
658 if (filedata->section_headers == NULL)
659 return NULL;
660
661 for (i = 0; i < filedata->file_header.e_shnum; i++)
662 if (streq (SECTION_NAME (filedata->section_headers + i), name))
663 return filedata->section_headers + i;
664
665 return NULL;
666 }
667
668 /* Return a pointer to a section containing ADDR, or NULL if no such
669 section exists. */
670
671 static Elf_Internal_Shdr *
672 find_section_by_address (Filedata * filedata, bfd_vma addr)
673 {
674 unsigned int i;
675
676 if (filedata->section_headers == NULL)
677 return NULL;
678
679 for (i = 0; i < filedata->file_header.e_shnum; i++)
680 {
681 Elf_Internal_Shdr *sec = filedata->section_headers + i;
682
683 if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
684 return sec;
685 }
686
687 return NULL;
688 }
689
690 static Elf_Internal_Shdr *
691 find_section_by_type (Filedata * filedata, unsigned int type)
692 {
693 unsigned int i;
694
695 if (filedata->section_headers == NULL)
696 return NULL;
697
698 for (i = 0; i < filedata->file_header.e_shnum; i++)
699 {
700 Elf_Internal_Shdr *sec = filedata->section_headers + i;
701
702 if (sec->sh_type == type)
703 return sec;
704 }
705
706 return NULL;
707 }
708
709 /* Return a pointer to section NAME, or NULL if no such section exists,
710 restricted to the list of sections given in SET. */
711
712 static Elf_Internal_Shdr *
713 find_section_in_set (Filedata * filedata, const char * name, unsigned int * set)
714 {
715 unsigned int i;
716
717 if (filedata->section_headers == NULL)
718 return NULL;
719
720 if (set != NULL)
721 {
722 while ((i = *set++) > 0)
723 {
724 /* See PR 21156 for a reproducer. */
725 if (i >= filedata->file_header.e_shnum)
726 continue; /* FIXME: Should we issue an error message ? */
727
728 if (streq (SECTION_NAME (filedata->section_headers + i), name))
729 return filedata->section_headers + i;
730 }
731 }
732
733 return find_section (filedata, name);
734 }
735
736 /* Read an unsigned LEB128 encoded value from DATA.
737 Set *LENGTH_RETURN to the number of bytes read. */
738
739 static inline unsigned long
740 read_uleb128 (unsigned char * data,
741 unsigned int * length_return,
742 const unsigned char * const end)
743 {
744 return read_leb128 (data, length_return, FALSE, end);
745 }
746
747 /* Return TRUE if the current file is for IA-64 machine and OpenVMS ABI.
748 This OS has so many departures from the ELF standard that we test it at
749 many places. */
750
751 static inline bfd_boolean
752 is_ia64_vms (Filedata * filedata)
753 {
754 return filedata->file_header.e_machine == EM_IA_64
755 && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
756 }
757
758 /* Guess the relocation size commonly used by the specific machines. */
759
760 static bfd_boolean
761 guess_is_rela (unsigned int e_machine)
762 {
763 switch (e_machine)
764 {
765 /* Targets that use REL relocations. */
766 case EM_386:
767 case EM_IAMCU:
768 case EM_960:
769 case EM_ARM:
770 case EM_D10V:
771 case EM_CYGNUS_D10V:
772 case EM_DLX:
773 case EM_MIPS:
774 case EM_MIPS_RS3_LE:
775 case EM_CYGNUS_M32R:
776 case EM_SCORE:
777 case EM_XGATE:
778 return FALSE;
779
780 /* Targets that use RELA relocations. */
781 case EM_68K:
782 case EM_860:
783 case EM_AARCH64:
784 case EM_ADAPTEVA_EPIPHANY:
785 case EM_ALPHA:
786 case EM_ALTERA_NIOS2:
787 case EM_ARC:
788 case EM_ARC_COMPACT:
789 case EM_ARC_COMPACT2:
790 case EM_AVR:
791 case EM_AVR_OLD:
792 case EM_BLACKFIN:
793 case EM_CR16:
794 case EM_CRIS:
795 case EM_CRX:
796 case EM_D30V:
797 case EM_CYGNUS_D30V:
798 case EM_FR30:
799 case EM_FT32:
800 case EM_CYGNUS_FR30:
801 case EM_CYGNUS_FRV:
802 case EM_H8S:
803 case EM_H8_300:
804 case EM_H8_300H:
805 case EM_IA_64:
806 case EM_IP2K:
807 case EM_IP2K_OLD:
808 case EM_IQ2000:
809 case EM_LATTICEMICO32:
810 case EM_M32C_OLD:
811 case EM_M32C:
812 case EM_M32R:
813 case EM_MCORE:
814 case EM_CYGNUS_MEP:
815 case EM_METAG:
816 case EM_MMIX:
817 case EM_MN10200:
818 case EM_CYGNUS_MN10200:
819 case EM_MN10300:
820 case EM_CYGNUS_MN10300:
821 case EM_MOXIE:
822 case EM_MSP430:
823 case EM_MSP430_OLD:
824 case EM_MT:
825 case EM_NDS32:
826 case EM_NIOS32:
827 case EM_OR1K:
828 case EM_PPC64:
829 case EM_PPC:
830 case EM_TI_PRU:
831 case EM_RISCV:
832 case EM_RL78:
833 case EM_RX:
834 case EM_S390:
835 case EM_S390_OLD:
836 case EM_SH:
837 case EM_SPARC:
838 case EM_SPARC32PLUS:
839 case EM_SPARCV9:
840 case EM_SPU:
841 case EM_TI_C6000:
842 case EM_TILEGX:
843 case EM_TILEPRO:
844 case EM_V800:
845 case EM_V850:
846 case EM_CYGNUS_V850:
847 case EM_VAX:
848 case EM_VISIUM:
849 case EM_X86_64:
850 case EM_L1OM:
851 case EM_K1OM:
852 case EM_XSTORMY16:
853 case EM_XTENSA:
854 case EM_XTENSA_OLD:
855 case EM_MICROBLAZE:
856 case EM_MICROBLAZE_OLD:
857 case EM_WEBASSEMBLY:
858 return TRUE;
859
860 case EM_68HC05:
861 case EM_68HC08:
862 case EM_68HC11:
863 case EM_68HC16:
864 case EM_FX66:
865 case EM_ME16:
866 case EM_MMA:
867 case EM_NCPU:
868 case EM_NDR1:
869 case EM_PCP:
870 case EM_ST100:
871 case EM_ST19:
872 case EM_ST7:
873 case EM_ST9PLUS:
874 case EM_STARCORE:
875 case EM_SVX:
876 case EM_TINYJ:
877 default:
878 warn (_("Don't know about relocations on this machine architecture\n"));
879 return FALSE;
880 }
881 }
882
883 /* Load RELA type relocations from FILEDATA at REL_OFFSET extending for REL_SIZE bytes.
884 Returns TRUE upon success, FALSE otherwise. If successful then a
885 pointer to a malloc'ed buffer containing the relocs is placed in *RELASP,
886 and the number of relocs loaded is placed in *NRELASP. It is the caller's
887 responsibility to free the allocated buffer. */
888
889 static bfd_boolean
890 slurp_rela_relocs (Filedata * filedata,
891 unsigned long rel_offset,
892 unsigned long rel_size,
893 Elf_Internal_Rela ** relasp,
894 unsigned long * nrelasp)
895 {
896 Elf_Internal_Rela * relas;
897 size_t nrelas;
898 unsigned int i;
899
900 if (is_32bit_elf)
901 {
902 Elf32_External_Rela * erelas;
903
904 erelas = (Elf32_External_Rela *) get_data (NULL, filedata, rel_offset, 1,
905 rel_size, _("32-bit relocation data"));
906 if (!erelas)
907 return FALSE;
908
909 nrelas = rel_size / sizeof (Elf32_External_Rela);
910
911 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
912 sizeof (Elf_Internal_Rela));
913
914 if (relas == NULL)
915 {
916 free (erelas);
917 error (_("out of memory parsing relocs\n"));
918 return FALSE;
919 }
920
921 for (i = 0; i < nrelas; i++)
922 {
923 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
924 relas[i].r_info = BYTE_GET (erelas[i].r_info);
925 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
926 }
927
928 free (erelas);
929 }
930 else
931 {
932 Elf64_External_Rela * erelas;
933
934 erelas = (Elf64_External_Rela *) get_data (NULL, filedata, rel_offset, 1,
935 rel_size, _("64-bit relocation data"));
936 if (!erelas)
937 return FALSE;
938
939 nrelas = rel_size / sizeof (Elf64_External_Rela);
940
941 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
942 sizeof (Elf_Internal_Rela));
943
944 if (relas == NULL)
945 {
946 free (erelas);
947 error (_("out of memory parsing relocs\n"));
948 return FALSE;
949 }
950
951 for (i = 0; i < nrelas; i++)
952 {
953 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
954 relas[i].r_info = BYTE_GET (erelas[i].r_info);
955 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
956
957 /* The #ifdef BFD64 below is to prevent a compile time
958 warning. We know that if we do not have a 64 bit data
959 type that we will never execute this code anyway. */
960 #ifdef BFD64
961 if (filedata->file_header.e_machine == EM_MIPS
962 && filedata->file_header.e_ident[EI_DATA] != ELFDATA2MSB)
963 {
964 /* In little-endian objects, r_info isn't really a
965 64-bit little-endian value: it has a 32-bit
966 little-endian symbol index followed by four
967 individual byte fields. Reorder INFO
968 accordingly. */
969 bfd_vma inf = relas[i].r_info;
970 inf = (((inf & 0xffffffff) << 32)
971 | ((inf >> 56) & 0xff)
972 | ((inf >> 40) & 0xff00)
973 | ((inf >> 24) & 0xff0000)
974 | ((inf >> 8) & 0xff000000));
975 relas[i].r_info = inf;
976 }
977 #endif /* BFD64 */
978 }
979
980 free (erelas);
981 }
982
983 *relasp = relas;
984 *nrelasp = nrelas;
985 return TRUE;
986 }
987
988 /* Load REL type relocations from FILEDATA at REL_OFFSET extending for REL_SIZE bytes.
989 Returns TRUE upon success, FALSE otherwise. If successful then a
990 pointer to a malloc'ed buffer containing the relocs is placed in *RELSP,
991 and the number of relocs loaded is placed in *NRELSP. It is the caller's
992 responsibility to free the allocated buffer. */
993
994 static bfd_boolean
995 slurp_rel_relocs (Filedata * filedata,
996 unsigned long rel_offset,
997 unsigned long rel_size,
998 Elf_Internal_Rela ** relsp,
999 unsigned long * nrelsp)
1000 {
1001 Elf_Internal_Rela * rels;
1002 size_t nrels;
1003 unsigned int i;
1004
1005 if (is_32bit_elf)
1006 {
1007 Elf32_External_Rel * erels;
1008
1009 erels = (Elf32_External_Rel *) get_data (NULL, filedata, rel_offset, 1,
1010 rel_size, _("32-bit relocation data"));
1011 if (!erels)
1012 return FALSE;
1013
1014 nrels = rel_size / sizeof (Elf32_External_Rel);
1015
1016 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
1017
1018 if (rels == NULL)
1019 {
1020 free (erels);
1021 error (_("out of memory parsing relocs\n"));
1022 return FALSE;
1023 }
1024
1025 for (i = 0; i < nrels; i++)
1026 {
1027 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
1028 rels[i].r_info = BYTE_GET (erels[i].r_info);
1029 rels[i].r_addend = 0;
1030 }
1031
1032 free (erels);
1033 }
1034 else
1035 {
1036 Elf64_External_Rel * erels;
1037
1038 erels = (Elf64_External_Rel *) get_data (NULL, filedata, rel_offset, 1,
1039 rel_size, _("64-bit relocation data"));
1040 if (!erels)
1041 return FALSE;
1042
1043 nrels = rel_size / sizeof (Elf64_External_Rel);
1044
1045 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
1046
1047 if (rels == NULL)
1048 {
1049 free (erels);
1050 error (_("out of memory parsing relocs\n"));
1051 return FALSE;
1052 }
1053
1054 for (i = 0; i < nrels; i++)
1055 {
1056 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
1057 rels[i].r_info = BYTE_GET (erels[i].r_info);
1058 rels[i].r_addend = 0;
1059
1060 /* The #ifdef BFD64 below is to prevent a compile time
1061 warning. We know that if we do not have a 64 bit data
1062 type that we will never execute this code anyway. */
1063 #ifdef BFD64
1064 if (filedata->file_header.e_machine == EM_MIPS
1065 && filedata->file_header.e_ident[EI_DATA] != ELFDATA2MSB)
1066 {
1067 /* In little-endian objects, r_info isn't really a
1068 64-bit little-endian value: it has a 32-bit
1069 little-endian symbol index followed by four
1070 individual byte fields. Reorder INFO
1071 accordingly. */
1072 bfd_vma inf = rels[i].r_info;
1073 inf = (((inf & 0xffffffff) << 32)
1074 | ((inf >> 56) & 0xff)
1075 | ((inf >> 40) & 0xff00)
1076 | ((inf >> 24) & 0xff0000)
1077 | ((inf >> 8) & 0xff000000));
1078 rels[i].r_info = inf;
1079 }
1080 #endif /* BFD64 */
1081 }
1082
1083 free (erels);
1084 }
1085
1086 *relsp = rels;
1087 *nrelsp = nrels;
1088 return TRUE;
1089 }
1090
1091 /* Returns the reloc type extracted from the reloc info field. */
1092
1093 static unsigned int
1094 get_reloc_type (Filedata * filedata, bfd_vma reloc_info)
1095 {
1096 if (is_32bit_elf)
1097 return ELF32_R_TYPE (reloc_info);
1098
1099 switch (filedata->file_header.e_machine)
1100 {
1101 case EM_MIPS:
1102 /* Note: We assume that reloc_info has already been adjusted for us. */
1103 return ELF64_MIPS_R_TYPE (reloc_info);
1104
1105 case EM_SPARCV9:
1106 return ELF64_R_TYPE_ID (reloc_info);
1107
1108 default:
1109 return ELF64_R_TYPE (reloc_info);
1110 }
1111 }
1112
1113 /* Return the symbol index extracted from the reloc info field. */
1114
1115 static bfd_vma
1116 get_reloc_symindex (bfd_vma reloc_info)
1117 {
1118 return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
1119 }
1120
1121 static inline bfd_boolean
1122 uses_msp430x_relocs (Filedata * filedata)
1123 {
1124 return
1125 filedata->file_header.e_machine == EM_MSP430 /* Paranoia. */
1126 /* GCC uses osabi == ELFOSBI_STANDALONE. */
1127 && (((filedata->file_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
1128 /* TI compiler uses ELFOSABI_NONE. */
1129 || (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
1130 }
1131
1132 /* Display the contents of the relocation data found at the specified
1133 offset. */
1134
1135 static bfd_boolean
1136 dump_relocations (Filedata * filedata,
1137 unsigned long rel_offset,
1138 unsigned long rel_size,
1139 Elf_Internal_Sym * symtab,
1140 unsigned long nsyms,
1141 char * strtab,
1142 unsigned long strtablen,
1143 int is_rela,
1144 bfd_boolean is_dynsym)
1145 {
1146 unsigned long i;
1147 Elf_Internal_Rela * rels;
1148 bfd_boolean res = TRUE;
1149
1150 if (is_rela == UNKNOWN)
1151 is_rela = guess_is_rela (filedata->file_header.e_machine);
1152
1153 if (is_rela)
1154 {
1155 if (!slurp_rela_relocs (filedata, rel_offset, rel_size, &rels, &rel_size))
1156 return FALSE;
1157 }
1158 else
1159 {
1160 if (!slurp_rel_relocs (filedata, rel_offset, rel_size, &rels, &rel_size))
1161 return FALSE;
1162 }
1163
1164 if (is_32bit_elf)
1165 {
1166 if (is_rela)
1167 {
1168 if (do_wide)
1169 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
1170 else
1171 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
1172 }
1173 else
1174 {
1175 if (do_wide)
1176 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
1177 else
1178 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
1179 }
1180 }
1181 else
1182 {
1183 if (is_rela)
1184 {
1185 if (do_wide)
1186 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
1187 else
1188 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
1189 }
1190 else
1191 {
1192 if (do_wide)
1193 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
1194 else
1195 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
1196 }
1197 }
1198
1199 for (i = 0; i < rel_size; i++)
1200 {
1201 const char * rtype;
1202 bfd_vma offset;
1203 bfd_vma inf;
1204 bfd_vma symtab_index;
1205 bfd_vma type;
1206
1207 offset = rels[i].r_offset;
1208 inf = rels[i].r_info;
1209
1210 type = get_reloc_type (filedata, inf);
1211 symtab_index = get_reloc_symindex (inf);
1212
1213 if (is_32bit_elf)
1214 {
1215 printf ("%8.8lx %8.8lx ",
1216 (unsigned long) offset & 0xffffffff,
1217 (unsigned long) inf & 0xffffffff);
1218 }
1219 else
1220 {
1221 #if BFD_HOST_64BIT_LONG
1222 printf (do_wide
1223 ? "%16.16lx %16.16lx "
1224 : "%12.12lx %12.12lx ",
1225 offset, inf);
1226 #elif BFD_HOST_64BIT_LONG_LONG
1227 #ifndef __MSVCRT__
1228 printf (do_wide
1229 ? "%16.16llx %16.16llx "
1230 : "%12.12llx %12.12llx ",
1231 offset, inf);
1232 #else
1233 printf (do_wide
1234 ? "%16.16I64x %16.16I64x "
1235 : "%12.12I64x %12.12I64x ",
1236 offset, inf);
1237 #endif
1238 #else
1239 printf (do_wide
1240 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1241 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
1242 _bfd_int64_high (offset),
1243 _bfd_int64_low (offset),
1244 _bfd_int64_high (inf),
1245 _bfd_int64_low (inf));
1246 #endif
1247 }
1248
1249 switch (filedata->file_header.e_machine)
1250 {
1251 default:
1252 rtype = NULL;
1253 break;
1254
1255 case EM_AARCH64:
1256 rtype = elf_aarch64_reloc_type (type);
1257 break;
1258
1259 case EM_M32R:
1260 case EM_CYGNUS_M32R:
1261 rtype = elf_m32r_reloc_type (type);
1262 break;
1263
1264 case EM_386:
1265 case EM_IAMCU:
1266 rtype = elf_i386_reloc_type (type);
1267 break;
1268
1269 case EM_68HC11:
1270 case EM_68HC12:
1271 rtype = elf_m68hc11_reloc_type (type);
1272 break;
1273
1274 case EM_68K:
1275 rtype = elf_m68k_reloc_type (type);
1276 break;
1277
1278 case EM_960:
1279 rtype = elf_i960_reloc_type (type);
1280 break;
1281
1282 case EM_AVR:
1283 case EM_AVR_OLD:
1284 rtype = elf_avr_reloc_type (type);
1285 break;
1286
1287 case EM_OLD_SPARCV9:
1288 case EM_SPARC32PLUS:
1289 case EM_SPARCV9:
1290 case EM_SPARC:
1291 rtype = elf_sparc_reloc_type (type);
1292 break;
1293
1294 case EM_SPU:
1295 rtype = elf_spu_reloc_type (type);
1296 break;
1297
1298 case EM_V800:
1299 rtype = v800_reloc_type (type);
1300 break;
1301 case EM_V850:
1302 case EM_CYGNUS_V850:
1303 rtype = v850_reloc_type (type);
1304 break;
1305
1306 case EM_D10V:
1307 case EM_CYGNUS_D10V:
1308 rtype = elf_d10v_reloc_type (type);
1309 break;
1310
1311 case EM_D30V:
1312 case EM_CYGNUS_D30V:
1313 rtype = elf_d30v_reloc_type (type);
1314 break;
1315
1316 case EM_DLX:
1317 rtype = elf_dlx_reloc_type (type);
1318 break;
1319
1320 case EM_SH:
1321 rtype = elf_sh_reloc_type (type);
1322 break;
1323
1324 case EM_MN10300:
1325 case EM_CYGNUS_MN10300:
1326 rtype = elf_mn10300_reloc_type (type);
1327 break;
1328
1329 case EM_MN10200:
1330 case EM_CYGNUS_MN10200:
1331 rtype = elf_mn10200_reloc_type (type);
1332 break;
1333
1334 case EM_FR30:
1335 case EM_CYGNUS_FR30:
1336 rtype = elf_fr30_reloc_type (type);
1337 break;
1338
1339 case EM_CYGNUS_FRV:
1340 rtype = elf_frv_reloc_type (type);
1341 break;
1342
1343 case EM_FT32:
1344 rtype = elf_ft32_reloc_type (type);
1345 break;
1346
1347 case EM_MCORE:
1348 rtype = elf_mcore_reloc_type (type);
1349 break;
1350
1351 case EM_MMIX:
1352 rtype = elf_mmix_reloc_type (type);
1353 break;
1354
1355 case EM_MOXIE:
1356 rtype = elf_moxie_reloc_type (type);
1357 break;
1358
1359 case EM_MSP430:
1360 if (uses_msp430x_relocs (filedata))
1361 {
1362 rtype = elf_msp430x_reloc_type (type);
1363 break;
1364 }
1365 /* Fall through. */
1366 case EM_MSP430_OLD:
1367 rtype = elf_msp430_reloc_type (type);
1368 break;
1369
1370 case EM_NDS32:
1371 rtype = elf_nds32_reloc_type (type);
1372 break;
1373
1374 case EM_PPC:
1375 rtype = elf_ppc_reloc_type (type);
1376 break;
1377
1378 case EM_PPC64:
1379 rtype = elf_ppc64_reloc_type (type);
1380 break;
1381
1382 case EM_MIPS:
1383 case EM_MIPS_RS3_LE:
1384 rtype = elf_mips_reloc_type (type);
1385 break;
1386
1387 case EM_RISCV:
1388 rtype = elf_riscv_reloc_type (type);
1389 break;
1390
1391 case EM_ALPHA:
1392 rtype = elf_alpha_reloc_type (type);
1393 break;
1394
1395 case EM_ARM:
1396 rtype = elf_arm_reloc_type (type);
1397 break;
1398
1399 case EM_ARC:
1400 case EM_ARC_COMPACT:
1401 case EM_ARC_COMPACT2:
1402 rtype = elf_arc_reloc_type (type);
1403 break;
1404
1405 case EM_PARISC:
1406 rtype = elf_hppa_reloc_type (type);
1407 break;
1408
1409 case EM_H8_300:
1410 case EM_H8_300H:
1411 case EM_H8S:
1412 rtype = elf_h8_reloc_type (type);
1413 break;
1414
1415 case EM_OR1K:
1416 rtype = elf_or1k_reloc_type (type);
1417 break;
1418
1419 case EM_PJ:
1420 case EM_PJ_OLD:
1421 rtype = elf_pj_reloc_type (type);
1422 break;
1423 case EM_IA_64:
1424 rtype = elf_ia64_reloc_type (type);
1425 break;
1426
1427 case EM_CRIS:
1428 rtype = elf_cris_reloc_type (type);
1429 break;
1430
1431 case EM_860:
1432 rtype = elf_i860_reloc_type (type);
1433 break;
1434
1435 case EM_X86_64:
1436 case EM_L1OM:
1437 case EM_K1OM:
1438 rtype = elf_x86_64_reloc_type (type);
1439 break;
1440
1441 case EM_S370:
1442 rtype = i370_reloc_type (type);
1443 break;
1444
1445 case EM_S390_OLD:
1446 case EM_S390:
1447 rtype = elf_s390_reloc_type (type);
1448 break;
1449
1450 case EM_SCORE:
1451 rtype = elf_score_reloc_type (type);
1452 break;
1453
1454 case EM_XSTORMY16:
1455 rtype = elf_xstormy16_reloc_type (type);
1456 break;
1457
1458 case EM_CRX:
1459 rtype = elf_crx_reloc_type (type);
1460 break;
1461
1462 case EM_VAX:
1463 rtype = elf_vax_reloc_type (type);
1464 break;
1465
1466 case EM_VISIUM:
1467 rtype = elf_visium_reloc_type (type);
1468 break;
1469
1470 case EM_ADAPTEVA_EPIPHANY:
1471 rtype = elf_epiphany_reloc_type (type);
1472 break;
1473
1474 case EM_IP2K:
1475 case EM_IP2K_OLD:
1476 rtype = elf_ip2k_reloc_type (type);
1477 break;
1478
1479 case EM_IQ2000:
1480 rtype = elf_iq2000_reloc_type (type);
1481 break;
1482
1483 case EM_XTENSA_OLD:
1484 case EM_XTENSA:
1485 rtype = elf_xtensa_reloc_type (type);
1486 break;
1487
1488 case EM_LATTICEMICO32:
1489 rtype = elf_lm32_reloc_type (type);
1490 break;
1491
1492 case EM_M32C_OLD:
1493 case EM_M32C:
1494 rtype = elf_m32c_reloc_type (type);
1495 break;
1496
1497 case EM_MT:
1498 rtype = elf_mt_reloc_type (type);
1499 break;
1500
1501 case EM_BLACKFIN:
1502 rtype = elf_bfin_reloc_type (type);
1503 break;
1504
1505 case EM_CYGNUS_MEP:
1506 rtype = elf_mep_reloc_type (type);
1507 break;
1508
1509 case EM_CR16:
1510 rtype = elf_cr16_reloc_type (type);
1511 break;
1512
1513 case EM_MICROBLAZE:
1514 case EM_MICROBLAZE_OLD:
1515 rtype = elf_microblaze_reloc_type (type);
1516 break;
1517
1518 case EM_RL78:
1519 rtype = elf_rl78_reloc_type (type);
1520 break;
1521
1522 case EM_RX:
1523 rtype = elf_rx_reloc_type (type);
1524 break;
1525
1526 case EM_METAG:
1527 rtype = elf_metag_reloc_type (type);
1528 break;
1529
1530 case EM_XC16X:
1531 case EM_C166:
1532 rtype = elf_xc16x_reloc_type (type);
1533 break;
1534
1535 case EM_TI_C6000:
1536 rtype = elf_tic6x_reloc_type (type);
1537 break;
1538
1539 case EM_TILEGX:
1540 rtype = elf_tilegx_reloc_type (type);
1541 break;
1542
1543 case EM_TILEPRO:
1544 rtype = elf_tilepro_reloc_type (type);
1545 break;
1546
1547 case EM_WEBASSEMBLY:
1548 rtype = elf_wasm32_reloc_type (type);
1549 break;
1550
1551 case EM_XGATE:
1552 rtype = elf_xgate_reloc_type (type);
1553 break;
1554
1555 case EM_ALTERA_NIOS2:
1556 rtype = elf_nios2_reloc_type (type);
1557 break;
1558
1559 case EM_TI_PRU:
1560 rtype = elf_pru_reloc_type (type);
1561 break;
1562 }
1563
1564 if (rtype == NULL)
1565 printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1566 else
1567 printf (do_wide ? "%-22s" : "%-17.17s", rtype);
1568
1569 if (filedata->file_header.e_machine == EM_ALPHA
1570 && rtype != NULL
1571 && streq (rtype, "R_ALPHA_LITUSE")
1572 && is_rela)
1573 {
1574 switch (rels[i].r_addend)
1575 {
1576 case LITUSE_ALPHA_ADDR: rtype = "ADDR"; break;
1577 case LITUSE_ALPHA_BASE: rtype = "BASE"; break;
1578 case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1579 case LITUSE_ALPHA_JSR: rtype = "JSR"; break;
1580 case LITUSE_ALPHA_TLSGD: rtype = "TLSGD"; break;
1581 case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1582 case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1583 default: rtype = NULL;
1584 }
1585
1586 if (rtype)
1587 printf (" (%s)", rtype);
1588 else
1589 {
1590 putchar (' ');
1591 printf (_("<unknown addend: %lx>"),
1592 (unsigned long) rels[i].r_addend);
1593 res = FALSE;
1594 }
1595 }
1596 else if (symtab_index)
1597 {
1598 if (symtab == NULL || symtab_index >= nsyms)
1599 {
1600 error (_(" bad symbol index: %08lx in reloc"), (unsigned long) symtab_index);
1601 res = FALSE;
1602 }
1603 else
1604 {
1605 Elf_Internal_Sym * psym;
1606 const char * version_string;
1607 enum versioned_symbol_info sym_info;
1608 unsigned short vna_other;
1609
1610 psym = symtab + symtab_index;
1611
1612 version_string
1613 = get_symbol_version_string (filedata, is_dynsym,
1614 strtab, strtablen,
1615 symtab_index,
1616 psym,
1617 &sym_info,
1618 &vna_other);
1619
1620 printf (" ");
1621
1622 if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1623 {
1624 const char * name;
1625 unsigned int len;
1626 unsigned int width = is_32bit_elf ? 8 : 14;
1627
1628 /* Relocations against GNU_IFUNC symbols do not use the value
1629 of the symbol as the address to relocate against. Instead
1630 they invoke the function named by the symbol and use its
1631 result as the address for relocation.
1632
1633 To indicate this to the user, do not display the value of
1634 the symbol in the "Symbols's Value" field. Instead show
1635 its name followed by () as a hint that the symbol is
1636 invoked. */
1637
1638 if (strtab == NULL
1639 || psym->st_name == 0
1640 || psym->st_name >= strtablen)
1641 name = "??";
1642 else
1643 name = strtab + psym->st_name;
1644
1645 len = print_symbol (width, name);
1646 if (version_string)
1647 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1648 version_string);
1649 printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1650 }
1651 else
1652 {
1653 print_vma (psym->st_value, LONG_HEX);
1654
1655 printf (is_32bit_elf ? " " : " ");
1656 }
1657
1658 if (psym->st_name == 0)
1659 {
1660 const char * sec_name = "<null>";
1661 char name_buf[40];
1662
1663 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1664 {
1665 if (psym->st_shndx < filedata->file_header.e_shnum)
1666 sec_name = SECTION_NAME (filedata->section_headers + psym->st_shndx);
1667 else if (psym->st_shndx == SHN_ABS)
1668 sec_name = "ABS";
1669 else if (psym->st_shndx == SHN_COMMON)
1670 sec_name = "COMMON";
1671 else if ((filedata->file_header.e_machine == EM_MIPS
1672 && psym->st_shndx == SHN_MIPS_SCOMMON)
1673 || (filedata->file_header.e_machine == EM_TI_C6000
1674 && psym->st_shndx == SHN_TIC6X_SCOMMON))
1675 sec_name = "SCOMMON";
1676 else if (filedata->file_header.e_machine == EM_MIPS
1677 && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1678 sec_name = "SUNDEF";
1679 else if ((filedata->file_header.e_machine == EM_X86_64
1680 || filedata->file_header.e_machine == EM_L1OM
1681 || filedata->file_header.e_machine == EM_K1OM)
1682 && psym->st_shndx == SHN_X86_64_LCOMMON)
1683 sec_name = "LARGE_COMMON";
1684 else if (filedata->file_header.e_machine == EM_IA_64
1685 && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1686 && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1687 sec_name = "ANSI_COM";
1688 else if (is_ia64_vms (filedata)
1689 && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1690 sec_name = "VMS_SYMVEC";
1691 else
1692 {
1693 sprintf (name_buf, "<section 0x%x>",
1694 (unsigned int) psym->st_shndx);
1695 sec_name = name_buf;
1696 }
1697 }
1698 print_symbol (22, sec_name);
1699 }
1700 else if (strtab == NULL)
1701 printf (_("<string table index: %3ld>"), psym->st_name);
1702 else if (psym->st_name >= strtablen)
1703 {
1704 error (_("<corrupt string table index: %3ld>"), psym->st_name);
1705 res = FALSE;
1706 }
1707 else
1708 {
1709 print_symbol (22, strtab + psym->st_name);
1710 if (version_string)
1711 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1712 version_string);
1713 }
1714
1715 if (is_rela)
1716 {
1717 bfd_vma off = rels[i].r_addend;
1718
1719 if ((bfd_signed_vma) off < 0)
1720 printf (" - %" BFD_VMA_FMT "x", - off);
1721 else
1722 printf (" + %" BFD_VMA_FMT "x", off);
1723 }
1724 }
1725 }
1726 else if (is_rela)
1727 {
1728 bfd_vma off = rels[i].r_addend;
1729
1730 printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1731 if ((bfd_signed_vma) off < 0)
1732 printf ("-%" BFD_VMA_FMT "x", - off);
1733 else
1734 printf ("%" BFD_VMA_FMT "x", off);
1735 }
1736
1737 if (filedata->file_header.e_machine == EM_SPARCV9
1738 && rtype != NULL
1739 && streq (rtype, "R_SPARC_OLO10"))
1740 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1741
1742 putchar ('\n');
1743
1744 #ifdef BFD64
1745 if (! is_32bit_elf && filedata->file_header.e_machine == EM_MIPS)
1746 {
1747 bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1748 bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1749 const char * rtype2 = elf_mips_reloc_type (type2);
1750 const char * rtype3 = elf_mips_reloc_type (type3);
1751
1752 printf (" Type2: ");
1753
1754 if (rtype2 == NULL)
1755 printf (_("unrecognized: %-7lx"),
1756 (unsigned long) type2 & 0xffffffff);
1757 else
1758 printf ("%-17.17s", rtype2);
1759
1760 printf ("\n Type3: ");
1761
1762 if (rtype3 == NULL)
1763 printf (_("unrecognized: %-7lx"),
1764 (unsigned long) type3 & 0xffffffff);
1765 else
1766 printf ("%-17.17s", rtype3);
1767
1768 putchar ('\n');
1769 }
1770 #endif /* BFD64 */
1771 }
1772
1773 free (rels);
1774
1775 return res;
1776 }
1777
1778 static const char *
1779 get_mips_dynamic_type (unsigned long type)
1780 {
1781 switch (type)
1782 {
1783 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1784 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1785 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1786 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1787 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1788 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1789 case DT_MIPS_MSYM: return "MIPS_MSYM";
1790 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1791 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1792 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1793 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1794 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1795 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1796 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1797 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1798 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1799 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1800 case DT_MIPS_RLD_MAP_REL: return "MIPS_RLD_MAP_REL";
1801 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1802 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1803 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1804 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1805 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1806 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1807 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1808 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1809 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1810 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1811 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1812 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1813 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1814 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1815 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1816 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1817 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1818 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1819 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1820 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1821 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1822 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1823 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1824 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1825 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1826 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1827 case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1828 case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1829 default:
1830 return NULL;
1831 }
1832 }
1833
1834 static const char *
1835 get_sparc64_dynamic_type (unsigned long type)
1836 {
1837 switch (type)
1838 {
1839 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1840 default:
1841 return NULL;
1842 }
1843 }
1844
1845 static const char *
1846 get_ppc_dynamic_type (unsigned long type)
1847 {
1848 switch (type)
1849 {
1850 case DT_PPC_GOT: return "PPC_GOT";
1851 case DT_PPC_OPT: return "PPC_OPT";
1852 default:
1853 return NULL;
1854 }
1855 }
1856
1857 static const char *
1858 get_ppc64_dynamic_type (unsigned long type)
1859 {
1860 switch (type)
1861 {
1862 case DT_PPC64_GLINK: return "PPC64_GLINK";
1863 case DT_PPC64_OPD: return "PPC64_OPD";
1864 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
1865 case DT_PPC64_OPT: return "PPC64_OPT";
1866 default:
1867 return NULL;
1868 }
1869 }
1870
1871 static const char *
1872 get_parisc_dynamic_type (unsigned long type)
1873 {
1874 switch (type)
1875 {
1876 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1877 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1878 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1879 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1880 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1881 case DT_HP_PREINIT: return "HP_PREINIT";
1882 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1883 case DT_HP_NEEDED: return "HP_NEEDED";
1884 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1885 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1886 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1887 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1888 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1889 case DT_HP_EPLTREL: return "HP_GST_EPLTREL";
1890 case DT_HP_EPLTRELSZ: return "HP_GST_EPLTRELSZ";
1891 case DT_HP_FILTERED: return "HP_FILTERED";
1892 case DT_HP_FILTER_TLS: return "HP_FILTER_TLS";
1893 case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1894 case DT_HP_LAZYLOAD: return "HP_LAZYLOAD";
1895 case DT_HP_BIND_NOW_COUNT: return "HP_BIND_NOW_COUNT";
1896 case DT_PLT: return "PLT";
1897 case DT_PLT_SIZE: return "PLT_SIZE";
1898 case DT_DLT: return "DLT";
1899 case DT_DLT_SIZE: return "DLT_SIZE";
1900 default:
1901 return NULL;
1902 }
1903 }
1904
1905 static const char *
1906 get_ia64_dynamic_type (unsigned long type)
1907 {
1908 switch (type)
1909 {
1910 case DT_IA_64_PLT_RESERVE: return "IA_64_PLT_RESERVE";
1911 case DT_IA_64_VMS_SUBTYPE: return "VMS_SUBTYPE";
1912 case DT_IA_64_VMS_IMGIOCNT: return "VMS_IMGIOCNT";
1913 case DT_IA_64_VMS_LNKFLAGS: return "VMS_LNKFLAGS";
1914 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1915 case DT_IA_64_VMS_IDENT: return "VMS_IDENT";
1916 case DT_IA_64_VMS_NEEDED_IDENT: return "VMS_NEEDED_IDENT";
1917 case DT_IA_64_VMS_IMG_RELA_CNT: return "VMS_IMG_RELA_CNT";
1918 case DT_IA_64_VMS_SEG_RELA_CNT: return "VMS_SEG_RELA_CNT";
1919 case DT_IA_64_VMS_FIXUP_RELA_CNT: return "VMS_FIXUP_RELA_CNT";
1920 case DT_IA_64_VMS_FIXUP_NEEDED: return "VMS_FIXUP_NEEDED";
1921 case DT_IA_64_VMS_SYMVEC_CNT: return "VMS_SYMVEC_CNT";
1922 case DT_IA_64_VMS_XLATED: return "VMS_XLATED";
1923 case DT_IA_64_VMS_STACKSIZE: return "VMS_STACKSIZE";
1924 case DT_IA_64_VMS_UNWINDSZ: return "VMS_UNWINDSZ";
1925 case DT_IA_64_VMS_UNWIND_CODSEG: return "VMS_UNWIND_CODSEG";
1926 case DT_IA_64_VMS_UNWIND_INFOSEG: return "VMS_UNWIND_INFOSEG";
1927 case DT_IA_64_VMS_LINKTIME: return "VMS_LINKTIME";
1928 case DT_IA_64_VMS_SEG_NO: return "VMS_SEG_NO";
1929 case DT_IA_64_VMS_SYMVEC_OFFSET: return "VMS_SYMVEC_OFFSET";
1930 case DT_IA_64_VMS_SYMVEC_SEG: return "VMS_SYMVEC_SEG";
1931 case DT_IA_64_VMS_UNWIND_OFFSET: return "VMS_UNWIND_OFFSET";
1932 case DT_IA_64_VMS_UNWIND_SEG: return "VMS_UNWIND_SEG";
1933 case DT_IA_64_VMS_STRTAB_OFFSET: return "VMS_STRTAB_OFFSET";
1934 case DT_IA_64_VMS_SYSVER_OFFSET: return "VMS_SYSVER_OFFSET";
1935 case DT_IA_64_VMS_IMG_RELA_OFF: return "VMS_IMG_RELA_OFF";
1936 case DT_IA_64_VMS_SEG_RELA_OFF: return "VMS_SEG_RELA_OFF";
1937 case DT_IA_64_VMS_FIXUP_RELA_OFF: return "VMS_FIXUP_RELA_OFF";
1938 case DT_IA_64_VMS_PLTGOT_OFFSET: return "VMS_PLTGOT_OFFSET";
1939 case DT_IA_64_VMS_PLTGOT_SEG: return "VMS_PLTGOT_SEG";
1940 case DT_IA_64_VMS_FPMODE: return "VMS_FPMODE";
1941 default:
1942 return NULL;
1943 }
1944 }
1945
1946 static const char *
1947 get_solaris_section_type (unsigned long type)
1948 {
1949 switch (type)
1950 {
1951 case 0x6fffffee: return "SUNW_ancillary";
1952 case 0x6fffffef: return "SUNW_capchain";
1953 case 0x6ffffff0: return "SUNW_capinfo";
1954 case 0x6ffffff1: return "SUNW_symsort";
1955 case 0x6ffffff2: return "SUNW_tlssort";
1956 case 0x6ffffff3: return "SUNW_LDYNSYM";
1957 case 0x6ffffff4: return "SUNW_dof";
1958 case 0x6ffffff5: return "SUNW_cap";
1959 case 0x6ffffff6: return "SUNW_SIGNATURE";
1960 case 0x6ffffff7: return "SUNW_ANNOTATE";
1961 case 0x6ffffff8: return "SUNW_DEBUGSTR";
1962 case 0x6ffffff9: return "SUNW_DEBUG";
1963 case 0x6ffffffa: return "SUNW_move";
1964 case 0x6ffffffb: return "SUNW_COMDAT";
1965 case 0x6ffffffc: return "SUNW_syminfo";
1966 case 0x6ffffffd: return "SUNW_verdef";
1967 case 0x6ffffffe: return "SUNW_verneed";
1968 case 0x6fffffff: return "SUNW_versym";
1969 case 0x70000000: return "SPARC_GOTDATA";
1970 default: return NULL;
1971 }
1972 }
1973
1974 static const char *
1975 get_alpha_dynamic_type (unsigned long type)
1976 {
1977 switch (type)
1978 {
1979 case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1980 default: return NULL;
1981 }
1982 }
1983
1984 static const char *
1985 get_score_dynamic_type (unsigned long type)
1986 {
1987 switch (type)
1988 {
1989 case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1990 case DT_SCORE_LOCAL_GOTNO: return "SCORE_LOCAL_GOTNO";
1991 case DT_SCORE_SYMTABNO: return "SCORE_SYMTABNO";
1992 case DT_SCORE_GOTSYM: return "SCORE_GOTSYM";
1993 case DT_SCORE_UNREFEXTNO: return "SCORE_UNREFEXTNO";
1994 case DT_SCORE_HIPAGENO: return "SCORE_HIPAGENO";
1995 default: return NULL;
1996 }
1997 }
1998
1999 static const char *
2000 get_tic6x_dynamic_type (unsigned long type)
2001 {
2002 switch (type)
2003 {
2004 case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
2005 case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
2006 case DT_C6000_DSBT_BASE: return "C6000_DSBT_BASE";
2007 case DT_C6000_DSBT_SIZE: return "C6000_DSBT_SIZE";
2008 case DT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
2009 case DT_C6000_DSBT_INDEX: return "C6000_DSBT_INDEX";
2010 default: return NULL;
2011 }
2012 }
2013
2014 static const char *
2015 get_nios2_dynamic_type (unsigned long type)
2016 {
2017 switch (type)
2018 {
2019 case DT_NIOS2_GP: return "NIOS2_GP";
2020 default: return NULL;
2021 }
2022 }
2023
2024 static const char *
2025 get_solaris_dynamic_type (unsigned long type)
2026 {
2027 switch (type)
2028 {
2029 case 0x6000000d: return "SUNW_AUXILIARY";
2030 case 0x6000000e: return "SUNW_RTLDINF";
2031 case 0x6000000f: return "SUNW_FILTER";
2032 case 0x60000010: return "SUNW_CAP";
2033 case 0x60000011: return "SUNW_SYMTAB";
2034 case 0x60000012: return "SUNW_SYMSZ";
2035 case 0x60000013: return "SUNW_SORTENT";
2036 case 0x60000014: return "SUNW_SYMSORT";
2037 case 0x60000015: return "SUNW_SYMSORTSZ";
2038 case 0x60000016: return "SUNW_TLSSORT";
2039 case 0x60000017: return "SUNW_TLSSORTSZ";
2040 case 0x60000018: return "SUNW_CAPINFO";
2041 case 0x60000019: return "SUNW_STRPAD";
2042 case 0x6000001a: return "SUNW_CAPCHAIN";
2043 case 0x6000001b: return "SUNW_LDMACH";
2044 case 0x6000001d: return "SUNW_CAPCHAINENT";
2045 case 0x6000001f: return "SUNW_CAPCHAINSZ";
2046 case 0x60000021: return "SUNW_PARENT";
2047 case 0x60000023: return "SUNW_ASLR";
2048 case 0x60000025: return "SUNW_RELAX";
2049 case 0x60000029: return "SUNW_NXHEAP";
2050 case 0x6000002b: return "SUNW_NXSTACK";
2051
2052 case 0x70000001: return "SPARC_REGISTER";
2053 case 0x7ffffffd: return "AUXILIARY";
2054 case 0x7ffffffe: return "USED";
2055 case 0x7fffffff: return "FILTER";
2056
2057 default: return NULL;
2058 }
2059 }
2060
2061 static const char *
2062 get_dynamic_type (Filedata * filedata, unsigned long type)
2063 {
2064 static char buff[64];
2065
2066 switch (type)
2067 {
2068 case DT_NULL: return "NULL";
2069 case DT_NEEDED: return "NEEDED";
2070 case DT_PLTRELSZ: return "PLTRELSZ";
2071 case DT_PLTGOT: return "PLTGOT";
2072 case DT_HASH: return "HASH";
2073 case DT_STRTAB: return "STRTAB";
2074 case DT_SYMTAB: return "SYMTAB";
2075 case DT_RELA: return "RELA";
2076 case DT_RELASZ: return "RELASZ";
2077 case DT_RELAENT: return "RELAENT";
2078 case DT_STRSZ: return "STRSZ";
2079 case DT_SYMENT: return "SYMENT";
2080 case DT_INIT: return "INIT";
2081 case DT_FINI: return "FINI";
2082 case DT_SONAME: return "SONAME";
2083 case DT_RPATH: return "RPATH";
2084 case DT_SYMBOLIC: return "SYMBOLIC";
2085 case DT_REL: return "REL";
2086 case DT_RELSZ: return "RELSZ";
2087 case DT_RELENT: return "RELENT";
2088 case DT_PLTREL: return "PLTREL";
2089 case DT_DEBUG: return "DEBUG";
2090 case DT_TEXTREL: return "TEXTREL";
2091 case DT_JMPREL: return "JMPREL";
2092 case DT_BIND_NOW: return "BIND_NOW";
2093 case DT_INIT_ARRAY: return "INIT_ARRAY";
2094 case DT_FINI_ARRAY: return "FINI_ARRAY";
2095 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
2096 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
2097 case DT_RUNPATH: return "RUNPATH";
2098 case DT_FLAGS: return "FLAGS";
2099
2100 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2101 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
2102 case DT_SYMTAB_SHNDX: return "SYMTAB_SHNDX";
2103
2104 case DT_CHECKSUM: return "CHECKSUM";
2105 case DT_PLTPADSZ: return "PLTPADSZ";
2106 case DT_MOVEENT: return "MOVEENT";
2107 case DT_MOVESZ: return "MOVESZ";
2108 case DT_FEATURE: return "FEATURE";
2109 case DT_POSFLAG_1: return "POSFLAG_1";
2110 case DT_SYMINSZ: return "SYMINSZ";
2111 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
2112
2113 case DT_ADDRRNGLO: return "ADDRRNGLO";
2114 case DT_CONFIG: return "CONFIG";
2115 case DT_DEPAUDIT: return "DEPAUDIT";
2116 case DT_AUDIT: return "AUDIT";
2117 case DT_PLTPAD: return "PLTPAD";
2118 case DT_MOVETAB: return "MOVETAB";
2119 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
2120
2121 case DT_VERSYM: return "VERSYM";
2122
2123 case DT_TLSDESC_GOT: return "TLSDESC_GOT";
2124 case DT_TLSDESC_PLT: return "TLSDESC_PLT";
2125 case DT_RELACOUNT: return "RELACOUNT";
2126 case DT_RELCOUNT: return "RELCOUNT";
2127 case DT_FLAGS_1: return "FLAGS_1";
2128 case DT_VERDEF: return "VERDEF";
2129 case DT_VERDEFNUM: return "VERDEFNUM";
2130 case DT_VERNEED: return "VERNEED";
2131 case DT_VERNEEDNUM: return "VERNEEDNUM";
2132
2133 case DT_AUXILIARY: return "AUXILIARY";
2134 case DT_USED: return "USED";
2135 case DT_FILTER: return "FILTER";
2136
2137 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
2138 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
2139 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
2140 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
2141 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
2142 case DT_GNU_HASH: return "GNU_HASH";
2143
2144 default:
2145 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
2146 {
2147 const char * result;
2148
2149 switch (filedata->file_header.e_machine)
2150 {
2151 case EM_MIPS:
2152 case EM_MIPS_RS3_LE:
2153 result = get_mips_dynamic_type (type);
2154 break;
2155 case EM_SPARCV9:
2156 result = get_sparc64_dynamic_type (type);
2157 break;
2158 case EM_PPC:
2159 result = get_ppc_dynamic_type (type);
2160 break;
2161 case EM_PPC64:
2162 result = get_ppc64_dynamic_type (type);
2163 break;
2164 case EM_IA_64:
2165 result = get_ia64_dynamic_type (type);
2166 break;
2167 case EM_ALPHA:
2168 result = get_alpha_dynamic_type (type);
2169 break;
2170 case EM_SCORE:
2171 result = get_score_dynamic_type (type);
2172 break;
2173 case EM_TI_C6000:
2174 result = get_tic6x_dynamic_type (type);
2175 break;
2176 case EM_ALTERA_NIOS2:
2177 result = get_nios2_dynamic_type (type);
2178 break;
2179 default:
2180 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2181 result = get_solaris_dynamic_type (type);
2182 else
2183 result = NULL;
2184 break;
2185 }
2186
2187 if (result != NULL)
2188 return result;
2189
2190 snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
2191 }
2192 else if (((type >= DT_LOOS) && (type <= DT_HIOS))
2193 || (filedata->file_header.e_machine == EM_PARISC
2194 && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
2195 {
2196 const char * result;
2197
2198 switch (filedata->file_header.e_machine)
2199 {
2200 case EM_PARISC:
2201 result = get_parisc_dynamic_type (type);
2202 break;
2203 case EM_IA_64:
2204 result = get_ia64_dynamic_type (type);
2205 break;
2206 default:
2207 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2208 result = get_solaris_dynamic_type (type);
2209 else
2210 result = NULL;
2211 break;
2212 }
2213
2214 if (result != NULL)
2215 return result;
2216
2217 snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2218 type);
2219 }
2220 else
2221 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
2222
2223 return buff;
2224 }
2225 }
2226
2227 static char *
2228 get_file_type (unsigned e_type)
2229 {
2230 static char buff[32];
2231
2232 switch (e_type)
2233 {
2234 case ET_NONE: return _("NONE (None)");
2235 case ET_REL: return _("REL (Relocatable file)");
2236 case ET_EXEC: return _("EXEC (Executable file)");
2237 case ET_DYN: return _("DYN (Shared object file)");
2238 case ET_CORE: return _("CORE (Core file)");
2239
2240 default:
2241 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
2242 snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
2243 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
2244 snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
2245 else
2246 snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
2247 return buff;
2248 }
2249 }
2250
2251 static char *
2252 get_machine_name (unsigned e_machine)
2253 {
2254 static char buff[64]; /* XXX */
2255
2256 switch (e_machine)
2257 {
2258 /* Please keep this switch table sorted by increasing EM_ value. */
2259 /* 0 */
2260 case EM_NONE: return _("None");
2261 case EM_M32: return "WE32100";
2262 case EM_SPARC: return "Sparc";
2263 case EM_386: return "Intel 80386";
2264 case EM_68K: return "MC68000";
2265 case EM_88K: return "MC88000";
2266 case EM_IAMCU: return "Intel MCU";
2267 case EM_860: return "Intel 80860";
2268 case EM_MIPS: return "MIPS R3000";
2269 case EM_S370: return "IBM System/370";
2270 /* 10 */
2271 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
2272 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
2273 case EM_PARISC: return "HPPA";
2274 case EM_VPP550: return "Fujitsu VPP500";
2275 case EM_SPARC32PLUS: return "Sparc v8+" ;
2276 case EM_960: return "Intel 90860";
2277 case EM_PPC: return "PowerPC";
2278 /* 20 */
2279 case EM_PPC64: return "PowerPC64";
2280 case EM_S390_OLD:
2281 case EM_S390: return "IBM S/390";
2282 case EM_SPU: return "SPU";
2283 /* 30 */
2284 case EM_V800: return "Renesas V850 (using RH850 ABI)";
2285 case EM_FR20: return "Fujitsu FR20";
2286 case EM_RH32: return "TRW RH32";
2287 case EM_MCORE: return "MCORE";
2288 /* 40 */
2289 case EM_ARM: return "ARM";
2290 case EM_OLD_ALPHA: return "Digital Alpha (old)";
2291 case EM_SH: return "Renesas / SuperH SH";
2292 case EM_SPARCV9: return "Sparc v9";
2293 case EM_TRICORE: return "Siemens Tricore";
2294 case EM_ARC: return "ARC";
2295 case EM_H8_300: return "Renesas H8/300";
2296 case EM_H8_300H: return "Renesas H8/300H";
2297 case EM_H8S: return "Renesas H8S";
2298 case EM_H8_500: return "Renesas H8/500";
2299 /* 50 */
2300 case EM_IA_64: return "Intel IA-64";
2301 case EM_MIPS_X: return "Stanford MIPS-X";
2302 case EM_COLDFIRE: return "Motorola Coldfire";
2303 case EM_68HC12: return "Motorola MC68HC12 Microcontroller";
2304 case EM_MMA: return "Fujitsu Multimedia Accelerator";
2305 case EM_PCP: return "Siemens PCP";
2306 case EM_NCPU: return "Sony nCPU embedded RISC processor";
2307 case EM_NDR1: return "Denso NDR1 microprocesspr";
2308 case EM_STARCORE: return "Motorola Star*Core processor";
2309 case EM_ME16: return "Toyota ME16 processor";
2310 /* 60 */
2311 case EM_ST100: return "STMicroelectronics ST100 processor";
2312 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
2313 case EM_X86_64: return "Advanced Micro Devices X86-64";
2314 case EM_PDSP: return "Sony DSP processor";
2315 case EM_PDP10: return "Digital Equipment Corp. PDP-10";
2316 case EM_PDP11: return "Digital Equipment Corp. PDP-11";
2317 case EM_FX66: return "Siemens FX66 microcontroller";
2318 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2319 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
2320 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
2321 /* 70 */
2322 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
2323 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
2324 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
2325 case EM_SVX: return "Silicon Graphics SVx";
2326 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
2327 case EM_VAX: return "Digital VAX";
2328 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
2329 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
2330 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
2331 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
2332 /* 80 */
2333 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
2334 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
2335 case EM_PRISM: return "Vitesse Prism";
2336 case EM_AVR_OLD:
2337 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
2338 case EM_CYGNUS_FR30:
2339 case EM_FR30: return "Fujitsu FR30";
2340 case EM_CYGNUS_D10V:
2341 case EM_D10V: return "d10v";
2342 case EM_CYGNUS_D30V:
2343 case EM_D30V: return "d30v";
2344 case EM_CYGNUS_V850:
2345 case EM_V850: return "Renesas V850";
2346 case EM_CYGNUS_M32R:
2347 case EM_M32R: return "Renesas M32R (formerly Mitsubishi M32r)";
2348 case EM_CYGNUS_MN10300:
2349 case EM_MN10300: return "mn10300";
2350 /* 90 */
2351 case EM_CYGNUS_MN10200:
2352 case EM_MN10200: return "mn10200";
2353 case EM_PJ: return "picoJava";
2354 case EM_OR1K: return "OpenRISC 1000";
2355 case EM_ARC_COMPACT: return "ARCompact";
2356 case EM_XTENSA_OLD:
2357 case EM_XTENSA: return "Tensilica Xtensa Processor";
2358 case EM_VIDEOCORE: return "Alphamosaic VideoCore processor";
2359 case EM_TMM_GPP: return "Thompson Multimedia General Purpose Processor";
2360 case EM_NS32K: return "National Semiconductor 32000 series";
2361 case EM_TPC: return "Tenor Network TPC processor";
2362 case EM_SNP1K: return "Trebia SNP 1000 processor";
2363 /* 100 */
2364 case EM_ST200: return "STMicroelectronics ST200 microcontroller";
2365 case EM_IP2K_OLD:
2366 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
2367 case EM_MAX: return "MAX Processor";
2368 case EM_CR: return "National Semiconductor CompactRISC";
2369 case EM_F2MC16: return "Fujitsu F2MC16";
2370 case EM_MSP430: return "Texas Instruments msp430 microcontroller";
2371 case EM_BLACKFIN: return "Analog Devices Blackfin";
2372 case EM_SE_C33: return "S1C33 Family of Seiko Epson processors";
2373 case EM_SEP: return "Sharp embedded microprocessor";
2374 case EM_ARCA: return "Arca RISC microprocessor";
2375 /* 110 */
2376 case EM_UNICORE: return "Unicore";
2377 case EM_EXCESS: return "eXcess 16/32/64-bit configurable embedded CPU";
2378 case EM_DXP: return "Icera Semiconductor Inc. Deep Execution Processor";
2379 case EM_ALTERA_NIOS2: return "Altera Nios II";
2380 case EM_CRX: return "National Semiconductor CRX microprocessor";
2381 case EM_XGATE: return "Motorola XGATE embedded processor";
2382 case EM_C166:
2383 case EM_XC16X: return "Infineon Technologies xc16x";
2384 case EM_M16C: return "Renesas M16C series microprocessors";
2385 case EM_DSPIC30F: return "Microchip Technology dsPIC30F Digital Signal Controller";
2386 case EM_CE: return "Freescale Communication Engine RISC core";
2387 /* 120 */
2388 case EM_M32C: return "Renesas M32c";
2389 /* 130 */
2390 case EM_TSK3000: return "Altium TSK3000 core";
2391 case EM_RS08: return "Freescale RS08 embedded processor";
2392 case EM_ECOG2: return "Cyan Technology eCOG2 microprocessor";
2393 case EM_SCORE: return "SUNPLUS S+Core";
2394 case EM_DSP24: return "New Japan Radio (NJR) 24-bit DSP Processor";
2395 case EM_VIDEOCORE3: return "Broadcom VideoCore III processor";
2396 case EM_LATTICEMICO32: return "Lattice Mico32";
2397 case EM_SE_C17: return "Seiko Epson C17 family";
2398 /* 140 */
2399 case EM_TI_C6000: return "Texas Instruments TMS320C6000 DSP family";
2400 case EM_TI_C2000: return "Texas Instruments TMS320C2000 DSP family";
2401 case EM_TI_C5500: return "Texas Instruments TMS320C55x DSP family";
2402 case EM_TI_PRU: return "TI PRU I/O processor";
2403 /* 160 */
2404 case EM_MMDSP_PLUS: return "STMicroelectronics 64bit VLIW Data Signal Processor";
2405 case EM_CYPRESS_M8C: return "Cypress M8C microprocessor";
2406 case EM_R32C: return "Renesas R32C series microprocessors";
2407 case EM_TRIMEDIA: return "NXP Semiconductors TriMedia architecture family";
2408 case EM_QDSP6: return "QUALCOMM DSP6 Processor";
2409 case EM_8051: return "Intel 8051 and variants";
2410 case EM_STXP7X: return "STMicroelectronics STxP7x family";
2411 case EM_NDS32: return "Andes Technology compact code size embedded RISC processor family";
2412 case EM_ECOG1X: return "Cyan Technology eCOG1X family";
2413 case EM_MAXQ30: return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2414 /* 170 */
2415 case EM_XIMO16: return "New Japan Radio (NJR) 16-bit DSP Processor";
2416 case EM_MANIK: return "M2000 Reconfigurable RISC Microprocessor";
2417 case EM_CRAYNV2: return "Cray Inc. NV2 vector architecture";
2418 case EM_RX: return "Renesas RX";
2419 case EM_METAG: return "Imagination Technologies Meta processor architecture";
2420 case EM_MCST_ELBRUS: return "MCST Elbrus general purpose hardware architecture";
2421 case EM_ECOG16: return "Cyan Technology eCOG16 family";
2422 case EM_CR16:
2423 case EM_MICROBLAZE:
2424 case EM_MICROBLAZE_OLD: return "Xilinx MicroBlaze";
2425 case EM_ETPU: return "Freescale Extended Time Processing Unit";
2426 case EM_SLE9X: return "Infineon Technologies SLE9X core";
2427 /* 180 */
2428 case EM_L1OM: return "Intel L1OM";
2429 case EM_K1OM: return "Intel K1OM";
2430 case EM_INTEL182: return "Intel (reserved)";
2431 case EM_AARCH64: return "AArch64";
2432 case EM_ARM184: return "ARM (reserved)";
2433 case EM_AVR32: return "Atmel Corporation 32-bit microprocessor";
2434 case EM_STM8: return "STMicroeletronics STM8 8-bit microcontroller";
2435 case EM_TILE64: return "Tilera TILE64 multicore architecture family";
2436 case EM_TILEPRO: return "Tilera TILEPro multicore architecture family";
2437 /* 190 */
2438 case EM_CUDA: return "NVIDIA CUDA architecture";
2439 case EM_TILEGX: return "Tilera TILE-Gx multicore architecture family";
2440 case EM_CLOUDSHIELD: return "CloudShield architecture family";
2441 case EM_COREA_1ST: return "KIPO-KAIST Core-A 1st generation processor family";
2442 case EM_COREA_2ND: return "KIPO-KAIST Core-A 2nd generation processor family";
2443 case EM_ARC_COMPACT2: return "ARCv2";
2444 case EM_OPEN8: return "Open8 8-bit RISC soft processor core";
2445 case EM_RL78: return "Renesas RL78";
2446 case EM_VIDEOCORE5: return "Broadcom VideoCore V processor";
2447 case EM_78K0R: return "Renesas 78K0R";
2448 /* 200 */
2449 case EM_56800EX: return "Freescale 56800EX Digital Signal Controller (DSC)";
2450 case EM_BA1: return "Beyond BA1 CPU architecture";
2451 case EM_BA2: return "Beyond BA2 CPU architecture";
2452 case EM_XCORE: return "XMOS xCORE processor family";
2453 case EM_MCHP_PIC: return "Microchip 8-bit PIC(r) family";
2454 /* 210 */
2455 case EM_KM32: return "KM211 KM32 32-bit processor";
2456 case EM_KMX32: return "KM211 KMX32 32-bit processor";
2457 case EM_KMX16: return "KM211 KMX16 16-bit processor";
2458 case EM_KMX8: return "KM211 KMX8 8-bit processor";
2459 case EM_KVARC: return "KM211 KVARC processor";
2460 case EM_CDP: return "Paneve CDP architecture family";
2461 case EM_COGE: return "Cognitive Smart Memory Processor";
2462 case EM_COOL: return "Bluechip Systems CoolEngine";
2463 case EM_NORC: return "Nanoradio Optimized RISC";
2464 case EM_CSR_KALIMBA: return "CSR Kalimba architecture family";
2465 /* 220 */
2466 case EM_Z80: return "Zilog Z80";
2467 case EM_VISIUM: return "CDS VISIUMcore processor";
2468 case EM_FT32: return "FTDI Chip FT32";
2469 case EM_MOXIE: return "Moxie";
2470 case EM_AMDGPU: return "AMD GPU";
2471 case EM_RISCV: return "RISC-V";
2472 case EM_LANAI: return "Lanai 32-bit processor";
2473 case EM_BPF: return "Linux BPF";
2474
2475 /* Large numbers... */
2476 case EM_MT: return "Morpho Techologies MT processor";
2477 case EM_ALPHA: return "Alpha";
2478 case EM_WEBASSEMBLY: return "Web Assembly";
2479 case EM_DLX: return "OpenDLX";
2480 case EM_XSTORMY16: return "Sanyo XStormy16 CPU core";
2481 case EM_IQ2000: return "Vitesse IQ2000";
2482 case EM_M32C_OLD:
2483 case EM_NIOS32: return "Altera Nios";
2484 case EM_CYGNUS_MEP: return "Toshiba MeP Media Engine";
2485 case EM_ADAPTEVA_EPIPHANY: return "Adapteva EPIPHANY";
2486 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
2487
2488 default:
2489 snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2490 return buff;
2491 }
2492 }
2493
2494 static void
2495 decode_ARC_machine_flags (unsigned e_flags, unsigned e_machine, char buf[])
2496 {
2497 /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2. Some
2498 other compilers don't a specific architecture type in the e_flags, and
2499 instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
2500 architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
2501 architectures.
2502
2503 Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
2504 but also sets a specific architecture type in the e_flags field.
2505
2506 However, when decoding the flags we don't worry if we see an
2507 unexpected pairing, for example EM_ARC_COMPACT machine type, with
2508 ARCEM architecture type. */
2509
2510 switch (e_flags & EF_ARC_MACH_MSK)
2511 {
2512 /* We only expect these to occur for EM_ARC_COMPACT2. */
2513 case EF_ARC_CPU_ARCV2EM:
2514 strcat (buf, ", ARC EM");
2515 break;
2516 case EF_ARC_CPU_ARCV2HS:
2517 strcat (buf, ", ARC HS");
2518 break;
2519
2520 /* We only expect these to occur for EM_ARC_COMPACT. */
2521 case E_ARC_MACH_ARC600:
2522 strcat (buf, ", ARC600");
2523 break;
2524 case E_ARC_MACH_ARC601:
2525 strcat (buf, ", ARC601");
2526 break;
2527 case E_ARC_MACH_ARC700:
2528 strcat (buf, ", ARC700");
2529 break;
2530
2531 /* The only times we should end up here are (a) A corrupt ELF, (b) A
2532 new ELF with new architecture being read by an old version of
2533 readelf, or (c) An ELF built with non-GNU compiler that does not
2534 set the architecture in the e_flags. */
2535 default:
2536 if (e_machine == EM_ARC_COMPACT)
2537 strcat (buf, ", Unknown ARCompact");
2538 else
2539 strcat (buf, ", Unknown ARC");
2540 break;
2541 }
2542
2543 switch (e_flags & EF_ARC_OSABI_MSK)
2544 {
2545 case E_ARC_OSABI_ORIG:
2546 strcat (buf, ", (ABI:legacy)");
2547 break;
2548 case E_ARC_OSABI_V2:
2549 strcat (buf, ", (ABI:v2)");
2550 break;
2551 /* Only upstream 3.9+ kernels will support ARCv2 ISA. */
2552 case E_ARC_OSABI_V3:
2553 strcat (buf, ", v3 no-legacy-syscalls ABI");
2554 break;
2555 case E_ARC_OSABI_V4:
2556 strcat (buf, ", v4 ABI");
2557 break;
2558 default:
2559 strcat (buf, ", unrecognised ARC OSABI flag");
2560 break;
2561 }
2562 }
2563
2564 static void
2565 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2566 {
2567 unsigned eabi;
2568 bfd_boolean unknown = FALSE;
2569
2570 eabi = EF_ARM_EABI_VERSION (e_flags);
2571 e_flags &= ~ EF_ARM_EABIMASK;
2572
2573 /* Handle "generic" ARM flags. */
2574 if (e_flags & EF_ARM_RELEXEC)
2575 {
2576 strcat (buf, ", relocatable executable");
2577 e_flags &= ~ EF_ARM_RELEXEC;
2578 }
2579
2580 /* Now handle EABI specific flags. */
2581 switch (eabi)
2582 {
2583 default:
2584 strcat (buf, ", <unrecognized EABI>");
2585 if (e_flags)
2586 unknown = TRUE;
2587 break;
2588
2589 case EF_ARM_EABI_VER1:
2590 strcat (buf, ", Version1 EABI");
2591 while (e_flags)
2592 {
2593 unsigned flag;
2594
2595 /* Process flags one bit at a time. */
2596 flag = e_flags & - e_flags;
2597 e_flags &= ~ flag;
2598
2599 switch (flag)
2600 {
2601 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2602 strcat (buf, ", sorted symbol tables");
2603 break;
2604
2605 default:
2606 unknown = TRUE;
2607 break;
2608 }
2609 }
2610 break;
2611
2612 case EF_ARM_EABI_VER2:
2613 strcat (buf, ", Version2 EABI");
2614 while (e_flags)
2615 {
2616 unsigned flag;
2617
2618 /* Process flags one bit at a time. */
2619 flag = e_flags & - e_flags;
2620 e_flags &= ~ flag;
2621
2622 switch (flag)
2623 {
2624 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2625 strcat (buf, ", sorted symbol tables");
2626 break;
2627
2628 case EF_ARM_DYNSYMSUSESEGIDX:
2629 strcat (buf, ", dynamic symbols use segment index");
2630 break;
2631
2632 case EF_ARM_MAPSYMSFIRST:
2633 strcat (buf, ", mapping symbols precede others");
2634 break;
2635
2636 default:
2637 unknown = TRUE;
2638 break;
2639 }
2640 }
2641 break;
2642
2643 case EF_ARM_EABI_VER3:
2644 strcat (buf, ", Version3 EABI");
2645 break;
2646
2647 case EF_ARM_EABI_VER4:
2648 strcat (buf, ", Version4 EABI");
2649 while (e_flags)
2650 {
2651 unsigned flag;
2652
2653 /* Process flags one bit at a time. */
2654 flag = e_flags & - e_flags;
2655 e_flags &= ~ flag;
2656
2657 switch (flag)
2658 {
2659 case EF_ARM_BE8:
2660 strcat (buf, ", BE8");
2661 break;
2662
2663 case EF_ARM_LE8:
2664 strcat (buf, ", LE8");
2665 break;
2666
2667 default:
2668 unknown = TRUE;
2669 break;
2670 }
2671 }
2672 break;
2673
2674 case EF_ARM_EABI_VER5:
2675 strcat (buf, ", Version5 EABI");
2676 while (e_flags)
2677 {
2678 unsigned flag;
2679
2680 /* Process flags one bit at a time. */
2681 flag = e_flags & - e_flags;
2682 e_flags &= ~ flag;
2683
2684 switch (flag)
2685 {
2686 case EF_ARM_BE8:
2687 strcat (buf, ", BE8");
2688 break;
2689
2690 case EF_ARM_LE8:
2691 strcat (buf, ", LE8");
2692 break;
2693
2694 case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT. */
2695 strcat (buf, ", soft-float ABI");
2696 break;
2697
2698 case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT. */
2699 strcat (buf, ", hard-float ABI");
2700 break;
2701
2702 default:
2703 unknown = TRUE;
2704 break;
2705 }
2706 }
2707 break;
2708
2709 case EF_ARM_EABI_UNKNOWN:
2710 strcat (buf, ", GNU EABI");
2711 while (e_flags)
2712 {
2713 unsigned flag;
2714
2715 /* Process flags one bit at a time. */
2716 flag = e_flags & - e_flags;
2717 e_flags &= ~ flag;
2718
2719 switch (flag)
2720 {
2721 case EF_ARM_INTERWORK:
2722 strcat (buf, ", interworking enabled");
2723 break;
2724
2725 case EF_ARM_APCS_26:
2726 strcat (buf, ", uses APCS/26");
2727 break;
2728
2729 case EF_ARM_APCS_FLOAT:
2730 strcat (buf, ", uses APCS/float");
2731 break;
2732
2733 case EF_ARM_PIC:
2734 strcat (buf, ", position independent");
2735 break;
2736
2737 case EF_ARM_ALIGN8:
2738 strcat (buf, ", 8 bit structure alignment");
2739 break;
2740
2741 case EF_ARM_NEW_ABI:
2742 strcat (buf, ", uses new ABI");
2743 break;
2744
2745 case EF_ARM_OLD_ABI:
2746 strcat (buf, ", uses old ABI");
2747 break;
2748
2749 case EF_ARM_SOFT_FLOAT:
2750 strcat (buf, ", software FP");
2751 break;
2752
2753 case EF_ARM_VFP_FLOAT:
2754 strcat (buf, ", VFP");
2755 break;
2756
2757 case EF_ARM_MAVERICK_FLOAT:
2758 strcat (buf, ", Maverick FP");
2759 break;
2760
2761 default:
2762 unknown = TRUE;
2763 break;
2764 }
2765 }
2766 }
2767
2768 if (unknown)
2769 strcat (buf,_(", <unknown>"));
2770 }
2771
2772 static void
2773 decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2774 {
2775 --size; /* Leave space for null terminator. */
2776
2777 switch (e_flags & EF_AVR_MACH)
2778 {
2779 case E_AVR_MACH_AVR1:
2780 strncat (buf, ", avr:1", size);
2781 break;
2782 case E_AVR_MACH_AVR2:
2783 strncat (buf, ", avr:2", size);
2784 break;
2785 case E_AVR_MACH_AVR25:
2786 strncat (buf, ", avr:25", size);
2787 break;
2788 case E_AVR_MACH_AVR3:
2789 strncat (buf, ", avr:3", size);
2790 break;
2791 case E_AVR_MACH_AVR31:
2792 strncat (buf, ", avr:31", size);
2793 break;
2794 case E_AVR_MACH_AVR35:
2795 strncat (buf, ", avr:35", size);
2796 break;
2797 case E_AVR_MACH_AVR4:
2798 strncat (buf, ", avr:4", size);
2799 break;
2800 case E_AVR_MACH_AVR5:
2801 strncat (buf, ", avr:5", size);
2802 break;
2803 case E_AVR_MACH_AVR51:
2804 strncat (buf, ", avr:51", size);
2805 break;
2806 case E_AVR_MACH_AVR6:
2807 strncat (buf, ", avr:6", size);
2808 break;
2809 case E_AVR_MACH_AVRTINY:
2810 strncat (buf, ", avr:100", size);
2811 break;
2812 case E_AVR_MACH_XMEGA1:
2813 strncat (buf, ", avr:101", size);
2814 break;
2815 case E_AVR_MACH_XMEGA2:
2816 strncat (buf, ", avr:102", size);
2817 break;
2818 case E_AVR_MACH_XMEGA3:
2819 strncat (buf, ", avr:103", size);
2820 break;
2821 case E_AVR_MACH_XMEGA4:
2822 strncat (buf, ", avr:104", size);
2823 break;
2824 case E_AVR_MACH_XMEGA5:
2825 strncat (buf, ", avr:105", size);
2826 break;
2827 case E_AVR_MACH_XMEGA6:
2828 strncat (buf, ", avr:106", size);
2829 break;
2830 case E_AVR_MACH_XMEGA7:
2831 strncat (buf, ", avr:107", size);
2832 break;
2833 default:
2834 strncat (buf, ", avr:<unknown>", size);
2835 break;
2836 }
2837
2838 size -= strlen (buf);
2839 if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2840 strncat (buf, ", link-relax", size);
2841 }
2842
2843 static void
2844 decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2845 {
2846 unsigned abi;
2847 unsigned arch;
2848 unsigned config;
2849 unsigned version;
2850 bfd_boolean has_fpu = FALSE;
2851 unsigned int r = 0;
2852
2853 static const char *ABI_STRINGS[] =
2854 {
2855 "ABI v0", /* use r5 as return register; only used in N1213HC */
2856 "ABI v1", /* use r0 as return register */
2857 "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2858 "ABI v2fp", /* for FPU */
2859 "AABI",
2860 "ABI2 FP+"
2861 };
2862 static const char *VER_STRINGS[] =
2863 {
2864 "Andes ELF V1.3 or older",
2865 "Andes ELF V1.3.1",
2866 "Andes ELF V1.4"
2867 };
2868 static const char *ARCH_STRINGS[] =
2869 {
2870 "",
2871 "Andes Star v1.0",
2872 "Andes Star v2.0",
2873 "Andes Star v3.0",
2874 "Andes Star v3.0m"
2875 };
2876
2877 abi = EF_NDS_ABI & e_flags;
2878 arch = EF_NDS_ARCH & e_flags;
2879 config = EF_NDS_INST & e_flags;
2880 version = EF_NDS32_ELF_VERSION & e_flags;
2881
2882 memset (buf, 0, size);
2883
2884 switch (abi)
2885 {
2886 case E_NDS_ABI_V0:
2887 case E_NDS_ABI_V1:
2888 case E_NDS_ABI_V2:
2889 case E_NDS_ABI_V2FP:
2890 case E_NDS_ABI_AABI:
2891 case E_NDS_ABI_V2FP_PLUS:
2892 /* In case there are holes in the array. */
2893 r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2894 break;
2895
2896 default:
2897 r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2898 break;
2899 }
2900
2901 switch (version)
2902 {
2903 case E_NDS32_ELF_VER_1_2:
2904 case E_NDS32_ELF_VER_1_3:
2905 case E_NDS32_ELF_VER_1_4:
2906 r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2907 break;
2908
2909 default:
2910 r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2911 break;
2912 }
2913
2914 if (E_NDS_ABI_V0 == abi)
2915 {
2916 /* OLD ABI; only used in N1213HC, has performance extension 1. */
2917 r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2918 if (arch == E_NDS_ARCH_STAR_V1_0)
2919 r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2920 return;
2921 }
2922
2923 switch (arch)
2924 {
2925 case E_NDS_ARCH_STAR_V1_0:
2926 case E_NDS_ARCH_STAR_V2_0:
2927 case E_NDS_ARCH_STAR_V3_0:
2928 case E_NDS_ARCH_STAR_V3_M:
2929 r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2930 break;
2931
2932 default:
2933 r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2934 /* ARCH version determines how the e_flags are interpreted.
2935 If it is unknown, we cannot proceed. */
2936 return;
2937 }
2938
2939 /* Newer ABI; Now handle architecture specific flags. */
2940 if (arch == E_NDS_ARCH_STAR_V1_0)
2941 {
2942 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2943 r += snprintf (buf + r, size -r, ", MFUSR_PC");
2944
2945 if (!(config & E_NDS32_HAS_NO_MAC_INST))
2946 r += snprintf (buf + r, size -r, ", MAC");
2947
2948 if (config & E_NDS32_HAS_DIV_INST)
2949 r += snprintf (buf + r, size -r, ", DIV");
2950
2951 if (config & E_NDS32_HAS_16BIT_INST)
2952 r += snprintf (buf + r, size -r, ", 16b");
2953 }
2954 else
2955 {
2956 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2957 {
2958 if (version <= E_NDS32_ELF_VER_1_3)
2959 r += snprintf (buf + r, size -r, ", [B8]");
2960 else
2961 r += snprintf (buf + r, size -r, ", EX9");
2962 }
2963
2964 if (config & E_NDS32_HAS_MAC_DX_INST)
2965 r += snprintf (buf + r, size -r, ", MAC_DX");
2966
2967 if (config & E_NDS32_HAS_DIV_DX_INST)
2968 r += snprintf (buf + r, size -r, ", DIV_DX");
2969
2970 if (config & E_NDS32_HAS_16BIT_INST)
2971 {
2972 if (version <= E_NDS32_ELF_VER_1_3)
2973 r += snprintf (buf + r, size -r, ", 16b");
2974 else
2975 r += snprintf (buf + r, size -r, ", IFC");
2976 }
2977 }
2978
2979 if (config & E_NDS32_HAS_EXT_INST)
2980 r += snprintf (buf + r, size -r, ", PERF1");
2981
2982 if (config & E_NDS32_HAS_EXT2_INST)
2983 r += snprintf (buf + r, size -r, ", PERF2");
2984
2985 if (config & E_NDS32_HAS_FPU_INST)
2986 {
2987 has_fpu = TRUE;
2988 r += snprintf (buf + r, size -r, ", FPU_SP");
2989 }
2990
2991 if (config & E_NDS32_HAS_FPU_DP_INST)
2992 {
2993 has_fpu = TRUE;
2994 r += snprintf (buf + r, size -r, ", FPU_DP");
2995 }
2996
2997 if (config & E_NDS32_HAS_FPU_MAC_INST)
2998 {
2999 has_fpu = TRUE;
3000 r += snprintf (buf + r, size -r, ", FPU_MAC");
3001 }
3002
3003 if (has_fpu)
3004 {
3005 switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
3006 {
3007 case E_NDS32_FPU_REG_8SP_4DP:
3008 r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
3009 break;
3010 case E_NDS32_FPU_REG_16SP_8DP:
3011 r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
3012 break;
3013 case E_NDS32_FPU_REG_32SP_16DP:
3014 r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
3015 break;
3016 case E_NDS32_FPU_REG_32SP_32DP:
3017 r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
3018 break;
3019 }
3020 }
3021
3022 if (config & E_NDS32_HAS_AUDIO_INST)
3023 r += snprintf (buf + r, size -r, ", AUDIO");
3024
3025 if (config & E_NDS32_HAS_STRING_INST)
3026 r += snprintf (buf + r, size -r, ", STR");
3027
3028 if (config & E_NDS32_HAS_REDUCED_REGS)
3029 r += snprintf (buf + r, size -r, ", 16REG");
3030
3031 if (config & E_NDS32_HAS_VIDEO_INST)
3032 {
3033 if (version <= E_NDS32_ELF_VER_1_3)
3034 r += snprintf (buf + r, size -r, ", VIDEO");
3035 else
3036 r += snprintf (buf + r, size -r, ", SATURATION");
3037 }
3038
3039 if (config & E_NDS32_HAS_ENCRIPT_INST)
3040 r += snprintf (buf + r, size -r, ", ENCRP");
3041
3042 if (config & E_NDS32_HAS_L2C_INST)
3043 r += snprintf (buf + r, size -r, ", L2C");
3044 }
3045
3046 static char *
3047 get_machine_flags (Filedata * filedata, unsigned e_flags, unsigned e_machine)
3048 {
3049 static char buf[1024];
3050
3051 buf[0] = '\0';
3052
3053 if (e_flags)
3054 {
3055 switch (e_machine)
3056 {
3057 default:
3058 break;
3059
3060 case EM_ARC_COMPACT2:
3061 case EM_ARC_COMPACT:
3062 decode_ARC_machine_flags (e_flags, e_machine, buf);
3063 break;
3064
3065 case EM_ARM:
3066 decode_ARM_machine_flags (e_flags, buf);
3067 break;
3068
3069 case EM_AVR:
3070 decode_AVR_machine_flags (e_flags, buf, sizeof buf);
3071 break;
3072
3073 case EM_BLACKFIN:
3074 if (e_flags & EF_BFIN_PIC)
3075 strcat (buf, ", PIC");
3076
3077 if (e_flags & EF_BFIN_FDPIC)
3078 strcat (buf, ", FDPIC");
3079
3080 if (e_flags & EF_BFIN_CODE_IN_L1)
3081 strcat (buf, ", code in L1");
3082
3083 if (e_flags & EF_BFIN_DATA_IN_L1)
3084 strcat (buf, ", data in L1");
3085
3086 break;
3087
3088 case EM_CYGNUS_FRV:
3089 switch (e_flags & EF_FRV_CPU_MASK)
3090 {
3091 case EF_FRV_CPU_GENERIC:
3092 break;
3093
3094 default:
3095 strcat (buf, ", fr???");
3096 break;
3097
3098 case EF_FRV_CPU_FR300:
3099 strcat (buf, ", fr300");
3100 break;
3101
3102 case EF_FRV_CPU_FR400:
3103 strcat (buf, ", fr400");
3104 break;
3105 case EF_FRV_CPU_FR405:
3106 strcat (buf, ", fr405");
3107 break;
3108
3109 case EF_FRV_CPU_FR450:
3110 strcat (buf, ", fr450");
3111 break;
3112
3113 case EF_FRV_CPU_FR500:
3114 strcat (buf, ", fr500");
3115 break;
3116 case EF_FRV_CPU_FR550:
3117 strcat (buf, ", fr550");
3118 break;
3119
3120 case EF_FRV_CPU_SIMPLE:
3121 strcat (buf, ", simple");
3122 break;
3123 case EF_FRV_CPU_TOMCAT:
3124 strcat (buf, ", tomcat");
3125 break;
3126 }
3127 break;
3128
3129 case EM_68K:
3130 if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
3131 strcat (buf, ", m68000");
3132 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
3133 strcat (buf, ", cpu32");
3134 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
3135 strcat (buf, ", fido_a");
3136 else
3137 {
3138 char const * isa = _("unknown");
3139 char const * mac = _("unknown mac");
3140 char const * additional = NULL;
3141
3142 switch (e_flags & EF_M68K_CF_ISA_MASK)
3143 {
3144 case EF_M68K_CF_ISA_A_NODIV:
3145 isa = "A";
3146 additional = ", nodiv";
3147 break;
3148 case EF_M68K_CF_ISA_A:
3149 isa = "A";
3150 break;
3151 case EF_M68K_CF_ISA_A_PLUS:
3152 isa = "A+";
3153 break;
3154 case EF_M68K_CF_ISA_B_NOUSP:
3155 isa = "B";
3156 additional = ", nousp";
3157 break;
3158 case EF_M68K_CF_ISA_B:
3159 isa = "B";
3160 break;
3161 case EF_M68K_CF_ISA_C:
3162 isa = "C";
3163 break;
3164 case EF_M68K_CF_ISA_C_NODIV:
3165 isa = "C";
3166 additional = ", nodiv";
3167 break;
3168 }
3169 strcat (buf, ", cf, isa ");
3170 strcat (buf, isa);
3171 if (additional)
3172 strcat (buf, additional);
3173 if (e_flags & EF_M68K_CF_FLOAT)
3174 strcat (buf, ", float");
3175 switch (e_flags & EF_M68K_CF_MAC_MASK)
3176 {
3177 case 0:
3178 mac = NULL;
3179 break;
3180 case EF_M68K_CF_MAC:
3181 mac = "mac";
3182 break;
3183 case EF_M68K_CF_EMAC:
3184 mac = "emac";
3185 break;
3186 case EF_M68K_CF_EMAC_B:
3187 mac = "emac_b";
3188 break;
3189 }
3190 if (mac)
3191 {
3192 strcat (buf, ", ");
3193 strcat (buf, mac);
3194 }
3195 }
3196 break;
3197
3198 case EM_CYGNUS_MEP:
3199 switch (e_flags & EF_MEP_CPU_MASK)
3200 {
3201 case EF_MEP_CPU_MEP: strcat (buf, ", generic MeP"); break;
3202 case EF_MEP_CPU_C2: strcat (buf, ", MeP C2"); break;
3203 case EF_MEP_CPU_C3: strcat (buf, ", MeP C3"); break;
3204 case EF_MEP_CPU_C4: strcat (buf, ", MeP C4"); break;
3205 case EF_MEP_CPU_C5: strcat (buf, ", MeP C5"); break;
3206 case EF_MEP_CPU_H1: strcat (buf, ", MeP H1"); break;
3207 default: strcat (buf, _(", <unknown MeP cpu type>")); break;
3208 }
3209
3210 switch (e_flags & EF_MEP_COP_MASK)
3211 {
3212 case EF_MEP_COP_NONE: break;
3213 case EF_MEP_COP_AVC: strcat (buf, ", AVC coprocessor"); break;
3214 case EF_MEP_COP_AVC2: strcat (buf, ", AVC2 coprocessor"); break;
3215 case EF_MEP_COP_FMAX: strcat (buf, ", FMAX coprocessor"); break;
3216 case EF_MEP_COP_IVC2: strcat (buf, ", IVC2 coprocessor"); break;
3217 default: strcat (buf, _("<unknown MeP copro type>")); break;
3218 }
3219
3220 if (e_flags & EF_MEP_LIBRARY)
3221 strcat (buf, ", Built for Library");
3222
3223 if (e_flags & EF_MEP_INDEX_MASK)
3224 sprintf (buf + strlen (buf), ", Configuration Index: %#x",
3225 e_flags & EF_MEP_INDEX_MASK);
3226
3227 if (e_flags & ~ EF_MEP_ALL_FLAGS)
3228 sprintf (buf + strlen (buf), _(", unknown flags bits: %#x"),
3229 e_flags & ~ EF_MEP_ALL_FLAGS);
3230 break;
3231
3232 case EM_PPC:
3233 if (e_flags & EF_PPC_EMB)
3234 strcat (buf, ", emb");
3235
3236 if (e_flags & EF_PPC_RELOCATABLE)
3237 strcat (buf, _(", relocatable"));
3238
3239 if (e_flags & EF_PPC_RELOCATABLE_LIB)
3240 strcat (buf, _(", relocatable-lib"));
3241 break;
3242
3243 case EM_PPC64:
3244 if (e_flags & EF_PPC64_ABI)
3245 {
3246 char abi[] = ", abiv0";
3247
3248 abi[6] += e_flags & EF_PPC64_ABI;
3249 strcat (buf, abi);
3250 }
3251 break;
3252
3253 case EM_V800:
3254 if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
3255 strcat (buf, ", RH850 ABI");
3256
3257 if (e_flags & EF_V800_850E3)
3258 strcat (buf, ", V3 architecture");
3259
3260 if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
3261 strcat (buf, ", FPU not used");
3262
3263 if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
3264 strcat (buf, ", regmode: COMMON");
3265
3266 if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
3267 strcat (buf, ", r4 not used");
3268
3269 if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
3270 strcat (buf, ", r30 not used");
3271
3272 if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
3273 strcat (buf, ", r5 not used");
3274
3275 if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
3276 strcat (buf, ", r2 not used");
3277
3278 for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
3279 {
3280 switch (e_flags & - e_flags)
3281 {
3282 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
3283 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
3284 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
3285 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
3286 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
3287 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
3288 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
3289 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
3290 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
3291 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
3292 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
3293 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
3294 default: break;
3295 }
3296 }
3297 break;
3298
3299 case EM_V850:
3300 case EM_CYGNUS_V850:
3301 switch (e_flags & EF_V850_ARCH)
3302 {
3303 case E_V850E3V5_ARCH:
3304 strcat (buf, ", v850e3v5");
3305 break;
3306 case E_V850E2V3_ARCH:
3307 strcat (buf, ", v850e2v3");
3308 break;
3309 case E_V850E2_ARCH:
3310 strcat (buf, ", v850e2");
3311 break;
3312 case E_V850E1_ARCH:
3313 strcat (buf, ", v850e1");
3314 break;
3315 case E_V850E_ARCH:
3316 strcat (buf, ", v850e");
3317 break;
3318 case E_V850_ARCH:
3319 strcat (buf, ", v850");
3320 break;
3321 default:
3322 strcat (buf, _(", unknown v850 architecture variant"));
3323 break;
3324 }
3325 break;
3326
3327 case EM_M32R:
3328 case EM_CYGNUS_M32R:
3329 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3330 strcat (buf, ", m32r");
3331 break;
3332
3333 case EM_MIPS:
3334 case EM_MIPS_RS3_LE:
3335 if (e_flags & EF_MIPS_NOREORDER)
3336 strcat (buf, ", noreorder");
3337
3338 if (e_flags & EF_MIPS_PIC)
3339 strcat (buf, ", pic");
3340
3341 if (e_flags & EF_MIPS_CPIC)
3342 strcat (buf, ", cpic");
3343
3344 if (e_flags & EF_MIPS_UCODE)
3345 strcat (buf, ", ugen_reserved");
3346
3347 if (e_flags & EF_MIPS_ABI2)
3348 strcat (buf, ", abi2");
3349
3350 if (e_flags & EF_MIPS_OPTIONS_FIRST)
3351 strcat (buf, ", odk first");
3352
3353 if (e_flags & EF_MIPS_32BITMODE)
3354 strcat (buf, ", 32bitmode");
3355
3356 if (e_flags & EF_MIPS_NAN2008)
3357 strcat (buf, ", nan2008");
3358
3359 if (e_flags & EF_MIPS_FP64)
3360 strcat (buf, ", fp64");
3361
3362 switch ((e_flags & EF_MIPS_MACH))
3363 {
3364 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3365 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3366 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
3367 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
3368 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3369 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3370 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3371 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
3372 case E_MIPS_MACH_5900: strcat (buf, ", 5900"); break;
3373 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
3374 case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
3375 case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3376 case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
3377 case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
3378 case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
3379 case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
3380 case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
3381 case E_MIPS_MACH_XLR: strcat (buf, ", xlr"); break;
3382 case E_MIPS_MACH_IAMR2: strcat (buf, ", interaptiv-mr2"); break;
3383 case 0:
3384 /* We simply ignore the field in this case to avoid confusion:
3385 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3386 extension. */
3387 break;
3388 default: strcat (buf, _(", unknown CPU")); break;
3389 }
3390
3391 switch ((e_flags & EF_MIPS_ABI))
3392 {
3393 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3394 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3395 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3396 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3397 case 0:
3398 /* We simply ignore the field in this case to avoid confusion:
3399 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3400 This means it is likely to be an o32 file, but not for
3401 sure. */
3402 break;
3403 default: strcat (buf, _(", unknown ABI")); break;
3404 }
3405
3406 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3407 strcat (buf, ", mdmx");
3408
3409 if (e_flags & EF_MIPS_ARCH_ASE_M16)
3410 strcat (buf, ", mips16");
3411
3412 if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3413 strcat (buf, ", micromips");
3414
3415 switch ((e_flags & EF_MIPS_ARCH))
3416 {
3417 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3418 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3419 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3420 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3421 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3422 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
3423 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
3424 case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
3425 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
3426 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
3427 case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
3428 default: strcat (buf, _(", unknown ISA")); break;
3429 }
3430 break;
3431
3432 case EM_NDS32:
3433 decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3434 break;
3435
3436 case EM_RISCV:
3437 if (e_flags & EF_RISCV_RVC)
3438 strcat (buf, ", RVC");
3439
3440 switch (e_flags & EF_RISCV_FLOAT_ABI)
3441 {
3442 case EF_RISCV_FLOAT_ABI_SOFT:
3443 strcat (buf, ", soft-float ABI");
3444 break;
3445
3446 case EF_RISCV_FLOAT_ABI_SINGLE:
3447 strcat (buf, ", single-float ABI");
3448 break;
3449
3450 case EF_RISCV_FLOAT_ABI_DOUBLE:
3451 strcat (buf, ", double-float ABI");
3452 break;
3453
3454 case EF_RISCV_FLOAT_ABI_QUAD:
3455 strcat (buf, ", quad-float ABI");
3456 break;
3457 }
3458 break;
3459
3460 case EM_SH:
3461 switch ((e_flags & EF_SH_MACH_MASK))
3462 {
3463 case EF_SH1: strcat (buf, ", sh1"); break;
3464 case EF_SH2: strcat (buf, ", sh2"); break;
3465 case EF_SH3: strcat (buf, ", sh3"); break;
3466 case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3467 case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3468 case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3469 case EF_SH3E: strcat (buf, ", sh3e"); break;
3470 case EF_SH4: strcat (buf, ", sh4"); break;
3471 case EF_SH5: strcat (buf, ", sh5"); break;
3472 case EF_SH2E: strcat (buf, ", sh2e"); break;
3473 case EF_SH4A: strcat (buf, ", sh4a"); break;
3474 case EF_SH2A: strcat (buf, ", sh2a"); break;
3475 case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3476 case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
3477 case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
3478 case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3479 case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3480 case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3481 case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3482 case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3483 case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
3484 default: strcat (buf, _(", unknown ISA")); break;
3485 }
3486
3487 if (e_flags & EF_SH_PIC)
3488 strcat (buf, ", pic");
3489
3490 if (e_flags & EF_SH_FDPIC)
3491 strcat (buf, ", fdpic");
3492 break;
3493
3494 case EM_OR1K:
3495 if (e_flags & EF_OR1K_NODELAY)
3496 strcat (buf, ", no delay");
3497 break;
3498
3499 case EM_SPARCV9:
3500 if (e_flags & EF_SPARC_32PLUS)
3501 strcat (buf, ", v8+");
3502
3503 if (e_flags & EF_SPARC_SUN_US1)
3504 strcat (buf, ", ultrasparcI");
3505
3506 if (e_flags & EF_SPARC_SUN_US3)
3507 strcat (buf, ", ultrasparcIII");
3508
3509 if (e_flags & EF_SPARC_HAL_R1)
3510 strcat (buf, ", halr1");
3511
3512 if (e_flags & EF_SPARC_LEDATA)
3513 strcat (buf, ", ledata");
3514
3515 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3516 strcat (buf, ", tso");
3517
3518 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3519 strcat (buf, ", pso");
3520
3521 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3522 strcat (buf, ", rmo");
3523 break;
3524
3525 case EM_PARISC:
3526 switch (e_flags & EF_PARISC_ARCH)
3527 {
3528 case EFA_PARISC_1_0:
3529 strcpy (buf, ", PA-RISC 1.0");
3530 break;
3531 case EFA_PARISC_1_1:
3532 strcpy (buf, ", PA-RISC 1.1");
3533 break;
3534 case EFA_PARISC_2_0:
3535 strcpy (buf, ", PA-RISC 2.0");
3536 break;
3537 default:
3538 break;
3539 }
3540 if (e_flags & EF_PARISC_TRAPNIL)
3541 strcat (buf, ", trapnil");
3542 if (e_flags & EF_PARISC_EXT)
3543 strcat (buf, ", ext");
3544 if (e_flags & EF_PARISC_LSB)
3545 strcat (buf, ", lsb");
3546 if (e_flags & EF_PARISC_WIDE)
3547 strcat (buf, ", wide");
3548 if (e_flags & EF_PARISC_NO_KABP)
3549 strcat (buf, ", no kabp");
3550 if (e_flags & EF_PARISC_LAZYSWAP)
3551 strcat (buf, ", lazyswap");
3552 break;
3553
3554 case EM_PJ:
3555 case EM_PJ_OLD:
3556 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3557 strcat (buf, ", new calling convention");
3558
3559 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3560 strcat (buf, ", gnu calling convention");
3561 break;
3562
3563 case EM_IA_64:
3564 if ((e_flags & EF_IA_64_ABI64))
3565 strcat (buf, ", 64-bit");
3566 else
3567 strcat (buf, ", 32-bit");
3568 if ((e_flags & EF_IA_64_REDUCEDFP))
3569 strcat (buf, ", reduced fp model");
3570 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3571 strcat (buf, ", no function descriptors, constant gp");
3572 else if ((e_flags & EF_IA_64_CONS_GP))
3573 strcat (buf, ", constant gp");
3574 if ((e_flags & EF_IA_64_ABSOLUTE))
3575 strcat (buf, ", absolute");
3576 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3577 {
3578 if ((e_flags & EF_IA_64_VMS_LINKAGES))
3579 strcat (buf, ", vms_linkages");
3580 switch ((e_flags & EF_IA_64_VMS_COMCOD))
3581 {
3582 case EF_IA_64_VMS_COMCOD_SUCCESS:
3583 break;
3584 case EF_IA_64_VMS_COMCOD_WARNING:
3585 strcat (buf, ", warning");
3586 break;
3587 case EF_IA_64_VMS_COMCOD_ERROR:
3588 strcat (buf, ", error");
3589 break;
3590 case EF_IA_64_VMS_COMCOD_ABORT:
3591 strcat (buf, ", abort");
3592 break;
3593 default:
3594 warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3595 e_flags & EF_IA_64_VMS_COMCOD);
3596 strcat (buf, ", <unknown>");
3597 }
3598 }
3599 break;
3600
3601 case EM_VAX:
3602 if ((e_flags & EF_VAX_NONPIC))
3603 strcat (buf, ", non-PIC");
3604 if ((e_flags & EF_VAX_DFLOAT))
3605 strcat (buf, ", D-Float");
3606 if ((e_flags & EF_VAX_GFLOAT))
3607 strcat (buf, ", G-Float");
3608 break;
3609
3610 case EM_VISIUM:
3611 if (e_flags & EF_VISIUM_ARCH_MCM)
3612 strcat (buf, ", mcm");
3613 else if (e_flags & EF_VISIUM_ARCH_MCM24)
3614 strcat (buf, ", mcm24");
3615 if (e_flags & EF_VISIUM_ARCH_GR6)
3616 strcat (buf, ", gr6");
3617 break;
3618
3619 case EM_RL78:
3620 switch (e_flags & E_FLAG_RL78_CPU_MASK)
3621 {
3622 case E_FLAG_RL78_ANY_CPU: break;
3623 case E_FLAG_RL78_G10: strcat (buf, ", G10"); break;
3624 case E_FLAG_RL78_G13: strcat (buf, ", G13"); break;
3625 case E_FLAG_RL78_G14: strcat (buf, ", G14"); break;
3626 }
3627 if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3628 strcat (buf, ", 64-bit doubles");
3629 break;
3630
3631 case EM_RX:
3632 if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3633 strcat (buf, ", 64-bit doubles");
3634 if (e_flags & E_FLAG_RX_DSP)
3635 strcat (buf, ", dsp");
3636 if (e_flags & E_FLAG_RX_PID)
3637 strcat (buf, ", pid");
3638 if (e_flags & E_FLAG_RX_ABI)
3639 strcat (buf, ", RX ABI");
3640 if (e_flags & E_FLAG_RX_SINSNS_SET)
3641 strcat (buf, e_flags & E_FLAG_RX_SINSNS_YES
3642 ? ", uses String instructions" : ", bans String instructions");
3643 if (e_flags & E_FLAG_RX_V2)
3644 strcat (buf, ", V2");
3645 break;
3646
3647 case EM_S390:
3648 if (e_flags & EF_S390_HIGH_GPRS)
3649 strcat (buf, ", highgprs");
3650 break;
3651
3652 case EM_TI_C6000:
3653 if ((e_flags & EF_C6000_REL))
3654 strcat (buf, ", relocatable module");
3655 break;
3656
3657 case EM_MSP430:
3658 strcat (buf, _(": architecture variant: "));
3659 switch (e_flags & EF_MSP430_MACH)
3660 {
3661 case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3662 case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3663 case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3664 case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3665 case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3666 case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3667 case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3668 case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3669 case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3670 case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3671 case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3672 case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3673 case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3674 case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3675 case E_MSP430_MACH_MSP430X : strcat (buf, "MSP430X"); break;
3676 default:
3677 strcat (buf, _(": unknown")); break;
3678 }
3679
3680 if (e_flags & ~ EF_MSP430_MACH)
3681 strcat (buf, _(": unknown extra flag bits also present"));
3682 }
3683 }
3684
3685 return buf;
3686 }
3687
3688 static const char *
3689 get_osabi_name (Filedata * filedata, unsigned int osabi)
3690 {
3691 static char buff[32];
3692
3693 switch (osabi)
3694 {
3695 case ELFOSABI_NONE: return "UNIX - System V";
3696 case ELFOSABI_HPUX: return "UNIX - HP-UX";
3697 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
3698 case ELFOSABI_GNU: return "UNIX - GNU";
3699 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
3700 case ELFOSABI_AIX: return "UNIX - AIX";
3701 case ELFOSABI_IRIX: return "UNIX - IRIX";
3702 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
3703 case ELFOSABI_TRU64: return "UNIX - TRU64";
3704 case ELFOSABI_MODESTO: return "Novell - Modesto";
3705 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
3706 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
3707 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
3708 case ELFOSABI_AROS: return "AROS";
3709 case ELFOSABI_FENIXOS: return "FenixOS";
3710 case ELFOSABI_CLOUDABI: return "Nuxi CloudABI";
3711 case ELFOSABI_OPENVOS: return "Stratus Technologies OpenVOS";
3712 default:
3713 if (osabi >= 64)
3714 switch (filedata->file_header.e_machine)
3715 {
3716 case EM_ARM:
3717 switch (osabi)
3718 {
3719 case ELFOSABI_ARM: return "ARM";
3720 default:
3721 break;
3722 }
3723 break;
3724
3725 case EM_MSP430:
3726 case EM_MSP430_OLD:
3727 case EM_VISIUM:
3728 switch (osabi)
3729 {
3730 case ELFOSABI_STANDALONE: return _("Standalone App");
3731 default:
3732 break;
3733 }
3734 break;
3735
3736 case EM_TI_C6000:
3737 switch (osabi)
3738 {
3739 case ELFOSABI_C6000_ELFABI: return _("Bare-metal C6000");
3740 case ELFOSABI_C6000_LINUX: return "Linux C6000";
3741 default:
3742 break;
3743 }
3744 break;
3745
3746 default:
3747 break;
3748 }
3749 snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3750 return buff;
3751 }
3752 }
3753
3754 static const char *
3755 get_aarch64_segment_type (unsigned long type)
3756 {
3757 switch (type)
3758 {
3759 case PT_AARCH64_ARCHEXT: return "AARCH64_ARCHEXT";
3760 default: return NULL;
3761 }
3762 }
3763
3764 static const char *
3765 get_arm_segment_type (unsigned long type)
3766 {
3767 switch (type)
3768 {
3769 case PT_ARM_EXIDX: return "EXIDX";
3770 default: return NULL;
3771 }
3772 }
3773
3774 static const char *
3775 get_s390_segment_type (unsigned long type)
3776 {
3777 switch (type)
3778 {
3779 case PT_S390_PGSTE: return "S390_PGSTE";
3780 default: return NULL;
3781 }
3782 }
3783
3784 static const char *
3785 get_mips_segment_type (unsigned long type)
3786 {
3787 switch (type)
3788 {
3789 case PT_MIPS_REGINFO: return "REGINFO";
3790 case PT_MIPS_RTPROC: return "RTPROC";
3791 case PT_MIPS_OPTIONS: return "OPTIONS";
3792 case PT_MIPS_ABIFLAGS: return "ABIFLAGS";
3793 default: return NULL;
3794 }
3795 }
3796
3797 static const char *
3798 get_parisc_segment_type (unsigned long type)
3799 {
3800 switch (type)
3801 {
3802 case PT_HP_TLS: return "HP_TLS";
3803 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
3804 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
3805 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
3806 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
3807 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
3808 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
3809 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
3810 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
3811 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
3812 case PT_HP_PARALLEL: return "HP_PARALLEL";
3813 case PT_HP_FASTBIND: return "HP_FASTBIND";
3814 case PT_HP_OPT_ANNOT: return "HP_OPT_ANNOT";
3815 case PT_HP_HSL_ANNOT: return "HP_HSL_ANNOT";
3816 case PT_HP_STACK: return "HP_STACK";
3817 case PT_HP_CORE_UTSNAME: return "HP_CORE_UTSNAME";
3818 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
3819 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
3820 case PT_PARISC_WEAKORDER: return "PARISC_WEAKORDER";
3821 default: return NULL;
3822 }
3823 }
3824
3825 static const char *
3826 get_ia64_segment_type (unsigned long type)
3827 {
3828 switch (type)
3829 {
3830 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
3831 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
3832 case PT_HP_TLS: return "HP_TLS";
3833 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
3834 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
3835 case PT_IA_64_HP_STACK: return "HP_STACK";
3836 default: return NULL;
3837 }
3838 }
3839
3840 static const char *
3841 get_tic6x_segment_type (unsigned long type)
3842 {
3843 switch (type)
3844 {
3845 case PT_C6000_PHATTR: return "C6000_PHATTR";
3846 default: return NULL;
3847 }
3848 }
3849
3850 static const char *
3851 get_solaris_segment_type (unsigned long type)
3852 {
3853 switch (type)
3854 {
3855 case 0x6464e550: return "PT_SUNW_UNWIND";
3856 case 0x6474e550: return "PT_SUNW_EH_FRAME";
3857 case 0x6ffffff7: return "PT_LOSUNW";
3858 case 0x6ffffffa: return "PT_SUNWBSS";
3859 case 0x6ffffffb: return "PT_SUNWSTACK";
3860 case 0x6ffffffc: return "PT_SUNWDTRACE";
3861 case 0x6ffffffd: return "PT_SUNWCAP";
3862 case 0x6fffffff: return "PT_HISUNW";
3863 default: return NULL;
3864 }
3865 }
3866
3867 static const char *
3868 get_segment_type (Filedata * filedata, unsigned long p_type)
3869 {
3870 static char buff[32];
3871
3872 switch (p_type)
3873 {
3874 case PT_NULL: return "NULL";
3875 case PT_LOAD: return "LOAD";
3876 case PT_DYNAMIC: return "DYNAMIC";
3877 case PT_INTERP: return "INTERP";
3878 case PT_NOTE: return "NOTE";
3879 case PT_SHLIB: return "SHLIB";
3880 case PT_PHDR: return "PHDR";
3881 case PT_TLS: return "TLS";
3882 case PT_GNU_EH_FRAME: return "GNU_EH_FRAME";
3883 case PT_GNU_STACK: return "GNU_STACK";
3884 case PT_GNU_RELRO: return "GNU_RELRO";
3885
3886 default:
3887 if (p_type >= PT_GNU_MBIND_LO && p_type <= PT_GNU_MBIND_HI)
3888 {
3889 sprintf (buff, "GNU_MBIND+%#lx",
3890 p_type - PT_GNU_MBIND_LO);
3891 }
3892 else if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3893 {
3894 const char * result;
3895
3896 switch (filedata->file_header.e_machine)
3897 {
3898 case EM_AARCH64:
3899 result = get_aarch64_segment_type (p_type);
3900 break;
3901 case EM_ARM:
3902 result = get_arm_segment_type (p_type);
3903 break;
3904 case EM_MIPS:
3905 case EM_MIPS_RS3_LE:
3906 result = get_mips_segment_type (p_type);
3907 break;
3908 case EM_PARISC:
3909 result = get_parisc_segment_type (p_type);
3910 break;
3911 case EM_IA_64:
3912 result = get_ia64_segment_type (p_type);
3913 break;
3914 case EM_TI_C6000:
3915 result = get_tic6x_segment_type (p_type);
3916 break;
3917 case EM_S390:
3918 case EM_S390_OLD:
3919 result = get_s390_segment_type (p_type);
3920 break;
3921 default:
3922 result = NULL;
3923 break;
3924 }
3925
3926 if (result != NULL)
3927 return result;
3928
3929 sprintf (buff, "LOPROC+%#lx", p_type - PT_LOPROC);
3930 }
3931 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3932 {
3933 const char * result;
3934
3935 switch (filedata->file_header.e_machine)
3936 {
3937 case EM_PARISC:
3938 result = get_parisc_segment_type (p_type);
3939 break;
3940 case EM_IA_64:
3941 result = get_ia64_segment_type (p_type);
3942 break;
3943 default:
3944 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
3945 result = get_solaris_segment_type (p_type);
3946 else
3947 result = NULL;
3948 break;
3949 }
3950
3951 if (result != NULL)
3952 return result;
3953
3954 sprintf (buff, "LOOS+%#lx", p_type - PT_LOOS);
3955 }
3956 else
3957 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
3958
3959 return buff;
3960 }
3961 }
3962
3963 static const char *
3964 get_arc_section_type_name (unsigned int sh_type)
3965 {
3966 switch (sh_type)
3967 {
3968 case SHT_ARC_ATTRIBUTES: return "ARC_ATTRIBUTES";
3969 default:
3970 break;
3971 }
3972 return NULL;
3973 }
3974
3975 static const char *
3976 get_mips_section_type_name (unsigned int sh_type)
3977 {
3978 switch (sh_type)
3979 {
3980 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
3981 case SHT_MIPS_MSYM: return "MIPS_MSYM";
3982 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
3983 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
3984 case SHT_MIPS_UCODE: return "MIPS_UCODE";
3985 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
3986 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
3987 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
3988 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
3989 case SHT_MIPS_RELD: return "MIPS_RELD";
3990 case SHT_MIPS_IFACE: return "MIPS_IFACE";
3991 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
3992 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
3993 case SHT_MIPS_SHDR: return "MIPS_SHDR";
3994 case SHT_MIPS_FDESC: return "MIPS_FDESC";
3995 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
3996 case SHT_MIPS_DENSE: return "MIPS_DENSE";
3997 case SHT_MIPS_PDESC: return "MIPS_PDESC";
3998 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
3999 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
4000 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
4001 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
4002 case SHT_MIPS_LINE: return "MIPS_LINE";
4003 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
4004 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
4005 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
4006 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
4007 case SHT_MIPS_DWARF: return "MIPS_DWARF";
4008 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
4009 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
4010 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
4011 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
4012 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
4013 case SHT_MIPS_XLATE: return "MIPS_XLATE";
4014 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
4015 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
4016 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
4017 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
4018 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
4019 case SHT_MIPS_ABIFLAGS: return "MIPS_ABIFLAGS";
4020 default:
4021 break;
4022 }
4023 return NULL;
4024 }
4025
4026 static const char *
4027 get_parisc_section_type_name (unsigned int sh_type)
4028 {
4029 switch (sh_type)
4030 {
4031 case SHT_PARISC_EXT: return "PARISC_EXT";
4032 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
4033 case SHT_PARISC_DOC: return "PARISC_DOC";
4034 case SHT_PARISC_ANNOT: return "PARISC_ANNOT";
4035 case SHT_PARISC_SYMEXTN: return "PARISC_SYMEXTN";
4036 case SHT_PARISC_STUBS: return "PARISC_STUBS";
4037 case SHT_PARISC_DLKM: return "PARISC_DLKM";
4038 default: return NULL;
4039 }
4040 }
4041
4042 static const char *
4043 get_ia64_section_type_name (Filedata * filedata, unsigned int sh_type)
4044 {
4045 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
4046 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
4047 return get_osabi_name (filedata, (sh_type & 0x00FF0000) >> 16);
4048
4049 switch (sh_type)
4050 {
4051 case SHT_IA_64_EXT: return "IA_64_EXT";
4052 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
4053 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
4054 case SHT_IA_64_VMS_TRACE: return "VMS_TRACE";
4055 case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
4056 case SHT_IA_64_VMS_DEBUG: return "VMS_DEBUG";
4057 case SHT_IA_64_VMS_DEBUG_STR: return "VMS_DEBUG_STR";
4058 case SHT_IA_64_VMS_LINKAGES: return "VMS_LINKAGES";
4059 case SHT_IA_64_VMS_SYMBOL_VECTOR: return "VMS_SYMBOL_VECTOR";
4060 case SHT_IA_64_VMS_FIXUP: return "VMS_FIXUP";
4061 default:
4062 break;
4063 }
4064 return NULL;
4065 }
4066
4067 static const char *
4068 get_x86_64_section_type_name (unsigned int sh_type)
4069 {
4070 switch (sh_type)
4071 {
4072 case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
4073 default: return NULL;
4074 }
4075 }
4076
4077 static const char *
4078 get_aarch64_section_type_name (unsigned int sh_type)
4079 {
4080 switch (sh_type)
4081 {
4082 case SHT_AARCH64_ATTRIBUTES: return "AARCH64_ATTRIBUTES";
4083 default: return NULL;
4084 }
4085 }
4086
4087 static const char *
4088 get_arm_section_type_name (unsigned int sh_type)
4089 {
4090 switch (sh_type)
4091 {
4092 case SHT_ARM_EXIDX: return "ARM_EXIDX";
4093 case SHT_ARM_PREEMPTMAP: return "ARM_PREEMPTMAP";
4094 case SHT_ARM_ATTRIBUTES: return "ARM_ATTRIBUTES";
4095 case SHT_ARM_DEBUGOVERLAY: return "ARM_DEBUGOVERLAY";
4096 case SHT_ARM_OVERLAYSECTION: return "ARM_OVERLAYSECTION";
4097 default: return NULL;
4098 }
4099 }
4100
4101 static const char *
4102 get_tic6x_section_type_name (unsigned int sh_type)
4103 {
4104 switch (sh_type)
4105 {
4106 case SHT_C6000_UNWIND: return "C6000_UNWIND";
4107 case SHT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
4108 case SHT_C6000_ATTRIBUTES: return "C6000_ATTRIBUTES";
4109 case SHT_TI_ICODE: return "TI_ICODE";
4110 case SHT_TI_XREF: return "TI_XREF";
4111 case SHT_TI_HANDLER: return "TI_HANDLER";
4112 case SHT_TI_INITINFO: return "TI_INITINFO";
4113 case SHT_TI_PHATTRS: return "TI_PHATTRS";
4114 default: return NULL;
4115 }
4116 }
4117
4118 static const char *
4119 get_msp430x_section_type_name (unsigned int sh_type)
4120 {
4121 switch (sh_type)
4122 {
4123 case SHT_MSP430_SEC_FLAGS: return "MSP430_SEC_FLAGS";
4124 case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
4125 case SHT_MSP430_ATTRIBUTES: return "MSP430_ATTRIBUTES";
4126 default: return NULL;
4127 }
4128 }
4129
4130 static const char *
4131 get_v850_section_type_name (unsigned int sh_type)
4132 {
4133 switch (sh_type)
4134 {
4135 case SHT_V850_SCOMMON: return "V850 Small Common";
4136 case SHT_V850_TCOMMON: return "V850 Tiny Common";
4137 case SHT_V850_ZCOMMON: return "V850 Zero Common";
4138 case SHT_RENESAS_IOP: return "RENESAS IOP";
4139 case SHT_RENESAS_INFO: return "RENESAS INFO";
4140 default: return NULL;
4141 }
4142 }
4143
4144 static const char *
4145 get_section_type_name (Filedata * filedata, unsigned int sh_type)
4146 {
4147 static char buff[32];
4148 const char * result;
4149
4150 switch (sh_type)
4151 {
4152 case SHT_NULL: return "NULL";
4153 case SHT_PROGBITS: return "PROGBITS";
4154 case SHT_SYMTAB: return "SYMTAB";
4155 case SHT_STRTAB: return "STRTAB";
4156 case SHT_RELA: return "RELA";
4157 case SHT_HASH: return "HASH";
4158 case SHT_DYNAMIC: return "DYNAMIC";
4159 case SHT_NOTE: return "NOTE";
4160 case SHT_NOBITS: return "NOBITS";
4161 case SHT_REL: return "REL";
4162 case SHT_SHLIB: return "SHLIB";
4163 case SHT_DYNSYM: return "DYNSYM";
4164 case SHT_INIT_ARRAY: return "INIT_ARRAY";
4165 case SHT_FINI_ARRAY: return "FINI_ARRAY";
4166 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
4167 case SHT_GNU_HASH: return "GNU_HASH";
4168 case SHT_GROUP: return "GROUP";
4169 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
4170 case SHT_GNU_verdef: return "VERDEF";
4171 case SHT_GNU_verneed: return "VERNEED";
4172 case SHT_GNU_versym: return "VERSYM";
4173 case 0x6ffffff0: return "VERSYM";
4174 case 0x6ffffffc: return "VERDEF";
4175 case 0x7ffffffd: return "AUXILIARY";
4176 case 0x7fffffff: return "FILTER";
4177 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
4178
4179 default:
4180 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
4181 {
4182 switch (filedata->file_header.e_machine)
4183 {
4184 case EM_ARC:
4185 case EM_ARC_COMPACT:
4186 case EM_ARC_COMPACT2:
4187 result = get_arc_section_type_name (sh_type);
4188 break;
4189 case EM_MIPS:
4190 case EM_MIPS_RS3_LE:
4191 result = get_mips_section_type_name (sh_type);
4192 break;
4193 case EM_PARISC:
4194 result = get_parisc_section_type_name (sh_type);
4195 break;
4196 case EM_IA_64:
4197 result = get_ia64_section_type_name (filedata, sh_type);
4198 break;
4199 case EM_X86_64:
4200 case EM_L1OM:
4201 case EM_K1OM:
4202 result = get_x86_64_section_type_name (sh_type);
4203 break;
4204 case EM_AARCH64:
4205 result = get_aarch64_section_type_name (sh_type);
4206 break;
4207 case EM_ARM:
4208 result = get_arm_section_type_name (sh_type);
4209 break;
4210 case EM_TI_C6000:
4211 result = get_tic6x_section_type_name (sh_type);
4212 break;
4213 case EM_MSP430:
4214 result = get_msp430x_section_type_name (sh_type);
4215 break;
4216 case EM_V800:
4217 case EM_V850:
4218 case EM_CYGNUS_V850:
4219 result = get_v850_section_type_name (sh_type);
4220 break;
4221 default:
4222 result = NULL;
4223 break;
4224 }
4225
4226 if (result != NULL)
4227 return result;
4228
4229 sprintf (buff, "LOPROC+%#x", sh_type - SHT_LOPROC);
4230 }
4231 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
4232 {
4233 switch (filedata->file_header.e_machine)
4234 {
4235 case EM_IA_64:
4236 result = get_ia64_section_type_name (filedata, sh_type);
4237 break;
4238 default:
4239 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
4240 result = get_solaris_section_type (sh_type);
4241 else
4242 {
4243 switch (sh_type)
4244 {
4245 case SHT_GNU_INCREMENTAL_INPUTS: result = "GNU_INCREMENTAL_INPUTS"; break;
4246 case SHT_GNU_ATTRIBUTES: result = "GNU_ATTRIBUTES"; break;
4247 case SHT_GNU_HASH: result = "GNU_HASH"; break;
4248 case SHT_GNU_LIBLIST: result = "GNU_LIBLIST"; break;
4249 default:
4250 result = NULL;
4251 break;
4252 }
4253 }
4254 break;
4255 }
4256
4257 if (result != NULL)
4258 return result;
4259
4260 sprintf (buff, "LOOS+%#x", sh_type - SHT_LOOS);
4261 }
4262 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
4263 {
4264 switch (filedata->file_header.e_machine)
4265 {
4266 case EM_V800:
4267 case EM_V850:
4268 case EM_CYGNUS_V850:
4269 result = get_v850_section_type_name (sh_type);
4270 break;
4271 default:
4272 result = NULL;
4273 break;
4274 }
4275
4276 if (result != NULL)
4277 return result;
4278
4279 sprintf (buff, "LOUSER+%#x", sh_type - SHT_LOUSER);
4280 }
4281 else
4282 /* This message is probably going to be displayed in a 15
4283 character wide field, so put the hex value first. */
4284 snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
4285
4286 return buff;
4287 }
4288 }
4289
4290 #define OPTION_DEBUG_DUMP 512
4291 #define OPTION_DYN_SYMS 513
4292 #define OPTION_DWARF_DEPTH 514
4293 #define OPTION_DWARF_START 515
4294 #define OPTION_DWARF_CHECK 516
4295
4296 static struct option options[] =
4297 {
4298 {"all", no_argument, 0, 'a'},
4299 {"file-header", no_argument, 0, 'h'},
4300 {"program-headers", no_argument, 0, 'l'},
4301 {"headers", no_argument, 0, 'e'},
4302 {"histogram", no_argument, 0, 'I'},
4303 {"segments", no_argument, 0, 'l'},
4304 {"sections", no_argument, 0, 'S'},
4305 {"section-headers", no_argument, 0, 'S'},
4306 {"section-groups", no_argument, 0, 'g'},
4307 {"section-details", no_argument, 0, 't'},
4308 {"full-section-name",no_argument, 0, 'N'},
4309 {"symbols", no_argument, 0, 's'},
4310 {"syms", no_argument, 0, 's'},
4311 {"dyn-syms", no_argument, 0, OPTION_DYN_SYMS},
4312 {"relocs", no_argument, 0, 'r'},
4313 {"notes", no_argument, 0, 'n'},
4314 {"dynamic", no_argument, 0, 'd'},
4315 {"arch-specific", no_argument, 0, 'A'},
4316 {"version-info", no_argument, 0, 'V'},
4317 {"use-dynamic", no_argument, 0, 'D'},
4318 {"unwind", no_argument, 0, 'u'},
4319 {"archive-index", no_argument, 0, 'c'},
4320 {"hex-dump", required_argument, 0, 'x'},
4321 {"relocated-dump", required_argument, 0, 'R'},
4322 {"string-dump", required_argument, 0, 'p'},
4323 {"decompress", no_argument, 0, 'z'},
4324 #ifdef SUPPORT_DISASSEMBLY
4325 {"instruction-dump", required_argument, 0, 'i'},
4326 #endif
4327 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
4328
4329 {"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH},
4330 {"dwarf-start", required_argument, 0, OPTION_DWARF_START},
4331 {"dwarf-check", no_argument, 0, OPTION_DWARF_CHECK},
4332
4333 {"version", no_argument, 0, 'v'},
4334 {"wide", no_argument, 0, 'W'},
4335 {"help", no_argument, 0, 'H'},
4336 {0, no_argument, 0, 0}
4337 };
4338
4339 static void
4340 usage (FILE * stream)
4341 {
4342 fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
4343 fprintf (stream, _(" Display information about the contents of ELF format files\n"));
4344 fprintf (stream, _(" Options are:\n\
4345 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4346 -h --file-header Display the ELF file header\n\
4347 -l --program-headers Display the program headers\n\
4348 --segments An alias for --program-headers\n\
4349 -S --section-headers Display the sections' header\n\
4350 --sections An alias for --section-headers\n\
4351 -g --section-groups Display the section groups\n\
4352 -t --section-details Display the section details\n\
4353 -e --headers Equivalent to: -h -l -S\n\
4354 -s --syms Display the symbol table\n\
4355 --symbols An alias for --syms\n\
4356 --dyn-syms Display the dynamic symbol table\n\
4357 -n --notes Display the core notes (if present)\n\
4358 -r --relocs Display the relocations (if present)\n\
4359 -u --unwind Display the unwind info (if present)\n\
4360 -d --dynamic Display the dynamic section (if present)\n\
4361 -V --version-info Display the version sections (if present)\n\
4362 -A --arch-specific Display architecture specific information (if any)\n\
4363 -c --archive-index Display the symbol/file index in an archive\n\
4364 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
4365 -x --hex-dump=<number|name>\n\
4366 Dump the contents of section <number|name> as bytes\n\
4367 -p --string-dump=<number|name>\n\
4368 Dump the contents of section <number|name> as strings\n\
4369 -R --relocated-dump=<number|name>\n\
4370 Dump the contents of section <number|name> as relocated bytes\n\
4371 -z --decompress Decompress section before dumping it\n\
4372 -w[lLiaprmfFsoRtUuTgAckK] or\n\
4373 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
4374 =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
4375 =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4376 =addr,=cu_index,=links,=follow-links]\n\
4377 Display the contents of DWARF debug sections\n"));
4378 fprintf (stream, _("\
4379 --dwarf-depth=N Do not display DIEs at depth N or greater\n\
4380 --dwarf-start=N Display DIEs starting with N, at the same depth\n\
4381 or deeper\n"));
4382 #ifdef SUPPORT_DISASSEMBLY
4383 fprintf (stream, _("\
4384 -i --instruction-dump=<number|name>\n\
4385 Disassemble the contents of section <number|name>\n"));
4386 #endif
4387 fprintf (stream, _("\
4388 -I --histogram Display histogram of bucket list lengths\n\
4389 -W --wide Allow output width to exceed 80 characters\n\
4390 @<file> Read options from <file>\n\
4391 -H --help Display this information\n\
4392 -v --version Display the version number of readelf\n"));
4393
4394 if (REPORT_BUGS_TO[0] && stream == stdout)
4395 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
4396
4397 exit (stream == stdout ? 0 : 1);
4398 }
4399
4400 /* Record the fact that the user wants the contents of section number
4401 SECTION to be displayed using the method(s) encoded as flags bits
4402 in TYPE. Note, TYPE can be zero if we are creating the array for
4403 the first time. */
4404
4405 static void
4406 request_dump_bynumber (Filedata * filedata, unsigned int section, dump_type type)
4407 {
4408 if (section >= filedata->num_dump_sects)
4409 {
4410 dump_type * new_dump_sects;
4411
4412 new_dump_sects = (dump_type *) calloc (section + 1,
4413 sizeof (* new_dump_sects));
4414
4415 if (new_dump_sects == NULL)
4416 error (_("Out of memory allocating dump request table.\n"));
4417 else
4418 {
4419 if (filedata->dump_sects)
4420 {
4421 /* Copy current flag settings. */
4422 memcpy (new_dump_sects, filedata->dump_sects,
4423 filedata->num_dump_sects * sizeof (* new_dump_sects));
4424
4425 free (filedata->dump_sects);
4426 }
4427
4428 filedata->dump_sects = new_dump_sects;
4429 filedata->num_dump_sects = section + 1;
4430 }
4431 }
4432
4433 if (filedata->dump_sects)
4434 filedata->dump_sects[section] |= type;
4435 }
4436
4437 /* Request a dump by section name. */
4438
4439 static void
4440 request_dump_byname (const char * section, dump_type type)
4441 {
4442 struct dump_list_entry * new_request;
4443
4444 new_request = (struct dump_list_entry *)
4445 malloc (sizeof (struct dump_list_entry));
4446 if (!new_request)
4447 error (_("Out of memory allocating dump request table.\n"));
4448
4449 new_request->name = strdup (section);
4450 if (!new_request->name)
4451 error (_("Out of memory allocating dump request table.\n"));
4452
4453 new_request->type = type;
4454
4455 new_request->next = dump_sects_byname;
4456 dump_sects_byname = new_request;
4457 }
4458
4459 static inline void
4460 request_dump (Filedata * filedata, dump_type type)
4461 {
4462 int section;
4463 char * cp;
4464
4465 do_dump++;
4466 section = strtoul (optarg, & cp, 0);
4467
4468 if (! *cp && section >= 0)
4469 request_dump_bynumber (filedata, section, type);
4470 else
4471 request_dump_byname (optarg, type);
4472 }
4473
4474 static void
4475 parse_args (Filedata * filedata, int argc, char ** argv)
4476 {
4477 int c;
4478
4479 if (argc < 2)
4480 usage (stderr);
4481
4482 while ((c = getopt_long
4483 (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
4484 {
4485 switch (c)
4486 {
4487 case 0:
4488 /* Long options. */
4489 break;
4490 case 'H':
4491 usage (stdout);
4492 break;
4493
4494 case 'a':
4495 do_syms = TRUE;
4496 do_reloc = TRUE;
4497 do_unwind = TRUE;
4498 do_dynamic = TRUE;
4499 do_header = TRUE;
4500 do_sections = TRUE;
4501 do_section_groups = TRUE;
4502 do_segments = TRUE;
4503 do_version = TRUE;
4504 do_histogram = TRUE;
4505 do_arch = TRUE;
4506 do_notes = TRUE;
4507 break;
4508 case 'g':
4509 do_section_groups = TRUE;
4510 break;
4511 case 't':
4512 case 'N':
4513 do_sections = TRUE;
4514 do_section_details = TRUE;
4515 break;
4516 case 'e':
4517 do_header = TRUE;
4518 do_sections = TRUE;
4519 do_segments = TRUE;
4520 break;
4521 case 'A':
4522 do_arch = TRUE;
4523 break;
4524 case 'D':
4525 do_using_dynamic = TRUE;
4526 break;
4527 case 'r':
4528 do_reloc = TRUE;
4529 break;
4530 case 'u':
4531 do_unwind = TRUE;
4532 break;
4533 case 'h':
4534 do_header = TRUE;
4535 break;
4536 case 'l':
4537 do_segments = TRUE;
4538 break;
4539 case 's':
4540 do_syms = TRUE;
4541 break;
4542 case 'S':
4543 do_sections = TRUE;
4544 break;
4545 case 'd':
4546 do_dynamic = TRUE;
4547 break;
4548 case 'I':
4549 do_histogram = TRUE;
4550 break;
4551 case 'n':
4552 do_notes = TRUE;
4553 break;
4554 case 'c':
4555 do_archive_index = TRUE;
4556 break;
4557 case 'x':
4558 request_dump (filedata, HEX_DUMP);
4559 break;
4560 case 'p':
4561 request_dump (filedata, STRING_DUMP);
4562 break;
4563 case 'R':
4564 request_dump (filedata, RELOC_DUMP);
4565 break;
4566 case 'z':
4567 decompress_dumps = TRUE;
4568 break;
4569 case 'w':
4570 do_dump = TRUE;
4571 if (optarg == 0)
4572 {
4573 do_debugging = TRUE;
4574 dwarf_select_sections_all ();
4575 }
4576 else
4577 {
4578 do_debugging = FALSE;
4579 dwarf_select_sections_by_letters (optarg);
4580 }
4581 break;
4582 case OPTION_DEBUG_DUMP:
4583 do_dump = TRUE;
4584 if (optarg == 0)
4585 do_debugging = TRUE;
4586 else
4587 {
4588 do_debugging = FALSE;
4589 dwarf_select_sections_by_names (optarg);
4590 }
4591 break;
4592 case OPTION_DWARF_DEPTH:
4593 {
4594 char *cp;
4595
4596 dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4597 }
4598 break;
4599 case OPTION_DWARF_START:
4600 {
4601 char *cp;
4602
4603 dwarf_start_die = strtoul (optarg, & cp, 0);
4604 }
4605 break;
4606 case OPTION_DWARF_CHECK:
4607 dwarf_check = TRUE;
4608 break;
4609 case OPTION_DYN_SYMS:
4610 do_dyn_syms = TRUE;
4611 break;
4612 #ifdef SUPPORT_DISASSEMBLY
4613 case 'i':
4614 request_dump (filedata, DISASS_DUMP);
4615 break;
4616 #endif
4617 case 'v':
4618 print_version (program_name);
4619 break;
4620 case 'V':
4621 do_version = TRUE;
4622 break;
4623 case 'W':
4624 do_wide = TRUE;
4625 break;
4626 default:
4627 /* xgettext:c-format */
4628 error (_("Invalid option '-%c'\n"), c);
4629 /* Fall through. */
4630 case '?':
4631 usage (stderr);
4632 }
4633 }
4634
4635 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
4636 && !do_segments && !do_header && !do_dump && !do_version
4637 && !do_histogram && !do_debugging && !do_arch && !do_notes
4638 && !do_section_groups && !do_archive_index
4639 && !do_dyn_syms)
4640 usage (stderr);
4641 }
4642
4643 static const char *
4644 get_elf_class (unsigned int elf_class)
4645 {
4646 static char buff[32];
4647
4648 switch (elf_class)
4649 {
4650 case ELFCLASSNONE: return _("none");
4651 case ELFCLASS32: return "ELF32";
4652 case ELFCLASS64: return "ELF64";
4653 default:
4654 snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
4655 return buff;
4656 }
4657 }
4658
4659 static const char *
4660 get_data_encoding (unsigned int encoding)
4661 {
4662 static char buff[32];
4663
4664 switch (encoding)
4665 {
4666 case ELFDATANONE: return _("none");
4667 case ELFDATA2LSB: return _("2's complement, little endian");
4668 case ELFDATA2MSB: return _("2's complement, big endian");
4669 default:
4670 snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
4671 return buff;
4672 }
4673 }
4674
4675 /* Decode the data held in 'filedata->file_header'. */
4676
4677 static bfd_boolean
4678 process_file_header (Filedata * filedata)
4679 {
4680 Elf_Internal_Ehdr * header = & filedata->file_header;
4681
4682 if ( header->e_ident[EI_MAG0] != ELFMAG0
4683 || header->e_ident[EI_MAG1] != ELFMAG1
4684 || header->e_ident[EI_MAG2] != ELFMAG2
4685 || header->e_ident[EI_MAG3] != ELFMAG3)
4686 {
4687 error
4688 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4689 return FALSE;
4690 }
4691
4692 init_dwarf_regnames (header->e_machine);
4693
4694 if (do_header)
4695 {
4696 unsigned i;
4697
4698 printf (_("ELF Header:\n"));
4699 printf (_(" Magic: "));
4700 for (i = 0; i < EI_NIDENT; i++)
4701 printf ("%2.2x ", header->e_ident[i]);
4702 printf ("\n");
4703 printf (_(" Class: %s\n"),
4704 get_elf_class (header->e_ident[EI_CLASS]));
4705 printf (_(" Data: %s\n"),
4706 get_data_encoding (header->e_ident[EI_DATA]));
4707 printf (_(" Version: %d %s\n"),
4708 header->e_ident[EI_VERSION],
4709 (header->e_ident[EI_VERSION] == EV_CURRENT
4710 ? "(current)"
4711 : (header->e_ident[EI_VERSION] != EV_NONE
4712 ? _("<unknown: %lx>")
4713 : "")));
4714 printf (_(" OS/ABI: %s\n"),
4715 get_osabi_name (filedata, header->e_ident[EI_OSABI]));
4716 printf (_(" ABI Version: %d\n"),
4717 header->e_ident[EI_ABIVERSION]);
4718 printf (_(" Type: %s\n"),
4719 get_file_type (header->e_type));
4720 printf (_(" Machine: %s\n"),
4721 get_machine_name (header->e_machine));
4722 printf (_(" Version: 0x%lx\n"),
4723 (unsigned long) header->e_version);
4724
4725 printf (_(" Entry point address: "));
4726 print_vma ((bfd_vma) header->e_entry, PREFIX_HEX);
4727 printf (_("\n Start of program headers: "));
4728 print_vma ((bfd_vma) header->e_phoff, DEC);
4729 printf (_(" (bytes into file)\n Start of section headers: "));
4730 print_vma ((bfd_vma) header->e_shoff, DEC);
4731 printf (_(" (bytes into file)\n"));
4732
4733 printf (_(" Flags: 0x%lx%s\n"),
4734 (unsigned long) header->e_flags,
4735 get_machine_flags (filedata, header->e_flags, header->e_machine));
4736 printf (_(" Size of this header: %ld (bytes)\n"),
4737 (long) header->e_ehsize);
4738 printf (_(" Size of program headers: %ld (bytes)\n"),
4739 (long) header->e_phentsize);
4740 printf (_(" Number of program headers: %ld"),
4741 (long) header->e_phnum);
4742 if (filedata->section_headers != NULL
4743 && header->e_phnum == PN_XNUM
4744 && filedata->section_headers[0].sh_info != 0)
4745 printf (" (%ld)", (long) filedata->section_headers[0].sh_info);
4746 putc ('\n', stdout);
4747 printf (_(" Size of section headers: %ld (bytes)\n"),
4748 (long) header->e_shentsize);
4749 printf (_(" Number of section headers: %ld"),
4750 (long) header->e_shnum);
4751 if (filedata->section_headers != NULL && header->e_shnum == SHN_UNDEF)
4752 printf (" (%ld)", (long) filedata->section_headers[0].sh_size);
4753 putc ('\n', stdout);
4754 printf (_(" Section header string table index: %ld"),
4755 (long) header->e_shstrndx);
4756 if (filedata->section_headers != NULL
4757 && header->e_shstrndx == (SHN_XINDEX & 0xffff))
4758 printf (" (%u)", filedata->section_headers[0].sh_link);
4759 else if (header->e_shstrndx != SHN_UNDEF
4760 && header->e_shstrndx >= header->e_shnum)
4761 printf (_(" <corrupt: out of range>"));
4762 putc ('\n', stdout);
4763 }
4764
4765 if (filedata->section_headers != NULL)
4766 {
4767 if (header->e_phnum == PN_XNUM
4768 && filedata->section_headers[0].sh_info != 0)
4769 header->e_phnum = filedata->section_headers[0].sh_info;
4770 if (header->e_shnum == SHN_UNDEF)
4771 header->e_shnum = filedata->section_headers[0].sh_size;
4772 if (header->e_shstrndx == (SHN_XINDEX & 0xffff))
4773 header->e_shstrndx = filedata->section_headers[0].sh_link;
4774 if (header->e_shstrndx >= header->e_shnum)
4775 header->e_shstrndx = SHN_UNDEF;
4776 free (filedata->section_headers);
4777 filedata->section_headers = NULL;
4778 }
4779
4780 return TRUE;
4781 }
4782
4783 /* Read in the program headers from FILEDATA and store them in PHEADERS.
4784 Returns TRUE upon success, FALSE otherwise. Loads 32-bit headers. */
4785
4786 static bfd_boolean
4787 get_32bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
4788 {
4789 Elf32_External_Phdr * phdrs;
4790 Elf32_External_Phdr * external;
4791 Elf_Internal_Phdr * internal;
4792 unsigned int i;
4793 unsigned int size = filedata->file_header.e_phentsize;
4794 unsigned int num = filedata->file_header.e_phnum;
4795
4796 /* PR binutils/17531: Cope with unexpected section header sizes. */
4797 if (size == 0 || num == 0)
4798 return FALSE;
4799 if (size < sizeof * phdrs)
4800 {
4801 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4802 return FALSE;
4803 }
4804 if (size > sizeof * phdrs)
4805 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4806
4807 phdrs = (Elf32_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
4808 size, num, _("program headers"));
4809 if (phdrs == NULL)
4810 return FALSE;
4811
4812 for (i = 0, internal = pheaders, external = phdrs;
4813 i < filedata->file_header.e_phnum;
4814 i++, internal++, external++)
4815 {
4816 internal->p_type = BYTE_GET (external->p_type);
4817 internal->p_offset = BYTE_GET (external->p_offset);
4818 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4819 internal->p_paddr = BYTE_GET (external->p_paddr);
4820 internal->p_filesz = BYTE_GET (external->p_filesz);
4821 internal->p_memsz = BYTE_GET (external->p_memsz);
4822 internal->p_flags = BYTE_GET (external->p_flags);
4823 internal->p_align = BYTE_GET (external->p_align);
4824 }
4825
4826 free (phdrs);
4827 return TRUE;
4828 }
4829
4830 /* Read in the program headers from FILEDATA and store them in PHEADERS.
4831 Returns TRUE upon success, FALSE otherwise. Loads 64-bit headers. */
4832
4833 static bfd_boolean
4834 get_64bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
4835 {
4836 Elf64_External_Phdr * phdrs;
4837 Elf64_External_Phdr * external;
4838 Elf_Internal_Phdr * internal;
4839 unsigned int i;
4840 unsigned int size = filedata->file_header.e_phentsize;
4841 unsigned int num = filedata->file_header.e_phnum;
4842
4843 /* PR binutils/17531: Cope with unexpected section header sizes. */
4844 if (size == 0 || num == 0)
4845 return FALSE;
4846 if (size < sizeof * phdrs)
4847 {
4848 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4849 return FALSE;
4850 }
4851 if (size > sizeof * phdrs)
4852 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4853
4854 phdrs = (Elf64_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
4855 size, num, _("program headers"));
4856 if (!phdrs)
4857 return FALSE;
4858
4859 for (i = 0, internal = pheaders, external = phdrs;
4860 i < filedata->file_header.e_phnum;
4861 i++, internal++, external++)
4862 {
4863 internal->p_type = BYTE_GET (external->p_type);
4864 internal->p_flags = BYTE_GET (external->p_flags);
4865 internal->p_offset = BYTE_GET (external->p_offset);
4866 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4867 internal->p_paddr = BYTE_GET (external->p_paddr);
4868 internal->p_filesz = BYTE_GET (external->p_filesz);
4869 internal->p_memsz = BYTE_GET (external->p_memsz);
4870 internal->p_align = BYTE_GET (external->p_align);
4871 }
4872
4873 free (phdrs);
4874 return TRUE;
4875 }
4876
4877 /* Returns TRUE if the program headers were read into `program_headers'. */
4878
4879 static bfd_boolean
4880 get_program_headers (Filedata * filedata)
4881 {
4882 Elf_Internal_Phdr * phdrs;
4883
4884 /* Check cache of prior read. */
4885 if (filedata->program_headers != NULL)
4886 return TRUE;
4887
4888 /* Be kind to memory checkers by looking for
4889 e_phnum values which we know must be invalid. */
4890 if (filedata->file_header.e_phnum
4891 * (is_32bit_elf ? sizeof (Elf32_External_Phdr) : sizeof (Elf64_External_Phdr))
4892 >= filedata->file_size)
4893 {
4894 error (_("Too many program headers - %#x - the file is not that big\n"),
4895 filedata->file_header.e_phnum);
4896 return FALSE;
4897 }
4898
4899 phdrs = (Elf_Internal_Phdr *) cmalloc (filedata->file_header.e_phnum,
4900 sizeof (Elf_Internal_Phdr));
4901 if (phdrs == NULL)
4902 {
4903 error (_("Out of memory reading %u program headers\n"),
4904 filedata->file_header.e_phnum);
4905 return FALSE;
4906 }
4907
4908 if (is_32bit_elf
4909 ? get_32bit_program_headers (filedata, phdrs)
4910 : get_64bit_program_headers (filedata, phdrs))
4911 {
4912 filedata->program_headers = phdrs;
4913 return TRUE;
4914 }
4915
4916 free (phdrs);
4917 return FALSE;
4918 }
4919
4920 /* Returns TRUE if the program headers were loaded. */
4921
4922 static bfd_boolean
4923 process_program_headers (Filedata * filedata)
4924 {
4925 Elf_Internal_Phdr * segment;
4926 unsigned int i;
4927 Elf_Internal_Phdr * previous_load = NULL;
4928
4929 if (filedata->file_header.e_phnum == 0)
4930 {
4931 /* PR binutils/12467. */
4932 if (filedata->file_header.e_phoff != 0)
4933 {
4934 warn (_("possibly corrupt ELF header - it has a non-zero program"
4935 " header offset, but no program headers\n"));
4936 return FALSE;
4937 }
4938 else if (do_segments)
4939 printf (_("\nThere are no program headers in this file.\n"));
4940 return TRUE;
4941 }
4942
4943 if (do_segments && !do_header)
4944 {
4945 printf (_("\nElf file type is %s\n"), get_file_type (filedata->file_header.e_type));
4946 printf (_("Entry point 0x%s\n"), bfd_vmatoa ("x", filedata->file_header.e_entry));
4947 printf (ngettext ("There is %d program header, starting at offset %s\n",
4948 "There are %d program headers, starting at offset %s\n",
4949 filedata->file_header.e_phnum),
4950 filedata->file_header.e_phnum,
4951 bfd_vmatoa ("u", filedata->file_header.e_phoff));
4952 }
4953
4954 if (! get_program_headers (filedata))
4955 return TRUE;
4956
4957 if (do_segments)
4958 {
4959 if (filedata->file_header.e_phnum > 1)
4960 printf (_("\nProgram Headers:\n"));
4961 else
4962 printf (_("\nProgram Headers:\n"));
4963
4964 if (is_32bit_elf)
4965 printf
4966 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
4967 else if (do_wide)
4968 printf
4969 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
4970 else
4971 {
4972 printf
4973 (_(" Type Offset VirtAddr PhysAddr\n"));
4974 printf
4975 (_(" FileSiz MemSiz Flags Align\n"));
4976 }
4977 }
4978
4979 dynamic_addr = 0;
4980 dynamic_size = 0;
4981
4982 for (i = 0, segment = filedata->program_headers;
4983 i < filedata->file_header.e_phnum;
4984 i++, segment++)
4985 {
4986 if (do_segments)
4987 {
4988 printf (" %-14.14s ", get_segment_type (filedata, segment->p_type));
4989
4990 if (is_32bit_elf)
4991 {
4992 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4993 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
4994 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
4995 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
4996 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
4997 printf ("%c%c%c ",
4998 (segment->p_flags & PF_R ? 'R' : ' '),
4999 (segment->p_flags & PF_W ? 'W' : ' '),
5000 (segment->p_flags & PF_X ? 'E' : ' '));
5001 printf ("%#lx", (unsigned long) segment->p_align);
5002 }
5003 else if (do_wide)
5004 {
5005 if ((unsigned long) segment->p_offset == segment->p_offset)
5006 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
5007 else
5008 {
5009 print_vma (segment->p_offset, FULL_HEX);
5010 putchar (' ');
5011 }
5012
5013 print_vma (segment->p_vaddr, FULL_HEX);
5014 putchar (' ');
5015 print_vma (segment->p_paddr, FULL_HEX);
5016 putchar (' ');
5017
5018 if ((unsigned long) segment->p_filesz == segment->p_filesz)
5019 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
5020 else
5021 {
5022 print_vma (segment->p_filesz, FULL_HEX);
5023 putchar (' ');
5024 }
5025
5026 if ((unsigned long) segment->p_memsz == segment->p_memsz)
5027 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
5028 else
5029 {
5030 print_vma (segment->p_memsz, FULL_HEX);
5031 }
5032
5033 printf (" %c%c%c ",
5034 (segment->p_flags & PF_R ? 'R' : ' '),
5035 (segment->p_flags & PF_W ? 'W' : ' '),
5036 (segment->p_flags & PF_X ? 'E' : ' '));
5037
5038 if ((unsigned long) segment->p_align == segment->p_align)
5039 printf ("%#lx", (unsigned long) segment->p_align);
5040 else
5041 {
5042 print_vma (segment->p_align, PREFIX_HEX);
5043 }
5044 }
5045 else
5046 {
5047 print_vma (segment->p_offset, FULL_HEX);
5048 putchar (' ');
5049 print_vma (segment->p_vaddr, FULL_HEX);
5050 putchar (' ');
5051 print_vma (segment->p_paddr, FULL_HEX);
5052 printf ("\n ");
5053 print_vma (segment->p_filesz, FULL_HEX);
5054 putchar (' ');
5055 print_vma (segment->p_memsz, FULL_HEX);
5056 printf (" %c%c%c ",
5057 (segment->p_flags & PF_R ? 'R' : ' '),
5058 (segment->p_flags & PF_W ? 'W' : ' '),
5059 (segment->p_flags & PF_X ? 'E' : ' '));
5060 print_vma (segment->p_align, PREFIX_HEX);
5061 }
5062
5063 putc ('\n', stdout);
5064 }
5065
5066 switch (segment->p_type)
5067 {
5068 case PT_LOAD:
5069 #if 0 /* Do not warn about out of order PT_LOAD segments. Although officially
5070 required by the ELF standard, several programs, including the Linux
5071 kernel, make use of non-ordered segments. */
5072 if (previous_load
5073 && previous_load->p_vaddr > segment->p_vaddr)
5074 error (_("LOAD segments must be sorted in order of increasing VirtAddr\n"));
5075 #endif
5076 if (segment->p_memsz < segment->p_filesz)
5077 error (_("the segment's file size is larger than its memory size\n"));
5078 previous_load = segment;
5079 break;
5080
5081 case PT_PHDR:
5082 /* PR 20815 - Verify that the program header is loaded into memory. */
5083 if (i > 0 && previous_load != NULL)
5084 error (_("the PHDR segment must occur before any LOAD segment\n"));
5085 if (filedata->file_header.e_machine != EM_PARISC)
5086 {
5087 unsigned int j;
5088
5089 for (j = 1; j < filedata->file_header.e_phnum; j++)
5090 if (filedata->program_headers[j].p_vaddr <= segment->p_vaddr
5091 && (filedata->program_headers[j].p_vaddr
5092 + filedata->program_headers[j].p_memsz)
5093 >= (segment->p_vaddr + segment->p_filesz))
5094 break;
5095 if (j == filedata->file_header.e_phnum)
5096 error (_("the PHDR segment is not covered by a LOAD segment\n"));
5097 }
5098 break;
5099
5100 case PT_DYNAMIC:
5101 if (dynamic_addr)
5102 error (_("more than one dynamic segment\n"));
5103
5104 /* By default, assume that the .dynamic section is the first
5105 section in the DYNAMIC segment. */
5106 dynamic_addr = segment->p_offset;
5107 dynamic_size = segment->p_filesz;
5108
5109 /* Try to locate the .dynamic section. If there is
5110 a section header table, we can easily locate it. */
5111 if (filedata->section_headers != NULL)
5112 {
5113 Elf_Internal_Shdr * sec;
5114
5115 sec = find_section (filedata, ".dynamic");
5116 if (sec == NULL || sec->sh_size == 0)
5117 {
5118 /* A corresponding .dynamic section is expected, but on
5119 IA-64/OpenVMS it is OK for it to be missing. */
5120 if (!is_ia64_vms (filedata))
5121 error (_("no .dynamic section in the dynamic segment\n"));
5122 break;
5123 }
5124
5125 if (sec->sh_type == SHT_NOBITS)
5126 {
5127 dynamic_size = 0;
5128 break;
5129 }
5130
5131 dynamic_addr = sec->sh_offset;
5132 dynamic_size = sec->sh_size;
5133
5134 if (dynamic_addr < segment->p_offset
5135 || dynamic_addr > segment->p_offset + segment->p_filesz)
5136 warn (_("the .dynamic section is not contained"
5137 " within the dynamic segment\n"));
5138 else if (dynamic_addr > segment->p_offset)
5139 warn (_("the .dynamic section is not the first section"
5140 " in the dynamic segment.\n"));
5141 }
5142
5143 /* PR binutils/17512: Avoid corrupt dynamic section info in the
5144 segment. Check this after matching against the section headers
5145 so we don't warn on debuginfo file (which have NOBITS .dynamic
5146 sections). */
5147 if (dynamic_addr + dynamic_size >= filedata->file_size)
5148 {
5149 error (_("the dynamic segment offset + size exceeds the size of the file\n"));
5150 dynamic_addr = dynamic_size = 0;
5151 }
5152 break;
5153
5154 case PT_INTERP:
5155 if (fseek (filedata->handle, archive_file_offset + (long) segment->p_offset,
5156 SEEK_SET))
5157 error (_("Unable to find program interpreter name\n"));
5158 else
5159 {
5160 char fmt [32];
5161 int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
5162
5163 if (ret >= (int) sizeof (fmt) || ret < 0)
5164 error (_("Internal error: failed to create format string to display program interpreter\n"));
5165
5166 program_interpreter[0] = 0;
5167 if (fscanf (filedata->handle, fmt, program_interpreter) <= 0)
5168 error (_("Unable to read program interpreter name\n"));
5169
5170 if (do_segments)
5171 printf (_(" [Requesting program interpreter: %s]\n"),
5172 program_interpreter);
5173 }
5174 break;
5175 }
5176 }
5177
5178 if (do_segments
5179 && filedata->section_headers != NULL
5180 && filedata->string_table != NULL)
5181 {
5182 printf (_("\n Section to Segment mapping:\n"));
5183 printf (_(" Segment Sections...\n"));
5184
5185 for (i = 0; i < filedata->file_header.e_phnum; i++)
5186 {
5187 unsigned int j;
5188 Elf_Internal_Shdr * section;
5189
5190 segment = filedata->program_headers + i;
5191 section = filedata->section_headers + 1;
5192
5193 printf (" %2.2d ", i);
5194
5195 for (j = 1; j < filedata->file_header.e_shnum; j++, section++)
5196 {
5197 if (!ELF_TBSS_SPECIAL (section, segment)
5198 && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
5199 printf ("%s ", printable_section_name (filedata, section));
5200 }
5201
5202 putc ('\n',stdout);
5203 }
5204 }
5205
5206 return TRUE;
5207 }
5208
5209
5210 /* Find the file offset corresponding to VMA by using the program headers. */
5211
5212 static long
5213 offset_from_vma (Filedata * filedata, bfd_vma vma, bfd_size_type size)
5214 {
5215 Elf_Internal_Phdr * seg;
5216
5217 if (! get_program_headers (filedata))
5218 {
5219 warn (_("Cannot interpret virtual addresses without program headers.\n"));
5220 return (long) vma;
5221 }
5222
5223 for (seg = filedata->program_headers;
5224 seg < filedata->program_headers + filedata->file_header.e_phnum;
5225 ++seg)
5226 {
5227 if (seg->p_type != PT_LOAD)
5228 continue;
5229
5230 if (vma >= (seg->p_vaddr & -seg->p_align)
5231 && vma + size <= seg->p_vaddr + seg->p_filesz)
5232 return vma - seg->p_vaddr + seg->p_offset;
5233 }
5234
5235 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
5236 (unsigned long) vma);
5237 return (long) vma;
5238 }
5239
5240
5241 /* Allocate memory and load the sections headers into FILEDATA->filedata->section_headers.
5242 If PROBE is true, this is just a probe and we do not generate any error
5243 messages if the load fails. */
5244
5245 static bfd_boolean
5246 get_32bit_section_headers (Filedata * filedata, bfd_boolean probe)
5247 {
5248 Elf32_External_Shdr * shdrs;
5249 Elf_Internal_Shdr * internal;
5250 unsigned int i;
5251 unsigned int size = filedata->file_header.e_shentsize;
5252 unsigned int num = probe ? 1 : filedata->file_header.e_shnum;
5253
5254 /* PR binutils/17531: Cope with unexpected section header sizes. */
5255 if (size == 0 || num == 0)
5256 return FALSE;
5257 if (size < sizeof * shdrs)
5258 {
5259 if (! probe)
5260 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5261 return FALSE;
5262 }
5263 if (!probe && size > sizeof * shdrs)
5264 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5265
5266 shdrs = (Elf32_External_Shdr *) get_data (NULL, filedata, filedata->file_header.e_shoff,
5267 size, num,
5268 probe ? NULL : _("section headers"));
5269 if (shdrs == NULL)
5270 return FALSE;
5271
5272 free (filedata->section_headers);
5273 filedata->section_headers = (Elf_Internal_Shdr *)
5274 cmalloc (num, sizeof (Elf_Internal_Shdr));
5275 if (filedata->section_headers == NULL)
5276 {
5277 if (!probe)
5278 error (_("Out of memory reading %u section headers\n"), num);
5279 return FALSE;
5280 }
5281
5282 for (i = 0, internal = filedata->section_headers;
5283 i < num;
5284 i++, internal++)
5285 {
5286 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5287 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
5288 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5289 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5290 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5291 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5292 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5293 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5294 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5295 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
5296 if (!probe && internal->sh_link > num)
5297 warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5298 if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5299 warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5300 }
5301
5302 free (shdrs);
5303 return TRUE;
5304 }
5305
5306 /* Like get_32bit_section_headers, except that it fetches 64-bit headers. */
5307
5308 static bfd_boolean
5309 get_64bit_section_headers (Filedata * filedata, bfd_boolean probe)
5310 {
5311 Elf64_External_Shdr * shdrs;
5312 Elf_Internal_Shdr * internal;
5313 unsigned int i;
5314 unsigned int size = filedata->file_header.e_shentsize;
5315 unsigned int num = probe ? 1 : filedata->file_header.e_shnum;
5316
5317 /* PR binutils/17531: Cope with unexpected section header sizes. */
5318 if (size == 0 || num == 0)
5319 return FALSE;
5320
5321 if (size < sizeof * shdrs)
5322 {
5323 if (! probe)
5324 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5325 return FALSE;
5326 }
5327
5328 if (! probe && size > sizeof * shdrs)
5329 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5330
5331 shdrs = (Elf64_External_Shdr *) get_data (NULL, filedata,
5332 filedata->file_header.e_shoff,
5333 size, num,
5334 probe ? NULL : _("section headers"));
5335 if (shdrs == NULL)
5336 return FALSE;
5337
5338 free (filedata->section_headers);
5339 filedata->section_headers = (Elf_Internal_Shdr *)
5340 cmalloc (num, sizeof (Elf_Internal_Shdr));
5341 if (filedata->section_headers == NULL)
5342 {
5343 if (! probe)
5344 error (_("Out of memory reading %u section headers\n"), num);
5345 return FALSE;
5346 }
5347
5348 for (i = 0, internal = filedata->section_headers;
5349 i < num;
5350 i++, internal++)
5351 {
5352 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5353 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
5354 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5355 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5356 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5357 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
5358 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5359 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5360 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5361 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5362 if (!probe && internal->sh_link > num)
5363 warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5364 if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5365 warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5366 }
5367
5368 free (shdrs);
5369 return TRUE;
5370 }
5371
5372 static Elf_Internal_Sym *
5373 get_32bit_elf_symbols (Filedata * filedata,
5374 Elf_Internal_Shdr * section,
5375 unsigned long * num_syms_return)
5376 {
5377 unsigned long number = 0;
5378 Elf32_External_Sym * esyms = NULL;
5379 Elf_External_Sym_Shndx * shndx = NULL;
5380 Elf_Internal_Sym * isyms = NULL;
5381 Elf_Internal_Sym * psym;
5382 unsigned int j;
5383
5384 if (section->sh_size == 0)
5385 {
5386 if (num_syms_return != NULL)
5387 * num_syms_return = 0;
5388 return NULL;
5389 }
5390
5391 /* Run some sanity checks first. */
5392 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5393 {
5394 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5395 printable_section_name (filedata, section),
5396 (unsigned long) section->sh_entsize);
5397 goto exit_point;
5398 }
5399
5400 if (section->sh_size > filedata->file_size)
5401 {
5402 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5403 printable_section_name (filedata, section),
5404 (unsigned long) section->sh_size);
5405 goto exit_point;
5406 }
5407
5408 number = section->sh_size / section->sh_entsize;
5409
5410 if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
5411 {
5412 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5413 (unsigned long) section->sh_size,
5414 printable_section_name (filedata, section),
5415 (unsigned long) section->sh_entsize);
5416 goto exit_point;
5417 }
5418
5419 esyms = (Elf32_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
5420 section->sh_size, _("symbols"));
5421 if (esyms == NULL)
5422 goto exit_point;
5423
5424 {
5425 elf_section_list * entry;
5426
5427 shndx = NULL;
5428 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5429 if (entry->hdr->sh_link == (unsigned long) (section - filedata->section_headers))
5430 {
5431 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
5432 entry->hdr->sh_offset,
5433 1, entry->hdr->sh_size,
5434 _("symbol table section indicies"));
5435 if (shndx == NULL)
5436 goto exit_point;
5437 /* PR17531: file: heap-buffer-overflow */
5438 else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5439 {
5440 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5441 printable_section_name (filedata, entry->hdr),
5442 (unsigned long) entry->hdr->sh_size,
5443 (unsigned long) section->sh_size);
5444 goto exit_point;
5445 }
5446 }
5447 }
5448
5449 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5450
5451 if (isyms == NULL)
5452 {
5453 error (_("Out of memory reading %lu symbols\n"),
5454 (unsigned long) number);
5455 goto exit_point;
5456 }
5457
5458 for (j = 0, psym = isyms; j < number; j++, psym++)
5459 {
5460 psym->st_name = BYTE_GET (esyms[j].st_name);
5461 psym->st_value = BYTE_GET (esyms[j].st_value);
5462 psym->st_size = BYTE_GET (esyms[j].st_size);
5463 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5464 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5465 psym->st_shndx
5466 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5467 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5468 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5469 psym->st_info = BYTE_GET (esyms[j].st_info);
5470 psym->st_other = BYTE_GET (esyms[j].st_other);
5471 }
5472
5473 exit_point:
5474 if (shndx != NULL)
5475 free (shndx);
5476 if (esyms != NULL)
5477 free (esyms);
5478
5479 if (num_syms_return != NULL)
5480 * num_syms_return = isyms == NULL ? 0 : number;
5481
5482 return isyms;
5483 }
5484
5485 static Elf_Internal_Sym *
5486 get_64bit_elf_symbols (Filedata * filedata,
5487 Elf_Internal_Shdr * section,
5488 unsigned long * num_syms_return)
5489 {
5490 unsigned long number = 0;
5491 Elf64_External_Sym * esyms = NULL;
5492 Elf_External_Sym_Shndx * shndx = NULL;
5493 Elf_Internal_Sym * isyms = NULL;
5494 Elf_Internal_Sym * psym;
5495 unsigned int j;
5496
5497 if (section->sh_size == 0)
5498 {
5499 if (num_syms_return != NULL)
5500 * num_syms_return = 0;
5501 return NULL;
5502 }
5503
5504 /* Run some sanity checks first. */
5505 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5506 {
5507 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5508 printable_section_name (filedata, section),
5509 (unsigned long) section->sh_entsize);
5510 goto exit_point;
5511 }
5512
5513 if (section->sh_size > filedata->file_size)
5514 {
5515 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5516 printable_section_name (filedata, section),
5517 (unsigned long) section->sh_size);
5518 goto exit_point;
5519 }
5520
5521 number = section->sh_size / section->sh_entsize;
5522
5523 if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5524 {
5525 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5526 (unsigned long) section->sh_size,
5527 printable_section_name (filedata, section),
5528 (unsigned long) section->sh_entsize);
5529 goto exit_point;
5530 }
5531
5532 esyms = (Elf64_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
5533 section->sh_size, _("symbols"));
5534 if (!esyms)
5535 goto exit_point;
5536
5537 {
5538 elf_section_list * entry;
5539
5540 shndx = NULL;
5541 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5542 if (entry->hdr->sh_link == (unsigned long) (section - filedata->section_headers))
5543 {
5544 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
5545 entry->hdr->sh_offset,
5546 1, entry->hdr->sh_size,
5547 _("symbol table section indicies"));
5548 if (shndx == NULL)
5549 goto exit_point;
5550 /* PR17531: file: heap-buffer-overflow */
5551 else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5552 {
5553 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5554 printable_section_name (filedata, entry->hdr),
5555 (unsigned long) entry->hdr->sh_size,
5556 (unsigned long) section->sh_size);
5557 goto exit_point;
5558 }
5559 }
5560 }
5561
5562 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5563
5564 if (isyms == NULL)
5565 {
5566 error (_("Out of memory reading %lu symbols\n"),
5567 (unsigned long) number);
5568 goto exit_point;
5569 }
5570
5571 for (j = 0, psym = isyms; j < number; j++, psym++)
5572 {
5573 psym->st_name = BYTE_GET (esyms[j].st_name);
5574 psym->st_info = BYTE_GET (esyms[j].st_info);
5575 psym->st_other = BYTE_GET (esyms[j].st_other);
5576 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5577
5578 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5579 psym->st_shndx
5580 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5581 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5582 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5583
5584 psym->st_value = BYTE_GET (esyms[j].st_value);
5585 psym->st_size = BYTE_GET (esyms[j].st_size);
5586 }
5587
5588 exit_point:
5589 if (shndx != NULL)
5590 free (shndx);
5591 if (esyms != NULL)
5592 free (esyms);
5593
5594 if (num_syms_return != NULL)
5595 * num_syms_return = isyms == NULL ? 0 : number;
5596
5597 return isyms;
5598 }
5599
5600 static const char *
5601 get_elf_section_flags (Filedata * filedata, bfd_vma sh_flags)
5602 {
5603 static char buff[1024];
5604 char * p = buff;
5605 unsigned int field_size = is_32bit_elf ? 8 : 16;
5606 signed int sindex;
5607 unsigned int size = sizeof (buff) - (field_size + 4 + 1);
5608 bfd_vma os_flags = 0;
5609 bfd_vma proc_flags = 0;
5610 bfd_vma unknown_flags = 0;
5611 static const struct
5612 {
5613 const char * str;
5614 unsigned int len;
5615 }
5616 flags [] =
5617 {
5618 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
5619 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
5620 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
5621 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
5622 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
5623 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
5624 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5625 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5626 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
5627 /* 9 */ { STRING_COMMA_LEN ("TLS") },
5628 /* IA-64 specific. */
5629 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5630 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5631 /* IA-64 OpenVMS specific. */
5632 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5633 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5634 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5635 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5636 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5637 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
5638 /* Generic. */
5639 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
5640 /* SPARC specific. */
5641 /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
5642 /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5643 /* ARM specific. */
5644 /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
5645 /* 22 */ { STRING_COMMA_LEN ("ARM_PURECODE") },
5646 /* 23 */ { STRING_COMMA_LEN ("COMDEF") },
5647 /* GNU specific. */
5648 /* 24 */ { STRING_COMMA_LEN ("GNU_MBIND") },
5649 /* VLE specific. */
5650 /* 25 */ { STRING_COMMA_LEN ("VLE") },
5651 };
5652
5653 if (do_section_details)
5654 {
5655 sprintf (buff, "[%*.*lx]: ",
5656 field_size, field_size, (unsigned long) sh_flags);
5657 p += field_size + 4;
5658 }
5659
5660 while (sh_flags)
5661 {
5662 bfd_vma flag;
5663
5664 flag = sh_flags & - sh_flags;
5665 sh_flags &= ~ flag;
5666
5667 if (do_section_details)
5668 {
5669 switch (flag)
5670 {
5671 case SHF_WRITE: sindex = 0; break;
5672 case SHF_ALLOC: sindex = 1; break;
5673 case SHF_EXECINSTR: sindex = 2; break;
5674 case SHF_MERGE: sindex = 3; break;
5675 case SHF_STRINGS: sindex = 4; break;
5676 case SHF_INFO_LINK: sindex = 5; break;
5677 case SHF_LINK_ORDER: sindex = 6; break;
5678 case SHF_OS_NONCONFORMING: sindex = 7; break;
5679 case SHF_GROUP: sindex = 8; break;
5680 case SHF_TLS: sindex = 9; break;
5681 case SHF_EXCLUDE: sindex = 18; break;
5682 case SHF_COMPRESSED: sindex = 20; break;
5683 case SHF_GNU_MBIND: sindex = 24; break;
5684
5685 default:
5686 sindex = -1;
5687 switch (filedata->file_header.e_machine)
5688 {
5689 case EM_IA_64:
5690 if (flag == SHF_IA_64_SHORT)
5691 sindex = 10;
5692 else if (flag == SHF_IA_64_NORECOV)
5693 sindex = 11;
5694 #ifdef BFD64
5695 else if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5696 switch (flag)
5697 {
5698 case SHF_IA_64_VMS_GLOBAL: sindex = 12; break;
5699 case SHF_IA_64_VMS_OVERLAID: sindex = 13; break;
5700 case SHF_IA_64_VMS_SHARED: sindex = 14; break;
5701 case SHF_IA_64_VMS_VECTOR: sindex = 15; break;
5702 case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5703 case SHF_IA_64_VMS_PROTECTED: sindex = 17; break;
5704 default: break;
5705 }
5706 #endif
5707 break;
5708
5709 case EM_386:
5710 case EM_IAMCU:
5711 case EM_X86_64:
5712 case EM_L1OM:
5713 case EM_K1OM:
5714 case EM_OLD_SPARCV9:
5715 case EM_SPARC32PLUS:
5716 case EM_SPARCV9:
5717 case EM_SPARC:
5718 if (flag == SHF_ORDERED)
5719 sindex = 19;
5720 break;
5721
5722 case EM_ARM:
5723 switch (flag)
5724 {
5725 case SHF_ENTRYSECT: sindex = 21; break;
5726 case SHF_ARM_PURECODE: sindex = 22; break;
5727 case SHF_COMDEF: sindex = 23; break;
5728 default: break;
5729 }
5730 break;
5731 case EM_PPC:
5732 if (flag == SHF_PPC_VLE)
5733 sindex = 25;
5734 break;
5735
5736 default:
5737 break;
5738 }
5739 }
5740
5741 if (sindex != -1)
5742 {
5743 if (p != buff + field_size + 4)
5744 {
5745 if (size < (10 + 2))
5746 {
5747 warn (_("Internal error: not enough buffer room for section flag info"));
5748 return _("<unknown>");
5749 }
5750 size -= 2;
5751 *p++ = ',';
5752 *p++ = ' ';
5753 }
5754
5755 size -= flags [sindex].len;
5756 p = stpcpy (p, flags [sindex].str);
5757 }
5758 else if (flag & SHF_MASKOS)
5759 os_flags |= flag;
5760 else if (flag & SHF_MASKPROC)
5761 proc_flags |= flag;
5762 else
5763 unknown_flags |= flag;
5764 }
5765 else
5766 {
5767 switch (flag)
5768 {
5769 case SHF_WRITE: *p = 'W'; break;
5770 case SHF_ALLOC: *p = 'A'; break;
5771 case SHF_EXECINSTR: *p = 'X'; break;
5772 case SHF_MERGE: *p = 'M'; break;
5773 case SHF_STRINGS: *p = 'S'; break;
5774 case SHF_INFO_LINK: *p = 'I'; break;
5775 case SHF_LINK_ORDER: *p = 'L'; break;
5776 case SHF_OS_NONCONFORMING: *p = 'O'; break;
5777 case SHF_GROUP: *p = 'G'; break;
5778 case SHF_TLS: *p = 'T'; break;
5779 case SHF_EXCLUDE: *p = 'E'; break;
5780 case SHF_COMPRESSED: *p = 'C'; break;
5781 case SHF_GNU_MBIND: *p = 'D'; break;
5782
5783 default:
5784 if ((filedata->file_header.e_machine == EM_X86_64
5785 || filedata->file_header.e_machine == EM_L1OM
5786 || filedata->file_header.e_machine == EM_K1OM)
5787 && flag == SHF_X86_64_LARGE)
5788 *p = 'l';
5789 else if (filedata->file_header.e_machine == EM_ARM
5790 && flag == SHF_ARM_PURECODE)
5791 *p = 'y';
5792 else if (filedata->file_header.e_machine == EM_PPC
5793 && flag == SHF_PPC_VLE)
5794 *p = 'v';
5795 else if (flag & SHF_MASKOS)
5796 {
5797 *p = 'o';
5798 sh_flags &= ~ SHF_MASKOS;
5799 }
5800 else if (flag & SHF_MASKPROC)
5801 {
5802 *p = 'p';
5803 sh_flags &= ~ SHF_MASKPROC;
5804 }
5805 else
5806 *p = 'x';
5807 break;
5808 }
5809 p++;
5810 }
5811 }
5812
5813 if (do_section_details)
5814 {
5815 if (os_flags)
5816 {
5817 size -= 5 + field_size;
5818 if (p != buff + field_size + 4)
5819 {
5820 if (size < (2 + 1))
5821 {
5822 warn (_("Internal error: not enough buffer room for section flag info"));
5823 return _("<unknown>");
5824 }
5825 size -= 2;
5826 *p++ = ',';
5827 *p++ = ' ';
5828 }
5829 sprintf (p, "OS (%*.*lx)", field_size, field_size,
5830 (unsigned long) os_flags);
5831 p += 5 + field_size;
5832 }
5833 if (proc_flags)
5834 {
5835 size -= 7 + field_size;
5836 if (p != buff + field_size + 4)
5837 {
5838 if (size < (2 + 1))
5839 {
5840 warn (_("Internal error: not enough buffer room for section flag info"));
5841 return _("<unknown>");
5842 }
5843 size -= 2;
5844 *p++ = ',';
5845 *p++ = ' ';
5846 }
5847 sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5848 (unsigned long) proc_flags);
5849 p += 7 + field_size;
5850 }
5851 if (unknown_flags)
5852 {
5853 size -= 10 + field_size;
5854 if (p != buff + field_size + 4)
5855 {
5856 if (size < (2 + 1))
5857 {
5858 warn (_("Internal error: not enough buffer room for section flag info"));
5859 return _("<unknown>");
5860 }
5861 size -= 2;
5862 *p++ = ',';
5863 *p++ = ' ';
5864 }
5865 sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
5866 (unsigned long) unknown_flags);
5867 p += 10 + field_size;
5868 }
5869 }
5870
5871 *p = '\0';
5872 return buff;
5873 }
5874
5875 static unsigned int
5876 get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf, bfd_size_type size)
5877 {
5878 if (is_32bit_elf)
5879 {
5880 Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
5881
5882 if (size < sizeof (* echdr))
5883 {
5884 error (_("Compressed section is too small even for a compression header\n"));
5885 return 0;
5886 }
5887
5888 chdr->ch_type = BYTE_GET (echdr->ch_type);
5889 chdr->ch_size = BYTE_GET (echdr->ch_size);
5890 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5891 return sizeof (*echdr);
5892 }
5893 else
5894 {
5895 Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) buf;
5896
5897 if (size < sizeof (* echdr))
5898 {
5899 error (_("Compressed section is too small even for a compression header\n"));
5900 return 0;
5901 }
5902
5903 chdr->ch_type = BYTE_GET (echdr->ch_type);
5904 chdr->ch_size = BYTE_GET (echdr->ch_size);
5905 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5906 return sizeof (*echdr);
5907 }
5908 }
5909
5910 static bfd_boolean
5911 process_section_headers (Filedata * filedata)
5912 {
5913 Elf_Internal_Shdr * section;
5914 unsigned int i;
5915
5916 filedata->section_headers = NULL;
5917
5918 if (filedata->file_header.e_shnum == 0)
5919 {
5920 /* PR binutils/12467. */
5921 if (filedata->file_header.e_shoff != 0)
5922 {
5923 warn (_("possibly corrupt ELF file header - it has a non-zero"
5924 " section header offset, but no section headers\n"));
5925 return FALSE;
5926 }
5927 else if (do_sections)
5928 printf (_("\nThere are no sections in this file.\n"));
5929
5930 return TRUE;
5931 }
5932
5933 if (do_sections && !do_header)
5934 printf (ngettext ("There is %d section header, "
5935 "starting at offset 0x%lx:\n",
5936 "There are %d section headers, "
5937 "starting at offset 0x%lx:\n",
5938 filedata->file_header.e_shnum),
5939 filedata->file_header.e_shnum,
5940 (unsigned long) filedata->file_header.e_shoff);
5941
5942 if (is_32bit_elf)
5943 {
5944 if (! get_32bit_section_headers (filedata, FALSE))
5945 return FALSE;
5946 }
5947 else
5948 {
5949 if (! get_64bit_section_headers (filedata, FALSE))
5950 return FALSE;
5951 }
5952
5953 /* Read in the string table, so that we have names to display. */
5954 if (filedata->file_header.e_shstrndx != SHN_UNDEF
5955 && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
5956 {
5957 section = filedata->section_headers + filedata->file_header.e_shstrndx;
5958
5959 if (section->sh_size != 0)
5960 {
5961 filedata->string_table = (char *) get_data (NULL, filedata, section->sh_offset,
5962 1, section->sh_size,
5963 _("string table"));
5964
5965 filedata->string_table_length = filedata->string_table != NULL ? section->sh_size : 0;
5966 }
5967 }
5968
5969 /* Scan the sections for the dynamic symbol table
5970 and dynamic string table and debug sections. */
5971 dynamic_symbols = NULL;
5972 dynamic_strings = NULL;
5973 dynamic_syminfo = NULL;
5974 symtab_shndx_list = NULL;
5975
5976 eh_addr_size = is_32bit_elf ? 4 : 8;
5977 switch (filedata->file_header.e_machine)
5978 {
5979 case EM_MIPS:
5980 case EM_MIPS_RS3_LE:
5981 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
5982 FDE addresses. However, the ABI also has a semi-official ILP32
5983 variant for which the normal FDE address size rules apply.
5984
5985 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
5986 section, where XX is the size of longs in bits. Unfortunately,
5987 earlier compilers provided no way of distinguishing ILP32 objects
5988 from LP64 objects, so if there's any doubt, we should assume that
5989 the official LP64 form is being used. */
5990 if ((filedata->file_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
5991 && find_section (filedata, ".gcc_compiled_long32") == NULL)
5992 eh_addr_size = 8;
5993 break;
5994
5995 case EM_H8_300:
5996 case EM_H8_300H:
5997 switch (filedata->file_header.e_flags & EF_H8_MACH)
5998 {
5999 case E_H8_MACH_H8300:
6000 case E_H8_MACH_H8300HN:
6001 case E_H8_MACH_H8300SN:
6002 case E_H8_MACH_H8300SXN:
6003 eh_addr_size = 2;
6004 break;
6005 case E_H8_MACH_H8300H:
6006 case E_H8_MACH_H8300S:
6007 case E_H8_MACH_H8300SX:
6008 eh_addr_size = 4;
6009 break;
6010 }
6011 break;
6012
6013 case EM_M32C_OLD:
6014 case EM_M32C:
6015 switch (filedata->file_header.e_flags & EF_M32C_CPU_MASK)
6016 {
6017 case EF_M32C_CPU_M16C:
6018 eh_addr_size = 2;
6019 break;
6020 }
6021 break;
6022 }
6023
6024 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
6025 do \
6026 { \
6027 bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64; \
6028 if (section->sh_entsize != expected_entsize) \
6029 { \
6030 char buf[40]; \
6031 sprintf_vma (buf, section->sh_entsize); \
6032 /* Note: coded this way so that there is a single string for \
6033 translation. */ \
6034 error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
6035 error (_("(Using the expected size of %u for the rest of this dump)\n"), \
6036 (unsigned) expected_entsize); \
6037 section->sh_entsize = expected_entsize; \
6038 } \
6039 } \
6040 while (0)
6041
6042 #define CHECK_ENTSIZE(section, i, type) \
6043 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
6044 sizeof (Elf64_External_##type))
6045
6046 for (i = 0, section = filedata->section_headers;
6047 i < filedata->file_header.e_shnum;
6048 i++, section++)
6049 {
6050 char * name = SECTION_NAME (section);
6051
6052 if (section->sh_type == SHT_DYNSYM)
6053 {
6054 if (dynamic_symbols != NULL)
6055 {
6056 error (_("File contains multiple dynamic symbol tables\n"));
6057 continue;
6058 }
6059
6060 CHECK_ENTSIZE (section, i, Sym);
6061 dynamic_symbols = GET_ELF_SYMBOLS (filedata, section, & num_dynamic_syms);
6062 }
6063 else if (section->sh_type == SHT_STRTAB
6064 && streq (name, ".dynstr"))
6065 {
6066 if (dynamic_strings != NULL)
6067 {
6068 error (_("File contains multiple dynamic string tables\n"));
6069 continue;
6070 }
6071
6072 dynamic_strings = (char *) get_data (NULL, filedata, section->sh_offset,
6073 1, section->sh_size,
6074 _("dynamic strings"));
6075 dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
6076 }
6077 else if (section->sh_type == SHT_SYMTAB_SHNDX)
6078 {
6079 elf_section_list * entry = xmalloc (sizeof * entry);
6080
6081 entry->hdr = section;
6082 entry->next = symtab_shndx_list;
6083 symtab_shndx_list = entry;
6084 }
6085 else if (section->sh_type == SHT_SYMTAB)
6086 CHECK_ENTSIZE (section, i, Sym);
6087 else if (section->sh_type == SHT_GROUP)
6088 CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
6089 else if (section->sh_type == SHT_REL)
6090 CHECK_ENTSIZE (section, i, Rel);
6091 else if (section->sh_type == SHT_RELA)
6092 CHECK_ENTSIZE (section, i, Rela);
6093 else if ((do_debugging || do_debug_info || do_debug_abbrevs
6094 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
6095 || do_debug_aranges || do_debug_frames || do_debug_macinfo
6096 || do_debug_str || do_debug_loc || do_debug_ranges
6097 || do_debug_addr || do_debug_cu_index || do_debug_links)
6098 && (const_strneq (name, ".debug_")
6099 || const_strneq (name, ".zdebug_")))
6100 {
6101 if (name[1] == 'z')
6102 name += sizeof (".zdebug_") - 1;
6103 else
6104 name += sizeof (".debug_") - 1;
6105
6106 if (do_debugging
6107 || (do_debug_info && const_strneq (name, "info"))
6108 || (do_debug_info && const_strneq (name, "types"))
6109 || (do_debug_abbrevs && const_strneq (name, "abbrev"))
6110 || (do_debug_lines && strcmp (name, "line") == 0)
6111 || (do_debug_lines && const_strneq (name, "line."))
6112 || (do_debug_pubnames && const_strneq (name, "pubnames"))
6113 || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
6114 || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
6115 || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
6116 || (do_debug_aranges && const_strneq (name, "aranges"))
6117 || (do_debug_ranges && const_strneq (name, "ranges"))
6118 || (do_debug_ranges && const_strneq (name, "rnglists"))
6119 || (do_debug_frames && const_strneq (name, "frame"))
6120 || (do_debug_macinfo && const_strneq (name, "macinfo"))
6121 || (do_debug_macinfo && const_strneq (name, "macro"))
6122 || (do_debug_str && const_strneq (name, "str"))
6123 || (do_debug_loc && const_strneq (name, "loc"))
6124 || (do_debug_loc && const_strneq (name, "loclists"))
6125 || (do_debug_addr && const_strneq (name, "addr"))
6126 || (do_debug_cu_index && const_strneq (name, "cu_index"))
6127 || (do_debug_cu_index && const_strneq (name, "tu_index"))
6128 )
6129 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6130 }
6131 /* Linkonce section to be combined with .debug_info at link time. */
6132 else if ((do_debugging || do_debug_info)
6133 && const_strneq (name, ".gnu.linkonce.wi."))
6134 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6135 else if (do_debug_frames && streq (name, ".eh_frame"))
6136 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6137 else if (do_gdb_index && (streq (name, ".gdb_index")
6138 || streq (name, ".debug_names")))
6139 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6140 /* Trace sections for Itanium VMS. */
6141 else if ((do_debugging || do_trace_info || do_trace_abbrevs
6142 || do_trace_aranges)
6143 && const_strneq (name, ".trace_"))
6144 {
6145 name += sizeof (".trace_") - 1;
6146
6147 if (do_debugging
6148 || (do_trace_info && streq (name, "info"))
6149 || (do_trace_abbrevs && streq (name, "abbrev"))
6150 || (do_trace_aranges && streq (name, "aranges"))
6151 )
6152 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6153 }
6154 else if ((do_debugging || do_debug_links)
6155 && (const_strneq (name, ".gnu_debuglink")
6156 || const_strneq (name, ".gnu_debugaltlink")))
6157 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6158 }
6159
6160 if (! do_sections)
6161 return TRUE;
6162
6163 if (filedata->file_header.e_shnum > 1)
6164 printf (_("\nSection Headers:\n"));
6165 else
6166 printf (_("\nSection Header:\n"));
6167
6168 if (is_32bit_elf)
6169 {
6170 if (do_section_details)
6171 {
6172 printf (_(" [Nr] Name\n"));
6173 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
6174 }
6175 else
6176 printf
6177 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
6178 }
6179 else if (do_wide)
6180 {
6181 if (do_section_details)
6182 {
6183 printf (_(" [Nr] Name\n"));
6184 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
6185 }
6186 else
6187 printf
6188 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
6189 }
6190 else
6191 {
6192 if (do_section_details)
6193 {
6194 printf (_(" [Nr] Name\n"));
6195 printf (_(" Type Address Offset Link\n"));
6196 printf (_(" Size EntSize Info Align\n"));
6197 }
6198 else
6199 {
6200 printf (_(" [Nr] Name Type Address Offset\n"));
6201 printf (_(" Size EntSize Flags Link Info Align\n"));
6202 }
6203 }
6204
6205 if (do_section_details)
6206 printf (_(" Flags\n"));
6207
6208 for (i = 0, section = filedata->section_headers;
6209 i < filedata->file_header.e_shnum;
6210 i++, section++)
6211 {
6212 /* Run some sanity checks on the section header. */
6213
6214 /* Check the sh_link field. */
6215 switch (section->sh_type)
6216 {
6217 case SHT_SYMTAB_SHNDX:
6218 case SHT_GROUP:
6219 case SHT_HASH:
6220 case SHT_GNU_HASH:
6221 case SHT_GNU_versym:
6222 case SHT_REL:
6223 case SHT_RELA:
6224 if (section->sh_link < 1
6225 || section->sh_link >= filedata->file_header.e_shnum
6226 || (filedata->section_headers[section->sh_link].sh_type != SHT_SYMTAB
6227 && filedata->section_headers[section->sh_link].sh_type != SHT_DYNSYM))
6228 warn (_("[%2u]: Link field (%u) should index a symtab section.\n"),
6229 i, section->sh_link);
6230 break;
6231
6232 case SHT_DYNAMIC:
6233 case SHT_SYMTAB:
6234 case SHT_DYNSYM:
6235 case SHT_GNU_verneed:
6236 case SHT_GNU_verdef:
6237 case SHT_GNU_LIBLIST:
6238 if (section->sh_link < 1
6239 || section->sh_link >= filedata->file_header.e_shnum
6240 || filedata->section_headers[section->sh_link].sh_type != SHT_STRTAB)
6241 warn (_("[%2u]: Link field (%u) should index a string section.\n"),
6242 i, section->sh_link);
6243 break;
6244
6245 case SHT_INIT_ARRAY:
6246 case SHT_FINI_ARRAY:
6247 case SHT_PREINIT_ARRAY:
6248 if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6249 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6250 i, section->sh_link);
6251 break;
6252
6253 default:
6254 /* FIXME: Add support for target specific section types. */
6255 #if 0 /* Currently we do not check other section types as there are too
6256 many special cases. Stab sections for example have a type
6257 of SHT_PROGBITS but an sh_link field that links to the .stabstr
6258 section. */
6259 if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6260 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6261 i, section->sh_link);
6262 #endif
6263 break;
6264 }
6265
6266 /* Check the sh_info field. */
6267 switch (section->sh_type)
6268 {
6269 case SHT_REL:
6270 case SHT_RELA:
6271 if (section->sh_info < 1
6272 || section->sh_info >= filedata->file_header.e_shnum
6273 || (filedata->section_headers[section->sh_info].sh_type != SHT_PROGBITS
6274 && filedata->section_headers[section->sh_info].sh_type != SHT_NOBITS
6275 && filedata->section_headers[section->sh_info].sh_type != SHT_NOTE
6276 && filedata->section_headers[section->sh_info].sh_type != SHT_INIT_ARRAY
6277 /* FIXME: Are other section types valid ? */
6278 && filedata->section_headers[section->sh_info].sh_type < SHT_LOOS))
6279 {
6280 if (section->sh_info == 0
6281 && (filedata->file_header.e_type == ET_EXEC
6282 || filedata->file_header.e_type == ET_DYN
6283 /* These next two tests may be redundant, but
6284 they have been left in for paranoia's sake. */
6285 || streq (SECTION_NAME (section), ".rel.dyn")
6286 || streq (SECTION_NAME (section), ".rela.dyn")))
6287 /* Dynamic relocations apply to segments, not sections, so
6288 they do not need an sh_info value. */
6289 ;
6290 else
6291 warn (_("[%2u]: Info field (%u) should index a relocatable section.\n"),
6292 i, section->sh_info);
6293 }
6294 break;
6295
6296 case SHT_DYNAMIC:
6297 case SHT_HASH:
6298 case SHT_SYMTAB_SHNDX:
6299 case SHT_INIT_ARRAY:
6300 case SHT_FINI_ARRAY:
6301 case SHT_PREINIT_ARRAY:
6302 if (section->sh_info != 0)
6303 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6304 i, section->sh_info);
6305 break;
6306
6307 case SHT_GROUP:
6308 case SHT_SYMTAB:
6309 case SHT_DYNSYM:
6310 /* A symbol index - we assume that it is valid. */
6311 break;
6312
6313 default:
6314 /* FIXME: Add support for target specific section types. */
6315 if (section->sh_type == SHT_NOBITS)
6316 /* NOBITS section headers with non-zero sh_info fields can be
6317 created when a binary is stripped of everything but its debug
6318 information. The stripped sections have their headers
6319 preserved but their types set to SHT_NOBITS. So do not check
6320 this type of section. */
6321 ;
6322 else if (section->sh_flags & SHF_INFO_LINK)
6323 {
6324 if (section->sh_info < 1 || section->sh_info >= filedata->file_header.e_shnum)
6325 warn (_("[%2u]: Expected link to another section in info field"), i);
6326 }
6327 else if (section->sh_type < SHT_LOOS
6328 && (section->sh_flags & SHF_GNU_MBIND) == 0
6329 && section->sh_info != 0)
6330 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6331 i, section->sh_info);
6332 break;
6333 }
6334
6335 /* Check the sh_size field. */
6336 if (section->sh_size > filedata->file_size
6337 && section->sh_type != SHT_NOBITS
6338 && section->sh_type != SHT_NULL
6339 && section->sh_type < SHT_LOOS)
6340 warn (_("Size of section %u is larger than the entire file!\n"), i);
6341
6342 printf (" [%2u] ", i);
6343 if (do_section_details)
6344 printf ("%s\n ", printable_section_name (filedata, section));
6345 else
6346 print_symbol (-17, SECTION_NAME (section));
6347
6348 printf (do_wide ? " %-15s " : " %-15.15s ",
6349 get_section_type_name (filedata, section->sh_type));
6350
6351 if (is_32bit_elf)
6352 {
6353 const char * link_too_big = NULL;
6354
6355 print_vma (section->sh_addr, LONG_HEX);
6356
6357 printf ( " %6.6lx %6.6lx %2.2lx",
6358 (unsigned long) section->sh_offset,
6359 (unsigned long) section->sh_size,
6360 (unsigned long) section->sh_entsize);
6361
6362 if (do_section_details)
6363 fputs (" ", stdout);
6364 else
6365 printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6366
6367 if (section->sh_link >= filedata->file_header.e_shnum)
6368 {
6369 link_too_big = "";
6370 /* The sh_link value is out of range. Normally this indicates
6371 an error but it can have special values in Solaris binaries. */
6372 switch (filedata->file_header.e_machine)
6373 {
6374 case EM_386:
6375 case EM_IAMCU:
6376 case EM_X86_64:
6377 case EM_L1OM:
6378 case EM_K1OM:
6379 case EM_OLD_SPARCV9:
6380 case EM_SPARC32PLUS:
6381 case EM_SPARCV9:
6382 case EM_SPARC:
6383 if (section->sh_link == (SHN_BEFORE & 0xffff))
6384 link_too_big = "BEFORE";
6385 else if (section->sh_link == (SHN_AFTER & 0xffff))
6386 link_too_big = "AFTER";
6387 break;
6388 default:
6389 break;
6390 }
6391 }
6392
6393 if (do_section_details)
6394 {
6395 if (link_too_big != NULL && * link_too_big)
6396 printf ("<%s> ", link_too_big);
6397 else
6398 printf ("%2u ", section->sh_link);
6399 printf ("%3u %2lu\n", section->sh_info,
6400 (unsigned long) section->sh_addralign);
6401 }
6402 else
6403 printf ("%2u %3u %2lu\n",
6404 section->sh_link,
6405 section->sh_info,
6406 (unsigned long) section->sh_addralign);
6407
6408 if (link_too_big && ! * link_too_big)
6409 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
6410 i, section->sh_link);
6411 }
6412 else if (do_wide)
6413 {
6414 print_vma (section->sh_addr, LONG_HEX);
6415
6416 if ((long) section->sh_offset == section->sh_offset)
6417 printf (" %6.6lx", (unsigned long) section->sh_offset);
6418 else
6419 {
6420 putchar (' ');
6421 print_vma (section->sh_offset, LONG_HEX);
6422 }
6423
6424 if ((unsigned long) section->sh_size == section->sh_size)
6425 printf (" %6.6lx", (unsigned long) section->sh_size);
6426 else
6427 {
6428 putchar (' ');
6429 print_vma (section->sh_size, LONG_HEX);
6430 }
6431
6432 if ((unsigned long) section->sh_entsize == section->sh_entsize)
6433 printf (" %2.2lx", (unsigned long) section->sh_entsize);
6434 else
6435 {
6436 putchar (' ');
6437 print_vma (section->sh_entsize, LONG_HEX);
6438 }
6439
6440 if (do_section_details)
6441 fputs (" ", stdout);
6442 else
6443 printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6444
6445 printf ("%2u %3u ", section->sh_link, section->sh_info);
6446
6447 if ((unsigned long) section->sh_addralign == section->sh_addralign)
6448 printf ("%2lu\n", (unsigned long) section->sh_addralign);
6449 else
6450 {
6451 print_vma (section->sh_addralign, DEC);
6452 putchar ('\n');
6453 }
6454 }
6455 else if (do_section_details)
6456 {
6457 printf (" %-15.15s ",
6458 get_section_type_name (filedata, section->sh_type));
6459 print_vma (section->sh_addr, LONG_HEX);
6460 if ((long) section->sh_offset == section->sh_offset)
6461 printf (" %16.16lx", (unsigned long) section->sh_offset);
6462 else
6463 {
6464 printf (" ");
6465 print_vma (section->sh_offset, LONG_HEX);
6466 }
6467 printf (" %u\n ", section->sh_link);
6468 print_vma (section->sh_size, LONG_HEX);
6469 putchar (' ');
6470 print_vma (section->sh_entsize, LONG_HEX);
6471
6472 printf (" %-16u %lu\n",
6473 section->sh_info,
6474 (unsigned long) section->sh_addralign);
6475 }
6476 else
6477 {
6478 putchar (' ');
6479 print_vma (section->sh_addr, LONG_HEX);
6480 if ((long) section->sh_offset == section->sh_offset)
6481 printf (" %8.8lx", (unsigned long) section->sh_offset);
6482 else
6483 {
6484 printf (" ");
6485 print_vma (section->sh_offset, LONG_HEX);
6486 }
6487 printf ("\n ");
6488 print_vma (section->sh_size, LONG_HEX);
6489 printf (" ");
6490 print_vma (section->sh_entsize, LONG_HEX);
6491
6492 printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6493
6494 printf (" %2u %3u %lu\n",
6495 section->sh_link,
6496 section->sh_info,
6497 (unsigned long) section->sh_addralign);
6498 }
6499
6500 if (do_section_details)
6501 {
6502 printf (" %s\n", get_elf_section_flags (filedata, section->sh_flags));
6503 if ((section->sh_flags & SHF_COMPRESSED) != 0)
6504 {
6505 /* Minimum section size is 12 bytes for 32-bit compression
6506 header + 12 bytes for compressed data header. */
6507 unsigned char buf[24];
6508
6509 assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
6510 if (get_data (&buf, filedata, section->sh_offset, 1,
6511 sizeof (buf), _("compression header")))
6512 {
6513 Elf_Internal_Chdr chdr;
6514
6515 (void) get_compression_header (&chdr, buf, sizeof (buf));
6516
6517 if (chdr.ch_type == ELFCOMPRESS_ZLIB)
6518 printf (" ZLIB, ");
6519 else
6520 printf (_(" [<unknown>: 0x%x], "),
6521 chdr.ch_type);
6522 print_vma (chdr.ch_size, LONG_HEX);
6523 printf (", %lu\n", (unsigned long) chdr.ch_addralign);
6524 }
6525 }
6526 }
6527 }
6528
6529 if (!do_section_details)
6530 {
6531 /* The ordering of the letters shown here matches the ordering of the
6532 corresponding SHF_xxx values, and hence the order in which these
6533 letters will be displayed to the user. */
6534 printf (_("Key to Flags:\n\
6535 W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6536 L (link order), O (extra OS processing required), G (group), T (TLS),\n\
6537 C (compressed), x (unknown), o (OS specific), E (exclude),\n "));
6538 if (filedata->file_header.e_machine == EM_X86_64
6539 || filedata->file_header.e_machine == EM_L1OM
6540 || filedata->file_header.e_machine == EM_K1OM)
6541 printf (_("l (large), "));
6542 else if (filedata->file_header.e_machine == EM_ARM)
6543 printf (_("y (purecode), "));
6544 else if (filedata->file_header.e_machine == EM_PPC)
6545 printf (_("v (VLE), "));
6546 printf ("p (processor specific)\n");
6547 }
6548
6549 return TRUE;
6550 }
6551
6552 static const char *
6553 get_group_flags (unsigned int flags)
6554 {
6555 static char buff[128];
6556
6557 if (flags == 0)
6558 return "";
6559 else if (flags == GRP_COMDAT)
6560 return "COMDAT ";
6561
6562 snprintf (buff, 14, _("[0x%x: "), flags);
6563
6564 flags &= ~ GRP_COMDAT;
6565 if (flags & GRP_MASKOS)
6566 {
6567 strcat (buff, "<OS specific>");
6568 flags &= ~ GRP_MASKOS;
6569 }
6570
6571 if (flags & GRP_MASKPROC)
6572 {
6573 strcat (buff, "<PROC specific>");
6574 flags &= ~ GRP_MASKPROC;
6575 }
6576
6577 if (flags)
6578 strcat (buff, "<unknown>");
6579
6580 strcat (buff, "]");
6581 return buff;
6582 }
6583
6584 static bfd_boolean
6585 process_section_groups (Filedata * filedata)
6586 {
6587 Elf_Internal_Shdr * section;
6588 unsigned int i;
6589 struct group * group;
6590 Elf_Internal_Shdr * symtab_sec;
6591 Elf_Internal_Shdr * strtab_sec;
6592 Elf_Internal_Sym * symtab;
6593 unsigned long num_syms;
6594 char * strtab;
6595 size_t strtab_size;
6596
6597 /* Don't process section groups unless needed. */
6598 if (!do_unwind && !do_section_groups)
6599 return TRUE;
6600
6601 if (filedata->file_header.e_shnum == 0)
6602 {
6603 if (do_section_groups)
6604 printf (_("\nThere are no sections to group in this file.\n"));
6605
6606 return TRUE;
6607 }
6608
6609 if (filedata->section_headers == NULL)
6610 {
6611 error (_("Section headers are not available!\n"));
6612 /* PR 13622: This can happen with a corrupt ELF header. */
6613 return FALSE;
6614 }
6615
6616 section_headers_groups = (struct group **) calloc (filedata->file_header.e_shnum,
6617 sizeof (struct group *));
6618
6619 if (section_headers_groups == NULL)
6620 {
6621 error (_("Out of memory reading %u section group headers\n"),
6622 filedata->file_header.e_shnum);
6623 return FALSE;
6624 }
6625
6626 /* Scan the sections for the group section. */
6627 group_count = 0;
6628 for (i = 0, section = filedata->section_headers;
6629 i < filedata->file_header.e_shnum;
6630 i++, section++)
6631 if (section->sh_type == SHT_GROUP)
6632 group_count++;
6633
6634 if (group_count == 0)
6635 {
6636 if (do_section_groups)
6637 printf (_("\nThere are no section groups in this file.\n"));
6638
6639 return TRUE;
6640 }
6641
6642 section_groups = (struct group *) calloc (group_count, sizeof (struct group));
6643
6644 if (section_groups == NULL)
6645 {
6646 error (_("Out of memory reading %lu groups\n"),
6647 (unsigned long) group_count);
6648 return FALSE;
6649 }
6650
6651 symtab_sec = NULL;
6652 strtab_sec = NULL;
6653 symtab = NULL;
6654 num_syms = 0;
6655 strtab = NULL;
6656 strtab_size = 0;
6657 for (i = 0, section = filedata->section_headers, group = section_groups;
6658 i < filedata->file_header.e_shnum;
6659 i++, section++)
6660 {
6661 if (section->sh_type == SHT_GROUP)
6662 {
6663 const char * name = printable_section_name (filedata, section);
6664 const char * group_name;
6665 unsigned char * start;
6666 unsigned char * indices;
6667 unsigned int entry, j, size;
6668 Elf_Internal_Shdr * sec;
6669 Elf_Internal_Sym * sym;
6670
6671 /* Get the symbol table. */
6672 if (section->sh_link >= filedata->file_header.e_shnum
6673 || ((sec = filedata->section_headers + section->sh_link)->sh_type
6674 != SHT_SYMTAB))
6675 {
6676 error (_("Bad sh_link in group section `%s'\n"), name);
6677 continue;
6678 }
6679
6680 if (symtab_sec != sec)
6681 {
6682 symtab_sec = sec;
6683 if (symtab)
6684 free (symtab);
6685 symtab = GET_ELF_SYMBOLS (filedata, symtab_sec, & num_syms);
6686 }
6687
6688 if (symtab == NULL)
6689 {
6690 error (_("Corrupt header in group section `%s'\n"), name);
6691 continue;
6692 }
6693
6694 if (section->sh_info >= num_syms)
6695 {
6696 error (_("Bad sh_info in group section `%s'\n"), name);
6697 continue;
6698 }
6699
6700 sym = symtab + section->sh_info;
6701
6702 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6703 {
6704 if (sym->st_shndx == 0
6705 || sym->st_shndx >= filedata->file_header.e_shnum)
6706 {
6707 error (_("Bad sh_info in group section `%s'\n"), name);
6708 continue;
6709 }
6710
6711 group_name = SECTION_NAME (filedata->section_headers + sym->st_shndx);
6712 strtab_sec = NULL;
6713 if (strtab)
6714 free (strtab);
6715 strtab = NULL;
6716 strtab_size = 0;
6717 }
6718 else
6719 {
6720 /* Get the string table. */
6721 if (symtab_sec->sh_link >= filedata->file_header.e_shnum)
6722 {
6723 strtab_sec = NULL;
6724 if (strtab)
6725 free (strtab);
6726 strtab = NULL;
6727 strtab_size = 0;
6728 }
6729 else if (strtab_sec
6730 != (sec = filedata->section_headers + symtab_sec->sh_link))
6731 {
6732 strtab_sec = sec;
6733 if (strtab)
6734 free (strtab);
6735
6736 strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
6737 1, strtab_sec->sh_size,
6738 _("string table"));
6739 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
6740 }
6741 group_name = sym->st_name < strtab_size
6742 ? strtab + sym->st_name : _("<corrupt>");
6743 }
6744
6745 /* PR 17531: file: loop. */
6746 if (section->sh_entsize > section->sh_size)
6747 {
6748 error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6749 printable_section_name (filedata, section),
6750 (unsigned long) section->sh_entsize,
6751 (unsigned long) section->sh_size);
6752 break;
6753 }
6754
6755 start = (unsigned char *) get_data (NULL, filedata, section->sh_offset,
6756 1, section->sh_size,
6757 _("section data"));
6758 if (start == NULL)
6759 continue;
6760
6761 indices = start;
6762 size = (section->sh_size / section->sh_entsize) - 1;
6763 entry = byte_get (indices, 4);
6764 indices += 4;
6765
6766 if (do_section_groups)
6767 {
6768 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
6769 get_group_flags (entry), i, name, group_name, size);
6770
6771 printf (_(" [Index] Name\n"));
6772 }
6773
6774 group->group_index = i;
6775
6776 for (j = 0; j < size; j++)
6777 {
6778 struct group_list * g;
6779
6780 entry = byte_get (indices, 4);
6781 indices += 4;
6782
6783 if (entry >= filedata->file_header.e_shnum)
6784 {
6785 static unsigned num_group_errors = 0;
6786
6787 if (num_group_errors ++ < 10)
6788 {
6789 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6790 entry, i, filedata->file_header.e_shnum - 1);
6791 if (num_group_errors == 10)
6792 warn (_("Further error messages about overlarge group section indicies suppressed\n"));
6793 }
6794 continue;
6795 }
6796
6797 if (section_headers_groups [entry] != NULL)
6798 {
6799 if (entry)
6800 {
6801 static unsigned num_errs = 0;
6802
6803 if (num_errs ++ < 10)
6804 {
6805 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6806 entry, i,
6807 section_headers_groups [entry]->group_index);
6808 if (num_errs == 10)
6809 warn (_("Further error messages about already contained group sections suppressed\n"));
6810 }
6811 continue;
6812 }
6813 else
6814 {
6815 /* Intel C/C++ compiler may put section 0 in a
6816 section group. We just warn it the first time
6817 and ignore it afterwards. */
6818 static bfd_boolean warned = FALSE;
6819 if (!warned)
6820 {
6821 error (_("section 0 in group section [%5u]\n"),
6822 section_headers_groups [entry]->group_index);
6823 warned = TRUE;
6824 }
6825 }
6826 }
6827
6828 section_headers_groups [entry] = group;
6829
6830 if (do_section_groups)
6831 {
6832 sec = filedata->section_headers + entry;
6833 printf (" [%5u] %s\n", entry, printable_section_name (filedata, sec));
6834 }
6835
6836 g = (struct group_list *) xmalloc (sizeof (struct group_list));
6837 g->section_index = entry;
6838 g->next = group->root;
6839 group->root = g;
6840 }
6841
6842 if (start)
6843 free (start);
6844
6845 group++;
6846 }
6847 }
6848
6849 if (symtab)
6850 free (symtab);
6851 if (strtab)
6852 free (strtab);
6853 return TRUE;
6854 }
6855
6856 /* Data used to display dynamic fixups. */
6857
6858 struct ia64_vms_dynfixup
6859 {
6860 bfd_vma needed_ident; /* Library ident number. */
6861 bfd_vma needed; /* Index in the dstrtab of the library name. */
6862 bfd_vma fixup_needed; /* Index of the library. */
6863 bfd_vma fixup_rela_cnt; /* Number of fixups. */
6864 bfd_vma fixup_rela_off; /* Fixups offset in the dynamic segment. */
6865 };
6866
6867 /* Data used to display dynamic relocations. */
6868
6869 struct ia64_vms_dynimgrela
6870 {
6871 bfd_vma img_rela_cnt; /* Number of relocations. */
6872 bfd_vma img_rela_off; /* Reloc offset in the dynamic segment. */
6873 };
6874
6875 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6876 library). */
6877
6878 static bfd_boolean
6879 dump_ia64_vms_dynamic_fixups (Filedata * filedata,
6880 struct ia64_vms_dynfixup * fixup,
6881 const char * strtab,
6882 unsigned int strtab_sz)
6883 {
6884 Elf64_External_VMS_IMAGE_FIXUP * imfs;
6885 long i;
6886 const char * lib_name;
6887
6888 imfs = get_data (NULL, filedata, dynamic_addr + fixup->fixup_rela_off,
6889 1, fixup->fixup_rela_cnt * sizeof (*imfs),
6890 _("dynamic section image fixups"));
6891 if (!imfs)
6892 return FALSE;
6893
6894 if (fixup->needed < strtab_sz)
6895 lib_name = strtab + fixup->needed;
6896 else
6897 {
6898 warn (_("corrupt library name index of 0x%lx found in dynamic entry"),
6899 (unsigned long) fixup->needed);
6900 lib_name = "???";
6901 }
6902 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
6903 (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
6904 printf
6905 (_("Seg Offset Type SymVec DataType\n"));
6906
6907 for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
6908 {
6909 unsigned int type;
6910 const char *rtype;
6911
6912 printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
6913 printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
6914 type = BYTE_GET (imfs [i].type);
6915 rtype = elf_ia64_reloc_type (type);
6916 if (rtype == NULL)
6917 printf (" 0x%08x ", type);
6918 else
6919 printf (" %-32s ", rtype);
6920 printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
6921 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
6922 }
6923
6924 free (imfs);
6925 return TRUE;
6926 }
6927
6928 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
6929
6930 static bfd_boolean
6931 dump_ia64_vms_dynamic_relocs (Filedata * filedata, struct ia64_vms_dynimgrela *imgrela)
6932 {
6933 Elf64_External_VMS_IMAGE_RELA *imrs;
6934 long i;
6935
6936 imrs = get_data (NULL, filedata, dynamic_addr + imgrela->img_rela_off,
6937 1, imgrela->img_rela_cnt * sizeof (*imrs),
6938 _("dynamic section image relocations"));
6939 if (!imrs)
6940 return FALSE;
6941
6942 printf (_("\nImage relocs\n"));
6943 printf
6944 (_("Seg Offset Type Addend Seg Sym Off\n"));
6945
6946 for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
6947 {
6948 unsigned int type;
6949 const char *rtype;
6950
6951 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
6952 printf ("%08" BFD_VMA_FMT "x ",
6953 (bfd_vma) BYTE_GET (imrs [i].rela_offset));
6954 type = BYTE_GET (imrs [i].type);
6955 rtype = elf_ia64_reloc_type (type);
6956 if (rtype == NULL)
6957 printf ("0x%08x ", type);
6958 else
6959 printf ("%-31s ", rtype);
6960 print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
6961 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
6962 printf ("%08" BFD_VMA_FMT "x\n",
6963 (bfd_vma) BYTE_GET (imrs [i].sym_offset));
6964 }
6965
6966 free (imrs);
6967 return TRUE;
6968 }
6969
6970 /* Display IA-64 OpenVMS dynamic relocations and fixups. */
6971
6972 static bfd_boolean
6973 process_ia64_vms_dynamic_relocs (Filedata * filedata)
6974 {
6975 struct ia64_vms_dynfixup fixup;
6976 struct ia64_vms_dynimgrela imgrela;
6977 Elf_Internal_Dyn *entry;
6978 bfd_vma strtab_off = 0;
6979 bfd_vma strtab_sz = 0;
6980 char *strtab = NULL;
6981 bfd_boolean res = TRUE;
6982
6983 memset (&fixup, 0, sizeof (fixup));
6984 memset (&imgrela, 0, sizeof (imgrela));
6985
6986 /* Note: the order of the entries is specified by the OpenVMS specs. */
6987 for (entry = dynamic_section;
6988 entry < dynamic_section + dynamic_nent;
6989 entry++)
6990 {
6991 switch (entry->d_tag)
6992 {
6993 case DT_IA_64_VMS_STRTAB_OFFSET:
6994 strtab_off = entry->d_un.d_val;
6995 break;
6996 case DT_STRSZ:
6997 strtab_sz = entry->d_un.d_val;
6998 if (strtab == NULL)
6999 strtab = get_data (NULL, filedata, dynamic_addr + strtab_off,
7000 1, strtab_sz, _("dynamic string section"));
7001 break;
7002
7003 case DT_IA_64_VMS_NEEDED_IDENT:
7004 fixup.needed_ident = entry->d_un.d_val;
7005 break;
7006 case DT_NEEDED:
7007 fixup.needed = entry->d_un.d_val;
7008 break;
7009 case DT_IA_64_VMS_FIXUP_NEEDED:
7010 fixup.fixup_needed = entry->d_un.d_val;
7011 break;
7012 case DT_IA_64_VMS_FIXUP_RELA_CNT:
7013 fixup.fixup_rela_cnt = entry->d_un.d_val;
7014 break;
7015 case DT_IA_64_VMS_FIXUP_RELA_OFF:
7016 fixup.fixup_rela_off = entry->d_un.d_val;
7017 if (! dump_ia64_vms_dynamic_fixups (filedata, &fixup, strtab, strtab_sz))
7018 res = FALSE;
7019 break;
7020 case DT_IA_64_VMS_IMG_RELA_CNT:
7021 imgrela.img_rela_cnt = entry->d_un.d_val;
7022 break;
7023 case DT_IA_64_VMS_IMG_RELA_OFF:
7024 imgrela.img_rela_off = entry->d_un.d_val;
7025 if (! dump_ia64_vms_dynamic_relocs (filedata, &imgrela))
7026 res = FALSE;
7027 break;
7028
7029 default:
7030 break;
7031 }
7032 }
7033
7034 if (strtab != NULL)
7035 free (strtab);
7036
7037 return res;
7038 }
7039
7040 static struct
7041 {
7042 const char * name;
7043 int reloc;
7044 int size;
7045 int rela;
7046 }
7047 dynamic_relocations [] =
7048 {
7049 { "REL", DT_REL, DT_RELSZ, FALSE },
7050 { "RELA", DT_RELA, DT_RELASZ, TRUE },
7051 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
7052 };
7053
7054 /* Process the reloc section. */
7055
7056 static bfd_boolean
7057 process_relocs (Filedata * filedata)
7058 {
7059 unsigned long rel_size;
7060 unsigned long rel_offset;
7061
7062 if (!do_reloc)
7063 return TRUE;
7064
7065 if (do_using_dynamic)
7066 {
7067 int is_rela;
7068 const char * name;
7069 bfd_boolean has_dynamic_reloc;
7070 unsigned int i;
7071
7072 has_dynamic_reloc = FALSE;
7073
7074 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
7075 {
7076 is_rela = dynamic_relocations [i].rela;
7077 name = dynamic_relocations [i].name;
7078 rel_size = dynamic_info [dynamic_relocations [i].size];
7079 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
7080
7081 if (rel_size)
7082 has_dynamic_reloc = TRUE;
7083
7084 if (is_rela == UNKNOWN)
7085 {
7086 if (dynamic_relocations [i].reloc == DT_JMPREL)
7087 switch (dynamic_info[DT_PLTREL])
7088 {
7089 case DT_REL:
7090 is_rela = FALSE;
7091 break;
7092 case DT_RELA:
7093 is_rela = TRUE;
7094 break;
7095 }
7096 }
7097
7098 if (rel_size)
7099 {
7100 printf
7101 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
7102 name, rel_offset, rel_size);
7103
7104 dump_relocations (filedata,
7105 offset_from_vma (filedata, rel_offset, rel_size),
7106 rel_size,
7107 dynamic_symbols, num_dynamic_syms,
7108 dynamic_strings, dynamic_strings_length,
7109 is_rela, TRUE /* is_dynamic */);
7110 }
7111 }
7112
7113 if (is_ia64_vms (filedata))
7114 if (process_ia64_vms_dynamic_relocs (filedata))
7115 has_dynamic_reloc = TRUE;
7116
7117 if (! has_dynamic_reloc)
7118 printf (_("\nThere are no dynamic relocations in this file.\n"));
7119 }
7120 else
7121 {
7122 Elf_Internal_Shdr * section;
7123 unsigned long i;
7124 bfd_boolean found = FALSE;
7125
7126 for (i = 0, section = filedata->section_headers;
7127 i < filedata->file_header.e_shnum;
7128 i++, section++)
7129 {
7130 if ( section->sh_type != SHT_RELA
7131 && section->sh_type != SHT_REL)
7132 continue;
7133
7134 rel_offset = section->sh_offset;
7135 rel_size = section->sh_size;
7136
7137 if (rel_size)
7138 {
7139 Elf_Internal_Shdr * strsec;
7140 int is_rela;
7141 unsigned long num_rela;
7142
7143 printf (_("\nRelocation section "));
7144
7145 if (filedata->string_table == NULL)
7146 printf ("%d", section->sh_name);
7147 else
7148 printf ("'%s'", printable_section_name (filedata, section));
7149
7150 num_rela = rel_size / section->sh_entsize;
7151 printf (ngettext (" at offset 0x%lx contains %lu entry:\n",
7152 " at offset 0x%lx contains %lu entries:\n",
7153 num_rela),
7154 rel_offset, num_rela);
7155
7156 is_rela = section->sh_type == SHT_RELA;
7157
7158 if (section->sh_link != 0
7159 && section->sh_link < filedata->file_header.e_shnum)
7160 {
7161 Elf_Internal_Shdr * symsec;
7162 Elf_Internal_Sym * symtab;
7163 unsigned long nsyms;
7164 unsigned long strtablen = 0;
7165 char * strtab = NULL;
7166
7167 symsec = filedata->section_headers + section->sh_link;
7168 if (symsec->sh_type != SHT_SYMTAB
7169 && symsec->sh_type != SHT_DYNSYM)
7170 continue;
7171
7172 symtab = GET_ELF_SYMBOLS (filedata, symsec, & nsyms);
7173
7174 if (symtab == NULL)
7175 continue;
7176
7177 if (symsec->sh_link != 0
7178 && symsec->sh_link < filedata->file_header.e_shnum)
7179 {
7180 strsec = filedata->section_headers + symsec->sh_link;
7181
7182 strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
7183 1, strsec->sh_size,
7184 _("string table"));
7185 strtablen = strtab == NULL ? 0 : strsec->sh_size;
7186 }
7187
7188 dump_relocations (filedata, rel_offset, rel_size,
7189 symtab, nsyms, strtab, strtablen,
7190 is_rela,
7191 symsec->sh_type == SHT_DYNSYM);
7192 if (strtab)
7193 free (strtab);
7194 free (symtab);
7195 }
7196 else
7197 dump_relocations (filedata, rel_offset, rel_size,
7198 NULL, 0, NULL, 0, is_rela,
7199 FALSE /* is_dynamic */);
7200
7201 found = TRUE;
7202 }
7203 }
7204
7205 if (! found)
7206 {
7207 /* Users sometimes forget the -D option, so try to be helpful. */
7208 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
7209 {
7210 if (dynamic_info [dynamic_relocations [i].size])
7211 {
7212 printf (_("\nThere are no static relocations in this file."));
7213 printf (_("\nTo see the dynamic relocations add --use-dynamic to the command line.\n"));
7214
7215 break;
7216 }
7217 }
7218 if (i == ARRAY_SIZE (dynamic_relocations))
7219 printf (_("\nThere are no relocations in this file.\n"));
7220 }
7221 }
7222
7223 return TRUE;
7224 }
7225
7226 /* An absolute address consists of a section and an offset. If the
7227 section is NULL, the offset itself is the address, otherwise, the
7228 address equals to LOAD_ADDRESS(section) + offset. */
7229
7230 struct absaddr
7231 {
7232 unsigned short section;
7233 bfd_vma offset;
7234 };
7235
7236 #define ABSADDR(a) \
7237 ((a).section \
7238 ? filedata->section_headers [(a).section].sh_addr + (a).offset \
7239 : (a).offset)
7240
7241 /* Find the nearest symbol at or below ADDR. Returns the symbol
7242 name, if found, and the offset from the symbol to ADDR. */
7243
7244 static void
7245 find_symbol_for_address (Filedata * filedata,
7246 Elf_Internal_Sym * symtab,
7247 unsigned long nsyms,
7248 const char * strtab,
7249 unsigned long strtab_size,
7250 struct absaddr addr,
7251 const char ** symname,
7252 bfd_vma * offset)
7253 {
7254 bfd_vma dist = 0x100000;
7255 Elf_Internal_Sym * sym;
7256 Elf_Internal_Sym * beg;
7257 Elf_Internal_Sym * end;
7258 Elf_Internal_Sym * best = NULL;
7259
7260 REMOVE_ARCH_BITS (addr.offset);
7261 beg = symtab;
7262 end = symtab + nsyms;
7263
7264 while (beg < end)
7265 {
7266 bfd_vma value;
7267
7268 sym = beg + (end - beg) / 2;
7269
7270 value = sym->st_value;
7271 REMOVE_ARCH_BITS (value);
7272
7273 if (sym->st_name != 0
7274 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
7275 && addr.offset >= value
7276 && addr.offset - value < dist)
7277 {
7278 best = sym;
7279 dist = addr.offset - value;
7280 if (!dist)
7281 break;
7282 }
7283
7284 if (addr.offset < value)
7285 end = sym;
7286 else
7287 beg = sym + 1;
7288 }
7289
7290 if (best)
7291 {
7292 *symname = (best->st_name >= strtab_size
7293 ? _("<corrupt>") : strtab + best->st_name);
7294 *offset = dist;
7295 return;
7296 }
7297
7298 *symname = NULL;
7299 *offset = addr.offset;
7300 }
7301
7302 static /* signed */ int
7303 symcmp (const void *p, const void *q)
7304 {
7305 Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
7306 Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
7307
7308 return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
7309 }
7310
7311 /* Process the unwind section. */
7312
7313 #include "unwind-ia64.h"
7314
7315 struct ia64_unw_table_entry
7316 {
7317 struct absaddr start;
7318 struct absaddr end;
7319 struct absaddr info;
7320 };
7321
7322 struct ia64_unw_aux_info
7323 {
7324 struct ia64_unw_table_entry * table; /* Unwind table. */
7325 unsigned long table_len; /* Length of unwind table. */
7326 unsigned char * info; /* Unwind info. */
7327 unsigned long info_size; /* Size of unwind info. */
7328 bfd_vma info_addr; /* Starting address of unwind info. */
7329 bfd_vma seg_base; /* Starting address of segment. */
7330 Elf_Internal_Sym * symtab; /* The symbol table. */
7331 unsigned long nsyms; /* Number of symbols. */
7332 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7333 unsigned long nfuns; /* Number of entries in funtab. */
7334 char * strtab; /* The string table. */
7335 unsigned long strtab_size; /* Size of string table. */
7336 };
7337
7338 static bfd_boolean
7339 dump_ia64_unwind (Filedata * filedata, struct ia64_unw_aux_info * aux)
7340 {
7341 struct ia64_unw_table_entry * tp;
7342 unsigned long j, nfuns;
7343 int in_body;
7344 bfd_boolean res = TRUE;
7345
7346 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7347 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7348 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7349 aux->funtab[nfuns++] = aux->symtab[j];
7350 aux->nfuns = nfuns;
7351 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7352
7353 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7354 {
7355 bfd_vma stamp;
7356 bfd_vma offset;
7357 const unsigned char * dp;
7358 const unsigned char * head;
7359 const unsigned char * end;
7360 const char * procname;
7361
7362 find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
7363 aux->strtab_size, tp->start, &procname, &offset);
7364
7365 fputs ("\n<", stdout);
7366
7367 if (procname)
7368 {
7369 fputs (procname, stdout);
7370
7371 if (offset)
7372 printf ("+%lx", (unsigned long) offset);
7373 }
7374
7375 fputs (">: [", stdout);
7376 print_vma (tp->start.offset, PREFIX_HEX);
7377 fputc ('-', stdout);
7378 print_vma (tp->end.offset, PREFIX_HEX);
7379 printf ("], info at +0x%lx\n",
7380 (unsigned long) (tp->info.offset - aux->seg_base));
7381
7382 /* PR 17531: file: 86232b32. */
7383 if (aux->info == NULL)
7384 continue;
7385
7386 /* PR 17531: file: 0997b4d1. */
7387 if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
7388 {
7389 warn (_("Invalid offset %lx in table entry %ld\n"),
7390 (long) tp->info.offset, (long) (tp - aux->table));
7391 res = FALSE;
7392 continue;
7393 }
7394
7395 head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
7396 stamp = byte_get ((unsigned char *) head, sizeof (stamp));
7397
7398 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
7399 (unsigned) UNW_VER (stamp),
7400 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
7401 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
7402 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
7403 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
7404
7405 if (UNW_VER (stamp) != 1)
7406 {
7407 printf (_("\tUnknown version.\n"));
7408 continue;
7409 }
7410
7411 in_body = 0;
7412 end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
7413 /* PR 17531: file: 16ceda89. */
7414 if (end > aux->info + aux->info_size)
7415 end = aux->info + aux->info_size;
7416 for (dp = head + 8; dp < end;)
7417 dp = unw_decode (dp, in_body, & in_body, end);
7418 }
7419
7420 free (aux->funtab);
7421
7422 return res;
7423 }
7424
7425 static bfd_boolean
7426 slurp_ia64_unwind_table (Filedata * filedata,
7427 struct ia64_unw_aux_info * aux,
7428 Elf_Internal_Shdr * sec)
7429 {
7430 unsigned long size, nrelas, i;
7431 Elf_Internal_Phdr * seg;
7432 struct ia64_unw_table_entry * tep;
7433 Elf_Internal_Shdr * relsec;
7434 Elf_Internal_Rela * rela;
7435 Elf_Internal_Rela * rp;
7436 unsigned char * table;
7437 unsigned char * tp;
7438 Elf_Internal_Sym * sym;
7439 const char * relname;
7440
7441 aux->table_len = 0;
7442
7443 /* First, find the starting address of the segment that includes
7444 this section: */
7445
7446 if (filedata->file_header.e_phnum)
7447 {
7448 if (! get_program_headers (filedata))
7449 return FALSE;
7450
7451 for (seg = filedata->program_headers;
7452 seg < filedata->program_headers + filedata->file_header.e_phnum;
7453 ++seg)
7454 {
7455 if (seg->p_type != PT_LOAD)
7456 continue;
7457
7458 if (sec->sh_addr >= seg->p_vaddr
7459 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7460 {
7461 aux->seg_base = seg->p_vaddr;
7462 break;
7463 }
7464 }
7465 }
7466
7467 /* Second, build the unwind table from the contents of the unwind section: */
7468 size = sec->sh_size;
7469 table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
7470 _("unwind table"));
7471 if (!table)
7472 return FALSE;
7473
7474 aux->table_len = size / (3 * eh_addr_size);
7475 aux->table = (struct ia64_unw_table_entry *)
7476 xcmalloc (aux->table_len, sizeof (aux->table[0]));
7477 tep = aux->table;
7478
7479 for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
7480 {
7481 tep->start.section = SHN_UNDEF;
7482 tep->end.section = SHN_UNDEF;
7483 tep->info.section = SHN_UNDEF;
7484 tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7485 tep->end.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7486 tep->info.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7487 tep->start.offset += aux->seg_base;
7488 tep->end.offset += aux->seg_base;
7489 tep->info.offset += aux->seg_base;
7490 }
7491 free (table);
7492
7493 /* Third, apply any relocations to the unwind table: */
7494 for (relsec = filedata->section_headers;
7495 relsec < filedata->section_headers + filedata->file_header.e_shnum;
7496 ++relsec)
7497 {
7498 if (relsec->sh_type != SHT_RELA
7499 || relsec->sh_info >= filedata->file_header.e_shnum
7500 || filedata->section_headers + relsec->sh_info != sec)
7501 continue;
7502
7503 if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
7504 & rela, & nrelas))
7505 {
7506 free (aux->table);
7507 aux->table = NULL;
7508 aux->table_len = 0;
7509 return FALSE;
7510 }
7511
7512 for (rp = rela; rp < rela + nrelas; ++rp)
7513 {
7514 relname = elf_ia64_reloc_type (get_reloc_type (filedata, rp->r_info));
7515 sym = aux->symtab + get_reloc_symindex (rp->r_info);
7516
7517 /* PR 17531: file: 9fa67536. */
7518 if (relname == NULL)
7519 {
7520 warn (_("Skipping unknown relocation type: %u\n"),
7521 get_reloc_type (filedata, rp->r_info));
7522 continue;
7523 }
7524
7525 if (! const_strneq (relname, "R_IA64_SEGREL"))
7526 {
7527 warn (_("Skipping unexpected relocation type: %s\n"), relname);
7528 continue;
7529 }
7530
7531 i = rp->r_offset / (3 * eh_addr_size);
7532
7533 /* PR 17531: file: 5bc8d9bf. */
7534 if (i >= aux->table_len)
7535 {
7536 warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
7537 continue;
7538 }
7539
7540 switch (rp->r_offset / eh_addr_size % 3)
7541 {
7542 case 0:
7543 aux->table[i].start.section = sym->st_shndx;
7544 aux->table[i].start.offset = rp->r_addend + sym->st_value;
7545 break;
7546 case 1:
7547 aux->table[i].end.section = sym->st_shndx;
7548 aux->table[i].end.offset = rp->r_addend + sym->st_value;
7549 break;
7550 case 2:
7551 aux->table[i].info.section = sym->st_shndx;
7552 aux->table[i].info.offset = rp->r_addend + sym->st_value;
7553 break;
7554 default:
7555 break;
7556 }
7557 }
7558
7559 free (rela);
7560 }
7561
7562 return TRUE;
7563 }
7564
7565 static bfd_boolean
7566 ia64_process_unwind (Filedata * filedata)
7567 {
7568 Elf_Internal_Shdr * sec;
7569 Elf_Internal_Shdr * unwsec = NULL;
7570 Elf_Internal_Shdr * strsec;
7571 unsigned long i, unwcount = 0, unwstart = 0;
7572 struct ia64_unw_aux_info aux;
7573 bfd_boolean res = TRUE;
7574
7575 memset (& aux, 0, sizeof (aux));
7576
7577 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
7578 {
7579 if (sec->sh_type == SHT_SYMTAB
7580 && sec->sh_link < filedata->file_header.e_shnum)
7581 {
7582 aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
7583
7584 strsec = filedata->section_headers + sec->sh_link;
7585 if (aux.strtab != NULL)
7586 {
7587 error (_("Multiple auxillary string tables encountered\n"));
7588 free (aux.strtab);
7589 res = FALSE;
7590 }
7591 aux.strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
7592 1, strsec->sh_size,
7593 _("string table"));
7594 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7595 }
7596 else if (sec->sh_type == SHT_IA_64_UNWIND)
7597 unwcount++;
7598 }
7599
7600 if (!unwcount)
7601 printf (_("\nThere are no unwind sections in this file.\n"));
7602
7603 while (unwcount-- > 0)
7604 {
7605 char * suffix;
7606 size_t len, len2;
7607
7608 for (i = unwstart, sec = filedata->section_headers + unwstart, unwsec = NULL;
7609 i < filedata->file_header.e_shnum; ++i, ++sec)
7610 if (sec->sh_type == SHT_IA_64_UNWIND)
7611 {
7612 unwsec = sec;
7613 break;
7614 }
7615 /* We have already counted the number of SHT_IA64_UNWIND
7616 sections so the loop above should never fail. */
7617 assert (unwsec != NULL);
7618
7619 unwstart = i + 1;
7620 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
7621
7622 if ((unwsec->sh_flags & SHF_GROUP) != 0)
7623 {
7624 /* We need to find which section group it is in. */
7625 struct group_list * g;
7626
7627 if (section_headers_groups == NULL
7628 || section_headers_groups [i] == NULL)
7629 i = filedata->file_header.e_shnum;
7630 else
7631 {
7632 g = section_headers_groups [i]->root;
7633
7634 for (; g != NULL; g = g->next)
7635 {
7636 sec = filedata->section_headers + g->section_index;
7637
7638 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
7639 break;
7640 }
7641
7642 if (g == NULL)
7643 i = filedata->file_header.e_shnum;
7644 }
7645 }
7646 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
7647 {
7648 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
7649 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
7650 suffix = SECTION_NAME (unwsec) + len;
7651 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum;
7652 ++i, ++sec)
7653 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
7654 && streq (SECTION_NAME (sec) + len2, suffix))
7655 break;
7656 }
7657 else
7658 {
7659 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
7660 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
7661 len = sizeof (ELF_STRING_ia64_unwind) - 1;
7662 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
7663 suffix = "";
7664 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
7665 suffix = SECTION_NAME (unwsec) + len;
7666 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum;
7667 ++i, ++sec)
7668 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
7669 && streq (SECTION_NAME (sec) + len2, suffix))
7670 break;
7671 }
7672
7673 if (i == filedata->file_header.e_shnum)
7674 {
7675 printf (_("\nCould not find unwind info section for "));
7676
7677 if (filedata->string_table == NULL)
7678 printf ("%d", unwsec->sh_name);
7679 else
7680 printf ("'%s'", printable_section_name (filedata, unwsec));
7681 }
7682 else
7683 {
7684 aux.info_addr = sec->sh_addr;
7685 aux.info = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1,
7686 sec->sh_size,
7687 _("unwind info"));
7688 aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
7689
7690 printf (_("\nUnwind section "));
7691
7692 if (filedata->string_table == NULL)
7693 printf ("%d", unwsec->sh_name);
7694 else
7695 printf ("'%s'", printable_section_name (filedata, unwsec));
7696
7697 printf (_(" at offset 0x%lx contains %lu entries:\n"),
7698 (unsigned long) unwsec->sh_offset,
7699 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
7700
7701 if (slurp_ia64_unwind_table (filedata, & aux, unwsec)
7702 && aux.table_len > 0)
7703 dump_ia64_unwind (filedata, & aux);
7704
7705 if (aux.table)
7706 free ((char *) aux.table);
7707 if (aux.info)
7708 free ((char *) aux.info);
7709 aux.table = NULL;
7710 aux.info = NULL;
7711 }
7712 }
7713
7714 if (aux.symtab)
7715 free (aux.symtab);
7716 if (aux.strtab)
7717 free ((char *) aux.strtab);
7718
7719 return res;
7720 }
7721
7722 struct hppa_unw_table_entry
7723 {
7724 struct absaddr start;
7725 struct absaddr end;
7726 unsigned int Cannot_unwind:1; /* 0 */
7727 unsigned int Millicode:1; /* 1 */
7728 unsigned int Millicode_save_sr0:1; /* 2 */
7729 unsigned int Region_description:2; /* 3..4 */
7730 unsigned int reserved1:1; /* 5 */
7731 unsigned int Entry_SR:1; /* 6 */
7732 unsigned int Entry_FR:4; /* Number saved 7..10 */
7733 unsigned int Entry_GR:5; /* Number saved 11..15 */
7734 unsigned int Args_stored:1; /* 16 */
7735 unsigned int Variable_Frame:1; /* 17 */
7736 unsigned int Separate_Package_Body:1; /* 18 */
7737 unsigned int Frame_Extension_Millicode:1; /* 19 */
7738 unsigned int Stack_Overflow_Check:1; /* 20 */
7739 unsigned int Two_Instruction_SP_Increment:1; /* 21 */
7740 unsigned int Ada_Region:1; /* 22 */
7741 unsigned int cxx_info:1; /* 23 */
7742 unsigned int cxx_try_catch:1; /* 24 */
7743 unsigned int sched_entry_seq:1; /* 25 */
7744 unsigned int reserved2:1; /* 26 */
7745 unsigned int Save_SP:1; /* 27 */
7746 unsigned int Save_RP:1; /* 28 */
7747 unsigned int Save_MRP_in_frame:1; /* 29 */
7748 unsigned int extn_ptr_defined:1; /* 30 */
7749 unsigned int Cleanup_defined:1; /* 31 */
7750
7751 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
7752 unsigned int HP_UX_interrupt_marker:1; /* 1 */
7753 unsigned int Large_frame:1; /* 2 */
7754 unsigned int Pseudo_SP_Set:1; /* 3 */
7755 unsigned int reserved4:1; /* 4 */
7756 unsigned int Total_frame_size:27; /* 5..31 */
7757 };
7758
7759 struct hppa_unw_aux_info
7760 {
7761 struct hppa_unw_table_entry * table; /* Unwind table. */
7762 unsigned long table_len; /* Length of unwind table. */
7763 bfd_vma seg_base; /* Starting address of segment. */
7764 Elf_Internal_Sym * symtab; /* The symbol table. */
7765 unsigned long nsyms; /* Number of symbols. */
7766 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7767 unsigned long nfuns; /* Number of entries in funtab. */
7768 char * strtab; /* The string table. */
7769 unsigned long strtab_size; /* Size of string table. */
7770 };
7771
7772 static bfd_boolean
7773 dump_hppa_unwind (Filedata * filedata, struct hppa_unw_aux_info * aux)
7774 {
7775 struct hppa_unw_table_entry * tp;
7776 unsigned long j, nfuns;
7777 bfd_boolean res = TRUE;
7778
7779 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7780 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7781 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7782 aux->funtab[nfuns++] = aux->symtab[j];
7783 aux->nfuns = nfuns;
7784 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7785
7786 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7787 {
7788 bfd_vma offset;
7789 const char * procname;
7790
7791 find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
7792 aux->strtab_size, tp->start, &procname,
7793 &offset);
7794
7795 fputs ("\n<", stdout);
7796
7797 if (procname)
7798 {
7799 fputs (procname, stdout);
7800
7801 if (offset)
7802 printf ("+%lx", (unsigned long) offset);
7803 }
7804
7805 fputs (">: [", stdout);
7806 print_vma (tp->start.offset, PREFIX_HEX);
7807 fputc ('-', stdout);
7808 print_vma (tp->end.offset, PREFIX_HEX);
7809 printf ("]\n\t");
7810
7811 #define PF(_m) if (tp->_m) printf (#_m " ");
7812 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
7813 PF(Cannot_unwind);
7814 PF(Millicode);
7815 PF(Millicode_save_sr0);
7816 /* PV(Region_description); */
7817 PF(Entry_SR);
7818 PV(Entry_FR);
7819 PV(Entry_GR);
7820 PF(Args_stored);
7821 PF(Variable_Frame);
7822 PF(Separate_Package_Body);
7823 PF(Frame_Extension_Millicode);
7824 PF(Stack_Overflow_Check);
7825 PF(Two_Instruction_SP_Increment);
7826 PF(Ada_Region);
7827 PF(cxx_info);
7828 PF(cxx_try_catch);
7829 PF(sched_entry_seq);
7830 PF(Save_SP);
7831 PF(Save_RP);
7832 PF(Save_MRP_in_frame);
7833 PF(extn_ptr_defined);
7834 PF(Cleanup_defined);
7835 PF(MPE_XL_interrupt_marker);
7836 PF(HP_UX_interrupt_marker);
7837 PF(Large_frame);
7838 PF(Pseudo_SP_Set);
7839 PV(Total_frame_size);
7840 #undef PF
7841 #undef PV
7842 }
7843
7844 printf ("\n");
7845
7846 free (aux->funtab);
7847
7848 return res;
7849 }
7850
7851 static bfd_boolean
7852 slurp_hppa_unwind_table (Filedata * filedata,
7853 struct hppa_unw_aux_info * aux,
7854 Elf_Internal_Shdr * sec)
7855 {
7856 unsigned long size, unw_ent_size, nentries, nrelas, i;
7857 Elf_Internal_Phdr * seg;
7858 struct hppa_unw_table_entry * tep;
7859 Elf_Internal_Shdr * relsec;
7860 Elf_Internal_Rela * rela;
7861 Elf_Internal_Rela * rp;
7862 unsigned char * table;
7863 unsigned char * tp;
7864 Elf_Internal_Sym * sym;
7865 const char * relname;
7866
7867 /* First, find the starting address of the segment that includes
7868 this section. */
7869 if (filedata->file_header.e_phnum)
7870 {
7871 if (! get_program_headers (filedata))
7872 return FALSE;
7873
7874 for (seg = filedata->program_headers;
7875 seg < filedata->program_headers + filedata->file_header.e_phnum;
7876 ++seg)
7877 {
7878 if (seg->p_type != PT_LOAD)
7879 continue;
7880
7881 if (sec->sh_addr >= seg->p_vaddr
7882 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7883 {
7884 aux->seg_base = seg->p_vaddr;
7885 break;
7886 }
7887 }
7888 }
7889
7890 /* Second, build the unwind table from the contents of the unwind
7891 section. */
7892 size = sec->sh_size;
7893 table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
7894 _("unwind table"));
7895 if (!table)
7896 return FALSE;
7897
7898 unw_ent_size = 16;
7899 nentries = size / unw_ent_size;
7900 size = unw_ent_size * nentries;
7901
7902 tep = aux->table = (struct hppa_unw_table_entry *)
7903 xcmalloc (nentries, sizeof (aux->table[0]));
7904
7905 for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
7906 {
7907 unsigned int tmp1, tmp2;
7908
7909 tep->start.section = SHN_UNDEF;
7910 tep->end.section = SHN_UNDEF;
7911
7912 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
7913 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
7914 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
7915 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
7916
7917 tep->start.offset += aux->seg_base;
7918 tep->end.offset += aux->seg_base;
7919
7920 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
7921 tep->Millicode = (tmp1 >> 30) & 0x1;
7922 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
7923 tep->Region_description = (tmp1 >> 27) & 0x3;
7924 tep->reserved1 = (tmp1 >> 26) & 0x1;
7925 tep->Entry_SR = (tmp1 >> 25) & 0x1;
7926 tep->Entry_FR = (tmp1 >> 21) & 0xf;
7927 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
7928 tep->Args_stored = (tmp1 >> 15) & 0x1;
7929 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
7930 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
7931 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
7932 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
7933 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
7934 tep->Ada_Region = (tmp1 >> 9) & 0x1;
7935 tep->cxx_info = (tmp1 >> 8) & 0x1;
7936 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
7937 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
7938 tep->reserved2 = (tmp1 >> 5) & 0x1;
7939 tep->Save_SP = (tmp1 >> 4) & 0x1;
7940 tep->Save_RP = (tmp1 >> 3) & 0x1;
7941 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
7942 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
7943 tep->Cleanup_defined = tmp1 & 0x1;
7944
7945 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
7946 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
7947 tep->Large_frame = (tmp2 >> 29) & 0x1;
7948 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
7949 tep->reserved4 = (tmp2 >> 27) & 0x1;
7950 tep->Total_frame_size = tmp2 & 0x7ffffff;
7951 }
7952 free (table);
7953
7954 /* Third, apply any relocations to the unwind table. */
7955 for (relsec = filedata->section_headers;
7956 relsec < filedata->section_headers + filedata->file_header.e_shnum;
7957 ++relsec)
7958 {
7959 if (relsec->sh_type != SHT_RELA
7960 || relsec->sh_info >= filedata->file_header.e_shnum
7961 || filedata->section_headers + relsec->sh_info != sec)
7962 continue;
7963
7964 if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
7965 & rela, & nrelas))
7966 return FALSE;
7967
7968 for (rp = rela; rp < rela + nrelas; ++rp)
7969 {
7970 relname = elf_hppa_reloc_type (get_reloc_type (filedata, rp->r_info));
7971 sym = aux->symtab + get_reloc_symindex (rp->r_info);
7972
7973 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
7974 if (! const_strneq (relname, "R_PARISC_SEGREL"))
7975 {
7976 warn (_("Skipping unexpected relocation type %s\n"), relname);
7977 continue;
7978 }
7979
7980 i = rp->r_offset / unw_ent_size;
7981
7982 switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
7983 {
7984 case 0:
7985 aux->table[i].start.section = sym->st_shndx;
7986 aux->table[i].start.offset = sym->st_value + rp->r_addend;
7987 break;
7988 case 1:
7989 aux->table[i].end.section = sym->st_shndx;
7990 aux->table[i].end.offset = sym->st_value + rp->r_addend;
7991 break;
7992 default:
7993 break;
7994 }
7995 }
7996
7997 free (rela);
7998 }
7999
8000 aux->table_len = nentries;
8001
8002 return TRUE;
8003 }
8004
8005 static bfd_boolean
8006 hppa_process_unwind (Filedata * filedata)
8007 {
8008 struct hppa_unw_aux_info aux;
8009 Elf_Internal_Shdr * unwsec = NULL;
8010 Elf_Internal_Shdr * strsec;
8011 Elf_Internal_Shdr * sec;
8012 unsigned long i;
8013 bfd_boolean res = TRUE;
8014
8015 if (filedata->string_table == NULL)
8016 return FALSE;
8017
8018 memset (& aux, 0, sizeof (aux));
8019
8020 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
8021 {
8022 if (sec->sh_type == SHT_SYMTAB
8023 && sec->sh_link < filedata->file_header.e_shnum)
8024 {
8025 aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
8026
8027 strsec = filedata->section_headers + sec->sh_link;
8028 if (aux.strtab != NULL)
8029 {
8030 error (_("Multiple auxillary string tables encountered\n"));
8031 free (aux.strtab);
8032 res = FALSE;
8033 }
8034 aux.strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
8035 1, strsec->sh_size,
8036 _("string table"));
8037 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8038 }
8039 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
8040 unwsec = sec;
8041 }
8042
8043 if (!unwsec)
8044 printf (_("\nThere are no unwind sections in this file.\n"));
8045
8046 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
8047 {
8048 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
8049 {
8050 unsigned long num_unwind = sec->sh_size / (2 * eh_addr_size + 8);
8051
8052 printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
8053 "contains %lu entry:\n",
8054 "\nUnwind section '%s' at offset 0x%lx "
8055 "contains %lu entries:\n",
8056 num_unwind),
8057 printable_section_name (filedata, sec),
8058 (unsigned long) sec->sh_offset,
8059 num_unwind);
8060
8061 if (! slurp_hppa_unwind_table (filedata, &aux, sec))
8062 res = FALSE;
8063
8064 if (aux.table_len > 0)
8065 {
8066 if (! dump_hppa_unwind (filedata, &aux))
8067 res = FALSE;
8068 }
8069
8070 if (aux.table)
8071 free ((char *) aux.table);
8072 aux.table = NULL;
8073 }
8074 }
8075
8076 if (aux.symtab)
8077 free (aux.symtab);
8078 if (aux.strtab)
8079 free ((char *) aux.strtab);
8080
8081 return res;
8082 }
8083
8084 struct arm_section
8085 {
8086 unsigned char * data; /* The unwind data. */
8087 Elf_Internal_Shdr * sec; /* The cached unwind section header. */
8088 Elf_Internal_Rela * rela; /* The cached relocations for this section. */
8089 unsigned long nrelas; /* The number of relocations. */
8090 unsigned int rel_type; /* REL or RELA ? */
8091 Elf_Internal_Rela * next_rela; /* Cyclic pointer to the next reloc to process. */
8092 };
8093
8094 struct arm_unw_aux_info
8095 {
8096 Filedata * filedata; /* The file containing the unwind sections. */
8097 Elf_Internal_Sym * symtab; /* The file's symbol table. */
8098 unsigned long nsyms; /* Number of symbols. */
8099 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
8100 unsigned long nfuns; /* Number of these symbols. */
8101 char * strtab; /* The file's string table. */
8102 unsigned long strtab_size; /* Size of string table. */
8103 };
8104
8105 static const char *
8106 arm_print_vma_and_name (Filedata * filedata,
8107 struct arm_unw_aux_info * aux,
8108 bfd_vma fn,
8109 struct absaddr addr)
8110 {
8111 const char *procname;
8112 bfd_vma sym_offset;
8113
8114 if (addr.section == SHN_UNDEF)
8115 addr.offset = fn;
8116
8117 find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
8118 aux->strtab_size, addr, &procname,
8119 &sym_offset);
8120
8121 print_vma (fn, PREFIX_HEX);
8122
8123 if (procname)
8124 {
8125 fputs (" <", stdout);
8126 fputs (procname, stdout);
8127
8128 if (sym_offset)
8129 printf ("+0x%lx", (unsigned long) sym_offset);
8130 fputc ('>', stdout);
8131 }
8132
8133 return procname;
8134 }
8135
8136 static void
8137 arm_free_section (struct arm_section *arm_sec)
8138 {
8139 if (arm_sec->data != NULL)
8140 free (arm_sec->data);
8141
8142 if (arm_sec->rela != NULL)
8143 free (arm_sec->rela);
8144 }
8145
8146 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
8147 cached section and install SEC instead.
8148 2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
8149 and return its valued in * WORDP, relocating if necessary.
8150 3) Update the NEXT_RELA field in ARM_SEC and store the section index and
8151 relocation's offset in ADDR.
8152 4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
8153 into the string table of the symbol associated with the reloc. If no
8154 reloc was applied store -1 there.
8155 5) Return TRUE upon success, FALSE otherwise. */
8156
8157 static bfd_boolean
8158 get_unwind_section_word (Filedata * filedata,
8159 struct arm_unw_aux_info * aux,
8160 struct arm_section * arm_sec,
8161 Elf_Internal_Shdr * sec,
8162 bfd_vma word_offset,
8163 unsigned int * wordp,
8164 struct absaddr * addr,
8165 bfd_vma * sym_name)
8166 {
8167 Elf_Internal_Rela *rp;
8168 Elf_Internal_Sym *sym;
8169 const char * relname;
8170 unsigned int word;
8171 bfd_boolean wrapped;
8172
8173 if (sec == NULL || arm_sec == NULL)
8174 return FALSE;
8175
8176 addr->section = SHN_UNDEF;
8177 addr->offset = 0;
8178
8179 if (sym_name != NULL)
8180 *sym_name = (bfd_vma) -1;
8181
8182 /* If necessary, update the section cache. */
8183 if (sec != arm_sec->sec)
8184 {
8185 Elf_Internal_Shdr *relsec;
8186
8187 arm_free_section (arm_sec);
8188
8189 arm_sec->sec = sec;
8190 arm_sec->data = get_data (NULL, aux->filedata, sec->sh_offset, 1,
8191 sec->sh_size, _("unwind data"));
8192 arm_sec->rela = NULL;
8193 arm_sec->nrelas = 0;
8194
8195 for (relsec = filedata->section_headers;
8196 relsec < filedata->section_headers + filedata->file_header.e_shnum;
8197 ++relsec)
8198 {
8199 if (relsec->sh_info >= filedata->file_header.e_shnum
8200 || filedata->section_headers + relsec->sh_info != sec
8201 /* PR 15745: Check the section type as well. */
8202 || (relsec->sh_type != SHT_REL
8203 && relsec->sh_type != SHT_RELA))
8204 continue;
8205
8206 arm_sec->rel_type = relsec->sh_type;
8207 if (relsec->sh_type == SHT_REL)
8208 {
8209 if (!slurp_rel_relocs (aux->filedata, relsec->sh_offset,
8210 relsec->sh_size,
8211 & arm_sec->rela, & arm_sec->nrelas))
8212 return FALSE;
8213 }
8214 else /* relsec->sh_type == SHT_RELA */
8215 {
8216 if (!slurp_rela_relocs (aux->filedata, relsec->sh_offset,
8217 relsec->sh_size,
8218 & arm_sec->rela, & arm_sec->nrelas))
8219 return FALSE;
8220 }
8221 break;
8222 }
8223
8224 arm_sec->next_rela = arm_sec->rela;
8225 }
8226
8227 /* If there is no unwind data we can do nothing. */
8228 if (arm_sec->data == NULL)
8229 return FALSE;
8230
8231 /* If the offset is invalid then fail. */
8232 if (/* PR 21343 *//* PR 18879 */
8233 sec->sh_size < 4
8234 || word_offset > (sec->sh_size - 4)
8235 || ((bfd_signed_vma) word_offset) < 0)
8236 return FALSE;
8237
8238 /* Get the word at the required offset. */
8239 word = byte_get (arm_sec->data + word_offset, 4);
8240
8241 /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128. */
8242 if (arm_sec->rela == NULL)
8243 {
8244 * wordp = word;
8245 return TRUE;
8246 }
8247
8248 /* Look through the relocs to find the one that applies to the provided offset. */
8249 wrapped = FALSE;
8250 for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
8251 {
8252 bfd_vma prelval, offset;
8253
8254 if (rp->r_offset > word_offset && !wrapped)
8255 {
8256 rp = arm_sec->rela;
8257 wrapped = TRUE;
8258 }
8259 if (rp->r_offset > word_offset)
8260 break;
8261
8262 if (rp->r_offset & 3)
8263 {
8264 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
8265 (unsigned long) rp->r_offset);
8266 continue;
8267 }
8268
8269 if (rp->r_offset < word_offset)
8270 continue;
8271
8272 /* PR 17531: file: 027-161405-0.004 */
8273 if (aux->symtab == NULL)
8274 continue;
8275
8276 if (arm_sec->rel_type == SHT_REL)
8277 {
8278 offset = word & 0x7fffffff;
8279 if (offset & 0x40000000)
8280 offset |= ~ (bfd_vma) 0x7fffffff;
8281 }
8282 else if (arm_sec->rel_type == SHT_RELA)
8283 offset = rp->r_addend;
8284 else
8285 {
8286 error (_("Unknown section relocation type %d encountered\n"),
8287 arm_sec->rel_type);
8288 break;
8289 }
8290
8291 /* PR 17531 file: 027-1241568-0.004. */
8292 if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
8293 {
8294 error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
8295 (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
8296 break;
8297 }
8298
8299 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
8300 offset += sym->st_value;
8301 prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
8302
8303 /* Check that we are processing the expected reloc type. */
8304 if (filedata->file_header.e_machine == EM_ARM)
8305 {
8306 relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
8307 if (relname == NULL)
8308 {
8309 warn (_("Skipping unknown ARM relocation type: %d\n"),
8310 (int) ELF32_R_TYPE (rp->r_info));
8311 continue;
8312 }
8313
8314 if (streq (relname, "R_ARM_NONE"))
8315 continue;
8316
8317 if (! streq (relname, "R_ARM_PREL31"))
8318 {
8319 warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
8320 continue;
8321 }
8322 }
8323 else if (filedata->file_header.e_machine == EM_TI_C6000)
8324 {
8325 relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
8326 if (relname == NULL)
8327 {
8328 warn (_("Skipping unknown C6000 relocation type: %d\n"),
8329 (int) ELF32_R_TYPE (rp->r_info));
8330 continue;
8331 }
8332
8333 if (streq (relname, "R_C6000_NONE"))
8334 continue;
8335
8336 if (! streq (relname, "R_C6000_PREL31"))
8337 {
8338 warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
8339 continue;
8340 }
8341
8342 prelval >>= 1;
8343 }
8344 else
8345 {
8346 /* This function currently only supports ARM and TI unwinders. */
8347 warn (_("Only TI and ARM unwinders are currently supported\n"));
8348 break;
8349 }
8350
8351 word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
8352 addr->section = sym->st_shndx;
8353 addr->offset = offset;
8354
8355 if (sym_name)
8356 * sym_name = sym->st_name;
8357 break;
8358 }
8359
8360 *wordp = word;
8361 arm_sec->next_rela = rp;
8362
8363 return TRUE;
8364 }
8365
8366 static const char *tic6x_unwind_regnames[16] =
8367 {
8368 "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
8369 "A14", "A13", "A12", "A11", "A10",
8370 "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
8371 };
8372
8373 static void
8374 decode_tic6x_unwind_regmask (unsigned int mask)
8375 {
8376 int i;
8377
8378 for (i = 12; mask; mask >>= 1, i--)
8379 {
8380 if (mask & 1)
8381 {
8382 fputs (tic6x_unwind_regnames[i], stdout);
8383 if (mask > 1)
8384 fputs (", ", stdout);
8385 }
8386 }
8387 }
8388
8389 #define ADVANCE \
8390 if (remaining == 0 && more_words) \
8391 { \
8392 data_offset += 4; \
8393 if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec, \
8394 data_offset, & word, & addr, NULL)) \
8395 return FALSE; \
8396 remaining = 4; \
8397 more_words--; \
8398 } \
8399
8400 #define GET_OP(OP) \
8401 ADVANCE; \
8402 if (remaining) \
8403 { \
8404 remaining--; \
8405 (OP) = word >> 24; \
8406 word <<= 8; \
8407 } \
8408 else \
8409 { \
8410 printf (_("[Truncated opcode]\n")); \
8411 return FALSE; \
8412 } \
8413 printf ("0x%02x ", OP)
8414
8415 static bfd_boolean
8416 decode_arm_unwind_bytecode (Filedata * filedata,
8417 struct arm_unw_aux_info * aux,
8418 unsigned int word,
8419 unsigned int remaining,
8420 unsigned int more_words,
8421 bfd_vma data_offset,
8422 Elf_Internal_Shdr * data_sec,
8423 struct arm_section * data_arm_sec)
8424 {
8425 struct absaddr addr;
8426 bfd_boolean res = TRUE;
8427
8428 /* Decode the unwinding instructions. */
8429 while (1)
8430 {
8431 unsigned int op, op2;
8432
8433 ADVANCE;
8434 if (remaining == 0)
8435 break;
8436 remaining--;
8437 op = word >> 24;
8438 word <<= 8;
8439
8440 printf (" 0x%02x ", op);
8441
8442 if ((op & 0xc0) == 0x00)
8443 {
8444 int offset = ((op & 0x3f) << 2) + 4;
8445
8446 printf (" vsp = vsp + %d", offset);
8447 }
8448 else if ((op & 0xc0) == 0x40)
8449 {
8450 int offset = ((op & 0x3f) << 2) + 4;
8451
8452 printf (" vsp = vsp - %d", offset);
8453 }
8454 else if ((op & 0xf0) == 0x80)
8455 {
8456 GET_OP (op2);
8457 if (op == 0x80 && op2 == 0)
8458 printf (_("Refuse to unwind"));
8459 else
8460 {
8461 unsigned int mask = ((op & 0x0f) << 8) | op2;
8462 bfd_boolean first = TRUE;
8463 int i;
8464
8465 printf ("pop {");
8466 for (i = 0; i < 12; i++)
8467 if (mask & (1 << i))
8468 {
8469 if (first)
8470 first = FALSE;
8471 else
8472 printf (", ");
8473 printf ("r%d", 4 + i);
8474 }
8475 printf ("}");
8476 }
8477 }
8478 else if ((op & 0xf0) == 0x90)
8479 {
8480 if (op == 0x9d || op == 0x9f)
8481 printf (_(" [Reserved]"));
8482 else
8483 printf (" vsp = r%d", op & 0x0f);
8484 }
8485 else if ((op & 0xf0) == 0xa0)
8486 {
8487 int end = 4 + (op & 0x07);
8488 bfd_boolean first = TRUE;
8489 int i;
8490
8491 printf (" pop {");
8492 for (i = 4; i <= end; i++)
8493 {
8494 if (first)
8495 first = FALSE;
8496 else
8497 printf (", ");
8498 printf ("r%d", i);
8499 }
8500 if (op & 0x08)
8501 {
8502 if (!first)
8503 printf (", ");
8504 printf ("r14");
8505 }
8506 printf ("}");
8507 }
8508 else if (op == 0xb0)
8509 printf (_(" finish"));
8510 else if (op == 0xb1)
8511 {
8512 GET_OP (op2);
8513 if (op2 == 0 || (op2 & 0xf0) != 0)
8514 printf (_("[Spare]"));
8515 else
8516 {
8517 unsigned int mask = op2 & 0x0f;
8518 bfd_boolean first = TRUE;
8519 int i;
8520
8521 printf ("pop {");
8522 for (i = 0; i < 12; i++)
8523 if (mask & (1 << i))
8524 {
8525 if (first)
8526 first = FALSE;
8527 else
8528 printf (", ");
8529 printf ("r%d", i);
8530 }
8531 printf ("}");
8532 }
8533 }
8534 else if (op == 0xb2)
8535 {
8536 unsigned char buf[9];
8537 unsigned int i, len;
8538 unsigned long offset;
8539
8540 for (i = 0; i < sizeof (buf); i++)
8541 {
8542 GET_OP (buf[i]);
8543 if ((buf[i] & 0x80) == 0)
8544 break;
8545 }
8546 if (i == sizeof (buf))
8547 {
8548 error (_("corrupt change to vsp"));
8549 res = FALSE;
8550 }
8551 else
8552 {
8553 offset = read_uleb128 (buf, &len, buf + i + 1);
8554 assert (len == i + 1);
8555 offset = offset * 4 + 0x204;
8556 printf ("vsp = vsp + %ld", offset);
8557 }
8558 }
8559 else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
8560 {
8561 unsigned int first, last;
8562
8563 GET_OP (op2);
8564 first = op2 >> 4;
8565 last = op2 & 0x0f;
8566 if (op == 0xc8)
8567 first = first + 16;
8568 printf ("pop {D%d", first);
8569 if (last)
8570 printf ("-D%d", first + last);
8571 printf ("}");
8572 }
8573 else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
8574 {
8575 unsigned int count = op & 0x07;
8576
8577 printf ("pop {D8");
8578 if (count)
8579 printf ("-D%d", 8 + count);
8580 printf ("}");
8581 }
8582 else if (op >= 0xc0 && op <= 0xc5)
8583 {
8584 unsigned int count = op & 0x07;
8585
8586 printf (" pop {wR10");
8587 if (count)
8588 printf ("-wR%d", 10 + count);
8589 printf ("}");
8590 }
8591 else if (op == 0xc6)
8592 {
8593 unsigned int first, last;
8594
8595 GET_OP (op2);
8596 first = op2 >> 4;
8597 last = op2 & 0x0f;
8598 printf ("pop {wR%d", first);
8599 if (last)
8600 printf ("-wR%d", first + last);
8601 printf ("}");
8602 }
8603 else if (op == 0xc7)
8604 {
8605 GET_OP (op2);
8606 if (op2 == 0 || (op2 & 0xf0) != 0)
8607 printf (_("[Spare]"));
8608 else
8609 {
8610 unsigned int mask = op2 & 0x0f;
8611 bfd_boolean first = TRUE;
8612 int i;
8613
8614 printf ("pop {");
8615 for (i = 0; i < 4; i++)
8616 if (mask & (1 << i))
8617 {
8618 if (first)
8619 first = FALSE;
8620 else
8621 printf (", ");
8622 printf ("wCGR%d", i);
8623 }
8624 printf ("}");
8625 }
8626 }
8627 else
8628 {
8629 printf (_(" [unsupported opcode]"));
8630 res = FALSE;
8631 }
8632
8633 printf ("\n");
8634 }
8635
8636 return res;
8637 }
8638
8639 static bfd_boolean
8640 decode_tic6x_unwind_bytecode (Filedata * filedata,
8641 struct arm_unw_aux_info * aux,
8642 unsigned int word,
8643 unsigned int remaining,
8644 unsigned int more_words,
8645 bfd_vma data_offset,
8646 Elf_Internal_Shdr * data_sec,
8647 struct arm_section * data_arm_sec)
8648 {
8649 struct absaddr addr;
8650
8651 /* Decode the unwinding instructions. */
8652 while (1)
8653 {
8654 unsigned int op, op2;
8655
8656 ADVANCE;
8657 if (remaining == 0)
8658 break;
8659 remaining--;
8660 op = word >> 24;
8661 word <<= 8;
8662
8663 printf (" 0x%02x ", op);
8664
8665 if ((op & 0xc0) == 0x00)
8666 {
8667 int offset = ((op & 0x3f) << 3) + 8;
8668 printf (" sp = sp + %d", offset);
8669 }
8670 else if ((op & 0xc0) == 0x80)
8671 {
8672 GET_OP (op2);
8673 if (op == 0x80 && op2 == 0)
8674 printf (_("Refuse to unwind"));
8675 else
8676 {
8677 unsigned int mask = ((op & 0x1f) << 8) | op2;
8678 if (op & 0x20)
8679 printf ("pop compact {");
8680 else
8681 printf ("pop {");
8682
8683 decode_tic6x_unwind_regmask (mask);
8684 printf("}");
8685 }
8686 }
8687 else if ((op & 0xf0) == 0xc0)
8688 {
8689 unsigned int reg;
8690 unsigned int nregs;
8691 unsigned int i;
8692 const char *name;
8693 struct
8694 {
8695 unsigned int offset;
8696 unsigned int reg;
8697 } regpos[16];
8698
8699 /* Scan entire instruction first so that GET_OP output is not
8700 interleaved with disassembly. */
8701 nregs = 0;
8702 for (i = 0; nregs < (op & 0xf); i++)
8703 {
8704 GET_OP (op2);
8705 reg = op2 >> 4;
8706 if (reg != 0xf)
8707 {
8708 regpos[nregs].offset = i * 2;
8709 regpos[nregs].reg = reg;
8710 nregs++;
8711 }
8712
8713 reg = op2 & 0xf;
8714 if (reg != 0xf)
8715 {
8716 regpos[nregs].offset = i * 2 + 1;
8717 regpos[nregs].reg = reg;
8718 nregs++;
8719 }
8720 }
8721
8722 printf (_("pop frame {"));
8723 reg = nregs - 1;
8724 for (i = i * 2; i > 0; i--)
8725 {
8726 if (regpos[reg].offset == i - 1)
8727 {
8728 name = tic6x_unwind_regnames[regpos[reg].reg];
8729 if (reg > 0)
8730 reg--;
8731 }
8732 else
8733 name = _("[pad]");
8734
8735 fputs (name, stdout);
8736 if (i > 1)
8737 printf (", ");
8738 }
8739
8740 printf ("}");
8741 }
8742 else if (op == 0xd0)
8743 printf (" MOV FP, SP");
8744 else if (op == 0xd1)
8745 printf (" __c6xabi_pop_rts");
8746 else if (op == 0xd2)
8747 {
8748 unsigned char buf[9];
8749 unsigned int i, len;
8750 unsigned long offset;
8751
8752 for (i = 0; i < sizeof (buf); i++)
8753 {
8754 GET_OP (buf[i]);
8755 if ((buf[i] & 0x80) == 0)
8756 break;
8757 }
8758 /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2. */
8759 if (i == sizeof (buf))
8760 {
8761 warn (_("Corrupt stack pointer adjustment detected\n"));
8762 return FALSE;
8763 }
8764
8765 offset = read_uleb128 (buf, &len, buf + i + 1);
8766 assert (len == i + 1);
8767 offset = offset * 8 + 0x408;
8768 printf (_("sp = sp + %ld"), offset);
8769 }
8770 else if ((op & 0xf0) == 0xe0)
8771 {
8772 if ((op & 0x0f) == 7)
8773 printf (" RETURN");
8774 else
8775 printf (" MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
8776 }
8777 else
8778 {
8779 printf (_(" [unsupported opcode]"));
8780 }
8781 putchar ('\n');
8782 }
8783
8784 return TRUE;
8785 }
8786
8787 static bfd_vma
8788 arm_expand_prel31 (Filedata * filedata, bfd_vma word, bfd_vma where)
8789 {
8790 bfd_vma offset;
8791
8792 offset = word & 0x7fffffff;
8793 if (offset & 0x40000000)
8794 offset |= ~ (bfd_vma) 0x7fffffff;
8795
8796 if (filedata->file_header.e_machine == EM_TI_C6000)
8797 offset <<= 1;
8798
8799 return offset + where;
8800 }
8801
8802 static bfd_boolean
8803 decode_arm_unwind (Filedata * filedata,
8804 struct arm_unw_aux_info * aux,
8805 unsigned int word,
8806 unsigned int remaining,
8807 bfd_vma data_offset,
8808 Elf_Internal_Shdr * data_sec,
8809 struct arm_section * data_arm_sec)
8810 {
8811 int per_index;
8812 unsigned int more_words = 0;
8813 struct absaddr addr;
8814 bfd_vma sym_name = (bfd_vma) -1;
8815 bfd_boolean res = TRUE;
8816
8817 if (remaining == 0)
8818 {
8819 /* Fetch the first word.
8820 Note - when decoding an object file the address extracted
8821 here will always be 0. So we also pass in the sym_name
8822 parameter so that we can find the symbol associated with
8823 the personality routine. */
8824 if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec, data_offset,
8825 & word, & addr, & sym_name))
8826 return FALSE;
8827
8828 remaining = 4;
8829 }
8830
8831 if ((word & 0x80000000) == 0)
8832 {
8833 /* Expand prel31 for personality routine. */
8834 bfd_vma fn;
8835 const char *procname;
8836
8837 fn = arm_expand_prel31 (filedata, word, data_sec->sh_addr + data_offset);
8838 printf (_(" Personality routine: "));
8839 if (fn == 0
8840 && addr.section == SHN_UNDEF && addr.offset == 0
8841 && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
8842 {
8843 procname = aux->strtab + sym_name;
8844 print_vma (fn, PREFIX_HEX);
8845 if (procname)
8846 {
8847 fputs (" <", stdout);
8848 fputs (procname, stdout);
8849 fputc ('>', stdout);
8850 }
8851 }
8852 else
8853 procname = arm_print_vma_and_name (filedata, aux, fn, addr);
8854 fputc ('\n', stdout);
8855
8856 /* The GCC personality routines use the standard compact
8857 encoding, starting with one byte giving the number of
8858 words. */
8859 if (procname != NULL
8860 && (const_strneq (procname, "__gcc_personality_v0")
8861 || const_strneq (procname, "__gxx_personality_v0")
8862 || const_strneq (procname, "__gcj_personality_v0")
8863 || const_strneq (procname, "__gnu_objc_personality_v0")))
8864 {
8865 remaining = 0;
8866 more_words = 1;
8867 ADVANCE;
8868 if (!remaining)
8869 {
8870 printf (_(" [Truncated data]\n"));
8871 return FALSE;
8872 }
8873 more_words = word >> 24;
8874 word <<= 8;
8875 remaining--;
8876 per_index = -1;
8877 }
8878 else
8879 return TRUE;
8880 }
8881 else
8882 {
8883 /* ARM EHABI Section 6.3:
8884
8885 An exception-handling table entry for the compact model looks like:
8886
8887 31 30-28 27-24 23-0
8888 -- ----- ----- ----
8889 1 0 index Data for personalityRoutine[index] */
8890
8891 if (filedata->file_header.e_machine == EM_ARM
8892 && (word & 0x70000000))
8893 {
8894 warn (_("Corrupt ARM compact model table entry: %x \n"), word);
8895 res = FALSE;
8896 }
8897
8898 per_index = (word >> 24) & 0x7f;
8899 printf (_(" Compact model index: %d\n"), per_index);
8900 if (per_index == 0)
8901 {
8902 more_words = 0;
8903 word <<= 8;
8904 remaining--;
8905 }
8906 else if (per_index < 3)
8907 {
8908 more_words = (word >> 16) & 0xff;
8909 word <<= 16;
8910 remaining -= 2;
8911 }
8912 }
8913
8914 switch (filedata->file_header.e_machine)
8915 {
8916 case EM_ARM:
8917 if (per_index < 3)
8918 {
8919 if (! decode_arm_unwind_bytecode (filedata, aux, word, remaining, more_words,
8920 data_offset, data_sec, data_arm_sec))
8921 res = FALSE;
8922 }
8923 else
8924 {
8925 warn (_("Unknown ARM compact model index encountered\n"));
8926 printf (_(" [reserved]\n"));
8927 res = FALSE;
8928 }
8929 break;
8930
8931 case EM_TI_C6000:
8932 if (per_index < 3)
8933 {
8934 if (! decode_tic6x_unwind_bytecode (filedata, aux, word, remaining, more_words,
8935 data_offset, data_sec, data_arm_sec))
8936 res = FALSE;
8937 }
8938 else if (per_index < 5)
8939 {
8940 if (((word >> 17) & 0x7f) == 0x7f)
8941 printf (_(" Restore stack from frame pointer\n"));
8942 else
8943 printf (_(" Stack increment %d\n"), (word >> 14) & 0x1fc);
8944 printf (_(" Registers restored: "));
8945 if (per_index == 4)
8946 printf (" (compact) ");
8947 decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
8948 putchar ('\n');
8949 printf (_(" Return register: %s\n"),
8950 tic6x_unwind_regnames[word & 0xf]);
8951 }
8952 else
8953 printf (_(" [reserved (%d)]\n"), per_index);
8954 break;
8955
8956 default:
8957 error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
8958 filedata->file_header.e_machine);
8959 res = FALSE;
8960 }
8961
8962 /* Decode the descriptors. Not implemented. */
8963
8964 return res;
8965 }
8966
8967 static bfd_boolean
8968 dump_arm_unwind (Filedata * filedata,
8969 struct arm_unw_aux_info * aux,
8970 Elf_Internal_Shdr * exidx_sec)
8971 {
8972 struct arm_section exidx_arm_sec, extab_arm_sec;
8973 unsigned int i, exidx_len;
8974 unsigned long j, nfuns;
8975 bfd_boolean res = TRUE;
8976
8977 memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
8978 memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
8979 exidx_len = exidx_sec->sh_size / 8;
8980
8981 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
8982 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
8983 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
8984 aux->funtab[nfuns++] = aux->symtab[j];
8985 aux->nfuns = nfuns;
8986 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
8987
8988 for (i = 0; i < exidx_len; i++)
8989 {
8990 unsigned int exidx_fn, exidx_entry;
8991 struct absaddr fn_addr, entry_addr;
8992 bfd_vma fn;
8993
8994 fputc ('\n', stdout);
8995
8996 if (! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
8997 8 * i, & exidx_fn, & fn_addr, NULL)
8998 || ! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
8999 8 * i + 4, & exidx_entry, & entry_addr, NULL))
9000 {
9001 free (aux->funtab);
9002 arm_free_section (& exidx_arm_sec);
9003 arm_free_section (& extab_arm_sec);
9004 return FALSE;
9005 }
9006
9007 /* ARM EHABI, Section 5:
9008 An index table entry consists of 2 words.
9009 The first word contains a prel31 offset to the start of a function, with bit 31 clear. */
9010 if (exidx_fn & 0x80000000)
9011 {
9012 warn (_("corrupt index table entry: %x\n"), exidx_fn);
9013 res = FALSE;
9014 }
9015
9016 fn = arm_expand_prel31 (filedata, exidx_fn, exidx_sec->sh_addr + 8 * i);
9017
9018 arm_print_vma_and_name (filedata, aux, fn, fn_addr);
9019 fputs (": ", stdout);
9020
9021 if (exidx_entry == 1)
9022 {
9023 print_vma (exidx_entry, PREFIX_HEX);
9024 fputs (" [cantunwind]\n", stdout);
9025 }
9026 else if (exidx_entry & 0x80000000)
9027 {
9028 print_vma (exidx_entry, PREFIX_HEX);
9029 fputc ('\n', stdout);
9030 decode_arm_unwind (filedata, aux, exidx_entry, 4, 0, NULL, NULL);
9031 }
9032 else
9033 {
9034 bfd_vma table, table_offset = 0;
9035 Elf_Internal_Shdr *table_sec;
9036
9037 fputs ("@", stdout);
9038 table = arm_expand_prel31 (filedata, exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
9039 print_vma (table, PREFIX_HEX);
9040 printf ("\n");
9041
9042 /* Locate the matching .ARM.extab. */
9043 if (entry_addr.section != SHN_UNDEF
9044 && entry_addr.section < filedata->file_header.e_shnum)
9045 {
9046 table_sec = filedata->section_headers + entry_addr.section;
9047 table_offset = entry_addr.offset;
9048 /* PR 18879 */
9049 if (table_offset > table_sec->sh_size
9050 || ((bfd_signed_vma) table_offset) < 0)
9051 {
9052 warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
9053 (unsigned long) table_offset,
9054 printable_section_name (filedata, table_sec));
9055 res = FALSE;
9056 continue;
9057 }
9058 }
9059 else
9060 {
9061 table_sec = find_section_by_address (filedata, table);
9062 if (table_sec != NULL)
9063 table_offset = table - table_sec->sh_addr;
9064 }
9065
9066 if (table_sec == NULL)
9067 {
9068 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
9069 (unsigned long) table);
9070 res = FALSE;
9071 continue;
9072 }
9073
9074 if (! decode_arm_unwind (filedata, aux, 0, 0, table_offset, table_sec,
9075 &extab_arm_sec))
9076 res = FALSE;
9077 }
9078 }
9079
9080 printf ("\n");
9081
9082 free (aux->funtab);
9083 arm_free_section (&exidx_arm_sec);
9084 arm_free_section (&extab_arm_sec);
9085
9086 return res;
9087 }
9088
9089 /* Used for both ARM and C6X unwinding tables. */
9090
9091 static bfd_boolean
9092 arm_process_unwind (Filedata * filedata)
9093 {
9094 struct arm_unw_aux_info aux;
9095 Elf_Internal_Shdr *unwsec = NULL;
9096 Elf_Internal_Shdr *strsec;
9097 Elf_Internal_Shdr *sec;
9098 unsigned long i;
9099 unsigned int sec_type;
9100 bfd_boolean res = TRUE;
9101
9102 switch (filedata->file_header.e_machine)
9103 {
9104 case EM_ARM:
9105 sec_type = SHT_ARM_EXIDX;
9106 break;
9107
9108 case EM_TI_C6000:
9109 sec_type = SHT_C6000_UNWIND;
9110 break;
9111
9112 default:
9113 error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
9114 filedata->file_header.e_machine);
9115 return FALSE;
9116 }
9117
9118 if (filedata->string_table == NULL)
9119 return FALSE;
9120
9121 memset (& aux, 0, sizeof (aux));
9122 aux.filedata = filedata;
9123
9124 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
9125 {
9126 if (sec->sh_type == SHT_SYMTAB && sec->sh_link < filedata->file_header.e_shnum)
9127 {
9128 aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
9129
9130 strsec = filedata->section_headers + sec->sh_link;
9131
9132 /* PR binutils/17531 file: 011-12666-0.004. */
9133 if (aux.strtab != NULL)
9134 {
9135 error (_("Multiple string tables found in file.\n"));
9136 free (aux.strtab);
9137 res = FALSE;
9138 }
9139 aux.strtab = get_data (NULL, filedata, strsec->sh_offset,
9140 1, strsec->sh_size, _("string table"));
9141 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
9142 }
9143 else if (sec->sh_type == sec_type)
9144 unwsec = sec;
9145 }
9146
9147 if (unwsec == NULL)
9148 printf (_("\nThere are no unwind sections in this file.\n"));
9149 else
9150 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
9151 {
9152 if (sec->sh_type == sec_type)
9153 {
9154 unsigned long num_unwind = sec->sh_size / (2 * eh_addr_size);
9155 printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
9156 "contains %lu entry:\n",
9157 "\nUnwind section '%s' at offset 0x%lx "
9158 "contains %lu entries:\n",
9159 num_unwind),
9160 printable_section_name (filedata, sec),
9161 (unsigned long) sec->sh_offset,
9162 num_unwind);
9163
9164 if (! dump_arm_unwind (filedata, &aux, sec))
9165 res = FALSE;
9166 }
9167 }
9168
9169 if (aux.symtab)
9170 free (aux.symtab);
9171 if (aux.strtab)
9172 free ((char *) aux.strtab);
9173
9174 return res;
9175 }
9176
9177 static bfd_boolean
9178 process_unwind (Filedata * filedata)
9179 {
9180 struct unwind_handler
9181 {
9182 unsigned int machtype;
9183 bfd_boolean (* handler)(Filedata *);
9184 } handlers[] =
9185 {
9186 { EM_ARM, arm_process_unwind },
9187 { EM_IA_64, ia64_process_unwind },
9188 { EM_PARISC, hppa_process_unwind },
9189 { EM_TI_C6000, arm_process_unwind },
9190 { 0, NULL }
9191 };
9192 int i;
9193
9194 if (!do_unwind)
9195 return TRUE;
9196
9197 for (i = 0; handlers[i].handler != NULL; i++)
9198 if (filedata->file_header.e_machine == handlers[i].machtype)
9199 return handlers[i].handler (filedata);
9200
9201 printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
9202 get_machine_name (filedata->file_header.e_machine));
9203 return TRUE;
9204 }
9205
9206 static void
9207 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
9208 {
9209 switch (entry->d_tag)
9210 {
9211 case DT_MIPS_FLAGS:
9212 if (entry->d_un.d_val == 0)
9213 printf (_("NONE"));
9214 else
9215 {
9216 static const char * opts[] =
9217 {
9218 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
9219 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
9220 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
9221 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
9222 "RLD_ORDER_SAFE"
9223 };
9224 unsigned int cnt;
9225 bfd_boolean first = TRUE;
9226
9227 for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
9228 if (entry->d_un.d_val & (1 << cnt))
9229 {
9230 printf ("%s%s", first ? "" : " ", opts[cnt]);
9231 first = FALSE;
9232 }
9233 }
9234 break;
9235
9236 case DT_MIPS_IVERSION:
9237 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9238 printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
9239 else
9240 {
9241 char buf[40];
9242 sprintf_vma (buf, entry->d_un.d_ptr);
9243 /* Note: coded this way so that there is a single string for translation. */
9244 printf (_("<corrupt: %s>"), buf);
9245 }
9246 break;
9247
9248 case DT_MIPS_TIME_STAMP:
9249 {
9250 char timebuf[128];
9251 struct tm * tmp;
9252 time_t atime = entry->d_un.d_val;
9253
9254 tmp = gmtime (&atime);
9255 /* PR 17531: file: 6accc532. */
9256 if (tmp == NULL)
9257 snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
9258 else
9259 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
9260 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9261 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9262 printf (_("Time Stamp: %s"), timebuf);
9263 }
9264 break;
9265
9266 case DT_MIPS_RLD_VERSION:
9267 case DT_MIPS_LOCAL_GOTNO:
9268 case DT_MIPS_CONFLICTNO:
9269 case DT_MIPS_LIBLISTNO:
9270 case DT_MIPS_SYMTABNO:
9271 case DT_MIPS_UNREFEXTNO:
9272 case DT_MIPS_HIPAGENO:
9273 case DT_MIPS_DELTA_CLASS_NO:
9274 case DT_MIPS_DELTA_INSTANCE_NO:
9275 case DT_MIPS_DELTA_RELOC_NO:
9276 case DT_MIPS_DELTA_SYM_NO:
9277 case DT_MIPS_DELTA_CLASSSYM_NO:
9278 case DT_MIPS_COMPACT_SIZE:
9279 print_vma (entry->d_un.d_val, DEC);
9280 break;
9281
9282 default:
9283 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9284 }
9285 putchar ('\n');
9286 }
9287
9288 static void
9289 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
9290 {
9291 switch (entry->d_tag)
9292 {
9293 case DT_HP_DLD_FLAGS:
9294 {
9295 static struct
9296 {
9297 long int bit;
9298 const char * str;
9299 }
9300 flags[] =
9301 {
9302 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
9303 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
9304 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
9305 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
9306 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
9307 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
9308 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
9309 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
9310 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
9311 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
9312 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
9313 { DT_HP_GST, "HP_GST" },
9314 { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
9315 { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
9316 { DT_HP_NODELETE, "HP_NODELETE" },
9317 { DT_HP_GROUP, "HP_GROUP" },
9318 { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
9319 };
9320 bfd_boolean first = TRUE;
9321 size_t cnt;
9322 bfd_vma val = entry->d_un.d_val;
9323
9324 for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
9325 if (val & flags[cnt].bit)
9326 {
9327 if (! first)
9328 putchar (' ');
9329 fputs (flags[cnt].str, stdout);
9330 first = FALSE;
9331 val ^= flags[cnt].bit;
9332 }
9333
9334 if (val != 0 || first)
9335 {
9336 if (! first)
9337 putchar (' ');
9338 print_vma (val, HEX);
9339 }
9340 }
9341 break;
9342
9343 default:
9344 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9345 break;
9346 }
9347 putchar ('\n');
9348 }
9349
9350 #ifdef BFD64
9351
9352 /* VMS vs Unix time offset and factor. */
9353
9354 #define VMS_EPOCH_OFFSET 35067168000000000LL
9355 #define VMS_GRANULARITY_FACTOR 10000000
9356
9357 /* Display a VMS time in a human readable format. */
9358
9359 static void
9360 print_vms_time (bfd_int64_t vmstime)
9361 {
9362 struct tm *tm;
9363 time_t unxtime;
9364
9365 unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
9366 tm = gmtime (&unxtime);
9367 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
9368 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
9369 tm->tm_hour, tm->tm_min, tm->tm_sec);
9370 }
9371 #endif /* BFD64 */
9372
9373 static void
9374 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
9375 {
9376 switch (entry->d_tag)
9377 {
9378 case DT_IA_64_PLT_RESERVE:
9379 /* First 3 slots reserved. */
9380 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9381 printf (" -- ");
9382 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
9383 break;
9384
9385 case DT_IA_64_VMS_LINKTIME:
9386 #ifdef BFD64
9387 print_vms_time (entry->d_un.d_val);
9388 #endif
9389 break;
9390
9391 case DT_IA_64_VMS_LNKFLAGS:
9392 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9393 if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
9394 printf (" CALL_DEBUG");
9395 if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
9396 printf (" NOP0BUFS");
9397 if (entry->d_un.d_val & VMS_LF_P0IMAGE)
9398 printf (" P0IMAGE");
9399 if (entry->d_un.d_val & VMS_LF_MKTHREADS)
9400 printf (" MKTHREADS");
9401 if (entry->d_un.d_val & VMS_LF_UPCALLS)
9402 printf (" UPCALLS");
9403 if (entry->d_un.d_val & VMS_LF_IMGSTA)
9404 printf (" IMGSTA");
9405 if (entry->d_un.d_val & VMS_LF_INITIALIZE)
9406 printf (" INITIALIZE");
9407 if (entry->d_un.d_val & VMS_LF_MAIN)
9408 printf (" MAIN");
9409 if (entry->d_un.d_val & VMS_LF_EXE_INIT)
9410 printf (" EXE_INIT");
9411 if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
9412 printf (" TBK_IN_IMG");
9413 if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
9414 printf (" DBG_IN_IMG");
9415 if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
9416 printf (" TBK_IN_DSF");
9417 if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
9418 printf (" DBG_IN_DSF");
9419 if (entry->d_un.d_val & VMS_LF_SIGNATURES)
9420 printf (" SIGNATURES");
9421 if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
9422 printf (" REL_SEG_OFF");
9423 break;
9424
9425 default:
9426 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9427 break;
9428 }
9429 putchar ('\n');
9430 }
9431
9432 static bfd_boolean
9433 get_32bit_dynamic_section (Filedata * filedata)
9434 {
9435 Elf32_External_Dyn * edyn;
9436 Elf32_External_Dyn * ext;
9437 Elf_Internal_Dyn * entry;
9438
9439 edyn = (Elf32_External_Dyn *) get_data (NULL, filedata, dynamic_addr, 1,
9440 dynamic_size, _("dynamic section"));
9441 if (!edyn)
9442 return FALSE;
9443
9444 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9445 might not have the luxury of section headers. Look for the DT_NULL
9446 terminator to determine the number of entries. */
9447 for (ext = edyn, dynamic_nent = 0;
9448 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9449 ext++)
9450 {
9451 dynamic_nent++;
9452 if (BYTE_GET (ext->d_tag) == DT_NULL)
9453 break;
9454 }
9455
9456 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9457 sizeof (* entry));
9458 if (dynamic_section == NULL)
9459 {
9460 error (_("Out of memory allocating space for %lu dynamic entries\n"),
9461 (unsigned long) dynamic_nent);
9462 free (edyn);
9463 return FALSE;
9464 }
9465
9466 for (ext = edyn, entry = dynamic_section;
9467 entry < dynamic_section + dynamic_nent;
9468 ext++, entry++)
9469 {
9470 entry->d_tag = BYTE_GET (ext->d_tag);
9471 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9472 }
9473
9474 free (edyn);
9475
9476 return TRUE;
9477 }
9478
9479 static bfd_boolean
9480 get_64bit_dynamic_section (Filedata * filedata)
9481 {
9482 Elf64_External_Dyn * edyn;
9483 Elf64_External_Dyn * ext;
9484 Elf_Internal_Dyn * entry;
9485
9486 /* Read in the data. */
9487 edyn = (Elf64_External_Dyn *) get_data (NULL, filedata, dynamic_addr, 1,
9488 dynamic_size, _("dynamic section"));
9489 if (!edyn)
9490 return FALSE;
9491
9492 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9493 might not have the luxury of section headers. Look for the DT_NULL
9494 terminator to determine the number of entries. */
9495 for (ext = edyn, dynamic_nent = 0;
9496 /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer. */
9497 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9498 ext++)
9499 {
9500 dynamic_nent++;
9501 if (BYTE_GET (ext->d_tag) == DT_NULL)
9502 break;
9503 }
9504
9505 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9506 sizeof (* entry));
9507 if (dynamic_section == NULL)
9508 {
9509 error (_("Out of memory allocating space for %lu dynamic entries\n"),
9510 (unsigned long) dynamic_nent);
9511 free (edyn);
9512 return FALSE;
9513 }
9514
9515 /* Convert from external to internal formats. */
9516 for (ext = edyn, entry = dynamic_section;
9517 entry < dynamic_section + dynamic_nent;
9518 ext++, entry++)
9519 {
9520 entry->d_tag = BYTE_GET (ext->d_tag);
9521 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9522 }
9523
9524 free (edyn);
9525
9526 return TRUE;
9527 }
9528
9529 static void
9530 print_dynamic_flags (bfd_vma flags)
9531 {
9532 bfd_boolean first = TRUE;
9533
9534 while (flags)
9535 {
9536 bfd_vma flag;
9537
9538 flag = flags & - flags;
9539 flags &= ~ flag;
9540
9541 if (first)
9542 first = FALSE;
9543 else
9544 putc (' ', stdout);
9545
9546 switch (flag)
9547 {
9548 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
9549 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
9550 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
9551 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
9552 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
9553 default: fputs (_("unknown"), stdout); break;
9554 }
9555 }
9556 puts ("");
9557 }
9558
9559 /* Parse and display the contents of the dynamic section. */
9560
9561 static bfd_boolean
9562 process_dynamic_section (Filedata * filedata)
9563 {
9564 Elf_Internal_Dyn * entry;
9565
9566 if (dynamic_size == 0)
9567 {
9568 if (do_dynamic)
9569 printf (_("\nThere is no dynamic section in this file.\n"));
9570
9571 return TRUE;
9572 }
9573
9574 if (is_32bit_elf)
9575 {
9576 if (! get_32bit_dynamic_section (filedata))
9577 return FALSE;
9578 }
9579 else
9580 {
9581 if (! get_64bit_dynamic_section (filedata))
9582 return FALSE;
9583 }
9584
9585 /* Find the appropriate symbol table. */
9586 if (dynamic_symbols == NULL)
9587 {
9588 for (entry = dynamic_section;
9589 entry < dynamic_section + dynamic_nent;
9590 ++entry)
9591 {
9592 Elf_Internal_Shdr section;
9593
9594 if (entry->d_tag != DT_SYMTAB)
9595 continue;
9596
9597 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
9598
9599 /* Since we do not know how big the symbol table is,
9600 we default to reading in the entire file (!) and
9601 processing that. This is overkill, I know, but it
9602 should work. */
9603 section.sh_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
9604 if ((bfd_size_type) section.sh_offset > filedata->file_size)
9605 {
9606 /* See PR 21379 for a reproducer. */
9607 error (_("Invalid DT_SYMTAB entry: %lx"), (long) section.sh_offset);
9608 return FALSE;
9609 }
9610
9611 if (archive_file_offset != 0)
9612 section.sh_size = archive_file_size - section.sh_offset;
9613 else
9614 section.sh_size = filedata->file_size - section.sh_offset;
9615
9616 if (is_32bit_elf)
9617 section.sh_entsize = sizeof (Elf32_External_Sym);
9618 else
9619 section.sh_entsize = sizeof (Elf64_External_Sym);
9620 section.sh_name = filedata->string_table_length;
9621
9622 dynamic_symbols = GET_ELF_SYMBOLS (filedata, &section, & num_dynamic_syms);
9623 if (num_dynamic_syms < 1)
9624 {
9625 error (_("Unable to determine the number of symbols to load\n"));
9626 continue;
9627 }
9628 }
9629 }
9630
9631 /* Similarly find a string table. */
9632 if (dynamic_strings == NULL)
9633 {
9634 for (entry = dynamic_section;
9635 entry < dynamic_section + dynamic_nent;
9636 ++entry)
9637 {
9638 unsigned long offset;
9639 long str_tab_len;
9640
9641 if (entry->d_tag != DT_STRTAB)
9642 continue;
9643
9644 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
9645
9646 /* Since we do not know how big the string table is,
9647 we default to reading in the entire file (!) and
9648 processing that. This is overkill, I know, but it
9649 should work. */
9650
9651 offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
9652
9653 if (archive_file_offset != 0)
9654 str_tab_len = archive_file_size - offset;
9655 else
9656 str_tab_len = filedata->file_size;
9657
9658 if (str_tab_len < 1)
9659 {
9660 error
9661 (_("Unable to determine the length of the dynamic string table\n"));
9662 continue;
9663 }
9664
9665 dynamic_strings = (char *) get_data (NULL, filedata, offset, 1,
9666 str_tab_len,
9667 _("dynamic string table"));
9668 dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
9669 break;
9670 }
9671 }
9672
9673 /* And find the syminfo section if available. */
9674 if (dynamic_syminfo == NULL)
9675 {
9676 unsigned long syminsz = 0;
9677
9678 for (entry = dynamic_section;
9679 entry < dynamic_section + dynamic_nent;
9680 ++entry)
9681 {
9682 if (entry->d_tag == DT_SYMINENT)
9683 {
9684 /* Note: these braces are necessary to avoid a syntax
9685 error from the SunOS4 C compiler. */
9686 /* PR binutils/17531: A corrupt file can trigger this test.
9687 So do not use an assert, instead generate an error message. */
9688 if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
9689 error (_("Bad value (%d) for SYMINENT entry\n"),
9690 (int) entry->d_un.d_val);
9691 }
9692 else if (entry->d_tag == DT_SYMINSZ)
9693 syminsz = entry->d_un.d_val;
9694 else if (entry->d_tag == DT_SYMINFO)
9695 dynamic_syminfo_offset = offset_from_vma (filedata, entry->d_un.d_val,
9696 syminsz);
9697 }
9698
9699 if (dynamic_syminfo_offset != 0 && syminsz != 0)
9700 {
9701 Elf_External_Syminfo * extsyminfo;
9702 Elf_External_Syminfo * extsym;
9703 Elf_Internal_Syminfo * syminfo;
9704
9705 /* There is a syminfo section. Read the data. */
9706 extsyminfo = (Elf_External_Syminfo *)
9707 get_data (NULL, filedata, dynamic_syminfo_offset, 1, syminsz,
9708 _("symbol information"));
9709 if (!extsyminfo)
9710 return FALSE;
9711
9712 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
9713 if (dynamic_syminfo == NULL)
9714 {
9715 error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9716 (unsigned long) syminsz);
9717 return FALSE;
9718 }
9719
9720 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
9721 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
9722 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
9723 ++syminfo, ++extsym)
9724 {
9725 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
9726 syminfo->si_flags = BYTE_GET (extsym->si_flags);
9727 }
9728
9729 free (extsyminfo);
9730 }
9731 }
9732
9733 if (do_dynamic && dynamic_addr)
9734 printf (ngettext ("\nDynamic section at offset 0x%lx "
9735 "contains %lu entry:\n",
9736 "\nDynamic section at offset 0x%lx "
9737 "contains %lu entries:\n",
9738 dynamic_nent),
9739 dynamic_addr, (unsigned long) dynamic_nent);
9740 if (do_dynamic)
9741 printf (_(" Tag Type Name/Value\n"));
9742
9743 for (entry = dynamic_section;
9744 entry < dynamic_section + dynamic_nent;
9745 entry++)
9746 {
9747 if (do_dynamic)
9748 {
9749 const char * dtype;
9750
9751 putchar (' ');
9752 print_vma (entry->d_tag, FULL_HEX);
9753 dtype = get_dynamic_type (filedata, entry->d_tag);
9754 printf (" (%s)%*s", dtype,
9755 ((is_32bit_elf ? 27 : 19) - (int) strlen (dtype)), " ");
9756 }
9757
9758 switch (entry->d_tag)
9759 {
9760 case DT_FLAGS:
9761 if (do_dynamic)
9762 print_dynamic_flags (entry->d_un.d_val);
9763 break;
9764
9765 case DT_AUXILIARY:
9766 case DT_FILTER:
9767 case DT_CONFIG:
9768 case DT_DEPAUDIT:
9769 case DT_AUDIT:
9770 if (do_dynamic)
9771 {
9772 switch (entry->d_tag)
9773 {
9774 case DT_AUXILIARY:
9775 printf (_("Auxiliary library"));
9776 break;
9777
9778 case DT_FILTER:
9779 printf (_("Filter library"));
9780 break;
9781
9782 case DT_CONFIG:
9783 printf (_("Configuration file"));
9784 break;
9785
9786 case DT_DEPAUDIT:
9787 printf (_("Dependency audit library"));
9788 break;
9789
9790 case DT_AUDIT:
9791 printf (_("Audit library"));
9792 break;
9793 }
9794
9795 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9796 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
9797 else
9798 {
9799 printf (": ");
9800 print_vma (entry->d_un.d_val, PREFIX_HEX);
9801 putchar ('\n');
9802 }
9803 }
9804 break;
9805
9806 case DT_FEATURE:
9807 if (do_dynamic)
9808 {
9809 printf (_("Flags:"));
9810
9811 if (entry->d_un.d_val == 0)
9812 printf (_(" None\n"));
9813 else
9814 {
9815 unsigned long int val = entry->d_un.d_val;
9816
9817 if (val & DTF_1_PARINIT)
9818 {
9819 printf (" PARINIT");
9820 val ^= DTF_1_PARINIT;
9821 }
9822 if (val & DTF_1_CONFEXP)
9823 {
9824 printf (" CONFEXP");
9825 val ^= DTF_1_CONFEXP;
9826 }
9827 if (val != 0)
9828 printf (" %lx", val);
9829 puts ("");
9830 }
9831 }
9832 break;
9833
9834 case DT_POSFLAG_1:
9835 if (do_dynamic)
9836 {
9837 printf (_("Flags:"));
9838
9839 if (entry->d_un.d_val == 0)
9840 printf (_(" None\n"));
9841 else
9842 {
9843 unsigned long int val = entry->d_un.d_val;
9844
9845 if (val & DF_P1_LAZYLOAD)
9846 {
9847 printf (" LAZYLOAD");
9848 val ^= DF_P1_LAZYLOAD;
9849 }
9850 if (val & DF_P1_GROUPPERM)
9851 {
9852 printf (" GROUPPERM");
9853 val ^= DF_P1_GROUPPERM;
9854 }
9855 if (val != 0)
9856 printf (" %lx", val);
9857 puts ("");
9858 }
9859 }
9860 break;
9861
9862 case DT_FLAGS_1:
9863 if (do_dynamic)
9864 {
9865 printf (_("Flags:"));
9866 if (entry->d_un.d_val == 0)
9867 printf (_(" None\n"));
9868 else
9869 {
9870 unsigned long int val = entry->d_un.d_val;
9871
9872 if (val & DF_1_NOW)
9873 {
9874 printf (" NOW");
9875 val ^= DF_1_NOW;
9876 }
9877 if (val & DF_1_GLOBAL)
9878 {
9879 printf (" GLOBAL");
9880 val ^= DF_1_GLOBAL;
9881 }
9882 if (val & DF_1_GROUP)
9883 {
9884 printf (" GROUP");
9885 val ^= DF_1_GROUP;
9886 }
9887 if (val & DF_1_NODELETE)
9888 {
9889 printf (" NODELETE");
9890 val ^= DF_1_NODELETE;
9891 }
9892 if (val & DF_1_LOADFLTR)
9893 {
9894 printf (" LOADFLTR");
9895 val ^= DF_1_LOADFLTR;
9896 }
9897 if (val & DF_1_INITFIRST)
9898 {
9899 printf (" INITFIRST");
9900 val ^= DF_1_INITFIRST;
9901 }
9902 if (val & DF_1_NOOPEN)
9903 {
9904 printf (" NOOPEN");
9905 val ^= DF_1_NOOPEN;
9906 }
9907 if (val & DF_1_ORIGIN)
9908 {
9909 printf (" ORIGIN");
9910 val ^= DF_1_ORIGIN;
9911 }
9912 if (val & DF_1_DIRECT)
9913 {
9914 printf (" DIRECT");
9915 val ^= DF_1_DIRECT;
9916 }
9917 if (val & DF_1_TRANS)
9918 {
9919 printf (" TRANS");
9920 val ^= DF_1_TRANS;
9921 }
9922 if (val & DF_1_INTERPOSE)
9923 {
9924 printf (" INTERPOSE");
9925 val ^= DF_1_INTERPOSE;
9926 }
9927 if (val & DF_1_NODEFLIB)
9928 {
9929 printf (" NODEFLIB");
9930 val ^= DF_1_NODEFLIB;
9931 }
9932 if (val & DF_1_NODUMP)
9933 {
9934 printf (" NODUMP");
9935 val ^= DF_1_NODUMP;
9936 }
9937 if (val & DF_1_CONFALT)
9938 {
9939 printf (" CONFALT");
9940 val ^= DF_1_CONFALT;
9941 }
9942 if (val & DF_1_ENDFILTEE)
9943 {
9944 printf (" ENDFILTEE");
9945 val ^= DF_1_ENDFILTEE;
9946 }
9947 if (val & DF_1_DISPRELDNE)
9948 {
9949 printf (" DISPRELDNE");
9950 val ^= DF_1_DISPRELDNE;
9951 }
9952 if (val & DF_1_DISPRELPND)
9953 {
9954 printf (" DISPRELPND");
9955 val ^= DF_1_DISPRELPND;
9956 }
9957 if (val & DF_1_NODIRECT)
9958 {
9959 printf (" NODIRECT");
9960 val ^= DF_1_NODIRECT;
9961 }
9962 if (val & DF_1_IGNMULDEF)
9963 {
9964 printf (" IGNMULDEF");
9965 val ^= DF_1_IGNMULDEF;
9966 }
9967 if (val & DF_1_NOKSYMS)
9968 {
9969 printf (" NOKSYMS");
9970 val ^= DF_1_NOKSYMS;
9971 }
9972 if (val & DF_1_NOHDR)
9973 {
9974 printf (" NOHDR");
9975 val ^= DF_1_NOHDR;
9976 }
9977 if (val & DF_1_EDITED)
9978 {
9979 printf (" EDITED");
9980 val ^= DF_1_EDITED;
9981 }
9982 if (val & DF_1_NORELOC)
9983 {
9984 printf (" NORELOC");
9985 val ^= DF_1_NORELOC;
9986 }
9987 if (val & DF_1_SYMINTPOSE)
9988 {
9989 printf (" SYMINTPOSE");
9990 val ^= DF_1_SYMINTPOSE;
9991 }
9992 if (val & DF_1_GLOBAUDIT)
9993 {
9994 printf (" GLOBAUDIT");
9995 val ^= DF_1_GLOBAUDIT;
9996 }
9997 if (val & DF_1_SINGLETON)
9998 {
9999 printf (" SINGLETON");
10000 val ^= DF_1_SINGLETON;
10001 }
10002 if (val & DF_1_STUB)
10003 {
10004 printf (" STUB");
10005 val ^= DF_1_STUB;
10006 }
10007 if (val & DF_1_PIE)
10008 {
10009 printf (" PIE");
10010 val ^= DF_1_PIE;
10011 }
10012 if (val & DF_1_KMOD)
10013 {
10014 printf (" KMOD");
10015 val ^= DF_1_KMOD;
10016 }
10017 if (val & DF_1_WEAKFILTER)
10018 {
10019 printf (" WEAKFILTER");
10020 val ^= DF_1_WEAKFILTER;
10021 }
10022 if (val & DF_1_NOCOMMON)
10023 {
10024 printf (" NOCOMMON");
10025 val ^= DF_1_NOCOMMON;
10026 }
10027 if (val != 0)
10028 printf (" %lx", val);
10029 puts ("");
10030 }
10031 }
10032 break;
10033
10034 case DT_PLTREL:
10035 dynamic_info[entry->d_tag] = entry->d_un.d_val;
10036 if (do_dynamic)
10037 puts (get_dynamic_type (filedata, entry->d_un.d_val));
10038 break;
10039
10040 case DT_NULL :
10041 case DT_NEEDED :
10042 case DT_PLTGOT :
10043 case DT_HASH :
10044 case DT_STRTAB :
10045 case DT_SYMTAB :
10046 case DT_RELA :
10047 case DT_INIT :
10048 case DT_FINI :
10049 case DT_SONAME :
10050 case DT_RPATH :
10051 case DT_SYMBOLIC:
10052 case DT_REL :
10053 case DT_DEBUG :
10054 case DT_TEXTREL :
10055 case DT_JMPREL :
10056 case DT_RUNPATH :
10057 dynamic_info[entry->d_tag] = entry->d_un.d_val;
10058
10059 if (do_dynamic)
10060 {
10061 char * name;
10062
10063 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
10064 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
10065 else
10066 name = NULL;
10067
10068 if (name)
10069 {
10070 switch (entry->d_tag)
10071 {
10072 case DT_NEEDED:
10073 printf (_("Shared library: [%s]"), name);
10074
10075 if (streq (name, program_interpreter))
10076 printf (_(" program interpreter"));
10077 break;
10078
10079 case DT_SONAME:
10080 printf (_("Library soname: [%s]"), name);
10081 break;
10082
10083 case DT_RPATH:
10084 printf (_("Library rpath: [%s]"), name);
10085 break;
10086
10087 case DT_RUNPATH:
10088 printf (_("Library runpath: [%s]"), name);
10089 break;
10090
10091 default:
10092 print_vma (entry->d_un.d_val, PREFIX_HEX);
10093 break;
10094 }
10095 }
10096 else
10097 print_vma (entry->d_un.d_val, PREFIX_HEX);
10098
10099 putchar ('\n');
10100 }
10101 break;
10102
10103 case DT_PLTRELSZ:
10104 case DT_RELASZ :
10105 case DT_STRSZ :
10106 case DT_RELSZ :
10107 case DT_RELAENT :
10108 case DT_SYMENT :
10109 case DT_RELENT :
10110 dynamic_info[entry->d_tag] = entry->d_un.d_val;
10111 /* Fall through. */
10112 case DT_PLTPADSZ:
10113 case DT_MOVEENT :
10114 case DT_MOVESZ :
10115 case DT_INIT_ARRAYSZ:
10116 case DT_FINI_ARRAYSZ:
10117 case DT_GNU_CONFLICTSZ:
10118 case DT_GNU_LIBLISTSZ:
10119 if (do_dynamic)
10120 {
10121 print_vma (entry->d_un.d_val, UNSIGNED);
10122 printf (_(" (bytes)\n"));
10123 }
10124 break;
10125
10126 case DT_VERDEFNUM:
10127 case DT_VERNEEDNUM:
10128 case DT_RELACOUNT:
10129 case DT_RELCOUNT:
10130 if (do_dynamic)
10131 {
10132 print_vma (entry->d_un.d_val, UNSIGNED);
10133 putchar ('\n');
10134 }
10135 break;
10136
10137 case DT_SYMINSZ:
10138 case DT_SYMINENT:
10139 case DT_SYMINFO:
10140 case DT_USED:
10141 case DT_INIT_ARRAY:
10142 case DT_FINI_ARRAY:
10143 if (do_dynamic)
10144 {
10145 if (entry->d_tag == DT_USED
10146 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
10147 {
10148 char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
10149
10150 if (*name)
10151 {
10152 printf (_("Not needed object: [%s]\n"), name);
10153 break;
10154 }
10155 }
10156
10157 print_vma (entry->d_un.d_val, PREFIX_HEX);
10158 putchar ('\n');
10159 }
10160 break;
10161
10162 case DT_BIND_NOW:
10163 /* The value of this entry is ignored. */
10164 if (do_dynamic)
10165 putchar ('\n');
10166 break;
10167
10168 case DT_GNU_PRELINKED:
10169 if (do_dynamic)
10170 {
10171 struct tm * tmp;
10172 time_t atime = entry->d_un.d_val;
10173
10174 tmp = gmtime (&atime);
10175 /* PR 17533 file: 041-1244816-0.004. */
10176 if (tmp == NULL)
10177 printf (_("<corrupt time val: %lx"),
10178 (unsigned long) atime);
10179 else
10180 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
10181 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
10182 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
10183
10184 }
10185 break;
10186
10187 case DT_GNU_HASH:
10188 dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
10189 if (do_dynamic)
10190 {
10191 print_vma (entry->d_un.d_val, PREFIX_HEX);
10192 putchar ('\n');
10193 }
10194 break;
10195
10196 default:
10197 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
10198 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
10199 entry->d_un.d_val;
10200
10201 if (do_dynamic)
10202 {
10203 switch (filedata->file_header.e_machine)
10204 {
10205 case EM_MIPS:
10206 case EM_MIPS_RS3_LE:
10207 dynamic_section_mips_val (entry);
10208 break;
10209 case EM_PARISC:
10210 dynamic_section_parisc_val (entry);
10211 break;
10212 case EM_IA_64:
10213 dynamic_section_ia64_val (entry);
10214 break;
10215 default:
10216 print_vma (entry->d_un.d_val, PREFIX_HEX);
10217 putchar ('\n');
10218 }
10219 }
10220 break;
10221 }
10222 }
10223
10224 return TRUE;
10225 }
10226
10227 static char *
10228 get_ver_flags (unsigned int flags)
10229 {
10230 static char buff[128];
10231
10232 buff[0] = 0;
10233
10234 if (flags == 0)
10235 return _("none");
10236
10237 if (flags & VER_FLG_BASE)
10238 strcat (buff, "BASE");
10239
10240 if (flags & VER_FLG_WEAK)
10241 {
10242 if (flags & VER_FLG_BASE)
10243 strcat (buff, " | ");
10244
10245 strcat (buff, "WEAK");
10246 }
10247
10248 if (flags & VER_FLG_INFO)
10249 {
10250 if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
10251 strcat (buff, " | ");
10252
10253 strcat (buff, "INFO");
10254 }
10255
10256 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
10257 {
10258 if (flags & (VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
10259 strcat (buff, " | ");
10260
10261 strcat (buff, _("<unknown>"));
10262 }
10263
10264 return buff;
10265 }
10266
10267 /* Display the contents of the version sections. */
10268
10269 static bfd_boolean
10270 process_version_sections (Filedata * filedata)
10271 {
10272 Elf_Internal_Shdr * section;
10273 unsigned i;
10274 bfd_boolean found = FALSE;
10275
10276 if (! do_version)
10277 return TRUE;
10278
10279 for (i = 0, section = filedata->section_headers;
10280 i < filedata->file_header.e_shnum;
10281 i++, section++)
10282 {
10283 switch (section->sh_type)
10284 {
10285 case SHT_GNU_verdef:
10286 {
10287 Elf_External_Verdef * edefs;
10288 unsigned long idx;
10289 unsigned long cnt;
10290 char * endbuf;
10291
10292 found = TRUE;
10293
10294 printf (ngettext ("\nVersion definition section '%s' "
10295 "contains %u entry:\n",
10296 "\nVersion definition section '%s' "
10297 "contains %u entries:\n",
10298 section->sh_info),
10299 printable_section_name (filedata, section),
10300 section->sh_info);
10301
10302 printf (_(" Addr: 0x"));
10303 printf_vma (section->sh_addr);
10304 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
10305 (unsigned long) section->sh_offset, section->sh_link,
10306 printable_section_name_from_index (filedata, section->sh_link));
10307
10308 edefs = (Elf_External_Verdef *)
10309 get_data (NULL, filedata, section->sh_offset, 1,section->sh_size,
10310 _("version definition section"));
10311 if (!edefs)
10312 break;
10313 endbuf = (char *) edefs + section->sh_size;
10314
10315 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10316 {
10317 char * vstart;
10318 Elf_External_Verdef * edef;
10319 Elf_Internal_Verdef ent;
10320 Elf_External_Verdaux * eaux;
10321 Elf_Internal_Verdaux aux;
10322 unsigned long isum;
10323 int j;
10324
10325 vstart = ((char *) edefs) + idx;
10326 if (vstart + sizeof (*edef) > endbuf)
10327 break;
10328
10329 edef = (Elf_External_Verdef *) vstart;
10330
10331 ent.vd_version = BYTE_GET (edef->vd_version);
10332 ent.vd_flags = BYTE_GET (edef->vd_flags);
10333 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
10334 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
10335 ent.vd_hash = BYTE_GET (edef->vd_hash);
10336 ent.vd_aux = BYTE_GET (edef->vd_aux);
10337 ent.vd_next = BYTE_GET (edef->vd_next);
10338
10339 printf (_(" %#06lx: Rev: %d Flags: %s"),
10340 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
10341
10342 printf (_(" Index: %d Cnt: %d "),
10343 ent.vd_ndx, ent.vd_cnt);
10344
10345 /* Check for overflow. */
10346 if (ent.vd_aux > (size_t) (endbuf - vstart))
10347 break;
10348
10349 vstart += ent.vd_aux;
10350
10351 if (vstart + sizeof (*eaux) > endbuf)
10352 break;
10353 eaux = (Elf_External_Verdaux *) vstart;
10354
10355 aux.vda_name = BYTE_GET (eaux->vda_name);
10356 aux.vda_next = BYTE_GET (eaux->vda_next);
10357
10358 if (VALID_DYNAMIC_NAME (aux.vda_name))
10359 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
10360 else
10361 printf (_("Name index: %ld\n"), aux.vda_name);
10362
10363 isum = idx + ent.vd_aux;
10364
10365 for (j = 1; j < ent.vd_cnt; j++)
10366 {
10367 if (aux.vda_next < sizeof (*eaux)
10368 && !(j == ent.vd_cnt - 1 && aux.vda_next == 0))
10369 {
10370 warn (_("Invalid vda_next field of %lx\n"),
10371 aux.vda_next);
10372 j = ent.vd_cnt;
10373 break;
10374 }
10375 /* Check for overflow. */
10376 if (aux.vda_next > (size_t) (endbuf - vstart))
10377 break;
10378
10379 isum += aux.vda_next;
10380 vstart += aux.vda_next;
10381
10382 if (vstart + sizeof (*eaux) > endbuf)
10383 break;
10384 eaux = (Elf_External_Verdaux *) vstart;
10385
10386 aux.vda_name = BYTE_GET (eaux->vda_name);
10387 aux.vda_next = BYTE_GET (eaux->vda_next);
10388
10389 if (VALID_DYNAMIC_NAME (aux.vda_name))
10390 printf (_(" %#06lx: Parent %d: %s\n"),
10391 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
10392 else
10393 printf (_(" %#06lx: Parent %d, name index: %ld\n"),
10394 isum, j, aux.vda_name);
10395 }
10396
10397 if (j < ent.vd_cnt)
10398 printf (_(" Version def aux past end of section\n"));
10399
10400 /* PR 17531:
10401 file: id:000001,src:000172+005151,op:splice,rep:2. */
10402 if (ent.vd_next < sizeof (*edef)
10403 && !(cnt == section->sh_info - 1 && ent.vd_next == 0))
10404 {
10405 warn (_("Invalid vd_next field of %lx\n"), ent.vd_next);
10406 cnt = section->sh_info;
10407 break;
10408 }
10409 if (ent.vd_next > (size_t) (endbuf - ((char *) edefs + idx)))
10410 break;
10411
10412 idx += ent.vd_next;
10413 }
10414
10415 if (cnt < section->sh_info)
10416 printf (_(" Version definition past end of section\n"));
10417
10418 free (edefs);
10419 }
10420 break;
10421
10422 case SHT_GNU_verneed:
10423 {
10424 Elf_External_Verneed * eneed;
10425 unsigned long idx;
10426 unsigned long cnt;
10427 char * endbuf;
10428
10429 found = TRUE;
10430
10431 printf (ngettext ("\nVersion needs section '%s' "
10432 "contains %u entry:\n",
10433 "\nVersion needs section '%s' "
10434 "contains %u entries:\n",
10435 section->sh_info),
10436 printable_section_name (filedata, section), section->sh_info);
10437
10438 printf (_(" Addr: 0x"));
10439 printf_vma (section->sh_addr);
10440 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
10441 (unsigned long) section->sh_offset, section->sh_link,
10442 printable_section_name_from_index (filedata, section->sh_link));
10443
10444 eneed = (Elf_External_Verneed *) get_data (NULL, filedata,
10445 section->sh_offset, 1,
10446 section->sh_size,
10447 _("Version Needs section"));
10448 if (!eneed)
10449 break;
10450 endbuf = (char *) eneed + section->sh_size;
10451
10452 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10453 {
10454 Elf_External_Verneed * entry;
10455 Elf_Internal_Verneed ent;
10456 unsigned long isum;
10457 int j;
10458 char * vstart;
10459
10460 vstart = ((char *) eneed) + idx;
10461 if (vstart + sizeof (*entry) > endbuf)
10462 break;
10463
10464 entry = (Elf_External_Verneed *) vstart;
10465
10466 ent.vn_version = BYTE_GET (entry->vn_version);
10467 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
10468 ent.vn_file = BYTE_GET (entry->vn_file);
10469 ent.vn_aux = BYTE_GET (entry->vn_aux);
10470 ent.vn_next = BYTE_GET (entry->vn_next);
10471
10472 printf (_(" %#06lx: Version: %d"), idx, ent.vn_version);
10473
10474 if (VALID_DYNAMIC_NAME (ent.vn_file))
10475 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
10476 else
10477 printf (_(" File: %lx"), ent.vn_file);
10478
10479 printf (_(" Cnt: %d\n"), ent.vn_cnt);
10480
10481 /* Check for overflow. */
10482 if (ent.vn_aux > (size_t) (endbuf - vstart))
10483 break;
10484 vstart += ent.vn_aux;
10485
10486 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
10487 {
10488 Elf_External_Vernaux * eaux;
10489 Elf_Internal_Vernaux aux;
10490
10491 if (vstart + sizeof (*eaux) > endbuf)
10492 break;
10493 eaux = (Elf_External_Vernaux *) vstart;
10494
10495 aux.vna_hash = BYTE_GET (eaux->vna_hash);
10496 aux.vna_flags = BYTE_GET (eaux->vna_flags);
10497 aux.vna_other = BYTE_GET (eaux->vna_other);
10498 aux.vna_name = BYTE_GET (eaux->vna_name);
10499 aux.vna_next = BYTE_GET (eaux->vna_next);
10500
10501 if (VALID_DYNAMIC_NAME (aux.vna_name))
10502 printf (_(" %#06lx: Name: %s"),
10503 isum, GET_DYNAMIC_NAME (aux.vna_name));
10504 else
10505 printf (_(" %#06lx: Name index: %lx"),
10506 isum, aux.vna_name);
10507
10508 printf (_(" Flags: %s Version: %d\n"),
10509 get_ver_flags (aux.vna_flags), aux.vna_other);
10510
10511 if (aux.vna_next < sizeof (*eaux)
10512 && !(j == ent.vn_cnt - 1 && aux.vna_next == 0))
10513 {
10514 warn (_("Invalid vna_next field of %lx\n"),
10515 aux.vna_next);
10516 j = ent.vn_cnt;
10517 break;
10518 }
10519 /* Check for overflow. */
10520 if (aux.vna_next > (size_t) (endbuf - vstart))
10521 break;
10522 isum += aux.vna_next;
10523 vstart += aux.vna_next;
10524 }
10525
10526 if (j < ent.vn_cnt)
10527 warn (_("Missing Version Needs auxillary information\n"));
10528
10529 if (ent.vn_next < sizeof (*entry)
10530 && !(cnt == section->sh_info - 1 && ent.vn_next == 0))
10531 {
10532 warn (_("Invalid vn_next field of %lx\n"), ent.vn_next);
10533 cnt = section->sh_info;
10534 break;
10535 }
10536 if (ent.vn_next > (size_t) (endbuf - ((char *) eneed + idx)))
10537 break;
10538 idx += ent.vn_next;
10539 }
10540
10541 if (cnt < section->sh_info)
10542 warn (_("Missing Version Needs information\n"));
10543
10544 free (eneed);
10545 }
10546 break;
10547
10548 case SHT_GNU_versym:
10549 {
10550 Elf_Internal_Shdr * link_section;
10551 size_t total;
10552 unsigned int cnt;
10553 unsigned char * edata;
10554 unsigned short * data;
10555 char * strtab;
10556 Elf_Internal_Sym * symbols;
10557 Elf_Internal_Shdr * string_sec;
10558 unsigned long num_syms;
10559 long off;
10560
10561 if (section->sh_link >= filedata->file_header.e_shnum)
10562 break;
10563
10564 link_section = filedata->section_headers + section->sh_link;
10565 total = section->sh_size / sizeof (Elf_External_Versym);
10566
10567 if (link_section->sh_link >= filedata->file_header.e_shnum)
10568 break;
10569
10570 found = TRUE;
10571
10572 symbols = GET_ELF_SYMBOLS (filedata, link_section, & num_syms);
10573 if (symbols == NULL)
10574 break;
10575
10576 string_sec = filedata->section_headers + link_section->sh_link;
10577
10578 strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
10579 string_sec->sh_size,
10580 _("version string table"));
10581 if (!strtab)
10582 {
10583 free (symbols);
10584 break;
10585 }
10586
10587 printf (ngettext ("\nVersion symbols section '%s' "
10588 "contains %lu entry:\n",
10589 "\nVersion symbols section '%s' "
10590 "contains %lu entries:\n",
10591 total),
10592 printable_section_name (filedata, section), (unsigned long) total);
10593
10594 printf (_(" Addr: "));
10595 printf_vma (section->sh_addr);
10596 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
10597 (unsigned long) section->sh_offset, section->sh_link,
10598 printable_section_name (filedata, link_section));
10599
10600 off = offset_from_vma (filedata,
10601 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10602 total * sizeof (short));
10603 edata = (unsigned char *) get_data (NULL, filedata, off, total,
10604 sizeof (short),
10605 _("version symbol data"));
10606 if (!edata)
10607 {
10608 free (strtab);
10609 free (symbols);
10610 break;
10611 }
10612
10613 data = (short unsigned int *) cmalloc (total, sizeof (short));
10614
10615 for (cnt = total; cnt --;)
10616 data[cnt] = byte_get (edata + cnt * sizeof (short),
10617 sizeof (short));
10618
10619 free (edata);
10620
10621 for (cnt = 0; cnt < total; cnt += 4)
10622 {
10623 int j, nn;
10624 char *name;
10625 char *invalid = _("*invalid*");
10626
10627 printf (" %03x:", cnt);
10628
10629 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
10630 switch (data[cnt + j])
10631 {
10632 case 0:
10633 fputs (_(" 0 (*local*) "), stdout);
10634 break;
10635
10636 case 1:
10637 fputs (_(" 1 (*global*) "), stdout);
10638 break;
10639
10640 default:
10641 nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
10642 data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
10643
10644 /* If this index value is greater than the size of the symbols
10645 array, break to avoid an out-of-bounds read. */
10646 if ((unsigned long)(cnt + j) >= num_syms)
10647 {
10648 warn (_("invalid index into symbol array\n"));
10649 break;
10650 }
10651
10652 name = NULL;
10653 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10654 {
10655 Elf_Internal_Verneed ivn;
10656 unsigned long offset;
10657
10658 offset = offset_from_vma
10659 (filedata, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10660 sizeof (Elf_External_Verneed));
10661
10662 do
10663 {
10664 Elf_Internal_Vernaux ivna;
10665 Elf_External_Verneed evn;
10666 Elf_External_Vernaux evna;
10667 unsigned long a_off;
10668
10669 if (get_data (&evn, filedata, offset, sizeof (evn), 1,
10670 _("version need")) == NULL)
10671 break;
10672
10673 ivn.vn_aux = BYTE_GET (evn.vn_aux);
10674 ivn.vn_next = BYTE_GET (evn.vn_next);
10675
10676 a_off = offset + ivn.vn_aux;
10677
10678 do
10679 {
10680 if (get_data (&evna, filedata, a_off, sizeof (evna),
10681 1, _("version need aux (2)")) == NULL)
10682 {
10683 ivna.vna_next = 0;
10684 ivna.vna_other = 0;
10685 }
10686 else
10687 {
10688 ivna.vna_next = BYTE_GET (evna.vna_next);
10689 ivna.vna_other = BYTE_GET (evna.vna_other);
10690 }
10691
10692 a_off += ivna.vna_next;
10693 }
10694 while (ivna.vna_other != data[cnt + j]
10695 && ivna.vna_next != 0);
10696
10697 if (ivna.vna_other == data[cnt + j])
10698 {
10699 ivna.vna_name = BYTE_GET (evna.vna_name);
10700
10701 if (ivna.vna_name >= string_sec->sh_size)
10702 name = invalid;
10703 else
10704 name = strtab + ivna.vna_name;
10705 break;
10706 }
10707
10708 offset += ivn.vn_next;
10709 }
10710 while (ivn.vn_next);
10711 }
10712
10713 if (data[cnt + j] != 0x8001
10714 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10715 {
10716 Elf_Internal_Verdef ivd;
10717 Elf_External_Verdef evd;
10718 unsigned long offset;
10719
10720 offset = offset_from_vma
10721 (filedata, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10722 sizeof evd);
10723
10724 do
10725 {
10726 if (get_data (&evd, filedata, offset, sizeof (evd), 1,
10727 _("version def")) == NULL)
10728 {
10729 ivd.vd_next = 0;
10730 /* PR 17531: file: 046-1082287-0.004. */
10731 ivd.vd_ndx = (data[cnt + j] & VERSYM_VERSION) + 1;
10732 break;
10733 }
10734 else
10735 {
10736 ivd.vd_next = BYTE_GET (evd.vd_next);
10737 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10738 }
10739
10740 offset += ivd.vd_next;
10741 }
10742 while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
10743 && ivd.vd_next != 0);
10744
10745 if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
10746 {
10747 Elf_External_Verdaux evda;
10748 Elf_Internal_Verdaux ivda;
10749
10750 ivd.vd_aux = BYTE_GET (evd.vd_aux);
10751
10752 if (get_data (&evda, filedata,
10753 offset - ivd.vd_next + ivd.vd_aux,
10754 sizeof (evda), 1,
10755 _("version def aux")) == NULL)
10756 break;
10757
10758 ivda.vda_name = BYTE_GET (evda.vda_name);
10759
10760 if (ivda.vda_name >= string_sec->sh_size)
10761 name = invalid;
10762 else if (name != NULL && name != invalid)
10763 name = _("*both*");
10764 else
10765 name = strtab + ivda.vda_name;
10766 }
10767 }
10768 if (name != NULL)
10769 nn += printf ("(%s%-*s",
10770 name,
10771 12 - (int) strlen (name),
10772 ")");
10773
10774 if (nn < 18)
10775 printf ("%*c", 18 - nn, ' ');
10776 }
10777
10778 putchar ('\n');
10779 }
10780
10781 free (data);
10782 free (strtab);
10783 free (symbols);
10784 }
10785 break;
10786
10787 default:
10788 break;
10789 }
10790 }
10791
10792 if (! found)
10793 printf (_("\nNo version information found in this file.\n"));
10794
10795 return TRUE;
10796 }
10797
10798 static const char *
10799 get_symbol_binding (Filedata * filedata, unsigned int binding)
10800 {
10801 static char buff[32];
10802
10803 switch (binding)
10804 {
10805 case STB_LOCAL: return "LOCAL";
10806 case STB_GLOBAL: return "GLOBAL";
10807 case STB_WEAK: return "WEAK";
10808 default:
10809 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
10810 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
10811 binding);
10812 else if (binding >= STB_LOOS && binding <= STB_HIOS)
10813 {
10814 if (binding == STB_GNU_UNIQUE
10815 && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10816 /* GNU is still using the default value 0. */
10817 || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10818 return "UNIQUE";
10819 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
10820 }
10821 else
10822 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
10823 return buff;
10824 }
10825 }
10826
10827 static const char *
10828 get_symbol_type (Filedata * filedata, unsigned int type)
10829 {
10830 static char buff[32];
10831
10832 switch (type)
10833 {
10834 case STT_NOTYPE: return "NOTYPE";
10835 case STT_OBJECT: return "OBJECT";
10836 case STT_FUNC: return "FUNC";
10837 case STT_SECTION: return "SECTION";
10838 case STT_FILE: return "FILE";
10839 case STT_COMMON: return "COMMON";
10840 case STT_TLS: return "TLS";
10841 case STT_RELC: return "RELC";
10842 case STT_SRELC: return "SRELC";
10843 default:
10844 if (type >= STT_LOPROC && type <= STT_HIPROC)
10845 {
10846 if (filedata->file_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
10847 return "THUMB_FUNC";
10848
10849 if (filedata->file_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
10850 return "REGISTER";
10851
10852 if (filedata->file_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
10853 return "PARISC_MILLI";
10854
10855 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
10856 }
10857 else if (type >= STT_LOOS && type <= STT_HIOS)
10858 {
10859 if (filedata->file_header.e_machine == EM_PARISC)
10860 {
10861 if (type == STT_HP_OPAQUE)
10862 return "HP_OPAQUE";
10863 if (type == STT_HP_STUB)
10864 return "HP_STUB";
10865 }
10866
10867 if (type == STT_GNU_IFUNC
10868 && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10869 || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
10870 /* GNU is still using the default value 0. */
10871 || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10872 return "IFUNC";
10873
10874 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
10875 }
10876 else
10877 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
10878 return buff;
10879 }
10880 }
10881
10882 static const char *
10883 get_symbol_visibility (unsigned int visibility)
10884 {
10885 switch (visibility)
10886 {
10887 case STV_DEFAULT: return "DEFAULT";
10888 case STV_INTERNAL: return "INTERNAL";
10889 case STV_HIDDEN: return "HIDDEN";
10890 case STV_PROTECTED: return "PROTECTED";
10891 default:
10892 error (_("Unrecognized visibility value: %u"), visibility);
10893 return _("<unknown>");
10894 }
10895 }
10896
10897 static const char *
10898 get_solaris_symbol_visibility (unsigned int visibility)
10899 {
10900 switch (visibility)
10901 {
10902 case 4: return "EXPORTED";
10903 case 5: return "SINGLETON";
10904 case 6: return "ELIMINATE";
10905 default: return get_symbol_visibility (visibility);
10906 }
10907 }
10908
10909 static const char *
10910 get_mips_symbol_other (unsigned int other)
10911 {
10912 switch (other)
10913 {
10914 case STO_OPTIONAL: return "OPTIONAL";
10915 case STO_MIPS_PLT: return "MIPS PLT";
10916 case STO_MIPS_PIC: return "MIPS PIC";
10917 case STO_MICROMIPS: return "MICROMIPS";
10918 case STO_MICROMIPS | STO_MIPS_PIC: return "MICROMIPS, MIPS PIC";
10919 case STO_MIPS16: return "MIPS16";
10920 default: return NULL;
10921 }
10922 }
10923
10924 static const char *
10925 get_ia64_symbol_other (Filedata * filedata, unsigned int other)
10926 {
10927 if (is_ia64_vms (filedata))
10928 {
10929 static char res[32];
10930
10931 res[0] = 0;
10932
10933 /* Function types is for images and .STB files only. */
10934 switch (filedata->file_header.e_type)
10935 {
10936 case ET_DYN:
10937 case ET_EXEC:
10938 switch (VMS_ST_FUNC_TYPE (other))
10939 {
10940 case VMS_SFT_CODE_ADDR:
10941 strcat (res, " CA");
10942 break;
10943 case VMS_SFT_SYMV_IDX:
10944 strcat (res, " VEC");
10945 break;
10946 case VMS_SFT_FD:
10947 strcat (res, " FD");
10948 break;
10949 case VMS_SFT_RESERVE:
10950 strcat (res, " RSV");
10951 break;
10952 default:
10953 warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
10954 VMS_ST_FUNC_TYPE (other));
10955 strcat (res, " <unknown>");
10956 break;
10957 }
10958 break;
10959 default:
10960 break;
10961 }
10962 switch (VMS_ST_LINKAGE (other))
10963 {
10964 case VMS_STL_IGNORE:
10965 strcat (res, " IGN");
10966 break;
10967 case VMS_STL_RESERVE:
10968 strcat (res, " RSV");
10969 break;
10970 case VMS_STL_STD:
10971 strcat (res, " STD");
10972 break;
10973 case VMS_STL_LNK:
10974 strcat (res, " LNK");
10975 break;
10976 default:
10977 warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
10978 VMS_ST_LINKAGE (other));
10979 strcat (res, " <unknown>");
10980 break;
10981 }
10982
10983 if (res[0] != 0)
10984 return res + 1;
10985 else
10986 return res;
10987 }
10988 return NULL;
10989 }
10990
10991 static const char *
10992 get_ppc64_symbol_other (unsigned int other)
10993 {
10994 if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
10995 {
10996 static char buf[32];
10997 snprintf (buf, sizeof buf, _("<localentry>: %d"),
10998 PPC64_LOCAL_ENTRY_OFFSET (other));
10999 return buf;
11000 }
11001 return NULL;
11002 }
11003
11004 static const char *
11005 get_symbol_other (Filedata * filedata, unsigned int other)
11006 {
11007 const char * result = NULL;
11008 static char buff [32];
11009
11010 if (other == 0)
11011 return "";
11012
11013 switch (filedata->file_header.e_machine)
11014 {
11015 case EM_MIPS:
11016 result = get_mips_symbol_other (other);
11017 break;
11018 case EM_IA_64:
11019 result = get_ia64_symbol_other (filedata, other);
11020 break;
11021 case EM_PPC64:
11022 result = get_ppc64_symbol_other (other);
11023 break;
11024 default:
11025 result = NULL;
11026 break;
11027 }
11028
11029 if (result)
11030 return result;
11031
11032 snprintf (buff, sizeof buff, _("<other>: %x"), other);
11033 return buff;
11034 }
11035
11036 static const char *
11037 get_symbol_index_type (Filedata * filedata, unsigned int type)
11038 {
11039 static char buff[32];
11040
11041 switch (type)
11042 {
11043 case SHN_UNDEF: return "UND";
11044 case SHN_ABS: return "ABS";
11045 case SHN_COMMON: return "COM";
11046 default:
11047 if (type == SHN_IA_64_ANSI_COMMON
11048 && filedata->file_header.e_machine == EM_IA_64
11049 && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
11050 return "ANSI_COM";
11051 else if ((filedata->file_header.e_machine == EM_X86_64
11052 || filedata->file_header.e_machine == EM_L1OM
11053 || filedata->file_header.e_machine == EM_K1OM)
11054 && type == SHN_X86_64_LCOMMON)
11055 return "LARGE_COM";
11056 else if ((type == SHN_MIPS_SCOMMON
11057 && filedata->file_header.e_machine == EM_MIPS)
11058 || (type == SHN_TIC6X_SCOMMON
11059 && filedata->file_header.e_machine == EM_TI_C6000))
11060 return "SCOM";
11061 else if (type == SHN_MIPS_SUNDEFINED
11062 && filedata->file_header.e_machine == EM_MIPS)
11063 return "SUND";
11064 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
11065 sprintf (buff, "PRC[0x%04x]", type & 0xffff);
11066 else if (type >= SHN_LOOS && type <= SHN_HIOS)
11067 sprintf (buff, "OS [0x%04x]", type & 0xffff);
11068 else if (type >= SHN_LORESERVE)
11069 sprintf (buff, "RSV[0x%04x]", type & 0xffff);
11070 else if (type >= filedata->file_header.e_shnum)
11071 sprintf (buff, _("bad section index[%3d]"), type);
11072 else
11073 sprintf (buff, "%3d", type);
11074 break;
11075 }
11076
11077 return buff;
11078 }
11079
11080 static bfd_vma *
11081 get_dynamic_data (Filedata * filedata, bfd_size_type number, unsigned int ent_size)
11082 {
11083 unsigned char * e_data;
11084 bfd_vma * i_data;
11085
11086 /* If the size_t type is smaller than the bfd_size_type, eg because
11087 you are building a 32-bit tool on a 64-bit host, then make sure
11088 that when (number) is cast to (size_t) no information is lost. */
11089 if (sizeof (size_t) < sizeof (bfd_size_type)
11090 && (bfd_size_type) ((size_t) number) != number)
11091 {
11092 error (_("Size truncation prevents reading %s elements of size %u\n"),
11093 bfd_vmatoa ("u", number), ent_size);
11094 return NULL;
11095 }
11096
11097 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
11098 attempting to allocate memory when the read is bound to fail. */
11099 if (ent_size * number > filedata->file_size)
11100 {
11101 error (_("Invalid number of dynamic entries: %s\n"),
11102 bfd_vmatoa ("u", number));
11103 return NULL;
11104 }
11105
11106 e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
11107 if (e_data == NULL)
11108 {
11109 error (_("Out of memory reading %s dynamic entries\n"),
11110 bfd_vmatoa ("u", number));
11111 return NULL;
11112 }
11113
11114 if (fread (e_data, ent_size, (size_t) number, filedata->handle) != number)
11115 {
11116 error (_("Unable to read in %s bytes of dynamic data\n"),
11117 bfd_vmatoa ("u", number * ent_size));
11118 free (e_data);
11119 return NULL;
11120 }
11121
11122 i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
11123 if (i_data == NULL)
11124 {
11125 error (_("Out of memory allocating space for %s dynamic entries\n"),
11126 bfd_vmatoa ("u", number));
11127 free (e_data);
11128 return NULL;
11129 }
11130
11131 while (number--)
11132 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
11133
11134 free (e_data);
11135
11136 return i_data;
11137 }
11138
11139 static void
11140 print_dynamic_symbol (Filedata * filedata, bfd_vma si, unsigned long hn)
11141 {
11142 Elf_Internal_Sym * psym;
11143 int n;
11144
11145 n = print_vma (si, DEC_5);
11146 if (n < 5)
11147 fputs (&" "[n], stdout);
11148 printf (" %3lu: ", hn);
11149
11150 if (dynamic_symbols == NULL || si >= num_dynamic_syms)
11151 {
11152 printf (_("<No info available for dynamic symbol number %lu>\n"),
11153 (unsigned long) si);
11154 return;
11155 }
11156
11157 psym = dynamic_symbols + si;
11158 print_vma (psym->st_value, LONG_HEX);
11159 putchar (' ');
11160 print_vma (psym->st_size, DEC_5);
11161
11162 printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
11163 printf (" %-6s", get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
11164
11165 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11166 printf (" %-7s", get_solaris_symbol_visibility (psym->st_other));
11167 else
11168 {
11169 unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11170
11171 printf (" %-7s", get_symbol_visibility (vis));
11172 /* Check to see if any other bits in the st_other field are set.
11173 Note - displaying this information disrupts the layout of the
11174 table being generated, but for the moment this case is very
11175 rare. */
11176 if (psym->st_other ^ vis)
11177 printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
11178 }
11179
11180 printf (" %3.3s ", get_symbol_index_type (filedata, psym->st_shndx));
11181 if (VALID_DYNAMIC_NAME (psym->st_name))
11182 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
11183 else
11184 printf (_(" <corrupt: %14ld>"), psym->st_name);
11185 putchar ('\n');
11186 }
11187
11188 static const char *
11189 get_symbol_version_string (Filedata * filedata,
11190 bfd_boolean is_dynsym,
11191 const char * strtab,
11192 unsigned long int strtab_size,
11193 unsigned int si,
11194 Elf_Internal_Sym * psym,
11195 enum versioned_symbol_info * sym_info,
11196 unsigned short * vna_other)
11197 {
11198 unsigned char data[2];
11199 unsigned short vers_data;
11200 unsigned long offset;
11201
11202 if (!is_dynsym
11203 || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
11204 return NULL;
11205
11206 offset = offset_from_vma (filedata, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
11207 sizeof data + si * sizeof (vers_data));
11208
11209 if (get_data (&data, filedata, offset + si * sizeof (vers_data),
11210 sizeof (data), 1, _("version data")) == NULL)
11211 return NULL;
11212
11213 vers_data = byte_get (data, 2);
11214
11215 if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data <= 1)
11216 return NULL;
11217
11218 /* Usually we'd only see verdef for defined symbols, and verneed for
11219 undefined symbols. However, symbols defined by the linker in
11220 .dynbss for variables copied from a shared library in order to
11221 avoid text relocations are defined yet have verneed. We could
11222 use a heuristic to detect the special case, for example, check
11223 for verneed first on symbols defined in SHT_NOBITS sections, but
11224 it is simpler and more reliable to just look for both verdef and
11225 verneed. .dynbss might not be mapped to a SHT_NOBITS section. */
11226
11227 if (psym->st_shndx != SHN_UNDEF
11228 && vers_data != 0x8001
11229 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
11230 {
11231 Elf_Internal_Verdef ivd;
11232 Elf_Internal_Verdaux ivda;
11233 Elf_External_Verdaux evda;
11234 unsigned long off;
11235
11236 off = offset_from_vma (filedata,
11237 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
11238 sizeof (Elf_External_Verdef));
11239
11240 do
11241 {
11242 Elf_External_Verdef evd;
11243
11244 if (get_data (&evd, filedata, off, sizeof (evd), 1,
11245 _("version def")) == NULL)
11246 {
11247 ivd.vd_ndx = 0;
11248 ivd.vd_aux = 0;
11249 ivd.vd_next = 0;
11250 }
11251 else
11252 {
11253 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
11254 ivd.vd_aux = BYTE_GET (evd.vd_aux);
11255 ivd.vd_next = BYTE_GET (evd.vd_next);
11256 }
11257
11258 off += ivd.vd_next;
11259 }
11260 while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
11261
11262 if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
11263 {
11264 off -= ivd.vd_next;
11265 off += ivd.vd_aux;
11266
11267 if (get_data (&evda, filedata, off, sizeof (evda), 1,
11268 _("version def aux")) != NULL)
11269 {
11270 ivda.vda_name = BYTE_GET (evda.vda_name);
11271
11272 if (psym->st_name != ivda.vda_name)
11273 {
11274 *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
11275 ? symbol_hidden : symbol_public);
11276 return (ivda.vda_name < strtab_size
11277 ? strtab + ivda.vda_name : _("<corrupt>"));
11278 }
11279 }
11280 }
11281 }
11282
11283 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
11284 {
11285 Elf_External_Verneed evn;
11286 Elf_Internal_Verneed ivn;
11287 Elf_Internal_Vernaux ivna;
11288
11289 offset = offset_from_vma (filedata,
11290 version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
11291 sizeof evn);
11292 do
11293 {
11294 unsigned long vna_off;
11295
11296 if (get_data (&evn, filedata, offset, sizeof (evn), 1,
11297 _("version need")) == NULL)
11298 {
11299 ivna.vna_next = 0;
11300 ivna.vna_other = 0;
11301 ivna.vna_name = 0;
11302 break;
11303 }
11304
11305 ivn.vn_aux = BYTE_GET (evn.vn_aux);
11306 ivn.vn_next = BYTE_GET (evn.vn_next);
11307
11308 vna_off = offset + ivn.vn_aux;
11309
11310 do
11311 {
11312 Elf_External_Vernaux evna;
11313
11314 if (get_data (&evna, filedata, vna_off, sizeof (evna), 1,
11315 _("version need aux (3)")) == NULL)
11316 {
11317 ivna.vna_next = 0;
11318 ivna.vna_other = 0;
11319 ivna.vna_name = 0;
11320 }
11321 else
11322 {
11323 ivna.vna_other = BYTE_GET (evna.vna_other);
11324 ivna.vna_next = BYTE_GET (evna.vna_next);
11325 ivna.vna_name = BYTE_GET (evna.vna_name);
11326 }
11327
11328 vna_off += ivna.vna_next;
11329 }
11330 while (ivna.vna_other != vers_data && ivna.vna_next != 0);
11331
11332 if (ivna.vna_other == vers_data)
11333 break;
11334
11335 offset += ivn.vn_next;
11336 }
11337 while (ivn.vn_next != 0);
11338
11339 if (ivna.vna_other == vers_data)
11340 {
11341 *sym_info = symbol_undefined;
11342 *vna_other = ivna.vna_other;
11343 return (ivna.vna_name < strtab_size
11344 ? strtab + ivna.vna_name : _("<corrupt>"));
11345 }
11346 }
11347 return NULL;
11348 }
11349
11350 /* Dump the symbol table. */
11351 static bfd_boolean
11352 process_symbol_table (Filedata * filedata)
11353 {
11354 Elf_Internal_Shdr * section;
11355 bfd_size_type nbuckets = 0;
11356 bfd_size_type nchains = 0;
11357 bfd_vma * buckets = NULL;
11358 bfd_vma * chains = NULL;
11359 bfd_vma ngnubuckets = 0;
11360 bfd_vma * gnubuckets = NULL;
11361 bfd_vma * gnuchains = NULL;
11362 bfd_vma gnusymidx = 0;
11363 bfd_size_type ngnuchains = 0;
11364
11365 if (!do_syms && !do_dyn_syms && !do_histogram)
11366 return TRUE;
11367
11368 if (dynamic_info[DT_HASH]
11369 && (do_histogram
11370 || (do_using_dynamic
11371 && !do_dyn_syms
11372 && dynamic_strings != NULL)))
11373 {
11374 unsigned char nb[8];
11375 unsigned char nc[8];
11376 unsigned int hash_ent_size = 4;
11377
11378 if ((filedata->file_header.e_machine == EM_ALPHA
11379 || filedata->file_header.e_machine == EM_S390
11380 || filedata->file_header.e_machine == EM_S390_OLD)
11381 && filedata->file_header.e_ident[EI_CLASS] == ELFCLASS64)
11382 hash_ent_size = 8;
11383
11384 if (fseek (filedata->handle,
11385 (archive_file_offset
11386 + offset_from_vma (filedata, dynamic_info[DT_HASH],
11387 sizeof nb + sizeof nc)),
11388 SEEK_SET))
11389 {
11390 error (_("Unable to seek to start of dynamic information\n"));
11391 goto no_hash;
11392 }
11393
11394 if (fread (nb, hash_ent_size, 1, filedata->handle) != 1)
11395 {
11396 error (_("Failed to read in number of buckets\n"));
11397 goto no_hash;
11398 }
11399
11400 if (fread (nc, hash_ent_size, 1, filedata->handle) != 1)
11401 {
11402 error (_("Failed to read in number of chains\n"));
11403 goto no_hash;
11404 }
11405
11406 nbuckets = byte_get (nb, hash_ent_size);
11407 nchains = byte_get (nc, hash_ent_size);
11408
11409 buckets = get_dynamic_data (filedata, nbuckets, hash_ent_size);
11410 chains = get_dynamic_data (filedata, nchains, hash_ent_size);
11411
11412 no_hash:
11413 if (buckets == NULL || chains == NULL)
11414 {
11415 if (do_using_dynamic)
11416 return FALSE;
11417 free (buckets);
11418 free (chains);
11419 buckets = NULL;
11420 chains = NULL;
11421 nbuckets = 0;
11422 nchains = 0;
11423 }
11424 }
11425
11426 if (dynamic_info_DT_GNU_HASH
11427 && (do_histogram
11428 || (do_using_dynamic
11429 && !do_dyn_syms
11430 && dynamic_strings != NULL)))
11431 {
11432 unsigned char nb[16];
11433 bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
11434 bfd_vma buckets_vma;
11435
11436 if (fseek (filedata->handle,
11437 (archive_file_offset
11438 + offset_from_vma (filedata, dynamic_info_DT_GNU_HASH,
11439 sizeof nb)),
11440 SEEK_SET))
11441 {
11442 error (_("Unable to seek to start of dynamic information\n"));
11443 goto no_gnu_hash;
11444 }
11445
11446 if (fread (nb, 16, 1, filedata->handle) != 1)
11447 {
11448 error (_("Failed to read in number of buckets\n"));
11449 goto no_gnu_hash;
11450 }
11451
11452 ngnubuckets = byte_get (nb, 4);
11453 gnusymidx = byte_get (nb + 4, 4);
11454 bitmaskwords = byte_get (nb + 8, 4);
11455 buckets_vma = dynamic_info_DT_GNU_HASH + 16;
11456 if (is_32bit_elf)
11457 buckets_vma += bitmaskwords * 4;
11458 else
11459 buckets_vma += bitmaskwords * 8;
11460
11461 if (fseek (filedata->handle,
11462 (archive_file_offset
11463 + offset_from_vma (filedata, buckets_vma, 4)),
11464 SEEK_SET))
11465 {
11466 error (_("Unable to seek to start of dynamic information\n"));
11467 goto no_gnu_hash;
11468 }
11469
11470 gnubuckets = get_dynamic_data (filedata, ngnubuckets, 4);
11471
11472 if (gnubuckets == NULL)
11473 goto no_gnu_hash;
11474
11475 for (i = 0; i < ngnubuckets; i++)
11476 if (gnubuckets[i] != 0)
11477 {
11478 if (gnubuckets[i] < gnusymidx)
11479 return FALSE;
11480
11481 if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
11482 maxchain = gnubuckets[i];
11483 }
11484
11485 if (maxchain == 0xffffffff)
11486 goto no_gnu_hash;
11487
11488 maxchain -= gnusymidx;
11489
11490 if (fseek (filedata->handle,
11491 (archive_file_offset
11492 + offset_from_vma (filedata, buckets_vma
11493 + 4 * (ngnubuckets + maxchain), 4)),
11494 SEEK_SET))
11495 {
11496 error (_("Unable to seek to start of dynamic information\n"));
11497 goto no_gnu_hash;
11498 }
11499
11500 do
11501 {
11502 if (fread (nb, 4, 1, filedata->handle) != 1)
11503 {
11504 error (_("Failed to determine last chain length\n"));
11505 goto no_gnu_hash;
11506 }
11507
11508 if (maxchain + 1 == 0)
11509 goto no_gnu_hash;
11510
11511 ++maxchain;
11512 }
11513 while ((byte_get (nb, 4) & 1) == 0);
11514
11515 if (fseek (filedata->handle,
11516 (archive_file_offset
11517 + offset_from_vma (filedata, buckets_vma + 4 * ngnubuckets, 4)),
11518 SEEK_SET))
11519 {
11520 error (_("Unable to seek to start of dynamic information\n"));
11521 goto no_gnu_hash;
11522 }
11523
11524 gnuchains = get_dynamic_data (filedata, maxchain, 4);
11525 ngnuchains = maxchain;
11526
11527 no_gnu_hash:
11528 if (gnuchains == NULL)
11529 {
11530 free (gnubuckets);
11531 gnubuckets = NULL;
11532 ngnubuckets = 0;
11533 if (do_using_dynamic)
11534 return FALSE;
11535 }
11536 }
11537
11538 if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
11539 && do_syms
11540 && do_using_dynamic
11541 && dynamic_strings != NULL
11542 && dynamic_symbols != NULL)
11543 {
11544 unsigned long hn;
11545
11546 if (dynamic_info[DT_HASH])
11547 {
11548 bfd_vma si;
11549 char *visited;
11550
11551 printf (_("\nSymbol table for image:\n"));
11552 if (is_32bit_elf)
11553 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11554 else
11555 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11556
11557 visited = xcmalloc (nchains, 1);
11558 memset (visited, 0, nchains);
11559 for (hn = 0; hn < nbuckets; hn++)
11560 {
11561 for (si = buckets[hn]; si > 0; si = chains[si])
11562 {
11563 print_dynamic_symbol (filedata, si, hn);
11564 if (si >= nchains || visited[si])
11565 {
11566 error (_("histogram chain is corrupt\n"));
11567 break;
11568 }
11569 visited[si] = 1;
11570 }
11571 }
11572 free (visited);
11573 }
11574
11575 if (dynamic_info_DT_GNU_HASH)
11576 {
11577 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
11578 if (is_32bit_elf)
11579 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11580 else
11581 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11582
11583 for (hn = 0; hn < ngnubuckets; ++hn)
11584 if (gnubuckets[hn] != 0)
11585 {
11586 bfd_vma si = gnubuckets[hn];
11587 bfd_vma off = si - gnusymidx;
11588
11589 do
11590 {
11591 print_dynamic_symbol (filedata, si, hn);
11592 si++;
11593 }
11594 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
11595 }
11596 }
11597 }
11598 else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
11599 && filedata->section_headers != NULL)
11600 {
11601 unsigned int i;
11602
11603 for (i = 0, section = filedata->section_headers;
11604 i < filedata->file_header.e_shnum;
11605 i++, section++)
11606 {
11607 unsigned int si;
11608 char * strtab = NULL;
11609 unsigned long int strtab_size = 0;
11610 Elf_Internal_Sym * symtab;
11611 Elf_Internal_Sym * psym;
11612 unsigned long num_syms;
11613
11614 if ((section->sh_type != SHT_SYMTAB
11615 && section->sh_type != SHT_DYNSYM)
11616 || (!do_syms
11617 && section->sh_type == SHT_SYMTAB))
11618 continue;
11619
11620 if (section->sh_entsize == 0)
11621 {
11622 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
11623 printable_section_name (filedata, section));
11624 continue;
11625 }
11626
11627 num_syms = section->sh_size / section->sh_entsize;
11628 printf (ngettext ("\nSymbol table '%s' contains %lu entry:\n",
11629 "\nSymbol table '%s' contains %lu entries:\n",
11630 num_syms),
11631 printable_section_name (filedata, section),
11632 num_syms);
11633
11634 if (is_32bit_elf)
11635 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
11636 else
11637 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
11638
11639 symtab = GET_ELF_SYMBOLS (filedata, section, & num_syms);
11640 if (symtab == NULL)
11641 continue;
11642
11643 if (section->sh_link == filedata->file_header.e_shstrndx)
11644 {
11645 strtab = filedata->string_table;
11646 strtab_size = filedata->string_table_length;
11647 }
11648 else if (section->sh_link < filedata->file_header.e_shnum)
11649 {
11650 Elf_Internal_Shdr * string_sec;
11651
11652 string_sec = filedata->section_headers + section->sh_link;
11653
11654 strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset,
11655 1, string_sec->sh_size,
11656 _("string table"));
11657 strtab_size = strtab != NULL ? string_sec->sh_size : 0;
11658 }
11659
11660 for (si = 0, psym = symtab; si < num_syms; si++, psym++)
11661 {
11662 const char *version_string;
11663 enum versioned_symbol_info sym_info;
11664 unsigned short vna_other;
11665
11666 printf ("%6d: ", si);
11667 print_vma (psym->st_value, LONG_HEX);
11668 putchar (' ');
11669 print_vma (psym->st_size, DEC_5);
11670 printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
11671 printf (" %-6s", get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
11672 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11673 printf (" %-7s", get_solaris_symbol_visibility (psym->st_other));
11674 else
11675 {
11676 unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11677
11678 printf (" %-7s", get_symbol_visibility (vis));
11679 /* Check to see if any other bits in the st_other field are set.
11680 Note - displaying this information disrupts the layout of the
11681 table being generated, but for the moment this case is very rare. */
11682 if (psym->st_other ^ vis)
11683 printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
11684 }
11685 printf (" %4s ", get_symbol_index_type (filedata, psym->st_shndx));
11686 print_symbol (25, psym->st_name < strtab_size
11687 ? strtab + psym->st_name : _("<corrupt>"));
11688
11689 version_string
11690 = get_symbol_version_string (filedata,
11691 section->sh_type == SHT_DYNSYM,
11692 strtab, strtab_size, si,
11693 psym, &sym_info, &vna_other);
11694 if (version_string)
11695 {
11696 if (sym_info == symbol_undefined)
11697 printf ("@%s (%d)", version_string, vna_other);
11698 else
11699 printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
11700 version_string);
11701 }
11702
11703 putchar ('\n');
11704
11705 if (ELF_ST_BIND (psym->st_info) == STB_LOCAL
11706 && si >= section->sh_info
11707 /* Irix 5 and 6 MIPS binaries are known to ignore this requirement. */
11708 && filedata->file_header.e_machine != EM_MIPS
11709 /* Solaris binaries have been found to violate this requirement as
11710 well. Not sure if this is a bug or an ABI requirement. */
11711 && filedata->file_header.e_ident[EI_OSABI] != ELFOSABI_SOLARIS)
11712 warn (_("local symbol %u found at index >= %s's sh_info value of %u\n"),
11713 si, printable_section_name (filedata, section), section->sh_info);
11714 }
11715
11716 free (symtab);
11717 if (strtab != filedata->string_table)
11718 free (strtab);
11719 }
11720 }
11721 else if (do_syms)
11722 printf
11723 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
11724
11725 if (do_histogram && buckets != NULL)
11726 {
11727 unsigned long * lengths;
11728 unsigned long * counts;
11729 unsigned long hn;
11730 bfd_vma si;
11731 unsigned long maxlength = 0;
11732 unsigned long nzero_counts = 0;
11733 unsigned long nsyms = 0;
11734 char *visited;
11735
11736 printf (ngettext ("\nHistogram for bucket list length "
11737 "(total of %lu bucket):\n",
11738 "\nHistogram for bucket list length "
11739 "(total of %lu buckets):\n",
11740 (unsigned long) nbuckets),
11741 (unsigned long) nbuckets);
11742
11743 lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
11744 if (lengths == NULL)
11745 {
11746 error (_("Out of memory allocating space for histogram buckets\n"));
11747 return FALSE;
11748 }
11749 visited = xcmalloc (nchains, 1);
11750 memset (visited, 0, nchains);
11751
11752 printf (_(" Length Number %% of total Coverage\n"));
11753 for (hn = 0; hn < nbuckets; ++hn)
11754 {
11755 for (si = buckets[hn]; si > 0; si = chains[si])
11756 {
11757 ++nsyms;
11758 if (maxlength < ++lengths[hn])
11759 ++maxlength;
11760 if (si >= nchains || visited[si])
11761 {
11762 error (_("histogram chain is corrupt\n"));
11763 break;
11764 }
11765 visited[si] = 1;
11766 }
11767 }
11768 free (visited);
11769
11770 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11771 if (counts == NULL)
11772 {
11773 free (lengths);
11774 error (_("Out of memory allocating space for histogram counts\n"));
11775 return FALSE;
11776 }
11777
11778 for (hn = 0; hn < nbuckets; ++hn)
11779 ++counts[lengths[hn]];
11780
11781 if (nbuckets > 0)
11782 {
11783 unsigned long i;
11784 printf (" 0 %-10lu (%5.1f%%)\n",
11785 counts[0], (counts[0] * 100.0) / nbuckets);
11786 for (i = 1; i <= maxlength; ++i)
11787 {
11788 nzero_counts += counts[i] * i;
11789 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11790 i, counts[i], (counts[i] * 100.0) / nbuckets,
11791 (nzero_counts * 100.0) / nsyms);
11792 }
11793 }
11794
11795 free (counts);
11796 free (lengths);
11797 }
11798
11799 if (buckets != NULL)
11800 {
11801 free (buckets);
11802 free (chains);
11803 }
11804
11805 if (do_histogram && gnubuckets != NULL)
11806 {
11807 unsigned long * lengths;
11808 unsigned long * counts;
11809 unsigned long hn;
11810 unsigned long maxlength = 0;
11811 unsigned long nzero_counts = 0;
11812 unsigned long nsyms = 0;
11813
11814 printf (ngettext ("\nHistogram for `.gnu.hash' bucket list length "
11815 "(total of %lu bucket):\n",
11816 "\nHistogram for `.gnu.hash' bucket list length "
11817 "(total of %lu buckets):\n",
11818 (unsigned long) ngnubuckets),
11819 (unsigned long) ngnubuckets);
11820
11821 lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
11822 if (lengths == NULL)
11823 {
11824 error (_("Out of memory allocating space for gnu histogram buckets\n"));
11825 return FALSE;
11826 }
11827
11828 printf (_(" Length Number %% of total Coverage\n"));
11829
11830 for (hn = 0; hn < ngnubuckets; ++hn)
11831 if (gnubuckets[hn] != 0)
11832 {
11833 bfd_vma off, length = 1;
11834
11835 for (off = gnubuckets[hn] - gnusymidx;
11836 /* PR 17531 file: 010-77222-0.004. */
11837 off < ngnuchains && (gnuchains[off] & 1) == 0;
11838 ++off)
11839 ++length;
11840 lengths[hn] = length;
11841 if (length > maxlength)
11842 maxlength = length;
11843 nsyms += length;
11844 }
11845
11846 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11847 if (counts == NULL)
11848 {
11849 free (lengths);
11850 error (_("Out of memory allocating space for gnu histogram counts\n"));
11851 return FALSE;
11852 }
11853
11854 for (hn = 0; hn < ngnubuckets; ++hn)
11855 ++counts[lengths[hn]];
11856
11857 if (ngnubuckets > 0)
11858 {
11859 unsigned long j;
11860 printf (" 0 %-10lu (%5.1f%%)\n",
11861 counts[0], (counts[0] * 100.0) / ngnubuckets);
11862 for (j = 1; j <= maxlength; ++j)
11863 {
11864 nzero_counts += counts[j] * j;
11865 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11866 j, counts[j], (counts[j] * 100.0) / ngnubuckets,
11867 (nzero_counts * 100.0) / nsyms);
11868 }
11869 }
11870
11871 free (counts);
11872 free (lengths);
11873 free (gnubuckets);
11874 free (gnuchains);
11875 }
11876
11877 return TRUE;
11878 }
11879
11880 static bfd_boolean
11881 process_syminfo (Filedata * filedata ATTRIBUTE_UNUSED)
11882 {
11883 unsigned int i;
11884
11885 if (dynamic_syminfo == NULL
11886 || !do_dynamic)
11887 /* No syminfo, this is ok. */
11888 return TRUE;
11889
11890 /* There better should be a dynamic symbol section. */
11891 if (dynamic_symbols == NULL || dynamic_strings == NULL)
11892 return FALSE;
11893
11894 if (dynamic_addr)
11895 printf (ngettext ("\nDynamic info segment at offset 0x%lx "
11896 "contains %d entry:\n",
11897 "\nDynamic info segment at offset 0x%lx "
11898 "contains %d entries:\n",
11899 dynamic_syminfo_nent),
11900 dynamic_syminfo_offset, dynamic_syminfo_nent);
11901
11902 printf (_(" Num: Name BoundTo Flags\n"));
11903 for (i = 0; i < dynamic_syminfo_nent; ++i)
11904 {
11905 unsigned short int flags = dynamic_syminfo[i].si_flags;
11906
11907 printf ("%4d: ", i);
11908 if (i >= num_dynamic_syms)
11909 printf (_("<corrupt index>"));
11910 else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
11911 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
11912 else
11913 printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
11914 putchar (' ');
11915
11916 switch (dynamic_syminfo[i].si_boundto)
11917 {
11918 case SYMINFO_BT_SELF:
11919 fputs ("SELF ", stdout);
11920 break;
11921 case SYMINFO_BT_PARENT:
11922 fputs ("PARENT ", stdout);
11923 break;
11924 default:
11925 if (dynamic_syminfo[i].si_boundto > 0
11926 && dynamic_syminfo[i].si_boundto < dynamic_nent
11927 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
11928 {
11929 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
11930 putchar (' ' );
11931 }
11932 else
11933 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
11934 break;
11935 }
11936
11937 if (flags & SYMINFO_FLG_DIRECT)
11938 printf (" DIRECT");
11939 if (flags & SYMINFO_FLG_PASSTHRU)
11940 printf (" PASSTHRU");
11941 if (flags & SYMINFO_FLG_COPY)
11942 printf (" COPY");
11943 if (flags & SYMINFO_FLG_LAZYLOAD)
11944 printf (" LAZYLOAD");
11945
11946 puts ("");
11947 }
11948
11949 return TRUE;
11950 }
11951
11952 #define IN_RANGE(START,END,ADDR,OFF) \
11953 (((ADDR) >= (START)) && ((ADDR) + (OFF) < (END)))
11954
11955 /* Check to see if the given reloc needs to be handled in a target specific
11956 manner. If so then process the reloc and return TRUE otherwise return
11957 FALSE.
11958
11959 If called with reloc == NULL, then this is a signal that reloc processing
11960 for the current section has finished, and any saved state should be
11961 discarded. */
11962
11963 static bfd_boolean
11964 target_specific_reloc_handling (Filedata * filedata,
11965 Elf_Internal_Rela * reloc,
11966 unsigned char * start,
11967 unsigned char * end,
11968 Elf_Internal_Sym * symtab,
11969 unsigned long num_syms)
11970 {
11971 unsigned int reloc_type = 0;
11972 unsigned long sym_index = 0;
11973
11974 if (reloc)
11975 {
11976 reloc_type = get_reloc_type (filedata, reloc->r_info);
11977 sym_index = get_reloc_symindex (reloc->r_info);
11978 }
11979
11980 switch (filedata->file_header.e_machine)
11981 {
11982 case EM_MSP430:
11983 case EM_MSP430_OLD:
11984 {
11985 static Elf_Internal_Sym * saved_sym = NULL;
11986
11987 if (reloc == NULL)
11988 {
11989 saved_sym = NULL;
11990 return TRUE;
11991 }
11992
11993 switch (reloc_type)
11994 {
11995 case 10: /* R_MSP430_SYM_DIFF */
11996 if (uses_msp430x_relocs (filedata))
11997 break;
11998 /* Fall through. */
11999 case 21: /* R_MSP430X_SYM_DIFF */
12000 /* PR 21139. */
12001 if (sym_index >= num_syms)
12002 error (_("MSP430 SYM_DIFF reloc contains invalid symbol index %lu\n"),
12003 sym_index);
12004 else
12005 saved_sym = symtab + sym_index;
12006 return TRUE;
12007
12008 case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
12009 case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
12010 goto handle_sym_diff;
12011
12012 case 5: /* R_MSP430_16_BYTE */
12013 case 9: /* R_MSP430_8 */
12014 if (uses_msp430x_relocs (filedata))
12015 break;
12016 goto handle_sym_diff;
12017
12018 case 2: /* R_MSP430_ABS16 */
12019 case 15: /* R_MSP430X_ABS16 */
12020 if (! uses_msp430x_relocs (filedata))
12021 break;
12022 goto handle_sym_diff;
12023
12024 handle_sym_diff:
12025 if (saved_sym != NULL)
12026 {
12027 int reloc_size = reloc_type == 1 ? 4 : 2;
12028 bfd_vma value;
12029
12030 if (sym_index >= num_syms)
12031 error (_("MSP430 reloc contains invalid symbol index %lu\n"),
12032 sym_index);
12033 else
12034 {
12035 value = reloc->r_addend + (symtab[sym_index].st_value
12036 - saved_sym->st_value);
12037
12038 if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
12039 byte_put (start + reloc->r_offset, value, reloc_size);
12040 else
12041 /* PR 21137 */
12042 error (_("MSP430 sym diff reloc contains invalid offset: 0x%lx\n"),
12043 (long) reloc->r_offset);
12044 }
12045
12046 saved_sym = NULL;
12047 return TRUE;
12048 }
12049 break;
12050
12051 default:
12052 if (saved_sym != NULL)
12053 error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
12054 break;
12055 }
12056 break;
12057 }
12058
12059 case EM_MN10300:
12060 case EM_CYGNUS_MN10300:
12061 {
12062 static Elf_Internal_Sym * saved_sym = NULL;
12063
12064 if (reloc == NULL)
12065 {
12066 saved_sym = NULL;
12067 return TRUE;
12068 }
12069
12070 switch (reloc_type)
12071 {
12072 case 34: /* R_MN10300_ALIGN */
12073 return TRUE;
12074 case 33: /* R_MN10300_SYM_DIFF */
12075 if (sym_index >= num_syms)
12076 error (_("MN10300_SYM_DIFF reloc contains invalid symbol index %lu\n"),
12077 sym_index);
12078 else
12079 saved_sym = symtab + sym_index;
12080 return TRUE;
12081
12082 case 1: /* R_MN10300_32 */
12083 case 2: /* R_MN10300_16 */
12084 if (saved_sym != NULL)
12085 {
12086 int reloc_size = reloc_type == 1 ? 4 : 2;
12087 bfd_vma value;
12088
12089 if (sym_index >= num_syms)
12090 error (_("MN10300 reloc contains invalid symbol index %lu\n"),
12091 sym_index);
12092 else
12093 {
12094 value = reloc->r_addend + (symtab[sym_index].st_value
12095 - saved_sym->st_value);
12096
12097 if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
12098 byte_put (start + reloc->r_offset, value, reloc_size);
12099 else
12100 error (_("MN10300 sym diff reloc contains invalid offset: 0x%lx\n"),
12101 (long) reloc->r_offset);
12102 }
12103
12104 saved_sym = NULL;
12105 return TRUE;
12106 }
12107 break;
12108 default:
12109 if (saved_sym != NULL)
12110 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
12111 break;
12112 }
12113 break;
12114 }
12115
12116 case EM_RL78:
12117 {
12118 static bfd_vma saved_sym1 = 0;
12119 static bfd_vma saved_sym2 = 0;
12120 static bfd_vma value;
12121
12122 if (reloc == NULL)
12123 {
12124 saved_sym1 = saved_sym2 = 0;
12125 return TRUE;
12126 }
12127
12128 switch (reloc_type)
12129 {
12130 case 0x80: /* R_RL78_SYM. */
12131 saved_sym1 = saved_sym2;
12132 if (sym_index >= num_syms)
12133 error (_("RL78_SYM reloc contains invalid symbol index %lu\n"),
12134 sym_index);
12135 else
12136 {
12137 saved_sym2 = symtab[sym_index].st_value;
12138 saved_sym2 += reloc->r_addend;
12139 }
12140 return TRUE;
12141
12142 case 0x83: /* R_RL78_OPsub. */
12143 value = saved_sym1 - saved_sym2;
12144 saved_sym2 = saved_sym1 = 0;
12145 return TRUE;
12146 break;
12147
12148 case 0x41: /* R_RL78_ABS32. */
12149 if (IN_RANGE (start, end, start + reloc->r_offset, 4))
12150 byte_put (start + reloc->r_offset, value, 4);
12151 else
12152 error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12153 (long) reloc->r_offset);
12154 value = 0;
12155 return TRUE;
12156
12157 case 0x43: /* R_RL78_ABS16. */
12158 if (IN_RANGE (start, end, start + reloc->r_offset, 2))
12159 byte_put (start + reloc->r_offset, value, 2);
12160 else
12161 error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12162 (long) reloc->r_offset);
12163 value = 0;
12164 return TRUE;
12165
12166 default:
12167 break;
12168 }
12169 break;
12170 }
12171 }
12172
12173 return FALSE;
12174 }
12175
12176 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
12177 DWARF debug sections. This is a target specific test. Note - we do not
12178 go through the whole including-target-headers-multiple-times route, (as
12179 we have already done with <elf/h8.h>) because this would become very
12180 messy and even then this function would have to contain target specific
12181 information (the names of the relocs instead of their numeric values).
12182 FIXME: This is not the correct way to solve this problem. The proper way
12183 is to have target specific reloc sizing and typing functions created by
12184 the reloc-macros.h header, in the same way that it already creates the
12185 reloc naming functions. */
12186
12187 static bfd_boolean
12188 is_32bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12189 {
12190 /* Please keep this table alpha-sorted for ease of visual lookup. */
12191 switch (filedata->file_header.e_machine)
12192 {
12193 case EM_386:
12194 case EM_IAMCU:
12195 return reloc_type == 1; /* R_386_32. */
12196 case EM_68K:
12197 return reloc_type == 1; /* R_68K_32. */
12198 case EM_860:
12199 return reloc_type == 1; /* R_860_32. */
12200 case EM_960:
12201 return reloc_type == 2; /* R_960_32. */
12202 case EM_AARCH64:
12203 return (reloc_type == 258
12204 || reloc_type == 1); /* R_AARCH64_ABS32 || R_AARCH64_P32_ABS32 */
12205 case EM_ADAPTEVA_EPIPHANY:
12206 return reloc_type == 3;
12207 case EM_ALPHA:
12208 return reloc_type == 1; /* R_ALPHA_REFLONG. */
12209 case EM_ARC:
12210 return reloc_type == 1; /* R_ARC_32. */
12211 case EM_ARC_COMPACT:
12212 case EM_ARC_COMPACT2:
12213 return reloc_type == 4; /* R_ARC_32. */
12214 case EM_ARM:
12215 return reloc_type == 2; /* R_ARM_ABS32 */
12216 case EM_AVR_OLD:
12217 case EM_AVR:
12218 return reloc_type == 1;
12219 case EM_BLACKFIN:
12220 return reloc_type == 0x12; /* R_byte4_data. */
12221 case EM_CRIS:
12222 return reloc_type == 3; /* R_CRIS_32. */
12223 case EM_CR16:
12224 return reloc_type == 3; /* R_CR16_NUM32. */
12225 case EM_CRX:
12226 return reloc_type == 15; /* R_CRX_NUM32. */
12227 case EM_CYGNUS_FRV:
12228 return reloc_type == 1;
12229 case EM_CYGNUS_D10V:
12230 case EM_D10V:
12231 return reloc_type == 6; /* R_D10V_32. */
12232 case EM_CYGNUS_D30V:
12233 case EM_D30V:
12234 return reloc_type == 12; /* R_D30V_32_NORMAL. */
12235 case EM_DLX:
12236 return reloc_type == 3; /* R_DLX_RELOC_32. */
12237 case EM_CYGNUS_FR30:
12238 case EM_FR30:
12239 return reloc_type == 3; /* R_FR30_32. */
12240 case EM_FT32:
12241 return reloc_type == 1; /* R_FT32_32. */
12242 case EM_H8S:
12243 case EM_H8_300:
12244 case EM_H8_300H:
12245 return reloc_type == 1; /* R_H8_DIR32. */
12246 case EM_IA_64:
12247 return (reloc_type == 0x64 /* R_IA64_SECREL32MSB. */
12248 || reloc_type == 0x65 /* R_IA64_SECREL32LSB. */
12249 || reloc_type == 0x24 /* R_IA64_DIR32MSB. */
12250 || reloc_type == 0x25 /* R_IA64_DIR32LSB. */);
12251 case EM_IP2K_OLD:
12252 case EM_IP2K:
12253 return reloc_type == 2; /* R_IP2K_32. */
12254 case EM_IQ2000:
12255 return reloc_type == 2; /* R_IQ2000_32. */
12256 case EM_LATTICEMICO32:
12257 return reloc_type == 3; /* R_LM32_32. */
12258 case EM_M32C_OLD:
12259 case EM_M32C:
12260 return reloc_type == 3; /* R_M32C_32. */
12261 case EM_M32R:
12262 return reloc_type == 34; /* R_M32R_32_RELA. */
12263 case EM_68HC11:
12264 case EM_68HC12:
12265 return reloc_type == 6; /* R_M68HC11_32. */
12266 case EM_MCORE:
12267 return reloc_type == 1; /* R_MCORE_ADDR32. */
12268 case EM_CYGNUS_MEP:
12269 return reloc_type == 4; /* R_MEP_32. */
12270 case EM_METAG:
12271 return reloc_type == 2; /* R_METAG_ADDR32. */
12272 case EM_MICROBLAZE:
12273 return reloc_type == 1; /* R_MICROBLAZE_32. */
12274 case EM_MIPS:
12275 return reloc_type == 2; /* R_MIPS_32. */
12276 case EM_MMIX:
12277 return reloc_type == 4; /* R_MMIX_32. */
12278 case EM_CYGNUS_MN10200:
12279 case EM_MN10200:
12280 return reloc_type == 1; /* R_MN10200_32. */
12281 case EM_CYGNUS_MN10300:
12282 case EM_MN10300:
12283 return reloc_type == 1; /* R_MN10300_32. */
12284 case EM_MOXIE:
12285 return reloc_type == 1; /* R_MOXIE_32. */
12286 case EM_MSP430_OLD:
12287 case EM_MSP430:
12288 return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32. */
12289 case EM_MT:
12290 return reloc_type == 2; /* R_MT_32. */
12291 case EM_NDS32:
12292 return reloc_type == 20; /* R_NDS32_RELA. */
12293 case EM_ALTERA_NIOS2:
12294 return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32. */
12295 case EM_NIOS32:
12296 return reloc_type == 1; /* R_NIOS_32. */
12297 case EM_OR1K:
12298 return reloc_type == 1; /* R_OR1K_32. */
12299 case EM_PARISC:
12300 return (reloc_type == 1 /* R_PARISC_DIR32. */
12301 || reloc_type == 41); /* R_PARISC_SECREL32. */
12302 case EM_PJ:
12303 case EM_PJ_OLD:
12304 return reloc_type == 1; /* R_PJ_DATA_DIR32. */
12305 case EM_PPC64:
12306 return reloc_type == 1; /* R_PPC64_ADDR32. */
12307 case EM_PPC:
12308 return reloc_type == 1; /* R_PPC_ADDR32. */
12309 case EM_TI_PRU:
12310 return reloc_type == 11; /* R_PRU_BFD_RELOC_32. */
12311 case EM_RISCV:
12312 return reloc_type == 1; /* R_RISCV_32. */
12313 case EM_RL78:
12314 return reloc_type == 1; /* R_RL78_DIR32. */
12315 case EM_RX:
12316 return reloc_type == 1; /* R_RX_DIR32. */
12317 case EM_S370:
12318 return reloc_type == 1; /* R_I370_ADDR31. */
12319 case EM_S390_OLD:
12320 case EM_S390:
12321 return reloc_type == 4; /* R_S390_32. */
12322 case EM_SCORE:
12323 return reloc_type == 8; /* R_SCORE_ABS32. */
12324 case EM_SH:
12325 return reloc_type == 1; /* R_SH_DIR32. */
12326 case EM_SPARC32PLUS:
12327 case EM_SPARCV9:
12328 case EM_SPARC:
12329 return reloc_type == 3 /* R_SPARC_32. */
12330 || reloc_type == 23; /* R_SPARC_UA32. */
12331 case EM_SPU:
12332 return reloc_type == 6; /* R_SPU_ADDR32 */
12333 case EM_TI_C6000:
12334 return reloc_type == 1; /* R_C6000_ABS32. */
12335 case EM_TILEGX:
12336 return reloc_type == 2; /* R_TILEGX_32. */
12337 case EM_TILEPRO:
12338 return reloc_type == 1; /* R_TILEPRO_32. */
12339 case EM_CYGNUS_V850:
12340 case EM_V850:
12341 return reloc_type == 6; /* R_V850_ABS32. */
12342 case EM_V800:
12343 return reloc_type == 0x33; /* R_V810_WORD. */
12344 case EM_VAX:
12345 return reloc_type == 1; /* R_VAX_32. */
12346 case EM_VISIUM:
12347 return reloc_type == 3; /* R_VISIUM_32. */
12348 case EM_WEBASSEMBLY:
12349 return reloc_type == 1; /* R_WASM32_32. */
12350 case EM_X86_64:
12351 case EM_L1OM:
12352 case EM_K1OM:
12353 return reloc_type == 10; /* R_X86_64_32. */
12354 case EM_XC16X:
12355 case EM_C166:
12356 return reloc_type == 3; /* R_XC16C_ABS_32. */
12357 case EM_XGATE:
12358 return reloc_type == 4; /* R_XGATE_32. */
12359 case EM_XSTORMY16:
12360 return reloc_type == 1; /* R_XSTROMY16_32. */
12361 case EM_XTENSA_OLD:
12362 case EM_XTENSA:
12363 return reloc_type == 1; /* R_XTENSA_32. */
12364 default:
12365 {
12366 static unsigned int prev_warn = 0;
12367
12368 /* Avoid repeating the same warning multiple times. */
12369 if (prev_warn != filedata->file_header.e_machine)
12370 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
12371 filedata->file_header.e_machine);
12372 prev_warn = filedata->file_header.e_machine;
12373 return FALSE;
12374 }
12375 }
12376 }
12377
12378 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12379 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
12380
12381 static bfd_boolean
12382 is_32bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
12383 {
12384 switch (filedata->file_header.e_machine)
12385 /* Please keep this table alpha-sorted for ease of visual lookup. */
12386 {
12387 case EM_386:
12388 case EM_IAMCU:
12389 return reloc_type == 2; /* R_386_PC32. */
12390 case EM_68K:
12391 return reloc_type == 4; /* R_68K_PC32. */
12392 case EM_AARCH64:
12393 return reloc_type == 261; /* R_AARCH64_PREL32 */
12394 case EM_ADAPTEVA_EPIPHANY:
12395 return reloc_type == 6;
12396 case EM_ALPHA:
12397 return reloc_type == 10; /* R_ALPHA_SREL32. */
12398 case EM_ARC_COMPACT:
12399 case EM_ARC_COMPACT2:
12400 return reloc_type == 49; /* R_ARC_32_PCREL. */
12401 case EM_ARM:
12402 return reloc_type == 3; /* R_ARM_REL32 */
12403 case EM_AVR_OLD:
12404 case EM_AVR:
12405 return reloc_type == 36; /* R_AVR_32_PCREL. */
12406 case EM_MICROBLAZE:
12407 return reloc_type == 2; /* R_MICROBLAZE_32_PCREL. */
12408 case EM_OR1K:
12409 return reloc_type == 9; /* R_OR1K_32_PCREL. */
12410 case EM_PARISC:
12411 return reloc_type == 9; /* R_PARISC_PCREL32. */
12412 case EM_PPC:
12413 return reloc_type == 26; /* R_PPC_REL32. */
12414 case EM_PPC64:
12415 return reloc_type == 26; /* R_PPC64_REL32. */
12416 case EM_S390_OLD:
12417 case EM_S390:
12418 return reloc_type == 5; /* R_390_PC32. */
12419 case EM_SH:
12420 return reloc_type == 2; /* R_SH_REL32. */
12421 case EM_SPARC32PLUS:
12422 case EM_SPARCV9:
12423 case EM_SPARC:
12424 return reloc_type == 6; /* R_SPARC_DISP32. */
12425 case EM_SPU:
12426 return reloc_type == 13; /* R_SPU_REL32. */
12427 case EM_TILEGX:
12428 return reloc_type == 6; /* R_TILEGX_32_PCREL. */
12429 case EM_TILEPRO:
12430 return reloc_type == 4; /* R_TILEPRO_32_PCREL. */
12431 case EM_VISIUM:
12432 return reloc_type == 6; /* R_VISIUM_32_PCREL */
12433 case EM_X86_64:
12434 case EM_L1OM:
12435 case EM_K1OM:
12436 return reloc_type == 2; /* R_X86_64_PC32. */
12437 case EM_XTENSA_OLD:
12438 case EM_XTENSA:
12439 return reloc_type == 14; /* R_XTENSA_32_PCREL. */
12440 default:
12441 /* Do not abort or issue an error message here. Not all targets use
12442 pc-relative 32-bit relocs in their DWARF debug information and we
12443 have already tested for target coverage in is_32bit_abs_reloc. A
12444 more helpful warning message will be generated by apply_relocations
12445 anyway, so just return. */
12446 return FALSE;
12447 }
12448 }
12449
12450 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12451 a 64-bit absolute RELA relocation used in DWARF debug sections. */
12452
12453 static bfd_boolean
12454 is_64bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12455 {
12456 switch (filedata->file_header.e_machine)
12457 {
12458 case EM_AARCH64:
12459 return reloc_type == 257; /* R_AARCH64_ABS64. */
12460 case EM_ALPHA:
12461 return reloc_type == 2; /* R_ALPHA_REFQUAD. */
12462 case EM_IA_64:
12463 return (reloc_type == 0x26 /* R_IA64_DIR64MSB. */
12464 || reloc_type == 0x27 /* R_IA64_DIR64LSB. */);
12465 case EM_PARISC:
12466 return reloc_type == 80; /* R_PARISC_DIR64. */
12467 case EM_PPC64:
12468 return reloc_type == 38; /* R_PPC64_ADDR64. */
12469 case EM_RISCV:
12470 return reloc_type == 2; /* R_RISCV_64. */
12471 case EM_SPARC32PLUS:
12472 case EM_SPARCV9:
12473 case EM_SPARC:
12474 return reloc_type == 32 /* R_SPARC_64. */
12475 || reloc_type == 54; /* R_SPARC_UA64. */
12476 case EM_X86_64:
12477 case EM_L1OM:
12478 case EM_K1OM:
12479 return reloc_type == 1; /* R_X86_64_64. */
12480 case EM_S390_OLD:
12481 case EM_S390:
12482 return reloc_type == 22; /* R_S390_64. */
12483 case EM_TILEGX:
12484 return reloc_type == 1; /* R_TILEGX_64. */
12485 case EM_MIPS:
12486 return reloc_type == 18; /* R_MIPS_64. */
12487 default:
12488 return FALSE;
12489 }
12490 }
12491
12492 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
12493 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
12494
12495 static bfd_boolean
12496 is_64bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
12497 {
12498 switch (filedata->file_header.e_machine)
12499 {
12500 case EM_AARCH64:
12501 return reloc_type == 260; /* R_AARCH64_PREL64. */
12502 case EM_ALPHA:
12503 return reloc_type == 11; /* R_ALPHA_SREL64. */
12504 case EM_IA_64:
12505 return (reloc_type == 0x4e /* R_IA64_PCREL64MSB. */
12506 || reloc_type == 0x4f /* R_IA64_PCREL64LSB. */);
12507 case EM_PARISC:
12508 return reloc_type == 72; /* R_PARISC_PCREL64. */
12509 case EM_PPC64:
12510 return reloc_type == 44; /* R_PPC64_REL64. */
12511 case EM_SPARC32PLUS:
12512 case EM_SPARCV9:
12513 case EM_SPARC:
12514 return reloc_type == 46; /* R_SPARC_DISP64. */
12515 case EM_X86_64:
12516 case EM_L1OM:
12517 case EM_K1OM:
12518 return reloc_type == 24; /* R_X86_64_PC64. */
12519 case EM_S390_OLD:
12520 case EM_S390:
12521 return reloc_type == 23; /* R_S390_PC64. */
12522 case EM_TILEGX:
12523 return reloc_type == 5; /* R_TILEGX_64_PCREL. */
12524 default:
12525 return FALSE;
12526 }
12527 }
12528
12529 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12530 a 24-bit absolute RELA relocation used in DWARF debug sections. */
12531
12532 static bfd_boolean
12533 is_24bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12534 {
12535 switch (filedata->file_header.e_machine)
12536 {
12537 case EM_CYGNUS_MN10200:
12538 case EM_MN10200:
12539 return reloc_type == 4; /* R_MN10200_24. */
12540 case EM_FT32:
12541 return reloc_type == 5; /* R_FT32_20. */
12542 default:
12543 return FALSE;
12544 }
12545 }
12546
12547 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12548 a 16-bit absolute RELA relocation used in DWARF debug sections. */
12549
12550 static bfd_boolean
12551 is_16bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12552 {
12553 /* Please keep this table alpha-sorted for ease of visual lookup. */
12554 switch (filedata->file_header.e_machine)
12555 {
12556 case EM_ARC:
12557 case EM_ARC_COMPACT:
12558 case EM_ARC_COMPACT2:
12559 return reloc_type == 2; /* R_ARC_16. */
12560 case EM_ADAPTEVA_EPIPHANY:
12561 return reloc_type == 5;
12562 case EM_AVR_OLD:
12563 case EM_AVR:
12564 return reloc_type == 4; /* R_AVR_16. */
12565 case EM_CYGNUS_D10V:
12566 case EM_D10V:
12567 return reloc_type == 3; /* R_D10V_16. */
12568 case EM_FT32:
12569 return reloc_type == 2; /* R_FT32_16. */
12570 case EM_H8S:
12571 case EM_H8_300:
12572 case EM_H8_300H:
12573 return reloc_type == R_H8_DIR16;
12574 case EM_IP2K_OLD:
12575 case EM_IP2K:
12576 return reloc_type == 1; /* R_IP2K_16. */
12577 case EM_M32C_OLD:
12578 case EM_M32C:
12579 return reloc_type == 1; /* R_M32C_16 */
12580 case EM_CYGNUS_MN10200:
12581 case EM_MN10200:
12582 return reloc_type == 2; /* R_MN10200_16. */
12583 case EM_CYGNUS_MN10300:
12584 case EM_MN10300:
12585 return reloc_type == 2; /* R_MN10300_16. */
12586 case EM_MSP430:
12587 if (uses_msp430x_relocs (filedata))
12588 return reloc_type == 2; /* R_MSP430_ABS16. */
12589 /* Fall through. */
12590 case EM_MSP430_OLD:
12591 return reloc_type == 5; /* R_MSP430_16_BYTE. */
12592 case EM_NDS32:
12593 return reloc_type == 19; /* R_NDS32_RELA. */
12594 case EM_ALTERA_NIOS2:
12595 return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16. */
12596 case EM_NIOS32:
12597 return reloc_type == 9; /* R_NIOS_16. */
12598 case EM_OR1K:
12599 return reloc_type == 2; /* R_OR1K_16. */
12600 case EM_TI_PRU:
12601 return reloc_type == 8; /* R_PRU_BFD_RELOC_16. */
12602 case EM_TI_C6000:
12603 return reloc_type == 2; /* R_C6000_ABS16. */
12604 case EM_VISIUM:
12605 return reloc_type == 2; /* R_VISIUM_16. */
12606 case EM_XC16X:
12607 case EM_C166:
12608 return reloc_type == 2; /* R_XC16C_ABS_16. */
12609 case EM_XGATE:
12610 return reloc_type == 3; /* R_XGATE_16. */
12611 default:
12612 return FALSE;
12613 }
12614 }
12615
12616 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12617 a 32-bit inplace add RELA relocation used in DWARF debug sections. */
12618
12619 static bfd_boolean
12620 is_32bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12621 {
12622 /* Please keep this table alpha-sorted for ease of visual lookup. */
12623 switch (filedata->file_header.e_machine)
12624 {
12625 case EM_RISCV:
12626 return reloc_type == 35; /* R_RISCV_ADD32. */
12627 default:
12628 return FALSE;
12629 }
12630 }
12631
12632 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12633 a 32-bit inplace sub RELA relocation used in DWARF debug sections. */
12634
12635 static bfd_boolean
12636 is_32bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12637 {
12638 /* Please keep this table alpha-sorted for ease of visual lookup. */
12639 switch (filedata->file_header.e_machine)
12640 {
12641 case EM_RISCV:
12642 return reloc_type == 39; /* R_RISCV_SUB32. */
12643 default:
12644 return FALSE;
12645 }
12646 }
12647
12648 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12649 a 64-bit inplace add RELA relocation used in DWARF debug sections. */
12650
12651 static bfd_boolean
12652 is_64bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12653 {
12654 /* Please keep this table alpha-sorted for ease of visual lookup. */
12655 switch (filedata->file_header.e_machine)
12656 {
12657 case EM_RISCV:
12658 return reloc_type == 36; /* R_RISCV_ADD64. */
12659 default:
12660 return FALSE;
12661 }
12662 }
12663
12664 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12665 a 64-bit inplace sub RELA relocation used in DWARF debug sections. */
12666
12667 static bfd_boolean
12668 is_64bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12669 {
12670 /* Please keep this table alpha-sorted for ease of visual lookup. */
12671 switch (filedata->file_header.e_machine)
12672 {
12673 case EM_RISCV:
12674 return reloc_type == 40; /* R_RISCV_SUB64. */
12675 default:
12676 return FALSE;
12677 }
12678 }
12679
12680 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12681 a 16-bit inplace add RELA relocation used in DWARF debug sections. */
12682
12683 static bfd_boolean
12684 is_16bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12685 {
12686 /* Please keep this table alpha-sorted for ease of visual lookup. */
12687 switch (filedata->file_header.e_machine)
12688 {
12689 case EM_RISCV:
12690 return reloc_type == 34; /* R_RISCV_ADD16. */
12691 default:
12692 return FALSE;
12693 }
12694 }
12695
12696 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12697 a 16-bit inplace sub RELA relocation used in DWARF debug sections. */
12698
12699 static bfd_boolean
12700 is_16bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12701 {
12702 /* Please keep this table alpha-sorted for ease of visual lookup. */
12703 switch (filedata->file_header.e_machine)
12704 {
12705 case EM_RISCV:
12706 return reloc_type == 38; /* R_RISCV_SUB16. */
12707 default:
12708 return FALSE;
12709 }
12710 }
12711
12712 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12713 a 8-bit inplace add RELA relocation used in DWARF debug sections. */
12714
12715 static bfd_boolean
12716 is_8bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12717 {
12718 /* Please keep this table alpha-sorted for ease of visual lookup. */
12719 switch (filedata->file_header.e_machine)
12720 {
12721 case EM_RISCV:
12722 return reloc_type == 33; /* R_RISCV_ADD8. */
12723 default:
12724 return FALSE;
12725 }
12726 }
12727
12728 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12729 a 8-bit inplace sub RELA relocation used in DWARF debug sections. */
12730
12731 static bfd_boolean
12732 is_8bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12733 {
12734 /* Please keep this table alpha-sorted for ease of visual lookup. */
12735 switch (filedata->file_header.e_machine)
12736 {
12737 case EM_RISCV:
12738 return reloc_type == 37; /* R_RISCV_SUB8. */
12739 default:
12740 return FALSE;
12741 }
12742 }
12743
12744 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
12745 relocation entries (possibly formerly used for SHT_GROUP sections). */
12746
12747 static bfd_boolean
12748 is_none_reloc (Filedata * filedata, unsigned int reloc_type)
12749 {
12750 switch (filedata->file_header.e_machine)
12751 {
12752 case EM_386: /* R_386_NONE. */
12753 case EM_68K: /* R_68K_NONE. */
12754 case EM_ADAPTEVA_EPIPHANY:
12755 case EM_ALPHA: /* R_ALPHA_NONE. */
12756 case EM_ALTERA_NIOS2: /* R_NIOS2_NONE. */
12757 case EM_ARC: /* R_ARC_NONE. */
12758 case EM_ARC_COMPACT2: /* R_ARC_NONE. */
12759 case EM_ARC_COMPACT: /* R_ARC_NONE. */
12760 case EM_ARM: /* R_ARM_NONE. */
12761 case EM_C166: /* R_XC16X_NONE. */
12762 case EM_CRIS: /* R_CRIS_NONE. */
12763 case EM_FT32: /* R_FT32_NONE. */
12764 case EM_IA_64: /* R_IA64_NONE. */
12765 case EM_K1OM: /* R_X86_64_NONE. */
12766 case EM_L1OM: /* R_X86_64_NONE. */
12767 case EM_M32R: /* R_M32R_NONE. */
12768 case EM_MIPS: /* R_MIPS_NONE. */
12769 case EM_MN10300: /* R_MN10300_NONE. */
12770 case EM_MOXIE: /* R_MOXIE_NONE. */
12771 case EM_NIOS32: /* R_NIOS_NONE. */
12772 case EM_OR1K: /* R_OR1K_NONE. */
12773 case EM_PARISC: /* R_PARISC_NONE. */
12774 case EM_PPC64: /* R_PPC64_NONE. */
12775 case EM_PPC: /* R_PPC_NONE. */
12776 case EM_RISCV: /* R_RISCV_NONE. */
12777 case EM_S390: /* R_390_NONE. */
12778 case EM_S390_OLD:
12779 case EM_SH: /* R_SH_NONE. */
12780 case EM_SPARC32PLUS:
12781 case EM_SPARC: /* R_SPARC_NONE. */
12782 case EM_SPARCV9:
12783 case EM_TILEGX: /* R_TILEGX_NONE. */
12784 case EM_TILEPRO: /* R_TILEPRO_NONE. */
12785 case EM_TI_C6000:/* R_C6000_NONE. */
12786 case EM_X86_64: /* R_X86_64_NONE. */
12787 case EM_XC16X:
12788 case EM_WEBASSEMBLY: /* R_WASM32_NONE. */
12789 return reloc_type == 0;
12790
12791 case EM_AARCH64:
12792 return reloc_type == 0 || reloc_type == 256;
12793 case EM_AVR_OLD:
12794 case EM_AVR:
12795 return (reloc_type == 0 /* R_AVR_NONE. */
12796 || reloc_type == 30 /* R_AVR_DIFF8. */
12797 || reloc_type == 31 /* R_AVR_DIFF16. */
12798 || reloc_type == 32 /* R_AVR_DIFF32. */);
12799 case EM_METAG:
12800 return reloc_type == 3; /* R_METAG_NONE. */
12801 case EM_NDS32:
12802 return (reloc_type == 0 /* R_XTENSA_NONE. */
12803 || reloc_type == 204 /* R_NDS32_DIFF8. */
12804 || reloc_type == 205 /* R_NDS32_DIFF16. */
12805 || reloc_type == 206 /* R_NDS32_DIFF32. */
12806 || reloc_type == 207 /* R_NDS32_ULEB128. */);
12807 case EM_TI_PRU:
12808 return (reloc_type == 0 /* R_PRU_NONE. */
12809 || reloc_type == 65 /* R_PRU_DIFF8. */
12810 || reloc_type == 66 /* R_PRU_DIFF16. */
12811 || reloc_type == 67 /* R_PRU_DIFF32. */);
12812 case EM_XTENSA_OLD:
12813 case EM_XTENSA:
12814 return (reloc_type == 0 /* R_XTENSA_NONE. */
12815 || reloc_type == 17 /* R_XTENSA_DIFF8. */
12816 || reloc_type == 18 /* R_XTENSA_DIFF16. */
12817 || reloc_type == 19 /* R_XTENSA_DIFF32. */);
12818 }
12819 return FALSE;
12820 }
12821
12822 /* Returns TRUE if there is a relocation against
12823 section NAME at OFFSET bytes. */
12824
12825 bfd_boolean
12826 reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
12827 {
12828 Elf_Internal_Rela * relocs;
12829 Elf_Internal_Rela * rp;
12830
12831 if (dsec == NULL || dsec->reloc_info == NULL)
12832 return FALSE;
12833
12834 relocs = (Elf_Internal_Rela *) dsec->reloc_info;
12835
12836 for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
12837 if (rp->r_offset == offset)
12838 return TRUE;
12839
12840 return FALSE;
12841 }
12842
12843 /* Apply relocations to a section.
12844 Returns TRUE upon success, FALSE otherwise.
12845 If RELOCS_RETURN is non-NULL then it is set to point to the loaded relocs.
12846 It is then the caller's responsibility to free them. NUM_RELOCS_RETURN
12847 will be set to the number of relocs loaded.
12848
12849 Note: So far support has been added only for those relocations
12850 which can be found in debug sections. FIXME: Add support for
12851 more relocations ? */
12852
12853 static bfd_boolean
12854 apply_relocations (Filedata * filedata,
12855 const Elf_Internal_Shdr * section,
12856 unsigned char * start,
12857 bfd_size_type size,
12858 void ** relocs_return,
12859 unsigned long * num_relocs_return)
12860 {
12861 Elf_Internal_Shdr * relsec;
12862 unsigned char * end = start + size;
12863 bfd_boolean res = TRUE;
12864
12865 if (relocs_return != NULL)
12866 {
12867 * (Elf_Internal_Rela **) relocs_return = NULL;
12868 * num_relocs_return = 0;
12869 }
12870
12871 if (filedata->file_header.e_type != ET_REL)
12872 /* No relocs to apply. */
12873 return TRUE;
12874
12875 /* Find the reloc section associated with the section. */
12876 for (relsec = filedata->section_headers;
12877 relsec < filedata->section_headers + filedata->file_header.e_shnum;
12878 ++relsec)
12879 {
12880 bfd_boolean is_rela;
12881 unsigned long num_relocs;
12882 Elf_Internal_Rela * relocs;
12883 Elf_Internal_Rela * rp;
12884 Elf_Internal_Shdr * symsec;
12885 Elf_Internal_Sym * symtab;
12886 unsigned long num_syms;
12887 Elf_Internal_Sym * sym;
12888
12889 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12890 || relsec->sh_info >= filedata->file_header.e_shnum
12891 || filedata->section_headers + relsec->sh_info != section
12892 || relsec->sh_size == 0
12893 || relsec->sh_link >= filedata->file_header.e_shnum)
12894 continue;
12895
12896 is_rela = relsec->sh_type == SHT_RELA;
12897
12898 if (is_rela)
12899 {
12900 if (!slurp_rela_relocs (filedata, relsec->sh_offset,
12901 relsec->sh_size, & relocs, & num_relocs))
12902 return FALSE;
12903 }
12904 else
12905 {
12906 if (!slurp_rel_relocs (filedata, relsec->sh_offset,
12907 relsec->sh_size, & relocs, & num_relocs))
12908 return FALSE;
12909 }
12910
12911 /* SH uses RELA but uses in place value instead of the addend field. */
12912 if (filedata->file_header.e_machine == EM_SH)
12913 is_rela = FALSE;
12914
12915 symsec = filedata->section_headers + relsec->sh_link;
12916 if (symsec->sh_type != SHT_SYMTAB
12917 && symsec->sh_type != SHT_DYNSYM)
12918 return FALSE;
12919 symtab = GET_ELF_SYMBOLS (filedata, symsec, & num_syms);
12920
12921 for (rp = relocs; rp < relocs + num_relocs; ++rp)
12922 {
12923 bfd_vma addend;
12924 unsigned int reloc_type;
12925 unsigned int reloc_size;
12926 bfd_boolean reloc_inplace = FALSE;
12927 bfd_boolean reloc_subtract = FALSE;
12928 unsigned char * rloc;
12929 unsigned long sym_index;
12930
12931 reloc_type = get_reloc_type (filedata, rp->r_info);
12932
12933 if (target_specific_reloc_handling (filedata, rp, start, end, symtab, num_syms))
12934 continue;
12935 else if (is_none_reloc (filedata, reloc_type))
12936 continue;
12937 else if (is_32bit_abs_reloc (filedata, reloc_type)
12938 || is_32bit_pcrel_reloc (filedata, reloc_type))
12939 reloc_size = 4;
12940 else if (is_64bit_abs_reloc (filedata, reloc_type)
12941 || is_64bit_pcrel_reloc (filedata, reloc_type))
12942 reloc_size = 8;
12943 else if (is_24bit_abs_reloc (filedata, reloc_type))
12944 reloc_size = 3;
12945 else if (is_16bit_abs_reloc (filedata, reloc_type))
12946 reloc_size = 2;
12947 else if ((reloc_subtract = is_32bit_inplace_sub_reloc (filedata,
12948 reloc_type))
12949 || is_32bit_inplace_add_reloc (filedata, reloc_type))
12950 {
12951 reloc_size = 4;
12952 reloc_inplace = TRUE;
12953 }
12954 else if ((reloc_subtract = is_64bit_inplace_sub_reloc (filedata,
12955 reloc_type))
12956 || is_64bit_inplace_add_reloc (filedata, reloc_type))
12957 {
12958 reloc_size = 8;
12959 reloc_inplace = TRUE;
12960 }
12961 else if ((reloc_subtract = is_16bit_inplace_sub_reloc (filedata,
12962 reloc_type))
12963 || is_16bit_inplace_add_reloc (filedata, reloc_type))
12964 {
12965 reloc_size = 2;
12966 reloc_inplace = TRUE;
12967 }
12968 else if ((reloc_subtract = is_8bit_inplace_sub_reloc (filedata,
12969 reloc_type))
12970 || is_8bit_inplace_add_reloc (filedata, reloc_type))
12971 {
12972 reloc_size = 1;
12973 reloc_inplace = TRUE;
12974 }
12975 else
12976 {
12977 static unsigned int prev_reloc = 0;
12978
12979 if (reloc_type != prev_reloc)
12980 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
12981 reloc_type, printable_section_name (filedata, section));
12982 prev_reloc = reloc_type;
12983 res = FALSE;
12984 continue;
12985 }
12986
12987 rloc = start + rp->r_offset;
12988 if ((rloc + reloc_size) > end || (rloc < start))
12989 {
12990 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
12991 (unsigned long) rp->r_offset,
12992 printable_section_name (filedata, section));
12993 res = FALSE;
12994 continue;
12995 }
12996
12997 sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
12998 if (sym_index >= num_syms)
12999 {
13000 warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
13001 sym_index, printable_section_name (filedata, section));
13002 res = FALSE;
13003 continue;
13004 }
13005 sym = symtab + sym_index;
13006
13007 /* If the reloc has a symbol associated with it,
13008 make sure that it is of an appropriate type.
13009
13010 Relocations against symbols without type can happen.
13011 Gcc -feliminate-dwarf2-dups may generate symbols
13012 without type for debug info.
13013
13014 Icc generates relocations against function symbols
13015 instead of local labels.
13016
13017 Relocations against object symbols can happen, eg when
13018 referencing a global array. For an example of this see
13019 the _clz.o binary in libgcc.a. */
13020 if (sym != symtab
13021 && ELF_ST_TYPE (sym->st_info) != STT_COMMON
13022 && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
13023 {
13024 warn (_("skipping unexpected symbol type %s in section %s relocation %ld\n"),
13025 get_symbol_type (filedata, ELF_ST_TYPE (sym->st_info)),
13026 printable_section_name (filedata, relsec),
13027 (long int)(rp - relocs));
13028 res = FALSE;
13029 continue;
13030 }
13031
13032 addend = 0;
13033 if (is_rela)
13034 addend += rp->r_addend;
13035 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
13036 partial_inplace. */
13037 if (!is_rela
13038 || (filedata->file_header.e_machine == EM_XTENSA
13039 && reloc_type == 1)
13040 || ((filedata->file_header.e_machine == EM_PJ
13041 || filedata->file_header.e_machine == EM_PJ_OLD)
13042 && reloc_type == 1)
13043 || ((filedata->file_header.e_machine == EM_D30V
13044 || filedata->file_header.e_machine == EM_CYGNUS_D30V)
13045 && reloc_type == 12)
13046 || reloc_inplace)
13047 addend += byte_get (rloc, reloc_size);
13048
13049 if (is_32bit_pcrel_reloc (filedata, reloc_type)
13050 || is_64bit_pcrel_reloc (filedata, reloc_type))
13051 {
13052 /* On HPPA, all pc-relative relocations are biased by 8. */
13053 if (filedata->file_header.e_machine == EM_PARISC)
13054 addend -= 8;
13055 byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
13056 reloc_size);
13057 }
13058 else if (reloc_subtract)
13059 byte_put (rloc, addend - sym->st_value, reloc_size);
13060 else
13061 byte_put (rloc, addend + sym->st_value, reloc_size);
13062 }
13063
13064 free (symtab);
13065 /* Let the target specific reloc processing code know that
13066 we have finished with these relocs. */
13067 target_specific_reloc_handling (filedata, NULL, NULL, NULL, NULL, 0);
13068
13069 if (relocs_return)
13070 {
13071 * (Elf_Internal_Rela **) relocs_return = relocs;
13072 * num_relocs_return = num_relocs;
13073 }
13074 else
13075 free (relocs);
13076
13077 break;
13078 }
13079
13080 return res;
13081 }
13082
13083 #ifdef SUPPORT_DISASSEMBLY
13084 static bfd_boolean
13085 disassemble_section (Elf_Internal_Shdr * section, Filedata * filedata)
13086 {
13087 printf (_("\nAssembly dump of section %s\n"), printable_section_name (filedata, section));
13088
13089 /* FIXME: XXX -- to be done --- XXX */
13090
13091 return TRUE;
13092 }
13093 #endif
13094
13095 /* Reads in the contents of SECTION from FILE, returning a pointer
13096 to a malloc'ed buffer or NULL if something went wrong. */
13097
13098 static char *
13099 get_section_contents (Elf_Internal_Shdr * section, Filedata * filedata)
13100 {
13101 bfd_size_type num_bytes = section->sh_size;
13102
13103 if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
13104 {
13105 printf (_("Section '%s' has no data to dump.\n"),
13106 printable_section_name (filedata, section));
13107 return NULL;
13108 }
13109
13110 return (char *) get_data (NULL, filedata, section->sh_offset, 1, num_bytes,
13111 _("section contents"));
13112 }
13113
13114 /* Uncompresses a section that was compressed using zlib, in place. */
13115
13116 static bfd_boolean
13117 uncompress_section_contents (unsigned char ** buffer,
13118 dwarf_size_type uncompressed_size,
13119 dwarf_size_type * size)
13120 {
13121 dwarf_size_type compressed_size = *size;
13122 unsigned char * compressed_buffer = *buffer;
13123 unsigned char * uncompressed_buffer;
13124 z_stream strm;
13125 int rc;
13126
13127 /* It is possible the section consists of several compressed
13128 buffers concatenated together, so we uncompress in a loop. */
13129 /* PR 18313: The state field in the z_stream structure is supposed
13130 to be invisible to the user (ie us), but some compilers will
13131 still complain about it being used without initialisation. So
13132 we first zero the entire z_stream structure and then set the fields
13133 that we need. */
13134 memset (& strm, 0, sizeof strm);
13135 strm.avail_in = compressed_size;
13136 strm.next_in = (Bytef *) compressed_buffer;
13137 strm.avail_out = uncompressed_size;
13138 uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
13139
13140 rc = inflateInit (& strm);
13141 while (strm.avail_in > 0)
13142 {
13143 if (rc != Z_OK)
13144 goto fail;
13145 strm.next_out = ((Bytef *) uncompressed_buffer
13146 + (uncompressed_size - strm.avail_out));
13147 rc = inflate (&strm, Z_FINISH);
13148 if (rc != Z_STREAM_END)
13149 goto fail;
13150 rc = inflateReset (& strm);
13151 }
13152 rc = inflateEnd (& strm);
13153 if (rc != Z_OK
13154 || strm.avail_out != 0)
13155 goto fail;
13156
13157 *buffer = uncompressed_buffer;
13158 *size = uncompressed_size;
13159 return TRUE;
13160
13161 fail:
13162 free (uncompressed_buffer);
13163 /* Indicate decompression failure. */
13164 *buffer = NULL;
13165 return FALSE;
13166 }
13167
13168 static bfd_boolean
13169 dump_section_as_strings (Elf_Internal_Shdr * section, Filedata * filedata)
13170 {
13171 Elf_Internal_Shdr * relsec;
13172 bfd_size_type num_bytes;
13173 unsigned char * data;
13174 unsigned char * end;
13175 unsigned char * real_start;
13176 unsigned char * start;
13177 bfd_boolean some_strings_shown;
13178
13179 real_start = start = (unsigned char *) get_section_contents (section, filedata);
13180 if (start == NULL)
13181 /* PR 21820: Do not fail if the section was empty. */
13182 return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
13183
13184 num_bytes = section->sh_size;
13185
13186 printf (_("\nString dump of section '%s':\n"), printable_section_name (filedata, section));
13187
13188 if (decompress_dumps)
13189 {
13190 dwarf_size_type new_size = num_bytes;
13191 dwarf_size_type uncompressed_size = 0;
13192
13193 if ((section->sh_flags & SHF_COMPRESSED) != 0)
13194 {
13195 Elf_Internal_Chdr chdr;
13196 unsigned int compression_header_size
13197 = get_compression_header (& chdr, (unsigned char *) start,
13198 num_bytes);
13199
13200 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13201 {
13202 warn (_("section '%s' has unsupported compress type: %d\n"),
13203 printable_section_name (filedata, section), chdr.ch_type);
13204 return FALSE;
13205 }
13206 else if (chdr.ch_addralign != section->sh_addralign)
13207 {
13208 warn (_("compressed section '%s' is corrupted\n"),
13209 printable_section_name (filedata, section));
13210 return FALSE;
13211 }
13212 uncompressed_size = chdr.ch_size;
13213 start += compression_header_size;
13214 new_size -= compression_header_size;
13215 }
13216 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
13217 {
13218 /* Read the zlib header. In this case, it should be "ZLIB"
13219 followed by the uncompressed section size, 8 bytes in
13220 big-endian order. */
13221 uncompressed_size = start[4]; uncompressed_size <<= 8;
13222 uncompressed_size += start[5]; uncompressed_size <<= 8;
13223 uncompressed_size += start[6]; uncompressed_size <<= 8;
13224 uncompressed_size += start[7]; uncompressed_size <<= 8;
13225 uncompressed_size += start[8]; uncompressed_size <<= 8;
13226 uncompressed_size += start[9]; uncompressed_size <<= 8;
13227 uncompressed_size += start[10]; uncompressed_size <<= 8;
13228 uncompressed_size += start[11];
13229 start += 12;
13230 new_size -= 12;
13231 }
13232
13233 if (uncompressed_size)
13234 {
13235 if (uncompress_section_contents (& start,
13236 uncompressed_size, & new_size))
13237 num_bytes = new_size;
13238 else
13239 {
13240 error (_("Unable to decompress section %s\n"),
13241 printable_section_name (filedata, section));
13242 return FALSE;
13243 }
13244 }
13245 else
13246 start = real_start;
13247 }
13248
13249 /* If the section being dumped has relocations against it the user might
13250 be expecting these relocations to have been applied. Check for this
13251 case and issue a warning message in order to avoid confusion.
13252 FIXME: Maybe we ought to have an option that dumps a section with
13253 relocs applied ? */
13254 for (relsec = filedata->section_headers;
13255 relsec < filedata->section_headers + filedata->file_header.e_shnum;
13256 ++relsec)
13257 {
13258 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13259 || relsec->sh_info >= filedata->file_header.e_shnum
13260 || filedata->section_headers + relsec->sh_info != section
13261 || relsec->sh_size == 0
13262 || relsec->sh_link >= filedata->file_header.e_shnum)
13263 continue;
13264
13265 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
13266 break;
13267 }
13268
13269 data = start;
13270 end = start + num_bytes;
13271 some_strings_shown = FALSE;
13272
13273 while (data < end)
13274 {
13275 while (!ISPRINT (* data))
13276 if (++ data >= end)
13277 break;
13278
13279 if (data < end)
13280 {
13281 size_t maxlen = end - data;
13282
13283 #ifndef __MSVCRT__
13284 /* PR 11128: Use two separate invocations in order to work
13285 around bugs in the Solaris 8 implementation of printf. */
13286 printf (" [%6tx] ", data - start);
13287 #else
13288 printf (" [%6Ix] ", (size_t) (data - start));
13289 #endif
13290 if (maxlen > 0)
13291 {
13292 print_symbol ((int) maxlen, (const char *) data);
13293 putchar ('\n');
13294 data += strnlen ((const char *) data, maxlen);
13295 }
13296 else
13297 {
13298 printf (_("<corrupt>\n"));
13299 data = end;
13300 }
13301 some_strings_shown = TRUE;
13302 }
13303 }
13304
13305 if (! some_strings_shown)
13306 printf (_(" No strings found in this section."));
13307
13308 free (real_start);
13309
13310 putchar ('\n');
13311 return TRUE;
13312 }
13313
13314 static bfd_boolean
13315 dump_section_as_bytes (Elf_Internal_Shdr * section,
13316 Filedata * filedata,
13317 bfd_boolean relocate)
13318 {
13319 Elf_Internal_Shdr * relsec;
13320 bfd_size_type bytes;
13321 bfd_size_type section_size;
13322 bfd_vma addr;
13323 unsigned char * data;
13324 unsigned char * real_start;
13325 unsigned char * start;
13326
13327 real_start = start = (unsigned char *) get_section_contents (section, filedata);
13328 if (start == NULL)
13329 /* PR 21820: Do not fail if the section was empty. */
13330 return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
13331
13332 section_size = section->sh_size;
13333
13334 printf (_("\nHex dump of section '%s':\n"), printable_section_name (filedata, section));
13335
13336 if (decompress_dumps)
13337 {
13338 dwarf_size_type new_size = section_size;
13339 dwarf_size_type uncompressed_size = 0;
13340
13341 if ((section->sh_flags & SHF_COMPRESSED) != 0)
13342 {
13343 Elf_Internal_Chdr chdr;
13344 unsigned int compression_header_size
13345 = get_compression_header (& chdr, start, section_size);
13346
13347 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13348 {
13349 warn (_("section '%s' has unsupported compress type: %d\n"),
13350 printable_section_name (filedata, section), chdr.ch_type);
13351 return FALSE;
13352 }
13353 else if (chdr.ch_addralign != section->sh_addralign)
13354 {
13355 warn (_("compressed section '%s' is corrupted\n"),
13356 printable_section_name (filedata, section));
13357 return FALSE;
13358 }
13359 uncompressed_size = chdr.ch_size;
13360 start += compression_header_size;
13361 new_size -= compression_header_size;
13362 }
13363 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
13364 {
13365 /* Read the zlib header. In this case, it should be "ZLIB"
13366 followed by the uncompressed section size, 8 bytes in
13367 big-endian order. */
13368 uncompressed_size = start[4]; uncompressed_size <<= 8;
13369 uncompressed_size += start[5]; uncompressed_size <<= 8;
13370 uncompressed_size += start[6]; uncompressed_size <<= 8;
13371 uncompressed_size += start[7]; uncompressed_size <<= 8;
13372 uncompressed_size += start[8]; uncompressed_size <<= 8;
13373 uncompressed_size += start[9]; uncompressed_size <<= 8;
13374 uncompressed_size += start[10]; uncompressed_size <<= 8;
13375 uncompressed_size += start[11];
13376 start += 12;
13377 new_size -= 12;
13378 }
13379
13380 if (uncompressed_size)
13381 {
13382 if (uncompress_section_contents (& start, uncompressed_size,
13383 & new_size))
13384 {
13385 section_size = new_size;
13386 }
13387 else
13388 {
13389 error (_("Unable to decompress section %s\n"),
13390 printable_section_name (filedata, section));
13391 /* FIXME: Print the section anyway ? */
13392 return FALSE;
13393 }
13394 }
13395 else
13396 start = real_start;
13397 }
13398
13399 if (relocate)
13400 {
13401 if (! apply_relocations (filedata, section, start, section_size, NULL, NULL))
13402 return FALSE;
13403 }
13404 else
13405 {
13406 /* If the section being dumped has relocations against it the user might
13407 be expecting these relocations to have been applied. Check for this
13408 case and issue a warning message in order to avoid confusion.
13409 FIXME: Maybe we ought to have an option that dumps a section with
13410 relocs applied ? */
13411 for (relsec = filedata->section_headers;
13412 relsec < filedata->section_headers + filedata->file_header.e_shnum;
13413 ++relsec)
13414 {
13415 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13416 || relsec->sh_info >= filedata->file_header.e_shnum
13417 || filedata->section_headers + relsec->sh_info != section
13418 || relsec->sh_size == 0
13419 || relsec->sh_link >= filedata->file_header.e_shnum)
13420 continue;
13421
13422 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
13423 break;
13424 }
13425 }
13426
13427 addr = section->sh_addr;
13428 bytes = section_size;
13429 data = start;
13430
13431 while (bytes)
13432 {
13433 int j;
13434 int k;
13435 int lbytes;
13436
13437 lbytes = (bytes > 16 ? 16 : bytes);
13438
13439 printf (" 0x%8.8lx ", (unsigned long) addr);
13440
13441 for (j = 0; j < 16; j++)
13442 {
13443 if (j < lbytes)
13444 printf ("%2.2x", data[j]);
13445 else
13446 printf (" ");
13447
13448 if ((j & 3) == 3)
13449 printf (" ");
13450 }
13451
13452 for (j = 0; j < lbytes; j++)
13453 {
13454 k = data[j];
13455 if (k >= ' ' && k < 0x7f)
13456 printf ("%c", k);
13457 else
13458 printf (".");
13459 }
13460
13461 putchar ('\n');
13462
13463 data += lbytes;
13464 addr += lbytes;
13465 bytes -= lbytes;
13466 }
13467
13468 free (real_start);
13469
13470 putchar ('\n');
13471 return TRUE;
13472 }
13473
13474 static bfd_boolean
13475 load_specific_debug_section (enum dwarf_section_display_enum debug,
13476 const Elf_Internal_Shdr * sec,
13477 void * data)
13478 {
13479 struct dwarf_section * section = &debug_displays [debug].section;
13480 char buf [64];
13481 Filedata * filedata = (Filedata *) data;
13482
13483 if (section->start != NULL)
13484 {
13485 /* If it is already loaded, do nothing. */
13486 if (streq (section->filename, filedata->file_name))
13487 return TRUE;
13488 free (section->start);
13489 }
13490
13491 snprintf (buf, sizeof (buf), _("%s section data"), section->name);
13492 section->address = sec->sh_addr;
13493 section->user_data = NULL;
13494 section->filename = filedata->file_name;
13495 section->start = (unsigned char *) get_data (NULL, filedata,
13496 sec->sh_offset, 1,
13497 sec->sh_size, buf);
13498 if (section->start == NULL)
13499 section->size = 0;
13500 else
13501 {
13502 unsigned char *start = section->start;
13503 dwarf_size_type size = sec->sh_size;
13504 dwarf_size_type uncompressed_size = 0;
13505
13506 if ((sec->sh_flags & SHF_COMPRESSED) != 0)
13507 {
13508 Elf_Internal_Chdr chdr;
13509 unsigned int compression_header_size;
13510
13511 if (size < (is_32bit_elf
13512 ? sizeof (Elf32_External_Chdr)
13513 : sizeof (Elf64_External_Chdr)))
13514 {
13515 warn (_("compressed section %s is too small to contain a compression header"),
13516 section->name);
13517 return FALSE;
13518 }
13519
13520 compression_header_size = get_compression_header (&chdr, start, size);
13521
13522 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13523 {
13524 warn (_("section '%s' has unsupported compress type: %d\n"),
13525 section->name, chdr.ch_type);
13526 return FALSE;
13527 }
13528 else if (chdr.ch_addralign != sec->sh_addralign)
13529 {
13530 warn (_("compressed section '%s' is corrupted\n"),
13531 section->name);
13532 return FALSE;
13533 }
13534 uncompressed_size = chdr.ch_size;
13535 start += compression_header_size;
13536 size -= compression_header_size;
13537 }
13538 else if (size > 12 && streq ((char *) start, "ZLIB"))
13539 {
13540 /* Read the zlib header. In this case, it should be "ZLIB"
13541 followed by the uncompressed section size, 8 bytes in
13542 big-endian order. */
13543 uncompressed_size = start[4]; uncompressed_size <<= 8;
13544 uncompressed_size += start[5]; uncompressed_size <<= 8;
13545 uncompressed_size += start[6]; uncompressed_size <<= 8;
13546 uncompressed_size += start[7]; uncompressed_size <<= 8;
13547 uncompressed_size += start[8]; uncompressed_size <<= 8;
13548 uncompressed_size += start[9]; uncompressed_size <<= 8;
13549 uncompressed_size += start[10]; uncompressed_size <<= 8;
13550 uncompressed_size += start[11];
13551 start += 12;
13552 size -= 12;
13553 }
13554
13555 if (uncompressed_size)
13556 {
13557 if (uncompress_section_contents (&start, uncompressed_size,
13558 &size))
13559 {
13560 /* Free the compressed buffer, update the section buffer
13561 and the section size if uncompress is successful. */
13562 free (section->start);
13563 section->start = start;
13564 }
13565 else
13566 {
13567 error (_("Unable to decompress section %s\n"),
13568 printable_section_name (filedata, sec));
13569 return FALSE;
13570 }
13571 }
13572
13573 section->size = size;
13574 }
13575
13576 if (section->start == NULL)
13577 return FALSE;
13578
13579 if (debug_displays [debug].relocate)
13580 {
13581 if (! apply_relocations (filedata, sec, section->start, section->size,
13582 & section->reloc_info, & section->num_relocs))
13583 return FALSE;
13584 }
13585 else
13586 {
13587 section->reloc_info = NULL;
13588 section->num_relocs = 0;
13589 }
13590
13591 return TRUE;
13592 }
13593
13594 /* If this is not NULL, load_debug_section will only look for sections
13595 within the list of sections given here. */
13596 static unsigned int * section_subset = NULL;
13597
13598 bfd_boolean
13599 load_debug_section (enum dwarf_section_display_enum debug, void * data)
13600 {
13601 struct dwarf_section * section = &debug_displays [debug].section;
13602 Elf_Internal_Shdr * sec;
13603 Filedata * filedata = (Filedata *) data;
13604
13605 /* Without section headers we cannot find any sections. */
13606 if (filedata->section_headers == NULL)
13607 return FALSE;
13608
13609 if (filedata->string_table == NULL
13610 && filedata->file_header.e_shstrndx != SHN_UNDEF
13611 && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
13612 {
13613 Elf_Internal_Shdr * strs;
13614
13615 /* Read in the string table, so that we have section names to scan. */
13616 strs = filedata->section_headers + filedata->file_header.e_shstrndx;
13617
13618 if (strs != NULL && strs->sh_size != 0)
13619 {
13620 filedata->string_table
13621 = (char *) get_data (NULL, filedata, strs->sh_offset,
13622 1, strs->sh_size, _("string table"));
13623
13624 filedata->string_table_length
13625 = filedata->string_table != NULL ? strs->sh_size : 0;
13626 }
13627 }
13628
13629 /* Locate the debug section. */
13630 sec = find_section_in_set (filedata, section->uncompressed_name, section_subset);
13631 if (sec != NULL)
13632 section->name = section->uncompressed_name;
13633 else
13634 {
13635 sec = find_section_in_set (filedata, section->compressed_name, section_subset);
13636 if (sec != NULL)
13637 section->name = section->compressed_name;
13638 }
13639 if (sec == NULL)
13640 return FALSE;
13641
13642 /* If we're loading from a subset of sections, and we've loaded
13643 a section matching this name before, it's likely that it's a
13644 different one. */
13645 if (section_subset != NULL)
13646 free_debug_section (debug);
13647
13648 return load_specific_debug_section (debug, sec, data);
13649 }
13650
13651 void
13652 free_debug_section (enum dwarf_section_display_enum debug)
13653 {
13654 struct dwarf_section * section = &debug_displays [debug].section;
13655
13656 if (section->start == NULL)
13657 return;
13658
13659 free ((char *) section->start);
13660 section->start = NULL;
13661 section->address = 0;
13662 section->size = 0;
13663 }
13664
13665 static bfd_boolean
13666 display_debug_section (int shndx, Elf_Internal_Shdr * section, Filedata * filedata)
13667 {
13668 char * name = SECTION_NAME (section);
13669 const char * print_name = printable_section_name (filedata, section);
13670 bfd_size_type length;
13671 bfd_boolean result = TRUE;
13672 int i;
13673
13674 length = section->sh_size;
13675 if (length == 0)
13676 {
13677 printf (_("\nSection '%s' has no debugging data.\n"), print_name);
13678 return TRUE;
13679 }
13680 if (section->sh_type == SHT_NOBITS)
13681 {
13682 /* There is no point in dumping the contents of a debugging section
13683 which has the NOBITS type - the bits in the file will be random.
13684 This can happen when a file containing a .eh_frame section is
13685 stripped with the --only-keep-debug command line option. */
13686 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
13687 print_name);
13688 return FALSE;
13689 }
13690
13691 if (const_strneq (name, ".gnu.linkonce.wi."))
13692 name = ".debug_info";
13693
13694 /* See if we know how to display the contents of this section. */
13695 for (i = 0; i < max; i++)
13696 {
13697 enum dwarf_section_display_enum id = (enum dwarf_section_display_enum) i;
13698 struct dwarf_section_display * display = debug_displays + i;
13699 struct dwarf_section * sec = & display->section;
13700
13701 if (streq (sec->uncompressed_name, name)
13702 || (id == line && const_strneq (name, ".debug_line."))
13703 || streq (sec->compressed_name, name))
13704 {
13705 bfd_boolean secondary = (section != find_section (filedata, name));
13706
13707 if (secondary)
13708 free_debug_section (id);
13709
13710 if (i == line && const_strneq (name, ".debug_line."))
13711 sec->name = name;
13712 else if (streq (sec->uncompressed_name, name))
13713 sec->name = sec->uncompressed_name;
13714 else
13715 sec->name = sec->compressed_name;
13716
13717 if (load_specific_debug_section (id, section, filedata))
13718 {
13719 /* If this debug section is part of a CU/TU set in a .dwp file,
13720 restrict load_debug_section to the sections in that set. */
13721 section_subset = find_cu_tu_set (filedata, shndx);
13722
13723 result &= display->display (sec, filedata);
13724
13725 section_subset = NULL;
13726
13727 if (secondary || (id != info && id != abbrev))
13728 free_debug_section (id);
13729 }
13730 break;
13731 }
13732 }
13733
13734 if (i == max)
13735 {
13736 printf (_("Unrecognized debug section: %s\n"), print_name);
13737 result = FALSE;
13738 }
13739
13740 return result;
13741 }
13742
13743 /* Set DUMP_SECTS for all sections where dumps were requested
13744 based on section name. */
13745
13746 static void
13747 initialise_dumps_byname (Filedata * filedata)
13748 {
13749 struct dump_list_entry * cur;
13750
13751 for (cur = dump_sects_byname; cur; cur = cur->next)
13752 {
13753 unsigned int i;
13754 bfd_boolean any = FALSE;
13755
13756 for (i = 0; i < filedata->file_header.e_shnum; i++)
13757 if (streq (SECTION_NAME (filedata->section_headers + i), cur->name))
13758 {
13759 request_dump_bynumber (filedata, i, cur->type);
13760 any = TRUE;
13761 }
13762
13763 if (!any)
13764 warn (_("Section '%s' was not dumped because it does not exist!\n"),
13765 cur->name);
13766 }
13767 }
13768
13769 static bfd_boolean
13770 process_section_contents (Filedata * filedata)
13771 {
13772 Elf_Internal_Shdr * section;
13773 unsigned int i;
13774 bfd_boolean res = TRUE;
13775
13776 if (! do_dump)
13777 return TRUE;
13778
13779 initialise_dumps_byname (filedata);
13780
13781 for (i = 0, section = filedata->section_headers;
13782 i < filedata->file_header.e_shnum && i < filedata->num_dump_sects;
13783 i++, section++)
13784 {
13785 dump_type dump = filedata->dump_sects[i];
13786
13787 #ifdef SUPPORT_DISASSEMBLY
13788 if (dump & DISASS_DUMP)
13789 {
13790 if (! disassemble_section (section, filedata))
13791 res = FALSE;
13792 }
13793 #endif
13794 if (dump & HEX_DUMP)
13795 {
13796 if (! dump_section_as_bytes (section, filedata, FALSE))
13797 res = FALSE;
13798 }
13799
13800 if (dump & RELOC_DUMP)
13801 {
13802 if (! dump_section_as_bytes (section, filedata, TRUE))
13803 res = FALSE;
13804 }
13805
13806 if (dump & STRING_DUMP)
13807 {
13808 if (! dump_section_as_strings (section, filedata))
13809 res = FALSE;
13810 }
13811
13812 if (dump & DEBUG_DUMP)
13813 {
13814 if (! display_debug_section (i, section, filedata))
13815 res = FALSE;
13816 }
13817 }
13818
13819 /* Check to see if the user requested a
13820 dump of a section that does not exist. */
13821 while (i < filedata->num_dump_sects)
13822 {
13823 if (filedata->dump_sects[i])
13824 {
13825 warn (_("Section %d was not dumped because it does not exist!\n"), i);
13826 res = FALSE;
13827 }
13828 i++;
13829 }
13830
13831 return res;
13832 }
13833
13834 static void
13835 process_mips_fpe_exception (int mask)
13836 {
13837 if (mask)
13838 {
13839 bfd_boolean first = TRUE;
13840
13841 if (mask & OEX_FPU_INEX)
13842 fputs ("INEX", stdout), first = FALSE;
13843 if (mask & OEX_FPU_UFLO)
13844 printf ("%sUFLO", first ? "" : "|"), first = FALSE;
13845 if (mask & OEX_FPU_OFLO)
13846 printf ("%sOFLO", first ? "" : "|"), first = FALSE;
13847 if (mask & OEX_FPU_DIV0)
13848 printf ("%sDIV0", first ? "" : "|"), first = FALSE;
13849 if (mask & OEX_FPU_INVAL)
13850 printf ("%sINVAL", first ? "" : "|");
13851 }
13852 else
13853 fputs ("0", stdout);
13854 }
13855
13856 /* Display's the value of TAG at location P. If TAG is
13857 greater than 0 it is assumed to be an unknown tag, and
13858 a message is printed to this effect. Otherwise it is
13859 assumed that a message has already been printed.
13860
13861 If the bottom bit of TAG is set it assumed to have a
13862 string value, otherwise it is assumed to have an integer
13863 value.
13864
13865 Returns an updated P pointing to the first unread byte
13866 beyond the end of TAG's value.
13867
13868 Reads at or beyond END will not be made. */
13869
13870 static unsigned char *
13871 display_tag_value (signed int tag,
13872 unsigned char * p,
13873 const unsigned char * const end)
13874 {
13875 unsigned long val;
13876
13877 if (tag > 0)
13878 printf (" Tag_unknown_%d: ", tag);
13879
13880 if (p >= end)
13881 {
13882 warn (_("<corrupt tag>\n"));
13883 }
13884 else if (tag & 1)
13885 {
13886 /* PR 17531 file: 027-19978-0.004. */
13887 size_t maxlen = (end - p) - 1;
13888
13889 putchar ('"');
13890 if (maxlen > 0)
13891 {
13892 print_symbol ((int) maxlen, (const char *) p);
13893 p += strnlen ((char *) p, maxlen) + 1;
13894 }
13895 else
13896 {
13897 printf (_("<corrupt string tag>"));
13898 p = (unsigned char *) end;
13899 }
13900 printf ("\"\n");
13901 }
13902 else
13903 {
13904 unsigned int len;
13905
13906 val = read_uleb128 (p, &len, end);
13907 p += len;
13908 printf ("%ld (0x%lx)\n", val, val);
13909 }
13910
13911 assert (p <= end);
13912 return p;
13913 }
13914
13915 /* ARC ABI attributes section. */
13916
13917 static unsigned char *
13918 display_arc_attribute (unsigned char * p,
13919 const unsigned char * const end)
13920 {
13921 unsigned int tag;
13922 unsigned int len;
13923 unsigned int val;
13924
13925 tag = read_uleb128 (p, &len, end);
13926 p += len;
13927
13928 switch (tag)
13929 {
13930 case Tag_ARC_PCS_config:
13931 val = read_uleb128 (p, &len, end);
13932 p += len;
13933 printf (" Tag_ARC_PCS_config: ");
13934 switch (val)
13935 {
13936 case 0:
13937 printf (_("Absent/Non standard\n"));
13938 break;
13939 case 1:
13940 printf (_("Bare metal/mwdt\n"));
13941 break;
13942 case 2:
13943 printf (_("Bare metal/newlib\n"));
13944 break;
13945 case 3:
13946 printf (_("Linux/uclibc\n"));
13947 break;
13948 case 4:
13949 printf (_("Linux/glibc\n"));
13950 break;
13951 default:
13952 printf (_("Unknown\n"));
13953 break;
13954 }
13955 break;
13956
13957 case Tag_ARC_CPU_base:
13958 val = read_uleb128 (p, &len, end);
13959 p += len;
13960 printf (" Tag_ARC_CPU_base: ");
13961 switch (val)
13962 {
13963 default:
13964 case TAG_CPU_NONE:
13965 printf (_("Absent\n"));
13966 break;
13967 case TAG_CPU_ARC6xx:
13968 printf ("ARC6xx\n");
13969 break;
13970 case TAG_CPU_ARC7xx:
13971 printf ("ARC7xx\n");
13972 break;
13973 case TAG_CPU_ARCEM:
13974 printf ("ARCEM\n");
13975 break;
13976 case TAG_CPU_ARCHS:
13977 printf ("ARCHS\n");
13978 break;
13979 }
13980 break;
13981
13982 case Tag_ARC_CPU_variation:
13983 val = read_uleb128 (p, &len, end);
13984 p += len;
13985 printf (" Tag_ARC_CPU_variation: ");
13986 switch (val)
13987 {
13988 default:
13989 if (val > 0 && val < 16)
13990 printf ("Core%d\n", val);
13991 else
13992 printf ("Unknown\n");
13993 break;
13994
13995 case 0:
13996 printf (_("Absent\n"));
13997 break;
13998 }
13999 break;
14000
14001 case Tag_ARC_CPU_name:
14002 printf (" Tag_ARC_CPU_name: ");
14003 p = display_tag_value (-1, p, end);
14004 break;
14005
14006 case Tag_ARC_ABI_rf16:
14007 val = read_uleb128 (p, &len, end);
14008 p += len;
14009 printf (" Tag_ARC_ABI_rf16: %s\n", val ? _("yes") : _("no"));
14010 break;
14011
14012 case Tag_ARC_ABI_osver:
14013 val = read_uleb128 (p, &len, end);
14014 p += len;
14015 printf (" Tag_ARC_ABI_osver: v%d\n", val);
14016 break;
14017
14018 case Tag_ARC_ABI_pic:
14019 case Tag_ARC_ABI_sda:
14020 val = read_uleb128 (p, &len, end);
14021 p += len;
14022 printf (tag == Tag_ARC_ABI_sda ? " Tag_ARC_ABI_sda: "
14023 : " Tag_ARC_ABI_pic: ");
14024 switch (val)
14025 {
14026 case 0:
14027 printf (_("Absent\n"));
14028 break;
14029 case 1:
14030 printf ("MWDT\n");
14031 break;
14032 case 2:
14033 printf ("GNU\n");
14034 break;
14035 default:
14036 printf (_("Unknown\n"));
14037 break;
14038 }
14039 break;
14040
14041 case Tag_ARC_ABI_tls:
14042 val = read_uleb128 (p, &len, end);
14043 p += len;
14044 printf (" Tag_ARC_ABI_tls: %s\n", val ? "r25": "none");
14045 break;
14046
14047 case Tag_ARC_ABI_enumsize:
14048 val = read_uleb128 (p, &len, end);
14049 p += len;
14050 printf (" Tag_ARC_ABI_enumsize: %s\n", val ? _("default") :
14051 _("smallest"));
14052 break;
14053
14054 case Tag_ARC_ABI_exceptions:
14055 val = read_uleb128 (p, &len, end);
14056 p += len;
14057 printf (" Tag_ARC_ABI_exceptions: %s\n", val ? _("OPTFP")
14058 : _("default"));
14059 break;
14060
14061 case Tag_ARC_ABI_double_size:
14062 val = read_uleb128 (p, &len, end);
14063 p += len;
14064 printf (" Tag_ARC_ABI_double_size: %d\n", val);
14065 break;
14066
14067 case Tag_ARC_ISA_config:
14068 printf (" Tag_ARC_ISA_config: ");
14069 p = display_tag_value (-1, p, end);
14070 break;
14071
14072 case Tag_ARC_ISA_apex:
14073 printf (" Tag_ARC_ISA_apex: ");
14074 p = display_tag_value (-1, p, end);
14075 break;
14076
14077 case Tag_ARC_ISA_mpy_option:
14078 val = read_uleb128 (p, &len, end);
14079 p += len;
14080 printf (" Tag_ARC_ISA_mpy_option: %d\n", val);
14081 break;
14082
14083 default:
14084 return display_tag_value (tag & 1, p, end);
14085 }
14086
14087 return p;
14088 }
14089
14090 /* ARM EABI attributes section. */
14091 typedef struct
14092 {
14093 unsigned int tag;
14094 const char * name;
14095 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
14096 unsigned int type;
14097 const char ** table;
14098 } arm_attr_public_tag;
14099
14100 static const char * arm_attr_tag_CPU_arch[] =
14101 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
14102 "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "v8-R", "v8-M.baseline",
14103 "v8-M.mainline"};
14104 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
14105 static const char * arm_attr_tag_THUMB_ISA_use[] =
14106 {"No", "Thumb-1", "Thumb-2", "Yes"};
14107 static const char * arm_attr_tag_FP_arch[] =
14108 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
14109 "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
14110 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
14111 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
14112 {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
14113 "NEON for ARMv8.1"};
14114 static const char * arm_attr_tag_PCS_config[] =
14115 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
14116 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
14117 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
14118 {"V6", "SB", "TLS", "Unused"};
14119 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
14120 {"Absolute", "PC-relative", "SB-relative", "None"};
14121 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
14122 {"Absolute", "PC-relative", "None"};
14123 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
14124 {"None", "direct", "GOT-indirect"};
14125 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
14126 {"None", "??? 1", "2", "??? 3", "4"};
14127 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
14128 static const char * arm_attr_tag_ABI_FP_denormal[] =
14129 {"Unused", "Needed", "Sign only"};
14130 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
14131 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
14132 static const char * arm_attr_tag_ABI_FP_number_model[] =
14133 {"Unused", "Finite", "RTABI", "IEEE 754"};
14134 static const char * arm_attr_tag_ABI_enum_size[] =
14135 {"Unused", "small", "int", "forced to int"};
14136 static const char * arm_attr_tag_ABI_HardFP_use[] =
14137 {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
14138 static const char * arm_attr_tag_ABI_VFP_args[] =
14139 {"AAPCS", "VFP registers", "custom", "compatible"};
14140 static const char * arm_attr_tag_ABI_WMMX_args[] =
14141 {"AAPCS", "WMMX registers", "custom"};
14142 static const char * arm_attr_tag_ABI_optimization_goals[] =
14143 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14144 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
14145 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
14146 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14147 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
14148 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
14149 static const char * arm_attr_tag_FP_HP_extension[] =
14150 {"Not Allowed", "Allowed"};
14151 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
14152 {"None", "IEEE 754", "Alternative Format"};
14153 static const char * arm_attr_tag_DSP_extension[] =
14154 {"Follow architecture", "Allowed"};
14155 static const char * arm_attr_tag_MPextension_use[] =
14156 {"Not Allowed", "Allowed"};
14157 static const char * arm_attr_tag_DIV_use[] =
14158 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
14159 "Allowed in v7-A with integer division extension"};
14160 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
14161 static const char * arm_attr_tag_Virtualization_use[] =
14162 {"Not Allowed", "TrustZone", "Virtualization Extensions",
14163 "TrustZone and Virtualization Extensions"};
14164 static const char * arm_attr_tag_MPextension_use_legacy[] =
14165 {"Not Allowed", "Allowed"};
14166
14167 #define LOOKUP(id, name) \
14168 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
14169 static arm_attr_public_tag arm_attr_public_tags[] =
14170 {
14171 {4, "CPU_raw_name", 1, NULL},
14172 {5, "CPU_name", 1, NULL},
14173 LOOKUP(6, CPU_arch),
14174 {7, "CPU_arch_profile", 0, NULL},
14175 LOOKUP(8, ARM_ISA_use),
14176 LOOKUP(9, THUMB_ISA_use),
14177 LOOKUP(10, FP_arch),
14178 LOOKUP(11, WMMX_arch),
14179 LOOKUP(12, Advanced_SIMD_arch),
14180 LOOKUP(13, PCS_config),
14181 LOOKUP(14, ABI_PCS_R9_use),
14182 LOOKUP(15, ABI_PCS_RW_data),
14183 LOOKUP(16, ABI_PCS_RO_data),
14184 LOOKUP(17, ABI_PCS_GOT_use),
14185 LOOKUP(18, ABI_PCS_wchar_t),
14186 LOOKUP(19, ABI_FP_rounding),
14187 LOOKUP(20, ABI_FP_denormal),
14188 LOOKUP(21, ABI_FP_exceptions),
14189 LOOKUP(22, ABI_FP_user_exceptions),
14190 LOOKUP(23, ABI_FP_number_model),
14191 {24, "ABI_align_needed", 0, NULL},
14192 {25, "ABI_align_preserved", 0, NULL},
14193 LOOKUP(26, ABI_enum_size),
14194 LOOKUP(27, ABI_HardFP_use),
14195 LOOKUP(28, ABI_VFP_args),
14196 LOOKUP(29, ABI_WMMX_args),
14197 LOOKUP(30, ABI_optimization_goals),
14198 LOOKUP(31, ABI_FP_optimization_goals),
14199 {32, "compatibility", 0, NULL},
14200 LOOKUP(34, CPU_unaligned_access),
14201 LOOKUP(36, FP_HP_extension),
14202 LOOKUP(38, ABI_FP_16bit_format),
14203 LOOKUP(42, MPextension_use),
14204 LOOKUP(44, DIV_use),
14205 LOOKUP(46, DSP_extension),
14206 {64, "nodefaults", 0, NULL},
14207 {65, "also_compatible_with", 0, NULL},
14208 LOOKUP(66, T2EE_use),
14209 {67, "conformance", 1, NULL},
14210 LOOKUP(68, Virtualization_use),
14211 LOOKUP(70, MPextension_use_legacy)
14212 };
14213 #undef LOOKUP
14214
14215 static unsigned char *
14216 display_arm_attribute (unsigned char * p,
14217 const unsigned char * const end)
14218 {
14219 unsigned int tag;
14220 unsigned int len;
14221 unsigned int val;
14222 arm_attr_public_tag * attr;
14223 unsigned i;
14224 unsigned int type;
14225
14226 tag = read_uleb128 (p, &len, end);
14227 p += len;
14228 attr = NULL;
14229 for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
14230 {
14231 if (arm_attr_public_tags[i].tag == tag)
14232 {
14233 attr = &arm_attr_public_tags[i];
14234 break;
14235 }
14236 }
14237
14238 if (attr)
14239 {
14240 printf (" Tag_%s: ", attr->name);
14241 switch (attr->type)
14242 {
14243 case 0:
14244 switch (tag)
14245 {
14246 case 7: /* Tag_CPU_arch_profile. */
14247 val = read_uleb128 (p, &len, end);
14248 p += len;
14249 switch (val)
14250 {
14251 case 0: printf (_("None\n")); break;
14252 case 'A': printf (_("Application\n")); break;
14253 case 'R': printf (_("Realtime\n")); break;
14254 case 'M': printf (_("Microcontroller\n")); break;
14255 case 'S': printf (_("Application or Realtime\n")); break;
14256 default: printf ("??? (%d)\n", val); break;
14257 }
14258 break;
14259
14260 case 24: /* Tag_align_needed. */
14261 val = read_uleb128 (p, &len, end);
14262 p += len;
14263 switch (val)
14264 {
14265 case 0: printf (_("None\n")); break;
14266 case 1: printf (_("8-byte\n")); break;
14267 case 2: printf (_("4-byte\n")); break;
14268 case 3: printf ("??? 3\n"); break;
14269 default:
14270 if (val <= 12)
14271 printf (_("8-byte and up to %d-byte extended\n"),
14272 1 << val);
14273 else
14274 printf ("??? (%d)\n", val);
14275 break;
14276 }
14277 break;
14278
14279 case 25: /* Tag_align_preserved. */
14280 val = read_uleb128 (p, &len, end);
14281 p += len;
14282 switch (val)
14283 {
14284 case 0: printf (_("None\n")); break;
14285 case 1: printf (_("8-byte, except leaf SP\n")); break;
14286 case 2: printf (_("8-byte\n")); break;
14287 case 3: printf ("??? 3\n"); break;
14288 default:
14289 if (val <= 12)
14290 printf (_("8-byte and up to %d-byte extended\n"),
14291 1 << val);
14292 else
14293 printf ("??? (%d)\n", val);
14294 break;
14295 }
14296 break;
14297
14298 case 32: /* Tag_compatibility. */
14299 {
14300 val = read_uleb128 (p, &len, end);
14301 p += len;
14302 printf (_("flag = %d, vendor = "), val);
14303 if (p < end - 1)
14304 {
14305 size_t maxlen = (end - p) - 1;
14306
14307 print_symbol ((int) maxlen, (const char *) p);
14308 p += strnlen ((char *) p, maxlen) + 1;
14309 }
14310 else
14311 {
14312 printf (_("<corrupt>"));
14313 p = (unsigned char *) end;
14314 }
14315 putchar ('\n');
14316 }
14317 break;
14318
14319 case 64: /* Tag_nodefaults. */
14320 /* PR 17531: file: 001-505008-0.01. */
14321 if (p < end)
14322 p++;
14323 printf (_("True\n"));
14324 break;
14325
14326 case 65: /* Tag_also_compatible_with. */
14327 val = read_uleb128 (p, &len, end);
14328 p += len;
14329 if (val == 6 /* Tag_CPU_arch. */)
14330 {
14331 val = read_uleb128 (p, &len, end);
14332 p += len;
14333 if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
14334 printf ("??? (%d)\n", val);
14335 else
14336 printf ("%s\n", arm_attr_tag_CPU_arch[val]);
14337 }
14338 else
14339 printf ("???\n");
14340 while (p < end && *(p++) != '\0' /* NUL terminator. */)
14341 ;
14342 break;
14343
14344 default:
14345 printf (_("<unknown: %d>\n"), tag);
14346 break;
14347 }
14348 return p;
14349
14350 case 1:
14351 return display_tag_value (-1, p, end);
14352 case 2:
14353 return display_tag_value (0, p, end);
14354
14355 default:
14356 assert (attr->type & 0x80);
14357 val = read_uleb128 (p, &len, end);
14358 p += len;
14359 type = attr->type & 0x7f;
14360 if (val >= type)
14361 printf ("??? (%d)\n", val);
14362 else
14363 printf ("%s\n", attr->table[val]);
14364 return p;
14365 }
14366 }
14367
14368 return display_tag_value (tag, p, end);
14369 }
14370
14371 static unsigned char *
14372 display_gnu_attribute (unsigned char * p,
14373 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const),
14374 const unsigned char * const end)
14375 {
14376 int tag;
14377 unsigned int len;
14378 unsigned int val;
14379
14380 tag = read_uleb128 (p, &len, end);
14381 p += len;
14382
14383 /* Tag_compatibility is the only generic GNU attribute defined at
14384 present. */
14385 if (tag == 32)
14386 {
14387 val = read_uleb128 (p, &len, end);
14388 p += len;
14389
14390 printf (_("flag = %d, vendor = "), val);
14391 if (p == end)
14392 {
14393 printf (_("<corrupt>\n"));
14394 warn (_("corrupt vendor attribute\n"));
14395 }
14396 else
14397 {
14398 if (p < end - 1)
14399 {
14400 size_t maxlen = (end - p) - 1;
14401
14402 print_symbol ((int) maxlen, (const char *) p);
14403 p += strnlen ((char *) p, maxlen) + 1;
14404 }
14405 else
14406 {
14407 printf (_("<corrupt>"));
14408 p = (unsigned char *) end;
14409 }
14410 putchar ('\n');
14411 }
14412 return p;
14413 }
14414
14415 if ((tag & 2) == 0 && display_proc_gnu_attribute)
14416 return display_proc_gnu_attribute (p, tag, end);
14417
14418 return display_tag_value (tag, p, end);
14419 }
14420
14421 static unsigned char *
14422 display_power_gnu_attribute (unsigned char * p,
14423 unsigned int tag,
14424 const unsigned char * const end)
14425 {
14426 unsigned int len;
14427 unsigned int val;
14428
14429 if (tag == Tag_GNU_Power_ABI_FP)
14430 {
14431 val = read_uleb128 (p, &len, end);
14432 p += len;
14433 printf (" Tag_GNU_Power_ABI_FP: ");
14434 if (len == 0)
14435 {
14436 printf (_("<corrupt>\n"));
14437 return p;
14438 }
14439
14440 if (val > 15)
14441 printf ("(%#x), ", val);
14442
14443 switch (val & 3)
14444 {
14445 case 0:
14446 printf (_("unspecified hard/soft float, "));
14447 break;
14448 case 1:
14449 printf (_("hard float, "));
14450 break;
14451 case 2:
14452 printf (_("soft float, "));
14453 break;
14454 case 3:
14455 printf (_("single-precision hard float, "));
14456 break;
14457 }
14458
14459 switch (val & 0xC)
14460 {
14461 case 0:
14462 printf (_("unspecified long double\n"));
14463 break;
14464 case 4:
14465 printf (_("128-bit IBM long double\n"));
14466 break;
14467 case 8:
14468 printf (_("64-bit long double\n"));
14469 break;
14470 case 12:
14471 printf (_("128-bit IEEE long double\n"));
14472 break;
14473 }
14474 return p;
14475 }
14476
14477 if (tag == Tag_GNU_Power_ABI_Vector)
14478 {
14479 val = read_uleb128 (p, &len, end);
14480 p += len;
14481 printf (" Tag_GNU_Power_ABI_Vector: ");
14482 if (len == 0)
14483 {
14484 printf (_("<corrupt>\n"));
14485 return p;
14486 }
14487
14488 if (val > 3)
14489 printf ("(%#x), ", val);
14490
14491 switch (val & 3)
14492 {
14493 case 0:
14494 printf (_("unspecified\n"));
14495 break;
14496 case 1:
14497 printf (_("generic\n"));
14498 break;
14499 case 2:
14500 printf ("AltiVec\n");
14501 break;
14502 case 3:
14503 printf ("SPE\n");
14504 break;
14505 }
14506 return p;
14507 }
14508
14509 if (tag == Tag_GNU_Power_ABI_Struct_Return)
14510 {
14511 val = read_uleb128 (p, &len, end);
14512 p += len;
14513 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
14514 if (len == 0)
14515 {
14516 printf (_("<corrupt>\n"));
14517 return p;
14518 }
14519
14520 if (val > 2)
14521 printf ("(%#x), ", val);
14522
14523 switch (val & 3)
14524 {
14525 case 0:
14526 printf (_("unspecified\n"));
14527 break;
14528 case 1:
14529 printf ("r3/r4\n");
14530 break;
14531 case 2:
14532 printf (_("memory\n"));
14533 break;
14534 case 3:
14535 printf ("???\n");
14536 break;
14537 }
14538 return p;
14539 }
14540
14541 return display_tag_value (tag & 1, p, end);
14542 }
14543
14544 static unsigned char *
14545 display_s390_gnu_attribute (unsigned char * p,
14546 unsigned int tag,
14547 const unsigned char * const end)
14548 {
14549 unsigned int len;
14550 int val;
14551
14552 if (tag == Tag_GNU_S390_ABI_Vector)
14553 {
14554 val = read_uleb128 (p, &len, end);
14555 p += len;
14556 printf (" Tag_GNU_S390_ABI_Vector: ");
14557
14558 switch (val)
14559 {
14560 case 0:
14561 printf (_("any\n"));
14562 break;
14563 case 1:
14564 printf (_("software\n"));
14565 break;
14566 case 2:
14567 printf (_("hardware\n"));
14568 break;
14569 default:
14570 printf ("??? (%d)\n", val);
14571 break;
14572 }
14573 return p;
14574 }
14575
14576 return display_tag_value (tag & 1, p, end);
14577 }
14578
14579 static void
14580 display_sparc_hwcaps (unsigned int mask)
14581 {
14582 if (mask)
14583 {
14584 bfd_boolean first = TRUE;
14585
14586 if (mask & ELF_SPARC_HWCAP_MUL32)
14587 fputs ("mul32", stdout), first = FALSE;
14588 if (mask & ELF_SPARC_HWCAP_DIV32)
14589 printf ("%sdiv32", first ? "" : "|"), first = FALSE;
14590 if (mask & ELF_SPARC_HWCAP_FSMULD)
14591 printf ("%sfsmuld", first ? "" : "|"), first = FALSE;
14592 if (mask & ELF_SPARC_HWCAP_V8PLUS)
14593 printf ("%sv8plus", first ? "" : "|"), first = FALSE;
14594 if (mask & ELF_SPARC_HWCAP_POPC)
14595 printf ("%spopc", first ? "" : "|"), first = FALSE;
14596 if (mask & ELF_SPARC_HWCAP_VIS)
14597 printf ("%svis", first ? "" : "|"), first = FALSE;
14598 if (mask & ELF_SPARC_HWCAP_VIS2)
14599 printf ("%svis2", first ? "" : "|"), first = FALSE;
14600 if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
14601 printf ("%sASIBlkInit", first ? "" : "|"), first = FALSE;
14602 if (mask & ELF_SPARC_HWCAP_FMAF)
14603 printf ("%sfmaf", first ? "" : "|"), first = FALSE;
14604 if (mask & ELF_SPARC_HWCAP_VIS3)
14605 printf ("%svis3", first ? "" : "|"), first = FALSE;
14606 if (mask & ELF_SPARC_HWCAP_HPC)
14607 printf ("%shpc", first ? "" : "|"), first = FALSE;
14608 if (mask & ELF_SPARC_HWCAP_RANDOM)
14609 printf ("%srandom", first ? "" : "|"), first = FALSE;
14610 if (mask & ELF_SPARC_HWCAP_TRANS)
14611 printf ("%strans", first ? "" : "|"), first = FALSE;
14612 if (mask & ELF_SPARC_HWCAP_FJFMAU)
14613 printf ("%sfjfmau", first ? "" : "|"), first = FALSE;
14614 if (mask & ELF_SPARC_HWCAP_IMA)
14615 printf ("%sima", first ? "" : "|"), first = FALSE;
14616 if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
14617 printf ("%scspare", first ? "" : "|"), first = FALSE;
14618 }
14619 else
14620 fputc ('0', stdout);
14621 fputc ('\n', stdout);
14622 }
14623
14624 static void
14625 display_sparc_hwcaps2 (unsigned int mask)
14626 {
14627 if (mask)
14628 {
14629 bfd_boolean first = TRUE;
14630
14631 if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
14632 fputs ("fjathplus", stdout), first = FALSE;
14633 if (mask & ELF_SPARC_HWCAP2_VIS3B)
14634 printf ("%svis3b", first ? "" : "|"), first = FALSE;
14635 if (mask & ELF_SPARC_HWCAP2_ADP)
14636 printf ("%sadp", first ? "" : "|"), first = FALSE;
14637 if (mask & ELF_SPARC_HWCAP2_SPARC5)
14638 printf ("%ssparc5", first ? "" : "|"), first = FALSE;
14639 if (mask & ELF_SPARC_HWCAP2_MWAIT)
14640 printf ("%smwait", first ? "" : "|"), first = FALSE;
14641 if (mask & ELF_SPARC_HWCAP2_XMPMUL)
14642 printf ("%sxmpmul", first ? "" : "|"), first = FALSE;
14643 if (mask & ELF_SPARC_HWCAP2_XMONT)
14644 printf ("%sxmont2", first ? "" : "|"), first = FALSE;
14645 if (mask & ELF_SPARC_HWCAP2_NSEC)
14646 printf ("%snsec", first ? "" : "|"), first = FALSE;
14647 if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
14648 printf ("%sfjathhpc", first ? "" : "|"), first = FALSE;
14649 if (mask & ELF_SPARC_HWCAP2_FJDES)
14650 printf ("%sfjdes", first ? "" : "|"), first = FALSE;
14651 if (mask & ELF_SPARC_HWCAP2_FJAES)
14652 printf ("%sfjaes", first ? "" : "|"), first = FALSE;
14653 }
14654 else
14655 fputc ('0', stdout);
14656 fputc ('\n', stdout);
14657 }
14658
14659 static unsigned char *
14660 display_sparc_gnu_attribute (unsigned char * p,
14661 unsigned int tag,
14662 const unsigned char * const end)
14663 {
14664 unsigned int len;
14665 int val;
14666
14667 if (tag == Tag_GNU_Sparc_HWCAPS)
14668 {
14669 val = read_uleb128 (p, &len, end);
14670 p += len;
14671 printf (" Tag_GNU_Sparc_HWCAPS: ");
14672 display_sparc_hwcaps (val);
14673 return p;
14674 }
14675 if (tag == Tag_GNU_Sparc_HWCAPS2)
14676 {
14677 val = read_uleb128 (p, &len, end);
14678 p += len;
14679 printf (" Tag_GNU_Sparc_HWCAPS2: ");
14680 display_sparc_hwcaps2 (val);
14681 return p;
14682 }
14683
14684 return display_tag_value (tag, p, end);
14685 }
14686
14687 static void
14688 print_mips_fp_abi_value (unsigned int val)
14689 {
14690 switch (val)
14691 {
14692 case Val_GNU_MIPS_ABI_FP_ANY:
14693 printf (_("Hard or soft float\n"));
14694 break;
14695 case Val_GNU_MIPS_ABI_FP_DOUBLE:
14696 printf (_("Hard float (double precision)\n"));
14697 break;
14698 case Val_GNU_MIPS_ABI_FP_SINGLE:
14699 printf (_("Hard float (single precision)\n"));
14700 break;
14701 case Val_GNU_MIPS_ABI_FP_SOFT:
14702 printf (_("Soft float\n"));
14703 break;
14704 case Val_GNU_MIPS_ABI_FP_OLD_64:
14705 printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
14706 break;
14707 case Val_GNU_MIPS_ABI_FP_XX:
14708 printf (_("Hard float (32-bit CPU, Any FPU)\n"));
14709 break;
14710 case Val_GNU_MIPS_ABI_FP_64:
14711 printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
14712 break;
14713 case Val_GNU_MIPS_ABI_FP_64A:
14714 printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
14715 break;
14716 case Val_GNU_MIPS_ABI_FP_NAN2008:
14717 printf (_("NaN 2008 compatibility\n"));
14718 break;
14719 default:
14720 printf ("??? (%d)\n", val);
14721 break;
14722 }
14723 }
14724
14725 static unsigned char *
14726 display_mips_gnu_attribute (unsigned char * p,
14727 unsigned int tag,
14728 const unsigned char * const end)
14729 {
14730 if (tag == Tag_GNU_MIPS_ABI_FP)
14731 {
14732 unsigned int len;
14733 unsigned int val;
14734
14735 val = read_uleb128 (p, &len, end);
14736 p += len;
14737 printf (" Tag_GNU_MIPS_ABI_FP: ");
14738
14739 print_mips_fp_abi_value (val);
14740
14741 return p;
14742 }
14743
14744 if (tag == Tag_GNU_MIPS_ABI_MSA)
14745 {
14746 unsigned int len;
14747 unsigned int val;
14748
14749 val = read_uleb128 (p, &len, end);
14750 p += len;
14751 printf (" Tag_GNU_MIPS_ABI_MSA: ");
14752
14753 switch (val)
14754 {
14755 case Val_GNU_MIPS_ABI_MSA_ANY:
14756 printf (_("Any MSA or not\n"));
14757 break;
14758 case Val_GNU_MIPS_ABI_MSA_128:
14759 printf (_("128-bit MSA\n"));
14760 break;
14761 default:
14762 printf ("??? (%d)\n", val);
14763 break;
14764 }
14765 return p;
14766 }
14767
14768 return display_tag_value (tag & 1, p, end);
14769 }
14770
14771 static unsigned char *
14772 display_tic6x_attribute (unsigned char * p,
14773 const unsigned char * const end)
14774 {
14775 unsigned int tag;
14776 unsigned int len;
14777 int val;
14778
14779 tag = read_uleb128 (p, &len, end);
14780 p += len;
14781
14782 switch (tag)
14783 {
14784 case Tag_ISA:
14785 val = read_uleb128 (p, &len, end);
14786 p += len;
14787 printf (" Tag_ISA: ");
14788
14789 switch (val)
14790 {
14791 case C6XABI_Tag_ISA_none:
14792 printf (_("None\n"));
14793 break;
14794 case C6XABI_Tag_ISA_C62X:
14795 printf ("C62x\n");
14796 break;
14797 case C6XABI_Tag_ISA_C67X:
14798 printf ("C67x\n");
14799 break;
14800 case C6XABI_Tag_ISA_C67XP:
14801 printf ("C67x+\n");
14802 break;
14803 case C6XABI_Tag_ISA_C64X:
14804 printf ("C64x\n");
14805 break;
14806 case C6XABI_Tag_ISA_C64XP:
14807 printf ("C64x+\n");
14808 break;
14809 case C6XABI_Tag_ISA_C674X:
14810 printf ("C674x\n");
14811 break;
14812 default:
14813 printf ("??? (%d)\n", val);
14814 break;
14815 }
14816 return p;
14817
14818 case Tag_ABI_wchar_t:
14819 val = read_uleb128 (p, &len, end);
14820 p += len;
14821 printf (" Tag_ABI_wchar_t: ");
14822 switch (val)
14823 {
14824 case 0:
14825 printf (_("Not used\n"));
14826 break;
14827 case 1:
14828 printf (_("2 bytes\n"));
14829 break;
14830 case 2:
14831 printf (_("4 bytes\n"));
14832 break;
14833 default:
14834 printf ("??? (%d)\n", val);
14835 break;
14836 }
14837 return p;
14838
14839 case Tag_ABI_stack_align_needed:
14840 val = read_uleb128 (p, &len, end);
14841 p += len;
14842 printf (" Tag_ABI_stack_align_needed: ");
14843 switch (val)
14844 {
14845 case 0:
14846 printf (_("8-byte\n"));
14847 break;
14848 case 1:
14849 printf (_("16-byte\n"));
14850 break;
14851 default:
14852 printf ("??? (%d)\n", val);
14853 break;
14854 }
14855 return p;
14856
14857 case Tag_ABI_stack_align_preserved:
14858 val = read_uleb128 (p, &len, end);
14859 p += len;
14860 printf (" Tag_ABI_stack_align_preserved: ");
14861 switch (val)
14862 {
14863 case 0:
14864 printf (_("8-byte\n"));
14865 break;
14866 case 1:
14867 printf (_("16-byte\n"));
14868 break;
14869 default:
14870 printf ("??? (%d)\n", val);
14871 break;
14872 }
14873 return p;
14874
14875 case Tag_ABI_DSBT:
14876 val = read_uleb128 (p, &len, end);
14877 p += len;
14878 printf (" Tag_ABI_DSBT: ");
14879 switch (val)
14880 {
14881 case 0:
14882 printf (_("DSBT addressing not used\n"));
14883 break;
14884 case 1:
14885 printf (_("DSBT addressing used\n"));
14886 break;
14887 default:
14888 printf ("??? (%d)\n", val);
14889 break;
14890 }
14891 return p;
14892
14893 case Tag_ABI_PID:
14894 val = read_uleb128 (p, &len, end);
14895 p += len;
14896 printf (" Tag_ABI_PID: ");
14897 switch (val)
14898 {
14899 case 0:
14900 printf (_("Data addressing position-dependent\n"));
14901 break;
14902 case 1:
14903 printf (_("Data addressing position-independent, GOT near DP\n"));
14904 break;
14905 case 2:
14906 printf (_("Data addressing position-independent, GOT far from DP\n"));
14907 break;
14908 default:
14909 printf ("??? (%d)\n", val);
14910 break;
14911 }
14912 return p;
14913
14914 case Tag_ABI_PIC:
14915 val = read_uleb128 (p, &len, end);
14916 p += len;
14917 printf (" Tag_ABI_PIC: ");
14918 switch (val)
14919 {
14920 case 0:
14921 printf (_("Code addressing position-dependent\n"));
14922 break;
14923 case 1:
14924 printf (_("Code addressing position-independent\n"));
14925 break;
14926 default:
14927 printf ("??? (%d)\n", val);
14928 break;
14929 }
14930 return p;
14931
14932 case Tag_ABI_array_object_alignment:
14933 val = read_uleb128 (p, &len, end);
14934 p += len;
14935 printf (" Tag_ABI_array_object_alignment: ");
14936 switch (val)
14937 {
14938 case 0:
14939 printf (_("8-byte\n"));
14940 break;
14941 case 1:
14942 printf (_("4-byte\n"));
14943 break;
14944 case 2:
14945 printf (_("16-byte\n"));
14946 break;
14947 default:
14948 printf ("??? (%d)\n", val);
14949 break;
14950 }
14951 return p;
14952
14953 case Tag_ABI_array_object_align_expected:
14954 val = read_uleb128 (p, &len, end);
14955 p += len;
14956 printf (" Tag_ABI_array_object_align_expected: ");
14957 switch (val)
14958 {
14959 case 0:
14960 printf (_("8-byte\n"));
14961 break;
14962 case 1:
14963 printf (_("4-byte\n"));
14964 break;
14965 case 2:
14966 printf (_("16-byte\n"));
14967 break;
14968 default:
14969 printf ("??? (%d)\n", val);
14970 break;
14971 }
14972 return p;
14973
14974 case Tag_ABI_compatibility:
14975 {
14976 val = read_uleb128 (p, &len, end);
14977 p += len;
14978 printf (" Tag_ABI_compatibility: ");
14979 printf (_("flag = %d, vendor = "), val);
14980 if (p < end - 1)
14981 {
14982 size_t maxlen = (end - p) - 1;
14983
14984 print_symbol ((int) maxlen, (const char *) p);
14985 p += strnlen ((char *) p, maxlen) + 1;
14986 }
14987 else
14988 {
14989 printf (_("<corrupt>"));
14990 p = (unsigned char *) end;
14991 }
14992 putchar ('\n');
14993 return p;
14994 }
14995
14996 case Tag_ABI_conformance:
14997 {
14998 printf (" Tag_ABI_conformance: \"");
14999 if (p < end - 1)
15000 {
15001 size_t maxlen = (end - p) - 1;
15002
15003 print_symbol ((int) maxlen, (const char *) p);
15004 p += strnlen ((char *) p, maxlen) + 1;
15005 }
15006 else
15007 {
15008 printf (_("<corrupt>"));
15009 p = (unsigned char *) end;
15010 }
15011 printf ("\"\n");
15012 return p;
15013 }
15014 }
15015
15016 return display_tag_value (tag, p, end);
15017 }
15018
15019 static void
15020 display_raw_attribute (unsigned char * p, unsigned char const * const end)
15021 {
15022 unsigned long addr = 0;
15023 size_t bytes = end - p;
15024
15025 assert (end > p);
15026 while (bytes)
15027 {
15028 int j;
15029 int k;
15030 int lbytes = (bytes > 16 ? 16 : bytes);
15031
15032 printf (" 0x%8.8lx ", addr);
15033
15034 for (j = 0; j < 16; j++)
15035 {
15036 if (j < lbytes)
15037 printf ("%2.2x", p[j]);
15038 else
15039 printf (" ");
15040
15041 if ((j & 3) == 3)
15042 printf (" ");
15043 }
15044
15045 for (j = 0; j < lbytes; j++)
15046 {
15047 k = p[j];
15048 if (k >= ' ' && k < 0x7f)
15049 printf ("%c", k);
15050 else
15051 printf (".");
15052 }
15053
15054 putchar ('\n');
15055
15056 p += lbytes;
15057 bytes -= lbytes;
15058 addr += lbytes;
15059 }
15060
15061 putchar ('\n');
15062 }
15063
15064 static unsigned char *
15065 display_msp430x_attribute (unsigned char * p,
15066 const unsigned char * const end)
15067 {
15068 unsigned int len;
15069 unsigned int val;
15070 unsigned int tag;
15071
15072 tag = read_uleb128 (p, & len, end);
15073 p += len;
15074
15075 switch (tag)
15076 {
15077 case OFBA_MSPABI_Tag_ISA:
15078 val = read_uleb128 (p, &len, end);
15079 p += len;
15080 printf (" Tag_ISA: ");
15081 switch (val)
15082 {
15083 case 0: printf (_("None\n")); break;
15084 case 1: printf (_("MSP430\n")); break;
15085 case 2: printf (_("MSP430X\n")); break;
15086 default: printf ("??? (%d)\n", val); break;
15087 }
15088 break;
15089
15090 case OFBA_MSPABI_Tag_Code_Model:
15091 val = read_uleb128 (p, &len, end);
15092 p += len;
15093 printf (" Tag_Code_Model: ");
15094 switch (val)
15095 {
15096 case 0: printf (_("None\n")); break;
15097 case 1: printf (_("Small\n")); break;
15098 case 2: printf (_("Large\n")); break;
15099 default: printf ("??? (%d)\n", val); break;
15100 }
15101 break;
15102
15103 case OFBA_MSPABI_Tag_Data_Model:
15104 val = read_uleb128 (p, &len, end);
15105 p += len;
15106 printf (" Tag_Data_Model: ");
15107 switch (val)
15108 {
15109 case 0: printf (_("None\n")); break;
15110 case 1: printf (_("Small\n")); break;
15111 case 2: printf (_("Large\n")); break;
15112 case 3: printf (_("Restricted Large\n")); break;
15113 default: printf ("??? (%d)\n", val); break;
15114 }
15115 break;
15116
15117 default:
15118 printf (_(" <unknown tag %d>: "), tag);
15119
15120 if (tag & 1)
15121 {
15122 putchar ('"');
15123 if (p < end - 1)
15124 {
15125 size_t maxlen = (end - p) - 1;
15126
15127 print_symbol ((int) maxlen, (const char *) p);
15128 p += strnlen ((char *) p, maxlen) + 1;
15129 }
15130 else
15131 {
15132 printf (_("<corrupt>"));
15133 p = (unsigned char *) end;
15134 }
15135 printf ("\"\n");
15136 }
15137 else
15138 {
15139 val = read_uleb128 (p, &len, end);
15140 p += len;
15141 printf ("%d (0x%x)\n", val, val);
15142 }
15143 break;
15144 }
15145
15146 assert (p <= end);
15147 return p;
15148 }
15149
15150 static bfd_boolean
15151 process_attributes (Filedata * filedata,
15152 const char * public_name,
15153 unsigned int proc_type,
15154 unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
15155 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const))
15156 {
15157 Elf_Internal_Shdr * sect;
15158 unsigned i;
15159 bfd_boolean res = TRUE;
15160
15161 /* Find the section header so that we get the size. */
15162 for (i = 0, sect = filedata->section_headers;
15163 i < filedata->file_header.e_shnum;
15164 i++, sect++)
15165 {
15166 unsigned char * contents;
15167 unsigned char * p;
15168
15169 if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
15170 continue;
15171
15172 contents = (unsigned char *) get_data (NULL, filedata, sect->sh_offset, 1,
15173 sect->sh_size, _("attributes"));
15174 if (contents == NULL)
15175 {
15176 res = FALSE;
15177 continue;
15178 }
15179
15180 p = contents;
15181 /* The first character is the version of the attributes.
15182 Currently only version 1, (aka 'A') is recognised here. */
15183 if (*p != 'A')
15184 {
15185 printf (_("Unknown attributes version '%c'(%d) - expecting 'A'\n"), *p, *p);
15186 res = FALSE;
15187 }
15188 else
15189 {
15190 bfd_vma section_len;
15191
15192 section_len = sect->sh_size - 1;
15193 p++;
15194
15195 while (section_len > 0)
15196 {
15197 bfd_vma attr_len;
15198 unsigned int namelen;
15199 bfd_boolean public_section;
15200 bfd_boolean gnu_section;
15201
15202 if (section_len <= 4)
15203 {
15204 error (_("Tag section ends prematurely\n"));
15205 res = FALSE;
15206 break;
15207 }
15208 attr_len = byte_get (p, 4);
15209 p += 4;
15210
15211 if (attr_len > section_len)
15212 {
15213 error (_("Bad attribute length (%u > %u)\n"),
15214 (unsigned) attr_len, (unsigned) section_len);
15215 attr_len = section_len;
15216 res = FALSE;
15217 }
15218 /* PR 17531: file: 001-101425-0.004 */
15219 else if (attr_len < 5)
15220 {
15221 error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
15222 res = FALSE;
15223 break;
15224 }
15225
15226 section_len -= attr_len;
15227 attr_len -= 4;
15228
15229 namelen = strnlen ((char *) p, attr_len) + 1;
15230 if (namelen == 0 || namelen >= attr_len)
15231 {
15232 error (_("Corrupt attribute section name\n"));
15233 res = FALSE;
15234 break;
15235 }
15236
15237 printf (_("Attribute Section: "));
15238 print_symbol (INT_MAX, (const char *) p);
15239 putchar ('\n');
15240
15241 if (public_name && streq ((char *) p, public_name))
15242 public_section = TRUE;
15243 else
15244 public_section = FALSE;
15245
15246 if (streq ((char *) p, "gnu"))
15247 gnu_section = TRUE;
15248 else
15249 gnu_section = FALSE;
15250
15251 p += namelen;
15252 attr_len -= namelen;
15253
15254 while (attr_len > 0 && p < contents + sect->sh_size)
15255 {
15256 int tag;
15257 int val;
15258 bfd_vma size;
15259 unsigned char * end;
15260
15261 /* PR binutils/17531: Safe handling of corrupt files. */
15262 if (attr_len < 6)
15263 {
15264 error (_("Unused bytes at end of section\n"));
15265 res = FALSE;
15266 section_len = 0;
15267 break;
15268 }
15269
15270 tag = *(p++);
15271 size = byte_get (p, 4);
15272 if (size > attr_len)
15273 {
15274 error (_("Bad subsection length (%u > %u)\n"),
15275 (unsigned) size, (unsigned) attr_len);
15276 res = FALSE;
15277 size = attr_len;
15278 }
15279 /* PR binutils/17531: Safe handling of corrupt files. */
15280 if (size < 6)
15281 {
15282 error (_("Bad subsection length (%u < 6)\n"),
15283 (unsigned) size);
15284 res = FALSE;
15285 section_len = 0;
15286 break;
15287 }
15288
15289 attr_len -= size;
15290 end = p + size - 1;
15291 assert (end <= contents + sect->sh_size);
15292 p += 4;
15293
15294 switch (tag)
15295 {
15296 case 1:
15297 printf (_("File Attributes\n"));
15298 break;
15299 case 2:
15300 printf (_("Section Attributes:"));
15301 goto do_numlist;
15302 case 3:
15303 printf (_("Symbol Attributes:"));
15304 /* Fall through. */
15305 do_numlist:
15306 for (;;)
15307 {
15308 unsigned int j;
15309
15310 val = read_uleb128 (p, &j, end);
15311 p += j;
15312 if (val == 0)
15313 break;
15314 printf (" %d", val);
15315 }
15316 printf ("\n");
15317 break;
15318 default:
15319 printf (_("Unknown tag: %d\n"), tag);
15320 public_section = FALSE;
15321 break;
15322 }
15323
15324 if (public_section && display_pub_attribute != NULL)
15325 {
15326 while (p < end)
15327 p = display_pub_attribute (p, end);
15328 assert (p == end);
15329 }
15330 else if (gnu_section && display_proc_gnu_attribute != NULL)
15331 {
15332 while (p < end)
15333 p = display_gnu_attribute (p,
15334 display_proc_gnu_attribute,
15335 end);
15336 assert (p == end);
15337 }
15338 else if (p < end)
15339 {
15340 printf (_(" Unknown attribute:\n"));
15341 display_raw_attribute (p, end);
15342 p = end;
15343 }
15344 else
15345 attr_len = 0;
15346 }
15347 }
15348 }
15349
15350 free (contents);
15351 }
15352
15353 return res;
15354 }
15355
15356 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
15357 Print the Address, Access and Initial fields of an entry at VMA ADDR
15358 and return the VMA of the next entry, or -1 if there was a problem.
15359 Does not read from DATA_END or beyond. */
15360
15361 static bfd_vma
15362 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
15363 unsigned char * data_end)
15364 {
15365 printf (" ");
15366 print_vma (addr, LONG_HEX);
15367 printf (" ");
15368 if (addr < pltgot + 0xfff0)
15369 printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
15370 else
15371 printf ("%10s", "");
15372 printf (" ");
15373 if (data == NULL)
15374 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
15375 else
15376 {
15377 bfd_vma entry;
15378 unsigned char * from = data + addr - pltgot;
15379
15380 if (from + (is_32bit_elf ? 4 : 8) > data_end)
15381 {
15382 warn (_("MIPS GOT entry extends beyond the end of available data\n"));
15383 printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
15384 return (bfd_vma) -1;
15385 }
15386 else
15387 {
15388 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
15389 print_vma (entry, LONG_HEX);
15390 }
15391 }
15392 return addr + (is_32bit_elf ? 4 : 8);
15393 }
15394
15395 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
15396 PLTGOT. Print the Address and Initial fields of an entry at VMA
15397 ADDR and return the VMA of the next entry. */
15398
15399 static bfd_vma
15400 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
15401 {
15402 printf (" ");
15403 print_vma (addr, LONG_HEX);
15404 printf (" ");
15405 if (data == NULL)
15406 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
15407 else
15408 {
15409 bfd_vma entry;
15410
15411 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
15412 print_vma (entry, LONG_HEX);
15413 }
15414 return addr + (is_32bit_elf ? 4 : 8);
15415 }
15416
15417 static void
15418 print_mips_ases (unsigned int mask)
15419 {
15420 if (mask & AFL_ASE_DSP)
15421 fputs ("\n\tDSP ASE", stdout);
15422 if (mask & AFL_ASE_DSPR2)
15423 fputs ("\n\tDSP R2 ASE", stdout);
15424 if (mask & AFL_ASE_DSPR3)
15425 fputs ("\n\tDSP R3 ASE", stdout);
15426 if (mask & AFL_ASE_EVA)
15427 fputs ("\n\tEnhanced VA Scheme", stdout);
15428 if (mask & AFL_ASE_MCU)
15429 fputs ("\n\tMCU (MicroController) ASE", stdout);
15430 if (mask & AFL_ASE_MDMX)
15431 fputs ("\n\tMDMX ASE", stdout);
15432 if (mask & AFL_ASE_MIPS3D)
15433 fputs ("\n\tMIPS-3D ASE", stdout);
15434 if (mask & AFL_ASE_MT)
15435 fputs ("\n\tMT ASE", stdout);
15436 if (mask & AFL_ASE_SMARTMIPS)
15437 fputs ("\n\tSmartMIPS ASE", stdout);
15438 if (mask & AFL_ASE_VIRT)
15439 fputs ("\n\tVZ ASE", stdout);
15440 if (mask & AFL_ASE_MSA)
15441 fputs ("\n\tMSA ASE", stdout);
15442 if (mask & AFL_ASE_MIPS16)
15443 fputs ("\n\tMIPS16 ASE", stdout);
15444 if (mask & AFL_ASE_MICROMIPS)
15445 fputs ("\n\tMICROMIPS ASE", stdout);
15446 if (mask & AFL_ASE_XPA)
15447 fputs ("\n\tXPA ASE", stdout);
15448 if (mask & AFL_ASE_MIPS16E2)
15449 fputs ("\n\tMIPS16e2 ASE", stdout);
15450 if (mask == 0)
15451 fprintf (stdout, "\n\t%s", _("None"));
15452 else if ((mask & ~AFL_ASE_MASK) != 0)
15453 fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
15454 }
15455
15456 static void
15457 print_mips_isa_ext (unsigned int isa_ext)
15458 {
15459 switch (isa_ext)
15460 {
15461 case 0:
15462 fputs (_("None"), stdout);
15463 break;
15464 case AFL_EXT_XLR:
15465 fputs ("RMI XLR", stdout);
15466 break;
15467 case AFL_EXT_OCTEON3:
15468 fputs ("Cavium Networks Octeon3", stdout);
15469 break;
15470 case AFL_EXT_OCTEON2:
15471 fputs ("Cavium Networks Octeon2", stdout);
15472 break;
15473 case AFL_EXT_OCTEONP:
15474 fputs ("Cavium Networks OcteonP", stdout);
15475 break;
15476 case AFL_EXT_LOONGSON_3A:
15477 fputs ("Loongson 3A", stdout);
15478 break;
15479 case AFL_EXT_OCTEON:
15480 fputs ("Cavium Networks Octeon", stdout);
15481 break;
15482 case AFL_EXT_5900:
15483 fputs ("Toshiba R5900", stdout);
15484 break;
15485 case AFL_EXT_4650:
15486 fputs ("MIPS R4650", stdout);
15487 break;
15488 case AFL_EXT_4010:
15489 fputs ("LSI R4010", stdout);
15490 break;
15491 case AFL_EXT_4100:
15492 fputs ("NEC VR4100", stdout);
15493 break;
15494 case AFL_EXT_3900:
15495 fputs ("Toshiba R3900", stdout);
15496 break;
15497 case AFL_EXT_10000:
15498 fputs ("MIPS R10000", stdout);
15499 break;
15500 case AFL_EXT_SB1:
15501 fputs ("Broadcom SB-1", stdout);
15502 break;
15503 case AFL_EXT_4111:
15504 fputs ("NEC VR4111/VR4181", stdout);
15505 break;
15506 case AFL_EXT_4120:
15507 fputs ("NEC VR4120", stdout);
15508 break;
15509 case AFL_EXT_5400:
15510 fputs ("NEC VR5400", stdout);
15511 break;
15512 case AFL_EXT_5500:
15513 fputs ("NEC VR5500", stdout);
15514 break;
15515 case AFL_EXT_LOONGSON_2E:
15516 fputs ("ST Microelectronics Loongson 2E", stdout);
15517 break;
15518 case AFL_EXT_LOONGSON_2F:
15519 fputs ("ST Microelectronics Loongson 2F", stdout);
15520 break;
15521 case AFL_EXT_INTERAPTIV_MR2:
15522 fputs ("Imagination interAptiv MR2", stdout);
15523 break;
15524 default:
15525 fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
15526 }
15527 }
15528
15529 static signed int
15530 get_mips_reg_size (int reg_size)
15531 {
15532 return (reg_size == AFL_REG_NONE) ? 0
15533 : (reg_size == AFL_REG_32) ? 32
15534 : (reg_size == AFL_REG_64) ? 64
15535 : (reg_size == AFL_REG_128) ? 128
15536 : -1;
15537 }
15538
15539 static bfd_boolean
15540 process_mips_specific (Filedata * filedata)
15541 {
15542 Elf_Internal_Dyn * entry;
15543 Elf_Internal_Shdr *sect = NULL;
15544 size_t liblist_offset = 0;
15545 size_t liblistno = 0;
15546 size_t conflictsno = 0;
15547 size_t options_offset = 0;
15548 size_t conflicts_offset = 0;
15549 size_t pltrelsz = 0;
15550 size_t pltrel = 0;
15551 bfd_vma pltgot = 0;
15552 bfd_vma mips_pltgot = 0;
15553 bfd_vma jmprel = 0;
15554 bfd_vma local_gotno = 0;
15555 bfd_vma gotsym = 0;
15556 bfd_vma symtabno = 0;
15557 bfd_boolean res = TRUE;
15558
15559 if (! process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
15560 display_mips_gnu_attribute))
15561 res = FALSE;
15562
15563 sect = find_section (filedata, ".MIPS.abiflags");
15564
15565 if (sect != NULL)
15566 {
15567 Elf_External_ABIFlags_v0 *abiflags_ext;
15568 Elf_Internal_ABIFlags_v0 abiflags_in;
15569
15570 if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
15571 {
15572 error (_("Corrupt MIPS ABI Flags section.\n"));
15573 res = FALSE;
15574 }
15575 else
15576 {
15577 abiflags_ext = get_data (NULL, filedata, sect->sh_offset, 1,
15578 sect->sh_size, _("MIPS ABI Flags section"));
15579 if (abiflags_ext)
15580 {
15581 abiflags_in.version = BYTE_GET (abiflags_ext->version);
15582 abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
15583 abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
15584 abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
15585 abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
15586 abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
15587 abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
15588 abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
15589 abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
15590 abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
15591 abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
15592
15593 printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
15594 printf ("\nISA: MIPS%d", abiflags_in.isa_level);
15595 if (abiflags_in.isa_rev > 1)
15596 printf ("r%d", abiflags_in.isa_rev);
15597 printf ("\nGPR size: %d",
15598 get_mips_reg_size (abiflags_in.gpr_size));
15599 printf ("\nCPR1 size: %d",
15600 get_mips_reg_size (abiflags_in.cpr1_size));
15601 printf ("\nCPR2 size: %d",
15602 get_mips_reg_size (abiflags_in.cpr2_size));
15603 fputs ("\nFP ABI: ", stdout);
15604 print_mips_fp_abi_value (abiflags_in.fp_abi);
15605 fputs ("ISA Extension: ", stdout);
15606 print_mips_isa_ext (abiflags_in.isa_ext);
15607 fputs ("\nASEs:", stdout);
15608 print_mips_ases (abiflags_in.ases);
15609 printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
15610 printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
15611 fputc ('\n', stdout);
15612 free (abiflags_ext);
15613 }
15614 }
15615 }
15616
15617 /* We have a lot of special sections. Thanks SGI! */
15618 if (dynamic_section == NULL)
15619 {
15620 /* No dynamic information available. See if there is static GOT. */
15621 sect = find_section (filedata, ".got");
15622 if (sect != NULL)
15623 {
15624 unsigned char *data_end;
15625 unsigned char *data;
15626 bfd_vma ent, end;
15627 int addr_size;
15628
15629 pltgot = sect->sh_addr;
15630
15631 ent = pltgot;
15632 addr_size = (is_32bit_elf ? 4 : 8);
15633 end = pltgot + sect->sh_size;
15634
15635 data = (unsigned char *) get_data (NULL, filedata, sect->sh_offset,
15636 end - pltgot, 1,
15637 _("Global Offset Table data"));
15638 /* PR 12855: Null data is handled gracefully throughout. */
15639 data_end = data + (end - pltgot);
15640
15641 printf (_("\nStatic GOT:\n"));
15642 printf (_(" Canonical gp value: "));
15643 print_vma (ent + 0x7ff0, LONG_HEX);
15644 printf ("\n\n");
15645
15646 /* In a dynamic binary GOT[0] is reserved for the dynamic
15647 loader to store the lazy resolver pointer, however in
15648 a static binary it may well have been omitted and GOT
15649 reduced to a table of addresses.
15650 PR 21344: Check for the entry being fully available
15651 before fetching it. */
15652 if (data
15653 && data + ent - pltgot + addr_size <= data_end
15654 && byte_get (data + ent - pltgot, addr_size) == 0)
15655 {
15656 printf (_(" Reserved entries:\n"));
15657 printf (_(" %*s %10s %*s\n"),
15658 addr_size * 2, _("Address"), _("Access"),
15659 addr_size * 2, _("Value"));
15660 ent = print_mips_got_entry (data, pltgot, ent, data_end);
15661 printf ("\n");
15662 if (ent == (bfd_vma) -1)
15663 goto sgot_print_fail;
15664
15665 /* Check for the MSB of GOT[1] being set, identifying a
15666 GNU object. This entry will be used by some runtime
15667 loaders, to store the module pointer. Otherwise this
15668 is an ordinary local entry.
15669 PR 21344: Check for the entry being fully available
15670 before fetching it. */
15671 if (data
15672 && data + ent - pltgot + addr_size <= data_end
15673 && (byte_get (data + ent - pltgot, addr_size)
15674 >> (addr_size * 8 - 1)) != 0)
15675 {
15676 ent = print_mips_got_entry (data, pltgot, ent, data_end);
15677 printf ("\n");
15678 if (ent == (bfd_vma) -1)
15679 goto sgot_print_fail;
15680 }
15681 printf ("\n");
15682 }
15683
15684 if (data != NULL && ent < end)
15685 {
15686 printf (_(" Local entries:\n"));
15687 printf (" %*s %10s %*s\n",
15688 addr_size * 2, _("Address"), _("Access"),
15689 addr_size * 2, _("Value"));
15690 while (ent < end)
15691 {
15692 ent = print_mips_got_entry (data, pltgot, ent, data_end);
15693 printf ("\n");
15694 if (ent == (bfd_vma) -1)
15695 goto sgot_print_fail;
15696 }
15697 printf ("\n");
15698 }
15699
15700 sgot_print_fail:
15701 if (data)
15702 free (data);
15703 }
15704 return res;
15705 }
15706
15707 for (entry = dynamic_section;
15708 /* PR 17531 file: 012-50589-0.004. */
15709 entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
15710 ++entry)
15711 switch (entry->d_tag)
15712 {
15713 case DT_MIPS_LIBLIST:
15714 liblist_offset
15715 = offset_from_vma (filedata, entry->d_un.d_val,
15716 liblistno * sizeof (Elf32_External_Lib));
15717 break;
15718 case DT_MIPS_LIBLISTNO:
15719 liblistno = entry->d_un.d_val;
15720 break;
15721 case DT_MIPS_OPTIONS:
15722 options_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
15723 break;
15724 case DT_MIPS_CONFLICT:
15725 conflicts_offset
15726 = offset_from_vma (filedata, entry->d_un.d_val,
15727 conflictsno * sizeof (Elf32_External_Conflict));
15728 break;
15729 case DT_MIPS_CONFLICTNO:
15730 conflictsno = entry->d_un.d_val;
15731 break;
15732 case DT_PLTGOT:
15733 pltgot = entry->d_un.d_ptr;
15734 break;
15735 case DT_MIPS_LOCAL_GOTNO:
15736 local_gotno = entry->d_un.d_val;
15737 break;
15738 case DT_MIPS_GOTSYM:
15739 gotsym = entry->d_un.d_val;
15740 break;
15741 case DT_MIPS_SYMTABNO:
15742 symtabno = entry->d_un.d_val;
15743 break;
15744 case DT_MIPS_PLTGOT:
15745 mips_pltgot = entry->d_un.d_ptr;
15746 break;
15747 case DT_PLTREL:
15748 pltrel = entry->d_un.d_val;
15749 break;
15750 case DT_PLTRELSZ:
15751 pltrelsz = entry->d_un.d_val;
15752 break;
15753 case DT_JMPREL:
15754 jmprel = entry->d_un.d_ptr;
15755 break;
15756 default:
15757 break;
15758 }
15759
15760 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
15761 {
15762 Elf32_External_Lib * elib;
15763 size_t cnt;
15764
15765 elib = (Elf32_External_Lib *) get_data (NULL, filedata, liblist_offset,
15766 liblistno,
15767 sizeof (Elf32_External_Lib),
15768 _("liblist section data"));
15769 if (elib)
15770 {
15771 printf (ngettext ("\nSection '.liblist' contains %lu entry:\n",
15772 "\nSection '.liblist' contains %lu entries:\n",
15773 (unsigned long) liblistno),
15774 (unsigned long) liblistno);
15775 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
15776 stdout);
15777
15778 for (cnt = 0; cnt < liblistno; ++cnt)
15779 {
15780 Elf32_Lib liblist;
15781 time_t atime;
15782 char timebuf[128];
15783 struct tm * tmp;
15784
15785 liblist.l_name = BYTE_GET (elib[cnt].l_name);
15786 atime = BYTE_GET (elib[cnt].l_time_stamp);
15787 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
15788 liblist.l_version = BYTE_GET (elib[cnt].l_version);
15789 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
15790
15791 tmp = gmtime (&atime);
15792 snprintf (timebuf, sizeof (timebuf),
15793 "%04u-%02u-%02uT%02u:%02u:%02u",
15794 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
15795 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
15796
15797 printf ("%3lu: ", (unsigned long) cnt);
15798 if (VALID_DYNAMIC_NAME (liblist.l_name))
15799 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
15800 else
15801 printf (_("<corrupt: %9ld>"), liblist.l_name);
15802 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
15803 liblist.l_version);
15804
15805 if (liblist.l_flags == 0)
15806 puts (_(" NONE"));
15807 else
15808 {
15809 static const struct
15810 {
15811 const char * name;
15812 int bit;
15813 }
15814 l_flags_vals[] =
15815 {
15816 { " EXACT_MATCH", LL_EXACT_MATCH },
15817 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
15818 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
15819 { " EXPORTS", LL_EXPORTS },
15820 { " DELAY_LOAD", LL_DELAY_LOAD },
15821 { " DELTA", LL_DELTA }
15822 };
15823 int flags = liblist.l_flags;
15824 size_t fcnt;
15825
15826 for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
15827 if ((flags & l_flags_vals[fcnt].bit) != 0)
15828 {
15829 fputs (l_flags_vals[fcnt].name, stdout);
15830 flags ^= l_flags_vals[fcnt].bit;
15831 }
15832 if (flags != 0)
15833 printf (" %#x", (unsigned int) flags);
15834
15835 puts ("");
15836 }
15837 }
15838
15839 free (elib);
15840 }
15841 else
15842 res = FALSE;
15843 }
15844
15845 if (options_offset != 0)
15846 {
15847 Elf_External_Options * eopt;
15848 Elf_Internal_Options * iopt;
15849 Elf_Internal_Options * option;
15850 size_t offset;
15851 int cnt;
15852 sect = filedata->section_headers;
15853
15854 /* Find the section header so that we get the size. */
15855 sect = find_section_by_type (filedata, SHT_MIPS_OPTIONS);
15856 /* PR 17533 file: 012-277276-0.004. */
15857 if (sect == NULL)
15858 {
15859 error (_("No MIPS_OPTIONS header found\n"));
15860 return FALSE;
15861 }
15862
15863 eopt = (Elf_External_Options *) get_data (NULL, filedata, options_offset, 1,
15864 sect->sh_size, _("options"));
15865 if (eopt)
15866 {
15867 iopt = (Elf_Internal_Options *)
15868 cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
15869 if (iopt == NULL)
15870 {
15871 error (_("Out of memory allocating space for MIPS options\n"));
15872 return FALSE;
15873 }
15874
15875 offset = cnt = 0;
15876 option = iopt;
15877
15878 while (offset <= sect->sh_size - sizeof (* eopt))
15879 {
15880 Elf_External_Options * eoption;
15881
15882 eoption = (Elf_External_Options *) ((char *) eopt + offset);
15883
15884 option->kind = BYTE_GET (eoption->kind);
15885 option->size = BYTE_GET (eoption->size);
15886 option->section = BYTE_GET (eoption->section);
15887 option->info = BYTE_GET (eoption->info);
15888
15889 /* PR 17531: file: ffa0fa3b. */
15890 if (option->size < sizeof (* eopt)
15891 || offset + option->size > sect->sh_size)
15892 {
15893 error (_("Invalid size (%u) for MIPS option\n"), option->size);
15894 return FALSE;
15895 }
15896 offset += option->size;
15897
15898 ++option;
15899 ++cnt;
15900 }
15901
15902 printf (ngettext ("\nSection '%s' contains %d entry:\n",
15903 "\nSection '%s' contains %d entries:\n",
15904 cnt),
15905 printable_section_name (filedata, sect), cnt);
15906
15907 option = iopt;
15908 offset = 0;
15909
15910 while (cnt-- > 0)
15911 {
15912 size_t len;
15913
15914 switch (option->kind)
15915 {
15916 case ODK_NULL:
15917 /* This shouldn't happen. */
15918 printf (" NULL %d %lx", option->section, option->info);
15919 break;
15920 case ODK_REGINFO:
15921 printf (" REGINFO ");
15922 if (filedata->file_header.e_machine == EM_MIPS)
15923 {
15924 /* 32bit form. */
15925 Elf32_External_RegInfo * ereg;
15926 Elf32_RegInfo reginfo;
15927
15928 ereg = (Elf32_External_RegInfo *) (option + 1);
15929 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
15930 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
15931 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
15932 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
15933 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
15934 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
15935
15936 printf ("GPR %08lx GP 0x%lx\n",
15937 reginfo.ri_gprmask,
15938 (unsigned long) reginfo.ri_gp_value);
15939 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
15940 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
15941 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
15942 }
15943 else
15944 {
15945 /* 64 bit form. */
15946 Elf64_External_RegInfo * ereg;
15947 Elf64_Internal_RegInfo reginfo;
15948
15949 ereg = (Elf64_External_RegInfo *) (option + 1);
15950 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
15951 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
15952 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
15953 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
15954 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
15955 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
15956
15957 printf ("GPR %08lx GP 0x",
15958 reginfo.ri_gprmask);
15959 printf_vma (reginfo.ri_gp_value);
15960 printf ("\n");
15961
15962 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
15963 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
15964 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
15965 }
15966 ++option;
15967 continue;
15968 case ODK_EXCEPTIONS:
15969 fputs (" EXCEPTIONS fpe_min(", stdout);
15970 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
15971 fputs (") fpe_max(", stdout);
15972 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
15973 fputs (")", stdout);
15974
15975 if (option->info & OEX_PAGE0)
15976 fputs (" PAGE0", stdout);
15977 if (option->info & OEX_SMM)
15978 fputs (" SMM", stdout);
15979 if (option->info & OEX_FPDBUG)
15980 fputs (" FPDBUG", stdout);
15981 if (option->info & OEX_DISMISS)
15982 fputs (" DISMISS", stdout);
15983 break;
15984 case ODK_PAD:
15985 fputs (" PAD ", stdout);
15986 if (option->info & OPAD_PREFIX)
15987 fputs (" PREFIX", stdout);
15988 if (option->info & OPAD_POSTFIX)
15989 fputs (" POSTFIX", stdout);
15990 if (option->info & OPAD_SYMBOL)
15991 fputs (" SYMBOL", stdout);
15992 break;
15993 case ODK_HWPATCH:
15994 fputs (" HWPATCH ", stdout);
15995 if (option->info & OHW_R4KEOP)
15996 fputs (" R4KEOP", stdout);
15997 if (option->info & OHW_R8KPFETCH)
15998 fputs (" R8KPFETCH", stdout);
15999 if (option->info & OHW_R5KEOP)
16000 fputs (" R5KEOP", stdout);
16001 if (option->info & OHW_R5KCVTL)
16002 fputs (" R5KCVTL", stdout);
16003 break;
16004 case ODK_FILL:
16005 fputs (" FILL ", stdout);
16006 /* XXX Print content of info word? */
16007 break;
16008 case ODK_TAGS:
16009 fputs (" TAGS ", stdout);
16010 /* XXX Print content of info word? */
16011 break;
16012 case ODK_HWAND:
16013 fputs (" HWAND ", stdout);
16014 if (option->info & OHWA0_R4KEOP_CHECKED)
16015 fputs (" R4KEOP_CHECKED", stdout);
16016 if (option->info & OHWA0_R4KEOP_CLEAN)
16017 fputs (" R4KEOP_CLEAN", stdout);
16018 break;
16019 case ODK_HWOR:
16020 fputs (" HWOR ", stdout);
16021 if (option->info & OHWA0_R4KEOP_CHECKED)
16022 fputs (" R4KEOP_CHECKED", stdout);
16023 if (option->info & OHWA0_R4KEOP_CLEAN)
16024 fputs (" R4KEOP_CLEAN", stdout);
16025 break;
16026 case ODK_GP_GROUP:
16027 printf (" GP_GROUP %#06lx self-contained %#06lx",
16028 option->info & OGP_GROUP,
16029 (option->info & OGP_SELF) >> 16);
16030 break;
16031 case ODK_IDENT:
16032 printf (" IDENT %#06lx self-contained %#06lx",
16033 option->info & OGP_GROUP,
16034 (option->info & OGP_SELF) >> 16);
16035 break;
16036 default:
16037 /* This shouldn't happen. */
16038 printf (" %3d ??? %d %lx",
16039 option->kind, option->section, option->info);
16040 break;
16041 }
16042
16043 len = sizeof (* eopt);
16044 while (len < option->size)
16045 {
16046 unsigned char datum = * ((unsigned char *) eopt + offset + len);
16047
16048 if (ISPRINT (datum))
16049 printf ("%c", datum);
16050 else
16051 printf ("\\%03o", datum);
16052 len ++;
16053 }
16054 fputs ("\n", stdout);
16055
16056 offset += option->size;
16057 ++option;
16058 }
16059
16060 free (eopt);
16061 }
16062 else
16063 res = FALSE;
16064 }
16065
16066 if (conflicts_offset != 0 && conflictsno != 0)
16067 {
16068 Elf32_Conflict * iconf;
16069 size_t cnt;
16070
16071 if (dynamic_symbols == NULL)
16072 {
16073 error (_("conflict list found without a dynamic symbol table\n"));
16074 return FALSE;
16075 }
16076
16077 /* PR 21345 - print a slightly more helpful error message
16078 if we are sure that the cmalloc will fail. */
16079 if (conflictsno * sizeof (* iconf) > filedata->file_size)
16080 {
16081 error (_("Overlarge number of conflicts detected: %lx\n"),
16082 (long) conflictsno);
16083 return FALSE;
16084 }
16085
16086 iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
16087 if (iconf == NULL)
16088 {
16089 error (_("Out of memory allocating space for dynamic conflicts\n"));
16090 return FALSE;
16091 }
16092
16093 if (is_32bit_elf)
16094 {
16095 Elf32_External_Conflict * econf32;
16096
16097 econf32 = (Elf32_External_Conflict *)
16098 get_data (NULL, filedata, conflicts_offset, conflictsno,
16099 sizeof (* econf32), _("conflict"));
16100 if (!econf32)
16101 return FALSE;
16102
16103 for (cnt = 0; cnt < conflictsno; ++cnt)
16104 iconf[cnt] = BYTE_GET (econf32[cnt]);
16105
16106 free (econf32);
16107 }
16108 else
16109 {
16110 Elf64_External_Conflict * econf64;
16111
16112 econf64 = (Elf64_External_Conflict *)
16113 get_data (NULL, filedata, conflicts_offset, conflictsno,
16114 sizeof (* econf64), _("conflict"));
16115 if (!econf64)
16116 return FALSE;
16117
16118 for (cnt = 0; cnt < conflictsno; ++cnt)
16119 iconf[cnt] = BYTE_GET (econf64[cnt]);
16120
16121 free (econf64);
16122 }
16123
16124 printf (ngettext ("\nSection '.conflict' contains %lu entry:\n",
16125 "\nSection '.conflict' contains %lu entries:\n",
16126 (unsigned long) conflictsno),
16127 (unsigned long) conflictsno);
16128 puts (_(" Num: Index Value Name"));
16129
16130 for (cnt = 0; cnt < conflictsno; ++cnt)
16131 {
16132 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
16133
16134 if (iconf[cnt] >= num_dynamic_syms)
16135 printf (_("<corrupt symbol index>"));
16136 else
16137 {
16138 Elf_Internal_Sym * psym;
16139
16140 psym = & dynamic_symbols[iconf[cnt]];
16141 print_vma (psym->st_value, FULL_HEX);
16142 putchar (' ');
16143 if (VALID_DYNAMIC_NAME (psym->st_name))
16144 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
16145 else
16146 printf (_("<corrupt: %14ld>"), psym->st_name);
16147 }
16148 putchar ('\n');
16149 }
16150
16151 free (iconf);
16152 }
16153
16154 if (pltgot != 0 && local_gotno != 0)
16155 {
16156 bfd_vma ent, local_end, global_end;
16157 size_t i, offset;
16158 unsigned char * data;
16159 unsigned char * data_end;
16160 int addr_size;
16161
16162 ent = pltgot;
16163 addr_size = (is_32bit_elf ? 4 : 8);
16164 local_end = pltgot + local_gotno * addr_size;
16165
16166 /* PR binutils/17533 file: 012-111227-0.004 */
16167 if (symtabno < gotsym)
16168 {
16169 error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
16170 (unsigned long) gotsym, (unsigned long) symtabno);
16171 return FALSE;
16172 }
16173
16174 global_end = local_end + (symtabno - gotsym) * addr_size;
16175 /* PR 17531: file: 54c91a34. */
16176 if (global_end < local_end)
16177 {
16178 error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
16179 return FALSE;
16180 }
16181
16182 offset = offset_from_vma (filedata, pltgot, global_end - pltgot);
16183 data = (unsigned char *) get_data (NULL, filedata, offset,
16184 global_end - pltgot, 1,
16185 _("Global Offset Table data"));
16186 /* PR 12855: Null data is handled gracefully throughout. */
16187 data_end = data + (global_end - pltgot);
16188
16189 printf (_("\nPrimary GOT:\n"));
16190 printf (_(" Canonical gp value: "));
16191 print_vma (pltgot + 0x7ff0, LONG_HEX);
16192 printf ("\n\n");
16193
16194 printf (_(" Reserved entries:\n"));
16195 printf (_(" %*s %10s %*s Purpose\n"),
16196 addr_size * 2, _("Address"), _("Access"),
16197 addr_size * 2, _("Initial"));
16198 ent = print_mips_got_entry (data, pltgot, ent, data_end);
16199 printf (_(" Lazy resolver\n"));
16200 if (ent == (bfd_vma) -1)
16201 goto got_print_fail;
16202
16203 /* Check for the MSB of GOT[1] being set, denoting a GNU object.
16204 This entry will be used by some runtime loaders, to store the
16205 module pointer. Otherwise this is an ordinary local entry.
16206 PR 21344: Check for the entry being fully available before
16207 fetching it. */
16208 if (data
16209 && data + ent - pltgot + addr_size <= data_end
16210 && (byte_get (data + ent - pltgot, addr_size)
16211 >> (addr_size * 8 - 1)) != 0)
16212 {
16213 ent = print_mips_got_entry (data, pltgot, ent, data_end);
16214 printf (_(" Module pointer (GNU extension)\n"));
16215 if (ent == (bfd_vma) -1)
16216 goto got_print_fail;
16217 }
16218 printf ("\n");
16219
16220 if (data != NULL && ent < local_end)
16221 {
16222 printf (_(" Local entries:\n"));
16223 printf (" %*s %10s %*s\n",
16224 addr_size * 2, _("Address"), _("Access"),
16225 addr_size * 2, _("Initial"));
16226 while (ent < local_end)
16227 {
16228 ent = print_mips_got_entry (data, pltgot, ent, data_end);
16229 printf ("\n");
16230 if (ent == (bfd_vma) -1)
16231 goto got_print_fail;
16232 }
16233 printf ("\n");
16234 }
16235
16236 if (data != NULL && gotsym < symtabno)
16237 {
16238 int sym_width;
16239
16240 printf (_(" Global entries:\n"));
16241 printf (" %*s %10s %*s %*s %-7s %3s %s\n",
16242 addr_size * 2, _("Address"),
16243 _("Access"),
16244 addr_size * 2, _("Initial"),
16245 addr_size * 2, _("Sym.Val."),
16246 _("Type"),
16247 /* Note for translators: "Ndx" = abbreviated form of "Index". */
16248 _("Ndx"), _("Name"));
16249
16250 sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
16251
16252 for (i = gotsym; i < symtabno; i++)
16253 {
16254 ent = print_mips_got_entry (data, pltgot, ent, data_end);
16255 printf (" ");
16256
16257 if (dynamic_symbols == NULL)
16258 printf (_("<no dynamic symbols>"));
16259 else if (i < num_dynamic_syms)
16260 {
16261 Elf_Internal_Sym * psym = dynamic_symbols + i;
16262
16263 print_vma (psym->st_value, LONG_HEX);
16264 printf (" %-7s %3s ",
16265 get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
16266 get_symbol_index_type (filedata, psym->st_shndx));
16267
16268 if (VALID_DYNAMIC_NAME (psym->st_name))
16269 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
16270 else
16271 printf (_("<corrupt: %14ld>"), psym->st_name);
16272 }
16273 else
16274 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
16275 (unsigned long) i);
16276
16277 printf ("\n");
16278 if (ent == (bfd_vma) -1)
16279 break;
16280 }
16281 printf ("\n");
16282 }
16283
16284 got_print_fail:
16285 if (data)
16286 free (data);
16287 }
16288
16289 if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
16290 {
16291 bfd_vma ent, end;
16292 size_t offset, rel_offset;
16293 unsigned long count, i;
16294 unsigned char * data;
16295 int addr_size, sym_width;
16296 Elf_Internal_Rela * rels;
16297
16298 rel_offset = offset_from_vma (filedata, jmprel, pltrelsz);
16299 if (pltrel == DT_RELA)
16300 {
16301 if (!slurp_rela_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
16302 return FALSE;
16303 }
16304 else
16305 {
16306 if (!slurp_rel_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
16307 return FALSE;
16308 }
16309
16310 ent = mips_pltgot;
16311 addr_size = (is_32bit_elf ? 4 : 8);
16312 end = mips_pltgot + (2 + count) * addr_size;
16313
16314 offset = offset_from_vma (filedata, mips_pltgot, end - mips_pltgot);
16315 data = (unsigned char *) get_data (NULL, filedata, offset, end - mips_pltgot,
16316 1, _("Procedure Linkage Table data"));
16317 if (data == NULL)
16318 return FALSE;
16319
16320 printf ("\nPLT GOT:\n\n");
16321 printf (_(" Reserved entries:\n"));
16322 printf (_(" %*s %*s Purpose\n"),
16323 addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
16324 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16325 printf (_(" PLT lazy resolver\n"));
16326 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16327 printf (_(" Module pointer\n"));
16328 printf ("\n");
16329
16330 printf (_(" Entries:\n"));
16331 printf (" %*s %*s %*s %-7s %3s %s\n",
16332 addr_size * 2, _("Address"),
16333 addr_size * 2, _("Initial"),
16334 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
16335 sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
16336 for (i = 0; i < count; i++)
16337 {
16338 unsigned long idx = get_reloc_symindex (rels[i].r_info);
16339
16340 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16341 printf (" ");
16342
16343 if (idx >= num_dynamic_syms)
16344 printf (_("<corrupt symbol index: %lu>"), idx);
16345 else
16346 {
16347 Elf_Internal_Sym * psym = dynamic_symbols + idx;
16348
16349 print_vma (psym->st_value, LONG_HEX);
16350 printf (" %-7s %3s ",
16351 get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
16352 get_symbol_index_type (filedata, psym->st_shndx));
16353 if (VALID_DYNAMIC_NAME (psym->st_name))
16354 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
16355 else
16356 printf (_("<corrupt: %14ld>"), psym->st_name);
16357 }
16358 printf ("\n");
16359 }
16360 printf ("\n");
16361
16362 if (data)
16363 free (data);
16364 free (rels);
16365 }
16366
16367 return res;
16368 }
16369
16370 static bfd_boolean
16371 process_nds32_specific (Filedata * filedata)
16372 {
16373 Elf_Internal_Shdr *sect = NULL;
16374
16375 sect = find_section (filedata, ".nds32_e_flags");
16376 if (sect != NULL)
16377 {
16378 unsigned int *flag;
16379
16380 printf ("\nNDS32 elf flags section:\n");
16381 flag = get_data (NULL, filedata, sect->sh_offset, 1,
16382 sect->sh_size, _("NDS32 elf flags section"));
16383
16384 if (! flag)
16385 return FALSE;
16386
16387 switch ((*flag) & 0x3)
16388 {
16389 case 0:
16390 printf ("(VEC_SIZE):\tNo entry.\n");
16391 break;
16392 case 1:
16393 printf ("(VEC_SIZE):\t4 bytes\n");
16394 break;
16395 case 2:
16396 printf ("(VEC_SIZE):\t16 bytes\n");
16397 break;
16398 case 3:
16399 printf ("(VEC_SIZE):\treserved\n");
16400 break;
16401 }
16402 }
16403
16404 return TRUE;
16405 }
16406
16407 static bfd_boolean
16408 process_gnu_liblist (Filedata * filedata)
16409 {
16410 Elf_Internal_Shdr * section;
16411 Elf_Internal_Shdr * string_sec;
16412 Elf32_External_Lib * elib;
16413 char * strtab;
16414 size_t strtab_size;
16415 size_t cnt;
16416 unsigned long num_liblist;
16417 unsigned i;
16418 bfd_boolean res = TRUE;
16419
16420 if (! do_arch)
16421 return TRUE;
16422
16423 for (i = 0, section = filedata->section_headers;
16424 i < filedata->file_header.e_shnum;
16425 i++, section++)
16426 {
16427 switch (section->sh_type)
16428 {
16429 case SHT_GNU_LIBLIST:
16430 if (section->sh_link >= filedata->file_header.e_shnum)
16431 break;
16432
16433 elib = (Elf32_External_Lib *)
16434 get_data (NULL, filedata, section->sh_offset, 1, section->sh_size,
16435 _("liblist section data"));
16436
16437 if (elib == NULL)
16438 {
16439 res = FALSE;
16440 break;
16441 }
16442
16443 string_sec = filedata->section_headers + section->sh_link;
16444 strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
16445 string_sec->sh_size,
16446 _("liblist string table"));
16447 if (strtab == NULL
16448 || section->sh_entsize != sizeof (Elf32_External_Lib))
16449 {
16450 free (elib);
16451 free (strtab);
16452 res = FALSE;
16453 break;
16454 }
16455 strtab_size = string_sec->sh_size;
16456
16457 num_liblist = section->sh_size / sizeof (Elf32_External_Lib);
16458 printf (ngettext ("\nLibrary list section '%s' contains %lu entries:\n",
16459 "\nLibrary list section '%s' contains %lu entries:\n",
16460 num_liblist),
16461 printable_section_name (filedata, section),
16462 num_liblist);
16463
16464 puts (_(" Library Time Stamp Checksum Version Flags"));
16465
16466 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
16467 ++cnt)
16468 {
16469 Elf32_Lib liblist;
16470 time_t atime;
16471 char timebuf[128];
16472 struct tm * tmp;
16473
16474 liblist.l_name = BYTE_GET (elib[cnt].l_name);
16475 atime = BYTE_GET (elib[cnt].l_time_stamp);
16476 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
16477 liblist.l_version = BYTE_GET (elib[cnt].l_version);
16478 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
16479
16480 tmp = gmtime (&atime);
16481 snprintf (timebuf, sizeof (timebuf),
16482 "%04u-%02u-%02uT%02u:%02u:%02u",
16483 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
16484 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
16485
16486 printf ("%3lu: ", (unsigned long) cnt);
16487 if (do_wide)
16488 printf ("%-20s", liblist.l_name < strtab_size
16489 ? strtab + liblist.l_name : _("<corrupt>"));
16490 else
16491 printf ("%-20.20s", liblist.l_name < strtab_size
16492 ? strtab + liblist.l_name : _("<corrupt>"));
16493 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
16494 liblist.l_version, liblist.l_flags);
16495 }
16496
16497 free (elib);
16498 free (strtab);
16499 }
16500 }
16501
16502 return res;
16503 }
16504
16505 static const char *
16506 get_note_type (Filedata * filedata, unsigned e_type)
16507 {
16508 static char buff[64];
16509
16510 if (filedata->file_header.e_type == ET_CORE)
16511 switch (e_type)
16512 {
16513 case NT_AUXV:
16514 return _("NT_AUXV (auxiliary vector)");
16515 case NT_PRSTATUS:
16516 return _("NT_PRSTATUS (prstatus structure)");
16517 case NT_FPREGSET:
16518 return _("NT_FPREGSET (floating point registers)");
16519 case NT_PRPSINFO:
16520 return _("NT_PRPSINFO (prpsinfo structure)");
16521 case NT_TASKSTRUCT:
16522 return _("NT_TASKSTRUCT (task structure)");
16523 case NT_PRXFPREG:
16524 return _("NT_PRXFPREG (user_xfpregs structure)");
16525 case NT_PPC_VMX:
16526 return _("NT_PPC_VMX (ppc Altivec registers)");
16527 case NT_PPC_VSX:
16528 return _("NT_PPC_VSX (ppc VSX registers)");
16529 case NT_PPC_TAR:
16530 return _("NT_PPC_TAR (ppc TAR register)");
16531 case NT_PPC_PPR:
16532 return _("NT_PPC_PPR (ppc PPR register)");
16533 case NT_PPC_DSCR:
16534 return _("NT_PPC_DSCR (ppc DSCR register)");
16535 case NT_PPC_EBB:
16536 return _("NT_PPC_EBB (ppc EBB registers)");
16537 case NT_PPC_PMU:
16538 return _("NT_PPC_PMU (ppc PMU registers)");
16539 case NT_PPC_TM_CGPR:
16540 return _("NT_PPC_TM_CGPR (ppc checkpointed GPR registers)");
16541 case NT_PPC_TM_CFPR:
16542 return _("NT_PPC_TM_CFPR (ppc checkpointed floating point registers)");
16543 case NT_PPC_TM_CVMX:
16544 return _("NT_PPC_TM_CVMX (ppc checkpointed Altivec registers)");
16545 case NT_PPC_TM_CVSX:
16546 return _("NT_PPC_TM_VSX (ppc checkpointed VSX registers)");
16547 case NT_PPC_TM_SPR:
16548 return _("NT_PPC_TM_SPR (ppc TM special purpose registers)");
16549 case NT_PPC_TM_CTAR:
16550 return _("NT_PPC_TM_CTAR (ppc checkpointed TAR register)");
16551 case NT_PPC_TM_CPPR:
16552 return _("NT_PPC_TM_CPPR (ppc checkpointed PPR register)");
16553 case NT_PPC_TM_CDSCR:
16554 return _("NT_PPC_TM_CDSCR (ppc checkpointed DSCR register)");
16555 case NT_386_TLS:
16556 return _("NT_386_TLS (x86 TLS information)");
16557 case NT_386_IOPERM:
16558 return _("NT_386_IOPERM (x86 I/O permissions)");
16559 case NT_X86_XSTATE:
16560 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
16561 case NT_S390_HIGH_GPRS:
16562 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
16563 case NT_S390_TIMER:
16564 return _("NT_S390_TIMER (s390 timer register)");
16565 case NT_S390_TODCMP:
16566 return _("NT_S390_TODCMP (s390 TOD comparator register)");
16567 case NT_S390_TODPREG:
16568 return _("NT_S390_TODPREG (s390 TOD programmable register)");
16569 case NT_S390_CTRS:
16570 return _("NT_S390_CTRS (s390 control registers)");
16571 case NT_S390_PREFIX:
16572 return _("NT_S390_PREFIX (s390 prefix register)");
16573 case NT_S390_LAST_BREAK:
16574 return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
16575 case NT_S390_SYSTEM_CALL:
16576 return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
16577 case NT_S390_TDB:
16578 return _("NT_S390_TDB (s390 transaction diagnostic block)");
16579 case NT_S390_VXRS_LOW:
16580 return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
16581 case NT_S390_VXRS_HIGH:
16582 return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
16583 case NT_S390_GS_CB:
16584 return _("NT_S390_GS_CB (s390 guarded-storage registers)");
16585 case NT_S390_GS_BC:
16586 return _("NT_S390_GS_BC (s390 guarded-storage broadcast control)");
16587 case NT_ARM_VFP:
16588 return _("NT_ARM_VFP (arm VFP registers)");
16589 case NT_ARM_TLS:
16590 return _("NT_ARM_TLS (AArch TLS registers)");
16591 case NT_ARM_HW_BREAK:
16592 return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
16593 case NT_ARM_HW_WATCH:
16594 return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
16595 case NT_PSTATUS:
16596 return _("NT_PSTATUS (pstatus structure)");
16597 case NT_FPREGS:
16598 return _("NT_FPREGS (floating point registers)");
16599 case NT_PSINFO:
16600 return _("NT_PSINFO (psinfo structure)");
16601 case NT_LWPSTATUS:
16602 return _("NT_LWPSTATUS (lwpstatus_t structure)");
16603 case NT_LWPSINFO:
16604 return _("NT_LWPSINFO (lwpsinfo_t structure)");
16605 case NT_WIN32PSTATUS:
16606 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
16607 case NT_SIGINFO:
16608 return _("NT_SIGINFO (siginfo_t data)");
16609 case NT_FILE:
16610 return _("NT_FILE (mapped files)");
16611 default:
16612 break;
16613 }
16614 else
16615 switch (e_type)
16616 {
16617 case NT_VERSION:
16618 return _("NT_VERSION (version)");
16619 case NT_ARCH:
16620 return _("NT_ARCH (architecture)");
16621 case NT_GNU_BUILD_ATTRIBUTE_OPEN:
16622 return _("OPEN");
16623 case NT_GNU_BUILD_ATTRIBUTE_FUNC:
16624 return _("func");
16625 default:
16626 break;
16627 }
16628
16629 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
16630 return buff;
16631 }
16632
16633 static bfd_boolean
16634 print_core_note (Elf_Internal_Note *pnote)
16635 {
16636 unsigned int addr_size = is_32bit_elf ? 4 : 8;
16637 bfd_vma count, page_size;
16638 unsigned char *descdata, *filenames, *descend;
16639
16640 if (pnote->type != NT_FILE)
16641 {
16642 if (do_wide)
16643 printf ("\n");
16644 return TRUE;
16645 }
16646
16647 #ifndef BFD64
16648 if (!is_32bit_elf)
16649 {
16650 printf (_(" Cannot decode 64-bit note in 32-bit build\n"));
16651 /* Still "successful". */
16652 return TRUE;
16653 }
16654 #endif
16655
16656 if (pnote->descsz < 2 * addr_size)
16657 {
16658 error (_(" Malformed note - too short for header\n"));
16659 return FALSE;
16660 }
16661
16662 descdata = (unsigned char *) pnote->descdata;
16663 descend = descdata + pnote->descsz;
16664
16665 if (descdata[pnote->descsz - 1] != '\0')
16666 {
16667 error (_(" Malformed note - does not end with \\0\n"));
16668 return FALSE;
16669 }
16670
16671 count = byte_get (descdata, addr_size);
16672 descdata += addr_size;
16673
16674 page_size = byte_get (descdata, addr_size);
16675 descdata += addr_size;
16676
16677 if (count > ((bfd_vma) -1 - 2 * addr_size) / (3 * addr_size)
16678 || pnote->descsz < 2 * addr_size + count * 3 * addr_size)
16679 {
16680 error (_(" Malformed note - too short for supplied file count\n"));
16681 return FALSE;
16682 }
16683
16684 printf (_(" Page size: "));
16685 print_vma (page_size, DEC);
16686 printf ("\n");
16687
16688 printf (_(" %*s%*s%*s\n"),
16689 (int) (2 + 2 * addr_size), _("Start"),
16690 (int) (4 + 2 * addr_size), _("End"),
16691 (int) (4 + 2 * addr_size), _("Page Offset"));
16692 filenames = descdata + count * 3 * addr_size;
16693 while (count-- > 0)
16694 {
16695 bfd_vma start, end, file_ofs;
16696
16697 if (filenames == descend)
16698 {
16699 error (_(" Malformed note - filenames end too early\n"));
16700 return FALSE;
16701 }
16702
16703 start = byte_get (descdata, addr_size);
16704 descdata += addr_size;
16705 end = byte_get (descdata, addr_size);
16706 descdata += addr_size;
16707 file_ofs = byte_get (descdata, addr_size);
16708 descdata += addr_size;
16709
16710 printf (" ");
16711 print_vma (start, FULL_HEX);
16712 printf (" ");
16713 print_vma (end, FULL_HEX);
16714 printf (" ");
16715 print_vma (file_ofs, FULL_HEX);
16716 printf ("\n %s\n", filenames);
16717
16718 filenames += 1 + strlen ((char *) filenames);
16719 }
16720
16721 return TRUE;
16722 }
16723
16724 static const char *
16725 get_gnu_elf_note_type (unsigned e_type)
16726 {
16727 /* NB/ Keep this switch statement in sync with print_gnu_note (). */
16728 switch (e_type)
16729 {
16730 case NT_GNU_ABI_TAG:
16731 return _("NT_GNU_ABI_TAG (ABI version tag)");
16732 case NT_GNU_HWCAP:
16733 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
16734 case NT_GNU_BUILD_ID:
16735 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
16736 case NT_GNU_GOLD_VERSION:
16737 return _("NT_GNU_GOLD_VERSION (gold version)");
16738 case NT_GNU_PROPERTY_TYPE_0:
16739 return _("NT_GNU_PROPERTY_TYPE_0");
16740 case NT_GNU_BUILD_ATTRIBUTE_OPEN:
16741 return _("NT_GNU_BUILD_ATTRIBUTE_OPEN");
16742 case NT_GNU_BUILD_ATTRIBUTE_FUNC:
16743 return _("NT_GNU_BUILD_ATTRIBUTE_FUNC");
16744 default:
16745 {
16746 static char buff[64];
16747
16748 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
16749 return buff;
16750 }
16751 }
16752 }
16753
16754 static void
16755 decode_x86_isa (unsigned int bitmask)
16756 {
16757 while (bitmask)
16758 {
16759 unsigned int bit = bitmask & (- bitmask);
16760
16761 bitmask &= ~ bit;
16762 switch (bit)
16763 {
16764 case GNU_PROPERTY_X86_ISA_1_486: printf ("i486"); break;
16765 case GNU_PROPERTY_X86_ISA_1_586: printf ("586"); break;
16766 case GNU_PROPERTY_X86_ISA_1_686: printf ("686"); break;
16767 case GNU_PROPERTY_X86_ISA_1_SSE: printf ("SSE"); break;
16768 case GNU_PROPERTY_X86_ISA_1_SSE2: printf ("SSE2"); break;
16769 case GNU_PROPERTY_X86_ISA_1_SSE3: printf ("SSE3"); break;
16770 case GNU_PROPERTY_X86_ISA_1_SSSE3: printf ("SSSE3"); break;
16771 case GNU_PROPERTY_X86_ISA_1_SSE4_1: printf ("SSE4_1"); break;
16772 case GNU_PROPERTY_X86_ISA_1_SSE4_2: printf ("SSE4_2"); break;
16773 case GNU_PROPERTY_X86_ISA_1_AVX: printf ("AVX"); break;
16774 case GNU_PROPERTY_X86_ISA_1_AVX2: printf ("AVX2"); break;
16775 case GNU_PROPERTY_X86_ISA_1_AVX512F: printf ("AVX512F"); break;
16776 case GNU_PROPERTY_X86_ISA_1_AVX512CD: printf ("AVX512CD"); break;
16777 case GNU_PROPERTY_X86_ISA_1_AVX512ER: printf ("AVX512ER"); break;
16778 case GNU_PROPERTY_X86_ISA_1_AVX512PF: printf ("AVX512PF"); break;
16779 case GNU_PROPERTY_X86_ISA_1_AVX512VL: printf ("AVX512VL"); break;
16780 case GNU_PROPERTY_X86_ISA_1_AVX512DQ: printf ("AVX512DQ"); break;
16781 case GNU_PROPERTY_X86_ISA_1_AVX512BW: printf ("AVX512BW"); break;
16782 default: printf (_("<unknown: %x>"), bit); break;
16783 }
16784 if (bitmask)
16785 printf (", ");
16786 }
16787 }
16788
16789 static void
16790 decode_x86_feature (unsigned int type, unsigned int bitmask)
16791 {
16792 while (bitmask)
16793 {
16794 unsigned int bit = bitmask & (- bitmask);
16795
16796 bitmask &= ~ bit;
16797 switch (bit)
16798 {
16799 case GNU_PROPERTY_X86_FEATURE_1_IBT:
16800 switch (type)
16801 {
16802 case GNU_PROPERTY_X86_FEATURE_1_AND:
16803 printf ("IBT");
16804 break;
16805 default:
16806 /* This should never happen. */
16807 abort ();
16808 }
16809 break;
16810 case GNU_PROPERTY_X86_FEATURE_1_SHSTK:
16811 switch (type)
16812 {
16813 case GNU_PROPERTY_X86_FEATURE_1_AND:
16814 printf ("SHSTK");
16815 break;
16816 default:
16817 /* This should never happen. */
16818 abort ();
16819 }
16820 break;
16821 default:
16822 printf (_("<unknown: %x>"), bit);
16823 break;
16824 }
16825 if (bitmask)
16826 printf (", ");
16827 }
16828 }
16829
16830 static void
16831 print_gnu_property_note (Filedata * filedata, Elf_Internal_Note * pnote)
16832 {
16833 unsigned char * ptr = (unsigned char *) pnote->descdata;
16834 unsigned char * ptr_end = ptr + pnote->descsz;
16835 unsigned int size = is_32bit_elf ? 4 : 8;
16836
16837 printf (_(" Properties: "));
16838
16839 if (pnote->descsz < 8 || (pnote->descsz % size) != 0)
16840 {
16841 printf (_("<corrupt GNU_PROPERTY_TYPE, size = %#lx>\n"), pnote->descsz);
16842 return;
16843 }
16844
16845 while (ptr < ptr_end)
16846 {
16847 unsigned int j;
16848 unsigned int type;
16849 unsigned int datasz;
16850
16851 if ((size_t) (ptr_end - ptr) < 8)
16852 {
16853 printf (_("<corrupt descsz: %#lx>\n"), pnote->descsz);
16854 break;
16855 }
16856
16857 type = byte_get (ptr, 4);
16858 datasz = byte_get (ptr + 4, 4);
16859
16860 ptr += 8;
16861
16862 if (datasz > (size_t) (ptr_end - ptr))
16863 {
16864 printf (_("<corrupt type (%#x) datasz: %#x>\n"),
16865 type, datasz);
16866 break;
16867 }
16868
16869 if (type >= GNU_PROPERTY_LOPROC && type <= GNU_PROPERTY_HIPROC)
16870 {
16871 if (filedata->file_header.e_machine == EM_X86_64
16872 || filedata->file_header.e_machine == EM_IAMCU
16873 || filedata->file_header.e_machine == EM_386)
16874 {
16875 switch (type)
16876 {
16877 case GNU_PROPERTY_X86_ISA_1_USED:
16878 printf ("x86 ISA used: ");
16879 if (datasz != 4)
16880 printf (_("<corrupt length: %#x> "), datasz);
16881 else
16882 decode_x86_isa (byte_get (ptr, 4));
16883 goto next;
16884
16885 case GNU_PROPERTY_X86_ISA_1_NEEDED:
16886 printf ("x86 ISA needed: ");
16887 if (datasz != 4)
16888 printf (_("<corrupt length: %#x> "), datasz);
16889 else
16890 decode_x86_isa (byte_get (ptr, 4));
16891 goto next;
16892
16893 case GNU_PROPERTY_X86_FEATURE_1_AND:
16894 printf ("x86 feature: ");
16895 if (datasz != 4)
16896 printf (_("<corrupt length: %#x> "), datasz);
16897 else
16898 decode_x86_feature (type, byte_get (ptr, 4));
16899 goto next;
16900
16901 default:
16902 break;
16903 }
16904 }
16905 }
16906 else
16907 {
16908 switch (type)
16909 {
16910 case GNU_PROPERTY_STACK_SIZE:
16911 printf (_("stack size: "));
16912 if (datasz != size)
16913 printf (_("<corrupt length: %#x> "), datasz);
16914 else
16915 printf ("%#lx", (unsigned long) byte_get (ptr, size));
16916 goto next;
16917
16918 case GNU_PROPERTY_NO_COPY_ON_PROTECTED:
16919 printf ("no copy on protected ");
16920 if (datasz)
16921 printf (_("<corrupt length: %#x> "), datasz);
16922 goto next;
16923
16924 default:
16925 break;
16926 }
16927 }
16928
16929 if (type < GNU_PROPERTY_LOPROC)
16930 printf (_("<unknown type %#x data: "), type);
16931 else if (type < GNU_PROPERTY_LOUSER)
16932 printf (_("<procesor-specific type %#x data: "), type);
16933 else
16934 printf (_("<application-specific type %#x data: "), type);
16935 for (j = 0; j < datasz; ++j)
16936 printf ("%02x ", ptr[j] & 0xff);
16937 printf (">");
16938
16939 next:
16940 ptr += ((datasz + (size - 1)) & ~ (size - 1));
16941 if (ptr == ptr_end)
16942 break;
16943
16944 if (do_wide)
16945 printf (", ");
16946 else
16947 printf ("\n\t");
16948 }
16949
16950 printf ("\n");
16951 }
16952
16953 static bfd_boolean
16954 print_gnu_note (Filedata * filedata, Elf_Internal_Note *pnote)
16955 {
16956 /* NB/ Keep this switch statement in sync with get_gnu_elf_note_type (). */
16957 switch (pnote->type)
16958 {
16959 case NT_GNU_BUILD_ID:
16960 {
16961 unsigned long i;
16962
16963 printf (_(" Build ID: "));
16964 for (i = 0; i < pnote->descsz; ++i)
16965 printf ("%02x", pnote->descdata[i] & 0xff);
16966 printf ("\n");
16967 }
16968 break;
16969
16970 case NT_GNU_ABI_TAG:
16971 {
16972 unsigned long os, major, minor, subminor;
16973 const char *osname;
16974
16975 /* PR 17531: file: 030-599401-0.004. */
16976 if (pnote->descsz < 16)
16977 {
16978 printf (_(" <corrupt GNU_ABI_TAG>\n"));
16979 break;
16980 }
16981
16982 os = byte_get ((unsigned char *) pnote->descdata, 4);
16983 major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
16984 minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
16985 subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
16986
16987 switch (os)
16988 {
16989 case GNU_ABI_TAG_LINUX:
16990 osname = "Linux";
16991 break;
16992 case GNU_ABI_TAG_HURD:
16993 osname = "Hurd";
16994 break;
16995 case GNU_ABI_TAG_SOLARIS:
16996 osname = "Solaris";
16997 break;
16998 case GNU_ABI_TAG_FREEBSD:
16999 osname = "FreeBSD";
17000 break;
17001 case GNU_ABI_TAG_NETBSD:
17002 osname = "NetBSD";
17003 break;
17004 case GNU_ABI_TAG_SYLLABLE:
17005 osname = "Syllable";
17006 break;
17007 case GNU_ABI_TAG_NACL:
17008 osname = "NaCl";
17009 break;
17010 default:
17011 osname = "Unknown";
17012 break;
17013 }
17014
17015 printf (_(" OS: %s, ABI: %ld.%ld.%ld\n"), osname,
17016 major, minor, subminor);
17017 }
17018 break;
17019
17020 case NT_GNU_GOLD_VERSION:
17021 {
17022 unsigned long i;
17023
17024 printf (_(" Version: "));
17025 for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
17026 printf ("%c", pnote->descdata[i]);
17027 printf ("\n");
17028 }
17029 break;
17030
17031 case NT_GNU_HWCAP:
17032 {
17033 unsigned long num_entries, mask;
17034
17035 /* Hardware capabilities information. Word 0 is the number of entries.
17036 Word 1 is a bitmask of enabled entries. The rest of the descriptor
17037 is a series of entries, where each entry is a single byte followed
17038 by a nul terminated string. The byte gives the bit number to test
17039 if enabled in the bitmask. */
17040 printf (_(" Hardware Capabilities: "));
17041 if (pnote->descsz < 8)
17042 {
17043 error (_("<corrupt GNU_HWCAP>\n"));
17044 return FALSE;
17045 }
17046 num_entries = byte_get ((unsigned char *) pnote->descdata, 4);
17047 mask = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17048 printf (_("num entries: %ld, enabled mask: %lx\n"), num_entries, mask);
17049 /* FIXME: Add code to display the entries... */
17050 }
17051 break;
17052
17053 case NT_GNU_PROPERTY_TYPE_0:
17054 print_gnu_property_note (filedata, pnote);
17055 break;
17056
17057 default:
17058 /* Handle unrecognised types. An error message should have already been
17059 created by get_gnu_elf_note_type(), so all that we need to do is to
17060 display the data. */
17061 {
17062 unsigned long i;
17063
17064 printf (_(" Description data: "));
17065 for (i = 0; i < pnote->descsz; ++i)
17066 printf ("%02x ", pnote->descdata[i] & 0xff);
17067 printf ("\n");
17068 }
17069 break;
17070 }
17071
17072 return TRUE;
17073 }
17074
17075 static const char *
17076 get_v850_elf_note_type (enum v850_notes n_type)
17077 {
17078 static char buff[64];
17079
17080 switch (n_type)
17081 {
17082 case V850_NOTE_ALIGNMENT: return _("Alignment of 8-byte objects");
17083 case V850_NOTE_DATA_SIZE: return _("Sizeof double and long double");
17084 case V850_NOTE_FPU_INFO: return _("Type of FPU support needed");
17085 case V850_NOTE_SIMD_INFO: return _("Use of SIMD instructions");
17086 case V850_NOTE_CACHE_INFO: return _("Use of cache");
17087 case V850_NOTE_MMU_INFO: return _("Use of MMU");
17088 default:
17089 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
17090 return buff;
17091 }
17092 }
17093
17094 static bfd_boolean
17095 print_v850_note (Elf_Internal_Note * pnote)
17096 {
17097 unsigned int val;
17098
17099 if (pnote->descsz != 4)
17100 return FALSE;
17101
17102 val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
17103
17104 if (val == 0)
17105 {
17106 printf (_("not set\n"));
17107 return TRUE;
17108 }
17109
17110 switch (pnote->type)
17111 {
17112 case V850_NOTE_ALIGNMENT:
17113 switch (val)
17114 {
17115 case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return TRUE;
17116 case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return TRUE;
17117 }
17118 break;
17119
17120 case V850_NOTE_DATA_SIZE:
17121 switch (val)
17122 {
17123 case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return TRUE;
17124 case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return TRUE;
17125 }
17126 break;
17127
17128 case V850_NOTE_FPU_INFO:
17129 switch (val)
17130 {
17131 case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return TRUE;
17132 case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return TRUE;
17133 }
17134 break;
17135
17136 case V850_NOTE_MMU_INFO:
17137 case V850_NOTE_CACHE_INFO:
17138 case V850_NOTE_SIMD_INFO:
17139 if (val == EF_RH850_SIMD)
17140 {
17141 printf (_("yes\n"));
17142 return TRUE;
17143 }
17144 break;
17145
17146 default:
17147 /* An 'unknown note type' message will already have been displayed. */
17148 break;
17149 }
17150
17151 printf (_("unknown value: %x\n"), val);
17152 return FALSE;
17153 }
17154
17155 static bfd_boolean
17156 process_netbsd_elf_note (Elf_Internal_Note * pnote)
17157 {
17158 unsigned int version;
17159
17160 switch (pnote->type)
17161 {
17162 case NT_NETBSD_IDENT:
17163 version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
17164 if ((version / 10000) % 100)
17165 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
17166 version, version / 100000000, (version / 1000000) % 100,
17167 (version / 10000) % 100 > 26 ? "Z" : "",
17168 'A' + (version / 10000) % 26);
17169 else
17170 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
17171 version, version / 100000000, (version / 1000000) % 100,
17172 (version / 100) % 100);
17173 return TRUE;
17174
17175 case NT_NETBSD_MARCH:
17176 printf (" NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
17177 pnote->descdata);
17178 return TRUE;
17179
17180 default:
17181 printf (" NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
17182 pnote->type);
17183 return FALSE;
17184 }
17185 }
17186
17187 static const char *
17188 get_freebsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
17189 {
17190 switch (e_type)
17191 {
17192 case NT_FREEBSD_THRMISC:
17193 return _("NT_THRMISC (thrmisc structure)");
17194 case NT_FREEBSD_PROCSTAT_PROC:
17195 return _("NT_PROCSTAT_PROC (proc data)");
17196 case NT_FREEBSD_PROCSTAT_FILES:
17197 return _("NT_PROCSTAT_FILES (files data)");
17198 case NT_FREEBSD_PROCSTAT_VMMAP:
17199 return _("NT_PROCSTAT_VMMAP (vmmap data)");
17200 case NT_FREEBSD_PROCSTAT_GROUPS:
17201 return _("NT_PROCSTAT_GROUPS (groups data)");
17202 case NT_FREEBSD_PROCSTAT_UMASK:
17203 return _("NT_PROCSTAT_UMASK (umask data)");
17204 case NT_FREEBSD_PROCSTAT_RLIMIT:
17205 return _("NT_PROCSTAT_RLIMIT (rlimit data)");
17206 case NT_FREEBSD_PROCSTAT_OSREL:
17207 return _("NT_PROCSTAT_OSREL (osreldate data)");
17208 case NT_FREEBSD_PROCSTAT_PSSTRINGS:
17209 return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
17210 case NT_FREEBSD_PROCSTAT_AUXV:
17211 return _("NT_PROCSTAT_AUXV (auxv data)");
17212 case NT_FREEBSD_PTLWPINFO:
17213 return _("NT_PTLWPINFO (ptrace_lwpinfo structure)");
17214 }
17215 return get_note_type (filedata, e_type);
17216 }
17217
17218 static const char *
17219 get_netbsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
17220 {
17221 static char buff[64];
17222
17223 if (e_type == NT_NETBSDCORE_PROCINFO)
17224 return _("NetBSD procinfo structure");
17225
17226 /* As of Jan 2002 there are no other machine-independent notes
17227 defined for NetBSD core files. If the note type is less
17228 than the start of the machine-dependent note types, we don't
17229 understand it. */
17230
17231 if (e_type < NT_NETBSDCORE_FIRSTMACH)
17232 {
17233 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17234 return buff;
17235 }
17236
17237 switch (filedata->file_header.e_machine)
17238 {
17239 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
17240 and PT_GETFPREGS == mach+2. */
17241
17242 case EM_OLD_ALPHA:
17243 case EM_ALPHA:
17244 case EM_SPARC:
17245 case EM_SPARC32PLUS:
17246 case EM_SPARCV9:
17247 switch (e_type)
17248 {
17249 case NT_NETBSDCORE_FIRSTMACH + 0:
17250 return _("PT_GETREGS (reg structure)");
17251 case NT_NETBSDCORE_FIRSTMACH + 2:
17252 return _("PT_GETFPREGS (fpreg structure)");
17253 default:
17254 break;
17255 }
17256 break;
17257
17258 /* On all other arch's, PT_GETREGS == mach+1 and
17259 PT_GETFPREGS == mach+3. */
17260 default:
17261 switch (e_type)
17262 {
17263 case NT_NETBSDCORE_FIRSTMACH + 1:
17264 return _("PT_GETREGS (reg structure)");
17265 case NT_NETBSDCORE_FIRSTMACH + 3:
17266 return _("PT_GETFPREGS (fpreg structure)");
17267 default:
17268 break;
17269 }
17270 }
17271
17272 snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
17273 e_type - NT_NETBSDCORE_FIRSTMACH);
17274 return buff;
17275 }
17276
17277 static const char *
17278 get_stapsdt_note_type (unsigned e_type)
17279 {
17280 static char buff[64];
17281
17282 switch (e_type)
17283 {
17284 case NT_STAPSDT:
17285 return _("NT_STAPSDT (SystemTap probe descriptors)");
17286
17287 default:
17288 break;
17289 }
17290
17291 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17292 return buff;
17293 }
17294
17295 static bfd_boolean
17296 print_stapsdt_note (Elf_Internal_Note *pnote)
17297 {
17298 int addr_size = is_32bit_elf ? 4 : 8;
17299 char *data = pnote->descdata;
17300 char *data_end = pnote->descdata + pnote->descsz;
17301 bfd_vma pc, base_addr, semaphore;
17302 char *provider, *probe, *arg_fmt;
17303
17304 pc = byte_get ((unsigned char *) data, addr_size);
17305 data += addr_size;
17306 base_addr = byte_get ((unsigned char *) data, addr_size);
17307 data += addr_size;
17308 semaphore = byte_get ((unsigned char *) data, addr_size);
17309 data += addr_size;
17310
17311 provider = data;
17312 data += strlen (data) + 1;
17313 probe = data;
17314 data += strlen (data) + 1;
17315 arg_fmt = data;
17316 data += strlen (data) + 1;
17317
17318 printf (_(" Provider: %s\n"), provider);
17319 printf (_(" Name: %s\n"), probe);
17320 printf (_(" Location: "));
17321 print_vma (pc, FULL_HEX);
17322 printf (_(", Base: "));
17323 print_vma (base_addr, FULL_HEX);
17324 printf (_(", Semaphore: "));
17325 print_vma (semaphore, FULL_HEX);
17326 printf ("\n");
17327 printf (_(" Arguments: %s\n"), arg_fmt);
17328
17329 return data == data_end;
17330 }
17331
17332 static const char *
17333 get_ia64_vms_note_type (unsigned e_type)
17334 {
17335 static char buff[64];
17336
17337 switch (e_type)
17338 {
17339 case NT_VMS_MHD:
17340 return _("NT_VMS_MHD (module header)");
17341 case NT_VMS_LNM:
17342 return _("NT_VMS_LNM (language name)");
17343 case NT_VMS_SRC:
17344 return _("NT_VMS_SRC (source files)");
17345 case NT_VMS_TITLE:
17346 return "NT_VMS_TITLE";
17347 case NT_VMS_EIDC:
17348 return _("NT_VMS_EIDC (consistency check)");
17349 case NT_VMS_FPMODE:
17350 return _("NT_VMS_FPMODE (FP mode)");
17351 case NT_VMS_LINKTIME:
17352 return "NT_VMS_LINKTIME";
17353 case NT_VMS_IMGNAM:
17354 return _("NT_VMS_IMGNAM (image name)");
17355 case NT_VMS_IMGID:
17356 return _("NT_VMS_IMGID (image id)");
17357 case NT_VMS_LINKID:
17358 return _("NT_VMS_LINKID (link id)");
17359 case NT_VMS_IMGBID:
17360 return _("NT_VMS_IMGBID (build id)");
17361 case NT_VMS_GSTNAM:
17362 return _("NT_VMS_GSTNAM (sym table name)");
17363 case NT_VMS_ORIG_DYN:
17364 return "NT_VMS_ORIG_DYN";
17365 case NT_VMS_PATCHTIME:
17366 return "NT_VMS_PATCHTIME";
17367 default:
17368 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17369 return buff;
17370 }
17371 }
17372
17373 static bfd_boolean
17374 print_ia64_vms_note (Elf_Internal_Note * pnote)
17375 {
17376 switch (pnote->type)
17377 {
17378 case NT_VMS_MHD:
17379 if (pnote->descsz > 36)
17380 {
17381 size_t l = strlen (pnote->descdata + 34);
17382 printf (_(" Creation date : %.17s\n"), pnote->descdata);
17383 printf (_(" Last patch date: %.17s\n"), pnote->descdata + 17);
17384 printf (_(" Module name : %s\n"), pnote->descdata + 34);
17385 printf (_(" Module version : %s\n"), pnote->descdata + 34 + l + 1);
17386 }
17387 else
17388 printf (_(" Invalid size\n"));
17389 break;
17390 case NT_VMS_LNM:
17391 printf (_(" Language: %s\n"), pnote->descdata);
17392 break;
17393 #ifdef BFD64
17394 case NT_VMS_FPMODE:
17395 printf (_(" Floating Point mode: "));
17396 printf ("0x%016" BFD_VMA_FMT "x\n",
17397 (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
17398 break;
17399 case NT_VMS_LINKTIME:
17400 printf (_(" Link time: "));
17401 print_vms_time
17402 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
17403 printf ("\n");
17404 break;
17405 case NT_VMS_PATCHTIME:
17406 printf (_(" Patch time: "));
17407 print_vms_time
17408 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
17409 printf ("\n");
17410 break;
17411 case NT_VMS_ORIG_DYN:
17412 printf (_(" Major id: %u, minor id: %u\n"),
17413 (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
17414 (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
17415 printf (_(" Last modified : "));
17416 print_vms_time
17417 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
17418 printf (_("\n Link flags : "));
17419 printf ("0x%016" BFD_VMA_FMT "x\n",
17420 (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
17421 printf (_(" Header flags: 0x%08x\n"),
17422 (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
17423 printf (_(" Image id : %s\n"), pnote->descdata + 32);
17424 break;
17425 #endif
17426 case NT_VMS_IMGNAM:
17427 printf (_(" Image name: %s\n"), pnote->descdata);
17428 break;
17429 case NT_VMS_GSTNAM:
17430 printf (_(" Global symbol table name: %s\n"), pnote->descdata);
17431 break;
17432 case NT_VMS_IMGID:
17433 printf (_(" Image id: %s\n"), pnote->descdata);
17434 break;
17435 case NT_VMS_LINKID:
17436 printf (_(" Linker id: %s\n"), pnote->descdata);
17437 break;
17438 default:
17439 return FALSE;
17440 }
17441 return TRUE;
17442 }
17443
17444 /* Find the symbol associated with a build attribute that is attached
17445 to address OFFSET. If PNAME is non-NULL then store the name of
17446 the symbol (if found) in the provided pointer, Returns NULL if a
17447 symbol could not be found. */
17448
17449 static Elf_Internal_Sym *
17450 get_symbol_for_build_attribute (Filedata * filedata,
17451 unsigned long offset,
17452 bfd_boolean is_open_attr,
17453 const char ** pname)
17454 {
17455 static Filedata * saved_filedata = NULL;
17456 static char * strtab;
17457 static unsigned long strtablen;
17458 static Elf_Internal_Sym * symtab;
17459 static unsigned long nsyms;
17460 Elf_Internal_Sym * saved_sym = NULL;
17461 Elf_Internal_Sym * sym;
17462
17463 if (filedata->section_headers != NULL
17464 && (saved_filedata == NULL || filedata != saved_filedata))
17465 {
17466 Elf_Internal_Shdr * symsec;
17467
17468 /* Load the symbol and string sections. */
17469 for (symsec = filedata->section_headers;
17470 symsec < filedata->section_headers + filedata->file_header.e_shnum;
17471 symsec ++)
17472 {
17473 if (symsec->sh_type == SHT_SYMTAB)
17474 {
17475 symtab = GET_ELF_SYMBOLS (filedata, symsec, & nsyms);
17476
17477 if (symsec->sh_link < filedata->file_header.e_shnum)
17478 {
17479 Elf_Internal_Shdr * strtab_sec = filedata->section_headers + symsec->sh_link;
17480
17481 strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
17482 1, strtab_sec->sh_size,
17483 _("string table"));
17484 strtablen = strtab != NULL ? strtab_sec->sh_size : 0;
17485 }
17486 }
17487 }
17488 saved_filedata = filedata;
17489 }
17490
17491 if (symtab == NULL || strtab == NULL)
17492 return NULL;
17493
17494 /* Find a symbol whose value matches offset. */
17495 for (sym = symtab; sym < symtab + nsyms; sym ++)
17496 if (sym->st_value == offset)
17497 {
17498 if (sym->st_name >= strtablen)
17499 /* Huh ? This should not happen. */
17500 continue;
17501
17502 if (strtab[sym->st_name] == 0)
17503 continue;
17504
17505 if (is_open_attr)
17506 {
17507 /* For OPEN attributes we prefer GLOBAL over LOCAL symbols
17508 and FILE or OBJECT symbols over NOTYPE symbols. We skip
17509 FUNC symbols entirely. */
17510 switch (ELF_ST_TYPE (sym->st_info))
17511 {
17512 case STT_OBJECT:
17513 case STT_FILE:
17514 saved_sym = sym;
17515 if (sym->st_size)
17516 {
17517 /* If the symbol has a size associated
17518 with it then we can stop searching. */
17519 sym = symtab + nsyms;
17520 }
17521 continue;
17522
17523 case STT_FUNC:
17524 /* Ignore function symbols. */
17525 continue;
17526
17527 default:
17528 break;
17529 }
17530
17531 switch (ELF_ST_BIND (sym->st_info))
17532 {
17533 case STB_GLOBAL:
17534 if (saved_sym == NULL
17535 || ELF_ST_TYPE (saved_sym->st_info) != STT_OBJECT)
17536 saved_sym = sym;
17537 break;
17538
17539 case STB_LOCAL:
17540 if (saved_sym == NULL)
17541 saved_sym = sym;
17542 break;
17543
17544 default:
17545 break;
17546 }
17547 }
17548 else
17549 {
17550 if (ELF_ST_TYPE (sym->st_info) != STT_FUNC)
17551 continue;
17552
17553 saved_sym = sym;
17554 break;
17555 }
17556 }
17557
17558 if (saved_sym && pname)
17559 * pname = strtab + saved_sym->st_name;
17560
17561 return saved_sym;
17562 }
17563
17564 static bfd_boolean
17565 print_gnu_build_attribute_description (Elf_Internal_Note * pnote,
17566 Filedata * filedata)
17567 {
17568 static unsigned long global_offset = 0;
17569 static unsigned long global_end = 0;
17570 static unsigned long func_offset = 0;
17571 static unsigned long func_end = 0;
17572
17573 Elf_Internal_Sym * sym;
17574 const char * name;
17575 unsigned long start;
17576 unsigned long end;
17577 bfd_boolean is_open_attr = pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN;
17578
17579 switch (pnote->descsz)
17580 {
17581 case 0:
17582 /* A zero-length description means that the range of
17583 the previous note of the same type should be used. */
17584 if (is_open_attr)
17585 {
17586 if (global_end > global_offset)
17587 printf (_(" Applies to region from %#lx to %#lx\n"),
17588 global_offset, global_end);
17589 else
17590 printf (_(" Applies to region from %#lx\n"), global_offset);
17591 }
17592 else
17593 {
17594 if (func_end > func_offset)
17595 printf (_(" Applies to region from %#lx to %#lx\n"), func_offset, func_end);
17596 else
17597 printf (_(" Applies to region from %#lx\n"), func_offset);
17598 }
17599 return TRUE;
17600
17601 case 4:
17602 start = byte_get ((unsigned char *) pnote->descdata, 4);
17603 end = 0;
17604 break;
17605
17606 case 8:
17607 if (is_32bit_elf)
17608 {
17609 /* FIXME: We should check that version 3+ notes are being used here... */
17610 start = byte_get ((unsigned char *) pnote->descdata, 4);
17611 end = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17612 }
17613 else
17614 {
17615 start = byte_get ((unsigned char *) pnote->descdata, 8);
17616 end = 0;
17617 }
17618 break;
17619
17620 case 16:
17621 start = byte_get ((unsigned char *) pnote->descdata, 8);
17622 end = byte_get ((unsigned char *) pnote->descdata + 8, 8);
17623 break;
17624
17625 default:
17626 error (_(" <invalid description size: %lx>\n"), pnote->descsz);
17627 printf (_(" <invalid descsz>"));
17628 return FALSE;
17629 }
17630
17631 name = NULL;
17632 sym = get_symbol_for_build_attribute (filedata, start, is_open_attr, & name);
17633
17634 if (end == 0 && sym != NULL && sym->st_size > 0)
17635 end = start + sym->st_size;
17636
17637 if (is_open_attr)
17638 {
17639 /* FIXME: Need to properly allow for section alignment. 16 is just the alignment used on x86_64. */
17640 if (global_end > 0 && start > BFD_ALIGN (global_end, 16))
17641 warn (_("Gap in build notes detected from %#lx to %#lx\n"),
17642 global_end + 1, start - 1);
17643
17644 printf (_(" Applies to region from %#lx"), start);
17645 global_offset = start;
17646
17647 if (end)
17648 {
17649 printf (_(" to %#lx"), end);
17650 global_end = end;
17651 }
17652 }
17653 else
17654 {
17655 printf (_(" Applies to region from %#lx"), start);
17656 func_offset = start;
17657
17658 if (end)
17659 {
17660 printf (_(" to %#lx"), end);
17661 func_end = end;
17662 }
17663 }
17664
17665 if (sym && name)
17666 printf (_(" (%s)"), name);
17667
17668 printf ("\n");
17669 return TRUE;
17670 }
17671
17672 static bfd_boolean
17673 print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
17674 {
17675 static const char string_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_STRING, 0 };
17676 static const char number_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC, 0 };
17677 static const char bool_expected [3] = { GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE, GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE, 0 };
17678 char name_type;
17679 char name_attribute;
17680 const char * expected_types;
17681 const char * name = pnote->namedata;
17682 const char * text;
17683 signed int left;
17684
17685 if (name == NULL || pnote->namesz < 2)
17686 {
17687 error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
17688 print_symbol (-20, _(" <corrupt name>"));
17689 return FALSE;
17690 }
17691
17692 if (do_wide)
17693 left = 28;
17694 else
17695 left = 20;
17696
17697 /* Version 2 of the spec adds a "GA" prefix to the name field. */
17698 if (name[0] == 'G' && name[1] == 'A')
17699 {
17700 if (pnote->namesz < 4)
17701 {
17702 error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
17703 print_symbol (-20, _(" <corrupt name>"));
17704 return FALSE;
17705 }
17706
17707 printf ("GA");
17708 name += 2;
17709 left -= 2;
17710 }
17711
17712 switch ((name_type = * name))
17713 {
17714 case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
17715 case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
17716 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
17717 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
17718 printf ("%c", * name);
17719 left --;
17720 break;
17721 default:
17722 error (_("unrecognised attribute type in name field: %d\n"), name_type);
17723 print_symbol (-20, _("<unknown name type>"));
17724 return FALSE;
17725 }
17726
17727 ++ name;
17728 text = NULL;
17729
17730 switch ((name_attribute = * name))
17731 {
17732 case GNU_BUILD_ATTRIBUTE_VERSION:
17733 text = _("<version>");
17734 expected_types = string_expected;
17735 ++ name;
17736 break;
17737 case GNU_BUILD_ATTRIBUTE_STACK_PROT:
17738 text = _("<stack prot>");
17739 expected_types = "!+*";
17740 ++ name;
17741 break;
17742 case GNU_BUILD_ATTRIBUTE_RELRO:
17743 text = _("<relro>");
17744 expected_types = bool_expected;
17745 ++ name;
17746 break;
17747 case GNU_BUILD_ATTRIBUTE_STACK_SIZE:
17748 text = _("<stack size>");
17749 expected_types = number_expected;
17750 ++ name;
17751 break;
17752 case GNU_BUILD_ATTRIBUTE_TOOL:
17753 text = _("<tool>");
17754 expected_types = string_expected;
17755 ++ name;
17756 break;
17757 case GNU_BUILD_ATTRIBUTE_ABI:
17758 text = _("<ABI>");
17759 expected_types = "$*";
17760 ++ name;
17761 break;
17762 case GNU_BUILD_ATTRIBUTE_PIC:
17763 text = _("<PIC>");
17764 expected_types = number_expected;
17765 ++ name;
17766 break;
17767 case GNU_BUILD_ATTRIBUTE_SHORT_ENUM:
17768 text = _("<short enum>");
17769 expected_types = bool_expected;
17770 ++ name;
17771 break;
17772 default:
17773 if (ISPRINT (* name))
17774 {
17775 int len = strnlen (name, pnote->namesz - (name - pnote->namedata)) + 1;
17776
17777 if (len > left && ! do_wide)
17778 len = left;
17779 printf ("%.*s:", len, name);
17780 left -= len;
17781 name += len;
17782 }
17783 else
17784 {
17785 static char tmpbuf [128];
17786
17787 error (_("unrecognised byte in name field: %d\n"), * name);
17788 sprintf (tmpbuf, _("<unknown:_%d>"), * name);
17789 text = tmpbuf;
17790 name ++;
17791 }
17792 expected_types = "*$!+";
17793 break;
17794 }
17795
17796 if (text)
17797 left -= printf ("%s", text);
17798
17799 if (strchr (expected_types, name_type) == NULL)
17800 warn (_("attribute does not have an expected type (%c)\n"), name_type);
17801
17802 if ((unsigned long)(name - pnote->namedata) > pnote->namesz)
17803 {
17804 error (_("corrupt name field: namesz: %lu but parsing gets to %ld\n"),
17805 (unsigned long) pnote->namesz,
17806 (long) (name - pnote->namedata));
17807 return FALSE;
17808 }
17809
17810 if (left < 1 && ! do_wide)
17811 return TRUE;
17812
17813 switch (name_type)
17814 {
17815 case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
17816 {
17817 unsigned int bytes;
17818 unsigned long long val = 0;
17819 unsigned int shift = 0;
17820 char * decoded = NULL;
17821
17822 bytes = pnote->namesz - (name - pnote->namedata);
17823 if (bytes > 0)
17824 /* The -1 is because the name field is always 0 terminated, and we
17825 want to be able to ensure that the shift in the while loop below
17826 will not overflow. */
17827 -- bytes;
17828
17829 if (bytes > sizeof (val))
17830 {
17831 error (_("corrupt numeric name field: too many bytes in the value: %x\n"),
17832 bytes);
17833 bytes = sizeof (val);
17834 }
17835 /* We do not bother to warn if bytes == 0 as this can
17836 happen with some early versions of the gcc plugin. */
17837
17838 while (bytes --)
17839 {
17840 unsigned long byte = (* name ++) & 0xff;
17841
17842 val |= byte << shift;
17843 shift += 8;
17844 }
17845
17846 switch (name_attribute)
17847 {
17848 case GNU_BUILD_ATTRIBUTE_PIC:
17849 switch (val)
17850 {
17851 case 0: decoded = "static"; break;
17852 case 1: decoded = "pic"; break;
17853 case 2: decoded = "PIC"; break;
17854 case 3: decoded = "pie"; break;
17855 case 4: decoded = "PIE"; break;
17856 default: break;
17857 }
17858 break;
17859 case GNU_BUILD_ATTRIBUTE_STACK_PROT:
17860 switch (val)
17861 {
17862 /* Based upon the SPCT_FLAG_xxx enum values in gcc/cfgexpand.c. */
17863 case 0: decoded = "off"; break;
17864 case 1: decoded = "on"; break;
17865 case 2: decoded = "all"; break;
17866 case 3: decoded = "strong"; break;
17867 case 4: decoded = "explicit"; break;
17868 default: break;
17869 }
17870 break;
17871 default:
17872 break;
17873 }
17874
17875 if (decoded != NULL)
17876 {
17877 print_symbol (-left, decoded);
17878 left = 0;
17879 }
17880 else if (val == 0)
17881 {
17882 printf ("0x0");
17883 left -= 3;
17884 }
17885 else
17886 {
17887 if (do_wide)
17888 left -= printf ("0x%llx", val);
17889 else
17890 left -= printf ("0x%-.*llx", left, val);
17891 }
17892 }
17893 break;
17894 case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
17895 left -= print_symbol (- left, name);
17896 break;
17897 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
17898 left -= print_symbol (- left, "true");
17899 break;
17900 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
17901 left -= print_symbol (- left, "false");
17902 break;
17903 }
17904
17905 if (do_wide && left > 0)
17906 printf ("%-*s", left, " ");
17907
17908 return TRUE;
17909 }
17910
17911 /* Note that by the ELF standard, the name field is already null byte
17912 terminated, and namesz includes the terminating null byte.
17913 I.E. the value of namesz for the name "FSF" is 4.
17914
17915 If the value of namesz is zero, there is no name present. */
17916
17917 static bfd_boolean
17918 process_note (Elf_Internal_Note * pnote,
17919 Filedata * filedata)
17920 {
17921 const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
17922 const char * nt;
17923
17924 if (pnote->namesz == 0)
17925 /* If there is no note name, then use the default set of
17926 note type strings. */
17927 nt = get_note_type (filedata, pnote->type);
17928
17929 else if (const_strneq (pnote->namedata, "GNU"))
17930 /* GNU-specific object file notes. */
17931 nt = get_gnu_elf_note_type (pnote->type);
17932
17933 else if (const_strneq (pnote->namedata, "FreeBSD"))
17934 /* FreeBSD-specific core file notes. */
17935 nt = get_freebsd_elfcore_note_type (filedata, pnote->type);
17936
17937 else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
17938 /* NetBSD-specific core file notes. */
17939 nt = get_netbsd_elfcore_note_type (filedata, pnote->type);
17940
17941 else if (const_strneq (pnote->namedata, "NetBSD"))
17942 /* NetBSD-specific core file notes. */
17943 return process_netbsd_elf_note (pnote);
17944
17945 else if (strneq (pnote->namedata, "SPU/", 4))
17946 {
17947 /* SPU-specific core file notes. */
17948 nt = pnote->namedata + 4;
17949 name = "SPU";
17950 }
17951
17952 else if (const_strneq (pnote->namedata, "IPF/VMS"))
17953 /* VMS/ia64-specific file notes. */
17954 nt = get_ia64_vms_note_type (pnote->type);
17955
17956 else if (const_strneq (pnote->namedata, "stapsdt"))
17957 nt = get_stapsdt_note_type (pnote->type);
17958
17959 else
17960 /* Don't recognize this note name; just use the default set of
17961 note type strings. */
17962 nt = get_note_type (filedata, pnote->type);
17963
17964 printf (" ");
17965
17966 if (((const_strneq (pnote->namedata, "GA")
17967 && strchr ("*$!+", pnote->namedata[2]) != NULL)
17968 || strchr ("*$!+", pnote->namedata[0]) != NULL)
17969 && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
17970 || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
17971 print_gnu_build_attribute_name (pnote);
17972 else
17973 print_symbol (-20, name);
17974
17975 if (do_wide)
17976 printf (" 0x%08lx\t%s\t", pnote->descsz, nt);
17977 else
17978 printf (" 0x%08lx\t%s\n", pnote->descsz, nt);
17979
17980 if (const_strneq (pnote->namedata, "IPF/VMS"))
17981 return print_ia64_vms_note (pnote);
17982 else if (const_strneq (pnote->namedata, "GNU"))
17983 return print_gnu_note (filedata, pnote);
17984 else if (const_strneq (pnote->namedata, "stapsdt"))
17985 return print_stapsdt_note (pnote);
17986 else if (const_strneq (pnote->namedata, "CORE"))
17987 return print_core_note (pnote);
17988 else if (((const_strneq (pnote->namedata, "GA")
17989 && strchr ("*$!+", pnote->namedata[2]) != NULL)
17990 || strchr ("*$!+", pnote->namedata[0]) != NULL)
17991 && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
17992 || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
17993 return print_gnu_build_attribute_description (pnote, filedata);
17994
17995 if (pnote->descsz)
17996 {
17997 unsigned long i;
17998
17999 printf (_(" description data: "));
18000 for (i = 0; i < pnote->descsz; i++)
18001 printf ("%02x ", pnote->descdata[i]);
18002 if (!do_wide)
18003 printf ("\n");
18004 }
18005
18006 if (do_wide)
18007 printf ("\n");
18008
18009 return TRUE;
18010 }
18011
18012 static bfd_boolean
18013 process_notes_at (Filedata * filedata,
18014 Elf_Internal_Shdr * section,
18015 bfd_vma offset,
18016 bfd_vma length,
18017 bfd_vma align)
18018 {
18019 Elf_External_Note * pnotes;
18020 Elf_External_Note * external;
18021 char * end;
18022 bfd_boolean res = TRUE;
18023
18024 if (length <= 0)
18025 return FALSE;
18026
18027 if (section)
18028 {
18029 pnotes = (Elf_External_Note *) get_section_contents (section, filedata);
18030 if (pnotes)
18031 {
18032 if (! apply_relocations (filedata, section, (unsigned char *) pnotes, length, NULL, NULL))
18033 return FALSE;
18034 }
18035 }
18036 else
18037 pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
18038 _("notes"));
18039
18040 if (pnotes == NULL)
18041 return FALSE;
18042
18043 external = pnotes;
18044
18045 if (section)
18046 printf (_("\nDisplaying notes found in: %s\n"), printable_section_name (filedata, section));
18047 else
18048 printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
18049 (unsigned long) offset, (unsigned long) length);
18050
18051 /* NB: Some note sections may have alignment value of 0 or 1. gABI
18052 specifies that notes should be aligned to 4 bytes in 32-bit
18053 objects and to 8 bytes in 64-bit objects. As a Linux extension,
18054 we also support 4 byte alignment in 64-bit objects. If section
18055 alignment is less than 4, we treate alignment as 4 bytes. */
18056 if (align < 4)
18057 align = 4;
18058 else if (align != 4 && align != 8)
18059 {
18060 warn (_("Corrupt note: alignment %ld, expecting 4 or 8\n"),
18061 (long) align);
18062 return FALSE;
18063 }
18064
18065 printf (_(" %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
18066
18067 end = (char *) pnotes + length;
18068 while ((char *) external < end)
18069 {
18070 Elf_Internal_Note inote;
18071 size_t min_notesz;
18072 char * next;
18073 char * temp = NULL;
18074 size_t data_remaining = end - (char *) external;
18075
18076 if (!is_ia64_vms (filedata))
18077 {
18078 /* PR binutils/15191
18079 Make sure that there is enough data to read. */
18080 min_notesz = offsetof (Elf_External_Note, name);
18081 if (data_remaining < min_notesz)
18082 {
18083 warn (ngettext ("Corrupt note: only %ld byte remains, "
18084 "not enough for a full note\n",
18085 "Corrupt note: only %ld bytes remain, "
18086 "not enough for a full note\n",
18087 data_remaining),
18088 (long) data_remaining);
18089 break;
18090 }
18091 data_remaining -= min_notesz;
18092
18093 inote.type = BYTE_GET (external->type);
18094 inote.namesz = BYTE_GET (external->namesz);
18095 inote.namedata = external->name;
18096 inote.descsz = BYTE_GET (external->descsz);
18097 inote.descdata = ((char *) external
18098 + ELF_NOTE_DESC_OFFSET (inote.namesz, align));
18099 inote.descpos = offset + (inote.descdata - (char *) pnotes);
18100 next = ((char *) external
18101 + ELF_NOTE_NEXT_OFFSET (inote.namesz, inote.descsz, align));
18102 }
18103 else
18104 {
18105 Elf64_External_VMS_Note *vms_external;
18106
18107 /* PR binutils/15191
18108 Make sure that there is enough data to read. */
18109 min_notesz = offsetof (Elf64_External_VMS_Note, name);
18110 if (data_remaining < min_notesz)
18111 {
18112 warn (ngettext ("Corrupt note: only %ld byte remains, "
18113 "not enough for a full note\n",
18114 "Corrupt note: only %ld bytes remain, "
18115 "not enough for a full note\n",
18116 data_remaining),
18117 (long) data_remaining);
18118 break;
18119 }
18120 data_remaining -= min_notesz;
18121
18122 vms_external = (Elf64_External_VMS_Note *) external;
18123 inote.type = BYTE_GET (vms_external->type);
18124 inote.namesz = BYTE_GET (vms_external->namesz);
18125 inote.namedata = vms_external->name;
18126 inote.descsz = BYTE_GET (vms_external->descsz);
18127 inote.descdata = inote.namedata + align_power (inote.namesz, 3);
18128 inote.descpos = offset + (inote.descdata - (char *) pnotes);
18129 next = inote.descdata + align_power (inote.descsz, 3);
18130 }
18131
18132 /* PR 17531: file: 3443835e. */
18133 /* PR 17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4. */
18134 if ((size_t) (inote.descdata - inote.namedata) < inote.namesz
18135 || (size_t) (inote.descdata - inote.namedata) > data_remaining
18136 || (size_t) (next - inote.descdata) < inote.descsz
18137 || ((size_t) (next - inote.descdata)
18138 > data_remaining - (size_t) (inote.descdata - inote.namedata)))
18139 {
18140 warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
18141 (unsigned long) ((char *) external - (char *) pnotes));
18142 warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx, alignment: %u\n"),
18143 inote.type, inote.namesz, inote.descsz, (int) align);
18144 break;
18145 }
18146
18147 external = (Elf_External_Note *) next;
18148
18149 /* Verify that name is null terminated. It appears that at least
18150 one version of Linux (RedHat 6.0) generates corefiles that don't
18151 comply with the ELF spec by failing to include the null byte in
18152 namesz. */
18153 if (inote.namedata[inote.namesz - 1] != '\0')
18154 {
18155 if ((size_t) (inote.descdata - inote.namedata) == inote.namesz)
18156 {
18157 temp = (char *) malloc (inote.namesz + 1);
18158 if (temp == NULL)
18159 {
18160 error (_("Out of memory allocating space for inote name\n"));
18161 res = FALSE;
18162 break;
18163 }
18164
18165 memcpy (temp, inote.namedata, inote.namesz);
18166 inote.namedata = temp;
18167 }
18168 inote.namedata[inote.namesz] = 0;
18169 }
18170
18171 if (! process_note (& inote, filedata))
18172 res = FALSE;
18173
18174 if (temp != NULL)
18175 {
18176 free (temp);
18177 temp = NULL;
18178 }
18179 }
18180
18181 free (pnotes);
18182
18183 return res;
18184 }
18185
18186 static bfd_boolean
18187 process_corefile_note_segments (Filedata * filedata)
18188 {
18189 Elf_Internal_Phdr * segment;
18190 unsigned int i;
18191 bfd_boolean res = TRUE;
18192
18193 if (! get_program_headers (filedata))
18194 return TRUE;
18195
18196 for (i = 0, segment = filedata->program_headers;
18197 i < filedata->file_header.e_phnum;
18198 i++, segment++)
18199 {
18200 if (segment->p_type == PT_NOTE)
18201 if (! process_notes_at (filedata, NULL,
18202 (bfd_vma) segment->p_offset,
18203 (bfd_vma) segment->p_filesz,
18204 (bfd_vma) segment->p_align))
18205 res = FALSE;
18206 }
18207
18208 return res;
18209 }
18210
18211 static bfd_boolean
18212 process_v850_notes (Filedata * filedata, bfd_vma offset, bfd_vma length)
18213 {
18214 Elf_External_Note * pnotes;
18215 Elf_External_Note * external;
18216 char * end;
18217 bfd_boolean res = TRUE;
18218
18219 if (length <= 0)
18220 return FALSE;
18221
18222 pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
18223 _("v850 notes"));
18224 if (pnotes == NULL)
18225 return FALSE;
18226
18227 external = pnotes;
18228 end = (char*) pnotes + length;
18229
18230 printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
18231 (unsigned long) offset, (unsigned long) length);
18232
18233 while ((char *) external + sizeof (Elf_External_Note) < end)
18234 {
18235 Elf_External_Note * next;
18236 Elf_Internal_Note inote;
18237
18238 inote.type = BYTE_GET (external->type);
18239 inote.namesz = BYTE_GET (external->namesz);
18240 inote.namedata = external->name;
18241 inote.descsz = BYTE_GET (external->descsz);
18242 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
18243 inote.descpos = offset + (inote.descdata - (char *) pnotes);
18244
18245 if (inote.descdata < (char *) pnotes || inote.descdata >= end)
18246 {
18247 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
18248 inote.descdata = inote.namedata;
18249 inote.namesz = 0;
18250 }
18251
18252 next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
18253
18254 if ( ((char *) next > end)
18255 || ((char *) next < (char *) pnotes))
18256 {
18257 warn (_("corrupt descsz found in note at offset 0x%lx\n"),
18258 (unsigned long) ((char *) external - (char *) pnotes));
18259 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
18260 inote.type, inote.namesz, inote.descsz);
18261 break;
18262 }
18263
18264 external = next;
18265
18266 /* Prevent out-of-bounds indexing. */
18267 if ( inote.namedata + inote.namesz > end
18268 || inote.namedata + inote.namesz < inote.namedata)
18269 {
18270 warn (_("corrupt namesz found in note at offset 0x%lx\n"),
18271 (unsigned long) ((char *) external - (char *) pnotes));
18272 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
18273 inote.type, inote.namesz, inote.descsz);
18274 break;
18275 }
18276
18277 printf (" %s: ", get_v850_elf_note_type (inote.type));
18278
18279 if (! print_v850_note (& inote))
18280 {
18281 res = FALSE;
18282 printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
18283 inote.namesz, inote.descsz);
18284 }
18285 }
18286
18287 free (pnotes);
18288
18289 return res;
18290 }
18291
18292 static bfd_boolean
18293 process_note_sections (Filedata * filedata)
18294 {
18295 Elf_Internal_Shdr * section;
18296 unsigned long i;
18297 unsigned int n = 0;
18298 bfd_boolean res = TRUE;
18299
18300 for (i = 0, section = filedata->section_headers;
18301 i < filedata->file_header.e_shnum && section != NULL;
18302 i++, section++)
18303 {
18304 if (section->sh_type == SHT_NOTE)
18305 {
18306 if (! process_notes_at (filedata, section,
18307 (bfd_vma) section->sh_offset,
18308 (bfd_vma) section->sh_size,
18309 (bfd_vma) section->sh_addralign))
18310 res = FALSE;
18311 n++;
18312 }
18313
18314 if (( filedata->file_header.e_machine == EM_V800
18315 || filedata->file_header.e_machine == EM_V850
18316 || filedata->file_header.e_machine == EM_CYGNUS_V850)
18317 && section->sh_type == SHT_RENESAS_INFO)
18318 {
18319 if (! process_v850_notes (filedata,
18320 (bfd_vma) section->sh_offset,
18321 (bfd_vma) section->sh_size))
18322 res = FALSE;
18323 n++;
18324 }
18325 }
18326
18327 if (n == 0)
18328 /* Try processing NOTE segments instead. */
18329 return process_corefile_note_segments (filedata);
18330
18331 return res;
18332 }
18333
18334 static bfd_boolean
18335 process_notes (Filedata * filedata)
18336 {
18337 /* If we have not been asked to display the notes then do nothing. */
18338 if (! do_notes)
18339 return TRUE;
18340
18341 if (filedata->file_header.e_type != ET_CORE)
18342 return process_note_sections (filedata);
18343
18344 /* No program headers means no NOTE segment. */
18345 if (filedata->file_header.e_phnum > 0)
18346 return process_corefile_note_segments (filedata);
18347
18348 printf (_("No note segments present in the core file.\n"));
18349 return TRUE;
18350 }
18351
18352 static unsigned char *
18353 display_public_gnu_attributes (unsigned char * start,
18354 const unsigned char * const end)
18355 {
18356 printf (_(" Unknown GNU attribute: %s\n"), start);
18357
18358 start += strnlen ((char *) start, end - start);
18359 display_raw_attribute (start, end);
18360
18361 return (unsigned char *) end;
18362 }
18363
18364 static unsigned char *
18365 display_generic_attribute (unsigned char * start,
18366 unsigned int tag,
18367 const unsigned char * const end)
18368 {
18369 if (tag == 0)
18370 return (unsigned char *) end;
18371
18372 return display_tag_value (tag, start, end);
18373 }
18374
18375 static bfd_boolean
18376 process_arch_specific (Filedata * filedata)
18377 {
18378 if (! do_arch)
18379 return TRUE;
18380
18381 switch (filedata->file_header.e_machine)
18382 {
18383 case EM_ARC:
18384 case EM_ARC_COMPACT:
18385 case EM_ARC_COMPACT2:
18386 return process_attributes (filedata, "ARC", SHT_ARC_ATTRIBUTES,
18387 display_arc_attribute,
18388 display_generic_attribute);
18389 case EM_ARM:
18390 return process_attributes (filedata, "aeabi", SHT_ARM_ATTRIBUTES,
18391 display_arm_attribute,
18392 display_generic_attribute);
18393
18394 case EM_MIPS:
18395 case EM_MIPS_RS3_LE:
18396 return process_mips_specific (filedata);
18397
18398 case EM_MSP430:
18399 return process_attributes (filedata, "mspabi", SHT_MSP430_ATTRIBUTES,
18400 display_msp430x_attribute,
18401 display_generic_attribute);
18402
18403 case EM_NDS32:
18404 return process_nds32_specific (filedata);
18405
18406 case EM_PPC:
18407 case EM_PPC64:
18408 return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
18409 display_power_gnu_attribute);
18410
18411 case EM_S390:
18412 case EM_S390_OLD:
18413 return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
18414 display_s390_gnu_attribute);
18415
18416 case EM_SPARC:
18417 case EM_SPARC32PLUS:
18418 case EM_SPARCV9:
18419 return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
18420 display_sparc_gnu_attribute);
18421
18422 case EM_TI_C6000:
18423 return process_attributes (filedata, "c6xabi", SHT_C6000_ATTRIBUTES,
18424 display_tic6x_attribute,
18425 display_generic_attribute);
18426
18427 default:
18428 return process_attributes (filedata, "gnu", SHT_GNU_ATTRIBUTES,
18429 display_public_gnu_attributes,
18430 display_generic_attribute);
18431 }
18432 }
18433
18434 static bfd_boolean
18435 get_file_header (Filedata * filedata)
18436 {
18437 /* Read in the identity array. */
18438 if (fread (filedata->file_header.e_ident, EI_NIDENT, 1, filedata->handle) != 1)
18439 return FALSE;
18440
18441 /* Determine how to read the rest of the header. */
18442 switch (filedata->file_header.e_ident[EI_DATA])
18443 {
18444 default:
18445 case ELFDATANONE:
18446 case ELFDATA2LSB:
18447 byte_get = byte_get_little_endian;
18448 byte_put = byte_put_little_endian;
18449 break;
18450 case ELFDATA2MSB:
18451 byte_get = byte_get_big_endian;
18452 byte_put = byte_put_big_endian;
18453 break;
18454 }
18455
18456 /* For now we only support 32 bit and 64 bit ELF files. */
18457 is_32bit_elf = (filedata->file_header.e_ident[EI_CLASS] != ELFCLASS64);
18458
18459 /* Read in the rest of the header. */
18460 if (is_32bit_elf)
18461 {
18462 Elf32_External_Ehdr ehdr32;
18463
18464 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, filedata->handle) != 1)
18465 return FALSE;
18466
18467 filedata->file_header.e_type = BYTE_GET (ehdr32.e_type);
18468 filedata->file_header.e_machine = BYTE_GET (ehdr32.e_machine);
18469 filedata->file_header.e_version = BYTE_GET (ehdr32.e_version);
18470 filedata->file_header.e_entry = BYTE_GET (ehdr32.e_entry);
18471 filedata->file_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
18472 filedata->file_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
18473 filedata->file_header.e_flags = BYTE_GET (ehdr32.e_flags);
18474 filedata->file_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
18475 filedata->file_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
18476 filedata->file_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
18477 filedata->file_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
18478 filedata->file_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
18479 filedata->file_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
18480 }
18481 else
18482 {
18483 Elf64_External_Ehdr ehdr64;
18484
18485 /* If we have been compiled with sizeof (bfd_vma) == 4, then
18486 we will not be able to cope with the 64bit data found in
18487 64 ELF files. Detect this now and abort before we start
18488 overwriting things. */
18489 if (sizeof (bfd_vma) < 8)
18490 {
18491 error (_("This instance of readelf has been built without support for a\n\
18492 64 bit data type and so it cannot read 64 bit ELF files.\n"));
18493 return FALSE;
18494 }
18495
18496 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, filedata->handle) != 1)
18497 return FALSE;
18498
18499 filedata->file_header.e_type = BYTE_GET (ehdr64.e_type);
18500 filedata->file_header.e_machine = BYTE_GET (ehdr64.e_machine);
18501 filedata->file_header.e_version = BYTE_GET (ehdr64.e_version);
18502 filedata->file_header.e_entry = BYTE_GET (ehdr64.e_entry);
18503 filedata->file_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
18504 filedata->file_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
18505 filedata->file_header.e_flags = BYTE_GET (ehdr64.e_flags);
18506 filedata->file_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
18507 filedata->file_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
18508 filedata->file_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
18509 filedata->file_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
18510 filedata->file_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
18511 filedata->file_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
18512 }
18513
18514 if (filedata->file_header.e_shoff)
18515 {
18516 /* There may be some extensions in the first section header. Don't
18517 bomb if we can't read it. */
18518 if (is_32bit_elf)
18519 get_32bit_section_headers (filedata, TRUE);
18520 else
18521 get_64bit_section_headers (filedata, TRUE);
18522 }
18523
18524 return TRUE;
18525 }
18526
18527 static void
18528 close_file (Filedata * filedata)
18529 {
18530 if (filedata)
18531 {
18532 if (filedata->handle)
18533 fclose (filedata->handle);
18534 free (filedata);
18535 }
18536 }
18537
18538 void
18539 close_debug_file (void * data)
18540 {
18541 close_file ((Filedata *) data);
18542 }
18543
18544 static Filedata *
18545 open_file (const char * pathname)
18546 {
18547 struct stat statbuf;
18548 Filedata * filedata = NULL;
18549
18550 if (stat (pathname, & statbuf) < 0
18551 || ! S_ISREG (statbuf.st_mode))
18552 goto fail;
18553
18554 filedata = calloc (1, sizeof * filedata);
18555 if (filedata == NULL)
18556 goto fail;
18557
18558 filedata->handle = fopen (pathname, "rb");
18559 if (filedata->handle == NULL)
18560 goto fail;
18561
18562 filedata->file_size = (bfd_size_type) statbuf.st_size;
18563 filedata->file_name = pathname;
18564
18565 if (! get_file_header (filedata))
18566 goto fail;
18567
18568 if (filedata->file_header.e_shoff)
18569 {
18570 bfd_boolean res;
18571
18572 /* Read the section headers again, this time for real. */
18573 if (is_32bit_elf)
18574 res = get_32bit_section_headers (filedata, FALSE);
18575 else
18576 res = get_64bit_section_headers (filedata, FALSE);
18577
18578 if (!res)
18579 goto fail;
18580 }
18581
18582 return filedata;
18583
18584 fail:
18585 if (filedata)
18586 {
18587 if (filedata->handle)
18588 fclose (filedata->handle);
18589 free (filedata);
18590 }
18591 return NULL;
18592 }
18593
18594 void *
18595 open_debug_file (const char * pathname)
18596 {
18597 return open_file (pathname);
18598 }
18599
18600 /* Process one ELF object file according to the command line options.
18601 This file may actually be stored in an archive. The file is
18602 positioned at the start of the ELF object. Returns TRUE if no
18603 problems were encountered, FALSE otherwise. */
18604
18605 static bfd_boolean
18606 process_object (Filedata * filedata)
18607 {
18608 Filedata * separates;
18609 unsigned int i;
18610 bfd_boolean res = TRUE;
18611
18612 if (! get_file_header (filedata))
18613 {
18614 error (_("%s: Failed to read file header\n"), filedata->file_name);
18615 return FALSE;
18616 }
18617
18618 /* Initialise per file variables. */
18619 for (i = ARRAY_SIZE (version_info); i--;)
18620 version_info[i] = 0;
18621
18622 for (i = ARRAY_SIZE (dynamic_info); i--;)
18623 dynamic_info[i] = 0;
18624 dynamic_info_DT_GNU_HASH = 0;
18625
18626 /* Process the file. */
18627 if (show_name)
18628 printf (_("\nFile: %s\n"), filedata->file_name);
18629
18630 /* Initialise the dump_sects array from the cmdline_dump_sects array.
18631 Note we do this even if cmdline_dump_sects is empty because we
18632 must make sure that the dump_sets array is zeroed out before each
18633 object file is processed. */
18634 if (filedata->num_dump_sects > cmdline.num_dump_sects)
18635 memset (filedata->dump_sects, 0, filedata->num_dump_sects * sizeof (* filedata->dump_sects));
18636
18637 if (cmdline.num_dump_sects > 0)
18638 {
18639 if (filedata->num_dump_sects == 0)
18640 /* A sneaky way of allocating the dump_sects array. */
18641 request_dump_bynumber (filedata, cmdline.num_dump_sects, 0);
18642
18643 assert (filedata->num_dump_sects >= cmdline.num_dump_sects);
18644 memcpy (filedata->dump_sects, cmdline.dump_sects,
18645 cmdline.num_dump_sects * sizeof (* filedata->dump_sects));
18646 }
18647
18648 if (! process_file_header (filedata))
18649 return FALSE;
18650
18651 if (! process_section_headers (filedata))
18652 {
18653 /* Without loaded section headers we cannot process lots of things. */
18654 do_unwind = do_version = do_dump = do_arch = FALSE;
18655
18656 if (! do_using_dynamic)
18657 do_syms = do_dyn_syms = do_reloc = FALSE;
18658 }
18659
18660 if (! process_section_groups (filedata))
18661 /* Without loaded section groups we cannot process unwind. */
18662 do_unwind = FALSE;
18663
18664 if (process_program_headers (filedata))
18665 process_dynamic_section (filedata);
18666 else
18667 res = FALSE;
18668
18669 if (! process_relocs (filedata))
18670 res = FALSE;
18671
18672 if (! process_unwind (filedata))
18673 res = FALSE;
18674
18675 if (! process_symbol_table (filedata))
18676 res = FALSE;
18677
18678 if (! process_syminfo (filedata))
18679 res = FALSE;
18680
18681 if (! process_version_sections (filedata))
18682 res = FALSE;
18683
18684 if (filedata->file_header.e_shstrndx != SHN_UNDEF)
18685 separates = load_separate_debug_file (filedata, filedata->file_name);
18686 else
18687 separates = NULL;
18688
18689 if (! process_section_contents (filedata))
18690 res = FALSE;
18691
18692 if (separates)
18693 {
18694 if (! process_section_headers (separates))
18695 res = FALSE;
18696 else if (! process_section_contents (separates))
18697 res = FALSE;
18698 }
18699
18700 if (! process_notes (filedata))
18701 res = FALSE;
18702
18703 if (! process_gnu_liblist (filedata))
18704 res = FALSE;
18705
18706 if (! process_arch_specific (filedata))
18707 res = FALSE;
18708
18709 free (filedata->program_headers);
18710 filedata->program_headers = NULL;
18711
18712 free (filedata->section_headers);
18713 filedata->section_headers = NULL;
18714
18715 free (filedata->string_table);
18716 filedata->string_table = NULL;
18717 filedata->string_table_length = 0;
18718
18719 if (dynamic_strings)
18720 {
18721 free (dynamic_strings);
18722 dynamic_strings = NULL;
18723 dynamic_strings_length = 0;
18724 }
18725
18726 if (dynamic_symbols)
18727 {
18728 free (dynamic_symbols);
18729 dynamic_symbols = NULL;
18730 num_dynamic_syms = 0;
18731 }
18732
18733 if (dynamic_syminfo)
18734 {
18735 free (dynamic_syminfo);
18736 dynamic_syminfo = NULL;
18737 }
18738
18739 if (dynamic_section)
18740 {
18741 free (dynamic_section);
18742 dynamic_section = NULL;
18743 }
18744
18745 if (section_headers_groups)
18746 {
18747 free (section_headers_groups);
18748 section_headers_groups = NULL;
18749 }
18750
18751 if (section_groups)
18752 {
18753 struct group_list * g;
18754 struct group_list * next;
18755
18756 for (i = 0; i < group_count; i++)
18757 {
18758 for (g = section_groups [i].root; g != NULL; g = next)
18759 {
18760 next = g->next;
18761 free (g);
18762 }
18763 }
18764
18765 free (section_groups);
18766 section_groups = NULL;
18767 }
18768
18769 free_debug_memory ();
18770
18771 return res;
18772 }
18773
18774 /* Process an ELF archive.
18775 On entry the file is positioned just after the ARMAG string.
18776 Returns TRUE upon success, FALSE otherwise. */
18777
18778 static bfd_boolean
18779 process_archive (Filedata * filedata, bfd_boolean is_thin_archive)
18780 {
18781 struct archive_info arch;
18782 struct archive_info nested_arch;
18783 size_t got;
18784 bfd_boolean ret = TRUE;
18785
18786 show_name = TRUE;
18787
18788 /* The ARCH structure is used to hold information about this archive. */
18789 arch.file_name = NULL;
18790 arch.file = NULL;
18791 arch.index_array = NULL;
18792 arch.sym_table = NULL;
18793 arch.longnames = NULL;
18794
18795 /* The NESTED_ARCH structure is used as a single-item cache of information
18796 about a nested archive (when members of a thin archive reside within
18797 another regular archive file). */
18798 nested_arch.file_name = NULL;
18799 nested_arch.file = NULL;
18800 nested_arch.index_array = NULL;
18801 nested_arch.sym_table = NULL;
18802 nested_arch.longnames = NULL;
18803
18804 if (setup_archive (&arch, filedata->file_name, filedata->handle,
18805 is_thin_archive, do_archive_index) != 0)
18806 {
18807 ret = FALSE;
18808 goto out;
18809 }
18810
18811 if (do_archive_index)
18812 {
18813 if (arch.sym_table == NULL)
18814 error (_("%s: unable to dump the index as none was found\n"), filedata->file_name);
18815 else
18816 {
18817 unsigned long i, l;
18818 unsigned long current_pos;
18819
18820 printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
18821 filedata->file_name, (unsigned long) arch.index_num, arch.sym_size);
18822
18823 current_pos = ftell (filedata->handle);
18824
18825 for (i = l = 0; i < arch.index_num; i++)
18826 {
18827 if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
18828 {
18829 char * member_name;
18830
18831 member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
18832
18833 if (member_name != NULL)
18834 {
18835 char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
18836
18837 if (qualified_name != NULL)
18838 {
18839 printf (_("Contents of binary %s at offset "), qualified_name);
18840 (void) print_vma (arch.index_array[i], PREFIX_HEX);
18841 putchar ('\n');
18842 free (qualified_name);
18843 }
18844 }
18845 }
18846
18847 if (l >= arch.sym_size)
18848 {
18849 error (_("%s: end of the symbol table reached before the end of the index\n"),
18850 filedata->file_name);
18851 ret = FALSE;
18852 break;
18853 }
18854 /* PR 17531: file: 0b6630b2. */
18855 printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
18856 l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
18857 }
18858
18859 if (arch.uses_64bit_indicies)
18860 l = (l + 7) & ~ 7;
18861 else
18862 l += l & 1;
18863
18864 if (l < arch.sym_size)
18865 {
18866 error (ngettext ("%s: %ld byte remains in the symbol table, "
18867 "but without corresponding entries in "
18868 "the index table\n",
18869 "%s: %ld bytes remain in the symbol table, "
18870 "but without corresponding entries in "
18871 "the index table\n",
18872 arch.sym_size - l),
18873 filedata->file_name, arch.sym_size - l);
18874 ret = FALSE;
18875 }
18876
18877 if (fseek (filedata->handle, current_pos, SEEK_SET) != 0)
18878 {
18879 error (_("%s: failed to seek back to start of object files in the archive\n"),
18880 filedata->file_name);
18881 ret = FALSE;
18882 goto out;
18883 }
18884 }
18885
18886 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
18887 && !do_segments && !do_header && !do_dump && !do_version
18888 && !do_histogram && !do_debugging && !do_arch && !do_notes
18889 && !do_section_groups && !do_dyn_syms)
18890 {
18891 ret = TRUE; /* Archive index only. */
18892 goto out;
18893 }
18894 }
18895
18896 while (1)
18897 {
18898 char * name;
18899 size_t namelen;
18900 char * qualified_name;
18901
18902 /* Read the next archive header. */
18903 if (fseek (filedata->handle, arch.next_arhdr_offset, SEEK_SET) != 0)
18904 {
18905 error (_("%s: failed to seek to next archive header\n"), filedata->file_name);
18906 return FALSE;
18907 }
18908 got = fread (&arch.arhdr, 1, sizeof arch.arhdr, filedata->handle);
18909 if (got != sizeof arch.arhdr)
18910 {
18911 if (got == 0)
18912 break;
18913 error (_("%s: failed to read archive header\n"), filedata->file_name);
18914 ret = FALSE;
18915 break;
18916 }
18917 if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
18918 {
18919 error (_("%s: did not find a valid archive header\n"), arch.file_name);
18920 ret = FALSE;
18921 break;
18922 }
18923
18924 arch.next_arhdr_offset += sizeof arch.arhdr;
18925
18926 archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
18927 if (archive_file_size & 01)
18928 ++archive_file_size;
18929
18930 name = get_archive_member_name (&arch, &nested_arch);
18931 if (name == NULL)
18932 {
18933 error (_("%s: bad archive file name\n"), filedata->file_name);
18934 ret = FALSE;
18935 break;
18936 }
18937 namelen = strlen (name);
18938
18939 qualified_name = make_qualified_name (&arch, &nested_arch, name);
18940 if (qualified_name == NULL)
18941 {
18942 error (_("%s: bad archive file name\n"), filedata->file_name);
18943 ret = FALSE;
18944 break;
18945 }
18946
18947 if (is_thin_archive && arch.nested_member_origin == 0)
18948 {
18949 /* This is a proxy for an external member of a thin archive. */
18950 Filedata * member_filedata;
18951 char * member_file_name = adjust_relative_path
18952 (filedata->file_name, name, namelen);
18953
18954 if (member_file_name == NULL)
18955 {
18956 ret = FALSE;
18957 break;
18958 }
18959
18960 member_filedata = open_file (member_file_name);
18961 if (member_filedata == NULL)
18962 {
18963 error (_("Input file '%s' is not readable.\n"), member_file_name);
18964 free (member_file_name);
18965 ret = FALSE;
18966 break;
18967 }
18968
18969 archive_file_offset = arch.nested_member_origin;
18970 member_filedata->file_name = qualified_name;
18971
18972 if (! process_object (member_filedata))
18973 ret = FALSE;
18974
18975 close_file (member_filedata);
18976 free (member_file_name);
18977 }
18978 else if (is_thin_archive)
18979 {
18980 Filedata thin_filedata;
18981
18982 memset (&thin_filedata, 0, sizeof (thin_filedata));
18983
18984 /* PR 15140: Allow for corrupt thin archives. */
18985 if (nested_arch.file == NULL)
18986 {
18987 error (_("%s: contains corrupt thin archive: %s\n"),
18988 filedata->file_name, name);
18989 ret = FALSE;
18990 break;
18991 }
18992
18993 /* This is a proxy for a member of a nested archive. */
18994 archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
18995
18996 /* The nested archive file will have been opened and setup by
18997 get_archive_member_name. */
18998 if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
18999 {
19000 error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
19001 ret = FALSE;
19002 break;
19003 }
19004
19005 thin_filedata.handle = nested_arch.file;
19006 thin_filedata.file_name = qualified_name;
19007
19008 if (! process_object (& thin_filedata))
19009 ret = FALSE;
19010 }
19011 else
19012 {
19013 archive_file_offset = arch.next_arhdr_offset;
19014 arch.next_arhdr_offset += archive_file_size;
19015
19016 filedata->file_name = qualified_name;
19017 if (! process_object (filedata))
19018 ret = FALSE;
19019 }
19020
19021 if (filedata->dump_sects != NULL)
19022 {
19023 free (filedata->dump_sects);
19024 filedata->dump_sects = NULL;
19025 filedata->num_dump_sects = 0;
19026 }
19027
19028 free (qualified_name);
19029 }
19030
19031 out:
19032 if (nested_arch.file != NULL)
19033 fclose (nested_arch.file);
19034 release_archive (&nested_arch);
19035 release_archive (&arch);
19036
19037 return ret;
19038 }
19039
19040 static bfd_boolean
19041 process_file (char * file_name)
19042 {
19043 Filedata * filedata = NULL;
19044 struct stat statbuf;
19045 char armag[SARMAG];
19046 bfd_boolean ret = TRUE;
19047
19048 if (stat (file_name, &statbuf) < 0)
19049 {
19050 if (errno == ENOENT)
19051 error (_("'%s': No such file\n"), file_name);
19052 else
19053 error (_("Could not locate '%s'. System error message: %s\n"),
19054 file_name, strerror (errno));
19055 return FALSE;
19056 }
19057
19058 if (! S_ISREG (statbuf.st_mode))
19059 {
19060 error (_("'%s' is not an ordinary file\n"), file_name);
19061 return FALSE;
19062 }
19063
19064 filedata = calloc (1, sizeof * filedata);
19065 if (filedata == NULL)
19066 {
19067 error (_("Out of memory allocating file data structure\n"));
19068 return FALSE;
19069 }
19070
19071 filedata->file_name = file_name;
19072 filedata->handle = fopen (file_name, "rb");
19073 if (filedata->handle == NULL)
19074 {
19075 error (_("Input file '%s' is not readable.\n"), file_name);
19076 free (filedata);
19077 return FALSE;
19078 }
19079
19080 if (fread (armag, SARMAG, 1, filedata->handle) != 1)
19081 {
19082 error (_("%s: Failed to read file's magic number\n"), file_name);
19083 fclose (filedata->handle);
19084 free (filedata);
19085 return FALSE;
19086 }
19087
19088 filedata->file_size = (bfd_size_type) statbuf.st_size;
19089
19090 if (memcmp (armag, ARMAG, SARMAG) == 0)
19091 {
19092 if (! process_archive (filedata, FALSE))
19093 ret = FALSE;
19094 }
19095 else if (memcmp (armag, ARMAGT, SARMAG) == 0)
19096 {
19097 if ( ! process_archive (filedata, TRUE))
19098 ret = FALSE;
19099 }
19100 else
19101 {
19102 if (do_archive_index)
19103 error (_("File %s is not an archive so its index cannot be displayed.\n"),
19104 file_name);
19105
19106 rewind (filedata->handle);
19107 archive_file_size = archive_file_offset = 0;
19108
19109 if (! process_object (filedata))
19110 ret = FALSE;
19111 }
19112
19113 fclose (filedata->handle);
19114 free (filedata);
19115
19116 return ret;
19117 }
19118
19119 #ifdef SUPPORT_DISASSEMBLY
19120 /* Needed by the i386 disassembler. For extra credit, someone could
19121 fix this so that we insert symbolic addresses here, esp for GOT/PLT
19122 symbols. */
19123
19124 void
19125 print_address (unsigned int addr, FILE * outfile)
19126 {
19127 fprintf (outfile,"0x%8.8x", addr);
19128 }
19129
19130 /* Needed by the i386 disassembler. */
19131
19132 void
19133 db_task_printsym (unsigned int addr)
19134 {
19135 print_address (addr, stderr);
19136 }
19137 #endif
19138
19139 int
19140 main (int argc, char ** argv)
19141 {
19142 int err;
19143
19144 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
19145 setlocale (LC_MESSAGES, "");
19146 #endif
19147 #if defined (HAVE_SETLOCALE)
19148 setlocale (LC_CTYPE, "");
19149 #endif
19150 bindtextdomain (PACKAGE, LOCALEDIR);
19151 textdomain (PACKAGE);
19152
19153 expandargv (&argc, &argv);
19154
19155 cmdline.file_name = "<cmdline>";
19156 parse_args (& cmdline, argc, argv);
19157
19158 if (optind < (argc - 1))
19159 show_name = TRUE;
19160 else if (optind >= argc)
19161 {
19162 warn (_("Nothing to do.\n"));
19163 usage (stderr);
19164 }
19165
19166 err = FALSE;
19167 while (optind < argc)
19168 if (! process_file (argv[optind++]))
19169 err = TRUE;
19170
19171 if (cmdline.dump_sects != NULL)
19172 free (cmdline.dump_sects);
19173
19174 return err ? EXIT_FAILURE : EXIT_SUCCESS;
19175 }