]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - binutils/readelf.c
PR20886, looping in ppc64_elf_size_stubs
[thirdparty/binutils-gdb.git] / binutils / readelf.c
CommitLineData
252b5132 1/* readelf.c -- display contents of an ELF format file
6f2750fe 2 Copyright (C) 1998-2016 Free Software Foundation, Inc.
252b5132
RH
3
4 Originally developed by Eric Youngdale <eric@andante.jic.com>
12ab83a9 5 Modifications by Nick Clifton <nickc@redhat.com>
252b5132
RH
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
32866df7 11 the Free Software Foundation; either version 3 of the License, or
252b5132
RH
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
b43b5d5f
NC
21 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
22 02110-1301, USA. */
252b5132 23\f
9eb20dd8 24/* The difference between readelf and objdump:
252b5132 25
74013231 26 Both programs are capable of displaying the contents of ELF format files,
9eb20dd8 27 so why does the binutils project have two file dumpers ?
0de14b54 28
9eb20dd8
NC
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
3db64b00 43#include "sysdep.h"
252b5132 44#include <assert.h>
252b5132 45#include <time.h>
1b315056 46#include <zlib.h>
3bfcb652 47#ifdef HAVE_WCHAR_H
7bfd842d 48#include <wchar.h>
3bfcb652 49#endif
252b5132 50
a952a375 51#if __GNUC__ >= 2
19936277 52/* Define BFD64 here, even if our default architecture is 32 bit ELF
a952a375 53 as this will allow us to read in and parse 64bit and 32bit ELF files.
b34976b6 54 Only do this if we believe that the compiler can support a 64 bit
a952a375 55 data type. For now we only rely on GCC being able to do this. */
19936277 56#define BFD64
a952a375
NC
57#endif
58
3db64b00
AM
59#include "bfd.h"
60#include "bucomm.h"
3284fe0c 61#include "elfcomm.h"
19e6b90e 62#include "dwarf.h"
252b5132
RH
63
64#include "elf/common.h"
65#include "elf/external.h"
66#include "elf/internal.h"
252b5132 67
4b78141a
NC
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
252b5132
RH
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
a06ea964 92#include "elf/aarch64.h"
252b5132 93#include "elf/alpha.h"
3b16e843 94#include "elf/arc.h"
252b5132 95#include "elf/arm.h"
3b16e843 96#include "elf/avr.h"
1d65ded4 97#include "elf/bfin.h"
60bca95a 98#include "elf/cr16.h"
3b16e843 99#include "elf/cris.h"
1c0d3aa6 100#include "elf/crx.h"
252b5132
RH
101#include "elf/d10v.h"
102#include "elf/d30v.h"
d172d4ba 103#include "elf/dlx.h"
cfb8c092 104#include "elf/epiphany.h"
252b5132 105#include "elf/fr30.h"
5c70f934 106#include "elf/frv.h"
3f8107ab 107#include "elf/ft32.h"
3b16e843
NC
108#include "elf/h8.h"
109#include "elf/hppa.h"
110#include "elf/i386.h"
35b1837e 111#include "elf/i370.h"
3b16e843
NC
112#include "elf/i860.h"
113#include "elf/i960.h"
114#include "elf/ia64.h"
1e4cf259 115#include "elf/ip2k.h"
84e94c90 116#include "elf/lm32.h"
1c0d3aa6 117#include "elf/iq2000.h"
49f58d10 118#include "elf/m32c.h"
3b16e843
NC
119#include "elf/m32r.h"
120#include "elf/m68k.h"
75751cd9 121#include "elf/m68hc11.h"
252b5132 122#include "elf/mcore.h"
15ab5209 123#include "elf/mep.h"
a3c62988 124#include "elf/metag.h"
7ba29e2a 125#include "elf/microblaze.h"
3b16e843 126#include "elf/mips.h"
e23eba97 127#include "elf/riscv.h"
3c3bdf30 128#include "elf/mmix.h"
3b16e843
NC
129#include "elf/mn10200.h"
130#include "elf/mn10300.h"
5506d11a 131#include "elf/moxie.h"
4970f871 132#include "elf/mt.h"
2469cfa2 133#include "elf/msp430.h"
35c08157 134#include "elf/nds32.h"
13761a11 135#include "elf/nios2.h"
73589c9d 136#include "elf/or1k.h"
7d466069 137#include "elf/pj.h"
3b16e843 138#include "elf/ppc.h"
c833c019 139#include "elf/ppc64.h"
99c513f6 140#include "elf/rl78.h"
c7927a3c 141#include "elf/rx.h"
a85d7ed0 142#include "elf/s390.h"
1c0d3aa6 143#include "elf/score.h"
3b16e843
NC
144#include "elf/sh.h"
145#include "elf/sparc.h"
e9f53129 146#include "elf/spu.h"
40b36596 147#include "elf/tic6x.h"
aa137e4d
NC
148#include "elf/tilegx.h"
149#include "elf/tilepro.h"
3b16e843 150#include "elf/v850.h"
179d3252 151#include "elf/vax.h"
619ed720 152#include "elf/visium.h"
3b16e843 153#include "elf/x86-64.h"
c29aca4a 154#include "elf/xc16x.h"
f6c1a2d5 155#include "elf/xgate.h"
93fbbb04 156#include "elf/xstormy16.h"
88da6820 157#include "elf/xtensa.h"
252b5132 158
252b5132 159#include "getopt.h"
566b0d53 160#include "libiberty.h"
09c11c86 161#include "safe-ctype.h"
2cf0635d 162#include "filenames.h"
252b5132 163
15b42fb0
AM
164#ifndef offsetof
165#define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
166#endif
167
6a40cf0c
NC
168typedef struct elf_section_list
169{
170 Elf_Internal_Shdr * hdr;
171 struct elf_section_list * next;
172} elf_section_list;
173
2cf0635d 174char * program_name = "readelf";
c9c1d674 175static unsigned long archive_file_offset;
85b1c36d 176static unsigned long archive_file_size;
f54498b4 177static bfd_size_type current_file_size;
85b1c36d
BE
178static unsigned long dynamic_addr;
179static bfd_size_type dynamic_size;
8b73c356 180static size_t dynamic_nent;
2cf0635d 181static char * dynamic_strings;
85b1c36d 182static unsigned long dynamic_strings_length;
2cf0635d 183static char * string_table;
85b1c36d
BE
184static unsigned long string_table_length;
185static unsigned long num_dynamic_syms;
2cf0635d
NC
186static Elf_Internal_Sym * dynamic_symbols;
187static Elf_Internal_Syminfo * dynamic_syminfo;
85b1c36d
BE
188static unsigned long dynamic_syminfo_offset;
189static unsigned int dynamic_syminfo_nent;
f8eae8b2 190static char program_interpreter[PATH_MAX];
bb8a0291 191static bfd_vma dynamic_info[DT_ENCODING];
fdc90cb4 192static bfd_vma dynamic_info_DT_GNU_HASH;
85b1c36d
BE
193static bfd_vma version_info[16];
194static Elf_Internal_Ehdr elf_header;
2cf0635d
NC
195static Elf_Internal_Shdr * section_headers;
196static Elf_Internal_Phdr * program_headers;
197static Elf_Internal_Dyn * dynamic_section;
6a40cf0c 198static elf_section_list * symtab_shndx_list;
85b1c36d
BE
199static int show_name;
200static int do_dynamic;
201static int do_syms;
2c610e4b 202static int do_dyn_syms;
85b1c36d
BE
203static int do_reloc;
204static int do_sections;
205static int do_section_groups;
5477e8a0 206static int do_section_details;
85b1c36d
BE
207static int do_segments;
208static int do_unwind;
209static int do_using_dynamic;
210static int do_header;
211static int do_dump;
212static int do_version;
85b1c36d
BE
213static int do_histogram;
214static int do_debugging;
85b1c36d
BE
215static int do_arch;
216static int do_notes;
4145f1d5 217static int do_archive_index;
85b1c36d 218static int is_32bit_elf;
0e602686 219static int decompress_dumps;
252b5132 220
e4b17d5c
L
221struct group_list
222{
2cf0635d 223 struct group_list * next;
e4b17d5c
L
224 unsigned int section_index;
225};
226
227struct group
228{
2cf0635d 229 struct group_list * root;
e4b17d5c
L
230 unsigned int group_index;
231};
232
85b1c36d 233static size_t group_count;
2cf0635d
NC
234static struct group * section_groups;
235static struct group ** section_headers_groups;
e4b17d5c 236
09c11c86
NC
237
238/* Flag bits indicating particular types of dump. */
239#define HEX_DUMP (1 << 0) /* The -x command line switch. */
240#define DISASS_DUMP (1 << 1) /* The -i command line switch. */
241#define DEBUG_DUMP (1 << 2) /* The -w command line switch. */
242#define STRING_DUMP (1 << 3) /* The -p command line switch. */
cf13d699 243#define RELOC_DUMP (1 << 4) /* The -R command line switch. */
09c11c86
NC
244
245typedef unsigned char dump_type;
246
247/* A linked list of the section names for which dumps were requested. */
aef1f6d0
DJ
248struct dump_list_entry
249{
2cf0635d 250 char * name;
09c11c86 251 dump_type type;
2cf0635d 252 struct dump_list_entry * next;
aef1f6d0 253};
2cf0635d 254static struct dump_list_entry * dump_sects_byname;
aef1f6d0 255
09c11c86
NC
256/* A dynamic array of flags indicating for which sections a dump
257 has been requested via command line switches. */
258static dump_type * cmdline_dump_sects = NULL;
259static unsigned int num_cmdline_dump_sects = 0;
18bd398b
NC
260
261/* A dynamic array of flags indicating for which sections a dump of
262 some kind has been requested. It is reset on a per-object file
aef1f6d0
DJ
263 basis and then initialised from the cmdline_dump_sects array,
264 the results of interpreting the -w switch, and the
265 dump_sects_byname list. */
09c11c86
NC
266static dump_type * dump_sects = NULL;
267static unsigned int num_dump_sects = 0;
252b5132 268
252b5132 269
c256ffe7 270/* How to print a vma value. */
843dd992
NC
271typedef enum print_mode
272{
273 HEX,
274 DEC,
275 DEC_5,
276 UNSIGNED,
277 PREFIX_HEX,
278 FULL_HEX,
279 LONG_HEX
280}
281print_mode;
282
bb4d2ac2
L
283/* Versioned symbol info. */
284enum versioned_symbol_info
285{
286 symbol_undefined,
287 symbol_hidden,
288 symbol_public
289};
290
15f205b1 291static const char *get_symbol_version_string
bb4d2ac2
L
292 (FILE *file, int is_dynsym, const char *strtab,
293 unsigned long int strtab_size, unsigned int si,
294 Elf_Internal_Sym *psym, enum versioned_symbol_info *sym_info,
295 unsigned short *vna_other);
296
9c19a809
NC
297#define UNKNOWN -1
298
2b692964
NC
299#define SECTION_NAME(X) \
300 ((X) == NULL ? _("<none>") \
301 : string_table == NULL ? _("<no-name>") \
302 : ((X)->sh_name >= string_table_length ? _("<corrupt>") \
0b49d371 303 : string_table + (X)->sh_name))
252b5132 304
ee42cf8c 305#define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
252b5132 306
ba5cdace
NC
307#define GET_ELF_SYMBOLS(file, section, sym_count) \
308 (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count) \
309 : get_64bit_elf_symbols (file, section, sym_count))
9ea033b2 310
d79b3d50
NC
311#define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
312/* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
313 already been called and verified that the string exists. */
314#define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
18bd398b 315
61865e30
NC
316#define REMOVE_ARCH_BITS(ADDR) \
317 do \
318 { \
319 if (elf_header.e_machine == EM_ARM) \
320 (ADDR) &= ~1; \
321 } \
322 while (0)
d79b3d50 323\f
c9c1d674
EG
324/* Retrieve NMEMB structures, each SIZE bytes long from FILE starting at OFFSET +
325 the offset of the current archive member, if we are examining an archive.
59245841
NC
326 Put the retrieved data into VAR, if it is not NULL. Otherwise allocate a buffer
327 using malloc and fill that. In either case return the pointer to the start of
328 the retrieved data or NULL if something went wrong. If something does go wrong
c9c1d674
EG
329 and REASON is not NULL then emit an error message using REASON as part of the
330 context. */
59245841 331
c256ffe7 332static void *
57028622
NC
333get_data (void * var, FILE * file, unsigned long offset, bfd_size_type size,
334 bfd_size_type nmemb, const char * reason)
a6e9f9df 335{
2cf0635d 336 void * mvar;
57028622 337 bfd_size_type amt = size * nmemb;
a6e9f9df 338
c256ffe7 339 if (size == 0 || nmemb == 0)
a6e9f9df
AM
340 return NULL;
341
57028622
NC
342 /* If the size_t type is smaller than the bfd_size_type, eg because
343 you are building a 32-bit tool on a 64-bit host, then make sure
344 that when the sizes are cast to (size_t) no information is lost. */
345 if (sizeof (size_t) < sizeof (bfd_size_type)
346 && ( (bfd_size_type) ((size_t) size) != size
347 || (bfd_size_type) ((size_t) nmemb) != nmemb))
348 {
349 if (reason)
ed754a13
AM
350 error (_("Size truncation prevents reading 0x%" BFD_VMA_FMT "x"
351 " elements of size 0x%" BFD_VMA_FMT "x for %s\n"),
352 nmemb, size, reason);
57028622
NC
353 return NULL;
354 }
355
356 /* Check for size overflow. */
357 if (amt < nmemb)
358 {
359 if (reason)
ed754a13
AM
360 error (_("Size overflow prevents reading 0x%" BFD_VMA_FMT "x"
361 " elements of size 0x%" BFD_VMA_FMT "x for %s\n"),
362 nmemb, size, reason);
57028622
NC
363 return NULL;
364 }
365
c9c1d674
EG
366 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
367 attempting to allocate memory when the read is bound to fail. */
368 if (amt > current_file_size
369 || offset + archive_file_offset + amt > current_file_size)
a6e9f9df 370 {
049b0c3a 371 if (reason)
ed754a13
AM
372 error (_("Reading 0x%" BFD_VMA_FMT "x"
373 " bytes extends past end of file for %s\n"),
374 amt, reason);
a6e9f9df
AM
375 return NULL;
376 }
377
c9c1d674 378 if (fseek (file, archive_file_offset + offset, SEEK_SET))
071436c6
NC
379 {
380 if (reason)
c9c1d674 381 error (_("Unable to seek to 0x%lx for %s\n"),
ed754a13 382 archive_file_offset + offset, reason);
071436c6
NC
383 return NULL;
384 }
385
a6e9f9df
AM
386 mvar = var;
387 if (mvar == NULL)
388 {
c256ffe7 389 /* Check for overflow. */
57028622 390 if (nmemb < (~(bfd_size_type) 0 - 1) / size)
c256ffe7 391 /* + 1 so that we can '\0' terminate invalid string table sections. */
57028622 392 mvar = malloc ((size_t) amt + 1);
a6e9f9df
AM
393
394 if (mvar == NULL)
395 {
049b0c3a 396 if (reason)
ed754a13
AM
397 error (_("Out of memory allocating 0x%" BFD_VMA_FMT "x"
398 " bytes for %s\n"),
399 amt, reason);
a6e9f9df
AM
400 return NULL;
401 }
c256ffe7 402
c9c1d674 403 ((char *) mvar)[amt] = '\0';
a6e9f9df
AM
404 }
405
57028622 406 if (fread (mvar, (size_t) size, (size_t) nmemb, file) != nmemb)
a6e9f9df 407 {
049b0c3a 408 if (reason)
ed754a13
AM
409 error (_("Unable to read in 0x%" BFD_VMA_FMT "x bytes of %s\n"),
410 amt, reason);
a6e9f9df
AM
411 if (mvar != var)
412 free (mvar);
413 return NULL;
414 }
415
416 return mvar;
417}
418
14a91970 419/* Print a VMA value. */
cb8f3167 420
66543521 421static int
14a91970 422print_vma (bfd_vma vma, print_mode mode)
66543521 423{
66543521
AM
424 int nc = 0;
425
14a91970 426 switch (mode)
66543521 427 {
14a91970
AM
428 case FULL_HEX:
429 nc = printf ("0x");
1a0670f3 430 /* Fall through. */
66543521 431
14a91970 432 case LONG_HEX:
f7a99963 433#ifdef BFD64
14a91970 434 if (is_32bit_elf)
437c2fb7 435 return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
f7a99963 436#endif
14a91970
AM
437 printf_vma (vma);
438 return nc + 16;
b19aac67 439
14a91970
AM
440 case DEC_5:
441 if (vma <= 99999)
442 return printf ("%5" BFD_VMA_FMT "d", vma);
1a0670f3 443 /* Fall through. */
66543521 444
14a91970
AM
445 case PREFIX_HEX:
446 nc = printf ("0x");
1a0670f3 447 /* Fall through. */
66543521 448
14a91970
AM
449 case HEX:
450 return nc + printf ("%" BFD_VMA_FMT "x", vma);
b19aac67 451
14a91970
AM
452 case DEC:
453 return printf ("%" BFD_VMA_FMT "d", vma);
b19aac67 454
14a91970
AM
455 case UNSIGNED:
456 return printf ("%" BFD_VMA_FMT "u", vma);
f7a99963 457 }
66543521 458 return 0;
f7a99963
NC
459}
460
7bfd842d 461/* Display a symbol on stdout. Handles the display of control characters and
3bfcb652 462 multibye characters (assuming the host environment supports them).
31104126 463
7bfd842d
NC
464 Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
465
466 If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
467 padding as necessary.
171191ba
NC
468
469 Returns the number of emitted characters. */
470
471static unsigned int
7a88bc9c 472print_symbol (int width, const char *symbol)
31104126 473{
171191ba 474 bfd_boolean extra_padding = FALSE;
7bfd842d 475 int num_printed = 0;
3bfcb652 476#ifdef HAVE_MBSTATE_T
7bfd842d 477 mbstate_t state;
3bfcb652 478#endif
7bfd842d 479 int width_remaining;
961c521f 480
7bfd842d 481 if (width < 0)
961c521f 482 {
961c521f
NC
483 /* Keep the width positive. This also helps. */
484 width = - width;
171191ba 485 extra_padding = TRUE;
0b4362b0 486 }
74e1a04b 487 assert (width != 0);
961c521f 488
7bfd842d
NC
489 if (do_wide)
490 /* Set the remaining width to a very large value.
491 This simplifies the code below. */
492 width_remaining = INT_MAX;
493 else
494 width_remaining = width;
cb8f3167 495
3bfcb652 496#ifdef HAVE_MBSTATE_T
7bfd842d
NC
497 /* Initialise the multibyte conversion state. */
498 memset (& state, 0, sizeof (state));
3bfcb652 499#endif
961c521f 500
7bfd842d
NC
501 while (width_remaining)
502 {
503 size_t n;
7bfd842d 504 const char c = *symbol++;
961c521f 505
7bfd842d 506 if (c == 0)
961c521f
NC
507 break;
508
7bfd842d
NC
509 /* Do not print control characters directly as they can affect terminal
510 settings. Such characters usually appear in the names generated
511 by the assembler for local labels. */
512 if (ISCNTRL (c))
961c521f 513 {
7bfd842d 514 if (width_remaining < 2)
961c521f
NC
515 break;
516
7bfd842d
NC
517 printf ("^%c", c + 0x40);
518 width_remaining -= 2;
171191ba 519 num_printed += 2;
961c521f 520 }
7bfd842d
NC
521 else if (ISPRINT (c))
522 {
523 putchar (c);
524 width_remaining --;
525 num_printed ++;
526 }
961c521f
NC
527 else
528 {
3bfcb652
NC
529#ifdef HAVE_MBSTATE_T
530 wchar_t w;
531#endif
7bfd842d
NC
532 /* Let printf do the hard work of displaying multibyte characters. */
533 printf ("%.1s", symbol - 1);
534 width_remaining --;
535 num_printed ++;
536
3bfcb652 537#ifdef HAVE_MBSTATE_T
7bfd842d
NC
538 /* Try to find out how many bytes made up the character that was
539 just printed. Advance the symbol pointer past the bytes that
540 were displayed. */
541 n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
3bfcb652
NC
542#else
543 n = 1;
544#endif
7bfd842d
NC
545 if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
546 symbol += (n - 1);
961c521f 547 }
961c521f 548 }
171191ba 549
7bfd842d 550 if (extra_padding && num_printed < width)
171191ba
NC
551 {
552 /* Fill in the remaining spaces. */
7bfd842d
NC
553 printf ("%-*s", width - num_printed, " ");
554 num_printed = width;
171191ba
NC
555 }
556
557 return num_printed;
31104126
NC
558}
559
1449284b 560/* Returns a pointer to a static buffer containing a printable version of
74e1a04b
NC
561 the given section's name. Like print_symbol, except that it does not try
562 to print multibyte characters, it just interprets them as hex values. */
563
564static const char *
0d2a7a93 565printable_section_name (const Elf_Internal_Shdr * sec)
74e1a04b
NC
566{
567#define MAX_PRINT_SEC_NAME_LEN 128
568 static char sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
569 const char * name = SECTION_NAME (sec);
570 char * buf = sec_name_buf;
571 char c;
572 unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
573
574 while ((c = * name ++) != 0)
575 {
576 if (ISCNTRL (c))
577 {
578 if (remaining < 2)
579 break;
948f632f 580
74e1a04b
NC
581 * buf ++ = '^';
582 * buf ++ = c + 0x40;
583 remaining -= 2;
584 }
585 else if (ISPRINT (c))
586 {
587 * buf ++ = c;
588 remaining -= 1;
589 }
590 else
591 {
592 static char hex[17] = "0123456789ABCDEF";
593
594 if (remaining < 4)
595 break;
596 * buf ++ = '<';
597 * buf ++ = hex[(c & 0xf0) >> 4];
598 * buf ++ = hex[c & 0x0f];
599 * buf ++ = '>';
600 remaining -= 4;
601 }
602
603 if (remaining == 0)
604 break;
605 }
606
607 * buf = 0;
608 return sec_name_buf;
609}
610
611static const char *
612printable_section_name_from_index (unsigned long ndx)
613{
614 if (ndx >= elf_header.e_shnum)
615 return _("<corrupt>");
616
617 return printable_section_name (section_headers + ndx);
618}
619
89fac5e3
RS
620/* Return a pointer to section NAME, or NULL if no such section exists. */
621
622static Elf_Internal_Shdr *
2cf0635d 623find_section (const char * name)
89fac5e3
RS
624{
625 unsigned int i;
626
627 for (i = 0; i < elf_header.e_shnum; i++)
628 if (streq (SECTION_NAME (section_headers + i), name))
629 return section_headers + i;
630
631 return NULL;
632}
633
0b6ae522
DJ
634/* Return a pointer to a section containing ADDR, or NULL if no such
635 section exists. */
636
637static Elf_Internal_Shdr *
638find_section_by_address (bfd_vma addr)
639{
640 unsigned int i;
641
642 for (i = 0; i < elf_header.e_shnum; i++)
643 {
644 Elf_Internal_Shdr *sec = section_headers + i;
645 if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
646 return sec;
647 }
648
649 return NULL;
650}
651
071436c6
NC
652static Elf_Internal_Shdr *
653find_section_by_type (unsigned int type)
654{
655 unsigned int i;
656
657 for (i = 0; i < elf_header.e_shnum; i++)
658 {
659 Elf_Internal_Shdr *sec = section_headers + i;
660 if (sec->sh_type == type)
661 return sec;
662 }
663
664 return NULL;
665}
666
657d0d47
CC
667/* Return a pointer to section NAME, or NULL if no such section exists,
668 restricted to the list of sections given in SET. */
669
670static Elf_Internal_Shdr *
671find_section_in_set (const char * name, unsigned int * set)
672{
673 unsigned int i;
674
675 if (set != NULL)
676 {
677 while ((i = *set++) > 0)
678 if (streq (SECTION_NAME (section_headers + i), name))
679 return section_headers + i;
680 }
681
682 return find_section (name);
683}
684
0b6ae522
DJ
685/* Read an unsigned LEB128 encoded value from p. Set *PLEN to the number of
686 bytes read. */
687
f6f0e17b
NC
688static inline unsigned long
689read_uleb128 (unsigned char *data,
690 unsigned int *length_return,
691 const unsigned char * const end)
0b6ae522 692{
f6f0e17b 693 return read_leb128 (data, length_return, FALSE, end);
0b6ae522
DJ
694}
695
28f997cf
TG
696/* Return true if the current file is for IA-64 machine and OpenVMS ABI.
697 This OS has so many departures from the ELF standard that we test it at
698 many places. */
699
700static inline int
701is_ia64_vms (void)
702{
703 return elf_header.e_machine == EM_IA_64
704 && elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
705}
706
bcedfee6 707/* Guess the relocation size commonly used by the specific machines. */
252b5132 708
252b5132 709static int
2dc4cec1 710guess_is_rela (unsigned int e_machine)
252b5132 711{
9c19a809 712 switch (e_machine)
252b5132
RH
713 {
714 /* Targets that use REL relocations. */
252b5132 715 case EM_386:
22abe556 716 case EM_IAMCU:
63fcb9e9 717 case EM_960:
e9f53129 718 case EM_ARM:
2b0337b0 719 case EM_D10V:
252b5132 720 case EM_CYGNUS_D10V:
e9f53129 721 case EM_DLX:
252b5132 722 case EM_MIPS:
4fe85591 723 case EM_MIPS_RS3_LE:
e9f53129 724 case EM_CYGNUS_M32R:
1c0d3aa6 725 case EM_SCORE:
f6c1a2d5 726 case EM_XGATE:
9c19a809 727 return FALSE;
103f02d3 728
252b5132
RH
729 /* Targets that use RELA relocations. */
730 case EM_68K:
e9f53129 731 case EM_860:
a06ea964 732 case EM_AARCH64:
cfb8c092 733 case EM_ADAPTEVA_EPIPHANY:
e9f53129
AM
734 case EM_ALPHA:
735 case EM_ALTERA_NIOS2:
886a2506
NC
736 case EM_ARC:
737 case EM_ARC_COMPACT:
738 case EM_ARC_COMPACT2:
e9f53129
AM
739 case EM_AVR:
740 case EM_AVR_OLD:
741 case EM_BLACKFIN:
60bca95a 742 case EM_CR16:
e9f53129
AM
743 case EM_CRIS:
744 case EM_CRX:
2b0337b0 745 case EM_D30V:
252b5132 746 case EM_CYGNUS_D30V:
2b0337b0 747 case EM_FR30:
3f8107ab 748 case EM_FT32:
252b5132 749 case EM_CYGNUS_FR30:
5c70f934 750 case EM_CYGNUS_FRV:
e9f53129
AM
751 case EM_H8S:
752 case EM_H8_300:
753 case EM_H8_300H:
800eeca4 754 case EM_IA_64:
1e4cf259
NC
755 case EM_IP2K:
756 case EM_IP2K_OLD:
3b36097d 757 case EM_IQ2000:
84e94c90 758 case EM_LATTICEMICO32:
ff7eeb89 759 case EM_M32C_OLD:
49f58d10 760 case EM_M32C:
e9f53129
AM
761 case EM_M32R:
762 case EM_MCORE:
15ab5209 763 case EM_CYGNUS_MEP:
a3c62988 764 case EM_METAG:
e9f53129
AM
765 case EM_MMIX:
766 case EM_MN10200:
767 case EM_CYGNUS_MN10200:
768 case EM_MN10300:
769 case EM_CYGNUS_MN10300:
5506d11a 770 case EM_MOXIE:
e9f53129
AM
771 case EM_MSP430:
772 case EM_MSP430_OLD:
d031aafb 773 case EM_MT:
35c08157 774 case EM_NDS32:
64fd6348 775 case EM_NIOS32:
73589c9d 776 case EM_OR1K:
e9f53129
AM
777 case EM_PPC64:
778 case EM_PPC:
e23eba97 779 case EM_RISCV:
99c513f6 780 case EM_RL78:
c7927a3c 781 case EM_RX:
e9f53129
AM
782 case EM_S390:
783 case EM_S390_OLD:
784 case EM_SH:
785 case EM_SPARC:
786 case EM_SPARC32PLUS:
787 case EM_SPARCV9:
788 case EM_SPU:
40b36596 789 case EM_TI_C6000:
aa137e4d
NC
790 case EM_TILEGX:
791 case EM_TILEPRO:
708e2187 792 case EM_V800:
e9f53129
AM
793 case EM_V850:
794 case EM_CYGNUS_V850:
795 case EM_VAX:
619ed720 796 case EM_VISIUM:
e9f53129 797 case EM_X86_64:
8a9036a4 798 case EM_L1OM:
7a9068fe 799 case EM_K1OM:
e9f53129
AM
800 case EM_XSTORMY16:
801 case EM_XTENSA:
802 case EM_XTENSA_OLD:
7ba29e2a
NC
803 case EM_MICROBLAZE:
804 case EM_MICROBLAZE_OLD:
9c19a809 805 return TRUE;
103f02d3 806
e9f53129
AM
807 case EM_68HC05:
808 case EM_68HC08:
809 case EM_68HC11:
810 case EM_68HC16:
811 case EM_FX66:
812 case EM_ME16:
d1133906 813 case EM_MMA:
d1133906
NC
814 case EM_NCPU:
815 case EM_NDR1:
e9f53129 816 case EM_PCP:
d1133906 817 case EM_ST100:
e9f53129 818 case EM_ST19:
d1133906 819 case EM_ST7:
e9f53129
AM
820 case EM_ST9PLUS:
821 case EM_STARCORE:
d1133906 822 case EM_SVX:
e9f53129 823 case EM_TINYJ:
9c19a809
NC
824 default:
825 warn (_("Don't know about relocations on this machine architecture\n"));
826 return FALSE;
827 }
828}
252b5132 829
9c19a809 830static int
2cf0635d 831slurp_rela_relocs (FILE * file,
d3ba0551
AM
832 unsigned long rel_offset,
833 unsigned long rel_size,
2cf0635d
NC
834 Elf_Internal_Rela ** relasp,
835 unsigned long * nrelasp)
9c19a809 836{
2cf0635d 837 Elf_Internal_Rela * relas;
8b73c356 838 size_t nrelas;
4d6ed7c8 839 unsigned int i;
252b5132 840
4d6ed7c8
NC
841 if (is_32bit_elf)
842 {
2cf0635d 843 Elf32_External_Rela * erelas;
103f02d3 844
3f5e193b 845 erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset, 1,
9cf03b7e 846 rel_size, _("32-bit relocation data"));
a6e9f9df
AM
847 if (!erelas)
848 return 0;
252b5132 849
4d6ed7c8 850 nrelas = rel_size / sizeof (Elf32_External_Rela);
103f02d3 851
3f5e193b
NC
852 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
853 sizeof (Elf_Internal_Rela));
103f02d3 854
4d6ed7c8
NC
855 if (relas == NULL)
856 {
c256ffe7 857 free (erelas);
591a748a 858 error (_("out of memory parsing relocs\n"));
4d6ed7c8
NC
859 return 0;
860 }
103f02d3 861
4d6ed7c8
NC
862 for (i = 0; i < nrelas; i++)
863 {
864 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
865 relas[i].r_info = BYTE_GET (erelas[i].r_info);
598aaa76 866 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
4d6ed7c8 867 }
103f02d3 868
4d6ed7c8
NC
869 free (erelas);
870 }
871 else
872 {
2cf0635d 873 Elf64_External_Rela * erelas;
103f02d3 874
3f5e193b 875 erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset, 1,
9cf03b7e 876 rel_size, _("64-bit relocation data"));
a6e9f9df
AM
877 if (!erelas)
878 return 0;
4d6ed7c8
NC
879
880 nrelas = rel_size / sizeof (Elf64_External_Rela);
103f02d3 881
3f5e193b
NC
882 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
883 sizeof (Elf_Internal_Rela));
103f02d3 884
4d6ed7c8
NC
885 if (relas == NULL)
886 {
c256ffe7 887 free (erelas);
591a748a 888 error (_("out of memory parsing relocs\n"));
4d6ed7c8 889 return 0;
9c19a809 890 }
4d6ed7c8
NC
891
892 for (i = 0; i < nrelas; i++)
9c19a809 893 {
66543521
AM
894 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
895 relas[i].r_info = BYTE_GET (erelas[i].r_info);
598aaa76 896 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
861fb55a
DJ
897
898 /* The #ifdef BFD64 below is to prevent a compile time
899 warning. We know that if we do not have a 64 bit data
900 type that we will never execute this code anyway. */
901#ifdef BFD64
902 if (elf_header.e_machine == EM_MIPS
903 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
904 {
905 /* In little-endian objects, r_info isn't really a
906 64-bit little-endian value: it has a 32-bit
907 little-endian symbol index followed by four
908 individual byte fields. Reorder INFO
909 accordingly. */
91d6fa6a
NC
910 bfd_vma inf = relas[i].r_info;
911 inf = (((inf & 0xffffffff) << 32)
912 | ((inf >> 56) & 0xff)
913 | ((inf >> 40) & 0xff00)
914 | ((inf >> 24) & 0xff0000)
915 | ((inf >> 8) & 0xff000000));
916 relas[i].r_info = inf;
861fb55a
DJ
917 }
918#endif /* BFD64 */
4d6ed7c8 919 }
103f02d3 920
4d6ed7c8
NC
921 free (erelas);
922 }
923 *relasp = relas;
924 *nrelasp = nrelas;
925 return 1;
926}
103f02d3 927
4d6ed7c8 928static int
2cf0635d 929slurp_rel_relocs (FILE * file,
d3ba0551
AM
930 unsigned long rel_offset,
931 unsigned long rel_size,
2cf0635d
NC
932 Elf_Internal_Rela ** relsp,
933 unsigned long * nrelsp)
4d6ed7c8 934{
2cf0635d 935 Elf_Internal_Rela * rels;
8b73c356 936 size_t nrels;
4d6ed7c8 937 unsigned int i;
103f02d3 938
4d6ed7c8
NC
939 if (is_32bit_elf)
940 {
2cf0635d 941 Elf32_External_Rel * erels;
103f02d3 942
3f5e193b 943 erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset, 1,
9cf03b7e 944 rel_size, _("32-bit relocation data"));
a6e9f9df
AM
945 if (!erels)
946 return 0;
103f02d3 947
4d6ed7c8 948 nrels = rel_size / sizeof (Elf32_External_Rel);
103f02d3 949
3f5e193b 950 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
103f02d3 951
4d6ed7c8
NC
952 if (rels == NULL)
953 {
c256ffe7 954 free (erels);
591a748a 955 error (_("out of memory parsing relocs\n"));
4d6ed7c8
NC
956 return 0;
957 }
958
959 for (i = 0; i < nrels; i++)
960 {
961 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
962 rels[i].r_info = BYTE_GET (erels[i].r_info);
c8286bd1 963 rels[i].r_addend = 0;
9ea033b2 964 }
4d6ed7c8
NC
965
966 free (erels);
9c19a809
NC
967 }
968 else
969 {
2cf0635d 970 Elf64_External_Rel * erels;
9ea033b2 971
3f5e193b 972 erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset, 1,
9cf03b7e 973 rel_size, _("64-bit relocation data"));
a6e9f9df
AM
974 if (!erels)
975 return 0;
103f02d3 976
4d6ed7c8 977 nrels = rel_size / sizeof (Elf64_External_Rel);
103f02d3 978
3f5e193b 979 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
103f02d3 980
4d6ed7c8 981 if (rels == NULL)
9c19a809 982 {
c256ffe7 983 free (erels);
591a748a 984 error (_("out of memory parsing relocs\n"));
4d6ed7c8
NC
985 return 0;
986 }
103f02d3 987
4d6ed7c8
NC
988 for (i = 0; i < nrels; i++)
989 {
66543521
AM
990 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
991 rels[i].r_info = BYTE_GET (erels[i].r_info);
c8286bd1 992 rels[i].r_addend = 0;
861fb55a
DJ
993
994 /* The #ifdef BFD64 below is to prevent a compile time
995 warning. We know that if we do not have a 64 bit data
996 type that we will never execute this code anyway. */
997#ifdef BFD64
998 if (elf_header.e_machine == EM_MIPS
999 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
1000 {
1001 /* In little-endian objects, r_info isn't really a
1002 64-bit little-endian value: it has a 32-bit
1003 little-endian symbol index followed by four
1004 individual byte fields. Reorder INFO
1005 accordingly. */
91d6fa6a
NC
1006 bfd_vma inf = rels[i].r_info;
1007 inf = (((inf & 0xffffffff) << 32)
1008 | ((inf >> 56) & 0xff)
1009 | ((inf >> 40) & 0xff00)
1010 | ((inf >> 24) & 0xff0000)
1011 | ((inf >> 8) & 0xff000000));
1012 rels[i].r_info = inf;
861fb55a
DJ
1013 }
1014#endif /* BFD64 */
4d6ed7c8 1015 }
103f02d3 1016
4d6ed7c8
NC
1017 free (erels);
1018 }
1019 *relsp = rels;
1020 *nrelsp = nrels;
1021 return 1;
1022}
103f02d3 1023
aca88567
NC
1024/* Returns the reloc type extracted from the reloc info field. */
1025
1026static unsigned int
1027get_reloc_type (bfd_vma reloc_info)
1028{
1029 if (is_32bit_elf)
1030 return ELF32_R_TYPE (reloc_info);
1031
1032 switch (elf_header.e_machine)
1033 {
1034 case EM_MIPS:
1035 /* Note: We assume that reloc_info has already been adjusted for us. */
1036 return ELF64_MIPS_R_TYPE (reloc_info);
1037
1038 case EM_SPARCV9:
1039 return ELF64_R_TYPE_ID (reloc_info);
1040
1041 default:
1042 return ELF64_R_TYPE (reloc_info);
1043 }
1044}
1045
1046/* Return the symbol index extracted from the reloc info field. */
1047
1048static bfd_vma
1049get_reloc_symindex (bfd_vma reloc_info)
1050{
1051 return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
1052}
1053
13761a11
NC
1054static inline bfd_boolean
1055uses_msp430x_relocs (void)
1056{
1057 return
1058 elf_header.e_machine == EM_MSP430 /* Paranoia. */
1059 /* GCC uses osabi == ELFOSBI_STANDALONE. */
1060 && (((elf_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
1061 /* TI compiler uses ELFOSABI_NONE. */
1062 || (elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
1063}
1064
d3ba0551
AM
1065/* Display the contents of the relocation data found at the specified
1066 offset. */
ee42cf8c 1067
41e92641 1068static void
2cf0635d 1069dump_relocations (FILE * file,
d3ba0551
AM
1070 unsigned long rel_offset,
1071 unsigned long rel_size,
2cf0635d 1072 Elf_Internal_Sym * symtab,
d3ba0551 1073 unsigned long nsyms,
2cf0635d 1074 char * strtab,
d79b3d50 1075 unsigned long strtablen,
bb4d2ac2
L
1076 int is_rela,
1077 int is_dynsym)
4d6ed7c8 1078{
b34976b6 1079 unsigned int i;
2cf0635d 1080 Elf_Internal_Rela * rels;
103f02d3 1081
4d6ed7c8
NC
1082 if (is_rela == UNKNOWN)
1083 is_rela = guess_is_rela (elf_header.e_machine);
103f02d3 1084
4d6ed7c8
NC
1085 if (is_rela)
1086 {
c8286bd1 1087 if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
41e92641 1088 return;
4d6ed7c8
NC
1089 }
1090 else
1091 {
1092 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
41e92641 1093 return;
252b5132
RH
1094 }
1095
410f7a12
L
1096 if (is_32bit_elf)
1097 {
1098 if (is_rela)
2c71103e
NC
1099 {
1100 if (do_wide)
1101 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
1102 else
1103 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
1104 }
410f7a12 1105 else
2c71103e
NC
1106 {
1107 if (do_wide)
1108 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
1109 else
1110 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
1111 }
410f7a12 1112 }
252b5132 1113 else
410f7a12
L
1114 {
1115 if (is_rela)
2c71103e
NC
1116 {
1117 if (do_wide)
8beeaeb7 1118 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
2c71103e
NC
1119 else
1120 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
1121 }
410f7a12 1122 else
2c71103e
NC
1123 {
1124 if (do_wide)
8beeaeb7 1125 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
2c71103e
NC
1126 else
1127 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
1128 }
410f7a12 1129 }
252b5132
RH
1130
1131 for (i = 0; i < rel_size; i++)
1132 {
2cf0635d 1133 const char * rtype;
b34976b6 1134 bfd_vma offset;
91d6fa6a 1135 bfd_vma inf;
b34976b6
AM
1136 bfd_vma symtab_index;
1137 bfd_vma type;
103f02d3 1138
b34976b6 1139 offset = rels[i].r_offset;
91d6fa6a 1140 inf = rels[i].r_info;
103f02d3 1141
91d6fa6a
NC
1142 type = get_reloc_type (inf);
1143 symtab_index = get_reloc_symindex (inf);
252b5132 1144
410f7a12
L
1145 if (is_32bit_elf)
1146 {
39dbeff8
AM
1147 printf ("%8.8lx %8.8lx ",
1148 (unsigned long) offset & 0xffffffff,
91d6fa6a 1149 (unsigned long) inf & 0xffffffff);
410f7a12
L
1150 }
1151 else
1152 {
39dbeff8
AM
1153#if BFD_HOST_64BIT_LONG
1154 printf (do_wide
1155 ? "%16.16lx %16.16lx "
1156 : "%12.12lx %12.12lx ",
91d6fa6a 1157 offset, inf);
39dbeff8 1158#elif BFD_HOST_64BIT_LONG_LONG
6e3d6dc1 1159#ifndef __MSVCRT__
39dbeff8
AM
1160 printf (do_wide
1161 ? "%16.16llx %16.16llx "
1162 : "%12.12llx %12.12llx ",
91d6fa6a 1163 offset, inf);
6e3d6dc1
NC
1164#else
1165 printf (do_wide
1166 ? "%16.16I64x %16.16I64x "
1167 : "%12.12I64x %12.12I64x ",
91d6fa6a 1168 offset, inf);
6e3d6dc1 1169#endif
39dbeff8 1170#else
2c71103e
NC
1171 printf (do_wide
1172 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1173 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
410f7a12
L
1174 _bfd_int64_high (offset),
1175 _bfd_int64_low (offset),
91d6fa6a
NC
1176 _bfd_int64_high (inf),
1177 _bfd_int64_low (inf));
9ea033b2 1178#endif
410f7a12 1179 }
103f02d3 1180
252b5132
RH
1181 switch (elf_header.e_machine)
1182 {
1183 default:
1184 rtype = NULL;
1185 break;
1186
a06ea964
NC
1187 case EM_AARCH64:
1188 rtype = elf_aarch64_reloc_type (type);
1189 break;
1190
2b0337b0 1191 case EM_M32R:
252b5132 1192 case EM_CYGNUS_M32R:
9ea033b2 1193 rtype = elf_m32r_reloc_type (type);
252b5132
RH
1194 break;
1195
1196 case EM_386:
22abe556 1197 case EM_IAMCU:
9ea033b2 1198 rtype = elf_i386_reloc_type (type);
252b5132
RH
1199 break;
1200
ba2685cc
AM
1201 case EM_68HC11:
1202 case EM_68HC12:
1203 rtype = elf_m68hc11_reloc_type (type);
1204 break;
75751cd9 1205
252b5132 1206 case EM_68K:
9ea033b2 1207 rtype = elf_m68k_reloc_type (type);
252b5132
RH
1208 break;
1209
63fcb9e9 1210 case EM_960:
9ea033b2 1211 rtype = elf_i960_reloc_type (type);
63fcb9e9
ILT
1212 break;
1213
adde6300 1214 case EM_AVR:
2b0337b0 1215 case EM_AVR_OLD:
adde6300
AM
1216 rtype = elf_avr_reloc_type (type);
1217 break;
1218
9ea033b2
NC
1219 case EM_OLD_SPARCV9:
1220 case EM_SPARC32PLUS:
1221 case EM_SPARCV9:
252b5132 1222 case EM_SPARC:
9ea033b2 1223 rtype = elf_sparc_reloc_type (type);
252b5132
RH
1224 break;
1225
e9f53129
AM
1226 case EM_SPU:
1227 rtype = elf_spu_reloc_type (type);
1228 break;
1229
708e2187
NC
1230 case EM_V800:
1231 rtype = v800_reloc_type (type);
1232 break;
2b0337b0 1233 case EM_V850:
252b5132 1234 case EM_CYGNUS_V850:
9ea033b2 1235 rtype = v850_reloc_type (type);
252b5132
RH
1236 break;
1237
2b0337b0 1238 case EM_D10V:
252b5132 1239 case EM_CYGNUS_D10V:
9ea033b2 1240 rtype = elf_d10v_reloc_type (type);
252b5132
RH
1241 break;
1242
2b0337b0 1243 case EM_D30V:
252b5132 1244 case EM_CYGNUS_D30V:
9ea033b2 1245 rtype = elf_d30v_reloc_type (type);
252b5132
RH
1246 break;
1247
d172d4ba
NC
1248 case EM_DLX:
1249 rtype = elf_dlx_reloc_type (type);
1250 break;
1251
252b5132 1252 case EM_SH:
9ea033b2 1253 rtype = elf_sh_reloc_type (type);
252b5132
RH
1254 break;
1255
2b0337b0 1256 case EM_MN10300:
252b5132 1257 case EM_CYGNUS_MN10300:
9ea033b2 1258 rtype = elf_mn10300_reloc_type (type);
252b5132
RH
1259 break;
1260
2b0337b0 1261 case EM_MN10200:
252b5132 1262 case EM_CYGNUS_MN10200:
9ea033b2 1263 rtype = elf_mn10200_reloc_type (type);
252b5132
RH
1264 break;
1265
2b0337b0 1266 case EM_FR30:
252b5132 1267 case EM_CYGNUS_FR30:
9ea033b2 1268 rtype = elf_fr30_reloc_type (type);
252b5132
RH
1269 break;
1270
ba2685cc
AM
1271 case EM_CYGNUS_FRV:
1272 rtype = elf_frv_reloc_type (type);
1273 break;
5c70f934 1274
3f8107ab
AM
1275 case EM_FT32:
1276 rtype = elf_ft32_reloc_type (type);
1277 break;
1278
252b5132 1279 case EM_MCORE:
9ea033b2 1280 rtype = elf_mcore_reloc_type (type);
252b5132
RH
1281 break;
1282
3c3bdf30
NC
1283 case EM_MMIX:
1284 rtype = elf_mmix_reloc_type (type);
1285 break;
1286
5506d11a
AM
1287 case EM_MOXIE:
1288 rtype = elf_moxie_reloc_type (type);
1289 break;
1290
2469cfa2 1291 case EM_MSP430:
13761a11
NC
1292 if (uses_msp430x_relocs ())
1293 {
1294 rtype = elf_msp430x_reloc_type (type);
1295 break;
1296 }
1a0670f3 1297 /* Fall through. */
2469cfa2
NC
1298 case EM_MSP430_OLD:
1299 rtype = elf_msp430_reloc_type (type);
1300 break;
1301
35c08157
KLC
1302 case EM_NDS32:
1303 rtype = elf_nds32_reloc_type (type);
1304 break;
1305
252b5132 1306 case EM_PPC:
9ea033b2 1307 rtype = elf_ppc_reloc_type (type);
252b5132
RH
1308 break;
1309
c833c019
AM
1310 case EM_PPC64:
1311 rtype = elf_ppc64_reloc_type (type);
1312 break;
1313
252b5132 1314 case EM_MIPS:
4fe85591 1315 case EM_MIPS_RS3_LE:
9ea033b2 1316 rtype = elf_mips_reloc_type (type);
252b5132
RH
1317 break;
1318
e23eba97
NC
1319 case EM_RISCV:
1320 rtype = elf_riscv_reloc_type (type);
1321 break;
1322
252b5132 1323 case EM_ALPHA:
9ea033b2 1324 rtype = elf_alpha_reloc_type (type);
252b5132
RH
1325 break;
1326
1327 case EM_ARM:
9ea033b2 1328 rtype = elf_arm_reloc_type (type);
252b5132
RH
1329 break;
1330
584da044 1331 case EM_ARC:
886a2506
NC
1332 case EM_ARC_COMPACT:
1333 case EM_ARC_COMPACT2:
9ea033b2 1334 rtype = elf_arc_reloc_type (type);
252b5132
RH
1335 break;
1336
1337 case EM_PARISC:
69e617ca 1338 rtype = elf_hppa_reloc_type (type);
252b5132 1339 break;
7d466069 1340
b8720f9d
JL
1341 case EM_H8_300:
1342 case EM_H8_300H:
1343 case EM_H8S:
1344 rtype = elf_h8_reloc_type (type);
1345 break;
1346
73589c9d
CS
1347 case EM_OR1K:
1348 rtype = elf_or1k_reloc_type (type);
3b16e843
NC
1349 break;
1350
7d466069 1351 case EM_PJ:
2b0337b0 1352 case EM_PJ_OLD:
7d466069
ILT
1353 rtype = elf_pj_reloc_type (type);
1354 break;
800eeca4
JW
1355 case EM_IA_64:
1356 rtype = elf_ia64_reloc_type (type);
1357 break;
1b61cf92
HPN
1358
1359 case EM_CRIS:
1360 rtype = elf_cris_reloc_type (type);
1361 break;
535c37ff
JE
1362
1363 case EM_860:
1364 rtype = elf_i860_reloc_type (type);
1365 break;
bcedfee6
NC
1366
1367 case EM_X86_64:
8a9036a4 1368 case EM_L1OM:
7a9068fe 1369 case EM_K1OM:
bcedfee6
NC
1370 rtype = elf_x86_64_reloc_type (type);
1371 break;
a85d7ed0 1372
35b1837e
AM
1373 case EM_S370:
1374 rtype = i370_reloc_type (type);
1375 break;
1376
53c7db4b
KH
1377 case EM_S390_OLD:
1378 case EM_S390:
1379 rtype = elf_s390_reloc_type (type);
1380 break;
93fbbb04 1381
1c0d3aa6
NC
1382 case EM_SCORE:
1383 rtype = elf_score_reloc_type (type);
1384 break;
1385
93fbbb04
GK
1386 case EM_XSTORMY16:
1387 rtype = elf_xstormy16_reloc_type (type);
1388 break;
179d3252 1389
1fe1f39c
NC
1390 case EM_CRX:
1391 rtype = elf_crx_reloc_type (type);
1392 break;
1393
179d3252
JT
1394 case EM_VAX:
1395 rtype = elf_vax_reloc_type (type);
1396 break;
1e4cf259 1397
619ed720
EB
1398 case EM_VISIUM:
1399 rtype = elf_visium_reloc_type (type);
1400 break;
1401
cfb8c092
NC
1402 case EM_ADAPTEVA_EPIPHANY:
1403 rtype = elf_epiphany_reloc_type (type);
1404 break;
1405
1e4cf259
NC
1406 case EM_IP2K:
1407 case EM_IP2K_OLD:
1408 rtype = elf_ip2k_reloc_type (type);
1409 break;
3b36097d
SC
1410
1411 case EM_IQ2000:
1412 rtype = elf_iq2000_reloc_type (type);
1413 break;
88da6820
NC
1414
1415 case EM_XTENSA_OLD:
1416 case EM_XTENSA:
1417 rtype = elf_xtensa_reloc_type (type);
1418 break;
a34e3ecb 1419
84e94c90
NC
1420 case EM_LATTICEMICO32:
1421 rtype = elf_lm32_reloc_type (type);
1422 break;
1423
ff7eeb89 1424 case EM_M32C_OLD:
49f58d10
JB
1425 case EM_M32C:
1426 rtype = elf_m32c_reloc_type (type);
1427 break;
1428
d031aafb
NS
1429 case EM_MT:
1430 rtype = elf_mt_reloc_type (type);
a34e3ecb 1431 break;
1d65ded4
CM
1432
1433 case EM_BLACKFIN:
1434 rtype = elf_bfin_reloc_type (type);
1435 break;
15ab5209
DB
1436
1437 case EM_CYGNUS_MEP:
1438 rtype = elf_mep_reloc_type (type);
1439 break;
60bca95a
NC
1440
1441 case EM_CR16:
1442 rtype = elf_cr16_reloc_type (type);
1443 break;
dd24e3da 1444
7ba29e2a
NC
1445 case EM_MICROBLAZE:
1446 case EM_MICROBLAZE_OLD:
1447 rtype = elf_microblaze_reloc_type (type);
1448 break;
c7927a3c 1449
99c513f6
DD
1450 case EM_RL78:
1451 rtype = elf_rl78_reloc_type (type);
1452 break;
1453
c7927a3c
NC
1454 case EM_RX:
1455 rtype = elf_rx_reloc_type (type);
1456 break;
c29aca4a 1457
a3c62988
NC
1458 case EM_METAG:
1459 rtype = elf_metag_reloc_type (type);
1460 break;
1461
c29aca4a
NC
1462 case EM_XC16X:
1463 case EM_C166:
1464 rtype = elf_xc16x_reloc_type (type);
1465 break;
40b36596
JM
1466
1467 case EM_TI_C6000:
1468 rtype = elf_tic6x_reloc_type (type);
1469 break;
aa137e4d
NC
1470
1471 case EM_TILEGX:
1472 rtype = elf_tilegx_reloc_type (type);
1473 break;
1474
1475 case EM_TILEPRO:
1476 rtype = elf_tilepro_reloc_type (type);
1477 break;
f6c1a2d5
NC
1478
1479 case EM_XGATE:
1480 rtype = elf_xgate_reloc_type (type);
1481 break;
36591ba1
SL
1482
1483 case EM_ALTERA_NIOS2:
1484 rtype = elf_nios2_reloc_type (type);
1485 break;
252b5132
RH
1486 }
1487
1488 if (rtype == NULL)
39dbeff8 1489 printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
252b5132 1490 else
8beeaeb7 1491 printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
252b5132 1492
7ace3541 1493 if (elf_header.e_machine == EM_ALPHA
157c2599 1494 && rtype != NULL
7ace3541
RH
1495 && streq (rtype, "R_ALPHA_LITUSE")
1496 && is_rela)
1497 {
1498 switch (rels[i].r_addend)
1499 {
1500 case LITUSE_ALPHA_ADDR: rtype = "ADDR"; break;
1501 case LITUSE_ALPHA_BASE: rtype = "BASE"; break;
1502 case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1503 case LITUSE_ALPHA_JSR: rtype = "JSR"; break;
1504 case LITUSE_ALPHA_TLSGD: rtype = "TLSGD"; break;
1505 case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1506 case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1507 default: rtype = NULL;
1508 }
1509 if (rtype)
1510 printf (" (%s)", rtype);
1511 else
1512 {
1513 putchar (' ');
1514 printf (_("<unknown addend: %lx>"),
1515 (unsigned long) rels[i].r_addend);
1516 }
1517 }
1518 else if (symtab_index)
252b5132 1519 {
af3fc3bc 1520 if (symtab == NULL || symtab_index >= nsyms)
2b692964 1521 printf (_(" bad symbol index: %08lx"), (unsigned long) symtab_index);
af3fc3bc 1522 else
19936277 1523 {
2cf0635d 1524 Elf_Internal_Sym * psym;
bb4d2ac2
L
1525 const char * version_string;
1526 enum versioned_symbol_info sym_info;
1527 unsigned short vna_other;
19936277 1528
af3fc3bc 1529 psym = symtab + symtab_index;
103f02d3 1530
bb4d2ac2
L
1531 version_string
1532 = get_symbol_version_string (file, is_dynsym,
1533 strtab, strtablen,
1534 symtab_index,
1535 psym,
1536 &sym_info,
1537 &vna_other);
1538
af3fc3bc 1539 printf (" ");
171191ba 1540
d8045f23
NC
1541 if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1542 {
1543 const char * name;
1544 unsigned int len;
1545 unsigned int width = is_32bit_elf ? 8 : 14;
1546
1547 /* Relocations against GNU_IFUNC symbols do not use the value
1548 of the symbol as the address to relocate against. Instead
1549 they invoke the function named by the symbol and use its
1550 result as the address for relocation.
1551
1552 To indicate this to the user, do not display the value of
1553 the symbol in the "Symbols's Value" field. Instead show
1554 its name followed by () as a hint that the symbol is
1555 invoked. */
1556
1557 if (strtab == NULL
1558 || psym->st_name == 0
1559 || psym->st_name >= strtablen)
1560 name = "??";
1561 else
1562 name = strtab + psym->st_name;
1563
1564 len = print_symbol (width, name);
bb4d2ac2
L
1565 if (version_string)
1566 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1567 version_string);
d8045f23
NC
1568 printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1569 }
1570 else
1571 {
1572 print_vma (psym->st_value, LONG_HEX);
171191ba 1573
d8045f23
NC
1574 printf (is_32bit_elf ? " " : " ");
1575 }
103f02d3 1576
af3fc3bc 1577 if (psym->st_name == 0)
f1ef08cb 1578 {
2cf0635d 1579 const char * sec_name = "<null>";
f1ef08cb
AM
1580 char name_buf[40];
1581
1582 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1583 {
4fbb74a6 1584 if (psym->st_shndx < elf_header.e_shnum)
74e1a04b 1585 sec_name = SECTION_NAME (section_headers + psym->st_shndx);
f1ef08cb
AM
1586 else if (psym->st_shndx == SHN_ABS)
1587 sec_name = "ABS";
1588 else if (psym->st_shndx == SHN_COMMON)
1589 sec_name = "COMMON";
ac145307
BS
1590 else if ((elf_header.e_machine == EM_MIPS
1591 && psym->st_shndx == SHN_MIPS_SCOMMON)
1592 || (elf_header.e_machine == EM_TI_C6000
1593 && psym->st_shndx == SHN_TIC6X_SCOMMON))
172553c7
TS
1594 sec_name = "SCOMMON";
1595 else if (elf_header.e_machine == EM_MIPS
1596 && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1597 sec_name = "SUNDEF";
8a9036a4 1598 else if ((elf_header.e_machine == EM_X86_64
7a9068fe
L
1599 || elf_header.e_machine == EM_L1OM
1600 || elf_header.e_machine == EM_K1OM)
3b22753a
L
1601 && psym->st_shndx == SHN_X86_64_LCOMMON)
1602 sec_name = "LARGE_COMMON";
9ce701e2
L
1603 else if (elf_header.e_machine == EM_IA_64
1604 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1605 && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1606 sec_name = "ANSI_COM";
28f997cf 1607 else if (is_ia64_vms ()
148b93f2
NC
1608 && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1609 sec_name = "VMS_SYMVEC";
f1ef08cb
AM
1610 else
1611 {
1612 sprintf (name_buf, "<section 0x%x>",
1613 (unsigned int) psym->st_shndx);
1614 sec_name = name_buf;
1615 }
1616 }
1617 print_symbol (22, sec_name);
1618 }
af3fc3bc 1619 else if (strtab == NULL)
d79b3d50 1620 printf (_("<string table index: %3ld>"), psym->st_name);
c256ffe7 1621 else if (psym->st_name >= strtablen)
d79b3d50 1622 printf (_("<corrupt string table index: %3ld>"), psym->st_name);
af3fc3bc 1623 else
bb4d2ac2
L
1624 {
1625 print_symbol (22, strtab + psym->st_name);
1626 if (version_string)
1627 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1628 version_string);
1629 }
103f02d3 1630
af3fc3bc 1631 if (is_rela)
171191ba 1632 {
7360e63f 1633 bfd_vma off = rels[i].r_addend;
171191ba 1634
7360e63f 1635 if ((bfd_signed_vma) off < 0)
598aaa76 1636 printf (" - %" BFD_VMA_FMT "x", - off);
171191ba 1637 else
598aaa76 1638 printf (" + %" BFD_VMA_FMT "x", off);
171191ba 1639 }
19936277 1640 }
252b5132 1641 }
1b228002 1642 else if (is_rela)
f7a99963 1643 {
7360e63f 1644 bfd_vma off = rels[i].r_addend;
e04d7088
L
1645
1646 printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
7360e63f 1647 if ((bfd_signed_vma) off < 0)
e04d7088
L
1648 printf ("-%" BFD_VMA_FMT "x", - off);
1649 else
1650 printf ("%" BFD_VMA_FMT "x", off);
f7a99963 1651 }
252b5132 1652
157c2599
NC
1653 if (elf_header.e_machine == EM_SPARCV9
1654 && rtype != NULL
1655 && streq (rtype, "R_SPARC_OLO10"))
91d6fa6a 1656 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
351b4b40 1657
252b5132 1658 putchar ('\n');
2c71103e 1659
aca88567 1660#ifdef BFD64
53c7db4b 1661 if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
2c71103e 1662 {
91d6fa6a
NC
1663 bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1664 bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
2cf0635d
NC
1665 const char * rtype2 = elf_mips_reloc_type (type2);
1666 const char * rtype3 = elf_mips_reloc_type (type3);
aca88567 1667
2c71103e
NC
1668 printf (" Type2: ");
1669
1670 if (rtype2 == NULL)
39dbeff8
AM
1671 printf (_("unrecognized: %-7lx"),
1672 (unsigned long) type2 & 0xffffffff);
2c71103e
NC
1673 else
1674 printf ("%-17.17s", rtype2);
1675
18bd398b 1676 printf ("\n Type3: ");
2c71103e
NC
1677
1678 if (rtype3 == NULL)
39dbeff8
AM
1679 printf (_("unrecognized: %-7lx"),
1680 (unsigned long) type3 & 0xffffffff);
2c71103e
NC
1681 else
1682 printf ("%-17.17s", rtype3);
1683
53c7db4b 1684 putchar ('\n');
2c71103e 1685 }
aca88567 1686#endif /* BFD64 */
252b5132
RH
1687 }
1688
c8286bd1 1689 free (rels);
252b5132
RH
1690}
1691
1692static const char *
d3ba0551 1693get_mips_dynamic_type (unsigned long type)
252b5132
RH
1694{
1695 switch (type)
1696 {
1697 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1698 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1699 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1700 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1701 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1702 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1703 case DT_MIPS_MSYM: return "MIPS_MSYM";
1704 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1705 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1706 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1707 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1708 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1709 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1710 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1711 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1712 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1713 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
a5499fa4 1714 case DT_MIPS_RLD_MAP_REL: return "MIPS_RLD_MAP_REL";
252b5132
RH
1715 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1716 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1717 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1718 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1719 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1720 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1721 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1722 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1723 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1724 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1725 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1726 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1727 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1728 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1729 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1730 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1731 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1732 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1733 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1734 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1735 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1736 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1737 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1738 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1739 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1740 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
861fb55a
DJ
1741 case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1742 case DT_MIPS_RWPLT: return "MIPS_RWPLT";
252b5132
RH
1743 default:
1744 return NULL;
1745 }
1746}
1747
9a097730 1748static const char *
d3ba0551 1749get_sparc64_dynamic_type (unsigned long type)
9a097730
RH
1750{
1751 switch (type)
1752 {
1753 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1754 default:
1755 return NULL;
1756 }
103f02d3
UD
1757}
1758
7490d522
AM
1759static const char *
1760get_ppc_dynamic_type (unsigned long type)
1761{
1762 switch (type)
1763 {
a7f2871e 1764 case DT_PPC_GOT: return "PPC_GOT";
e8910a83 1765 case DT_PPC_OPT: return "PPC_OPT";
7490d522
AM
1766 default:
1767 return NULL;
1768 }
1769}
1770
f1cb7e17 1771static const char *
d3ba0551 1772get_ppc64_dynamic_type (unsigned long type)
f1cb7e17
AM
1773{
1774 switch (type)
1775 {
a7f2871e
AM
1776 case DT_PPC64_GLINK: return "PPC64_GLINK";
1777 case DT_PPC64_OPD: return "PPC64_OPD";
1778 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
e8910a83 1779 case DT_PPC64_OPT: return "PPC64_OPT";
f1cb7e17
AM
1780 default:
1781 return NULL;
1782 }
1783}
1784
103f02d3 1785static const char *
d3ba0551 1786get_parisc_dynamic_type (unsigned long type)
103f02d3
UD
1787{
1788 switch (type)
1789 {
1790 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1791 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1792 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1793 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1794 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1795 case DT_HP_PREINIT: return "HP_PREINIT";
1796 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1797 case DT_HP_NEEDED: return "HP_NEEDED";
1798 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1799 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1800 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1801 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1802 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
eec8f817
DA
1803 case DT_HP_EPLTREL: return "HP_GST_EPLTREL";
1804 case DT_HP_EPLTRELSZ: return "HP_GST_EPLTRELSZ";
1805 case DT_HP_FILTERED: return "HP_FILTERED";
1806 case DT_HP_FILTER_TLS: return "HP_FILTER_TLS";
1807 case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1808 case DT_HP_LAZYLOAD: return "HP_LAZYLOAD";
1809 case DT_HP_BIND_NOW_COUNT: return "HP_BIND_NOW_COUNT";
1810 case DT_PLT: return "PLT";
1811 case DT_PLT_SIZE: return "PLT_SIZE";
1812 case DT_DLT: return "DLT";
1813 case DT_DLT_SIZE: return "DLT_SIZE";
103f02d3
UD
1814 default:
1815 return NULL;
1816 }
1817}
9a097730 1818
ecc51f48 1819static const char *
d3ba0551 1820get_ia64_dynamic_type (unsigned long type)
ecc51f48
NC
1821{
1822 switch (type)
1823 {
148b93f2
NC
1824 case DT_IA_64_PLT_RESERVE: return "IA_64_PLT_RESERVE";
1825 case DT_IA_64_VMS_SUBTYPE: return "VMS_SUBTYPE";
1826 case DT_IA_64_VMS_IMGIOCNT: return "VMS_IMGIOCNT";
1827 case DT_IA_64_VMS_LNKFLAGS: return "VMS_LNKFLAGS";
1828 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1829 case DT_IA_64_VMS_IDENT: return "VMS_IDENT";
1830 case DT_IA_64_VMS_NEEDED_IDENT: return "VMS_NEEDED_IDENT";
1831 case DT_IA_64_VMS_IMG_RELA_CNT: return "VMS_IMG_RELA_CNT";
1832 case DT_IA_64_VMS_SEG_RELA_CNT: return "VMS_SEG_RELA_CNT";
1833 case DT_IA_64_VMS_FIXUP_RELA_CNT: return "VMS_FIXUP_RELA_CNT";
1834 case DT_IA_64_VMS_FIXUP_NEEDED: return "VMS_FIXUP_NEEDED";
1835 case DT_IA_64_VMS_SYMVEC_CNT: return "VMS_SYMVEC_CNT";
1836 case DT_IA_64_VMS_XLATED: return "VMS_XLATED";
1837 case DT_IA_64_VMS_STACKSIZE: return "VMS_STACKSIZE";
1838 case DT_IA_64_VMS_UNWINDSZ: return "VMS_UNWINDSZ";
1839 case DT_IA_64_VMS_UNWIND_CODSEG: return "VMS_UNWIND_CODSEG";
1840 case DT_IA_64_VMS_UNWIND_INFOSEG: return "VMS_UNWIND_INFOSEG";
1841 case DT_IA_64_VMS_LINKTIME: return "VMS_LINKTIME";
1842 case DT_IA_64_VMS_SEG_NO: return "VMS_SEG_NO";
1843 case DT_IA_64_VMS_SYMVEC_OFFSET: return "VMS_SYMVEC_OFFSET";
1844 case DT_IA_64_VMS_SYMVEC_SEG: return "VMS_SYMVEC_SEG";
1845 case DT_IA_64_VMS_UNWIND_OFFSET: return "VMS_UNWIND_OFFSET";
1846 case DT_IA_64_VMS_UNWIND_SEG: return "VMS_UNWIND_SEG";
1847 case DT_IA_64_VMS_STRTAB_OFFSET: return "VMS_STRTAB_OFFSET";
1848 case DT_IA_64_VMS_SYSVER_OFFSET: return "VMS_SYSVER_OFFSET";
1849 case DT_IA_64_VMS_IMG_RELA_OFF: return "VMS_IMG_RELA_OFF";
1850 case DT_IA_64_VMS_SEG_RELA_OFF: return "VMS_SEG_RELA_OFF";
1851 case DT_IA_64_VMS_FIXUP_RELA_OFF: return "VMS_FIXUP_RELA_OFF";
1852 case DT_IA_64_VMS_PLTGOT_OFFSET: return "VMS_PLTGOT_OFFSET";
1853 case DT_IA_64_VMS_PLTGOT_SEG: return "VMS_PLTGOT_SEG";
1854 case DT_IA_64_VMS_FPMODE: return "VMS_FPMODE";
ecc51f48
NC
1855 default:
1856 return NULL;
1857 }
1858}
1859
fd85a6a1
NC
1860static const char *
1861get_solaris_section_type (unsigned long type)
1862{
1863 switch (type)
1864 {
1865 case 0x6fffffee: return "SUNW_ancillary";
1866 case 0x6fffffef: return "SUNW_capchain";
1867 case 0x6ffffff0: return "SUNW_capinfo";
1868 case 0x6ffffff1: return "SUNW_symsort";
1869 case 0x6ffffff2: return "SUNW_tlssort";
1870 case 0x6ffffff3: return "SUNW_LDYNSYM";
1871 case 0x6ffffff4: return "SUNW_dof";
1872 case 0x6ffffff5: return "SUNW_cap";
1873 case 0x6ffffff6: return "SUNW_SIGNATURE";
1874 case 0x6ffffff7: return "SUNW_ANNOTATE";
1875 case 0x6ffffff8: return "SUNW_DEBUGSTR";
1876 case 0x6ffffff9: return "SUNW_DEBUG";
1877 case 0x6ffffffa: return "SUNW_move";
1878 case 0x6ffffffb: return "SUNW_COMDAT";
1879 case 0x6ffffffc: return "SUNW_syminfo";
1880 case 0x6ffffffd: return "SUNW_verdef";
1881 case 0x6ffffffe: return "SUNW_verneed";
1882 case 0x6fffffff: return "SUNW_versym";
1883 case 0x70000000: return "SPARC_GOTDATA";
1884 default: return NULL;
1885 }
1886}
1887
fabcb361
RH
1888static const char *
1889get_alpha_dynamic_type (unsigned long type)
1890{
1891 switch (type)
1892 {
1893 case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1894 default:
1895 return NULL;
1896 }
1897}
1898
1c0d3aa6
NC
1899static const char *
1900get_score_dynamic_type (unsigned long type)
1901{
1902 switch (type)
1903 {
1904 case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1905 case DT_SCORE_LOCAL_GOTNO: return "SCORE_LOCAL_GOTNO";
1906 case DT_SCORE_SYMTABNO: return "SCORE_SYMTABNO";
1907 case DT_SCORE_GOTSYM: return "SCORE_GOTSYM";
1908 case DT_SCORE_UNREFEXTNO: return "SCORE_UNREFEXTNO";
1909 case DT_SCORE_HIPAGENO: return "SCORE_HIPAGENO";
1910 default:
1911 return NULL;
1912 }
1913}
1914
40b36596
JM
1915static const char *
1916get_tic6x_dynamic_type (unsigned long type)
1917{
1918 switch (type)
1919 {
1920 case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1921 case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1922 case DT_C6000_DSBT_BASE: return "C6000_DSBT_BASE";
1923 case DT_C6000_DSBT_SIZE: return "C6000_DSBT_SIZE";
1924 case DT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
1925 case DT_C6000_DSBT_INDEX: return "C6000_DSBT_INDEX";
1926 default:
1927 return NULL;
1928 }
1929}
1c0d3aa6 1930
36591ba1
SL
1931static const char *
1932get_nios2_dynamic_type (unsigned long type)
1933{
1934 switch (type)
1935 {
1936 case DT_NIOS2_GP: return "NIOS2_GP";
1937 default:
1938 return NULL;
1939 }
1940}
1941
fd85a6a1
NC
1942static const char *
1943get_solaris_dynamic_type (unsigned long type)
1944{
1945 switch (type)
1946 {
1947 case 0x6000000d: return "SUNW_AUXILIARY";
1948 case 0x6000000e: return "SUNW_RTLDINF";
1949 case 0x6000000f: return "SUNW_FILTER";
1950 case 0x60000010: return "SUNW_CAP";
1951 case 0x60000011: return "SUNW_SYMTAB";
1952 case 0x60000012: return "SUNW_SYMSZ";
1953 case 0x60000013: return "SUNW_SORTENT";
1954 case 0x60000014: return "SUNW_SYMSORT";
1955 case 0x60000015: return "SUNW_SYMSORTSZ";
1956 case 0x60000016: return "SUNW_TLSSORT";
1957 case 0x60000017: return "SUNW_TLSSORTSZ";
1958 case 0x60000018: return "SUNW_CAPINFO";
1959 case 0x60000019: return "SUNW_STRPAD";
1960 case 0x6000001a: return "SUNW_CAPCHAIN";
1961 case 0x6000001b: return "SUNW_LDMACH";
1962 case 0x6000001d: return "SUNW_CAPCHAINENT";
1963 case 0x6000001f: return "SUNW_CAPCHAINSZ";
1964 case 0x60000021: return "SUNW_PARENT";
1965 case 0x60000023: return "SUNW_ASLR";
1966 case 0x60000025: return "SUNW_RELAX";
1967 case 0x60000029: return "SUNW_NXHEAP";
1968 case 0x6000002b: return "SUNW_NXSTACK";
1969
1970 case 0x70000001: return "SPARC_REGISTER";
1971 case 0x7ffffffd: return "AUXILIARY";
1972 case 0x7ffffffe: return "USED";
1973 case 0x7fffffff: return "FILTER";
1974
15f205b1 1975 default: return NULL;
fd85a6a1
NC
1976 }
1977}
1978
252b5132 1979static const char *
d3ba0551 1980get_dynamic_type (unsigned long type)
252b5132 1981{
e9e44622 1982 static char buff[64];
252b5132
RH
1983
1984 switch (type)
1985 {
1986 case DT_NULL: return "NULL";
1987 case DT_NEEDED: return "NEEDED";
1988 case DT_PLTRELSZ: return "PLTRELSZ";
1989 case DT_PLTGOT: return "PLTGOT";
1990 case DT_HASH: return "HASH";
1991 case DT_STRTAB: return "STRTAB";
1992 case DT_SYMTAB: return "SYMTAB";
1993 case DT_RELA: return "RELA";
1994 case DT_RELASZ: return "RELASZ";
1995 case DT_RELAENT: return "RELAENT";
1996 case DT_STRSZ: return "STRSZ";
1997 case DT_SYMENT: return "SYMENT";
1998 case DT_INIT: return "INIT";
1999 case DT_FINI: return "FINI";
2000 case DT_SONAME: return "SONAME";
2001 case DT_RPATH: return "RPATH";
2002 case DT_SYMBOLIC: return "SYMBOLIC";
2003 case DT_REL: return "REL";
2004 case DT_RELSZ: return "RELSZ";
2005 case DT_RELENT: return "RELENT";
2006 case DT_PLTREL: return "PLTREL";
2007 case DT_DEBUG: return "DEBUG";
2008 case DT_TEXTREL: return "TEXTREL";
2009 case DT_JMPREL: return "JMPREL";
2010 case DT_BIND_NOW: return "BIND_NOW";
2011 case DT_INIT_ARRAY: return "INIT_ARRAY";
2012 case DT_FINI_ARRAY: return "FINI_ARRAY";
2013 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
2014 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
d1133906
NC
2015 case DT_RUNPATH: return "RUNPATH";
2016 case DT_FLAGS: return "FLAGS";
2d0e6f43 2017
d1133906
NC
2018 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2019 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
6d913794 2020 case DT_SYMTAB_SHNDX: return "SYMTAB_SHNDX";
103f02d3 2021
05107a46 2022 case DT_CHECKSUM: return "CHECKSUM";
252b5132
RH
2023 case DT_PLTPADSZ: return "PLTPADSZ";
2024 case DT_MOVEENT: return "MOVEENT";
2025 case DT_MOVESZ: return "MOVESZ";
dcefbbbd 2026 case DT_FEATURE: return "FEATURE";
252b5132
RH
2027 case DT_POSFLAG_1: return "POSFLAG_1";
2028 case DT_SYMINSZ: return "SYMINSZ";
2029 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
103f02d3 2030
252b5132 2031 case DT_ADDRRNGLO: return "ADDRRNGLO";
dcefbbbd
L
2032 case DT_CONFIG: return "CONFIG";
2033 case DT_DEPAUDIT: return "DEPAUDIT";
2034 case DT_AUDIT: return "AUDIT";
2035 case DT_PLTPAD: return "PLTPAD";
2036 case DT_MOVETAB: return "MOVETAB";
252b5132 2037 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
103f02d3 2038
252b5132 2039 case DT_VERSYM: return "VERSYM";
103f02d3 2040
67a4f2b7
AO
2041 case DT_TLSDESC_GOT: return "TLSDESC_GOT";
2042 case DT_TLSDESC_PLT: return "TLSDESC_PLT";
252b5132
RH
2043 case DT_RELACOUNT: return "RELACOUNT";
2044 case DT_RELCOUNT: return "RELCOUNT";
2045 case DT_FLAGS_1: return "FLAGS_1";
2046 case DT_VERDEF: return "VERDEF";
2047 case DT_VERDEFNUM: return "VERDEFNUM";
2048 case DT_VERNEED: return "VERNEED";
2049 case DT_VERNEEDNUM: return "VERNEEDNUM";
103f02d3 2050
019148e4 2051 case DT_AUXILIARY: return "AUXILIARY";
252b5132
RH
2052 case DT_USED: return "USED";
2053 case DT_FILTER: return "FILTER";
103f02d3 2054
047b2264
JJ
2055 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
2056 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
2057 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
2058 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
2059 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
fdc90cb4 2060 case DT_GNU_HASH: return "GNU_HASH";
047b2264 2061
252b5132
RH
2062 default:
2063 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
2064 {
2cf0635d 2065 const char * result;
103f02d3 2066
252b5132
RH
2067 switch (elf_header.e_machine)
2068 {
2069 case EM_MIPS:
4fe85591 2070 case EM_MIPS_RS3_LE:
252b5132
RH
2071 result = get_mips_dynamic_type (type);
2072 break;
9a097730
RH
2073 case EM_SPARCV9:
2074 result = get_sparc64_dynamic_type (type);
2075 break;
7490d522
AM
2076 case EM_PPC:
2077 result = get_ppc_dynamic_type (type);
2078 break;
f1cb7e17
AM
2079 case EM_PPC64:
2080 result = get_ppc64_dynamic_type (type);
2081 break;
ecc51f48
NC
2082 case EM_IA_64:
2083 result = get_ia64_dynamic_type (type);
2084 break;
fabcb361
RH
2085 case EM_ALPHA:
2086 result = get_alpha_dynamic_type (type);
2087 break;
1c0d3aa6
NC
2088 case EM_SCORE:
2089 result = get_score_dynamic_type (type);
2090 break;
40b36596
JM
2091 case EM_TI_C6000:
2092 result = get_tic6x_dynamic_type (type);
2093 break;
36591ba1
SL
2094 case EM_ALTERA_NIOS2:
2095 result = get_nios2_dynamic_type (type);
2096 break;
252b5132 2097 default:
fd85a6a1
NC
2098 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2099 result = get_solaris_dynamic_type (type);
2100 else
2101 result = NULL;
252b5132
RH
2102 break;
2103 }
2104
2105 if (result != NULL)
2106 return result;
2107
e9e44622 2108 snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
252b5132 2109 }
eec8f817
DA
2110 else if (((type >= DT_LOOS) && (type <= DT_HIOS))
2111 || (elf_header.e_machine == EM_PARISC
2112 && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
103f02d3 2113 {
2cf0635d 2114 const char * result;
103f02d3
UD
2115
2116 switch (elf_header.e_machine)
2117 {
2118 case EM_PARISC:
2119 result = get_parisc_dynamic_type (type);
2120 break;
148b93f2
NC
2121 case EM_IA_64:
2122 result = get_ia64_dynamic_type (type);
2123 break;
103f02d3 2124 default:
fd85a6a1
NC
2125 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2126 result = get_solaris_dynamic_type (type);
2127 else
2128 result = NULL;
103f02d3
UD
2129 break;
2130 }
2131
2132 if (result != NULL)
2133 return result;
2134
e9e44622
JJ
2135 snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2136 type);
103f02d3 2137 }
252b5132 2138 else
e9e44622 2139 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
103f02d3 2140
252b5132
RH
2141 return buff;
2142 }
2143}
2144
2145static char *
d3ba0551 2146get_file_type (unsigned e_type)
252b5132 2147{
b34976b6 2148 static char buff[32];
252b5132
RH
2149
2150 switch (e_type)
2151 {
2152 case ET_NONE: return _("NONE (None)");
2153 case ET_REL: return _("REL (Relocatable file)");
ba2685cc
AM
2154 case ET_EXEC: return _("EXEC (Executable file)");
2155 case ET_DYN: return _("DYN (Shared object file)");
2156 case ET_CORE: return _("CORE (Core file)");
252b5132
RH
2157
2158 default:
2159 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
e9e44622 2160 snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
252b5132 2161 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
e9e44622 2162 snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
252b5132 2163 else
e9e44622 2164 snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
252b5132
RH
2165 return buff;
2166 }
2167}
2168
2169static char *
d3ba0551 2170get_machine_name (unsigned e_machine)
252b5132 2171{
b34976b6 2172 static char buff[64]; /* XXX */
252b5132
RH
2173
2174 switch (e_machine)
2175 {
c45021f2 2176 case EM_NONE: return _("None");
a06ea964 2177 case EM_AARCH64: return "AArch64";
c45021f2
NC
2178 case EM_M32: return "WE32100";
2179 case EM_SPARC: return "Sparc";
e9f53129 2180 case EM_SPU: return "SPU";
c45021f2
NC
2181 case EM_386: return "Intel 80386";
2182 case EM_68K: return "MC68000";
2183 case EM_88K: return "MC88000";
22abe556 2184 case EM_IAMCU: return "Intel MCU";
c45021f2
NC
2185 case EM_860: return "Intel 80860";
2186 case EM_MIPS: return "MIPS R3000";
2187 case EM_S370: return "IBM System/370";
7036c0e1 2188 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
252b5132 2189 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
c45021f2 2190 case EM_PARISC: return "HPPA";
252b5132 2191 case EM_PPC_OLD: return "Power PC (old)";
7036c0e1 2192 case EM_SPARC32PLUS: return "Sparc v8+" ;
c45021f2
NC
2193 case EM_960: return "Intel 90860";
2194 case EM_PPC: return "PowerPC";
285d1771 2195 case EM_PPC64: return "PowerPC64";
c45021f2 2196 case EM_FR20: return "Fujitsu FR20";
3f8107ab 2197 case EM_FT32: return "FTDI FT32";
c45021f2 2198 case EM_RH32: return "TRW RH32";
b34976b6 2199 case EM_MCORE: return "MCORE";
7036c0e1
AJ
2200 case EM_ARM: return "ARM";
2201 case EM_OLD_ALPHA: return "Digital Alpha (old)";
ef230218 2202 case EM_SH: return "Renesas / SuperH SH";
c45021f2
NC
2203 case EM_SPARCV9: return "Sparc v9";
2204 case EM_TRICORE: return "Siemens Tricore";
584da044 2205 case EM_ARC: return "ARC";
886a2506
NC
2206 case EM_ARC_COMPACT: return "ARCompact";
2207 case EM_ARC_COMPACT2: return "ARCv2";
c2dcd04e
NC
2208 case EM_H8_300: return "Renesas H8/300";
2209 case EM_H8_300H: return "Renesas H8/300H";
2210 case EM_H8S: return "Renesas H8S";
2211 case EM_H8_500: return "Renesas H8/500";
30800947 2212 case EM_IA_64: return "Intel IA-64";
252b5132
RH
2213 case EM_MIPS_X: return "Stanford MIPS-X";
2214 case EM_COLDFIRE: return "Motorola Coldfire";
c45021f2 2215 case EM_ALPHA: return "Alpha";
2b0337b0
AO
2216 case EM_CYGNUS_D10V:
2217 case EM_D10V: return "d10v";
2218 case EM_CYGNUS_D30V:
b34976b6 2219 case EM_D30V: return "d30v";
2b0337b0 2220 case EM_CYGNUS_M32R:
26597c86 2221 case EM_M32R: return "Renesas M32R (formerly Mitsubishi M32r)";
2b0337b0 2222 case EM_CYGNUS_V850:
708e2187 2223 case EM_V800: return "Renesas V850 (using RH850 ABI)";
f6c1a2d5 2224 case EM_V850: return "Renesas V850";
2b0337b0
AO
2225 case EM_CYGNUS_MN10300:
2226 case EM_MN10300: return "mn10300";
2227 case EM_CYGNUS_MN10200:
2228 case EM_MN10200: return "mn10200";
5506d11a 2229 case EM_MOXIE: return "Moxie";
2b0337b0
AO
2230 case EM_CYGNUS_FR30:
2231 case EM_FR30: return "Fujitsu FR30";
b34976b6 2232 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
2b0337b0 2233 case EM_PJ_OLD:
b34976b6 2234 case EM_PJ: return "picoJava";
7036c0e1
AJ
2235 case EM_MMA: return "Fujitsu Multimedia Accelerator";
2236 case EM_PCP: return "Siemens PCP";
2237 case EM_NCPU: return "Sony nCPU embedded RISC processor";
2238 case EM_NDR1: return "Denso NDR1 microprocesspr";
2239 case EM_STARCORE: return "Motorola Star*Core processor";
2240 case EM_ME16: return "Toyota ME16 processor";
2241 case EM_ST100: return "STMicroelectronics ST100 processor";
2242 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
11636f9e
JM
2243 case EM_PDSP: return "Sony DSP processor";
2244 case EM_PDP10: return "Digital Equipment Corp. PDP-10";
2245 case EM_PDP11: return "Digital Equipment Corp. PDP-11";
7036c0e1
AJ
2246 case EM_FX66: return "Siemens FX66 microcontroller";
2247 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2248 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
2249 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
6927f982 2250 case EM_68HC12: return "Motorola MC68HC12 Microcontroller";
7036c0e1
AJ
2251 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
2252 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
2253 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
2254 case EM_SVX: return "Silicon Graphics SVx";
2255 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
2256 case EM_VAX: return "Digital VAX";
619ed720 2257 case EM_VISIUM: return "CDS VISIUMcore processor";
2b0337b0 2258 case EM_AVR_OLD:
b34976b6 2259 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
1b61cf92 2260 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
c45021f2
NC
2261 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
2262 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
2263 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
b34976b6 2264 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
c45021f2 2265 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
3b36097d 2266 case EM_PRISM: return "Vitesse Prism";
bcedfee6 2267 case EM_X86_64: return "Advanced Micro Devices X86-64";
8a9036a4 2268 case EM_L1OM: return "Intel L1OM";
7a9068fe 2269 case EM_K1OM: return "Intel K1OM";
b7498e0e 2270 case EM_S390_OLD:
b34976b6 2271 case EM_S390: return "IBM S/390";
1c0d3aa6 2272 case EM_SCORE: return "SUNPLUS S+Core";
61865e30 2273 case EM_XSTORMY16: return "Sanyo XStormy16 CPU core";
73589c9d 2274 case EM_OR1K: return "OpenRISC 1000";
1fe1f39c 2275 case EM_CRX: return "National Semiconductor CRX microprocessor";
cfb8c092 2276 case EM_ADAPTEVA_EPIPHANY: return "Adapteva EPIPHANY";
d172d4ba 2277 case EM_DLX: return "OpenDLX";
1e4cf259 2278 case EM_IP2K_OLD:
b34976b6 2279 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
3b36097d 2280 case EM_IQ2000: return "Vitesse IQ2000";
88da6820
NC
2281 case EM_XTENSA_OLD:
2282 case EM_XTENSA: return "Tensilica Xtensa Processor";
11636f9e
JM
2283 case EM_VIDEOCORE: return "Alphamosaic VideoCore processor";
2284 case EM_TMM_GPP: return "Thompson Multimedia General Purpose Processor";
2285 case EM_NS32K: return "National Semiconductor 32000 series";
2286 case EM_TPC: return "Tenor Network TPC processor";
2287 case EM_ST200: return "STMicroelectronics ST200 microcontroller";
2288 case EM_MAX: return "MAX Processor";
2289 case EM_CR: return "National Semiconductor CompactRISC";
2290 case EM_F2MC16: return "Fujitsu F2MC16";
2291 case EM_MSP430: return "Texas Instruments msp430 microcontroller";
84e94c90 2292 case EM_LATTICEMICO32: return "Lattice Mico32";
ff7eeb89 2293 case EM_M32C_OLD:
49f58d10 2294 case EM_M32C: return "Renesas M32c";
d031aafb 2295 case EM_MT: return "Morpho Techologies MT processor";
7bbe5bc5 2296 case EM_BLACKFIN: return "Analog Devices Blackfin";
11636f9e
JM
2297 case EM_SE_C33: return "S1C33 Family of Seiko Epson processors";
2298 case EM_SEP: return "Sharp embedded microprocessor";
2299 case EM_ARCA: return "Arca RISC microprocessor";
2300 case EM_UNICORE: return "Unicore";
2301 case EM_EXCESS: return "eXcess 16/32/64-bit configurable embedded CPU";
2302 case EM_DXP: return "Icera Semiconductor Inc. Deep Execution Processor";
64fd6348
NC
2303 case EM_NIOS32: return "Altera Nios";
2304 case EM_ALTERA_NIOS2: return "Altera Nios II";
c29aca4a 2305 case EM_C166:
d70c5fc7 2306 case EM_XC16X: return "Infineon Technologies xc16x";
11636f9e
JM
2307 case EM_M16C: return "Renesas M16C series microprocessors";
2308 case EM_DSPIC30F: return "Microchip Technology dsPIC30F Digital Signal Controller";
2309 case EM_CE: return "Freescale Communication Engine RISC core";
2310 case EM_TSK3000: return "Altium TSK3000 core";
2311 case EM_RS08: return "Freescale RS08 embedded processor";
2312 case EM_ECOG2: return "Cyan Technology eCOG2 microprocessor";
2313 case EM_DSP24: return "New Japan Radio (NJR) 24-bit DSP Processor";
2314 case EM_VIDEOCORE3: return "Broadcom VideoCore III processor";
2315 case EM_SE_C17: return "Seiko Epson C17 family";
2316 case EM_TI_C6000: return "Texas Instruments TMS320C6000 DSP family";
2317 case EM_TI_C2000: return "Texas Instruments TMS320C2000 DSP family";
2318 case EM_TI_C5500: return "Texas Instruments TMS320C55x DSP family";
2319 case EM_MMDSP_PLUS: return "STMicroelectronics 64bit VLIW Data Signal Processor";
2320 case EM_CYPRESS_M8C: return "Cypress M8C microprocessor";
2321 case EM_R32C: return "Renesas R32C series microprocessors";
2322 case EM_TRIMEDIA: return "NXP Semiconductors TriMedia architecture family";
2323 case EM_QDSP6: return "QUALCOMM DSP6 Processor";
2324 case EM_8051: return "Intel 8051 and variants";
2325 case EM_STXP7X: return "STMicroelectronics STxP7x family";
2326 case EM_NDS32: return "Andes Technology compact code size embedded RISC processor family";
2327 case EM_ECOG1X: return "Cyan Technology eCOG1X family";
2328 case EM_MAXQ30: return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2329 case EM_XIMO16: return "New Japan Radio (NJR) 16-bit DSP Processor";
2330 case EM_MANIK: return "M2000 Reconfigurable RISC Microprocessor";
2331 case EM_CRAYNV2: return "Cray Inc. NV2 vector architecture";
15ab5209 2332 case EM_CYGNUS_MEP: return "Toshiba MeP Media Engine";
cb8f3167 2333 case EM_CR16:
f6c1a2d5 2334 case EM_MICROBLAZE:
7ba29e2a 2335 case EM_MICROBLAZE_OLD: return "Xilinx MicroBlaze";
e23eba97 2336 case EM_RISCV: return "RISC-V";
99c513f6 2337 case EM_RL78: return "Renesas RL78";
c7927a3c 2338 case EM_RX: return "Renesas RX";
a3c62988 2339 case EM_METAG: return "Imagination Technologies Meta processor architecture";
11636f9e
JM
2340 case EM_MCST_ELBRUS: return "MCST Elbrus general purpose hardware architecture";
2341 case EM_ECOG16: return "Cyan Technology eCOG16 family";
2342 case EM_ETPU: return "Freescale Extended Time Processing Unit";
2343 case EM_SLE9X: return "Infineon Technologies SLE9X core";
2344 case EM_AVR32: return "Atmel Corporation 32-bit microprocessor family";
2345 case EM_STM8: return "STMicroeletronics STM8 8-bit microcontroller";
2346 case EM_TILE64: return "Tilera TILE64 multicore architecture family";
2347 case EM_TILEPRO: return "Tilera TILEPro multicore architecture family";
aa137e4d 2348 case EM_TILEGX: return "Tilera TILE-Gx multicore architecture family";
11636f9e 2349 case EM_CUDA: return "NVIDIA CUDA architecture";
f6c1a2d5 2350 case EM_XGATE: return "Motorola XGATE embedded processor";
6d913794
NC
2351 case EM_CLOUDSHIELD: return "CloudShield architecture family";
2352 case EM_COREA_1ST: return "KIPO-KAIST Core-A 1st generation processor family";
2353 case EM_COREA_2ND: return "KIPO-KAIST Core-A 2nd generation processor family";
2354 case EM_OPEN8: return "Open8 8-bit RISC soft processor core";
2355 case EM_VIDEOCORE5: return "Broadcom VideoCore V processor";
2356 case EM_56800EX: return "Freescale 56800EX Digital Signal Controller (DSC)";
15f205b1
NC
2357 case EM_BA1: return "Beyond BA1 CPU architecture";
2358 case EM_BA2: return "Beyond BA2 CPU architecture";
6d913794
NC
2359 case EM_XCORE: return "XMOS xCORE processor family";
2360 case EM_MCHP_PIC: return "Microchip 8-bit PIC(r) family";
2361 case EM_KM32: return "KM211 KM32 32-bit processor";
2362 case EM_KMX32: return "KM211 KMX32 32-bit processor";
2363 case EM_KMX16: return "KM211 KMX16 16-bit processor";
2364 case EM_KMX8: return "KM211 KMX8 8-bit processor";
2365 case EM_KVARC: return "KM211 KVARC processor";
15f205b1 2366 case EM_CDP: return "Paneve CDP architecture family";
6d913794
NC
2367 case EM_COGE: return "Cognitive Smart Memory Processor";
2368 case EM_COOL: return "Bluechip Systems CoolEngine";
2369 case EM_NORC: return "Nanoradio Optimized RISC";
2370 case EM_CSR_KALIMBA: return "CSR Kalimba architecture family";
15f205b1 2371 case EM_Z80: return "Zilog Z80";
6d913794 2372 case EM_AMDGPU: return "AMD GPU architecture";
252b5132 2373 default:
35d9dd2f 2374 snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
252b5132
RH
2375 return buff;
2376 }
2377}
2378
a9522a21
AB
2379static void
2380decode_ARC_machine_flags (unsigned e_flags, unsigned e_machine, char buf[])
2381{
2382 /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2. Some
2383 other compilers don't a specific architecture type in the e_flags, and
2384 instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
2385 architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
2386 architectures.
2387
2388 Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
2389 but also sets a specific architecture type in the e_flags field.
2390
2391 However, when decoding the flags we don't worry if we see an
2392 unexpected pairing, for example EM_ARC_COMPACT machine type, with
2393 ARCEM architecture type. */
2394
2395 switch (e_flags & EF_ARC_MACH_MSK)
2396 {
2397 /* We only expect these to occur for EM_ARC_COMPACT2. */
2398 case EF_ARC_CPU_ARCV2EM:
2399 strcat (buf, ", ARC EM");
2400 break;
2401 case EF_ARC_CPU_ARCV2HS:
2402 strcat (buf, ", ARC HS");
2403 break;
2404
2405 /* We only expect these to occur for EM_ARC_COMPACT. */
2406 case E_ARC_MACH_ARC600:
2407 strcat (buf, ", ARC600");
2408 break;
2409 case E_ARC_MACH_ARC601:
2410 strcat (buf, ", ARC601");
2411 break;
2412 case E_ARC_MACH_ARC700:
2413 strcat (buf, ", ARC700");
2414 break;
2415
2416 /* The only times we should end up here are (a) A corrupt ELF, (b) A
2417 new ELF with new architecture being read by an old version of
2418 readelf, or (c) An ELF built with non-GNU compiler that does not
2419 set the architecture in the e_flags. */
2420 default:
2421 if (e_machine == EM_ARC_COMPACT)
2422 strcat (buf, ", Unknown ARCompact");
2423 else
2424 strcat (buf, ", Unknown ARC");
2425 break;
2426 }
2427
2428 switch (e_flags & EF_ARC_OSABI_MSK)
2429 {
2430 case E_ARC_OSABI_ORIG:
2431 strcat (buf, ", (ABI:legacy)");
2432 break;
2433 case E_ARC_OSABI_V2:
2434 strcat (buf, ", (ABI:v2)");
2435 break;
2436 /* Only upstream 3.9+ kernels will support ARCv2 ISA. */
2437 case E_ARC_OSABI_V3:
2438 strcat (buf, ", v3 no-legacy-syscalls ABI");
2439 break;
2440 default:
2441 strcat (buf, ", unrecognised ARC OSABI flag");
2442 break;
2443 }
2444}
2445
f3485b74 2446static void
d3ba0551 2447decode_ARM_machine_flags (unsigned e_flags, char buf[])
f3485b74
NC
2448{
2449 unsigned eabi;
2450 int unknown = 0;
2451
2452 eabi = EF_ARM_EABI_VERSION (e_flags);
2453 e_flags &= ~ EF_ARM_EABIMASK;
2454
2455 /* Handle "generic" ARM flags. */
2456 if (e_flags & EF_ARM_RELEXEC)
2457 {
2458 strcat (buf, ", relocatable executable");
2459 e_flags &= ~ EF_ARM_RELEXEC;
2460 }
76da6bbe 2461
f3485b74
NC
2462 /* Now handle EABI specific flags. */
2463 switch (eabi)
2464 {
2465 default:
2c71103e 2466 strcat (buf, ", <unrecognized EABI>");
f3485b74
NC
2467 if (e_flags)
2468 unknown = 1;
2469 break;
2470
2471 case EF_ARM_EABI_VER1:
a5bcd848 2472 strcat (buf, ", Version1 EABI");
f3485b74
NC
2473 while (e_flags)
2474 {
2475 unsigned flag;
76da6bbe 2476
f3485b74
NC
2477 /* Process flags one bit at a time. */
2478 flag = e_flags & - e_flags;
2479 e_flags &= ~ flag;
76da6bbe 2480
f3485b74
NC
2481 switch (flag)
2482 {
a5bcd848 2483 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
f3485b74
NC
2484 strcat (buf, ", sorted symbol tables");
2485 break;
76da6bbe 2486
f3485b74
NC
2487 default:
2488 unknown = 1;
2489 break;
2490 }
2491 }
2492 break;
76da6bbe 2493
a5bcd848
PB
2494 case EF_ARM_EABI_VER2:
2495 strcat (buf, ", Version2 EABI");
2496 while (e_flags)
2497 {
2498 unsigned flag;
2499
2500 /* Process flags one bit at a time. */
2501 flag = e_flags & - e_flags;
2502 e_flags &= ~ flag;
2503
2504 switch (flag)
2505 {
2506 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2507 strcat (buf, ", sorted symbol tables");
2508 break;
2509
2510 case EF_ARM_DYNSYMSUSESEGIDX:
2511 strcat (buf, ", dynamic symbols use segment index");
2512 break;
2513
2514 case EF_ARM_MAPSYMSFIRST:
2515 strcat (buf, ", mapping symbols precede others");
2516 break;
2517
2518 default:
2519 unknown = 1;
2520 break;
2521 }
2522 }
2523 break;
2524
d507cf36
PB
2525 case EF_ARM_EABI_VER3:
2526 strcat (buf, ", Version3 EABI");
8cb51566
PB
2527 break;
2528
2529 case EF_ARM_EABI_VER4:
2530 strcat (buf, ", Version4 EABI");
3bfcb652
NC
2531 while (e_flags)
2532 {
2533 unsigned flag;
2534
2535 /* Process flags one bit at a time. */
2536 flag = e_flags & - e_flags;
2537 e_flags &= ~ flag;
2538
2539 switch (flag)
2540 {
2541 case EF_ARM_BE8:
2542 strcat (buf, ", BE8");
2543 break;
2544
2545 case EF_ARM_LE8:
2546 strcat (buf, ", LE8");
2547 break;
2548
2549 default:
2550 unknown = 1;
2551 break;
2552 }
2553 break;
2554 }
2555 break;
3a4a14e9
PB
2556
2557 case EF_ARM_EABI_VER5:
2558 strcat (buf, ", Version5 EABI");
d507cf36
PB
2559 while (e_flags)
2560 {
2561 unsigned flag;
2562
2563 /* Process flags one bit at a time. */
2564 flag = e_flags & - e_flags;
2565 e_flags &= ~ flag;
2566
2567 switch (flag)
2568 {
2569 case EF_ARM_BE8:
2570 strcat (buf, ", BE8");
2571 break;
2572
2573 case EF_ARM_LE8:
2574 strcat (buf, ", LE8");
2575 break;
2576
3bfcb652
NC
2577 case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT. */
2578 strcat (buf, ", soft-float ABI");
2579 break;
2580
2581 case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT. */
2582 strcat (buf, ", hard-float ABI");
2583 break;
2584
d507cf36
PB
2585 default:
2586 unknown = 1;
2587 break;
2588 }
2589 }
2590 break;
2591
f3485b74 2592 case EF_ARM_EABI_UNKNOWN:
a5bcd848 2593 strcat (buf, ", GNU EABI");
f3485b74
NC
2594 while (e_flags)
2595 {
2596 unsigned flag;
76da6bbe 2597
f3485b74
NC
2598 /* Process flags one bit at a time. */
2599 flag = e_flags & - e_flags;
2600 e_flags &= ~ flag;
76da6bbe 2601
f3485b74
NC
2602 switch (flag)
2603 {
a5bcd848 2604 case EF_ARM_INTERWORK:
f3485b74
NC
2605 strcat (buf, ", interworking enabled");
2606 break;
76da6bbe 2607
a5bcd848 2608 case EF_ARM_APCS_26:
f3485b74
NC
2609 strcat (buf, ", uses APCS/26");
2610 break;
76da6bbe 2611
a5bcd848 2612 case EF_ARM_APCS_FLOAT:
f3485b74
NC
2613 strcat (buf, ", uses APCS/float");
2614 break;
76da6bbe 2615
a5bcd848 2616 case EF_ARM_PIC:
f3485b74
NC
2617 strcat (buf, ", position independent");
2618 break;
76da6bbe 2619
a5bcd848 2620 case EF_ARM_ALIGN8:
f3485b74
NC
2621 strcat (buf, ", 8 bit structure alignment");
2622 break;
76da6bbe 2623
a5bcd848 2624 case EF_ARM_NEW_ABI:
f3485b74
NC
2625 strcat (buf, ", uses new ABI");
2626 break;
76da6bbe 2627
a5bcd848 2628 case EF_ARM_OLD_ABI:
f3485b74
NC
2629 strcat (buf, ", uses old ABI");
2630 break;
76da6bbe 2631
a5bcd848 2632 case EF_ARM_SOFT_FLOAT:
f3485b74
NC
2633 strcat (buf, ", software FP");
2634 break;
76da6bbe 2635
90e01f86
ILT
2636 case EF_ARM_VFP_FLOAT:
2637 strcat (buf, ", VFP");
2638 break;
2639
fde78edd
NC
2640 case EF_ARM_MAVERICK_FLOAT:
2641 strcat (buf, ", Maverick FP");
2642 break;
2643
f3485b74
NC
2644 default:
2645 unknown = 1;
2646 break;
2647 }
2648 }
2649 }
f3485b74
NC
2650
2651 if (unknown)
2b692964 2652 strcat (buf,_(", <unknown>"));
f3485b74
NC
2653}
2654
343433df
AB
2655static void
2656decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2657{
2658 --size; /* Leave space for null terminator. */
2659
2660 switch (e_flags & EF_AVR_MACH)
2661 {
2662 case E_AVR_MACH_AVR1:
2663 strncat (buf, ", avr:1", size);
2664 break;
2665 case E_AVR_MACH_AVR2:
2666 strncat (buf, ", avr:2", size);
2667 break;
2668 case E_AVR_MACH_AVR25:
2669 strncat (buf, ", avr:25", size);
2670 break;
2671 case E_AVR_MACH_AVR3:
2672 strncat (buf, ", avr:3", size);
2673 break;
2674 case E_AVR_MACH_AVR31:
2675 strncat (buf, ", avr:31", size);
2676 break;
2677 case E_AVR_MACH_AVR35:
2678 strncat (buf, ", avr:35", size);
2679 break;
2680 case E_AVR_MACH_AVR4:
2681 strncat (buf, ", avr:4", size);
2682 break;
2683 case E_AVR_MACH_AVR5:
2684 strncat (buf, ", avr:5", size);
2685 break;
2686 case E_AVR_MACH_AVR51:
2687 strncat (buf, ", avr:51", size);
2688 break;
2689 case E_AVR_MACH_AVR6:
2690 strncat (buf, ", avr:6", size);
2691 break;
2692 case E_AVR_MACH_AVRTINY:
2693 strncat (buf, ", avr:100", size);
2694 break;
2695 case E_AVR_MACH_XMEGA1:
2696 strncat (buf, ", avr:101", size);
2697 break;
2698 case E_AVR_MACH_XMEGA2:
2699 strncat (buf, ", avr:102", size);
2700 break;
2701 case E_AVR_MACH_XMEGA3:
2702 strncat (buf, ", avr:103", size);
2703 break;
2704 case E_AVR_MACH_XMEGA4:
2705 strncat (buf, ", avr:104", size);
2706 break;
2707 case E_AVR_MACH_XMEGA5:
2708 strncat (buf, ", avr:105", size);
2709 break;
2710 case E_AVR_MACH_XMEGA6:
2711 strncat (buf, ", avr:106", size);
2712 break;
2713 case E_AVR_MACH_XMEGA7:
2714 strncat (buf, ", avr:107", size);
2715 break;
2716 default:
2717 strncat (buf, ", avr:<unknown>", size);
2718 break;
2719 }
2720
2721 size -= strlen (buf);
2722 if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2723 strncat (buf, ", link-relax", size);
2724}
2725
35c08157
KLC
2726static void
2727decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2728{
2729 unsigned abi;
2730 unsigned arch;
2731 unsigned config;
2732 unsigned version;
2733 int has_fpu = 0;
2734 int r = 0;
2735
2736 static const char *ABI_STRINGS[] =
2737 {
2738 "ABI v0", /* use r5 as return register; only used in N1213HC */
2739 "ABI v1", /* use r0 as return register */
2740 "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2741 "ABI v2fp", /* for FPU */
40c7a7cb
KLC
2742 "AABI",
2743 "ABI2 FP+"
35c08157
KLC
2744 };
2745 static const char *VER_STRINGS[] =
2746 {
2747 "Andes ELF V1.3 or older",
2748 "Andes ELF V1.3.1",
2749 "Andes ELF V1.4"
2750 };
2751 static const char *ARCH_STRINGS[] =
2752 {
2753 "",
2754 "Andes Star v1.0",
2755 "Andes Star v2.0",
2756 "Andes Star v3.0",
2757 "Andes Star v3.0m"
2758 };
2759
2760 abi = EF_NDS_ABI & e_flags;
2761 arch = EF_NDS_ARCH & e_flags;
2762 config = EF_NDS_INST & e_flags;
2763 version = EF_NDS32_ELF_VERSION & e_flags;
2764
2765 memset (buf, 0, size);
2766
2767 switch (abi)
2768 {
2769 case E_NDS_ABI_V0:
2770 case E_NDS_ABI_V1:
2771 case E_NDS_ABI_V2:
2772 case E_NDS_ABI_V2FP:
2773 case E_NDS_ABI_AABI:
40c7a7cb 2774 case E_NDS_ABI_V2FP_PLUS:
35c08157
KLC
2775 /* In case there are holes in the array. */
2776 r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2777 break;
2778
2779 default:
2780 r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2781 break;
2782 }
2783
2784 switch (version)
2785 {
2786 case E_NDS32_ELF_VER_1_2:
2787 case E_NDS32_ELF_VER_1_3:
2788 case E_NDS32_ELF_VER_1_4:
2789 r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2790 break;
2791
2792 default:
2793 r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2794 break;
2795 }
2796
2797 if (E_NDS_ABI_V0 == abi)
2798 {
2799 /* OLD ABI; only used in N1213HC, has performance extension 1. */
2800 r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2801 if (arch == E_NDS_ARCH_STAR_V1_0)
2802 r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2803 return;
2804 }
2805
2806 switch (arch)
2807 {
2808 case E_NDS_ARCH_STAR_V1_0:
2809 case E_NDS_ARCH_STAR_V2_0:
2810 case E_NDS_ARCH_STAR_V3_0:
2811 case E_NDS_ARCH_STAR_V3_M:
2812 r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2813 break;
2814
2815 default:
2816 r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2817 /* ARCH version determines how the e_flags are interpreted.
2818 If it is unknown, we cannot proceed. */
2819 return;
2820 }
2821
2822 /* Newer ABI; Now handle architecture specific flags. */
2823 if (arch == E_NDS_ARCH_STAR_V1_0)
2824 {
2825 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2826 r += snprintf (buf + r, size -r, ", MFUSR_PC");
2827
2828 if (!(config & E_NDS32_HAS_NO_MAC_INST))
2829 r += snprintf (buf + r, size -r, ", MAC");
2830
2831 if (config & E_NDS32_HAS_DIV_INST)
2832 r += snprintf (buf + r, size -r, ", DIV");
2833
2834 if (config & E_NDS32_HAS_16BIT_INST)
2835 r += snprintf (buf + r, size -r, ", 16b");
2836 }
2837 else
2838 {
2839 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2840 {
2841 if (version <= E_NDS32_ELF_VER_1_3)
2842 r += snprintf (buf + r, size -r, ", [B8]");
2843 else
2844 r += snprintf (buf + r, size -r, ", EX9");
2845 }
2846
2847 if (config & E_NDS32_HAS_MAC_DX_INST)
2848 r += snprintf (buf + r, size -r, ", MAC_DX");
2849
2850 if (config & E_NDS32_HAS_DIV_DX_INST)
2851 r += snprintf (buf + r, size -r, ", DIV_DX");
2852
2853 if (config & E_NDS32_HAS_16BIT_INST)
2854 {
2855 if (version <= E_NDS32_ELF_VER_1_3)
2856 r += snprintf (buf + r, size -r, ", 16b");
2857 else
2858 r += snprintf (buf + r, size -r, ", IFC");
2859 }
2860 }
2861
2862 if (config & E_NDS32_HAS_EXT_INST)
2863 r += snprintf (buf + r, size -r, ", PERF1");
2864
2865 if (config & E_NDS32_HAS_EXT2_INST)
2866 r += snprintf (buf + r, size -r, ", PERF2");
2867
2868 if (config & E_NDS32_HAS_FPU_INST)
2869 {
2870 has_fpu = 1;
2871 r += snprintf (buf + r, size -r, ", FPU_SP");
2872 }
2873
2874 if (config & E_NDS32_HAS_FPU_DP_INST)
2875 {
2876 has_fpu = 1;
2877 r += snprintf (buf + r, size -r, ", FPU_DP");
2878 }
2879
2880 if (config & E_NDS32_HAS_FPU_MAC_INST)
2881 {
2882 has_fpu = 1;
2883 r += snprintf (buf + r, size -r, ", FPU_MAC");
2884 }
2885
2886 if (has_fpu)
2887 {
2888 switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
2889 {
2890 case E_NDS32_FPU_REG_8SP_4DP:
2891 r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
2892 break;
2893 case E_NDS32_FPU_REG_16SP_8DP:
2894 r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
2895 break;
2896 case E_NDS32_FPU_REG_32SP_16DP:
2897 r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
2898 break;
2899 case E_NDS32_FPU_REG_32SP_32DP:
2900 r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
2901 break;
2902 }
2903 }
2904
2905 if (config & E_NDS32_HAS_AUDIO_INST)
2906 r += snprintf (buf + r, size -r, ", AUDIO");
2907
2908 if (config & E_NDS32_HAS_STRING_INST)
2909 r += snprintf (buf + r, size -r, ", STR");
2910
2911 if (config & E_NDS32_HAS_REDUCED_REGS)
2912 r += snprintf (buf + r, size -r, ", 16REG");
2913
2914 if (config & E_NDS32_HAS_VIDEO_INST)
2915 {
2916 if (version <= E_NDS32_ELF_VER_1_3)
2917 r += snprintf (buf + r, size -r, ", VIDEO");
2918 else
2919 r += snprintf (buf + r, size -r, ", SATURATION");
2920 }
2921
2922 if (config & E_NDS32_HAS_ENCRIPT_INST)
2923 r += snprintf (buf + r, size -r, ", ENCRP");
2924
2925 if (config & E_NDS32_HAS_L2C_INST)
2926 r += snprintf (buf + r, size -r, ", L2C");
2927}
2928
252b5132 2929static char *
d3ba0551 2930get_machine_flags (unsigned e_flags, unsigned e_machine)
252b5132 2931{
b34976b6 2932 static char buf[1024];
252b5132
RH
2933
2934 buf[0] = '\0';
76da6bbe 2935
252b5132
RH
2936 if (e_flags)
2937 {
2938 switch (e_machine)
2939 {
2940 default:
2941 break;
2942
886a2506 2943 case EM_ARC_COMPACT2:
886a2506 2944 case EM_ARC_COMPACT:
a9522a21
AB
2945 decode_ARC_machine_flags (e_flags, e_machine, buf);
2946 break;
886a2506 2947
f3485b74
NC
2948 case EM_ARM:
2949 decode_ARM_machine_flags (e_flags, buf);
2950 break;
76da6bbe 2951
343433df
AB
2952 case EM_AVR:
2953 decode_AVR_machine_flags (e_flags, buf, sizeof buf);
2954 break;
2955
781303ce
MF
2956 case EM_BLACKFIN:
2957 if (e_flags & EF_BFIN_PIC)
2958 strcat (buf, ", PIC");
2959
2960 if (e_flags & EF_BFIN_FDPIC)
2961 strcat (buf, ", FDPIC");
2962
2963 if (e_flags & EF_BFIN_CODE_IN_L1)
2964 strcat (buf, ", code in L1");
2965
2966 if (e_flags & EF_BFIN_DATA_IN_L1)
2967 strcat (buf, ", data in L1");
2968
2969 break;
2970
ec2dfb42
AO
2971 case EM_CYGNUS_FRV:
2972 switch (e_flags & EF_FRV_CPU_MASK)
2973 {
2974 case EF_FRV_CPU_GENERIC:
2975 break;
2976
2977 default:
2978 strcat (buf, ", fr???");
2979 break;
57346661 2980
ec2dfb42
AO
2981 case EF_FRV_CPU_FR300:
2982 strcat (buf, ", fr300");
2983 break;
2984
2985 case EF_FRV_CPU_FR400:
2986 strcat (buf, ", fr400");
2987 break;
2988 case EF_FRV_CPU_FR405:
2989 strcat (buf, ", fr405");
2990 break;
2991
2992 case EF_FRV_CPU_FR450:
2993 strcat (buf, ", fr450");
2994 break;
2995
2996 case EF_FRV_CPU_FR500:
2997 strcat (buf, ", fr500");
2998 break;
2999 case EF_FRV_CPU_FR550:
3000 strcat (buf, ", fr550");
3001 break;
3002
3003 case EF_FRV_CPU_SIMPLE:
3004 strcat (buf, ", simple");
3005 break;
3006 case EF_FRV_CPU_TOMCAT:
3007 strcat (buf, ", tomcat");
3008 break;
3009 }
1c877e87 3010 break;
ec2dfb42 3011
53c7db4b 3012 case EM_68K:
425c6cb0 3013 if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
76f57f3a 3014 strcat (buf, ", m68000");
425c6cb0 3015 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
3bdcfdf4
KH
3016 strcat (buf, ", cpu32");
3017 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
3018 strcat (buf, ", fido_a");
425c6cb0 3019 else
266abb8f 3020 {
2cf0635d
NC
3021 char const * isa = _("unknown");
3022 char const * mac = _("unknown mac");
3023 char const * additional = NULL;
0112cd26 3024
c694fd50 3025 switch (e_flags & EF_M68K_CF_ISA_MASK)
266abb8f 3026 {
c694fd50 3027 case EF_M68K_CF_ISA_A_NODIV:
0b2e31dc
NS
3028 isa = "A";
3029 additional = ", nodiv";
3030 break;
c694fd50 3031 case EF_M68K_CF_ISA_A:
266abb8f
NS
3032 isa = "A";
3033 break;
c694fd50 3034 case EF_M68K_CF_ISA_A_PLUS:
266abb8f
NS
3035 isa = "A+";
3036 break;
c694fd50 3037 case EF_M68K_CF_ISA_B_NOUSP:
0b2e31dc
NS
3038 isa = "B";
3039 additional = ", nousp";
3040 break;
c694fd50 3041 case EF_M68K_CF_ISA_B:
266abb8f
NS
3042 isa = "B";
3043 break;
f608cd77
NS
3044 case EF_M68K_CF_ISA_C:
3045 isa = "C";
3046 break;
3047 case EF_M68K_CF_ISA_C_NODIV:
3048 isa = "C";
3049 additional = ", nodiv";
3050 break;
266abb8f
NS
3051 }
3052 strcat (buf, ", cf, isa ");
3053 strcat (buf, isa);
0b2e31dc
NS
3054 if (additional)
3055 strcat (buf, additional);
c694fd50 3056 if (e_flags & EF_M68K_CF_FLOAT)
0b2e31dc 3057 strcat (buf, ", float");
c694fd50 3058 switch (e_flags & EF_M68K_CF_MAC_MASK)
266abb8f
NS
3059 {
3060 case 0:
3061 mac = NULL;
3062 break;
c694fd50 3063 case EF_M68K_CF_MAC:
266abb8f
NS
3064 mac = "mac";
3065 break;
c694fd50 3066 case EF_M68K_CF_EMAC:
266abb8f
NS
3067 mac = "emac";
3068 break;
f608cd77
NS
3069 case EF_M68K_CF_EMAC_B:
3070 mac = "emac_b";
3071 break;
266abb8f
NS
3072 }
3073 if (mac)
3074 {
3075 strcat (buf, ", ");
3076 strcat (buf, mac);
3077 }
266abb8f 3078 }
53c7db4b 3079 break;
33c63f9d 3080
153a2776
NC
3081 case EM_CYGNUS_MEP:
3082 switch (e_flags & EF_MEP_CPU_MASK)
3083 {
3084 case EF_MEP_CPU_MEP: strcat (buf, ", generic MeP"); break;
3085 case EF_MEP_CPU_C2: strcat (buf, ", MeP C2"); break;
3086 case EF_MEP_CPU_C3: strcat (buf, ", MeP C3"); break;
3087 case EF_MEP_CPU_C4: strcat (buf, ", MeP C4"); break;
3088 case EF_MEP_CPU_C5: strcat (buf, ", MeP C5"); break;
3089 case EF_MEP_CPU_H1: strcat (buf, ", MeP H1"); break;
3090 default: strcat (buf, _(", <unknown MeP cpu type>")); break;
3091 }
3092
3093 switch (e_flags & EF_MEP_COP_MASK)
3094 {
3095 case EF_MEP_COP_NONE: break;
3096 case EF_MEP_COP_AVC: strcat (buf, ", AVC coprocessor"); break;
3097 case EF_MEP_COP_AVC2: strcat (buf, ", AVC2 coprocessor"); break;
3098 case EF_MEP_COP_FMAX: strcat (buf, ", FMAX coprocessor"); break;
3099 case EF_MEP_COP_IVC2: strcat (buf, ", IVC2 coprocessor"); break;
3100 default: strcat (buf, _("<unknown MeP copro type>")); break;
3101 }
3102
3103 if (e_flags & EF_MEP_LIBRARY)
3104 strcat (buf, ", Built for Library");
3105
3106 if (e_flags & EF_MEP_INDEX_MASK)
3107 sprintf (buf + strlen (buf), ", Configuration Index: %#x",
3108 e_flags & EF_MEP_INDEX_MASK);
3109
3110 if (e_flags & ~ EF_MEP_ALL_FLAGS)
3111 sprintf (buf + strlen (buf), _(", unknown flags bits: %#x"),
3112 e_flags & ~ EF_MEP_ALL_FLAGS);
3113 break;
3114
252b5132
RH
3115 case EM_PPC:
3116 if (e_flags & EF_PPC_EMB)
3117 strcat (buf, ", emb");
3118
3119 if (e_flags & EF_PPC_RELOCATABLE)
2b692964 3120 strcat (buf, _(", relocatable"));
252b5132
RH
3121
3122 if (e_flags & EF_PPC_RELOCATABLE_LIB)
2b692964 3123 strcat (buf, _(", relocatable-lib"));
252b5132
RH
3124 break;
3125
ee67d69a
AM
3126 case EM_PPC64:
3127 if (e_flags & EF_PPC64_ABI)
3128 {
3129 char abi[] = ", abiv0";
3130
3131 abi[6] += e_flags & EF_PPC64_ABI;
3132 strcat (buf, abi);
3133 }
3134 break;
3135
708e2187
NC
3136 case EM_V800:
3137 if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
3138 strcat (buf, ", RH850 ABI");
0b4362b0 3139
708e2187
NC
3140 if (e_flags & EF_V800_850E3)
3141 strcat (buf, ", V3 architecture");
3142
3143 if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
3144 strcat (buf, ", FPU not used");
3145
3146 if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
3147 strcat (buf, ", regmode: COMMON");
3148
3149 if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
3150 strcat (buf, ", r4 not used");
3151
3152 if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
3153 strcat (buf, ", r30 not used");
3154
3155 if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
3156 strcat (buf, ", r5 not used");
3157
3158 if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
3159 strcat (buf, ", r2 not used");
3160
3161 for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
3162 {
3163 switch (e_flags & - e_flags)
3164 {
3165 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
3166 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
708e2187
NC
3167 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
3168 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
708e2187
NC
3169 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
3170 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
3171 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
3172 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
3173 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
3174 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
3175 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
3176 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
3177 default: break;
3178 }
3179 }
3180 break;
3181
2b0337b0 3182 case EM_V850:
252b5132
RH
3183 case EM_CYGNUS_V850:
3184 switch (e_flags & EF_V850_ARCH)
3185 {
78c8d46c
NC
3186 case E_V850E3V5_ARCH:
3187 strcat (buf, ", v850e3v5");
3188 break;
1cd986c5
NC
3189 case E_V850E2V3_ARCH:
3190 strcat (buf, ", v850e2v3");
3191 break;
3192 case E_V850E2_ARCH:
3193 strcat (buf, ", v850e2");
3194 break;
3195 case E_V850E1_ARCH:
3196 strcat (buf, ", v850e1");
8ad30312 3197 break;
252b5132
RH
3198 case E_V850E_ARCH:
3199 strcat (buf, ", v850e");
3200 break;
252b5132
RH
3201 case E_V850_ARCH:
3202 strcat (buf, ", v850");
3203 break;
3204 default:
2b692964 3205 strcat (buf, _(", unknown v850 architecture variant"));
252b5132
RH
3206 break;
3207 }
3208 break;
3209
2b0337b0 3210 case EM_M32R:
252b5132
RH
3211 case EM_CYGNUS_M32R:
3212 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3213 strcat (buf, ", m32r");
252b5132
RH
3214 break;
3215
3216 case EM_MIPS:
4fe85591 3217 case EM_MIPS_RS3_LE:
252b5132
RH
3218 if (e_flags & EF_MIPS_NOREORDER)
3219 strcat (buf, ", noreorder");
3220
3221 if (e_flags & EF_MIPS_PIC)
3222 strcat (buf, ", pic");
3223
3224 if (e_flags & EF_MIPS_CPIC)
3225 strcat (buf, ", cpic");
3226
d1bdd336
TS
3227 if (e_flags & EF_MIPS_UCODE)
3228 strcat (buf, ", ugen_reserved");
3229
252b5132
RH
3230 if (e_flags & EF_MIPS_ABI2)
3231 strcat (buf, ", abi2");
3232
43521d43
TS
3233 if (e_flags & EF_MIPS_OPTIONS_FIRST)
3234 strcat (buf, ", odk first");
3235
a5d22d2a
TS
3236 if (e_flags & EF_MIPS_32BITMODE)
3237 strcat (buf, ", 32bitmode");
3238
ba92f887
MR
3239 if (e_flags & EF_MIPS_NAN2008)
3240 strcat (buf, ", nan2008");
3241
fef1b0b3
SE
3242 if (e_flags & EF_MIPS_FP64)
3243 strcat (buf, ", fp64");
3244
156c2f8b
NC
3245 switch ((e_flags & EF_MIPS_MACH))
3246 {
3247 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3248 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3249 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
156c2f8b 3250 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
810dfa6e
L
3251 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3252 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3253 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3254 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
c6c98b38 3255 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
ebcb91b7 3256 case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
350cc38d
MS
3257 case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3258 case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
fd503541 3259 case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
05c6f050 3260 case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
67c2a3e8 3261 case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
d32e5c54 3262 case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
52b6b6b9 3263 case E_MIPS_MACH_XLR: strcat (buf, ", xlr"); break;
43521d43
TS
3264 case 0:
3265 /* We simply ignore the field in this case to avoid confusion:
3266 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3267 extension. */
3268 break;
2b692964 3269 default: strcat (buf, _(", unknown CPU")); break;
156c2f8b 3270 }
43521d43
TS
3271
3272 switch ((e_flags & EF_MIPS_ABI))
3273 {
3274 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3275 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3276 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3277 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3278 case 0:
3279 /* We simply ignore the field in this case to avoid confusion:
3280 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3281 This means it is likely to be an o32 file, but not for
3282 sure. */
3283 break;
2b692964 3284 default: strcat (buf, _(", unknown ABI")); break;
43521d43
TS
3285 }
3286
3287 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3288 strcat (buf, ", mdmx");
3289
3290 if (e_flags & EF_MIPS_ARCH_ASE_M16)
3291 strcat (buf, ", mips16");
3292
df58fc94
RS
3293 if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3294 strcat (buf, ", micromips");
3295
43521d43
TS
3296 switch ((e_flags & EF_MIPS_ARCH))
3297 {
3298 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3299 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3300 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3301 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3302 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3303 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
cb44e358 3304 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
7361da2c 3305 case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
43521d43 3306 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
5f74bc13 3307 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
7361da2c 3308 case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
2b692964 3309 default: strcat (buf, _(", unknown ISA")); break;
43521d43 3310 }
252b5132 3311 break;
351b4b40 3312
35c08157
KLC
3313 case EM_NDS32:
3314 decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3315 break;
3316
e23eba97
NC
3317 case EM_RISCV:
3318 if (e_flags & EF_RISCV_RVC)
3319 strcat (buf, ", RVC");
3320 if (e_flags & EF_RISCV_SOFT_FLOAT)
3321 strcat (buf, ", soft-float ABI");
3322 break;
3323
ccde1100
AO
3324 case EM_SH:
3325 switch ((e_flags & EF_SH_MACH_MASK))
3326 {
3327 case EF_SH1: strcat (buf, ", sh1"); break;
3328 case EF_SH2: strcat (buf, ", sh2"); break;
3329 case EF_SH3: strcat (buf, ", sh3"); break;
3330 case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3331 case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3332 case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3333 case EF_SH3E: strcat (buf, ", sh3e"); break;
3334 case EF_SH4: strcat (buf, ", sh4"); break;
3335 case EF_SH5: strcat (buf, ", sh5"); break;
3336 case EF_SH2E: strcat (buf, ", sh2e"); break;
3337 case EF_SH4A: strcat (buf, ", sh4a"); break;
1d70c7fb 3338 case EF_SH2A: strcat (buf, ", sh2a"); break;
ccde1100
AO
3339 case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3340 case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
1d70c7fb 3341 case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
0b92ab21
NH
3342 case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3343 case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3344 case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3345 case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3346 case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3347 case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
2b692964 3348 default: strcat (buf, _(", unknown ISA")); break;
ccde1100
AO
3349 }
3350
cec6a5b8
MR
3351 if (e_flags & EF_SH_PIC)
3352 strcat (buf, ", pic");
3353
3354 if (e_flags & EF_SH_FDPIC)
3355 strcat (buf, ", fdpic");
ccde1100 3356 break;
948f632f 3357
73589c9d
CS
3358 case EM_OR1K:
3359 if (e_flags & EF_OR1K_NODELAY)
3360 strcat (buf, ", no delay");
3361 break;
57346661 3362
351b4b40
RH
3363 case EM_SPARCV9:
3364 if (e_flags & EF_SPARC_32PLUS)
3365 strcat (buf, ", v8+");
3366
3367 if (e_flags & EF_SPARC_SUN_US1)
d07faca2
RH
3368 strcat (buf, ", ultrasparcI");
3369
3370 if (e_flags & EF_SPARC_SUN_US3)
3371 strcat (buf, ", ultrasparcIII");
351b4b40
RH
3372
3373 if (e_flags & EF_SPARC_HAL_R1)
3374 strcat (buf, ", halr1");
3375
3376 if (e_flags & EF_SPARC_LEDATA)
3377 strcat (buf, ", ledata");
3378
3379 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3380 strcat (buf, ", tso");
3381
3382 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3383 strcat (buf, ", pso");
3384
3385 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3386 strcat (buf, ", rmo");
3387 break;
7d466069 3388
103f02d3
UD
3389 case EM_PARISC:
3390 switch (e_flags & EF_PARISC_ARCH)
3391 {
3392 case EFA_PARISC_1_0:
3393 strcpy (buf, ", PA-RISC 1.0");
3394 break;
3395 case EFA_PARISC_1_1:
3396 strcpy (buf, ", PA-RISC 1.1");
3397 break;
3398 case EFA_PARISC_2_0:
3399 strcpy (buf, ", PA-RISC 2.0");
3400 break;
3401 default:
3402 break;
3403 }
3404 if (e_flags & EF_PARISC_TRAPNIL)
3405 strcat (buf, ", trapnil");
3406 if (e_flags & EF_PARISC_EXT)
3407 strcat (buf, ", ext");
3408 if (e_flags & EF_PARISC_LSB)
3409 strcat (buf, ", lsb");
3410 if (e_flags & EF_PARISC_WIDE)
3411 strcat (buf, ", wide");
3412 if (e_flags & EF_PARISC_NO_KABP)
3413 strcat (buf, ", no kabp");
3414 if (e_flags & EF_PARISC_LAZYSWAP)
3415 strcat (buf, ", lazyswap");
30800947 3416 break;
76da6bbe 3417
7d466069 3418 case EM_PJ:
2b0337b0 3419 case EM_PJ_OLD:
7d466069
ILT
3420 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3421 strcat (buf, ", new calling convention");
3422
3423 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3424 strcat (buf, ", gnu calling convention");
3425 break;
4d6ed7c8
NC
3426
3427 case EM_IA_64:
3428 if ((e_flags & EF_IA_64_ABI64))
3429 strcat (buf, ", 64-bit");
3430 else
3431 strcat (buf, ", 32-bit");
3432 if ((e_flags & EF_IA_64_REDUCEDFP))
3433 strcat (buf, ", reduced fp model");
3434 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3435 strcat (buf, ", no function descriptors, constant gp");
3436 else if ((e_flags & EF_IA_64_CONS_GP))
3437 strcat (buf, ", constant gp");
3438 if ((e_flags & EF_IA_64_ABSOLUTE))
3439 strcat (buf, ", absolute");
28f997cf
TG
3440 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3441 {
3442 if ((e_flags & EF_IA_64_VMS_LINKAGES))
3443 strcat (buf, ", vms_linkages");
3444 switch ((e_flags & EF_IA_64_VMS_COMCOD))
3445 {
3446 case EF_IA_64_VMS_COMCOD_SUCCESS:
3447 break;
3448 case EF_IA_64_VMS_COMCOD_WARNING:
3449 strcat (buf, ", warning");
3450 break;
3451 case EF_IA_64_VMS_COMCOD_ERROR:
3452 strcat (buf, ", error");
3453 break;
3454 case EF_IA_64_VMS_COMCOD_ABORT:
3455 strcat (buf, ", abort");
3456 break;
3457 default:
bee0ee85
NC
3458 warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3459 e_flags & EF_IA_64_VMS_COMCOD);
3460 strcat (buf, ", <unknown>");
28f997cf
TG
3461 }
3462 }
4d6ed7c8 3463 break;
179d3252
JT
3464
3465 case EM_VAX:
3466 if ((e_flags & EF_VAX_NONPIC))
3467 strcat (buf, ", non-PIC");
3468 if ((e_flags & EF_VAX_DFLOAT))
3469 strcat (buf, ", D-Float");
3470 if ((e_flags & EF_VAX_GFLOAT))
3471 strcat (buf, ", G-Float");
3472 break;
c7927a3c 3473
619ed720
EB
3474 case EM_VISIUM:
3475 if (e_flags & EF_VISIUM_ARCH_MCM)
3476 strcat (buf, ", mcm");
3477 else if (e_flags & EF_VISIUM_ARCH_MCM24)
3478 strcat (buf, ", mcm24");
3479 if (e_flags & EF_VISIUM_ARCH_GR6)
3480 strcat (buf, ", gr6");
3481 break;
3482
4046d87a 3483 case EM_RL78:
1740ba0c
NC
3484 switch (e_flags & E_FLAG_RL78_CPU_MASK)
3485 {
3486 case E_FLAG_RL78_ANY_CPU: break;
3487 case E_FLAG_RL78_G10: strcat (buf, ", G10"); break;
3488 case E_FLAG_RL78_G13: strcat (buf, ", G13"); break;
3489 case E_FLAG_RL78_G14: strcat (buf, ", G14"); break;
3490 }
856ea05c
KP
3491 if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3492 strcat (buf, ", 64-bit doubles");
4046d87a 3493 break;
0b4362b0 3494
c7927a3c
NC
3495 case EM_RX:
3496 if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3497 strcat (buf, ", 64-bit doubles");
3498 if (e_flags & E_FLAG_RX_DSP)
dd24e3da 3499 strcat (buf, ", dsp");
d4cb0ea0 3500 if (e_flags & E_FLAG_RX_PID)
0b4362b0 3501 strcat (buf, ", pid");
708e2187
NC
3502 if (e_flags & E_FLAG_RX_ABI)
3503 strcat (buf, ", RX ABI");
3525236c
NC
3504 if (e_flags & E_FLAG_RX_SINSNS_SET)
3505 strcat (buf, e_flags & E_FLAG_RX_SINSNS_YES
3506 ? ", uses String instructions" : ", bans String instructions");
a117b0a5
YS
3507 if (e_flags & E_FLAG_RX_V2)
3508 strcat (buf, ", V2");
d4cb0ea0 3509 break;
55786da2
AK
3510
3511 case EM_S390:
3512 if (e_flags & EF_S390_HIGH_GPRS)
3513 strcat (buf, ", highgprs");
d4cb0ea0 3514 break;
40b36596
JM
3515
3516 case EM_TI_C6000:
3517 if ((e_flags & EF_C6000_REL))
3518 strcat (buf, ", relocatable module");
d4cb0ea0 3519 break;
13761a11
NC
3520
3521 case EM_MSP430:
3522 strcat (buf, _(": architecture variant: "));
3523 switch (e_flags & EF_MSP430_MACH)
3524 {
3525 case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3526 case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3527 case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3528 case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3529 case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3530 case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3531 case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3532 case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3533 case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3534 case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3535 case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3536 case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3537 case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3538 case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3539 case E_MSP430_MACH_MSP430X : strcat (buf, "MSP430X"); break;
3540 default:
3541 strcat (buf, _(": unknown")); break;
3542 }
3543
3544 if (e_flags & ~ EF_MSP430_MACH)
3545 strcat (buf, _(": unknown extra flag bits also present"));
252b5132
RH
3546 }
3547 }
3548
3549 return buf;
3550}
3551
252b5132 3552static const char *
d3ba0551
AM
3553get_osabi_name (unsigned int osabi)
3554{
3555 static char buff[32];
3556
3557 switch (osabi)
3558 {
3559 case ELFOSABI_NONE: return "UNIX - System V";
3560 case ELFOSABI_HPUX: return "UNIX - HP-UX";
3561 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
9c55345c 3562 case ELFOSABI_GNU: return "UNIX - GNU";
d3ba0551
AM
3563 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
3564 case ELFOSABI_AIX: return "UNIX - AIX";
3565 case ELFOSABI_IRIX: return "UNIX - IRIX";
3566 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
3567 case ELFOSABI_TRU64: return "UNIX - TRU64";
3568 case ELFOSABI_MODESTO: return "Novell - Modesto";
3569 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
3570 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
3571 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
3b26c801 3572 case ELFOSABI_AROS: return "AROS";
11636f9e 3573 case ELFOSABI_FENIXOS: return "FenixOS";
6d913794
NC
3574 case ELFOSABI_CLOUDABI: return "Nuxi CloudABI";
3575 case ELFOSABI_OPENVOS: return "Stratus Technologies OpenVOS";
d3ba0551 3576 default:
40b36596
JM
3577 if (osabi >= 64)
3578 switch (elf_header.e_machine)
3579 {
3580 case EM_ARM:
3581 switch (osabi)
3582 {
3583 case ELFOSABI_ARM: return "ARM";
3584 default:
3585 break;
3586 }
3587 break;
3588
3589 case EM_MSP430:
3590 case EM_MSP430_OLD:
619ed720 3591 case EM_VISIUM:
40b36596
JM
3592 switch (osabi)
3593 {
3594 case ELFOSABI_STANDALONE: return _("Standalone App");
3595 default:
3596 break;
3597 }
3598 break;
3599
3600 case EM_TI_C6000:
3601 switch (osabi)
3602 {
3603 case ELFOSABI_C6000_ELFABI: return _("Bare-metal C6000");
3604 case ELFOSABI_C6000_LINUX: return "Linux C6000";
3605 default:
3606 break;
3607 }
3608 break;
3609
3610 default:
3611 break;
3612 }
e9e44622 3613 snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
d3ba0551
AM
3614 return buff;
3615 }
3616}
3617
a06ea964
NC
3618static const char *
3619get_aarch64_segment_type (unsigned long type)
3620{
3621 switch (type)
3622 {
3623 case PT_AARCH64_ARCHEXT:
3624 return "AARCH64_ARCHEXT";
3625 default:
3626 break;
3627 }
3628
3629 return NULL;
3630}
3631
b294bdf8
MM
3632static const char *
3633get_arm_segment_type (unsigned long type)
3634{
3635 switch (type)
3636 {
3637 case PT_ARM_EXIDX:
3638 return "EXIDX";
3639 default:
3640 break;
3641 }
3642
3643 return NULL;
3644}
3645
d3ba0551
AM
3646static const char *
3647get_mips_segment_type (unsigned long type)
252b5132
RH
3648{
3649 switch (type)
3650 {
3651 case PT_MIPS_REGINFO:
3652 return "REGINFO";
3653 case PT_MIPS_RTPROC:
3654 return "RTPROC";
3655 case PT_MIPS_OPTIONS:
3656 return "OPTIONS";
351cdf24
MF
3657 case PT_MIPS_ABIFLAGS:
3658 return "ABIFLAGS";
252b5132
RH
3659 default:
3660 break;
3661 }
3662
3663 return NULL;
3664}
3665
103f02d3 3666static const char *
d3ba0551 3667get_parisc_segment_type (unsigned long type)
103f02d3
UD
3668{
3669 switch (type)
3670 {
3671 case PT_HP_TLS: return "HP_TLS";
3672 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
3673 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
3674 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
3675 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
3676 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
3677 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
3678 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
3679 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
3680 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
3681 case PT_HP_PARALLEL: return "HP_PARALLEL";
3682 case PT_HP_FASTBIND: return "HP_FASTBIND";
eec8f817
DA
3683 case PT_HP_OPT_ANNOT: return "HP_OPT_ANNOT";
3684 case PT_HP_HSL_ANNOT: return "HP_HSL_ANNOT";
3685 case PT_HP_STACK: return "HP_STACK";
3686 case PT_HP_CORE_UTSNAME: return "HP_CORE_UTSNAME";
103f02d3
UD
3687 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
3688 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
61472819 3689 case PT_PARISC_WEAKORDER: return "PARISC_WEAKORDER";
103f02d3
UD
3690 default:
3691 break;
3692 }
3693
3694 return NULL;
3695}
3696
4d6ed7c8 3697static const char *
d3ba0551 3698get_ia64_segment_type (unsigned long type)
4d6ed7c8
NC
3699{
3700 switch (type)
3701 {
3702 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
3703 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
00428cca
AM
3704 case PT_HP_TLS: return "HP_TLS";
3705 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
3706 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
3707 case PT_IA_64_HP_STACK: return "HP_STACK";
4d6ed7c8
NC
3708 default:
3709 break;
3710 }
3711
3712 return NULL;
3713}
3714
40b36596
JM
3715static const char *
3716get_tic6x_segment_type (unsigned long type)
3717{
3718 switch (type)
3719 {
3720 case PT_C6000_PHATTR: return "C6000_PHATTR";
3721 default:
3722 break;
3723 }
3724
3725 return NULL;
3726}
3727
5522f910
NC
3728static const char *
3729get_solaris_segment_type (unsigned long type)
3730{
3731 switch (type)
3732 {
3733 case 0x6464e550: return "PT_SUNW_UNWIND";
3734 case 0x6474e550: return "PT_SUNW_EH_FRAME";
3735 case 0x6ffffff7: return "PT_LOSUNW";
3736 case 0x6ffffffa: return "PT_SUNWBSS";
3737 case 0x6ffffffb: return "PT_SUNWSTACK";
3738 case 0x6ffffffc: return "PT_SUNWDTRACE";
3739 case 0x6ffffffd: return "PT_SUNWCAP";
3740 case 0x6fffffff: return "PT_HISUNW";
3741 default: return NULL;
3742 }
3743}
3744
252b5132 3745static const char *
d3ba0551 3746get_segment_type (unsigned long p_type)
252b5132 3747{
b34976b6 3748 static char buff[32];
252b5132
RH
3749
3750 switch (p_type)
3751 {
b34976b6
AM
3752 case PT_NULL: return "NULL";
3753 case PT_LOAD: return "LOAD";
252b5132 3754 case PT_DYNAMIC: return "DYNAMIC";
b34976b6
AM
3755 case PT_INTERP: return "INTERP";
3756 case PT_NOTE: return "NOTE";
3757 case PT_SHLIB: return "SHLIB";
3758 case PT_PHDR: return "PHDR";
13ae64f3 3759 case PT_TLS: return "TLS";
252b5132 3760
65765700
JJ
3761 case PT_GNU_EH_FRAME:
3762 return "GNU_EH_FRAME";
2b05f1b7 3763 case PT_GNU_STACK: return "GNU_STACK";
8c37241b 3764 case PT_GNU_RELRO: return "GNU_RELRO";
65765700 3765
252b5132
RH
3766 default:
3767 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3768 {
2cf0635d 3769 const char * result;
103f02d3 3770
252b5132
RH
3771 switch (elf_header.e_machine)
3772 {
a06ea964
NC
3773 case EM_AARCH64:
3774 result = get_aarch64_segment_type (p_type);
3775 break;
b294bdf8
MM
3776 case EM_ARM:
3777 result = get_arm_segment_type (p_type);
3778 break;
252b5132 3779 case EM_MIPS:
4fe85591 3780 case EM_MIPS_RS3_LE:
252b5132
RH
3781 result = get_mips_segment_type (p_type);
3782 break;
103f02d3
UD
3783 case EM_PARISC:
3784 result = get_parisc_segment_type (p_type);
3785 break;
4d6ed7c8
NC
3786 case EM_IA_64:
3787 result = get_ia64_segment_type (p_type);
3788 break;
40b36596
JM
3789 case EM_TI_C6000:
3790 result = get_tic6x_segment_type (p_type);
3791 break;
252b5132
RH
3792 default:
3793 result = NULL;
3794 break;
3795 }
103f02d3 3796
252b5132
RH
3797 if (result != NULL)
3798 return result;
103f02d3 3799
1a9ccd70 3800 sprintf (buff, "LOPROC+%#lx", p_type - PT_LOPROC);
252b5132
RH
3801 }
3802 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
103f02d3 3803 {
2cf0635d 3804 const char * result;
103f02d3
UD
3805
3806 switch (elf_header.e_machine)
3807 {
3808 case EM_PARISC:
3809 result = get_parisc_segment_type (p_type);
3810 break;
00428cca
AM
3811 case EM_IA_64:
3812 result = get_ia64_segment_type (p_type);
3813 break;
103f02d3 3814 default:
5522f910
NC
3815 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
3816 result = get_solaris_segment_type (p_type);
3817 else
3818 result = NULL;
103f02d3
UD
3819 break;
3820 }
3821
3822 if (result != NULL)
3823 return result;
3824
1a9ccd70 3825 sprintf (buff, "LOOS+%#lx", p_type - PT_LOOS);
103f02d3 3826 }
252b5132 3827 else
e9e44622 3828 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
252b5132
RH
3829
3830 return buff;
3831 }
3832}
3833
3834static const char *
d3ba0551 3835get_mips_section_type_name (unsigned int sh_type)
252b5132
RH
3836{
3837 switch (sh_type)
3838 {
b34976b6
AM
3839 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
3840 case SHT_MIPS_MSYM: return "MIPS_MSYM";
3841 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
3842 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
3843 case SHT_MIPS_UCODE: return "MIPS_UCODE";
3844 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
3845 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
3846 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
3847 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
3848 case SHT_MIPS_RELD: return "MIPS_RELD";
3849 case SHT_MIPS_IFACE: return "MIPS_IFACE";
3850 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
3851 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
3852 case SHT_MIPS_SHDR: return "MIPS_SHDR";
3853 case SHT_MIPS_FDESC: return "MIPS_FDESC";
3854 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
3855 case SHT_MIPS_DENSE: return "MIPS_DENSE";
3856 case SHT_MIPS_PDESC: return "MIPS_PDESC";
3857 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
3858 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
3859 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
3860 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
3861 case SHT_MIPS_LINE: return "MIPS_LINE";
3862 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
3863 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
3864 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
3865 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
3866 case SHT_MIPS_DWARF: return "MIPS_DWARF";
3867 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
3868 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
3869 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
3870 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
3871 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
3872 case SHT_MIPS_XLATE: return "MIPS_XLATE";
3873 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
3874 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
3875 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
3876 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
252b5132 3877 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
351cdf24 3878 case SHT_MIPS_ABIFLAGS: return "MIPS_ABIFLAGS";
252b5132
RH
3879 default:
3880 break;
3881 }
3882 return NULL;
3883}
3884
103f02d3 3885static const char *
d3ba0551 3886get_parisc_section_type_name (unsigned int sh_type)
103f02d3
UD
3887{
3888 switch (sh_type)
3889 {
3890 case SHT_PARISC_EXT: return "PARISC_EXT";
3891 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
3892 case SHT_PARISC_DOC: return "PARISC_DOC";
eec8f817
DA
3893 case SHT_PARISC_ANNOT: return "PARISC_ANNOT";
3894 case SHT_PARISC_SYMEXTN: return "PARISC_SYMEXTN";
3895 case SHT_PARISC_STUBS: return "PARISC_STUBS";
61472819 3896 case SHT_PARISC_DLKM: return "PARISC_DLKM";
103f02d3
UD
3897 default:
3898 break;
3899 }
3900 return NULL;
3901}
3902
4d6ed7c8 3903static const char *
d3ba0551 3904get_ia64_section_type_name (unsigned int sh_type)
4d6ed7c8 3905{
18bd398b 3906 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
ecc51f48
NC
3907 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
3908 return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
0de14b54 3909
4d6ed7c8
NC
3910 switch (sh_type)
3911 {
148b93f2
NC
3912 case SHT_IA_64_EXT: return "IA_64_EXT";
3913 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
3914 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
3915 case SHT_IA_64_VMS_TRACE: return "VMS_TRACE";
3916 case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
3917 case SHT_IA_64_VMS_DEBUG: return "VMS_DEBUG";
3918 case SHT_IA_64_VMS_DEBUG_STR: return "VMS_DEBUG_STR";
3919 case SHT_IA_64_VMS_LINKAGES: return "VMS_LINKAGES";
3920 case SHT_IA_64_VMS_SYMBOL_VECTOR: return "VMS_SYMBOL_VECTOR";
3921 case SHT_IA_64_VMS_FIXUP: return "VMS_FIXUP";
4d6ed7c8
NC
3922 default:
3923 break;
3924 }
3925 return NULL;
3926}
3927
d2b2c203
DJ
3928static const char *
3929get_x86_64_section_type_name (unsigned int sh_type)
3930{
3931 switch (sh_type)
3932 {
3933 case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
3934 default:
3935 break;
3936 }
3937 return NULL;
3938}
3939
a06ea964
NC
3940static const char *
3941get_aarch64_section_type_name (unsigned int sh_type)
3942{
3943 switch (sh_type)
3944 {
3945 case SHT_AARCH64_ATTRIBUTES:
3946 return "AARCH64_ATTRIBUTES";
3947 default:
3948 break;
3949 }
3950 return NULL;
3951}
3952
40a18ebd
NC
3953static const char *
3954get_arm_section_type_name (unsigned int sh_type)
3955{
3956 switch (sh_type)
3957 {
7f6fed87
NC
3958 case SHT_ARM_EXIDX: return "ARM_EXIDX";
3959 case SHT_ARM_PREEMPTMAP: return "ARM_PREEMPTMAP";
3960 case SHT_ARM_ATTRIBUTES: return "ARM_ATTRIBUTES";
3961 case SHT_ARM_DEBUGOVERLAY: return "ARM_DEBUGOVERLAY";
3962 case SHT_ARM_OVERLAYSECTION: return "ARM_OVERLAYSECTION";
40a18ebd
NC
3963 default:
3964 break;
3965 }
3966 return NULL;
3967}
3968
40b36596
JM
3969static const char *
3970get_tic6x_section_type_name (unsigned int sh_type)
3971{
3972 switch (sh_type)
3973 {
3974 case SHT_C6000_UNWIND:
3975 return "C6000_UNWIND";
3976 case SHT_C6000_PREEMPTMAP:
3977 return "C6000_PREEMPTMAP";
3978 case SHT_C6000_ATTRIBUTES:
3979 return "C6000_ATTRIBUTES";
3980 case SHT_TI_ICODE:
3981 return "TI_ICODE";
3982 case SHT_TI_XREF:
3983 return "TI_XREF";
3984 case SHT_TI_HANDLER:
3985 return "TI_HANDLER";
3986 case SHT_TI_INITINFO:
3987 return "TI_INITINFO";
3988 case SHT_TI_PHATTRS:
3989 return "TI_PHATTRS";
3990 default:
3991 break;
3992 }
3993 return NULL;
3994}
3995
13761a11
NC
3996static const char *
3997get_msp430x_section_type_name (unsigned int sh_type)
3998{
3999 switch (sh_type)
4000 {
4001 case SHT_MSP430_SEC_FLAGS: return "MSP430_SEC_FLAGS";
4002 case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
4003 case SHT_MSP430_ATTRIBUTES: return "MSP430_ATTRIBUTES";
4004 default: return NULL;
4005 }
4006}
4007
685080f2
NC
4008static const char *
4009get_v850_section_type_name (unsigned int sh_type)
4010{
4011 switch (sh_type)
4012 {
4013 case SHT_V850_SCOMMON: return "V850 Small Common";
4014 case SHT_V850_TCOMMON: return "V850 Tiny Common";
4015 case SHT_V850_ZCOMMON: return "V850 Zero Common";
4016 case SHT_RENESAS_IOP: return "RENESAS IOP";
4017 case SHT_RENESAS_INFO: return "RENESAS INFO";
4018 default: return NULL;
4019 }
4020}
4021
252b5132 4022static const char *
d3ba0551 4023get_section_type_name (unsigned int sh_type)
252b5132 4024{
b34976b6 4025 static char buff[32];
9fb71ee4 4026 const char * result;
252b5132
RH
4027
4028 switch (sh_type)
4029 {
4030 case SHT_NULL: return "NULL";
4031 case SHT_PROGBITS: return "PROGBITS";
4032 case SHT_SYMTAB: return "SYMTAB";
4033 case SHT_STRTAB: return "STRTAB";
4034 case SHT_RELA: return "RELA";
4035 case SHT_HASH: return "HASH";
4036 case SHT_DYNAMIC: return "DYNAMIC";
4037 case SHT_NOTE: return "NOTE";
4038 case SHT_NOBITS: return "NOBITS";
4039 case SHT_REL: return "REL";
4040 case SHT_SHLIB: return "SHLIB";
4041 case SHT_DYNSYM: return "DYNSYM";
d1133906
NC
4042 case SHT_INIT_ARRAY: return "INIT_ARRAY";
4043 case SHT_FINI_ARRAY: return "FINI_ARRAY";
4044 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
fdc90cb4 4045 case SHT_GNU_HASH: return "GNU_HASH";
93ebe586
NC
4046 case SHT_GROUP: return "GROUP";
4047 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
252b5132
RH
4048 case SHT_GNU_verdef: return "VERDEF";
4049 case SHT_GNU_verneed: return "VERNEED";
4050 case SHT_GNU_versym: return "VERSYM";
b34976b6
AM
4051 case 0x6ffffff0: return "VERSYM";
4052 case 0x6ffffffc: return "VERDEF";
252b5132
RH
4053 case 0x7ffffffd: return "AUXILIARY";
4054 case 0x7fffffff: return "FILTER";
047b2264 4055 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
252b5132
RH
4056
4057 default:
4058 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
4059 {
252b5132
RH
4060 switch (elf_header.e_machine)
4061 {
4062 case EM_MIPS:
4fe85591 4063 case EM_MIPS_RS3_LE:
252b5132
RH
4064 result = get_mips_section_type_name (sh_type);
4065 break;
103f02d3
UD
4066 case EM_PARISC:
4067 result = get_parisc_section_type_name (sh_type);
4068 break;
4d6ed7c8
NC
4069 case EM_IA_64:
4070 result = get_ia64_section_type_name (sh_type);
4071 break;
d2b2c203 4072 case EM_X86_64:
8a9036a4 4073 case EM_L1OM:
7a9068fe 4074 case EM_K1OM:
d2b2c203
DJ
4075 result = get_x86_64_section_type_name (sh_type);
4076 break;
a06ea964
NC
4077 case EM_AARCH64:
4078 result = get_aarch64_section_type_name (sh_type);
4079 break;
40a18ebd
NC
4080 case EM_ARM:
4081 result = get_arm_section_type_name (sh_type);
4082 break;
40b36596
JM
4083 case EM_TI_C6000:
4084 result = get_tic6x_section_type_name (sh_type);
4085 break;
13761a11
NC
4086 case EM_MSP430:
4087 result = get_msp430x_section_type_name (sh_type);
4088 break;
685080f2
NC
4089 case EM_V800:
4090 case EM_V850:
4091 case EM_CYGNUS_V850:
4092 result = get_v850_section_type_name (sh_type);
4093 break;
252b5132
RH
4094 default:
4095 result = NULL;
4096 break;
4097 }
4098
4099 if (result != NULL)
4100 return result;
4101
9fb71ee4 4102 sprintf (buff, "LOPROC+%#x", sh_type - SHT_LOPROC);
252b5132
RH
4103 }
4104 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
148b93f2 4105 {
148b93f2
NC
4106 switch (elf_header.e_machine)
4107 {
4108 case EM_IA_64:
4109 result = get_ia64_section_type_name (sh_type);
4110 break;
4111 default:
fd85a6a1
NC
4112 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
4113 result = get_solaris_section_type (sh_type);
4114 else
4115 result = NULL;
148b93f2
NC
4116 break;
4117 }
4118
4119 if (result != NULL)
4120 return result;
4121
9fb71ee4 4122 sprintf (buff, "LOOS+%#x", sh_type - SHT_LOOS);
148b93f2 4123 }
252b5132 4124 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
685080f2
NC
4125 {
4126 switch (elf_header.e_machine)
4127 {
4128 case EM_V800:
4129 case EM_V850:
4130 case EM_CYGNUS_V850:
9fb71ee4 4131 result = get_v850_section_type_name (sh_type);
a9fb83be 4132 break;
685080f2 4133 default:
9fb71ee4 4134 result = NULL;
685080f2
NC
4135 break;
4136 }
4137
9fb71ee4
NC
4138 if (result != NULL)
4139 return result;
4140
4141 sprintf (buff, "LOUSER+%#x", sh_type - SHT_LOUSER);
685080f2 4142 }
252b5132 4143 else
a7dbfd1c
NC
4144 /* This message is probably going to be displayed in a 15
4145 character wide field, so put the hex value first. */
4146 snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
103f02d3 4147
252b5132
RH
4148 return buff;
4149 }
4150}
4151
2979dc34 4152#define OPTION_DEBUG_DUMP 512
2c610e4b 4153#define OPTION_DYN_SYMS 513
fd2f0033
TT
4154#define OPTION_DWARF_DEPTH 514
4155#define OPTION_DWARF_START 515
4723351a 4156#define OPTION_DWARF_CHECK 516
2979dc34 4157
85b1c36d 4158static struct option options[] =
252b5132 4159{
b34976b6 4160 {"all", no_argument, 0, 'a'},
252b5132
RH
4161 {"file-header", no_argument, 0, 'h'},
4162 {"program-headers", no_argument, 0, 'l'},
b34976b6
AM
4163 {"headers", no_argument, 0, 'e'},
4164 {"histogram", no_argument, 0, 'I'},
4165 {"segments", no_argument, 0, 'l'},
4166 {"sections", no_argument, 0, 'S'},
252b5132 4167 {"section-headers", no_argument, 0, 'S'},
f5842774 4168 {"section-groups", no_argument, 0, 'g'},
5477e8a0 4169 {"section-details", no_argument, 0, 't'},
595cf52e 4170 {"full-section-name",no_argument, 0, 'N'},
b34976b6
AM
4171 {"symbols", no_argument, 0, 's'},
4172 {"syms", no_argument, 0, 's'},
2c610e4b 4173 {"dyn-syms", no_argument, 0, OPTION_DYN_SYMS},
b34976b6
AM
4174 {"relocs", no_argument, 0, 'r'},
4175 {"notes", no_argument, 0, 'n'},
4176 {"dynamic", no_argument, 0, 'd'},
a952a375 4177 {"arch-specific", no_argument, 0, 'A'},
252b5132
RH
4178 {"version-info", no_argument, 0, 'V'},
4179 {"use-dynamic", no_argument, 0, 'D'},
09c11c86 4180 {"unwind", no_argument, 0, 'u'},
4145f1d5 4181 {"archive-index", no_argument, 0, 'c'},
b34976b6 4182 {"hex-dump", required_argument, 0, 'x'},
cf13d699 4183 {"relocated-dump", required_argument, 0, 'R'},
09c11c86 4184 {"string-dump", required_argument, 0, 'p'},
0e602686 4185 {"decompress", no_argument, 0, 'z'},
252b5132
RH
4186#ifdef SUPPORT_DISASSEMBLY
4187 {"instruction-dump", required_argument, 0, 'i'},
4188#endif
cf13d699 4189 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
252b5132 4190
fd2f0033
TT
4191 {"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH},
4192 {"dwarf-start", required_argument, 0, OPTION_DWARF_START},
4723351a 4193 {"dwarf-check", no_argument, 0, OPTION_DWARF_CHECK},
fd2f0033 4194
b34976b6
AM
4195 {"version", no_argument, 0, 'v'},
4196 {"wide", no_argument, 0, 'W'},
4197 {"help", no_argument, 0, 'H'},
4198 {0, no_argument, 0, 0}
252b5132
RH
4199};
4200
4201static void
2cf0635d 4202usage (FILE * stream)
252b5132 4203{
92f01d61
JM
4204 fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
4205 fprintf (stream, _(" Display information about the contents of ELF format files\n"));
4206 fprintf (stream, _(" Options are:\n\
8b53311e
NC
4207 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4208 -h --file-header Display the ELF file header\n\
4209 -l --program-headers Display the program headers\n\
4210 --segments An alias for --program-headers\n\
4211 -S --section-headers Display the sections' header\n\
4212 --sections An alias for --section-headers\n\
f5842774 4213 -g --section-groups Display the section groups\n\
5477e8a0 4214 -t --section-details Display the section details\n\
8b53311e
NC
4215 -e --headers Equivalent to: -h -l -S\n\
4216 -s --syms Display the symbol table\n\
3f08eb35 4217 --symbols An alias for --syms\n\
2c610e4b 4218 --dyn-syms Display the dynamic symbol table\n\
8b53311e
NC
4219 -n --notes Display the core notes (if present)\n\
4220 -r --relocs Display the relocations (if present)\n\
4221 -u --unwind Display the unwind info (if present)\n\
b2d38a17 4222 -d --dynamic Display the dynamic section (if present)\n\
8b53311e 4223 -V --version-info Display the version sections (if present)\n\
1b31d05e 4224 -A --arch-specific Display architecture specific information (if any)\n\
4145f1d5 4225 -c --archive-index Display the symbol/file index in an archive\n\
8b53311e 4226 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
09c11c86
NC
4227 -x --hex-dump=<number|name>\n\
4228 Dump the contents of section <number|name> as bytes\n\
4229 -p --string-dump=<number|name>\n\
4230 Dump the contents of section <number|name> as strings\n\
cf13d699
NC
4231 -R --relocated-dump=<number|name>\n\
4232 Dump the contents of section <number|name> as relocated bytes\n\
0e602686 4233 -z --decompress Decompress section before dumping it\n\
f9f0e732 4234 -w[lLiaprmfFsoRt] or\n\
1ed06042 4235 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
6f875884 4236 =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
657d0d47
CC
4237 =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4238 =addr,=cu_index]\n\
8b53311e 4239 Display the contents of DWARF2 debug sections\n"));
fd2f0033
TT
4240 fprintf (stream, _("\
4241 --dwarf-depth=N Do not display DIEs at depth N or greater\n\
4242 --dwarf-start=N Display DIEs starting with N, at the same depth\n\
4243 or deeper\n"));
252b5132 4244#ifdef SUPPORT_DISASSEMBLY
92f01d61 4245 fprintf (stream, _("\
09c11c86
NC
4246 -i --instruction-dump=<number|name>\n\
4247 Disassemble the contents of section <number|name>\n"));
252b5132 4248#endif
92f01d61 4249 fprintf (stream, _("\
8b53311e
NC
4250 -I --histogram Display histogram of bucket list lengths\n\
4251 -W --wide Allow output width to exceed 80 characters\n\
07012eee 4252 @<file> Read options from <file>\n\
8b53311e
NC
4253 -H --help Display this information\n\
4254 -v --version Display the version number of readelf\n"));
1118d252 4255
92f01d61
JM
4256 if (REPORT_BUGS_TO[0] && stream == stdout)
4257 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
252b5132 4258
92f01d61 4259 exit (stream == stdout ? 0 : 1);
252b5132
RH
4260}
4261
18bd398b
NC
4262/* Record the fact that the user wants the contents of section number
4263 SECTION to be displayed using the method(s) encoded as flags bits
4264 in TYPE. Note, TYPE can be zero if we are creating the array for
4265 the first time. */
4266
252b5132 4267static void
09c11c86 4268request_dump_bynumber (unsigned int section, dump_type type)
252b5132
RH
4269{
4270 if (section >= num_dump_sects)
4271 {
2cf0635d 4272 dump_type * new_dump_sects;
252b5132 4273
3f5e193b
NC
4274 new_dump_sects = (dump_type *) calloc (section + 1,
4275 sizeof (* dump_sects));
252b5132
RH
4276
4277 if (new_dump_sects == NULL)
591a748a 4278 error (_("Out of memory allocating dump request table.\n"));
252b5132
RH
4279 else
4280 {
21b65bac
NC
4281 if (dump_sects)
4282 {
4283 /* Copy current flag settings. */
4284 memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
252b5132 4285
21b65bac
NC
4286 free (dump_sects);
4287 }
252b5132
RH
4288
4289 dump_sects = new_dump_sects;
4290 num_dump_sects = section + 1;
4291 }
4292 }
4293
4294 if (dump_sects)
b34976b6 4295 dump_sects[section] |= type;
252b5132
RH
4296
4297 return;
4298}
4299
aef1f6d0
DJ
4300/* Request a dump by section name. */
4301
4302static void
2cf0635d 4303request_dump_byname (const char * section, dump_type type)
aef1f6d0 4304{
2cf0635d 4305 struct dump_list_entry * new_request;
aef1f6d0 4306
3f5e193b
NC
4307 new_request = (struct dump_list_entry *)
4308 malloc (sizeof (struct dump_list_entry));
aef1f6d0 4309 if (!new_request)
591a748a 4310 error (_("Out of memory allocating dump request table.\n"));
aef1f6d0
DJ
4311
4312 new_request->name = strdup (section);
4313 if (!new_request->name)
591a748a 4314 error (_("Out of memory allocating dump request table.\n"));
aef1f6d0
DJ
4315
4316 new_request->type = type;
4317
4318 new_request->next = dump_sects_byname;
4319 dump_sects_byname = new_request;
4320}
4321
cf13d699
NC
4322static inline void
4323request_dump (dump_type type)
4324{
4325 int section;
4326 char * cp;
4327
4328 do_dump++;
4329 section = strtoul (optarg, & cp, 0);
4330
4331 if (! *cp && section >= 0)
4332 request_dump_bynumber (section, type);
4333 else
4334 request_dump_byname (optarg, type);
4335}
4336
4337
252b5132 4338static void
2cf0635d 4339parse_args (int argc, char ** argv)
252b5132
RH
4340{
4341 int c;
4342
4343 if (argc < 2)
92f01d61 4344 usage (stderr);
252b5132
RH
4345
4346 while ((c = getopt_long
0e602686 4347 (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
252b5132 4348 {
252b5132
RH
4349 switch (c)
4350 {
4351 case 0:
4352 /* Long options. */
4353 break;
4354 case 'H':
92f01d61 4355 usage (stdout);
252b5132
RH
4356 break;
4357
4358 case 'a':
b34976b6
AM
4359 do_syms++;
4360 do_reloc++;
4361 do_unwind++;
4362 do_dynamic++;
4363 do_header++;
4364 do_sections++;
f5842774 4365 do_section_groups++;
b34976b6
AM
4366 do_segments++;
4367 do_version++;
4368 do_histogram++;
4369 do_arch++;
4370 do_notes++;
252b5132 4371 break;
f5842774
L
4372 case 'g':
4373 do_section_groups++;
4374 break;
5477e8a0 4375 case 't':
595cf52e 4376 case 'N':
5477e8a0
L
4377 do_sections++;
4378 do_section_details++;
595cf52e 4379 break;
252b5132 4380 case 'e':
b34976b6
AM
4381 do_header++;
4382 do_sections++;
4383 do_segments++;
252b5132 4384 break;
a952a375 4385 case 'A':
b34976b6 4386 do_arch++;
a952a375 4387 break;
252b5132 4388 case 'D':
b34976b6 4389 do_using_dynamic++;
252b5132
RH
4390 break;
4391 case 'r':
b34976b6 4392 do_reloc++;
252b5132 4393 break;
4d6ed7c8 4394 case 'u':
b34976b6 4395 do_unwind++;
4d6ed7c8 4396 break;
252b5132 4397 case 'h':
b34976b6 4398 do_header++;
252b5132
RH
4399 break;
4400 case 'l':
b34976b6 4401 do_segments++;
252b5132
RH
4402 break;
4403 case 's':
b34976b6 4404 do_syms++;
252b5132
RH
4405 break;
4406 case 'S':
b34976b6 4407 do_sections++;
252b5132
RH
4408 break;
4409 case 'd':
b34976b6 4410 do_dynamic++;
252b5132 4411 break;
a952a375 4412 case 'I':
b34976b6 4413 do_histogram++;
a952a375 4414 break;
779fe533 4415 case 'n':
b34976b6 4416 do_notes++;
779fe533 4417 break;
4145f1d5
NC
4418 case 'c':
4419 do_archive_index++;
4420 break;
252b5132 4421 case 'x':
cf13d699 4422 request_dump (HEX_DUMP);
aef1f6d0 4423 break;
09c11c86 4424 case 'p':
cf13d699
NC
4425 request_dump (STRING_DUMP);
4426 break;
4427 case 'R':
4428 request_dump (RELOC_DUMP);
09c11c86 4429 break;
0e602686
NC
4430 case 'z':
4431 decompress_dumps++;
4432 break;
252b5132 4433 case 'w':
b34976b6 4434 do_dump++;
252b5132 4435 if (optarg == 0)
613ff48b
CC
4436 {
4437 do_debugging = 1;
4438 dwarf_select_sections_all ();
4439 }
252b5132
RH
4440 else
4441 {
4442 do_debugging = 0;
4cb93e3b 4443 dwarf_select_sections_by_letters (optarg);
252b5132
RH
4444 }
4445 break;
2979dc34 4446 case OPTION_DEBUG_DUMP:
b34976b6 4447 do_dump++;
2979dc34
JJ
4448 if (optarg == 0)
4449 do_debugging = 1;
4450 else
4451 {
2979dc34 4452 do_debugging = 0;
4cb93e3b 4453 dwarf_select_sections_by_names (optarg);
2979dc34
JJ
4454 }
4455 break;
fd2f0033
TT
4456 case OPTION_DWARF_DEPTH:
4457 {
4458 char *cp;
4459
4460 dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4461 }
4462 break;
4463 case OPTION_DWARF_START:
4464 {
4465 char *cp;
4466
4467 dwarf_start_die = strtoul (optarg, & cp, 0);
4468 }
4469 break;
4723351a
CC
4470 case OPTION_DWARF_CHECK:
4471 dwarf_check = 1;
4472 break;
2c610e4b
L
4473 case OPTION_DYN_SYMS:
4474 do_dyn_syms++;
4475 break;
252b5132
RH
4476#ifdef SUPPORT_DISASSEMBLY
4477 case 'i':
cf13d699
NC
4478 request_dump (DISASS_DUMP);
4479 break;
252b5132
RH
4480#endif
4481 case 'v':
4482 print_version (program_name);
4483 break;
4484 case 'V':
b34976b6 4485 do_version++;
252b5132 4486 break;
d974e256 4487 case 'W':
b34976b6 4488 do_wide++;
d974e256 4489 break;
252b5132 4490 default:
252b5132
RH
4491 /* xgettext:c-format */
4492 error (_("Invalid option '-%c'\n"), c);
1a0670f3 4493 /* Fall through. */
252b5132 4494 case '?':
92f01d61 4495 usage (stderr);
252b5132
RH
4496 }
4497 }
4498
4d6ed7c8 4499 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
252b5132 4500 && !do_segments && !do_header && !do_dump && !do_version
f5842774 4501 && !do_histogram && !do_debugging && !do_arch && !do_notes
2c610e4b
L
4502 && !do_section_groups && !do_archive_index
4503 && !do_dyn_syms)
92f01d61 4504 usage (stderr);
252b5132
RH
4505}
4506
4507static const char *
d3ba0551 4508get_elf_class (unsigned int elf_class)
252b5132 4509{
b34976b6 4510 static char buff[32];
103f02d3 4511
252b5132
RH
4512 switch (elf_class)
4513 {
4514 case ELFCLASSNONE: return _("none");
e3c8793a
NC
4515 case ELFCLASS32: return "ELF32";
4516 case ELFCLASS64: return "ELF64";
ab5e7794 4517 default:
e9e44622 4518 snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
ab5e7794 4519 return buff;
252b5132
RH
4520 }
4521}
4522
4523static const char *
d3ba0551 4524get_data_encoding (unsigned int encoding)
252b5132 4525{
b34976b6 4526 static char buff[32];
103f02d3 4527
252b5132
RH
4528 switch (encoding)
4529 {
4530 case ELFDATANONE: return _("none");
33c63f9d
CM
4531 case ELFDATA2LSB: return _("2's complement, little endian");
4532 case ELFDATA2MSB: return _("2's complement, big endian");
103f02d3 4533 default:
e9e44622 4534 snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
ab5e7794 4535 return buff;
252b5132
RH
4536 }
4537}
4538
252b5132 4539/* Decode the data held in 'elf_header'. */
ee42cf8c 4540
252b5132 4541static int
d3ba0551 4542process_file_header (void)
252b5132 4543{
b34976b6
AM
4544 if ( elf_header.e_ident[EI_MAG0] != ELFMAG0
4545 || elf_header.e_ident[EI_MAG1] != ELFMAG1
4546 || elf_header.e_ident[EI_MAG2] != ELFMAG2
4547 || elf_header.e_ident[EI_MAG3] != ELFMAG3)
252b5132
RH
4548 {
4549 error
4550 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4551 return 0;
4552 }
4553
2dc4cec1
L
4554 init_dwarf_regnames (elf_header.e_machine);
4555
252b5132
RH
4556 if (do_header)
4557 {
4558 int i;
4559
4560 printf (_("ELF Header:\n"));
4561 printf (_(" Magic: "));
b34976b6
AM
4562 for (i = 0; i < EI_NIDENT; i++)
4563 printf ("%2.2x ", elf_header.e_ident[i]);
252b5132
RH
4564 printf ("\n");
4565 printf (_(" Class: %s\n"),
b34976b6 4566 get_elf_class (elf_header.e_ident[EI_CLASS]));
252b5132 4567 printf (_(" Data: %s\n"),
b34976b6 4568 get_data_encoding (elf_header.e_ident[EI_DATA]));
252b5132 4569 printf (_(" Version: %d %s\n"),
b34976b6
AM
4570 elf_header.e_ident[EI_VERSION],
4571 (elf_header.e_ident[EI_VERSION] == EV_CURRENT
789be9f7 4572 ? "(current)"
b34976b6 4573 : (elf_header.e_ident[EI_VERSION] != EV_NONE
2b692964 4574 ? _("<unknown: %lx>")
789be9f7 4575 : "")));
252b5132 4576 printf (_(" OS/ABI: %s\n"),
b34976b6 4577 get_osabi_name (elf_header.e_ident[EI_OSABI]));
252b5132 4578 printf (_(" ABI Version: %d\n"),
b34976b6 4579 elf_header.e_ident[EI_ABIVERSION]);
252b5132
RH
4580 printf (_(" Type: %s\n"),
4581 get_file_type (elf_header.e_type));
4582 printf (_(" Machine: %s\n"),
4583 get_machine_name (elf_header.e_machine));
4584 printf (_(" Version: 0x%lx\n"),
4585 (unsigned long) elf_header.e_version);
76da6bbe 4586
f7a99963
NC
4587 printf (_(" Entry point address: "));
4588 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4589 printf (_("\n Start of program headers: "));
4590 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4591 printf (_(" (bytes into file)\n Start of section headers: "));
4592 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
4593 printf (_(" (bytes into file)\n"));
76da6bbe 4594
252b5132
RH
4595 printf (_(" Flags: 0x%lx%s\n"),
4596 (unsigned long) elf_header.e_flags,
4597 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
4598 printf (_(" Size of this header: %ld (bytes)\n"),
4599 (long) elf_header.e_ehsize);
4600 printf (_(" Size of program headers: %ld (bytes)\n"),
4601 (long) elf_header.e_phentsize);
2046a35d 4602 printf (_(" Number of program headers: %ld"),
252b5132 4603 (long) elf_header.e_phnum);
2046a35d
AM
4604 if (section_headers != NULL
4605 && elf_header.e_phnum == PN_XNUM
4606 && section_headers[0].sh_info != 0)
cc5914eb 4607 printf (" (%ld)", (long) section_headers[0].sh_info);
2046a35d 4608 putc ('\n', stdout);
252b5132
RH
4609 printf (_(" Size of section headers: %ld (bytes)\n"),
4610 (long) elf_header.e_shentsize);
560f3c1c 4611 printf (_(" Number of section headers: %ld"),
252b5132 4612 (long) elf_header.e_shnum);
4fbb74a6 4613 if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
560f3c1c
AM
4614 printf (" (%ld)", (long) section_headers[0].sh_size);
4615 putc ('\n', stdout);
4616 printf (_(" Section header string table index: %ld"),
252b5132 4617 (long) elf_header.e_shstrndx);
4fbb74a6
AM
4618 if (section_headers != NULL
4619 && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
72de5009 4620 printf (" (%u)", section_headers[0].sh_link);
15ba6505
AM
4621 else if (elf_header.e_shstrndx != SHN_UNDEF
4622 && elf_header.e_shstrndx >= elf_header.e_shnum)
2b692964 4623 printf (_(" <corrupt: out of range>"));
560f3c1c
AM
4624 putc ('\n', stdout);
4625 }
4626
4627 if (section_headers != NULL)
4628 {
2046a35d
AM
4629 if (elf_header.e_phnum == PN_XNUM
4630 && section_headers[0].sh_info != 0)
4631 elf_header.e_phnum = section_headers[0].sh_info;
4fbb74a6 4632 if (elf_header.e_shnum == SHN_UNDEF)
560f3c1c 4633 elf_header.e_shnum = section_headers[0].sh_size;
4fbb74a6 4634 if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
560f3c1c 4635 elf_header.e_shstrndx = section_headers[0].sh_link;
4fbb74a6 4636 else if (elf_header.e_shstrndx >= elf_header.e_shnum)
0b49d371 4637 elf_header.e_shstrndx = SHN_UNDEF;
560f3c1c
AM
4638 free (section_headers);
4639 section_headers = NULL;
252b5132 4640 }
103f02d3 4641
9ea033b2
NC
4642 return 1;
4643}
4644
e0a31db1 4645static bfd_boolean
91d6fa6a 4646get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
9ea033b2 4647{
2cf0635d
NC
4648 Elf32_External_Phdr * phdrs;
4649 Elf32_External_Phdr * external;
4650 Elf_Internal_Phdr * internal;
b34976b6 4651 unsigned int i;
e0a31db1
NC
4652 unsigned int size = elf_header.e_phentsize;
4653 unsigned int num = elf_header.e_phnum;
4654
4655 /* PR binutils/17531: Cope with unexpected section header sizes. */
4656 if (size == 0 || num == 0)
4657 return FALSE;
4658 if (size < sizeof * phdrs)
4659 {
4660 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4661 return FALSE;
4662 }
4663 if (size > sizeof * phdrs)
4664 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
103f02d3 4665
3f5e193b 4666 phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
e0a31db1
NC
4667 size, num, _("program headers"));
4668 if (phdrs == NULL)
4669 return FALSE;
9ea033b2 4670
91d6fa6a 4671 for (i = 0, internal = pheaders, external = phdrs;
9ea033b2 4672 i < elf_header.e_phnum;
b34976b6 4673 i++, internal++, external++)
252b5132 4674 {
9ea033b2
NC
4675 internal->p_type = BYTE_GET (external->p_type);
4676 internal->p_offset = BYTE_GET (external->p_offset);
4677 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4678 internal->p_paddr = BYTE_GET (external->p_paddr);
4679 internal->p_filesz = BYTE_GET (external->p_filesz);
4680 internal->p_memsz = BYTE_GET (external->p_memsz);
4681 internal->p_flags = BYTE_GET (external->p_flags);
4682 internal->p_align = BYTE_GET (external->p_align);
252b5132
RH
4683 }
4684
9ea033b2 4685 free (phdrs);
e0a31db1 4686 return TRUE;
252b5132
RH
4687}
4688
e0a31db1 4689static bfd_boolean
91d6fa6a 4690get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
9ea033b2 4691{
2cf0635d
NC
4692 Elf64_External_Phdr * phdrs;
4693 Elf64_External_Phdr * external;
4694 Elf_Internal_Phdr * internal;
b34976b6 4695 unsigned int i;
e0a31db1
NC
4696 unsigned int size = elf_header.e_phentsize;
4697 unsigned int num = elf_header.e_phnum;
4698
4699 /* PR binutils/17531: Cope with unexpected section header sizes. */
4700 if (size == 0 || num == 0)
4701 return FALSE;
4702 if (size < sizeof * phdrs)
4703 {
4704 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4705 return FALSE;
4706 }
4707 if (size > sizeof * phdrs)
4708 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
103f02d3 4709
3f5e193b 4710 phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
e0a31db1 4711 size, num, _("program headers"));
a6e9f9df 4712 if (!phdrs)
e0a31db1 4713 return FALSE;
9ea033b2 4714
91d6fa6a 4715 for (i = 0, internal = pheaders, external = phdrs;
9ea033b2 4716 i < elf_header.e_phnum;
b34976b6 4717 i++, internal++, external++)
9ea033b2
NC
4718 {
4719 internal->p_type = BYTE_GET (external->p_type);
4720 internal->p_flags = BYTE_GET (external->p_flags);
66543521
AM
4721 internal->p_offset = BYTE_GET (external->p_offset);
4722 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4723 internal->p_paddr = BYTE_GET (external->p_paddr);
4724 internal->p_filesz = BYTE_GET (external->p_filesz);
4725 internal->p_memsz = BYTE_GET (external->p_memsz);
4726 internal->p_align = BYTE_GET (external->p_align);
9ea033b2
NC
4727 }
4728
4729 free (phdrs);
e0a31db1 4730 return TRUE;
9ea033b2 4731}
252b5132 4732
d93f0186
NC
4733/* Returns 1 if the program headers were read into `program_headers'. */
4734
4735static int
2cf0635d 4736get_program_headers (FILE * file)
d93f0186 4737{
2cf0635d 4738 Elf_Internal_Phdr * phdrs;
d93f0186
NC
4739
4740 /* Check cache of prior read. */
4741 if (program_headers != NULL)
4742 return 1;
4743
3f5e193b
NC
4744 phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
4745 sizeof (Elf_Internal_Phdr));
d93f0186
NC
4746
4747 if (phdrs == NULL)
4748 {
8b73c356
NC
4749 error (_("Out of memory reading %u program headers\n"),
4750 elf_header.e_phnum);
d93f0186
NC
4751 return 0;
4752 }
4753
4754 if (is_32bit_elf
4755 ? get_32bit_program_headers (file, phdrs)
4756 : get_64bit_program_headers (file, phdrs))
4757 {
4758 program_headers = phdrs;
4759 return 1;
4760 }
4761
4762 free (phdrs);
4763 return 0;
4764}
4765
2f62977e
NC
4766/* Returns 1 if the program headers were loaded. */
4767
252b5132 4768static int
2cf0635d 4769process_program_headers (FILE * file)
252b5132 4770{
2cf0635d 4771 Elf_Internal_Phdr * segment;
b34976b6 4772 unsigned int i;
1a9ccd70 4773 Elf_Internal_Phdr * previous_load = NULL;
252b5132
RH
4774
4775 if (elf_header.e_phnum == 0)
4776 {
82f2dbf7
NC
4777 /* PR binutils/12467. */
4778 if (elf_header.e_phoff != 0)
4779 warn (_("possibly corrupt ELF header - it has a non-zero program"
9035ed51 4780 " header offset, but no program headers\n"));
82f2dbf7 4781 else if (do_segments)
252b5132 4782 printf (_("\nThere are no program headers in this file.\n"));
2f62977e 4783 return 0;
252b5132
RH
4784 }
4785
4786 if (do_segments && !do_header)
4787 {
f7a99963
NC
4788 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
4789 printf (_("Entry point "));
4790 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4791 printf (_("\nThere are %d program headers, starting at offset "),
4792 elf_header.e_phnum);
4793 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4794 printf ("\n");
252b5132
RH
4795 }
4796
d93f0186 4797 if (! get_program_headers (file))
252b5132 4798 return 0;
103f02d3 4799
252b5132
RH
4800 if (do_segments)
4801 {
3a1a2036
NC
4802 if (elf_header.e_phnum > 1)
4803 printf (_("\nProgram Headers:\n"));
4804 else
4805 printf (_("\nProgram Headers:\n"));
76da6bbe 4806
f7a99963
NC
4807 if (is_32bit_elf)
4808 printf
4809 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
d974e256
JJ
4810 else if (do_wide)
4811 printf
4812 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
f7a99963
NC
4813 else
4814 {
4815 printf
4816 (_(" Type Offset VirtAddr PhysAddr\n"));
4817 printf
4818 (_(" FileSiz MemSiz Flags Align\n"));
4819 }
252b5132
RH
4820 }
4821
252b5132 4822 dynamic_addr = 0;
1b228002 4823 dynamic_size = 0;
252b5132
RH
4824
4825 for (i = 0, segment = program_headers;
4826 i < elf_header.e_phnum;
b34976b6 4827 i++, segment++)
252b5132
RH
4828 {
4829 if (do_segments)
4830 {
103f02d3 4831 printf (" %-14.14s ", get_segment_type (segment->p_type));
f7a99963
NC
4832
4833 if (is_32bit_elf)
4834 {
4835 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4836 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
4837 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
4838 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
4839 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
4840 printf ("%c%c%c ",
4841 (segment->p_flags & PF_R ? 'R' : ' '),
4842 (segment->p_flags & PF_W ? 'W' : ' '),
4843 (segment->p_flags & PF_X ? 'E' : ' '));
4844 printf ("%#lx", (unsigned long) segment->p_align);
4845 }
d974e256
JJ
4846 else if (do_wide)
4847 {
4848 if ((unsigned long) segment->p_offset == segment->p_offset)
4849 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4850 else
4851 {
4852 print_vma (segment->p_offset, FULL_HEX);
4853 putchar (' ');
4854 }
4855
4856 print_vma (segment->p_vaddr, FULL_HEX);
4857 putchar (' ');
4858 print_vma (segment->p_paddr, FULL_HEX);
4859 putchar (' ');
4860
4861 if ((unsigned long) segment->p_filesz == segment->p_filesz)
4862 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
4863 else
4864 {
4865 print_vma (segment->p_filesz, FULL_HEX);
4866 putchar (' ');
4867 }
4868
4869 if ((unsigned long) segment->p_memsz == segment->p_memsz)
4870 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
4871 else
4872 {
f48e6c45 4873 print_vma (segment->p_memsz, FULL_HEX);
d974e256
JJ
4874 }
4875
4876 printf (" %c%c%c ",
4877 (segment->p_flags & PF_R ? 'R' : ' '),
4878 (segment->p_flags & PF_W ? 'W' : ' '),
4879 (segment->p_flags & PF_X ? 'E' : ' '));
4880
4881 if ((unsigned long) segment->p_align == segment->p_align)
4882 printf ("%#lx", (unsigned long) segment->p_align);
4883 else
4884 {
4885 print_vma (segment->p_align, PREFIX_HEX);
4886 }
4887 }
f7a99963
NC
4888 else
4889 {
4890 print_vma (segment->p_offset, FULL_HEX);
4891 putchar (' ');
4892 print_vma (segment->p_vaddr, FULL_HEX);
4893 putchar (' ');
4894 print_vma (segment->p_paddr, FULL_HEX);
4895 printf ("\n ");
4896 print_vma (segment->p_filesz, FULL_HEX);
4897 putchar (' ');
4898 print_vma (segment->p_memsz, FULL_HEX);
4899 printf (" %c%c%c ",
4900 (segment->p_flags & PF_R ? 'R' : ' '),
4901 (segment->p_flags & PF_W ? 'W' : ' '),
4902 (segment->p_flags & PF_X ? 'E' : ' '));
4903 print_vma (segment->p_align, HEX);
4904 }
252b5132 4905
1a9ccd70
NC
4906 putc ('\n', stdout);
4907 }
f54498b4 4908
252b5132
RH
4909 switch (segment->p_type)
4910 {
1a9ccd70
NC
4911 case PT_LOAD:
4912 if (previous_load
4913 && previous_load->p_vaddr > segment->p_vaddr)
4914 error (_("LOAD segments must be sorted in order of increasing VirtAddr\n"));
4915 if (segment->p_memsz < segment->p_filesz)
4916 error (_("the segment's file size is larger than its memory size\n"));
4917 previous_load = segment;
4918 break;
4919
4920 case PT_PHDR:
4921 /* PR 20815 - Verify that the program header is loaded into memory. */
4922 if (i > 0 && previous_load != NULL)
4923 error (_("the PHDR segment must occur before any LOAD segment\n"));
4924 if (elf_header.e_machine != EM_PARISC)
4925 {
4926 unsigned int j;
4927
4928 for (j = 1; j < elf_header.e_phnum; j++)
4929 if (program_headers[j].p_vaddr <= segment->p_vaddr
4930 && (program_headers[j].p_vaddr + program_headers[j].p_memsz)
4931 >= (segment->p_vaddr + segment->p_filesz))
4932 break;
4933 if (j == elf_header.e_phnum)
4934 error (_("the PHDR segment is not covered by a LOAD segment\n"));
4935 }
4936 break;
4937
252b5132
RH
4938 case PT_DYNAMIC:
4939 if (dynamic_addr)
4940 error (_("more than one dynamic segment\n"));
4941
20737c13
AM
4942 /* By default, assume that the .dynamic section is the first
4943 section in the DYNAMIC segment. */
4944 dynamic_addr = segment->p_offset;
4945 dynamic_size = segment->p_filesz;
f54498b4
NC
4946 /* PR binutils/17512: Avoid corrupt dynamic section info in the segment. */
4947 if (dynamic_addr + dynamic_size >= current_file_size)
4948 {
4949 error (_("the dynamic segment offset + size exceeds the size of the file\n"));
4950 dynamic_addr = dynamic_size = 0;
4951 }
20737c13 4952
b2d38a17
NC
4953 /* Try to locate the .dynamic section. If there is
4954 a section header table, we can easily locate it. */
4955 if (section_headers != NULL)
4956 {
2cf0635d 4957 Elf_Internal_Shdr * sec;
b2d38a17 4958
89fac5e3
RS
4959 sec = find_section (".dynamic");
4960 if (sec == NULL || sec->sh_size == 0)
b2d38a17 4961 {
28f997cf
TG
4962 /* A corresponding .dynamic section is expected, but on
4963 IA-64/OpenVMS it is OK for it to be missing. */
4964 if (!is_ia64_vms ())
4965 error (_("no .dynamic section in the dynamic segment\n"));
b2d38a17
NC
4966 break;
4967 }
4968
42bb2e33 4969 if (sec->sh_type == SHT_NOBITS)
20737c13
AM
4970 {
4971 dynamic_size = 0;
4972 break;
4973 }
42bb2e33 4974
b2d38a17
NC
4975 dynamic_addr = sec->sh_offset;
4976 dynamic_size = sec->sh_size;
4977
4978 if (dynamic_addr < segment->p_offset
4979 || dynamic_addr > segment->p_offset + segment->p_filesz)
20737c13
AM
4980 warn (_("the .dynamic section is not contained"
4981 " within the dynamic segment\n"));
b2d38a17 4982 else if (dynamic_addr > segment->p_offset)
20737c13
AM
4983 warn (_("the .dynamic section is not the first section"
4984 " in the dynamic segment.\n"));
b2d38a17 4985 }
252b5132
RH
4986 break;
4987
4988 case PT_INTERP:
fb52b2f4
NC
4989 if (fseek (file, archive_file_offset + (long) segment->p_offset,
4990 SEEK_SET))
252b5132
RH
4991 error (_("Unable to find program interpreter name\n"));
4992 else
4993 {
f8eae8b2 4994 char fmt [32];
9495b2e6 4995 int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
f8eae8b2
L
4996
4997 if (ret >= (int) sizeof (fmt) || ret < 0)
591a748a 4998 error (_("Internal error: failed to create format string to display program interpreter\n"));
f8eae8b2 4999
252b5132 5000 program_interpreter[0] = 0;
7bd7b3ef
AM
5001 if (fscanf (file, fmt, program_interpreter) <= 0)
5002 error (_("Unable to read program interpreter name\n"));
252b5132
RH
5003
5004 if (do_segments)
f54498b4 5005 printf (_(" [Requesting program interpreter: %s]\n"),
252b5132
RH
5006 program_interpreter);
5007 }
5008 break;
5009 }
252b5132
RH
5010 }
5011
c256ffe7 5012 if (do_segments && section_headers != NULL && string_table != NULL)
252b5132
RH
5013 {
5014 printf (_("\n Section to Segment mapping:\n"));
5015 printf (_(" Segment Sections...\n"));
5016
252b5132
RH
5017 for (i = 0; i < elf_header.e_phnum; i++)
5018 {
9ad5cbcf 5019 unsigned int j;
2cf0635d 5020 Elf_Internal_Shdr * section;
252b5132
RH
5021
5022 segment = program_headers + i;
b391a3e3 5023 section = section_headers + 1;
252b5132
RH
5024
5025 printf (" %2.2d ", i);
5026
b34976b6 5027 for (j = 1; j < elf_header.e_shnum; j++, section++)
252b5132 5028 {
f4638467
AM
5029 if (!ELF_TBSS_SPECIAL (section, segment)
5030 && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
74e1a04b 5031 printf ("%s ", printable_section_name (section));
252b5132
RH
5032 }
5033
5034 putc ('\n',stdout);
5035 }
5036 }
5037
252b5132
RH
5038 return 1;
5039}
5040
5041
d93f0186
NC
5042/* Find the file offset corresponding to VMA by using the program headers. */
5043
5044static long
2cf0635d 5045offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
d93f0186 5046{
2cf0635d 5047 Elf_Internal_Phdr * seg;
d93f0186
NC
5048
5049 if (! get_program_headers (file))
5050 {
5051 warn (_("Cannot interpret virtual addresses without program headers.\n"));
5052 return (long) vma;
5053 }
5054
5055 for (seg = program_headers;
5056 seg < program_headers + elf_header.e_phnum;
5057 ++seg)
5058 {
5059 if (seg->p_type != PT_LOAD)
5060 continue;
5061
5062 if (vma >= (seg->p_vaddr & -seg->p_align)
5063 && vma + size <= seg->p_vaddr + seg->p_filesz)
5064 return vma - seg->p_vaddr + seg->p_offset;
5065 }
5066
5067 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
0af1713e 5068 (unsigned long) vma);
d93f0186
NC
5069 return (long) vma;
5070}
5071
5072
049b0c3a
NC
5073/* Allocate memory and load the sections headers into the global pointer
5074 SECTION_HEADERS. If PROBE is true, this is just a probe and we do not
5075 generate any error messages if the load fails. */
5076
5077static bfd_boolean
5078get_32bit_section_headers (FILE * file, bfd_boolean probe)
252b5132 5079{
2cf0635d
NC
5080 Elf32_External_Shdr * shdrs;
5081 Elf_Internal_Shdr * internal;
b34976b6 5082 unsigned int i;
049b0c3a
NC
5083 unsigned int size = elf_header.e_shentsize;
5084 unsigned int num = probe ? 1 : elf_header.e_shnum;
5085
5086 /* PR binutils/17531: Cope with unexpected section header sizes. */
5087 if (size == 0 || num == 0)
5088 return FALSE;
5089 if (size < sizeof * shdrs)
5090 {
5091 if (! probe)
5092 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5093 return FALSE;
5094 }
5095 if (!probe && size > sizeof * shdrs)
5096 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
252b5132 5097
3f5e193b 5098 shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
049b0c3a
NC
5099 size, num,
5100 probe ? NULL : _("section headers"));
5101 if (shdrs == NULL)
5102 return FALSE;
252b5132 5103
049b0c3a
NC
5104 if (section_headers != NULL)
5105 free (section_headers);
3f5e193b
NC
5106 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
5107 sizeof (Elf_Internal_Shdr));
252b5132
RH
5108 if (section_headers == NULL)
5109 {
049b0c3a 5110 if (!probe)
8b73c356 5111 error (_("Out of memory reading %u section headers\n"), num);
049b0c3a 5112 return FALSE;
252b5132
RH
5113 }
5114
5115 for (i = 0, internal = section_headers;
560f3c1c 5116 i < num;
b34976b6 5117 i++, internal++)
252b5132
RH
5118 {
5119 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5120 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
5121 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5122 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5123 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5124 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5125 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5126 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5127 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5128 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
315350be
NC
5129 if (!probe && internal->sh_link > num)
5130 warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5131 if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5132 warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
252b5132
RH
5133 }
5134
5135 free (shdrs);
049b0c3a 5136 return TRUE;
252b5132
RH
5137}
5138
049b0c3a
NC
5139static bfd_boolean
5140get_64bit_section_headers (FILE * file, bfd_boolean probe)
9ea033b2 5141{
2cf0635d
NC
5142 Elf64_External_Shdr * shdrs;
5143 Elf_Internal_Shdr * internal;
b34976b6 5144 unsigned int i;
049b0c3a
NC
5145 unsigned int size = elf_header.e_shentsize;
5146 unsigned int num = probe ? 1 : elf_header.e_shnum;
5147
5148 /* PR binutils/17531: Cope with unexpected section header sizes. */
5149 if (size == 0 || num == 0)
5150 return FALSE;
5151 if (size < sizeof * shdrs)
5152 {
5153 if (! probe)
5154 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5155 return FALSE;
5156 }
5157 if (! probe && size > sizeof * shdrs)
5158 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
9ea033b2 5159
3f5e193b 5160 shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
049b0c3a
NC
5161 size, num,
5162 probe ? NULL : _("section headers"));
5163 if (shdrs == NULL)
5164 return FALSE;
9ea033b2 5165
049b0c3a
NC
5166 if (section_headers != NULL)
5167 free (section_headers);
3f5e193b
NC
5168 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
5169 sizeof (Elf_Internal_Shdr));
9ea033b2
NC
5170 if (section_headers == NULL)
5171 {
049b0c3a 5172 if (! probe)
8b73c356 5173 error (_("Out of memory reading %u section headers\n"), num);
049b0c3a 5174 return FALSE;
9ea033b2
NC
5175 }
5176
5177 for (i = 0, internal = section_headers;
560f3c1c 5178 i < num;
b34976b6 5179 i++, internal++)
9ea033b2
NC
5180 {
5181 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5182 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
66543521
AM
5183 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5184 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5185 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5186 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
9ea033b2
NC
5187 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5188 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5189 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5190 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
315350be
NC
5191 if (!probe && internal->sh_link > num)
5192 warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5193 if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5194 warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
9ea033b2
NC
5195 }
5196
5197 free (shdrs);
049b0c3a 5198 return TRUE;
9ea033b2
NC
5199}
5200
252b5132 5201static Elf_Internal_Sym *
ba5cdace
NC
5202get_32bit_elf_symbols (FILE * file,
5203 Elf_Internal_Shdr * section,
5204 unsigned long * num_syms_return)
252b5132 5205{
ba5cdace 5206 unsigned long number = 0;
dd24e3da 5207 Elf32_External_Sym * esyms = NULL;
ba5cdace 5208 Elf_External_Sym_Shndx * shndx = NULL;
dd24e3da 5209 Elf_Internal_Sym * isyms = NULL;
2cf0635d 5210 Elf_Internal_Sym * psym;
b34976b6 5211 unsigned int j;
252b5132 5212
c9c1d674
EG
5213 if (section->sh_size == 0)
5214 {
5215 if (num_syms_return != NULL)
5216 * num_syms_return = 0;
5217 return NULL;
5218 }
5219
dd24e3da 5220 /* Run some sanity checks first. */
c9c1d674 5221 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
dd24e3da 5222 {
c9c1d674
EG
5223 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5224 printable_section_name (section), (unsigned long) section->sh_entsize);
ba5cdace 5225 goto exit_point;
dd24e3da
NC
5226 }
5227
f54498b4
NC
5228 if (section->sh_size > current_file_size)
5229 {
5230 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
74e1a04b 5231 printable_section_name (section), (unsigned long) section->sh_size);
f54498b4
NC
5232 goto exit_point;
5233 }
5234
dd24e3da
NC
5235 number = section->sh_size / section->sh_entsize;
5236
5237 if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
5238 {
c9c1d674 5239 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
8066deb1
AM
5240 (unsigned long) section->sh_size,
5241 printable_section_name (section),
5242 (unsigned long) section->sh_entsize);
ba5cdace 5243 goto exit_point;
dd24e3da
NC
5244 }
5245
3f5e193b
NC
5246 esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5247 section->sh_size, _("symbols"));
dd24e3da 5248 if (esyms == NULL)
ba5cdace 5249 goto exit_point;
252b5132 5250
6a40cf0c
NC
5251 {
5252 elf_section_list * entry;
5253
5254 shndx = NULL;
5255 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5256 if (entry->hdr->sh_link == (unsigned long) (section - section_headers))
c9c1d674 5257 {
6a40cf0c
NC
5258 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5259 entry->hdr->sh_offset,
5260 1, entry->hdr->sh_size,
5261 _("symbol table section indicies"));
5262 if (shndx == NULL)
5263 goto exit_point;
5264 /* PR17531: file: heap-buffer-overflow */
5265 else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5266 {
5267 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5268 printable_section_name (entry->hdr),
5269 (unsigned long) entry->hdr->sh_size,
5270 (unsigned long) section->sh_size);
5271 goto exit_point;
5272 }
c9c1d674 5273 }
6a40cf0c 5274 }
9ad5cbcf 5275
3f5e193b 5276 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
252b5132
RH
5277
5278 if (isyms == NULL)
5279 {
8b73c356
NC
5280 error (_("Out of memory reading %lu symbols\n"),
5281 (unsigned long) number);
dd24e3da 5282 goto exit_point;
252b5132
RH
5283 }
5284
dd24e3da 5285 for (j = 0, psym = isyms; j < number; j++, psym++)
252b5132
RH
5286 {
5287 psym->st_name = BYTE_GET (esyms[j].st_name);
5288 psym->st_value = BYTE_GET (esyms[j].st_value);
5289 psym->st_size = BYTE_GET (esyms[j].st_size);
5290 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4fbb74a6 5291 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
9ad5cbcf
AM
5292 psym->st_shndx
5293 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4fbb74a6
AM
5294 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5295 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
252b5132
RH
5296 psym->st_info = BYTE_GET (esyms[j].st_info);
5297 psym->st_other = BYTE_GET (esyms[j].st_other);
5298 }
5299
dd24e3da 5300 exit_point:
ba5cdace 5301 if (shndx != NULL)
9ad5cbcf 5302 free (shndx);
ba5cdace 5303 if (esyms != NULL)
dd24e3da 5304 free (esyms);
252b5132 5305
ba5cdace
NC
5306 if (num_syms_return != NULL)
5307 * num_syms_return = isyms == NULL ? 0 : number;
5308
252b5132
RH
5309 return isyms;
5310}
5311
9ea033b2 5312static Elf_Internal_Sym *
ba5cdace
NC
5313get_64bit_elf_symbols (FILE * file,
5314 Elf_Internal_Shdr * section,
5315 unsigned long * num_syms_return)
9ea033b2 5316{
ba5cdace
NC
5317 unsigned long number = 0;
5318 Elf64_External_Sym * esyms = NULL;
5319 Elf_External_Sym_Shndx * shndx = NULL;
5320 Elf_Internal_Sym * isyms = NULL;
2cf0635d 5321 Elf_Internal_Sym * psym;
b34976b6 5322 unsigned int j;
9ea033b2 5323
c9c1d674
EG
5324 if (section->sh_size == 0)
5325 {
5326 if (num_syms_return != NULL)
5327 * num_syms_return = 0;
5328 return NULL;
5329 }
5330
dd24e3da 5331 /* Run some sanity checks first. */
c9c1d674 5332 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
dd24e3da 5333 {
c9c1d674 5334 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
8066deb1
AM
5335 printable_section_name (section),
5336 (unsigned long) section->sh_entsize);
ba5cdace 5337 goto exit_point;
dd24e3da
NC
5338 }
5339
f54498b4
NC
5340 if (section->sh_size > current_file_size)
5341 {
5342 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
8066deb1
AM
5343 printable_section_name (section),
5344 (unsigned long) section->sh_size);
f54498b4
NC
5345 goto exit_point;
5346 }
5347
dd24e3da
NC
5348 number = section->sh_size / section->sh_entsize;
5349
5350 if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5351 {
c9c1d674 5352 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
8066deb1
AM
5353 (unsigned long) section->sh_size,
5354 printable_section_name (section),
5355 (unsigned long) section->sh_entsize);
ba5cdace 5356 goto exit_point;
dd24e3da
NC
5357 }
5358
3f5e193b
NC
5359 esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5360 section->sh_size, _("symbols"));
a6e9f9df 5361 if (!esyms)
ba5cdace 5362 goto exit_point;
9ea033b2 5363
6a40cf0c
NC
5364 {
5365 elf_section_list * entry;
5366
5367 shndx = NULL;
5368 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5369 if (entry->hdr->sh_link == (unsigned long) (section - section_headers))
c9c1d674 5370 {
6a40cf0c
NC
5371 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5372 entry->hdr->sh_offset,
5373 1, entry->hdr->sh_size,
5374 _("symbol table section indicies"));
5375 if (shndx == NULL)
5376 goto exit_point;
5377 /* PR17531: file: heap-buffer-overflow */
5378 else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5379 {
5380 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5381 printable_section_name (entry->hdr),
5382 (unsigned long) entry->hdr->sh_size,
5383 (unsigned long) section->sh_size);
5384 goto exit_point;
5385 }
c9c1d674 5386 }
6a40cf0c 5387 }
9ad5cbcf 5388
3f5e193b 5389 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
9ea033b2
NC
5390
5391 if (isyms == NULL)
5392 {
8b73c356
NC
5393 error (_("Out of memory reading %lu symbols\n"),
5394 (unsigned long) number);
ba5cdace 5395 goto exit_point;
9ea033b2
NC
5396 }
5397
ba5cdace 5398 for (j = 0, psym = isyms; j < number; j++, psym++)
9ea033b2
NC
5399 {
5400 psym->st_name = BYTE_GET (esyms[j].st_name);
5401 psym->st_info = BYTE_GET (esyms[j].st_info);
5402 psym->st_other = BYTE_GET (esyms[j].st_other);
5403 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
ba5cdace 5404
4fbb74a6 5405 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
9ad5cbcf
AM
5406 psym->st_shndx
5407 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4fbb74a6
AM
5408 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5409 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
ba5cdace 5410
66543521
AM
5411 psym->st_value = BYTE_GET (esyms[j].st_value);
5412 psym->st_size = BYTE_GET (esyms[j].st_size);
9ea033b2
NC
5413 }
5414
ba5cdace
NC
5415 exit_point:
5416 if (shndx != NULL)
9ad5cbcf 5417 free (shndx);
ba5cdace
NC
5418 if (esyms != NULL)
5419 free (esyms);
5420
5421 if (num_syms_return != NULL)
5422 * num_syms_return = isyms == NULL ? 0 : number;
9ea033b2
NC
5423
5424 return isyms;
5425}
5426
d1133906 5427static const char *
d3ba0551 5428get_elf_section_flags (bfd_vma sh_flags)
d1133906 5429{
5477e8a0 5430 static char buff[1024];
2cf0635d 5431 char * p = buff;
8d5ff12c 5432 int field_size = is_32bit_elf ? 8 : 16;
91d6fa6a
NC
5433 int sindex;
5434 int size = sizeof (buff) - (field_size + 4 + 1);
8d5ff12c
L
5435 bfd_vma os_flags = 0;
5436 bfd_vma proc_flags = 0;
5437 bfd_vma unknown_flags = 0;
148b93f2 5438 static const struct
5477e8a0 5439 {
2cf0635d 5440 const char * str;
5477e8a0
L
5441 int len;
5442 }
5443 flags [] =
5444 {
cfcac11d
NC
5445 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
5446 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
5447 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
5448 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
5449 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
5450 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
5451 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5452 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5453 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
5454 /* 9 */ { STRING_COMMA_LEN ("TLS") },
5455 /* IA-64 specific. */
5456 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5457 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5458 /* IA-64 OpenVMS specific. */
5459 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5460 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5461 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5462 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5463 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5464 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
18ae9cc1 5465 /* Generic. */
cfcac11d 5466 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
18ae9cc1 5467 /* SPARC specific. */
77115a4a 5468 /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
ac4c9b04
MG
5469 /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5470 /* ARM specific. */
5471 /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
f0728ee3 5472 /* 22 */ { STRING_COMMA_LEN ("ARM_PURECODE") },
ac4c9b04 5473 /* 23 */ { STRING_COMMA_LEN ("COMDEF") }
5477e8a0
L
5474 };
5475
5476 if (do_section_details)
5477 {
8d5ff12c
L
5478 sprintf (buff, "[%*.*lx]: ",
5479 field_size, field_size, (unsigned long) sh_flags);
5480 p += field_size + 4;
5477e8a0 5481 }
76da6bbe 5482
d1133906
NC
5483 while (sh_flags)
5484 {
5485 bfd_vma flag;
5486
5487 flag = sh_flags & - sh_flags;
5488 sh_flags &= ~ flag;
76da6bbe 5489
5477e8a0 5490 if (do_section_details)
d1133906 5491 {
5477e8a0
L
5492 switch (flag)
5493 {
91d6fa6a
NC
5494 case SHF_WRITE: sindex = 0; break;
5495 case SHF_ALLOC: sindex = 1; break;
5496 case SHF_EXECINSTR: sindex = 2; break;
5497 case SHF_MERGE: sindex = 3; break;
5498 case SHF_STRINGS: sindex = 4; break;
5499 case SHF_INFO_LINK: sindex = 5; break;
5500 case SHF_LINK_ORDER: sindex = 6; break;
5501 case SHF_OS_NONCONFORMING: sindex = 7; break;
5502 case SHF_GROUP: sindex = 8; break;
5503 case SHF_TLS: sindex = 9; break;
18ae9cc1 5504 case SHF_EXCLUDE: sindex = 18; break;
77115a4a 5505 case SHF_COMPRESSED: sindex = 20; break;
76da6bbe 5506
5477e8a0 5507 default:
91d6fa6a 5508 sindex = -1;
cfcac11d 5509 switch (elf_header.e_machine)
148b93f2 5510 {
cfcac11d 5511 case EM_IA_64:
148b93f2 5512 if (flag == SHF_IA_64_SHORT)
91d6fa6a 5513 sindex = 10;
148b93f2 5514 else if (flag == SHF_IA_64_NORECOV)
91d6fa6a 5515 sindex = 11;
148b93f2
NC
5516#ifdef BFD64
5517 else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5518 switch (flag)
5519 {
91d6fa6a
NC
5520 case SHF_IA_64_VMS_GLOBAL: sindex = 12; break;
5521 case SHF_IA_64_VMS_OVERLAID: sindex = 13; break;
5522 case SHF_IA_64_VMS_SHARED: sindex = 14; break;
5523 case SHF_IA_64_VMS_VECTOR: sindex = 15; break;
5524 case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5525 case SHF_IA_64_VMS_PROTECTED: sindex = 17; break;
148b93f2
NC
5526 default: break;
5527 }
5528#endif
cfcac11d
NC
5529 break;
5530
caa83f8b 5531 case EM_386:
22abe556 5532 case EM_IAMCU:
caa83f8b 5533 case EM_X86_64:
7f502d6c 5534 case EM_L1OM:
7a9068fe 5535 case EM_K1OM:
cfcac11d
NC
5536 case EM_OLD_SPARCV9:
5537 case EM_SPARC32PLUS:
5538 case EM_SPARCV9:
5539 case EM_SPARC:
18ae9cc1 5540 if (flag == SHF_ORDERED)
91d6fa6a 5541 sindex = 19;
cfcac11d 5542 break;
ac4c9b04
MG
5543
5544 case EM_ARM:
5545 switch (flag)
5546 {
5547 case SHF_ENTRYSECT: sindex = 21; break;
f0728ee3 5548 case SHF_ARM_PURECODE: sindex = 22; break;
ac4c9b04
MG
5549 case SHF_COMDEF: sindex = 23; break;
5550 default: break;
5551 }
5552 break;
5553
cfcac11d
NC
5554 default:
5555 break;
148b93f2 5556 }
5477e8a0
L
5557 }
5558
91d6fa6a 5559 if (sindex != -1)
5477e8a0 5560 {
8d5ff12c
L
5561 if (p != buff + field_size + 4)
5562 {
5563 if (size < (10 + 2))
bee0ee85
NC
5564 {
5565 warn (_("Internal error: not enough buffer room for section flag info"));
5566 return _("<unknown>");
5567 }
8d5ff12c
L
5568 size -= 2;
5569 *p++ = ',';
5570 *p++ = ' ';
5571 }
5572
91d6fa6a
NC
5573 size -= flags [sindex].len;
5574 p = stpcpy (p, flags [sindex].str);
5477e8a0 5575 }
3b22753a 5576 else if (flag & SHF_MASKOS)
8d5ff12c 5577 os_flags |= flag;
d1133906 5578 else if (flag & SHF_MASKPROC)
8d5ff12c 5579 proc_flags |= flag;
d1133906 5580 else
8d5ff12c 5581 unknown_flags |= flag;
5477e8a0
L
5582 }
5583 else
5584 {
5585 switch (flag)
5586 {
5587 case SHF_WRITE: *p = 'W'; break;
5588 case SHF_ALLOC: *p = 'A'; break;
5589 case SHF_EXECINSTR: *p = 'X'; break;
5590 case SHF_MERGE: *p = 'M'; break;
5591 case SHF_STRINGS: *p = 'S'; break;
5592 case SHF_INFO_LINK: *p = 'I'; break;
5593 case SHF_LINK_ORDER: *p = 'L'; break;
5594 case SHF_OS_NONCONFORMING: *p = 'O'; break;
5595 case SHF_GROUP: *p = 'G'; break;
5596 case SHF_TLS: *p = 'T'; break;
18ae9cc1 5597 case SHF_EXCLUDE: *p = 'E'; break;
77115a4a 5598 case SHF_COMPRESSED: *p = 'C'; break;
5477e8a0
L
5599
5600 default:
8a9036a4 5601 if ((elf_header.e_machine == EM_X86_64
7a9068fe
L
5602 || elf_header.e_machine == EM_L1OM
5603 || elf_header.e_machine == EM_K1OM)
5477e8a0
L
5604 && flag == SHF_X86_64_LARGE)
5605 *p = 'l';
91f68a68 5606 else if (elf_header.e_machine == EM_ARM
f0728ee3 5607 && flag == SHF_ARM_PURECODE)
91f68a68 5608 *p = 'y';
5477e8a0
L
5609 else if (flag & SHF_MASKOS)
5610 {
5611 *p = 'o';
5612 sh_flags &= ~ SHF_MASKOS;
5613 }
5614 else if (flag & SHF_MASKPROC)
5615 {
5616 *p = 'p';
5617 sh_flags &= ~ SHF_MASKPROC;
5618 }
5619 else
5620 *p = 'x';
5621 break;
5622 }
5623 p++;
d1133906
NC
5624 }
5625 }
76da6bbe 5626
8d5ff12c
L
5627 if (do_section_details)
5628 {
5629 if (os_flags)
5630 {
5631 size -= 5 + field_size;
5632 if (p != buff + field_size + 4)
5633 {
5634 if (size < (2 + 1))
bee0ee85
NC
5635 {
5636 warn (_("Internal error: not enough buffer room for section flag info"));
5637 return _("<unknown>");
5638 }
8d5ff12c
L
5639 size -= 2;
5640 *p++ = ',';
5641 *p++ = ' ';
5642 }
5643 sprintf (p, "OS (%*.*lx)", field_size, field_size,
5644 (unsigned long) os_flags);
5645 p += 5 + field_size;
5646 }
5647 if (proc_flags)
5648 {
5649 size -= 7 + field_size;
5650 if (p != buff + field_size + 4)
5651 {
5652 if (size < (2 + 1))
bee0ee85
NC
5653 {
5654 warn (_("Internal error: not enough buffer room for section flag info"));
5655 return _("<unknown>");
5656 }
8d5ff12c
L
5657 size -= 2;
5658 *p++ = ',';
5659 *p++ = ' ';
5660 }
5661 sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5662 (unsigned long) proc_flags);
5663 p += 7 + field_size;
5664 }
5665 if (unknown_flags)
5666 {
5667 size -= 10 + field_size;
5668 if (p != buff + field_size + 4)
5669 {
5670 if (size < (2 + 1))
bee0ee85
NC
5671 {
5672 warn (_("Internal error: not enough buffer room for section flag info"));
5673 return _("<unknown>");
5674 }
8d5ff12c
L
5675 size -= 2;
5676 *p++ = ',';
5677 *p++ = ' ';
5678 }
2b692964 5679 sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
8d5ff12c
L
5680 (unsigned long) unknown_flags);
5681 p += 10 + field_size;
5682 }
5683 }
5684
e9e44622 5685 *p = '\0';
d1133906
NC
5686 return buff;
5687}
5688
77115a4a
L
5689static unsigned int
5690get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf)
5691{
5692 if (is_32bit_elf)
5693 {
5694 Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
d8024a91 5695
77115a4a
L
5696 chdr->ch_type = BYTE_GET (echdr->ch_type);
5697 chdr->ch_size = BYTE_GET (echdr->ch_size);
5698 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5699 return sizeof (*echdr);
5700 }
5701 else
5702 {
5703 Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) buf;
d8024a91 5704
77115a4a
L
5705 chdr->ch_type = BYTE_GET (echdr->ch_type);
5706 chdr->ch_size = BYTE_GET (echdr->ch_size);
5707 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5708 return sizeof (*echdr);
5709 }
5710}
5711
252b5132 5712static int
2cf0635d 5713process_section_headers (FILE * file)
252b5132 5714{
2cf0635d 5715 Elf_Internal_Shdr * section;
b34976b6 5716 unsigned int i;
252b5132
RH
5717
5718 section_headers = NULL;
5719
5720 if (elf_header.e_shnum == 0)
5721 {
82f2dbf7
NC
5722 /* PR binutils/12467. */
5723 if (elf_header.e_shoff != 0)
5724 warn (_("possibly corrupt ELF file header - it has a non-zero"
5725 " section header offset, but no section headers\n"));
5726 else if (do_sections)
252b5132
RH
5727 printf (_("\nThere are no sections in this file.\n"));
5728
5729 return 1;
5730 }
5731
5732 if (do_sections && !do_header)
9ea033b2 5733 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
252b5132
RH
5734 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
5735
9ea033b2
NC
5736 if (is_32bit_elf)
5737 {
049b0c3a 5738 if (! get_32bit_section_headers (file, FALSE))
9ea033b2
NC
5739 return 0;
5740 }
049b0c3a 5741 else if (! get_64bit_section_headers (file, FALSE))
252b5132
RH
5742 return 0;
5743
5744 /* Read in the string table, so that we have names to display. */
0b49d371 5745 if (elf_header.e_shstrndx != SHN_UNDEF
4fbb74a6 5746 && elf_header.e_shstrndx < elf_header.e_shnum)
252b5132 5747 {
4fbb74a6 5748 section = section_headers + elf_header.e_shstrndx;
d40ac9bd 5749
c256ffe7
JJ
5750 if (section->sh_size != 0)
5751 {
3f5e193b
NC
5752 string_table = (char *) get_data (NULL, file, section->sh_offset,
5753 1, section->sh_size,
5754 _("string table"));
0de14b54 5755
c256ffe7
JJ
5756 string_table_length = string_table != NULL ? section->sh_size : 0;
5757 }
252b5132
RH
5758 }
5759
5760 /* Scan the sections for the dynamic symbol table
e3c8793a 5761 and dynamic string table and debug sections. */
252b5132
RH
5762 dynamic_symbols = NULL;
5763 dynamic_strings = NULL;
5764 dynamic_syminfo = NULL;
6a40cf0c 5765 symtab_shndx_list = NULL;
103f02d3 5766
89fac5e3
RS
5767 eh_addr_size = is_32bit_elf ? 4 : 8;
5768 switch (elf_header.e_machine)
5769 {
5770 case EM_MIPS:
5771 case EM_MIPS_RS3_LE:
5772 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
5773 FDE addresses. However, the ABI also has a semi-official ILP32
5774 variant for which the normal FDE address size rules apply.
5775
5776 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
5777 section, where XX is the size of longs in bits. Unfortunately,
5778 earlier compilers provided no way of distinguishing ILP32 objects
5779 from LP64 objects, so if there's any doubt, we should assume that
5780 the official LP64 form is being used. */
5781 if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
5782 && find_section (".gcc_compiled_long32") == NULL)
5783 eh_addr_size = 8;
5784 break;
0f56a26a
DD
5785
5786 case EM_H8_300:
5787 case EM_H8_300H:
5788 switch (elf_header.e_flags & EF_H8_MACH)
5789 {
5790 case E_H8_MACH_H8300:
5791 case E_H8_MACH_H8300HN:
5792 case E_H8_MACH_H8300SN:
5793 case E_H8_MACH_H8300SXN:
5794 eh_addr_size = 2;
5795 break;
5796 case E_H8_MACH_H8300H:
5797 case E_H8_MACH_H8300S:
5798 case E_H8_MACH_H8300SX:
5799 eh_addr_size = 4;
5800 break;
5801 }
f4236fe4
DD
5802 break;
5803
ff7eeb89 5804 case EM_M32C_OLD:
f4236fe4
DD
5805 case EM_M32C:
5806 switch (elf_header.e_flags & EF_M32C_CPU_MASK)
5807 {
5808 case EF_M32C_CPU_M16C:
5809 eh_addr_size = 2;
5810 break;
5811 }
5812 break;
89fac5e3
RS
5813 }
5814
76ca31c0
NC
5815#define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
5816 do \
5817 { \
5818 bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64; \
5819 if (section->sh_entsize != expected_entsize) \
9dd3a467 5820 { \
76ca31c0
NC
5821 char buf[40]; \
5822 sprintf_vma (buf, section->sh_entsize); \
5823 /* Note: coded this way so that there is a single string for \
5824 translation. */ \
5825 error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
5826 error (_("(Using the expected size of %u for the rest of this dump)\n"), \
5827 (unsigned) expected_entsize); \
9dd3a467 5828 section->sh_entsize = expected_entsize; \
76ca31c0
NC
5829 } \
5830 } \
08d8fa11 5831 while (0)
9dd3a467
NC
5832
5833#define CHECK_ENTSIZE(section, i, type) \
08d8fa11
JJ
5834 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
5835 sizeof (Elf64_External_##type))
5836
252b5132
RH
5837 for (i = 0, section = section_headers;
5838 i < elf_header.e_shnum;
b34976b6 5839 i++, section++)
252b5132 5840 {
2cf0635d 5841 char * name = SECTION_NAME (section);
252b5132
RH
5842
5843 if (section->sh_type == SHT_DYNSYM)
5844 {
5845 if (dynamic_symbols != NULL)
5846 {
5847 error (_("File contains multiple dynamic symbol tables\n"));
5848 continue;
5849 }
5850
08d8fa11 5851 CHECK_ENTSIZE (section, i, Sym);
ba5cdace 5852 dynamic_symbols = GET_ELF_SYMBOLS (file, section, & num_dynamic_syms);
252b5132
RH
5853 }
5854 else if (section->sh_type == SHT_STRTAB
18bd398b 5855 && streq (name, ".dynstr"))
252b5132
RH
5856 {
5857 if (dynamic_strings != NULL)
5858 {
5859 error (_("File contains multiple dynamic string tables\n"));
5860 continue;
5861 }
5862
3f5e193b
NC
5863 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
5864 1, section->sh_size,
5865 _("dynamic strings"));
59245841 5866 dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
252b5132 5867 }
9ad5cbcf
AM
5868 else if (section->sh_type == SHT_SYMTAB_SHNDX)
5869 {
6a40cf0c
NC
5870 elf_section_list * entry = xmalloc (sizeof * entry);
5871 entry->hdr = section;
5872 entry->next = symtab_shndx_list;
5873 symtab_shndx_list = entry;
9ad5cbcf 5874 }
08d8fa11
JJ
5875 else if (section->sh_type == SHT_SYMTAB)
5876 CHECK_ENTSIZE (section, i, Sym);
5877 else if (section->sh_type == SHT_GROUP)
5878 CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
5879 else if (section->sh_type == SHT_REL)
5880 CHECK_ENTSIZE (section, i, Rel);
5881 else if (section->sh_type == SHT_RELA)
5882 CHECK_ENTSIZE (section, i, Rela);
252b5132 5883 else if ((do_debugging || do_debug_info || do_debug_abbrevs
f9f0e732 5884 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
cb8f3167 5885 || do_debug_aranges || do_debug_frames || do_debug_macinfo
657d0d47
CC
5886 || do_debug_str || do_debug_loc || do_debug_ranges
5887 || do_debug_addr || do_debug_cu_index)
1b315056
CS
5888 && (const_strneq (name, ".debug_")
5889 || const_strneq (name, ".zdebug_")))
252b5132 5890 {
1b315056
CS
5891 if (name[1] == 'z')
5892 name += sizeof (".zdebug_") - 1;
5893 else
5894 name += sizeof (".debug_") - 1;
252b5132
RH
5895
5896 if (do_debugging
4723351a
CC
5897 || (do_debug_info && const_strneq (name, "info"))
5898 || (do_debug_info && const_strneq (name, "types"))
5899 || (do_debug_abbrevs && const_strneq (name, "abbrev"))
b40bf0a2
NC
5900 || (do_debug_lines && strcmp (name, "line") == 0)
5901 || (do_debug_lines && const_strneq (name, "line."))
4723351a
CC
5902 || (do_debug_pubnames && const_strneq (name, "pubnames"))
5903 || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
459d52c8
DE
5904 || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
5905 || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
4723351a
CC
5906 || (do_debug_aranges && const_strneq (name, "aranges"))
5907 || (do_debug_ranges && const_strneq (name, "ranges"))
5908 || (do_debug_frames && const_strneq (name, "frame"))
5909 || (do_debug_macinfo && const_strneq (name, "macinfo"))
5910 || (do_debug_macinfo && const_strneq (name, "macro"))
5911 || (do_debug_str && const_strneq (name, "str"))
5912 || (do_debug_loc && const_strneq (name, "loc"))
657d0d47
CC
5913 || (do_debug_addr && const_strneq (name, "addr"))
5914 || (do_debug_cu_index && const_strneq (name, "cu_index"))
5915 || (do_debug_cu_index && const_strneq (name, "tu_index"))
252b5132 5916 )
09c11c86 5917 request_dump_bynumber (i, DEBUG_DUMP);
252b5132 5918 }
a262ae96 5919 /* Linkonce section to be combined with .debug_info at link time. */
09fd7e38 5920 else if ((do_debugging || do_debug_info)
0112cd26 5921 && const_strneq (name, ".gnu.linkonce.wi."))
09c11c86 5922 request_dump_bynumber (i, DEBUG_DUMP);
18bd398b 5923 else if (do_debug_frames && streq (name, ".eh_frame"))
09c11c86 5924 request_dump_bynumber (i, DEBUG_DUMP);
5bbdf3d5
DE
5925 else if (do_gdb_index && streq (name, ".gdb_index"))
5926 request_dump_bynumber (i, DEBUG_DUMP);
6f875884
TG
5927 /* Trace sections for Itanium VMS. */
5928 else if ((do_debugging || do_trace_info || do_trace_abbrevs
5929 || do_trace_aranges)
5930 && const_strneq (name, ".trace_"))
5931 {
5932 name += sizeof (".trace_") - 1;
5933
5934 if (do_debugging
5935 || (do_trace_info && streq (name, "info"))
5936 || (do_trace_abbrevs && streq (name, "abbrev"))
5937 || (do_trace_aranges && streq (name, "aranges"))
5938 )
5939 request_dump_bynumber (i, DEBUG_DUMP);
5940 }
252b5132
RH
5941 }
5942
5943 if (! do_sections)
5944 return 1;
5945
3a1a2036
NC
5946 if (elf_header.e_shnum > 1)
5947 printf (_("\nSection Headers:\n"));
5948 else
5949 printf (_("\nSection Header:\n"));
76da6bbe 5950
f7a99963 5951 if (is_32bit_elf)
595cf52e 5952 {
5477e8a0 5953 if (do_section_details)
595cf52e
L
5954 {
5955 printf (_(" [Nr] Name\n"));
5477e8a0 5956 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
595cf52e
L
5957 }
5958 else
5959 printf
5960 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
5961 }
d974e256 5962 else if (do_wide)
595cf52e 5963 {
5477e8a0 5964 if (do_section_details)
595cf52e
L
5965 {
5966 printf (_(" [Nr] Name\n"));
5477e8a0 5967 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
595cf52e
L
5968 }
5969 else
5970 printf
5971 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
5972 }
f7a99963
NC
5973 else
5974 {
5477e8a0 5975 if (do_section_details)
595cf52e
L
5976 {
5977 printf (_(" [Nr] Name\n"));
5477e8a0
L
5978 printf (_(" Type Address Offset Link\n"));
5979 printf (_(" Size EntSize Info Align\n"));
595cf52e
L
5980 }
5981 else
5982 {
5983 printf (_(" [Nr] Name Type Address Offset\n"));
5984 printf (_(" Size EntSize Flags Link Info Align\n"));
5985 }
f7a99963 5986 }
252b5132 5987
5477e8a0
L
5988 if (do_section_details)
5989 printf (_(" Flags\n"));
5990
252b5132
RH
5991 for (i = 0, section = section_headers;
5992 i < elf_header.e_shnum;
b34976b6 5993 i++, section++)
252b5132 5994 {
dd905818
NC
5995 /* Run some sanity checks on the section header. */
5996
5997 /* Check the sh_link field. */
5998 switch (section->sh_type)
5999 {
6000 case SHT_SYMTAB_SHNDX:
6001 case SHT_GROUP:
6002 case SHT_HASH:
6003 case SHT_GNU_HASH:
6004 case SHT_GNU_versym:
6005 case SHT_REL:
6006 case SHT_RELA:
6007 if (section->sh_link < 1
cb64e50d 6008 || section->sh_link >= elf_header.e_shnum
dd905818
NC
6009 || (section_headers[section->sh_link].sh_type != SHT_SYMTAB
6010 && section_headers[section->sh_link].sh_type != SHT_DYNSYM))
6011 warn (_("[%2u]: Link field (%u) should index a symtab section.\n"),
6012 i, section->sh_link);
6013 break;
6014
6015 case SHT_DYNAMIC:
6016 case SHT_SYMTAB:
6017 case SHT_DYNSYM:
6018 case SHT_GNU_verneed:
6019 case SHT_GNU_verdef:
6020 case SHT_GNU_LIBLIST:
6021 if (section->sh_link < 1
cb64e50d 6022 || section->sh_link >= elf_header.e_shnum
dd905818
NC
6023 || section_headers[section->sh_link].sh_type != SHT_STRTAB)
6024 warn (_("[%2u]: Link field (%u) should index a string section.\n"),
6025 i, section->sh_link);
6026 break;
6027
6028 case SHT_INIT_ARRAY:
6029 case SHT_FINI_ARRAY:
6030 case SHT_PREINIT_ARRAY:
6031 if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6032 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6033 i, section->sh_link);
6034 break;
6035
6036 default:
6037 /* FIXME: Add support for target specific section types. */
6038#if 0 /* Currently we do not check other section types as there are too
6039 many special cases. Stab sections for example have a type
6040 of SHT_PROGBITS but an sh_link field that links to the .stabstr
6041 section. */
6042 if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6043 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6044 i, section->sh_link);
6045#endif
6046 break;
6047 }
6048
6049 /* Check the sh_info field. */
6050 switch (section->sh_type)
6051 {
6052 case SHT_REL:
6053 case SHT_RELA:
6054 if (section->sh_info < 1
cb64e50d 6055 || section->sh_info >= elf_header.e_shnum
dd905818
NC
6056 || (section_headers[section->sh_info].sh_type != SHT_PROGBITS
6057 && section_headers[section->sh_info].sh_type != SHT_NOBITS
6058 && section_headers[section->sh_info].sh_type != SHT_NOTE
6059 && section_headers[section->sh_info].sh_type != SHT_INIT_ARRAY
6060 /* FIXME: Are other section types valid ? */
6061 && section_headers[section->sh_info].sh_type < SHT_LOOS))
6062 {
6063 if (section->sh_info == 0
6064 && (streq (SECTION_NAME (section), ".rel.dyn")
6065 || streq (SECTION_NAME (section), ".rela.dyn")))
6066 /* The .rel.dyn and .rela.dyn sections have an sh_info field
6067 of zero. No idea why. I would have expected the index
6068 of the .plt section. */
6069 ;
6070 else
6071 warn (_("[%2u]: Info field (%u) should index a relocatable section.\n"),
6072 i, section->sh_info);
6073 }
6074 break;
6075
6076 case SHT_DYNAMIC:
6077 case SHT_HASH:
6078 case SHT_SYMTAB_SHNDX:
6079 case SHT_INIT_ARRAY:
6080 case SHT_FINI_ARRAY:
6081 case SHT_PREINIT_ARRAY:
6082 if (section->sh_info != 0)
6083 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6084 i, section->sh_info);
6085 break;
6086
6087 case SHT_GROUP:
6088 case SHT_SYMTAB:
6089 case SHT_DYNSYM:
6090 /* A symbol index - we assume that it is valid. */
6091 break;
6092
6093 default:
6094 /* FIXME: Add support for target specific section types. */
6095 if (section->sh_type == SHT_NOBITS)
6096 /* NOBITS section headers with non-zero sh_info fields can be
6097 created when a binary is stripped of everything but its debug
1a9ccd70
NC
6098 information. The stripped sections have their headers
6099 preserved but their types set to SHT_NOBITS. So do not check
6100 this type of section. */
dd905818
NC
6101 ;
6102 else if (section->sh_flags & SHF_INFO_LINK)
6103 {
cb64e50d 6104 if (section->sh_info < 1 || section->sh_info >= elf_header.e_shnum)
dd905818
NC
6105 warn (_("[%2u]: Expected link to another section in info field"), i);
6106 }
6107 else if (section->sh_type < SHT_LOOS && section->sh_info != 0)
6108 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6109 i, section->sh_info);
6110 break;
6111 }
6112
7bfd842d 6113 printf (" [%2u] ", i);
5477e8a0 6114 if (do_section_details)
74e1a04b 6115 printf ("%s\n ", printable_section_name (section));
595cf52e 6116 else
74e1a04b 6117 print_symbol (-17, SECTION_NAME (section));
0b4362b0 6118
ea52a088
NC
6119 printf (do_wide ? " %-15s " : " %-15.15s ",
6120 get_section_type_name (section->sh_type));
0b4362b0 6121
f7a99963
NC
6122 if (is_32bit_elf)
6123 {
cfcac11d
NC
6124 const char * link_too_big = NULL;
6125
f7a99963 6126 print_vma (section->sh_addr, LONG_HEX);
76da6bbe 6127
f7a99963
NC
6128 printf ( " %6.6lx %6.6lx %2.2lx",
6129 (unsigned long) section->sh_offset,
6130 (unsigned long) section->sh_size,
6131 (unsigned long) section->sh_entsize);
d1133906 6132
5477e8a0
L
6133 if (do_section_details)
6134 fputs (" ", stdout);
6135 else
6136 printf (" %3s ", get_elf_section_flags (section->sh_flags));
76da6bbe 6137
cfcac11d
NC
6138 if (section->sh_link >= elf_header.e_shnum)
6139 {
6140 link_too_big = "";
6141 /* The sh_link value is out of range. Normally this indicates
caa83f8b 6142 an error but it can have special values in Solaris binaries. */
cfcac11d
NC
6143 switch (elf_header.e_machine)
6144 {
caa83f8b 6145 case EM_386:
22abe556 6146 case EM_IAMCU:
caa83f8b 6147 case EM_X86_64:
7f502d6c 6148 case EM_L1OM:
7a9068fe 6149 case EM_K1OM:
cfcac11d
NC
6150 case EM_OLD_SPARCV9:
6151 case EM_SPARC32PLUS:
6152 case EM_SPARCV9:
6153 case EM_SPARC:
6154 if (section->sh_link == (SHN_BEFORE & 0xffff))
6155 link_too_big = "BEFORE";
6156 else if (section->sh_link == (SHN_AFTER & 0xffff))
6157 link_too_big = "AFTER";
6158 break;
6159 default:
6160 break;
6161 }
6162 }
6163
6164 if (do_section_details)
6165 {
6166 if (link_too_big != NULL && * link_too_big)
6167 printf ("<%s> ", link_too_big);
6168 else
6169 printf ("%2u ", section->sh_link);
6170 printf ("%3u %2lu\n", section->sh_info,
6171 (unsigned long) section->sh_addralign);
6172 }
6173 else
6174 printf ("%2u %3u %2lu\n",
6175 section->sh_link,
6176 section->sh_info,
6177 (unsigned long) section->sh_addralign);
6178
6179 if (link_too_big && ! * link_too_big)
6180 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
6181 i, section->sh_link);
f7a99963 6182 }
d974e256
JJ
6183 else if (do_wide)
6184 {
6185 print_vma (section->sh_addr, LONG_HEX);
6186
6187 if ((long) section->sh_offset == section->sh_offset)
6188 printf (" %6.6lx", (unsigned long) section->sh_offset);
6189 else
6190 {
6191 putchar (' ');
6192 print_vma (section->sh_offset, LONG_HEX);
6193 }
6194
6195 if ((unsigned long) section->sh_size == section->sh_size)
6196 printf (" %6.6lx", (unsigned long) section->sh_size);
6197 else
6198 {
6199 putchar (' ');
6200 print_vma (section->sh_size, LONG_HEX);
6201 }
6202
6203 if ((unsigned long) section->sh_entsize == section->sh_entsize)
6204 printf (" %2.2lx", (unsigned long) section->sh_entsize);
6205 else
6206 {
6207 putchar (' ');
6208 print_vma (section->sh_entsize, LONG_HEX);
6209 }
6210
5477e8a0
L
6211 if (do_section_details)
6212 fputs (" ", stdout);
6213 else
6214 printf (" %3s ", get_elf_section_flags (section->sh_flags));
d974e256 6215
72de5009 6216 printf ("%2u %3u ", section->sh_link, section->sh_info);
d974e256
JJ
6217
6218 if ((unsigned long) section->sh_addralign == section->sh_addralign)
72de5009 6219 printf ("%2lu\n", (unsigned long) section->sh_addralign);
d974e256
JJ
6220 else
6221 {
6222 print_vma (section->sh_addralign, DEC);
6223 putchar ('\n');
6224 }
6225 }
5477e8a0 6226 else if (do_section_details)
595cf52e 6227 {
5477e8a0 6228 printf (" %-15.15s ",
595cf52e 6229 get_section_type_name (section->sh_type));
595cf52e
L
6230 print_vma (section->sh_addr, LONG_HEX);
6231 if ((long) section->sh_offset == section->sh_offset)
5477e8a0 6232 printf (" %16.16lx", (unsigned long) section->sh_offset);
595cf52e
L
6233 else
6234 {
6235 printf (" ");
6236 print_vma (section->sh_offset, LONG_HEX);
6237 }
72de5009 6238 printf (" %u\n ", section->sh_link);
595cf52e 6239 print_vma (section->sh_size, LONG_HEX);
5477e8a0 6240 putchar (' ');
595cf52e
L
6241 print_vma (section->sh_entsize, LONG_HEX);
6242
72de5009
AM
6243 printf (" %-16u %lu\n",
6244 section->sh_info,
595cf52e
L
6245 (unsigned long) section->sh_addralign);
6246 }
f7a99963
NC
6247 else
6248 {
6249 putchar (' ');
6250 print_vma (section->sh_addr, LONG_HEX);
53c7db4b
KH
6251 if ((long) section->sh_offset == section->sh_offset)
6252 printf (" %8.8lx", (unsigned long) section->sh_offset);
6253 else
6254 {
6255 printf (" ");
6256 print_vma (section->sh_offset, LONG_HEX);
6257 }
f7a99963
NC
6258 printf ("\n ");
6259 print_vma (section->sh_size, LONG_HEX);
6260 printf (" ");
6261 print_vma (section->sh_entsize, LONG_HEX);
76da6bbe 6262
d1133906 6263 printf (" %3s ", get_elf_section_flags (section->sh_flags));
76da6bbe 6264
72de5009
AM
6265 printf (" %2u %3u %lu\n",
6266 section->sh_link,
6267 section->sh_info,
f7a99963
NC
6268 (unsigned long) section->sh_addralign);
6269 }
5477e8a0
L
6270
6271 if (do_section_details)
77115a4a
L
6272 {
6273 printf (" %s\n", get_elf_section_flags (section->sh_flags));
6274 if ((section->sh_flags & SHF_COMPRESSED) != 0)
6275 {
6276 /* Minimum section size is 12 bytes for 32-bit compression
6277 header + 12 bytes for compressed data header. */
6278 unsigned char buf[24];
d8024a91 6279
77115a4a
L
6280 assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
6281 if (get_data (&buf, (FILE *) file, section->sh_offset, 1,
6282 sizeof (buf), _("compression header")))
6283 {
6284 Elf_Internal_Chdr chdr;
d8024a91
NC
6285
6286 (void) get_compression_header (&chdr, buf);
6287
77115a4a
L
6288 if (chdr.ch_type == ELFCOMPRESS_ZLIB)
6289 printf (" ZLIB, ");
6290 else
6291 printf (_(" [<unknown>: 0x%x], "),
6292 chdr.ch_type);
6293 print_vma (chdr.ch_size, LONG_HEX);
6294 printf (", %lu\n", (unsigned long) chdr.ch_addralign);
6295 }
6296 }
6297 }
252b5132
RH
6298 }
6299
5477e8a0 6300 if (!do_section_details)
3dbcc61d 6301 {
9fb71ee4
NC
6302 /* The ordering of the letters shown here matches the ordering of the
6303 corresponding SHF_xxx values, and hence the order in which these
6304 letters will be displayed to the user. */
6305 printf (_("Key to Flags:\n\
6306 W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6307 L (link order), O (extra OS processing required), G (group), T (TLS),\n\
fd85a6a1 6308 C (compressed), x (unknown), o (OS specific), E (exclude),\n "));
3dbcc61d 6309 if (elf_header.e_machine == EM_X86_64
7a9068fe
L
6310 || elf_header.e_machine == EM_L1OM
6311 || elf_header.e_machine == EM_K1OM)
9fb71ee4 6312 printf (_("l (large), "));
91f68a68 6313 else if (elf_header.e_machine == EM_ARM)
f0728ee3 6314 printf (_("y (purecode), "));
9fb71ee4 6315 printf ("p (processor specific)\n");
0b4362b0 6316 }
d1133906 6317
252b5132
RH
6318 return 1;
6319}
6320
f5842774
L
6321static const char *
6322get_group_flags (unsigned int flags)
6323{
1449284b 6324 static char buff[128];
220453ec 6325
6d913794
NC
6326 if (flags == 0)
6327 return "";
6328 else if (flags == GRP_COMDAT)
6329 return "COMDAT ";
f5842774 6330
6d913794
NC
6331 snprintf (buff, 14, _("[0x%x: "), flags);
6332
6333 flags &= ~ GRP_COMDAT;
6334 if (flags & GRP_MASKOS)
6335 {
6336 strcat (buff, "<OS specific>");
6337 flags &= ~ GRP_MASKOS;
f5842774 6338 }
6d913794
NC
6339
6340 if (flags & GRP_MASKPROC)
6341 {
6342 strcat (buff, "<PROC specific>");
6343 flags &= ~ GRP_MASKPROC;
6344 }
6345
6346 if (flags)
6347 strcat (buff, "<unknown>");
6348
6349 strcat (buff, "]");
f5842774
L
6350 return buff;
6351}
6352
6353static int
2cf0635d 6354process_section_groups (FILE * file)
f5842774 6355{
2cf0635d 6356 Elf_Internal_Shdr * section;
f5842774 6357 unsigned int i;
2cf0635d
NC
6358 struct group * group;
6359 Elf_Internal_Shdr * symtab_sec;
6360 Elf_Internal_Shdr * strtab_sec;
6361 Elf_Internal_Sym * symtab;
ba5cdace 6362 unsigned long num_syms;
2cf0635d 6363 char * strtab;
c256ffe7 6364 size_t strtab_size;
d1f5c6e3
L
6365
6366 /* Don't process section groups unless needed. */
6367 if (!do_unwind && !do_section_groups)
6368 return 1;
f5842774
L
6369
6370 if (elf_header.e_shnum == 0)
6371 {
6372 if (do_section_groups)
82f2dbf7 6373 printf (_("\nThere are no sections to group in this file.\n"));
f5842774
L
6374
6375 return 1;
6376 }
6377
6378 if (section_headers == NULL)
6379 {
6380 error (_("Section headers are not available!\n"));
fa1908fd
NC
6381 /* PR 13622: This can happen with a corrupt ELF header. */
6382 return 0;
f5842774
L
6383 }
6384
3f5e193b
NC
6385 section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
6386 sizeof (struct group *));
e4b17d5c
L
6387
6388 if (section_headers_groups == NULL)
6389 {
8b73c356
NC
6390 error (_("Out of memory reading %u section group headers\n"),
6391 elf_header.e_shnum);
e4b17d5c
L
6392 return 0;
6393 }
6394
f5842774 6395 /* Scan the sections for the group section. */
d1f5c6e3 6396 group_count = 0;
f5842774
L
6397 for (i = 0, section = section_headers;
6398 i < elf_header.e_shnum;
6399 i++, section++)
e4b17d5c
L
6400 if (section->sh_type == SHT_GROUP)
6401 group_count++;
6402
d1f5c6e3
L
6403 if (group_count == 0)
6404 {
6405 if (do_section_groups)
6406 printf (_("\nThere are no section groups in this file.\n"));
6407
6408 return 1;
6409 }
6410
3f5e193b 6411 section_groups = (struct group *) calloc (group_count, sizeof (struct group));
e4b17d5c
L
6412
6413 if (section_groups == NULL)
6414 {
8b73c356
NC
6415 error (_("Out of memory reading %lu groups\n"),
6416 (unsigned long) group_count);
e4b17d5c
L
6417 return 0;
6418 }
6419
d1f5c6e3
L
6420 symtab_sec = NULL;
6421 strtab_sec = NULL;
6422 symtab = NULL;
ba5cdace 6423 num_syms = 0;
d1f5c6e3 6424 strtab = NULL;
c256ffe7 6425 strtab_size = 0;
e4b17d5c
L
6426 for (i = 0, section = section_headers, group = section_groups;
6427 i < elf_header.e_shnum;
6428 i++, section++)
f5842774
L
6429 {
6430 if (section->sh_type == SHT_GROUP)
6431 {
74e1a04b
NC
6432 const char * name = printable_section_name (section);
6433 const char * group_name;
2cf0635d
NC
6434 unsigned char * start;
6435 unsigned char * indices;
f5842774 6436 unsigned int entry, j, size;
2cf0635d
NC
6437 Elf_Internal_Shdr * sec;
6438 Elf_Internal_Sym * sym;
f5842774
L
6439
6440 /* Get the symbol table. */
4fbb74a6
AM
6441 if (section->sh_link >= elf_header.e_shnum
6442 || ((sec = section_headers + section->sh_link)->sh_type
c256ffe7 6443 != SHT_SYMTAB))
f5842774
L
6444 {
6445 error (_("Bad sh_link in group section `%s'\n"), name);
6446 continue;
6447 }
d1f5c6e3
L
6448
6449 if (symtab_sec != sec)
6450 {
6451 symtab_sec = sec;
6452 if (symtab)
6453 free (symtab);
ba5cdace 6454 symtab = GET_ELF_SYMBOLS (file, symtab_sec, & num_syms);
d1f5c6e3 6455 }
f5842774 6456
dd24e3da
NC
6457 if (symtab == NULL)
6458 {
6459 error (_("Corrupt header in group section `%s'\n"), name);
6460 continue;
6461 }
6462
ba5cdace
NC
6463 if (section->sh_info >= num_syms)
6464 {
6465 error (_("Bad sh_info in group section `%s'\n"), name);
6466 continue;
6467 }
6468
f5842774
L
6469 sym = symtab + section->sh_info;
6470
6471 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6472 {
4fbb74a6
AM
6473 if (sym->st_shndx == 0
6474 || sym->st_shndx >= elf_header.e_shnum)
f5842774
L
6475 {
6476 error (_("Bad sh_info in group section `%s'\n"), name);
6477 continue;
6478 }
ba2685cc 6479
4fbb74a6 6480 group_name = SECTION_NAME (section_headers + sym->st_shndx);
c256ffe7
JJ
6481 strtab_sec = NULL;
6482 if (strtab)
6483 free (strtab);
f5842774 6484 strtab = NULL;
c256ffe7 6485 strtab_size = 0;
f5842774
L
6486 }
6487 else
6488 {
6489 /* Get the string table. */
4fbb74a6 6490 if (symtab_sec->sh_link >= elf_header.e_shnum)
c256ffe7
JJ
6491 {
6492 strtab_sec = NULL;
6493 if (strtab)
6494 free (strtab);
6495 strtab = NULL;
6496 strtab_size = 0;
6497 }
6498 else if (strtab_sec
4fbb74a6 6499 != (sec = section_headers + symtab_sec->sh_link))
d1f5c6e3
L
6500 {
6501 strtab_sec = sec;
6502 if (strtab)
6503 free (strtab);
071436c6 6504
3f5e193b 6505 strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
071436c6
NC
6506 1, strtab_sec->sh_size,
6507 _("string table"));
c256ffe7 6508 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
d1f5c6e3 6509 }
c256ffe7 6510 group_name = sym->st_name < strtab_size
2b692964 6511 ? strtab + sym->st_name : _("<corrupt>");
f5842774
L
6512 }
6513
c9c1d674
EG
6514 /* PR 17531: file: loop. */
6515 if (section->sh_entsize > section->sh_size)
6516 {
6517 error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6518 printable_section_name (section),
8066deb1
AM
6519 (unsigned long) section->sh_entsize,
6520 (unsigned long) section->sh_size);
c9c1d674
EG
6521 break;
6522 }
6523
3f5e193b
NC
6524 start = (unsigned char *) get_data (NULL, file, section->sh_offset,
6525 1, section->sh_size,
6526 _("section data"));
59245841
NC
6527 if (start == NULL)
6528 continue;
f5842774
L
6529
6530 indices = start;
6531 size = (section->sh_size / section->sh_entsize) - 1;
6532 entry = byte_get (indices, 4);
6533 indices += 4;
e4b17d5c
L
6534
6535 if (do_section_groups)
6536 {
2b692964 6537 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
391cb864 6538 get_group_flags (entry), i, name, group_name, size);
ba2685cc 6539
e4b17d5c
L
6540 printf (_(" [Index] Name\n"));
6541 }
6542
6543 group->group_index = i;
6544
f5842774
L
6545 for (j = 0; j < size; j++)
6546 {
2cf0635d 6547 struct group_list * g;
e4b17d5c 6548
f5842774
L
6549 entry = byte_get (indices, 4);
6550 indices += 4;
6551
4fbb74a6 6552 if (entry >= elf_header.e_shnum)
391cb864 6553 {
57028622
NC
6554 static unsigned num_group_errors = 0;
6555
6556 if (num_group_errors ++ < 10)
6557 {
6558 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6559 entry, i, elf_header.e_shnum - 1);
6560 if (num_group_errors == 10)
6561 warn (_("Futher error messages about overlarge group section indicies suppressed\n"));
6562 }
391cb864
L
6563 continue;
6564 }
391cb864 6565
4fbb74a6 6566 if (section_headers_groups [entry] != NULL)
e4b17d5c 6567 {
d1f5c6e3
L
6568 if (entry)
6569 {
57028622
NC
6570 static unsigned num_errs = 0;
6571
6572 if (num_errs ++ < 10)
6573 {
6574 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6575 entry, i,
6576 section_headers_groups [entry]->group_index);
6577 if (num_errs == 10)
6578 warn (_("Further error messages about already contained group sections suppressed\n"));
6579 }
d1f5c6e3
L
6580 continue;
6581 }
6582 else
6583 {
6584 /* Intel C/C++ compiler may put section 0 in a
6585 section group. We just warn it the first time
6586 and ignore it afterwards. */
6587 static int warned = 0;
6588 if (!warned)
6589 {
6590 error (_("section 0 in group section [%5u]\n"),
4fbb74a6 6591 section_headers_groups [entry]->group_index);
d1f5c6e3
L
6592 warned++;
6593 }
6594 }
e4b17d5c
L
6595 }
6596
4fbb74a6 6597 section_headers_groups [entry] = group;
e4b17d5c
L
6598
6599 if (do_section_groups)
6600 {
4fbb74a6 6601 sec = section_headers + entry;
74e1a04b 6602 printf (" [%5u] %s\n", entry, printable_section_name (sec));
ba2685cc
AM
6603 }
6604
3f5e193b 6605 g = (struct group_list *) xmalloc (sizeof (struct group_list));
e4b17d5c
L
6606 g->section_index = entry;
6607 g->next = group->root;
6608 group->root = g;
f5842774
L
6609 }
6610
f5842774
L
6611 if (start)
6612 free (start);
e4b17d5c
L
6613
6614 group++;
f5842774
L
6615 }
6616 }
6617
d1f5c6e3
L
6618 if (symtab)
6619 free (symtab);
6620 if (strtab)
6621 free (strtab);
f5842774
L
6622 return 1;
6623}
6624
28f997cf
TG
6625/* Data used to display dynamic fixups. */
6626
6627struct ia64_vms_dynfixup
6628{
6629 bfd_vma needed_ident; /* Library ident number. */
6630 bfd_vma needed; /* Index in the dstrtab of the library name. */
6631 bfd_vma fixup_needed; /* Index of the library. */
6632 bfd_vma fixup_rela_cnt; /* Number of fixups. */
6633 bfd_vma fixup_rela_off; /* Fixups offset in the dynamic segment. */
6634};
6635
6636/* Data used to display dynamic relocations. */
6637
6638struct ia64_vms_dynimgrela
6639{
6640 bfd_vma img_rela_cnt; /* Number of relocations. */
6641 bfd_vma img_rela_off; /* Reloc offset in the dynamic segment. */
6642};
6643
6644/* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6645 library). */
6646
6647static void
6648dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
6649 const char *strtab, unsigned int strtab_sz)
6650{
6651 Elf64_External_VMS_IMAGE_FIXUP *imfs;
6652 long i;
6653 const char *lib_name;
6654
6655 imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
6656 1, fixup->fixup_rela_cnt * sizeof (*imfs),
6657 _("dynamic section image fixups"));
6658 if (!imfs)
6659 return;
6660
6661 if (fixup->needed < strtab_sz)
6662 lib_name = strtab + fixup->needed;
6663 else
6664 {
6665 warn ("corrupt library name index of 0x%lx found in dynamic entry",
7f01b0c6 6666 (unsigned long) fixup->needed);
28f997cf
TG
6667 lib_name = "???";
6668 }
6669 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
6670 (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
6671 printf
6672 (_("Seg Offset Type SymVec DataType\n"));
6673
6674 for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
6675 {
6676 unsigned int type;
6677 const char *rtype;
6678
6679 printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
6680 printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
6681 type = BYTE_GET (imfs [i].type);
6682 rtype = elf_ia64_reloc_type (type);
6683 if (rtype == NULL)
6684 printf (" 0x%08x ", type);
6685 else
6686 printf (" %-32s ", rtype);
6687 printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
6688 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
6689 }
6690
6691 free (imfs);
6692}
6693
6694/* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
6695
6696static void
6697dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
6698{
6699 Elf64_External_VMS_IMAGE_RELA *imrs;
6700 long i;
6701
6702 imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
6703 1, imgrela->img_rela_cnt * sizeof (*imrs),
9cf03b7e 6704 _("dynamic section image relocations"));
28f997cf
TG
6705 if (!imrs)
6706 return;
6707
6708 printf (_("\nImage relocs\n"));
6709 printf
6710 (_("Seg Offset Type Addend Seg Sym Off\n"));
6711
6712 for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
6713 {
6714 unsigned int type;
6715 const char *rtype;
6716
6717 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
6718 printf ("%08" BFD_VMA_FMT "x ",
6719 (bfd_vma) BYTE_GET (imrs [i].rela_offset));
6720 type = BYTE_GET (imrs [i].type);
6721 rtype = elf_ia64_reloc_type (type);
6722 if (rtype == NULL)
6723 printf ("0x%08x ", type);
6724 else
6725 printf ("%-31s ", rtype);
6726 print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
6727 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
6728 printf ("%08" BFD_VMA_FMT "x\n",
6729 (bfd_vma) BYTE_GET (imrs [i].sym_offset));
6730 }
6731
6732 free (imrs);
6733}
6734
6735/* Display IA-64 OpenVMS dynamic relocations and fixups. */
6736
6737static int
6738process_ia64_vms_dynamic_relocs (FILE *file)
6739{
6740 struct ia64_vms_dynfixup fixup;
6741 struct ia64_vms_dynimgrela imgrela;
6742 Elf_Internal_Dyn *entry;
6743 int res = 0;
6744 bfd_vma strtab_off = 0;
6745 bfd_vma strtab_sz = 0;
6746 char *strtab = NULL;
6747
6748 memset (&fixup, 0, sizeof (fixup));
6749 memset (&imgrela, 0, sizeof (imgrela));
6750
6751 /* Note: the order of the entries is specified by the OpenVMS specs. */
6752 for (entry = dynamic_section;
6753 entry < dynamic_section + dynamic_nent;
6754 entry++)
6755 {
6756 switch (entry->d_tag)
6757 {
6758 case DT_IA_64_VMS_STRTAB_OFFSET:
6759 strtab_off = entry->d_un.d_val;
6760 break;
6761 case DT_STRSZ:
6762 strtab_sz = entry->d_un.d_val;
6763 if (strtab == NULL)
6764 strtab = get_data (NULL, file, dynamic_addr + strtab_off,
6765 1, strtab_sz, _("dynamic string section"));
6766 break;
6767
6768 case DT_IA_64_VMS_NEEDED_IDENT:
6769 fixup.needed_ident = entry->d_un.d_val;
6770 break;
6771 case DT_NEEDED:
6772 fixup.needed = entry->d_un.d_val;
6773 break;
6774 case DT_IA_64_VMS_FIXUP_NEEDED:
6775 fixup.fixup_needed = entry->d_un.d_val;
6776 break;
6777 case DT_IA_64_VMS_FIXUP_RELA_CNT:
6778 fixup.fixup_rela_cnt = entry->d_un.d_val;
6779 break;
6780 case DT_IA_64_VMS_FIXUP_RELA_OFF:
6781 fixup.fixup_rela_off = entry->d_un.d_val;
6782 res++;
6783 dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
6784 break;
6785
6786 case DT_IA_64_VMS_IMG_RELA_CNT:
6787 imgrela.img_rela_cnt = entry->d_un.d_val;
6788 break;
6789 case DT_IA_64_VMS_IMG_RELA_OFF:
6790 imgrela.img_rela_off = entry->d_un.d_val;
6791 res++;
6792 dump_ia64_vms_dynamic_relocs (file, &imgrela);
6793 break;
6794
6795 default:
6796 break;
6797 }
6798 }
6799
6800 if (strtab != NULL)
6801 free (strtab);
6802
6803 return res;
6804}
6805
85b1c36d 6806static struct
566b0d53 6807{
2cf0635d 6808 const char * name;
566b0d53
L
6809 int reloc;
6810 int size;
6811 int rela;
6812} dynamic_relocations [] =
6813{
6814 { "REL", DT_REL, DT_RELSZ, FALSE },
6815 { "RELA", DT_RELA, DT_RELASZ, TRUE },
6816 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
6817};
6818
252b5132 6819/* Process the reloc section. */
18bd398b 6820
252b5132 6821static int
2cf0635d 6822process_relocs (FILE * file)
252b5132 6823{
b34976b6
AM
6824 unsigned long rel_size;
6825 unsigned long rel_offset;
252b5132
RH
6826
6827
6828 if (!do_reloc)
6829 return 1;
6830
6831 if (do_using_dynamic)
6832 {
566b0d53 6833 int is_rela;
2cf0635d 6834 const char * name;
566b0d53
L
6835 int has_dynamic_reloc;
6836 unsigned int i;
0de14b54 6837
566b0d53 6838 has_dynamic_reloc = 0;
252b5132 6839
566b0d53 6840 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
252b5132 6841 {
566b0d53
L
6842 is_rela = dynamic_relocations [i].rela;
6843 name = dynamic_relocations [i].name;
6844 rel_size = dynamic_info [dynamic_relocations [i].size];
6845 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
103f02d3 6846
566b0d53
L
6847 has_dynamic_reloc |= rel_size;
6848
6849 if (is_rela == UNKNOWN)
aa903cfb 6850 {
566b0d53
L
6851 if (dynamic_relocations [i].reloc == DT_JMPREL)
6852 switch (dynamic_info[DT_PLTREL])
6853 {
6854 case DT_REL:
6855 is_rela = FALSE;
6856 break;
6857 case DT_RELA:
6858 is_rela = TRUE;
6859 break;
6860 }
aa903cfb 6861 }
252b5132 6862
566b0d53
L
6863 if (rel_size)
6864 {
6865 printf
6866 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
6867 name, rel_offset, rel_size);
252b5132 6868
d93f0186
NC
6869 dump_relocations (file,
6870 offset_from_vma (file, rel_offset, rel_size),
6871 rel_size,
566b0d53 6872 dynamic_symbols, num_dynamic_syms,
bb4d2ac2
L
6873 dynamic_strings, dynamic_strings_length,
6874 is_rela, 1);
566b0d53 6875 }
252b5132 6876 }
566b0d53 6877
28f997cf
TG
6878 if (is_ia64_vms ())
6879 has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
6880
566b0d53 6881 if (! has_dynamic_reloc)
252b5132
RH
6882 printf (_("\nThere are no dynamic relocations in this file.\n"));
6883 }
6884 else
6885 {
2cf0635d 6886 Elf_Internal_Shdr * section;
b34976b6
AM
6887 unsigned long i;
6888 int found = 0;
252b5132
RH
6889
6890 for (i = 0, section = section_headers;
6891 i < elf_header.e_shnum;
b34976b6 6892 i++, section++)
252b5132
RH
6893 {
6894 if ( section->sh_type != SHT_RELA
6895 && section->sh_type != SHT_REL)
6896 continue;
6897
6898 rel_offset = section->sh_offset;
6899 rel_size = section->sh_size;
6900
6901 if (rel_size)
6902 {
2cf0635d 6903 Elf_Internal_Shdr * strsec;
b34976b6 6904 int is_rela;
103f02d3 6905
252b5132
RH
6906 printf (_("\nRelocation section "));
6907
6908 if (string_table == NULL)
19936277 6909 printf ("%d", section->sh_name);
252b5132 6910 else
74e1a04b 6911 printf ("'%s'", printable_section_name (section));
252b5132
RH
6912
6913 printf (_(" at offset 0x%lx contains %lu entries:\n"),
6914 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
6915
d79b3d50
NC
6916 is_rela = section->sh_type == SHT_RELA;
6917
4fbb74a6
AM
6918 if (section->sh_link != 0
6919 && section->sh_link < elf_header.e_shnum)
af3fc3bc 6920 {
2cf0635d
NC
6921 Elf_Internal_Shdr * symsec;
6922 Elf_Internal_Sym * symtab;
d79b3d50 6923 unsigned long nsyms;
c256ffe7 6924 unsigned long strtablen = 0;
2cf0635d 6925 char * strtab = NULL;
57346661 6926
4fbb74a6 6927 symsec = section_headers + section->sh_link;
08d8fa11
JJ
6928 if (symsec->sh_type != SHT_SYMTAB
6929 && symsec->sh_type != SHT_DYNSYM)
6930 continue;
6931
ba5cdace 6932 symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms);
252b5132 6933
af3fc3bc
AM
6934 if (symtab == NULL)
6935 continue;
252b5132 6936
4fbb74a6
AM
6937 if (symsec->sh_link != 0
6938 && symsec->sh_link < elf_header.e_shnum)
c256ffe7 6939 {
4fbb74a6 6940 strsec = section_headers + symsec->sh_link;
103f02d3 6941
3f5e193b 6942 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
071436c6
NC
6943 1, strsec->sh_size,
6944 _("string table"));
c256ffe7
JJ
6945 strtablen = strtab == NULL ? 0 : strsec->sh_size;
6946 }
252b5132 6947
d79b3d50 6948 dump_relocations (file, rel_offset, rel_size,
bb4d2ac2
L
6949 symtab, nsyms, strtab, strtablen,
6950 is_rela,
6951 symsec->sh_type == SHT_DYNSYM);
d79b3d50
NC
6952 if (strtab)
6953 free (strtab);
6954 free (symtab);
6955 }
6956 else
6957 dump_relocations (file, rel_offset, rel_size,
bb4d2ac2 6958 NULL, 0, NULL, 0, is_rela, 0);
252b5132
RH
6959
6960 found = 1;
6961 }
6962 }
6963
6964 if (! found)
6965 printf (_("\nThere are no relocations in this file.\n"));
6966 }
6967
6968 return 1;
6969}
6970
4d6ed7c8
NC
6971/* An absolute address consists of a section and an offset. If the
6972 section is NULL, the offset itself is the address, otherwise, the
6973 address equals to LOAD_ADDRESS(section) + offset. */
6974
6975struct absaddr
948f632f
DA
6976{
6977 unsigned short section;
6978 bfd_vma offset;
6979};
4d6ed7c8 6980
1949de15
L
6981#define ABSADDR(a) \
6982 ((a).section \
6983 ? section_headers [(a).section].sh_addr + (a).offset \
6984 : (a).offset)
6985
948f632f
DA
6986/* Find the nearest symbol at or below ADDR. Returns the symbol
6987 name, if found, and the offset from the symbol to ADDR. */
4d6ed7c8 6988
4d6ed7c8 6989static void
2cf0635d 6990find_symbol_for_address (Elf_Internal_Sym * symtab,
948f632f
DA
6991 unsigned long nsyms,
6992 const char * strtab,
6993 unsigned long strtab_size,
6994 struct absaddr addr,
6995 const char ** symname,
6996 bfd_vma * offset)
4d6ed7c8 6997{
d3ba0551 6998 bfd_vma dist = 0x100000;
2cf0635d 6999 Elf_Internal_Sym * sym;
948f632f
DA
7000 Elf_Internal_Sym * beg;
7001 Elf_Internal_Sym * end;
2cf0635d 7002 Elf_Internal_Sym * best = NULL;
4d6ed7c8 7003
0b6ae522 7004 REMOVE_ARCH_BITS (addr.offset);
948f632f
DA
7005 beg = symtab;
7006 end = symtab + nsyms;
0b6ae522 7007
948f632f 7008 while (beg < end)
4d6ed7c8 7009 {
948f632f
DA
7010 bfd_vma value;
7011
7012 sym = beg + (end - beg) / 2;
0b6ae522 7013
948f632f 7014 value = sym->st_value;
0b6ae522
DJ
7015 REMOVE_ARCH_BITS (value);
7016
948f632f 7017 if (sym->st_name != 0
4d6ed7c8 7018 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
0b6ae522
DJ
7019 && addr.offset >= value
7020 && addr.offset - value < dist)
4d6ed7c8
NC
7021 {
7022 best = sym;
0b6ae522 7023 dist = addr.offset - value;
4d6ed7c8
NC
7024 if (!dist)
7025 break;
7026 }
948f632f
DA
7027
7028 if (addr.offset < value)
7029 end = sym;
7030 else
7031 beg = sym + 1;
4d6ed7c8 7032 }
1b31d05e 7033
4d6ed7c8
NC
7034 if (best)
7035 {
57346661 7036 *symname = (best->st_name >= strtab_size
2b692964 7037 ? _("<corrupt>") : strtab + best->st_name);
4d6ed7c8
NC
7038 *offset = dist;
7039 return;
7040 }
1b31d05e 7041
4d6ed7c8
NC
7042 *symname = NULL;
7043 *offset = addr.offset;
7044}
7045
948f632f
DA
7046static int
7047symcmp (const void *p, const void *q)
7048{
7049 Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
7050 Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
7051
7052 return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
7053}
7054
7055/* Process the unwind section. */
7056
7057#include "unwind-ia64.h"
7058
7059struct ia64_unw_table_entry
7060{
7061 struct absaddr start;
7062 struct absaddr end;
7063 struct absaddr info;
7064};
7065
7066struct ia64_unw_aux_info
7067{
7068 struct ia64_unw_table_entry *table; /* Unwind table. */
7069 unsigned long table_len; /* Length of unwind table. */
7070 unsigned char * info; /* Unwind info. */
7071 unsigned long info_size; /* Size of unwind info. */
7072 bfd_vma info_addr; /* Starting address of unwind info. */
7073 bfd_vma seg_base; /* Starting address of segment. */
7074 Elf_Internal_Sym * symtab; /* The symbol table. */
7075 unsigned long nsyms; /* Number of symbols. */
7076 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7077 unsigned long nfuns; /* Number of entries in funtab. */
7078 char * strtab; /* The string table. */
7079 unsigned long strtab_size; /* Size of string table. */
7080};
7081
4d6ed7c8 7082static void
2cf0635d 7083dump_ia64_unwind (struct ia64_unw_aux_info * aux)
4d6ed7c8 7084{
2cf0635d 7085 struct ia64_unw_table_entry * tp;
948f632f 7086 unsigned long j, nfuns;
4d6ed7c8 7087 int in_body;
7036c0e1 7088
948f632f
DA
7089 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7090 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7091 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7092 aux->funtab[nfuns++] = aux->symtab[j];
7093 aux->nfuns = nfuns;
7094 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7095
4d6ed7c8
NC
7096 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7097 {
7098 bfd_vma stamp;
7099 bfd_vma offset;
2cf0635d
NC
7100 const unsigned char * dp;
7101 const unsigned char * head;
53774b7e 7102 const unsigned char * end;
2cf0635d 7103 const char * procname;
4d6ed7c8 7104
948f632f 7105 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
57346661 7106 aux->strtab_size, tp->start, &procname, &offset);
4d6ed7c8
NC
7107
7108 fputs ("\n<", stdout);
7109
7110 if (procname)
7111 {
7112 fputs (procname, stdout);
7113
7114 if (offset)
7115 printf ("+%lx", (unsigned long) offset);
7116 }
7117
7118 fputs (">: [", stdout);
7119 print_vma (tp->start.offset, PREFIX_HEX);
7120 fputc ('-', stdout);
7121 print_vma (tp->end.offset, PREFIX_HEX);
86f55779 7122 printf ("], info at +0x%lx\n",
4d6ed7c8
NC
7123 (unsigned long) (tp->info.offset - aux->seg_base));
7124
53774b7e
NC
7125 /* PR 17531: file: 86232b32. */
7126 if (aux->info == NULL)
7127 continue;
7128
7129 /* PR 17531: file: 0997b4d1. */
7130 if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
7131 {
7132 warn (_("Invalid offset %lx in table entry %ld\n"),
7133 (long) tp->info.offset, (long) (tp - aux->table));
7134 continue;
7135 }
7136
1949de15 7137 head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
a4a00738 7138 stamp = byte_get ((unsigned char *) head, sizeof (stamp));
4d6ed7c8 7139
86f55779 7140 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4d6ed7c8
NC
7141 (unsigned) UNW_VER (stamp),
7142 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
7143 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
7144 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
89fac5e3 7145 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
4d6ed7c8
NC
7146
7147 if (UNW_VER (stamp) != 1)
7148 {
2b692964 7149 printf (_("\tUnknown version.\n"));
4d6ed7c8
NC
7150 continue;
7151 }
7152
7153 in_body = 0;
53774b7e
NC
7154 end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
7155 /* PR 17531: file: 16ceda89. */
7156 if (end > aux->info + aux->info_size)
7157 end = aux->info + aux->info_size;
7158 for (dp = head + 8; dp < end;)
b4477bc8 7159 dp = unw_decode (dp, in_body, & in_body, end);
4d6ed7c8 7160 }
948f632f
DA
7161
7162 free (aux->funtab);
4d6ed7c8
NC
7163}
7164
53774b7e 7165static bfd_boolean
2cf0635d
NC
7166slurp_ia64_unwind_table (FILE * file,
7167 struct ia64_unw_aux_info * aux,
7168 Elf_Internal_Shdr * sec)
4d6ed7c8 7169{
89fac5e3 7170 unsigned long size, nrelas, i;
2cf0635d
NC
7171 Elf_Internal_Phdr * seg;
7172 struct ia64_unw_table_entry * tep;
7173 Elf_Internal_Shdr * relsec;
7174 Elf_Internal_Rela * rela;
7175 Elf_Internal_Rela * rp;
7176 unsigned char * table;
7177 unsigned char * tp;
7178 Elf_Internal_Sym * sym;
7179 const char * relname;
4d6ed7c8 7180
53774b7e
NC
7181 aux->table_len = 0;
7182
4d6ed7c8
NC
7183 /* First, find the starting address of the segment that includes
7184 this section: */
7185
7186 if (elf_header.e_phnum)
7187 {
d93f0186 7188 if (! get_program_headers (file))
53774b7e 7189 return FALSE;
4d6ed7c8 7190
d93f0186
NC
7191 for (seg = program_headers;
7192 seg < program_headers + elf_header.e_phnum;
7193 ++seg)
4d6ed7c8
NC
7194 {
7195 if (seg->p_type != PT_LOAD)
7196 continue;
7197
7198 if (sec->sh_addr >= seg->p_vaddr
7199 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7200 {
7201 aux->seg_base = seg->p_vaddr;
7202 break;
7203 }
7204 }
4d6ed7c8
NC
7205 }
7206
7207 /* Second, build the unwind table from the contents of the unwind section: */
7208 size = sec->sh_size;
3f5e193b
NC
7209 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7210 _("unwind table"));
a6e9f9df 7211 if (!table)
53774b7e 7212 return FALSE;
4d6ed7c8 7213
53774b7e 7214 aux->table_len = size / (3 * eh_addr_size);
3f5e193b 7215 aux->table = (struct ia64_unw_table_entry *)
53774b7e 7216 xcmalloc (aux->table_len, sizeof (aux->table[0]));
89fac5e3 7217 tep = aux->table;
53774b7e
NC
7218
7219 for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
4d6ed7c8
NC
7220 {
7221 tep->start.section = SHN_UNDEF;
7222 tep->end.section = SHN_UNDEF;
7223 tep->info.section = SHN_UNDEF;
c6a0c689
AM
7224 tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7225 tep->end.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7226 tep->info.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
4d6ed7c8
NC
7227 tep->start.offset += aux->seg_base;
7228 tep->end.offset += aux->seg_base;
7229 tep->info.offset += aux->seg_base;
7230 }
7231 free (table);
7232
41e92641 7233 /* Third, apply any relocations to the unwind table: */
4d6ed7c8
NC
7234 for (relsec = section_headers;
7235 relsec < section_headers + elf_header.e_shnum;
7236 ++relsec)
7237 {
7238 if (relsec->sh_type != SHT_RELA
4fbb74a6
AM
7239 || relsec->sh_info >= elf_header.e_shnum
7240 || section_headers + relsec->sh_info != sec)
4d6ed7c8
NC
7241 continue;
7242
7243 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7244 & rela, & nrelas))
53774b7e
NC
7245 {
7246 free (aux->table);
7247 aux->table = NULL;
7248 aux->table_len = 0;
7249 return FALSE;
7250 }
4d6ed7c8
NC
7251
7252 for (rp = rela; rp < rela + nrelas; ++rp)
7253 {
aca88567
NC
7254 relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
7255 sym = aux->symtab + get_reloc_symindex (rp->r_info);
4d6ed7c8 7256
82b1b41b
NC
7257 /* PR 17531: file: 9fa67536. */
7258 if (relname == NULL)
7259 {
7260 warn (_("Skipping unknown relocation type: %u\n"), get_reloc_type (rp->r_info));
7261 continue;
7262 }
948f632f 7263
0112cd26 7264 if (! const_strneq (relname, "R_IA64_SEGREL"))
4d6ed7c8 7265 {
82b1b41b 7266 warn (_("Skipping unexpected relocation type: %s\n"), relname);
4d6ed7c8
NC
7267 continue;
7268 }
7269
89fac5e3 7270 i = rp->r_offset / (3 * eh_addr_size);
4d6ed7c8 7271
53774b7e
NC
7272 /* PR 17531: file: 5bc8d9bf. */
7273 if (i >= aux->table_len)
7274 {
7275 warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
7276 continue;
7277 }
7278
7279 switch (rp->r_offset / eh_addr_size % 3)
4d6ed7c8
NC
7280 {
7281 case 0:
7282 aux->table[i].start.section = sym->st_shndx;
e466bc6e 7283 aux->table[i].start.offset = rp->r_addend + sym->st_value;
4d6ed7c8
NC
7284 break;
7285 case 1:
7286 aux->table[i].end.section = sym->st_shndx;
e466bc6e 7287 aux->table[i].end.offset = rp->r_addend + sym->st_value;
4d6ed7c8
NC
7288 break;
7289 case 2:
7290 aux->table[i].info.section = sym->st_shndx;
e466bc6e 7291 aux->table[i].info.offset = rp->r_addend + sym->st_value;
4d6ed7c8
NC
7292 break;
7293 default:
7294 break;
7295 }
7296 }
7297
7298 free (rela);
7299 }
7300
53774b7e 7301 return TRUE;
4d6ed7c8
NC
7302}
7303
1b31d05e 7304static void
2cf0635d 7305ia64_process_unwind (FILE * file)
4d6ed7c8 7306{
2cf0635d
NC
7307 Elf_Internal_Shdr * sec;
7308 Elf_Internal_Shdr * unwsec = NULL;
7309 Elf_Internal_Shdr * strsec;
89fac5e3 7310 unsigned long i, unwcount = 0, unwstart = 0;
57346661 7311 struct ia64_unw_aux_info aux;
f1467e33 7312
4d6ed7c8
NC
7313 memset (& aux, 0, sizeof (aux));
7314
4d6ed7c8
NC
7315 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7316 {
c256ffe7 7317 if (sec->sh_type == SHT_SYMTAB
4fbb74a6 7318 && sec->sh_link < elf_header.e_shnum)
4d6ed7c8 7319 {
ba5cdace 7320 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
4d6ed7c8 7321
4fbb74a6 7322 strsec = section_headers + sec->sh_link;
4082ef84
NC
7323 if (aux.strtab != NULL)
7324 {
7325 error (_("Multiple auxillary string tables encountered\n"));
7326 free (aux.strtab);
7327 }
3f5e193b
NC
7328 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7329 1, strsec->sh_size,
7330 _("string table"));
c256ffe7 7331 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
4d6ed7c8
NC
7332 }
7333 else if (sec->sh_type == SHT_IA_64_UNWIND)
579f31ac
JJ
7334 unwcount++;
7335 }
7336
7337 if (!unwcount)
7338 printf (_("\nThere are no unwind sections in this file.\n"));
7339
7340 while (unwcount-- > 0)
7341 {
2cf0635d 7342 char * suffix;
579f31ac
JJ
7343 size_t len, len2;
7344
4082ef84 7345 for (i = unwstart, sec = section_headers + unwstart, unwsec = NULL;
579f31ac
JJ
7346 i < elf_header.e_shnum; ++i, ++sec)
7347 if (sec->sh_type == SHT_IA_64_UNWIND)
7348 {
7349 unwsec = sec;
7350 break;
7351 }
4082ef84
NC
7352 /* We have already counted the number of SHT_IA64_UNWIND
7353 sections so the loop above should never fail. */
7354 assert (unwsec != NULL);
579f31ac
JJ
7355
7356 unwstart = i + 1;
7357 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
7358
e4b17d5c
L
7359 if ((unwsec->sh_flags & SHF_GROUP) != 0)
7360 {
7361 /* We need to find which section group it is in. */
4082ef84 7362 struct group_list * g;
e4b17d5c 7363
4082ef84
NC
7364 if (section_headers_groups == NULL
7365 || section_headers_groups [i] == NULL)
7366 i = elf_header.e_shnum;
7367 else
e4b17d5c 7368 {
4082ef84 7369 g = section_headers_groups [i]->root;
18bd398b 7370
4082ef84
NC
7371 for (; g != NULL; g = g->next)
7372 {
7373 sec = section_headers + g->section_index;
e4b17d5c 7374
4082ef84
NC
7375 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
7376 break;
7377 }
7378
7379 if (g == NULL)
7380 i = elf_header.e_shnum;
7381 }
e4b17d5c 7382 }
18bd398b 7383 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
579f31ac 7384 {
18bd398b 7385 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
579f31ac
JJ
7386 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
7387 suffix = SECTION_NAME (unwsec) + len;
7388 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7389 ++i, ++sec)
18bd398b
NC
7390 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
7391 && streq (SECTION_NAME (sec) + len2, suffix))
579f31ac
JJ
7392 break;
7393 }
7394 else
7395 {
7396 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
18bd398b 7397 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
579f31ac
JJ
7398 len = sizeof (ELF_STRING_ia64_unwind) - 1;
7399 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
7400 suffix = "";
18bd398b 7401 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
579f31ac
JJ
7402 suffix = SECTION_NAME (unwsec) + len;
7403 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7404 ++i, ++sec)
18bd398b
NC
7405 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
7406 && streq (SECTION_NAME (sec) + len2, suffix))
579f31ac
JJ
7407 break;
7408 }
7409
7410 if (i == elf_header.e_shnum)
7411 {
7412 printf (_("\nCould not find unwind info section for "));
7413
7414 if (string_table == NULL)
7415 printf ("%d", unwsec->sh_name);
7416 else
74e1a04b 7417 printf ("'%s'", printable_section_name (unwsec));
579f31ac
JJ
7418 }
7419 else
4d6ed7c8 7420 {
4d6ed7c8 7421 aux.info_addr = sec->sh_addr;
3f5e193b 7422 aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
4082ef84
NC
7423 sec->sh_size,
7424 _("unwind info"));
59245841 7425 aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
4d6ed7c8 7426
579f31ac 7427 printf (_("\nUnwind section "));
4d6ed7c8 7428
579f31ac
JJ
7429 if (string_table == NULL)
7430 printf ("%d", unwsec->sh_name);
7431 else
74e1a04b 7432 printf ("'%s'", printable_section_name (unwsec));
4d6ed7c8 7433
579f31ac 7434 printf (_(" at offset 0x%lx contains %lu entries:\n"),
e59b4dfb 7435 (unsigned long) unwsec->sh_offset,
89fac5e3 7436 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
4d6ed7c8 7437
53774b7e
NC
7438 if (slurp_ia64_unwind_table (file, & aux, unwsec)
7439 && aux.table_len > 0)
579f31ac
JJ
7440 dump_ia64_unwind (& aux);
7441
7442 if (aux.table)
7443 free ((char *) aux.table);
7444 if (aux.info)
7445 free ((char *) aux.info);
7446 aux.table = NULL;
7447 aux.info = NULL;
7448 }
4d6ed7c8 7449 }
4d6ed7c8 7450
4d6ed7c8
NC
7451 if (aux.symtab)
7452 free (aux.symtab);
7453 if (aux.strtab)
7454 free ((char *) aux.strtab);
4d6ed7c8
NC
7455}
7456
3f5e193b
NC
7457struct hppa_unw_table_entry
7458 {
7459 struct absaddr start;
7460 struct absaddr end;
948f632f 7461 unsigned int Cannot_unwind:1; /* 0 */
3f5e193b
NC
7462 unsigned int Millicode:1; /* 1 */
7463 unsigned int Millicode_save_sr0:1; /* 2 */
7464 unsigned int Region_description:2; /* 3..4 */
7465 unsigned int reserved1:1; /* 5 */
7466 unsigned int Entry_SR:1; /* 6 */
7467 unsigned int Entry_FR:4; /* number saved */ /* 7..10 */
7468 unsigned int Entry_GR:5; /* number saved */ /* 11..15 */
7469 unsigned int Args_stored:1; /* 16 */
948f632f
DA
7470 unsigned int Variable_Frame:1; /* 17 */
7471 unsigned int Separate_Package_Body:1; /* 18 */
3f5e193b 7472 unsigned int Frame_Extension_Millicode:1; /* 19 */
948f632f
DA
7473 unsigned int Stack_Overflow_Check:1; /* 20 */
7474 unsigned int Two_Instruction_SP_Increment:1;/* 21 */
3f5e193b
NC
7475 unsigned int Ada_Region:1; /* 22 */
7476 unsigned int cxx_info:1; /* 23 */
948f632f
DA
7477 unsigned int cxx_try_catch:1; /* 24 */
7478 unsigned int sched_entry_seq:1; /* 25 */
3f5e193b 7479 unsigned int reserved2:1; /* 26 */
948f632f
DA
7480 unsigned int Save_SP:1; /* 27 */
7481 unsigned int Save_RP:1; /* 28 */
3f5e193b
NC
7482 unsigned int Save_MRP_in_frame:1; /* 29 */
7483 unsigned int extn_ptr_defined:1; /* 30 */
948f632f 7484 unsigned int Cleanup_defined:1; /* 31 */
3f5e193b 7485
948f632f
DA
7486 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
7487 unsigned int HP_UX_interrupt_marker:1; /* 1 */
3f5e193b 7488 unsigned int Large_frame:1; /* 2 */
948f632f 7489 unsigned int Pseudo_SP_Set:1; /* 3 */
3f5e193b
NC
7490 unsigned int reserved4:1; /* 4 */
7491 unsigned int Total_frame_size:27; /* 5..31 */
7492 };
7493
57346661 7494struct hppa_unw_aux_info
948f632f
DA
7495{
7496 struct hppa_unw_table_entry * table; /* Unwind table. */
7497 unsigned long table_len; /* Length of unwind table. */
7498 bfd_vma seg_base; /* Starting address of segment. */
7499 Elf_Internal_Sym * symtab; /* The symbol table. */
7500 unsigned long nsyms; /* Number of symbols. */
7501 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7502 unsigned long nfuns; /* Number of entries in funtab. */
7503 char * strtab; /* The string table. */
7504 unsigned long strtab_size; /* Size of string table. */
7505};
57346661
AM
7506
7507static void
2cf0635d 7508dump_hppa_unwind (struct hppa_unw_aux_info * aux)
57346661 7509{
2cf0635d 7510 struct hppa_unw_table_entry * tp;
948f632f
DA
7511 unsigned long j, nfuns;
7512
7513 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7514 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7515 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7516 aux->funtab[nfuns++] = aux->symtab[j];
7517 aux->nfuns = nfuns;
7518 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
57346661 7519
57346661
AM
7520 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7521 {
7522 bfd_vma offset;
2cf0635d 7523 const char * procname;
57346661 7524
948f632f 7525 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
57346661
AM
7526 aux->strtab_size, tp->start, &procname,
7527 &offset);
7528
7529 fputs ("\n<", stdout);
7530
7531 if (procname)
7532 {
7533 fputs (procname, stdout);
7534
7535 if (offset)
7536 printf ("+%lx", (unsigned long) offset);
7537 }
7538
7539 fputs (">: [", stdout);
7540 print_vma (tp->start.offset, PREFIX_HEX);
7541 fputc ('-', stdout);
7542 print_vma (tp->end.offset, PREFIX_HEX);
7543 printf ("]\n\t");
7544
18bd398b
NC
7545#define PF(_m) if (tp->_m) printf (#_m " ");
7546#define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
57346661
AM
7547 PF(Cannot_unwind);
7548 PF(Millicode);
7549 PF(Millicode_save_sr0);
18bd398b 7550 /* PV(Region_description); */
57346661
AM
7551 PF(Entry_SR);
7552 PV(Entry_FR);
7553 PV(Entry_GR);
7554 PF(Args_stored);
7555 PF(Variable_Frame);
7556 PF(Separate_Package_Body);
7557 PF(Frame_Extension_Millicode);
7558 PF(Stack_Overflow_Check);
7559 PF(Two_Instruction_SP_Increment);
7560 PF(Ada_Region);
7561 PF(cxx_info);
7562 PF(cxx_try_catch);
7563 PF(sched_entry_seq);
7564 PF(Save_SP);
7565 PF(Save_RP);
7566 PF(Save_MRP_in_frame);
7567 PF(extn_ptr_defined);
7568 PF(Cleanup_defined);
7569 PF(MPE_XL_interrupt_marker);
7570 PF(HP_UX_interrupt_marker);
7571 PF(Large_frame);
7572 PF(Pseudo_SP_Set);
7573 PV(Total_frame_size);
7574#undef PF
7575#undef PV
7576 }
7577
18bd398b 7578 printf ("\n");
948f632f
DA
7579
7580 free (aux->funtab);
57346661
AM
7581}
7582
7583static int
2cf0635d
NC
7584slurp_hppa_unwind_table (FILE * file,
7585 struct hppa_unw_aux_info * aux,
7586 Elf_Internal_Shdr * sec)
57346661 7587{
1c0751b2 7588 unsigned long size, unw_ent_size, nentries, nrelas, i;
2cf0635d
NC
7589 Elf_Internal_Phdr * seg;
7590 struct hppa_unw_table_entry * tep;
7591 Elf_Internal_Shdr * relsec;
7592 Elf_Internal_Rela * rela;
7593 Elf_Internal_Rela * rp;
7594 unsigned char * table;
7595 unsigned char * tp;
7596 Elf_Internal_Sym * sym;
7597 const char * relname;
57346661 7598
57346661
AM
7599 /* First, find the starting address of the segment that includes
7600 this section. */
7601
7602 if (elf_header.e_phnum)
7603 {
7604 if (! get_program_headers (file))
7605 return 0;
7606
7607 for (seg = program_headers;
7608 seg < program_headers + elf_header.e_phnum;
7609 ++seg)
7610 {
7611 if (seg->p_type != PT_LOAD)
7612 continue;
7613
7614 if (sec->sh_addr >= seg->p_vaddr
7615 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7616 {
7617 aux->seg_base = seg->p_vaddr;
7618 break;
7619 }
7620 }
7621 }
7622
7623 /* Second, build the unwind table from the contents of the unwind
7624 section. */
7625 size = sec->sh_size;
3f5e193b
NC
7626 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7627 _("unwind table"));
57346661
AM
7628 if (!table)
7629 return 0;
7630
1c0751b2
DA
7631 unw_ent_size = 16;
7632 nentries = size / unw_ent_size;
7633 size = unw_ent_size * nentries;
57346661 7634
3f5e193b
NC
7635 tep = aux->table = (struct hppa_unw_table_entry *)
7636 xcmalloc (nentries, sizeof (aux->table[0]));
57346661 7637
1c0751b2 7638 for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
57346661
AM
7639 {
7640 unsigned int tmp1, tmp2;
7641
7642 tep->start.section = SHN_UNDEF;
7643 tep->end.section = SHN_UNDEF;
7644
1c0751b2
DA
7645 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
7646 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
7647 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
7648 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
7649
7650 tep->start.offset += aux->seg_base;
7651 tep->end.offset += aux->seg_base;
57346661
AM
7652
7653 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
7654 tep->Millicode = (tmp1 >> 30) & 0x1;
7655 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
7656 tep->Region_description = (tmp1 >> 27) & 0x3;
7657 tep->reserved1 = (tmp1 >> 26) & 0x1;
7658 tep->Entry_SR = (tmp1 >> 25) & 0x1;
7659 tep->Entry_FR = (tmp1 >> 21) & 0xf;
7660 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
7661 tep->Args_stored = (tmp1 >> 15) & 0x1;
7662 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
7663 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
7664 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
7665 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
7666 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
7667 tep->Ada_Region = (tmp1 >> 9) & 0x1;
7668 tep->cxx_info = (tmp1 >> 8) & 0x1;
7669 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
7670 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
7671 tep->reserved2 = (tmp1 >> 5) & 0x1;
7672 tep->Save_SP = (tmp1 >> 4) & 0x1;
7673 tep->Save_RP = (tmp1 >> 3) & 0x1;
7674 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
7675 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
7676 tep->Cleanup_defined = tmp1 & 0x1;
7677
7678 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
7679 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
7680 tep->Large_frame = (tmp2 >> 29) & 0x1;
7681 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
7682 tep->reserved4 = (tmp2 >> 27) & 0x1;
7683 tep->Total_frame_size = tmp2 & 0x7ffffff;
57346661
AM
7684 }
7685 free (table);
7686
7687 /* Third, apply any relocations to the unwind table. */
57346661
AM
7688 for (relsec = section_headers;
7689 relsec < section_headers + elf_header.e_shnum;
7690 ++relsec)
7691 {
7692 if (relsec->sh_type != SHT_RELA
4fbb74a6
AM
7693 || relsec->sh_info >= elf_header.e_shnum
7694 || section_headers + relsec->sh_info != sec)
57346661
AM
7695 continue;
7696
7697 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7698 & rela, & nrelas))
7699 return 0;
7700
7701 for (rp = rela; rp < rela + nrelas; ++rp)
7702 {
aca88567
NC
7703 relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
7704 sym = aux->symtab + get_reloc_symindex (rp->r_info);
57346661
AM
7705
7706 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
0112cd26 7707 if (! const_strneq (relname, "R_PARISC_SEGREL"))
57346661
AM
7708 {
7709 warn (_("Skipping unexpected relocation type %s\n"), relname);
7710 continue;
7711 }
7712
7713 i = rp->r_offset / unw_ent_size;
7714
89fac5e3 7715 switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
57346661
AM
7716 {
7717 case 0:
7718 aux->table[i].start.section = sym->st_shndx;
1e456d54 7719 aux->table[i].start.offset = sym->st_value + rp->r_addend;
57346661
AM
7720 break;
7721 case 1:
7722 aux->table[i].end.section = sym->st_shndx;
1e456d54 7723 aux->table[i].end.offset = sym->st_value + rp->r_addend;
57346661
AM
7724 break;
7725 default:
7726 break;
7727 }
7728 }
7729
7730 free (rela);
7731 }
7732
1c0751b2 7733 aux->table_len = nentries;
57346661
AM
7734
7735 return 1;
7736}
7737
1b31d05e 7738static void
2cf0635d 7739hppa_process_unwind (FILE * file)
57346661 7740{
57346661 7741 struct hppa_unw_aux_info aux;
2cf0635d
NC
7742 Elf_Internal_Shdr * unwsec = NULL;
7743 Elf_Internal_Shdr * strsec;
7744 Elf_Internal_Shdr * sec;
18bd398b 7745 unsigned long i;
57346661 7746
c256ffe7 7747 if (string_table == NULL)
1b31d05e
NC
7748 return;
7749
7750 memset (& aux, 0, sizeof (aux));
57346661
AM
7751
7752 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7753 {
c256ffe7 7754 if (sec->sh_type == SHT_SYMTAB
4fbb74a6 7755 && sec->sh_link < elf_header.e_shnum)
57346661 7756 {
ba5cdace 7757 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
57346661 7758
4fbb74a6 7759 strsec = section_headers + sec->sh_link;
4082ef84
NC
7760 if (aux.strtab != NULL)
7761 {
7762 error (_("Multiple auxillary string tables encountered\n"));
7763 free (aux.strtab);
7764 }
3f5e193b
NC
7765 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7766 1, strsec->sh_size,
7767 _("string table"));
c256ffe7 7768 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
57346661 7769 }
18bd398b 7770 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
57346661
AM
7771 unwsec = sec;
7772 }
7773
7774 if (!unwsec)
7775 printf (_("\nThere are no unwind sections in this file.\n"));
7776
7777 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7778 {
18bd398b 7779 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
57346661 7780 {
74e1a04b
NC
7781 printf (_("\nUnwind section '%s' at offset 0x%lx contains %lu entries:\n"),
7782 printable_section_name (sec),
57346661 7783 (unsigned long) sec->sh_offset,
89fac5e3 7784 (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
57346661
AM
7785
7786 slurp_hppa_unwind_table (file, &aux, sec);
7787 if (aux.table_len > 0)
7788 dump_hppa_unwind (&aux);
7789
7790 if (aux.table)
7791 free ((char *) aux.table);
7792 aux.table = NULL;
7793 }
7794 }
7795
7796 if (aux.symtab)
7797 free (aux.symtab);
7798 if (aux.strtab)
7799 free ((char *) aux.strtab);
57346661
AM
7800}
7801
0b6ae522
DJ
7802struct arm_section
7803{
a734115a
NC
7804 unsigned char * data; /* The unwind data. */
7805 Elf_Internal_Shdr * sec; /* The cached unwind section header. */
7806 Elf_Internal_Rela * rela; /* The cached relocations for this section. */
7807 unsigned long nrelas; /* The number of relocations. */
7808 unsigned int rel_type; /* REL or RELA ? */
7809 Elf_Internal_Rela * next_rela; /* Cyclic pointer to the next reloc to process. */
0b6ae522
DJ
7810};
7811
7812struct arm_unw_aux_info
7813{
a734115a
NC
7814 FILE * file; /* The file containing the unwind sections. */
7815 Elf_Internal_Sym * symtab; /* The file's symbol table. */
7816 unsigned long nsyms; /* Number of symbols. */
948f632f
DA
7817 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7818 unsigned long nfuns; /* Number of these symbols. */
a734115a
NC
7819 char * strtab; /* The file's string table. */
7820 unsigned long strtab_size; /* Size of string table. */
0b6ae522
DJ
7821};
7822
7823static const char *
7824arm_print_vma_and_name (struct arm_unw_aux_info *aux,
7825 bfd_vma fn, struct absaddr addr)
7826{
7827 const char *procname;
7828 bfd_vma sym_offset;
7829
7830 if (addr.section == SHN_UNDEF)
7831 addr.offset = fn;
7832
948f632f 7833 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
0b6ae522
DJ
7834 aux->strtab_size, addr, &procname,
7835 &sym_offset);
7836
7837 print_vma (fn, PREFIX_HEX);
7838
7839 if (procname)
7840 {
7841 fputs (" <", stdout);
7842 fputs (procname, stdout);
7843
7844 if (sym_offset)
7845 printf ("+0x%lx", (unsigned long) sym_offset);
7846 fputc ('>', stdout);
7847 }
7848
7849 return procname;
7850}
7851
7852static void
7853arm_free_section (struct arm_section *arm_sec)
7854{
7855 if (arm_sec->data != NULL)
7856 free (arm_sec->data);
7857
7858 if (arm_sec->rela != NULL)
7859 free (arm_sec->rela);
7860}
7861
a734115a
NC
7862/* 1) If SEC does not match the one cached in ARM_SEC, then free the current
7863 cached section and install SEC instead.
7864 2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
7865 and return its valued in * WORDP, relocating if necessary.
1b31d05e 7866 3) Update the NEXT_RELA field in ARM_SEC and store the section index and
a734115a 7867 relocation's offset in ADDR.
1b31d05e
NC
7868 4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
7869 into the string table of the symbol associated with the reloc. If no
7870 reloc was applied store -1 there.
7871 5) Return TRUE upon success, FALSE otherwise. */
a734115a
NC
7872
7873static bfd_boolean
1b31d05e
NC
7874get_unwind_section_word (struct arm_unw_aux_info * aux,
7875 struct arm_section * arm_sec,
7876 Elf_Internal_Shdr * sec,
7877 bfd_vma word_offset,
7878 unsigned int * wordp,
7879 struct absaddr * addr,
7880 bfd_vma * sym_name)
0b6ae522
DJ
7881{
7882 Elf_Internal_Rela *rp;
7883 Elf_Internal_Sym *sym;
7884 const char * relname;
7885 unsigned int word;
7886 bfd_boolean wrapped;
7887
e0a31db1
NC
7888 if (sec == NULL || arm_sec == NULL)
7889 return FALSE;
7890
0b6ae522
DJ
7891 addr->section = SHN_UNDEF;
7892 addr->offset = 0;
7893
1b31d05e
NC
7894 if (sym_name != NULL)
7895 *sym_name = (bfd_vma) -1;
7896
a734115a 7897 /* If necessary, update the section cache. */
0b6ae522
DJ
7898 if (sec != arm_sec->sec)
7899 {
7900 Elf_Internal_Shdr *relsec;
7901
7902 arm_free_section (arm_sec);
7903
7904 arm_sec->sec = sec;
7905 arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
7906 sec->sh_size, _("unwind data"));
0b6ae522
DJ
7907 arm_sec->rela = NULL;
7908 arm_sec->nrelas = 0;
7909
7910 for (relsec = section_headers;
7911 relsec < section_headers + elf_header.e_shnum;
7912 ++relsec)
7913 {
7914 if (relsec->sh_info >= elf_header.e_shnum
1ae40aa4
NC
7915 || section_headers + relsec->sh_info != sec
7916 /* PR 15745: Check the section type as well. */
7917 || (relsec->sh_type != SHT_REL
7918 && relsec->sh_type != SHT_RELA))
0b6ae522
DJ
7919 continue;
7920
a734115a 7921 arm_sec->rel_type = relsec->sh_type;
0b6ae522
DJ
7922 if (relsec->sh_type == SHT_REL)
7923 {
7924 if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
7925 relsec->sh_size,
7926 & arm_sec->rela, & arm_sec->nrelas))
a734115a 7927 return FALSE;
0b6ae522 7928 }
1ae40aa4 7929 else /* relsec->sh_type == SHT_RELA */
0b6ae522
DJ
7930 {
7931 if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
7932 relsec->sh_size,
7933 & arm_sec->rela, & arm_sec->nrelas))
a734115a 7934 return FALSE;
0b6ae522 7935 }
1ae40aa4 7936 break;
0b6ae522
DJ
7937 }
7938
7939 arm_sec->next_rela = arm_sec->rela;
7940 }
7941
a734115a 7942 /* If there is no unwind data we can do nothing. */
0b6ae522 7943 if (arm_sec->data == NULL)
a734115a 7944 return FALSE;
0b6ae522 7945
e0a31db1 7946 /* If the offset is invalid then fail. */
1a915552
NC
7947 if (word_offset > (sec->sh_size - 4)
7948 /* PR 18879 */
7949 || (sec->sh_size < 5 && word_offset >= sec->sh_size)
7950 || ((bfd_signed_vma) word_offset) < 0)
e0a31db1
NC
7951 return FALSE;
7952
a734115a 7953 /* Get the word at the required offset. */
0b6ae522
DJ
7954 word = byte_get (arm_sec->data + word_offset, 4);
7955
0eff7165
NC
7956 /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128. */
7957 if (arm_sec->rela == NULL)
7958 {
7959 * wordp = word;
7960 return TRUE;
7961 }
7962
a734115a 7963 /* Look through the relocs to find the one that applies to the provided offset. */
0b6ae522
DJ
7964 wrapped = FALSE;
7965 for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
7966 {
7967 bfd_vma prelval, offset;
7968
7969 if (rp->r_offset > word_offset && !wrapped)
7970 {
7971 rp = arm_sec->rela;
7972 wrapped = TRUE;
7973 }
7974 if (rp->r_offset > word_offset)
7975 break;
7976
7977 if (rp->r_offset & 3)
7978 {
7979 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
7980 (unsigned long) rp->r_offset);
7981 continue;
7982 }
7983
7984 if (rp->r_offset < word_offset)
7985 continue;
7986
74e1a04b
NC
7987 /* PR 17531: file: 027-161405-0.004 */
7988 if (aux->symtab == NULL)
7989 continue;
7990
0b6ae522
DJ
7991 if (arm_sec->rel_type == SHT_REL)
7992 {
7993 offset = word & 0x7fffffff;
7994 if (offset & 0x40000000)
7995 offset |= ~ (bfd_vma) 0x7fffffff;
7996 }
a734115a 7997 else if (arm_sec->rel_type == SHT_RELA)
0b6ae522 7998 offset = rp->r_addend;
a734115a 7999 else
74e1a04b
NC
8000 {
8001 error (_("Unknown section relocation type %d encountered\n"),
8002 arm_sec->rel_type);
8003 break;
8004 }
0b6ae522 8005
071436c6
NC
8006 /* PR 17531 file: 027-1241568-0.004. */
8007 if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
8008 {
8009 error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
8010 (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
8011 break;
8012 }
8013
8014 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
0b6ae522
DJ
8015 offset += sym->st_value;
8016 prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
8017
a734115a
NC
8018 /* Check that we are processing the expected reloc type. */
8019 if (elf_header.e_machine == EM_ARM)
8020 {
8021 relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
071436c6
NC
8022 if (relname == NULL)
8023 {
8024 warn (_("Skipping unknown ARM relocation type: %d\n"),
8025 (int) ELF32_R_TYPE (rp->r_info));
8026 continue;
8027 }
a734115a
NC
8028
8029 if (streq (relname, "R_ARM_NONE"))
8030 continue;
0b4362b0 8031
a734115a
NC
8032 if (! streq (relname, "R_ARM_PREL31"))
8033 {
071436c6 8034 warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
a734115a
NC
8035 continue;
8036 }
8037 }
8038 else if (elf_header.e_machine == EM_TI_C6000)
8039 {
8040 relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
071436c6
NC
8041 if (relname == NULL)
8042 {
8043 warn (_("Skipping unknown C6000 relocation type: %d\n"),
8044 (int) ELF32_R_TYPE (rp->r_info));
8045 continue;
8046 }
0b4362b0 8047
a734115a
NC
8048 if (streq (relname, "R_C6000_NONE"))
8049 continue;
8050
8051 if (! streq (relname, "R_C6000_PREL31"))
8052 {
071436c6 8053 warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
a734115a
NC
8054 continue;
8055 }
8056
8057 prelval >>= 1;
8058 }
8059 else
74e1a04b
NC
8060 {
8061 /* This function currently only supports ARM and TI unwinders. */
8062 warn (_("Only TI and ARM unwinders are currently supported\n"));
8063 break;
8064 }
fa197c1c 8065
0b6ae522
DJ
8066 word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
8067 addr->section = sym->st_shndx;
8068 addr->offset = offset;
74e1a04b 8069
1b31d05e
NC
8070 if (sym_name)
8071 * sym_name = sym->st_name;
0b6ae522
DJ
8072 break;
8073 }
8074
8075 *wordp = word;
8076 arm_sec->next_rela = rp;
8077
a734115a 8078 return TRUE;
0b6ae522
DJ
8079}
8080
a734115a
NC
8081static const char *tic6x_unwind_regnames[16] =
8082{
0b4362b0
RM
8083 "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
8084 "A14", "A13", "A12", "A11", "A10",
a734115a
NC
8085 "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
8086};
fa197c1c 8087
0b6ae522 8088static void
fa197c1c 8089decode_tic6x_unwind_regmask (unsigned int mask)
0b6ae522 8090{
fa197c1c
PB
8091 int i;
8092
8093 for (i = 12; mask; mask >>= 1, i--)
8094 {
8095 if (mask & 1)
8096 {
8097 fputs (tic6x_unwind_regnames[i], stdout);
8098 if (mask > 1)
8099 fputs (", ", stdout);
8100 }
8101 }
8102}
0b6ae522
DJ
8103
8104#define ADVANCE \
8105 if (remaining == 0 && more_words) \
8106 { \
8107 data_offset += 4; \
1b31d05e
NC
8108 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, \
8109 data_offset, & word, & addr, NULL)) \
0b6ae522
DJ
8110 return; \
8111 remaining = 4; \
8112 more_words--; \
8113 } \
8114
8115#define GET_OP(OP) \
8116 ADVANCE; \
8117 if (remaining) \
8118 { \
8119 remaining--; \
8120 (OP) = word >> 24; \
8121 word <<= 8; \
8122 } \
8123 else \
8124 { \
2b692964 8125 printf (_("[Truncated opcode]\n")); \
0b6ae522
DJ
8126 return; \
8127 } \
cc5914eb 8128 printf ("0x%02x ", OP)
0b6ae522 8129
fa197c1c 8130static void
948f632f
DA
8131decode_arm_unwind_bytecode (struct arm_unw_aux_info * aux,
8132 unsigned int word,
8133 unsigned int remaining,
8134 unsigned int more_words,
8135 bfd_vma data_offset,
8136 Elf_Internal_Shdr * data_sec,
8137 struct arm_section * data_arm_sec)
fa197c1c
PB
8138{
8139 struct absaddr addr;
0b6ae522
DJ
8140
8141 /* Decode the unwinding instructions. */
8142 while (1)
8143 {
8144 unsigned int op, op2;
8145
8146 ADVANCE;
8147 if (remaining == 0)
8148 break;
8149 remaining--;
8150 op = word >> 24;
8151 word <<= 8;
8152
cc5914eb 8153 printf (" 0x%02x ", op);
0b6ae522
DJ
8154
8155 if ((op & 0xc0) == 0x00)
8156 {
8157 int offset = ((op & 0x3f) << 2) + 4;
61865e30 8158
cc5914eb 8159 printf (" vsp = vsp + %d", offset);
0b6ae522
DJ
8160 }
8161 else if ((op & 0xc0) == 0x40)
8162 {
8163 int offset = ((op & 0x3f) << 2) + 4;
61865e30 8164
cc5914eb 8165 printf (" vsp = vsp - %d", offset);
0b6ae522
DJ
8166 }
8167 else if ((op & 0xf0) == 0x80)
8168 {
8169 GET_OP (op2);
8170 if (op == 0x80 && op2 == 0)
8171 printf (_("Refuse to unwind"));
8172 else
8173 {
8174 unsigned int mask = ((op & 0x0f) << 8) | op2;
8175 int first = 1;
8176 int i;
2b692964 8177
0b6ae522
DJ
8178 printf ("pop {");
8179 for (i = 0; i < 12; i++)
8180 if (mask & (1 << i))
8181 {
8182 if (first)
8183 first = 0;
8184 else
8185 printf (", ");
8186 printf ("r%d", 4 + i);
8187 }
8188 printf ("}");
8189 }
8190 }
8191 else if ((op & 0xf0) == 0x90)
8192 {
8193 if (op == 0x9d || op == 0x9f)
8194 printf (_(" [Reserved]"));
8195 else
cc5914eb 8196 printf (" vsp = r%d", op & 0x0f);
0b6ae522
DJ
8197 }
8198 else if ((op & 0xf0) == 0xa0)
8199 {
8200 int end = 4 + (op & 0x07);
8201 int first = 1;
8202 int i;
61865e30 8203
0b6ae522
DJ
8204 printf (" pop {");
8205 for (i = 4; i <= end; i++)
8206 {
8207 if (first)
8208 first = 0;
8209 else
8210 printf (", ");
8211 printf ("r%d", i);
8212 }
8213 if (op & 0x08)
8214 {
1b31d05e 8215 if (!first)
0b6ae522
DJ
8216 printf (", ");
8217 printf ("r14");
8218 }
8219 printf ("}");
8220 }
8221 else if (op == 0xb0)
8222 printf (_(" finish"));
8223 else if (op == 0xb1)
8224 {
8225 GET_OP (op2);
8226 if (op2 == 0 || (op2 & 0xf0) != 0)
8227 printf (_("[Spare]"));
8228 else
8229 {
8230 unsigned int mask = op2 & 0x0f;
8231 int first = 1;
8232 int i;
61865e30 8233
0b6ae522
DJ
8234 printf ("pop {");
8235 for (i = 0; i < 12; i++)
8236 if (mask & (1 << i))
8237 {
8238 if (first)
8239 first = 0;
8240 else
8241 printf (", ");
8242 printf ("r%d", i);
8243 }
8244 printf ("}");
8245 }
8246 }
8247 else if (op == 0xb2)
8248 {
b115cf96 8249 unsigned char buf[9];
0b6ae522
DJ
8250 unsigned int i, len;
8251 unsigned long offset;
61865e30 8252
b115cf96 8253 for (i = 0; i < sizeof (buf); i++)
0b6ae522
DJ
8254 {
8255 GET_OP (buf[i]);
8256 if ((buf[i] & 0x80) == 0)
8257 break;
8258 }
4082ef84
NC
8259 if (i == sizeof (buf))
8260 printf (_("corrupt change to vsp"));
8261 else
8262 {
8263 offset = read_uleb128 (buf, &len, buf + i + 1);
8264 assert (len == i + 1);
8265 offset = offset * 4 + 0x204;
8266 printf ("vsp = vsp + %ld", offset);
8267 }
0b6ae522 8268 }
61865e30 8269 else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
0b6ae522 8270 {
61865e30
NC
8271 unsigned int first, last;
8272
8273 GET_OP (op2);
8274 first = op2 >> 4;
8275 last = op2 & 0x0f;
8276 if (op == 0xc8)
8277 first = first + 16;
8278 printf ("pop {D%d", first);
8279 if (last)
8280 printf ("-D%d", first + last);
8281 printf ("}");
8282 }
8283 else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
8284 {
8285 unsigned int count = op & 0x07;
8286
8287 printf ("pop {D8");
8288 if (count)
8289 printf ("-D%d", 8 + count);
8290 printf ("}");
8291 }
8292 else if (op >= 0xc0 && op <= 0xc5)
8293 {
8294 unsigned int count = op & 0x07;
8295
8296 printf (" pop {wR10");
8297 if (count)
8298 printf ("-wR%d", 10 + count);
8299 printf ("}");
8300 }
8301 else if (op == 0xc6)
8302 {
8303 unsigned int first, last;
8304
8305 GET_OP (op2);
8306 first = op2 >> 4;
8307 last = op2 & 0x0f;
8308 printf ("pop {wR%d", first);
8309 if (last)
8310 printf ("-wR%d", first + last);
8311 printf ("}");
8312 }
8313 else if (op == 0xc7)
8314 {
8315 GET_OP (op2);
8316 if (op2 == 0 || (op2 & 0xf0) != 0)
8317 printf (_("[Spare]"));
0b6ae522
DJ
8318 else
8319 {
61865e30
NC
8320 unsigned int mask = op2 & 0x0f;
8321 int first = 1;
8322 int i;
8323
8324 printf ("pop {");
8325 for (i = 0; i < 4; i++)
8326 if (mask & (1 << i))
8327 {
8328 if (first)
8329 first = 0;
8330 else
8331 printf (", ");
8332 printf ("wCGR%d", i);
8333 }
8334 printf ("}");
0b6ae522
DJ
8335 }
8336 }
61865e30
NC
8337 else
8338 printf (_(" [unsupported opcode]"));
0b6ae522
DJ
8339 printf ("\n");
8340 }
fa197c1c
PB
8341}
8342
8343static void
948f632f
DA
8344decode_tic6x_unwind_bytecode (struct arm_unw_aux_info * aux,
8345 unsigned int word,
8346 unsigned int remaining,
8347 unsigned int more_words,
8348 bfd_vma data_offset,
8349 Elf_Internal_Shdr * data_sec,
8350 struct arm_section * data_arm_sec)
fa197c1c
PB
8351{
8352 struct absaddr addr;
8353
8354 /* Decode the unwinding instructions. */
8355 while (1)
8356 {
8357 unsigned int op, op2;
8358
8359 ADVANCE;
8360 if (remaining == 0)
8361 break;
8362 remaining--;
8363 op = word >> 24;
8364 word <<= 8;
8365
9cf03b7e 8366 printf (" 0x%02x ", op);
fa197c1c
PB
8367
8368 if ((op & 0xc0) == 0x00)
8369 {
8370 int offset = ((op & 0x3f) << 3) + 8;
9cf03b7e 8371 printf (" sp = sp + %d", offset);
fa197c1c
PB
8372 }
8373 else if ((op & 0xc0) == 0x80)
8374 {
8375 GET_OP (op2);
8376 if (op == 0x80 && op2 == 0)
8377 printf (_("Refuse to unwind"));
8378 else
8379 {
8380 unsigned int mask = ((op & 0x1f) << 8) | op2;
8381 if (op & 0x20)
8382 printf ("pop compact {");
8383 else
8384 printf ("pop {");
8385
8386 decode_tic6x_unwind_regmask (mask);
8387 printf("}");
8388 }
8389 }
8390 else if ((op & 0xf0) == 0xc0)
8391 {
8392 unsigned int reg;
8393 unsigned int nregs;
8394 unsigned int i;
8395 const char *name;
a734115a
NC
8396 struct
8397 {
fa197c1c
PB
8398 unsigned int offset;
8399 unsigned int reg;
8400 } regpos[16];
8401
8402 /* Scan entire instruction first so that GET_OP output is not
8403 interleaved with disassembly. */
8404 nregs = 0;
8405 for (i = 0; nregs < (op & 0xf); i++)
8406 {
8407 GET_OP (op2);
8408 reg = op2 >> 4;
8409 if (reg != 0xf)
8410 {
8411 regpos[nregs].offset = i * 2;
8412 regpos[nregs].reg = reg;
8413 nregs++;
8414 }
8415
8416 reg = op2 & 0xf;
8417 if (reg != 0xf)
8418 {
8419 regpos[nregs].offset = i * 2 + 1;
8420 regpos[nregs].reg = reg;
8421 nregs++;
8422 }
8423 }
8424
8425 printf (_("pop frame {"));
8426 reg = nregs - 1;
8427 for (i = i * 2; i > 0; i--)
8428 {
8429 if (regpos[reg].offset == i - 1)
8430 {
8431 name = tic6x_unwind_regnames[regpos[reg].reg];
8432 if (reg > 0)
8433 reg--;
8434 }
8435 else
8436 name = _("[pad]");
8437
8438 fputs (name, stdout);
8439 if (i > 1)
8440 printf (", ");
8441 }
8442
8443 printf ("}");
8444 }
8445 else if (op == 0xd0)
8446 printf (" MOV FP, SP");
8447 else if (op == 0xd1)
8448 printf (" __c6xabi_pop_rts");
8449 else if (op == 0xd2)
8450 {
8451 unsigned char buf[9];
8452 unsigned int i, len;
8453 unsigned long offset;
a734115a 8454
fa197c1c
PB
8455 for (i = 0; i < sizeof (buf); i++)
8456 {
8457 GET_OP (buf[i]);
8458 if ((buf[i] & 0x80) == 0)
8459 break;
8460 }
0eff7165
NC
8461 /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2. */
8462 if (i == sizeof (buf))
8463 {
8464 printf ("<corrupt sp adjust>\n");
8465 warn (_("Corrupt stack pointer adjustment detected\n"));
8466 return;
8467 }
948f632f 8468
f6f0e17b 8469 offset = read_uleb128 (buf, &len, buf + i + 1);
fa197c1c
PB
8470 assert (len == i + 1);
8471 offset = offset * 8 + 0x408;
8472 printf (_("sp = sp + %ld"), offset);
8473 }
8474 else if ((op & 0xf0) == 0xe0)
8475 {
8476 if ((op & 0x0f) == 7)
8477 printf (" RETURN");
8478 else
8479 printf (" MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
8480 }
8481 else
8482 {
8483 printf (_(" [unsupported opcode]"));
8484 }
8485 putchar ('\n');
8486 }
8487}
8488
8489static bfd_vma
a734115a 8490arm_expand_prel31 (bfd_vma word, bfd_vma where)
fa197c1c
PB
8491{
8492 bfd_vma offset;
8493
8494 offset = word & 0x7fffffff;
8495 if (offset & 0x40000000)
8496 offset |= ~ (bfd_vma) 0x7fffffff;
8497
8498 if (elf_header.e_machine == EM_TI_C6000)
8499 offset <<= 1;
8500
8501 return offset + where;
8502}
8503
8504static void
1b31d05e
NC
8505decode_arm_unwind (struct arm_unw_aux_info * aux,
8506 unsigned int word,
8507 unsigned int remaining,
8508 bfd_vma data_offset,
8509 Elf_Internal_Shdr * data_sec,
8510 struct arm_section * data_arm_sec)
fa197c1c
PB
8511{
8512 int per_index;
8513 unsigned int more_words = 0;
37e14bc3 8514 struct absaddr addr;
1b31d05e 8515 bfd_vma sym_name = (bfd_vma) -1;
fa197c1c
PB
8516
8517 if (remaining == 0)
8518 {
1b31d05e
NC
8519 /* Fetch the first word.
8520 Note - when decoding an object file the address extracted
8521 here will always be 0. So we also pass in the sym_name
8522 parameter so that we can find the symbol associated with
8523 the personality routine. */
8524 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, data_offset,
8525 & word, & addr, & sym_name))
fa197c1c 8526 return;
1b31d05e 8527
fa197c1c
PB
8528 remaining = 4;
8529 }
8530
8531 if ((word & 0x80000000) == 0)
8532 {
8533 /* Expand prel31 for personality routine. */
8534 bfd_vma fn;
8535 const char *procname;
8536
a734115a 8537 fn = arm_expand_prel31 (word, data_sec->sh_addr + data_offset);
fa197c1c 8538 printf (_(" Personality routine: "));
1b31d05e
NC
8539 if (fn == 0
8540 && addr.section == SHN_UNDEF && addr.offset == 0
8541 && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
8542 {
8543 procname = aux->strtab + sym_name;
8544 print_vma (fn, PREFIX_HEX);
8545 if (procname)
8546 {
8547 fputs (" <", stdout);
8548 fputs (procname, stdout);
8549 fputc ('>', stdout);
8550 }
8551 }
8552 else
8553 procname = arm_print_vma_and_name (aux, fn, addr);
fa197c1c
PB
8554 fputc ('\n', stdout);
8555
8556 /* The GCC personality routines use the standard compact
8557 encoding, starting with one byte giving the number of
8558 words. */
8559 if (procname != NULL
8560 && (const_strneq (procname, "__gcc_personality_v0")
8561 || const_strneq (procname, "__gxx_personality_v0")
8562 || const_strneq (procname, "__gcj_personality_v0")
8563 || const_strneq (procname, "__gnu_objc_personality_v0")))
8564 {
8565 remaining = 0;
8566 more_words = 1;
8567 ADVANCE;
8568 if (!remaining)
8569 {
8570 printf (_(" [Truncated data]\n"));
8571 return;
8572 }
8573 more_words = word >> 24;
8574 word <<= 8;
8575 remaining--;
8576 per_index = -1;
8577 }
8578 else
8579 return;
8580 }
8581 else
8582 {
1b31d05e 8583 /* ARM EHABI Section 6.3:
0b4362b0 8584
1b31d05e 8585 An exception-handling table entry for the compact model looks like:
0b4362b0 8586
1b31d05e
NC
8587 31 30-28 27-24 23-0
8588 -- ----- ----- ----
8589 1 0 index Data for personalityRoutine[index] */
8590
8591 if (elf_header.e_machine == EM_ARM
8592 && (word & 0x70000000))
83c257ca 8593 warn (_("Corrupt ARM compact model table entry: %x \n"), word);
1b31d05e 8594
fa197c1c 8595 per_index = (word >> 24) & 0x7f;
1b31d05e 8596 printf (_(" Compact model index: %d\n"), per_index);
fa197c1c
PB
8597 if (per_index == 0)
8598 {
8599 more_words = 0;
8600 word <<= 8;
8601 remaining--;
8602 }
8603 else if (per_index < 3)
8604 {
8605 more_words = (word >> 16) & 0xff;
8606 word <<= 16;
8607 remaining -= 2;
8608 }
8609 }
8610
8611 switch (elf_header.e_machine)
8612 {
8613 case EM_ARM:
8614 if (per_index < 3)
8615 {
8616 decode_arm_unwind_bytecode (aux, word, remaining, more_words,
8617 data_offset, data_sec, data_arm_sec);
8618 }
8619 else
1b31d05e
NC
8620 {
8621 warn (_("Unknown ARM compact model index encountered\n"));
8622 printf (_(" [reserved]\n"));
8623 }
fa197c1c
PB
8624 break;
8625
8626 case EM_TI_C6000:
8627 if (per_index < 3)
8628 {
8629 decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
1b31d05e 8630 data_offset, data_sec, data_arm_sec);
fa197c1c
PB
8631 }
8632 else if (per_index < 5)
8633 {
8634 if (((word >> 17) & 0x7f) == 0x7f)
8635 printf (_(" Restore stack from frame pointer\n"));
8636 else
8637 printf (_(" Stack increment %d\n"), (word >> 14) & 0x1fc);
8638 printf (_(" Registers restored: "));
8639 if (per_index == 4)
8640 printf (" (compact) ");
8641 decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
8642 putchar ('\n');
8643 printf (_(" Return register: %s\n"),
8644 tic6x_unwind_regnames[word & 0xf]);
8645 }
8646 else
1b31d05e 8647 printf (_(" [reserved (%d)]\n"), per_index);
fa197c1c
PB
8648 break;
8649
8650 default:
74e1a04b 8651 error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
1b31d05e 8652 elf_header.e_machine);
fa197c1c 8653 }
0b6ae522
DJ
8654
8655 /* Decode the descriptors. Not implemented. */
8656}
8657
8658static void
8659dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
8660{
8661 struct arm_section exidx_arm_sec, extab_arm_sec;
8662 unsigned int i, exidx_len;
948f632f 8663 unsigned long j, nfuns;
0b6ae522
DJ
8664
8665 memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
8666 memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
8667 exidx_len = exidx_sec->sh_size / 8;
8668
948f632f
DA
8669 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
8670 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
8671 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
8672 aux->funtab[nfuns++] = aux->symtab[j];
8673 aux->nfuns = nfuns;
8674 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
8675
0b6ae522
DJ
8676 for (i = 0; i < exidx_len; i++)
8677 {
8678 unsigned int exidx_fn, exidx_entry;
8679 struct absaddr fn_addr, entry_addr;
8680 bfd_vma fn;
8681
8682 fputc ('\n', stdout);
8683
1b31d05e
NC
8684 if (! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8685 8 * i, & exidx_fn, & fn_addr, NULL)
8686 || ! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8687 8 * i + 4, & exidx_entry, & entry_addr, NULL))
0b6ae522 8688 {
948f632f 8689 free (aux->funtab);
1b31d05e
NC
8690 arm_free_section (& exidx_arm_sec);
8691 arm_free_section (& extab_arm_sec);
0b6ae522
DJ
8692 return;
8693 }
8694
83c257ca
NC
8695 /* ARM EHABI, Section 5:
8696 An index table entry consists of 2 words.
8697 The first word contains a prel31 offset to the start of a function, with bit 31 clear. */
8698 if (exidx_fn & 0x80000000)
8699 warn (_("corrupt index table entry: %x\n"), exidx_fn);
8700
a734115a 8701 fn = arm_expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
0b6ae522 8702
a734115a 8703 arm_print_vma_and_name (aux, fn, fn_addr);
0b6ae522
DJ
8704 fputs (": ", stdout);
8705
8706 if (exidx_entry == 1)
8707 {
8708 print_vma (exidx_entry, PREFIX_HEX);
8709 fputs (" [cantunwind]\n", stdout);
8710 }
8711 else if (exidx_entry & 0x80000000)
8712 {
8713 print_vma (exidx_entry, PREFIX_HEX);
8714 fputc ('\n', stdout);
8715 decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
8716 }
8717 else
8718 {
8f73510c 8719 bfd_vma table, table_offset = 0;
0b6ae522
DJ
8720 Elf_Internal_Shdr *table_sec;
8721
8722 fputs ("@", stdout);
a734115a 8723 table = arm_expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
0b6ae522
DJ
8724 print_vma (table, PREFIX_HEX);
8725 printf ("\n");
8726
8727 /* Locate the matching .ARM.extab. */
8728 if (entry_addr.section != SHN_UNDEF
8729 && entry_addr.section < elf_header.e_shnum)
8730 {
8731 table_sec = section_headers + entry_addr.section;
8732 table_offset = entry_addr.offset;
1a915552
NC
8733 /* PR 18879 */
8734 if (table_offset > table_sec->sh_size
8735 || ((bfd_signed_vma) table_offset) < 0)
8736 {
8737 warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
8738 (unsigned long) table_offset,
8739 printable_section_name (table_sec));
8740 continue;
8741 }
0b6ae522
DJ
8742 }
8743 else
8744 {
8745 table_sec = find_section_by_address (table);
8746 if (table_sec != NULL)
8747 table_offset = table - table_sec->sh_addr;
8748 }
8749 if (table_sec == NULL)
8750 {
8751 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
8752 (unsigned long) table);
8753 continue;
8754 }
8755 decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
8756 &extab_arm_sec);
8757 }
8758 }
8759
8760 printf ("\n");
8761
948f632f 8762 free (aux->funtab);
0b6ae522
DJ
8763 arm_free_section (&exidx_arm_sec);
8764 arm_free_section (&extab_arm_sec);
8765}
8766
fa197c1c 8767/* Used for both ARM and C6X unwinding tables. */
1b31d05e
NC
8768
8769static void
0b6ae522
DJ
8770arm_process_unwind (FILE *file)
8771{
8772 struct arm_unw_aux_info aux;
8773 Elf_Internal_Shdr *unwsec = NULL;
8774 Elf_Internal_Shdr *strsec;
8775 Elf_Internal_Shdr *sec;
8776 unsigned long i;
fa197c1c 8777 unsigned int sec_type;
0b6ae522 8778
fa197c1c
PB
8779 switch (elf_header.e_machine)
8780 {
8781 case EM_ARM:
8782 sec_type = SHT_ARM_EXIDX;
8783 break;
8784
8785 case EM_TI_C6000:
8786 sec_type = SHT_C6000_UNWIND;
8787 break;
8788
0b4362b0 8789 default:
74e1a04b 8790 error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
1b31d05e
NC
8791 elf_header.e_machine);
8792 return;
fa197c1c
PB
8793 }
8794
0b6ae522 8795 if (string_table == NULL)
1b31d05e
NC
8796 return;
8797
8798 memset (& aux, 0, sizeof (aux));
8799 aux.file = file;
0b6ae522
DJ
8800
8801 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8802 {
8803 if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
8804 {
ba5cdace 8805 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
0b6ae522
DJ
8806
8807 strsec = section_headers + sec->sh_link;
74e1a04b
NC
8808
8809 /* PR binutils/17531 file: 011-12666-0.004. */
8810 if (aux.strtab != NULL)
8811 {
4082ef84 8812 error (_("Multiple string tables found in file.\n"));
74e1a04b
NC
8813 free (aux.strtab);
8814 }
0b6ae522
DJ
8815 aux.strtab = get_data (NULL, file, strsec->sh_offset,
8816 1, strsec->sh_size, _("string table"));
8817 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8818 }
fa197c1c 8819 else if (sec->sh_type == sec_type)
0b6ae522
DJ
8820 unwsec = sec;
8821 }
8822
1b31d05e 8823 if (unwsec == NULL)
0b6ae522 8824 printf (_("\nThere are no unwind sections in this file.\n"));
1b31d05e
NC
8825 else
8826 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8827 {
8828 if (sec->sh_type == sec_type)
8829 {
8830 printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
74e1a04b 8831 printable_section_name (sec),
1b31d05e
NC
8832 (unsigned long) sec->sh_offset,
8833 (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
0b6ae522 8834
1b31d05e
NC
8835 dump_arm_unwind (&aux, sec);
8836 }
8837 }
0b6ae522
DJ
8838
8839 if (aux.symtab)
8840 free (aux.symtab);
8841 if (aux.strtab)
8842 free ((char *) aux.strtab);
0b6ae522
DJ
8843}
8844
1b31d05e 8845static void
2cf0635d 8846process_unwind (FILE * file)
57346661 8847{
2cf0635d
NC
8848 struct unwind_handler
8849 {
57346661 8850 int machtype;
1b31d05e 8851 void (* handler)(FILE *);
2cf0635d
NC
8852 } handlers[] =
8853 {
0b6ae522 8854 { EM_ARM, arm_process_unwind },
57346661
AM
8855 { EM_IA_64, ia64_process_unwind },
8856 { EM_PARISC, hppa_process_unwind },
fa197c1c 8857 { EM_TI_C6000, arm_process_unwind },
57346661
AM
8858 { 0, 0 }
8859 };
8860 int i;
8861
8862 if (!do_unwind)
1b31d05e 8863 return;
57346661
AM
8864
8865 for (i = 0; handlers[i].handler != NULL; i++)
8866 if (elf_header.e_machine == handlers[i].machtype)
9f758fdc
NC
8867 {
8868 handlers[i].handler (file);
8869 return;
8870 }
57346661 8871
1b31d05e
NC
8872 printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
8873 get_machine_name (elf_header.e_machine));
57346661
AM
8874}
8875
252b5132 8876static void
2cf0635d 8877dynamic_section_mips_val (Elf_Internal_Dyn * entry)
252b5132
RH
8878{
8879 switch (entry->d_tag)
8880 {
8881 case DT_MIPS_FLAGS:
8882 if (entry->d_un.d_val == 0)
4b68bca3 8883 printf (_("NONE"));
252b5132
RH
8884 else
8885 {
8886 static const char * opts[] =
8887 {
8888 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
8889 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
8890 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
8891 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
8892 "RLD_ORDER_SAFE"
8893 };
8894 unsigned int cnt;
8895 int first = 1;
2b692964 8896
60bca95a 8897 for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
252b5132
RH
8898 if (entry->d_un.d_val & (1 << cnt))
8899 {
8900 printf ("%s%s", first ? "" : " ", opts[cnt]);
8901 first = 0;
8902 }
252b5132
RH
8903 }
8904 break;
103f02d3 8905
252b5132 8906 case DT_MIPS_IVERSION:
d79b3d50 8907 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
4b68bca3 8908 printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
252b5132 8909 else
76ca31c0
NC
8910 {
8911 char buf[40];
8912 sprintf_vma (buf, entry->d_un.d_ptr);
8913 /* Note: coded this way so that there is a single string for translation. */
8914 printf (_("<corrupt: %s>"), buf);
8915 }
252b5132 8916 break;
103f02d3 8917
252b5132
RH
8918 case DT_MIPS_TIME_STAMP:
8919 {
d5b07ef4 8920 char timebuf[128];
2cf0635d 8921 struct tm * tmp;
91d6fa6a 8922 time_t atime = entry->d_un.d_val;
82b1b41b 8923
91d6fa6a 8924 tmp = gmtime (&atime);
82b1b41b
NC
8925 /* PR 17531: file: 6accc532. */
8926 if (tmp == NULL)
8927 snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
8928 else
8929 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
8930 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8931 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
4b68bca3 8932 printf (_("Time Stamp: %s"), timebuf);
252b5132
RH
8933 }
8934 break;
103f02d3 8935
252b5132
RH
8936 case DT_MIPS_RLD_VERSION:
8937 case DT_MIPS_LOCAL_GOTNO:
8938 case DT_MIPS_CONFLICTNO:
8939 case DT_MIPS_LIBLISTNO:
8940 case DT_MIPS_SYMTABNO:
8941 case DT_MIPS_UNREFEXTNO:
8942 case DT_MIPS_HIPAGENO:
8943 case DT_MIPS_DELTA_CLASS_NO:
8944 case DT_MIPS_DELTA_INSTANCE_NO:
8945 case DT_MIPS_DELTA_RELOC_NO:
8946 case DT_MIPS_DELTA_SYM_NO:
8947 case DT_MIPS_DELTA_CLASSSYM_NO:
8948 case DT_MIPS_COMPACT_SIZE:
c69075ac 8949 print_vma (entry->d_un.d_val, DEC);
252b5132 8950 break;
103f02d3
UD
8951
8952 default:
4b68bca3 8953 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
103f02d3 8954 }
4b68bca3 8955 putchar ('\n');
103f02d3
UD
8956}
8957
103f02d3 8958static void
2cf0635d 8959dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
103f02d3
UD
8960{
8961 switch (entry->d_tag)
8962 {
8963 case DT_HP_DLD_FLAGS:
8964 {
8965 static struct
8966 {
8967 long int bit;
2cf0635d 8968 const char * str;
5e220199
NC
8969 }
8970 flags[] =
8971 {
8972 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
8973 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
8974 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
8975 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
8976 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
8977 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
8978 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
8979 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
8980 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
8981 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
eec8f817
DA
8982 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
8983 { DT_HP_GST, "HP_GST" },
8984 { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
8985 { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
8986 { DT_HP_NODELETE, "HP_NODELETE" },
8987 { DT_HP_GROUP, "HP_GROUP" },
8988 { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
5e220199 8989 };
103f02d3 8990 int first = 1;
5e220199 8991 size_t cnt;
f7a99963 8992 bfd_vma val = entry->d_un.d_val;
103f02d3 8993
60bca95a 8994 for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
103f02d3 8995 if (val & flags[cnt].bit)
30800947
NC
8996 {
8997 if (! first)
8998 putchar (' ');
8999 fputs (flags[cnt].str, stdout);
9000 first = 0;
9001 val ^= flags[cnt].bit;
9002 }
76da6bbe 9003
103f02d3 9004 if (val != 0 || first)
f7a99963
NC
9005 {
9006 if (! first)
9007 putchar (' ');
9008 print_vma (val, HEX);
9009 }
103f02d3
UD
9010 }
9011 break;
76da6bbe 9012
252b5132 9013 default:
f7a99963
NC
9014 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9015 break;
252b5132 9016 }
35b1837e 9017 putchar ('\n');
252b5132
RH
9018}
9019
28f997cf
TG
9020#ifdef BFD64
9021
9022/* VMS vs Unix time offset and factor. */
9023
9024#define VMS_EPOCH_OFFSET 35067168000000000LL
9025#define VMS_GRANULARITY_FACTOR 10000000
9026
9027/* Display a VMS time in a human readable format. */
9028
9029static void
9030print_vms_time (bfd_int64_t vmstime)
9031{
9032 struct tm *tm;
9033 time_t unxtime;
9034
9035 unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
9036 tm = gmtime (&unxtime);
9037 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
9038 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
9039 tm->tm_hour, tm->tm_min, tm->tm_sec);
9040}
9041#endif /* BFD64 */
9042
ecc51f48 9043static void
2cf0635d 9044dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
ecc51f48
NC
9045{
9046 switch (entry->d_tag)
9047 {
0de14b54 9048 case DT_IA_64_PLT_RESERVE:
bdf4d63a 9049 /* First 3 slots reserved. */
ecc51f48
NC
9050 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9051 printf (" -- ");
9052 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
bdf4d63a
JJ
9053 break;
9054
28f997cf
TG
9055 case DT_IA_64_VMS_LINKTIME:
9056#ifdef BFD64
9057 print_vms_time (entry->d_un.d_val);
9058#endif
9059 break;
9060
9061 case DT_IA_64_VMS_LNKFLAGS:
9062 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9063 if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
9064 printf (" CALL_DEBUG");
9065 if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
9066 printf (" NOP0BUFS");
9067 if (entry->d_un.d_val & VMS_LF_P0IMAGE)
9068 printf (" P0IMAGE");
9069 if (entry->d_un.d_val & VMS_LF_MKTHREADS)
9070 printf (" MKTHREADS");
9071 if (entry->d_un.d_val & VMS_LF_UPCALLS)
9072 printf (" UPCALLS");
9073 if (entry->d_un.d_val & VMS_LF_IMGSTA)
9074 printf (" IMGSTA");
9075 if (entry->d_un.d_val & VMS_LF_INITIALIZE)
9076 printf (" INITIALIZE");
9077 if (entry->d_un.d_val & VMS_LF_MAIN)
9078 printf (" MAIN");
9079 if (entry->d_un.d_val & VMS_LF_EXE_INIT)
9080 printf (" EXE_INIT");
9081 if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
9082 printf (" TBK_IN_IMG");
9083 if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
9084 printf (" DBG_IN_IMG");
9085 if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
9086 printf (" TBK_IN_DSF");
9087 if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
9088 printf (" DBG_IN_DSF");
9089 if (entry->d_un.d_val & VMS_LF_SIGNATURES)
9090 printf (" SIGNATURES");
9091 if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
9092 printf (" REL_SEG_OFF");
9093 break;
9094
bdf4d63a
JJ
9095 default:
9096 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9097 break;
ecc51f48 9098 }
bdf4d63a 9099 putchar ('\n');
ecc51f48
NC
9100}
9101
252b5132 9102static int
2cf0635d 9103get_32bit_dynamic_section (FILE * file)
252b5132 9104{
2cf0635d
NC
9105 Elf32_External_Dyn * edyn;
9106 Elf32_External_Dyn * ext;
9107 Elf_Internal_Dyn * entry;
103f02d3 9108
3f5e193b
NC
9109 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
9110 dynamic_size, _("dynamic section"));
a6e9f9df
AM
9111 if (!edyn)
9112 return 0;
103f02d3 9113
071436c6
NC
9114 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9115 might not have the luxury of section headers. Look for the DT_NULL
9116 terminator to determine the number of entries. */
ba2685cc 9117 for (ext = edyn, dynamic_nent = 0;
53c3012c 9118 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
ba2685cc
AM
9119 ext++)
9120 {
9121 dynamic_nent++;
9122 if (BYTE_GET (ext->d_tag) == DT_NULL)
9123 break;
9124 }
252b5132 9125
3f5e193b
NC
9126 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9127 sizeof (* entry));
b2d38a17 9128 if (dynamic_section == NULL)
252b5132 9129 {
8b73c356
NC
9130 error (_("Out of memory allocating space for %lu dynamic entries\n"),
9131 (unsigned long) dynamic_nent);
9ea033b2
NC
9132 free (edyn);
9133 return 0;
9134 }
252b5132 9135
fb514b26 9136 for (ext = edyn, entry = dynamic_section;
ba2685cc 9137 entry < dynamic_section + dynamic_nent;
fb514b26 9138 ext++, entry++)
9ea033b2 9139 {
fb514b26
AM
9140 entry->d_tag = BYTE_GET (ext->d_tag);
9141 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
252b5132
RH
9142 }
9143
9ea033b2
NC
9144 free (edyn);
9145
9146 return 1;
9147}
9148
9149static int
2cf0635d 9150get_64bit_dynamic_section (FILE * file)
9ea033b2 9151{
2cf0635d
NC
9152 Elf64_External_Dyn * edyn;
9153 Elf64_External_Dyn * ext;
9154 Elf_Internal_Dyn * entry;
103f02d3 9155
071436c6 9156 /* Read in the data. */
3f5e193b
NC
9157 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
9158 dynamic_size, _("dynamic section"));
a6e9f9df
AM
9159 if (!edyn)
9160 return 0;
103f02d3 9161
071436c6
NC
9162 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9163 might not have the luxury of section headers. Look for the DT_NULL
9164 terminator to determine the number of entries. */
ba2685cc 9165 for (ext = edyn, dynamic_nent = 0;
53c3012c
AM
9166 /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer. */
9167 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
ba2685cc
AM
9168 ext++)
9169 {
9170 dynamic_nent++;
66543521 9171 if (BYTE_GET (ext->d_tag) == DT_NULL)
ba2685cc
AM
9172 break;
9173 }
252b5132 9174
3f5e193b
NC
9175 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9176 sizeof (* entry));
b2d38a17 9177 if (dynamic_section == NULL)
252b5132 9178 {
8b73c356
NC
9179 error (_("Out of memory allocating space for %lu dynamic entries\n"),
9180 (unsigned long) dynamic_nent);
252b5132
RH
9181 free (edyn);
9182 return 0;
9183 }
9184
071436c6 9185 /* Convert from external to internal formats. */
fb514b26 9186 for (ext = edyn, entry = dynamic_section;
ba2685cc 9187 entry < dynamic_section + dynamic_nent;
fb514b26 9188 ext++, entry++)
252b5132 9189 {
66543521
AM
9190 entry->d_tag = BYTE_GET (ext->d_tag);
9191 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
252b5132
RH
9192 }
9193
9194 free (edyn);
9195
9ea033b2
NC
9196 return 1;
9197}
9198
e9e44622
JJ
9199static void
9200print_dynamic_flags (bfd_vma flags)
d1133906 9201{
e9e44622 9202 int first = 1;
13ae64f3 9203
d1133906
NC
9204 while (flags)
9205 {
9206 bfd_vma flag;
9207
9208 flag = flags & - flags;
9209 flags &= ~ flag;
9210
e9e44622
JJ
9211 if (first)
9212 first = 0;
9213 else
9214 putc (' ', stdout);
13ae64f3 9215
d1133906
NC
9216 switch (flag)
9217 {
e9e44622
JJ
9218 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
9219 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
9220 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
9221 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
9222 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
2b692964 9223 default: fputs (_("unknown"), stdout); break;
d1133906
NC
9224 }
9225 }
e9e44622 9226 puts ("");
d1133906
NC
9227}
9228
b2d38a17
NC
9229/* Parse and display the contents of the dynamic section. */
9230
9ea033b2 9231static int
2cf0635d 9232process_dynamic_section (FILE * file)
9ea033b2 9233{
2cf0635d 9234 Elf_Internal_Dyn * entry;
9ea033b2
NC
9235
9236 if (dynamic_size == 0)
9237 {
9238 if (do_dynamic)
b2d38a17 9239 printf (_("\nThere is no dynamic section in this file.\n"));
9ea033b2
NC
9240
9241 return 1;
9242 }
9243
9244 if (is_32bit_elf)
9245 {
b2d38a17 9246 if (! get_32bit_dynamic_section (file))
9ea033b2
NC
9247 return 0;
9248 }
b2d38a17 9249 else if (! get_64bit_dynamic_section (file))
9ea033b2
NC
9250 return 0;
9251
252b5132
RH
9252 /* Find the appropriate symbol table. */
9253 if (dynamic_symbols == NULL)
9254 {
86dba8ee
AM
9255 for (entry = dynamic_section;
9256 entry < dynamic_section + dynamic_nent;
9257 ++entry)
252b5132 9258 {
c8286bd1 9259 Elf_Internal_Shdr section;
252b5132
RH
9260
9261 if (entry->d_tag != DT_SYMTAB)
9262 continue;
9263
9264 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
9265
9266 /* Since we do not know how big the symbol table is,
9267 we default to reading in the entire file (!) and
9268 processing that. This is overkill, I know, but it
e3c8793a 9269 should work. */
d93f0186 9270 section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
252b5132 9271
fb52b2f4
NC
9272 if (archive_file_offset != 0)
9273 section.sh_size = archive_file_size - section.sh_offset;
9274 else
9275 {
9276 if (fseek (file, 0, SEEK_END))
591a748a 9277 error (_("Unable to seek to end of file!\n"));
fb52b2f4
NC
9278
9279 section.sh_size = ftell (file) - section.sh_offset;
9280 }
252b5132 9281
9ea033b2 9282 if (is_32bit_elf)
9ad5cbcf 9283 section.sh_entsize = sizeof (Elf32_External_Sym);
9ea033b2 9284 else
9ad5cbcf 9285 section.sh_entsize = sizeof (Elf64_External_Sym);
071436c6 9286 section.sh_name = string_table_length;
252b5132 9287
ba5cdace 9288 dynamic_symbols = GET_ELF_SYMBOLS (file, &section, & num_dynamic_syms);
19936277 9289 if (num_dynamic_syms < 1)
252b5132
RH
9290 {
9291 error (_("Unable to determine the number of symbols to load\n"));
9292 continue;
9293 }
252b5132
RH
9294 }
9295 }
9296
9297 /* Similarly find a string table. */
9298 if (dynamic_strings == NULL)
9299 {
86dba8ee
AM
9300 for (entry = dynamic_section;
9301 entry < dynamic_section + dynamic_nent;
9302 ++entry)
252b5132
RH
9303 {
9304 unsigned long offset;
b34976b6 9305 long str_tab_len;
252b5132
RH
9306
9307 if (entry->d_tag != DT_STRTAB)
9308 continue;
9309
9310 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
9311
9312 /* Since we do not know how big the string table is,
9313 we default to reading in the entire file (!) and
9314 processing that. This is overkill, I know, but it
e3c8793a 9315 should work. */
252b5132 9316
d93f0186 9317 offset = offset_from_vma (file, entry->d_un.d_val, 0);
fb52b2f4
NC
9318
9319 if (archive_file_offset != 0)
9320 str_tab_len = archive_file_size - offset;
9321 else
9322 {
9323 if (fseek (file, 0, SEEK_END))
9324 error (_("Unable to seek to end of file\n"));
9325 str_tab_len = ftell (file) - offset;
9326 }
252b5132
RH
9327
9328 if (str_tab_len < 1)
9329 {
9330 error
9331 (_("Unable to determine the length of the dynamic string table\n"));
9332 continue;
9333 }
9334
3f5e193b
NC
9335 dynamic_strings = (char *) get_data (NULL, file, offset, 1,
9336 str_tab_len,
9337 _("dynamic string table"));
59245841 9338 dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
252b5132
RH
9339 break;
9340 }
9341 }
9342
9343 /* And find the syminfo section if available. */
9344 if (dynamic_syminfo == NULL)
9345 {
3e8bba36 9346 unsigned long syminsz = 0;
252b5132 9347
86dba8ee
AM
9348 for (entry = dynamic_section;
9349 entry < dynamic_section + dynamic_nent;
9350 ++entry)
252b5132
RH
9351 {
9352 if (entry->d_tag == DT_SYMINENT)
9353 {
9354 /* Note: these braces are necessary to avoid a syntax
9355 error from the SunOS4 C compiler. */
049b0c3a
NC
9356 /* PR binutils/17531: A corrupt file can trigger this test.
9357 So do not use an assert, instead generate an error message. */
9358 if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
071436c6 9359 error (_("Bad value (%d) for SYMINENT entry\n"),
049b0c3a 9360 (int) entry->d_un.d_val);
252b5132
RH
9361 }
9362 else if (entry->d_tag == DT_SYMINSZ)
9363 syminsz = entry->d_un.d_val;
9364 else if (entry->d_tag == DT_SYMINFO)
d93f0186
NC
9365 dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
9366 syminsz);
252b5132
RH
9367 }
9368
9369 if (dynamic_syminfo_offset != 0 && syminsz != 0)
9370 {
2cf0635d
NC
9371 Elf_External_Syminfo * extsyminfo;
9372 Elf_External_Syminfo * extsym;
9373 Elf_Internal_Syminfo * syminfo;
252b5132
RH
9374
9375 /* There is a syminfo section. Read the data. */
3f5e193b
NC
9376 extsyminfo = (Elf_External_Syminfo *)
9377 get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
9378 _("symbol information"));
a6e9f9df
AM
9379 if (!extsyminfo)
9380 return 0;
252b5132 9381
3f5e193b 9382 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
252b5132
RH
9383 if (dynamic_syminfo == NULL)
9384 {
8b73c356
NC
9385 error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9386 (unsigned long) syminsz);
252b5132
RH
9387 return 0;
9388 }
9389
9390 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
86dba8ee
AM
9391 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
9392 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
9393 ++syminfo, ++extsym)
252b5132 9394 {
86dba8ee
AM
9395 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
9396 syminfo->si_flags = BYTE_GET (extsym->si_flags);
252b5132
RH
9397 }
9398
9399 free (extsyminfo);
9400 }
9401 }
9402
9403 if (do_dynamic && dynamic_addr)
8b73c356
NC
9404 printf (_("\nDynamic section at offset 0x%lx contains %lu entries:\n"),
9405 dynamic_addr, (unsigned long) dynamic_nent);
252b5132
RH
9406 if (do_dynamic)
9407 printf (_(" Tag Type Name/Value\n"));
9408
86dba8ee
AM
9409 for (entry = dynamic_section;
9410 entry < dynamic_section + dynamic_nent;
9411 entry++)
252b5132
RH
9412 {
9413 if (do_dynamic)
f7a99963 9414 {
2cf0635d 9415 const char * dtype;
e699b9ff 9416
f7a99963
NC
9417 putchar (' ');
9418 print_vma (entry->d_tag, FULL_HEX);
e699b9ff
ILT
9419 dtype = get_dynamic_type (entry->d_tag);
9420 printf (" (%s)%*s", dtype,
9421 ((is_32bit_elf ? 27 : 19)
9422 - (int) strlen (dtype)),
f7a99963
NC
9423 " ");
9424 }
252b5132
RH
9425
9426 switch (entry->d_tag)
9427 {
d1133906
NC
9428 case DT_FLAGS:
9429 if (do_dynamic)
e9e44622 9430 print_dynamic_flags (entry->d_un.d_val);
d1133906 9431 break;
76da6bbe 9432
252b5132
RH
9433 case DT_AUXILIARY:
9434 case DT_FILTER:
019148e4
L
9435 case DT_CONFIG:
9436 case DT_DEPAUDIT:
9437 case DT_AUDIT:
252b5132
RH
9438 if (do_dynamic)
9439 {
019148e4 9440 switch (entry->d_tag)
b34976b6 9441 {
019148e4
L
9442 case DT_AUXILIARY:
9443 printf (_("Auxiliary library"));
9444 break;
9445
9446 case DT_FILTER:
9447 printf (_("Filter library"));
9448 break;
9449
b34976b6 9450 case DT_CONFIG:
019148e4
L
9451 printf (_("Configuration file"));
9452 break;
9453
9454 case DT_DEPAUDIT:
9455 printf (_("Dependency audit library"));
9456 break;
9457
9458 case DT_AUDIT:
9459 printf (_("Audit library"));
9460 break;
9461 }
252b5132 9462
d79b3d50
NC
9463 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9464 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
252b5132 9465 else
f7a99963
NC
9466 {
9467 printf (": ");
9468 print_vma (entry->d_un.d_val, PREFIX_HEX);
9469 putchar ('\n');
9470 }
252b5132
RH
9471 }
9472 break;
9473
dcefbbbd 9474 case DT_FEATURE:
252b5132
RH
9475 if (do_dynamic)
9476 {
9477 printf (_("Flags:"));
86f55779 9478
252b5132
RH
9479 if (entry->d_un.d_val == 0)
9480 printf (_(" None\n"));
9481 else
9482 {
9483 unsigned long int val = entry->d_un.d_val;
86f55779 9484
252b5132
RH
9485 if (val & DTF_1_PARINIT)
9486 {
9487 printf (" PARINIT");
9488 val ^= DTF_1_PARINIT;
9489 }
dcefbbbd
L
9490 if (val & DTF_1_CONFEXP)
9491 {
9492 printf (" CONFEXP");
9493 val ^= DTF_1_CONFEXP;
9494 }
252b5132
RH
9495 if (val != 0)
9496 printf (" %lx", val);
9497 puts ("");
9498 }
9499 }
9500 break;
9501
9502 case DT_POSFLAG_1:
9503 if (do_dynamic)
9504 {
9505 printf (_("Flags:"));
86f55779 9506
252b5132
RH
9507 if (entry->d_un.d_val == 0)
9508 printf (_(" None\n"));
9509 else
9510 {
9511 unsigned long int val = entry->d_un.d_val;
86f55779 9512
252b5132
RH
9513 if (val & DF_P1_LAZYLOAD)
9514 {
9515 printf (" LAZYLOAD");
9516 val ^= DF_P1_LAZYLOAD;
9517 }
9518 if (val & DF_P1_GROUPPERM)
9519 {
9520 printf (" GROUPPERM");
9521 val ^= DF_P1_GROUPPERM;
9522 }
9523 if (val != 0)
9524 printf (" %lx", val);
9525 puts ("");
9526 }
9527 }
9528 break;
9529
9530 case DT_FLAGS_1:
9531 if (do_dynamic)
9532 {
9533 printf (_("Flags:"));
9534 if (entry->d_un.d_val == 0)
9535 printf (_(" None\n"));
9536 else
9537 {
9538 unsigned long int val = entry->d_un.d_val;
86f55779 9539
252b5132
RH
9540 if (val & DF_1_NOW)
9541 {
9542 printf (" NOW");
9543 val ^= DF_1_NOW;
9544 }
9545 if (val & DF_1_GLOBAL)
9546 {
9547 printf (" GLOBAL");
9548 val ^= DF_1_GLOBAL;
9549 }
9550 if (val & DF_1_GROUP)
9551 {
9552 printf (" GROUP");
9553 val ^= DF_1_GROUP;
9554 }
9555 if (val & DF_1_NODELETE)
9556 {
9557 printf (" NODELETE");
9558 val ^= DF_1_NODELETE;
9559 }
9560 if (val & DF_1_LOADFLTR)
9561 {
9562 printf (" LOADFLTR");
9563 val ^= DF_1_LOADFLTR;
9564 }
9565 if (val & DF_1_INITFIRST)
9566 {
9567 printf (" INITFIRST");
9568 val ^= DF_1_INITFIRST;
9569 }
9570 if (val & DF_1_NOOPEN)
9571 {
9572 printf (" NOOPEN");
9573 val ^= DF_1_NOOPEN;
9574 }
9575 if (val & DF_1_ORIGIN)
9576 {
9577 printf (" ORIGIN");
9578 val ^= DF_1_ORIGIN;
9579 }
9580 if (val & DF_1_DIRECT)
9581 {
9582 printf (" DIRECT");
9583 val ^= DF_1_DIRECT;
9584 }
9585 if (val & DF_1_TRANS)
9586 {
9587 printf (" TRANS");
9588 val ^= DF_1_TRANS;
9589 }
9590 if (val & DF_1_INTERPOSE)
9591 {
9592 printf (" INTERPOSE");
9593 val ^= DF_1_INTERPOSE;
9594 }
f7db6139 9595 if (val & DF_1_NODEFLIB)
dcefbbbd 9596 {
f7db6139
L
9597 printf (" NODEFLIB");
9598 val ^= DF_1_NODEFLIB;
dcefbbbd
L
9599 }
9600 if (val & DF_1_NODUMP)
9601 {
9602 printf (" NODUMP");
9603 val ^= DF_1_NODUMP;
9604 }
34b60028 9605 if (val & DF_1_CONFALT)
dcefbbbd 9606 {
34b60028
L
9607 printf (" CONFALT");
9608 val ^= DF_1_CONFALT;
9609 }
9610 if (val & DF_1_ENDFILTEE)
9611 {
9612 printf (" ENDFILTEE");
9613 val ^= DF_1_ENDFILTEE;
9614 }
9615 if (val & DF_1_DISPRELDNE)
9616 {
9617 printf (" DISPRELDNE");
9618 val ^= DF_1_DISPRELDNE;
9619 }
9620 if (val & DF_1_DISPRELPND)
9621 {
9622 printf (" DISPRELPND");
9623 val ^= DF_1_DISPRELPND;
9624 }
9625 if (val & DF_1_NODIRECT)
9626 {
9627 printf (" NODIRECT");
9628 val ^= DF_1_NODIRECT;
9629 }
9630 if (val & DF_1_IGNMULDEF)
9631 {
9632 printf (" IGNMULDEF");
9633 val ^= DF_1_IGNMULDEF;
9634 }
9635 if (val & DF_1_NOKSYMS)
9636 {
9637 printf (" NOKSYMS");
9638 val ^= DF_1_NOKSYMS;
9639 }
9640 if (val & DF_1_NOHDR)
9641 {
9642 printf (" NOHDR");
9643 val ^= DF_1_NOHDR;
9644 }
9645 if (val & DF_1_EDITED)
9646 {
9647 printf (" EDITED");
9648 val ^= DF_1_EDITED;
9649 }
9650 if (val & DF_1_NORELOC)
9651 {
9652 printf (" NORELOC");
9653 val ^= DF_1_NORELOC;
9654 }
9655 if (val & DF_1_SYMINTPOSE)
9656 {
9657 printf (" SYMINTPOSE");
9658 val ^= DF_1_SYMINTPOSE;
9659 }
9660 if (val & DF_1_GLOBAUDIT)
9661 {
9662 printf (" GLOBAUDIT");
9663 val ^= DF_1_GLOBAUDIT;
9664 }
9665 if (val & DF_1_SINGLETON)
9666 {
9667 printf (" SINGLETON");
9668 val ^= DF_1_SINGLETON;
dcefbbbd 9669 }
5c383f02
RO
9670 if (val & DF_1_STUB)
9671 {
9672 printf (" STUB");
9673 val ^= DF_1_STUB;
9674 }
9675 if (val & DF_1_PIE)
9676 {
9677 printf (" PIE");
9678 val ^= DF_1_PIE;
9679 }
252b5132
RH
9680 if (val != 0)
9681 printf (" %lx", val);
9682 puts ("");
9683 }
9684 }
9685 break;
9686
9687 case DT_PLTREL:
566b0d53 9688 dynamic_info[entry->d_tag] = entry->d_un.d_val;
252b5132
RH
9689 if (do_dynamic)
9690 puts (get_dynamic_type (entry->d_un.d_val));
9691 break;
9692
9693 case DT_NULL :
9694 case DT_NEEDED :
9695 case DT_PLTGOT :
9696 case DT_HASH :
9697 case DT_STRTAB :
9698 case DT_SYMTAB :
9699 case DT_RELA :
9700 case DT_INIT :
9701 case DT_FINI :
9702 case DT_SONAME :
9703 case DT_RPATH :
9704 case DT_SYMBOLIC:
9705 case DT_REL :
9706 case DT_DEBUG :
9707 case DT_TEXTREL :
9708 case DT_JMPREL :
019148e4 9709 case DT_RUNPATH :
252b5132
RH
9710 dynamic_info[entry->d_tag] = entry->d_un.d_val;
9711
9712 if (do_dynamic)
9713 {
2cf0635d 9714 char * name;
252b5132 9715
d79b3d50
NC
9716 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9717 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
252b5132 9718 else
d79b3d50 9719 name = NULL;
252b5132
RH
9720
9721 if (name)
9722 {
9723 switch (entry->d_tag)
9724 {
9725 case DT_NEEDED:
9726 printf (_("Shared library: [%s]"), name);
9727
18bd398b 9728 if (streq (name, program_interpreter))
f7a99963 9729 printf (_(" program interpreter"));
252b5132
RH
9730 break;
9731
9732 case DT_SONAME:
f7a99963 9733 printf (_("Library soname: [%s]"), name);
252b5132
RH
9734 break;
9735
9736 case DT_RPATH:
f7a99963 9737 printf (_("Library rpath: [%s]"), name);
252b5132
RH
9738 break;
9739
019148e4
L
9740 case DT_RUNPATH:
9741 printf (_("Library runpath: [%s]"), name);
9742 break;
9743
252b5132 9744 default:
f7a99963
NC
9745 print_vma (entry->d_un.d_val, PREFIX_HEX);
9746 break;
252b5132
RH
9747 }
9748 }
9749 else
f7a99963
NC
9750 print_vma (entry->d_un.d_val, PREFIX_HEX);
9751
9752 putchar ('\n');
252b5132
RH
9753 }
9754 break;
9755
9756 case DT_PLTRELSZ:
9757 case DT_RELASZ :
9758 case DT_STRSZ :
9759 case DT_RELSZ :
9760 case DT_RELAENT :
9761 case DT_SYMENT :
9762 case DT_RELENT :
566b0d53 9763 dynamic_info[entry->d_tag] = entry->d_un.d_val;
1a0670f3 9764 /* Fall through. */
252b5132
RH
9765 case DT_PLTPADSZ:
9766 case DT_MOVEENT :
9767 case DT_MOVESZ :
9768 case DT_INIT_ARRAYSZ:
9769 case DT_FINI_ARRAYSZ:
047b2264
JJ
9770 case DT_GNU_CONFLICTSZ:
9771 case DT_GNU_LIBLISTSZ:
252b5132 9772 if (do_dynamic)
f7a99963
NC
9773 {
9774 print_vma (entry->d_un.d_val, UNSIGNED);
2b692964 9775 printf (_(" (bytes)\n"));
f7a99963 9776 }
252b5132
RH
9777 break;
9778
9779 case DT_VERDEFNUM:
9780 case DT_VERNEEDNUM:
9781 case DT_RELACOUNT:
9782 case DT_RELCOUNT:
9783 if (do_dynamic)
f7a99963
NC
9784 {
9785 print_vma (entry->d_un.d_val, UNSIGNED);
9786 putchar ('\n');
9787 }
252b5132
RH
9788 break;
9789
9790 case DT_SYMINSZ:
9791 case DT_SYMINENT:
9792 case DT_SYMINFO:
9793 case DT_USED:
9794 case DT_INIT_ARRAY:
9795 case DT_FINI_ARRAY:
9796 if (do_dynamic)
9797 {
d79b3d50
NC
9798 if (entry->d_tag == DT_USED
9799 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
252b5132 9800 {
2cf0635d 9801 char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
252b5132 9802
b34976b6 9803 if (*name)
252b5132
RH
9804 {
9805 printf (_("Not needed object: [%s]\n"), name);
9806 break;
9807 }
9808 }
103f02d3 9809
f7a99963
NC
9810 print_vma (entry->d_un.d_val, PREFIX_HEX);
9811 putchar ('\n');
252b5132
RH
9812 }
9813 break;
9814
9815 case DT_BIND_NOW:
9816 /* The value of this entry is ignored. */
35b1837e
AM
9817 if (do_dynamic)
9818 putchar ('\n');
252b5132 9819 break;
103f02d3 9820
047b2264
JJ
9821 case DT_GNU_PRELINKED:
9822 if (do_dynamic)
9823 {
2cf0635d 9824 struct tm * tmp;
91d6fa6a 9825 time_t atime = entry->d_un.d_val;
047b2264 9826
91d6fa6a 9827 tmp = gmtime (&atime);
071436c6
NC
9828 /* PR 17533 file: 041-1244816-0.004. */
9829 if (tmp == NULL)
5a2cbcf4
L
9830 printf (_("<corrupt time val: %lx"),
9831 (unsigned long) atime);
071436c6
NC
9832 else
9833 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
9834 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9835 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
047b2264
JJ
9836
9837 }
9838 break;
9839
fdc90cb4
JJ
9840 case DT_GNU_HASH:
9841 dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
9842 if (do_dynamic)
9843 {
9844 print_vma (entry->d_un.d_val, PREFIX_HEX);
9845 putchar ('\n');
9846 }
9847 break;
9848
252b5132
RH
9849 default:
9850 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
b34976b6 9851 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
252b5132
RH
9852 entry->d_un.d_val;
9853
9854 if (do_dynamic)
9855 {
9856 switch (elf_header.e_machine)
9857 {
9858 case EM_MIPS:
4fe85591 9859 case EM_MIPS_RS3_LE:
b2d38a17 9860 dynamic_section_mips_val (entry);
252b5132 9861 break;
103f02d3 9862 case EM_PARISC:
b2d38a17 9863 dynamic_section_parisc_val (entry);
103f02d3 9864 break;
ecc51f48 9865 case EM_IA_64:
b2d38a17 9866 dynamic_section_ia64_val (entry);
ecc51f48 9867 break;
252b5132 9868 default:
f7a99963
NC
9869 print_vma (entry->d_un.d_val, PREFIX_HEX);
9870 putchar ('\n');
252b5132
RH
9871 }
9872 }
9873 break;
9874 }
9875 }
9876
9877 return 1;
9878}
9879
9880static char *
d3ba0551 9881get_ver_flags (unsigned int flags)
252b5132 9882{
b34976b6 9883 static char buff[32];
252b5132
RH
9884
9885 buff[0] = 0;
9886
9887 if (flags == 0)
9888 return _("none");
9889
9890 if (flags & VER_FLG_BASE)
9891 strcat (buff, "BASE ");
9892
9893 if (flags & VER_FLG_WEAK)
9894 {
9895 if (flags & VER_FLG_BASE)
9896 strcat (buff, "| ");
9897
9898 strcat (buff, "WEAK ");
9899 }
9900
44ec90b9
RO
9901 if (flags & VER_FLG_INFO)
9902 {
9903 if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
9904 strcat (buff, "| ");
9905
9906 strcat (buff, "INFO ");
9907 }
9908
9909 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
2b692964 9910 strcat (buff, _("| <unknown>"));
252b5132
RH
9911
9912 return buff;
9913}
9914
9915/* Display the contents of the version sections. */
98fb390a 9916
252b5132 9917static int
2cf0635d 9918process_version_sections (FILE * file)
252b5132 9919{
2cf0635d 9920 Elf_Internal_Shdr * section;
b34976b6
AM
9921 unsigned i;
9922 int found = 0;
252b5132
RH
9923
9924 if (! do_version)
9925 return 1;
9926
9927 for (i = 0, section = section_headers;
9928 i < elf_header.e_shnum;
b34976b6 9929 i++, section++)
252b5132
RH
9930 {
9931 switch (section->sh_type)
9932 {
9933 case SHT_GNU_verdef:
9934 {
2cf0635d 9935 Elf_External_Verdef * edefs;
b34976b6
AM
9936 unsigned int idx;
9937 unsigned int cnt;
2cf0635d 9938 char * endbuf;
252b5132
RH
9939
9940 found = 1;
9941
74e1a04b
NC
9942 printf (_("\nVersion definition section '%s' contains %u entries:\n"),
9943 printable_section_name (section),
9944 section->sh_info);
252b5132
RH
9945
9946 printf (_(" Addr: 0x"));
9947 printf_vma (section->sh_addr);
74e1a04b 9948 printf (_(" Offset: %#08lx Link: %u (%s)"),
1b228002 9949 (unsigned long) section->sh_offset, section->sh_link,
74e1a04b 9950 printable_section_name_from_index (section->sh_link));
252b5132 9951
3f5e193b
NC
9952 edefs = (Elf_External_Verdef *)
9953 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
9954 _("version definition section"));
a6e9f9df
AM
9955 if (!edefs)
9956 break;
59245841 9957 endbuf = (char *) edefs + section->sh_size;
252b5132 9958
b34976b6 9959 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
252b5132 9960 {
2cf0635d
NC
9961 char * vstart;
9962 Elf_External_Verdef * edef;
b34976b6 9963 Elf_Internal_Verdef ent;
2cf0635d 9964 Elf_External_Verdaux * eaux;
b34976b6
AM
9965 Elf_Internal_Verdaux aux;
9966 int j;
9967 int isum;
103f02d3 9968
222c2bf0 9969 /* Check for very large indices. */
7e26601c 9970 if (idx > (size_t) (endbuf - (char *) edefs))
dd24e3da
NC
9971 break;
9972
252b5132 9973 vstart = ((char *) edefs) + idx;
54806181
AM
9974 if (vstart + sizeof (*edef) > endbuf)
9975 break;
252b5132
RH
9976
9977 edef = (Elf_External_Verdef *) vstart;
9978
9979 ent.vd_version = BYTE_GET (edef->vd_version);
9980 ent.vd_flags = BYTE_GET (edef->vd_flags);
9981 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
9982 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
9983 ent.vd_hash = BYTE_GET (edef->vd_hash);
9984 ent.vd_aux = BYTE_GET (edef->vd_aux);
9985 ent.vd_next = BYTE_GET (edef->vd_next);
9986
9987 printf (_(" %#06x: Rev: %d Flags: %s"),
9988 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
9989
9990 printf (_(" Index: %d Cnt: %d "),
9991 ent.vd_ndx, ent.vd_cnt);
9992
dd24e3da 9993 /* Check for overflow. */
7e26601c 9994 if (ent.vd_aux > (size_t) (endbuf - vstart))
dd24e3da
NC
9995 break;
9996
252b5132
RH
9997 vstart += ent.vd_aux;
9998
9999 eaux = (Elf_External_Verdaux *) vstart;
10000
10001 aux.vda_name = BYTE_GET (eaux->vda_name);
10002 aux.vda_next = BYTE_GET (eaux->vda_next);
10003
d79b3d50
NC
10004 if (VALID_DYNAMIC_NAME (aux.vda_name))
10005 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
252b5132
RH
10006 else
10007 printf (_("Name index: %ld\n"), aux.vda_name);
10008
10009 isum = idx + ent.vd_aux;
10010
b34976b6 10011 for (j = 1; j < ent.vd_cnt; j++)
252b5132 10012 {
dd24e3da 10013 /* Check for overflow. */
7e26601c 10014 if (aux.vda_next > (size_t) (endbuf - vstart))
dd24e3da
NC
10015 break;
10016
252b5132
RH
10017 isum += aux.vda_next;
10018 vstart += aux.vda_next;
10019
10020 eaux = (Elf_External_Verdaux *) vstart;
54806181
AM
10021 if (vstart + sizeof (*eaux) > endbuf)
10022 break;
252b5132
RH
10023
10024 aux.vda_name = BYTE_GET (eaux->vda_name);
10025 aux.vda_next = BYTE_GET (eaux->vda_next);
10026
d79b3d50 10027 if (VALID_DYNAMIC_NAME (aux.vda_name))
252b5132 10028 printf (_(" %#06x: Parent %d: %s\n"),
d79b3d50 10029 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
252b5132
RH
10030 else
10031 printf (_(" %#06x: Parent %d, name index: %ld\n"),
10032 isum, j, aux.vda_name);
10033 }
dd24e3da 10034
54806181
AM
10035 if (j < ent.vd_cnt)
10036 printf (_(" Version def aux past end of section\n"));
252b5132 10037
5d921cbd
NC
10038 /* PR 17531: file: id:000001,src:000172+005151,op:splice,rep:2. */
10039 if (idx + ent.vd_next <= idx)
10040 break;
10041
252b5132
RH
10042 idx += ent.vd_next;
10043 }
dd24e3da 10044
54806181
AM
10045 if (cnt < section->sh_info)
10046 printf (_(" Version definition past end of section\n"));
252b5132
RH
10047
10048 free (edefs);
10049 }
10050 break;
103f02d3 10051
252b5132
RH
10052 case SHT_GNU_verneed:
10053 {
2cf0635d 10054 Elf_External_Verneed * eneed;
b34976b6
AM
10055 unsigned int idx;
10056 unsigned int cnt;
2cf0635d 10057 char * endbuf;
252b5132
RH
10058
10059 found = 1;
10060
72de5009 10061 printf (_("\nVersion needs section '%s' contains %u entries:\n"),
74e1a04b 10062 printable_section_name (section), section->sh_info);
252b5132
RH
10063
10064 printf (_(" Addr: 0x"));
10065 printf_vma (section->sh_addr);
72de5009 10066 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
1b228002 10067 (unsigned long) section->sh_offset, section->sh_link,
74e1a04b 10068 printable_section_name_from_index (section->sh_link));
252b5132 10069
3f5e193b
NC
10070 eneed = (Elf_External_Verneed *) get_data (NULL, file,
10071 section->sh_offset, 1,
10072 section->sh_size,
9cf03b7e 10073 _("Version Needs section"));
a6e9f9df
AM
10074 if (!eneed)
10075 break;
59245841 10076 endbuf = (char *) eneed + section->sh_size;
252b5132
RH
10077
10078 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10079 {
2cf0635d 10080 Elf_External_Verneed * entry;
b34976b6
AM
10081 Elf_Internal_Verneed ent;
10082 int j;
10083 int isum;
2cf0635d 10084 char * vstart;
252b5132 10085
7e26601c 10086 if (idx > (size_t) (endbuf - (char *) eneed))
dd24e3da
NC
10087 break;
10088
252b5132 10089 vstart = ((char *) eneed) + idx;
54806181
AM
10090 if (vstart + sizeof (*entry) > endbuf)
10091 break;
252b5132
RH
10092
10093 entry = (Elf_External_Verneed *) vstart;
10094
10095 ent.vn_version = BYTE_GET (entry->vn_version);
10096 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
10097 ent.vn_file = BYTE_GET (entry->vn_file);
10098 ent.vn_aux = BYTE_GET (entry->vn_aux);
10099 ent.vn_next = BYTE_GET (entry->vn_next);
10100
10101 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
10102
d79b3d50
NC
10103 if (VALID_DYNAMIC_NAME (ent.vn_file))
10104 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
252b5132
RH
10105 else
10106 printf (_(" File: %lx"), ent.vn_file);
10107
10108 printf (_(" Cnt: %d\n"), ent.vn_cnt);
10109
dd24e3da 10110 /* Check for overflow. */
7e26601c 10111 if (ent.vn_aux > (size_t) (endbuf - vstart))
dd24e3da 10112 break;
252b5132
RH
10113 vstart += ent.vn_aux;
10114
10115 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
10116 {
2cf0635d 10117 Elf_External_Vernaux * eaux;
b34976b6 10118 Elf_Internal_Vernaux aux;
252b5132 10119
54806181
AM
10120 if (vstart + sizeof (*eaux) > endbuf)
10121 break;
252b5132
RH
10122 eaux = (Elf_External_Vernaux *) vstart;
10123
10124 aux.vna_hash = BYTE_GET (eaux->vna_hash);
10125 aux.vna_flags = BYTE_GET (eaux->vna_flags);
10126 aux.vna_other = BYTE_GET (eaux->vna_other);
10127 aux.vna_name = BYTE_GET (eaux->vna_name);
10128 aux.vna_next = BYTE_GET (eaux->vna_next);
10129
d79b3d50 10130 if (VALID_DYNAMIC_NAME (aux.vna_name))
ecc2063b 10131 printf (_(" %#06x: Name: %s"),
d79b3d50 10132 isum, GET_DYNAMIC_NAME (aux.vna_name));
252b5132 10133 else
ecc2063b 10134 printf (_(" %#06x: Name index: %lx"),
252b5132
RH
10135 isum, aux.vna_name);
10136
10137 printf (_(" Flags: %s Version: %d\n"),
10138 get_ver_flags (aux.vna_flags), aux.vna_other);
10139
dd24e3da 10140 /* Check for overflow. */
53774b7e
NC
10141 if (aux.vna_next > (size_t) (endbuf - vstart)
10142 || (aux.vna_next == 0 && j < ent.vn_cnt - 1))
10143 {
10144 warn (_("Invalid vna_next field of %lx\n"),
10145 aux.vna_next);
10146 j = ent.vn_cnt;
10147 break;
10148 }
252b5132
RH
10149 isum += aux.vna_next;
10150 vstart += aux.vna_next;
10151 }
9cf03b7e 10152
54806181 10153 if (j < ent.vn_cnt)
9cf03b7e 10154 warn (_("Missing Version Needs auxillary information\n"));
252b5132 10155
bcf83b2a 10156 if (ent.vn_next == 0 && cnt < section->sh_info - 1)
c24cf8b6
NC
10157 {
10158 warn (_("Corrupt Version Needs structure - offset to next structure is zero with entries still left to be processed\n"));
10159 cnt = section->sh_info;
10160 break;
10161 }
252b5132
RH
10162 idx += ent.vn_next;
10163 }
9cf03b7e 10164
54806181 10165 if (cnt < section->sh_info)
9cf03b7e 10166 warn (_("Missing Version Needs information\n"));
103f02d3 10167
252b5132
RH
10168 free (eneed);
10169 }
10170 break;
10171
10172 case SHT_GNU_versym:
10173 {
2cf0635d 10174 Elf_Internal_Shdr * link_section;
8b73c356
NC
10175 size_t total;
10176 unsigned int cnt;
2cf0635d
NC
10177 unsigned char * edata;
10178 unsigned short * data;
10179 char * strtab;
10180 Elf_Internal_Sym * symbols;
10181 Elf_Internal_Shdr * string_sec;
ba5cdace 10182 unsigned long num_syms;
d3ba0551 10183 long off;
252b5132 10184
4fbb74a6 10185 if (section->sh_link >= elf_header.e_shnum)
c256ffe7
JJ
10186 break;
10187
4fbb74a6 10188 link_section = section_headers + section->sh_link;
08d8fa11 10189 total = section->sh_size / sizeof (Elf_External_Versym);
252b5132 10190
4fbb74a6 10191 if (link_section->sh_link >= elf_header.e_shnum)
c256ffe7
JJ
10192 break;
10193
252b5132
RH
10194 found = 1;
10195
ba5cdace 10196 symbols = GET_ELF_SYMBOLS (file, link_section, & num_syms);
dd24e3da
NC
10197 if (symbols == NULL)
10198 break;
252b5132 10199
4fbb74a6 10200 string_sec = section_headers + link_section->sh_link;
252b5132 10201
3f5e193b
NC
10202 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
10203 string_sec->sh_size,
10204 _("version string table"));
a6e9f9df 10205 if (!strtab)
0429c154
MS
10206 {
10207 free (symbols);
10208 break;
10209 }
252b5132 10210
8b73c356
NC
10211 printf (_("\nVersion symbols section '%s' contains %lu entries:\n"),
10212 printable_section_name (section), (unsigned long) total);
252b5132
RH
10213
10214 printf (_(" Addr: "));
10215 printf_vma (section->sh_addr);
72de5009 10216 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
1b228002 10217 (unsigned long) section->sh_offset, section->sh_link,
74e1a04b 10218 printable_section_name (link_section));
252b5132 10219
d3ba0551
AM
10220 off = offset_from_vma (file,
10221 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10222 total * sizeof (short));
3f5e193b
NC
10223 edata = (unsigned char *) get_data (NULL, file, off, total,
10224 sizeof (short),
10225 _("version symbol data"));
a6e9f9df
AM
10226 if (!edata)
10227 {
10228 free (strtab);
0429c154 10229 free (symbols);
a6e9f9df
AM
10230 break;
10231 }
252b5132 10232
3f5e193b 10233 data = (short unsigned int *) cmalloc (total, sizeof (short));
252b5132
RH
10234
10235 for (cnt = total; cnt --;)
b34976b6
AM
10236 data[cnt] = byte_get (edata + cnt * sizeof (short),
10237 sizeof (short));
252b5132
RH
10238
10239 free (edata);
10240
10241 for (cnt = 0; cnt < total; cnt += 4)
10242 {
10243 int j, nn;
ab273396
AM
10244 char *name;
10245 char *invalid = _("*invalid*");
252b5132
RH
10246
10247 printf (" %03x:", cnt);
10248
10249 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
b34976b6 10250 switch (data[cnt + j])
252b5132
RH
10251 {
10252 case 0:
10253 fputs (_(" 0 (*local*) "), stdout);
10254 break;
10255
10256 case 1:
10257 fputs (_(" 1 (*global*) "), stdout);
10258 break;
10259
10260 default:
c244d050
NC
10261 nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
10262 data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
252b5132 10263
dd24e3da 10264 /* If this index value is greater than the size of the symbols
ba5cdace
NC
10265 array, break to avoid an out-of-bounds read. */
10266 if ((unsigned long)(cnt + j) >= num_syms)
dd24e3da
NC
10267 {
10268 warn (_("invalid index into symbol array\n"));
10269 break;
10270 }
10271
ab273396
AM
10272 name = NULL;
10273 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
252b5132 10274 {
b34976b6
AM
10275 Elf_Internal_Verneed ivn;
10276 unsigned long offset;
252b5132 10277
d93f0186
NC
10278 offset = offset_from_vma
10279 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10280 sizeof (Elf_External_Verneed));
252b5132 10281
b34976b6 10282 do
252b5132 10283 {
b34976b6
AM
10284 Elf_Internal_Vernaux ivna;
10285 Elf_External_Verneed evn;
10286 Elf_External_Vernaux evna;
10287 unsigned long a_off;
252b5132 10288
59245841
NC
10289 if (get_data (&evn, file, offset, sizeof (evn), 1,
10290 _("version need")) == NULL)
10291 break;
0b4362b0 10292
252b5132
RH
10293 ivn.vn_aux = BYTE_GET (evn.vn_aux);
10294 ivn.vn_next = BYTE_GET (evn.vn_next);
10295
10296 a_off = offset + ivn.vn_aux;
10297
10298 do
10299 {
59245841
NC
10300 if (get_data (&evna, file, a_off, sizeof (evna),
10301 1, _("version need aux (2)")) == NULL)
10302 {
10303 ivna.vna_next = 0;
10304 ivna.vna_other = 0;
10305 }
10306 else
10307 {
10308 ivna.vna_next = BYTE_GET (evna.vna_next);
10309 ivna.vna_other = BYTE_GET (evna.vna_other);
10310 }
252b5132
RH
10311
10312 a_off += ivna.vna_next;
10313 }
b34976b6 10314 while (ivna.vna_other != data[cnt + j]
252b5132
RH
10315 && ivna.vna_next != 0);
10316
b34976b6 10317 if (ivna.vna_other == data[cnt + j])
252b5132
RH
10318 {
10319 ivna.vna_name = BYTE_GET (evna.vna_name);
10320
54806181 10321 if (ivna.vna_name >= string_sec->sh_size)
ab273396 10322 name = invalid;
54806181
AM
10323 else
10324 name = strtab + ivna.vna_name;
252b5132
RH
10325 break;
10326 }
10327
10328 offset += ivn.vn_next;
10329 }
10330 while (ivn.vn_next);
10331 }
00d93f34 10332
ab273396 10333 if (data[cnt + j] != 0x8001
b34976b6 10334 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
252b5132 10335 {
b34976b6
AM
10336 Elf_Internal_Verdef ivd;
10337 Elf_External_Verdef evd;
10338 unsigned long offset;
252b5132 10339
d93f0186
NC
10340 offset = offset_from_vma
10341 (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10342 sizeof evd);
252b5132
RH
10343
10344 do
10345 {
59245841
NC
10346 if (get_data (&evd, file, offset, sizeof (evd), 1,
10347 _("version def")) == NULL)
10348 {
10349 ivd.vd_next = 0;
948f632f 10350 /* PR 17531: file: 046-1082287-0.004. */
3102e897
NC
10351 ivd.vd_ndx = (data[cnt + j] & VERSYM_VERSION) + 1;
10352 break;
59245841
NC
10353 }
10354 else
10355 {
10356 ivd.vd_next = BYTE_GET (evd.vd_next);
10357 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10358 }
252b5132
RH
10359
10360 offset += ivd.vd_next;
10361 }
c244d050 10362 while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
252b5132
RH
10363 && ivd.vd_next != 0);
10364
c244d050 10365 if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
252b5132 10366 {
b34976b6
AM
10367 Elf_External_Verdaux evda;
10368 Elf_Internal_Verdaux ivda;
252b5132
RH
10369
10370 ivd.vd_aux = BYTE_GET (evd.vd_aux);
10371
59245841
NC
10372 if (get_data (&evda, file,
10373 offset - ivd.vd_next + ivd.vd_aux,
10374 sizeof (evda), 1,
10375 _("version def aux")) == NULL)
10376 break;
252b5132
RH
10377
10378 ivda.vda_name = BYTE_GET (evda.vda_name);
10379
54806181 10380 if (ivda.vda_name >= string_sec->sh_size)
ab273396
AM
10381 name = invalid;
10382 else if (name != NULL && name != invalid)
10383 name = _("*both*");
54806181
AM
10384 else
10385 name = strtab + ivda.vda_name;
252b5132
RH
10386 }
10387 }
ab273396
AM
10388 if (name != NULL)
10389 nn += printf ("(%s%-*s",
10390 name,
10391 12 - (int) strlen (name),
10392 ")");
252b5132
RH
10393
10394 if (nn < 18)
10395 printf ("%*c", 18 - nn, ' ');
10396 }
10397
10398 putchar ('\n');
10399 }
10400
10401 free (data);
10402 free (strtab);
10403 free (symbols);
10404 }
10405 break;
103f02d3 10406
252b5132
RH
10407 default:
10408 break;
10409 }
10410 }
10411
10412 if (! found)
10413 printf (_("\nNo version information found in this file.\n"));
10414
10415 return 1;
10416}
10417
d1133906 10418static const char *
d3ba0551 10419get_symbol_binding (unsigned int binding)
252b5132 10420{
b34976b6 10421 static char buff[32];
252b5132
RH
10422
10423 switch (binding)
10424 {
b34976b6
AM
10425 case STB_LOCAL: return "LOCAL";
10426 case STB_GLOBAL: return "GLOBAL";
10427 case STB_WEAK: return "WEAK";
252b5132
RH
10428 default:
10429 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
e9e44622
JJ
10430 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
10431 binding);
252b5132 10432 else if (binding >= STB_LOOS && binding <= STB_HIOS)
3e7a7d11
NC
10433 {
10434 if (binding == STB_GNU_UNIQUE
9c55345c
TS
10435 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10436 /* GNU is still using the default value 0. */
3e7a7d11
NC
10437 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10438 return "UNIQUE";
10439 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
10440 }
252b5132 10441 else
e9e44622 10442 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
252b5132
RH
10443 return buff;
10444 }
10445}
10446
d1133906 10447static const char *
d3ba0551 10448get_symbol_type (unsigned int type)
252b5132 10449{
b34976b6 10450 static char buff[32];
252b5132
RH
10451
10452 switch (type)
10453 {
b34976b6
AM
10454 case STT_NOTYPE: return "NOTYPE";
10455 case STT_OBJECT: return "OBJECT";
10456 case STT_FUNC: return "FUNC";
10457 case STT_SECTION: return "SECTION";
10458 case STT_FILE: return "FILE";
10459 case STT_COMMON: return "COMMON";
10460 case STT_TLS: return "TLS";
15ab5209
DB
10461 case STT_RELC: return "RELC";
10462 case STT_SRELC: return "SRELC";
252b5132
RH
10463 default:
10464 if (type >= STT_LOPROC && type <= STT_HIPROC)
df75f1af 10465 {
3510a7b8
NC
10466 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
10467 return "THUMB_FUNC";
103f02d3 10468
351b4b40 10469 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
103f02d3
UD
10470 return "REGISTER";
10471
10472 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
10473 return "PARISC_MILLI";
10474
e9e44622 10475 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
df75f1af 10476 }
252b5132 10477 else if (type >= STT_LOOS && type <= STT_HIOS)
103f02d3
UD
10478 {
10479 if (elf_header.e_machine == EM_PARISC)
10480 {
10481 if (type == STT_HP_OPAQUE)
10482 return "HP_OPAQUE";
10483 if (type == STT_HP_STUB)
10484 return "HP_STUB";
10485 }
10486
d8045f23 10487 if (type == STT_GNU_IFUNC
9c55345c 10488 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
83c257ca 10489 || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
9c55345c 10490 /* GNU is still using the default value 0. */
d8045f23
NC
10491 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10492 return "IFUNC";
10493
e9e44622 10494 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
103f02d3 10495 }
252b5132 10496 else
e9e44622 10497 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
252b5132
RH
10498 return buff;
10499 }
10500}
10501
d1133906 10502static const char *
d3ba0551 10503get_symbol_visibility (unsigned int visibility)
d1133906
NC
10504{
10505 switch (visibility)
10506 {
b34976b6
AM
10507 case STV_DEFAULT: return "DEFAULT";
10508 case STV_INTERNAL: return "INTERNAL";
10509 case STV_HIDDEN: return "HIDDEN";
d1133906 10510 case STV_PROTECTED: return "PROTECTED";
bee0ee85
NC
10511 default:
10512 error (_("Unrecognized visibility value: %u"), visibility);
10513 return _("<unknown>");
d1133906
NC
10514 }
10515}
10516
fd85a6a1
NC
10517static const char *
10518get_solaris_symbol_visibility (unsigned int visibility)
10519{
10520 switch (visibility)
10521 {
10522 case 4: return "EXPORTED";
10523 case 5: return "SINGLETON";
10524 case 6: return "ELIMINATE";
10525 default: return get_symbol_visibility (visibility);
10526 }
10527}
10528
5e2b0d47
NC
10529static const char *
10530get_mips_symbol_other (unsigned int other)
10531{
10532 switch (other)
10533 {
df58fc94
RS
10534 case STO_OPTIONAL:
10535 return "OPTIONAL";
10536 case STO_MIPS_PLT:
10537 return "MIPS PLT";
10538 case STO_MIPS_PIC:
10539 return "MIPS PIC";
10540 case STO_MICROMIPS:
10541 return "MICROMIPS";
10542 case STO_MICROMIPS | STO_MIPS_PIC:
10543 return "MICROMIPS, MIPS PIC";
10544 case STO_MIPS16:
10545 return "MIPS16";
10546 default:
10547 return NULL;
5e2b0d47
NC
10548 }
10549}
10550
28f997cf
TG
10551static const char *
10552get_ia64_symbol_other (unsigned int other)
10553{
10554 if (is_ia64_vms ())
10555 {
10556 static char res[32];
10557
10558 res[0] = 0;
10559
10560 /* Function types is for images and .STB files only. */
10561 switch (elf_header.e_type)
10562 {
10563 case ET_DYN:
10564 case ET_EXEC:
10565 switch (VMS_ST_FUNC_TYPE (other))
10566 {
10567 case VMS_SFT_CODE_ADDR:
10568 strcat (res, " CA");
10569 break;
10570 case VMS_SFT_SYMV_IDX:
10571 strcat (res, " VEC");
10572 break;
10573 case VMS_SFT_FD:
10574 strcat (res, " FD");
10575 break;
10576 case VMS_SFT_RESERVE:
10577 strcat (res, " RSV");
10578 break;
10579 default:
bee0ee85
NC
10580 warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
10581 VMS_ST_FUNC_TYPE (other));
10582 strcat (res, " <unknown>");
10583 break;
28f997cf
TG
10584 }
10585 break;
10586 default:
10587 break;
10588 }
10589 switch (VMS_ST_LINKAGE (other))
10590 {
10591 case VMS_STL_IGNORE:
10592 strcat (res, " IGN");
10593 break;
10594 case VMS_STL_RESERVE:
10595 strcat (res, " RSV");
10596 break;
10597 case VMS_STL_STD:
10598 strcat (res, " STD");
10599 break;
10600 case VMS_STL_LNK:
10601 strcat (res, " LNK");
10602 break;
10603 default:
bee0ee85
NC
10604 warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
10605 VMS_ST_LINKAGE (other));
10606 strcat (res, " <unknown>");
10607 break;
28f997cf
TG
10608 }
10609
10610 if (res[0] != 0)
10611 return res + 1;
10612 else
10613 return res;
10614 }
10615 return NULL;
10616}
10617
6911b7dc
AM
10618static const char *
10619get_ppc64_symbol_other (unsigned int other)
10620{
10621 if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
10622 {
10623 static char buf[32];
10624 snprintf (buf, sizeof buf, _("<localentry>: %d"),
10625 PPC64_LOCAL_ENTRY_OFFSET (other));
10626 return buf;
10627 }
10628 return NULL;
10629}
10630
5e2b0d47
NC
10631static const char *
10632get_symbol_other (unsigned int other)
10633{
10634 const char * result = NULL;
10635 static char buff [32];
10636
10637 if (other == 0)
10638 return "";
10639
10640 switch (elf_header.e_machine)
10641 {
10642 case EM_MIPS:
10643 result = get_mips_symbol_other (other);
28f997cf
TG
10644 break;
10645 case EM_IA_64:
10646 result = get_ia64_symbol_other (other);
10647 break;
6911b7dc
AM
10648 case EM_PPC64:
10649 result = get_ppc64_symbol_other (other);
10650 break;
5e2b0d47 10651 default:
fd85a6a1 10652 result = NULL;
5e2b0d47
NC
10653 break;
10654 }
10655
10656 if (result)
10657 return result;
10658
10659 snprintf (buff, sizeof buff, _("<other>: %x"), other);
10660 return buff;
10661}
10662
d1133906 10663static const char *
d3ba0551 10664get_symbol_index_type (unsigned int type)
252b5132 10665{
b34976b6 10666 static char buff[32];
5cf1065c 10667
252b5132
RH
10668 switch (type)
10669 {
b34976b6
AM
10670 case SHN_UNDEF: return "UND";
10671 case SHN_ABS: return "ABS";
10672 case SHN_COMMON: return "COM";
252b5132 10673 default:
9ce701e2
L
10674 if (type == SHN_IA_64_ANSI_COMMON
10675 && elf_header.e_machine == EM_IA_64
10676 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
10677 return "ANSI_COM";
8a9036a4 10678 else if ((elf_header.e_machine == EM_X86_64
7a9068fe
L
10679 || elf_header.e_machine == EM_L1OM
10680 || elf_header.e_machine == EM_K1OM)
3b22753a
L
10681 && type == SHN_X86_64_LCOMMON)
10682 return "LARGE_COM";
ac145307
BS
10683 else if ((type == SHN_MIPS_SCOMMON
10684 && elf_header.e_machine == EM_MIPS)
10685 || (type == SHN_TIC6X_SCOMMON
10686 && elf_header.e_machine == EM_TI_C6000))
172553c7
TS
10687 return "SCOM";
10688 else if (type == SHN_MIPS_SUNDEFINED
10689 && elf_header.e_machine == EM_MIPS)
10690 return "SUND";
9ce701e2 10691 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
4fbb74a6 10692 sprintf (buff, "PRC[0x%04x]", type & 0xffff);
252b5132 10693 else if (type >= SHN_LOOS && type <= SHN_HIOS)
4fbb74a6
AM
10694 sprintf (buff, "OS [0x%04x]", type & 0xffff);
10695 else if (type >= SHN_LORESERVE)
10696 sprintf (buff, "RSV[0x%04x]", type & 0xffff);
c6d8cab4 10697 else if (type >= elf_header.e_shnum)
e0a31db1 10698 sprintf (buff, _("bad section index[%3d]"), type);
252b5132 10699 else
232e7cb8 10700 sprintf (buff, "%3d", type);
5cf1065c 10701 break;
252b5132 10702 }
5cf1065c
NC
10703
10704 return buff;
252b5132
RH
10705}
10706
66543521 10707static bfd_vma *
57028622 10708get_dynamic_data (FILE * file, bfd_size_type number, unsigned int ent_size)
252b5132 10709{
2cf0635d
NC
10710 unsigned char * e_data;
10711 bfd_vma * i_data;
252b5132 10712
57028622
NC
10713 /* If the size_t type is smaller than the bfd_size_type, eg because
10714 you are building a 32-bit tool on a 64-bit host, then make sure
10715 that when (number) is cast to (size_t) no information is lost. */
10716 if (sizeof (size_t) < sizeof (bfd_size_type)
10717 && (bfd_size_type) ((size_t) number) != number)
10718 {
ed754a13
AM
10719 error (_("Size truncation prevents reading %" BFD_VMA_FMT "u"
10720 " elements of size %u\n"),
10721 number, ent_size);
57028622
NC
10722 return NULL;
10723 }
948f632f 10724
3102e897
NC
10725 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
10726 attempting to allocate memory when the read is bound to fail. */
10727 if (ent_size * number > current_file_size)
10728 {
ed754a13
AM
10729 error (_("Invalid number of dynamic entries: %" BFD_VMA_FMT "u\n"),
10730 number);
3102e897
NC
10731 return NULL;
10732 }
10733
57028622 10734 e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
252b5132
RH
10735 if (e_data == NULL)
10736 {
ed754a13
AM
10737 error (_("Out of memory reading %" BFD_VMA_FMT "u dynamic entries\n"),
10738 number);
252b5132
RH
10739 return NULL;
10740 }
10741
57028622 10742 if (fread (e_data, ent_size, (size_t) number, file) != number)
252b5132 10743 {
ed754a13
AM
10744 error (_("Unable to read in %" BFD_VMA_FMT "u bytes of dynamic data\n"),
10745 number * ent_size);
3102e897 10746 free (e_data);
252b5132
RH
10747 return NULL;
10748 }
10749
57028622 10750 i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
252b5132
RH
10751 if (i_data == NULL)
10752 {
ed754a13
AM
10753 error (_("Out of memory allocating space for %" BFD_VMA_FMT "u"
10754 " dynamic entries\n"),
10755 number);
252b5132
RH
10756 free (e_data);
10757 return NULL;
10758 }
10759
10760 while (number--)
66543521 10761 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
252b5132
RH
10762
10763 free (e_data);
10764
10765 return i_data;
10766}
10767
6bd1a22c
L
10768static void
10769print_dynamic_symbol (bfd_vma si, unsigned long hn)
10770{
2cf0635d 10771 Elf_Internal_Sym * psym;
6bd1a22c
L
10772 int n;
10773
6bd1a22c
L
10774 n = print_vma (si, DEC_5);
10775 if (n < 5)
0b4362b0 10776 fputs (&" "[n], stdout);
6bd1a22c 10777 printf (" %3lu: ", hn);
e0a31db1
NC
10778
10779 if (dynamic_symbols == NULL || si >= num_dynamic_syms)
10780 {
3102e897
NC
10781 printf (_("<No info available for dynamic symbol number %lu>\n"),
10782 (unsigned long) si);
e0a31db1
NC
10783 return;
10784 }
10785
10786 psym = dynamic_symbols + si;
6bd1a22c
L
10787 print_vma (psym->st_value, LONG_HEX);
10788 putchar (' ');
10789 print_vma (psym->st_size, DEC_5);
10790
f4be36b3
AM
10791 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10792 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
fd85a6a1
NC
10793
10794 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
10795 printf (" %-7s", get_solaris_symbol_visibility (psym->st_other));
10796 else
10797 {
10798 unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
10799
10800 printf (" %-7s", get_symbol_visibility (vis));
10801 /* Check to see if any other bits in the st_other field are set.
10802 Note - displaying this information disrupts the layout of the
10803 table being generated, but for the moment this case is very
10804 rare. */
10805 if (psym->st_other ^ vis)
10806 printf (" [%s] ", get_symbol_other (psym->st_other ^ vis));
10807 }
10808
6bd1a22c
L
10809 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
10810 if (VALID_DYNAMIC_NAME (psym->st_name))
10811 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
10812 else
2b692964 10813 printf (_(" <corrupt: %14ld>"), psym->st_name);
6bd1a22c
L
10814 putchar ('\n');
10815}
10816
bb4d2ac2 10817static const char *
1449284b
NC
10818get_symbol_version_string (FILE * file,
10819 bfd_boolean is_dynsym,
10820 const char * strtab,
10821 unsigned long int strtab_size,
10822 unsigned int si,
10823 Elf_Internal_Sym * psym,
10824 enum versioned_symbol_info * sym_info,
10825 unsigned short * vna_other)
bb4d2ac2 10826{
ab273396
AM
10827 unsigned char data[2];
10828 unsigned short vers_data;
10829 unsigned long offset;
bb4d2ac2 10830
ab273396
AM
10831 if (!is_dynsym
10832 || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
10833 return NULL;
bb4d2ac2 10834
ab273396
AM
10835 offset = offset_from_vma (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10836 sizeof data + si * sizeof (vers_data));
bb4d2ac2 10837
ab273396
AM
10838 if (get_data (&data, file, offset + si * sizeof (vers_data),
10839 sizeof (data), 1, _("version data")) == NULL)
10840 return NULL;
10841
10842 vers_data = byte_get (data, 2);
bb4d2ac2 10843
ab273396
AM
10844 if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data <= 1)
10845 return NULL;
bb4d2ac2 10846
ab273396
AM
10847 /* Usually we'd only see verdef for defined symbols, and verneed for
10848 undefined symbols. However, symbols defined by the linker in
10849 .dynbss for variables copied from a shared library in order to
10850 avoid text relocations are defined yet have verneed. We could
10851 use a heuristic to detect the special case, for example, check
10852 for verneed first on symbols defined in SHT_NOBITS sections, but
10853 it is simpler and more reliable to just look for both verdef and
10854 verneed. .dynbss might not be mapped to a SHT_NOBITS section. */
bb4d2ac2 10855
ab273396
AM
10856 if (psym->st_shndx != SHN_UNDEF
10857 && vers_data != 0x8001
10858 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10859 {
10860 Elf_Internal_Verdef ivd;
10861 Elf_Internal_Verdaux ivda;
10862 Elf_External_Verdaux evda;
10863 unsigned long off;
bb4d2ac2 10864
ab273396
AM
10865 off = offset_from_vma (file,
10866 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10867 sizeof (Elf_External_Verdef));
10868
10869 do
bb4d2ac2 10870 {
ab273396
AM
10871 Elf_External_Verdef evd;
10872
10873 if (get_data (&evd, file, off, sizeof (evd), 1,
10874 _("version def")) == NULL)
10875 {
10876 ivd.vd_ndx = 0;
10877 ivd.vd_aux = 0;
10878 ivd.vd_next = 0;
10879 }
10880 else
bb4d2ac2 10881 {
ab273396
AM
10882 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10883 ivd.vd_aux = BYTE_GET (evd.vd_aux);
10884 ivd.vd_next = BYTE_GET (evd.vd_next);
10885 }
bb4d2ac2 10886
ab273396
AM
10887 off += ivd.vd_next;
10888 }
10889 while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
bb4d2ac2 10890
ab273396
AM
10891 if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
10892 {
10893 off -= ivd.vd_next;
10894 off += ivd.vd_aux;
bb4d2ac2 10895
ab273396
AM
10896 if (get_data (&evda, file, off, sizeof (evda), 1,
10897 _("version def aux")) != NULL)
10898 {
10899 ivda.vda_name = BYTE_GET (evda.vda_name);
bb4d2ac2 10900
ab273396
AM
10901 if (psym->st_name != ivda.vda_name)
10902 {
10903 *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
10904 ? symbol_hidden : symbol_public);
10905 return (ivda.vda_name < strtab_size
10906 ? strtab + ivda.vda_name : _("<corrupt>"));
10907 }
10908 }
10909 }
10910 }
bb4d2ac2 10911
ab273396
AM
10912 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10913 {
10914 Elf_External_Verneed evn;
10915 Elf_Internal_Verneed ivn;
10916 Elf_Internal_Vernaux ivna;
bb4d2ac2 10917
ab273396
AM
10918 offset = offset_from_vma (file,
10919 version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10920 sizeof evn);
10921 do
10922 {
10923 unsigned long vna_off;
bb4d2ac2 10924
ab273396
AM
10925 if (get_data (&evn, file, offset, sizeof (evn), 1,
10926 _("version need")) == NULL)
10927 {
10928 ivna.vna_next = 0;
10929 ivna.vna_other = 0;
10930 ivna.vna_name = 0;
10931 break;
10932 }
bb4d2ac2 10933
ab273396
AM
10934 ivn.vn_aux = BYTE_GET (evn.vn_aux);
10935 ivn.vn_next = BYTE_GET (evn.vn_next);
bb4d2ac2 10936
ab273396 10937 vna_off = offset + ivn.vn_aux;
bb4d2ac2 10938
ab273396
AM
10939 do
10940 {
10941 Elf_External_Vernaux evna;
bb4d2ac2 10942
ab273396
AM
10943 if (get_data (&evna, file, vna_off, sizeof (evna), 1,
10944 _("version need aux (3)")) == NULL)
bb4d2ac2 10945 {
ab273396
AM
10946 ivna.vna_next = 0;
10947 ivna.vna_other = 0;
10948 ivna.vna_name = 0;
bb4d2ac2 10949 }
bb4d2ac2 10950 else
bb4d2ac2 10951 {
ab273396
AM
10952 ivna.vna_other = BYTE_GET (evna.vna_other);
10953 ivna.vna_next = BYTE_GET (evna.vna_next);
10954 ivna.vna_name = BYTE_GET (evna.vna_name);
10955 }
bb4d2ac2 10956
ab273396
AM
10957 vna_off += ivna.vna_next;
10958 }
10959 while (ivna.vna_other != vers_data && ivna.vna_next != 0);
bb4d2ac2 10960
ab273396
AM
10961 if (ivna.vna_other == vers_data)
10962 break;
bb4d2ac2 10963
ab273396
AM
10964 offset += ivn.vn_next;
10965 }
10966 while (ivn.vn_next != 0);
bb4d2ac2 10967
ab273396
AM
10968 if (ivna.vna_other == vers_data)
10969 {
10970 *sym_info = symbol_undefined;
10971 *vna_other = ivna.vna_other;
10972 return (ivna.vna_name < strtab_size
10973 ? strtab + ivna.vna_name : _("<corrupt>"));
bb4d2ac2
L
10974 }
10975 }
ab273396 10976 return NULL;
bb4d2ac2
L
10977}
10978
e3c8793a 10979/* Dump the symbol table. */
252b5132 10980static int
2cf0635d 10981process_symbol_table (FILE * file)
252b5132 10982{
2cf0635d 10983 Elf_Internal_Shdr * section;
8b73c356
NC
10984 bfd_size_type nbuckets = 0;
10985 bfd_size_type nchains = 0;
2cf0635d
NC
10986 bfd_vma * buckets = NULL;
10987 bfd_vma * chains = NULL;
fdc90cb4 10988 bfd_vma ngnubuckets = 0;
2cf0635d
NC
10989 bfd_vma * gnubuckets = NULL;
10990 bfd_vma * gnuchains = NULL;
6bd1a22c 10991 bfd_vma gnusymidx = 0;
071436c6 10992 bfd_size_type ngnuchains = 0;
252b5132 10993
2c610e4b 10994 if (!do_syms && !do_dyn_syms && !do_histogram)
252b5132
RH
10995 return 1;
10996
6bd1a22c
L
10997 if (dynamic_info[DT_HASH]
10998 && (do_histogram
2c610e4b
L
10999 || (do_using_dynamic
11000 && !do_dyn_syms
11001 && dynamic_strings != NULL)))
252b5132 11002 {
66543521
AM
11003 unsigned char nb[8];
11004 unsigned char nc[8];
8b73c356 11005 unsigned int hash_ent_size = 4;
66543521
AM
11006
11007 if ((elf_header.e_machine == EM_ALPHA
11008 || elf_header.e_machine == EM_S390
11009 || elf_header.e_machine == EM_S390_OLD)
11010 && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
11011 hash_ent_size = 8;
11012
fb52b2f4
NC
11013 if (fseek (file,
11014 (archive_file_offset
11015 + offset_from_vma (file, dynamic_info[DT_HASH],
11016 sizeof nb + sizeof nc)),
d93f0186 11017 SEEK_SET))
252b5132 11018 {
591a748a 11019 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 11020 goto no_hash;
252b5132
RH
11021 }
11022
66543521 11023 if (fread (nb, hash_ent_size, 1, file) != 1)
252b5132
RH
11024 {
11025 error (_("Failed to read in number of buckets\n"));
d3a44ec6 11026 goto no_hash;
252b5132
RH
11027 }
11028
66543521 11029 if (fread (nc, hash_ent_size, 1, file) != 1)
252b5132
RH
11030 {
11031 error (_("Failed to read in number of chains\n"));
d3a44ec6 11032 goto no_hash;
252b5132
RH
11033 }
11034
66543521
AM
11035 nbuckets = byte_get (nb, hash_ent_size);
11036 nchains = byte_get (nc, hash_ent_size);
252b5132 11037
66543521
AM
11038 buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
11039 chains = get_dynamic_data (file, nchains, hash_ent_size);
252b5132 11040
d3a44ec6 11041 no_hash:
252b5132 11042 if (buckets == NULL || chains == NULL)
d3a44ec6
JJ
11043 {
11044 if (do_using_dynamic)
11045 return 0;
11046 free (buckets);
11047 free (chains);
11048 buckets = NULL;
11049 chains = NULL;
11050 nbuckets = 0;
11051 nchains = 0;
11052 }
252b5132
RH
11053 }
11054
6bd1a22c
L
11055 if (dynamic_info_DT_GNU_HASH
11056 && (do_histogram
2c610e4b
L
11057 || (do_using_dynamic
11058 && !do_dyn_syms
11059 && dynamic_strings != NULL)))
252b5132 11060 {
6bd1a22c
L
11061 unsigned char nb[16];
11062 bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
11063 bfd_vma buckets_vma;
11064
11065 if (fseek (file,
11066 (archive_file_offset
11067 + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
11068 sizeof nb)),
11069 SEEK_SET))
11070 {
11071 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 11072 goto no_gnu_hash;
6bd1a22c 11073 }
252b5132 11074
6bd1a22c
L
11075 if (fread (nb, 16, 1, file) != 1)
11076 {
11077 error (_("Failed to read in number of buckets\n"));
d3a44ec6 11078 goto no_gnu_hash;
6bd1a22c
L
11079 }
11080
11081 ngnubuckets = byte_get (nb, 4);
11082 gnusymidx = byte_get (nb + 4, 4);
11083 bitmaskwords = byte_get (nb + 8, 4);
11084 buckets_vma = dynamic_info_DT_GNU_HASH + 16;
f7a99963 11085 if (is_32bit_elf)
6bd1a22c 11086 buckets_vma += bitmaskwords * 4;
f7a99963 11087 else
6bd1a22c 11088 buckets_vma += bitmaskwords * 8;
252b5132 11089
6bd1a22c
L
11090 if (fseek (file,
11091 (archive_file_offset
11092 + offset_from_vma (file, buckets_vma, 4)),
11093 SEEK_SET))
252b5132 11094 {
6bd1a22c 11095 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 11096 goto no_gnu_hash;
6bd1a22c
L
11097 }
11098
11099 gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
252b5132 11100
6bd1a22c 11101 if (gnubuckets == NULL)
d3a44ec6 11102 goto no_gnu_hash;
6bd1a22c
L
11103
11104 for (i = 0; i < ngnubuckets; i++)
11105 if (gnubuckets[i] != 0)
11106 {
11107 if (gnubuckets[i] < gnusymidx)
11108 return 0;
11109
11110 if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
11111 maxchain = gnubuckets[i];
11112 }
11113
11114 if (maxchain == 0xffffffff)
d3a44ec6 11115 goto no_gnu_hash;
6bd1a22c
L
11116
11117 maxchain -= gnusymidx;
11118
11119 if (fseek (file,
11120 (archive_file_offset
11121 + offset_from_vma (file, buckets_vma
11122 + 4 * (ngnubuckets + maxchain), 4)),
11123 SEEK_SET))
11124 {
11125 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 11126 goto no_gnu_hash;
6bd1a22c
L
11127 }
11128
11129 do
11130 {
11131 if (fread (nb, 4, 1, file) != 1)
252b5132 11132 {
6bd1a22c 11133 error (_("Failed to determine last chain length\n"));
d3a44ec6 11134 goto no_gnu_hash;
6bd1a22c 11135 }
252b5132 11136
6bd1a22c 11137 if (maxchain + 1 == 0)
d3a44ec6 11138 goto no_gnu_hash;
252b5132 11139
6bd1a22c
L
11140 ++maxchain;
11141 }
11142 while ((byte_get (nb, 4) & 1) == 0);
76da6bbe 11143
6bd1a22c
L
11144 if (fseek (file,
11145 (archive_file_offset
11146 + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
11147 SEEK_SET))
11148 {
11149 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 11150 goto no_gnu_hash;
6bd1a22c
L
11151 }
11152
11153 gnuchains = get_dynamic_data (file, maxchain, 4);
071436c6 11154 ngnuchains = maxchain;
6bd1a22c 11155
d3a44ec6 11156 no_gnu_hash:
6bd1a22c 11157 if (gnuchains == NULL)
d3a44ec6
JJ
11158 {
11159 free (gnubuckets);
d3a44ec6
JJ
11160 gnubuckets = NULL;
11161 ngnubuckets = 0;
f64fddf1
NC
11162 if (do_using_dynamic)
11163 return 0;
d3a44ec6 11164 }
6bd1a22c
L
11165 }
11166
11167 if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
11168 && do_syms
11169 && do_using_dynamic
3102e897
NC
11170 && dynamic_strings != NULL
11171 && dynamic_symbols != NULL)
6bd1a22c
L
11172 {
11173 unsigned long hn;
11174
11175 if (dynamic_info[DT_HASH])
11176 {
11177 bfd_vma si;
11178
11179 printf (_("\nSymbol table for image:\n"));
11180 if (is_32bit_elf)
11181 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11182 else
11183 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11184
11185 for (hn = 0; hn < nbuckets; hn++)
11186 {
11187 if (! buckets[hn])
11188 continue;
11189
11190 for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
11191 print_dynamic_symbol (si, hn);
252b5132
RH
11192 }
11193 }
6bd1a22c
L
11194
11195 if (dynamic_info_DT_GNU_HASH)
11196 {
11197 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
11198 if (is_32bit_elf)
11199 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11200 else
11201 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11202
11203 for (hn = 0; hn < ngnubuckets; ++hn)
11204 if (gnubuckets[hn] != 0)
11205 {
11206 bfd_vma si = gnubuckets[hn];
11207 bfd_vma off = si - gnusymidx;
11208
11209 do
11210 {
11211 print_dynamic_symbol (si, hn);
11212 si++;
11213 }
071436c6 11214 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
6bd1a22c
L
11215 }
11216 }
252b5132 11217 }
8b73c356
NC
11218 else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
11219 && section_headers != NULL)
252b5132 11220 {
b34976b6 11221 unsigned int i;
252b5132
RH
11222
11223 for (i = 0, section = section_headers;
11224 i < elf_header.e_shnum;
11225 i++, section++)
11226 {
b34976b6 11227 unsigned int si;
2cf0635d 11228 char * strtab = NULL;
c256ffe7 11229 unsigned long int strtab_size = 0;
2cf0635d
NC
11230 Elf_Internal_Sym * symtab;
11231 Elf_Internal_Sym * psym;
ba5cdace 11232 unsigned long num_syms;
252b5132 11233
2c610e4b
L
11234 if ((section->sh_type != SHT_SYMTAB
11235 && section->sh_type != SHT_DYNSYM)
11236 || (!do_syms
11237 && section->sh_type == SHT_SYMTAB))
252b5132
RH
11238 continue;
11239
dd24e3da
NC
11240 if (section->sh_entsize == 0)
11241 {
11242 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
74e1a04b 11243 printable_section_name (section));
dd24e3da
NC
11244 continue;
11245 }
11246
252b5132 11247 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
74e1a04b 11248 printable_section_name (section),
252b5132 11249 (unsigned long) (section->sh_size / section->sh_entsize));
dd24e3da 11250
f7a99963 11251 if (is_32bit_elf)
ca47b30c 11252 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
f7a99963 11253 else
ca47b30c 11254 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
252b5132 11255
ba5cdace 11256 symtab = GET_ELF_SYMBOLS (file, section, & num_syms);
252b5132
RH
11257 if (symtab == NULL)
11258 continue;
11259
11260 if (section->sh_link == elf_header.e_shstrndx)
c256ffe7
JJ
11261 {
11262 strtab = string_table;
11263 strtab_size = string_table_length;
11264 }
4fbb74a6 11265 else if (section->sh_link < elf_header.e_shnum)
252b5132 11266 {
2cf0635d 11267 Elf_Internal_Shdr * string_sec;
252b5132 11268
4fbb74a6 11269 string_sec = section_headers + section->sh_link;
252b5132 11270
3f5e193b
NC
11271 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
11272 1, string_sec->sh_size,
11273 _("string table"));
c256ffe7 11274 strtab_size = strtab != NULL ? string_sec->sh_size : 0;
252b5132
RH
11275 }
11276
ba5cdace 11277 for (si = 0, psym = symtab; si < num_syms; si++, psym++)
252b5132 11278 {
bb4d2ac2
L
11279 const char *version_string;
11280 enum versioned_symbol_info sym_info;
11281 unsigned short vna_other;
11282
5e220199 11283 printf ("%6d: ", si);
f7a99963
NC
11284 print_vma (psym->st_value, LONG_HEX);
11285 putchar (' ');
11286 print_vma (psym->st_size, DEC_5);
d1133906
NC
11287 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
11288 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
fd85a6a1
NC
11289 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11290 printf (" %-7s", get_solaris_symbol_visibility (psym->st_other));
11291 else
11292 {
11293 unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11294
11295 printf (" %-7s", get_symbol_visibility (vis));
11296 /* Check to see if any other bits in the st_other field are set.
11297 Note - displaying this information disrupts the layout of the
11298 table being generated, but for the moment this case is very rare. */
11299 if (psym->st_other ^ vis)
11300 printf (" [%s] ", get_symbol_other (psym->st_other ^ vis));
11301 }
31104126 11302 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
c256ffe7 11303 print_symbol (25, psym->st_name < strtab_size
2b692964 11304 ? strtab + psym->st_name : _("<corrupt>"));
252b5132 11305
bb4d2ac2
L
11306 version_string
11307 = get_symbol_version_string (file,
11308 section->sh_type == SHT_DYNSYM,
11309 strtab, strtab_size, si,
11310 psym, &sym_info, &vna_other);
11311 if (version_string)
252b5132 11312 {
bb4d2ac2
L
11313 if (sym_info == symbol_undefined)
11314 printf ("@%s (%d)", version_string, vna_other);
11315 else
11316 printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
11317 version_string);
252b5132
RH
11318 }
11319
11320 putchar ('\n');
52c3c391
NC
11321
11322 if (ELF_ST_BIND (psym->st_info) == STB_LOCAL
dd905818
NC
11323 && si >= section->sh_info
11324 /* Irix 5 and 6 MIPS binaries are known to ignore this requirement. */
11325 && elf_header.e_machine != EM_MIPS
11326 /* Solaris binaries have been found to violate this requirement as
11327 well. Not sure if this is a bug or an ABI requirement. */
11328 && elf_header.e_ident[EI_OSABI] != ELFOSABI_SOLARIS)
52c3c391
NC
11329 warn (_("local symbol %u found at index >= %s's sh_info value of %u\n"),
11330 si, printable_section_name (section), section->sh_info);
252b5132
RH
11331 }
11332
11333 free (symtab);
11334 if (strtab != string_table)
11335 free (strtab);
11336 }
11337 }
11338 else if (do_syms)
11339 printf
11340 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
11341
11342 if (do_histogram && buckets != NULL)
11343 {
2cf0635d
NC
11344 unsigned long * lengths;
11345 unsigned long * counts;
66543521
AM
11346 unsigned long hn;
11347 bfd_vma si;
11348 unsigned long maxlength = 0;
11349 unsigned long nzero_counts = 0;
11350 unsigned long nsyms = 0;
94d15024 11351 unsigned long chained;
252b5132 11352
66543521
AM
11353 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
11354 (unsigned long) nbuckets);
252b5132 11355
3f5e193b 11356 lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
252b5132
RH
11357 if (lengths == NULL)
11358 {
8b73c356 11359 error (_("Out of memory allocating space for histogram buckets\n"));
252b5132
RH
11360 return 0;
11361 }
8b73c356
NC
11362
11363 printf (_(" Length Number %% of total Coverage\n"));
252b5132
RH
11364 for (hn = 0; hn < nbuckets; ++hn)
11365 {
94d15024
MF
11366 for (si = buckets[hn], chained = 0;
11367 si > 0 && si < nchains && si < nbuckets && chained <= nchains;
11368 si = chains[si], ++chained)
252b5132 11369 {
b34976b6 11370 ++nsyms;
252b5132 11371 if (maxlength < ++lengths[hn])
b34976b6 11372 ++maxlength;
252b5132 11373 }
94d15024
MF
11374
11375 /* PR binutils/17531: A corrupt binary could contain broken
11376 histogram data. Do not go into an infinite loop trying
11377 to process it. */
11378 if (chained > nchains)
11379 {
11380 error (_("histogram chain is corrupt\n"));
11381 break;
11382 }
252b5132
RH
11383 }
11384
3f5e193b 11385 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
252b5132
RH
11386 if (counts == NULL)
11387 {
b2e951ec 11388 free (lengths);
8b73c356 11389 error (_("Out of memory allocating space for histogram counts\n"));
252b5132
RH
11390 return 0;
11391 }
11392
11393 for (hn = 0; hn < nbuckets; ++hn)
b34976b6 11394 ++counts[lengths[hn]];
252b5132 11395
103f02d3 11396 if (nbuckets > 0)
252b5132 11397 {
66543521
AM
11398 unsigned long i;
11399 printf (" 0 %-10lu (%5.1f%%)\n",
103f02d3 11400 counts[0], (counts[0] * 100.0) / nbuckets);
66543521 11401 for (i = 1; i <= maxlength; ++i)
103f02d3 11402 {
66543521
AM
11403 nzero_counts += counts[i] * i;
11404 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11405 i, counts[i], (counts[i] * 100.0) / nbuckets,
103f02d3
UD
11406 (nzero_counts * 100.0) / nsyms);
11407 }
252b5132
RH
11408 }
11409
11410 free (counts);
11411 free (lengths);
11412 }
11413
11414 if (buckets != NULL)
11415 {
11416 free (buckets);
11417 free (chains);
11418 }
11419
d3a44ec6 11420 if (do_histogram && gnubuckets != NULL)
fdc90cb4 11421 {
2cf0635d
NC
11422 unsigned long * lengths;
11423 unsigned long * counts;
fdc90cb4
JJ
11424 unsigned long hn;
11425 unsigned long maxlength = 0;
11426 unsigned long nzero_counts = 0;
11427 unsigned long nsyms = 0;
fdc90cb4 11428
8b73c356
NC
11429 printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
11430 (unsigned long) ngnubuckets);
11431
3f5e193b 11432 lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
fdc90cb4
JJ
11433 if (lengths == NULL)
11434 {
8b73c356 11435 error (_("Out of memory allocating space for gnu histogram buckets\n"));
fdc90cb4
JJ
11436 return 0;
11437 }
11438
fdc90cb4
JJ
11439 printf (_(" Length Number %% of total Coverage\n"));
11440
11441 for (hn = 0; hn < ngnubuckets; ++hn)
11442 if (gnubuckets[hn] != 0)
11443 {
11444 bfd_vma off, length = 1;
11445
6bd1a22c 11446 for (off = gnubuckets[hn] - gnusymidx;
071436c6
NC
11447 /* PR 17531 file: 010-77222-0.004. */
11448 off < ngnuchains && (gnuchains[off] & 1) == 0;
11449 ++off)
fdc90cb4
JJ
11450 ++length;
11451 lengths[hn] = length;
11452 if (length > maxlength)
11453 maxlength = length;
11454 nsyms += length;
11455 }
11456
3f5e193b 11457 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
fdc90cb4
JJ
11458 if (counts == NULL)
11459 {
b2e951ec 11460 free (lengths);
8b73c356 11461 error (_("Out of memory allocating space for gnu histogram counts\n"));
fdc90cb4
JJ
11462 return 0;
11463 }
11464
11465 for (hn = 0; hn < ngnubuckets; ++hn)
11466 ++counts[lengths[hn]];
11467
11468 if (ngnubuckets > 0)
11469 {
11470 unsigned long j;
11471 printf (" 0 %-10lu (%5.1f%%)\n",
11472 counts[0], (counts[0] * 100.0) / ngnubuckets);
11473 for (j = 1; j <= maxlength; ++j)
11474 {
11475 nzero_counts += counts[j] * j;
11476 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11477 j, counts[j], (counts[j] * 100.0) / ngnubuckets,
11478 (nzero_counts * 100.0) / nsyms);
11479 }
11480 }
11481
11482 free (counts);
11483 free (lengths);
11484 free (gnubuckets);
11485 free (gnuchains);
11486 }
11487
252b5132
RH
11488 return 1;
11489}
11490
11491static int
2cf0635d 11492process_syminfo (FILE * file ATTRIBUTE_UNUSED)
252b5132 11493{
b4c96d0d 11494 unsigned int i;
252b5132
RH
11495
11496 if (dynamic_syminfo == NULL
11497 || !do_dynamic)
11498 /* No syminfo, this is ok. */
11499 return 1;
11500
11501 /* There better should be a dynamic symbol section. */
11502 if (dynamic_symbols == NULL || dynamic_strings == NULL)
11503 return 0;
11504
11505 if (dynamic_addr)
11506 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
11507 dynamic_syminfo_offset, dynamic_syminfo_nent);
11508
11509 printf (_(" Num: Name BoundTo Flags\n"));
11510 for (i = 0; i < dynamic_syminfo_nent; ++i)
11511 {
11512 unsigned short int flags = dynamic_syminfo[i].si_flags;
11513
31104126 11514 printf ("%4d: ", i);
4082ef84
NC
11515 if (i >= num_dynamic_syms)
11516 printf (_("<corrupt index>"));
11517 else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
d79b3d50
NC
11518 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
11519 else
2b692964 11520 printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
31104126 11521 putchar (' ');
252b5132
RH
11522
11523 switch (dynamic_syminfo[i].si_boundto)
11524 {
11525 case SYMINFO_BT_SELF:
11526 fputs ("SELF ", stdout);
11527 break;
11528 case SYMINFO_BT_PARENT:
11529 fputs ("PARENT ", stdout);
11530 break;
11531 default:
11532 if (dynamic_syminfo[i].si_boundto > 0
d79b3d50
NC
11533 && dynamic_syminfo[i].si_boundto < dynamic_nent
11534 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
31104126 11535 {
d79b3d50 11536 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
31104126
NC
11537 putchar (' ' );
11538 }
252b5132
RH
11539 else
11540 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
11541 break;
11542 }
11543
11544 if (flags & SYMINFO_FLG_DIRECT)
11545 printf (" DIRECT");
11546 if (flags & SYMINFO_FLG_PASSTHRU)
11547 printf (" PASSTHRU");
11548 if (flags & SYMINFO_FLG_COPY)
11549 printf (" COPY");
11550 if (flags & SYMINFO_FLG_LAZYLOAD)
11551 printf (" LAZYLOAD");
11552
11553 puts ("");
11554 }
11555
11556 return 1;
11557}
11558
cf13d699
NC
11559/* Check to see if the given reloc needs to be handled in a target specific
11560 manner. If so then process the reloc and return TRUE otherwise return
11561 FALSE. */
09c11c86 11562
cf13d699
NC
11563static bfd_boolean
11564target_specific_reloc_handling (Elf_Internal_Rela * reloc,
11565 unsigned char * start,
11566 Elf_Internal_Sym * symtab)
252b5132 11567{
cf13d699 11568 unsigned int reloc_type = get_reloc_type (reloc->r_info);
252b5132 11569
cf13d699 11570 switch (elf_header.e_machine)
252b5132 11571 {
13761a11
NC
11572 case EM_MSP430:
11573 case EM_MSP430_OLD:
11574 {
11575 static Elf_Internal_Sym * saved_sym = NULL;
11576
11577 switch (reloc_type)
11578 {
11579 case 10: /* R_MSP430_SYM_DIFF */
11580 if (uses_msp430x_relocs ())
11581 break;
1a0670f3 11582 /* Fall through. */
13761a11
NC
11583 case 21: /* R_MSP430X_SYM_DIFF */
11584 saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11585 return TRUE;
11586
11587 case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
11588 case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
11589 goto handle_sym_diff;
0b4362b0 11590
13761a11
NC
11591 case 5: /* R_MSP430_16_BYTE */
11592 case 9: /* R_MSP430_8 */
11593 if (uses_msp430x_relocs ())
11594 break;
11595 goto handle_sym_diff;
11596
11597 case 2: /* R_MSP430_ABS16 */
11598 case 15: /* R_MSP430X_ABS16 */
11599 if (! uses_msp430x_relocs ())
11600 break;
11601 goto handle_sym_diff;
0b4362b0 11602
13761a11
NC
11603 handle_sym_diff:
11604 if (saved_sym != NULL)
11605 {
11606 bfd_vma value;
11607
11608 value = reloc->r_addend
11609 + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11610 - saved_sym->st_value);
11611
11612 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
11613
11614 saved_sym = NULL;
11615 return TRUE;
11616 }
11617 break;
11618
11619 default:
11620 if (saved_sym != NULL)
071436c6 11621 error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
13761a11
NC
11622 break;
11623 }
11624 break;
11625 }
11626
cf13d699
NC
11627 case EM_MN10300:
11628 case EM_CYGNUS_MN10300:
11629 {
11630 static Elf_Internal_Sym * saved_sym = NULL;
252b5132 11631
cf13d699
NC
11632 switch (reloc_type)
11633 {
11634 case 34: /* R_MN10300_ALIGN */
11635 return TRUE;
11636 case 33: /* R_MN10300_SYM_DIFF */
11637 saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11638 return TRUE;
11639 case 1: /* R_MN10300_32 */
11640 case 2: /* R_MN10300_16 */
11641 if (saved_sym != NULL)
11642 {
11643 bfd_vma value;
252b5132 11644
cf13d699
NC
11645 value = reloc->r_addend
11646 + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11647 - saved_sym->st_value);
252b5132 11648
cf13d699 11649 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
252b5132 11650
cf13d699
NC
11651 saved_sym = NULL;
11652 return TRUE;
11653 }
11654 break;
11655 default:
11656 if (saved_sym != NULL)
071436c6 11657 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
cf13d699
NC
11658 break;
11659 }
11660 break;
11661 }
6ff71e76
NC
11662
11663 case EM_RL78:
11664 {
11665 static bfd_vma saved_sym1 = 0;
11666 static bfd_vma saved_sym2 = 0;
11667 static bfd_vma value;
11668
11669 switch (reloc_type)
11670 {
11671 case 0x80: /* R_RL78_SYM. */
11672 saved_sym1 = saved_sym2;
11673 saved_sym2 = symtab[get_reloc_symindex (reloc->r_info)].st_value;
11674 saved_sym2 += reloc->r_addend;
11675 return TRUE;
11676
11677 case 0x83: /* R_RL78_OPsub. */
11678 value = saved_sym1 - saved_sym2;
11679 saved_sym2 = saved_sym1 = 0;
11680 return TRUE;
11681 break;
11682
11683 case 0x41: /* R_RL78_ABS32. */
11684 byte_put (start + reloc->r_offset, value, 4);
11685 value = 0;
11686 return TRUE;
11687
11688 case 0x43: /* R_RL78_ABS16. */
11689 byte_put (start + reloc->r_offset, value, 2);
11690 value = 0;
11691 return TRUE;
11692
11693 default:
11694 break;
11695 }
11696 break;
11697 }
252b5132
RH
11698 }
11699
cf13d699 11700 return FALSE;
252b5132
RH
11701}
11702
aca88567
NC
11703/* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
11704 DWARF debug sections. This is a target specific test. Note - we do not
11705 go through the whole including-target-headers-multiple-times route, (as
11706 we have already done with <elf/h8.h>) because this would become very
11707 messy and even then this function would have to contain target specific
11708 information (the names of the relocs instead of their numeric values).
11709 FIXME: This is not the correct way to solve this problem. The proper way
11710 is to have target specific reloc sizing and typing functions created by
11711 the reloc-macros.h header, in the same way that it already creates the
11712 reloc naming functions. */
11713
11714static bfd_boolean
11715is_32bit_abs_reloc (unsigned int reloc_type)
11716{
d347c9df 11717 /* Please keep this table alpha-sorted for ease of visual lookup. */
aca88567
NC
11718 switch (elf_header.e_machine)
11719 {
41e92641 11720 case EM_386:
22abe556 11721 case EM_IAMCU:
41e92641 11722 return reloc_type == 1; /* R_386_32. */
aca88567
NC
11723 case EM_68K:
11724 return reloc_type == 1; /* R_68K_32. */
11725 case EM_860:
11726 return reloc_type == 1; /* R_860_32. */
137b6b5f
AM
11727 case EM_960:
11728 return reloc_type == 2; /* R_960_32. */
a06ea964
NC
11729 case EM_AARCH64:
11730 return reloc_type == 258; /* R_AARCH64_ABS32 */
d347c9df
PS
11731 case EM_ADAPTEVA_EPIPHANY:
11732 return reloc_type == 3;
aca88567 11733 case EM_ALPHA:
137b6b5f 11734 return reloc_type == 1; /* R_ALPHA_REFLONG. */
41e92641
NC
11735 case EM_ARC:
11736 return reloc_type == 1; /* R_ARC_32. */
886a2506
NC
11737 case EM_ARC_COMPACT:
11738 case EM_ARC_COMPACT2:
11739 return reloc_type == 4; /* R_ARC_32. */
41e92641
NC
11740 case EM_ARM:
11741 return reloc_type == 2; /* R_ARM_ABS32 */
cb8f3167 11742 case EM_AVR_OLD:
aca88567
NC
11743 case EM_AVR:
11744 return reloc_type == 1;
11745 case EM_BLACKFIN:
11746 return reloc_type == 0x12; /* R_byte4_data. */
11747 case EM_CRIS:
11748 return reloc_type == 3; /* R_CRIS_32. */
11749 case EM_CR16:
11750 return reloc_type == 3; /* R_CR16_NUM32. */
11751 case EM_CRX:
11752 return reloc_type == 15; /* R_CRX_NUM32. */
11753 case EM_CYGNUS_FRV:
11754 return reloc_type == 1;
41e92641
NC
11755 case EM_CYGNUS_D10V:
11756 case EM_D10V:
11757 return reloc_type == 6; /* R_D10V_32. */
aca88567
NC
11758 case EM_CYGNUS_D30V:
11759 case EM_D30V:
11760 return reloc_type == 12; /* R_D30V_32_NORMAL. */
41e92641
NC
11761 case EM_DLX:
11762 return reloc_type == 3; /* R_DLX_RELOC_32. */
aca88567
NC
11763 case EM_CYGNUS_FR30:
11764 case EM_FR30:
11765 return reloc_type == 3; /* R_FR30_32. */
3f8107ab
AM
11766 case EM_FT32:
11767 return reloc_type == 1; /* R_FT32_32. */
aca88567
NC
11768 case EM_H8S:
11769 case EM_H8_300:
11770 case EM_H8_300H:
11771 return reloc_type == 1; /* R_H8_DIR32. */
3730236a 11772 case EM_IA_64:
d1c4b12b
NC
11773 return reloc_type == 0x65 /* R_IA64_SECREL32LSB. */
11774 || reloc_type == 0x25; /* R_IA64_DIR32LSB. */
aca88567
NC
11775 case EM_IP2K_OLD:
11776 case EM_IP2K:
11777 return reloc_type == 2; /* R_IP2K_32. */
11778 case EM_IQ2000:
11779 return reloc_type == 2; /* R_IQ2000_32. */
84e94c90
NC
11780 case EM_LATTICEMICO32:
11781 return reloc_type == 3; /* R_LM32_32. */
ff7eeb89 11782 case EM_M32C_OLD:
aca88567
NC
11783 case EM_M32C:
11784 return reloc_type == 3; /* R_M32C_32. */
11785 case EM_M32R:
11786 return reloc_type == 34; /* R_M32R_32_RELA. */
adec12c1
AM
11787 case EM_68HC11:
11788 case EM_68HC12:
11789 return reloc_type == 6; /* R_M68HC11_32. */
aca88567
NC
11790 case EM_MCORE:
11791 return reloc_type == 1; /* R_MCORE_ADDR32. */
11792 case EM_CYGNUS_MEP:
11793 return reloc_type == 4; /* R_MEP_32. */
a3c62988
NC
11794 case EM_METAG:
11795 return reloc_type == 2; /* R_METAG_ADDR32. */
137b6b5f
AM
11796 case EM_MICROBLAZE:
11797 return reloc_type == 1; /* R_MICROBLAZE_32. */
aca88567
NC
11798 case EM_MIPS:
11799 return reloc_type == 2; /* R_MIPS_32. */
11800 case EM_MMIX:
11801 return reloc_type == 4; /* R_MMIX_32. */
11802 case EM_CYGNUS_MN10200:
11803 case EM_MN10200:
11804 return reloc_type == 1; /* R_MN10200_32. */
11805 case EM_CYGNUS_MN10300:
11806 case EM_MN10300:
11807 return reloc_type == 1; /* R_MN10300_32. */
5506d11a
AM
11808 case EM_MOXIE:
11809 return reloc_type == 1; /* R_MOXIE_32. */
aca88567
NC
11810 case EM_MSP430_OLD:
11811 case EM_MSP430:
13761a11 11812 return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32. */
aca88567
NC
11813 case EM_MT:
11814 return reloc_type == 2; /* R_MT_32. */
35c08157
KLC
11815 case EM_NDS32:
11816 return reloc_type == 20; /* R_NDS32_RELA. */
3e0873ac 11817 case EM_ALTERA_NIOS2:
36591ba1 11818 return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32. */
3e0873ac
NC
11819 case EM_NIOS32:
11820 return reloc_type == 1; /* R_NIOS_32. */
73589c9d
CS
11821 case EM_OR1K:
11822 return reloc_type == 1; /* R_OR1K_32. */
aca88567 11823 case EM_PARISC:
5fda8eca
NC
11824 return (reloc_type == 1 /* R_PARISC_DIR32. */
11825 || reloc_type == 41); /* R_PARISC_SECREL32. */
aca88567
NC
11826 case EM_PJ:
11827 case EM_PJ_OLD:
11828 return reloc_type == 1; /* R_PJ_DATA_DIR32. */
11829 case EM_PPC64:
11830 return reloc_type == 1; /* R_PPC64_ADDR32. */
11831 case EM_PPC:
11832 return reloc_type == 1; /* R_PPC_ADDR32. */
e23eba97
NC
11833 case EM_RISCV:
11834 return reloc_type == 1; /* R_RISCV_32. */
99c513f6
DD
11835 case EM_RL78:
11836 return reloc_type == 1; /* R_RL78_DIR32. */
c7927a3c
NC
11837 case EM_RX:
11838 return reloc_type == 1; /* R_RX_DIR32. */
aca88567
NC
11839 case EM_S370:
11840 return reloc_type == 1; /* R_I370_ADDR31. */
11841 case EM_S390_OLD:
11842 case EM_S390:
11843 return reloc_type == 4; /* R_S390_32. */
41e92641
NC
11844 case EM_SCORE:
11845 return reloc_type == 8; /* R_SCORE_ABS32. */
aca88567
NC
11846 case EM_SH:
11847 return reloc_type == 1; /* R_SH_DIR32. */
11848 case EM_SPARC32PLUS:
11849 case EM_SPARCV9:
11850 case EM_SPARC:
11851 return reloc_type == 3 /* R_SPARC_32. */
11852 || reloc_type == 23; /* R_SPARC_UA32. */
a7dd7d05
AM
11853 case EM_SPU:
11854 return reloc_type == 6; /* R_SPU_ADDR32 */
40b36596
JM
11855 case EM_TI_C6000:
11856 return reloc_type == 1; /* R_C6000_ABS32. */
aa137e4d
NC
11857 case EM_TILEGX:
11858 return reloc_type == 2; /* R_TILEGX_32. */
11859 case EM_TILEPRO:
11860 return reloc_type == 1; /* R_TILEPRO_32. */
aca88567
NC
11861 case EM_CYGNUS_V850:
11862 case EM_V850:
11863 return reloc_type == 6; /* R_V850_ABS32. */
708e2187
NC
11864 case EM_V800:
11865 return reloc_type == 0x33; /* R_V810_WORD. */
aca88567
NC
11866 case EM_VAX:
11867 return reloc_type == 1; /* R_VAX_32. */
619ed720
EB
11868 case EM_VISIUM:
11869 return reloc_type == 3; /* R_VISIUM_32. */
aca88567 11870 case EM_X86_64:
8a9036a4 11871 case EM_L1OM:
7a9068fe 11872 case EM_K1OM:
aca88567 11873 return reloc_type == 10; /* R_X86_64_32. */
c29aca4a
NC
11874 case EM_XC16X:
11875 case EM_C166:
11876 return reloc_type == 3; /* R_XC16C_ABS_32. */
f6c1a2d5
NC
11877 case EM_XGATE:
11878 return reloc_type == 4; /* R_XGATE_32. */
aca88567
NC
11879 case EM_XSTORMY16:
11880 return reloc_type == 1; /* R_XSTROMY16_32. */
11881 case EM_XTENSA_OLD:
11882 case EM_XTENSA:
11883 return reloc_type == 1; /* R_XTENSA_32. */
aca88567 11884 default:
bee0ee85
NC
11885 {
11886 static unsigned int prev_warn = 0;
11887
11888 /* Avoid repeating the same warning multiple times. */
11889 if (prev_warn != elf_header.e_machine)
11890 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
11891 elf_header.e_machine);
11892 prev_warn = elf_header.e_machine;
11893 return FALSE;
11894 }
aca88567
NC
11895 }
11896}
11897
11898/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11899 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
11900
11901static bfd_boolean
11902is_32bit_pcrel_reloc (unsigned int reloc_type)
11903{
11904 switch (elf_header.e_machine)
d347c9df 11905 /* Please keep this table alpha-sorted for ease of visual lookup. */
aca88567 11906 {
41e92641 11907 case EM_386:
22abe556 11908 case EM_IAMCU:
3e0873ac 11909 return reloc_type == 2; /* R_386_PC32. */
aca88567 11910 case EM_68K:
3e0873ac 11911 return reloc_type == 4; /* R_68K_PC32. */
a06ea964
NC
11912 case EM_AARCH64:
11913 return reloc_type == 261; /* R_AARCH64_PREL32 */
cfb8c092
NC
11914 case EM_ADAPTEVA_EPIPHANY:
11915 return reloc_type == 6;
aca88567
NC
11916 case EM_ALPHA:
11917 return reloc_type == 10; /* R_ALPHA_SREL32. */
726c18e1
CZ
11918 case EM_ARC_COMPACT:
11919 case EM_ARC_COMPACT2:
11920 return reloc_type == 49; /* R_ARC_32_PCREL. */
41e92641 11921 case EM_ARM:
3e0873ac 11922 return reloc_type == 3; /* R_ARM_REL32 */
d347c9df
PS
11923 case EM_AVR_OLD:
11924 case EM_AVR:
11925 return reloc_type == 36; /* R_AVR_32_PCREL. */
137b6b5f
AM
11926 case EM_MICROBLAZE:
11927 return reloc_type == 2; /* R_MICROBLAZE_32_PCREL. */
73589c9d
CS
11928 case EM_OR1K:
11929 return reloc_type == 9; /* R_OR1K_32_PCREL. */
aca88567 11930 case EM_PARISC:
85acf597 11931 return reloc_type == 9; /* R_PARISC_PCREL32. */
aca88567
NC
11932 case EM_PPC:
11933 return reloc_type == 26; /* R_PPC_REL32. */
11934 case EM_PPC64:
3e0873ac 11935 return reloc_type == 26; /* R_PPC64_REL32. */
aca88567
NC
11936 case EM_S390_OLD:
11937 case EM_S390:
3e0873ac 11938 return reloc_type == 5; /* R_390_PC32. */
aca88567 11939 case EM_SH:
3e0873ac 11940 return reloc_type == 2; /* R_SH_REL32. */
aca88567
NC
11941 case EM_SPARC32PLUS:
11942 case EM_SPARCV9:
11943 case EM_SPARC:
3e0873ac 11944 return reloc_type == 6; /* R_SPARC_DISP32. */
a7dd7d05
AM
11945 case EM_SPU:
11946 return reloc_type == 13; /* R_SPU_REL32. */
aa137e4d
NC
11947 case EM_TILEGX:
11948 return reloc_type == 6; /* R_TILEGX_32_PCREL. */
11949 case EM_TILEPRO:
11950 return reloc_type == 4; /* R_TILEPRO_32_PCREL. */
619ed720
EB
11951 case EM_VISIUM:
11952 return reloc_type == 6; /* R_VISIUM_32_PCREL */
aca88567 11953 case EM_X86_64:
8a9036a4 11954 case EM_L1OM:
7a9068fe 11955 case EM_K1OM:
3e0873ac 11956 return reloc_type == 2; /* R_X86_64_PC32. */
2fcb9706
BW
11957 case EM_XTENSA_OLD:
11958 case EM_XTENSA:
11959 return reloc_type == 14; /* R_XTENSA_32_PCREL. */
aca88567
NC
11960 default:
11961 /* Do not abort or issue an error message here. Not all targets use
11962 pc-relative 32-bit relocs in their DWARF debug information and we
11963 have already tested for target coverage in is_32bit_abs_reloc. A
cf13d699
NC
11964 more helpful warning message will be generated by apply_relocations
11965 anyway, so just return. */
aca88567
NC
11966 return FALSE;
11967 }
11968}
11969
11970/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11971 a 64-bit absolute RELA relocation used in DWARF debug sections. */
11972
11973static bfd_boolean
11974is_64bit_abs_reloc (unsigned int reloc_type)
11975{
11976 switch (elf_header.e_machine)
11977 {
a06ea964
NC
11978 case EM_AARCH64:
11979 return reloc_type == 257; /* R_AARCH64_ABS64. */
aca88567
NC
11980 case EM_ALPHA:
11981 return reloc_type == 2; /* R_ALPHA_REFQUAD. */
3730236a
NC
11982 case EM_IA_64:
11983 return reloc_type == 0x27; /* R_IA64_DIR64LSB. */
3e0873ac
NC
11984 case EM_PARISC:
11985 return reloc_type == 80; /* R_PARISC_DIR64. */
aca88567
NC
11986 case EM_PPC64:
11987 return reloc_type == 38; /* R_PPC64_ADDR64. */
e23eba97
NC
11988 case EM_RISCV:
11989 return reloc_type == 2; /* R_RISCV_64. */
aca88567
NC
11990 case EM_SPARC32PLUS:
11991 case EM_SPARCV9:
11992 case EM_SPARC:
11993 return reloc_type == 54; /* R_SPARC_UA64. */
11994 case EM_X86_64:
8a9036a4 11995 case EM_L1OM:
7a9068fe 11996 case EM_K1OM:
aca88567 11997 return reloc_type == 1; /* R_X86_64_64. */
e819ade1
AS
11998 case EM_S390_OLD:
11999 case EM_S390:
aa137e4d
NC
12000 return reloc_type == 22; /* R_S390_64. */
12001 case EM_TILEGX:
12002 return reloc_type == 1; /* R_TILEGX_64. */
85a82265 12003 case EM_MIPS:
aa137e4d 12004 return reloc_type == 18; /* R_MIPS_64. */
aca88567
NC
12005 default:
12006 return FALSE;
12007 }
12008}
12009
85acf597
RH
12010/* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
12011 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
12012
12013static bfd_boolean
12014is_64bit_pcrel_reloc (unsigned int reloc_type)
12015{
12016 switch (elf_header.e_machine)
12017 {
a06ea964
NC
12018 case EM_AARCH64:
12019 return reloc_type == 260; /* R_AARCH64_PREL64. */
85acf597 12020 case EM_ALPHA:
aa137e4d 12021 return reloc_type == 11; /* R_ALPHA_SREL64. */
85acf597 12022 case EM_IA_64:
aa137e4d 12023 return reloc_type == 0x4f; /* R_IA64_PCREL64LSB. */
85acf597 12024 case EM_PARISC:
aa137e4d 12025 return reloc_type == 72; /* R_PARISC_PCREL64. */
85acf597 12026 case EM_PPC64:
aa137e4d 12027 return reloc_type == 44; /* R_PPC64_REL64. */
85acf597
RH
12028 case EM_SPARC32PLUS:
12029 case EM_SPARCV9:
12030 case EM_SPARC:
aa137e4d 12031 return reloc_type == 46; /* R_SPARC_DISP64. */
85acf597 12032 case EM_X86_64:
8a9036a4 12033 case EM_L1OM:
7a9068fe 12034 case EM_K1OM:
aa137e4d 12035 return reloc_type == 24; /* R_X86_64_PC64. */
85acf597
RH
12036 case EM_S390_OLD:
12037 case EM_S390:
aa137e4d
NC
12038 return reloc_type == 23; /* R_S390_PC64. */
12039 case EM_TILEGX:
12040 return reloc_type == 5; /* R_TILEGX_64_PCREL. */
85acf597
RH
12041 default:
12042 return FALSE;
12043 }
12044}
12045
4dc3c23d
AM
12046/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12047 a 24-bit absolute RELA relocation used in DWARF debug sections. */
12048
12049static bfd_boolean
12050is_24bit_abs_reloc (unsigned int reloc_type)
12051{
12052 switch (elf_header.e_machine)
12053 {
12054 case EM_CYGNUS_MN10200:
12055 case EM_MN10200:
12056 return reloc_type == 4; /* R_MN10200_24. */
3ee6e4fb
NC
12057 case EM_FT32:
12058 return reloc_type == 5; /* R_FT32_20. */
4dc3c23d
AM
12059 default:
12060 return FALSE;
12061 }
12062}
12063
aca88567
NC
12064/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12065 a 16-bit absolute RELA relocation used in DWARF debug sections. */
12066
12067static bfd_boolean
12068is_16bit_abs_reloc (unsigned int reloc_type)
4b78141a 12069{
d347c9df 12070 /* Please keep this table alpha-sorted for ease of visual lookup. */
4b78141a
NC
12071 switch (elf_header.e_machine)
12072 {
886a2506
NC
12073 case EM_ARC:
12074 case EM_ARC_COMPACT:
12075 case EM_ARC_COMPACT2:
12076 return reloc_type == 2; /* R_ARC_16. */
d347c9df
PS
12077 case EM_ADAPTEVA_EPIPHANY:
12078 return reloc_type == 5;
aca88567
NC
12079 case EM_AVR_OLD:
12080 case EM_AVR:
12081 return reloc_type == 4; /* R_AVR_16. */
41e92641
NC
12082 case EM_CYGNUS_D10V:
12083 case EM_D10V:
12084 return reloc_type == 3; /* R_D10V_16. */
4b78141a
NC
12085 case EM_H8S:
12086 case EM_H8_300:
12087 case EM_H8_300H:
aca88567
NC
12088 return reloc_type == R_H8_DIR16;
12089 case EM_IP2K_OLD:
12090 case EM_IP2K:
12091 return reloc_type == 1; /* R_IP2K_16. */
ff7eeb89 12092 case EM_M32C_OLD:
f4236fe4
DD
12093 case EM_M32C:
12094 return reloc_type == 1; /* R_M32C_16 */
d347c9df
PS
12095 case EM_CYGNUS_MN10200:
12096 case EM_MN10200:
12097 return reloc_type == 2; /* R_MN10200_16. */
12098 case EM_CYGNUS_MN10300:
12099 case EM_MN10300:
12100 return reloc_type == 2; /* R_MN10300_16. */
aca88567 12101 case EM_MSP430:
13761a11
NC
12102 if (uses_msp430x_relocs ())
12103 return reloc_type == 2; /* R_MSP430_ABS16. */
1a0670f3 12104 /* Fall through. */
78c8d46c 12105 case EM_MSP430_OLD:
aca88567 12106 return reloc_type == 5; /* R_MSP430_16_BYTE. */
35c08157
KLC
12107 case EM_NDS32:
12108 return reloc_type == 19; /* R_NDS32_RELA. */
3e0873ac 12109 case EM_ALTERA_NIOS2:
36591ba1 12110 return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16. */
3e0873ac
NC
12111 case EM_NIOS32:
12112 return reloc_type == 9; /* R_NIOS_16. */
73589c9d
CS
12113 case EM_OR1K:
12114 return reloc_type == 2; /* R_OR1K_16. */
40b36596
JM
12115 case EM_TI_C6000:
12116 return reloc_type == 2; /* R_C6000_ABS16. */
d347c9df
PS
12117 case EM_VISIUM:
12118 return reloc_type == 2; /* R_VISIUM_16. */
c29aca4a
NC
12119 case EM_XC16X:
12120 case EM_C166:
12121 return reloc_type == 2; /* R_XC16C_ABS_16. */
f6c1a2d5
NC
12122 case EM_XGATE:
12123 return reloc_type == 3; /* R_XGATE_16. */
4b78141a 12124 default:
aca88567 12125 return FALSE;
4b78141a
NC
12126 }
12127}
12128
2a7b2e88
JK
12129/* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
12130 relocation entries (possibly formerly used for SHT_GROUP sections). */
12131
12132static bfd_boolean
12133is_none_reloc (unsigned int reloc_type)
12134{
12135 switch (elf_header.e_machine)
12136 {
cb8f3167 12137 case EM_386: /* R_386_NONE. */
d347c9df 12138 case EM_68K: /* R_68K_NONE. */
cfb8c092 12139 case EM_ADAPTEVA_EPIPHANY:
d347c9df
PS
12140 case EM_ALPHA: /* R_ALPHA_NONE. */
12141 case EM_ALTERA_NIOS2: /* R_NIOS2_NONE. */
886a2506 12142 case EM_ARC: /* R_ARC_NONE. */
886a2506 12143 case EM_ARC_COMPACT2: /* R_ARC_NONE. */
d347c9df 12144 case EM_ARC_COMPACT: /* R_ARC_NONE. */
cb8f3167 12145 case EM_ARM: /* R_ARM_NONE. */
d347c9df 12146 case EM_C166: /* R_XC16X_NONE. */
cb8f3167 12147 case EM_CRIS: /* R_CRIS_NONE. */
d347c9df
PS
12148 case EM_FT32: /* R_FT32_NONE. */
12149 case EM_IA_64: /* R_IA64_NONE. */
7a9068fe 12150 case EM_K1OM: /* R_X86_64_NONE. */
d347c9df
PS
12151 case EM_L1OM: /* R_X86_64_NONE. */
12152 case EM_M32R: /* R_M32R_NONE. */
12153 case EM_MIPS: /* R_MIPS_NONE. */
cb8f3167 12154 case EM_MN10300: /* R_MN10300_NONE. */
5506d11a 12155 case EM_MOXIE: /* R_MOXIE_NONE. */
d347c9df
PS
12156 case EM_NIOS32: /* R_NIOS_NONE. */
12157 case EM_OR1K: /* R_OR1K_NONE. */
12158 case EM_PARISC: /* R_PARISC_NONE. */
12159 case EM_PPC64: /* R_PPC64_NONE. */
12160 case EM_PPC: /* R_PPC_NONE. */
e23eba97 12161 case EM_RISCV: /* R_RISCV_NONE. */
d347c9df
PS
12162 case EM_S390: /* R_390_NONE. */
12163 case EM_S390_OLD:
12164 case EM_SH: /* R_SH_NONE. */
12165 case EM_SPARC32PLUS:
12166 case EM_SPARC: /* R_SPARC_NONE. */
12167 case EM_SPARCV9:
aa137e4d
NC
12168 case EM_TILEGX: /* R_TILEGX_NONE. */
12169 case EM_TILEPRO: /* R_TILEPRO_NONE. */
d347c9df
PS
12170 case EM_TI_C6000:/* R_C6000_NONE. */
12171 case EM_X86_64: /* R_X86_64_NONE. */
c29aca4a 12172 case EM_XC16X:
cb8f3167 12173 return reloc_type == 0;
d347c9df 12174
a06ea964
NC
12175 case EM_AARCH64:
12176 return reloc_type == 0 || reloc_type == 256;
d347c9df
PS
12177 case EM_AVR_OLD:
12178 case EM_AVR:
12179 return (reloc_type == 0 /* R_AVR_NONE. */
12180 || reloc_type == 30 /* R_AVR_DIFF8. */
12181 || reloc_type == 31 /* R_AVR_DIFF16. */
12182 || reloc_type == 32 /* R_AVR_DIFF32. */);
12183 case EM_METAG:
12184 return reloc_type == 3; /* R_METAG_NONE. */
35c08157
KLC
12185 case EM_NDS32:
12186 return (reloc_type == 0 /* R_XTENSA_NONE. */
12187 || reloc_type == 204 /* R_NDS32_DIFF8. */
12188 || reloc_type == 205 /* R_NDS32_DIFF16. */
12189 || reloc_type == 206 /* R_NDS32_DIFF32. */
12190 || reloc_type == 207 /* R_NDS32_ULEB128. */);
58332dda
JK
12191 case EM_XTENSA_OLD:
12192 case EM_XTENSA:
4dc3c23d
AM
12193 return (reloc_type == 0 /* R_XTENSA_NONE. */
12194 || reloc_type == 17 /* R_XTENSA_DIFF8. */
12195 || reloc_type == 18 /* R_XTENSA_DIFF16. */
12196 || reloc_type == 19 /* R_XTENSA_DIFF32. */);
2a7b2e88
JK
12197 }
12198 return FALSE;
12199}
12200
d1c4b12b
NC
12201/* Returns TRUE if there is a relocation against
12202 section NAME at OFFSET bytes. */
12203
12204bfd_boolean
12205reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
12206{
12207 Elf_Internal_Rela * relocs;
12208 Elf_Internal_Rela * rp;
12209
12210 if (dsec == NULL || dsec->reloc_info == NULL)
12211 return FALSE;
12212
12213 relocs = (Elf_Internal_Rela *) dsec->reloc_info;
12214
12215 for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
12216 if (rp->r_offset == offset)
12217 return TRUE;
12218
12219 return FALSE;
12220}
12221
cf13d699
NC
12222/* Apply relocations to a section.
12223 Note: So far support has been added only for those relocations
12224 which can be found in debug sections.
d1c4b12b
NC
12225 If RELOCS_RETURN is non-NULL then returns in it a pointer to the
12226 loaded relocs. It is then the caller's responsibility to free them.
cf13d699 12227 FIXME: Add support for more relocations ? */
1b315056 12228
cf13d699 12229static void
d1c4b12b
NC
12230apply_relocations (void * file,
12231 const Elf_Internal_Shdr * section,
12232 unsigned char * start,
12233 bfd_size_type size,
1449284b 12234 void ** relocs_return,
d1c4b12b 12235 unsigned long * num_relocs_return)
1b315056 12236{
cf13d699 12237 Elf_Internal_Shdr * relsec;
0d2a7a93 12238 unsigned char * end = start + size;
cb8f3167 12239
d1c4b12b
NC
12240 if (relocs_return != NULL)
12241 {
12242 * (Elf_Internal_Rela **) relocs_return = NULL;
12243 * num_relocs_return = 0;
12244 }
12245
cf13d699
NC
12246 if (elf_header.e_type != ET_REL)
12247 return;
1b315056 12248
cf13d699 12249 /* Find the reloc section associated with the section. */
5b18a4bc
NC
12250 for (relsec = section_headers;
12251 relsec < section_headers + elf_header.e_shnum;
12252 ++relsec)
252b5132 12253 {
41e92641
NC
12254 bfd_boolean is_rela;
12255 unsigned long num_relocs;
2cf0635d
NC
12256 Elf_Internal_Rela * relocs;
12257 Elf_Internal_Rela * rp;
12258 Elf_Internal_Shdr * symsec;
12259 Elf_Internal_Sym * symtab;
ba5cdace 12260 unsigned long num_syms;
2cf0635d 12261 Elf_Internal_Sym * sym;
252b5132 12262
41e92641 12263 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
4fbb74a6
AM
12264 || relsec->sh_info >= elf_header.e_shnum
12265 || section_headers + relsec->sh_info != section
c256ffe7 12266 || relsec->sh_size == 0
4fbb74a6 12267 || relsec->sh_link >= elf_header.e_shnum)
5b18a4bc 12268 continue;
428409d5 12269
41e92641
NC
12270 is_rela = relsec->sh_type == SHT_RELA;
12271
12272 if (is_rela)
12273 {
3f5e193b
NC
12274 if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
12275 relsec->sh_size, & relocs, & num_relocs))
41e92641
NC
12276 return;
12277 }
12278 else
12279 {
3f5e193b
NC
12280 if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
12281 relsec->sh_size, & relocs, & num_relocs))
41e92641
NC
12282 return;
12283 }
12284
12285 /* SH uses RELA but uses in place value instead of the addend field. */
12286 if (elf_header.e_machine == EM_SH)
12287 is_rela = FALSE;
428409d5 12288
4fbb74a6 12289 symsec = section_headers + relsec->sh_link;
1449284b
NC
12290 if (symsec->sh_type != SHT_SYMTAB
12291 && symsec->sh_type != SHT_DYNSYM)
12292 return;
ba5cdace 12293 symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec, & num_syms);
103f02d3 12294
41e92641 12295 for (rp = relocs; rp < relocs + num_relocs; ++rp)
252b5132 12296 {
41e92641
NC
12297 bfd_vma addend;
12298 unsigned int reloc_type;
12299 unsigned int reloc_size;
91d6fa6a 12300 unsigned char * rloc;
ba5cdace 12301 unsigned long sym_index;
4b78141a 12302
aca88567 12303 reloc_type = get_reloc_type (rp->r_info);
41e92641 12304
98fb390a 12305 if (target_specific_reloc_handling (rp, start, symtab))
2a7b2e88 12306 continue;
98fb390a
NC
12307 else if (is_none_reloc (reloc_type))
12308 continue;
12309 else if (is_32bit_abs_reloc (reloc_type)
12310 || is_32bit_pcrel_reloc (reloc_type))
aca88567 12311 reloc_size = 4;
85acf597
RH
12312 else if (is_64bit_abs_reloc (reloc_type)
12313 || is_64bit_pcrel_reloc (reloc_type))
aca88567 12314 reloc_size = 8;
4dc3c23d
AM
12315 else if (is_24bit_abs_reloc (reloc_type))
12316 reloc_size = 3;
aca88567
NC
12317 else if (is_16bit_abs_reloc (reloc_type))
12318 reloc_size = 2;
12319 else
4b78141a 12320 {
bee0ee85
NC
12321 static unsigned int prev_reloc = 0;
12322 if (reloc_type != prev_reloc)
12323 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
12324 reloc_type, printable_section_name (section));
12325 prev_reloc = reloc_type;
4b78141a
NC
12326 continue;
12327 }
103f02d3 12328
91d6fa6a 12329 rloc = start + rp->r_offset;
c8da6823 12330 if ((rloc + reloc_size) > end || (rloc < start))
700dd8b7
L
12331 {
12332 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
12333 (unsigned long) rp->r_offset,
74e1a04b 12334 printable_section_name (section));
700dd8b7
L
12335 continue;
12336 }
103f02d3 12337
ba5cdace
NC
12338 sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
12339 if (sym_index >= num_syms)
12340 {
12341 warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
74e1a04b 12342 sym_index, printable_section_name (section));
ba5cdace
NC
12343 continue;
12344 }
12345 sym = symtab + sym_index;
41e92641
NC
12346
12347 /* If the reloc has a symbol associated with it,
55f25fc3
L
12348 make sure that it is of an appropriate type.
12349
12350 Relocations against symbols without type can happen.
12351 Gcc -feliminate-dwarf2-dups may generate symbols
12352 without type for debug info.
12353
12354 Icc generates relocations against function symbols
12355 instead of local labels.
12356
12357 Relocations against object symbols can happen, eg when
12358 referencing a global array. For an example of this see
12359 the _clz.o binary in libgcc.a. */
aca88567 12360 if (sym != symtab
b8871f35 12361 && ELF_ST_TYPE (sym->st_info) != STT_COMMON
55f25fc3 12362 && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
5b18a4bc 12363 {
41e92641 12364 warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
aca88567 12365 get_symbol_type (ELF_ST_TYPE (sym->st_info)),
99dcb0b9 12366 (long int)(rp - relocs),
74e1a04b 12367 printable_section_name (relsec));
aca88567 12368 continue;
5b18a4bc 12369 }
252b5132 12370
4dc3c23d
AM
12371 addend = 0;
12372 if (is_rela)
12373 addend += rp->r_addend;
c47320c3
AM
12374 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
12375 partial_inplace. */
4dc3c23d
AM
12376 if (!is_rela
12377 || (elf_header.e_machine == EM_XTENSA
12378 && reloc_type == 1)
12379 || ((elf_header.e_machine == EM_PJ
12380 || elf_header.e_machine == EM_PJ_OLD)
c47320c3
AM
12381 && reloc_type == 1)
12382 || ((elf_header.e_machine == EM_D30V
12383 || elf_header.e_machine == EM_CYGNUS_D30V)
12384 && reloc_type == 12))
91d6fa6a 12385 addend += byte_get (rloc, reloc_size);
cb8f3167 12386
85acf597
RH
12387 if (is_32bit_pcrel_reloc (reloc_type)
12388 || is_64bit_pcrel_reloc (reloc_type))
12389 {
12390 /* On HPPA, all pc-relative relocations are biased by 8. */
12391 if (elf_header.e_machine == EM_PARISC)
12392 addend -= 8;
91d6fa6a 12393 byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
85acf597
RH
12394 reloc_size);
12395 }
41e92641 12396 else
91d6fa6a 12397 byte_put (rloc, addend + sym->st_value, reloc_size);
5b18a4bc 12398 }
252b5132 12399
5b18a4bc 12400 free (symtab);
d1c4b12b
NC
12401
12402 if (relocs_return)
12403 {
12404 * (Elf_Internal_Rela **) relocs_return = relocs;
12405 * num_relocs_return = num_relocs;
12406 }
12407 else
12408 free (relocs);
12409
5b18a4bc
NC
12410 break;
12411 }
5b18a4bc 12412}
103f02d3 12413
cf13d699
NC
12414#ifdef SUPPORT_DISASSEMBLY
12415static int
12416disassemble_section (Elf_Internal_Shdr * section, FILE * file)
12417{
74e1a04b 12418 printf (_("\nAssembly dump of section %s\n"), printable_section_name (section));
cf13d699 12419
74e1a04b 12420 /* FIXME: XXX -- to be done --- XXX */
cf13d699
NC
12421
12422 return 1;
12423}
12424#endif
12425
12426/* Reads in the contents of SECTION from FILE, returning a pointer
12427 to a malloc'ed buffer or NULL if something went wrong. */
12428
12429static char *
12430get_section_contents (Elf_Internal_Shdr * section, FILE * file)
12431{
12432 bfd_size_type num_bytes;
12433
12434 num_bytes = section->sh_size;
12435
12436 if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
12437 {
12438 printf (_("\nSection '%s' has no data to dump.\n"),
74e1a04b 12439 printable_section_name (section));
cf13d699
NC
12440 return NULL;
12441 }
12442
3f5e193b
NC
12443 return (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
12444 _("section contents"));
cf13d699
NC
12445}
12446
0e602686
NC
12447/* Uncompresses a section that was compressed using zlib, in place. */
12448
12449static bfd_boolean
12450uncompress_section_contents (unsigned char **buffer,
12451 dwarf_size_type uncompressed_size,
12452 dwarf_size_type *size)
12453{
12454 dwarf_size_type compressed_size = *size;
12455 unsigned char * compressed_buffer = *buffer;
12456 unsigned char * uncompressed_buffer;
12457 z_stream strm;
12458 int rc;
12459
12460 /* It is possible the section consists of several compressed
12461 buffers concatenated together, so we uncompress in a loop. */
12462 /* PR 18313: The state field in the z_stream structure is supposed
12463 to be invisible to the user (ie us), but some compilers will
12464 still complain about it being used without initialisation. So
12465 we first zero the entire z_stream structure and then set the fields
12466 that we need. */
12467 memset (& strm, 0, sizeof strm);
12468 strm.avail_in = compressed_size;
12469 strm.next_in = (Bytef *) compressed_buffer;
12470 strm.avail_out = uncompressed_size;
12471 uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
12472
12473 rc = inflateInit (& strm);
12474 while (strm.avail_in > 0)
12475 {
12476 if (rc != Z_OK)
12477 goto fail;
12478 strm.next_out = ((Bytef *) uncompressed_buffer
12479 + (uncompressed_size - strm.avail_out));
12480 rc = inflate (&strm, Z_FINISH);
12481 if (rc != Z_STREAM_END)
12482 goto fail;
12483 rc = inflateReset (& strm);
12484 }
12485 rc = inflateEnd (& strm);
12486 if (rc != Z_OK
12487 || strm.avail_out != 0)
12488 goto fail;
12489
12490 *buffer = uncompressed_buffer;
12491 *size = uncompressed_size;
12492 return TRUE;
12493
12494 fail:
12495 free (uncompressed_buffer);
12496 /* Indicate decompression failure. */
12497 *buffer = NULL;
12498 return FALSE;
12499}
dd24e3da 12500
cf13d699
NC
12501static void
12502dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
12503{
0e602686
NC
12504 Elf_Internal_Shdr * relsec;
12505 bfd_size_type num_bytes;
fd8008d8
L
12506 unsigned char * data;
12507 unsigned char * end;
12508 unsigned char * real_start;
12509 unsigned char * start;
0e602686 12510 bfd_boolean some_strings_shown;
cf13d699 12511
fd8008d8
L
12512 real_start = start = (unsigned char *) get_section_contents (section,
12513 file);
cf13d699
NC
12514 if (start == NULL)
12515 return;
0e602686 12516 num_bytes = section->sh_size;
cf13d699 12517
74e1a04b 12518 printf (_("\nString dump of section '%s':\n"), printable_section_name (section));
cf13d699 12519
0e602686
NC
12520 if (decompress_dumps)
12521 {
12522 dwarf_size_type new_size = num_bytes;
12523 dwarf_size_type uncompressed_size = 0;
12524
12525 if ((section->sh_flags & SHF_COMPRESSED) != 0)
12526 {
12527 Elf_Internal_Chdr chdr;
12528 unsigned int compression_header_size
12529 = get_compression_header (& chdr, (unsigned char *) start);
12530
813dabb9 12531 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
0e602686 12532 {
813dabb9
L
12533 warn (_("section '%s' has unsupported compress type: %d\n"),
12534 printable_section_name (section), chdr.ch_type);
12535 return;
12536 }
12537 else if (chdr.ch_addralign != section->sh_addralign)
12538 {
12539 warn (_("compressed section '%s' is corrupted\n"),
12540 printable_section_name (section));
12541 return;
0e602686 12542 }
813dabb9
L
12543 uncompressed_size = chdr.ch_size;
12544 start += compression_header_size;
12545 new_size -= compression_header_size;
0e602686
NC
12546 }
12547 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12548 {
12549 /* Read the zlib header. In this case, it should be "ZLIB"
12550 followed by the uncompressed section size, 8 bytes in
12551 big-endian order. */
12552 uncompressed_size = start[4]; uncompressed_size <<= 8;
12553 uncompressed_size += start[5]; uncompressed_size <<= 8;
12554 uncompressed_size += start[6]; uncompressed_size <<= 8;
12555 uncompressed_size += start[7]; uncompressed_size <<= 8;
12556 uncompressed_size += start[8]; uncompressed_size <<= 8;
12557 uncompressed_size += start[9]; uncompressed_size <<= 8;
12558 uncompressed_size += start[10]; uncompressed_size <<= 8;
12559 uncompressed_size += start[11];
12560 start += 12;
12561 new_size -= 12;
12562 }
12563
12564 if (uncompressed_size
fd8008d8 12565 && uncompress_section_contents (& start,
0e602686
NC
12566 uncompressed_size, & new_size))
12567 num_bytes = new_size;
12568 }
fd8008d8 12569
cf13d699
NC
12570 /* If the section being dumped has relocations against it the user might
12571 be expecting these relocations to have been applied. Check for this
12572 case and issue a warning message in order to avoid confusion.
12573 FIXME: Maybe we ought to have an option that dumps a section with
12574 relocs applied ? */
12575 for (relsec = section_headers;
12576 relsec < section_headers + elf_header.e_shnum;
12577 ++relsec)
12578 {
12579 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12580 || relsec->sh_info >= elf_header.e_shnum
12581 || section_headers + relsec->sh_info != section
12582 || relsec->sh_size == 0
12583 || relsec->sh_link >= elf_header.e_shnum)
12584 continue;
12585
12586 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12587 break;
12588 }
12589
cf13d699
NC
12590 data = start;
12591 end = start + num_bytes;
12592 some_strings_shown = FALSE;
12593
12594 while (data < end)
12595 {
12596 while (!ISPRINT (* data))
12597 if (++ data >= end)
12598 break;
12599
12600 if (data < end)
12601 {
071436c6
NC
12602 size_t maxlen = end - data;
12603
cf13d699 12604#ifndef __MSVCRT__
c975cc98
NC
12605 /* PR 11128: Use two separate invocations in order to work
12606 around bugs in the Solaris 8 implementation of printf. */
12607 printf (" [%6tx] ", data - start);
cf13d699 12608#else
071436c6 12609 printf (" [%6Ix] ", (size_t) (data - start));
cf13d699 12610#endif
4082ef84
NC
12611 if (maxlen > 0)
12612 {
fd8008d8 12613 print_symbol ((int) maxlen, (const char *) data);
4082ef84 12614 putchar ('\n');
fd8008d8 12615 data += strnlen ((const char *) data, maxlen);
4082ef84
NC
12616 }
12617 else
12618 {
12619 printf (_("<corrupt>\n"));
12620 data = end;
12621 }
cf13d699
NC
12622 some_strings_shown = TRUE;
12623 }
12624 }
12625
12626 if (! some_strings_shown)
12627 printf (_(" No strings found in this section."));
12628
0e602686 12629 free (real_start);
cf13d699
NC
12630
12631 putchar ('\n');
12632}
12633
12634static void
12635dump_section_as_bytes (Elf_Internal_Shdr * section,
12636 FILE * file,
12637 bfd_boolean relocate)
12638{
12639 Elf_Internal_Shdr * relsec;
0e602686
NC
12640 bfd_size_type bytes;
12641 bfd_size_type section_size;
12642 bfd_vma addr;
12643 unsigned char * data;
12644 unsigned char * real_start;
12645 unsigned char * start;
12646
12647 real_start = start = (unsigned char *) get_section_contents (section, file);
cf13d699
NC
12648 if (start == NULL)
12649 return;
0e602686 12650 section_size = section->sh_size;
cf13d699 12651
74e1a04b 12652 printf (_("\nHex dump of section '%s':\n"), printable_section_name (section));
cf13d699 12653
0e602686
NC
12654 if (decompress_dumps)
12655 {
12656 dwarf_size_type new_size = section_size;
12657 dwarf_size_type uncompressed_size = 0;
12658
12659 if ((section->sh_flags & SHF_COMPRESSED) != 0)
12660 {
12661 Elf_Internal_Chdr chdr;
12662 unsigned int compression_header_size
12663 = get_compression_header (& chdr, start);
12664
813dabb9 12665 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
0e602686 12666 {
813dabb9
L
12667 warn (_("section '%s' has unsupported compress type: %d\n"),
12668 printable_section_name (section), chdr.ch_type);
12669 return;
0e602686 12670 }
813dabb9
L
12671 else if (chdr.ch_addralign != section->sh_addralign)
12672 {
12673 warn (_("compressed section '%s' is corrupted\n"),
12674 printable_section_name (section));
12675 return;
12676 }
12677 uncompressed_size = chdr.ch_size;
12678 start += compression_header_size;
12679 new_size -= compression_header_size;
0e602686
NC
12680 }
12681 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12682 {
12683 /* Read the zlib header. In this case, it should be "ZLIB"
12684 followed by the uncompressed section size, 8 bytes in
12685 big-endian order. */
12686 uncompressed_size = start[4]; uncompressed_size <<= 8;
12687 uncompressed_size += start[5]; uncompressed_size <<= 8;
12688 uncompressed_size += start[6]; uncompressed_size <<= 8;
12689 uncompressed_size += start[7]; uncompressed_size <<= 8;
12690 uncompressed_size += start[8]; uncompressed_size <<= 8;
12691 uncompressed_size += start[9]; uncompressed_size <<= 8;
12692 uncompressed_size += start[10]; uncompressed_size <<= 8;
12693 uncompressed_size += start[11];
12694 start += 12;
12695 new_size -= 12;
12696 }
12697
12698 if (uncompressed_size
12699 && uncompress_section_contents (& start, uncompressed_size,
12700 & new_size))
12701 section_size = new_size;
12702 }
14ae95f2 12703
cf13d699
NC
12704 if (relocate)
12705 {
0e602686 12706 apply_relocations (file, section, start, section_size, NULL, NULL);
cf13d699
NC
12707 }
12708 else
12709 {
12710 /* If the section being dumped has relocations against it the user might
12711 be expecting these relocations to have been applied. Check for this
12712 case and issue a warning message in order to avoid confusion.
12713 FIXME: Maybe we ought to have an option that dumps a section with
12714 relocs applied ? */
12715 for (relsec = section_headers;
12716 relsec < section_headers + elf_header.e_shnum;
12717 ++relsec)
12718 {
12719 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12720 || relsec->sh_info >= elf_header.e_shnum
12721 || section_headers + relsec->sh_info != section
12722 || relsec->sh_size == 0
12723 || relsec->sh_link >= elf_header.e_shnum)
12724 continue;
12725
12726 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12727 break;
12728 }
12729 }
12730
12731 addr = section->sh_addr;
0e602686 12732 bytes = section_size;
cf13d699
NC
12733 data = start;
12734
12735 while (bytes)
12736 {
12737 int j;
12738 int k;
12739 int lbytes;
12740
12741 lbytes = (bytes > 16 ? 16 : bytes);
12742
12743 printf (" 0x%8.8lx ", (unsigned long) addr);
12744
12745 for (j = 0; j < 16; j++)
12746 {
12747 if (j < lbytes)
12748 printf ("%2.2x", data[j]);
12749 else
12750 printf (" ");
12751
12752 if ((j & 3) == 3)
12753 printf (" ");
12754 }
12755
12756 for (j = 0; j < lbytes; j++)
12757 {
12758 k = data[j];
12759 if (k >= ' ' && k < 0x7f)
12760 printf ("%c", k);
12761 else
12762 printf (".");
12763 }
12764
12765 putchar ('\n');
12766
12767 data += lbytes;
12768 addr += lbytes;
12769 bytes -= lbytes;
12770 }
12771
0e602686 12772 free (real_start);
cf13d699
NC
12773
12774 putchar ('\n');
12775}
12776
d966045b
DJ
12777static int
12778load_specific_debug_section (enum dwarf_section_display_enum debug,
0d2a7a93 12779 const Elf_Internal_Shdr * sec, void * file)
1007acb3 12780{
2cf0635d 12781 struct dwarf_section * section = &debug_displays [debug].section;
19e6b90e 12782 char buf [64];
1007acb3 12783
19e6b90e
L
12784 /* If it is already loaded, do nothing. */
12785 if (section->start != NULL)
12786 return 1;
1007acb3 12787
19e6b90e
L
12788 snprintf (buf, sizeof (buf), _("%s section data"), section->name);
12789 section->address = sec->sh_addr;
06614111 12790 section->user_data = NULL;
3f5e193b
NC
12791 section->start = (unsigned char *) get_data (NULL, (FILE *) file,
12792 sec->sh_offset, 1,
12793 sec->sh_size, buf);
59245841
NC
12794 if (section->start == NULL)
12795 section->size = 0;
12796 else
12797 {
77115a4a
L
12798 unsigned char *start = section->start;
12799 dwarf_size_type size = sec->sh_size;
dab394de 12800 dwarf_size_type uncompressed_size = 0;
77115a4a
L
12801
12802 if ((sec->sh_flags & SHF_COMPRESSED) != 0)
12803 {
12804 Elf_Internal_Chdr chdr;
d8024a91
NC
12805 unsigned int compression_header_size;
12806
f53be977
L
12807 if (size < (is_32bit_elf
12808 ? sizeof (Elf32_External_Chdr)
12809 : sizeof (Elf64_External_Chdr)))
d8024a91
NC
12810 {
12811 warn (_("compressed section %s is too small to contain a compression header"),
12812 section->name);
12813 return 0;
12814 }
12815
12816 compression_header_size = get_compression_header (&chdr, start);
12817
813dabb9
L
12818 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12819 {
12820 warn (_("section '%s' has unsupported compress type: %d\n"),
12821 section->name, chdr.ch_type);
12822 return 0;
12823 }
12824 else if (chdr.ch_addralign != sec->sh_addralign)
12825 {
12826 warn (_("compressed section '%s' is corrupted\n"),
12827 section->name);
12828 return 0;
12829 }
dab394de 12830 uncompressed_size = chdr.ch_size;
77115a4a
L
12831 start += compression_header_size;
12832 size -= compression_header_size;
12833 }
dab394de
L
12834 else if (size > 12 && streq ((char *) start, "ZLIB"))
12835 {
12836 /* Read the zlib header. In this case, it should be "ZLIB"
12837 followed by the uncompressed section size, 8 bytes in
12838 big-endian order. */
12839 uncompressed_size = start[4]; uncompressed_size <<= 8;
12840 uncompressed_size += start[5]; uncompressed_size <<= 8;
12841 uncompressed_size += start[6]; uncompressed_size <<= 8;
12842 uncompressed_size += start[7]; uncompressed_size <<= 8;
12843 uncompressed_size += start[8]; uncompressed_size <<= 8;
12844 uncompressed_size += start[9]; uncompressed_size <<= 8;
12845 uncompressed_size += start[10]; uncompressed_size <<= 8;
12846 uncompressed_size += start[11];
12847 start += 12;
12848 size -= 12;
12849 }
12850
12851 if (uncompressed_size
12852 && uncompress_section_contents (&start, uncompressed_size,
12853 &size))
77115a4a
L
12854 {
12855 /* Free the compressed buffer, update the section buffer
12856 and the section size if uncompress is successful. */
12857 free (section->start);
12858 section->start = start;
77115a4a
L
12859 }
12860 section->size = size;
59245841 12861 }
4a114e3e 12862
1b315056
CS
12863 if (section->start == NULL)
12864 return 0;
12865
19e6b90e 12866 if (debug_displays [debug].relocate)
d1c4b12b
NC
12867 apply_relocations ((FILE *) file, sec, section->start, section->size,
12868 & section->reloc_info, & section->num_relocs);
12869 else
12870 {
12871 section->reloc_info = NULL;
12872 section->num_relocs = 0;
12873 }
1007acb3 12874
1b315056 12875 return 1;
1007acb3
L
12876}
12877
657d0d47
CC
12878/* If this is not NULL, load_debug_section will only look for sections
12879 within the list of sections given here. */
12880unsigned int *section_subset = NULL;
12881
d966045b 12882int
2cf0635d 12883load_debug_section (enum dwarf_section_display_enum debug, void * file)
d966045b 12884{
2cf0635d
NC
12885 struct dwarf_section * section = &debug_displays [debug].section;
12886 Elf_Internal_Shdr * sec;
d966045b
DJ
12887
12888 /* Locate the debug section. */
657d0d47 12889 sec = find_section_in_set (section->uncompressed_name, section_subset);
d966045b
DJ
12890 if (sec != NULL)
12891 section->name = section->uncompressed_name;
12892 else
12893 {
657d0d47 12894 sec = find_section_in_set (section->compressed_name, section_subset);
d966045b
DJ
12895 if (sec != NULL)
12896 section->name = section->compressed_name;
12897 }
12898 if (sec == NULL)
12899 return 0;
12900
657d0d47
CC
12901 /* If we're loading from a subset of sections, and we've loaded
12902 a section matching this name before, it's likely that it's a
12903 different one. */
12904 if (section_subset != NULL)
12905 free_debug_section (debug);
12906
3f5e193b 12907 return load_specific_debug_section (debug, sec, (FILE *) file);
d966045b
DJ
12908}
12909
19e6b90e
L
12910void
12911free_debug_section (enum dwarf_section_display_enum debug)
1007acb3 12912{
2cf0635d 12913 struct dwarf_section * section = &debug_displays [debug].section;
1007acb3 12914
19e6b90e
L
12915 if (section->start == NULL)
12916 return;
1007acb3 12917
19e6b90e
L
12918 free ((char *) section->start);
12919 section->start = NULL;
12920 section->address = 0;
12921 section->size = 0;
1007acb3
L
12922}
12923
1007acb3 12924static int
657d0d47 12925display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
1007acb3 12926{
2cf0635d 12927 char * name = SECTION_NAME (section);
74e1a04b 12928 const char * print_name = printable_section_name (section);
19e6b90e
L
12929 bfd_size_type length;
12930 int result = 1;
3f5e193b 12931 int i;
1007acb3 12932
19e6b90e
L
12933 length = section->sh_size;
12934 if (length == 0)
1007acb3 12935 {
74e1a04b 12936 printf (_("\nSection '%s' has no debugging data.\n"), print_name);
19e6b90e 12937 return 0;
1007acb3 12938 }
5dff79d8
NC
12939 if (section->sh_type == SHT_NOBITS)
12940 {
12941 /* There is no point in dumping the contents of a debugging section
12942 which has the NOBITS type - the bits in the file will be random.
12943 This can happen when a file containing a .eh_frame section is
12944 stripped with the --only-keep-debug command line option. */
74e1a04b
NC
12945 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
12946 print_name);
5dff79d8
NC
12947 return 0;
12948 }
1007acb3 12949
0112cd26 12950 if (const_strneq (name, ".gnu.linkonce.wi."))
19e6b90e 12951 name = ".debug_info";
1007acb3 12952
19e6b90e
L
12953 /* See if we know how to display the contents of this section. */
12954 for (i = 0; i < max; i++)
1b315056 12955 if (streq (debug_displays[i].section.uncompressed_name, name)
b40bf0a2 12956 || (i == line && const_strneq (name, ".debug_line."))
1b315056 12957 || streq (debug_displays[i].section.compressed_name, name))
19e6b90e 12958 {
2cf0635d 12959 struct dwarf_section * sec = &debug_displays [i].section;
d966045b
DJ
12960 int secondary = (section != find_section (name));
12961
12962 if (secondary)
3f5e193b 12963 free_debug_section ((enum dwarf_section_display_enum) i);
1007acb3 12964
b40bf0a2
NC
12965 if (i == line && const_strneq (name, ".debug_line."))
12966 sec->name = name;
12967 else if (streq (sec->uncompressed_name, name))
d966045b
DJ
12968 sec->name = sec->uncompressed_name;
12969 else
12970 sec->name = sec->compressed_name;
3f5e193b
NC
12971 if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
12972 section, file))
19e6b90e 12973 {
657d0d47
CC
12974 /* If this debug section is part of a CU/TU set in a .dwp file,
12975 restrict load_debug_section to the sections in that set. */
12976 section_subset = find_cu_tu_set (file, shndx);
12977
19e6b90e 12978 result &= debug_displays[i].display (sec, file);
1007acb3 12979
657d0d47
CC
12980 section_subset = NULL;
12981
d966045b 12982 if (secondary || (i != info && i != abbrev))
3f5e193b 12983 free_debug_section ((enum dwarf_section_display_enum) i);
19e6b90e 12984 }
1007acb3 12985
19e6b90e
L
12986 break;
12987 }
1007acb3 12988
19e6b90e 12989 if (i == max)
1007acb3 12990 {
74e1a04b 12991 printf (_("Unrecognized debug section: %s\n"), print_name);
19e6b90e 12992 result = 0;
1007acb3
L
12993 }
12994
19e6b90e 12995 return result;
5b18a4bc 12996}
103f02d3 12997
aef1f6d0
DJ
12998/* Set DUMP_SECTS for all sections where dumps were requested
12999 based on section name. */
13000
13001static void
13002initialise_dumps_byname (void)
13003{
2cf0635d 13004 struct dump_list_entry * cur;
aef1f6d0
DJ
13005
13006 for (cur = dump_sects_byname; cur; cur = cur->next)
13007 {
13008 unsigned int i;
13009 int any;
13010
13011 for (i = 0, any = 0; i < elf_header.e_shnum; i++)
13012 if (streq (SECTION_NAME (section_headers + i), cur->name))
13013 {
09c11c86 13014 request_dump_bynumber (i, cur->type);
aef1f6d0
DJ
13015 any = 1;
13016 }
13017
13018 if (!any)
13019 warn (_("Section '%s' was not dumped because it does not exist!\n"),
13020 cur->name);
13021 }
13022}
13023
5b18a4bc 13024static void
2cf0635d 13025process_section_contents (FILE * file)
5b18a4bc 13026{
2cf0635d 13027 Elf_Internal_Shdr * section;
19e6b90e 13028 unsigned int i;
103f02d3 13029
19e6b90e
L
13030 if (! do_dump)
13031 return;
103f02d3 13032
aef1f6d0
DJ
13033 initialise_dumps_byname ();
13034
19e6b90e
L
13035 for (i = 0, section = section_headers;
13036 i < elf_header.e_shnum && i < num_dump_sects;
13037 i++, section++)
13038 {
13039#ifdef SUPPORT_DISASSEMBLY
13040 if (dump_sects[i] & DISASS_DUMP)
13041 disassemble_section (section, file);
13042#endif
13043 if (dump_sects[i] & HEX_DUMP)
cf13d699 13044 dump_section_as_bytes (section, file, FALSE);
103f02d3 13045
cf13d699
NC
13046 if (dump_sects[i] & RELOC_DUMP)
13047 dump_section_as_bytes (section, file, TRUE);
09c11c86
NC
13048
13049 if (dump_sects[i] & STRING_DUMP)
13050 dump_section_as_strings (section, file);
cf13d699
NC
13051
13052 if (dump_sects[i] & DEBUG_DUMP)
657d0d47 13053 display_debug_section (i, section, file);
5b18a4bc 13054 }
103f02d3 13055
19e6b90e
L
13056 /* Check to see if the user requested a
13057 dump of a section that does not exist. */
13058 while (i++ < num_dump_sects)
13059 if (dump_sects[i])
13060 warn (_("Section %d was not dumped because it does not exist!\n"), i);
5b18a4bc 13061}
103f02d3 13062
5b18a4bc 13063static void
19e6b90e 13064process_mips_fpe_exception (int mask)
5b18a4bc 13065{
19e6b90e
L
13066 if (mask)
13067 {
13068 int first = 1;
13069 if (mask & OEX_FPU_INEX)
13070 fputs ("INEX", stdout), first = 0;
13071 if (mask & OEX_FPU_UFLO)
13072 printf ("%sUFLO", first ? "" : "|"), first = 0;
13073 if (mask & OEX_FPU_OFLO)
13074 printf ("%sOFLO", first ? "" : "|"), first = 0;
13075 if (mask & OEX_FPU_DIV0)
13076 printf ("%sDIV0", first ? "" : "|"), first = 0;
13077 if (mask & OEX_FPU_INVAL)
13078 printf ("%sINVAL", first ? "" : "|");
13079 }
5b18a4bc 13080 else
19e6b90e 13081 fputs ("0", stdout);
5b18a4bc 13082}
103f02d3 13083
f6f0e17b
NC
13084/* Display's the value of TAG at location P. If TAG is
13085 greater than 0 it is assumed to be an unknown tag, and
13086 a message is printed to this effect. Otherwise it is
13087 assumed that a message has already been printed.
13088
13089 If the bottom bit of TAG is set it assumed to have a
13090 string value, otherwise it is assumed to have an integer
13091 value.
13092
13093 Returns an updated P pointing to the first unread byte
13094 beyond the end of TAG's value.
13095
13096 Reads at or beyond END will not be made. */
13097
13098static unsigned char *
13099display_tag_value (int tag,
13100 unsigned char * p,
13101 const unsigned char * const end)
13102{
13103 unsigned long val;
13104
13105 if (tag > 0)
13106 printf (" Tag_unknown_%d: ", tag);
13107
13108 if (p >= end)
13109 {
4082ef84 13110 warn (_("<corrupt tag>\n"));
f6f0e17b
NC
13111 }
13112 else if (tag & 1)
13113 {
071436c6
NC
13114 /* PR 17531 file: 027-19978-0.004. */
13115 size_t maxlen = (end - p) - 1;
13116
13117 putchar ('"');
4082ef84
NC
13118 if (maxlen > 0)
13119 {
13120 print_symbol ((int) maxlen, (const char *) p);
13121 p += strnlen ((char *) p, maxlen) + 1;
13122 }
13123 else
13124 {
13125 printf (_("<corrupt string tag>"));
13126 p = (unsigned char *) end;
13127 }
071436c6 13128 printf ("\"\n");
f6f0e17b
NC
13129 }
13130 else
13131 {
13132 unsigned int len;
13133
13134 val = read_uleb128 (p, &len, end);
13135 p += len;
13136 printf ("%ld (0x%lx)\n", val, val);
13137 }
13138
4082ef84 13139 assert (p <= end);
f6f0e17b
NC
13140 return p;
13141}
13142
11c1ff18
PB
13143/* ARM EABI attributes section. */
13144typedef struct
13145{
70e99720 13146 unsigned int tag;
2cf0635d 13147 const char * name;
11c1ff18 13148 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
70e99720 13149 unsigned int type;
2cf0635d 13150 const char ** table;
11c1ff18
PB
13151} arm_attr_public_tag;
13152
2cf0635d 13153static const char * arm_attr_tag_CPU_arch[] =
11c1ff18 13154 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
ff8646ee
TP
13155 "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "", "v8-M.baseline",
13156 "v8-M.mainline"};
2cf0635d
NC
13157static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
13158static const char * arm_attr_tag_THUMB_ISA_use[] =
4ed7ed8d 13159 {"No", "Thumb-1", "Thumb-2", "Yes"};
75375b3e 13160static const char * arm_attr_tag_FP_arch[] =
bca38921 13161 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
a715796b 13162 "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
2cf0635d 13163static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
dd24e3da 13164static const char * arm_attr_tag_Advanced_SIMD_arch[] =
9411fd44
MW
13165 {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
13166 "NEON for ARMv8.1"};
2cf0635d 13167static const char * arm_attr_tag_PCS_config[] =
11c1ff18
PB
13168 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
13169 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
2cf0635d 13170static const char * arm_attr_tag_ABI_PCS_R9_use[] =
11c1ff18 13171 {"V6", "SB", "TLS", "Unused"};
2cf0635d 13172static const char * arm_attr_tag_ABI_PCS_RW_data[] =
11c1ff18 13173 {"Absolute", "PC-relative", "SB-relative", "None"};
2cf0635d 13174static const char * arm_attr_tag_ABI_PCS_RO_data[] =
11c1ff18 13175 {"Absolute", "PC-relative", "None"};
2cf0635d 13176static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
11c1ff18 13177 {"None", "direct", "GOT-indirect"};
2cf0635d 13178static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
11c1ff18 13179 {"None", "??? 1", "2", "??? 3", "4"};
2cf0635d
NC
13180static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
13181static const char * arm_attr_tag_ABI_FP_denormal[] =
f5f53991 13182 {"Unused", "Needed", "Sign only"};
2cf0635d
NC
13183static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
13184static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
13185static const char * arm_attr_tag_ABI_FP_number_model[] =
11c1ff18 13186 {"Unused", "Finite", "RTABI", "IEEE 754"};
2cf0635d 13187static const char * arm_attr_tag_ABI_enum_size[] =
11c1ff18 13188 {"Unused", "small", "int", "forced to int"};
2cf0635d 13189static const char * arm_attr_tag_ABI_HardFP_use[] =
99654aaf 13190 {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
2cf0635d 13191static const char * arm_attr_tag_ABI_VFP_args[] =
5c294fee 13192 {"AAPCS", "VFP registers", "custom", "compatible"};
2cf0635d 13193static const char * arm_attr_tag_ABI_WMMX_args[] =
11c1ff18 13194 {"AAPCS", "WMMX registers", "custom"};
2cf0635d 13195static const char * arm_attr_tag_ABI_optimization_goals[] =
11c1ff18
PB
13196 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
13197 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
2cf0635d 13198static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
11c1ff18
PB
13199 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
13200 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
2cf0635d 13201static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
75375b3e 13202static const char * arm_attr_tag_FP_HP_extension[] =
8e79c3df 13203 {"Not Allowed", "Allowed"};
2cf0635d 13204static const char * arm_attr_tag_ABI_FP_16bit_format[] =
8e79c3df 13205 {"None", "IEEE 754", "Alternative Format"};
15afaa63
TP
13206static const char * arm_attr_tag_DSP_extension[] =
13207 {"Follow architecture", "Allowed"};
dd24e3da 13208static const char * arm_attr_tag_MPextension_use[] =
cd21e546
MGD
13209 {"Not Allowed", "Allowed"};
13210static const char * arm_attr_tag_DIV_use[] =
dd24e3da 13211 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
cd21e546 13212 "Allowed in v7-A with integer division extension"};
2cf0635d
NC
13213static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
13214static const char * arm_attr_tag_Virtualization_use[] =
dd24e3da 13215 {"Not Allowed", "TrustZone", "Virtualization Extensions",
cd21e546 13216 "TrustZone and Virtualization Extensions"};
dd24e3da 13217static const char * arm_attr_tag_MPextension_use_legacy[] =
f5f53991 13218 {"Not Allowed", "Allowed"};
11c1ff18
PB
13219
13220#define LOOKUP(id, name) \
13221 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
d70c5fc7 13222static arm_attr_public_tag arm_attr_public_tags[] =
11c1ff18
PB
13223{
13224 {4, "CPU_raw_name", 1, NULL},
13225 {5, "CPU_name", 1, NULL},
13226 LOOKUP(6, CPU_arch),
13227 {7, "CPU_arch_profile", 0, NULL},
13228 LOOKUP(8, ARM_ISA_use),
13229 LOOKUP(9, THUMB_ISA_use),
75375b3e 13230 LOOKUP(10, FP_arch),
11c1ff18 13231 LOOKUP(11, WMMX_arch),
f5f53991
AS
13232 LOOKUP(12, Advanced_SIMD_arch),
13233 LOOKUP(13, PCS_config),
11c1ff18
PB
13234 LOOKUP(14, ABI_PCS_R9_use),
13235 LOOKUP(15, ABI_PCS_RW_data),
f5f53991 13236 LOOKUP(16, ABI_PCS_RO_data),
11c1ff18
PB
13237 LOOKUP(17, ABI_PCS_GOT_use),
13238 LOOKUP(18, ABI_PCS_wchar_t),
13239 LOOKUP(19, ABI_FP_rounding),
13240 LOOKUP(20, ABI_FP_denormal),
13241 LOOKUP(21, ABI_FP_exceptions),
13242 LOOKUP(22, ABI_FP_user_exceptions),
13243 LOOKUP(23, ABI_FP_number_model),
75375b3e
MGD
13244 {24, "ABI_align_needed", 0, NULL},
13245 {25, "ABI_align_preserved", 0, NULL},
11c1ff18
PB
13246 LOOKUP(26, ABI_enum_size),
13247 LOOKUP(27, ABI_HardFP_use),
13248 LOOKUP(28, ABI_VFP_args),
13249 LOOKUP(29, ABI_WMMX_args),
13250 LOOKUP(30, ABI_optimization_goals),
13251 LOOKUP(31, ABI_FP_optimization_goals),
8e79c3df 13252 {32, "compatibility", 0, NULL},
f5f53991 13253 LOOKUP(34, CPU_unaligned_access),
75375b3e 13254 LOOKUP(36, FP_HP_extension),
8e79c3df 13255 LOOKUP(38, ABI_FP_16bit_format),
cd21e546
MGD
13256 LOOKUP(42, MPextension_use),
13257 LOOKUP(44, DIV_use),
15afaa63 13258 LOOKUP(46, DSP_extension),
f5f53991
AS
13259 {64, "nodefaults", 0, NULL},
13260 {65, "also_compatible_with", 0, NULL},
13261 LOOKUP(66, T2EE_use),
13262 {67, "conformance", 1, NULL},
13263 LOOKUP(68, Virtualization_use),
cd21e546 13264 LOOKUP(70, MPextension_use_legacy)
11c1ff18
PB
13265};
13266#undef LOOKUP
13267
11c1ff18 13268static unsigned char *
f6f0e17b
NC
13269display_arm_attribute (unsigned char * p,
13270 const unsigned char * const end)
11c1ff18 13271{
70e99720 13272 unsigned int tag;
11c1ff18 13273 unsigned int len;
70e99720 13274 unsigned int val;
2cf0635d 13275 arm_attr_public_tag * attr;
11c1ff18 13276 unsigned i;
70e99720 13277 unsigned int type;
11c1ff18 13278
f6f0e17b 13279 tag = read_uleb128 (p, &len, end);
11c1ff18
PB
13280 p += len;
13281 attr = NULL;
2cf0635d 13282 for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
11c1ff18
PB
13283 {
13284 if (arm_attr_public_tags[i].tag == tag)
13285 {
13286 attr = &arm_attr_public_tags[i];
13287 break;
13288 }
13289 }
13290
13291 if (attr)
13292 {
13293 printf (" Tag_%s: ", attr->name);
13294 switch (attr->type)
13295 {
13296 case 0:
13297 switch (tag)
13298 {
13299 case 7: /* Tag_CPU_arch_profile. */
f6f0e17b 13300 val = read_uleb128 (p, &len, end);
11c1ff18
PB
13301 p += len;
13302 switch (val)
13303 {
2b692964
NC
13304 case 0: printf (_("None\n")); break;
13305 case 'A': printf (_("Application\n")); break;
13306 case 'R': printf (_("Realtime\n")); break;
13307 case 'M': printf (_("Microcontroller\n")); break;
13308 case 'S': printf (_("Application or Realtime\n")); break;
11c1ff18
PB
13309 default: printf ("??? (%d)\n", val); break;
13310 }
13311 break;
13312
75375b3e 13313 case 24: /* Tag_align_needed. */
f6f0e17b 13314 val = read_uleb128 (p, &len, end);
75375b3e
MGD
13315 p += len;
13316 switch (val)
13317 {
2b692964
NC
13318 case 0: printf (_("None\n")); break;
13319 case 1: printf (_("8-byte\n")); break;
13320 case 2: printf (_("4-byte\n")); break;
75375b3e
MGD
13321 case 3: printf ("??? 3\n"); break;
13322 default:
13323 if (val <= 12)
dd24e3da 13324 printf (_("8-byte and up to %d-byte extended\n"),
75375b3e
MGD
13325 1 << val);
13326 else
13327 printf ("??? (%d)\n", val);
13328 break;
13329 }
13330 break;
13331
13332 case 25: /* Tag_align_preserved. */
f6f0e17b 13333 val = read_uleb128 (p, &len, end);
75375b3e
MGD
13334 p += len;
13335 switch (val)
13336 {
2b692964
NC
13337 case 0: printf (_("None\n")); break;
13338 case 1: printf (_("8-byte, except leaf SP\n")); break;
13339 case 2: printf (_("8-byte\n")); break;
75375b3e
MGD
13340 case 3: printf ("??? 3\n"); break;
13341 default:
13342 if (val <= 12)
dd24e3da 13343 printf (_("8-byte and up to %d-byte extended\n"),
75375b3e
MGD
13344 1 << val);
13345 else
13346 printf ("??? (%d)\n", val);
13347 break;
13348 }
13349 break;
13350
11c1ff18 13351 case 32: /* Tag_compatibility. */
071436c6 13352 {
071436c6
NC
13353 val = read_uleb128 (p, &len, end);
13354 p += len;
071436c6 13355 printf (_("flag = %d, vendor = "), val);
4082ef84
NC
13356 if (p < end - 1)
13357 {
13358 size_t maxlen = (end - p) - 1;
13359
13360 print_symbol ((int) maxlen, (const char *) p);
13361 p += strnlen ((char *) p, maxlen) + 1;
13362 }
13363 else
13364 {
13365 printf (_("<corrupt>"));
13366 p = (unsigned char *) end;
13367 }
071436c6 13368 putchar ('\n');
071436c6 13369 }
11c1ff18
PB
13370 break;
13371
f5f53991 13372 case 64: /* Tag_nodefaults. */
541a3cbd
NC
13373 /* PR 17531: file: 001-505008-0.01. */
13374 if (p < end)
13375 p++;
2b692964 13376 printf (_("True\n"));
f5f53991
AS
13377 break;
13378
13379 case 65: /* Tag_also_compatible_with. */
f6f0e17b 13380 val = read_uleb128 (p, &len, end);
f5f53991
AS
13381 p += len;
13382 if (val == 6 /* Tag_CPU_arch. */)
13383 {
f6f0e17b 13384 val = read_uleb128 (p, &len, end);
f5f53991 13385 p += len;
071436c6 13386 if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
f5f53991
AS
13387 printf ("??? (%d)\n", val);
13388 else
13389 printf ("%s\n", arm_attr_tag_CPU_arch[val]);
13390 }
13391 else
13392 printf ("???\n");
071436c6
NC
13393 while (p < end && *(p++) != '\0' /* NUL terminator. */)
13394 ;
f5f53991
AS
13395 break;
13396
11c1ff18 13397 default:
bee0ee85
NC
13398 printf (_("<unknown: %d>\n"), tag);
13399 break;
11c1ff18
PB
13400 }
13401 return p;
13402
13403 case 1:
f6f0e17b 13404 return display_tag_value (-1, p, end);
11c1ff18 13405 case 2:
f6f0e17b 13406 return display_tag_value (0, p, end);
11c1ff18
PB
13407
13408 default:
13409 assert (attr->type & 0x80);
f6f0e17b 13410 val = read_uleb128 (p, &len, end);
11c1ff18
PB
13411 p += len;
13412 type = attr->type & 0x7f;
13413 if (val >= type)
13414 printf ("??? (%d)\n", val);
13415 else
13416 printf ("%s\n", attr->table[val]);
13417 return p;
13418 }
13419 }
11c1ff18 13420
f6f0e17b 13421 return display_tag_value (tag, p, end);
11c1ff18
PB
13422}
13423
104d59d1 13424static unsigned char *
60bca95a 13425display_gnu_attribute (unsigned char * p,
f6f0e17b
NC
13426 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const),
13427 const unsigned char * const end)
104d59d1
JM
13428{
13429 int tag;
13430 unsigned int len;
13431 int val;
104d59d1 13432
f6f0e17b 13433 tag = read_uleb128 (p, &len, end);
104d59d1
JM
13434 p += len;
13435
13436 /* Tag_compatibility is the only generic GNU attribute defined at
13437 present. */
13438 if (tag == 32)
13439 {
f6f0e17b 13440 val = read_uleb128 (p, &len, end);
104d59d1 13441 p += len;
071436c6
NC
13442
13443 printf (_("flag = %d, vendor = "), val);
f6f0e17b
NC
13444 if (p == end)
13445 {
071436c6 13446 printf (_("<corrupt>\n"));
f6f0e17b
NC
13447 warn (_("corrupt vendor attribute\n"));
13448 }
13449 else
13450 {
4082ef84
NC
13451 if (p < end - 1)
13452 {
13453 size_t maxlen = (end - p) - 1;
071436c6 13454
4082ef84
NC
13455 print_symbol ((int) maxlen, (const char *) p);
13456 p += strnlen ((char *) p, maxlen) + 1;
13457 }
13458 else
13459 {
13460 printf (_("<corrupt>"));
13461 p = (unsigned char *) end;
13462 }
071436c6 13463 putchar ('\n');
f6f0e17b 13464 }
104d59d1
JM
13465 return p;
13466 }
13467
13468 if ((tag & 2) == 0 && display_proc_gnu_attribute)
f6f0e17b 13469 return display_proc_gnu_attribute (p, tag, end);
104d59d1 13470
f6f0e17b 13471 return display_tag_value (tag, p, end);
104d59d1
JM
13472}
13473
34c8bcba 13474static unsigned char *
f6f0e17b
NC
13475display_power_gnu_attribute (unsigned char * p,
13476 int tag,
13477 const unsigned char * const end)
34c8bcba 13478{
34c8bcba 13479 unsigned int len;
005d79fd 13480 unsigned int val;
34c8bcba
JM
13481
13482 if (tag == Tag_GNU_Power_ABI_FP)
13483 {
f6f0e17b 13484 val = read_uleb128 (p, &len, end);
34c8bcba
JM
13485 p += len;
13486 printf (" Tag_GNU_Power_ABI_FP: ");
005d79fd
AM
13487 if (len == 0)
13488 {
13489 printf (_("<corrupt>\n"));
13490 return p;
13491 }
60bca95a 13492
005d79fd
AM
13493 if (val > 15)
13494 printf ("(%#x), ", val);
13495
13496 switch (val & 3)
34c8bcba
JM
13497 {
13498 case 0:
005d79fd 13499 printf (_("unspecified hard/soft float, "));
34c8bcba
JM
13500 break;
13501 case 1:
005d79fd 13502 printf (_("hard float, "));
34c8bcba
JM
13503 break;
13504 case 2:
005d79fd 13505 printf (_("soft float, "));
34c8bcba 13506 break;
3c7b9897 13507 case 3:
005d79fd 13508 printf (_("single-precision hard float, "));
3c7b9897 13509 break;
005d79fd
AM
13510 }
13511
13512 switch (val & 0xC)
13513 {
13514 case 0:
13515 printf (_("unspecified long double\n"));
13516 break;
13517 case 4:
13518 printf (_("128-bit IBM long double\n"));
13519 break;
13520 case 8:
13521 printf (_("64-bit long double\n"));
13522 break;
13523 case 12:
13524 printf (_("128-bit IEEE long double\n"));
34c8bcba
JM
13525 break;
13526 }
13527 return p;
005d79fd 13528 }
34c8bcba 13529
c6e65352
DJ
13530 if (tag == Tag_GNU_Power_ABI_Vector)
13531 {
f6f0e17b 13532 val = read_uleb128 (p, &len, end);
c6e65352
DJ
13533 p += len;
13534 printf (" Tag_GNU_Power_ABI_Vector: ");
005d79fd
AM
13535 if (len == 0)
13536 {
13537 printf (_("<corrupt>\n"));
13538 return p;
13539 }
13540
13541 if (val > 3)
13542 printf ("(%#x), ", val);
13543
13544 switch (val & 3)
c6e65352
DJ
13545 {
13546 case 0:
005d79fd 13547 printf (_("unspecified\n"));
c6e65352
DJ
13548 break;
13549 case 1:
005d79fd 13550 printf (_("generic\n"));
c6e65352
DJ
13551 break;
13552 case 2:
13553 printf ("AltiVec\n");
13554 break;
13555 case 3:
13556 printf ("SPE\n");
13557 break;
c6e65352
DJ
13558 }
13559 return p;
005d79fd 13560 }
c6e65352 13561
f82e0623
NF
13562 if (tag == Tag_GNU_Power_ABI_Struct_Return)
13563 {
005d79fd
AM
13564 val = read_uleb128 (p, &len, end);
13565 p += len;
13566 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
13567 if (len == 0)
f6f0e17b 13568 {
005d79fd 13569 printf (_("<corrupt>\n"));
f6f0e17b
NC
13570 return p;
13571 }
0b4362b0 13572
005d79fd
AM
13573 if (val > 2)
13574 printf ("(%#x), ", val);
13575
13576 switch (val & 3)
13577 {
13578 case 0:
13579 printf (_("unspecified\n"));
13580 break;
13581 case 1:
13582 printf ("r3/r4\n");
13583 break;
13584 case 2:
13585 printf (_("memory\n"));
13586 break;
13587 case 3:
13588 printf ("???\n");
13589 break;
13590 }
f82e0623
NF
13591 return p;
13592 }
13593
f6f0e17b 13594 return display_tag_value (tag & 1, p, end);
34c8bcba
JM
13595}
13596
643f7afb
AK
13597static unsigned char *
13598display_s390_gnu_attribute (unsigned char * p,
13599 int tag,
13600 const unsigned char * const end)
13601{
13602 unsigned int len;
13603 int val;
13604
13605 if (tag == Tag_GNU_S390_ABI_Vector)
13606 {
13607 val = read_uleb128 (p, &len, end);
13608 p += len;
13609 printf (" Tag_GNU_S390_ABI_Vector: ");
13610
13611 switch (val)
13612 {
13613 case 0:
13614 printf (_("any\n"));
13615 break;
13616 case 1:
13617 printf (_("software\n"));
13618 break;
13619 case 2:
13620 printf (_("hardware\n"));
13621 break;
13622 default:
13623 printf ("??? (%d)\n", val);
13624 break;
13625 }
13626 return p;
13627 }
13628
13629 return display_tag_value (tag & 1, p, end);
13630}
13631
9e8c70f9
DM
13632static void
13633display_sparc_hwcaps (int mask)
13634{
13635 if (mask)
13636 {
13637 int first = 1;
071436c6 13638
9e8c70f9
DM
13639 if (mask & ELF_SPARC_HWCAP_MUL32)
13640 fputs ("mul32", stdout), first = 0;
13641 if (mask & ELF_SPARC_HWCAP_DIV32)
13642 printf ("%sdiv32", first ? "" : "|"), first = 0;
13643 if (mask & ELF_SPARC_HWCAP_FSMULD)
13644 printf ("%sfsmuld", first ? "" : "|"), first = 0;
13645 if (mask & ELF_SPARC_HWCAP_V8PLUS)
13646 printf ("%sv8plus", first ? "" : "|"), first = 0;
13647 if (mask & ELF_SPARC_HWCAP_POPC)
13648 printf ("%spopc", first ? "" : "|"), first = 0;
13649 if (mask & ELF_SPARC_HWCAP_VIS)
13650 printf ("%svis", first ? "" : "|"), first = 0;
13651 if (mask & ELF_SPARC_HWCAP_VIS2)
13652 printf ("%svis2", first ? "" : "|"), first = 0;
13653 if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
13654 printf ("%sASIBlkInit", first ? "" : "|"), first = 0;
13655 if (mask & ELF_SPARC_HWCAP_FMAF)
13656 printf ("%sfmaf", first ? "" : "|"), first = 0;
13657 if (mask & ELF_SPARC_HWCAP_VIS3)
13658 printf ("%svis3", first ? "" : "|"), first = 0;
13659 if (mask & ELF_SPARC_HWCAP_HPC)
13660 printf ("%shpc", first ? "" : "|"), first = 0;
13661 if (mask & ELF_SPARC_HWCAP_RANDOM)
13662 printf ("%srandom", first ? "" : "|"), first = 0;
13663 if (mask & ELF_SPARC_HWCAP_TRANS)
13664 printf ("%strans", first ? "" : "|"), first = 0;
13665 if (mask & ELF_SPARC_HWCAP_FJFMAU)
13666 printf ("%sfjfmau", first ? "" : "|"), first = 0;
13667 if (mask & ELF_SPARC_HWCAP_IMA)
13668 printf ("%sima", first ? "" : "|"), first = 0;
13669 if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
13670 printf ("%scspare", first ? "" : "|"), first = 0;
13671 }
13672 else
071436c6
NC
13673 fputc ('0', stdout);
13674 fputc ('\n', stdout);
9e8c70f9
DM
13675}
13676
3d68f91c
JM
13677static void
13678display_sparc_hwcaps2 (int mask)
13679{
13680 if (mask)
13681 {
13682 int first = 1;
071436c6 13683
3d68f91c
JM
13684 if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
13685 fputs ("fjathplus", stdout), first = 0;
13686 if (mask & ELF_SPARC_HWCAP2_VIS3B)
13687 printf ("%svis3b", first ? "" : "|"), first = 0;
13688 if (mask & ELF_SPARC_HWCAP2_ADP)
13689 printf ("%sadp", first ? "" : "|"), first = 0;
13690 if (mask & ELF_SPARC_HWCAP2_SPARC5)
13691 printf ("%ssparc5", first ? "" : "|"), first = 0;
13692 if (mask & ELF_SPARC_HWCAP2_MWAIT)
13693 printf ("%smwait", first ? "" : "|"), first = 0;
13694 if (mask & ELF_SPARC_HWCAP2_XMPMUL)
13695 printf ("%sxmpmul", first ? "" : "|"), first = 0;
13696 if (mask & ELF_SPARC_HWCAP2_XMONT)
13697 printf ("%sxmont2", first ? "" : "|"), first = 0;
13698 if (mask & ELF_SPARC_HWCAP2_NSEC)
13699 printf ("%snsec", first ? "" : "|"), first = 0;
13700 if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
13701 printf ("%sfjathhpc", first ? "" : "|"), first = 0;
13702 if (mask & ELF_SPARC_HWCAP2_FJDES)
13703 printf ("%sfjdes", first ? "" : "|"), first = 0;
13704 if (mask & ELF_SPARC_HWCAP2_FJAES)
13705 printf ("%sfjaes", first ? "" : "|"), first = 0;
13706 }
13707 else
071436c6
NC
13708 fputc ('0', stdout);
13709 fputc ('\n', stdout);
3d68f91c
JM
13710}
13711
9e8c70f9 13712static unsigned char *
f6f0e17b
NC
13713display_sparc_gnu_attribute (unsigned char * p,
13714 int tag,
13715 const unsigned char * const end)
9e8c70f9 13716{
3d68f91c
JM
13717 unsigned int len;
13718 int val;
13719
9e8c70f9
DM
13720 if (tag == Tag_GNU_Sparc_HWCAPS)
13721 {
f6f0e17b 13722 val = read_uleb128 (p, &len, end);
9e8c70f9
DM
13723 p += len;
13724 printf (" Tag_GNU_Sparc_HWCAPS: ");
9e8c70f9
DM
13725 display_sparc_hwcaps (val);
13726 return p;
3d68f91c
JM
13727 }
13728 if (tag == Tag_GNU_Sparc_HWCAPS2)
13729 {
13730 val = read_uleb128 (p, &len, end);
13731 p += len;
13732 printf (" Tag_GNU_Sparc_HWCAPS2: ");
13733 display_sparc_hwcaps2 (val);
13734 return p;
13735 }
9e8c70f9 13736
f6f0e17b 13737 return display_tag_value (tag, p, end);
9e8c70f9
DM
13738}
13739
351cdf24
MF
13740static void
13741print_mips_fp_abi_value (int val)
13742{
13743 switch (val)
13744 {
13745 case Val_GNU_MIPS_ABI_FP_ANY:
13746 printf (_("Hard or soft float\n"));
13747 break;
13748 case Val_GNU_MIPS_ABI_FP_DOUBLE:
13749 printf (_("Hard float (double precision)\n"));
13750 break;
13751 case Val_GNU_MIPS_ABI_FP_SINGLE:
13752 printf (_("Hard float (single precision)\n"));
13753 break;
13754 case Val_GNU_MIPS_ABI_FP_SOFT:
13755 printf (_("Soft float\n"));
13756 break;
13757 case Val_GNU_MIPS_ABI_FP_OLD_64:
13758 printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
13759 break;
13760 case Val_GNU_MIPS_ABI_FP_XX:
13761 printf (_("Hard float (32-bit CPU, Any FPU)\n"));
13762 break;
13763 case Val_GNU_MIPS_ABI_FP_64:
13764 printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
13765 break;
13766 case Val_GNU_MIPS_ABI_FP_64A:
13767 printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
13768 break;
3350cc01
CM
13769 case Val_GNU_MIPS_ABI_FP_NAN2008:
13770 printf (_("NaN 2008 compatibility\n"));
13771 break;
351cdf24
MF
13772 default:
13773 printf ("??? (%d)\n", val);
13774 break;
13775 }
13776}
13777
2cf19d5c 13778static unsigned char *
f6f0e17b
NC
13779display_mips_gnu_attribute (unsigned char * p,
13780 int tag,
13781 const unsigned char * const end)
2cf19d5c 13782{
2cf19d5c
JM
13783 if (tag == Tag_GNU_MIPS_ABI_FP)
13784 {
f6f0e17b
NC
13785 unsigned int len;
13786 int val;
13787
13788 val = read_uleb128 (p, &len, end);
2cf19d5c
JM
13789 p += len;
13790 printf (" Tag_GNU_MIPS_ABI_FP: ");
60bca95a 13791
351cdf24
MF
13792 print_mips_fp_abi_value (val);
13793
2cf19d5c
JM
13794 return p;
13795 }
13796
a9f58168
CF
13797 if (tag == Tag_GNU_MIPS_ABI_MSA)
13798 {
13799 unsigned int len;
13800 int val;
13801
13802 val = read_uleb128 (p, &len, end);
13803 p += len;
13804 printf (" Tag_GNU_MIPS_ABI_MSA: ");
13805
13806 switch (val)
13807 {
13808 case Val_GNU_MIPS_ABI_MSA_ANY:
13809 printf (_("Any MSA or not\n"));
13810 break;
13811 case Val_GNU_MIPS_ABI_MSA_128:
13812 printf (_("128-bit MSA\n"));
13813 break;
13814 default:
13815 printf ("??? (%d)\n", val);
13816 break;
13817 }
13818 return p;
13819 }
13820
f6f0e17b 13821 return display_tag_value (tag & 1, p, end);
2cf19d5c
JM
13822}
13823
59e6276b 13824static unsigned char *
f6f0e17b
NC
13825display_tic6x_attribute (unsigned char * p,
13826 const unsigned char * const end)
59e6276b
JM
13827{
13828 int tag;
13829 unsigned int len;
13830 int val;
13831
f6f0e17b 13832 tag = read_uleb128 (p, &len, end);
59e6276b
JM
13833 p += len;
13834
13835 switch (tag)
13836 {
75fa6dc1 13837 case Tag_ISA:
f6f0e17b 13838 val = read_uleb128 (p, &len, end);
59e6276b 13839 p += len;
75fa6dc1 13840 printf (" Tag_ISA: ");
59e6276b
JM
13841
13842 switch (val)
13843 {
75fa6dc1 13844 case C6XABI_Tag_ISA_none:
59e6276b
JM
13845 printf (_("None\n"));
13846 break;
75fa6dc1 13847 case C6XABI_Tag_ISA_C62X:
59e6276b
JM
13848 printf ("C62x\n");
13849 break;
75fa6dc1 13850 case C6XABI_Tag_ISA_C67X:
59e6276b
JM
13851 printf ("C67x\n");
13852 break;
75fa6dc1 13853 case C6XABI_Tag_ISA_C67XP:
59e6276b
JM
13854 printf ("C67x+\n");
13855 break;
75fa6dc1 13856 case C6XABI_Tag_ISA_C64X:
59e6276b
JM
13857 printf ("C64x\n");
13858 break;
75fa6dc1 13859 case C6XABI_Tag_ISA_C64XP:
59e6276b
JM
13860 printf ("C64x+\n");
13861 break;
75fa6dc1 13862 case C6XABI_Tag_ISA_C674X:
59e6276b
JM
13863 printf ("C674x\n");
13864 break;
13865 default:
13866 printf ("??? (%d)\n", val);
13867 break;
13868 }
13869 return p;
13870
87779176 13871 case Tag_ABI_wchar_t:
f6f0e17b 13872 val = read_uleb128 (p, &len, end);
87779176
JM
13873 p += len;
13874 printf (" Tag_ABI_wchar_t: ");
13875 switch (val)
13876 {
13877 case 0:
13878 printf (_("Not used\n"));
13879 break;
13880 case 1:
13881 printf (_("2 bytes\n"));
13882 break;
13883 case 2:
13884 printf (_("4 bytes\n"));
13885 break;
13886 default:
13887 printf ("??? (%d)\n", val);
13888 break;
13889 }
13890 return p;
13891
13892 case Tag_ABI_stack_align_needed:
f6f0e17b 13893 val = read_uleb128 (p, &len, end);
87779176
JM
13894 p += len;
13895 printf (" Tag_ABI_stack_align_needed: ");
13896 switch (val)
13897 {
13898 case 0:
13899 printf (_("8-byte\n"));
13900 break;
13901 case 1:
13902 printf (_("16-byte\n"));
13903 break;
13904 default:
13905 printf ("??? (%d)\n", val);
13906 break;
13907 }
13908 return p;
13909
13910 case Tag_ABI_stack_align_preserved:
f6f0e17b 13911 val = read_uleb128 (p, &len, end);
87779176
JM
13912 p += len;
13913 printf (" Tag_ABI_stack_align_preserved: ");
13914 switch (val)
13915 {
13916 case 0:
13917 printf (_("8-byte\n"));
13918 break;
13919 case 1:
13920 printf (_("16-byte\n"));
13921 break;
13922 default:
13923 printf ("??? (%d)\n", val);
13924 break;
13925 }
13926 return p;
13927
b5593623 13928 case Tag_ABI_DSBT:
f6f0e17b 13929 val = read_uleb128 (p, &len, end);
b5593623
JM
13930 p += len;
13931 printf (" Tag_ABI_DSBT: ");
13932 switch (val)
13933 {
13934 case 0:
13935 printf (_("DSBT addressing not used\n"));
13936 break;
13937 case 1:
13938 printf (_("DSBT addressing used\n"));
13939 break;
13940 default:
13941 printf ("??? (%d)\n", val);
13942 break;
13943 }
13944 return p;
13945
87779176 13946 case Tag_ABI_PID:
f6f0e17b 13947 val = read_uleb128 (p, &len, end);
87779176
JM
13948 p += len;
13949 printf (" Tag_ABI_PID: ");
13950 switch (val)
13951 {
13952 case 0:
13953 printf (_("Data addressing position-dependent\n"));
13954 break;
13955 case 1:
13956 printf (_("Data addressing position-independent, GOT near DP\n"));
13957 break;
13958 case 2:
13959 printf (_("Data addressing position-independent, GOT far from DP\n"));
13960 break;
13961 default:
13962 printf ("??? (%d)\n", val);
13963 break;
13964 }
13965 return p;
13966
13967 case Tag_ABI_PIC:
f6f0e17b 13968 val = read_uleb128 (p, &len, end);
87779176
JM
13969 p += len;
13970 printf (" Tag_ABI_PIC: ");
13971 switch (val)
13972 {
13973 case 0:
13974 printf (_("Code addressing position-dependent\n"));
13975 break;
13976 case 1:
13977 printf (_("Code addressing position-independent\n"));
13978 break;
13979 default:
13980 printf ("??? (%d)\n", val);
13981 break;
13982 }
13983 return p;
13984
13985 case Tag_ABI_array_object_alignment:
f6f0e17b 13986 val = read_uleb128 (p, &len, end);
87779176
JM
13987 p += len;
13988 printf (" Tag_ABI_array_object_alignment: ");
13989 switch (val)
13990 {
13991 case 0:
13992 printf (_("8-byte\n"));
13993 break;
13994 case 1:
13995 printf (_("4-byte\n"));
13996 break;
13997 case 2:
13998 printf (_("16-byte\n"));
13999 break;
14000 default:
14001 printf ("??? (%d)\n", val);
14002 break;
14003 }
14004 return p;
14005
14006 case Tag_ABI_array_object_align_expected:
f6f0e17b 14007 val = read_uleb128 (p, &len, end);
87779176
JM
14008 p += len;
14009 printf (" Tag_ABI_array_object_align_expected: ");
14010 switch (val)
14011 {
14012 case 0:
14013 printf (_("8-byte\n"));
14014 break;
14015 case 1:
14016 printf (_("4-byte\n"));
14017 break;
14018 case 2:
14019 printf (_("16-byte\n"));
14020 break;
14021 default:
14022 printf ("??? (%d)\n", val);
14023 break;
14024 }
14025 return p;
14026
3cbd1c06 14027 case Tag_ABI_compatibility:
071436c6 14028 {
071436c6
NC
14029 val = read_uleb128 (p, &len, end);
14030 p += len;
14031 printf (" Tag_ABI_compatibility: ");
071436c6 14032 printf (_("flag = %d, vendor = "), val);
4082ef84
NC
14033 if (p < end - 1)
14034 {
14035 size_t maxlen = (end - p) - 1;
14036
14037 print_symbol ((int) maxlen, (const char *) p);
14038 p += strnlen ((char *) p, maxlen) + 1;
14039 }
14040 else
14041 {
14042 printf (_("<corrupt>"));
14043 p = (unsigned char *) end;
14044 }
071436c6 14045 putchar ('\n');
071436c6
NC
14046 return p;
14047 }
87779176
JM
14048
14049 case Tag_ABI_conformance:
071436c6 14050 {
4082ef84
NC
14051 printf (" Tag_ABI_conformance: \"");
14052 if (p < end - 1)
14053 {
14054 size_t maxlen = (end - p) - 1;
071436c6 14055
4082ef84
NC
14056 print_symbol ((int) maxlen, (const char *) p);
14057 p += strnlen ((char *) p, maxlen) + 1;
14058 }
14059 else
14060 {
14061 printf (_("<corrupt>"));
14062 p = (unsigned char *) end;
14063 }
071436c6 14064 printf ("\"\n");
071436c6
NC
14065 return p;
14066 }
59e6276b
JM
14067 }
14068
f6f0e17b
NC
14069 return display_tag_value (tag, p, end);
14070}
59e6276b 14071
f6f0e17b
NC
14072static void
14073display_raw_attribute (unsigned char * p, unsigned char * end)
14074{
14075 unsigned long addr = 0;
14076 size_t bytes = end - p;
14077
e0a31db1 14078 assert (end > p);
f6f0e17b 14079 while (bytes)
87779176 14080 {
f6f0e17b
NC
14081 int j;
14082 int k;
14083 int lbytes = (bytes > 16 ? 16 : bytes);
14084
14085 printf (" 0x%8.8lx ", addr);
14086
14087 for (j = 0; j < 16; j++)
14088 {
14089 if (j < lbytes)
14090 printf ("%2.2x", p[j]);
14091 else
14092 printf (" ");
14093
14094 if ((j & 3) == 3)
14095 printf (" ");
14096 }
14097
14098 for (j = 0; j < lbytes; j++)
14099 {
14100 k = p[j];
14101 if (k >= ' ' && k < 0x7f)
14102 printf ("%c", k);
14103 else
14104 printf (".");
14105 }
14106
14107 putchar ('\n');
14108
14109 p += lbytes;
14110 bytes -= lbytes;
14111 addr += lbytes;
87779176 14112 }
59e6276b 14113
f6f0e17b 14114 putchar ('\n');
59e6276b
JM
14115}
14116
13761a11
NC
14117static unsigned char *
14118display_msp430x_attribute (unsigned char * p,
14119 const unsigned char * const end)
14120{
14121 unsigned int len;
14122 int val;
14123 int tag;
14124
14125 tag = read_uleb128 (p, & len, end);
14126 p += len;
0b4362b0 14127
13761a11
NC
14128 switch (tag)
14129 {
14130 case OFBA_MSPABI_Tag_ISA:
14131 val = read_uleb128 (p, &len, end);
14132 p += len;
14133 printf (" Tag_ISA: ");
14134 switch (val)
14135 {
14136 case 0: printf (_("None\n")); break;
14137 case 1: printf (_("MSP430\n")); break;
14138 case 2: printf (_("MSP430X\n")); break;
14139 default: printf ("??? (%d)\n", val); break;
14140 }
14141 break;
14142
14143 case OFBA_MSPABI_Tag_Code_Model:
14144 val = read_uleb128 (p, &len, end);
14145 p += len;
14146 printf (" Tag_Code_Model: ");
14147 switch (val)
14148 {
14149 case 0: printf (_("None\n")); break;
14150 case 1: printf (_("Small\n")); break;
14151 case 2: printf (_("Large\n")); break;
14152 default: printf ("??? (%d)\n", val); break;
14153 }
14154 break;
14155
14156 case OFBA_MSPABI_Tag_Data_Model:
14157 val = read_uleb128 (p, &len, end);
14158 p += len;
14159 printf (" Tag_Data_Model: ");
14160 switch (val)
14161 {
14162 case 0: printf (_("None\n")); break;
14163 case 1: printf (_("Small\n")); break;
14164 case 2: printf (_("Large\n")); break;
14165 case 3: printf (_("Restricted Large\n")); break;
14166 default: printf ("??? (%d)\n", val); break;
14167 }
14168 break;
14169
14170 default:
14171 printf (_(" <unknown tag %d>: "), tag);
14172
14173 if (tag & 1)
14174 {
071436c6 14175 putchar ('"');
4082ef84
NC
14176 if (p < end - 1)
14177 {
14178 size_t maxlen = (end - p) - 1;
14179
14180 print_symbol ((int) maxlen, (const char *) p);
14181 p += strnlen ((char *) p, maxlen) + 1;
14182 }
14183 else
14184 {
14185 printf (_("<corrupt>"));
14186 p = (unsigned char *) end;
14187 }
071436c6 14188 printf ("\"\n");
13761a11
NC
14189 }
14190 else
14191 {
14192 val = read_uleb128 (p, &len, end);
14193 p += len;
14194 printf ("%d (0x%x)\n", val, val);
14195 }
14196 break;
14197 }
14198
4082ef84 14199 assert (p <= end);
13761a11
NC
14200 return p;
14201}
14202
11c1ff18 14203static int
60bca95a
NC
14204process_attributes (FILE * file,
14205 const char * public_name,
104d59d1 14206 unsigned int proc_type,
f6f0e17b
NC
14207 unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
14208 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const))
11c1ff18 14209{
2cf0635d 14210 Elf_Internal_Shdr * sect;
11c1ff18
PB
14211 unsigned i;
14212
14213 /* Find the section header so that we get the size. */
14214 for (i = 0, sect = section_headers;
14215 i < elf_header.e_shnum;
14216 i++, sect++)
14217 {
071436c6
NC
14218 unsigned char * contents;
14219 unsigned char * p;
14220
104d59d1 14221 if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
11c1ff18
PB
14222 continue;
14223
3f5e193b
NC
14224 contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
14225 sect->sh_size, _("attributes"));
60bca95a 14226 if (contents == NULL)
11c1ff18 14227 continue;
60bca95a 14228
11c1ff18
PB
14229 p = contents;
14230 if (*p == 'A')
14231 {
071436c6
NC
14232 bfd_vma section_len;
14233
14234 section_len = sect->sh_size - 1;
11c1ff18 14235 p++;
60bca95a 14236
071436c6 14237 while (section_len > 0)
11c1ff18 14238 {
071436c6 14239 bfd_vma attr_len;
e9847026 14240 unsigned int namelen;
11c1ff18 14241 bfd_boolean public_section;
104d59d1 14242 bfd_boolean gnu_section;
11c1ff18 14243
071436c6 14244 if (section_len <= 4)
e0a31db1
NC
14245 {
14246 error (_("Tag section ends prematurely\n"));
14247 break;
14248 }
071436c6 14249 attr_len = byte_get (p, 4);
11c1ff18 14250 p += 4;
60bca95a 14251
071436c6 14252 if (attr_len > section_len)
11c1ff18 14253 {
071436c6
NC
14254 error (_("Bad attribute length (%u > %u)\n"),
14255 (unsigned) attr_len, (unsigned) section_len);
14256 attr_len = section_len;
11c1ff18 14257 }
74e1a04b 14258 /* PR 17531: file: 001-101425-0.004 */
071436c6 14259 else if (attr_len < 5)
74e1a04b 14260 {
071436c6 14261 error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
74e1a04b
NC
14262 break;
14263 }
e9847026 14264
071436c6
NC
14265 section_len -= attr_len;
14266 attr_len -= 4;
14267
14268 namelen = strnlen ((char *) p, attr_len) + 1;
14269 if (namelen == 0 || namelen >= attr_len)
e9847026
NC
14270 {
14271 error (_("Corrupt attribute section name\n"));
14272 break;
14273 }
14274
071436c6
NC
14275 printf (_("Attribute Section: "));
14276 print_symbol (INT_MAX, (const char *) p);
14277 putchar ('\n');
60bca95a
NC
14278
14279 if (public_name && streq ((char *) p, public_name))
11c1ff18
PB
14280 public_section = TRUE;
14281 else
14282 public_section = FALSE;
60bca95a
NC
14283
14284 if (streq ((char *) p, "gnu"))
104d59d1
JM
14285 gnu_section = TRUE;
14286 else
14287 gnu_section = FALSE;
60bca95a 14288
11c1ff18 14289 p += namelen;
071436c6 14290 attr_len -= namelen;
e0a31db1 14291
071436c6 14292 while (attr_len > 0 && p < contents + sect->sh_size)
11c1ff18 14293 {
e0a31db1 14294 int tag;
11c1ff18
PB
14295 int val;
14296 bfd_vma size;
071436c6 14297 unsigned char * end;
60bca95a 14298
e0a31db1 14299 /* PR binutils/17531: Safe handling of corrupt files. */
071436c6 14300 if (attr_len < 6)
e0a31db1
NC
14301 {
14302 error (_("Unused bytes at end of section\n"));
14303 section_len = 0;
14304 break;
14305 }
14306
14307 tag = *(p++);
11c1ff18 14308 size = byte_get (p, 4);
071436c6 14309 if (size > attr_len)
11c1ff18 14310 {
e9847026 14311 error (_("Bad subsection length (%u > %u)\n"),
071436c6
NC
14312 (unsigned) size, (unsigned) attr_len);
14313 size = attr_len;
11c1ff18 14314 }
e0a31db1
NC
14315 /* PR binutils/17531: Safe handling of corrupt files. */
14316 if (size < 6)
14317 {
14318 error (_("Bad subsection length (%u < 6)\n"),
14319 (unsigned) size);
14320 section_len = 0;
14321 break;
14322 }
60bca95a 14323
071436c6 14324 attr_len -= size;
11c1ff18 14325 end = p + size - 1;
071436c6 14326 assert (end <= contents + sect->sh_size);
11c1ff18 14327 p += 4;
60bca95a 14328
11c1ff18
PB
14329 switch (tag)
14330 {
14331 case 1:
2b692964 14332 printf (_("File Attributes\n"));
11c1ff18
PB
14333 break;
14334 case 2:
2b692964 14335 printf (_("Section Attributes:"));
11c1ff18
PB
14336 goto do_numlist;
14337 case 3:
2b692964 14338 printf (_("Symbol Attributes:"));
1a0670f3 14339 /* Fall through. */
11c1ff18
PB
14340 do_numlist:
14341 for (;;)
14342 {
91d6fa6a 14343 unsigned int j;
60bca95a 14344
f6f0e17b 14345 val = read_uleb128 (p, &j, end);
91d6fa6a 14346 p += j;
11c1ff18
PB
14347 if (val == 0)
14348 break;
14349 printf (" %d", val);
14350 }
14351 printf ("\n");
14352 break;
14353 default:
2b692964 14354 printf (_("Unknown tag: %d\n"), tag);
11c1ff18
PB
14355 public_section = FALSE;
14356 break;
14357 }
60bca95a 14358
071436c6 14359 if (public_section && display_pub_attribute != NULL)
11c1ff18
PB
14360 {
14361 while (p < end)
f6f0e17b 14362 p = display_pub_attribute (p, end);
071436c6 14363 assert (p <= end);
104d59d1 14364 }
071436c6 14365 else if (gnu_section && display_proc_gnu_attribute != NULL)
104d59d1
JM
14366 {
14367 while (p < end)
14368 p = display_gnu_attribute (p,
f6f0e17b
NC
14369 display_proc_gnu_attribute,
14370 end);
071436c6 14371 assert (p <= end);
11c1ff18 14372 }
071436c6 14373 else if (p < end)
11c1ff18 14374 {
071436c6 14375 printf (_(" Unknown attribute:\n"));
f6f0e17b 14376 display_raw_attribute (p, end);
11c1ff18
PB
14377 p = end;
14378 }
071436c6
NC
14379 else
14380 attr_len = 0;
11c1ff18
PB
14381 }
14382 }
14383 }
14384 else
e9847026 14385 printf (_("Unknown format '%c' (%d)\n"), *p, *p);
d70c5fc7 14386
60bca95a 14387 free (contents);
11c1ff18
PB
14388 }
14389 return 1;
14390}
14391
104d59d1 14392static int
2cf0635d 14393process_arm_specific (FILE * file)
104d59d1
JM
14394{
14395 return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
14396 display_arm_attribute, NULL);
14397}
14398
34c8bcba 14399static int
2cf0635d 14400process_power_specific (FILE * file)
34c8bcba
JM
14401{
14402 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14403 display_power_gnu_attribute);
14404}
14405
643f7afb
AK
14406static int
14407process_s390_specific (FILE * file)
14408{
14409 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14410 display_s390_gnu_attribute);
14411}
14412
9e8c70f9
DM
14413static int
14414process_sparc_specific (FILE * file)
14415{
14416 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14417 display_sparc_gnu_attribute);
14418}
14419
59e6276b
JM
14420static int
14421process_tic6x_specific (FILE * file)
14422{
14423 return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
14424 display_tic6x_attribute, NULL);
14425}
14426
13761a11
NC
14427static int
14428process_msp430x_specific (FILE * file)
14429{
14430 return process_attributes (file, "mspabi", SHT_MSP430_ATTRIBUTES,
14431 display_msp430x_attribute, NULL);
14432}
14433
ccb4c951
RS
14434/* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
14435 Print the Address, Access and Initial fields of an entry at VMA ADDR
82b1b41b
NC
14436 and return the VMA of the next entry, or -1 if there was a problem.
14437 Does not read from DATA_END or beyond. */
ccb4c951
RS
14438
14439static bfd_vma
82b1b41b
NC
14440print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
14441 unsigned char * data_end)
ccb4c951
RS
14442{
14443 printf (" ");
14444 print_vma (addr, LONG_HEX);
14445 printf (" ");
14446 if (addr < pltgot + 0xfff0)
14447 printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
14448 else
14449 printf ("%10s", "");
14450 printf (" ");
14451 if (data == NULL)
2b692964 14452 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
ccb4c951
RS
14453 else
14454 {
14455 bfd_vma entry;
82b1b41b 14456 unsigned char * from = data + addr - pltgot;
ccb4c951 14457
82b1b41b
NC
14458 if (from + (is_32bit_elf ? 4 : 8) > data_end)
14459 {
14460 warn (_("MIPS GOT entry extends beyond the end of available data\n"));
14461 printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
14462 return (bfd_vma) -1;
14463 }
14464 else
14465 {
14466 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14467 print_vma (entry, LONG_HEX);
14468 }
ccb4c951
RS
14469 }
14470 return addr + (is_32bit_elf ? 4 : 8);
14471}
14472
861fb55a
DJ
14473/* DATA points to the contents of a MIPS PLT GOT that starts at VMA
14474 PLTGOT. Print the Address and Initial fields of an entry at VMA
14475 ADDR and return the VMA of the next entry. */
14476
14477static bfd_vma
2cf0635d 14478print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
861fb55a
DJ
14479{
14480 printf (" ");
14481 print_vma (addr, LONG_HEX);
14482 printf (" ");
14483 if (data == NULL)
2b692964 14484 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
861fb55a
DJ
14485 else
14486 {
14487 bfd_vma entry;
14488
14489 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14490 print_vma (entry, LONG_HEX);
14491 }
14492 return addr + (is_32bit_elf ? 4 : 8);
14493}
14494
351cdf24
MF
14495static void
14496print_mips_ases (unsigned int mask)
14497{
14498 if (mask & AFL_ASE_DSP)
14499 fputs ("\n\tDSP ASE", stdout);
14500 if (mask & AFL_ASE_DSPR2)
14501 fputs ("\n\tDSP R2 ASE", stdout);
8f4f9071
MF
14502 if (mask & AFL_ASE_DSPR3)
14503 fputs ("\n\tDSP R3 ASE", stdout);
351cdf24
MF
14504 if (mask & AFL_ASE_EVA)
14505 fputs ("\n\tEnhanced VA Scheme", stdout);
14506 if (mask & AFL_ASE_MCU)
14507 fputs ("\n\tMCU (MicroController) ASE", stdout);
14508 if (mask & AFL_ASE_MDMX)
14509 fputs ("\n\tMDMX ASE", stdout);
14510 if (mask & AFL_ASE_MIPS3D)
14511 fputs ("\n\tMIPS-3D ASE", stdout);
14512 if (mask & AFL_ASE_MT)
14513 fputs ("\n\tMT ASE", stdout);
14514 if (mask & AFL_ASE_SMARTMIPS)
14515 fputs ("\n\tSmartMIPS ASE", stdout);
14516 if (mask & AFL_ASE_VIRT)
14517 fputs ("\n\tVZ ASE", stdout);
14518 if (mask & AFL_ASE_MSA)
14519 fputs ("\n\tMSA ASE", stdout);
14520 if (mask & AFL_ASE_MIPS16)
14521 fputs ("\n\tMIPS16 ASE", stdout);
14522 if (mask & AFL_ASE_MICROMIPS)
14523 fputs ("\n\tMICROMIPS ASE", stdout);
14524 if (mask & AFL_ASE_XPA)
14525 fputs ("\n\tXPA ASE", stdout);
14526 if (mask == 0)
14527 fprintf (stdout, "\n\t%s", _("None"));
00ac7aa0
MF
14528 else if ((mask & ~AFL_ASE_MASK) != 0)
14529 fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
351cdf24
MF
14530}
14531
14532static void
14533print_mips_isa_ext (unsigned int isa_ext)
14534{
14535 switch (isa_ext)
14536 {
14537 case 0:
14538 fputs (_("None"), stdout);
14539 break;
14540 case AFL_EXT_XLR:
14541 fputs ("RMI XLR", stdout);
14542 break;
2c629856
N
14543 case AFL_EXT_OCTEON3:
14544 fputs ("Cavium Networks Octeon3", stdout);
14545 break;
351cdf24
MF
14546 case AFL_EXT_OCTEON2:
14547 fputs ("Cavium Networks Octeon2", stdout);
14548 break;
14549 case AFL_EXT_OCTEONP:
14550 fputs ("Cavium Networks OcteonP", stdout);
14551 break;
14552 case AFL_EXT_LOONGSON_3A:
14553 fputs ("Loongson 3A", stdout);
14554 break;
14555 case AFL_EXT_OCTEON:
14556 fputs ("Cavium Networks Octeon", stdout);
14557 break;
14558 case AFL_EXT_5900:
14559 fputs ("Toshiba R5900", stdout);
14560 break;
14561 case AFL_EXT_4650:
14562 fputs ("MIPS R4650", stdout);
14563 break;
14564 case AFL_EXT_4010:
14565 fputs ("LSI R4010", stdout);
14566 break;
14567 case AFL_EXT_4100:
14568 fputs ("NEC VR4100", stdout);
14569 break;
14570 case AFL_EXT_3900:
14571 fputs ("Toshiba R3900", stdout);
14572 break;
14573 case AFL_EXT_10000:
14574 fputs ("MIPS R10000", stdout);
14575 break;
14576 case AFL_EXT_SB1:
14577 fputs ("Broadcom SB-1", stdout);
14578 break;
14579 case AFL_EXT_4111:
14580 fputs ("NEC VR4111/VR4181", stdout);
14581 break;
14582 case AFL_EXT_4120:
14583 fputs ("NEC VR4120", stdout);
14584 break;
14585 case AFL_EXT_5400:
14586 fputs ("NEC VR5400", stdout);
14587 break;
14588 case AFL_EXT_5500:
14589 fputs ("NEC VR5500", stdout);
14590 break;
14591 case AFL_EXT_LOONGSON_2E:
14592 fputs ("ST Microelectronics Loongson 2E", stdout);
14593 break;
14594 case AFL_EXT_LOONGSON_2F:
14595 fputs ("ST Microelectronics Loongson 2F", stdout);
14596 break;
14597 default:
00ac7aa0 14598 fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
351cdf24
MF
14599 }
14600}
14601
14602static int
14603get_mips_reg_size (int reg_size)
14604{
14605 return (reg_size == AFL_REG_NONE) ? 0
14606 : (reg_size == AFL_REG_32) ? 32
14607 : (reg_size == AFL_REG_64) ? 64
14608 : (reg_size == AFL_REG_128) ? 128
14609 : -1;
14610}
14611
19e6b90e 14612static int
2cf0635d 14613process_mips_specific (FILE * file)
5b18a4bc 14614{
2cf0635d 14615 Elf_Internal_Dyn * entry;
351cdf24 14616 Elf_Internal_Shdr *sect = NULL;
19e6b90e
L
14617 size_t liblist_offset = 0;
14618 size_t liblistno = 0;
14619 size_t conflictsno = 0;
14620 size_t options_offset = 0;
14621 size_t conflicts_offset = 0;
861fb55a
DJ
14622 size_t pltrelsz = 0;
14623 size_t pltrel = 0;
ccb4c951 14624 bfd_vma pltgot = 0;
861fb55a
DJ
14625 bfd_vma mips_pltgot = 0;
14626 bfd_vma jmprel = 0;
ccb4c951
RS
14627 bfd_vma local_gotno = 0;
14628 bfd_vma gotsym = 0;
14629 bfd_vma symtabno = 0;
103f02d3 14630
2cf19d5c
JM
14631 process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14632 display_mips_gnu_attribute);
14633
351cdf24
MF
14634 sect = find_section (".MIPS.abiflags");
14635
14636 if (sect != NULL)
14637 {
14638 Elf_External_ABIFlags_v0 *abiflags_ext;
14639 Elf_Internal_ABIFlags_v0 abiflags_in;
14640
14641 if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
14642 fputs ("\nCorrupt ABI Flags section.\n", stdout);
14643 else
14644 {
14645 abiflags_ext = get_data (NULL, file, sect->sh_offset, 1,
14646 sect->sh_size, _("MIPS ABI Flags section"));
14647 if (abiflags_ext)
14648 {
14649 abiflags_in.version = BYTE_GET (abiflags_ext->version);
14650 abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
14651 abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
14652 abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
14653 abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
14654 abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
14655 abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
14656 abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
14657 abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
14658 abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
14659 abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
14660
14661 printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
14662 printf ("\nISA: MIPS%d", abiflags_in.isa_level);
14663 if (abiflags_in.isa_rev > 1)
14664 printf ("r%d", abiflags_in.isa_rev);
14665 printf ("\nGPR size: %d",
14666 get_mips_reg_size (abiflags_in.gpr_size));
14667 printf ("\nCPR1 size: %d",
14668 get_mips_reg_size (abiflags_in.cpr1_size));
14669 printf ("\nCPR2 size: %d",
14670 get_mips_reg_size (abiflags_in.cpr2_size));
14671 fputs ("\nFP ABI: ", stdout);
14672 print_mips_fp_abi_value (abiflags_in.fp_abi);
14673 fputs ("ISA Extension: ", stdout);
14674 print_mips_isa_ext (abiflags_in.isa_ext);
14675 fputs ("\nASEs:", stdout);
14676 print_mips_ases (abiflags_in.ases);
14677 printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
14678 printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
14679 fputc ('\n', stdout);
14680 free (abiflags_ext);
14681 }
14682 }
14683 }
14684
19e6b90e
L
14685 /* We have a lot of special sections. Thanks SGI! */
14686 if (dynamic_section == NULL)
14687 /* No information available. */
14688 return 0;
252b5132 14689
071436c6
NC
14690 for (entry = dynamic_section;
14691 /* PR 17531 file: 012-50589-0.004. */
14692 entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
14693 ++entry)
252b5132
RH
14694 switch (entry->d_tag)
14695 {
14696 case DT_MIPS_LIBLIST:
d93f0186
NC
14697 liblist_offset
14698 = offset_from_vma (file, entry->d_un.d_val,
14699 liblistno * sizeof (Elf32_External_Lib));
252b5132
RH
14700 break;
14701 case DT_MIPS_LIBLISTNO:
14702 liblistno = entry->d_un.d_val;
14703 break;
14704 case DT_MIPS_OPTIONS:
d93f0186 14705 options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
252b5132
RH
14706 break;
14707 case DT_MIPS_CONFLICT:
d93f0186
NC
14708 conflicts_offset
14709 = offset_from_vma (file, entry->d_un.d_val,
14710 conflictsno * sizeof (Elf32_External_Conflict));
252b5132
RH
14711 break;
14712 case DT_MIPS_CONFLICTNO:
14713 conflictsno = entry->d_un.d_val;
14714 break;
ccb4c951 14715 case DT_PLTGOT:
861fb55a
DJ
14716 pltgot = entry->d_un.d_ptr;
14717 break;
ccb4c951
RS
14718 case DT_MIPS_LOCAL_GOTNO:
14719 local_gotno = entry->d_un.d_val;
14720 break;
14721 case DT_MIPS_GOTSYM:
14722 gotsym = entry->d_un.d_val;
14723 break;
14724 case DT_MIPS_SYMTABNO:
14725 symtabno = entry->d_un.d_val;
14726 break;
861fb55a
DJ
14727 case DT_MIPS_PLTGOT:
14728 mips_pltgot = entry->d_un.d_ptr;
14729 break;
14730 case DT_PLTREL:
14731 pltrel = entry->d_un.d_val;
14732 break;
14733 case DT_PLTRELSZ:
14734 pltrelsz = entry->d_un.d_val;
14735 break;
14736 case DT_JMPREL:
14737 jmprel = entry->d_un.d_ptr;
14738 break;
252b5132
RH
14739 default:
14740 break;
14741 }
14742
14743 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
14744 {
2cf0635d 14745 Elf32_External_Lib * elib;
252b5132
RH
14746 size_t cnt;
14747
3f5e193b
NC
14748 elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
14749 liblistno,
14750 sizeof (Elf32_External_Lib),
9cf03b7e 14751 _("liblist section data"));
a6e9f9df 14752 if (elib)
252b5132 14753 {
2b692964 14754 printf (_("\nSection '.liblist' contains %lu entries:\n"),
a6e9f9df 14755 (unsigned long) liblistno);
2b692964 14756 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
a6e9f9df
AM
14757 stdout);
14758
14759 for (cnt = 0; cnt < liblistno; ++cnt)
252b5132 14760 {
a6e9f9df 14761 Elf32_Lib liblist;
91d6fa6a 14762 time_t atime;
d5b07ef4 14763 char timebuf[128];
2cf0635d 14764 struct tm * tmp;
a6e9f9df
AM
14765
14766 liblist.l_name = BYTE_GET (elib[cnt].l_name);
91d6fa6a 14767 atime = BYTE_GET (elib[cnt].l_time_stamp);
a6e9f9df
AM
14768 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
14769 liblist.l_version = BYTE_GET (elib[cnt].l_version);
14770 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
14771
91d6fa6a 14772 tmp = gmtime (&atime);
e9e44622
JJ
14773 snprintf (timebuf, sizeof (timebuf),
14774 "%04u-%02u-%02uT%02u:%02u:%02u",
14775 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
14776 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
a6e9f9df 14777
31104126 14778 printf ("%3lu: ", (unsigned long) cnt);
d79b3d50
NC
14779 if (VALID_DYNAMIC_NAME (liblist.l_name))
14780 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
14781 else
2b692964 14782 printf (_("<corrupt: %9ld>"), liblist.l_name);
31104126
NC
14783 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
14784 liblist.l_version);
a6e9f9df
AM
14785
14786 if (liblist.l_flags == 0)
2b692964 14787 puts (_(" NONE"));
a6e9f9df
AM
14788 else
14789 {
14790 static const struct
252b5132 14791 {
2cf0635d 14792 const char * name;
a6e9f9df 14793 int bit;
252b5132 14794 }
a6e9f9df
AM
14795 l_flags_vals[] =
14796 {
14797 { " EXACT_MATCH", LL_EXACT_MATCH },
14798 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
14799 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
14800 { " EXPORTS", LL_EXPORTS },
14801 { " DELAY_LOAD", LL_DELAY_LOAD },
14802 { " DELTA", LL_DELTA }
14803 };
14804 int flags = liblist.l_flags;
14805 size_t fcnt;
14806
60bca95a 14807 for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
a6e9f9df
AM
14808 if ((flags & l_flags_vals[fcnt].bit) != 0)
14809 {
14810 fputs (l_flags_vals[fcnt].name, stdout);
14811 flags ^= l_flags_vals[fcnt].bit;
14812 }
14813 if (flags != 0)
14814 printf (" %#x", (unsigned int) flags);
252b5132 14815
a6e9f9df
AM
14816 puts ("");
14817 }
252b5132 14818 }
252b5132 14819
a6e9f9df
AM
14820 free (elib);
14821 }
252b5132
RH
14822 }
14823
14824 if (options_offset != 0)
14825 {
2cf0635d 14826 Elf_External_Options * eopt;
2cf0635d
NC
14827 Elf_Internal_Options * iopt;
14828 Elf_Internal_Options * option;
252b5132
RH
14829 size_t offset;
14830 int cnt;
351cdf24 14831 sect = section_headers;
252b5132
RH
14832
14833 /* Find the section header so that we get the size. */
071436c6 14834 sect = find_section_by_type (SHT_MIPS_OPTIONS);
948f632f 14835 /* PR 17533 file: 012-277276-0.004. */
071436c6
NC
14836 if (sect == NULL)
14837 {
14838 error (_("No MIPS_OPTIONS header found\n"));
14839 return 0;
14840 }
252b5132 14841
3f5e193b
NC
14842 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
14843 sect->sh_size, _("options"));
a6e9f9df 14844 if (eopt)
252b5132 14845 {
3f5e193b
NC
14846 iopt = (Elf_Internal_Options *)
14847 cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
a6e9f9df
AM
14848 if (iopt == NULL)
14849 {
fb324ee9 14850 error (_("Out of memory allocating space for MIPS options\n"));
a6e9f9df
AM
14851 return 0;
14852 }
76da6bbe 14853
a6e9f9df
AM
14854 offset = cnt = 0;
14855 option = iopt;
252b5132 14856
82b1b41b 14857 while (offset <= sect->sh_size - sizeof (* eopt))
a6e9f9df 14858 {
2cf0635d 14859 Elf_External_Options * eoption;
252b5132 14860
a6e9f9df 14861 eoption = (Elf_External_Options *) ((char *) eopt + offset);
252b5132 14862
a6e9f9df
AM
14863 option->kind = BYTE_GET (eoption->kind);
14864 option->size = BYTE_GET (eoption->size);
14865 option->section = BYTE_GET (eoption->section);
14866 option->info = BYTE_GET (eoption->info);
76da6bbe 14867
82b1b41b
NC
14868 /* PR 17531: file: ffa0fa3b. */
14869 if (option->size < sizeof (* eopt)
14870 || offset + option->size > sect->sh_size)
14871 {
55325047
NC
14872 error (_("Invalid size (%u) for MIPS option\n"), option->size);
14873 return 0;
82b1b41b 14874 }
a6e9f9df 14875 offset += option->size;
14ae95f2 14876
a6e9f9df
AM
14877 ++option;
14878 ++cnt;
14879 }
252b5132 14880
a6e9f9df 14881 printf (_("\nSection '%s' contains %d entries:\n"),
74e1a04b 14882 printable_section_name (sect), cnt);
76da6bbe 14883
a6e9f9df 14884 option = iopt;
82b1b41b 14885 offset = 0;
252b5132 14886
a6e9f9df 14887 while (cnt-- > 0)
252b5132 14888 {
a6e9f9df
AM
14889 size_t len;
14890
14891 switch (option->kind)
252b5132 14892 {
a6e9f9df
AM
14893 case ODK_NULL:
14894 /* This shouldn't happen. */
14895 printf (" NULL %d %lx", option->section, option->info);
14896 break;
14897 case ODK_REGINFO:
14898 printf (" REGINFO ");
14899 if (elf_header.e_machine == EM_MIPS)
14900 {
14901 /* 32bit form. */
2cf0635d 14902 Elf32_External_RegInfo * ereg;
b34976b6 14903 Elf32_RegInfo reginfo;
a6e9f9df
AM
14904
14905 ereg = (Elf32_External_RegInfo *) (option + 1);
14906 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
14907 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
14908 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
14909 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
14910 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
14911 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
14912
14913 printf ("GPR %08lx GP 0x%lx\n",
14914 reginfo.ri_gprmask,
14915 (unsigned long) reginfo.ri_gp_value);
14916 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
14917 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
14918 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
14919 }
14920 else
14921 {
14922 /* 64 bit form. */
2cf0635d 14923 Elf64_External_RegInfo * ereg;
a6e9f9df
AM
14924 Elf64_Internal_RegInfo reginfo;
14925
14926 ereg = (Elf64_External_RegInfo *) (option + 1);
14927 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
14928 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
14929 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
14930 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
14931 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
66543521 14932 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
a6e9f9df
AM
14933
14934 printf ("GPR %08lx GP 0x",
14935 reginfo.ri_gprmask);
14936 printf_vma (reginfo.ri_gp_value);
14937 printf ("\n");
14938
14939 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
14940 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
14941 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
14942 }
14943 ++option;
14944 continue;
14945 case ODK_EXCEPTIONS:
14946 fputs (" EXCEPTIONS fpe_min(", stdout);
14947 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
14948 fputs (") fpe_max(", stdout);
14949 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
14950 fputs (")", stdout);
14951
14952 if (option->info & OEX_PAGE0)
14953 fputs (" PAGE0", stdout);
14954 if (option->info & OEX_SMM)
14955 fputs (" SMM", stdout);
14956 if (option->info & OEX_FPDBUG)
14957 fputs (" FPDBUG", stdout);
14958 if (option->info & OEX_DISMISS)
14959 fputs (" DISMISS", stdout);
14960 break;
14961 case ODK_PAD:
14962 fputs (" PAD ", stdout);
14963 if (option->info & OPAD_PREFIX)
14964 fputs (" PREFIX", stdout);
14965 if (option->info & OPAD_POSTFIX)
14966 fputs (" POSTFIX", stdout);
14967 if (option->info & OPAD_SYMBOL)
14968 fputs (" SYMBOL", stdout);
14969 break;
14970 case ODK_HWPATCH:
14971 fputs (" HWPATCH ", stdout);
14972 if (option->info & OHW_R4KEOP)
14973 fputs (" R4KEOP", stdout);
14974 if (option->info & OHW_R8KPFETCH)
14975 fputs (" R8KPFETCH", stdout);
14976 if (option->info & OHW_R5KEOP)
14977 fputs (" R5KEOP", stdout);
14978 if (option->info & OHW_R5KCVTL)
14979 fputs (" R5KCVTL", stdout);
14980 break;
14981 case ODK_FILL:
14982 fputs (" FILL ", stdout);
14983 /* XXX Print content of info word? */
14984 break;
14985 case ODK_TAGS:
14986 fputs (" TAGS ", stdout);
14987 /* XXX Print content of info word? */
14988 break;
14989 case ODK_HWAND:
14990 fputs (" HWAND ", stdout);
14991 if (option->info & OHWA0_R4KEOP_CHECKED)
14992 fputs (" R4KEOP_CHECKED", stdout);
14993 if (option->info & OHWA0_R4KEOP_CLEAN)
14994 fputs (" R4KEOP_CLEAN", stdout);
14995 break;
14996 case ODK_HWOR:
14997 fputs (" HWOR ", stdout);
14998 if (option->info & OHWA0_R4KEOP_CHECKED)
14999 fputs (" R4KEOP_CHECKED", stdout);
15000 if (option->info & OHWA0_R4KEOP_CLEAN)
15001 fputs (" R4KEOP_CLEAN", stdout);
15002 break;
15003 case ODK_GP_GROUP:
15004 printf (" GP_GROUP %#06lx self-contained %#06lx",
15005 option->info & OGP_GROUP,
15006 (option->info & OGP_SELF) >> 16);
15007 break;
15008 case ODK_IDENT:
15009 printf (" IDENT %#06lx self-contained %#06lx",
15010 option->info & OGP_GROUP,
15011 (option->info & OGP_SELF) >> 16);
15012 break;
15013 default:
15014 /* This shouldn't happen. */
15015 printf (" %3d ??? %d %lx",
15016 option->kind, option->section, option->info);
15017 break;
252b5132 15018 }
a6e9f9df 15019
2cf0635d 15020 len = sizeof (* eopt);
a6e9f9df 15021 while (len < option->size)
82b1b41b 15022 {
7e27a9d5 15023 unsigned char datum = * ((unsigned char *) eopt + offset + len);
a6e9f9df 15024
82b1b41b
NC
15025 if (ISPRINT (datum))
15026 printf ("%c", datum);
15027 else
15028 printf ("\\%03o", datum);
15029 len ++;
15030 }
a6e9f9df 15031 fputs ("\n", stdout);
82b1b41b
NC
15032
15033 offset += option->size;
252b5132 15034 ++option;
252b5132
RH
15035 }
15036
a6e9f9df 15037 free (eopt);
252b5132 15038 }
252b5132
RH
15039 }
15040
15041 if (conflicts_offset != 0 && conflictsno != 0)
15042 {
2cf0635d 15043 Elf32_Conflict * iconf;
252b5132
RH
15044 size_t cnt;
15045
15046 if (dynamic_symbols == NULL)
15047 {
591a748a 15048 error (_("conflict list found without a dynamic symbol table\n"));
252b5132
RH
15049 return 0;
15050 }
15051
3f5e193b 15052 iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
252b5132
RH
15053 if (iconf == NULL)
15054 {
8b73c356 15055 error (_("Out of memory allocating space for dynamic conflicts\n"));
252b5132
RH
15056 return 0;
15057 }
15058
9ea033b2 15059 if (is_32bit_elf)
252b5132 15060 {
2cf0635d 15061 Elf32_External_Conflict * econf32;
a6e9f9df 15062
3f5e193b
NC
15063 econf32 = (Elf32_External_Conflict *)
15064 get_data (NULL, file, conflicts_offset, conflictsno,
15065 sizeof (* econf32), _("conflict"));
a6e9f9df
AM
15066 if (!econf32)
15067 return 0;
252b5132
RH
15068
15069 for (cnt = 0; cnt < conflictsno; ++cnt)
15070 iconf[cnt] = BYTE_GET (econf32[cnt]);
a6e9f9df
AM
15071
15072 free (econf32);
252b5132
RH
15073 }
15074 else
15075 {
2cf0635d 15076 Elf64_External_Conflict * econf64;
a6e9f9df 15077
3f5e193b
NC
15078 econf64 = (Elf64_External_Conflict *)
15079 get_data (NULL, file, conflicts_offset, conflictsno,
15080 sizeof (* econf64), _("conflict"));
a6e9f9df
AM
15081 if (!econf64)
15082 return 0;
252b5132
RH
15083
15084 for (cnt = 0; cnt < conflictsno; ++cnt)
15085 iconf[cnt] = BYTE_GET (econf64[cnt]);
a6e9f9df
AM
15086
15087 free (econf64);
252b5132
RH
15088 }
15089
c7e7ca54
NC
15090 printf (_("\nSection '.conflict' contains %lu entries:\n"),
15091 (unsigned long) conflictsno);
252b5132
RH
15092 puts (_(" Num: Index Value Name"));
15093
15094 for (cnt = 0; cnt < conflictsno; ++cnt)
15095 {
b34976b6 15096 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
e0a31db1
NC
15097
15098 if (iconf[cnt] >= num_dynamic_syms)
15099 printf (_("<corrupt symbol index>"));
d79b3d50 15100 else
e0a31db1
NC
15101 {
15102 Elf_Internal_Sym * psym;
15103
15104 psym = & dynamic_symbols[iconf[cnt]];
15105 print_vma (psym->st_value, FULL_HEX);
15106 putchar (' ');
15107 if (VALID_DYNAMIC_NAME (psym->st_name))
15108 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
15109 else
15110 printf (_("<corrupt: %14ld>"), psym->st_name);
15111 }
31104126 15112 putchar ('\n');
252b5132
RH
15113 }
15114
252b5132
RH
15115 free (iconf);
15116 }
15117
ccb4c951
RS
15118 if (pltgot != 0 && local_gotno != 0)
15119 {
91d6fa6a 15120 bfd_vma ent, local_end, global_end;
bbeee7ea 15121 size_t i, offset;
2cf0635d 15122 unsigned char * data;
82b1b41b 15123 unsigned char * data_end;
bbeee7ea 15124 int addr_size;
ccb4c951 15125
91d6fa6a 15126 ent = pltgot;
ccb4c951
RS
15127 addr_size = (is_32bit_elf ? 4 : 8);
15128 local_end = pltgot + local_gotno * addr_size;
ccb4c951 15129
74e1a04b
NC
15130 /* PR binutils/17533 file: 012-111227-0.004 */
15131 if (symtabno < gotsym)
15132 {
15133 error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
82b1b41b 15134 (unsigned long) gotsym, (unsigned long) symtabno);
74e1a04b
NC
15135 return 0;
15136 }
82b1b41b 15137
74e1a04b 15138 global_end = local_end + (symtabno - gotsym) * addr_size;
82b1b41b
NC
15139 /* PR 17531: file: 54c91a34. */
15140 if (global_end < local_end)
15141 {
15142 error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
15143 return 0;
15144 }
948f632f 15145
ccb4c951 15146 offset = offset_from_vma (file, pltgot, global_end - pltgot);
3f5e193b 15147 data = (unsigned char *) get_data (NULL, file, offset,
9cf03b7e
NC
15148 global_end - pltgot, 1,
15149 _("Global Offset Table data"));
59245841
NC
15150 if (data == NULL)
15151 return 0;
82b1b41b 15152 data_end = data + (global_end - pltgot);
59245841 15153
ccb4c951
RS
15154 printf (_("\nPrimary GOT:\n"));
15155 printf (_(" Canonical gp value: "));
15156 print_vma (pltgot + 0x7ff0, LONG_HEX);
15157 printf ("\n\n");
15158
15159 printf (_(" Reserved entries:\n"));
15160 printf (_(" %*s %10s %*s Purpose\n"),
2b692964
NC
15161 addr_size * 2, _("Address"), _("Access"),
15162 addr_size * 2, _("Initial"));
82b1b41b 15163 ent = print_mips_got_entry (data, pltgot, ent, data_end);
2b692964 15164 printf (_(" Lazy resolver\n"));
82b1b41b
NC
15165 if (ent == (bfd_vma) -1)
15166 goto got_print_fail;
ccb4c951 15167 if (data
91d6fa6a 15168 && (byte_get (data + ent - pltgot, addr_size)
ccb4c951
RS
15169 >> (addr_size * 8 - 1)) != 0)
15170 {
82b1b41b 15171 ent = print_mips_got_entry (data, pltgot, ent, data_end);
2b692964 15172 printf (_(" Module pointer (GNU extension)\n"));
82b1b41b
NC
15173 if (ent == (bfd_vma) -1)
15174 goto got_print_fail;
ccb4c951
RS
15175 }
15176 printf ("\n");
15177
91d6fa6a 15178 if (ent < local_end)
ccb4c951
RS
15179 {
15180 printf (_(" Local entries:\n"));
cc5914eb 15181 printf (" %*s %10s %*s\n",
2b692964
NC
15182 addr_size * 2, _("Address"), _("Access"),
15183 addr_size * 2, _("Initial"));
91d6fa6a 15184 while (ent < local_end)
ccb4c951 15185 {
82b1b41b 15186 ent = print_mips_got_entry (data, pltgot, ent, data_end);
ccb4c951 15187 printf ("\n");
82b1b41b
NC
15188 if (ent == (bfd_vma) -1)
15189 goto got_print_fail;
ccb4c951
RS
15190 }
15191 printf ("\n");
15192 }
15193
15194 if (gotsym < symtabno)
15195 {
15196 int sym_width;
15197
15198 printf (_(" Global entries:\n"));
cc5914eb 15199 printf (" %*s %10s %*s %*s %-7s %3s %s\n",
9cf03b7e
NC
15200 addr_size * 2, _("Address"),
15201 _("Access"),
2b692964 15202 addr_size * 2, _("Initial"),
9cf03b7e
NC
15203 addr_size * 2, _("Sym.Val."),
15204 _("Type"),
15205 /* Note for translators: "Ndx" = abbreviated form of "Index". */
15206 _("Ndx"), _("Name"));
0b4362b0 15207
ccb4c951 15208 sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
e0a31db1 15209
ccb4c951
RS
15210 for (i = gotsym; i < symtabno; i++)
15211 {
82b1b41b 15212 ent = print_mips_got_entry (data, pltgot, ent, data_end);
ccb4c951 15213 printf (" ");
e0a31db1
NC
15214
15215 if (dynamic_symbols == NULL)
15216 printf (_("<no dynamic symbols>"));
15217 else if (i < num_dynamic_syms)
15218 {
15219 Elf_Internal_Sym * psym = dynamic_symbols + i;
15220
15221 print_vma (psym->st_value, LONG_HEX);
15222 printf (" %-7s %3s ",
15223 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
15224 get_symbol_index_type (psym->st_shndx));
15225
15226 if (VALID_DYNAMIC_NAME (psym->st_name))
15227 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
15228 else
15229 printf (_("<corrupt: %14ld>"), psym->st_name);
15230 }
ccb4c951 15231 else
7fc5ac57
JBG
15232 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
15233 (unsigned long) i);
e0a31db1 15234
ccb4c951 15235 printf ("\n");
82b1b41b
NC
15236 if (ent == (bfd_vma) -1)
15237 break;
ccb4c951
RS
15238 }
15239 printf ("\n");
15240 }
15241
82b1b41b 15242 got_print_fail:
ccb4c951
RS
15243 if (data)
15244 free (data);
15245 }
15246
861fb55a
DJ
15247 if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
15248 {
91d6fa6a 15249 bfd_vma ent, end;
861fb55a
DJ
15250 size_t offset, rel_offset;
15251 unsigned long count, i;
2cf0635d 15252 unsigned char * data;
861fb55a 15253 int addr_size, sym_width;
2cf0635d 15254 Elf_Internal_Rela * rels;
861fb55a
DJ
15255
15256 rel_offset = offset_from_vma (file, jmprel, pltrelsz);
15257 if (pltrel == DT_RELA)
15258 {
15259 if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
15260 return 0;
15261 }
15262 else
15263 {
15264 if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
15265 return 0;
15266 }
15267
91d6fa6a 15268 ent = mips_pltgot;
861fb55a
DJ
15269 addr_size = (is_32bit_elf ? 4 : 8);
15270 end = mips_pltgot + (2 + count) * addr_size;
15271
15272 offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
3f5e193b 15273 data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
9cf03b7e 15274 1, _("Procedure Linkage Table data"));
59245841
NC
15275 if (data == NULL)
15276 return 0;
15277
9cf03b7e 15278 printf ("\nPLT GOT:\n\n");
861fb55a
DJ
15279 printf (_(" Reserved entries:\n"));
15280 printf (_(" %*s %*s Purpose\n"),
2b692964 15281 addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
91d6fa6a 15282 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
2b692964 15283 printf (_(" PLT lazy resolver\n"));
91d6fa6a 15284 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
2b692964 15285 printf (_(" Module pointer\n"));
861fb55a
DJ
15286 printf ("\n");
15287
15288 printf (_(" Entries:\n"));
cc5914eb 15289 printf (" %*s %*s %*s %-7s %3s %s\n",
2b692964
NC
15290 addr_size * 2, _("Address"),
15291 addr_size * 2, _("Initial"),
15292 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
861fb55a
DJ
15293 sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
15294 for (i = 0; i < count; i++)
15295 {
df97ab2a 15296 unsigned long idx = get_reloc_symindex (rels[i].r_info);
861fb55a 15297
91d6fa6a 15298 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
861fb55a 15299 printf (" ");
e0a31db1 15300
df97ab2a
MF
15301 if (idx >= num_dynamic_syms)
15302 printf (_("<corrupt symbol index: %lu>"), idx);
861fb55a 15303 else
e0a31db1 15304 {
df97ab2a 15305 Elf_Internal_Sym * psym = dynamic_symbols + idx;
e0a31db1
NC
15306
15307 print_vma (psym->st_value, LONG_HEX);
15308 printf (" %-7s %3s ",
15309 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
15310 get_symbol_index_type (psym->st_shndx));
15311 if (VALID_DYNAMIC_NAME (psym->st_name))
15312 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
15313 else
15314 printf (_("<corrupt: %14ld>"), psym->st_name);
15315 }
861fb55a
DJ
15316 printf ("\n");
15317 }
15318 printf ("\n");
15319
15320 if (data)
15321 free (data);
15322 free (rels);
15323 }
15324
252b5132
RH
15325 return 1;
15326}
15327
35c08157
KLC
15328static int
15329process_nds32_specific (FILE * file)
15330{
15331 Elf_Internal_Shdr *sect = NULL;
15332
15333 sect = find_section (".nds32_e_flags");
15334 if (sect != NULL)
15335 {
15336 unsigned int *flag;
15337
15338 printf ("\nNDS32 elf flags section:\n");
15339 flag = get_data (NULL, file, sect->sh_offset, 1,
15340 sect->sh_size, _("NDS32 elf flags section"));
15341
15342 switch ((*flag) & 0x3)
15343 {
15344 case 0:
15345 printf ("(VEC_SIZE):\tNo entry.\n");
15346 break;
15347 case 1:
15348 printf ("(VEC_SIZE):\t4 bytes\n");
15349 break;
15350 case 2:
15351 printf ("(VEC_SIZE):\t16 bytes\n");
15352 break;
15353 case 3:
15354 printf ("(VEC_SIZE):\treserved\n");
15355 break;
15356 }
15357 }
15358
15359 return TRUE;
15360}
15361
047b2264 15362static int
2cf0635d 15363process_gnu_liblist (FILE * file)
047b2264 15364{
2cf0635d
NC
15365 Elf_Internal_Shdr * section;
15366 Elf_Internal_Shdr * string_sec;
15367 Elf32_External_Lib * elib;
15368 char * strtab;
c256ffe7 15369 size_t strtab_size;
047b2264
JJ
15370 size_t cnt;
15371 unsigned i;
15372
15373 if (! do_arch)
15374 return 0;
15375
15376 for (i = 0, section = section_headers;
15377 i < elf_header.e_shnum;
b34976b6 15378 i++, section++)
047b2264
JJ
15379 {
15380 switch (section->sh_type)
15381 {
15382 case SHT_GNU_LIBLIST:
4fbb74a6 15383 if (section->sh_link >= elf_header.e_shnum)
c256ffe7
JJ
15384 break;
15385
3f5e193b
NC
15386 elib = (Elf32_External_Lib *)
15387 get_data (NULL, file, section->sh_offset, 1, section->sh_size,
9cf03b7e 15388 _("liblist section data"));
047b2264
JJ
15389
15390 if (elib == NULL)
15391 break;
4fbb74a6 15392 string_sec = section_headers + section->sh_link;
047b2264 15393
3f5e193b
NC
15394 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
15395 string_sec->sh_size,
15396 _("liblist string table"));
047b2264
JJ
15397 if (strtab == NULL
15398 || section->sh_entsize != sizeof (Elf32_External_Lib))
15399 {
15400 free (elib);
2842702f 15401 free (strtab);
047b2264
JJ
15402 break;
15403 }
59245841 15404 strtab_size = string_sec->sh_size;
047b2264
JJ
15405
15406 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
74e1a04b 15407 printable_section_name (section),
0af1713e 15408 (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
047b2264 15409
2b692964 15410 puts (_(" Library Time Stamp Checksum Version Flags"));
047b2264
JJ
15411
15412 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
15413 ++cnt)
15414 {
15415 Elf32_Lib liblist;
91d6fa6a 15416 time_t atime;
d5b07ef4 15417 char timebuf[128];
2cf0635d 15418 struct tm * tmp;
047b2264
JJ
15419
15420 liblist.l_name = BYTE_GET (elib[cnt].l_name);
91d6fa6a 15421 atime = BYTE_GET (elib[cnt].l_time_stamp);
047b2264
JJ
15422 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
15423 liblist.l_version = BYTE_GET (elib[cnt].l_version);
15424 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
15425
91d6fa6a 15426 tmp = gmtime (&atime);
e9e44622
JJ
15427 snprintf (timebuf, sizeof (timebuf),
15428 "%04u-%02u-%02uT%02u:%02u:%02u",
15429 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
15430 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
047b2264
JJ
15431
15432 printf ("%3lu: ", (unsigned long) cnt);
15433 if (do_wide)
c256ffe7 15434 printf ("%-20s", liblist.l_name < strtab_size
2b692964 15435 ? strtab + liblist.l_name : _("<corrupt>"));
047b2264 15436 else
c256ffe7 15437 printf ("%-20.20s", liblist.l_name < strtab_size
2b692964 15438 ? strtab + liblist.l_name : _("<corrupt>"));
047b2264
JJ
15439 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
15440 liblist.l_version, liblist.l_flags);
15441 }
15442
15443 free (elib);
2842702f 15444 free (strtab);
047b2264
JJ
15445 }
15446 }
15447
15448 return 1;
15449}
15450
9437c45b 15451static const char *
d3ba0551 15452get_note_type (unsigned e_type)
779fe533
NC
15453{
15454 static char buff[64];
103f02d3 15455
1ec5cd37
NC
15456 if (elf_header.e_type == ET_CORE)
15457 switch (e_type)
15458 {
57346661 15459 case NT_AUXV:
1ec5cd37 15460 return _("NT_AUXV (auxiliary vector)");
57346661 15461 case NT_PRSTATUS:
1ec5cd37 15462 return _("NT_PRSTATUS (prstatus structure)");
57346661 15463 case NT_FPREGSET:
1ec5cd37 15464 return _("NT_FPREGSET (floating point registers)");
57346661 15465 case NT_PRPSINFO:
1ec5cd37 15466 return _("NT_PRPSINFO (prpsinfo structure)");
57346661 15467 case NT_TASKSTRUCT:
1ec5cd37 15468 return _("NT_TASKSTRUCT (task structure)");
57346661 15469 case NT_PRXFPREG:
1ec5cd37 15470 return _("NT_PRXFPREG (user_xfpregs structure)");
e1e95dec
AM
15471 case NT_PPC_VMX:
15472 return _("NT_PPC_VMX (ppc Altivec registers)");
89eeb0bc
LM
15473 case NT_PPC_VSX:
15474 return _("NT_PPC_VSX (ppc VSX registers)");
ff826ef3
TT
15475 case NT_386_TLS:
15476 return _("NT_386_TLS (x86 TLS information)");
15477 case NT_386_IOPERM:
15478 return _("NT_386_IOPERM (x86 I/O permissions)");
4339cae0
L
15479 case NT_X86_XSTATE:
15480 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
0675e188
UW
15481 case NT_S390_HIGH_GPRS:
15482 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
d7eeb400
MS
15483 case NT_S390_TIMER:
15484 return _("NT_S390_TIMER (s390 timer register)");
15485 case NT_S390_TODCMP:
15486 return _("NT_S390_TODCMP (s390 TOD comparator register)");
15487 case NT_S390_TODPREG:
15488 return _("NT_S390_TODPREG (s390 TOD programmable register)");
15489 case NT_S390_CTRS:
15490 return _("NT_S390_CTRS (s390 control registers)");
15491 case NT_S390_PREFIX:
15492 return _("NT_S390_PREFIX (s390 prefix register)");
a367d729
AK
15493 case NT_S390_LAST_BREAK:
15494 return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
15495 case NT_S390_SYSTEM_CALL:
15496 return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
abb3f6cc
NC
15497 case NT_S390_TDB:
15498 return _("NT_S390_TDB (s390 transaction diagnostic block)");
4ef9f41a
AA
15499 case NT_S390_VXRS_LOW:
15500 return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
15501 case NT_S390_VXRS_HIGH:
15502 return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
faa9a424
UW
15503 case NT_ARM_VFP:
15504 return _("NT_ARM_VFP (arm VFP registers)");
652451f8
YZ
15505 case NT_ARM_TLS:
15506 return _("NT_ARM_TLS (AArch TLS registers)");
15507 case NT_ARM_HW_BREAK:
15508 return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
15509 case NT_ARM_HW_WATCH:
15510 return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
57346661 15511 case NT_PSTATUS:
1ec5cd37 15512 return _("NT_PSTATUS (pstatus structure)");
57346661 15513 case NT_FPREGS:
1ec5cd37 15514 return _("NT_FPREGS (floating point registers)");
57346661 15515 case NT_PSINFO:
1ec5cd37 15516 return _("NT_PSINFO (psinfo structure)");
57346661 15517 case NT_LWPSTATUS:
1ec5cd37 15518 return _("NT_LWPSTATUS (lwpstatus_t structure)");
57346661 15519 case NT_LWPSINFO:
1ec5cd37 15520 return _("NT_LWPSINFO (lwpsinfo_t structure)");
57346661 15521 case NT_WIN32PSTATUS:
1ec5cd37 15522 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
9ece1fa9
TT
15523 case NT_SIGINFO:
15524 return _("NT_SIGINFO (siginfo_t data)");
15525 case NT_FILE:
15526 return _("NT_FILE (mapped files)");
1ec5cd37
NC
15527 default:
15528 break;
15529 }
15530 else
15531 switch (e_type)
15532 {
15533 case NT_VERSION:
15534 return _("NT_VERSION (version)");
15535 case NT_ARCH:
15536 return _("NT_ARCH (architecture)");
15537 default:
15538 break;
15539 }
15540
e9e44622 15541 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
1ec5cd37 15542 return buff;
779fe533
NC
15543}
15544
9ece1fa9
TT
15545static int
15546print_core_note (Elf_Internal_Note *pnote)
15547{
15548 unsigned int addr_size = is_32bit_elf ? 4 : 8;
15549 bfd_vma count, page_size;
15550 unsigned char *descdata, *filenames, *descend;
15551
15552 if (pnote->type != NT_FILE)
15553 return 1;
15554
15555#ifndef BFD64
15556 if (!is_32bit_elf)
15557 {
15558 printf (_(" Cannot decode 64-bit note in 32-bit build\n"));
15559 /* Still "successful". */
15560 return 1;
15561 }
15562#endif
15563
15564 if (pnote->descsz < 2 * addr_size)
15565 {
15566 printf (_(" Malformed note - too short for header\n"));
15567 return 0;
15568 }
15569
15570 descdata = (unsigned char *) pnote->descdata;
15571 descend = descdata + pnote->descsz;
15572
15573 if (descdata[pnote->descsz - 1] != '\0')
15574 {
15575 printf (_(" Malformed note - does not end with \\0\n"));
15576 return 0;
15577 }
15578
15579 count = byte_get (descdata, addr_size);
15580 descdata += addr_size;
15581
15582 page_size = byte_get (descdata, addr_size);
15583 descdata += addr_size;
15584
15585 if (pnote->descsz < 2 * addr_size + count * 3 * addr_size)
15586 {
15587 printf (_(" Malformed note - too short for supplied file count\n"));
15588 return 0;
15589 }
15590
15591 printf (_(" Page size: "));
15592 print_vma (page_size, DEC);
15593 printf ("\n");
15594
15595 printf (_(" %*s%*s%*s\n"),
15596 (int) (2 + 2 * addr_size), _("Start"),
15597 (int) (4 + 2 * addr_size), _("End"),
15598 (int) (4 + 2 * addr_size), _("Page Offset"));
15599 filenames = descdata + count * 3 * addr_size;
595712bb 15600 while (count-- > 0)
9ece1fa9
TT
15601 {
15602 bfd_vma start, end, file_ofs;
15603
15604 if (filenames == descend)
15605 {
15606 printf (_(" Malformed note - filenames end too early\n"));
15607 return 0;
15608 }
15609
15610 start = byte_get (descdata, addr_size);
15611 descdata += addr_size;
15612 end = byte_get (descdata, addr_size);
15613 descdata += addr_size;
15614 file_ofs = byte_get (descdata, addr_size);
15615 descdata += addr_size;
15616
15617 printf (" ");
15618 print_vma (start, FULL_HEX);
15619 printf (" ");
15620 print_vma (end, FULL_HEX);
15621 printf (" ");
15622 print_vma (file_ofs, FULL_HEX);
15623 printf ("\n %s\n", filenames);
15624
15625 filenames += 1 + strlen ((char *) filenames);
15626 }
15627
15628 return 1;
15629}
15630
1118d252
RM
15631static const char *
15632get_gnu_elf_note_type (unsigned e_type)
15633{
1449284b 15634 /* NB/ Keep this switch statement in sync with print_gnu_note (). */
1118d252
RM
15635 switch (e_type)
15636 {
15637 case NT_GNU_ABI_TAG:
15638 return _("NT_GNU_ABI_TAG (ABI version tag)");
15639 case NT_GNU_HWCAP:
15640 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
15641 case NT_GNU_BUILD_ID:
15642 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
0297aed6
DM
15643 case NT_GNU_GOLD_VERSION:
15644 return _("NT_GNU_GOLD_VERSION (gold version)");
1118d252 15645 default:
1449284b
NC
15646 {
15647 static char buff[64];
1118d252 15648
1449284b
NC
15649 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15650 return buff;
15651 }
15652 }
1118d252
RM
15653}
15654
664f90a3
TT
15655static int
15656print_gnu_note (Elf_Internal_Note *pnote)
15657{
1449284b 15658 /* NB/ Keep this switch statement in sync with get_gnu_elf_note_type (). */
664f90a3
TT
15659 switch (pnote->type)
15660 {
15661 case NT_GNU_BUILD_ID:
15662 {
15663 unsigned long i;
15664
15665 printf (_(" Build ID: "));
15666 for (i = 0; i < pnote->descsz; ++i)
15667 printf ("%02x", pnote->descdata[i] & 0xff);
9cf03b7e 15668 printf ("\n");
664f90a3
TT
15669 }
15670 break;
15671
15672 case NT_GNU_ABI_TAG:
15673 {
15674 unsigned long os, major, minor, subminor;
15675 const char *osname;
15676
3102e897
NC
15677 /* PR 17531: file: 030-599401-0.004. */
15678 if (pnote->descsz < 16)
15679 {
15680 printf (_(" <corrupt GNU_ABI_TAG>\n"));
15681 break;
15682 }
15683
664f90a3
TT
15684 os = byte_get ((unsigned char *) pnote->descdata, 4);
15685 major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
15686 minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
15687 subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
15688
15689 switch (os)
15690 {
15691 case GNU_ABI_TAG_LINUX:
15692 osname = "Linux";
15693 break;
15694 case GNU_ABI_TAG_HURD:
15695 osname = "Hurd";
15696 break;
15697 case GNU_ABI_TAG_SOLARIS:
15698 osname = "Solaris";
15699 break;
15700 case GNU_ABI_TAG_FREEBSD:
15701 osname = "FreeBSD";
15702 break;
15703 case GNU_ABI_TAG_NETBSD:
15704 osname = "NetBSD";
15705 break;
14ae95f2
RM
15706 case GNU_ABI_TAG_SYLLABLE:
15707 osname = "Syllable";
15708 break;
15709 case GNU_ABI_TAG_NACL:
15710 osname = "NaCl";
15711 break;
664f90a3
TT
15712 default:
15713 osname = "Unknown";
15714 break;
15715 }
15716
15717 printf (_(" OS: %s, ABI: %ld.%ld.%ld\n"), osname,
15718 major, minor, subminor);
15719 }
15720 break;
926c5385
CC
15721
15722 case NT_GNU_GOLD_VERSION:
15723 {
15724 unsigned long i;
15725
15726 printf (_(" Version: "));
15727 for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
15728 printf ("%c", pnote->descdata[i]);
15729 printf ("\n");
15730 }
15731 break;
1449284b
NC
15732
15733 case NT_GNU_HWCAP:
15734 {
15735 unsigned long num_entries, mask;
15736
15737 /* Hardware capabilities information. Word 0 is the number of entries.
15738 Word 1 is a bitmask of enabled entries. The rest of the descriptor
15739 is a series of entries, where each entry is a single byte followed
15740 by a nul terminated string. The byte gives the bit number to test
15741 if enabled in the bitmask. */
15742 printf (_(" Hardware Capabilities: "));
15743 if (pnote->descsz < 8)
15744 {
15745 printf (_("<corrupt GNU_HWCAP>\n"));
15746 break;
15747 }
15748 num_entries = byte_get ((unsigned char *) pnote->descdata, 4);
15749 mask = byte_get ((unsigned char *) pnote->descdata + 4, 4);
15750 printf (_("num entries: %ld, enabled mask: %lx\n"), num_entries, mask);
15751 /* FIXME: Add code to display the entries... */
15752 }
15753 break;
15754
15755 default:
15756 /* Handle unrecognised types. An error message should have already been
15757 created by get_gnu_elf_note_type(), so all that we need to do is to
15758 display the data. */
15759 {
15760 unsigned long i;
15761
15762 printf (_(" Description data: "));
15763 for (i = 0; i < pnote->descsz; ++i)
15764 printf ("%02x ", pnote->descdata[i] & 0xff);
15765 printf ("\n");
15766 }
15767 break;
664f90a3
TT
15768 }
15769
15770 return 1;
15771}
15772
685080f2
NC
15773static const char *
15774get_v850_elf_note_type (enum v850_notes n_type)
15775{
15776 static char buff[64];
15777
15778 switch (n_type)
15779 {
15780 case V850_NOTE_ALIGNMENT: return _("Alignment of 8-byte objects");
15781 case V850_NOTE_DATA_SIZE: return _("Sizeof double and long double");
15782 case V850_NOTE_FPU_INFO: return _("Type of FPU support needed");
15783 case V850_NOTE_SIMD_INFO: return _("Use of SIMD instructions");
15784 case V850_NOTE_CACHE_INFO: return _("Use of cache");
15785 case V850_NOTE_MMU_INFO: return _("Use of MMU");
15786 default:
15787 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
15788 return buff;
15789 }
15790}
15791
15792static int
15793print_v850_note (Elf_Internal_Note * pnote)
15794{
15795 unsigned int val;
15796
15797 if (pnote->descsz != 4)
15798 return 0;
15799 val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
15800
15801 if (val == 0)
15802 {
15803 printf (_("not set\n"));
15804 return 1;
15805 }
15806
15807 switch (pnote->type)
15808 {
15809 case V850_NOTE_ALIGNMENT:
15810 switch (val)
15811 {
15812 case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return 1;
15813 case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return 1;
15814 }
15815 break;
14ae95f2 15816
685080f2
NC
15817 case V850_NOTE_DATA_SIZE:
15818 switch (val)
15819 {
15820 case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return 1;
15821 case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return 1;
15822 }
15823 break;
14ae95f2 15824
685080f2
NC
15825 case V850_NOTE_FPU_INFO:
15826 switch (val)
15827 {
15828 case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return 1;
15829 case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return 1;
15830 }
15831 break;
14ae95f2 15832
685080f2
NC
15833 case V850_NOTE_MMU_INFO:
15834 case V850_NOTE_CACHE_INFO:
15835 case V850_NOTE_SIMD_INFO:
15836 if (val == EF_RH850_SIMD)
15837 {
15838 printf (_("yes\n"));
15839 return 1;
15840 }
15841 break;
15842
15843 default:
15844 /* An 'unknown note type' message will already have been displayed. */
15845 break;
15846 }
15847
15848 printf (_("unknown value: %x\n"), val);
15849 return 0;
15850}
15851
15f205b1 15852static int
c6056a74
SF
15853process_netbsd_elf_note (Elf_Internal_Note * pnote)
15854{
15855 unsigned int version;
15856
15857 switch (pnote->type)
15858 {
15859 case NT_NETBSD_IDENT:
15860 version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
15861 if ((version / 10000) % 100)
15862 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
15863 version, version / 100000000, (version / 1000000) % 100,
15864 (version / 10000) % 100 > 26 ? "Z" : "",
15f205b1 15865 'A' + (version / 10000) % 26);
c6056a74
SF
15866 else
15867 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
15868 version, version / 100000000, (version / 1000000) % 100,
15f205b1 15869 (version / 100) % 100);
c6056a74
SF
15870 return 1;
15871
15872 case NT_NETBSD_MARCH:
15873 printf (" NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
15874 pnote->descdata);
15875 return 1;
15876
15877 default:
15878 break;
15879 }
15880
15881 printf (" NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
15882 pnote->type);
15883 return 1;
15884}
15885
f4ddf30f
JB
15886static const char *
15887get_freebsd_elfcore_note_type (unsigned e_type)
15888{
f4ddf30f
JB
15889 switch (e_type)
15890 {
15891 case NT_FREEBSD_THRMISC:
15892 return _("NT_THRMISC (thrmisc structure)");
15893 case NT_FREEBSD_PROCSTAT_PROC:
15894 return _("NT_PROCSTAT_PROC (proc data)");
15895 case NT_FREEBSD_PROCSTAT_FILES:
15896 return _("NT_PROCSTAT_FILES (files data)");
15897 case NT_FREEBSD_PROCSTAT_VMMAP:
15898 return _("NT_PROCSTAT_VMMAP (vmmap data)");
15899 case NT_FREEBSD_PROCSTAT_GROUPS:
15900 return _("NT_PROCSTAT_GROUPS (groups data)");
15901 case NT_FREEBSD_PROCSTAT_UMASK:
15902 return _("NT_PROCSTAT_UMASK (umask data)");
15903 case NT_FREEBSD_PROCSTAT_RLIMIT:
15904 return _("NT_PROCSTAT_RLIMIT (rlimit data)");
15905 case NT_FREEBSD_PROCSTAT_OSREL:
15906 return _("NT_PROCSTAT_OSREL (osreldate data)");
15907 case NT_FREEBSD_PROCSTAT_PSSTRINGS:
15908 return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
15909 case NT_FREEBSD_PROCSTAT_AUXV:
15910 return _("NT_PROCSTAT_AUXV (auxv data)");
15911 }
15912 return get_note_type (e_type);
15913}
15914
9437c45b 15915static const char *
d3ba0551 15916get_netbsd_elfcore_note_type (unsigned e_type)
9437c45b
JT
15917{
15918 static char buff[64];
15919
b4db1224 15920 if (e_type == NT_NETBSDCORE_PROCINFO)
9437c45b
JT
15921 {
15922 /* NetBSD core "procinfo" structure. */
15923 return _("NetBSD procinfo structure");
15924 }
15925
15926 /* As of Jan 2002 there are no other machine-independent notes
15927 defined for NetBSD core files. If the note type is less
15928 than the start of the machine-dependent note types, we don't
15929 understand it. */
15930
b4db1224 15931 if (e_type < NT_NETBSDCORE_FIRSTMACH)
9437c45b 15932 {
e9e44622 15933 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
9437c45b
JT
15934 return buff;
15935 }
15936
15937 switch (elf_header.e_machine)
15938 {
15939 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
15940 and PT_GETFPREGS == mach+2. */
15941
15942 case EM_OLD_ALPHA:
15943 case EM_ALPHA:
15944 case EM_SPARC:
15945 case EM_SPARC32PLUS:
15946 case EM_SPARCV9:
15947 switch (e_type)
15948 {
2b692964 15949 case NT_NETBSDCORE_FIRSTMACH + 0:
b4db1224 15950 return _("PT_GETREGS (reg structure)");
2b692964 15951 case NT_NETBSDCORE_FIRSTMACH + 2:
b4db1224 15952 return _("PT_GETFPREGS (fpreg structure)");
9437c45b
JT
15953 default:
15954 break;
15955 }
15956 break;
15957
15958 /* On all other arch's, PT_GETREGS == mach+1 and
15959 PT_GETFPREGS == mach+3. */
15960 default:
15961 switch (e_type)
15962 {
2b692964 15963 case NT_NETBSDCORE_FIRSTMACH + 1:
b4db1224 15964 return _("PT_GETREGS (reg structure)");
2b692964 15965 case NT_NETBSDCORE_FIRSTMACH + 3:
b4db1224 15966 return _("PT_GETFPREGS (fpreg structure)");
9437c45b
JT
15967 default:
15968 break;
15969 }
15970 }
15971
9cf03b7e 15972 snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
e9e44622 15973 e_type - NT_NETBSDCORE_FIRSTMACH);
9437c45b
JT
15974 return buff;
15975}
15976
70616151
TT
15977static const char *
15978get_stapsdt_note_type (unsigned e_type)
15979{
15980 static char buff[64];
15981
15982 switch (e_type)
15983 {
15984 case NT_STAPSDT:
15985 return _("NT_STAPSDT (SystemTap probe descriptors)");
15986
15987 default:
15988 break;
15989 }
15990
15991 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15992 return buff;
15993}
15994
c6a9fc58
TT
15995static int
15996print_stapsdt_note (Elf_Internal_Note *pnote)
15997{
15998 int addr_size = is_32bit_elf ? 4 : 8;
15999 char *data = pnote->descdata;
16000 char *data_end = pnote->descdata + pnote->descsz;
16001 bfd_vma pc, base_addr, semaphore;
16002 char *provider, *probe, *arg_fmt;
16003
16004 pc = byte_get ((unsigned char *) data, addr_size);
16005 data += addr_size;
16006 base_addr = byte_get ((unsigned char *) data, addr_size);
16007 data += addr_size;
16008 semaphore = byte_get ((unsigned char *) data, addr_size);
16009 data += addr_size;
16010
16011 provider = data;
16012 data += strlen (data) + 1;
16013 probe = data;
16014 data += strlen (data) + 1;
16015 arg_fmt = data;
16016 data += strlen (data) + 1;
16017
16018 printf (_(" Provider: %s\n"), provider);
16019 printf (_(" Name: %s\n"), probe);
16020 printf (_(" Location: "));
16021 print_vma (pc, FULL_HEX);
16022 printf (_(", Base: "));
16023 print_vma (base_addr, FULL_HEX);
16024 printf (_(", Semaphore: "));
16025 print_vma (semaphore, FULL_HEX);
9cf03b7e 16026 printf ("\n");
c6a9fc58
TT
16027 printf (_(" Arguments: %s\n"), arg_fmt);
16028
16029 return data == data_end;
16030}
16031
00e98fc7
TG
16032static const char *
16033get_ia64_vms_note_type (unsigned e_type)
16034{
16035 static char buff[64];
16036
16037 switch (e_type)
16038 {
16039 case NT_VMS_MHD:
16040 return _("NT_VMS_MHD (module header)");
16041 case NT_VMS_LNM:
16042 return _("NT_VMS_LNM (language name)");
16043 case NT_VMS_SRC:
16044 return _("NT_VMS_SRC (source files)");
16045 case NT_VMS_TITLE:
9cf03b7e 16046 return "NT_VMS_TITLE";
00e98fc7
TG
16047 case NT_VMS_EIDC:
16048 return _("NT_VMS_EIDC (consistency check)");
16049 case NT_VMS_FPMODE:
16050 return _("NT_VMS_FPMODE (FP mode)");
16051 case NT_VMS_LINKTIME:
9cf03b7e 16052 return "NT_VMS_LINKTIME";
00e98fc7
TG
16053 case NT_VMS_IMGNAM:
16054 return _("NT_VMS_IMGNAM (image name)");
16055 case NT_VMS_IMGID:
16056 return _("NT_VMS_IMGID (image id)");
16057 case NT_VMS_LINKID:
16058 return _("NT_VMS_LINKID (link id)");
16059 case NT_VMS_IMGBID:
16060 return _("NT_VMS_IMGBID (build id)");
16061 case NT_VMS_GSTNAM:
16062 return _("NT_VMS_GSTNAM (sym table name)");
16063 case NT_VMS_ORIG_DYN:
9cf03b7e 16064 return "NT_VMS_ORIG_DYN";
00e98fc7 16065 case NT_VMS_PATCHTIME:
9cf03b7e 16066 return "NT_VMS_PATCHTIME";
00e98fc7
TG
16067 default:
16068 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
16069 return buff;
16070 }
16071}
16072
16073static int
16074print_ia64_vms_note (Elf_Internal_Note * pnote)
16075{
16076 switch (pnote->type)
16077 {
16078 case NT_VMS_MHD:
16079 if (pnote->descsz > 36)
16080 {
16081 size_t l = strlen (pnote->descdata + 34);
16082 printf (_(" Creation date : %.17s\n"), pnote->descdata);
16083 printf (_(" Last patch date: %.17s\n"), pnote->descdata + 17);
16084 printf (_(" Module name : %s\n"), pnote->descdata + 34);
16085 printf (_(" Module version : %s\n"), pnote->descdata + 34 + l + 1);
16086 }
16087 else
16088 printf (_(" Invalid size\n"));
16089 break;
16090 case NT_VMS_LNM:
16091 printf (_(" Language: %s\n"), pnote->descdata);
16092 break;
16093#ifdef BFD64
16094 case NT_VMS_FPMODE:
9cf03b7e 16095 printf (_(" Floating Point mode: "));
4a5cb34f 16096 printf ("0x%016" BFD_VMA_FMT "x\n",
948f632f 16097 (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
00e98fc7
TG
16098 break;
16099 case NT_VMS_LINKTIME:
16100 printf (_(" Link time: "));
16101 print_vms_time
16102 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
16103 printf ("\n");
16104 break;
16105 case NT_VMS_PATCHTIME:
16106 printf (_(" Patch time: "));
16107 print_vms_time
16108 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
16109 printf ("\n");
16110 break;
16111 case NT_VMS_ORIG_DYN:
16112 printf (_(" Major id: %u, minor id: %u\n"),
16113 (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
16114 (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
9cf03b7e 16115 printf (_(" Last modified : "));
00e98fc7
TG
16116 print_vms_time
16117 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
9cf03b7e 16118 printf (_("\n Link flags : "));
4a5cb34f 16119 printf ("0x%016" BFD_VMA_FMT "x\n",
948f632f 16120 (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
00e98fc7 16121 printf (_(" Header flags: 0x%08x\n"),
948f632f 16122 (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
00e98fc7
TG
16123 printf (_(" Image id : %s\n"), pnote->descdata + 32);
16124 break;
16125#endif
16126 case NT_VMS_IMGNAM:
16127 printf (_(" Image name: %s\n"), pnote->descdata);
16128 break;
16129 case NT_VMS_GSTNAM:
16130 printf (_(" Global symbol table name: %s\n"), pnote->descdata);
16131 break;
16132 case NT_VMS_IMGID:
16133 printf (_(" Image id: %s\n"), pnote->descdata);
16134 break;
16135 case NT_VMS_LINKID:
16136 printf (_(" Linker id: %s\n"), pnote->descdata);
16137 break;
16138 default:
16139 break;
16140 }
16141 return 1;
16142}
16143
6d118b09
NC
16144/* Note that by the ELF standard, the name field is already null byte
16145 terminated, and namesz includes the terminating null byte.
16146 I.E. the value of namesz for the name "FSF" is 4.
16147
e3c8793a 16148 If the value of namesz is zero, there is no name present. */
779fe533 16149static int
1449284b
NC
16150process_note (Elf_Internal_Note * pnote,
16151 FILE * file ATTRIBUTE_UNUSED,
16152 Elf_Internal_Shdr * section ATTRIBUTE_UNUSED)
779fe533 16153{
2cf0635d
NC
16154 const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
16155 const char * nt;
9437c45b
JT
16156
16157 if (pnote->namesz == 0)
1ec5cd37
NC
16158 /* If there is no note name, then use the default set of
16159 note type strings. */
16160 nt = get_note_type (pnote->type);
16161
1118d252
RM
16162 else if (const_strneq (pnote->namedata, "GNU"))
16163 /* GNU-specific object file notes. */
16164 nt = get_gnu_elf_note_type (pnote->type);
f4ddf30f
JB
16165
16166 else if (const_strneq (pnote->namedata, "FreeBSD"))
16167 /* FreeBSD-specific core file notes. */
16168 nt = get_freebsd_elfcore_note_type (pnote->type);
1118d252 16169
0112cd26 16170 else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
1ec5cd37
NC
16171 /* NetBSD-specific core file notes. */
16172 nt = get_netbsd_elfcore_note_type (pnote->type);
16173
c6056a74
SF
16174 else if (const_strneq (pnote->namedata, "NetBSD"))
16175 /* NetBSD-specific core file notes. */
16176 return process_netbsd_elf_note (pnote);
16177
b15fa79e
AM
16178 else if (strneq (pnote->namedata, "SPU/", 4))
16179 {
16180 /* SPU-specific core file notes. */
16181 nt = pnote->namedata + 4;
16182 name = "SPU";
16183 }
16184
00e98fc7
TG
16185 else if (const_strneq (pnote->namedata, "IPF/VMS"))
16186 /* VMS/ia64-specific file notes. */
16187 nt = get_ia64_vms_note_type (pnote->type);
16188
70616151
TT
16189 else if (const_strneq (pnote->namedata, "stapsdt"))
16190 nt = get_stapsdt_note_type (pnote->type);
16191
9437c45b 16192 else
1ec5cd37
NC
16193 /* Don't recognize this note name; just use the default set of
16194 note type strings. */
00e98fc7 16195 nt = get_note_type (pnote->type);
9437c45b 16196
1449284b
NC
16197 printf (" ");
16198 print_symbol (-20, name);
16199 printf (" 0x%08lx\t%s\n", pnote->descsz, nt);
00e98fc7
TG
16200
16201 if (const_strneq (pnote->namedata, "IPF/VMS"))
16202 return print_ia64_vms_note (pnote);
664f90a3
TT
16203 else if (const_strneq (pnote->namedata, "GNU"))
16204 return print_gnu_note (pnote);
c6a9fc58
TT
16205 else if (const_strneq (pnote->namedata, "stapsdt"))
16206 return print_stapsdt_note (pnote);
9ece1fa9
TT
16207 else if (const_strneq (pnote->namedata, "CORE"))
16208 return print_core_note (pnote);
779fe533 16209
1449284b
NC
16210 else if (pnote->descsz)
16211 {
16212 unsigned long i;
16213
16214 printf (_(" description data: "));
16215 for (i = 0; i < pnote->descsz; i++)
16216 printf ("%02x ", pnote->descdata[i]);
16217 printf ("\n");
16218 }
16219
16220 return 1;
16221}
6d118b09 16222
779fe533 16223static int
1449284b
NC
16224process_notes_at (FILE * file,
16225 Elf_Internal_Shdr * section,
16226 bfd_vma offset,
16227 bfd_vma length)
779fe533 16228{
2cf0635d
NC
16229 Elf_External_Note * pnotes;
16230 Elf_External_Note * external;
c8071705 16231 char * end;
b34976b6 16232 int res = 1;
103f02d3 16233
779fe533
NC
16234 if (length <= 0)
16235 return 0;
103f02d3 16236
1449284b
NC
16237 if (section)
16238 {
16239 pnotes = (Elf_External_Note *) get_section_contents (section, file);
16240 if (pnotes)
16241 apply_relocations (file, section, (unsigned char *) pnotes, length, NULL, NULL);
16242 }
16243 else
16244 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
16245 _("notes"));
dd24e3da 16246 if (pnotes == NULL)
a6e9f9df 16247 return 0;
779fe533 16248
103f02d3 16249 external = pnotes;
103f02d3 16250
1449284b
NC
16251 if (section)
16252 printf (_("\nDisplaying notes found in: %s\n"), printable_section_name (section));
16253 else
16254 printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
16255 (unsigned long) offset, (unsigned long) length);
16256
2aee03ae 16257 printf (_(" %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
103f02d3 16258
c8071705
NC
16259 end = (char *) pnotes + length;
16260 while ((char *) external < end)
779fe533 16261 {
b34976b6 16262 Elf_Internal_Note inote;
15b42fb0
AM
16263 size_t min_notesz;
16264 char *next;
2cf0635d 16265 char * temp = NULL;
c8071705 16266 size_t data_remaining = end - (char *) external;
6d118b09 16267
00e98fc7 16268 if (!is_ia64_vms ())
15b42fb0 16269 {
9dd3a467
NC
16270 /* PR binutils/15191
16271 Make sure that there is enough data to read. */
15b42fb0
AM
16272 min_notesz = offsetof (Elf_External_Note, name);
16273 if (data_remaining < min_notesz)
9dd3a467
NC
16274 {
16275 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
16276 (int) data_remaining);
16277 break;
16278 }
15b42fb0
AM
16279 inote.type = BYTE_GET (external->type);
16280 inote.namesz = BYTE_GET (external->namesz);
16281 inote.namedata = external->name;
16282 inote.descsz = BYTE_GET (external->descsz);
16283 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
834f871c 16284 /* PR 17531: file: 3443835e. */
c8071705 16285 if (inote.descdata < (char *) pnotes || inote.descdata > end)
834f871c
NC
16286 {
16287 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
16288 inote.descdata = inote.namedata;
16289 inote.namesz = 0;
16290 }
14ae95f2 16291
15b42fb0
AM
16292 inote.descpos = offset + (inote.descdata - (char *) pnotes);
16293 next = inote.descdata + align_power (inote.descsz, 2);
16294 }
00e98fc7 16295 else
15b42fb0
AM
16296 {
16297 Elf64_External_VMS_Note *vms_external;
00e98fc7 16298
9dd3a467
NC
16299 /* PR binutils/15191
16300 Make sure that there is enough data to read. */
15b42fb0
AM
16301 min_notesz = offsetof (Elf64_External_VMS_Note, name);
16302 if (data_remaining < min_notesz)
9dd3a467
NC
16303 {
16304 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
16305 (int) data_remaining);
16306 break;
16307 }
3e55a963 16308
15b42fb0
AM
16309 vms_external = (Elf64_External_VMS_Note *) external;
16310 inote.type = BYTE_GET (vms_external->type);
16311 inote.namesz = BYTE_GET (vms_external->namesz);
16312 inote.namedata = vms_external->name;
16313 inote.descsz = BYTE_GET (vms_external->descsz);
16314 inote.descdata = inote.namedata + align_power (inote.namesz, 3);
16315 inote.descpos = offset + (inote.descdata - (char *) pnotes);
16316 next = inote.descdata + align_power (inote.descsz, 3);
16317 }
16318
16319 if (inote.descdata < (char *) external + min_notesz
16320 || next < (char *) external + min_notesz
5d921cbd
NC
16321 /* PR binutils/17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4. */
16322 || inote.namedata + inote.namesz < inote.namedata
16323 || inote.descdata + inote.descsz < inote.descdata
15b42fb0 16324 || data_remaining < (size_t)(next - (char *) external))
3e55a963 16325 {
15b42fb0 16326 warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
0af1713e 16327 (unsigned long) ((char *) external - (char *) pnotes));
9dd3a467 16328 warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
3e55a963
NC
16329 inote.type, inote.namesz, inote.descsz);
16330 break;
16331 }
16332
15b42fb0 16333 external = (Elf_External_Note *) next;
dd24e3da 16334
6d118b09
NC
16335 /* Verify that name is null terminated. It appears that at least
16336 one version of Linux (RedHat 6.0) generates corefiles that don't
16337 comply with the ELF spec by failing to include the null byte in
16338 namesz. */
8b971f9f 16339 if (inote.namedata[inote.namesz - 1] != '\0')
6d118b09 16340 {
3f5e193b 16341 temp = (char *) malloc (inote.namesz + 1);
6d118b09
NC
16342 if (temp == NULL)
16343 {
8b73c356 16344 error (_("Out of memory allocating space for inote name\n"));
6d118b09
NC
16345 res = 0;
16346 break;
16347 }
76da6bbe 16348
6d118b09
NC
16349 strncpy (temp, inote.namedata, inote.namesz);
16350 temp[inote.namesz] = 0;
76da6bbe 16351
6d118b09
NC
16352 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
16353 inote.namedata = temp;
16354 }
16355
1449284b 16356 res &= process_note (& inote, file, section);
103f02d3 16357
6d118b09
NC
16358 if (temp != NULL)
16359 {
16360 free (temp);
16361 temp = NULL;
16362 }
779fe533
NC
16363 }
16364
16365 free (pnotes);
103f02d3 16366
779fe533
NC
16367 return res;
16368}
16369
16370static int
2cf0635d 16371process_corefile_note_segments (FILE * file)
779fe533 16372{
2cf0635d 16373 Elf_Internal_Phdr * segment;
b34976b6
AM
16374 unsigned int i;
16375 int res = 1;
103f02d3 16376
d93f0186 16377 if (! get_program_headers (file))
779fe533 16378 return 0;
103f02d3 16379
779fe533
NC
16380 for (i = 0, segment = program_headers;
16381 i < elf_header.e_phnum;
b34976b6 16382 i++, segment++)
779fe533
NC
16383 {
16384 if (segment->p_type == PT_NOTE)
1449284b
NC
16385 res &= process_notes_at (file, NULL,
16386 (bfd_vma) segment->p_offset,
16387 (bfd_vma) segment->p_filesz);
779fe533 16388 }
103f02d3 16389
779fe533
NC
16390 return res;
16391}
16392
685080f2
NC
16393static int
16394process_v850_notes (FILE * file, bfd_vma offset, bfd_vma length)
16395{
16396 Elf_External_Note * pnotes;
16397 Elf_External_Note * external;
c8071705 16398 char * end;
685080f2
NC
16399 int res = 1;
16400
16401 if (length <= 0)
16402 return 0;
16403
16404 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
16405 _("v850 notes"));
16406 if (pnotes == NULL)
16407 return 0;
16408
16409 external = pnotes;
c8071705 16410 end = (char*) pnotes + length;
685080f2
NC
16411
16412 printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
16413 (unsigned long) offset, (unsigned long) length);
16414
c8071705 16415 while ((char *) external + sizeof (Elf_External_Note) < end)
685080f2
NC
16416 {
16417 Elf_External_Note * next;
16418 Elf_Internal_Note inote;
16419
16420 inote.type = BYTE_GET (external->type);
16421 inote.namesz = BYTE_GET (external->namesz);
16422 inote.namedata = external->name;
16423 inote.descsz = BYTE_GET (external->descsz);
16424 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
16425 inote.descpos = offset + (inote.descdata - (char *) pnotes);
16426
c8071705
NC
16427 if (inote.descdata < (char *) pnotes || inote.descdata >= end)
16428 {
16429 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
16430 inote.descdata = inote.namedata;
16431 inote.namesz = 0;
16432 }
16433
685080f2
NC
16434 next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
16435
c8071705 16436 if ( ((char *) next > end)
685080f2
NC
16437 || ((char *) next < (char *) pnotes))
16438 {
16439 warn (_("corrupt descsz found in note at offset 0x%lx\n"),
16440 (unsigned long) ((char *) external - (char *) pnotes));
16441 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
16442 inote.type, inote.namesz, inote.descsz);
16443 break;
16444 }
16445
16446 external = next;
16447
16448 /* Prevent out-of-bounds indexing. */
c8071705 16449 if ( inote.namedata + inote.namesz > end
685080f2
NC
16450 || inote.namedata + inote.namesz < inote.namedata)
16451 {
16452 warn (_("corrupt namesz found in note at offset 0x%lx\n"),
16453 (unsigned long) ((char *) external - (char *) pnotes));
16454 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
16455 inote.type, inote.namesz, inote.descsz);
16456 break;
16457 }
16458
16459 printf (" %s: ", get_v850_elf_note_type (inote.type));
16460
16461 if (! print_v850_note (& inote))
16462 {
16463 res = 0;
16464 printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
16465 inote.namesz, inote.descsz);
16466 }
16467 }
16468
16469 free (pnotes);
16470
16471 return res;
16472}
16473
779fe533 16474static int
2cf0635d 16475process_note_sections (FILE * file)
1ec5cd37 16476{
2cf0635d 16477 Elf_Internal_Shdr * section;
1ec5cd37 16478 unsigned long i;
df565f32 16479 int n = 0;
1ec5cd37
NC
16480 int res = 1;
16481
16482 for (i = 0, section = section_headers;
fa1908fd 16483 i < elf_header.e_shnum && section != NULL;
1ec5cd37 16484 i++, section++)
685080f2
NC
16485 {
16486 if (section->sh_type == SHT_NOTE)
16487 {
1449284b
NC
16488 res &= process_notes_at (file, section,
16489 (bfd_vma) section->sh_offset,
16490 (bfd_vma) section->sh_size);
685080f2
NC
16491 n++;
16492 }
16493
16494 if (( elf_header.e_machine == EM_V800
16495 || elf_header.e_machine == EM_V850
16496 || elf_header.e_machine == EM_CYGNUS_V850)
16497 && section->sh_type == SHT_RENESAS_INFO)
16498 {
16499 res &= process_v850_notes (file,
16500 (bfd_vma) section->sh_offset,
16501 (bfd_vma) section->sh_size);
16502 n++;
16503 }
16504 }
df565f32
NC
16505
16506 if (n == 0)
16507 /* Try processing NOTE segments instead. */
16508 return process_corefile_note_segments (file);
1ec5cd37
NC
16509
16510 return res;
16511}
16512
16513static int
2cf0635d 16514process_notes (FILE * file)
779fe533
NC
16515{
16516 /* If we have not been asked to display the notes then do nothing. */
16517 if (! do_notes)
16518 return 1;
103f02d3 16519
779fe533 16520 if (elf_header.e_type != ET_CORE)
1ec5cd37 16521 return process_note_sections (file);
103f02d3 16522
779fe533 16523 /* No program headers means no NOTE segment. */
1ec5cd37
NC
16524 if (elf_header.e_phnum > 0)
16525 return process_corefile_note_segments (file);
779fe533 16526
1ec5cd37
NC
16527 printf (_("No note segments present in the core file.\n"));
16528 return 1;
779fe533
NC
16529}
16530
252b5132 16531static int
2cf0635d 16532process_arch_specific (FILE * file)
252b5132 16533{
a952a375
NC
16534 if (! do_arch)
16535 return 1;
16536
252b5132
RH
16537 switch (elf_header.e_machine)
16538 {
11c1ff18
PB
16539 case EM_ARM:
16540 return process_arm_specific (file);
252b5132 16541 case EM_MIPS:
4fe85591 16542 case EM_MIPS_RS3_LE:
252b5132
RH
16543 return process_mips_specific (file);
16544 break;
35c08157
KLC
16545 case EM_NDS32:
16546 return process_nds32_specific (file);
16547 break;
34c8bcba 16548 case EM_PPC:
b82317dd 16549 case EM_PPC64:
34c8bcba
JM
16550 return process_power_specific (file);
16551 break;
643f7afb
AK
16552 case EM_S390:
16553 case EM_S390_OLD:
16554 return process_s390_specific (file);
16555 break;
9e8c70f9
DM
16556 case EM_SPARC:
16557 case EM_SPARC32PLUS:
16558 case EM_SPARCV9:
16559 return process_sparc_specific (file);
16560 break;
59e6276b
JM
16561 case EM_TI_C6000:
16562 return process_tic6x_specific (file);
16563 break;
13761a11
NC
16564 case EM_MSP430:
16565 return process_msp430x_specific (file);
252b5132
RH
16566 default:
16567 break;
16568 }
16569 return 1;
16570}
16571
16572static int
2cf0635d 16573get_file_header (FILE * file)
252b5132 16574{
9ea033b2
NC
16575 /* Read in the identity array. */
16576 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
252b5132
RH
16577 return 0;
16578
9ea033b2 16579 /* Determine how to read the rest of the header. */
b34976b6 16580 switch (elf_header.e_ident[EI_DATA])
9ea033b2 16581 {
1a0670f3
AM
16582 default:
16583 case ELFDATANONE:
adab8cdc
AO
16584 case ELFDATA2LSB:
16585 byte_get = byte_get_little_endian;
16586 byte_put = byte_put_little_endian;
16587 break;
16588 case ELFDATA2MSB:
16589 byte_get = byte_get_big_endian;
16590 byte_put = byte_put_big_endian;
16591 break;
9ea033b2
NC
16592 }
16593
16594 /* For now we only support 32 bit and 64 bit ELF files. */
b34976b6 16595 is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
9ea033b2
NC
16596
16597 /* Read in the rest of the header. */
16598 if (is_32bit_elf)
16599 {
16600 Elf32_External_Ehdr ehdr32;
252b5132 16601
9ea033b2
NC
16602 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
16603 return 0;
103f02d3 16604
9ea033b2
NC
16605 elf_header.e_type = BYTE_GET (ehdr32.e_type);
16606 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
16607 elf_header.e_version = BYTE_GET (ehdr32.e_version);
16608 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
16609 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
16610 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
16611 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
16612 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
16613 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
16614 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
16615 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
16616 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
16617 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
16618 }
252b5132 16619 else
9ea033b2
NC
16620 {
16621 Elf64_External_Ehdr ehdr64;
a952a375
NC
16622
16623 /* If we have been compiled with sizeof (bfd_vma) == 4, then
16624 we will not be able to cope with the 64bit data found in
16625 64 ELF files. Detect this now and abort before we start
50c2245b 16626 overwriting things. */
a952a375
NC
16627 if (sizeof (bfd_vma) < 8)
16628 {
e3c8793a
NC
16629 error (_("This instance of readelf has been built without support for a\n\
1663064 bit data type and so it cannot read 64 bit ELF files.\n"));
a952a375
NC
16631 return 0;
16632 }
103f02d3 16633
9ea033b2
NC
16634 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
16635 return 0;
103f02d3 16636
9ea033b2
NC
16637 elf_header.e_type = BYTE_GET (ehdr64.e_type);
16638 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
16639 elf_header.e_version = BYTE_GET (ehdr64.e_version);
66543521
AM
16640 elf_header.e_entry = BYTE_GET (ehdr64.e_entry);
16641 elf_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
16642 elf_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
9ea033b2
NC
16643 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
16644 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
16645 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
16646 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
16647 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
16648 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
16649 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
16650 }
252b5132 16651
7ece0d85
JJ
16652 if (elf_header.e_shoff)
16653 {
16654 /* There may be some extensions in the first section header. Don't
16655 bomb if we can't read it. */
16656 if (is_32bit_elf)
049b0c3a 16657 get_32bit_section_headers (file, TRUE);
7ece0d85 16658 else
049b0c3a 16659 get_64bit_section_headers (file, TRUE);
7ece0d85 16660 }
560f3c1c 16661
252b5132
RH
16662 return 1;
16663}
16664
fb52b2f4
NC
16665/* Process one ELF object file according to the command line options.
16666 This file may actually be stored in an archive. The file is
16667 positioned at the start of the ELF object. */
16668
ff78d6d6 16669static int
2cf0635d 16670process_object (char * file_name, FILE * file)
252b5132 16671{
252b5132
RH
16672 unsigned int i;
16673
252b5132
RH
16674 if (! get_file_header (file))
16675 {
16676 error (_("%s: Failed to read file header\n"), file_name);
ff78d6d6 16677 return 1;
252b5132
RH
16678 }
16679
16680 /* Initialise per file variables. */
60bca95a 16681 for (i = ARRAY_SIZE (version_info); i--;)
252b5132
RH
16682 version_info[i] = 0;
16683
60bca95a 16684 for (i = ARRAY_SIZE (dynamic_info); i--;)
252b5132 16685 dynamic_info[i] = 0;
5115b233 16686 dynamic_info_DT_GNU_HASH = 0;
252b5132
RH
16687
16688 /* Process the file. */
16689 if (show_name)
16690 printf (_("\nFile: %s\n"), file_name);
16691
18bd398b
NC
16692 /* Initialise the dump_sects array from the cmdline_dump_sects array.
16693 Note we do this even if cmdline_dump_sects is empty because we
16694 must make sure that the dump_sets array is zeroed out before each
16695 object file is processed. */
16696 if (num_dump_sects > num_cmdline_dump_sects)
09c11c86 16697 memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
18bd398b
NC
16698
16699 if (num_cmdline_dump_sects > 0)
16700 {
16701 if (num_dump_sects == 0)
16702 /* A sneaky way of allocating the dump_sects array. */
09c11c86 16703 request_dump_bynumber (num_cmdline_dump_sects, 0);
18bd398b
NC
16704
16705 assert (num_dump_sects >= num_cmdline_dump_sects);
09c11c86
NC
16706 memcpy (dump_sects, cmdline_dump_sects,
16707 num_cmdline_dump_sects * sizeof (* dump_sects));
18bd398b 16708 }
d70c5fc7 16709
252b5132 16710 if (! process_file_header ())
fb52b2f4 16711 return 1;
252b5132 16712
d1f5c6e3 16713 if (! process_section_headers (file))
2f62977e 16714 {
d1f5c6e3
L
16715 /* Without loaded section headers we cannot process lots of
16716 things. */
2f62977e 16717 do_unwind = do_version = do_dump = do_arch = 0;
252b5132 16718
2f62977e 16719 if (! do_using_dynamic)
2c610e4b 16720 do_syms = do_dyn_syms = do_reloc = 0;
2f62977e 16721 }
252b5132 16722
d1f5c6e3
L
16723 if (! process_section_groups (file))
16724 {
16725 /* Without loaded section groups we cannot process unwind. */
16726 do_unwind = 0;
16727 }
16728
2f62977e 16729 if (process_program_headers (file))
b2d38a17 16730 process_dynamic_section (file);
252b5132
RH
16731
16732 process_relocs (file);
16733
4d6ed7c8
NC
16734 process_unwind (file);
16735
252b5132
RH
16736 process_symbol_table (file);
16737
16738 process_syminfo (file);
16739
16740 process_version_sections (file);
16741
16742 process_section_contents (file);
f5842774 16743
1ec5cd37 16744 process_notes (file);
103f02d3 16745
047b2264
JJ
16746 process_gnu_liblist (file);
16747
252b5132
RH
16748 process_arch_specific (file);
16749
d93f0186
NC
16750 if (program_headers)
16751 {
16752 free (program_headers);
16753 program_headers = NULL;
16754 }
16755
252b5132
RH
16756 if (section_headers)
16757 {
16758 free (section_headers);
16759 section_headers = NULL;
16760 }
16761
16762 if (string_table)
16763 {
16764 free (string_table);
16765 string_table = NULL;
d40ac9bd 16766 string_table_length = 0;
252b5132
RH
16767 }
16768
16769 if (dynamic_strings)
16770 {
16771 free (dynamic_strings);
16772 dynamic_strings = NULL;
d79b3d50 16773 dynamic_strings_length = 0;
252b5132
RH
16774 }
16775
16776 if (dynamic_symbols)
16777 {
16778 free (dynamic_symbols);
16779 dynamic_symbols = NULL;
19936277 16780 num_dynamic_syms = 0;
252b5132
RH
16781 }
16782
16783 if (dynamic_syminfo)
16784 {
16785 free (dynamic_syminfo);
16786 dynamic_syminfo = NULL;
16787 }
ff78d6d6 16788
293c573e
MR
16789 if (dynamic_section)
16790 {
16791 free (dynamic_section);
16792 dynamic_section = NULL;
16793 }
16794
e4b17d5c
L
16795 if (section_headers_groups)
16796 {
16797 free (section_headers_groups);
16798 section_headers_groups = NULL;
16799 }
16800
16801 if (section_groups)
16802 {
2cf0635d
NC
16803 struct group_list * g;
16804 struct group_list * next;
e4b17d5c
L
16805
16806 for (i = 0; i < group_count; i++)
16807 {
16808 for (g = section_groups [i].root; g != NULL; g = next)
16809 {
16810 next = g->next;
16811 free (g);
16812 }
16813 }
16814
16815 free (section_groups);
16816 section_groups = NULL;
16817 }
16818
19e6b90e 16819 free_debug_memory ();
18bd398b 16820
ff78d6d6 16821 return 0;
252b5132
RH
16822}
16823
2cf0635d
NC
16824/* Process an ELF archive.
16825 On entry the file is positioned just after the ARMAG string. */
16826
16827static int
16828process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
16829{
16830 struct archive_info arch;
16831 struct archive_info nested_arch;
16832 size_t got;
2cf0635d
NC
16833 int ret;
16834
16835 show_name = 1;
16836
16837 /* The ARCH structure is used to hold information about this archive. */
16838 arch.file_name = NULL;
16839 arch.file = NULL;
16840 arch.index_array = NULL;
16841 arch.sym_table = NULL;
16842 arch.longnames = NULL;
16843
16844 /* The NESTED_ARCH structure is used as a single-item cache of information
16845 about a nested archive (when members of a thin archive reside within
16846 another regular archive file). */
16847 nested_arch.file_name = NULL;
16848 nested_arch.file = NULL;
16849 nested_arch.index_array = NULL;
16850 nested_arch.sym_table = NULL;
16851 nested_arch.longnames = NULL;
16852
16853 if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
16854 {
16855 ret = 1;
16856 goto out;
4145f1d5 16857 }
fb52b2f4 16858
4145f1d5
NC
16859 if (do_archive_index)
16860 {
2cf0635d 16861 if (arch.sym_table == NULL)
4145f1d5
NC
16862 error (_("%s: unable to dump the index as none was found\n"), file_name);
16863 else
16864 {
591f7597 16865 unsigned long i, l;
4145f1d5
NC
16866 unsigned long current_pos;
16867
591f7597
NC
16868 printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
16869 file_name, (unsigned long) arch.index_num, arch.sym_size);
4145f1d5
NC
16870 current_pos = ftell (file);
16871
2cf0635d 16872 for (i = l = 0; i < arch.index_num; i++)
4145f1d5 16873 {
2cf0635d
NC
16874 if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
16875 {
16876 char * member_name;
4145f1d5 16877
2cf0635d
NC
16878 member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
16879
16880 if (member_name != NULL)
16881 {
16882 char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
16883
16884 if (qualified_name != NULL)
16885 {
c2a7d3f5
NC
16886 printf (_("Contents of binary %s at offset "), qualified_name);
16887 (void) print_vma (arch.index_array[i], PREFIX_HEX);
16888 putchar ('\n');
2cf0635d
NC
16889 free (qualified_name);
16890 }
4145f1d5
NC
16891 }
16892 }
2cf0635d
NC
16893
16894 if (l >= arch.sym_size)
4145f1d5
NC
16895 {
16896 error (_("%s: end of the symbol table reached before the end of the index\n"),
16897 file_name);
cb8f3167 16898 break;
4145f1d5 16899 }
591f7597
NC
16900 /* PR 17531: file: 0b6630b2. */
16901 printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
16902 l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
4145f1d5
NC
16903 }
16904
c2a7d3f5
NC
16905 if (arch.uses_64bit_indicies)
16906 l = (l + 7) & ~ 7;
16907 else
16908 l += l & 1;
16909
2cf0635d 16910 if (l < arch.sym_size)
c2a7d3f5
NC
16911 error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
16912 file_name, arch.sym_size - l);
4145f1d5 16913
4145f1d5
NC
16914 if (fseek (file, current_pos, SEEK_SET) != 0)
16915 {
16916 error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
2cf0635d
NC
16917 ret = 1;
16918 goto out;
4145f1d5 16919 }
fb52b2f4 16920 }
4145f1d5
NC
16921
16922 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
16923 && !do_segments && !do_header && !do_dump && !do_version
16924 && !do_histogram && !do_debugging && !do_arch && !do_notes
2c610e4b 16925 && !do_section_groups && !do_dyn_syms)
2cf0635d
NC
16926 {
16927 ret = 0; /* Archive index only. */
16928 goto out;
16929 }
fb52b2f4
NC
16930 }
16931
d989285c 16932 ret = 0;
fb52b2f4
NC
16933
16934 while (1)
16935 {
2cf0635d
NC
16936 char * name;
16937 size_t namelen;
16938 char * qualified_name;
16939
16940 /* Read the next archive header. */
16941 if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
16942 {
16943 error (_("%s: failed to seek to next archive header\n"), file_name);
16944 return 1;
16945 }
16946 got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
16947 if (got != sizeof arch.arhdr)
16948 {
16949 if (got == 0)
16950 break;
16951 error (_("%s: failed to read archive header\n"), file_name);
16952 ret = 1;
16953 break;
16954 }
16955 if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
16956 {
16957 error (_("%s: did not find a valid archive header\n"), arch.file_name);
16958 ret = 1;
16959 break;
16960 }
16961
16962 arch.next_arhdr_offset += sizeof arch.arhdr;
16963
16964 archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
16965 if (archive_file_size & 01)
16966 ++archive_file_size;
16967
16968 name = get_archive_member_name (&arch, &nested_arch);
16969 if (name == NULL)
fb52b2f4 16970 {
0fd3a477 16971 error (_("%s: bad archive file name\n"), file_name);
d989285c
ILT
16972 ret = 1;
16973 break;
fb52b2f4 16974 }
2cf0635d 16975 namelen = strlen (name);
fb52b2f4 16976
2cf0635d
NC
16977 qualified_name = make_qualified_name (&arch, &nested_arch, name);
16978 if (qualified_name == NULL)
fb52b2f4 16979 {
2cf0635d 16980 error (_("%s: bad archive file name\n"), file_name);
d989285c
ILT
16981 ret = 1;
16982 break;
fb52b2f4
NC
16983 }
16984
2cf0635d
NC
16985 if (is_thin_archive && arch.nested_member_origin == 0)
16986 {
16987 /* This is a proxy for an external member of a thin archive. */
16988 FILE * member_file;
16989 char * member_file_name = adjust_relative_path (file_name, name, namelen);
16990 if (member_file_name == NULL)
16991 {
16992 ret = 1;
16993 break;
16994 }
16995
16996 member_file = fopen (member_file_name, "rb");
16997 if (member_file == NULL)
16998 {
16999 error (_("Input file '%s' is not readable.\n"), member_file_name);
17000 free (member_file_name);
17001 ret = 1;
17002 break;
17003 }
17004
17005 archive_file_offset = arch.nested_member_origin;
17006
17007 ret |= process_object (qualified_name, member_file);
17008
17009 fclose (member_file);
17010 free (member_file_name);
17011 }
17012 else if (is_thin_archive)
17013 {
a043396b
NC
17014 /* PR 15140: Allow for corrupt thin archives. */
17015 if (nested_arch.file == NULL)
17016 {
17017 error (_("%s: contains corrupt thin archive: %s\n"),
17018 file_name, name);
17019 ret = 1;
17020 break;
17021 }
17022
2cf0635d
NC
17023 /* This is a proxy for a member of a nested archive. */
17024 archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
17025
17026 /* The nested archive file will have been opened and setup by
17027 get_archive_member_name. */
17028 if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
17029 {
17030 error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
17031 ret = 1;
17032 break;
17033 }
17034
17035 ret |= process_object (qualified_name, nested_arch.file);
17036 }
17037 else
17038 {
17039 archive_file_offset = arch.next_arhdr_offset;
17040 arch.next_arhdr_offset += archive_file_size;
fb52b2f4 17041
2cf0635d
NC
17042 ret |= process_object (qualified_name, file);
17043 }
fb52b2f4 17044
2b52916e
L
17045 if (dump_sects != NULL)
17046 {
17047 free (dump_sects);
17048 dump_sects = NULL;
17049 num_dump_sects = 0;
17050 }
17051
2cf0635d 17052 free (qualified_name);
fb52b2f4
NC
17053 }
17054
4145f1d5 17055 out:
2cf0635d
NC
17056 if (nested_arch.file != NULL)
17057 fclose (nested_arch.file);
17058 release_archive (&nested_arch);
17059 release_archive (&arch);
fb52b2f4 17060
d989285c 17061 return ret;
fb52b2f4
NC
17062}
17063
17064static int
2cf0635d 17065process_file (char * file_name)
fb52b2f4 17066{
2cf0635d 17067 FILE * file;
fb52b2f4
NC
17068 struct stat statbuf;
17069 char armag[SARMAG];
17070 int ret;
17071
17072 if (stat (file_name, &statbuf) < 0)
17073 {
f24ddbdd
NC
17074 if (errno == ENOENT)
17075 error (_("'%s': No such file\n"), file_name);
17076 else
17077 error (_("Could not locate '%s'. System error message: %s\n"),
17078 file_name, strerror (errno));
17079 return 1;
17080 }
17081
17082 if (! S_ISREG (statbuf.st_mode))
17083 {
17084 error (_("'%s' is not an ordinary file\n"), file_name);
fb52b2f4
NC
17085 return 1;
17086 }
17087
17088 file = fopen (file_name, "rb");
17089 if (file == NULL)
17090 {
f24ddbdd 17091 error (_("Input file '%s' is not readable.\n"), file_name);
fb52b2f4
NC
17092 return 1;
17093 }
17094
17095 if (fread (armag, SARMAG, 1, file) != 1)
17096 {
4145f1d5 17097 error (_("%s: Failed to read file's magic number\n"), file_name);
fb52b2f4
NC
17098 fclose (file);
17099 return 1;
17100 }
17101
f54498b4
NC
17102 current_file_size = (bfd_size_type) statbuf.st_size;
17103
fb52b2f4 17104 if (memcmp (armag, ARMAG, SARMAG) == 0)
2cf0635d
NC
17105 ret = process_archive (file_name, file, FALSE);
17106 else if (memcmp (armag, ARMAGT, SARMAG) == 0)
17107 ret = process_archive (file_name, file, TRUE);
fb52b2f4
NC
17108 else
17109 {
4145f1d5
NC
17110 if (do_archive_index)
17111 error (_("File %s is not an archive so its index cannot be displayed.\n"),
17112 file_name);
17113
fb52b2f4
NC
17114 rewind (file);
17115 archive_file_size = archive_file_offset = 0;
17116 ret = process_object (file_name, file);
17117 }
17118
17119 fclose (file);
17120
f54498b4 17121 current_file_size = 0;
fb52b2f4
NC
17122 return ret;
17123}
17124
252b5132
RH
17125#ifdef SUPPORT_DISASSEMBLY
17126/* Needed by the i386 disassembler. For extra credit, someone could
9ea033b2 17127 fix this so that we insert symbolic addresses here, esp for GOT/PLT
e3c8793a 17128 symbols. */
252b5132
RH
17129
17130void
2cf0635d 17131print_address (unsigned int addr, FILE * outfile)
252b5132
RH
17132{
17133 fprintf (outfile,"0x%8.8x", addr);
17134}
17135
e3c8793a 17136/* Needed by the i386 disassembler. */
252b5132
RH
17137void
17138db_task_printsym (unsigned int addr)
17139{
17140 print_address (addr, stderr);
17141}
17142#endif
17143
17144int
2cf0635d 17145main (int argc, char ** argv)
252b5132 17146{
ff78d6d6
L
17147 int err;
17148
252b5132
RH
17149#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
17150 setlocale (LC_MESSAGES, "");
3882b010
L
17151#endif
17152#if defined (HAVE_SETLOCALE)
17153 setlocale (LC_CTYPE, "");
252b5132
RH
17154#endif
17155 bindtextdomain (PACKAGE, LOCALEDIR);
17156 textdomain (PACKAGE);
17157
869b9d07
MM
17158 expandargv (&argc, &argv);
17159
252b5132
RH
17160 parse_args (argc, argv);
17161
18bd398b 17162 if (num_dump_sects > 0)
59f14fc0 17163 {
18bd398b 17164 /* Make a copy of the dump_sects array. */
3f5e193b
NC
17165 cmdline_dump_sects = (dump_type *)
17166 malloc (num_dump_sects * sizeof (* dump_sects));
59f14fc0 17167 if (cmdline_dump_sects == NULL)
591a748a 17168 error (_("Out of memory allocating dump request table.\n"));
59f14fc0
AS
17169 else
17170 {
09c11c86
NC
17171 memcpy (cmdline_dump_sects, dump_sects,
17172 num_dump_sects * sizeof (* dump_sects));
59f14fc0
AS
17173 num_cmdline_dump_sects = num_dump_sects;
17174 }
17175 }
17176
18bd398b
NC
17177 if (optind < (argc - 1))
17178 show_name = 1;
5656ba2c
L
17179 else if (optind >= argc)
17180 {
17181 warn (_("Nothing to do.\n"));
17182 usage (stderr);
17183 }
18bd398b 17184
ff78d6d6 17185 err = 0;
252b5132 17186 while (optind < argc)
18bd398b 17187 err |= process_file (argv[optind++]);
252b5132
RH
17188
17189 if (dump_sects != NULL)
17190 free (dump_sects);
59f14fc0
AS
17191 if (cmdline_dump_sects != NULL)
17192 free (cmdline_dump_sects);
252b5132 17193
ff78d6d6 17194 return err;
252b5132 17195}