Fix invalid read of section contents whilst processing a corrupt binary.
[deliverable/binutils-gdb.git] / binutils / readelf.c
CommitLineData
252b5132 1/* readelf.c -- display contents of an ELF format file
2571583a 2 Copyright (C) 1998-2017 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"
2b100bb5 140#include "elf/pru.h"
99c513f6 141#include "elf/rl78.h"
c7927a3c 142#include "elf/rx.h"
a85d7ed0 143#include "elf/s390.h"
1c0d3aa6 144#include "elf/score.h"
3b16e843
NC
145#include "elf/sh.h"
146#include "elf/sparc.h"
e9f53129 147#include "elf/spu.h"
40b36596 148#include "elf/tic6x.h"
aa137e4d
NC
149#include "elf/tilegx.h"
150#include "elf/tilepro.h"
3b16e843 151#include "elf/v850.h"
179d3252 152#include "elf/vax.h"
619ed720 153#include "elf/visium.h"
3b16e843 154#include "elf/x86-64.h"
c29aca4a 155#include "elf/xc16x.h"
f6c1a2d5 156#include "elf/xgate.h"
93fbbb04 157#include "elf/xstormy16.h"
88da6820 158#include "elf/xtensa.h"
252b5132 159
252b5132 160#include "getopt.h"
566b0d53 161#include "libiberty.h"
09c11c86 162#include "safe-ctype.h"
2cf0635d 163#include "filenames.h"
252b5132 164
15b42fb0
AM
165#ifndef offsetof
166#define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
167#endif
168
6a40cf0c
NC
169typedef struct elf_section_list
170{
171 Elf_Internal_Shdr * hdr;
172 struct elf_section_list * next;
173} elf_section_list;
174
2cf0635d 175char * program_name = "readelf";
c9c1d674 176static unsigned long archive_file_offset;
85b1c36d 177static unsigned long archive_file_size;
f54498b4 178static bfd_size_type current_file_size;
85b1c36d
BE
179static unsigned long dynamic_addr;
180static bfd_size_type dynamic_size;
8b73c356 181static size_t dynamic_nent;
2cf0635d 182static char * dynamic_strings;
85b1c36d 183static unsigned long dynamic_strings_length;
2cf0635d 184static char * string_table;
85b1c36d
BE
185static unsigned long string_table_length;
186static unsigned long num_dynamic_syms;
2cf0635d
NC
187static Elf_Internal_Sym * dynamic_symbols;
188static Elf_Internal_Syminfo * dynamic_syminfo;
85b1c36d
BE
189static unsigned long dynamic_syminfo_offset;
190static unsigned int dynamic_syminfo_nent;
f8eae8b2 191static char program_interpreter[PATH_MAX];
bb8a0291 192static bfd_vma dynamic_info[DT_ENCODING];
fdc90cb4 193static bfd_vma dynamic_info_DT_GNU_HASH;
85b1c36d
BE
194static bfd_vma version_info[16];
195static Elf_Internal_Ehdr elf_header;
2cf0635d
NC
196static Elf_Internal_Shdr * section_headers;
197static Elf_Internal_Phdr * program_headers;
198static Elf_Internal_Dyn * dynamic_section;
6a40cf0c 199static elf_section_list * symtab_shndx_list;
85b1c36d
BE
200static int show_name;
201static int do_dynamic;
202static int do_syms;
2c610e4b 203static int do_dyn_syms;
85b1c36d
BE
204static int do_reloc;
205static int do_sections;
206static int do_section_groups;
5477e8a0 207static int do_section_details;
85b1c36d
BE
208static int do_segments;
209static int do_unwind;
210static int do_using_dynamic;
211static int do_header;
212static int do_dump;
213static int do_version;
85b1c36d
BE
214static int do_histogram;
215static int do_debugging;
85b1c36d
BE
216static int do_arch;
217static int do_notes;
4145f1d5 218static int do_archive_index;
85b1c36d 219static int is_32bit_elf;
0e602686 220static int decompress_dumps;
252b5132 221
e4b17d5c
L
222struct group_list
223{
2cf0635d 224 struct group_list * next;
e4b17d5c
L
225 unsigned int section_index;
226};
227
228struct group
229{
2cf0635d 230 struct group_list * root;
e4b17d5c
L
231 unsigned int group_index;
232};
233
85b1c36d 234static size_t group_count;
2cf0635d
NC
235static struct group * section_groups;
236static struct group ** section_headers_groups;
e4b17d5c 237
09c11c86
NC
238
239/* Flag bits indicating particular types of dump. */
240#define HEX_DUMP (1 << 0) /* The -x command line switch. */
241#define DISASS_DUMP (1 << 1) /* The -i command line switch. */
242#define DEBUG_DUMP (1 << 2) /* The -w command line switch. */
243#define STRING_DUMP (1 << 3) /* The -p command line switch. */
cf13d699 244#define RELOC_DUMP (1 << 4) /* The -R command line switch. */
09c11c86
NC
245
246typedef unsigned char dump_type;
247
248/* A linked list of the section names for which dumps were requested. */
aef1f6d0
DJ
249struct dump_list_entry
250{
2cf0635d 251 char * name;
09c11c86 252 dump_type type;
2cf0635d 253 struct dump_list_entry * next;
aef1f6d0 254};
2cf0635d 255static struct dump_list_entry * dump_sects_byname;
aef1f6d0 256
09c11c86
NC
257/* A dynamic array of flags indicating for which sections a dump
258 has been requested via command line switches. */
259static dump_type * cmdline_dump_sects = NULL;
260static unsigned int num_cmdline_dump_sects = 0;
18bd398b
NC
261
262/* A dynamic array of flags indicating for which sections a dump of
263 some kind has been requested. It is reset on a per-object file
aef1f6d0
DJ
264 basis and then initialised from the cmdline_dump_sects array,
265 the results of interpreting the -w switch, and the
266 dump_sects_byname list. */
09c11c86
NC
267static dump_type * dump_sects = NULL;
268static unsigned int num_dump_sects = 0;
252b5132 269
252b5132 270
c256ffe7 271/* How to print a vma value. */
843dd992
NC
272typedef enum print_mode
273{
274 HEX,
275 DEC,
276 DEC_5,
277 UNSIGNED,
278 PREFIX_HEX,
279 FULL_HEX,
280 LONG_HEX
281}
282print_mode;
283
bb4d2ac2
L
284/* Versioned symbol info. */
285enum versioned_symbol_info
286{
287 symbol_undefined,
288 symbol_hidden,
289 symbol_public
290};
291
15f205b1 292static const char *get_symbol_version_string
bb4d2ac2
L
293 (FILE *file, int is_dynsym, const char *strtab,
294 unsigned long int strtab_size, unsigned int si,
295 Elf_Internal_Sym *psym, enum versioned_symbol_info *sym_info,
296 unsigned short *vna_other);
297
9c19a809
NC
298#define UNKNOWN -1
299
2b692964
NC
300#define SECTION_NAME(X) \
301 ((X) == NULL ? _("<none>") \
302 : string_table == NULL ? _("<no-name>") \
303 : ((X)->sh_name >= string_table_length ? _("<corrupt>") \
0b49d371 304 : string_table + (X)->sh_name))
252b5132 305
ee42cf8c 306#define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
252b5132 307
ba5cdace
NC
308#define GET_ELF_SYMBOLS(file, section, sym_count) \
309 (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count) \
310 : get_64bit_elf_symbols (file, section, sym_count))
9ea033b2 311
d79b3d50
NC
312#define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
313/* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
314 already been called and verified that the string exists. */
315#define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
18bd398b 316
61865e30
NC
317#define REMOVE_ARCH_BITS(ADDR) \
318 do \
319 { \
320 if (elf_header.e_machine == EM_ARM) \
321 (ADDR) &= ~1; \
322 } \
323 while (0)
d79b3d50 324\f
c9c1d674
EG
325/* Retrieve NMEMB structures, each SIZE bytes long from FILE starting at OFFSET +
326 the offset of the current archive member, if we are examining an archive.
59245841
NC
327 Put the retrieved data into VAR, if it is not NULL. Otherwise allocate a buffer
328 using malloc and fill that. In either case return the pointer to the start of
329 the retrieved data or NULL if something went wrong. If something does go wrong
c9c1d674
EG
330 and REASON is not NULL then emit an error message using REASON as part of the
331 context. */
59245841 332
c256ffe7 333static void *
57028622
NC
334get_data (void * var, FILE * file, unsigned long offset, bfd_size_type size,
335 bfd_size_type nmemb, const char * reason)
a6e9f9df 336{
2cf0635d 337 void * mvar;
57028622 338 bfd_size_type amt = size * nmemb;
a6e9f9df 339
c256ffe7 340 if (size == 0 || nmemb == 0)
a6e9f9df
AM
341 return NULL;
342
57028622
NC
343 /* If the size_t type is smaller than the bfd_size_type, eg because
344 you are building a 32-bit tool on a 64-bit host, then make sure
345 that when the sizes are cast to (size_t) no information is lost. */
346 if (sizeof (size_t) < sizeof (bfd_size_type)
347 && ( (bfd_size_type) ((size_t) size) != size
348 || (bfd_size_type) ((size_t) nmemb) != nmemb))
349 {
350 if (reason)
ed754a13
AM
351 error (_("Size truncation prevents reading 0x%" BFD_VMA_FMT "x"
352 " elements of size 0x%" BFD_VMA_FMT "x for %s\n"),
353 nmemb, size, reason);
57028622
NC
354 return NULL;
355 }
356
357 /* Check for size overflow. */
358 if (amt < nmemb)
359 {
360 if (reason)
ed754a13
AM
361 error (_("Size overflow prevents reading 0x%" BFD_VMA_FMT "x"
362 " elements of size 0x%" BFD_VMA_FMT "x for %s\n"),
363 nmemb, size, reason);
57028622
NC
364 return NULL;
365 }
366
c9c1d674
EG
367 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
368 attempting to allocate memory when the read is bound to fail. */
369 if (amt > current_file_size
370 || offset + archive_file_offset + amt > current_file_size)
a6e9f9df 371 {
049b0c3a 372 if (reason)
ed754a13
AM
373 error (_("Reading 0x%" BFD_VMA_FMT "x"
374 " bytes extends past end of file for %s\n"),
375 amt, reason);
a6e9f9df
AM
376 return NULL;
377 }
378
c9c1d674 379 if (fseek (file, archive_file_offset + offset, SEEK_SET))
071436c6
NC
380 {
381 if (reason)
c9c1d674 382 error (_("Unable to seek to 0x%lx for %s\n"),
ed754a13 383 archive_file_offset + offset, reason);
071436c6
NC
384 return NULL;
385 }
386
a6e9f9df
AM
387 mvar = var;
388 if (mvar == NULL)
389 {
c256ffe7 390 /* Check for overflow. */
57028622 391 if (nmemb < (~(bfd_size_type) 0 - 1) / size)
c256ffe7 392 /* + 1 so that we can '\0' terminate invalid string table sections. */
57028622 393 mvar = malloc ((size_t) amt + 1);
a6e9f9df
AM
394
395 if (mvar == NULL)
396 {
049b0c3a 397 if (reason)
ed754a13
AM
398 error (_("Out of memory allocating 0x%" BFD_VMA_FMT "x"
399 " bytes for %s\n"),
400 amt, reason);
a6e9f9df
AM
401 return NULL;
402 }
c256ffe7 403
c9c1d674 404 ((char *) mvar)[amt] = '\0';
a6e9f9df
AM
405 }
406
57028622 407 if (fread (mvar, (size_t) size, (size_t) nmemb, file) != nmemb)
a6e9f9df 408 {
049b0c3a 409 if (reason)
ed754a13
AM
410 error (_("Unable to read in 0x%" BFD_VMA_FMT "x bytes of %s\n"),
411 amt, reason);
a6e9f9df
AM
412 if (mvar != var)
413 free (mvar);
414 return NULL;
415 }
416
417 return mvar;
418}
419
14a91970 420/* Print a VMA value. */
cb8f3167 421
66543521 422static int
14a91970 423print_vma (bfd_vma vma, print_mode mode)
66543521 424{
66543521
AM
425 int nc = 0;
426
14a91970 427 switch (mode)
66543521 428 {
14a91970
AM
429 case FULL_HEX:
430 nc = printf ("0x");
1a0670f3 431 /* Fall through. */
66543521 432
14a91970 433 case LONG_HEX:
f7a99963 434#ifdef BFD64
14a91970 435 if (is_32bit_elf)
437c2fb7 436 return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
f7a99963 437#endif
14a91970
AM
438 printf_vma (vma);
439 return nc + 16;
b19aac67 440
14a91970
AM
441 case DEC_5:
442 if (vma <= 99999)
443 return printf ("%5" BFD_VMA_FMT "d", vma);
1a0670f3 444 /* Fall through. */
66543521 445
14a91970
AM
446 case PREFIX_HEX:
447 nc = printf ("0x");
1a0670f3 448 /* Fall through. */
66543521 449
14a91970
AM
450 case HEX:
451 return nc + printf ("%" BFD_VMA_FMT "x", vma);
b19aac67 452
14a91970
AM
453 case DEC:
454 return printf ("%" BFD_VMA_FMT "d", vma);
b19aac67 455
14a91970
AM
456 case UNSIGNED:
457 return printf ("%" BFD_VMA_FMT "u", vma);
f7a99963 458 }
66543521 459 return 0;
f7a99963
NC
460}
461
7bfd842d 462/* Display a symbol on stdout. Handles the display of control characters and
3bfcb652 463 multibye characters (assuming the host environment supports them).
31104126 464
7bfd842d
NC
465 Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
466
467 If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
468 padding as necessary.
171191ba
NC
469
470 Returns the number of emitted characters. */
471
472static unsigned int
7a88bc9c 473print_symbol (int width, const char *symbol)
31104126 474{
171191ba 475 bfd_boolean extra_padding = FALSE;
7bfd842d 476 int num_printed = 0;
3bfcb652 477#ifdef HAVE_MBSTATE_T
7bfd842d 478 mbstate_t state;
3bfcb652 479#endif
7bfd842d 480 int width_remaining;
961c521f 481
7bfd842d 482 if (width < 0)
961c521f 483 {
961c521f
NC
484 /* Keep the width positive. This also helps. */
485 width = - width;
171191ba 486 extra_padding = TRUE;
0b4362b0 487 }
74e1a04b 488 assert (width != 0);
961c521f 489
7bfd842d
NC
490 if (do_wide)
491 /* Set the remaining width to a very large value.
492 This simplifies the code below. */
493 width_remaining = INT_MAX;
494 else
495 width_remaining = width;
cb8f3167 496
3bfcb652 497#ifdef HAVE_MBSTATE_T
7bfd842d
NC
498 /* Initialise the multibyte conversion state. */
499 memset (& state, 0, sizeof (state));
3bfcb652 500#endif
961c521f 501
7bfd842d
NC
502 while (width_remaining)
503 {
504 size_t n;
7bfd842d 505 const char c = *symbol++;
961c521f 506
7bfd842d 507 if (c == 0)
961c521f
NC
508 break;
509
7bfd842d
NC
510 /* Do not print control characters directly as they can affect terminal
511 settings. Such characters usually appear in the names generated
512 by the assembler for local labels. */
513 if (ISCNTRL (c))
961c521f 514 {
7bfd842d 515 if (width_remaining < 2)
961c521f
NC
516 break;
517
7bfd842d
NC
518 printf ("^%c", c + 0x40);
519 width_remaining -= 2;
171191ba 520 num_printed += 2;
961c521f 521 }
7bfd842d
NC
522 else if (ISPRINT (c))
523 {
524 putchar (c);
525 width_remaining --;
526 num_printed ++;
527 }
961c521f
NC
528 else
529 {
3bfcb652
NC
530#ifdef HAVE_MBSTATE_T
531 wchar_t w;
532#endif
7bfd842d
NC
533 /* Let printf do the hard work of displaying multibyte characters. */
534 printf ("%.1s", symbol - 1);
535 width_remaining --;
536 num_printed ++;
537
3bfcb652 538#ifdef HAVE_MBSTATE_T
7bfd842d
NC
539 /* Try to find out how many bytes made up the character that was
540 just printed. Advance the symbol pointer past the bytes that
541 were displayed. */
542 n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
3bfcb652
NC
543#else
544 n = 1;
545#endif
7bfd842d
NC
546 if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
547 symbol += (n - 1);
961c521f 548 }
961c521f 549 }
171191ba 550
7bfd842d 551 if (extra_padding && num_printed < width)
171191ba
NC
552 {
553 /* Fill in the remaining spaces. */
7bfd842d
NC
554 printf ("%-*s", width - num_printed, " ");
555 num_printed = width;
171191ba
NC
556 }
557
558 return num_printed;
31104126
NC
559}
560
1449284b 561/* Returns a pointer to a static buffer containing a printable version of
74e1a04b
NC
562 the given section's name. Like print_symbol, except that it does not try
563 to print multibyte characters, it just interprets them as hex values. */
564
565static const char *
0d2a7a93 566printable_section_name (const Elf_Internal_Shdr * sec)
74e1a04b
NC
567{
568#define MAX_PRINT_SEC_NAME_LEN 128
569 static char sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
570 const char * name = SECTION_NAME (sec);
571 char * buf = sec_name_buf;
572 char c;
573 unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
574
575 while ((c = * name ++) != 0)
576 {
577 if (ISCNTRL (c))
578 {
579 if (remaining < 2)
580 break;
948f632f 581
74e1a04b
NC
582 * buf ++ = '^';
583 * buf ++ = c + 0x40;
584 remaining -= 2;
585 }
586 else if (ISPRINT (c))
587 {
588 * buf ++ = c;
589 remaining -= 1;
590 }
591 else
592 {
593 static char hex[17] = "0123456789ABCDEF";
594
595 if (remaining < 4)
596 break;
597 * buf ++ = '<';
598 * buf ++ = hex[(c & 0xf0) >> 4];
599 * buf ++ = hex[c & 0x0f];
600 * buf ++ = '>';
601 remaining -= 4;
602 }
603
604 if (remaining == 0)
605 break;
606 }
607
608 * buf = 0;
609 return sec_name_buf;
610}
611
612static const char *
613printable_section_name_from_index (unsigned long ndx)
614{
615 if (ndx >= elf_header.e_shnum)
616 return _("<corrupt>");
617
618 return printable_section_name (section_headers + ndx);
619}
620
89fac5e3
RS
621/* Return a pointer to section NAME, or NULL if no such section exists. */
622
623static Elf_Internal_Shdr *
2cf0635d 624find_section (const char * name)
89fac5e3
RS
625{
626 unsigned int i;
627
628 for (i = 0; i < elf_header.e_shnum; i++)
629 if (streq (SECTION_NAME (section_headers + i), name))
630 return section_headers + i;
631
632 return NULL;
633}
634
0b6ae522
DJ
635/* Return a pointer to a section containing ADDR, or NULL if no such
636 section exists. */
637
638static Elf_Internal_Shdr *
639find_section_by_address (bfd_vma addr)
640{
641 unsigned int i;
642
643 for (i = 0; i < elf_header.e_shnum; i++)
644 {
645 Elf_Internal_Shdr *sec = section_headers + i;
646 if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
647 return sec;
648 }
649
650 return NULL;
651}
652
071436c6
NC
653static Elf_Internal_Shdr *
654find_section_by_type (unsigned int type)
655{
656 unsigned int i;
657
658 for (i = 0; i < elf_header.e_shnum; i++)
659 {
660 Elf_Internal_Shdr *sec = section_headers + i;
661 if (sec->sh_type == type)
662 return sec;
663 }
664
665 return NULL;
666}
667
657d0d47
CC
668/* Return a pointer to section NAME, or NULL if no such section exists,
669 restricted to the list of sections given in SET. */
670
671static Elf_Internal_Shdr *
672find_section_in_set (const char * name, unsigned int * set)
673{
674 unsigned int i;
675
676 if (set != NULL)
677 {
678 while ((i = *set++) > 0)
679 if (streq (SECTION_NAME (section_headers + i), name))
680 return section_headers + i;
681 }
682
683 return find_section (name);
684}
685
0b6ae522
DJ
686/* Read an unsigned LEB128 encoded value from p. Set *PLEN to the number of
687 bytes read. */
688
f6f0e17b
NC
689static inline unsigned long
690read_uleb128 (unsigned char *data,
691 unsigned int *length_return,
692 const unsigned char * const end)
0b6ae522 693{
f6f0e17b 694 return read_leb128 (data, length_return, FALSE, end);
0b6ae522
DJ
695}
696
28f997cf
TG
697/* Return true if the current file is for IA-64 machine and OpenVMS ABI.
698 This OS has so many departures from the ELF standard that we test it at
699 many places. */
700
701static inline int
702is_ia64_vms (void)
703{
704 return elf_header.e_machine == EM_IA_64
705 && elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
706}
707
bcedfee6 708/* Guess the relocation size commonly used by the specific machines. */
252b5132 709
252b5132 710static int
2dc4cec1 711guess_is_rela (unsigned int e_machine)
252b5132 712{
9c19a809 713 switch (e_machine)
252b5132
RH
714 {
715 /* Targets that use REL relocations. */
252b5132 716 case EM_386:
22abe556 717 case EM_IAMCU:
63fcb9e9 718 case EM_960:
e9f53129 719 case EM_ARM:
2b0337b0 720 case EM_D10V:
252b5132 721 case EM_CYGNUS_D10V:
e9f53129 722 case EM_DLX:
252b5132 723 case EM_MIPS:
4fe85591 724 case EM_MIPS_RS3_LE:
e9f53129 725 case EM_CYGNUS_M32R:
1c0d3aa6 726 case EM_SCORE:
f6c1a2d5 727 case EM_XGATE:
9c19a809 728 return FALSE;
103f02d3 729
252b5132
RH
730 /* Targets that use RELA relocations. */
731 case EM_68K:
e9f53129 732 case EM_860:
a06ea964 733 case EM_AARCH64:
cfb8c092 734 case EM_ADAPTEVA_EPIPHANY:
e9f53129
AM
735 case EM_ALPHA:
736 case EM_ALTERA_NIOS2:
886a2506
NC
737 case EM_ARC:
738 case EM_ARC_COMPACT:
739 case EM_ARC_COMPACT2:
e9f53129
AM
740 case EM_AVR:
741 case EM_AVR_OLD:
742 case EM_BLACKFIN:
60bca95a 743 case EM_CR16:
e9f53129
AM
744 case EM_CRIS:
745 case EM_CRX:
2b0337b0 746 case EM_D30V:
252b5132 747 case EM_CYGNUS_D30V:
2b0337b0 748 case EM_FR30:
3f8107ab 749 case EM_FT32:
252b5132 750 case EM_CYGNUS_FR30:
5c70f934 751 case EM_CYGNUS_FRV:
e9f53129
AM
752 case EM_H8S:
753 case EM_H8_300:
754 case EM_H8_300H:
800eeca4 755 case EM_IA_64:
1e4cf259
NC
756 case EM_IP2K:
757 case EM_IP2K_OLD:
3b36097d 758 case EM_IQ2000:
84e94c90 759 case EM_LATTICEMICO32:
ff7eeb89 760 case EM_M32C_OLD:
49f58d10 761 case EM_M32C:
e9f53129
AM
762 case EM_M32R:
763 case EM_MCORE:
15ab5209 764 case EM_CYGNUS_MEP:
a3c62988 765 case EM_METAG:
e9f53129
AM
766 case EM_MMIX:
767 case EM_MN10200:
768 case EM_CYGNUS_MN10200:
769 case EM_MN10300:
770 case EM_CYGNUS_MN10300:
5506d11a 771 case EM_MOXIE:
e9f53129
AM
772 case EM_MSP430:
773 case EM_MSP430_OLD:
d031aafb 774 case EM_MT:
35c08157 775 case EM_NDS32:
64fd6348 776 case EM_NIOS32:
73589c9d 777 case EM_OR1K:
e9f53129
AM
778 case EM_PPC64:
779 case EM_PPC:
2b100bb5 780 case EM_TI_PRU:
e23eba97 781 case EM_RISCV:
99c513f6 782 case EM_RL78:
c7927a3c 783 case EM_RX:
e9f53129
AM
784 case EM_S390:
785 case EM_S390_OLD:
786 case EM_SH:
787 case EM_SPARC:
788 case EM_SPARC32PLUS:
789 case EM_SPARCV9:
790 case EM_SPU:
40b36596 791 case EM_TI_C6000:
aa137e4d
NC
792 case EM_TILEGX:
793 case EM_TILEPRO:
708e2187 794 case EM_V800:
e9f53129
AM
795 case EM_V850:
796 case EM_CYGNUS_V850:
797 case EM_VAX:
619ed720 798 case EM_VISIUM:
e9f53129 799 case EM_X86_64:
8a9036a4 800 case EM_L1OM:
7a9068fe 801 case EM_K1OM:
e9f53129
AM
802 case EM_XSTORMY16:
803 case EM_XTENSA:
804 case EM_XTENSA_OLD:
7ba29e2a
NC
805 case EM_MICROBLAZE:
806 case EM_MICROBLAZE_OLD:
9c19a809 807 return TRUE;
103f02d3 808
e9f53129
AM
809 case EM_68HC05:
810 case EM_68HC08:
811 case EM_68HC11:
812 case EM_68HC16:
813 case EM_FX66:
814 case EM_ME16:
d1133906 815 case EM_MMA:
d1133906
NC
816 case EM_NCPU:
817 case EM_NDR1:
e9f53129 818 case EM_PCP:
d1133906 819 case EM_ST100:
e9f53129 820 case EM_ST19:
d1133906 821 case EM_ST7:
e9f53129
AM
822 case EM_ST9PLUS:
823 case EM_STARCORE:
d1133906 824 case EM_SVX:
e9f53129 825 case EM_TINYJ:
9c19a809
NC
826 default:
827 warn (_("Don't know about relocations on this machine architecture\n"));
828 return FALSE;
829 }
830}
252b5132 831
9c19a809 832static int
2cf0635d 833slurp_rela_relocs (FILE * file,
d3ba0551
AM
834 unsigned long rel_offset,
835 unsigned long rel_size,
2cf0635d
NC
836 Elf_Internal_Rela ** relasp,
837 unsigned long * nrelasp)
9c19a809 838{
2cf0635d 839 Elf_Internal_Rela * relas;
8b73c356 840 size_t nrelas;
4d6ed7c8 841 unsigned int i;
252b5132 842
4d6ed7c8
NC
843 if (is_32bit_elf)
844 {
2cf0635d 845 Elf32_External_Rela * erelas;
103f02d3 846
3f5e193b 847 erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset, 1,
9cf03b7e 848 rel_size, _("32-bit relocation data"));
a6e9f9df
AM
849 if (!erelas)
850 return 0;
252b5132 851
4d6ed7c8 852 nrelas = rel_size / sizeof (Elf32_External_Rela);
103f02d3 853
3f5e193b
NC
854 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
855 sizeof (Elf_Internal_Rela));
103f02d3 856
4d6ed7c8
NC
857 if (relas == NULL)
858 {
c256ffe7 859 free (erelas);
591a748a 860 error (_("out of memory parsing relocs\n"));
4d6ed7c8
NC
861 return 0;
862 }
103f02d3 863
4d6ed7c8
NC
864 for (i = 0; i < nrelas; i++)
865 {
866 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
867 relas[i].r_info = BYTE_GET (erelas[i].r_info);
598aaa76 868 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
4d6ed7c8 869 }
103f02d3 870
4d6ed7c8
NC
871 free (erelas);
872 }
873 else
874 {
2cf0635d 875 Elf64_External_Rela * erelas;
103f02d3 876
3f5e193b 877 erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset, 1,
9cf03b7e 878 rel_size, _("64-bit relocation data"));
a6e9f9df
AM
879 if (!erelas)
880 return 0;
4d6ed7c8
NC
881
882 nrelas = rel_size / sizeof (Elf64_External_Rela);
103f02d3 883
3f5e193b
NC
884 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
885 sizeof (Elf_Internal_Rela));
103f02d3 886
4d6ed7c8
NC
887 if (relas == NULL)
888 {
c256ffe7 889 free (erelas);
591a748a 890 error (_("out of memory parsing relocs\n"));
4d6ed7c8 891 return 0;
9c19a809 892 }
4d6ed7c8
NC
893
894 for (i = 0; i < nrelas; i++)
9c19a809 895 {
66543521
AM
896 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
897 relas[i].r_info = BYTE_GET (erelas[i].r_info);
598aaa76 898 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
861fb55a
DJ
899
900 /* The #ifdef BFD64 below is to prevent a compile time
901 warning. We know that if we do not have a 64 bit data
902 type that we will never execute this code anyway. */
903#ifdef BFD64
904 if (elf_header.e_machine == EM_MIPS
905 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
906 {
907 /* In little-endian objects, r_info isn't really a
908 64-bit little-endian value: it has a 32-bit
909 little-endian symbol index followed by four
910 individual byte fields. Reorder INFO
911 accordingly. */
91d6fa6a
NC
912 bfd_vma inf = relas[i].r_info;
913 inf = (((inf & 0xffffffff) << 32)
914 | ((inf >> 56) & 0xff)
915 | ((inf >> 40) & 0xff00)
916 | ((inf >> 24) & 0xff0000)
917 | ((inf >> 8) & 0xff000000));
918 relas[i].r_info = inf;
861fb55a
DJ
919 }
920#endif /* BFD64 */
4d6ed7c8 921 }
103f02d3 922
4d6ed7c8
NC
923 free (erelas);
924 }
925 *relasp = relas;
926 *nrelasp = nrelas;
927 return 1;
928}
103f02d3 929
4d6ed7c8 930static int
2cf0635d 931slurp_rel_relocs (FILE * file,
d3ba0551
AM
932 unsigned long rel_offset,
933 unsigned long rel_size,
2cf0635d
NC
934 Elf_Internal_Rela ** relsp,
935 unsigned long * nrelsp)
4d6ed7c8 936{
2cf0635d 937 Elf_Internal_Rela * rels;
8b73c356 938 size_t nrels;
4d6ed7c8 939 unsigned int i;
103f02d3 940
4d6ed7c8
NC
941 if (is_32bit_elf)
942 {
2cf0635d 943 Elf32_External_Rel * erels;
103f02d3 944
3f5e193b 945 erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset, 1,
9cf03b7e 946 rel_size, _("32-bit relocation data"));
a6e9f9df
AM
947 if (!erels)
948 return 0;
103f02d3 949
4d6ed7c8 950 nrels = rel_size / sizeof (Elf32_External_Rel);
103f02d3 951
3f5e193b 952 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
103f02d3 953
4d6ed7c8
NC
954 if (rels == NULL)
955 {
c256ffe7 956 free (erels);
591a748a 957 error (_("out of memory parsing relocs\n"));
4d6ed7c8
NC
958 return 0;
959 }
960
961 for (i = 0; i < nrels; i++)
962 {
963 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
964 rels[i].r_info = BYTE_GET (erels[i].r_info);
c8286bd1 965 rels[i].r_addend = 0;
9ea033b2 966 }
4d6ed7c8
NC
967
968 free (erels);
9c19a809
NC
969 }
970 else
971 {
2cf0635d 972 Elf64_External_Rel * erels;
9ea033b2 973
3f5e193b 974 erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset, 1,
9cf03b7e 975 rel_size, _("64-bit relocation data"));
a6e9f9df
AM
976 if (!erels)
977 return 0;
103f02d3 978
4d6ed7c8 979 nrels = rel_size / sizeof (Elf64_External_Rel);
103f02d3 980
3f5e193b 981 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
103f02d3 982
4d6ed7c8 983 if (rels == NULL)
9c19a809 984 {
c256ffe7 985 free (erels);
591a748a 986 error (_("out of memory parsing relocs\n"));
4d6ed7c8
NC
987 return 0;
988 }
103f02d3 989
4d6ed7c8
NC
990 for (i = 0; i < nrels; i++)
991 {
66543521
AM
992 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
993 rels[i].r_info = BYTE_GET (erels[i].r_info);
c8286bd1 994 rels[i].r_addend = 0;
861fb55a
DJ
995
996 /* The #ifdef BFD64 below is to prevent a compile time
997 warning. We know that if we do not have a 64 bit data
998 type that we will never execute this code anyway. */
999#ifdef BFD64
1000 if (elf_header.e_machine == EM_MIPS
1001 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
1002 {
1003 /* In little-endian objects, r_info isn't really a
1004 64-bit little-endian value: it has a 32-bit
1005 little-endian symbol index followed by four
1006 individual byte fields. Reorder INFO
1007 accordingly. */
91d6fa6a
NC
1008 bfd_vma inf = rels[i].r_info;
1009 inf = (((inf & 0xffffffff) << 32)
1010 | ((inf >> 56) & 0xff)
1011 | ((inf >> 40) & 0xff00)
1012 | ((inf >> 24) & 0xff0000)
1013 | ((inf >> 8) & 0xff000000));
1014 rels[i].r_info = inf;
861fb55a
DJ
1015 }
1016#endif /* BFD64 */
4d6ed7c8 1017 }
103f02d3 1018
4d6ed7c8
NC
1019 free (erels);
1020 }
1021 *relsp = rels;
1022 *nrelsp = nrels;
1023 return 1;
1024}
103f02d3 1025
aca88567
NC
1026/* Returns the reloc type extracted from the reloc info field. */
1027
1028static unsigned int
1029get_reloc_type (bfd_vma reloc_info)
1030{
1031 if (is_32bit_elf)
1032 return ELF32_R_TYPE (reloc_info);
1033
1034 switch (elf_header.e_machine)
1035 {
1036 case EM_MIPS:
1037 /* Note: We assume that reloc_info has already been adjusted for us. */
1038 return ELF64_MIPS_R_TYPE (reloc_info);
1039
1040 case EM_SPARCV9:
1041 return ELF64_R_TYPE_ID (reloc_info);
1042
1043 default:
1044 return ELF64_R_TYPE (reloc_info);
1045 }
1046}
1047
1048/* Return the symbol index extracted from the reloc info field. */
1049
1050static bfd_vma
1051get_reloc_symindex (bfd_vma reloc_info)
1052{
1053 return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
1054}
1055
13761a11
NC
1056static inline bfd_boolean
1057uses_msp430x_relocs (void)
1058{
1059 return
1060 elf_header.e_machine == EM_MSP430 /* Paranoia. */
1061 /* GCC uses osabi == ELFOSBI_STANDALONE. */
1062 && (((elf_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
1063 /* TI compiler uses ELFOSABI_NONE. */
1064 || (elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
1065}
1066
d3ba0551
AM
1067/* Display the contents of the relocation data found at the specified
1068 offset. */
ee42cf8c 1069
41e92641 1070static void
2cf0635d 1071dump_relocations (FILE * file,
d3ba0551
AM
1072 unsigned long rel_offset,
1073 unsigned long rel_size,
2cf0635d 1074 Elf_Internal_Sym * symtab,
d3ba0551 1075 unsigned long nsyms,
2cf0635d 1076 char * strtab,
d79b3d50 1077 unsigned long strtablen,
bb4d2ac2
L
1078 int is_rela,
1079 int is_dynsym)
4d6ed7c8 1080{
b34976b6 1081 unsigned int i;
2cf0635d 1082 Elf_Internal_Rela * rels;
103f02d3 1083
4d6ed7c8
NC
1084 if (is_rela == UNKNOWN)
1085 is_rela = guess_is_rela (elf_header.e_machine);
103f02d3 1086
4d6ed7c8
NC
1087 if (is_rela)
1088 {
c8286bd1 1089 if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
41e92641 1090 return;
4d6ed7c8
NC
1091 }
1092 else
1093 {
1094 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
41e92641 1095 return;
252b5132
RH
1096 }
1097
410f7a12
L
1098 if (is_32bit_elf)
1099 {
1100 if (is_rela)
2c71103e
NC
1101 {
1102 if (do_wide)
1103 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
1104 else
1105 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
1106 }
410f7a12 1107 else
2c71103e
NC
1108 {
1109 if (do_wide)
1110 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
1111 else
1112 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
1113 }
410f7a12 1114 }
252b5132 1115 else
410f7a12
L
1116 {
1117 if (is_rela)
2c71103e
NC
1118 {
1119 if (do_wide)
8beeaeb7 1120 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
2c71103e
NC
1121 else
1122 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
1123 }
410f7a12 1124 else
2c71103e
NC
1125 {
1126 if (do_wide)
8beeaeb7 1127 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
2c71103e
NC
1128 else
1129 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
1130 }
410f7a12 1131 }
252b5132
RH
1132
1133 for (i = 0; i < rel_size; i++)
1134 {
2cf0635d 1135 const char * rtype;
b34976b6 1136 bfd_vma offset;
91d6fa6a 1137 bfd_vma inf;
b34976b6
AM
1138 bfd_vma symtab_index;
1139 bfd_vma type;
103f02d3 1140
b34976b6 1141 offset = rels[i].r_offset;
91d6fa6a 1142 inf = rels[i].r_info;
103f02d3 1143
91d6fa6a
NC
1144 type = get_reloc_type (inf);
1145 symtab_index = get_reloc_symindex (inf);
252b5132 1146
410f7a12
L
1147 if (is_32bit_elf)
1148 {
39dbeff8
AM
1149 printf ("%8.8lx %8.8lx ",
1150 (unsigned long) offset & 0xffffffff,
91d6fa6a 1151 (unsigned long) inf & 0xffffffff);
410f7a12
L
1152 }
1153 else
1154 {
39dbeff8
AM
1155#if BFD_HOST_64BIT_LONG
1156 printf (do_wide
1157 ? "%16.16lx %16.16lx "
1158 : "%12.12lx %12.12lx ",
91d6fa6a 1159 offset, inf);
39dbeff8 1160#elif BFD_HOST_64BIT_LONG_LONG
6e3d6dc1 1161#ifndef __MSVCRT__
39dbeff8
AM
1162 printf (do_wide
1163 ? "%16.16llx %16.16llx "
1164 : "%12.12llx %12.12llx ",
91d6fa6a 1165 offset, inf);
6e3d6dc1
NC
1166#else
1167 printf (do_wide
1168 ? "%16.16I64x %16.16I64x "
1169 : "%12.12I64x %12.12I64x ",
91d6fa6a 1170 offset, inf);
6e3d6dc1 1171#endif
39dbeff8 1172#else
2c71103e
NC
1173 printf (do_wide
1174 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1175 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
410f7a12
L
1176 _bfd_int64_high (offset),
1177 _bfd_int64_low (offset),
91d6fa6a
NC
1178 _bfd_int64_high (inf),
1179 _bfd_int64_low (inf));
9ea033b2 1180#endif
410f7a12 1181 }
103f02d3 1182
252b5132
RH
1183 switch (elf_header.e_machine)
1184 {
1185 default:
1186 rtype = NULL;
1187 break;
1188
a06ea964
NC
1189 case EM_AARCH64:
1190 rtype = elf_aarch64_reloc_type (type);
1191 break;
1192
2b0337b0 1193 case EM_M32R:
252b5132 1194 case EM_CYGNUS_M32R:
9ea033b2 1195 rtype = elf_m32r_reloc_type (type);
252b5132
RH
1196 break;
1197
1198 case EM_386:
22abe556 1199 case EM_IAMCU:
9ea033b2 1200 rtype = elf_i386_reloc_type (type);
252b5132
RH
1201 break;
1202
ba2685cc
AM
1203 case EM_68HC11:
1204 case EM_68HC12:
1205 rtype = elf_m68hc11_reloc_type (type);
1206 break;
75751cd9 1207
252b5132 1208 case EM_68K:
9ea033b2 1209 rtype = elf_m68k_reloc_type (type);
252b5132
RH
1210 break;
1211
63fcb9e9 1212 case EM_960:
9ea033b2 1213 rtype = elf_i960_reloc_type (type);
63fcb9e9
ILT
1214 break;
1215
adde6300 1216 case EM_AVR:
2b0337b0 1217 case EM_AVR_OLD:
adde6300
AM
1218 rtype = elf_avr_reloc_type (type);
1219 break;
1220
9ea033b2
NC
1221 case EM_OLD_SPARCV9:
1222 case EM_SPARC32PLUS:
1223 case EM_SPARCV9:
252b5132 1224 case EM_SPARC:
9ea033b2 1225 rtype = elf_sparc_reloc_type (type);
252b5132
RH
1226 break;
1227
e9f53129
AM
1228 case EM_SPU:
1229 rtype = elf_spu_reloc_type (type);
1230 break;
1231
708e2187
NC
1232 case EM_V800:
1233 rtype = v800_reloc_type (type);
1234 break;
2b0337b0 1235 case EM_V850:
252b5132 1236 case EM_CYGNUS_V850:
9ea033b2 1237 rtype = v850_reloc_type (type);
252b5132
RH
1238 break;
1239
2b0337b0 1240 case EM_D10V:
252b5132 1241 case EM_CYGNUS_D10V:
9ea033b2 1242 rtype = elf_d10v_reloc_type (type);
252b5132
RH
1243 break;
1244
2b0337b0 1245 case EM_D30V:
252b5132 1246 case EM_CYGNUS_D30V:
9ea033b2 1247 rtype = elf_d30v_reloc_type (type);
252b5132
RH
1248 break;
1249
d172d4ba
NC
1250 case EM_DLX:
1251 rtype = elf_dlx_reloc_type (type);
1252 break;
1253
252b5132 1254 case EM_SH:
9ea033b2 1255 rtype = elf_sh_reloc_type (type);
252b5132
RH
1256 break;
1257
2b0337b0 1258 case EM_MN10300:
252b5132 1259 case EM_CYGNUS_MN10300:
9ea033b2 1260 rtype = elf_mn10300_reloc_type (type);
252b5132
RH
1261 break;
1262
2b0337b0 1263 case EM_MN10200:
252b5132 1264 case EM_CYGNUS_MN10200:
9ea033b2 1265 rtype = elf_mn10200_reloc_type (type);
252b5132
RH
1266 break;
1267
2b0337b0 1268 case EM_FR30:
252b5132 1269 case EM_CYGNUS_FR30:
9ea033b2 1270 rtype = elf_fr30_reloc_type (type);
252b5132
RH
1271 break;
1272
ba2685cc
AM
1273 case EM_CYGNUS_FRV:
1274 rtype = elf_frv_reloc_type (type);
1275 break;
5c70f934 1276
3f8107ab
AM
1277 case EM_FT32:
1278 rtype = elf_ft32_reloc_type (type);
1279 break;
1280
252b5132 1281 case EM_MCORE:
9ea033b2 1282 rtype = elf_mcore_reloc_type (type);
252b5132
RH
1283 break;
1284
3c3bdf30
NC
1285 case EM_MMIX:
1286 rtype = elf_mmix_reloc_type (type);
1287 break;
1288
5506d11a
AM
1289 case EM_MOXIE:
1290 rtype = elf_moxie_reloc_type (type);
1291 break;
1292
2469cfa2 1293 case EM_MSP430:
13761a11
NC
1294 if (uses_msp430x_relocs ())
1295 {
1296 rtype = elf_msp430x_reloc_type (type);
1297 break;
1298 }
1a0670f3 1299 /* Fall through. */
2469cfa2
NC
1300 case EM_MSP430_OLD:
1301 rtype = elf_msp430_reloc_type (type);
1302 break;
1303
35c08157
KLC
1304 case EM_NDS32:
1305 rtype = elf_nds32_reloc_type (type);
1306 break;
1307
252b5132 1308 case EM_PPC:
9ea033b2 1309 rtype = elf_ppc_reloc_type (type);
252b5132
RH
1310 break;
1311
c833c019
AM
1312 case EM_PPC64:
1313 rtype = elf_ppc64_reloc_type (type);
1314 break;
1315
252b5132 1316 case EM_MIPS:
4fe85591 1317 case EM_MIPS_RS3_LE:
9ea033b2 1318 rtype = elf_mips_reloc_type (type);
252b5132
RH
1319 break;
1320
e23eba97
NC
1321 case EM_RISCV:
1322 rtype = elf_riscv_reloc_type (type);
1323 break;
1324
252b5132 1325 case EM_ALPHA:
9ea033b2 1326 rtype = elf_alpha_reloc_type (type);
252b5132
RH
1327 break;
1328
1329 case EM_ARM:
9ea033b2 1330 rtype = elf_arm_reloc_type (type);
252b5132
RH
1331 break;
1332
584da044 1333 case EM_ARC:
886a2506
NC
1334 case EM_ARC_COMPACT:
1335 case EM_ARC_COMPACT2:
9ea033b2 1336 rtype = elf_arc_reloc_type (type);
252b5132
RH
1337 break;
1338
1339 case EM_PARISC:
69e617ca 1340 rtype = elf_hppa_reloc_type (type);
252b5132 1341 break;
7d466069 1342
b8720f9d
JL
1343 case EM_H8_300:
1344 case EM_H8_300H:
1345 case EM_H8S:
1346 rtype = elf_h8_reloc_type (type);
1347 break;
1348
73589c9d
CS
1349 case EM_OR1K:
1350 rtype = elf_or1k_reloc_type (type);
3b16e843
NC
1351 break;
1352
7d466069 1353 case EM_PJ:
2b0337b0 1354 case EM_PJ_OLD:
7d466069
ILT
1355 rtype = elf_pj_reloc_type (type);
1356 break;
800eeca4
JW
1357 case EM_IA_64:
1358 rtype = elf_ia64_reloc_type (type);
1359 break;
1b61cf92
HPN
1360
1361 case EM_CRIS:
1362 rtype = elf_cris_reloc_type (type);
1363 break;
535c37ff
JE
1364
1365 case EM_860:
1366 rtype = elf_i860_reloc_type (type);
1367 break;
bcedfee6
NC
1368
1369 case EM_X86_64:
8a9036a4 1370 case EM_L1OM:
7a9068fe 1371 case EM_K1OM:
bcedfee6
NC
1372 rtype = elf_x86_64_reloc_type (type);
1373 break;
a85d7ed0 1374
35b1837e
AM
1375 case EM_S370:
1376 rtype = i370_reloc_type (type);
1377 break;
1378
53c7db4b
KH
1379 case EM_S390_OLD:
1380 case EM_S390:
1381 rtype = elf_s390_reloc_type (type);
1382 break;
93fbbb04 1383
1c0d3aa6
NC
1384 case EM_SCORE:
1385 rtype = elf_score_reloc_type (type);
1386 break;
1387
93fbbb04
GK
1388 case EM_XSTORMY16:
1389 rtype = elf_xstormy16_reloc_type (type);
1390 break;
179d3252 1391
1fe1f39c
NC
1392 case EM_CRX:
1393 rtype = elf_crx_reloc_type (type);
1394 break;
1395
179d3252
JT
1396 case EM_VAX:
1397 rtype = elf_vax_reloc_type (type);
1398 break;
1e4cf259 1399
619ed720
EB
1400 case EM_VISIUM:
1401 rtype = elf_visium_reloc_type (type);
1402 break;
1403
cfb8c092
NC
1404 case EM_ADAPTEVA_EPIPHANY:
1405 rtype = elf_epiphany_reloc_type (type);
1406 break;
1407
1e4cf259
NC
1408 case EM_IP2K:
1409 case EM_IP2K_OLD:
1410 rtype = elf_ip2k_reloc_type (type);
1411 break;
3b36097d
SC
1412
1413 case EM_IQ2000:
1414 rtype = elf_iq2000_reloc_type (type);
1415 break;
88da6820
NC
1416
1417 case EM_XTENSA_OLD:
1418 case EM_XTENSA:
1419 rtype = elf_xtensa_reloc_type (type);
1420 break;
a34e3ecb 1421
84e94c90
NC
1422 case EM_LATTICEMICO32:
1423 rtype = elf_lm32_reloc_type (type);
1424 break;
1425
ff7eeb89 1426 case EM_M32C_OLD:
49f58d10
JB
1427 case EM_M32C:
1428 rtype = elf_m32c_reloc_type (type);
1429 break;
1430
d031aafb
NS
1431 case EM_MT:
1432 rtype = elf_mt_reloc_type (type);
a34e3ecb 1433 break;
1d65ded4
CM
1434
1435 case EM_BLACKFIN:
1436 rtype = elf_bfin_reloc_type (type);
1437 break;
15ab5209
DB
1438
1439 case EM_CYGNUS_MEP:
1440 rtype = elf_mep_reloc_type (type);
1441 break;
60bca95a
NC
1442
1443 case EM_CR16:
1444 rtype = elf_cr16_reloc_type (type);
1445 break;
dd24e3da 1446
7ba29e2a
NC
1447 case EM_MICROBLAZE:
1448 case EM_MICROBLAZE_OLD:
1449 rtype = elf_microblaze_reloc_type (type);
1450 break;
c7927a3c 1451
99c513f6
DD
1452 case EM_RL78:
1453 rtype = elf_rl78_reloc_type (type);
1454 break;
1455
c7927a3c
NC
1456 case EM_RX:
1457 rtype = elf_rx_reloc_type (type);
1458 break;
c29aca4a 1459
a3c62988
NC
1460 case EM_METAG:
1461 rtype = elf_metag_reloc_type (type);
1462 break;
1463
c29aca4a
NC
1464 case EM_XC16X:
1465 case EM_C166:
1466 rtype = elf_xc16x_reloc_type (type);
1467 break;
40b36596
JM
1468
1469 case EM_TI_C6000:
1470 rtype = elf_tic6x_reloc_type (type);
1471 break;
aa137e4d
NC
1472
1473 case EM_TILEGX:
1474 rtype = elf_tilegx_reloc_type (type);
1475 break;
1476
1477 case EM_TILEPRO:
1478 rtype = elf_tilepro_reloc_type (type);
1479 break;
f6c1a2d5
NC
1480
1481 case EM_XGATE:
1482 rtype = elf_xgate_reloc_type (type);
1483 break;
36591ba1
SL
1484
1485 case EM_ALTERA_NIOS2:
1486 rtype = elf_nios2_reloc_type (type);
1487 break;
2b100bb5
DD
1488
1489 case EM_TI_PRU:
1490 rtype = elf_pru_reloc_type (type);
1491 break;
252b5132
RH
1492 }
1493
1494 if (rtype == NULL)
39dbeff8 1495 printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
252b5132 1496 else
8beeaeb7 1497 printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
252b5132 1498
7ace3541 1499 if (elf_header.e_machine == EM_ALPHA
157c2599 1500 && rtype != NULL
7ace3541
RH
1501 && streq (rtype, "R_ALPHA_LITUSE")
1502 && is_rela)
1503 {
1504 switch (rels[i].r_addend)
1505 {
1506 case LITUSE_ALPHA_ADDR: rtype = "ADDR"; break;
1507 case LITUSE_ALPHA_BASE: rtype = "BASE"; break;
1508 case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1509 case LITUSE_ALPHA_JSR: rtype = "JSR"; break;
1510 case LITUSE_ALPHA_TLSGD: rtype = "TLSGD"; break;
1511 case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1512 case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1513 default: rtype = NULL;
1514 }
1515 if (rtype)
1516 printf (" (%s)", rtype);
1517 else
1518 {
1519 putchar (' ');
1520 printf (_("<unknown addend: %lx>"),
1521 (unsigned long) rels[i].r_addend);
1522 }
1523 }
1524 else if (symtab_index)
252b5132 1525 {
af3fc3bc 1526 if (symtab == NULL || symtab_index >= nsyms)
2b692964 1527 printf (_(" bad symbol index: %08lx"), (unsigned long) symtab_index);
af3fc3bc 1528 else
19936277 1529 {
2cf0635d 1530 Elf_Internal_Sym * psym;
bb4d2ac2
L
1531 const char * version_string;
1532 enum versioned_symbol_info sym_info;
1533 unsigned short vna_other;
19936277 1534
af3fc3bc 1535 psym = symtab + symtab_index;
103f02d3 1536
bb4d2ac2
L
1537 version_string
1538 = get_symbol_version_string (file, is_dynsym,
1539 strtab, strtablen,
1540 symtab_index,
1541 psym,
1542 &sym_info,
1543 &vna_other);
1544
af3fc3bc 1545 printf (" ");
171191ba 1546
d8045f23
NC
1547 if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1548 {
1549 const char * name;
1550 unsigned int len;
1551 unsigned int width = is_32bit_elf ? 8 : 14;
1552
1553 /* Relocations against GNU_IFUNC symbols do not use the value
1554 of the symbol as the address to relocate against. Instead
1555 they invoke the function named by the symbol and use its
1556 result as the address for relocation.
1557
1558 To indicate this to the user, do not display the value of
1559 the symbol in the "Symbols's Value" field. Instead show
1560 its name followed by () as a hint that the symbol is
1561 invoked. */
1562
1563 if (strtab == NULL
1564 || psym->st_name == 0
1565 || psym->st_name >= strtablen)
1566 name = "??";
1567 else
1568 name = strtab + psym->st_name;
1569
1570 len = print_symbol (width, name);
bb4d2ac2
L
1571 if (version_string)
1572 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1573 version_string);
d8045f23
NC
1574 printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1575 }
1576 else
1577 {
1578 print_vma (psym->st_value, LONG_HEX);
171191ba 1579
d8045f23
NC
1580 printf (is_32bit_elf ? " " : " ");
1581 }
103f02d3 1582
af3fc3bc 1583 if (psym->st_name == 0)
f1ef08cb 1584 {
2cf0635d 1585 const char * sec_name = "<null>";
f1ef08cb
AM
1586 char name_buf[40];
1587
1588 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1589 {
4fbb74a6 1590 if (psym->st_shndx < elf_header.e_shnum)
74e1a04b 1591 sec_name = SECTION_NAME (section_headers + psym->st_shndx);
f1ef08cb
AM
1592 else if (psym->st_shndx == SHN_ABS)
1593 sec_name = "ABS";
1594 else if (psym->st_shndx == SHN_COMMON)
1595 sec_name = "COMMON";
ac145307
BS
1596 else if ((elf_header.e_machine == EM_MIPS
1597 && psym->st_shndx == SHN_MIPS_SCOMMON)
1598 || (elf_header.e_machine == EM_TI_C6000
1599 && psym->st_shndx == SHN_TIC6X_SCOMMON))
172553c7
TS
1600 sec_name = "SCOMMON";
1601 else if (elf_header.e_machine == EM_MIPS
1602 && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1603 sec_name = "SUNDEF";
8a9036a4 1604 else if ((elf_header.e_machine == EM_X86_64
7a9068fe
L
1605 || elf_header.e_machine == EM_L1OM
1606 || elf_header.e_machine == EM_K1OM)
3b22753a
L
1607 && psym->st_shndx == SHN_X86_64_LCOMMON)
1608 sec_name = "LARGE_COMMON";
9ce701e2
L
1609 else if (elf_header.e_machine == EM_IA_64
1610 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1611 && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1612 sec_name = "ANSI_COM";
28f997cf 1613 else if (is_ia64_vms ()
148b93f2
NC
1614 && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1615 sec_name = "VMS_SYMVEC";
f1ef08cb
AM
1616 else
1617 {
1618 sprintf (name_buf, "<section 0x%x>",
1619 (unsigned int) psym->st_shndx);
1620 sec_name = name_buf;
1621 }
1622 }
1623 print_symbol (22, sec_name);
1624 }
af3fc3bc 1625 else if (strtab == NULL)
d79b3d50 1626 printf (_("<string table index: %3ld>"), psym->st_name);
c256ffe7 1627 else if (psym->st_name >= strtablen)
d79b3d50 1628 printf (_("<corrupt string table index: %3ld>"), psym->st_name);
af3fc3bc 1629 else
bb4d2ac2
L
1630 {
1631 print_symbol (22, strtab + psym->st_name);
1632 if (version_string)
1633 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1634 version_string);
1635 }
103f02d3 1636
af3fc3bc 1637 if (is_rela)
171191ba 1638 {
7360e63f 1639 bfd_vma off = rels[i].r_addend;
171191ba 1640
7360e63f 1641 if ((bfd_signed_vma) off < 0)
598aaa76 1642 printf (" - %" BFD_VMA_FMT "x", - off);
171191ba 1643 else
598aaa76 1644 printf (" + %" BFD_VMA_FMT "x", off);
171191ba 1645 }
19936277 1646 }
252b5132 1647 }
1b228002 1648 else if (is_rela)
f7a99963 1649 {
7360e63f 1650 bfd_vma off = rels[i].r_addend;
e04d7088
L
1651
1652 printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
7360e63f 1653 if ((bfd_signed_vma) off < 0)
e04d7088
L
1654 printf ("-%" BFD_VMA_FMT "x", - off);
1655 else
1656 printf ("%" BFD_VMA_FMT "x", off);
f7a99963 1657 }
252b5132 1658
157c2599
NC
1659 if (elf_header.e_machine == EM_SPARCV9
1660 && rtype != NULL
1661 && streq (rtype, "R_SPARC_OLO10"))
91d6fa6a 1662 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
351b4b40 1663
252b5132 1664 putchar ('\n');
2c71103e 1665
aca88567 1666#ifdef BFD64
53c7db4b 1667 if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
2c71103e 1668 {
91d6fa6a
NC
1669 bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1670 bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
2cf0635d
NC
1671 const char * rtype2 = elf_mips_reloc_type (type2);
1672 const char * rtype3 = elf_mips_reloc_type (type3);
aca88567 1673
2c71103e
NC
1674 printf (" Type2: ");
1675
1676 if (rtype2 == NULL)
39dbeff8
AM
1677 printf (_("unrecognized: %-7lx"),
1678 (unsigned long) type2 & 0xffffffff);
2c71103e
NC
1679 else
1680 printf ("%-17.17s", rtype2);
1681
18bd398b 1682 printf ("\n Type3: ");
2c71103e
NC
1683
1684 if (rtype3 == NULL)
39dbeff8
AM
1685 printf (_("unrecognized: %-7lx"),
1686 (unsigned long) type3 & 0xffffffff);
2c71103e
NC
1687 else
1688 printf ("%-17.17s", rtype3);
1689
53c7db4b 1690 putchar ('\n');
2c71103e 1691 }
aca88567 1692#endif /* BFD64 */
252b5132
RH
1693 }
1694
c8286bd1 1695 free (rels);
252b5132
RH
1696}
1697
1698static const char *
d3ba0551 1699get_mips_dynamic_type (unsigned long type)
252b5132
RH
1700{
1701 switch (type)
1702 {
1703 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1704 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1705 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1706 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1707 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1708 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1709 case DT_MIPS_MSYM: return "MIPS_MSYM";
1710 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1711 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1712 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1713 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1714 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1715 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1716 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1717 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1718 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1719 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
a5499fa4 1720 case DT_MIPS_RLD_MAP_REL: return "MIPS_RLD_MAP_REL";
252b5132
RH
1721 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1722 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1723 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1724 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1725 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1726 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1727 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1728 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1729 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1730 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1731 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1732 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1733 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1734 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1735 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1736 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1737 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1738 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1739 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1740 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1741 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1742 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1743 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1744 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1745 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1746 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
861fb55a
DJ
1747 case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1748 case DT_MIPS_RWPLT: return "MIPS_RWPLT";
252b5132
RH
1749 default:
1750 return NULL;
1751 }
1752}
1753
9a097730 1754static const char *
d3ba0551 1755get_sparc64_dynamic_type (unsigned long type)
9a097730
RH
1756{
1757 switch (type)
1758 {
1759 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1760 default:
1761 return NULL;
1762 }
103f02d3
UD
1763}
1764
7490d522
AM
1765static const char *
1766get_ppc_dynamic_type (unsigned long type)
1767{
1768 switch (type)
1769 {
a7f2871e 1770 case DT_PPC_GOT: return "PPC_GOT";
e8910a83 1771 case DT_PPC_OPT: return "PPC_OPT";
7490d522
AM
1772 default:
1773 return NULL;
1774 }
1775}
1776
f1cb7e17 1777static const char *
d3ba0551 1778get_ppc64_dynamic_type (unsigned long type)
f1cb7e17
AM
1779{
1780 switch (type)
1781 {
a7f2871e
AM
1782 case DT_PPC64_GLINK: return "PPC64_GLINK";
1783 case DT_PPC64_OPD: return "PPC64_OPD";
1784 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
e8910a83 1785 case DT_PPC64_OPT: return "PPC64_OPT";
f1cb7e17
AM
1786 default:
1787 return NULL;
1788 }
1789}
1790
103f02d3 1791static const char *
d3ba0551 1792get_parisc_dynamic_type (unsigned long type)
103f02d3
UD
1793{
1794 switch (type)
1795 {
1796 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1797 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1798 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1799 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1800 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1801 case DT_HP_PREINIT: return "HP_PREINIT";
1802 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1803 case DT_HP_NEEDED: return "HP_NEEDED";
1804 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1805 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1806 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1807 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1808 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
eec8f817
DA
1809 case DT_HP_EPLTREL: return "HP_GST_EPLTREL";
1810 case DT_HP_EPLTRELSZ: return "HP_GST_EPLTRELSZ";
1811 case DT_HP_FILTERED: return "HP_FILTERED";
1812 case DT_HP_FILTER_TLS: return "HP_FILTER_TLS";
1813 case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1814 case DT_HP_LAZYLOAD: return "HP_LAZYLOAD";
1815 case DT_HP_BIND_NOW_COUNT: return "HP_BIND_NOW_COUNT";
1816 case DT_PLT: return "PLT";
1817 case DT_PLT_SIZE: return "PLT_SIZE";
1818 case DT_DLT: return "DLT";
1819 case DT_DLT_SIZE: return "DLT_SIZE";
103f02d3
UD
1820 default:
1821 return NULL;
1822 }
1823}
9a097730 1824
ecc51f48 1825static const char *
d3ba0551 1826get_ia64_dynamic_type (unsigned long type)
ecc51f48
NC
1827{
1828 switch (type)
1829 {
148b93f2
NC
1830 case DT_IA_64_PLT_RESERVE: return "IA_64_PLT_RESERVE";
1831 case DT_IA_64_VMS_SUBTYPE: return "VMS_SUBTYPE";
1832 case DT_IA_64_VMS_IMGIOCNT: return "VMS_IMGIOCNT";
1833 case DT_IA_64_VMS_LNKFLAGS: return "VMS_LNKFLAGS";
1834 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1835 case DT_IA_64_VMS_IDENT: return "VMS_IDENT";
1836 case DT_IA_64_VMS_NEEDED_IDENT: return "VMS_NEEDED_IDENT";
1837 case DT_IA_64_VMS_IMG_RELA_CNT: return "VMS_IMG_RELA_CNT";
1838 case DT_IA_64_VMS_SEG_RELA_CNT: return "VMS_SEG_RELA_CNT";
1839 case DT_IA_64_VMS_FIXUP_RELA_CNT: return "VMS_FIXUP_RELA_CNT";
1840 case DT_IA_64_VMS_FIXUP_NEEDED: return "VMS_FIXUP_NEEDED";
1841 case DT_IA_64_VMS_SYMVEC_CNT: return "VMS_SYMVEC_CNT";
1842 case DT_IA_64_VMS_XLATED: return "VMS_XLATED";
1843 case DT_IA_64_VMS_STACKSIZE: return "VMS_STACKSIZE";
1844 case DT_IA_64_VMS_UNWINDSZ: return "VMS_UNWINDSZ";
1845 case DT_IA_64_VMS_UNWIND_CODSEG: return "VMS_UNWIND_CODSEG";
1846 case DT_IA_64_VMS_UNWIND_INFOSEG: return "VMS_UNWIND_INFOSEG";
1847 case DT_IA_64_VMS_LINKTIME: return "VMS_LINKTIME";
1848 case DT_IA_64_VMS_SEG_NO: return "VMS_SEG_NO";
1849 case DT_IA_64_VMS_SYMVEC_OFFSET: return "VMS_SYMVEC_OFFSET";
1850 case DT_IA_64_VMS_SYMVEC_SEG: return "VMS_SYMVEC_SEG";
1851 case DT_IA_64_VMS_UNWIND_OFFSET: return "VMS_UNWIND_OFFSET";
1852 case DT_IA_64_VMS_UNWIND_SEG: return "VMS_UNWIND_SEG";
1853 case DT_IA_64_VMS_STRTAB_OFFSET: return "VMS_STRTAB_OFFSET";
1854 case DT_IA_64_VMS_SYSVER_OFFSET: return "VMS_SYSVER_OFFSET";
1855 case DT_IA_64_VMS_IMG_RELA_OFF: return "VMS_IMG_RELA_OFF";
1856 case DT_IA_64_VMS_SEG_RELA_OFF: return "VMS_SEG_RELA_OFF";
1857 case DT_IA_64_VMS_FIXUP_RELA_OFF: return "VMS_FIXUP_RELA_OFF";
1858 case DT_IA_64_VMS_PLTGOT_OFFSET: return "VMS_PLTGOT_OFFSET";
1859 case DT_IA_64_VMS_PLTGOT_SEG: return "VMS_PLTGOT_SEG";
1860 case DT_IA_64_VMS_FPMODE: return "VMS_FPMODE";
ecc51f48
NC
1861 default:
1862 return NULL;
1863 }
1864}
1865
fd85a6a1
NC
1866static const char *
1867get_solaris_section_type (unsigned long type)
1868{
1869 switch (type)
1870 {
1871 case 0x6fffffee: return "SUNW_ancillary";
1872 case 0x6fffffef: return "SUNW_capchain";
1873 case 0x6ffffff0: return "SUNW_capinfo";
1874 case 0x6ffffff1: return "SUNW_symsort";
1875 case 0x6ffffff2: return "SUNW_tlssort";
1876 case 0x6ffffff3: return "SUNW_LDYNSYM";
1877 case 0x6ffffff4: return "SUNW_dof";
1878 case 0x6ffffff5: return "SUNW_cap";
1879 case 0x6ffffff6: return "SUNW_SIGNATURE";
1880 case 0x6ffffff7: return "SUNW_ANNOTATE";
1881 case 0x6ffffff8: return "SUNW_DEBUGSTR";
1882 case 0x6ffffff9: return "SUNW_DEBUG";
1883 case 0x6ffffffa: return "SUNW_move";
1884 case 0x6ffffffb: return "SUNW_COMDAT";
1885 case 0x6ffffffc: return "SUNW_syminfo";
1886 case 0x6ffffffd: return "SUNW_verdef";
1887 case 0x6ffffffe: return "SUNW_verneed";
1888 case 0x6fffffff: return "SUNW_versym";
1889 case 0x70000000: return "SPARC_GOTDATA";
1890 default: return NULL;
1891 }
1892}
1893
fabcb361
RH
1894static const char *
1895get_alpha_dynamic_type (unsigned long type)
1896{
1897 switch (type)
1898 {
1899 case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1900 default:
1901 return NULL;
1902 }
1903}
1904
1c0d3aa6
NC
1905static const char *
1906get_score_dynamic_type (unsigned long type)
1907{
1908 switch (type)
1909 {
1910 case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1911 case DT_SCORE_LOCAL_GOTNO: return "SCORE_LOCAL_GOTNO";
1912 case DT_SCORE_SYMTABNO: return "SCORE_SYMTABNO";
1913 case DT_SCORE_GOTSYM: return "SCORE_GOTSYM";
1914 case DT_SCORE_UNREFEXTNO: return "SCORE_UNREFEXTNO";
1915 case DT_SCORE_HIPAGENO: return "SCORE_HIPAGENO";
1916 default:
1917 return NULL;
1918 }
1919}
1920
40b36596
JM
1921static const char *
1922get_tic6x_dynamic_type (unsigned long type)
1923{
1924 switch (type)
1925 {
1926 case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1927 case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1928 case DT_C6000_DSBT_BASE: return "C6000_DSBT_BASE";
1929 case DT_C6000_DSBT_SIZE: return "C6000_DSBT_SIZE";
1930 case DT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
1931 case DT_C6000_DSBT_INDEX: return "C6000_DSBT_INDEX";
1932 default:
1933 return NULL;
1934 }
1935}
1c0d3aa6 1936
36591ba1
SL
1937static const char *
1938get_nios2_dynamic_type (unsigned long type)
1939{
1940 switch (type)
1941 {
1942 case DT_NIOS2_GP: return "NIOS2_GP";
1943 default:
1944 return NULL;
1945 }
1946}
1947
fd85a6a1
NC
1948static const char *
1949get_solaris_dynamic_type (unsigned long type)
1950{
1951 switch (type)
1952 {
1953 case 0x6000000d: return "SUNW_AUXILIARY";
1954 case 0x6000000e: return "SUNW_RTLDINF";
1955 case 0x6000000f: return "SUNW_FILTER";
1956 case 0x60000010: return "SUNW_CAP";
1957 case 0x60000011: return "SUNW_SYMTAB";
1958 case 0x60000012: return "SUNW_SYMSZ";
1959 case 0x60000013: return "SUNW_SORTENT";
1960 case 0x60000014: return "SUNW_SYMSORT";
1961 case 0x60000015: return "SUNW_SYMSORTSZ";
1962 case 0x60000016: return "SUNW_TLSSORT";
1963 case 0x60000017: return "SUNW_TLSSORTSZ";
1964 case 0x60000018: return "SUNW_CAPINFO";
1965 case 0x60000019: return "SUNW_STRPAD";
1966 case 0x6000001a: return "SUNW_CAPCHAIN";
1967 case 0x6000001b: return "SUNW_LDMACH";
1968 case 0x6000001d: return "SUNW_CAPCHAINENT";
1969 case 0x6000001f: return "SUNW_CAPCHAINSZ";
1970 case 0x60000021: return "SUNW_PARENT";
1971 case 0x60000023: return "SUNW_ASLR";
1972 case 0x60000025: return "SUNW_RELAX";
1973 case 0x60000029: return "SUNW_NXHEAP";
1974 case 0x6000002b: return "SUNW_NXSTACK";
1975
1976 case 0x70000001: return "SPARC_REGISTER";
1977 case 0x7ffffffd: return "AUXILIARY";
1978 case 0x7ffffffe: return "USED";
1979 case 0x7fffffff: return "FILTER";
1980
15f205b1 1981 default: return NULL;
fd85a6a1
NC
1982 }
1983}
1984
252b5132 1985static const char *
d3ba0551 1986get_dynamic_type (unsigned long type)
252b5132 1987{
e9e44622 1988 static char buff[64];
252b5132
RH
1989
1990 switch (type)
1991 {
1992 case DT_NULL: return "NULL";
1993 case DT_NEEDED: return "NEEDED";
1994 case DT_PLTRELSZ: return "PLTRELSZ";
1995 case DT_PLTGOT: return "PLTGOT";
1996 case DT_HASH: return "HASH";
1997 case DT_STRTAB: return "STRTAB";
1998 case DT_SYMTAB: return "SYMTAB";
1999 case DT_RELA: return "RELA";
2000 case DT_RELASZ: return "RELASZ";
2001 case DT_RELAENT: return "RELAENT";
2002 case DT_STRSZ: return "STRSZ";
2003 case DT_SYMENT: return "SYMENT";
2004 case DT_INIT: return "INIT";
2005 case DT_FINI: return "FINI";
2006 case DT_SONAME: return "SONAME";
2007 case DT_RPATH: return "RPATH";
2008 case DT_SYMBOLIC: return "SYMBOLIC";
2009 case DT_REL: return "REL";
2010 case DT_RELSZ: return "RELSZ";
2011 case DT_RELENT: return "RELENT";
2012 case DT_PLTREL: return "PLTREL";
2013 case DT_DEBUG: return "DEBUG";
2014 case DT_TEXTREL: return "TEXTREL";
2015 case DT_JMPREL: return "JMPREL";
2016 case DT_BIND_NOW: return "BIND_NOW";
2017 case DT_INIT_ARRAY: return "INIT_ARRAY";
2018 case DT_FINI_ARRAY: return "FINI_ARRAY";
2019 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
2020 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
d1133906
NC
2021 case DT_RUNPATH: return "RUNPATH";
2022 case DT_FLAGS: return "FLAGS";
2d0e6f43 2023
d1133906
NC
2024 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2025 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
6d913794 2026 case DT_SYMTAB_SHNDX: return "SYMTAB_SHNDX";
103f02d3 2027
05107a46 2028 case DT_CHECKSUM: return "CHECKSUM";
252b5132
RH
2029 case DT_PLTPADSZ: return "PLTPADSZ";
2030 case DT_MOVEENT: return "MOVEENT";
2031 case DT_MOVESZ: return "MOVESZ";
dcefbbbd 2032 case DT_FEATURE: return "FEATURE";
252b5132
RH
2033 case DT_POSFLAG_1: return "POSFLAG_1";
2034 case DT_SYMINSZ: return "SYMINSZ";
2035 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
103f02d3 2036
252b5132 2037 case DT_ADDRRNGLO: return "ADDRRNGLO";
dcefbbbd
L
2038 case DT_CONFIG: return "CONFIG";
2039 case DT_DEPAUDIT: return "DEPAUDIT";
2040 case DT_AUDIT: return "AUDIT";
2041 case DT_PLTPAD: return "PLTPAD";
2042 case DT_MOVETAB: return "MOVETAB";
252b5132 2043 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
103f02d3 2044
252b5132 2045 case DT_VERSYM: return "VERSYM";
103f02d3 2046
67a4f2b7
AO
2047 case DT_TLSDESC_GOT: return "TLSDESC_GOT";
2048 case DT_TLSDESC_PLT: return "TLSDESC_PLT";
252b5132
RH
2049 case DT_RELACOUNT: return "RELACOUNT";
2050 case DT_RELCOUNT: return "RELCOUNT";
2051 case DT_FLAGS_1: return "FLAGS_1";
2052 case DT_VERDEF: return "VERDEF";
2053 case DT_VERDEFNUM: return "VERDEFNUM";
2054 case DT_VERNEED: return "VERNEED";
2055 case DT_VERNEEDNUM: return "VERNEEDNUM";
103f02d3 2056
019148e4 2057 case DT_AUXILIARY: return "AUXILIARY";
252b5132
RH
2058 case DT_USED: return "USED";
2059 case DT_FILTER: return "FILTER";
103f02d3 2060
047b2264
JJ
2061 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
2062 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
2063 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
2064 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
2065 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
fdc90cb4 2066 case DT_GNU_HASH: return "GNU_HASH";
047b2264 2067
252b5132
RH
2068 default:
2069 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
2070 {
2cf0635d 2071 const char * result;
103f02d3 2072
252b5132
RH
2073 switch (elf_header.e_machine)
2074 {
2075 case EM_MIPS:
4fe85591 2076 case EM_MIPS_RS3_LE:
252b5132
RH
2077 result = get_mips_dynamic_type (type);
2078 break;
9a097730
RH
2079 case EM_SPARCV9:
2080 result = get_sparc64_dynamic_type (type);
2081 break;
7490d522
AM
2082 case EM_PPC:
2083 result = get_ppc_dynamic_type (type);
2084 break;
f1cb7e17
AM
2085 case EM_PPC64:
2086 result = get_ppc64_dynamic_type (type);
2087 break;
ecc51f48
NC
2088 case EM_IA_64:
2089 result = get_ia64_dynamic_type (type);
2090 break;
fabcb361
RH
2091 case EM_ALPHA:
2092 result = get_alpha_dynamic_type (type);
2093 break;
1c0d3aa6
NC
2094 case EM_SCORE:
2095 result = get_score_dynamic_type (type);
2096 break;
40b36596
JM
2097 case EM_TI_C6000:
2098 result = get_tic6x_dynamic_type (type);
2099 break;
36591ba1
SL
2100 case EM_ALTERA_NIOS2:
2101 result = get_nios2_dynamic_type (type);
2102 break;
252b5132 2103 default:
fd85a6a1
NC
2104 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2105 result = get_solaris_dynamic_type (type);
2106 else
2107 result = NULL;
252b5132
RH
2108 break;
2109 }
2110
2111 if (result != NULL)
2112 return result;
2113
e9e44622 2114 snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
252b5132 2115 }
eec8f817
DA
2116 else if (((type >= DT_LOOS) && (type <= DT_HIOS))
2117 || (elf_header.e_machine == EM_PARISC
2118 && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
103f02d3 2119 {
2cf0635d 2120 const char * result;
103f02d3
UD
2121
2122 switch (elf_header.e_machine)
2123 {
2124 case EM_PARISC:
2125 result = get_parisc_dynamic_type (type);
2126 break;
148b93f2
NC
2127 case EM_IA_64:
2128 result = get_ia64_dynamic_type (type);
2129 break;
103f02d3 2130 default:
fd85a6a1
NC
2131 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2132 result = get_solaris_dynamic_type (type);
2133 else
2134 result = NULL;
103f02d3
UD
2135 break;
2136 }
2137
2138 if (result != NULL)
2139 return result;
2140
e9e44622
JJ
2141 snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2142 type);
103f02d3 2143 }
252b5132 2144 else
e9e44622 2145 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
103f02d3 2146
252b5132
RH
2147 return buff;
2148 }
2149}
2150
2151static char *
d3ba0551 2152get_file_type (unsigned e_type)
252b5132 2153{
b34976b6 2154 static char buff[32];
252b5132
RH
2155
2156 switch (e_type)
2157 {
2158 case ET_NONE: return _("NONE (None)");
2159 case ET_REL: return _("REL (Relocatable file)");
ba2685cc
AM
2160 case ET_EXEC: return _("EXEC (Executable file)");
2161 case ET_DYN: return _("DYN (Shared object file)");
2162 case ET_CORE: return _("CORE (Core file)");
252b5132
RH
2163
2164 default:
2165 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
e9e44622 2166 snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
252b5132 2167 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
e9e44622 2168 snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
252b5132 2169 else
e9e44622 2170 snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
252b5132
RH
2171 return buff;
2172 }
2173}
2174
2175static char *
d3ba0551 2176get_machine_name (unsigned e_machine)
252b5132 2177{
b34976b6 2178 static char buff[64]; /* XXX */
252b5132
RH
2179
2180 switch (e_machine)
2181 {
c45021f2 2182 case EM_NONE: return _("None");
a06ea964 2183 case EM_AARCH64: return "AArch64";
c45021f2
NC
2184 case EM_M32: return "WE32100";
2185 case EM_SPARC: return "Sparc";
e9f53129 2186 case EM_SPU: return "SPU";
c45021f2
NC
2187 case EM_386: return "Intel 80386";
2188 case EM_68K: return "MC68000";
2189 case EM_88K: return "MC88000";
22abe556 2190 case EM_IAMCU: return "Intel MCU";
c45021f2
NC
2191 case EM_860: return "Intel 80860";
2192 case EM_MIPS: return "MIPS R3000";
2193 case EM_S370: return "IBM System/370";
7036c0e1 2194 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
252b5132 2195 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
c45021f2 2196 case EM_PARISC: return "HPPA";
252b5132 2197 case EM_PPC_OLD: return "Power PC (old)";
7036c0e1 2198 case EM_SPARC32PLUS: return "Sparc v8+" ;
c45021f2
NC
2199 case EM_960: return "Intel 90860";
2200 case EM_PPC: return "PowerPC";
285d1771 2201 case EM_PPC64: return "PowerPC64";
c45021f2 2202 case EM_FR20: return "Fujitsu FR20";
3f8107ab 2203 case EM_FT32: return "FTDI FT32";
c45021f2 2204 case EM_RH32: return "TRW RH32";
b34976b6 2205 case EM_MCORE: return "MCORE";
7036c0e1
AJ
2206 case EM_ARM: return "ARM";
2207 case EM_OLD_ALPHA: return "Digital Alpha (old)";
ef230218 2208 case EM_SH: return "Renesas / SuperH SH";
c45021f2
NC
2209 case EM_SPARCV9: return "Sparc v9";
2210 case EM_TRICORE: return "Siemens Tricore";
584da044 2211 case EM_ARC: return "ARC";
886a2506
NC
2212 case EM_ARC_COMPACT: return "ARCompact";
2213 case EM_ARC_COMPACT2: return "ARCv2";
c2dcd04e
NC
2214 case EM_H8_300: return "Renesas H8/300";
2215 case EM_H8_300H: return "Renesas H8/300H";
2216 case EM_H8S: return "Renesas H8S";
2217 case EM_H8_500: return "Renesas H8/500";
30800947 2218 case EM_IA_64: return "Intel IA-64";
252b5132
RH
2219 case EM_MIPS_X: return "Stanford MIPS-X";
2220 case EM_COLDFIRE: return "Motorola Coldfire";
c45021f2 2221 case EM_ALPHA: return "Alpha";
2b0337b0
AO
2222 case EM_CYGNUS_D10V:
2223 case EM_D10V: return "d10v";
2224 case EM_CYGNUS_D30V:
b34976b6 2225 case EM_D30V: return "d30v";
2b0337b0 2226 case EM_CYGNUS_M32R:
26597c86 2227 case EM_M32R: return "Renesas M32R (formerly Mitsubishi M32r)";
2b0337b0 2228 case EM_CYGNUS_V850:
708e2187 2229 case EM_V800: return "Renesas V850 (using RH850 ABI)";
f6c1a2d5 2230 case EM_V850: return "Renesas V850";
2b0337b0
AO
2231 case EM_CYGNUS_MN10300:
2232 case EM_MN10300: return "mn10300";
2233 case EM_CYGNUS_MN10200:
2234 case EM_MN10200: return "mn10200";
5506d11a 2235 case EM_MOXIE: return "Moxie";
2b0337b0
AO
2236 case EM_CYGNUS_FR30:
2237 case EM_FR30: return "Fujitsu FR30";
b34976b6 2238 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
2b0337b0 2239 case EM_PJ_OLD:
b34976b6 2240 case EM_PJ: return "picoJava";
7036c0e1
AJ
2241 case EM_MMA: return "Fujitsu Multimedia Accelerator";
2242 case EM_PCP: return "Siemens PCP";
2243 case EM_NCPU: return "Sony nCPU embedded RISC processor";
2244 case EM_NDR1: return "Denso NDR1 microprocesspr";
2245 case EM_STARCORE: return "Motorola Star*Core processor";
2246 case EM_ME16: return "Toyota ME16 processor";
2247 case EM_ST100: return "STMicroelectronics ST100 processor";
2248 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
11636f9e
JM
2249 case EM_PDSP: return "Sony DSP processor";
2250 case EM_PDP10: return "Digital Equipment Corp. PDP-10";
2251 case EM_PDP11: return "Digital Equipment Corp. PDP-11";
7036c0e1
AJ
2252 case EM_FX66: return "Siemens FX66 microcontroller";
2253 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2254 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
2255 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
6927f982 2256 case EM_68HC12: return "Motorola MC68HC12 Microcontroller";
7036c0e1
AJ
2257 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
2258 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
2259 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
2260 case EM_SVX: return "Silicon Graphics SVx";
2261 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
2262 case EM_VAX: return "Digital VAX";
619ed720 2263 case EM_VISIUM: return "CDS VISIUMcore processor";
2b0337b0 2264 case EM_AVR_OLD:
b34976b6 2265 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
1b61cf92 2266 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
c45021f2
NC
2267 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
2268 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
2269 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
b34976b6 2270 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
c45021f2 2271 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
3b36097d 2272 case EM_PRISM: return "Vitesse Prism";
bcedfee6 2273 case EM_X86_64: return "Advanced Micro Devices X86-64";
8a9036a4 2274 case EM_L1OM: return "Intel L1OM";
7a9068fe 2275 case EM_K1OM: return "Intel K1OM";
b7498e0e 2276 case EM_S390_OLD:
b34976b6 2277 case EM_S390: return "IBM S/390";
1c0d3aa6 2278 case EM_SCORE: return "SUNPLUS S+Core";
61865e30 2279 case EM_XSTORMY16: return "Sanyo XStormy16 CPU core";
73589c9d 2280 case EM_OR1K: return "OpenRISC 1000";
1fe1f39c 2281 case EM_CRX: return "National Semiconductor CRX microprocessor";
cfb8c092 2282 case EM_ADAPTEVA_EPIPHANY: return "Adapteva EPIPHANY";
d172d4ba 2283 case EM_DLX: return "OpenDLX";
1e4cf259 2284 case EM_IP2K_OLD:
b34976b6 2285 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
3b36097d 2286 case EM_IQ2000: return "Vitesse IQ2000";
88da6820
NC
2287 case EM_XTENSA_OLD:
2288 case EM_XTENSA: return "Tensilica Xtensa Processor";
11636f9e
JM
2289 case EM_VIDEOCORE: return "Alphamosaic VideoCore processor";
2290 case EM_TMM_GPP: return "Thompson Multimedia General Purpose Processor";
2291 case EM_NS32K: return "National Semiconductor 32000 series";
2292 case EM_TPC: return "Tenor Network TPC processor";
2293 case EM_ST200: return "STMicroelectronics ST200 microcontroller";
2294 case EM_MAX: return "MAX Processor";
2295 case EM_CR: return "National Semiconductor CompactRISC";
2296 case EM_F2MC16: return "Fujitsu F2MC16";
2297 case EM_MSP430: return "Texas Instruments msp430 microcontroller";
84e94c90 2298 case EM_LATTICEMICO32: return "Lattice Mico32";
ff7eeb89 2299 case EM_M32C_OLD:
49f58d10 2300 case EM_M32C: return "Renesas M32c";
d031aafb 2301 case EM_MT: return "Morpho Techologies MT processor";
7bbe5bc5 2302 case EM_BLACKFIN: return "Analog Devices Blackfin";
11636f9e
JM
2303 case EM_SE_C33: return "S1C33 Family of Seiko Epson processors";
2304 case EM_SEP: return "Sharp embedded microprocessor";
2305 case EM_ARCA: return "Arca RISC microprocessor";
2306 case EM_UNICORE: return "Unicore";
2307 case EM_EXCESS: return "eXcess 16/32/64-bit configurable embedded CPU";
2308 case EM_DXP: return "Icera Semiconductor Inc. Deep Execution Processor";
64fd6348
NC
2309 case EM_NIOS32: return "Altera Nios";
2310 case EM_ALTERA_NIOS2: return "Altera Nios II";
c29aca4a 2311 case EM_C166:
d70c5fc7 2312 case EM_XC16X: return "Infineon Technologies xc16x";
11636f9e
JM
2313 case EM_M16C: return "Renesas M16C series microprocessors";
2314 case EM_DSPIC30F: return "Microchip Technology dsPIC30F Digital Signal Controller";
2315 case EM_CE: return "Freescale Communication Engine RISC core";
2316 case EM_TSK3000: return "Altium TSK3000 core";
2317 case EM_RS08: return "Freescale RS08 embedded processor";
2318 case EM_ECOG2: return "Cyan Technology eCOG2 microprocessor";
2319 case EM_DSP24: return "New Japan Radio (NJR) 24-bit DSP Processor";
2320 case EM_VIDEOCORE3: return "Broadcom VideoCore III processor";
2321 case EM_SE_C17: return "Seiko Epson C17 family";
2322 case EM_TI_C6000: return "Texas Instruments TMS320C6000 DSP family";
2323 case EM_TI_C2000: return "Texas Instruments TMS320C2000 DSP family";
2324 case EM_TI_C5500: return "Texas Instruments TMS320C55x DSP family";
2325 case EM_MMDSP_PLUS: return "STMicroelectronics 64bit VLIW Data Signal Processor";
2326 case EM_CYPRESS_M8C: return "Cypress M8C microprocessor";
2327 case EM_R32C: return "Renesas R32C series microprocessors";
2328 case EM_TRIMEDIA: return "NXP Semiconductors TriMedia architecture family";
2329 case EM_QDSP6: return "QUALCOMM DSP6 Processor";
2330 case EM_8051: return "Intel 8051 and variants";
2331 case EM_STXP7X: return "STMicroelectronics STxP7x family";
2332 case EM_NDS32: return "Andes Technology compact code size embedded RISC processor family";
2333 case EM_ECOG1X: return "Cyan Technology eCOG1X family";
2334 case EM_MAXQ30: return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2335 case EM_XIMO16: return "New Japan Radio (NJR) 16-bit DSP Processor";
2336 case EM_MANIK: return "M2000 Reconfigurable RISC Microprocessor";
2337 case EM_CRAYNV2: return "Cray Inc. NV2 vector architecture";
15ab5209 2338 case EM_CYGNUS_MEP: return "Toshiba MeP Media Engine";
cb8f3167 2339 case EM_CR16:
f6c1a2d5 2340 case EM_MICROBLAZE:
7ba29e2a 2341 case EM_MICROBLAZE_OLD: return "Xilinx MicroBlaze";
e23eba97 2342 case EM_RISCV: return "RISC-V";
99c513f6 2343 case EM_RL78: return "Renesas RL78";
c7927a3c 2344 case EM_RX: return "Renesas RX";
a3c62988 2345 case EM_METAG: return "Imagination Technologies Meta processor architecture";
11636f9e
JM
2346 case EM_MCST_ELBRUS: return "MCST Elbrus general purpose hardware architecture";
2347 case EM_ECOG16: return "Cyan Technology eCOG16 family";
2348 case EM_ETPU: return "Freescale Extended Time Processing Unit";
2349 case EM_SLE9X: return "Infineon Technologies SLE9X core";
2350 case EM_AVR32: return "Atmel Corporation 32-bit microprocessor family";
2351 case EM_STM8: return "STMicroeletronics STM8 8-bit microcontroller";
2352 case EM_TILE64: return "Tilera TILE64 multicore architecture family";
2353 case EM_TILEPRO: return "Tilera TILEPro multicore architecture family";
aa137e4d 2354 case EM_TILEGX: return "Tilera TILE-Gx multicore architecture family";
11636f9e 2355 case EM_CUDA: return "NVIDIA CUDA architecture";
f6c1a2d5 2356 case EM_XGATE: return "Motorola XGATE embedded processor";
6d913794
NC
2357 case EM_CLOUDSHIELD: return "CloudShield architecture family";
2358 case EM_COREA_1ST: return "KIPO-KAIST Core-A 1st generation processor family";
2359 case EM_COREA_2ND: return "KIPO-KAIST Core-A 2nd generation processor family";
2360 case EM_OPEN8: return "Open8 8-bit RISC soft processor core";
2361 case EM_VIDEOCORE5: return "Broadcom VideoCore V processor";
2362 case EM_56800EX: return "Freescale 56800EX Digital Signal Controller (DSC)";
15f205b1
NC
2363 case EM_BA1: return "Beyond BA1 CPU architecture";
2364 case EM_BA2: return "Beyond BA2 CPU architecture";
6d913794
NC
2365 case EM_XCORE: return "XMOS xCORE processor family";
2366 case EM_MCHP_PIC: return "Microchip 8-bit PIC(r) family";
2367 case EM_KM32: return "KM211 KM32 32-bit processor";
2368 case EM_KMX32: return "KM211 KMX32 32-bit processor";
2369 case EM_KMX16: return "KM211 KMX16 16-bit processor";
2370 case EM_KMX8: return "KM211 KMX8 8-bit processor";
2371 case EM_KVARC: return "KM211 KVARC processor";
15f205b1 2372 case EM_CDP: return "Paneve CDP architecture family";
6d913794
NC
2373 case EM_COGE: return "Cognitive Smart Memory Processor";
2374 case EM_COOL: return "Bluechip Systems CoolEngine";
2375 case EM_NORC: return "Nanoradio Optimized RISC";
2376 case EM_CSR_KALIMBA: return "CSR Kalimba architecture family";
15f205b1 2377 case EM_Z80: return "Zilog Z80";
6d913794 2378 case EM_AMDGPU: return "AMD GPU architecture";
2b100bb5 2379 case EM_TI_PRU: return "TI PRU I/O processor";
252b5132 2380 default:
35d9dd2f 2381 snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
252b5132
RH
2382 return buff;
2383 }
2384}
2385
a9522a21
AB
2386static void
2387decode_ARC_machine_flags (unsigned e_flags, unsigned e_machine, char buf[])
2388{
2389 /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2. Some
2390 other compilers don't a specific architecture type in the e_flags, and
2391 instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
2392 architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
2393 architectures.
2394
2395 Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
2396 but also sets a specific architecture type in the e_flags field.
2397
2398 However, when decoding the flags we don't worry if we see an
2399 unexpected pairing, for example EM_ARC_COMPACT machine type, with
2400 ARCEM architecture type. */
2401
2402 switch (e_flags & EF_ARC_MACH_MSK)
2403 {
2404 /* We only expect these to occur for EM_ARC_COMPACT2. */
2405 case EF_ARC_CPU_ARCV2EM:
2406 strcat (buf, ", ARC EM");
2407 break;
2408 case EF_ARC_CPU_ARCV2HS:
2409 strcat (buf, ", ARC HS");
2410 break;
2411
2412 /* We only expect these to occur for EM_ARC_COMPACT. */
2413 case E_ARC_MACH_ARC600:
2414 strcat (buf, ", ARC600");
2415 break;
2416 case E_ARC_MACH_ARC601:
2417 strcat (buf, ", ARC601");
2418 break;
2419 case E_ARC_MACH_ARC700:
2420 strcat (buf, ", ARC700");
2421 break;
2422
2423 /* The only times we should end up here are (a) A corrupt ELF, (b) A
2424 new ELF with new architecture being read by an old version of
2425 readelf, or (c) An ELF built with non-GNU compiler that does not
2426 set the architecture in the e_flags. */
2427 default:
2428 if (e_machine == EM_ARC_COMPACT)
2429 strcat (buf, ", Unknown ARCompact");
2430 else
2431 strcat (buf, ", Unknown ARC");
2432 break;
2433 }
2434
2435 switch (e_flags & EF_ARC_OSABI_MSK)
2436 {
2437 case E_ARC_OSABI_ORIG:
2438 strcat (buf, ", (ABI:legacy)");
2439 break;
2440 case E_ARC_OSABI_V2:
2441 strcat (buf, ", (ABI:v2)");
2442 break;
2443 /* Only upstream 3.9+ kernels will support ARCv2 ISA. */
2444 case E_ARC_OSABI_V3:
2445 strcat (buf, ", v3 no-legacy-syscalls ABI");
2446 break;
2447 default:
2448 strcat (buf, ", unrecognised ARC OSABI flag");
2449 break;
2450 }
2451}
2452
f3485b74 2453static void
d3ba0551 2454decode_ARM_machine_flags (unsigned e_flags, char buf[])
f3485b74
NC
2455{
2456 unsigned eabi;
2457 int unknown = 0;
2458
2459 eabi = EF_ARM_EABI_VERSION (e_flags);
2460 e_flags &= ~ EF_ARM_EABIMASK;
2461
2462 /* Handle "generic" ARM flags. */
2463 if (e_flags & EF_ARM_RELEXEC)
2464 {
2465 strcat (buf, ", relocatable executable");
2466 e_flags &= ~ EF_ARM_RELEXEC;
2467 }
76da6bbe 2468
f3485b74
NC
2469 /* Now handle EABI specific flags. */
2470 switch (eabi)
2471 {
2472 default:
2c71103e 2473 strcat (buf, ", <unrecognized EABI>");
f3485b74
NC
2474 if (e_flags)
2475 unknown = 1;
2476 break;
2477
2478 case EF_ARM_EABI_VER1:
a5bcd848 2479 strcat (buf, ", Version1 EABI");
f3485b74
NC
2480 while (e_flags)
2481 {
2482 unsigned flag;
76da6bbe 2483
f3485b74
NC
2484 /* Process flags one bit at a time. */
2485 flag = e_flags & - e_flags;
2486 e_flags &= ~ flag;
76da6bbe 2487
f3485b74
NC
2488 switch (flag)
2489 {
a5bcd848 2490 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
f3485b74
NC
2491 strcat (buf, ", sorted symbol tables");
2492 break;
76da6bbe 2493
f3485b74
NC
2494 default:
2495 unknown = 1;
2496 break;
2497 }
2498 }
2499 break;
76da6bbe 2500
a5bcd848
PB
2501 case EF_ARM_EABI_VER2:
2502 strcat (buf, ", Version2 EABI");
2503 while (e_flags)
2504 {
2505 unsigned flag;
2506
2507 /* Process flags one bit at a time. */
2508 flag = e_flags & - e_flags;
2509 e_flags &= ~ flag;
2510
2511 switch (flag)
2512 {
2513 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2514 strcat (buf, ", sorted symbol tables");
2515 break;
2516
2517 case EF_ARM_DYNSYMSUSESEGIDX:
2518 strcat (buf, ", dynamic symbols use segment index");
2519 break;
2520
2521 case EF_ARM_MAPSYMSFIRST:
2522 strcat (buf, ", mapping symbols precede others");
2523 break;
2524
2525 default:
2526 unknown = 1;
2527 break;
2528 }
2529 }
2530 break;
2531
d507cf36
PB
2532 case EF_ARM_EABI_VER3:
2533 strcat (buf, ", Version3 EABI");
8cb51566
PB
2534 break;
2535
2536 case EF_ARM_EABI_VER4:
2537 strcat (buf, ", Version4 EABI");
3bfcb652
NC
2538 while (e_flags)
2539 {
2540 unsigned flag;
2541
2542 /* Process flags one bit at a time. */
2543 flag = e_flags & - e_flags;
2544 e_flags &= ~ flag;
2545
2546 switch (flag)
2547 {
2548 case EF_ARM_BE8:
2549 strcat (buf, ", BE8");
2550 break;
2551
2552 case EF_ARM_LE8:
2553 strcat (buf, ", LE8");
2554 break;
2555
2556 default:
2557 unknown = 1;
2558 break;
2559 }
2560 break;
2561 }
2562 break;
3a4a14e9
PB
2563
2564 case EF_ARM_EABI_VER5:
2565 strcat (buf, ", Version5 EABI");
d507cf36
PB
2566 while (e_flags)
2567 {
2568 unsigned flag;
2569
2570 /* Process flags one bit at a time. */
2571 flag = e_flags & - e_flags;
2572 e_flags &= ~ flag;
2573
2574 switch (flag)
2575 {
2576 case EF_ARM_BE8:
2577 strcat (buf, ", BE8");
2578 break;
2579
2580 case EF_ARM_LE8:
2581 strcat (buf, ", LE8");
2582 break;
2583
3bfcb652
NC
2584 case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT. */
2585 strcat (buf, ", soft-float ABI");
2586 break;
2587
2588 case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT. */
2589 strcat (buf, ", hard-float ABI");
2590 break;
2591
d507cf36
PB
2592 default:
2593 unknown = 1;
2594 break;
2595 }
2596 }
2597 break;
2598
f3485b74 2599 case EF_ARM_EABI_UNKNOWN:
a5bcd848 2600 strcat (buf, ", GNU EABI");
f3485b74
NC
2601 while (e_flags)
2602 {
2603 unsigned flag;
76da6bbe 2604
f3485b74
NC
2605 /* Process flags one bit at a time. */
2606 flag = e_flags & - e_flags;
2607 e_flags &= ~ flag;
76da6bbe 2608
f3485b74
NC
2609 switch (flag)
2610 {
a5bcd848 2611 case EF_ARM_INTERWORK:
f3485b74
NC
2612 strcat (buf, ", interworking enabled");
2613 break;
76da6bbe 2614
a5bcd848 2615 case EF_ARM_APCS_26:
f3485b74
NC
2616 strcat (buf, ", uses APCS/26");
2617 break;
76da6bbe 2618
a5bcd848 2619 case EF_ARM_APCS_FLOAT:
f3485b74
NC
2620 strcat (buf, ", uses APCS/float");
2621 break;
76da6bbe 2622
a5bcd848 2623 case EF_ARM_PIC:
f3485b74
NC
2624 strcat (buf, ", position independent");
2625 break;
76da6bbe 2626
a5bcd848 2627 case EF_ARM_ALIGN8:
f3485b74
NC
2628 strcat (buf, ", 8 bit structure alignment");
2629 break;
76da6bbe 2630
a5bcd848 2631 case EF_ARM_NEW_ABI:
f3485b74
NC
2632 strcat (buf, ", uses new ABI");
2633 break;
76da6bbe 2634
a5bcd848 2635 case EF_ARM_OLD_ABI:
f3485b74
NC
2636 strcat (buf, ", uses old ABI");
2637 break;
76da6bbe 2638
a5bcd848 2639 case EF_ARM_SOFT_FLOAT:
f3485b74
NC
2640 strcat (buf, ", software FP");
2641 break;
76da6bbe 2642
90e01f86
ILT
2643 case EF_ARM_VFP_FLOAT:
2644 strcat (buf, ", VFP");
2645 break;
2646
fde78edd
NC
2647 case EF_ARM_MAVERICK_FLOAT:
2648 strcat (buf, ", Maverick FP");
2649 break;
2650
f3485b74
NC
2651 default:
2652 unknown = 1;
2653 break;
2654 }
2655 }
2656 }
f3485b74
NC
2657
2658 if (unknown)
2b692964 2659 strcat (buf,_(", <unknown>"));
f3485b74
NC
2660}
2661
343433df
AB
2662static void
2663decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2664{
2665 --size; /* Leave space for null terminator. */
2666
2667 switch (e_flags & EF_AVR_MACH)
2668 {
2669 case E_AVR_MACH_AVR1:
2670 strncat (buf, ", avr:1", size);
2671 break;
2672 case E_AVR_MACH_AVR2:
2673 strncat (buf, ", avr:2", size);
2674 break;
2675 case E_AVR_MACH_AVR25:
2676 strncat (buf, ", avr:25", size);
2677 break;
2678 case E_AVR_MACH_AVR3:
2679 strncat (buf, ", avr:3", size);
2680 break;
2681 case E_AVR_MACH_AVR31:
2682 strncat (buf, ", avr:31", size);
2683 break;
2684 case E_AVR_MACH_AVR35:
2685 strncat (buf, ", avr:35", size);
2686 break;
2687 case E_AVR_MACH_AVR4:
2688 strncat (buf, ", avr:4", size);
2689 break;
2690 case E_AVR_MACH_AVR5:
2691 strncat (buf, ", avr:5", size);
2692 break;
2693 case E_AVR_MACH_AVR51:
2694 strncat (buf, ", avr:51", size);
2695 break;
2696 case E_AVR_MACH_AVR6:
2697 strncat (buf, ", avr:6", size);
2698 break;
2699 case E_AVR_MACH_AVRTINY:
2700 strncat (buf, ", avr:100", size);
2701 break;
2702 case E_AVR_MACH_XMEGA1:
2703 strncat (buf, ", avr:101", size);
2704 break;
2705 case E_AVR_MACH_XMEGA2:
2706 strncat (buf, ", avr:102", size);
2707 break;
2708 case E_AVR_MACH_XMEGA3:
2709 strncat (buf, ", avr:103", size);
2710 break;
2711 case E_AVR_MACH_XMEGA4:
2712 strncat (buf, ", avr:104", size);
2713 break;
2714 case E_AVR_MACH_XMEGA5:
2715 strncat (buf, ", avr:105", size);
2716 break;
2717 case E_AVR_MACH_XMEGA6:
2718 strncat (buf, ", avr:106", size);
2719 break;
2720 case E_AVR_MACH_XMEGA7:
2721 strncat (buf, ", avr:107", size);
2722 break;
2723 default:
2724 strncat (buf, ", avr:<unknown>", size);
2725 break;
2726 }
2727
2728 size -= strlen (buf);
2729 if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2730 strncat (buf, ", link-relax", size);
2731}
2732
35c08157
KLC
2733static void
2734decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2735{
2736 unsigned abi;
2737 unsigned arch;
2738 unsigned config;
2739 unsigned version;
2740 int has_fpu = 0;
2741 int r = 0;
2742
2743 static const char *ABI_STRINGS[] =
2744 {
2745 "ABI v0", /* use r5 as return register; only used in N1213HC */
2746 "ABI v1", /* use r0 as return register */
2747 "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2748 "ABI v2fp", /* for FPU */
40c7a7cb
KLC
2749 "AABI",
2750 "ABI2 FP+"
35c08157
KLC
2751 };
2752 static const char *VER_STRINGS[] =
2753 {
2754 "Andes ELF V1.3 or older",
2755 "Andes ELF V1.3.1",
2756 "Andes ELF V1.4"
2757 };
2758 static const char *ARCH_STRINGS[] =
2759 {
2760 "",
2761 "Andes Star v1.0",
2762 "Andes Star v2.0",
2763 "Andes Star v3.0",
2764 "Andes Star v3.0m"
2765 };
2766
2767 abi = EF_NDS_ABI & e_flags;
2768 arch = EF_NDS_ARCH & e_flags;
2769 config = EF_NDS_INST & e_flags;
2770 version = EF_NDS32_ELF_VERSION & e_flags;
2771
2772 memset (buf, 0, size);
2773
2774 switch (abi)
2775 {
2776 case E_NDS_ABI_V0:
2777 case E_NDS_ABI_V1:
2778 case E_NDS_ABI_V2:
2779 case E_NDS_ABI_V2FP:
2780 case E_NDS_ABI_AABI:
40c7a7cb 2781 case E_NDS_ABI_V2FP_PLUS:
35c08157
KLC
2782 /* In case there are holes in the array. */
2783 r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2784 break;
2785
2786 default:
2787 r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2788 break;
2789 }
2790
2791 switch (version)
2792 {
2793 case E_NDS32_ELF_VER_1_2:
2794 case E_NDS32_ELF_VER_1_3:
2795 case E_NDS32_ELF_VER_1_4:
2796 r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2797 break;
2798
2799 default:
2800 r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2801 break;
2802 }
2803
2804 if (E_NDS_ABI_V0 == abi)
2805 {
2806 /* OLD ABI; only used in N1213HC, has performance extension 1. */
2807 r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2808 if (arch == E_NDS_ARCH_STAR_V1_0)
2809 r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2810 return;
2811 }
2812
2813 switch (arch)
2814 {
2815 case E_NDS_ARCH_STAR_V1_0:
2816 case E_NDS_ARCH_STAR_V2_0:
2817 case E_NDS_ARCH_STAR_V3_0:
2818 case E_NDS_ARCH_STAR_V3_M:
2819 r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2820 break;
2821
2822 default:
2823 r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2824 /* ARCH version determines how the e_flags are interpreted.
2825 If it is unknown, we cannot proceed. */
2826 return;
2827 }
2828
2829 /* Newer ABI; Now handle architecture specific flags. */
2830 if (arch == E_NDS_ARCH_STAR_V1_0)
2831 {
2832 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2833 r += snprintf (buf + r, size -r, ", MFUSR_PC");
2834
2835 if (!(config & E_NDS32_HAS_NO_MAC_INST))
2836 r += snprintf (buf + r, size -r, ", MAC");
2837
2838 if (config & E_NDS32_HAS_DIV_INST)
2839 r += snprintf (buf + r, size -r, ", DIV");
2840
2841 if (config & E_NDS32_HAS_16BIT_INST)
2842 r += snprintf (buf + r, size -r, ", 16b");
2843 }
2844 else
2845 {
2846 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2847 {
2848 if (version <= E_NDS32_ELF_VER_1_3)
2849 r += snprintf (buf + r, size -r, ", [B8]");
2850 else
2851 r += snprintf (buf + r, size -r, ", EX9");
2852 }
2853
2854 if (config & E_NDS32_HAS_MAC_DX_INST)
2855 r += snprintf (buf + r, size -r, ", MAC_DX");
2856
2857 if (config & E_NDS32_HAS_DIV_DX_INST)
2858 r += snprintf (buf + r, size -r, ", DIV_DX");
2859
2860 if (config & E_NDS32_HAS_16BIT_INST)
2861 {
2862 if (version <= E_NDS32_ELF_VER_1_3)
2863 r += snprintf (buf + r, size -r, ", 16b");
2864 else
2865 r += snprintf (buf + r, size -r, ", IFC");
2866 }
2867 }
2868
2869 if (config & E_NDS32_HAS_EXT_INST)
2870 r += snprintf (buf + r, size -r, ", PERF1");
2871
2872 if (config & E_NDS32_HAS_EXT2_INST)
2873 r += snprintf (buf + r, size -r, ", PERF2");
2874
2875 if (config & E_NDS32_HAS_FPU_INST)
2876 {
2877 has_fpu = 1;
2878 r += snprintf (buf + r, size -r, ", FPU_SP");
2879 }
2880
2881 if (config & E_NDS32_HAS_FPU_DP_INST)
2882 {
2883 has_fpu = 1;
2884 r += snprintf (buf + r, size -r, ", FPU_DP");
2885 }
2886
2887 if (config & E_NDS32_HAS_FPU_MAC_INST)
2888 {
2889 has_fpu = 1;
2890 r += snprintf (buf + r, size -r, ", FPU_MAC");
2891 }
2892
2893 if (has_fpu)
2894 {
2895 switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
2896 {
2897 case E_NDS32_FPU_REG_8SP_4DP:
2898 r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
2899 break;
2900 case E_NDS32_FPU_REG_16SP_8DP:
2901 r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
2902 break;
2903 case E_NDS32_FPU_REG_32SP_16DP:
2904 r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
2905 break;
2906 case E_NDS32_FPU_REG_32SP_32DP:
2907 r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
2908 break;
2909 }
2910 }
2911
2912 if (config & E_NDS32_HAS_AUDIO_INST)
2913 r += snprintf (buf + r, size -r, ", AUDIO");
2914
2915 if (config & E_NDS32_HAS_STRING_INST)
2916 r += snprintf (buf + r, size -r, ", STR");
2917
2918 if (config & E_NDS32_HAS_REDUCED_REGS)
2919 r += snprintf (buf + r, size -r, ", 16REG");
2920
2921 if (config & E_NDS32_HAS_VIDEO_INST)
2922 {
2923 if (version <= E_NDS32_ELF_VER_1_3)
2924 r += snprintf (buf + r, size -r, ", VIDEO");
2925 else
2926 r += snprintf (buf + r, size -r, ", SATURATION");
2927 }
2928
2929 if (config & E_NDS32_HAS_ENCRIPT_INST)
2930 r += snprintf (buf + r, size -r, ", ENCRP");
2931
2932 if (config & E_NDS32_HAS_L2C_INST)
2933 r += snprintf (buf + r, size -r, ", L2C");
2934}
2935
252b5132 2936static char *
d3ba0551 2937get_machine_flags (unsigned e_flags, unsigned e_machine)
252b5132 2938{
b34976b6 2939 static char buf[1024];
252b5132
RH
2940
2941 buf[0] = '\0';
76da6bbe 2942
252b5132
RH
2943 if (e_flags)
2944 {
2945 switch (e_machine)
2946 {
2947 default:
2948 break;
2949
886a2506 2950 case EM_ARC_COMPACT2:
886a2506 2951 case EM_ARC_COMPACT:
a9522a21
AB
2952 decode_ARC_machine_flags (e_flags, e_machine, buf);
2953 break;
886a2506 2954
f3485b74
NC
2955 case EM_ARM:
2956 decode_ARM_machine_flags (e_flags, buf);
2957 break;
76da6bbe 2958
343433df
AB
2959 case EM_AVR:
2960 decode_AVR_machine_flags (e_flags, buf, sizeof buf);
2961 break;
2962
781303ce
MF
2963 case EM_BLACKFIN:
2964 if (e_flags & EF_BFIN_PIC)
2965 strcat (buf, ", PIC");
2966
2967 if (e_flags & EF_BFIN_FDPIC)
2968 strcat (buf, ", FDPIC");
2969
2970 if (e_flags & EF_BFIN_CODE_IN_L1)
2971 strcat (buf, ", code in L1");
2972
2973 if (e_flags & EF_BFIN_DATA_IN_L1)
2974 strcat (buf, ", data in L1");
2975
2976 break;
2977
ec2dfb42
AO
2978 case EM_CYGNUS_FRV:
2979 switch (e_flags & EF_FRV_CPU_MASK)
2980 {
2981 case EF_FRV_CPU_GENERIC:
2982 break;
2983
2984 default:
2985 strcat (buf, ", fr???");
2986 break;
57346661 2987
ec2dfb42
AO
2988 case EF_FRV_CPU_FR300:
2989 strcat (buf, ", fr300");
2990 break;
2991
2992 case EF_FRV_CPU_FR400:
2993 strcat (buf, ", fr400");
2994 break;
2995 case EF_FRV_CPU_FR405:
2996 strcat (buf, ", fr405");
2997 break;
2998
2999 case EF_FRV_CPU_FR450:
3000 strcat (buf, ", fr450");
3001 break;
3002
3003 case EF_FRV_CPU_FR500:
3004 strcat (buf, ", fr500");
3005 break;
3006 case EF_FRV_CPU_FR550:
3007 strcat (buf, ", fr550");
3008 break;
3009
3010 case EF_FRV_CPU_SIMPLE:
3011 strcat (buf, ", simple");
3012 break;
3013 case EF_FRV_CPU_TOMCAT:
3014 strcat (buf, ", tomcat");
3015 break;
3016 }
1c877e87 3017 break;
ec2dfb42 3018
53c7db4b 3019 case EM_68K:
425c6cb0 3020 if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
76f57f3a 3021 strcat (buf, ", m68000");
425c6cb0 3022 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
3bdcfdf4
KH
3023 strcat (buf, ", cpu32");
3024 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
3025 strcat (buf, ", fido_a");
425c6cb0 3026 else
266abb8f 3027 {
2cf0635d
NC
3028 char const * isa = _("unknown");
3029 char const * mac = _("unknown mac");
3030 char const * additional = NULL;
0112cd26 3031
c694fd50 3032 switch (e_flags & EF_M68K_CF_ISA_MASK)
266abb8f 3033 {
c694fd50 3034 case EF_M68K_CF_ISA_A_NODIV:
0b2e31dc
NS
3035 isa = "A";
3036 additional = ", nodiv";
3037 break;
c694fd50 3038 case EF_M68K_CF_ISA_A:
266abb8f
NS
3039 isa = "A";
3040 break;
c694fd50 3041 case EF_M68K_CF_ISA_A_PLUS:
266abb8f
NS
3042 isa = "A+";
3043 break;
c694fd50 3044 case EF_M68K_CF_ISA_B_NOUSP:
0b2e31dc
NS
3045 isa = "B";
3046 additional = ", nousp";
3047 break;
c694fd50 3048 case EF_M68K_CF_ISA_B:
266abb8f
NS
3049 isa = "B";
3050 break;
f608cd77
NS
3051 case EF_M68K_CF_ISA_C:
3052 isa = "C";
3053 break;
3054 case EF_M68K_CF_ISA_C_NODIV:
3055 isa = "C";
3056 additional = ", nodiv";
3057 break;
266abb8f
NS
3058 }
3059 strcat (buf, ", cf, isa ");
3060 strcat (buf, isa);
0b2e31dc
NS
3061 if (additional)
3062 strcat (buf, additional);
c694fd50 3063 if (e_flags & EF_M68K_CF_FLOAT)
0b2e31dc 3064 strcat (buf, ", float");
c694fd50 3065 switch (e_flags & EF_M68K_CF_MAC_MASK)
266abb8f
NS
3066 {
3067 case 0:
3068 mac = NULL;
3069 break;
c694fd50 3070 case EF_M68K_CF_MAC:
266abb8f
NS
3071 mac = "mac";
3072 break;
c694fd50 3073 case EF_M68K_CF_EMAC:
266abb8f
NS
3074 mac = "emac";
3075 break;
f608cd77
NS
3076 case EF_M68K_CF_EMAC_B:
3077 mac = "emac_b";
3078 break;
266abb8f
NS
3079 }
3080 if (mac)
3081 {
3082 strcat (buf, ", ");
3083 strcat (buf, mac);
3084 }
266abb8f 3085 }
53c7db4b 3086 break;
33c63f9d 3087
153a2776
NC
3088 case EM_CYGNUS_MEP:
3089 switch (e_flags & EF_MEP_CPU_MASK)
3090 {
3091 case EF_MEP_CPU_MEP: strcat (buf, ", generic MeP"); break;
3092 case EF_MEP_CPU_C2: strcat (buf, ", MeP C2"); break;
3093 case EF_MEP_CPU_C3: strcat (buf, ", MeP C3"); break;
3094 case EF_MEP_CPU_C4: strcat (buf, ", MeP C4"); break;
3095 case EF_MEP_CPU_C5: strcat (buf, ", MeP C5"); break;
3096 case EF_MEP_CPU_H1: strcat (buf, ", MeP H1"); break;
3097 default: strcat (buf, _(", <unknown MeP cpu type>")); break;
3098 }
3099
3100 switch (e_flags & EF_MEP_COP_MASK)
3101 {
3102 case EF_MEP_COP_NONE: break;
3103 case EF_MEP_COP_AVC: strcat (buf, ", AVC coprocessor"); break;
3104 case EF_MEP_COP_AVC2: strcat (buf, ", AVC2 coprocessor"); break;
3105 case EF_MEP_COP_FMAX: strcat (buf, ", FMAX coprocessor"); break;
3106 case EF_MEP_COP_IVC2: strcat (buf, ", IVC2 coprocessor"); break;
3107 default: strcat (buf, _("<unknown MeP copro type>")); break;
3108 }
3109
3110 if (e_flags & EF_MEP_LIBRARY)
3111 strcat (buf, ", Built for Library");
3112
3113 if (e_flags & EF_MEP_INDEX_MASK)
3114 sprintf (buf + strlen (buf), ", Configuration Index: %#x",
3115 e_flags & EF_MEP_INDEX_MASK);
3116
3117 if (e_flags & ~ EF_MEP_ALL_FLAGS)
3118 sprintf (buf + strlen (buf), _(", unknown flags bits: %#x"),
3119 e_flags & ~ EF_MEP_ALL_FLAGS);
3120 break;
3121
252b5132
RH
3122 case EM_PPC:
3123 if (e_flags & EF_PPC_EMB)
3124 strcat (buf, ", emb");
3125
3126 if (e_flags & EF_PPC_RELOCATABLE)
2b692964 3127 strcat (buf, _(", relocatable"));
252b5132
RH
3128
3129 if (e_flags & EF_PPC_RELOCATABLE_LIB)
2b692964 3130 strcat (buf, _(", relocatable-lib"));
252b5132
RH
3131 break;
3132
ee67d69a
AM
3133 case EM_PPC64:
3134 if (e_flags & EF_PPC64_ABI)
3135 {
3136 char abi[] = ", abiv0";
3137
3138 abi[6] += e_flags & EF_PPC64_ABI;
3139 strcat (buf, abi);
3140 }
3141 break;
3142
708e2187
NC
3143 case EM_V800:
3144 if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
3145 strcat (buf, ", RH850 ABI");
0b4362b0 3146
708e2187
NC
3147 if (e_flags & EF_V800_850E3)
3148 strcat (buf, ", V3 architecture");
3149
3150 if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
3151 strcat (buf, ", FPU not used");
3152
3153 if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
3154 strcat (buf, ", regmode: COMMON");
3155
3156 if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
3157 strcat (buf, ", r4 not used");
3158
3159 if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
3160 strcat (buf, ", r30 not used");
3161
3162 if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
3163 strcat (buf, ", r5 not used");
3164
3165 if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
3166 strcat (buf, ", r2 not used");
3167
3168 for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
3169 {
3170 switch (e_flags & - e_flags)
3171 {
3172 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
3173 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
708e2187
NC
3174 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
3175 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
708e2187
NC
3176 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
3177 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
3178 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
3179 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
3180 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
3181 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
3182 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
3183 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
3184 default: break;
3185 }
3186 }
3187 break;
3188
2b0337b0 3189 case EM_V850:
252b5132
RH
3190 case EM_CYGNUS_V850:
3191 switch (e_flags & EF_V850_ARCH)
3192 {
78c8d46c
NC
3193 case E_V850E3V5_ARCH:
3194 strcat (buf, ", v850e3v5");
3195 break;
1cd986c5
NC
3196 case E_V850E2V3_ARCH:
3197 strcat (buf, ", v850e2v3");
3198 break;
3199 case E_V850E2_ARCH:
3200 strcat (buf, ", v850e2");
3201 break;
3202 case E_V850E1_ARCH:
3203 strcat (buf, ", v850e1");
8ad30312 3204 break;
252b5132
RH
3205 case E_V850E_ARCH:
3206 strcat (buf, ", v850e");
3207 break;
252b5132
RH
3208 case E_V850_ARCH:
3209 strcat (buf, ", v850");
3210 break;
3211 default:
2b692964 3212 strcat (buf, _(", unknown v850 architecture variant"));
252b5132
RH
3213 break;
3214 }
3215 break;
3216
2b0337b0 3217 case EM_M32R:
252b5132
RH
3218 case EM_CYGNUS_M32R:
3219 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3220 strcat (buf, ", m32r");
252b5132
RH
3221 break;
3222
3223 case EM_MIPS:
4fe85591 3224 case EM_MIPS_RS3_LE:
252b5132
RH
3225 if (e_flags & EF_MIPS_NOREORDER)
3226 strcat (buf, ", noreorder");
3227
3228 if (e_flags & EF_MIPS_PIC)
3229 strcat (buf, ", pic");
3230
3231 if (e_flags & EF_MIPS_CPIC)
3232 strcat (buf, ", cpic");
3233
d1bdd336
TS
3234 if (e_flags & EF_MIPS_UCODE)
3235 strcat (buf, ", ugen_reserved");
3236
252b5132
RH
3237 if (e_flags & EF_MIPS_ABI2)
3238 strcat (buf, ", abi2");
3239
43521d43
TS
3240 if (e_flags & EF_MIPS_OPTIONS_FIRST)
3241 strcat (buf, ", odk first");
3242
a5d22d2a
TS
3243 if (e_flags & EF_MIPS_32BITMODE)
3244 strcat (buf, ", 32bitmode");
3245
ba92f887
MR
3246 if (e_flags & EF_MIPS_NAN2008)
3247 strcat (buf, ", nan2008");
3248
fef1b0b3
SE
3249 if (e_flags & EF_MIPS_FP64)
3250 strcat (buf, ", fp64");
3251
156c2f8b
NC
3252 switch ((e_flags & EF_MIPS_MACH))
3253 {
3254 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3255 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3256 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
156c2f8b 3257 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
810dfa6e
L
3258 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3259 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3260 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3261 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
c6c98b38 3262 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
ebcb91b7 3263 case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
350cc38d
MS
3264 case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3265 case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
fd503541 3266 case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
05c6f050 3267 case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
67c2a3e8 3268 case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
d32e5c54 3269 case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
52b6b6b9 3270 case E_MIPS_MACH_XLR: strcat (buf, ", xlr"); break;
43521d43
TS
3271 case 0:
3272 /* We simply ignore the field in this case to avoid confusion:
3273 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3274 extension. */
3275 break;
2b692964 3276 default: strcat (buf, _(", unknown CPU")); break;
156c2f8b 3277 }
43521d43
TS
3278
3279 switch ((e_flags & EF_MIPS_ABI))
3280 {
3281 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3282 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3283 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3284 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3285 case 0:
3286 /* We simply ignore the field in this case to avoid confusion:
3287 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3288 This means it is likely to be an o32 file, but not for
3289 sure. */
3290 break;
2b692964 3291 default: strcat (buf, _(", unknown ABI")); break;
43521d43
TS
3292 }
3293
3294 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3295 strcat (buf, ", mdmx");
3296
3297 if (e_flags & EF_MIPS_ARCH_ASE_M16)
3298 strcat (buf, ", mips16");
3299
df58fc94
RS
3300 if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3301 strcat (buf, ", micromips");
3302
43521d43
TS
3303 switch ((e_flags & EF_MIPS_ARCH))
3304 {
3305 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3306 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3307 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3308 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3309 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3310 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
cb44e358 3311 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
7361da2c 3312 case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
43521d43 3313 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
5f74bc13 3314 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
7361da2c 3315 case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
2b692964 3316 default: strcat (buf, _(", unknown ISA")); break;
43521d43 3317 }
252b5132 3318 break;
351b4b40 3319
35c08157
KLC
3320 case EM_NDS32:
3321 decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3322 break;
3323
e23eba97
NC
3324 case EM_RISCV:
3325 if (e_flags & EF_RISCV_RVC)
3326 strcat (buf, ", RVC");
2922d21d
AW
3327
3328 switch (e_flags & EF_RISCV_FLOAT_ABI)
3329 {
3330 case EF_RISCV_FLOAT_ABI_SOFT:
3331 strcat (buf, ", soft-float ABI");
3332 break;
3333
3334 case EF_RISCV_FLOAT_ABI_SINGLE:
3335 strcat (buf, ", single-float ABI");
3336 break;
3337
3338 case EF_RISCV_FLOAT_ABI_DOUBLE:
3339 strcat (buf, ", double-float ABI");
3340 break;
3341
3342 case EF_RISCV_FLOAT_ABI_QUAD:
3343 strcat (buf, ", quad-float ABI");
3344 break;
3345 }
e23eba97
NC
3346 break;
3347
ccde1100
AO
3348 case EM_SH:
3349 switch ((e_flags & EF_SH_MACH_MASK))
3350 {
3351 case EF_SH1: strcat (buf, ", sh1"); break;
3352 case EF_SH2: strcat (buf, ", sh2"); break;
3353 case EF_SH3: strcat (buf, ", sh3"); break;
3354 case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3355 case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3356 case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3357 case EF_SH3E: strcat (buf, ", sh3e"); break;
3358 case EF_SH4: strcat (buf, ", sh4"); break;
3359 case EF_SH5: strcat (buf, ", sh5"); break;
3360 case EF_SH2E: strcat (buf, ", sh2e"); break;
3361 case EF_SH4A: strcat (buf, ", sh4a"); break;
1d70c7fb 3362 case EF_SH2A: strcat (buf, ", sh2a"); break;
ccde1100
AO
3363 case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3364 case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
1d70c7fb 3365 case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
0b92ab21
NH
3366 case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3367 case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3368 case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3369 case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3370 case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3371 case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
2b692964 3372 default: strcat (buf, _(", unknown ISA")); break;
ccde1100
AO
3373 }
3374
cec6a5b8
MR
3375 if (e_flags & EF_SH_PIC)
3376 strcat (buf, ", pic");
3377
3378 if (e_flags & EF_SH_FDPIC)
3379 strcat (buf, ", fdpic");
ccde1100 3380 break;
948f632f 3381
73589c9d
CS
3382 case EM_OR1K:
3383 if (e_flags & EF_OR1K_NODELAY)
3384 strcat (buf, ", no delay");
3385 break;
57346661 3386
351b4b40
RH
3387 case EM_SPARCV9:
3388 if (e_flags & EF_SPARC_32PLUS)
3389 strcat (buf, ", v8+");
3390
3391 if (e_flags & EF_SPARC_SUN_US1)
d07faca2
RH
3392 strcat (buf, ", ultrasparcI");
3393
3394 if (e_flags & EF_SPARC_SUN_US3)
3395 strcat (buf, ", ultrasparcIII");
351b4b40
RH
3396
3397 if (e_flags & EF_SPARC_HAL_R1)
3398 strcat (buf, ", halr1");
3399
3400 if (e_flags & EF_SPARC_LEDATA)
3401 strcat (buf, ", ledata");
3402
3403 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3404 strcat (buf, ", tso");
3405
3406 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3407 strcat (buf, ", pso");
3408
3409 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3410 strcat (buf, ", rmo");
3411 break;
7d466069 3412
103f02d3
UD
3413 case EM_PARISC:
3414 switch (e_flags & EF_PARISC_ARCH)
3415 {
3416 case EFA_PARISC_1_0:
3417 strcpy (buf, ", PA-RISC 1.0");
3418 break;
3419 case EFA_PARISC_1_1:
3420 strcpy (buf, ", PA-RISC 1.1");
3421 break;
3422 case EFA_PARISC_2_0:
3423 strcpy (buf, ", PA-RISC 2.0");
3424 break;
3425 default:
3426 break;
3427 }
3428 if (e_flags & EF_PARISC_TRAPNIL)
3429 strcat (buf, ", trapnil");
3430 if (e_flags & EF_PARISC_EXT)
3431 strcat (buf, ", ext");
3432 if (e_flags & EF_PARISC_LSB)
3433 strcat (buf, ", lsb");
3434 if (e_flags & EF_PARISC_WIDE)
3435 strcat (buf, ", wide");
3436 if (e_flags & EF_PARISC_NO_KABP)
3437 strcat (buf, ", no kabp");
3438 if (e_flags & EF_PARISC_LAZYSWAP)
3439 strcat (buf, ", lazyswap");
30800947 3440 break;
76da6bbe 3441
7d466069 3442 case EM_PJ:
2b0337b0 3443 case EM_PJ_OLD:
7d466069
ILT
3444 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3445 strcat (buf, ", new calling convention");
3446
3447 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3448 strcat (buf, ", gnu calling convention");
3449 break;
4d6ed7c8
NC
3450
3451 case EM_IA_64:
3452 if ((e_flags & EF_IA_64_ABI64))
3453 strcat (buf, ", 64-bit");
3454 else
3455 strcat (buf, ", 32-bit");
3456 if ((e_flags & EF_IA_64_REDUCEDFP))
3457 strcat (buf, ", reduced fp model");
3458 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3459 strcat (buf, ", no function descriptors, constant gp");
3460 else if ((e_flags & EF_IA_64_CONS_GP))
3461 strcat (buf, ", constant gp");
3462 if ((e_flags & EF_IA_64_ABSOLUTE))
3463 strcat (buf, ", absolute");
28f997cf
TG
3464 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3465 {
3466 if ((e_flags & EF_IA_64_VMS_LINKAGES))
3467 strcat (buf, ", vms_linkages");
3468 switch ((e_flags & EF_IA_64_VMS_COMCOD))
3469 {
3470 case EF_IA_64_VMS_COMCOD_SUCCESS:
3471 break;
3472 case EF_IA_64_VMS_COMCOD_WARNING:
3473 strcat (buf, ", warning");
3474 break;
3475 case EF_IA_64_VMS_COMCOD_ERROR:
3476 strcat (buf, ", error");
3477 break;
3478 case EF_IA_64_VMS_COMCOD_ABORT:
3479 strcat (buf, ", abort");
3480 break;
3481 default:
bee0ee85
NC
3482 warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3483 e_flags & EF_IA_64_VMS_COMCOD);
3484 strcat (buf, ", <unknown>");
28f997cf
TG
3485 }
3486 }
4d6ed7c8 3487 break;
179d3252
JT
3488
3489 case EM_VAX:
3490 if ((e_flags & EF_VAX_NONPIC))
3491 strcat (buf, ", non-PIC");
3492 if ((e_flags & EF_VAX_DFLOAT))
3493 strcat (buf, ", D-Float");
3494 if ((e_flags & EF_VAX_GFLOAT))
3495 strcat (buf, ", G-Float");
3496 break;
c7927a3c 3497
619ed720
EB
3498 case EM_VISIUM:
3499 if (e_flags & EF_VISIUM_ARCH_MCM)
3500 strcat (buf, ", mcm");
3501 else if (e_flags & EF_VISIUM_ARCH_MCM24)
3502 strcat (buf, ", mcm24");
3503 if (e_flags & EF_VISIUM_ARCH_GR6)
3504 strcat (buf, ", gr6");
3505 break;
3506
4046d87a 3507 case EM_RL78:
1740ba0c
NC
3508 switch (e_flags & E_FLAG_RL78_CPU_MASK)
3509 {
3510 case E_FLAG_RL78_ANY_CPU: break;
3511 case E_FLAG_RL78_G10: strcat (buf, ", G10"); break;
3512 case E_FLAG_RL78_G13: strcat (buf, ", G13"); break;
3513 case E_FLAG_RL78_G14: strcat (buf, ", G14"); break;
3514 }
856ea05c
KP
3515 if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3516 strcat (buf, ", 64-bit doubles");
4046d87a 3517 break;
0b4362b0 3518
c7927a3c
NC
3519 case EM_RX:
3520 if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3521 strcat (buf, ", 64-bit doubles");
3522 if (e_flags & E_FLAG_RX_DSP)
dd24e3da 3523 strcat (buf, ", dsp");
d4cb0ea0 3524 if (e_flags & E_FLAG_RX_PID)
0b4362b0 3525 strcat (buf, ", pid");
708e2187
NC
3526 if (e_flags & E_FLAG_RX_ABI)
3527 strcat (buf, ", RX ABI");
3525236c
NC
3528 if (e_flags & E_FLAG_RX_SINSNS_SET)
3529 strcat (buf, e_flags & E_FLAG_RX_SINSNS_YES
3530 ? ", uses String instructions" : ", bans String instructions");
a117b0a5
YS
3531 if (e_flags & E_FLAG_RX_V2)
3532 strcat (buf, ", V2");
d4cb0ea0 3533 break;
55786da2
AK
3534
3535 case EM_S390:
3536 if (e_flags & EF_S390_HIGH_GPRS)
3537 strcat (buf, ", highgprs");
d4cb0ea0 3538 break;
40b36596
JM
3539
3540 case EM_TI_C6000:
3541 if ((e_flags & EF_C6000_REL))
3542 strcat (buf, ", relocatable module");
d4cb0ea0 3543 break;
13761a11
NC
3544
3545 case EM_MSP430:
3546 strcat (buf, _(": architecture variant: "));
3547 switch (e_flags & EF_MSP430_MACH)
3548 {
3549 case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3550 case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3551 case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3552 case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3553 case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3554 case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3555 case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3556 case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3557 case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3558 case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3559 case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3560 case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3561 case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3562 case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3563 case E_MSP430_MACH_MSP430X : strcat (buf, "MSP430X"); break;
3564 default:
3565 strcat (buf, _(": unknown")); break;
3566 }
3567
3568 if (e_flags & ~ EF_MSP430_MACH)
3569 strcat (buf, _(": unknown extra flag bits also present"));
252b5132
RH
3570 }
3571 }
3572
3573 return buf;
3574}
3575
252b5132 3576static const char *
d3ba0551
AM
3577get_osabi_name (unsigned int osabi)
3578{
3579 static char buff[32];
3580
3581 switch (osabi)
3582 {
3583 case ELFOSABI_NONE: return "UNIX - System V";
3584 case ELFOSABI_HPUX: return "UNIX - HP-UX";
3585 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
9c55345c 3586 case ELFOSABI_GNU: return "UNIX - GNU";
d3ba0551
AM
3587 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
3588 case ELFOSABI_AIX: return "UNIX - AIX";
3589 case ELFOSABI_IRIX: return "UNIX - IRIX";
3590 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
3591 case ELFOSABI_TRU64: return "UNIX - TRU64";
3592 case ELFOSABI_MODESTO: return "Novell - Modesto";
3593 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
3594 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
3595 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
3b26c801 3596 case ELFOSABI_AROS: return "AROS";
11636f9e 3597 case ELFOSABI_FENIXOS: return "FenixOS";
6d913794
NC
3598 case ELFOSABI_CLOUDABI: return "Nuxi CloudABI";
3599 case ELFOSABI_OPENVOS: return "Stratus Technologies OpenVOS";
d3ba0551 3600 default:
40b36596
JM
3601 if (osabi >= 64)
3602 switch (elf_header.e_machine)
3603 {
3604 case EM_ARM:
3605 switch (osabi)
3606 {
3607 case ELFOSABI_ARM: return "ARM";
3608 default:
3609 break;
3610 }
3611 break;
3612
3613 case EM_MSP430:
3614 case EM_MSP430_OLD:
619ed720 3615 case EM_VISIUM:
40b36596
JM
3616 switch (osabi)
3617 {
3618 case ELFOSABI_STANDALONE: return _("Standalone App");
3619 default:
3620 break;
3621 }
3622 break;
3623
3624 case EM_TI_C6000:
3625 switch (osabi)
3626 {
3627 case ELFOSABI_C6000_ELFABI: return _("Bare-metal C6000");
3628 case ELFOSABI_C6000_LINUX: return "Linux C6000";
3629 default:
3630 break;
3631 }
3632 break;
3633
3634 default:
3635 break;
3636 }
e9e44622 3637 snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
d3ba0551
AM
3638 return buff;
3639 }
3640}
3641
a06ea964
NC
3642static const char *
3643get_aarch64_segment_type (unsigned long type)
3644{
3645 switch (type)
3646 {
3647 case PT_AARCH64_ARCHEXT:
3648 return "AARCH64_ARCHEXT";
3649 default:
3650 break;
3651 }
3652
3653 return NULL;
3654}
3655
b294bdf8
MM
3656static const char *
3657get_arm_segment_type (unsigned long type)
3658{
3659 switch (type)
3660 {
3661 case PT_ARM_EXIDX:
3662 return "EXIDX";
3663 default:
3664 break;
3665 }
3666
3667 return NULL;
3668}
3669
d3ba0551
AM
3670static const char *
3671get_mips_segment_type (unsigned long type)
252b5132
RH
3672{
3673 switch (type)
3674 {
3675 case PT_MIPS_REGINFO:
3676 return "REGINFO";
3677 case PT_MIPS_RTPROC:
3678 return "RTPROC";
3679 case PT_MIPS_OPTIONS:
3680 return "OPTIONS";
351cdf24
MF
3681 case PT_MIPS_ABIFLAGS:
3682 return "ABIFLAGS";
252b5132
RH
3683 default:
3684 break;
3685 }
3686
3687 return NULL;
3688}
3689
103f02d3 3690static const char *
d3ba0551 3691get_parisc_segment_type (unsigned long type)
103f02d3
UD
3692{
3693 switch (type)
3694 {
3695 case PT_HP_TLS: return "HP_TLS";
3696 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
3697 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
3698 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
3699 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
3700 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
3701 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
3702 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
3703 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
3704 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
3705 case PT_HP_PARALLEL: return "HP_PARALLEL";
3706 case PT_HP_FASTBIND: return "HP_FASTBIND";
eec8f817
DA
3707 case PT_HP_OPT_ANNOT: return "HP_OPT_ANNOT";
3708 case PT_HP_HSL_ANNOT: return "HP_HSL_ANNOT";
3709 case PT_HP_STACK: return "HP_STACK";
3710 case PT_HP_CORE_UTSNAME: return "HP_CORE_UTSNAME";
103f02d3
UD
3711 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
3712 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
61472819 3713 case PT_PARISC_WEAKORDER: return "PARISC_WEAKORDER";
103f02d3
UD
3714 default:
3715 break;
3716 }
3717
3718 return NULL;
3719}
3720
4d6ed7c8 3721static const char *
d3ba0551 3722get_ia64_segment_type (unsigned long type)
4d6ed7c8
NC
3723{
3724 switch (type)
3725 {
3726 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
3727 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
00428cca
AM
3728 case PT_HP_TLS: return "HP_TLS";
3729 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
3730 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
3731 case PT_IA_64_HP_STACK: return "HP_STACK";
4d6ed7c8
NC
3732 default:
3733 break;
3734 }
3735
3736 return NULL;
3737}
3738
40b36596
JM
3739static const char *
3740get_tic6x_segment_type (unsigned long type)
3741{
3742 switch (type)
3743 {
3744 case PT_C6000_PHATTR: return "C6000_PHATTR";
3745 default:
3746 break;
3747 }
3748
3749 return NULL;
3750}
3751
5522f910
NC
3752static const char *
3753get_solaris_segment_type (unsigned long type)
3754{
3755 switch (type)
3756 {
3757 case 0x6464e550: return "PT_SUNW_UNWIND";
3758 case 0x6474e550: return "PT_SUNW_EH_FRAME";
3759 case 0x6ffffff7: return "PT_LOSUNW";
3760 case 0x6ffffffa: return "PT_SUNWBSS";
3761 case 0x6ffffffb: return "PT_SUNWSTACK";
3762 case 0x6ffffffc: return "PT_SUNWDTRACE";
3763 case 0x6ffffffd: return "PT_SUNWCAP";
3764 case 0x6fffffff: return "PT_HISUNW";
3765 default: return NULL;
3766 }
3767}
3768
252b5132 3769static const char *
d3ba0551 3770get_segment_type (unsigned long p_type)
252b5132 3771{
b34976b6 3772 static char buff[32];
252b5132
RH
3773
3774 switch (p_type)
3775 {
b34976b6
AM
3776 case PT_NULL: return "NULL";
3777 case PT_LOAD: return "LOAD";
252b5132 3778 case PT_DYNAMIC: return "DYNAMIC";
b34976b6
AM
3779 case PT_INTERP: return "INTERP";
3780 case PT_NOTE: return "NOTE";
3781 case PT_SHLIB: return "SHLIB";
3782 case PT_PHDR: return "PHDR";
13ae64f3 3783 case PT_TLS: return "TLS";
252b5132 3784
65765700
JJ
3785 case PT_GNU_EH_FRAME:
3786 return "GNU_EH_FRAME";
2b05f1b7 3787 case PT_GNU_STACK: return "GNU_STACK";
8c37241b 3788 case PT_GNU_RELRO: return "GNU_RELRO";
65765700 3789
252b5132
RH
3790 default:
3791 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3792 {
2cf0635d 3793 const char * result;
103f02d3 3794
252b5132
RH
3795 switch (elf_header.e_machine)
3796 {
a06ea964
NC
3797 case EM_AARCH64:
3798 result = get_aarch64_segment_type (p_type);
3799 break;
b294bdf8
MM
3800 case EM_ARM:
3801 result = get_arm_segment_type (p_type);
3802 break;
252b5132 3803 case EM_MIPS:
4fe85591 3804 case EM_MIPS_RS3_LE:
252b5132
RH
3805 result = get_mips_segment_type (p_type);
3806 break;
103f02d3
UD
3807 case EM_PARISC:
3808 result = get_parisc_segment_type (p_type);
3809 break;
4d6ed7c8
NC
3810 case EM_IA_64:
3811 result = get_ia64_segment_type (p_type);
3812 break;
40b36596
JM
3813 case EM_TI_C6000:
3814 result = get_tic6x_segment_type (p_type);
3815 break;
252b5132
RH
3816 default:
3817 result = NULL;
3818 break;
3819 }
103f02d3 3820
252b5132
RH
3821 if (result != NULL)
3822 return result;
103f02d3 3823
1a9ccd70 3824 sprintf (buff, "LOPROC+%#lx", p_type - PT_LOPROC);
252b5132
RH
3825 }
3826 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
103f02d3 3827 {
2cf0635d 3828 const char * result;
103f02d3
UD
3829
3830 switch (elf_header.e_machine)
3831 {
3832 case EM_PARISC:
3833 result = get_parisc_segment_type (p_type);
3834 break;
00428cca
AM
3835 case EM_IA_64:
3836 result = get_ia64_segment_type (p_type);
3837 break;
103f02d3 3838 default:
5522f910
NC
3839 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
3840 result = get_solaris_segment_type (p_type);
3841 else
3842 result = NULL;
103f02d3
UD
3843 break;
3844 }
3845
3846 if (result != NULL)
3847 return result;
3848
1a9ccd70 3849 sprintf (buff, "LOOS+%#lx", p_type - PT_LOOS);
103f02d3 3850 }
252b5132 3851 else
e9e44622 3852 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
252b5132
RH
3853
3854 return buff;
3855 }
3856}
3857
3858static const char *
d3ba0551 3859get_mips_section_type_name (unsigned int sh_type)
252b5132
RH
3860{
3861 switch (sh_type)
3862 {
b34976b6
AM
3863 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
3864 case SHT_MIPS_MSYM: return "MIPS_MSYM";
3865 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
3866 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
3867 case SHT_MIPS_UCODE: return "MIPS_UCODE";
3868 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
3869 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
3870 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
3871 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
3872 case SHT_MIPS_RELD: return "MIPS_RELD";
3873 case SHT_MIPS_IFACE: return "MIPS_IFACE";
3874 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
3875 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
3876 case SHT_MIPS_SHDR: return "MIPS_SHDR";
3877 case SHT_MIPS_FDESC: return "MIPS_FDESC";
3878 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
3879 case SHT_MIPS_DENSE: return "MIPS_DENSE";
3880 case SHT_MIPS_PDESC: return "MIPS_PDESC";
3881 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
3882 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
3883 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
3884 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
3885 case SHT_MIPS_LINE: return "MIPS_LINE";
3886 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
3887 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
3888 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
3889 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
3890 case SHT_MIPS_DWARF: return "MIPS_DWARF";
3891 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
3892 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
3893 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
3894 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
3895 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
3896 case SHT_MIPS_XLATE: return "MIPS_XLATE";
3897 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
3898 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
3899 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
3900 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
252b5132 3901 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
351cdf24 3902 case SHT_MIPS_ABIFLAGS: return "MIPS_ABIFLAGS";
252b5132
RH
3903 default:
3904 break;
3905 }
3906 return NULL;
3907}
3908
103f02d3 3909static const char *
d3ba0551 3910get_parisc_section_type_name (unsigned int sh_type)
103f02d3
UD
3911{
3912 switch (sh_type)
3913 {
3914 case SHT_PARISC_EXT: return "PARISC_EXT";
3915 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
3916 case SHT_PARISC_DOC: return "PARISC_DOC";
eec8f817
DA
3917 case SHT_PARISC_ANNOT: return "PARISC_ANNOT";
3918 case SHT_PARISC_SYMEXTN: return "PARISC_SYMEXTN";
3919 case SHT_PARISC_STUBS: return "PARISC_STUBS";
61472819 3920 case SHT_PARISC_DLKM: return "PARISC_DLKM";
103f02d3
UD
3921 default:
3922 break;
3923 }
3924 return NULL;
3925}
3926
4d6ed7c8 3927static const char *
d3ba0551 3928get_ia64_section_type_name (unsigned int sh_type)
4d6ed7c8 3929{
18bd398b 3930 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
ecc51f48
NC
3931 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
3932 return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
0de14b54 3933
4d6ed7c8
NC
3934 switch (sh_type)
3935 {
148b93f2
NC
3936 case SHT_IA_64_EXT: return "IA_64_EXT";
3937 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
3938 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
3939 case SHT_IA_64_VMS_TRACE: return "VMS_TRACE";
3940 case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
3941 case SHT_IA_64_VMS_DEBUG: return "VMS_DEBUG";
3942 case SHT_IA_64_VMS_DEBUG_STR: return "VMS_DEBUG_STR";
3943 case SHT_IA_64_VMS_LINKAGES: return "VMS_LINKAGES";
3944 case SHT_IA_64_VMS_SYMBOL_VECTOR: return "VMS_SYMBOL_VECTOR";
3945 case SHT_IA_64_VMS_FIXUP: return "VMS_FIXUP";
4d6ed7c8
NC
3946 default:
3947 break;
3948 }
3949 return NULL;
3950}
3951
d2b2c203
DJ
3952static const char *
3953get_x86_64_section_type_name (unsigned int sh_type)
3954{
3955 switch (sh_type)
3956 {
3957 case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
3958 default:
3959 break;
3960 }
3961 return NULL;
3962}
3963
a06ea964
NC
3964static const char *
3965get_aarch64_section_type_name (unsigned int sh_type)
3966{
3967 switch (sh_type)
3968 {
3969 case SHT_AARCH64_ATTRIBUTES:
3970 return "AARCH64_ATTRIBUTES";
3971 default:
3972 break;
3973 }
3974 return NULL;
3975}
3976
40a18ebd
NC
3977static const char *
3978get_arm_section_type_name (unsigned int sh_type)
3979{
3980 switch (sh_type)
3981 {
7f6fed87
NC
3982 case SHT_ARM_EXIDX: return "ARM_EXIDX";
3983 case SHT_ARM_PREEMPTMAP: return "ARM_PREEMPTMAP";
3984 case SHT_ARM_ATTRIBUTES: return "ARM_ATTRIBUTES";
3985 case SHT_ARM_DEBUGOVERLAY: return "ARM_DEBUGOVERLAY";
3986 case SHT_ARM_OVERLAYSECTION: return "ARM_OVERLAYSECTION";
40a18ebd
NC
3987 default:
3988 break;
3989 }
3990 return NULL;
3991}
3992
40b36596
JM
3993static const char *
3994get_tic6x_section_type_name (unsigned int sh_type)
3995{
3996 switch (sh_type)
3997 {
3998 case SHT_C6000_UNWIND:
3999 return "C6000_UNWIND";
4000 case SHT_C6000_PREEMPTMAP:
4001 return "C6000_PREEMPTMAP";
4002 case SHT_C6000_ATTRIBUTES:
4003 return "C6000_ATTRIBUTES";
4004 case SHT_TI_ICODE:
4005 return "TI_ICODE";
4006 case SHT_TI_XREF:
4007 return "TI_XREF";
4008 case SHT_TI_HANDLER:
4009 return "TI_HANDLER";
4010 case SHT_TI_INITINFO:
4011 return "TI_INITINFO";
4012 case SHT_TI_PHATTRS:
4013 return "TI_PHATTRS";
4014 default:
4015 break;
4016 }
4017 return NULL;
4018}
4019
13761a11
NC
4020static const char *
4021get_msp430x_section_type_name (unsigned int sh_type)
4022{
4023 switch (sh_type)
4024 {
4025 case SHT_MSP430_SEC_FLAGS: return "MSP430_SEC_FLAGS";
4026 case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
4027 case SHT_MSP430_ATTRIBUTES: return "MSP430_ATTRIBUTES";
4028 default: return NULL;
4029 }
4030}
4031
685080f2
NC
4032static const char *
4033get_v850_section_type_name (unsigned int sh_type)
4034{
4035 switch (sh_type)
4036 {
4037 case SHT_V850_SCOMMON: return "V850 Small Common";
4038 case SHT_V850_TCOMMON: return "V850 Tiny Common";
4039 case SHT_V850_ZCOMMON: return "V850 Zero Common";
4040 case SHT_RENESAS_IOP: return "RENESAS IOP";
4041 case SHT_RENESAS_INFO: return "RENESAS INFO";
4042 default: return NULL;
4043 }
4044}
4045
252b5132 4046static const char *
d3ba0551 4047get_section_type_name (unsigned int sh_type)
252b5132 4048{
b34976b6 4049 static char buff[32];
9fb71ee4 4050 const char * result;
252b5132
RH
4051
4052 switch (sh_type)
4053 {
4054 case SHT_NULL: return "NULL";
4055 case SHT_PROGBITS: return "PROGBITS";
4056 case SHT_SYMTAB: return "SYMTAB";
4057 case SHT_STRTAB: return "STRTAB";
4058 case SHT_RELA: return "RELA";
4059 case SHT_HASH: return "HASH";
4060 case SHT_DYNAMIC: return "DYNAMIC";
4061 case SHT_NOTE: return "NOTE";
4062 case SHT_NOBITS: return "NOBITS";
4063 case SHT_REL: return "REL";
4064 case SHT_SHLIB: return "SHLIB";
4065 case SHT_DYNSYM: return "DYNSYM";
d1133906
NC
4066 case SHT_INIT_ARRAY: return "INIT_ARRAY";
4067 case SHT_FINI_ARRAY: return "FINI_ARRAY";
4068 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
fdc90cb4 4069 case SHT_GNU_HASH: return "GNU_HASH";
93ebe586
NC
4070 case SHT_GROUP: return "GROUP";
4071 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
252b5132
RH
4072 case SHT_GNU_verdef: return "VERDEF";
4073 case SHT_GNU_verneed: return "VERNEED";
4074 case SHT_GNU_versym: return "VERSYM";
b34976b6
AM
4075 case 0x6ffffff0: return "VERSYM";
4076 case 0x6ffffffc: return "VERDEF";
252b5132
RH
4077 case 0x7ffffffd: return "AUXILIARY";
4078 case 0x7fffffff: return "FILTER";
047b2264 4079 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
252b5132
RH
4080
4081 default:
4082 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
4083 {
252b5132
RH
4084 switch (elf_header.e_machine)
4085 {
4086 case EM_MIPS:
4fe85591 4087 case EM_MIPS_RS3_LE:
252b5132
RH
4088 result = get_mips_section_type_name (sh_type);
4089 break;
103f02d3
UD
4090 case EM_PARISC:
4091 result = get_parisc_section_type_name (sh_type);
4092 break;
4d6ed7c8
NC
4093 case EM_IA_64:
4094 result = get_ia64_section_type_name (sh_type);
4095 break;
d2b2c203 4096 case EM_X86_64:
8a9036a4 4097 case EM_L1OM:
7a9068fe 4098 case EM_K1OM:
d2b2c203
DJ
4099 result = get_x86_64_section_type_name (sh_type);
4100 break;
a06ea964
NC
4101 case EM_AARCH64:
4102 result = get_aarch64_section_type_name (sh_type);
4103 break;
40a18ebd
NC
4104 case EM_ARM:
4105 result = get_arm_section_type_name (sh_type);
4106 break;
40b36596
JM
4107 case EM_TI_C6000:
4108 result = get_tic6x_section_type_name (sh_type);
4109 break;
13761a11
NC
4110 case EM_MSP430:
4111 result = get_msp430x_section_type_name (sh_type);
4112 break;
685080f2
NC
4113 case EM_V800:
4114 case EM_V850:
4115 case EM_CYGNUS_V850:
4116 result = get_v850_section_type_name (sh_type);
4117 break;
252b5132
RH
4118 default:
4119 result = NULL;
4120 break;
4121 }
4122
4123 if (result != NULL)
4124 return result;
4125
9fb71ee4 4126 sprintf (buff, "LOPROC+%#x", sh_type - SHT_LOPROC);
252b5132
RH
4127 }
4128 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
148b93f2 4129 {
148b93f2
NC
4130 switch (elf_header.e_machine)
4131 {
4132 case EM_IA_64:
4133 result = get_ia64_section_type_name (sh_type);
4134 break;
4135 default:
fd85a6a1
NC
4136 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
4137 result = get_solaris_section_type (sh_type);
4138 else
4139 result = NULL;
148b93f2
NC
4140 break;
4141 }
4142
4143 if (result != NULL)
4144 return result;
4145
9fb71ee4 4146 sprintf (buff, "LOOS+%#x", sh_type - SHT_LOOS);
148b93f2 4147 }
252b5132 4148 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
685080f2
NC
4149 {
4150 switch (elf_header.e_machine)
4151 {
4152 case EM_V800:
4153 case EM_V850:
4154 case EM_CYGNUS_V850:
9fb71ee4 4155 result = get_v850_section_type_name (sh_type);
a9fb83be 4156 break;
685080f2 4157 default:
9fb71ee4 4158 result = NULL;
685080f2
NC
4159 break;
4160 }
4161
9fb71ee4
NC
4162 if (result != NULL)
4163 return result;
4164
4165 sprintf (buff, "LOUSER+%#x", sh_type - SHT_LOUSER);
685080f2 4166 }
252b5132 4167 else
a7dbfd1c
NC
4168 /* This message is probably going to be displayed in a 15
4169 character wide field, so put the hex value first. */
4170 snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
103f02d3 4171
252b5132
RH
4172 return buff;
4173 }
4174}
4175
2979dc34 4176#define OPTION_DEBUG_DUMP 512
2c610e4b 4177#define OPTION_DYN_SYMS 513
fd2f0033
TT
4178#define OPTION_DWARF_DEPTH 514
4179#define OPTION_DWARF_START 515
4723351a 4180#define OPTION_DWARF_CHECK 516
2979dc34 4181
85b1c36d 4182static struct option options[] =
252b5132 4183{
b34976b6 4184 {"all", no_argument, 0, 'a'},
252b5132
RH
4185 {"file-header", no_argument, 0, 'h'},
4186 {"program-headers", no_argument, 0, 'l'},
b34976b6
AM
4187 {"headers", no_argument, 0, 'e'},
4188 {"histogram", no_argument, 0, 'I'},
4189 {"segments", no_argument, 0, 'l'},
4190 {"sections", no_argument, 0, 'S'},
252b5132 4191 {"section-headers", no_argument, 0, 'S'},
f5842774 4192 {"section-groups", no_argument, 0, 'g'},
5477e8a0 4193 {"section-details", no_argument, 0, 't'},
595cf52e 4194 {"full-section-name",no_argument, 0, 'N'},
b34976b6
AM
4195 {"symbols", no_argument, 0, 's'},
4196 {"syms", no_argument, 0, 's'},
2c610e4b 4197 {"dyn-syms", no_argument, 0, OPTION_DYN_SYMS},
b34976b6
AM
4198 {"relocs", no_argument, 0, 'r'},
4199 {"notes", no_argument, 0, 'n'},
4200 {"dynamic", no_argument, 0, 'd'},
a952a375 4201 {"arch-specific", no_argument, 0, 'A'},
252b5132
RH
4202 {"version-info", no_argument, 0, 'V'},
4203 {"use-dynamic", no_argument, 0, 'D'},
09c11c86 4204 {"unwind", no_argument, 0, 'u'},
4145f1d5 4205 {"archive-index", no_argument, 0, 'c'},
b34976b6 4206 {"hex-dump", required_argument, 0, 'x'},
cf13d699 4207 {"relocated-dump", required_argument, 0, 'R'},
09c11c86 4208 {"string-dump", required_argument, 0, 'p'},
0e602686 4209 {"decompress", no_argument, 0, 'z'},
252b5132
RH
4210#ifdef SUPPORT_DISASSEMBLY
4211 {"instruction-dump", required_argument, 0, 'i'},
4212#endif
cf13d699 4213 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
252b5132 4214
fd2f0033
TT
4215 {"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH},
4216 {"dwarf-start", required_argument, 0, OPTION_DWARF_START},
4723351a 4217 {"dwarf-check", no_argument, 0, OPTION_DWARF_CHECK},
fd2f0033 4218
b34976b6
AM
4219 {"version", no_argument, 0, 'v'},
4220 {"wide", no_argument, 0, 'W'},
4221 {"help", no_argument, 0, 'H'},
4222 {0, no_argument, 0, 0}
252b5132
RH
4223};
4224
4225static void
2cf0635d 4226usage (FILE * stream)
252b5132 4227{
92f01d61
JM
4228 fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
4229 fprintf (stream, _(" Display information about the contents of ELF format files\n"));
4230 fprintf (stream, _(" Options are:\n\
8b53311e
NC
4231 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4232 -h --file-header Display the ELF file header\n\
4233 -l --program-headers Display the program headers\n\
4234 --segments An alias for --program-headers\n\
4235 -S --section-headers Display the sections' header\n\
4236 --sections An alias for --section-headers\n\
f5842774 4237 -g --section-groups Display the section groups\n\
5477e8a0 4238 -t --section-details Display the section details\n\
8b53311e
NC
4239 -e --headers Equivalent to: -h -l -S\n\
4240 -s --syms Display the symbol table\n\
3f08eb35 4241 --symbols An alias for --syms\n\
2c610e4b 4242 --dyn-syms Display the dynamic symbol table\n\
8b53311e
NC
4243 -n --notes Display the core notes (if present)\n\
4244 -r --relocs Display the relocations (if present)\n\
4245 -u --unwind Display the unwind info (if present)\n\
b2d38a17 4246 -d --dynamic Display the dynamic section (if present)\n\
8b53311e 4247 -V --version-info Display the version sections (if present)\n\
1b31d05e 4248 -A --arch-specific Display architecture specific information (if any)\n\
4145f1d5 4249 -c --archive-index Display the symbol/file index in an archive\n\
8b53311e 4250 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
09c11c86
NC
4251 -x --hex-dump=<number|name>\n\
4252 Dump the contents of section <number|name> as bytes\n\
4253 -p --string-dump=<number|name>\n\
4254 Dump the contents of section <number|name> as strings\n\
cf13d699
NC
4255 -R --relocated-dump=<number|name>\n\
4256 Dump the contents of section <number|name> as relocated bytes\n\
0e602686 4257 -z --decompress Decompress section before dumping it\n\
f9f0e732 4258 -w[lLiaprmfFsoRt] or\n\
1ed06042 4259 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
6f875884 4260 =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
657d0d47
CC
4261 =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4262 =addr,=cu_index]\n\
8b53311e 4263 Display the contents of DWARF2 debug sections\n"));
fd2f0033
TT
4264 fprintf (stream, _("\
4265 --dwarf-depth=N Do not display DIEs at depth N or greater\n\
4266 --dwarf-start=N Display DIEs starting with N, at the same depth\n\
4267 or deeper\n"));
252b5132 4268#ifdef SUPPORT_DISASSEMBLY
92f01d61 4269 fprintf (stream, _("\
09c11c86
NC
4270 -i --instruction-dump=<number|name>\n\
4271 Disassemble the contents of section <number|name>\n"));
252b5132 4272#endif
92f01d61 4273 fprintf (stream, _("\
8b53311e
NC
4274 -I --histogram Display histogram of bucket list lengths\n\
4275 -W --wide Allow output width to exceed 80 characters\n\
07012eee 4276 @<file> Read options from <file>\n\
8b53311e
NC
4277 -H --help Display this information\n\
4278 -v --version Display the version number of readelf\n"));
1118d252 4279
92f01d61
JM
4280 if (REPORT_BUGS_TO[0] && stream == stdout)
4281 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
252b5132 4282
92f01d61 4283 exit (stream == stdout ? 0 : 1);
252b5132
RH
4284}
4285
18bd398b
NC
4286/* Record the fact that the user wants the contents of section number
4287 SECTION to be displayed using the method(s) encoded as flags bits
4288 in TYPE. Note, TYPE can be zero if we are creating the array for
4289 the first time. */
4290
252b5132 4291static void
09c11c86 4292request_dump_bynumber (unsigned int section, dump_type type)
252b5132
RH
4293{
4294 if (section >= num_dump_sects)
4295 {
2cf0635d 4296 dump_type * new_dump_sects;
252b5132 4297
3f5e193b
NC
4298 new_dump_sects = (dump_type *) calloc (section + 1,
4299 sizeof (* dump_sects));
252b5132
RH
4300
4301 if (new_dump_sects == NULL)
591a748a 4302 error (_("Out of memory allocating dump request table.\n"));
252b5132
RH
4303 else
4304 {
21b65bac
NC
4305 if (dump_sects)
4306 {
4307 /* Copy current flag settings. */
4308 memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
252b5132 4309
21b65bac
NC
4310 free (dump_sects);
4311 }
252b5132
RH
4312
4313 dump_sects = new_dump_sects;
4314 num_dump_sects = section + 1;
4315 }
4316 }
4317
4318 if (dump_sects)
b34976b6 4319 dump_sects[section] |= type;
252b5132
RH
4320
4321 return;
4322}
4323
aef1f6d0
DJ
4324/* Request a dump by section name. */
4325
4326static void
2cf0635d 4327request_dump_byname (const char * section, dump_type type)
aef1f6d0 4328{
2cf0635d 4329 struct dump_list_entry * new_request;
aef1f6d0 4330
3f5e193b
NC
4331 new_request = (struct dump_list_entry *)
4332 malloc (sizeof (struct dump_list_entry));
aef1f6d0 4333 if (!new_request)
591a748a 4334 error (_("Out of memory allocating dump request table.\n"));
aef1f6d0
DJ
4335
4336 new_request->name = strdup (section);
4337 if (!new_request->name)
591a748a 4338 error (_("Out of memory allocating dump request table.\n"));
aef1f6d0
DJ
4339
4340 new_request->type = type;
4341
4342 new_request->next = dump_sects_byname;
4343 dump_sects_byname = new_request;
4344}
4345
cf13d699
NC
4346static inline void
4347request_dump (dump_type type)
4348{
4349 int section;
4350 char * cp;
4351
4352 do_dump++;
4353 section = strtoul (optarg, & cp, 0);
4354
4355 if (! *cp && section >= 0)
4356 request_dump_bynumber (section, type);
4357 else
4358 request_dump_byname (optarg, type);
4359}
4360
4361
252b5132 4362static void
2cf0635d 4363parse_args (int argc, char ** argv)
252b5132
RH
4364{
4365 int c;
4366
4367 if (argc < 2)
92f01d61 4368 usage (stderr);
252b5132
RH
4369
4370 while ((c = getopt_long
0e602686 4371 (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
252b5132 4372 {
252b5132
RH
4373 switch (c)
4374 {
4375 case 0:
4376 /* Long options. */
4377 break;
4378 case 'H':
92f01d61 4379 usage (stdout);
252b5132
RH
4380 break;
4381
4382 case 'a':
b34976b6
AM
4383 do_syms++;
4384 do_reloc++;
4385 do_unwind++;
4386 do_dynamic++;
4387 do_header++;
4388 do_sections++;
f5842774 4389 do_section_groups++;
b34976b6
AM
4390 do_segments++;
4391 do_version++;
4392 do_histogram++;
4393 do_arch++;
4394 do_notes++;
252b5132 4395 break;
f5842774
L
4396 case 'g':
4397 do_section_groups++;
4398 break;
5477e8a0 4399 case 't':
595cf52e 4400 case 'N':
5477e8a0
L
4401 do_sections++;
4402 do_section_details++;
595cf52e 4403 break;
252b5132 4404 case 'e':
b34976b6
AM
4405 do_header++;
4406 do_sections++;
4407 do_segments++;
252b5132 4408 break;
a952a375 4409 case 'A':
b34976b6 4410 do_arch++;
a952a375 4411 break;
252b5132 4412 case 'D':
b34976b6 4413 do_using_dynamic++;
252b5132
RH
4414 break;
4415 case 'r':
b34976b6 4416 do_reloc++;
252b5132 4417 break;
4d6ed7c8 4418 case 'u':
b34976b6 4419 do_unwind++;
4d6ed7c8 4420 break;
252b5132 4421 case 'h':
b34976b6 4422 do_header++;
252b5132
RH
4423 break;
4424 case 'l':
b34976b6 4425 do_segments++;
252b5132
RH
4426 break;
4427 case 's':
b34976b6 4428 do_syms++;
252b5132
RH
4429 break;
4430 case 'S':
b34976b6 4431 do_sections++;
252b5132
RH
4432 break;
4433 case 'd':
b34976b6 4434 do_dynamic++;
252b5132 4435 break;
a952a375 4436 case 'I':
b34976b6 4437 do_histogram++;
a952a375 4438 break;
779fe533 4439 case 'n':
b34976b6 4440 do_notes++;
779fe533 4441 break;
4145f1d5
NC
4442 case 'c':
4443 do_archive_index++;
4444 break;
252b5132 4445 case 'x':
cf13d699 4446 request_dump (HEX_DUMP);
aef1f6d0 4447 break;
09c11c86 4448 case 'p':
cf13d699
NC
4449 request_dump (STRING_DUMP);
4450 break;
4451 case 'R':
4452 request_dump (RELOC_DUMP);
09c11c86 4453 break;
0e602686
NC
4454 case 'z':
4455 decompress_dumps++;
4456 break;
252b5132 4457 case 'w':
b34976b6 4458 do_dump++;
252b5132 4459 if (optarg == 0)
613ff48b
CC
4460 {
4461 do_debugging = 1;
4462 dwarf_select_sections_all ();
4463 }
252b5132
RH
4464 else
4465 {
4466 do_debugging = 0;
4cb93e3b 4467 dwarf_select_sections_by_letters (optarg);
252b5132
RH
4468 }
4469 break;
2979dc34 4470 case OPTION_DEBUG_DUMP:
b34976b6 4471 do_dump++;
2979dc34
JJ
4472 if (optarg == 0)
4473 do_debugging = 1;
4474 else
4475 {
2979dc34 4476 do_debugging = 0;
4cb93e3b 4477 dwarf_select_sections_by_names (optarg);
2979dc34
JJ
4478 }
4479 break;
fd2f0033
TT
4480 case OPTION_DWARF_DEPTH:
4481 {
4482 char *cp;
4483
4484 dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4485 }
4486 break;
4487 case OPTION_DWARF_START:
4488 {
4489 char *cp;
4490
4491 dwarf_start_die = strtoul (optarg, & cp, 0);
4492 }
4493 break;
4723351a
CC
4494 case OPTION_DWARF_CHECK:
4495 dwarf_check = 1;
4496 break;
2c610e4b
L
4497 case OPTION_DYN_SYMS:
4498 do_dyn_syms++;
4499 break;
252b5132
RH
4500#ifdef SUPPORT_DISASSEMBLY
4501 case 'i':
cf13d699
NC
4502 request_dump (DISASS_DUMP);
4503 break;
252b5132
RH
4504#endif
4505 case 'v':
4506 print_version (program_name);
4507 break;
4508 case 'V':
b34976b6 4509 do_version++;
252b5132 4510 break;
d974e256 4511 case 'W':
b34976b6 4512 do_wide++;
d974e256 4513 break;
252b5132 4514 default:
252b5132
RH
4515 /* xgettext:c-format */
4516 error (_("Invalid option '-%c'\n"), c);
1a0670f3 4517 /* Fall through. */
252b5132 4518 case '?':
92f01d61 4519 usage (stderr);
252b5132
RH
4520 }
4521 }
4522
4d6ed7c8 4523 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
252b5132 4524 && !do_segments && !do_header && !do_dump && !do_version
f5842774 4525 && !do_histogram && !do_debugging && !do_arch && !do_notes
2c610e4b
L
4526 && !do_section_groups && !do_archive_index
4527 && !do_dyn_syms)
92f01d61 4528 usage (stderr);
252b5132
RH
4529}
4530
4531static const char *
d3ba0551 4532get_elf_class (unsigned int elf_class)
252b5132 4533{
b34976b6 4534 static char buff[32];
103f02d3 4535
252b5132
RH
4536 switch (elf_class)
4537 {
4538 case ELFCLASSNONE: return _("none");
e3c8793a
NC
4539 case ELFCLASS32: return "ELF32";
4540 case ELFCLASS64: return "ELF64";
ab5e7794 4541 default:
e9e44622 4542 snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
ab5e7794 4543 return buff;
252b5132
RH
4544 }
4545}
4546
4547static const char *
d3ba0551 4548get_data_encoding (unsigned int encoding)
252b5132 4549{
b34976b6 4550 static char buff[32];
103f02d3 4551
252b5132
RH
4552 switch (encoding)
4553 {
4554 case ELFDATANONE: return _("none");
33c63f9d
CM
4555 case ELFDATA2LSB: return _("2's complement, little endian");
4556 case ELFDATA2MSB: return _("2's complement, big endian");
103f02d3 4557 default:
e9e44622 4558 snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
ab5e7794 4559 return buff;
252b5132
RH
4560 }
4561}
4562
252b5132 4563/* Decode the data held in 'elf_header'. */
ee42cf8c 4564
252b5132 4565static int
d3ba0551 4566process_file_header (void)
252b5132 4567{
b34976b6
AM
4568 if ( elf_header.e_ident[EI_MAG0] != ELFMAG0
4569 || elf_header.e_ident[EI_MAG1] != ELFMAG1
4570 || elf_header.e_ident[EI_MAG2] != ELFMAG2
4571 || elf_header.e_ident[EI_MAG3] != ELFMAG3)
252b5132
RH
4572 {
4573 error
4574 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4575 return 0;
4576 }
4577
2dc4cec1
L
4578 init_dwarf_regnames (elf_header.e_machine);
4579
252b5132
RH
4580 if (do_header)
4581 {
4582 int i;
4583
4584 printf (_("ELF Header:\n"));
4585 printf (_(" Magic: "));
b34976b6
AM
4586 for (i = 0; i < EI_NIDENT; i++)
4587 printf ("%2.2x ", elf_header.e_ident[i]);
252b5132
RH
4588 printf ("\n");
4589 printf (_(" Class: %s\n"),
b34976b6 4590 get_elf_class (elf_header.e_ident[EI_CLASS]));
252b5132 4591 printf (_(" Data: %s\n"),
b34976b6 4592 get_data_encoding (elf_header.e_ident[EI_DATA]));
252b5132 4593 printf (_(" Version: %d %s\n"),
b34976b6
AM
4594 elf_header.e_ident[EI_VERSION],
4595 (elf_header.e_ident[EI_VERSION] == EV_CURRENT
789be9f7 4596 ? "(current)"
b34976b6 4597 : (elf_header.e_ident[EI_VERSION] != EV_NONE
2b692964 4598 ? _("<unknown: %lx>")
789be9f7 4599 : "")));
252b5132 4600 printf (_(" OS/ABI: %s\n"),
b34976b6 4601 get_osabi_name (elf_header.e_ident[EI_OSABI]));
252b5132 4602 printf (_(" ABI Version: %d\n"),
b34976b6 4603 elf_header.e_ident[EI_ABIVERSION]);
252b5132
RH
4604 printf (_(" Type: %s\n"),
4605 get_file_type (elf_header.e_type));
4606 printf (_(" Machine: %s\n"),
4607 get_machine_name (elf_header.e_machine));
4608 printf (_(" Version: 0x%lx\n"),
4609 (unsigned long) elf_header.e_version);
76da6bbe 4610
f7a99963
NC
4611 printf (_(" Entry point address: "));
4612 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4613 printf (_("\n Start of program headers: "));
4614 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4615 printf (_(" (bytes into file)\n Start of section headers: "));
4616 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
4617 printf (_(" (bytes into file)\n"));
76da6bbe 4618
252b5132
RH
4619 printf (_(" Flags: 0x%lx%s\n"),
4620 (unsigned long) elf_header.e_flags,
4621 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
4622 printf (_(" Size of this header: %ld (bytes)\n"),
4623 (long) elf_header.e_ehsize);
4624 printf (_(" Size of program headers: %ld (bytes)\n"),
4625 (long) elf_header.e_phentsize);
2046a35d 4626 printf (_(" Number of program headers: %ld"),
252b5132 4627 (long) elf_header.e_phnum);
2046a35d
AM
4628 if (section_headers != NULL
4629 && elf_header.e_phnum == PN_XNUM
4630 && section_headers[0].sh_info != 0)
cc5914eb 4631 printf (" (%ld)", (long) section_headers[0].sh_info);
2046a35d 4632 putc ('\n', stdout);
252b5132
RH
4633 printf (_(" Size of section headers: %ld (bytes)\n"),
4634 (long) elf_header.e_shentsize);
560f3c1c 4635 printf (_(" Number of section headers: %ld"),
252b5132 4636 (long) elf_header.e_shnum);
4fbb74a6 4637 if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
560f3c1c
AM
4638 printf (" (%ld)", (long) section_headers[0].sh_size);
4639 putc ('\n', stdout);
4640 printf (_(" Section header string table index: %ld"),
252b5132 4641 (long) elf_header.e_shstrndx);
4fbb74a6
AM
4642 if (section_headers != NULL
4643 && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
72de5009 4644 printf (" (%u)", section_headers[0].sh_link);
15ba6505
AM
4645 else if (elf_header.e_shstrndx != SHN_UNDEF
4646 && elf_header.e_shstrndx >= elf_header.e_shnum)
2b692964 4647 printf (_(" <corrupt: out of range>"));
560f3c1c
AM
4648 putc ('\n', stdout);
4649 }
4650
4651 if (section_headers != NULL)
4652 {
2046a35d
AM
4653 if (elf_header.e_phnum == PN_XNUM
4654 && section_headers[0].sh_info != 0)
4655 elf_header.e_phnum = section_headers[0].sh_info;
4fbb74a6 4656 if (elf_header.e_shnum == SHN_UNDEF)
560f3c1c 4657 elf_header.e_shnum = section_headers[0].sh_size;
4fbb74a6 4658 if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
560f3c1c 4659 elf_header.e_shstrndx = section_headers[0].sh_link;
4fbb74a6 4660 else if (elf_header.e_shstrndx >= elf_header.e_shnum)
0b49d371 4661 elf_header.e_shstrndx = SHN_UNDEF;
560f3c1c
AM
4662 free (section_headers);
4663 section_headers = NULL;
252b5132 4664 }
103f02d3 4665
9ea033b2
NC
4666 return 1;
4667}
4668
e0a31db1 4669static bfd_boolean
91d6fa6a 4670get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
9ea033b2 4671{
2cf0635d
NC
4672 Elf32_External_Phdr * phdrs;
4673 Elf32_External_Phdr * external;
4674 Elf_Internal_Phdr * internal;
b34976b6 4675 unsigned int i;
e0a31db1
NC
4676 unsigned int size = elf_header.e_phentsize;
4677 unsigned int num = elf_header.e_phnum;
4678
4679 /* PR binutils/17531: Cope with unexpected section header sizes. */
4680 if (size == 0 || num == 0)
4681 return FALSE;
4682 if (size < sizeof * phdrs)
4683 {
4684 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4685 return FALSE;
4686 }
4687 if (size > sizeof * phdrs)
4688 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
103f02d3 4689
3f5e193b 4690 phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
e0a31db1
NC
4691 size, num, _("program headers"));
4692 if (phdrs == NULL)
4693 return FALSE;
9ea033b2 4694
91d6fa6a 4695 for (i = 0, internal = pheaders, external = phdrs;
9ea033b2 4696 i < elf_header.e_phnum;
b34976b6 4697 i++, internal++, external++)
252b5132 4698 {
9ea033b2
NC
4699 internal->p_type = BYTE_GET (external->p_type);
4700 internal->p_offset = BYTE_GET (external->p_offset);
4701 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4702 internal->p_paddr = BYTE_GET (external->p_paddr);
4703 internal->p_filesz = BYTE_GET (external->p_filesz);
4704 internal->p_memsz = BYTE_GET (external->p_memsz);
4705 internal->p_flags = BYTE_GET (external->p_flags);
4706 internal->p_align = BYTE_GET (external->p_align);
252b5132
RH
4707 }
4708
9ea033b2 4709 free (phdrs);
e0a31db1 4710 return TRUE;
252b5132
RH
4711}
4712
e0a31db1 4713static bfd_boolean
91d6fa6a 4714get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
9ea033b2 4715{
2cf0635d
NC
4716 Elf64_External_Phdr * phdrs;
4717 Elf64_External_Phdr * external;
4718 Elf_Internal_Phdr * internal;
b34976b6 4719 unsigned int i;
e0a31db1
NC
4720 unsigned int size = elf_header.e_phentsize;
4721 unsigned int num = elf_header.e_phnum;
4722
4723 /* PR binutils/17531: Cope with unexpected section header sizes. */
4724 if (size == 0 || num == 0)
4725 return FALSE;
4726 if (size < sizeof * phdrs)
4727 {
4728 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4729 return FALSE;
4730 }
4731 if (size > sizeof * phdrs)
4732 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
103f02d3 4733
3f5e193b 4734 phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
e0a31db1 4735 size, num, _("program headers"));
a6e9f9df 4736 if (!phdrs)
e0a31db1 4737 return FALSE;
9ea033b2 4738
91d6fa6a 4739 for (i = 0, internal = pheaders, external = phdrs;
9ea033b2 4740 i < elf_header.e_phnum;
b34976b6 4741 i++, internal++, external++)
9ea033b2
NC
4742 {
4743 internal->p_type = BYTE_GET (external->p_type);
4744 internal->p_flags = BYTE_GET (external->p_flags);
66543521
AM
4745 internal->p_offset = BYTE_GET (external->p_offset);
4746 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4747 internal->p_paddr = BYTE_GET (external->p_paddr);
4748 internal->p_filesz = BYTE_GET (external->p_filesz);
4749 internal->p_memsz = BYTE_GET (external->p_memsz);
4750 internal->p_align = BYTE_GET (external->p_align);
9ea033b2
NC
4751 }
4752
4753 free (phdrs);
e0a31db1 4754 return TRUE;
9ea033b2 4755}
252b5132 4756
d93f0186
NC
4757/* Returns 1 if the program headers were read into `program_headers'. */
4758
4759static int
2cf0635d 4760get_program_headers (FILE * file)
d93f0186 4761{
2cf0635d 4762 Elf_Internal_Phdr * phdrs;
d93f0186
NC
4763
4764 /* Check cache of prior read. */
4765 if (program_headers != NULL)
4766 return 1;
4767
3f5e193b
NC
4768 phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
4769 sizeof (Elf_Internal_Phdr));
d93f0186
NC
4770
4771 if (phdrs == NULL)
4772 {
8b73c356
NC
4773 error (_("Out of memory reading %u program headers\n"),
4774 elf_header.e_phnum);
d93f0186
NC
4775 return 0;
4776 }
4777
4778 if (is_32bit_elf
4779 ? get_32bit_program_headers (file, phdrs)
4780 : get_64bit_program_headers (file, phdrs))
4781 {
4782 program_headers = phdrs;
4783 return 1;
4784 }
4785
4786 free (phdrs);
4787 return 0;
4788}
4789
2f62977e
NC
4790/* Returns 1 if the program headers were loaded. */
4791
252b5132 4792static int
2cf0635d 4793process_program_headers (FILE * file)
252b5132 4794{
2cf0635d 4795 Elf_Internal_Phdr * segment;
b34976b6 4796 unsigned int i;
1a9ccd70 4797 Elf_Internal_Phdr * previous_load = NULL;
252b5132
RH
4798
4799 if (elf_header.e_phnum == 0)
4800 {
82f2dbf7
NC
4801 /* PR binutils/12467. */
4802 if (elf_header.e_phoff != 0)
4803 warn (_("possibly corrupt ELF header - it has a non-zero program"
9035ed51 4804 " header offset, but no program headers\n"));
82f2dbf7 4805 else if (do_segments)
252b5132 4806 printf (_("\nThere are no program headers in this file.\n"));
2f62977e 4807 return 0;
252b5132
RH
4808 }
4809
4810 if (do_segments && !do_header)
4811 {
f7a99963
NC
4812 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
4813 printf (_("Entry point "));
4814 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4815 printf (_("\nThere are %d program headers, starting at offset "),
4816 elf_header.e_phnum);
4817 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4818 printf ("\n");
252b5132
RH
4819 }
4820
d93f0186 4821 if (! get_program_headers (file))
252b5132 4822 return 0;
103f02d3 4823
252b5132
RH
4824 if (do_segments)
4825 {
3a1a2036
NC
4826 if (elf_header.e_phnum > 1)
4827 printf (_("\nProgram Headers:\n"));
4828 else
4829 printf (_("\nProgram Headers:\n"));
76da6bbe 4830
f7a99963
NC
4831 if (is_32bit_elf)
4832 printf
4833 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
d974e256
JJ
4834 else if (do_wide)
4835 printf
4836 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
f7a99963
NC
4837 else
4838 {
4839 printf
4840 (_(" Type Offset VirtAddr PhysAddr\n"));
4841 printf
4842 (_(" FileSiz MemSiz Flags Align\n"));
4843 }
252b5132
RH
4844 }
4845
252b5132 4846 dynamic_addr = 0;
1b228002 4847 dynamic_size = 0;
252b5132
RH
4848
4849 for (i = 0, segment = program_headers;
4850 i < elf_header.e_phnum;
b34976b6 4851 i++, segment++)
252b5132
RH
4852 {
4853 if (do_segments)
4854 {
103f02d3 4855 printf (" %-14.14s ", get_segment_type (segment->p_type));
f7a99963
NC
4856
4857 if (is_32bit_elf)
4858 {
4859 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4860 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
4861 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
4862 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
4863 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
4864 printf ("%c%c%c ",
4865 (segment->p_flags & PF_R ? 'R' : ' '),
4866 (segment->p_flags & PF_W ? 'W' : ' '),
4867 (segment->p_flags & PF_X ? 'E' : ' '));
4868 printf ("%#lx", (unsigned long) segment->p_align);
4869 }
d974e256
JJ
4870 else if (do_wide)
4871 {
4872 if ((unsigned long) segment->p_offset == segment->p_offset)
4873 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4874 else
4875 {
4876 print_vma (segment->p_offset, FULL_HEX);
4877 putchar (' ');
4878 }
4879
4880 print_vma (segment->p_vaddr, FULL_HEX);
4881 putchar (' ');
4882 print_vma (segment->p_paddr, FULL_HEX);
4883 putchar (' ');
4884
4885 if ((unsigned long) segment->p_filesz == segment->p_filesz)
4886 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
4887 else
4888 {
4889 print_vma (segment->p_filesz, FULL_HEX);
4890 putchar (' ');
4891 }
4892
4893 if ((unsigned long) segment->p_memsz == segment->p_memsz)
4894 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
4895 else
4896 {
f48e6c45 4897 print_vma (segment->p_memsz, FULL_HEX);
d974e256
JJ
4898 }
4899
4900 printf (" %c%c%c ",
4901 (segment->p_flags & PF_R ? 'R' : ' '),
4902 (segment->p_flags & PF_W ? 'W' : ' '),
4903 (segment->p_flags & PF_X ? 'E' : ' '));
4904
4905 if ((unsigned long) segment->p_align == segment->p_align)
4906 printf ("%#lx", (unsigned long) segment->p_align);
4907 else
4908 {
4909 print_vma (segment->p_align, PREFIX_HEX);
4910 }
4911 }
f7a99963
NC
4912 else
4913 {
4914 print_vma (segment->p_offset, FULL_HEX);
4915 putchar (' ');
4916 print_vma (segment->p_vaddr, FULL_HEX);
4917 putchar (' ');
4918 print_vma (segment->p_paddr, FULL_HEX);
4919 printf ("\n ");
4920 print_vma (segment->p_filesz, FULL_HEX);
4921 putchar (' ');
4922 print_vma (segment->p_memsz, FULL_HEX);
4923 printf (" %c%c%c ",
4924 (segment->p_flags & PF_R ? 'R' : ' '),
4925 (segment->p_flags & PF_W ? 'W' : ' '),
4926 (segment->p_flags & PF_X ? 'E' : ' '));
1d262527 4927 print_vma (segment->p_align, PREFIX_HEX);
f7a99963 4928 }
252b5132 4929
1a9ccd70
NC
4930 putc ('\n', stdout);
4931 }
f54498b4 4932
252b5132
RH
4933 switch (segment->p_type)
4934 {
1a9ccd70 4935 case PT_LOAD:
502d895c
NC
4936#if 0 /* Do not warn about out of order PT_LOAD segments. Although officially
4937 required by the ELF standard, several programs, including the Linux
4938 kernel, make use of non-ordered segments. */
1a9ccd70
NC
4939 if (previous_load
4940 && previous_load->p_vaddr > segment->p_vaddr)
4941 error (_("LOAD segments must be sorted in order of increasing VirtAddr\n"));
502d895c 4942#endif
1a9ccd70
NC
4943 if (segment->p_memsz < segment->p_filesz)
4944 error (_("the segment's file size is larger than its memory size\n"));
4945 previous_load = segment;
4946 break;
4947
4948 case PT_PHDR:
4949 /* PR 20815 - Verify that the program header is loaded into memory. */
4950 if (i > 0 && previous_load != NULL)
4951 error (_("the PHDR segment must occur before any LOAD segment\n"));
4952 if (elf_header.e_machine != EM_PARISC)
4953 {
4954 unsigned int j;
4955
4956 for (j = 1; j < elf_header.e_phnum; j++)
4957 if (program_headers[j].p_vaddr <= segment->p_vaddr
4958 && (program_headers[j].p_vaddr + program_headers[j].p_memsz)
4959 >= (segment->p_vaddr + segment->p_filesz))
4960 break;
4961 if (j == elf_header.e_phnum)
4962 error (_("the PHDR segment is not covered by a LOAD segment\n"));
4963 }
4964 break;
4965
252b5132
RH
4966 case PT_DYNAMIC:
4967 if (dynamic_addr)
4968 error (_("more than one dynamic segment\n"));
4969
20737c13
AM
4970 /* By default, assume that the .dynamic section is the first
4971 section in the DYNAMIC segment. */
4972 dynamic_addr = segment->p_offset;
4973 dynamic_size = segment->p_filesz;
f54498b4
NC
4974 /* PR binutils/17512: Avoid corrupt dynamic section info in the segment. */
4975 if (dynamic_addr + dynamic_size >= current_file_size)
4976 {
4977 error (_("the dynamic segment offset + size exceeds the size of the file\n"));
4978 dynamic_addr = dynamic_size = 0;
4979 }
20737c13 4980
b2d38a17
NC
4981 /* Try to locate the .dynamic section. If there is
4982 a section header table, we can easily locate it. */
4983 if (section_headers != NULL)
4984 {
2cf0635d 4985 Elf_Internal_Shdr * sec;
b2d38a17 4986
89fac5e3
RS
4987 sec = find_section (".dynamic");
4988 if (sec == NULL || sec->sh_size == 0)
b2d38a17 4989 {
28f997cf
TG
4990 /* A corresponding .dynamic section is expected, but on
4991 IA-64/OpenVMS it is OK for it to be missing. */
4992 if (!is_ia64_vms ())
4993 error (_("no .dynamic section in the dynamic segment\n"));
b2d38a17
NC
4994 break;
4995 }
4996
42bb2e33 4997 if (sec->sh_type == SHT_NOBITS)
20737c13
AM
4998 {
4999 dynamic_size = 0;
5000 break;
5001 }
42bb2e33 5002
b2d38a17
NC
5003 dynamic_addr = sec->sh_offset;
5004 dynamic_size = sec->sh_size;
5005
5006 if (dynamic_addr < segment->p_offset
5007 || dynamic_addr > segment->p_offset + segment->p_filesz)
20737c13
AM
5008 warn (_("the .dynamic section is not contained"
5009 " within the dynamic segment\n"));
b2d38a17 5010 else if (dynamic_addr > segment->p_offset)
20737c13
AM
5011 warn (_("the .dynamic section is not the first section"
5012 " in the dynamic segment.\n"));
b2d38a17 5013 }
252b5132
RH
5014 break;
5015
5016 case PT_INTERP:
fb52b2f4
NC
5017 if (fseek (file, archive_file_offset + (long) segment->p_offset,
5018 SEEK_SET))
252b5132
RH
5019 error (_("Unable to find program interpreter name\n"));
5020 else
5021 {
f8eae8b2 5022 char fmt [32];
9495b2e6 5023 int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
f8eae8b2
L
5024
5025 if (ret >= (int) sizeof (fmt) || ret < 0)
591a748a 5026 error (_("Internal error: failed to create format string to display program interpreter\n"));
f8eae8b2 5027
252b5132 5028 program_interpreter[0] = 0;
7bd7b3ef
AM
5029 if (fscanf (file, fmt, program_interpreter) <= 0)
5030 error (_("Unable to read program interpreter name\n"));
252b5132
RH
5031
5032 if (do_segments)
f54498b4 5033 printf (_(" [Requesting program interpreter: %s]\n"),
252b5132
RH
5034 program_interpreter);
5035 }
5036 break;
5037 }
252b5132
RH
5038 }
5039
c256ffe7 5040 if (do_segments && section_headers != NULL && string_table != NULL)
252b5132
RH
5041 {
5042 printf (_("\n Section to Segment mapping:\n"));
5043 printf (_(" Segment Sections...\n"));
5044
252b5132
RH
5045 for (i = 0; i < elf_header.e_phnum; i++)
5046 {
9ad5cbcf 5047 unsigned int j;
2cf0635d 5048 Elf_Internal_Shdr * section;
252b5132
RH
5049
5050 segment = program_headers + i;
b391a3e3 5051 section = section_headers + 1;
252b5132
RH
5052
5053 printf (" %2.2d ", i);
5054
b34976b6 5055 for (j = 1; j < elf_header.e_shnum; j++, section++)
252b5132 5056 {
f4638467
AM
5057 if (!ELF_TBSS_SPECIAL (section, segment)
5058 && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
74e1a04b 5059 printf ("%s ", printable_section_name (section));
252b5132
RH
5060 }
5061
5062 putc ('\n',stdout);
5063 }
5064 }
5065
252b5132
RH
5066 return 1;
5067}
5068
5069
d93f0186
NC
5070/* Find the file offset corresponding to VMA by using the program headers. */
5071
5072static long
2cf0635d 5073offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
d93f0186 5074{
2cf0635d 5075 Elf_Internal_Phdr * seg;
d93f0186
NC
5076
5077 if (! get_program_headers (file))
5078 {
5079 warn (_("Cannot interpret virtual addresses without program headers.\n"));
5080 return (long) vma;
5081 }
5082
5083 for (seg = program_headers;
5084 seg < program_headers + elf_header.e_phnum;
5085 ++seg)
5086 {
5087 if (seg->p_type != PT_LOAD)
5088 continue;
5089
5090 if (vma >= (seg->p_vaddr & -seg->p_align)
5091 && vma + size <= seg->p_vaddr + seg->p_filesz)
5092 return vma - seg->p_vaddr + seg->p_offset;
5093 }
5094
5095 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
0af1713e 5096 (unsigned long) vma);
d93f0186
NC
5097 return (long) vma;
5098}
5099
5100
049b0c3a
NC
5101/* Allocate memory and load the sections headers into the global pointer
5102 SECTION_HEADERS. If PROBE is true, this is just a probe and we do not
5103 generate any error messages if the load fails. */
5104
5105static bfd_boolean
5106get_32bit_section_headers (FILE * file, bfd_boolean probe)
252b5132 5107{
2cf0635d
NC
5108 Elf32_External_Shdr * shdrs;
5109 Elf_Internal_Shdr * internal;
b34976b6 5110 unsigned int i;
049b0c3a
NC
5111 unsigned int size = elf_header.e_shentsize;
5112 unsigned int num = probe ? 1 : elf_header.e_shnum;
5113
5114 /* PR binutils/17531: Cope with unexpected section header sizes. */
5115 if (size == 0 || num == 0)
5116 return FALSE;
5117 if (size < sizeof * shdrs)
5118 {
5119 if (! probe)
5120 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5121 return FALSE;
5122 }
5123 if (!probe && size > sizeof * shdrs)
5124 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
252b5132 5125
3f5e193b 5126 shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
049b0c3a
NC
5127 size, num,
5128 probe ? NULL : _("section headers"));
5129 if (shdrs == NULL)
5130 return FALSE;
252b5132 5131
049b0c3a
NC
5132 if (section_headers != NULL)
5133 free (section_headers);
3f5e193b
NC
5134 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
5135 sizeof (Elf_Internal_Shdr));
252b5132
RH
5136 if (section_headers == NULL)
5137 {
049b0c3a 5138 if (!probe)
8b73c356 5139 error (_("Out of memory reading %u section headers\n"), num);
049b0c3a 5140 return FALSE;
252b5132
RH
5141 }
5142
5143 for (i = 0, internal = section_headers;
560f3c1c 5144 i < num;
b34976b6 5145 i++, internal++)
252b5132
RH
5146 {
5147 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5148 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
5149 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5150 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5151 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5152 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5153 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5154 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5155 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5156 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
315350be
NC
5157 if (!probe && internal->sh_link > num)
5158 warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5159 if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5160 warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
252b5132
RH
5161 }
5162
5163 free (shdrs);
049b0c3a 5164 return TRUE;
252b5132
RH
5165}
5166
049b0c3a
NC
5167static bfd_boolean
5168get_64bit_section_headers (FILE * file, bfd_boolean probe)
9ea033b2 5169{
2cf0635d
NC
5170 Elf64_External_Shdr * shdrs;
5171 Elf_Internal_Shdr * internal;
b34976b6 5172 unsigned int i;
049b0c3a
NC
5173 unsigned int size = elf_header.e_shentsize;
5174 unsigned int num = probe ? 1 : elf_header.e_shnum;
5175
5176 /* PR binutils/17531: Cope with unexpected section header sizes. */
5177 if (size == 0 || num == 0)
5178 return FALSE;
5179 if (size < sizeof * shdrs)
5180 {
5181 if (! probe)
5182 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5183 return FALSE;
5184 }
5185 if (! probe && size > sizeof * shdrs)
5186 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
9ea033b2 5187
3f5e193b 5188 shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
049b0c3a
NC
5189 size, num,
5190 probe ? NULL : _("section headers"));
5191 if (shdrs == NULL)
5192 return FALSE;
9ea033b2 5193
049b0c3a
NC
5194 if (section_headers != NULL)
5195 free (section_headers);
3f5e193b
NC
5196 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
5197 sizeof (Elf_Internal_Shdr));
9ea033b2
NC
5198 if (section_headers == NULL)
5199 {
049b0c3a 5200 if (! probe)
8b73c356 5201 error (_("Out of memory reading %u section headers\n"), num);
049b0c3a 5202 return FALSE;
9ea033b2
NC
5203 }
5204
5205 for (i = 0, internal = section_headers;
560f3c1c 5206 i < num;
b34976b6 5207 i++, internal++)
9ea033b2
NC
5208 {
5209 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5210 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
66543521
AM
5211 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5212 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5213 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5214 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
9ea033b2
NC
5215 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5216 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5217 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5218 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
315350be
NC
5219 if (!probe && internal->sh_link > num)
5220 warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5221 if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5222 warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
9ea033b2
NC
5223 }
5224
5225 free (shdrs);
049b0c3a 5226 return TRUE;
9ea033b2
NC
5227}
5228
252b5132 5229static Elf_Internal_Sym *
ba5cdace
NC
5230get_32bit_elf_symbols (FILE * file,
5231 Elf_Internal_Shdr * section,
5232 unsigned long * num_syms_return)
252b5132 5233{
ba5cdace 5234 unsigned long number = 0;
dd24e3da 5235 Elf32_External_Sym * esyms = NULL;
ba5cdace 5236 Elf_External_Sym_Shndx * shndx = NULL;
dd24e3da 5237 Elf_Internal_Sym * isyms = NULL;
2cf0635d 5238 Elf_Internal_Sym * psym;
b34976b6 5239 unsigned int j;
252b5132 5240
c9c1d674
EG
5241 if (section->sh_size == 0)
5242 {
5243 if (num_syms_return != NULL)
5244 * num_syms_return = 0;
5245 return NULL;
5246 }
5247
dd24e3da 5248 /* Run some sanity checks first. */
c9c1d674 5249 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
dd24e3da 5250 {
c9c1d674
EG
5251 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5252 printable_section_name (section), (unsigned long) section->sh_entsize);
ba5cdace 5253 goto exit_point;
dd24e3da
NC
5254 }
5255
f54498b4
NC
5256 if (section->sh_size > current_file_size)
5257 {
5258 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
74e1a04b 5259 printable_section_name (section), (unsigned long) section->sh_size);
f54498b4
NC
5260 goto exit_point;
5261 }
5262
dd24e3da
NC
5263 number = section->sh_size / section->sh_entsize;
5264
5265 if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
5266 {
c9c1d674 5267 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
8066deb1
AM
5268 (unsigned long) section->sh_size,
5269 printable_section_name (section),
5270 (unsigned long) section->sh_entsize);
ba5cdace 5271 goto exit_point;
dd24e3da
NC
5272 }
5273
3f5e193b
NC
5274 esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5275 section->sh_size, _("symbols"));
dd24e3da 5276 if (esyms == NULL)
ba5cdace 5277 goto exit_point;
252b5132 5278
6a40cf0c
NC
5279 {
5280 elf_section_list * entry;
5281
5282 shndx = NULL;
5283 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5284 if (entry->hdr->sh_link == (unsigned long) (section - section_headers))
c9c1d674 5285 {
6a40cf0c
NC
5286 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5287 entry->hdr->sh_offset,
5288 1, entry->hdr->sh_size,
5289 _("symbol table section indicies"));
5290 if (shndx == NULL)
5291 goto exit_point;
5292 /* PR17531: file: heap-buffer-overflow */
5293 else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5294 {
5295 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5296 printable_section_name (entry->hdr),
5297 (unsigned long) entry->hdr->sh_size,
5298 (unsigned long) section->sh_size);
5299 goto exit_point;
5300 }
c9c1d674 5301 }
6a40cf0c 5302 }
9ad5cbcf 5303
3f5e193b 5304 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
252b5132
RH
5305
5306 if (isyms == NULL)
5307 {
8b73c356
NC
5308 error (_("Out of memory reading %lu symbols\n"),
5309 (unsigned long) number);
dd24e3da 5310 goto exit_point;
252b5132
RH
5311 }
5312
dd24e3da 5313 for (j = 0, psym = isyms; j < number; j++, psym++)
252b5132
RH
5314 {
5315 psym->st_name = BYTE_GET (esyms[j].st_name);
5316 psym->st_value = BYTE_GET (esyms[j].st_value);
5317 psym->st_size = BYTE_GET (esyms[j].st_size);
5318 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4fbb74a6 5319 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
9ad5cbcf
AM
5320 psym->st_shndx
5321 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4fbb74a6
AM
5322 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5323 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
252b5132
RH
5324 psym->st_info = BYTE_GET (esyms[j].st_info);
5325 psym->st_other = BYTE_GET (esyms[j].st_other);
5326 }
5327
dd24e3da 5328 exit_point:
ba5cdace 5329 if (shndx != NULL)
9ad5cbcf 5330 free (shndx);
ba5cdace 5331 if (esyms != NULL)
dd24e3da 5332 free (esyms);
252b5132 5333
ba5cdace
NC
5334 if (num_syms_return != NULL)
5335 * num_syms_return = isyms == NULL ? 0 : number;
5336
252b5132
RH
5337 return isyms;
5338}
5339
9ea033b2 5340static Elf_Internal_Sym *
ba5cdace
NC
5341get_64bit_elf_symbols (FILE * file,
5342 Elf_Internal_Shdr * section,
5343 unsigned long * num_syms_return)
9ea033b2 5344{
ba5cdace
NC
5345 unsigned long number = 0;
5346 Elf64_External_Sym * esyms = NULL;
5347 Elf_External_Sym_Shndx * shndx = NULL;
5348 Elf_Internal_Sym * isyms = NULL;
2cf0635d 5349 Elf_Internal_Sym * psym;
b34976b6 5350 unsigned int j;
9ea033b2 5351
c9c1d674
EG
5352 if (section->sh_size == 0)
5353 {
5354 if (num_syms_return != NULL)
5355 * num_syms_return = 0;
5356 return NULL;
5357 }
5358
dd24e3da 5359 /* Run some sanity checks first. */
c9c1d674 5360 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
dd24e3da 5361 {
c9c1d674 5362 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
8066deb1
AM
5363 printable_section_name (section),
5364 (unsigned long) section->sh_entsize);
ba5cdace 5365 goto exit_point;
dd24e3da
NC
5366 }
5367
f54498b4
NC
5368 if (section->sh_size > current_file_size)
5369 {
5370 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
8066deb1
AM
5371 printable_section_name (section),
5372 (unsigned long) section->sh_size);
f54498b4
NC
5373 goto exit_point;
5374 }
5375
dd24e3da
NC
5376 number = section->sh_size / section->sh_entsize;
5377
5378 if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5379 {
c9c1d674 5380 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
8066deb1
AM
5381 (unsigned long) section->sh_size,
5382 printable_section_name (section),
5383 (unsigned long) section->sh_entsize);
ba5cdace 5384 goto exit_point;
dd24e3da
NC
5385 }
5386
3f5e193b
NC
5387 esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5388 section->sh_size, _("symbols"));
a6e9f9df 5389 if (!esyms)
ba5cdace 5390 goto exit_point;
9ea033b2 5391
6a40cf0c
NC
5392 {
5393 elf_section_list * entry;
5394
5395 shndx = NULL;
5396 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5397 if (entry->hdr->sh_link == (unsigned long) (section - section_headers))
c9c1d674 5398 {
6a40cf0c
NC
5399 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5400 entry->hdr->sh_offset,
5401 1, entry->hdr->sh_size,
5402 _("symbol table section indicies"));
5403 if (shndx == NULL)
5404 goto exit_point;
5405 /* PR17531: file: heap-buffer-overflow */
5406 else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5407 {
5408 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5409 printable_section_name (entry->hdr),
5410 (unsigned long) entry->hdr->sh_size,
5411 (unsigned long) section->sh_size);
5412 goto exit_point;
5413 }
c9c1d674 5414 }
6a40cf0c 5415 }
9ad5cbcf 5416
3f5e193b 5417 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
9ea033b2
NC
5418
5419 if (isyms == NULL)
5420 {
8b73c356
NC
5421 error (_("Out of memory reading %lu symbols\n"),
5422 (unsigned long) number);
ba5cdace 5423 goto exit_point;
9ea033b2
NC
5424 }
5425
ba5cdace 5426 for (j = 0, psym = isyms; j < number; j++, psym++)
9ea033b2
NC
5427 {
5428 psym->st_name = BYTE_GET (esyms[j].st_name);
5429 psym->st_info = BYTE_GET (esyms[j].st_info);
5430 psym->st_other = BYTE_GET (esyms[j].st_other);
5431 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
ba5cdace 5432
4fbb74a6 5433 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
9ad5cbcf
AM
5434 psym->st_shndx
5435 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4fbb74a6
AM
5436 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5437 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
ba5cdace 5438
66543521
AM
5439 psym->st_value = BYTE_GET (esyms[j].st_value);
5440 psym->st_size = BYTE_GET (esyms[j].st_size);
9ea033b2
NC
5441 }
5442
ba5cdace
NC
5443 exit_point:
5444 if (shndx != NULL)
9ad5cbcf 5445 free (shndx);
ba5cdace
NC
5446 if (esyms != NULL)
5447 free (esyms);
5448
5449 if (num_syms_return != NULL)
5450 * num_syms_return = isyms == NULL ? 0 : number;
9ea033b2
NC
5451
5452 return isyms;
5453}
5454
d1133906 5455static const char *
d3ba0551 5456get_elf_section_flags (bfd_vma sh_flags)
d1133906 5457{
5477e8a0 5458 static char buff[1024];
2cf0635d 5459 char * p = buff;
8d5ff12c 5460 int field_size = is_32bit_elf ? 8 : 16;
91d6fa6a
NC
5461 int sindex;
5462 int size = sizeof (buff) - (field_size + 4 + 1);
8d5ff12c
L
5463 bfd_vma os_flags = 0;
5464 bfd_vma proc_flags = 0;
5465 bfd_vma unknown_flags = 0;
148b93f2 5466 static const struct
5477e8a0 5467 {
2cf0635d 5468 const char * str;
5477e8a0
L
5469 int len;
5470 }
5471 flags [] =
5472 {
cfcac11d
NC
5473 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
5474 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
5475 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
5476 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
5477 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
5478 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
5479 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5480 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5481 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
5482 /* 9 */ { STRING_COMMA_LEN ("TLS") },
5483 /* IA-64 specific. */
5484 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5485 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5486 /* IA-64 OpenVMS specific. */
5487 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5488 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5489 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5490 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5491 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5492 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
18ae9cc1 5493 /* Generic. */
cfcac11d 5494 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
18ae9cc1 5495 /* SPARC specific. */
77115a4a 5496 /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
ac4c9b04
MG
5497 /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5498 /* ARM specific. */
5499 /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
f0728ee3 5500 /* 22 */ { STRING_COMMA_LEN ("ARM_PURECODE") },
ac4c9b04 5501 /* 23 */ { STRING_COMMA_LEN ("COMDEF") }
5477e8a0
L
5502 };
5503
5504 if (do_section_details)
5505 {
8d5ff12c
L
5506 sprintf (buff, "[%*.*lx]: ",
5507 field_size, field_size, (unsigned long) sh_flags);
5508 p += field_size + 4;
5477e8a0 5509 }
76da6bbe 5510
d1133906
NC
5511 while (sh_flags)
5512 {
5513 bfd_vma flag;
5514
5515 flag = sh_flags & - sh_flags;
5516 sh_flags &= ~ flag;
76da6bbe 5517
5477e8a0 5518 if (do_section_details)
d1133906 5519 {
5477e8a0
L
5520 switch (flag)
5521 {
91d6fa6a
NC
5522 case SHF_WRITE: sindex = 0; break;
5523 case SHF_ALLOC: sindex = 1; break;
5524 case SHF_EXECINSTR: sindex = 2; break;
5525 case SHF_MERGE: sindex = 3; break;
5526 case SHF_STRINGS: sindex = 4; break;
5527 case SHF_INFO_LINK: sindex = 5; break;
5528 case SHF_LINK_ORDER: sindex = 6; break;
5529 case SHF_OS_NONCONFORMING: sindex = 7; break;
5530 case SHF_GROUP: sindex = 8; break;
5531 case SHF_TLS: sindex = 9; break;
18ae9cc1 5532 case SHF_EXCLUDE: sindex = 18; break;
77115a4a 5533 case SHF_COMPRESSED: sindex = 20; break;
76da6bbe 5534
5477e8a0 5535 default:
91d6fa6a 5536 sindex = -1;
cfcac11d 5537 switch (elf_header.e_machine)
148b93f2 5538 {
cfcac11d 5539 case EM_IA_64:
148b93f2 5540 if (flag == SHF_IA_64_SHORT)
91d6fa6a 5541 sindex = 10;
148b93f2 5542 else if (flag == SHF_IA_64_NORECOV)
91d6fa6a 5543 sindex = 11;
148b93f2
NC
5544#ifdef BFD64
5545 else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5546 switch (flag)
5547 {
91d6fa6a
NC
5548 case SHF_IA_64_VMS_GLOBAL: sindex = 12; break;
5549 case SHF_IA_64_VMS_OVERLAID: sindex = 13; break;
5550 case SHF_IA_64_VMS_SHARED: sindex = 14; break;
5551 case SHF_IA_64_VMS_VECTOR: sindex = 15; break;
5552 case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5553 case SHF_IA_64_VMS_PROTECTED: sindex = 17; break;
148b93f2
NC
5554 default: break;
5555 }
5556#endif
cfcac11d
NC
5557 break;
5558
caa83f8b 5559 case EM_386:
22abe556 5560 case EM_IAMCU:
caa83f8b 5561 case EM_X86_64:
7f502d6c 5562 case EM_L1OM:
7a9068fe 5563 case EM_K1OM:
cfcac11d
NC
5564 case EM_OLD_SPARCV9:
5565 case EM_SPARC32PLUS:
5566 case EM_SPARCV9:
5567 case EM_SPARC:
18ae9cc1 5568 if (flag == SHF_ORDERED)
91d6fa6a 5569 sindex = 19;
cfcac11d 5570 break;
ac4c9b04
MG
5571
5572 case EM_ARM:
5573 switch (flag)
5574 {
5575 case SHF_ENTRYSECT: sindex = 21; break;
f0728ee3 5576 case SHF_ARM_PURECODE: sindex = 22; break;
ac4c9b04
MG
5577 case SHF_COMDEF: sindex = 23; break;
5578 default: break;
5579 }
5580 break;
5581
cfcac11d
NC
5582 default:
5583 break;
148b93f2 5584 }
5477e8a0
L
5585 }
5586
91d6fa6a 5587 if (sindex != -1)
5477e8a0 5588 {
8d5ff12c
L
5589 if (p != buff + field_size + 4)
5590 {
5591 if (size < (10 + 2))
bee0ee85
NC
5592 {
5593 warn (_("Internal error: not enough buffer room for section flag info"));
5594 return _("<unknown>");
5595 }
8d5ff12c
L
5596 size -= 2;
5597 *p++ = ',';
5598 *p++ = ' ';
5599 }
5600
91d6fa6a
NC
5601 size -= flags [sindex].len;
5602 p = stpcpy (p, flags [sindex].str);
5477e8a0 5603 }
3b22753a 5604 else if (flag & SHF_MASKOS)
8d5ff12c 5605 os_flags |= flag;
d1133906 5606 else if (flag & SHF_MASKPROC)
8d5ff12c 5607 proc_flags |= flag;
d1133906 5608 else
8d5ff12c 5609 unknown_flags |= flag;
5477e8a0
L
5610 }
5611 else
5612 {
5613 switch (flag)
5614 {
5615 case SHF_WRITE: *p = 'W'; break;
5616 case SHF_ALLOC: *p = 'A'; break;
5617 case SHF_EXECINSTR: *p = 'X'; break;
5618 case SHF_MERGE: *p = 'M'; break;
5619 case SHF_STRINGS: *p = 'S'; break;
5620 case SHF_INFO_LINK: *p = 'I'; break;
5621 case SHF_LINK_ORDER: *p = 'L'; break;
5622 case SHF_OS_NONCONFORMING: *p = 'O'; break;
5623 case SHF_GROUP: *p = 'G'; break;
5624 case SHF_TLS: *p = 'T'; break;
18ae9cc1 5625 case SHF_EXCLUDE: *p = 'E'; break;
77115a4a 5626 case SHF_COMPRESSED: *p = 'C'; break;
5477e8a0
L
5627
5628 default:
8a9036a4 5629 if ((elf_header.e_machine == EM_X86_64
7a9068fe
L
5630 || elf_header.e_machine == EM_L1OM
5631 || elf_header.e_machine == EM_K1OM)
5477e8a0
L
5632 && flag == SHF_X86_64_LARGE)
5633 *p = 'l';
91f68a68 5634 else if (elf_header.e_machine == EM_ARM
f0728ee3 5635 && flag == SHF_ARM_PURECODE)
91f68a68 5636 *p = 'y';
5477e8a0
L
5637 else if (flag & SHF_MASKOS)
5638 {
5639 *p = 'o';
5640 sh_flags &= ~ SHF_MASKOS;
5641 }
5642 else if (flag & SHF_MASKPROC)
5643 {
5644 *p = 'p';
5645 sh_flags &= ~ SHF_MASKPROC;
5646 }
5647 else
5648 *p = 'x';
5649 break;
5650 }
5651 p++;
d1133906
NC
5652 }
5653 }
76da6bbe 5654
8d5ff12c
L
5655 if (do_section_details)
5656 {
5657 if (os_flags)
5658 {
5659 size -= 5 + field_size;
5660 if (p != buff + field_size + 4)
5661 {
5662 if (size < (2 + 1))
bee0ee85
NC
5663 {
5664 warn (_("Internal error: not enough buffer room for section flag info"));
5665 return _("<unknown>");
5666 }
8d5ff12c
L
5667 size -= 2;
5668 *p++ = ',';
5669 *p++ = ' ';
5670 }
5671 sprintf (p, "OS (%*.*lx)", field_size, field_size,
5672 (unsigned long) os_flags);
5673 p += 5 + field_size;
5674 }
5675 if (proc_flags)
5676 {
5677 size -= 7 + field_size;
5678 if (p != buff + field_size + 4)
5679 {
5680 if (size < (2 + 1))
bee0ee85
NC
5681 {
5682 warn (_("Internal error: not enough buffer room for section flag info"));
5683 return _("<unknown>");
5684 }
8d5ff12c
L
5685 size -= 2;
5686 *p++ = ',';
5687 *p++ = ' ';
5688 }
5689 sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5690 (unsigned long) proc_flags);
5691 p += 7 + field_size;
5692 }
5693 if (unknown_flags)
5694 {
5695 size -= 10 + field_size;
5696 if (p != buff + field_size + 4)
5697 {
5698 if (size < (2 + 1))
bee0ee85
NC
5699 {
5700 warn (_("Internal error: not enough buffer room for section flag info"));
5701 return _("<unknown>");
5702 }
8d5ff12c
L
5703 size -= 2;
5704 *p++ = ',';
5705 *p++ = ' ';
5706 }
2b692964 5707 sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
8d5ff12c
L
5708 (unsigned long) unknown_flags);
5709 p += 10 + field_size;
5710 }
5711 }
5712
e9e44622 5713 *p = '\0';
d1133906
NC
5714 return buff;
5715}
5716
77115a4a 5717static unsigned int
ebdf1ebf 5718get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf, bfd_size_type size)
77115a4a
L
5719{
5720 if (is_32bit_elf)
5721 {
5722 Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
d8024a91 5723
ebdf1ebf
NC
5724 if (size < sizeof (* echdr))
5725 {
5726 error (_("Compressed section is too small even for a compression header\n"));
5727 return 0;
5728 }
5729
77115a4a
L
5730 chdr->ch_type = BYTE_GET (echdr->ch_type);
5731 chdr->ch_size = BYTE_GET (echdr->ch_size);
5732 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5733 return sizeof (*echdr);
5734 }
5735 else
5736 {
5737 Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) buf;
d8024a91 5738
ebdf1ebf
NC
5739 if (size < sizeof (* echdr))
5740 {
5741 error (_("Compressed section is too small even for a compression header\n"));
5742 return 0;
5743 }
5744
77115a4a
L
5745 chdr->ch_type = BYTE_GET (echdr->ch_type);
5746 chdr->ch_size = BYTE_GET (echdr->ch_size);
5747 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5748 return sizeof (*echdr);
5749 }
5750}
5751
252b5132 5752static int
2cf0635d 5753process_section_headers (FILE * file)
252b5132 5754{
2cf0635d 5755 Elf_Internal_Shdr * section;
b34976b6 5756 unsigned int i;
252b5132
RH
5757
5758 section_headers = NULL;
5759
5760 if (elf_header.e_shnum == 0)
5761 {
82f2dbf7
NC
5762 /* PR binutils/12467. */
5763 if (elf_header.e_shoff != 0)
5764 warn (_("possibly corrupt ELF file header - it has a non-zero"
5765 " section header offset, but no section headers\n"));
5766 else if (do_sections)
252b5132
RH
5767 printf (_("\nThere are no sections in this file.\n"));
5768
5769 return 1;
5770 }
5771
5772 if (do_sections && !do_header)
9ea033b2 5773 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
252b5132
RH
5774 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
5775
9ea033b2
NC
5776 if (is_32bit_elf)
5777 {
049b0c3a 5778 if (! get_32bit_section_headers (file, FALSE))
9ea033b2
NC
5779 return 0;
5780 }
049b0c3a 5781 else if (! get_64bit_section_headers (file, FALSE))
252b5132
RH
5782 return 0;
5783
5784 /* Read in the string table, so that we have names to display. */
0b49d371 5785 if (elf_header.e_shstrndx != SHN_UNDEF
4fbb74a6 5786 && elf_header.e_shstrndx < elf_header.e_shnum)
252b5132 5787 {
4fbb74a6 5788 section = section_headers + elf_header.e_shstrndx;
d40ac9bd 5789
c256ffe7
JJ
5790 if (section->sh_size != 0)
5791 {
3f5e193b
NC
5792 string_table = (char *) get_data (NULL, file, section->sh_offset,
5793 1, section->sh_size,
5794 _("string table"));
0de14b54 5795
c256ffe7
JJ
5796 string_table_length = string_table != NULL ? section->sh_size : 0;
5797 }
252b5132
RH
5798 }
5799
5800 /* Scan the sections for the dynamic symbol table
e3c8793a 5801 and dynamic string table and debug sections. */
252b5132
RH
5802 dynamic_symbols = NULL;
5803 dynamic_strings = NULL;
5804 dynamic_syminfo = NULL;
6a40cf0c 5805 symtab_shndx_list = NULL;
103f02d3 5806
89fac5e3
RS
5807 eh_addr_size = is_32bit_elf ? 4 : 8;
5808 switch (elf_header.e_machine)
5809 {
5810 case EM_MIPS:
5811 case EM_MIPS_RS3_LE:
5812 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
5813 FDE addresses. However, the ABI also has a semi-official ILP32
5814 variant for which the normal FDE address size rules apply.
5815
5816 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
5817 section, where XX is the size of longs in bits. Unfortunately,
5818 earlier compilers provided no way of distinguishing ILP32 objects
5819 from LP64 objects, so if there's any doubt, we should assume that
5820 the official LP64 form is being used. */
5821 if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
5822 && find_section (".gcc_compiled_long32") == NULL)
5823 eh_addr_size = 8;
5824 break;
0f56a26a
DD
5825
5826 case EM_H8_300:
5827 case EM_H8_300H:
5828 switch (elf_header.e_flags & EF_H8_MACH)
5829 {
5830 case E_H8_MACH_H8300:
5831 case E_H8_MACH_H8300HN:
5832 case E_H8_MACH_H8300SN:
5833 case E_H8_MACH_H8300SXN:
5834 eh_addr_size = 2;
5835 break;
5836 case E_H8_MACH_H8300H:
5837 case E_H8_MACH_H8300S:
5838 case E_H8_MACH_H8300SX:
5839 eh_addr_size = 4;
5840 break;
5841 }
f4236fe4
DD
5842 break;
5843
ff7eeb89 5844 case EM_M32C_OLD:
f4236fe4
DD
5845 case EM_M32C:
5846 switch (elf_header.e_flags & EF_M32C_CPU_MASK)
5847 {
5848 case EF_M32C_CPU_M16C:
5849 eh_addr_size = 2;
5850 break;
5851 }
5852 break;
89fac5e3
RS
5853 }
5854
76ca31c0
NC
5855#define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
5856 do \
5857 { \
5858 bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64; \
5859 if (section->sh_entsize != expected_entsize) \
9dd3a467 5860 { \
76ca31c0
NC
5861 char buf[40]; \
5862 sprintf_vma (buf, section->sh_entsize); \
5863 /* Note: coded this way so that there is a single string for \
5864 translation. */ \
5865 error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
5866 error (_("(Using the expected size of %u for the rest of this dump)\n"), \
5867 (unsigned) expected_entsize); \
9dd3a467 5868 section->sh_entsize = expected_entsize; \
76ca31c0
NC
5869 } \
5870 } \
08d8fa11 5871 while (0)
9dd3a467
NC
5872
5873#define CHECK_ENTSIZE(section, i, type) \
08d8fa11
JJ
5874 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
5875 sizeof (Elf64_External_##type))
5876
252b5132
RH
5877 for (i = 0, section = section_headers;
5878 i < elf_header.e_shnum;
b34976b6 5879 i++, section++)
252b5132 5880 {
2cf0635d 5881 char * name = SECTION_NAME (section);
252b5132
RH
5882
5883 if (section->sh_type == SHT_DYNSYM)
5884 {
5885 if (dynamic_symbols != NULL)
5886 {
5887 error (_("File contains multiple dynamic symbol tables\n"));
5888 continue;
5889 }
5890
08d8fa11 5891 CHECK_ENTSIZE (section, i, Sym);
ba5cdace 5892 dynamic_symbols = GET_ELF_SYMBOLS (file, section, & num_dynamic_syms);
252b5132
RH
5893 }
5894 else if (section->sh_type == SHT_STRTAB
18bd398b 5895 && streq (name, ".dynstr"))
252b5132
RH
5896 {
5897 if (dynamic_strings != NULL)
5898 {
5899 error (_("File contains multiple dynamic string tables\n"));
5900 continue;
5901 }
5902
3f5e193b
NC
5903 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
5904 1, section->sh_size,
5905 _("dynamic strings"));
59245841 5906 dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
252b5132 5907 }
9ad5cbcf
AM
5908 else if (section->sh_type == SHT_SYMTAB_SHNDX)
5909 {
6a40cf0c
NC
5910 elf_section_list * entry = xmalloc (sizeof * entry);
5911 entry->hdr = section;
5912 entry->next = symtab_shndx_list;
5913 symtab_shndx_list = entry;
9ad5cbcf 5914 }
08d8fa11
JJ
5915 else if (section->sh_type == SHT_SYMTAB)
5916 CHECK_ENTSIZE (section, i, Sym);
5917 else if (section->sh_type == SHT_GROUP)
5918 CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
5919 else if (section->sh_type == SHT_REL)
5920 CHECK_ENTSIZE (section, i, Rel);
5921 else if (section->sh_type == SHT_RELA)
5922 CHECK_ENTSIZE (section, i, Rela);
252b5132 5923 else if ((do_debugging || do_debug_info || do_debug_abbrevs
f9f0e732 5924 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
cb8f3167 5925 || do_debug_aranges || do_debug_frames || do_debug_macinfo
657d0d47
CC
5926 || do_debug_str || do_debug_loc || do_debug_ranges
5927 || do_debug_addr || do_debug_cu_index)
1b315056
CS
5928 && (const_strneq (name, ".debug_")
5929 || const_strneq (name, ".zdebug_")))
252b5132 5930 {
1b315056
CS
5931 if (name[1] == 'z')
5932 name += sizeof (".zdebug_") - 1;
5933 else
5934 name += sizeof (".debug_") - 1;
252b5132
RH
5935
5936 if (do_debugging
4723351a
CC
5937 || (do_debug_info && const_strneq (name, "info"))
5938 || (do_debug_info && const_strneq (name, "types"))
5939 || (do_debug_abbrevs && const_strneq (name, "abbrev"))
b40bf0a2
NC
5940 || (do_debug_lines && strcmp (name, "line") == 0)
5941 || (do_debug_lines && const_strneq (name, "line."))
4723351a
CC
5942 || (do_debug_pubnames && const_strneq (name, "pubnames"))
5943 || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
459d52c8
DE
5944 || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
5945 || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
4723351a
CC
5946 || (do_debug_aranges && const_strneq (name, "aranges"))
5947 || (do_debug_ranges && const_strneq (name, "ranges"))
5948 || (do_debug_frames && const_strneq (name, "frame"))
5949 || (do_debug_macinfo && const_strneq (name, "macinfo"))
5950 || (do_debug_macinfo && const_strneq (name, "macro"))
5951 || (do_debug_str && const_strneq (name, "str"))
5952 || (do_debug_loc && const_strneq (name, "loc"))
657d0d47
CC
5953 || (do_debug_addr && const_strneq (name, "addr"))
5954 || (do_debug_cu_index && const_strneq (name, "cu_index"))
5955 || (do_debug_cu_index && const_strneq (name, "tu_index"))
252b5132 5956 )
09c11c86 5957 request_dump_bynumber (i, DEBUG_DUMP);
252b5132 5958 }
a262ae96 5959 /* Linkonce section to be combined with .debug_info at link time. */
09fd7e38 5960 else if ((do_debugging || do_debug_info)
0112cd26 5961 && const_strneq (name, ".gnu.linkonce.wi."))
09c11c86 5962 request_dump_bynumber (i, DEBUG_DUMP);
18bd398b 5963 else if (do_debug_frames && streq (name, ".eh_frame"))
09c11c86 5964 request_dump_bynumber (i, DEBUG_DUMP);
5bbdf3d5
DE
5965 else if (do_gdb_index && streq (name, ".gdb_index"))
5966 request_dump_bynumber (i, DEBUG_DUMP);
6f875884
TG
5967 /* Trace sections for Itanium VMS. */
5968 else if ((do_debugging || do_trace_info || do_trace_abbrevs
5969 || do_trace_aranges)
5970 && const_strneq (name, ".trace_"))
5971 {
5972 name += sizeof (".trace_") - 1;
5973
5974 if (do_debugging
5975 || (do_trace_info && streq (name, "info"))
5976 || (do_trace_abbrevs && streq (name, "abbrev"))
5977 || (do_trace_aranges && streq (name, "aranges"))
5978 )
5979 request_dump_bynumber (i, DEBUG_DUMP);
5980 }
252b5132
RH
5981 }
5982
5983 if (! do_sections)
5984 return 1;
5985
3a1a2036
NC
5986 if (elf_header.e_shnum > 1)
5987 printf (_("\nSection Headers:\n"));
5988 else
5989 printf (_("\nSection Header:\n"));
76da6bbe 5990
f7a99963 5991 if (is_32bit_elf)
595cf52e 5992 {
5477e8a0 5993 if (do_section_details)
595cf52e
L
5994 {
5995 printf (_(" [Nr] Name\n"));
5477e8a0 5996 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
595cf52e
L
5997 }
5998 else
5999 printf
6000 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
6001 }
d974e256 6002 else if (do_wide)
595cf52e 6003 {
5477e8a0 6004 if (do_section_details)
595cf52e
L
6005 {
6006 printf (_(" [Nr] Name\n"));
5477e8a0 6007 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
595cf52e
L
6008 }
6009 else
6010 printf
6011 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
6012 }
f7a99963
NC
6013 else
6014 {
5477e8a0 6015 if (do_section_details)
595cf52e
L
6016 {
6017 printf (_(" [Nr] Name\n"));
5477e8a0
L
6018 printf (_(" Type Address Offset Link\n"));
6019 printf (_(" Size EntSize Info Align\n"));
595cf52e
L
6020 }
6021 else
6022 {
6023 printf (_(" [Nr] Name Type Address Offset\n"));
6024 printf (_(" Size EntSize Flags Link Info Align\n"));
6025 }
f7a99963 6026 }
252b5132 6027
5477e8a0
L
6028 if (do_section_details)
6029 printf (_(" Flags\n"));
6030
252b5132
RH
6031 for (i = 0, section = section_headers;
6032 i < elf_header.e_shnum;
b34976b6 6033 i++, section++)
252b5132 6034 {
dd905818
NC
6035 /* Run some sanity checks on the section header. */
6036
6037 /* Check the sh_link field. */
6038 switch (section->sh_type)
6039 {
6040 case SHT_SYMTAB_SHNDX:
6041 case SHT_GROUP:
6042 case SHT_HASH:
6043 case SHT_GNU_HASH:
6044 case SHT_GNU_versym:
6045 case SHT_REL:
6046 case SHT_RELA:
6047 if (section->sh_link < 1
cb64e50d 6048 || section->sh_link >= elf_header.e_shnum
dd905818
NC
6049 || (section_headers[section->sh_link].sh_type != SHT_SYMTAB
6050 && section_headers[section->sh_link].sh_type != SHT_DYNSYM))
6051 warn (_("[%2u]: Link field (%u) should index a symtab section.\n"),
6052 i, section->sh_link);
6053 break;
6054
6055 case SHT_DYNAMIC:
6056 case SHT_SYMTAB:
6057 case SHT_DYNSYM:
6058 case SHT_GNU_verneed:
6059 case SHT_GNU_verdef:
6060 case SHT_GNU_LIBLIST:
6061 if (section->sh_link < 1
cb64e50d 6062 || section->sh_link >= elf_header.e_shnum
dd905818
NC
6063 || section_headers[section->sh_link].sh_type != SHT_STRTAB)
6064 warn (_("[%2u]: Link field (%u) should index a string section.\n"),
6065 i, section->sh_link);
6066 break;
6067
6068 case SHT_INIT_ARRAY:
6069 case SHT_FINI_ARRAY:
6070 case SHT_PREINIT_ARRAY:
6071 if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6072 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6073 i, section->sh_link);
6074 break;
6075
6076 default:
6077 /* FIXME: Add support for target specific section types. */
6078#if 0 /* Currently we do not check other section types as there are too
6079 many special cases. Stab sections for example have a type
6080 of SHT_PROGBITS but an sh_link field that links to the .stabstr
6081 section. */
6082 if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6083 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6084 i, section->sh_link);
6085#endif
6086 break;
6087 }
6088
6089 /* Check the sh_info field. */
6090 switch (section->sh_type)
6091 {
6092 case SHT_REL:
6093 case SHT_RELA:
6094 if (section->sh_info < 1
cb64e50d 6095 || section->sh_info >= elf_header.e_shnum
dd905818
NC
6096 || (section_headers[section->sh_info].sh_type != SHT_PROGBITS
6097 && section_headers[section->sh_info].sh_type != SHT_NOBITS
6098 && section_headers[section->sh_info].sh_type != SHT_NOTE
6099 && section_headers[section->sh_info].sh_type != SHT_INIT_ARRAY
6100 /* FIXME: Are other section types valid ? */
6101 && section_headers[section->sh_info].sh_type < SHT_LOOS))
6102 {
6103 if (section->sh_info == 0
6104 && (streq (SECTION_NAME (section), ".rel.dyn")
6105 || streq (SECTION_NAME (section), ".rela.dyn")))
6106 /* The .rel.dyn and .rela.dyn sections have an sh_info field
4d74727a
AM
6107 of zero. The relocations in these sections may apply
6108 to many different sections. */
dd905818
NC
6109 ;
6110 else
6111 warn (_("[%2u]: Info field (%u) should index a relocatable section.\n"),
6112 i, section->sh_info);
6113 }
6114 break;
6115
6116 case SHT_DYNAMIC:
6117 case SHT_HASH:
6118 case SHT_SYMTAB_SHNDX:
6119 case SHT_INIT_ARRAY:
6120 case SHT_FINI_ARRAY:
6121 case SHT_PREINIT_ARRAY:
6122 if (section->sh_info != 0)
6123 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6124 i, section->sh_info);
6125 break;
6126
6127 case SHT_GROUP:
6128 case SHT_SYMTAB:
6129 case SHT_DYNSYM:
6130 /* A symbol index - we assume that it is valid. */
6131 break;
6132
6133 default:
6134 /* FIXME: Add support for target specific section types. */
6135 if (section->sh_type == SHT_NOBITS)
6136 /* NOBITS section headers with non-zero sh_info fields can be
6137 created when a binary is stripped of everything but its debug
1a9ccd70
NC
6138 information. The stripped sections have their headers
6139 preserved but their types set to SHT_NOBITS. So do not check
6140 this type of section. */
dd905818
NC
6141 ;
6142 else if (section->sh_flags & SHF_INFO_LINK)
6143 {
cb64e50d 6144 if (section->sh_info < 1 || section->sh_info >= elf_header.e_shnum)
dd905818
NC
6145 warn (_("[%2u]: Expected link to another section in info field"), i);
6146 }
6147 else if (section->sh_type < SHT_LOOS && section->sh_info != 0)
6148 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6149 i, section->sh_info);
6150 break;
6151 }
6152
7bfd842d 6153 printf (" [%2u] ", i);
5477e8a0 6154 if (do_section_details)
74e1a04b 6155 printf ("%s\n ", printable_section_name (section));
595cf52e 6156 else
74e1a04b 6157 print_symbol (-17, SECTION_NAME (section));
0b4362b0 6158
ea52a088
NC
6159 printf (do_wide ? " %-15s " : " %-15.15s ",
6160 get_section_type_name (section->sh_type));
0b4362b0 6161
f7a99963
NC
6162 if (is_32bit_elf)
6163 {
cfcac11d
NC
6164 const char * link_too_big = NULL;
6165
f7a99963 6166 print_vma (section->sh_addr, LONG_HEX);
76da6bbe 6167
f7a99963
NC
6168 printf ( " %6.6lx %6.6lx %2.2lx",
6169 (unsigned long) section->sh_offset,
6170 (unsigned long) section->sh_size,
6171 (unsigned long) section->sh_entsize);
d1133906 6172
5477e8a0
L
6173 if (do_section_details)
6174 fputs (" ", stdout);
6175 else
6176 printf (" %3s ", get_elf_section_flags (section->sh_flags));
76da6bbe 6177
cfcac11d
NC
6178 if (section->sh_link >= elf_header.e_shnum)
6179 {
6180 link_too_big = "";
6181 /* The sh_link value is out of range. Normally this indicates
caa83f8b 6182 an error but it can have special values in Solaris binaries. */
cfcac11d
NC
6183 switch (elf_header.e_machine)
6184 {
caa83f8b 6185 case EM_386:
22abe556 6186 case EM_IAMCU:
caa83f8b 6187 case EM_X86_64:
7f502d6c 6188 case EM_L1OM:
7a9068fe 6189 case EM_K1OM:
cfcac11d
NC
6190 case EM_OLD_SPARCV9:
6191 case EM_SPARC32PLUS:
6192 case EM_SPARCV9:
6193 case EM_SPARC:
6194 if (section->sh_link == (SHN_BEFORE & 0xffff))
6195 link_too_big = "BEFORE";
6196 else if (section->sh_link == (SHN_AFTER & 0xffff))
6197 link_too_big = "AFTER";
6198 break;
6199 default:
6200 break;
6201 }
6202 }
6203
6204 if (do_section_details)
6205 {
6206 if (link_too_big != NULL && * link_too_big)
6207 printf ("<%s> ", link_too_big);
6208 else
6209 printf ("%2u ", section->sh_link);
6210 printf ("%3u %2lu\n", section->sh_info,
6211 (unsigned long) section->sh_addralign);
6212 }
6213 else
6214 printf ("%2u %3u %2lu\n",
6215 section->sh_link,
6216 section->sh_info,
6217 (unsigned long) section->sh_addralign);
6218
6219 if (link_too_big && ! * link_too_big)
6220 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
6221 i, section->sh_link);
f7a99963 6222 }
d974e256
JJ
6223 else if (do_wide)
6224 {
6225 print_vma (section->sh_addr, LONG_HEX);
6226
6227 if ((long) section->sh_offset == section->sh_offset)
6228 printf (" %6.6lx", (unsigned long) section->sh_offset);
6229 else
6230 {
6231 putchar (' ');
6232 print_vma (section->sh_offset, LONG_HEX);
6233 }
6234
6235 if ((unsigned long) section->sh_size == section->sh_size)
6236 printf (" %6.6lx", (unsigned long) section->sh_size);
6237 else
6238 {
6239 putchar (' ');
6240 print_vma (section->sh_size, LONG_HEX);
6241 }
6242
6243 if ((unsigned long) section->sh_entsize == section->sh_entsize)
6244 printf (" %2.2lx", (unsigned long) section->sh_entsize);
6245 else
6246 {
6247 putchar (' ');
6248 print_vma (section->sh_entsize, LONG_HEX);
6249 }
6250
5477e8a0
L
6251 if (do_section_details)
6252 fputs (" ", stdout);
6253 else
6254 printf (" %3s ", get_elf_section_flags (section->sh_flags));
d974e256 6255
72de5009 6256 printf ("%2u %3u ", section->sh_link, section->sh_info);
d974e256
JJ
6257
6258 if ((unsigned long) section->sh_addralign == section->sh_addralign)
72de5009 6259 printf ("%2lu\n", (unsigned long) section->sh_addralign);
d974e256
JJ
6260 else
6261 {
6262 print_vma (section->sh_addralign, DEC);
6263 putchar ('\n');
6264 }
6265 }
5477e8a0 6266 else if (do_section_details)
595cf52e 6267 {
5477e8a0 6268 printf (" %-15.15s ",
595cf52e 6269 get_section_type_name (section->sh_type));
595cf52e
L
6270 print_vma (section->sh_addr, LONG_HEX);
6271 if ((long) section->sh_offset == section->sh_offset)
5477e8a0 6272 printf (" %16.16lx", (unsigned long) section->sh_offset);
595cf52e
L
6273 else
6274 {
6275 printf (" ");
6276 print_vma (section->sh_offset, LONG_HEX);
6277 }
72de5009 6278 printf (" %u\n ", section->sh_link);
595cf52e 6279 print_vma (section->sh_size, LONG_HEX);
5477e8a0 6280 putchar (' ');
595cf52e
L
6281 print_vma (section->sh_entsize, LONG_HEX);
6282
72de5009
AM
6283 printf (" %-16u %lu\n",
6284 section->sh_info,
595cf52e
L
6285 (unsigned long) section->sh_addralign);
6286 }
f7a99963
NC
6287 else
6288 {
6289 putchar (' ');
6290 print_vma (section->sh_addr, LONG_HEX);
53c7db4b
KH
6291 if ((long) section->sh_offset == section->sh_offset)
6292 printf (" %8.8lx", (unsigned long) section->sh_offset);
6293 else
6294 {
6295 printf (" ");
6296 print_vma (section->sh_offset, LONG_HEX);
6297 }
f7a99963
NC
6298 printf ("\n ");
6299 print_vma (section->sh_size, LONG_HEX);
6300 printf (" ");
6301 print_vma (section->sh_entsize, LONG_HEX);
76da6bbe 6302
d1133906 6303 printf (" %3s ", get_elf_section_flags (section->sh_flags));
76da6bbe 6304
72de5009
AM
6305 printf (" %2u %3u %lu\n",
6306 section->sh_link,
6307 section->sh_info,
f7a99963
NC
6308 (unsigned long) section->sh_addralign);
6309 }
5477e8a0
L
6310
6311 if (do_section_details)
77115a4a
L
6312 {
6313 printf (" %s\n", get_elf_section_flags (section->sh_flags));
6314 if ((section->sh_flags & SHF_COMPRESSED) != 0)
6315 {
6316 /* Minimum section size is 12 bytes for 32-bit compression
6317 header + 12 bytes for compressed data header. */
6318 unsigned char buf[24];
d8024a91 6319
77115a4a
L
6320 assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
6321 if (get_data (&buf, (FILE *) file, section->sh_offset, 1,
6322 sizeof (buf), _("compression header")))
6323 {
6324 Elf_Internal_Chdr chdr;
d8024a91 6325
ebdf1ebf 6326 (void) get_compression_header (&chdr, buf, sizeof (buf));
d8024a91 6327
77115a4a
L
6328 if (chdr.ch_type == ELFCOMPRESS_ZLIB)
6329 printf (" ZLIB, ");
6330 else
6331 printf (_(" [<unknown>: 0x%x], "),
6332 chdr.ch_type);
6333 print_vma (chdr.ch_size, LONG_HEX);
6334 printf (", %lu\n", (unsigned long) chdr.ch_addralign);
6335 }
6336 }
6337 }
252b5132
RH
6338 }
6339
5477e8a0 6340 if (!do_section_details)
3dbcc61d 6341 {
9fb71ee4
NC
6342 /* The ordering of the letters shown here matches the ordering of the
6343 corresponding SHF_xxx values, and hence the order in which these
6344 letters will be displayed to the user. */
6345 printf (_("Key to Flags:\n\
6346 W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6347 L (link order), O (extra OS processing required), G (group), T (TLS),\n\
fd85a6a1 6348 C (compressed), x (unknown), o (OS specific), E (exclude),\n "));
3dbcc61d 6349 if (elf_header.e_machine == EM_X86_64
7a9068fe
L
6350 || elf_header.e_machine == EM_L1OM
6351 || elf_header.e_machine == EM_K1OM)
9fb71ee4 6352 printf (_("l (large), "));
91f68a68 6353 else if (elf_header.e_machine == EM_ARM)
f0728ee3 6354 printf (_("y (purecode), "));
9fb71ee4 6355 printf ("p (processor specific)\n");
0b4362b0 6356 }
d1133906 6357
252b5132
RH
6358 return 1;
6359}
6360
f5842774
L
6361static const char *
6362get_group_flags (unsigned int flags)
6363{
1449284b 6364 static char buff[128];
220453ec 6365
6d913794
NC
6366 if (flags == 0)
6367 return "";
6368 else if (flags == GRP_COMDAT)
6369 return "COMDAT ";
f5842774 6370
6d913794
NC
6371 snprintf (buff, 14, _("[0x%x: "), flags);
6372
6373 flags &= ~ GRP_COMDAT;
6374 if (flags & GRP_MASKOS)
6375 {
6376 strcat (buff, "<OS specific>");
6377 flags &= ~ GRP_MASKOS;
f5842774 6378 }
6d913794
NC
6379
6380 if (flags & GRP_MASKPROC)
6381 {
6382 strcat (buff, "<PROC specific>");
6383 flags &= ~ GRP_MASKPROC;
6384 }
6385
6386 if (flags)
6387 strcat (buff, "<unknown>");
6388
6389 strcat (buff, "]");
f5842774
L
6390 return buff;
6391}
6392
6393static int
2cf0635d 6394process_section_groups (FILE * file)
f5842774 6395{
2cf0635d 6396 Elf_Internal_Shdr * section;
f5842774 6397 unsigned int i;
2cf0635d
NC
6398 struct group * group;
6399 Elf_Internal_Shdr * symtab_sec;
6400 Elf_Internal_Shdr * strtab_sec;
6401 Elf_Internal_Sym * symtab;
ba5cdace 6402 unsigned long num_syms;
2cf0635d 6403 char * strtab;
c256ffe7 6404 size_t strtab_size;
d1f5c6e3
L
6405
6406 /* Don't process section groups unless needed. */
6407 if (!do_unwind && !do_section_groups)
6408 return 1;
f5842774
L
6409
6410 if (elf_header.e_shnum == 0)
6411 {
6412 if (do_section_groups)
82f2dbf7 6413 printf (_("\nThere are no sections to group in this file.\n"));
f5842774
L
6414
6415 return 1;
6416 }
6417
6418 if (section_headers == NULL)
6419 {
6420 error (_("Section headers are not available!\n"));
fa1908fd
NC
6421 /* PR 13622: This can happen with a corrupt ELF header. */
6422 return 0;
f5842774
L
6423 }
6424
3f5e193b
NC
6425 section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
6426 sizeof (struct group *));
e4b17d5c
L
6427
6428 if (section_headers_groups == NULL)
6429 {
8b73c356
NC
6430 error (_("Out of memory reading %u section group headers\n"),
6431 elf_header.e_shnum);
e4b17d5c
L
6432 return 0;
6433 }
6434
f5842774 6435 /* Scan the sections for the group section. */
d1f5c6e3 6436 group_count = 0;
f5842774
L
6437 for (i = 0, section = section_headers;
6438 i < elf_header.e_shnum;
6439 i++, section++)
e4b17d5c
L
6440 if (section->sh_type == SHT_GROUP)
6441 group_count++;
6442
d1f5c6e3
L
6443 if (group_count == 0)
6444 {
6445 if (do_section_groups)
6446 printf (_("\nThere are no section groups in this file.\n"));
6447
6448 return 1;
6449 }
6450
3f5e193b 6451 section_groups = (struct group *) calloc (group_count, sizeof (struct group));
e4b17d5c
L
6452
6453 if (section_groups == NULL)
6454 {
8b73c356
NC
6455 error (_("Out of memory reading %lu groups\n"),
6456 (unsigned long) group_count);
e4b17d5c
L
6457 return 0;
6458 }
6459
d1f5c6e3
L
6460 symtab_sec = NULL;
6461 strtab_sec = NULL;
6462 symtab = NULL;
ba5cdace 6463 num_syms = 0;
d1f5c6e3 6464 strtab = NULL;
c256ffe7 6465 strtab_size = 0;
e4b17d5c
L
6466 for (i = 0, section = section_headers, group = section_groups;
6467 i < elf_header.e_shnum;
6468 i++, section++)
f5842774
L
6469 {
6470 if (section->sh_type == SHT_GROUP)
6471 {
74e1a04b
NC
6472 const char * name = printable_section_name (section);
6473 const char * group_name;
2cf0635d
NC
6474 unsigned char * start;
6475 unsigned char * indices;
f5842774 6476 unsigned int entry, j, size;
2cf0635d
NC
6477 Elf_Internal_Shdr * sec;
6478 Elf_Internal_Sym * sym;
f5842774
L
6479
6480 /* Get the symbol table. */
4fbb74a6
AM
6481 if (section->sh_link >= elf_header.e_shnum
6482 || ((sec = section_headers + section->sh_link)->sh_type
c256ffe7 6483 != SHT_SYMTAB))
f5842774
L
6484 {
6485 error (_("Bad sh_link in group section `%s'\n"), name);
6486 continue;
6487 }
d1f5c6e3
L
6488
6489 if (symtab_sec != sec)
6490 {
6491 symtab_sec = sec;
6492 if (symtab)
6493 free (symtab);
ba5cdace 6494 symtab = GET_ELF_SYMBOLS (file, symtab_sec, & num_syms);
d1f5c6e3 6495 }
f5842774 6496
dd24e3da
NC
6497 if (symtab == NULL)
6498 {
6499 error (_("Corrupt header in group section `%s'\n"), name);
6500 continue;
6501 }
6502
ba5cdace
NC
6503 if (section->sh_info >= num_syms)
6504 {
6505 error (_("Bad sh_info in group section `%s'\n"), name);
6506 continue;
6507 }
6508
f5842774
L
6509 sym = symtab + section->sh_info;
6510
6511 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6512 {
4fbb74a6
AM
6513 if (sym->st_shndx == 0
6514 || sym->st_shndx >= elf_header.e_shnum)
f5842774
L
6515 {
6516 error (_("Bad sh_info in group section `%s'\n"), name);
6517 continue;
6518 }
ba2685cc 6519
4fbb74a6 6520 group_name = SECTION_NAME (section_headers + sym->st_shndx);
c256ffe7
JJ
6521 strtab_sec = NULL;
6522 if (strtab)
6523 free (strtab);
f5842774 6524 strtab = NULL;
c256ffe7 6525 strtab_size = 0;
f5842774
L
6526 }
6527 else
6528 {
6529 /* Get the string table. */
4fbb74a6 6530 if (symtab_sec->sh_link >= elf_header.e_shnum)
c256ffe7
JJ
6531 {
6532 strtab_sec = NULL;
6533 if (strtab)
6534 free (strtab);
6535 strtab = NULL;
6536 strtab_size = 0;
6537 }
6538 else if (strtab_sec
4fbb74a6 6539 != (sec = section_headers + symtab_sec->sh_link))
d1f5c6e3
L
6540 {
6541 strtab_sec = sec;
6542 if (strtab)
6543 free (strtab);
071436c6 6544
3f5e193b 6545 strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
071436c6
NC
6546 1, strtab_sec->sh_size,
6547 _("string table"));
c256ffe7 6548 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
d1f5c6e3 6549 }
c256ffe7 6550 group_name = sym->st_name < strtab_size
2b692964 6551 ? strtab + sym->st_name : _("<corrupt>");
f5842774
L
6552 }
6553
c9c1d674
EG
6554 /* PR 17531: file: loop. */
6555 if (section->sh_entsize > section->sh_size)
6556 {
6557 error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6558 printable_section_name (section),
8066deb1
AM
6559 (unsigned long) section->sh_entsize,
6560 (unsigned long) section->sh_size);
c9c1d674
EG
6561 break;
6562 }
6563
3f5e193b
NC
6564 start = (unsigned char *) get_data (NULL, file, section->sh_offset,
6565 1, section->sh_size,
6566 _("section data"));
59245841
NC
6567 if (start == NULL)
6568 continue;
f5842774
L
6569
6570 indices = start;
6571 size = (section->sh_size / section->sh_entsize) - 1;
6572 entry = byte_get (indices, 4);
6573 indices += 4;
e4b17d5c
L
6574
6575 if (do_section_groups)
6576 {
2b692964 6577 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
391cb864 6578 get_group_flags (entry), i, name, group_name, size);
ba2685cc 6579
e4b17d5c
L
6580 printf (_(" [Index] Name\n"));
6581 }
6582
6583 group->group_index = i;
6584
f5842774
L
6585 for (j = 0; j < size; j++)
6586 {
2cf0635d 6587 struct group_list * g;
e4b17d5c 6588
f5842774
L
6589 entry = byte_get (indices, 4);
6590 indices += 4;
6591
4fbb74a6 6592 if (entry >= elf_header.e_shnum)
391cb864 6593 {
57028622
NC
6594 static unsigned num_group_errors = 0;
6595
6596 if (num_group_errors ++ < 10)
6597 {
6598 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6599 entry, i, elf_header.e_shnum - 1);
6600 if (num_group_errors == 10)
6601 warn (_("Futher error messages about overlarge group section indicies suppressed\n"));
6602 }
391cb864
L
6603 continue;
6604 }
391cb864 6605
4fbb74a6 6606 if (section_headers_groups [entry] != NULL)
e4b17d5c 6607 {
d1f5c6e3
L
6608 if (entry)
6609 {
57028622
NC
6610 static unsigned num_errs = 0;
6611
6612 if (num_errs ++ < 10)
6613 {
6614 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6615 entry, i,
6616 section_headers_groups [entry]->group_index);
6617 if (num_errs == 10)
6618 warn (_("Further error messages about already contained group sections suppressed\n"));
6619 }
d1f5c6e3
L
6620 continue;
6621 }
6622 else
6623 {
6624 /* Intel C/C++ compiler may put section 0 in a
6625 section group. We just warn it the first time
6626 and ignore it afterwards. */
6627 static int warned = 0;
6628 if (!warned)
6629 {
6630 error (_("section 0 in group section [%5u]\n"),
4fbb74a6 6631 section_headers_groups [entry]->group_index);
d1f5c6e3
L
6632 warned++;
6633 }
6634 }
e4b17d5c
L
6635 }
6636
4fbb74a6 6637 section_headers_groups [entry] = group;
e4b17d5c
L
6638
6639 if (do_section_groups)
6640 {
4fbb74a6 6641 sec = section_headers + entry;
74e1a04b 6642 printf (" [%5u] %s\n", entry, printable_section_name (sec));
ba2685cc
AM
6643 }
6644
3f5e193b 6645 g = (struct group_list *) xmalloc (sizeof (struct group_list));
e4b17d5c
L
6646 g->section_index = entry;
6647 g->next = group->root;
6648 group->root = g;
f5842774
L
6649 }
6650
f5842774
L
6651 if (start)
6652 free (start);
e4b17d5c
L
6653
6654 group++;
f5842774
L
6655 }
6656 }
6657
d1f5c6e3
L
6658 if (symtab)
6659 free (symtab);
6660 if (strtab)
6661 free (strtab);
f5842774
L
6662 return 1;
6663}
6664
28f997cf
TG
6665/* Data used to display dynamic fixups. */
6666
6667struct ia64_vms_dynfixup
6668{
6669 bfd_vma needed_ident; /* Library ident number. */
6670 bfd_vma needed; /* Index in the dstrtab of the library name. */
6671 bfd_vma fixup_needed; /* Index of the library. */
6672 bfd_vma fixup_rela_cnt; /* Number of fixups. */
6673 bfd_vma fixup_rela_off; /* Fixups offset in the dynamic segment. */
6674};
6675
6676/* Data used to display dynamic relocations. */
6677
6678struct ia64_vms_dynimgrela
6679{
6680 bfd_vma img_rela_cnt; /* Number of relocations. */
6681 bfd_vma img_rela_off; /* Reloc offset in the dynamic segment. */
6682};
6683
6684/* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6685 library). */
6686
6687static void
6688dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
6689 const char *strtab, unsigned int strtab_sz)
6690{
6691 Elf64_External_VMS_IMAGE_FIXUP *imfs;
6692 long i;
6693 const char *lib_name;
6694
6695 imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
6696 1, fixup->fixup_rela_cnt * sizeof (*imfs),
6697 _("dynamic section image fixups"));
6698 if (!imfs)
6699 return;
6700
6701 if (fixup->needed < strtab_sz)
6702 lib_name = strtab + fixup->needed;
6703 else
6704 {
6705 warn ("corrupt library name index of 0x%lx found in dynamic entry",
7f01b0c6 6706 (unsigned long) fixup->needed);
28f997cf
TG
6707 lib_name = "???";
6708 }
6709 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
6710 (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
6711 printf
6712 (_("Seg Offset Type SymVec DataType\n"));
6713
6714 for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
6715 {
6716 unsigned int type;
6717 const char *rtype;
6718
6719 printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
6720 printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
6721 type = BYTE_GET (imfs [i].type);
6722 rtype = elf_ia64_reloc_type (type);
6723 if (rtype == NULL)
6724 printf (" 0x%08x ", type);
6725 else
6726 printf (" %-32s ", rtype);
6727 printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
6728 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
6729 }
6730
6731 free (imfs);
6732}
6733
6734/* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
6735
6736static void
6737dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
6738{
6739 Elf64_External_VMS_IMAGE_RELA *imrs;
6740 long i;
6741
6742 imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
6743 1, imgrela->img_rela_cnt * sizeof (*imrs),
9cf03b7e 6744 _("dynamic section image relocations"));
28f997cf
TG
6745 if (!imrs)
6746 return;
6747
6748 printf (_("\nImage relocs\n"));
6749 printf
6750 (_("Seg Offset Type Addend Seg Sym Off\n"));
6751
6752 for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
6753 {
6754 unsigned int type;
6755 const char *rtype;
6756
6757 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
6758 printf ("%08" BFD_VMA_FMT "x ",
6759 (bfd_vma) BYTE_GET (imrs [i].rela_offset));
6760 type = BYTE_GET (imrs [i].type);
6761 rtype = elf_ia64_reloc_type (type);
6762 if (rtype == NULL)
6763 printf ("0x%08x ", type);
6764 else
6765 printf ("%-31s ", rtype);
6766 print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
6767 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
6768 printf ("%08" BFD_VMA_FMT "x\n",
6769 (bfd_vma) BYTE_GET (imrs [i].sym_offset));
6770 }
6771
6772 free (imrs);
6773}
6774
6775/* Display IA-64 OpenVMS dynamic relocations and fixups. */
6776
6777static int
6778process_ia64_vms_dynamic_relocs (FILE *file)
6779{
6780 struct ia64_vms_dynfixup fixup;
6781 struct ia64_vms_dynimgrela imgrela;
6782 Elf_Internal_Dyn *entry;
6783 int res = 0;
6784 bfd_vma strtab_off = 0;
6785 bfd_vma strtab_sz = 0;
6786 char *strtab = NULL;
6787
6788 memset (&fixup, 0, sizeof (fixup));
6789 memset (&imgrela, 0, sizeof (imgrela));
6790
6791 /* Note: the order of the entries is specified by the OpenVMS specs. */
6792 for (entry = dynamic_section;
6793 entry < dynamic_section + dynamic_nent;
6794 entry++)
6795 {
6796 switch (entry->d_tag)
6797 {
6798 case DT_IA_64_VMS_STRTAB_OFFSET:
6799 strtab_off = entry->d_un.d_val;
6800 break;
6801 case DT_STRSZ:
6802 strtab_sz = entry->d_un.d_val;
6803 if (strtab == NULL)
6804 strtab = get_data (NULL, file, dynamic_addr + strtab_off,
6805 1, strtab_sz, _("dynamic string section"));
6806 break;
6807
6808 case DT_IA_64_VMS_NEEDED_IDENT:
6809 fixup.needed_ident = entry->d_un.d_val;
6810 break;
6811 case DT_NEEDED:
6812 fixup.needed = entry->d_un.d_val;
6813 break;
6814 case DT_IA_64_VMS_FIXUP_NEEDED:
6815 fixup.fixup_needed = entry->d_un.d_val;
6816 break;
6817 case DT_IA_64_VMS_FIXUP_RELA_CNT:
6818 fixup.fixup_rela_cnt = entry->d_un.d_val;
6819 break;
6820 case DT_IA_64_VMS_FIXUP_RELA_OFF:
6821 fixup.fixup_rela_off = entry->d_un.d_val;
6822 res++;
6823 dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
6824 break;
6825
6826 case DT_IA_64_VMS_IMG_RELA_CNT:
6827 imgrela.img_rela_cnt = entry->d_un.d_val;
6828 break;
6829 case DT_IA_64_VMS_IMG_RELA_OFF:
6830 imgrela.img_rela_off = entry->d_un.d_val;
6831 res++;
6832 dump_ia64_vms_dynamic_relocs (file, &imgrela);
6833 break;
6834
6835 default:
6836 break;
6837 }
6838 }
6839
6840 if (strtab != NULL)
6841 free (strtab);
6842
6843 return res;
6844}
6845
85b1c36d 6846static struct
566b0d53 6847{
2cf0635d 6848 const char * name;
566b0d53
L
6849 int reloc;
6850 int size;
6851 int rela;
6852} dynamic_relocations [] =
6853{
6854 { "REL", DT_REL, DT_RELSZ, FALSE },
6855 { "RELA", DT_RELA, DT_RELASZ, TRUE },
6856 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
6857};
6858
252b5132 6859/* Process the reloc section. */
18bd398b 6860
252b5132 6861static int
2cf0635d 6862process_relocs (FILE * file)
252b5132 6863{
b34976b6
AM
6864 unsigned long rel_size;
6865 unsigned long rel_offset;
252b5132
RH
6866
6867
6868 if (!do_reloc)
6869 return 1;
6870
6871 if (do_using_dynamic)
6872 {
566b0d53 6873 int is_rela;
2cf0635d 6874 const char * name;
566b0d53
L
6875 int has_dynamic_reloc;
6876 unsigned int i;
0de14b54 6877
566b0d53 6878 has_dynamic_reloc = 0;
252b5132 6879
566b0d53 6880 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
252b5132 6881 {
566b0d53
L
6882 is_rela = dynamic_relocations [i].rela;
6883 name = dynamic_relocations [i].name;
6884 rel_size = dynamic_info [dynamic_relocations [i].size];
6885 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
103f02d3 6886
566b0d53
L
6887 has_dynamic_reloc |= rel_size;
6888
6889 if (is_rela == UNKNOWN)
aa903cfb 6890 {
566b0d53
L
6891 if (dynamic_relocations [i].reloc == DT_JMPREL)
6892 switch (dynamic_info[DT_PLTREL])
6893 {
6894 case DT_REL:
6895 is_rela = FALSE;
6896 break;
6897 case DT_RELA:
6898 is_rela = TRUE;
6899 break;
6900 }
aa903cfb 6901 }
252b5132 6902
566b0d53
L
6903 if (rel_size)
6904 {
6905 printf
6906 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
6907 name, rel_offset, rel_size);
252b5132 6908
d93f0186
NC
6909 dump_relocations (file,
6910 offset_from_vma (file, rel_offset, rel_size),
6911 rel_size,
566b0d53 6912 dynamic_symbols, num_dynamic_syms,
bb4d2ac2
L
6913 dynamic_strings, dynamic_strings_length,
6914 is_rela, 1);
566b0d53 6915 }
252b5132 6916 }
566b0d53 6917
28f997cf
TG
6918 if (is_ia64_vms ())
6919 has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
6920
566b0d53 6921 if (! has_dynamic_reloc)
252b5132
RH
6922 printf (_("\nThere are no dynamic relocations in this file.\n"));
6923 }
6924 else
6925 {
2cf0635d 6926 Elf_Internal_Shdr * section;
b34976b6
AM
6927 unsigned long i;
6928 int found = 0;
252b5132
RH
6929
6930 for (i = 0, section = section_headers;
6931 i < elf_header.e_shnum;
b34976b6 6932 i++, section++)
252b5132
RH
6933 {
6934 if ( section->sh_type != SHT_RELA
6935 && section->sh_type != SHT_REL)
6936 continue;
6937
6938 rel_offset = section->sh_offset;
6939 rel_size = section->sh_size;
6940
6941 if (rel_size)
6942 {
2cf0635d 6943 Elf_Internal_Shdr * strsec;
b34976b6 6944 int is_rela;
103f02d3 6945
252b5132
RH
6946 printf (_("\nRelocation section "));
6947
6948 if (string_table == NULL)
19936277 6949 printf ("%d", section->sh_name);
252b5132 6950 else
74e1a04b 6951 printf ("'%s'", printable_section_name (section));
252b5132
RH
6952
6953 printf (_(" at offset 0x%lx contains %lu entries:\n"),
6954 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
6955
d79b3d50
NC
6956 is_rela = section->sh_type == SHT_RELA;
6957
4fbb74a6
AM
6958 if (section->sh_link != 0
6959 && section->sh_link < elf_header.e_shnum)
af3fc3bc 6960 {
2cf0635d
NC
6961 Elf_Internal_Shdr * symsec;
6962 Elf_Internal_Sym * symtab;
d79b3d50 6963 unsigned long nsyms;
c256ffe7 6964 unsigned long strtablen = 0;
2cf0635d 6965 char * strtab = NULL;
57346661 6966
4fbb74a6 6967 symsec = section_headers + section->sh_link;
08d8fa11
JJ
6968 if (symsec->sh_type != SHT_SYMTAB
6969 && symsec->sh_type != SHT_DYNSYM)
6970 continue;
6971
ba5cdace 6972 symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms);
252b5132 6973
af3fc3bc
AM
6974 if (symtab == NULL)
6975 continue;
252b5132 6976
4fbb74a6
AM
6977 if (symsec->sh_link != 0
6978 && symsec->sh_link < elf_header.e_shnum)
c256ffe7 6979 {
4fbb74a6 6980 strsec = section_headers + symsec->sh_link;
103f02d3 6981
3f5e193b 6982 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
071436c6
NC
6983 1, strsec->sh_size,
6984 _("string table"));
c256ffe7
JJ
6985 strtablen = strtab == NULL ? 0 : strsec->sh_size;
6986 }
252b5132 6987
d79b3d50 6988 dump_relocations (file, rel_offset, rel_size,
bb4d2ac2
L
6989 symtab, nsyms, strtab, strtablen,
6990 is_rela,
6991 symsec->sh_type == SHT_DYNSYM);
d79b3d50
NC
6992 if (strtab)
6993 free (strtab);
6994 free (symtab);
6995 }
6996 else
6997 dump_relocations (file, rel_offset, rel_size,
bb4d2ac2 6998 NULL, 0, NULL, 0, is_rela, 0);
252b5132
RH
6999
7000 found = 1;
7001 }
7002 }
7003
7004 if (! found)
7005 printf (_("\nThere are no relocations in this file.\n"));
7006 }
7007
7008 return 1;
7009}
7010
4d6ed7c8
NC
7011/* An absolute address consists of a section and an offset. If the
7012 section is NULL, the offset itself is the address, otherwise, the
7013 address equals to LOAD_ADDRESS(section) + offset. */
7014
7015struct absaddr
948f632f
DA
7016{
7017 unsigned short section;
7018 bfd_vma offset;
7019};
4d6ed7c8 7020
1949de15
L
7021#define ABSADDR(a) \
7022 ((a).section \
7023 ? section_headers [(a).section].sh_addr + (a).offset \
7024 : (a).offset)
7025
948f632f
DA
7026/* Find the nearest symbol at or below ADDR. Returns the symbol
7027 name, if found, and the offset from the symbol to ADDR. */
4d6ed7c8 7028
4d6ed7c8 7029static void
2cf0635d 7030find_symbol_for_address (Elf_Internal_Sym * symtab,
948f632f
DA
7031 unsigned long nsyms,
7032 const char * strtab,
7033 unsigned long strtab_size,
7034 struct absaddr addr,
7035 const char ** symname,
7036 bfd_vma * offset)
4d6ed7c8 7037{
d3ba0551 7038 bfd_vma dist = 0x100000;
2cf0635d 7039 Elf_Internal_Sym * sym;
948f632f
DA
7040 Elf_Internal_Sym * beg;
7041 Elf_Internal_Sym * end;
2cf0635d 7042 Elf_Internal_Sym * best = NULL;
4d6ed7c8 7043
0b6ae522 7044 REMOVE_ARCH_BITS (addr.offset);
948f632f
DA
7045 beg = symtab;
7046 end = symtab + nsyms;
0b6ae522 7047
948f632f 7048 while (beg < end)
4d6ed7c8 7049 {
948f632f
DA
7050 bfd_vma value;
7051
7052 sym = beg + (end - beg) / 2;
0b6ae522 7053
948f632f 7054 value = sym->st_value;
0b6ae522
DJ
7055 REMOVE_ARCH_BITS (value);
7056
948f632f 7057 if (sym->st_name != 0
4d6ed7c8 7058 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
0b6ae522
DJ
7059 && addr.offset >= value
7060 && addr.offset - value < dist)
4d6ed7c8
NC
7061 {
7062 best = sym;
0b6ae522 7063 dist = addr.offset - value;
4d6ed7c8
NC
7064 if (!dist)
7065 break;
7066 }
948f632f
DA
7067
7068 if (addr.offset < value)
7069 end = sym;
7070 else
7071 beg = sym + 1;
4d6ed7c8 7072 }
1b31d05e 7073
4d6ed7c8
NC
7074 if (best)
7075 {
57346661 7076 *symname = (best->st_name >= strtab_size
2b692964 7077 ? _("<corrupt>") : strtab + best->st_name);
4d6ed7c8
NC
7078 *offset = dist;
7079 return;
7080 }
1b31d05e 7081
4d6ed7c8
NC
7082 *symname = NULL;
7083 *offset = addr.offset;
7084}
7085
948f632f
DA
7086static int
7087symcmp (const void *p, const void *q)
7088{
7089 Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
7090 Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
7091
7092 return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
7093}
7094
7095/* Process the unwind section. */
7096
7097#include "unwind-ia64.h"
7098
7099struct ia64_unw_table_entry
7100{
7101 struct absaddr start;
7102 struct absaddr end;
7103 struct absaddr info;
7104};
7105
7106struct ia64_unw_aux_info
7107{
7108 struct ia64_unw_table_entry *table; /* Unwind table. */
7109 unsigned long table_len; /* Length of unwind table. */
7110 unsigned char * info; /* Unwind info. */
7111 unsigned long info_size; /* Size of unwind info. */
7112 bfd_vma info_addr; /* Starting address of unwind info. */
7113 bfd_vma seg_base; /* Starting address of segment. */
7114 Elf_Internal_Sym * symtab; /* The symbol table. */
7115 unsigned long nsyms; /* Number of symbols. */
7116 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7117 unsigned long nfuns; /* Number of entries in funtab. */
7118 char * strtab; /* The string table. */
7119 unsigned long strtab_size; /* Size of string table. */
7120};
7121
4d6ed7c8 7122static void
2cf0635d 7123dump_ia64_unwind (struct ia64_unw_aux_info * aux)
4d6ed7c8 7124{
2cf0635d 7125 struct ia64_unw_table_entry * tp;
948f632f 7126 unsigned long j, nfuns;
4d6ed7c8 7127 int in_body;
7036c0e1 7128
948f632f
DA
7129 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7130 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7131 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7132 aux->funtab[nfuns++] = aux->symtab[j];
7133 aux->nfuns = nfuns;
7134 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7135
4d6ed7c8
NC
7136 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7137 {
7138 bfd_vma stamp;
7139 bfd_vma offset;
2cf0635d
NC
7140 const unsigned char * dp;
7141 const unsigned char * head;
53774b7e 7142 const unsigned char * end;
2cf0635d 7143 const char * procname;
4d6ed7c8 7144
948f632f 7145 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
57346661 7146 aux->strtab_size, tp->start, &procname, &offset);
4d6ed7c8
NC
7147
7148 fputs ("\n<", stdout);
7149
7150 if (procname)
7151 {
7152 fputs (procname, stdout);
7153
7154 if (offset)
7155 printf ("+%lx", (unsigned long) offset);
7156 }
7157
7158 fputs (">: [", stdout);
7159 print_vma (tp->start.offset, PREFIX_HEX);
7160 fputc ('-', stdout);
7161 print_vma (tp->end.offset, PREFIX_HEX);
86f55779 7162 printf ("], info at +0x%lx\n",
4d6ed7c8
NC
7163 (unsigned long) (tp->info.offset - aux->seg_base));
7164
53774b7e
NC
7165 /* PR 17531: file: 86232b32. */
7166 if (aux->info == NULL)
7167 continue;
7168
7169 /* PR 17531: file: 0997b4d1. */
7170 if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
7171 {
7172 warn (_("Invalid offset %lx in table entry %ld\n"),
7173 (long) tp->info.offset, (long) (tp - aux->table));
7174 continue;
7175 }
7176
1949de15 7177 head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
a4a00738 7178 stamp = byte_get ((unsigned char *) head, sizeof (stamp));
4d6ed7c8 7179
86f55779 7180 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4d6ed7c8
NC
7181 (unsigned) UNW_VER (stamp),
7182 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
7183 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
7184 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
89fac5e3 7185 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
4d6ed7c8
NC
7186
7187 if (UNW_VER (stamp) != 1)
7188 {
2b692964 7189 printf (_("\tUnknown version.\n"));
4d6ed7c8
NC
7190 continue;
7191 }
7192
7193 in_body = 0;
53774b7e
NC
7194 end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
7195 /* PR 17531: file: 16ceda89. */
7196 if (end > aux->info + aux->info_size)
7197 end = aux->info + aux->info_size;
7198 for (dp = head + 8; dp < end;)
b4477bc8 7199 dp = unw_decode (dp, in_body, & in_body, end);
4d6ed7c8 7200 }
948f632f
DA
7201
7202 free (aux->funtab);
4d6ed7c8
NC
7203}
7204
53774b7e 7205static bfd_boolean
2cf0635d
NC
7206slurp_ia64_unwind_table (FILE * file,
7207 struct ia64_unw_aux_info * aux,
7208 Elf_Internal_Shdr * sec)
4d6ed7c8 7209{
89fac5e3 7210 unsigned long size, nrelas, i;
2cf0635d
NC
7211 Elf_Internal_Phdr * seg;
7212 struct ia64_unw_table_entry * tep;
7213 Elf_Internal_Shdr * relsec;
7214 Elf_Internal_Rela * rela;
7215 Elf_Internal_Rela * rp;
7216 unsigned char * table;
7217 unsigned char * tp;
7218 Elf_Internal_Sym * sym;
7219 const char * relname;
4d6ed7c8 7220
53774b7e
NC
7221 aux->table_len = 0;
7222
4d6ed7c8
NC
7223 /* First, find the starting address of the segment that includes
7224 this section: */
7225
7226 if (elf_header.e_phnum)
7227 {
d93f0186 7228 if (! get_program_headers (file))
53774b7e 7229 return FALSE;
4d6ed7c8 7230
d93f0186
NC
7231 for (seg = program_headers;
7232 seg < program_headers + elf_header.e_phnum;
7233 ++seg)
4d6ed7c8
NC
7234 {
7235 if (seg->p_type != PT_LOAD)
7236 continue;
7237
7238 if (sec->sh_addr >= seg->p_vaddr
7239 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7240 {
7241 aux->seg_base = seg->p_vaddr;
7242 break;
7243 }
7244 }
4d6ed7c8
NC
7245 }
7246
7247 /* Second, build the unwind table from the contents of the unwind section: */
7248 size = sec->sh_size;
3f5e193b
NC
7249 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7250 _("unwind table"));
a6e9f9df 7251 if (!table)
53774b7e 7252 return FALSE;
4d6ed7c8 7253
53774b7e 7254 aux->table_len = size / (3 * eh_addr_size);
3f5e193b 7255 aux->table = (struct ia64_unw_table_entry *)
53774b7e 7256 xcmalloc (aux->table_len, sizeof (aux->table[0]));
89fac5e3 7257 tep = aux->table;
53774b7e
NC
7258
7259 for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
4d6ed7c8
NC
7260 {
7261 tep->start.section = SHN_UNDEF;
7262 tep->end.section = SHN_UNDEF;
7263 tep->info.section = SHN_UNDEF;
c6a0c689
AM
7264 tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7265 tep->end.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7266 tep->info.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
4d6ed7c8
NC
7267 tep->start.offset += aux->seg_base;
7268 tep->end.offset += aux->seg_base;
7269 tep->info.offset += aux->seg_base;
7270 }
7271 free (table);
7272
41e92641 7273 /* Third, apply any relocations to the unwind table: */
4d6ed7c8
NC
7274 for (relsec = section_headers;
7275 relsec < section_headers + elf_header.e_shnum;
7276 ++relsec)
7277 {
7278 if (relsec->sh_type != SHT_RELA
4fbb74a6
AM
7279 || relsec->sh_info >= elf_header.e_shnum
7280 || section_headers + relsec->sh_info != sec)
4d6ed7c8
NC
7281 continue;
7282
7283 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7284 & rela, & nrelas))
53774b7e
NC
7285 {
7286 free (aux->table);
7287 aux->table = NULL;
7288 aux->table_len = 0;
7289 return FALSE;
7290 }
4d6ed7c8
NC
7291
7292 for (rp = rela; rp < rela + nrelas; ++rp)
7293 {
aca88567
NC
7294 relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
7295 sym = aux->symtab + get_reloc_symindex (rp->r_info);
4d6ed7c8 7296
82b1b41b
NC
7297 /* PR 17531: file: 9fa67536. */
7298 if (relname == NULL)
7299 {
7300 warn (_("Skipping unknown relocation type: %u\n"), get_reloc_type (rp->r_info));
7301 continue;
7302 }
948f632f 7303
0112cd26 7304 if (! const_strneq (relname, "R_IA64_SEGREL"))
4d6ed7c8 7305 {
82b1b41b 7306 warn (_("Skipping unexpected relocation type: %s\n"), relname);
4d6ed7c8
NC
7307 continue;
7308 }
7309
89fac5e3 7310 i = rp->r_offset / (3 * eh_addr_size);
4d6ed7c8 7311
53774b7e
NC
7312 /* PR 17531: file: 5bc8d9bf. */
7313 if (i >= aux->table_len)
7314 {
7315 warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
7316 continue;
7317 }
7318
7319 switch (rp->r_offset / eh_addr_size % 3)
4d6ed7c8
NC
7320 {
7321 case 0:
7322 aux->table[i].start.section = sym->st_shndx;
e466bc6e 7323 aux->table[i].start.offset = rp->r_addend + sym->st_value;
4d6ed7c8
NC
7324 break;
7325 case 1:
7326 aux->table[i].end.section = sym->st_shndx;
e466bc6e 7327 aux->table[i].end.offset = rp->r_addend + sym->st_value;
4d6ed7c8
NC
7328 break;
7329 case 2:
7330 aux->table[i].info.section = sym->st_shndx;
e466bc6e 7331 aux->table[i].info.offset = rp->r_addend + sym->st_value;
4d6ed7c8
NC
7332 break;
7333 default:
7334 break;
7335 }
7336 }
7337
7338 free (rela);
7339 }
7340
53774b7e 7341 return TRUE;
4d6ed7c8
NC
7342}
7343
1b31d05e 7344static void
2cf0635d 7345ia64_process_unwind (FILE * file)
4d6ed7c8 7346{
2cf0635d
NC
7347 Elf_Internal_Shdr * sec;
7348 Elf_Internal_Shdr * unwsec = NULL;
7349 Elf_Internal_Shdr * strsec;
89fac5e3 7350 unsigned long i, unwcount = 0, unwstart = 0;
57346661 7351 struct ia64_unw_aux_info aux;
f1467e33 7352
4d6ed7c8
NC
7353 memset (& aux, 0, sizeof (aux));
7354
4d6ed7c8
NC
7355 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7356 {
c256ffe7 7357 if (sec->sh_type == SHT_SYMTAB
4fbb74a6 7358 && sec->sh_link < elf_header.e_shnum)
4d6ed7c8 7359 {
ba5cdace 7360 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
4d6ed7c8 7361
4fbb74a6 7362 strsec = section_headers + sec->sh_link;
4082ef84
NC
7363 if (aux.strtab != NULL)
7364 {
7365 error (_("Multiple auxillary string tables encountered\n"));
7366 free (aux.strtab);
7367 }
3f5e193b
NC
7368 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7369 1, strsec->sh_size,
7370 _("string table"));
c256ffe7 7371 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
4d6ed7c8
NC
7372 }
7373 else if (sec->sh_type == SHT_IA_64_UNWIND)
579f31ac
JJ
7374 unwcount++;
7375 }
7376
7377 if (!unwcount)
7378 printf (_("\nThere are no unwind sections in this file.\n"));
7379
7380 while (unwcount-- > 0)
7381 {
2cf0635d 7382 char * suffix;
579f31ac
JJ
7383 size_t len, len2;
7384
4082ef84 7385 for (i = unwstart, sec = section_headers + unwstart, unwsec = NULL;
579f31ac
JJ
7386 i < elf_header.e_shnum; ++i, ++sec)
7387 if (sec->sh_type == SHT_IA_64_UNWIND)
7388 {
7389 unwsec = sec;
7390 break;
7391 }
4082ef84
NC
7392 /* We have already counted the number of SHT_IA64_UNWIND
7393 sections so the loop above should never fail. */
7394 assert (unwsec != NULL);
579f31ac
JJ
7395
7396 unwstart = i + 1;
7397 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
7398
e4b17d5c
L
7399 if ((unwsec->sh_flags & SHF_GROUP) != 0)
7400 {
7401 /* We need to find which section group it is in. */
4082ef84 7402 struct group_list * g;
e4b17d5c 7403
4082ef84
NC
7404 if (section_headers_groups == NULL
7405 || section_headers_groups [i] == NULL)
7406 i = elf_header.e_shnum;
7407 else
e4b17d5c 7408 {
4082ef84 7409 g = section_headers_groups [i]->root;
18bd398b 7410
4082ef84
NC
7411 for (; g != NULL; g = g->next)
7412 {
7413 sec = section_headers + g->section_index;
e4b17d5c 7414
4082ef84
NC
7415 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
7416 break;
7417 }
7418
7419 if (g == NULL)
7420 i = elf_header.e_shnum;
7421 }
e4b17d5c 7422 }
18bd398b 7423 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
579f31ac 7424 {
18bd398b 7425 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
579f31ac
JJ
7426 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
7427 suffix = SECTION_NAME (unwsec) + len;
7428 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7429 ++i, ++sec)
18bd398b
NC
7430 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
7431 && streq (SECTION_NAME (sec) + len2, suffix))
579f31ac
JJ
7432 break;
7433 }
7434 else
7435 {
7436 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
18bd398b 7437 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
579f31ac
JJ
7438 len = sizeof (ELF_STRING_ia64_unwind) - 1;
7439 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
7440 suffix = "";
18bd398b 7441 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
579f31ac
JJ
7442 suffix = SECTION_NAME (unwsec) + len;
7443 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7444 ++i, ++sec)
18bd398b
NC
7445 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
7446 && streq (SECTION_NAME (sec) + len2, suffix))
579f31ac
JJ
7447 break;
7448 }
7449
7450 if (i == elf_header.e_shnum)
7451 {
7452 printf (_("\nCould not find unwind info section for "));
7453
7454 if (string_table == NULL)
7455 printf ("%d", unwsec->sh_name);
7456 else
74e1a04b 7457 printf ("'%s'", printable_section_name (unwsec));
579f31ac
JJ
7458 }
7459 else
4d6ed7c8 7460 {
4d6ed7c8 7461 aux.info_addr = sec->sh_addr;
3f5e193b 7462 aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
4082ef84
NC
7463 sec->sh_size,
7464 _("unwind info"));
59245841 7465 aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
4d6ed7c8 7466
579f31ac 7467 printf (_("\nUnwind section "));
4d6ed7c8 7468
579f31ac
JJ
7469 if (string_table == NULL)
7470 printf ("%d", unwsec->sh_name);
7471 else
74e1a04b 7472 printf ("'%s'", printable_section_name (unwsec));
4d6ed7c8 7473
579f31ac 7474 printf (_(" at offset 0x%lx contains %lu entries:\n"),
e59b4dfb 7475 (unsigned long) unwsec->sh_offset,
89fac5e3 7476 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
4d6ed7c8 7477
53774b7e
NC
7478 if (slurp_ia64_unwind_table (file, & aux, unwsec)
7479 && aux.table_len > 0)
579f31ac
JJ
7480 dump_ia64_unwind (& aux);
7481
7482 if (aux.table)
7483 free ((char *) aux.table);
7484 if (aux.info)
7485 free ((char *) aux.info);
7486 aux.table = NULL;
7487 aux.info = NULL;
7488 }
4d6ed7c8 7489 }
4d6ed7c8 7490
4d6ed7c8
NC
7491 if (aux.symtab)
7492 free (aux.symtab);
7493 if (aux.strtab)
7494 free ((char *) aux.strtab);
4d6ed7c8
NC
7495}
7496
3f5e193b
NC
7497struct hppa_unw_table_entry
7498 {
7499 struct absaddr start;
7500 struct absaddr end;
948f632f 7501 unsigned int Cannot_unwind:1; /* 0 */
3f5e193b
NC
7502 unsigned int Millicode:1; /* 1 */
7503 unsigned int Millicode_save_sr0:1; /* 2 */
7504 unsigned int Region_description:2; /* 3..4 */
7505 unsigned int reserved1:1; /* 5 */
7506 unsigned int Entry_SR:1; /* 6 */
7507 unsigned int Entry_FR:4; /* number saved */ /* 7..10 */
7508 unsigned int Entry_GR:5; /* number saved */ /* 11..15 */
7509 unsigned int Args_stored:1; /* 16 */
948f632f
DA
7510 unsigned int Variable_Frame:1; /* 17 */
7511 unsigned int Separate_Package_Body:1; /* 18 */
3f5e193b 7512 unsigned int Frame_Extension_Millicode:1; /* 19 */
948f632f
DA
7513 unsigned int Stack_Overflow_Check:1; /* 20 */
7514 unsigned int Two_Instruction_SP_Increment:1;/* 21 */
3f5e193b
NC
7515 unsigned int Ada_Region:1; /* 22 */
7516 unsigned int cxx_info:1; /* 23 */
948f632f
DA
7517 unsigned int cxx_try_catch:1; /* 24 */
7518 unsigned int sched_entry_seq:1; /* 25 */
3f5e193b 7519 unsigned int reserved2:1; /* 26 */
948f632f
DA
7520 unsigned int Save_SP:1; /* 27 */
7521 unsigned int Save_RP:1; /* 28 */
3f5e193b
NC
7522 unsigned int Save_MRP_in_frame:1; /* 29 */
7523 unsigned int extn_ptr_defined:1; /* 30 */
948f632f 7524 unsigned int Cleanup_defined:1; /* 31 */
3f5e193b 7525
948f632f
DA
7526 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
7527 unsigned int HP_UX_interrupt_marker:1; /* 1 */
3f5e193b 7528 unsigned int Large_frame:1; /* 2 */
948f632f 7529 unsigned int Pseudo_SP_Set:1; /* 3 */
3f5e193b
NC
7530 unsigned int reserved4:1; /* 4 */
7531 unsigned int Total_frame_size:27; /* 5..31 */
7532 };
7533
57346661 7534struct hppa_unw_aux_info
948f632f
DA
7535{
7536 struct hppa_unw_table_entry * table; /* Unwind table. */
7537 unsigned long table_len; /* Length of unwind table. */
7538 bfd_vma seg_base; /* Starting address of segment. */
7539 Elf_Internal_Sym * symtab; /* The symbol table. */
7540 unsigned long nsyms; /* Number of symbols. */
7541 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7542 unsigned long nfuns; /* Number of entries in funtab. */
7543 char * strtab; /* The string table. */
7544 unsigned long strtab_size; /* Size of string table. */
7545};
57346661
AM
7546
7547static void
2cf0635d 7548dump_hppa_unwind (struct hppa_unw_aux_info * aux)
57346661 7549{
2cf0635d 7550 struct hppa_unw_table_entry * tp;
948f632f
DA
7551 unsigned long j, nfuns;
7552
7553 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7554 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7555 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7556 aux->funtab[nfuns++] = aux->symtab[j];
7557 aux->nfuns = nfuns;
7558 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
57346661 7559
57346661
AM
7560 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7561 {
7562 bfd_vma offset;
2cf0635d 7563 const char * procname;
57346661 7564
948f632f 7565 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
57346661
AM
7566 aux->strtab_size, tp->start, &procname,
7567 &offset);
7568
7569 fputs ("\n<", stdout);
7570
7571 if (procname)
7572 {
7573 fputs (procname, stdout);
7574
7575 if (offset)
7576 printf ("+%lx", (unsigned long) offset);
7577 }
7578
7579 fputs (">: [", stdout);
7580 print_vma (tp->start.offset, PREFIX_HEX);
7581 fputc ('-', stdout);
7582 print_vma (tp->end.offset, PREFIX_HEX);
7583 printf ("]\n\t");
7584
18bd398b
NC
7585#define PF(_m) if (tp->_m) printf (#_m " ");
7586#define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
57346661
AM
7587 PF(Cannot_unwind);
7588 PF(Millicode);
7589 PF(Millicode_save_sr0);
18bd398b 7590 /* PV(Region_description); */
57346661
AM
7591 PF(Entry_SR);
7592 PV(Entry_FR);
7593 PV(Entry_GR);
7594 PF(Args_stored);
7595 PF(Variable_Frame);
7596 PF(Separate_Package_Body);
7597 PF(Frame_Extension_Millicode);
7598 PF(Stack_Overflow_Check);
7599 PF(Two_Instruction_SP_Increment);
7600 PF(Ada_Region);
7601 PF(cxx_info);
7602 PF(cxx_try_catch);
7603 PF(sched_entry_seq);
7604 PF(Save_SP);
7605 PF(Save_RP);
7606 PF(Save_MRP_in_frame);
7607 PF(extn_ptr_defined);
7608 PF(Cleanup_defined);
7609 PF(MPE_XL_interrupt_marker);
7610 PF(HP_UX_interrupt_marker);
7611 PF(Large_frame);
7612 PF(Pseudo_SP_Set);
7613 PV(Total_frame_size);
7614#undef PF
7615#undef PV
7616 }
7617
18bd398b 7618 printf ("\n");
948f632f
DA
7619
7620 free (aux->funtab);
57346661
AM
7621}
7622
7623static int
2cf0635d
NC
7624slurp_hppa_unwind_table (FILE * file,
7625 struct hppa_unw_aux_info * aux,
7626 Elf_Internal_Shdr * sec)
57346661 7627{
1c0751b2 7628 unsigned long size, unw_ent_size, nentries, nrelas, i;
2cf0635d
NC
7629 Elf_Internal_Phdr * seg;
7630 struct hppa_unw_table_entry * tep;
7631 Elf_Internal_Shdr * relsec;
7632 Elf_Internal_Rela * rela;
7633 Elf_Internal_Rela * rp;
7634 unsigned char * table;
7635 unsigned char * tp;
7636 Elf_Internal_Sym * sym;
7637 const char * relname;
57346661 7638
57346661
AM
7639 /* First, find the starting address of the segment that includes
7640 this section. */
7641
7642 if (elf_header.e_phnum)
7643 {
7644 if (! get_program_headers (file))
7645 return 0;
7646
7647 for (seg = program_headers;
7648 seg < program_headers + elf_header.e_phnum;
7649 ++seg)
7650 {
7651 if (seg->p_type != PT_LOAD)
7652 continue;
7653
7654 if (sec->sh_addr >= seg->p_vaddr
7655 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7656 {
7657 aux->seg_base = seg->p_vaddr;
7658 break;
7659 }
7660 }
7661 }
7662
7663 /* Second, build the unwind table from the contents of the unwind
7664 section. */
7665 size = sec->sh_size;
3f5e193b
NC
7666 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7667 _("unwind table"));
57346661
AM
7668 if (!table)
7669 return 0;
7670
1c0751b2
DA
7671 unw_ent_size = 16;
7672 nentries = size / unw_ent_size;
7673 size = unw_ent_size * nentries;
57346661 7674
3f5e193b
NC
7675 tep = aux->table = (struct hppa_unw_table_entry *)
7676 xcmalloc (nentries, sizeof (aux->table[0]));
57346661 7677
1c0751b2 7678 for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
57346661
AM
7679 {
7680 unsigned int tmp1, tmp2;
7681
7682 tep->start.section = SHN_UNDEF;
7683 tep->end.section = SHN_UNDEF;
7684
1c0751b2
DA
7685 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
7686 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
7687 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
7688 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
7689
7690 tep->start.offset += aux->seg_base;
7691 tep->end.offset += aux->seg_base;
57346661
AM
7692
7693 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
7694 tep->Millicode = (tmp1 >> 30) & 0x1;
7695 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
7696 tep->Region_description = (tmp1 >> 27) & 0x3;
7697 tep->reserved1 = (tmp1 >> 26) & 0x1;
7698 tep->Entry_SR = (tmp1 >> 25) & 0x1;
7699 tep->Entry_FR = (tmp1 >> 21) & 0xf;
7700 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
7701 tep->Args_stored = (tmp1 >> 15) & 0x1;
7702 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
7703 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
7704 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
7705 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
7706 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
7707 tep->Ada_Region = (tmp1 >> 9) & 0x1;
7708 tep->cxx_info = (tmp1 >> 8) & 0x1;
7709 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
7710 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
7711 tep->reserved2 = (tmp1 >> 5) & 0x1;
7712 tep->Save_SP = (tmp1 >> 4) & 0x1;
7713 tep->Save_RP = (tmp1 >> 3) & 0x1;
7714 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
7715 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
7716 tep->Cleanup_defined = tmp1 & 0x1;
7717
7718 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
7719 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
7720 tep->Large_frame = (tmp2 >> 29) & 0x1;
7721 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
7722 tep->reserved4 = (tmp2 >> 27) & 0x1;
7723 tep->Total_frame_size = tmp2 & 0x7ffffff;
57346661
AM
7724 }
7725 free (table);
7726
7727 /* Third, apply any relocations to the unwind table. */
57346661
AM
7728 for (relsec = section_headers;
7729 relsec < section_headers + elf_header.e_shnum;
7730 ++relsec)
7731 {
7732 if (relsec->sh_type != SHT_RELA
4fbb74a6
AM
7733 || relsec->sh_info >= elf_header.e_shnum
7734 || section_headers + relsec->sh_info != sec)
57346661
AM
7735 continue;
7736
7737 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7738 & rela, & nrelas))
7739 return 0;
7740
7741 for (rp = rela; rp < rela + nrelas; ++rp)
7742 {
aca88567
NC
7743 relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
7744 sym = aux->symtab + get_reloc_symindex (rp->r_info);
57346661
AM
7745
7746 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
0112cd26 7747 if (! const_strneq (relname, "R_PARISC_SEGREL"))
57346661
AM
7748 {
7749 warn (_("Skipping unexpected relocation type %s\n"), relname);
7750 continue;
7751 }
7752
7753 i = rp->r_offset / unw_ent_size;
7754
89fac5e3 7755 switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
57346661
AM
7756 {
7757 case 0:
7758 aux->table[i].start.section = sym->st_shndx;
1e456d54 7759 aux->table[i].start.offset = sym->st_value + rp->r_addend;
57346661
AM
7760 break;
7761 case 1:
7762 aux->table[i].end.section = sym->st_shndx;
1e456d54 7763 aux->table[i].end.offset = sym->st_value + rp->r_addend;
57346661
AM
7764 break;
7765 default:
7766 break;
7767 }
7768 }
7769
7770 free (rela);
7771 }
7772
1c0751b2 7773 aux->table_len = nentries;
57346661
AM
7774
7775 return 1;
7776}
7777
1b31d05e 7778static void
2cf0635d 7779hppa_process_unwind (FILE * file)
57346661 7780{
57346661 7781 struct hppa_unw_aux_info aux;
2cf0635d
NC
7782 Elf_Internal_Shdr * unwsec = NULL;
7783 Elf_Internal_Shdr * strsec;
7784 Elf_Internal_Shdr * sec;
18bd398b 7785 unsigned long i;
57346661 7786
c256ffe7 7787 if (string_table == NULL)
1b31d05e
NC
7788 return;
7789
7790 memset (& aux, 0, sizeof (aux));
57346661
AM
7791
7792 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7793 {
c256ffe7 7794 if (sec->sh_type == SHT_SYMTAB
4fbb74a6 7795 && sec->sh_link < elf_header.e_shnum)
57346661 7796 {
ba5cdace 7797 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
57346661 7798
4fbb74a6 7799 strsec = section_headers + sec->sh_link;
4082ef84
NC
7800 if (aux.strtab != NULL)
7801 {
7802 error (_("Multiple auxillary string tables encountered\n"));
7803 free (aux.strtab);
7804 }
3f5e193b
NC
7805 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7806 1, strsec->sh_size,
7807 _("string table"));
c256ffe7 7808 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
57346661 7809 }
18bd398b 7810 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
57346661
AM
7811 unwsec = sec;
7812 }
7813
7814 if (!unwsec)
7815 printf (_("\nThere are no unwind sections in this file.\n"));
7816
7817 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7818 {
18bd398b 7819 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
57346661 7820 {
74e1a04b
NC
7821 printf (_("\nUnwind section '%s' at offset 0x%lx contains %lu entries:\n"),
7822 printable_section_name (sec),
57346661 7823 (unsigned long) sec->sh_offset,
89fac5e3 7824 (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
57346661
AM
7825
7826 slurp_hppa_unwind_table (file, &aux, sec);
7827 if (aux.table_len > 0)
7828 dump_hppa_unwind (&aux);
7829
7830 if (aux.table)
7831 free ((char *) aux.table);
7832 aux.table = NULL;
7833 }
7834 }
7835
7836 if (aux.symtab)
7837 free (aux.symtab);
7838 if (aux.strtab)
7839 free ((char *) aux.strtab);
57346661
AM
7840}
7841
0b6ae522
DJ
7842struct arm_section
7843{
a734115a
NC
7844 unsigned char * data; /* The unwind data. */
7845 Elf_Internal_Shdr * sec; /* The cached unwind section header. */
7846 Elf_Internal_Rela * rela; /* The cached relocations for this section. */
7847 unsigned long nrelas; /* The number of relocations. */
7848 unsigned int rel_type; /* REL or RELA ? */
7849 Elf_Internal_Rela * next_rela; /* Cyclic pointer to the next reloc to process. */
0b6ae522
DJ
7850};
7851
7852struct arm_unw_aux_info
7853{
a734115a
NC
7854 FILE * file; /* The file containing the unwind sections. */
7855 Elf_Internal_Sym * symtab; /* The file's symbol table. */
7856 unsigned long nsyms; /* Number of symbols. */
948f632f
DA
7857 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7858 unsigned long nfuns; /* Number of these symbols. */
a734115a
NC
7859 char * strtab; /* The file's string table. */
7860 unsigned long strtab_size; /* Size of string table. */
0b6ae522
DJ
7861};
7862
7863static const char *
7864arm_print_vma_and_name (struct arm_unw_aux_info *aux,
7865 bfd_vma fn, struct absaddr addr)
7866{
7867 const char *procname;
7868 bfd_vma sym_offset;
7869
7870 if (addr.section == SHN_UNDEF)
7871 addr.offset = fn;
7872
948f632f 7873 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
0b6ae522
DJ
7874 aux->strtab_size, addr, &procname,
7875 &sym_offset);
7876
7877 print_vma (fn, PREFIX_HEX);
7878
7879 if (procname)
7880 {
7881 fputs (" <", stdout);
7882 fputs (procname, stdout);
7883
7884 if (sym_offset)
7885 printf ("+0x%lx", (unsigned long) sym_offset);
7886 fputc ('>', stdout);
7887 }
7888
7889 return procname;
7890}
7891
7892static void
7893arm_free_section (struct arm_section *arm_sec)
7894{
7895 if (arm_sec->data != NULL)
7896 free (arm_sec->data);
7897
7898 if (arm_sec->rela != NULL)
7899 free (arm_sec->rela);
7900}
7901
a734115a
NC
7902/* 1) If SEC does not match the one cached in ARM_SEC, then free the current
7903 cached section and install SEC instead.
7904 2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
7905 and return its valued in * WORDP, relocating if necessary.
1b31d05e 7906 3) Update the NEXT_RELA field in ARM_SEC and store the section index and
a734115a 7907 relocation's offset in ADDR.
1b31d05e
NC
7908 4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
7909 into the string table of the symbol associated with the reloc. If no
7910 reloc was applied store -1 there.
7911 5) Return TRUE upon success, FALSE otherwise. */
a734115a
NC
7912
7913static bfd_boolean
1b31d05e
NC
7914get_unwind_section_word (struct arm_unw_aux_info * aux,
7915 struct arm_section * arm_sec,
7916 Elf_Internal_Shdr * sec,
7917 bfd_vma word_offset,
7918 unsigned int * wordp,
7919 struct absaddr * addr,
7920 bfd_vma * sym_name)
0b6ae522
DJ
7921{
7922 Elf_Internal_Rela *rp;
7923 Elf_Internal_Sym *sym;
7924 const char * relname;
7925 unsigned int word;
7926 bfd_boolean wrapped;
7927
e0a31db1
NC
7928 if (sec == NULL || arm_sec == NULL)
7929 return FALSE;
7930
0b6ae522
DJ
7931 addr->section = SHN_UNDEF;
7932 addr->offset = 0;
7933
1b31d05e
NC
7934 if (sym_name != NULL)
7935 *sym_name = (bfd_vma) -1;
7936
a734115a 7937 /* If necessary, update the section cache. */
0b6ae522
DJ
7938 if (sec != arm_sec->sec)
7939 {
7940 Elf_Internal_Shdr *relsec;
7941
7942 arm_free_section (arm_sec);
7943
7944 arm_sec->sec = sec;
7945 arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
7946 sec->sh_size, _("unwind data"));
0b6ae522
DJ
7947 arm_sec->rela = NULL;
7948 arm_sec->nrelas = 0;
7949
7950 for (relsec = section_headers;
7951 relsec < section_headers + elf_header.e_shnum;
7952 ++relsec)
7953 {
7954 if (relsec->sh_info >= elf_header.e_shnum
1ae40aa4
NC
7955 || section_headers + relsec->sh_info != sec
7956 /* PR 15745: Check the section type as well. */
7957 || (relsec->sh_type != SHT_REL
7958 && relsec->sh_type != SHT_RELA))
0b6ae522
DJ
7959 continue;
7960
a734115a 7961 arm_sec->rel_type = relsec->sh_type;
0b6ae522
DJ
7962 if (relsec->sh_type == SHT_REL)
7963 {
7964 if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
7965 relsec->sh_size,
7966 & arm_sec->rela, & arm_sec->nrelas))
a734115a 7967 return FALSE;
0b6ae522 7968 }
1ae40aa4 7969 else /* relsec->sh_type == SHT_RELA */
0b6ae522
DJ
7970 {
7971 if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
7972 relsec->sh_size,
7973 & arm_sec->rela, & arm_sec->nrelas))
a734115a 7974 return FALSE;
0b6ae522 7975 }
1ae40aa4 7976 break;
0b6ae522
DJ
7977 }
7978
7979 arm_sec->next_rela = arm_sec->rela;
7980 }
7981
a734115a 7982 /* If there is no unwind data we can do nothing. */
0b6ae522 7983 if (arm_sec->data == NULL)
a734115a 7984 return FALSE;
0b6ae522 7985
e0a31db1 7986 /* If the offset is invalid then fail. */
1a915552
NC
7987 if (word_offset > (sec->sh_size - 4)
7988 /* PR 18879 */
7989 || (sec->sh_size < 5 && word_offset >= sec->sh_size)
7990 || ((bfd_signed_vma) word_offset) < 0)
e0a31db1
NC
7991 return FALSE;
7992
a734115a 7993 /* Get the word at the required offset. */
0b6ae522
DJ
7994 word = byte_get (arm_sec->data + word_offset, 4);
7995
0eff7165
NC
7996 /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128. */
7997 if (arm_sec->rela == NULL)
7998 {
7999 * wordp = word;
8000 return TRUE;
8001 }
8002
a734115a 8003 /* Look through the relocs to find the one that applies to the provided offset. */
0b6ae522
DJ
8004 wrapped = FALSE;
8005 for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
8006 {
8007 bfd_vma prelval, offset;
8008
8009 if (rp->r_offset > word_offset && !wrapped)
8010 {
8011 rp = arm_sec->rela;
8012 wrapped = TRUE;
8013 }
8014 if (rp->r_offset > word_offset)
8015 break;
8016
8017 if (rp->r_offset & 3)
8018 {
8019 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
8020 (unsigned long) rp->r_offset);
8021 continue;
8022 }
8023
8024 if (rp->r_offset < word_offset)
8025 continue;
8026
74e1a04b
NC
8027 /* PR 17531: file: 027-161405-0.004 */
8028 if (aux->symtab == NULL)
8029 continue;
8030
0b6ae522
DJ
8031 if (arm_sec->rel_type == SHT_REL)
8032 {
8033 offset = word & 0x7fffffff;
8034 if (offset & 0x40000000)
8035 offset |= ~ (bfd_vma) 0x7fffffff;
8036 }
a734115a 8037 else if (arm_sec->rel_type == SHT_RELA)
0b6ae522 8038 offset = rp->r_addend;
a734115a 8039 else
74e1a04b
NC
8040 {
8041 error (_("Unknown section relocation type %d encountered\n"),
8042 arm_sec->rel_type);
8043 break;
8044 }
0b6ae522 8045
071436c6
NC
8046 /* PR 17531 file: 027-1241568-0.004. */
8047 if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
8048 {
8049 error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
8050 (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
8051 break;
8052 }
8053
8054 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
0b6ae522
DJ
8055 offset += sym->st_value;
8056 prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
8057
a734115a
NC
8058 /* Check that we are processing the expected reloc type. */
8059 if (elf_header.e_machine == EM_ARM)
8060 {
8061 relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
071436c6
NC
8062 if (relname == NULL)
8063 {
8064 warn (_("Skipping unknown ARM relocation type: %d\n"),
8065 (int) ELF32_R_TYPE (rp->r_info));
8066 continue;
8067 }
a734115a
NC
8068
8069 if (streq (relname, "R_ARM_NONE"))
8070 continue;
0b4362b0 8071
a734115a
NC
8072 if (! streq (relname, "R_ARM_PREL31"))
8073 {
071436c6 8074 warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
a734115a
NC
8075 continue;
8076 }
8077 }
8078 else if (elf_header.e_machine == EM_TI_C6000)
8079 {
8080 relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
071436c6
NC
8081 if (relname == NULL)
8082 {
8083 warn (_("Skipping unknown C6000 relocation type: %d\n"),
8084 (int) ELF32_R_TYPE (rp->r_info));
8085 continue;
8086 }
0b4362b0 8087
a734115a
NC
8088 if (streq (relname, "R_C6000_NONE"))
8089 continue;
8090
8091 if (! streq (relname, "R_C6000_PREL31"))
8092 {
071436c6 8093 warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
a734115a
NC
8094 continue;
8095 }
8096
8097 prelval >>= 1;
8098 }
8099 else
74e1a04b
NC
8100 {
8101 /* This function currently only supports ARM and TI unwinders. */
8102 warn (_("Only TI and ARM unwinders are currently supported\n"));
8103 break;
8104 }
fa197c1c 8105
0b6ae522
DJ
8106 word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
8107 addr->section = sym->st_shndx;
8108 addr->offset = offset;
74e1a04b 8109
1b31d05e
NC
8110 if (sym_name)
8111 * sym_name = sym->st_name;
0b6ae522
DJ
8112 break;
8113 }
8114
8115 *wordp = word;
8116 arm_sec->next_rela = rp;
8117
a734115a 8118 return TRUE;
0b6ae522
DJ
8119}
8120
a734115a
NC
8121static const char *tic6x_unwind_regnames[16] =
8122{
0b4362b0
RM
8123 "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
8124 "A14", "A13", "A12", "A11", "A10",
a734115a
NC
8125 "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
8126};
fa197c1c 8127
0b6ae522 8128static void
fa197c1c 8129decode_tic6x_unwind_regmask (unsigned int mask)
0b6ae522 8130{
fa197c1c
PB
8131 int i;
8132
8133 for (i = 12; mask; mask >>= 1, i--)
8134 {
8135 if (mask & 1)
8136 {
8137 fputs (tic6x_unwind_regnames[i], stdout);
8138 if (mask > 1)
8139 fputs (", ", stdout);
8140 }
8141 }
8142}
0b6ae522
DJ
8143
8144#define ADVANCE \
8145 if (remaining == 0 && more_words) \
8146 { \
8147 data_offset += 4; \
1b31d05e
NC
8148 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, \
8149 data_offset, & word, & addr, NULL)) \
0b6ae522
DJ
8150 return; \
8151 remaining = 4; \
8152 more_words--; \
8153 } \
8154
8155#define GET_OP(OP) \
8156 ADVANCE; \
8157 if (remaining) \
8158 { \
8159 remaining--; \
8160 (OP) = word >> 24; \
8161 word <<= 8; \
8162 } \
8163 else \
8164 { \
2b692964 8165 printf (_("[Truncated opcode]\n")); \
0b6ae522
DJ
8166 return; \
8167 } \
cc5914eb 8168 printf ("0x%02x ", OP)
0b6ae522 8169
fa197c1c 8170static void
948f632f
DA
8171decode_arm_unwind_bytecode (struct arm_unw_aux_info * aux,
8172 unsigned int word,
8173 unsigned int remaining,
8174 unsigned int more_words,
8175 bfd_vma data_offset,
8176 Elf_Internal_Shdr * data_sec,
8177 struct arm_section * data_arm_sec)
fa197c1c
PB
8178{
8179 struct absaddr addr;
0b6ae522
DJ
8180
8181 /* Decode the unwinding instructions. */
8182 while (1)
8183 {
8184 unsigned int op, op2;
8185
8186 ADVANCE;
8187 if (remaining == 0)
8188 break;
8189 remaining--;
8190 op = word >> 24;
8191 word <<= 8;
8192
cc5914eb 8193 printf (" 0x%02x ", op);
0b6ae522
DJ
8194
8195 if ((op & 0xc0) == 0x00)
8196 {
8197 int offset = ((op & 0x3f) << 2) + 4;
61865e30 8198
cc5914eb 8199 printf (" vsp = vsp + %d", offset);
0b6ae522
DJ
8200 }
8201 else if ((op & 0xc0) == 0x40)
8202 {
8203 int offset = ((op & 0x3f) << 2) + 4;
61865e30 8204
cc5914eb 8205 printf (" vsp = vsp - %d", offset);
0b6ae522
DJ
8206 }
8207 else if ((op & 0xf0) == 0x80)
8208 {
8209 GET_OP (op2);
8210 if (op == 0x80 && op2 == 0)
8211 printf (_("Refuse to unwind"));
8212 else
8213 {
8214 unsigned int mask = ((op & 0x0f) << 8) | op2;
8215 int first = 1;
8216 int i;
2b692964 8217
0b6ae522
DJ
8218 printf ("pop {");
8219 for (i = 0; i < 12; i++)
8220 if (mask & (1 << i))
8221 {
8222 if (first)
8223 first = 0;
8224 else
8225 printf (", ");
8226 printf ("r%d", 4 + i);
8227 }
8228 printf ("}");
8229 }
8230 }
8231 else if ((op & 0xf0) == 0x90)
8232 {
8233 if (op == 0x9d || op == 0x9f)
8234 printf (_(" [Reserved]"));
8235 else
cc5914eb 8236 printf (" vsp = r%d", op & 0x0f);
0b6ae522
DJ
8237 }
8238 else if ((op & 0xf0) == 0xa0)
8239 {
8240 int end = 4 + (op & 0x07);
8241 int first = 1;
8242 int i;
61865e30 8243
0b6ae522
DJ
8244 printf (" pop {");
8245 for (i = 4; i <= end; i++)
8246 {
8247 if (first)
8248 first = 0;
8249 else
8250 printf (", ");
8251 printf ("r%d", i);
8252 }
8253 if (op & 0x08)
8254 {
1b31d05e 8255 if (!first)
0b6ae522
DJ
8256 printf (", ");
8257 printf ("r14");
8258 }
8259 printf ("}");
8260 }
8261 else if (op == 0xb0)
8262 printf (_(" finish"));
8263 else if (op == 0xb1)
8264 {
8265 GET_OP (op2);
8266 if (op2 == 0 || (op2 & 0xf0) != 0)
8267 printf (_("[Spare]"));
8268 else
8269 {
8270 unsigned int mask = op2 & 0x0f;
8271 int first = 1;
8272 int i;
61865e30 8273
0b6ae522
DJ
8274 printf ("pop {");
8275 for (i = 0; i < 12; i++)
8276 if (mask & (1 << i))
8277 {
8278 if (first)
8279 first = 0;
8280 else
8281 printf (", ");
8282 printf ("r%d", i);
8283 }
8284 printf ("}");
8285 }
8286 }
8287 else if (op == 0xb2)
8288 {
b115cf96 8289 unsigned char buf[9];
0b6ae522
DJ
8290 unsigned int i, len;
8291 unsigned long offset;
61865e30 8292
b115cf96 8293 for (i = 0; i < sizeof (buf); i++)
0b6ae522
DJ
8294 {
8295 GET_OP (buf[i]);
8296 if ((buf[i] & 0x80) == 0)
8297 break;
8298 }
4082ef84
NC
8299 if (i == sizeof (buf))
8300 printf (_("corrupt change to vsp"));
8301 else
8302 {
8303 offset = read_uleb128 (buf, &len, buf + i + 1);
8304 assert (len == i + 1);
8305 offset = offset * 4 + 0x204;
8306 printf ("vsp = vsp + %ld", offset);
8307 }
0b6ae522 8308 }
61865e30 8309 else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
0b6ae522 8310 {
61865e30
NC
8311 unsigned int first, last;
8312
8313 GET_OP (op2);
8314 first = op2 >> 4;
8315 last = op2 & 0x0f;
8316 if (op == 0xc8)
8317 first = first + 16;
8318 printf ("pop {D%d", first);
8319 if (last)
8320 printf ("-D%d", first + last);
8321 printf ("}");
8322 }
8323 else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
8324 {
8325 unsigned int count = op & 0x07;
8326
8327 printf ("pop {D8");
8328 if (count)
8329 printf ("-D%d", 8 + count);
8330 printf ("}");
8331 }
8332 else if (op >= 0xc0 && op <= 0xc5)
8333 {
8334 unsigned int count = op & 0x07;
8335
8336 printf (" pop {wR10");
8337 if (count)
8338 printf ("-wR%d", 10 + count);
8339 printf ("}");
8340 }
8341 else if (op == 0xc6)
8342 {
8343 unsigned int first, last;
8344
8345 GET_OP (op2);
8346 first = op2 >> 4;
8347 last = op2 & 0x0f;
8348 printf ("pop {wR%d", first);
8349 if (last)
8350 printf ("-wR%d", first + last);
8351 printf ("}");
8352 }
8353 else if (op == 0xc7)
8354 {
8355 GET_OP (op2);
8356 if (op2 == 0 || (op2 & 0xf0) != 0)
8357 printf (_("[Spare]"));
0b6ae522
DJ
8358 else
8359 {
61865e30
NC
8360 unsigned int mask = op2 & 0x0f;
8361 int first = 1;
8362 int i;
8363
8364 printf ("pop {");
8365 for (i = 0; i < 4; i++)
8366 if (mask & (1 << i))
8367 {
8368 if (first)
8369 first = 0;
8370 else
8371 printf (", ");
8372 printf ("wCGR%d", i);
8373 }
8374 printf ("}");
0b6ae522
DJ
8375 }
8376 }
61865e30
NC
8377 else
8378 printf (_(" [unsupported opcode]"));
0b6ae522
DJ
8379 printf ("\n");
8380 }
fa197c1c
PB
8381}
8382
8383static void
948f632f
DA
8384decode_tic6x_unwind_bytecode (struct arm_unw_aux_info * aux,
8385 unsigned int word,
8386 unsigned int remaining,
8387 unsigned int more_words,
8388 bfd_vma data_offset,
8389 Elf_Internal_Shdr * data_sec,
8390 struct arm_section * data_arm_sec)
fa197c1c
PB
8391{
8392 struct absaddr addr;
8393
8394 /* Decode the unwinding instructions. */
8395 while (1)
8396 {
8397 unsigned int op, op2;
8398
8399 ADVANCE;
8400 if (remaining == 0)
8401 break;
8402 remaining--;
8403 op = word >> 24;
8404 word <<= 8;
8405
9cf03b7e 8406 printf (" 0x%02x ", op);
fa197c1c
PB
8407
8408 if ((op & 0xc0) == 0x00)
8409 {
8410 int offset = ((op & 0x3f) << 3) + 8;
9cf03b7e 8411 printf (" sp = sp + %d", offset);
fa197c1c
PB
8412 }
8413 else if ((op & 0xc0) == 0x80)
8414 {
8415 GET_OP (op2);
8416 if (op == 0x80 && op2 == 0)
8417 printf (_("Refuse to unwind"));
8418 else
8419 {
8420 unsigned int mask = ((op & 0x1f) << 8) | op2;
8421 if (op & 0x20)
8422 printf ("pop compact {");
8423 else
8424 printf ("pop {");
8425
8426 decode_tic6x_unwind_regmask (mask);
8427 printf("}");
8428 }
8429 }
8430 else if ((op & 0xf0) == 0xc0)
8431 {
8432 unsigned int reg;
8433 unsigned int nregs;
8434 unsigned int i;
8435 const char *name;
a734115a
NC
8436 struct
8437 {
fa197c1c
PB
8438 unsigned int offset;
8439 unsigned int reg;
8440 } regpos[16];
8441
8442 /* Scan entire instruction first so that GET_OP output is not
8443 interleaved with disassembly. */
8444 nregs = 0;
8445 for (i = 0; nregs < (op & 0xf); i++)
8446 {
8447 GET_OP (op2);
8448 reg = op2 >> 4;
8449 if (reg != 0xf)
8450 {
8451 regpos[nregs].offset = i * 2;
8452 regpos[nregs].reg = reg;
8453 nregs++;
8454 }
8455
8456 reg = op2 & 0xf;
8457 if (reg != 0xf)
8458 {
8459 regpos[nregs].offset = i * 2 + 1;
8460 regpos[nregs].reg = reg;
8461 nregs++;
8462 }
8463 }
8464
8465 printf (_("pop frame {"));
8466 reg = nregs - 1;
8467 for (i = i * 2; i > 0; i--)
8468 {
8469 if (regpos[reg].offset == i - 1)
8470 {
8471 name = tic6x_unwind_regnames[regpos[reg].reg];
8472 if (reg > 0)
8473 reg--;
8474 }
8475 else
8476 name = _("[pad]");
8477
8478 fputs (name, stdout);
8479 if (i > 1)
8480 printf (", ");
8481 }
8482
8483 printf ("}");
8484 }
8485 else if (op == 0xd0)
8486 printf (" MOV FP, SP");
8487 else if (op == 0xd1)
8488 printf (" __c6xabi_pop_rts");
8489 else if (op == 0xd2)
8490 {
8491 unsigned char buf[9];
8492 unsigned int i, len;
8493 unsigned long offset;
a734115a 8494
fa197c1c
PB
8495 for (i = 0; i < sizeof (buf); i++)
8496 {
8497 GET_OP (buf[i]);
8498 if ((buf[i] & 0x80) == 0)
8499 break;
8500 }
0eff7165
NC
8501 /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2. */
8502 if (i == sizeof (buf))
8503 {
8504 printf ("<corrupt sp adjust>\n");
8505 warn (_("Corrupt stack pointer adjustment detected\n"));
8506 return;
8507 }
948f632f 8508
f6f0e17b 8509 offset = read_uleb128 (buf, &len, buf + i + 1);
fa197c1c
PB
8510 assert (len == i + 1);
8511 offset = offset * 8 + 0x408;
8512 printf (_("sp = sp + %ld"), offset);
8513 }
8514 else if ((op & 0xf0) == 0xe0)
8515 {
8516 if ((op & 0x0f) == 7)
8517 printf (" RETURN");
8518 else
8519 printf (" MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
8520 }
8521 else
8522 {
8523 printf (_(" [unsupported opcode]"));
8524 }
8525 putchar ('\n');
8526 }
8527}
8528
8529static bfd_vma
a734115a 8530arm_expand_prel31 (bfd_vma word, bfd_vma where)
fa197c1c
PB
8531{
8532 bfd_vma offset;
8533
8534 offset = word & 0x7fffffff;
8535 if (offset & 0x40000000)
8536 offset |= ~ (bfd_vma) 0x7fffffff;
8537
8538 if (elf_header.e_machine == EM_TI_C6000)
8539 offset <<= 1;
8540
8541 return offset + where;
8542}
8543
8544static void
1b31d05e
NC
8545decode_arm_unwind (struct arm_unw_aux_info * aux,
8546 unsigned int word,
8547 unsigned int remaining,
8548 bfd_vma data_offset,
8549 Elf_Internal_Shdr * data_sec,
8550 struct arm_section * data_arm_sec)
fa197c1c
PB
8551{
8552 int per_index;
8553 unsigned int more_words = 0;
37e14bc3 8554 struct absaddr addr;
1b31d05e 8555 bfd_vma sym_name = (bfd_vma) -1;
fa197c1c
PB
8556
8557 if (remaining == 0)
8558 {
1b31d05e
NC
8559 /* Fetch the first word.
8560 Note - when decoding an object file the address extracted
8561 here will always be 0. So we also pass in the sym_name
8562 parameter so that we can find the symbol associated with
8563 the personality routine. */
8564 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, data_offset,
8565 & word, & addr, & sym_name))
fa197c1c 8566 return;
1b31d05e 8567
fa197c1c
PB
8568 remaining = 4;
8569 }
8570
8571 if ((word & 0x80000000) == 0)
8572 {
8573 /* Expand prel31 for personality routine. */
8574 bfd_vma fn;
8575 const char *procname;
8576
a734115a 8577 fn = arm_expand_prel31 (word, data_sec->sh_addr + data_offset);
fa197c1c 8578 printf (_(" Personality routine: "));
1b31d05e
NC
8579 if (fn == 0
8580 && addr.section == SHN_UNDEF && addr.offset == 0
8581 && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
8582 {
8583 procname = aux->strtab + sym_name;
8584 print_vma (fn, PREFIX_HEX);
8585 if (procname)
8586 {
8587 fputs (" <", stdout);
8588 fputs (procname, stdout);
8589 fputc ('>', stdout);
8590 }
8591 }
8592 else
8593 procname = arm_print_vma_and_name (aux, fn, addr);
fa197c1c
PB
8594 fputc ('\n', stdout);
8595
8596 /* The GCC personality routines use the standard compact
8597 encoding, starting with one byte giving the number of
8598 words. */
8599 if (procname != NULL
8600 && (const_strneq (procname, "__gcc_personality_v0")
8601 || const_strneq (procname, "__gxx_personality_v0")
8602 || const_strneq (procname, "__gcj_personality_v0")
8603 || const_strneq (procname, "__gnu_objc_personality_v0")))
8604 {
8605 remaining = 0;
8606 more_words = 1;
8607 ADVANCE;
8608 if (!remaining)
8609 {
8610 printf (_(" [Truncated data]\n"));
8611 return;
8612 }
8613 more_words = word >> 24;
8614 word <<= 8;
8615 remaining--;
8616 per_index = -1;
8617 }
8618 else
8619 return;
8620 }
8621 else
8622 {
1b31d05e 8623 /* ARM EHABI Section 6.3:
0b4362b0 8624
1b31d05e 8625 An exception-handling table entry for the compact model looks like:
0b4362b0 8626
1b31d05e
NC
8627 31 30-28 27-24 23-0
8628 -- ----- ----- ----
8629 1 0 index Data for personalityRoutine[index] */
8630
8631 if (elf_header.e_machine == EM_ARM
8632 && (word & 0x70000000))
83c257ca 8633 warn (_("Corrupt ARM compact model table entry: %x \n"), word);
1b31d05e 8634
fa197c1c 8635 per_index = (word >> 24) & 0x7f;
1b31d05e 8636 printf (_(" Compact model index: %d\n"), per_index);
fa197c1c
PB
8637 if (per_index == 0)
8638 {
8639 more_words = 0;
8640 word <<= 8;
8641 remaining--;
8642 }
8643 else if (per_index < 3)
8644 {
8645 more_words = (word >> 16) & 0xff;
8646 word <<= 16;
8647 remaining -= 2;
8648 }
8649 }
8650
8651 switch (elf_header.e_machine)
8652 {
8653 case EM_ARM:
8654 if (per_index < 3)
8655 {
8656 decode_arm_unwind_bytecode (aux, word, remaining, more_words,
8657 data_offset, data_sec, data_arm_sec);
8658 }
8659 else
1b31d05e
NC
8660 {
8661 warn (_("Unknown ARM compact model index encountered\n"));
8662 printf (_(" [reserved]\n"));
8663 }
fa197c1c
PB
8664 break;
8665
8666 case EM_TI_C6000:
8667 if (per_index < 3)
8668 {
8669 decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
1b31d05e 8670 data_offset, data_sec, data_arm_sec);
fa197c1c
PB
8671 }
8672 else if (per_index < 5)
8673 {
8674 if (((word >> 17) & 0x7f) == 0x7f)
8675 printf (_(" Restore stack from frame pointer\n"));
8676 else
8677 printf (_(" Stack increment %d\n"), (word >> 14) & 0x1fc);
8678 printf (_(" Registers restored: "));
8679 if (per_index == 4)
8680 printf (" (compact) ");
8681 decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
8682 putchar ('\n');
8683 printf (_(" Return register: %s\n"),
8684 tic6x_unwind_regnames[word & 0xf]);
8685 }
8686 else
1b31d05e 8687 printf (_(" [reserved (%d)]\n"), per_index);
fa197c1c
PB
8688 break;
8689
8690 default:
74e1a04b 8691 error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
1b31d05e 8692 elf_header.e_machine);
fa197c1c 8693 }
0b6ae522
DJ
8694
8695 /* Decode the descriptors. Not implemented. */
8696}
8697
8698static void
8699dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
8700{
8701 struct arm_section exidx_arm_sec, extab_arm_sec;
8702 unsigned int i, exidx_len;
948f632f 8703 unsigned long j, nfuns;
0b6ae522
DJ
8704
8705 memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
8706 memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
8707 exidx_len = exidx_sec->sh_size / 8;
8708
948f632f
DA
8709 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
8710 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
8711 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
8712 aux->funtab[nfuns++] = aux->symtab[j];
8713 aux->nfuns = nfuns;
8714 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
8715
0b6ae522
DJ
8716 for (i = 0; i < exidx_len; i++)
8717 {
8718 unsigned int exidx_fn, exidx_entry;
8719 struct absaddr fn_addr, entry_addr;
8720 bfd_vma fn;
8721
8722 fputc ('\n', stdout);
8723
1b31d05e
NC
8724 if (! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8725 8 * i, & exidx_fn, & fn_addr, NULL)
8726 || ! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8727 8 * i + 4, & exidx_entry, & entry_addr, NULL))
0b6ae522 8728 {
948f632f 8729 free (aux->funtab);
1b31d05e
NC
8730 arm_free_section (& exidx_arm_sec);
8731 arm_free_section (& extab_arm_sec);
0b6ae522
DJ
8732 return;
8733 }
8734
83c257ca
NC
8735 /* ARM EHABI, Section 5:
8736 An index table entry consists of 2 words.
8737 The first word contains a prel31 offset to the start of a function, with bit 31 clear. */
8738 if (exidx_fn & 0x80000000)
8739 warn (_("corrupt index table entry: %x\n"), exidx_fn);
8740
a734115a 8741 fn = arm_expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
0b6ae522 8742
a734115a 8743 arm_print_vma_and_name (aux, fn, fn_addr);
0b6ae522
DJ
8744 fputs (": ", stdout);
8745
8746 if (exidx_entry == 1)
8747 {
8748 print_vma (exidx_entry, PREFIX_HEX);
8749 fputs (" [cantunwind]\n", stdout);
8750 }
8751 else if (exidx_entry & 0x80000000)
8752 {
8753 print_vma (exidx_entry, PREFIX_HEX);
8754 fputc ('\n', stdout);
8755 decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
8756 }
8757 else
8758 {
8f73510c 8759 bfd_vma table, table_offset = 0;
0b6ae522
DJ
8760 Elf_Internal_Shdr *table_sec;
8761
8762 fputs ("@", stdout);
a734115a 8763 table = arm_expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
0b6ae522
DJ
8764 print_vma (table, PREFIX_HEX);
8765 printf ("\n");
8766
8767 /* Locate the matching .ARM.extab. */
8768 if (entry_addr.section != SHN_UNDEF
8769 && entry_addr.section < elf_header.e_shnum)
8770 {
8771 table_sec = section_headers + entry_addr.section;
8772 table_offset = entry_addr.offset;
1a915552
NC
8773 /* PR 18879 */
8774 if (table_offset > table_sec->sh_size
8775 || ((bfd_signed_vma) table_offset) < 0)
8776 {
8777 warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
8778 (unsigned long) table_offset,
8779 printable_section_name (table_sec));
8780 continue;
8781 }
0b6ae522
DJ
8782 }
8783 else
8784 {
8785 table_sec = find_section_by_address (table);
8786 if (table_sec != NULL)
8787 table_offset = table - table_sec->sh_addr;
8788 }
8789 if (table_sec == NULL)
8790 {
8791 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
8792 (unsigned long) table);
8793 continue;
8794 }
8795 decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
8796 &extab_arm_sec);
8797 }
8798 }
8799
8800 printf ("\n");
8801
948f632f 8802 free (aux->funtab);
0b6ae522
DJ
8803 arm_free_section (&exidx_arm_sec);
8804 arm_free_section (&extab_arm_sec);
8805}
8806
fa197c1c 8807/* Used for both ARM and C6X unwinding tables. */
1b31d05e
NC
8808
8809static void
0b6ae522
DJ
8810arm_process_unwind (FILE *file)
8811{
8812 struct arm_unw_aux_info aux;
8813 Elf_Internal_Shdr *unwsec = NULL;
8814 Elf_Internal_Shdr *strsec;
8815 Elf_Internal_Shdr *sec;
8816 unsigned long i;
fa197c1c 8817 unsigned int sec_type;
0b6ae522 8818
fa197c1c
PB
8819 switch (elf_header.e_machine)
8820 {
8821 case EM_ARM:
8822 sec_type = SHT_ARM_EXIDX;
8823 break;
8824
8825 case EM_TI_C6000:
8826 sec_type = SHT_C6000_UNWIND;
8827 break;
8828
0b4362b0 8829 default:
74e1a04b 8830 error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
1b31d05e
NC
8831 elf_header.e_machine);
8832 return;
fa197c1c
PB
8833 }
8834
0b6ae522 8835 if (string_table == NULL)
1b31d05e
NC
8836 return;
8837
8838 memset (& aux, 0, sizeof (aux));
8839 aux.file = file;
0b6ae522
DJ
8840
8841 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8842 {
8843 if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
8844 {
ba5cdace 8845 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
0b6ae522
DJ
8846
8847 strsec = section_headers + sec->sh_link;
74e1a04b
NC
8848
8849 /* PR binutils/17531 file: 011-12666-0.004. */
8850 if (aux.strtab != NULL)
8851 {
4082ef84 8852 error (_("Multiple string tables found in file.\n"));
74e1a04b
NC
8853 free (aux.strtab);
8854 }
0b6ae522
DJ
8855 aux.strtab = get_data (NULL, file, strsec->sh_offset,
8856 1, strsec->sh_size, _("string table"));
8857 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8858 }
fa197c1c 8859 else if (sec->sh_type == sec_type)
0b6ae522
DJ
8860 unwsec = sec;
8861 }
8862
1b31d05e 8863 if (unwsec == NULL)
0b6ae522 8864 printf (_("\nThere are no unwind sections in this file.\n"));
1b31d05e
NC
8865 else
8866 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8867 {
8868 if (sec->sh_type == sec_type)
8869 {
8870 printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
74e1a04b 8871 printable_section_name (sec),
1b31d05e
NC
8872 (unsigned long) sec->sh_offset,
8873 (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
0b6ae522 8874
1b31d05e
NC
8875 dump_arm_unwind (&aux, sec);
8876 }
8877 }
0b6ae522
DJ
8878
8879 if (aux.symtab)
8880 free (aux.symtab);
8881 if (aux.strtab)
8882 free ((char *) aux.strtab);
0b6ae522
DJ
8883}
8884
1b31d05e 8885static void
2cf0635d 8886process_unwind (FILE * file)
57346661 8887{
2cf0635d
NC
8888 struct unwind_handler
8889 {
57346661 8890 int machtype;
1b31d05e 8891 void (* handler)(FILE *);
2cf0635d
NC
8892 } handlers[] =
8893 {
0b6ae522 8894 { EM_ARM, arm_process_unwind },
57346661
AM
8895 { EM_IA_64, ia64_process_unwind },
8896 { EM_PARISC, hppa_process_unwind },
fa197c1c 8897 { EM_TI_C6000, arm_process_unwind },
57346661
AM
8898 { 0, 0 }
8899 };
8900 int i;
8901
8902 if (!do_unwind)
1b31d05e 8903 return;
57346661
AM
8904
8905 for (i = 0; handlers[i].handler != NULL; i++)
8906 if (elf_header.e_machine == handlers[i].machtype)
9f758fdc
NC
8907 {
8908 handlers[i].handler (file);
8909 return;
8910 }
57346661 8911
1b31d05e
NC
8912 printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
8913 get_machine_name (elf_header.e_machine));
57346661
AM
8914}
8915
252b5132 8916static void
2cf0635d 8917dynamic_section_mips_val (Elf_Internal_Dyn * entry)
252b5132
RH
8918{
8919 switch (entry->d_tag)
8920 {
8921 case DT_MIPS_FLAGS:
8922 if (entry->d_un.d_val == 0)
4b68bca3 8923 printf (_("NONE"));
252b5132
RH
8924 else
8925 {
8926 static const char * opts[] =
8927 {
8928 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
8929 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
8930 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
8931 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
8932 "RLD_ORDER_SAFE"
8933 };
8934 unsigned int cnt;
8935 int first = 1;
2b692964 8936
60bca95a 8937 for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
252b5132
RH
8938 if (entry->d_un.d_val & (1 << cnt))
8939 {
8940 printf ("%s%s", first ? "" : " ", opts[cnt]);
8941 first = 0;
8942 }
252b5132
RH
8943 }
8944 break;
103f02d3 8945
252b5132 8946 case DT_MIPS_IVERSION:
d79b3d50 8947 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
4b68bca3 8948 printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
252b5132 8949 else
76ca31c0
NC
8950 {
8951 char buf[40];
8952 sprintf_vma (buf, entry->d_un.d_ptr);
8953 /* Note: coded this way so that there is a single string for translation. */
8954 printf (_("<corrupt: %s>"), buf);
8955 }
252b5132 8956 break;
103f02d3 8957
252b5132
RH
8958 case DT_MIPS_TIME_STAMP:
8959 {
d5b07ef4 8960 char timebuf[128];
2cf0635d 8961 struct tm * tmp;
91d6fa6a 8962 time_t atime = entry->d_un.d_val;
82b1b41b 8963
91d6fa6a 8964 tmp = gmtime (&atime);
82b1b41b
NC
8965 /* PR 17531: file: 6accc532. */
8966 if (tmp == NULL)
8967 snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
8968 else
8969 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
8970 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8971 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
4b68bca3 8972 printf (_("Time Stamp: %s"), timebuf);
252b5132
RH
8973 }
8974 break;
103f02d3 8975
252b5132
RH
8976 case DT_MIPS_RLD_VERSION:
8977 case DT_MIPS_LOCAL_GOTNO:
8978 case DT_MIPS_CONFLICTNO:
8979 case DT_MIPS_LIBLISTNO:
8980 case DT_MIPS_SYMTABNO:
8981 case DT_MIPS_UNREFEXTNO:
8982 case DT_MIPS_HIPAGENO:
8983 case DT_MIPS_DELTA_CLASS_NO:
8984 case DT_MIPS_DELTA_INSTANCE_NO:
8985 case DT_MIPS_DELTA_RELOC_NO:
8986 case DT_MIPS_DELTA_SYM_NO:
8987 case DT_MIPS_DELTA_CLASSSYM_NO:
8988 case DT_MIPS_COMPACT_SIZE:
c69075ac 8989 print_vma (entry->d_un.d_val, DEC);
252b5132 8990 break;
103f02d3
UD
8991
8992 default:
4b68bca3 8993 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
103f02d3 8994 }
4b68bca3 8995 putchar ('\n');
103f02d3
UD
8996}
8997
103f02d3 8998static void
2cf0635d 8999dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
103f02d3
UD
9000{
9001 switch (entry->d_tag)
9002 {
9003 case DT_HP_DLD_FLAGS:
9004 {
9005 static struct
9006 {
9007 long int bit;
2cf0635d 9008 const char * str;
5e220199
NC
9009 }
9010 flags[] =
9011 {
9012 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
9013 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
9014 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
9015 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
9016 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
9017 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
9018 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
9019 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
9020 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
9021 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
eec8f817
DA
9022 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
9023 { DT_HP_GST, "HP_GST" },
9024 { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
9025 { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
9026 { DT_HP_NODELETE, "HP_NODELETE" },
9027 { DT_HP_GROUP, "HP_GROUP" },
9028 { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
5e220199 9029 };
103f02d3 9030 int first = 1;
5e220199 9031 size_t cnt;
f7a99963 9032 bfd_vma val = entry->d_un.d_val;
103f02d3 9033
60bca95a 9034 for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
103f02d3 9035 if (val & flags[cnt].bit)
30800947
NC
9036 {
9037 if (! first)
9038 putchar (' ');
9039 fputs (flags[cnt].str, stdout);
9040 first = 0;
9041 val ^= flags[cnt].bit;
9042 }
76da6bbe 9043
103f02d3 9044 if (val != 0 || first)
f7a99963
NC
9045 {
9046 if (! first)
9047 putchar (' ');
9048 print_vma (val, HEX);
9049 }
103f02d3
UD
9050 }
9051 break;
76da6bbe 9052
252b5132 9053 default:
f7a99963
NC
9054 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9055 break;
252b5132 9056 }
35b1837e 9057 putchar ('\n');
252b5132
RH
9058}
9059
28f997cf
TG
9060#ifdef BFD64
9061
9062/* VMS vs Unix time offset and factor. */
9063
9064#define VMS_EPOCH_OFFSET 35067168000000000LL
9065#define VMS_GRANULARITY_FACTOR 10000000
9066
9067/* Display a VMS time in a human readable format. */
9068
9069static void
9070print_vms_time (bfd_int64_t vmstime)
9071{
9072 struct tm *tm;
9073 time_t unxtime;
9074
9075 unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
9076 tm = gmtime (&unxtime);
9077 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
9078 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
9079 tm->tm_hour, tm->tm_min, tm->tm_sec);
9080}
9081#endif /* BFD64 */
9082
ecc51f48 9083static void
2cf0635d 9084dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
ecc51f48
NC
9085{
9086 switch (entry->d_tag)
9087 {
0de14b54 9088 case DT_IA_64_PLT_RESERVE:
bdf4d63a 9089 /* First 3 slots reserved. */
ecc51f48
NC
9090 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9091 printf (" -- ");
9092 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
bdf4d63a
JJ
9093 break;
9094
28f997cf
TG
9095 case DT_IA_64_VMS_LINKTIME:
9096#ifdef BFD64
9097 print_vms_time (entry->d_un.d_val);
9098#endif
9099 break;
9100
9101 case DT_IA_64_VMS_LNKFLAGS:
9102 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9103 if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
9104 printf (" CALL_DEBUG");
9105 if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
9106 printf (" NOP0BUFS");
9107 if (entry->d_un.d_val & VMS_LF_P0IMAGE)
9108 printf (" P0IMAGE");
9109 if (entry->d_un.d_val & VMS_LF_MKTHREADS)
9110 printf (" MKTHREADS");
9111 if (entry->d_un.d_val & VMS_LF_UPCALLS)
9112 printf (" UPCALLS");
9113 if (entry->d_un.d_val & VMS_LF_IMGSTA)
9114 printf (" IMGSTA");
9115 if (entry->d_un.d_val & VMS_LF_INITIALIZE)
9116 printf (" INITIALIZE");
9117 if (entry->d_un.d_val & VMS_LF_MAIN)
9118 printf (" MAIN");
9119 if (entry->d_un.d_val & VMS_LF_EXE_INIT)
9120 printf (" EXE_INIT");
9121 if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
9122 printf (" TBK_IN_IMG");
9123 if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
9124 printf (" DBG_IN_IMG");
9125 if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
9126 printf (" TBK_IN_DSF");
9127 if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
9128 printf (" DBG_IN_DSF");
9129 if (entry->d_un.d_val & VMS_LF_SIGNATURES)
9130 printf (" SIGNATURES");
9131 if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
9132 printf (" REL_SEG_OFF");
9133 break;
9134
bdf4d63a
JJ
9135 default:
9136 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9137 break;
ecc51f48 9138 }
bdf4d63a 9139 putchar ('\n');
ecc51f48
NC
9140}
9141
252b5132 9142static int
2cf0635d 9143get_32bit_dynamic_section (FILE * file)
252b5132 9144{
2cf0635d
NC
9145 Elf32_External_Dyn * edyn;
9146 Elf32_External_Dyn * ext;
9147 Elf_Internal_Dyn * entry;
103f02d3 9148
3f5e193b
NC
9149 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
9150 dynamic_size, _("dynamic section"));
a6e9f9df
AM
9151 if (!edyn)
9152 return 0;
103f02d3 9153
071436c6
NC
9154 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9155 might not have the luxury of section headers. Look for the DT_NULL
9156 terminator to determine the number of entries. */
ba2685cc 9157 for (ext = edyn, dynamic_nent = 0;
53c3012c 9158 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
ba2685cc
AM
9159 ext++)
9160 {
9161 dynamic_nent++;
9162 if (BYTE_GET (ext->d_tag) == DT_NULL)
9163 break;
9164 }
252b5132 9165
3f5e193b
NC
9166 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9167 sizeof (* entry));
b2d38a17 9168 if (dynamic_section == NULL)
252b5132 9169 {
8b73c356
NC
9170 error (_("Out of memory allocating space for %lu dynamic entries\n"),
9171 (unsigned long) dynamic_nent);
9ea033b2
NC
9172 free (edyn);
9173 return 0;
9174 }
252b5132 9175
fb514b26 9176 for (ext = edyn, entry = dynamic_section;
ba2685cc 9177 entry < dynamic_section + dynamic_nent;
fb514b26 9178 ext++, entry++)
9ea033b2 9179 {
fb514b26
AM
9180 entry->d_tag = BYTE_GET (ext->d_tag);
9181 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
252b5132
RH
9182 }
9183
9ea033b2
NC
9184 free (edyn);
9185
9186 return 1;
9187}
9188
9189static int
2cf0635d 9190get_64bit_dynamic_section (FILE * file)
9ea033b2 9191{
2cf0635d
NC
9192 Elf64_External_Dyn * edyn;
9193 Elf64_External_Dyn * ext;
9194 Elf_Internal_Dyn * entry;
103f02d3 9195
071436c6 9196 /* Read in the data. */
3f5e193b
NC
9197 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
9198 dynamic_size, _("dynamic section"));
a6e9f9df
AM
9199 if (!edyn)
9200 return 0;
103f02d3 9201
071436c6
NC
9202 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9203 might not have the luxury of section headers. Look for the DT_NULL
9204 terminator to determine the number of entries. */
ba2685cc 9205 for (ext = edyn, dynamic_nent = 0;
53c3012c
AM
9206 /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer. */
9207 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
ba2685cc
AM
9208 ext++)
9209 {
9210 dynamic_nent++;
66543521 9211 if (BYTE_GET (ext->d_tag) == DT_NULL)
ba2685cc
AM
9212 break;
9213 }
252b5132 9214
3f5e193b
NC
9215 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9216 sizeof (* entry));
b2d38a17 9217 if (dynamic_section == NULL)
252b5132 9218 {
8b73c356
NC
9219 error (_("Out of memory allocating space for %lu dynamic entries\n"),
9220 (unsigned long) dynamic_nent);
252b5132
RH
9221 free (edyn);
9222 return 0;
9223 }
9224
071436c6 9225 /* Convert from external to internal formats. */
fb514b26 9226 for (ext = edyn, entry = dynamic_section;
ba2685cc 9227 entry < dynamic_section + dynamic_nent;
fb514b26 9228 ext++, entry++)
252b5132 9229 {
66543521
AM
9230 entry->d_tag = BYTE_GET (ext->d_tag);
9231 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
252b5132
RH
9232 }
9233
9234 free (edyn);
9235
9ea033b2
NC
9236 return 1;
9237}
9238
e9e44622
JJ
9239static void
9240print_dynamic_flags (bfd_vma flags)
d1133906 9241{
e9e44622 9242 int first = 1;
13ae64f3 9243
d1133906
NC
9244 while (flags)
9245 {
9246 bfd_vma flag;
9247
9248 flag = flags & - flags;
9249 flags &= ~ flag;
9250
e9e44622
JJ
9251 if (first)
9252 first = 0;
9253 else
9254 putc (' ', stdout);
13ae64f3 9255
d1133906
NC
9256 switch (flag)
9257 {
e9e44622
JJ
9258 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
9259 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
9260 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
9261 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
9262 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
2b692964 9263 default: fputs (_("unknown"), stdout); break;
d1133906
NC
9264 }
9265 }
e9e44622 9266 puts ("");
d1133906
NC
9267}
9268
b2d38a17
NC
9269/* Parse and display the contents of the dynamic section. */
9270
9ea033b2 9271static int
2cf0635d 9272process_dynamic_section (FILE * file)
9ea033b2 9273{
2cf0635d 9274 Elf_Internal_Dyn * entry;
9ea033b2
NC
9275
9276 if (dynamic_size == 0)
9277 {
9278 if (do_dynamic)
b2d38a17 9279 printf (_("\nThere is no dynamic section in this file.\n"));
9ea033b2
NC
9280
9281 return 1;
9282 }
9283
9284 if (is_32bit_elf)
9285 {
b2d38a17 9286 if (! get_32bit_dynamic_section (file))
9ea033b2
NC
9287 return 0;
9288 }
b2d38a17 9289 else if (! get_64bit_dynamic_section (file))
9ea033b2
NC
9290 return 0;
9291
252b5132
RH
9292 /* Find the appropriate symbol table. */
9293 if (dynamic_symbols == NULL)
9294 {
86dba8ee
AM
9295 for (entry = dynamic_section;
9296 entry < dynamic_section + dynamic_nent;
9297 ++entry)
252b5132 9298 {
c8286bd1 9299 Elf_Internal_Shdr section;
252b5132
RH
9300
9301 if (entry->d_tag != DT_SYMTAB)
9302 continue;
9303
9304 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
9305
9306 /* Since we do not know how big the symbol table is,
9307 we default to reading in the entire file (!) and
9308 processing that. This is overkill, I know, but it
e3c8793a 9309 should work. */
d93f0186 9310 section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
252b5132 9311
fb52b2f4
NC
9312 if (archive_file_offset != 0)
9313 section.sh_size = archive_file_size - section.sh_offset;
9314 else
9315 {
9316 if (fseek (file, 0, SEEK_END))
591a748a 9317 error (_("Unable to seek to end of file!\n"));
fb52b2f4
NC
9318
9319 section.sh_size = ftell (file) - section.sh_offset;
9320 }
252b5132 9321
9ea033b2 9322 if (is_32bit_elf)
9ad5cbcf 9323 section.sh_entsize = sizeof (Elf32_External_Sym);
9ea033b2 9324 else
9ad5cbcf 9325 section.sh_entsize = sizeof (Elf64_External_Sym);
071436c6 9326 section.sh_name = string_table_length;
252b5132 9327
ba5cdace 9328 dynamic_symbols = GET_ELF_SYMBOLS (file, &section, & num_dynamic_syms);
19936277 9329 if (num_dynamic_syms < 1)
252b5132
RH
9330 {
9331 error (_("Unable to determine the number of symbols to load\n"));
9332 continue;
9333 }
252b5132
RH
9334 }
9335 }
9336
9337 /* Similarly find a string table. */
9338 if (dynamic_strings == NULL)
9339 {
86dba8ee
AM
9340 for (entry = dynamic_section;
9341 entry < dynamic_section + dynamic_nent;
9342 ++entry)
252b5132
RH
9343 {
9344 unsigned long offset;
b34976b6 9345 long str_tab_len;
252b5132
RH
9346
9347 if (entry->d_tag != DT_STRTAB)
9348 continue;
9349
9350 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
9351
9352 /* Since we do not know how big the string table is,
9353 we default to reading in the entire file (!) and
9354 processing that. This is overkill, I know, but it
e3c8793a 9355 should work. */
252b5132 9356
d93f0186 9357 offset = offset_from_vma (file, entry->d_un.d_val, 0);
fb52b2f4
NC
9358
9359 if (archive_file_offset != 0)
9360 str_tab_len = archive_file_size - offset;
9361 else
9362 {
9363 if (fseek (file, 0, SEEK_END))
9364 error (_("Unable to seek to end of file\n"));
9365 str_tab_len = ftell (file) - offset;
9366 }
252b5132
RH
9367
9368 if (str_tab_len < 1)
9369 {
9370 error
9371 (_("Unable to determine the length of the dynamic string table\n"));
9372 continue;
9373 }
9374
3f5e193b
NC
9375 dynamic_strings = (char *) get_data (NULL, file, offset, 1,
9376 str_tab_len,
9377 _("dynamic string table"));
59245841 9378 dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
252b5132
RH
9379 break;
9380 }
9381 }
9382
9383 /* And find the syminfo section if available. */
9384 if (dynamic_syminfo == NULL)
9385 {
3e8bba36 9386 unsigned long syminsz = 0;
252b5132 9387
86dba8ee
AM
9388 for (entry = dynamic_section;
9389 entry < dynamic_section + dynamic_nent;
9390 ++entry)
252b5132
RH
9391 {
9392 if (entry->d_tag == DT_SYMINENT)
9393 {
9394 /* Note: these braces are necessary to avoid a syntax
9395 error from the SunOS4 C compiler. */
049b0c3a
NC
9396 /* PR binutils/17531: A corrupt file can trigger this test.
9397 So do not use an assert, instead generate an error message. */
9398 if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
071436c6 9399 error (_("Bad value (%d) for SYMINENT entry\n"),
049b0c3a 9400 (int) entry->d_un.d_val);
252b5132
RH
9401 }
9402 else if (entry->d_tag == DT_SYMINSZ)
9403 syminsz = entry->d_un.d_val;
9404 else if (entry->d_tag == DT_SYMINFO)
d93f0186
NC
9405 dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
9406 syminsz);
252b5132
RH
9407 }
9408
9409 if (dynamic_syminfo_offset != 0 && syminsz != 0)
9410 {
2cf0635d
NC
9411 Elf_External_Syminfo * extsyminfo;
9412 Elf_External_Syminfo * extsym;
9413 Elf_Internal_Syminfo * syminfo;
252b5132
RH
9414
9415 /* There is a syminfo section. Read the data. */
3f5e193b
NC
9416 extsyminfo = (Elf_External_Syminfo *)
9417 get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
9418 _("symbol information"));
a6e9f9df
AM
9419 if (!extsyminfo)
9420 return 0;
252b5132 9421
3f5e193b 9422 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
252b5132
RH
9423 if (dynamic_syminfo == NULL)
9424 {
8b73c356
NC
9425 error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9426 (unsigned long) syminsz);
252b5132
RH
9427 return 0;
9428 }
9429
9430 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
86dba8ee
AM
9431 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
9432 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
9433 ++syminfo, ++extsym)
252b5132 9434 {
86dba8ee
AM
9435 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
9436 syminfo->si_flags = BYTE_GET (extsym->si_flags);
252b5132
RH
9437 }
9438
9439 free (extsyminfo);
9440 }
9441 }
9442
9443 if (do_dynamic && dynamic_addr)
8b73c356
NC
9444 printf (_("\nDynamic section at offset 0x%lx contains %lu entries:\n"),
9445 dynamic_addr, (unsigned long) dynamic_nent);
252b5132
RH
9446 if (do_dynamic)
9447 printf (_(" Tag Type Name/Value\n"));
9448
86dba8ee
AM
9449 for (entry = dynamic_section;
9450 entry < dynamic_section + dynamic_nent;
9451 entry++)
252b5132
RH
9452 {
9453 if (do_dynamic)
f7a99963 9454 {
2cf0635d 9455 const char * dtype;
e699b9ff 9456
f7a99963
NC
9457 putchar (' ');
9458 print_vma (entry->d_tag, FULL_HEX);
e699b9ff
ILT
9459 dtype = get_dynamic_type (entry->d_tag);
9460 printf (" (%s)%*s", dtype,
9461 ((is_32bit_elf ? 27 : 19)
9462 - (int) strlen (dtype)),
f7a99963
NC
9463 " ");
9464 }
252b5132
RH
9465
9466 switch (entry->d_tag)
9467 {
d1133906
NC
9468 case DT_FLAGS:
9469 if (do_dynamic)
e9e44622 9470 print_dynamic_flags (entry->d_un.d_val);
d1133906 9471 break;
76da6bbe 9472
252b5132
RH
9473 case DT_AUXILIARY:
9474 case DT_FILTER:
019148e4
L
9475 case DT_CONFIG:
9476 case DT_DEPAUDIT:
9477 case DT_AUDIT:
252b5132
RH
9478 if (do_dynamic)
9479 {
019148e4 9480 switch (entry->d_tag)
b34976b6 9481 {
019148e4
L
9482 case DT_AUXILIARY:
9483 printf (_("Auxiliary library"));
9484 break;
9485
9486 case DT_FILTER:
9487 printf (_("Filter library"));
9488 break;
9489
b34976b6 9490 case DT_CONFIG:
019148e4
L
9491 printf (_("Configuration file"));
9492 break;
9493
9494 case DT_DEPAUDIT:
9495 printf (_("Dependency audit library"));
9496 break;
9497
9498 case DT_AUDIT:
9499 printf (_("Audit library"));
9500 break;
9501 }
252b5132 9502
d79b3d50
NC
9503 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9504 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
252b5132 9505 else
f7a99963
NC
9506 {
9507 printf (": ");
9508 print_vma (entry->d_un.d_val, PREFIX_HEX);
9509 putchar ('\n');
9510 }
252b5132
RH
9511 }
9512 break;
9513
dcefbbbd 9514 case DT_FEATURE:
252b5132
RH
9515 if (do_dynamic)
9516 {
9517 printf (_("Flags:"));
86f55779 9518
252b5132
RH
9519 if (entry->d_un.d_val == 0)
9520 printf (_(" None\n"));
9521 else
9522 {
9523 unsigned long int val = entry->d_un.d_val;
86f55779 9524
252b5132
RH
9525 if (val & DTF_1_PARINIT)
9526 {
9527 printf (" PARINIT");
9528 val ^= DTF_1_PARINIT;
9529 }
dcefbbbd
L
9530 if (val & DTF_1_CONFEXP)
9531 {
9532 printf (" CONFEXP");
9533 val ^= DTF_1_CONFEXP;
9534 }
252b5132
RH
9535 if (val != 0)
9536 printf (" %lx", val);
9537 puts ("");
9538 }
9539 }
9540 break;
9541
9542 case DT_POSFLAG_1:
9543 if (do_dynamic)
9544 {
9545 printf (_("Flags:"));
86f55779 9546
252b5132
RH
9547 if (entry->d_un.d_val == 0)
9548 printf (_(" None\n"));
9549 else
9550 {
9551 unsigned long int val = entry->d_un.d_val;
86f55779 9552
252b5132
RH
9553 if (val & DF_P1_LAZYLOAD)
9554 {
9555 printf (" LAZYLOAD");
9556 val ^= DF_P1_LAZYLOAD;
9557 }
9558 if (val & DF_P1_GROUPPERM)
9559 {
9560 printf (" GROUPPERM");
9561 val ^= DF_P1_GROUPPERM;
9562 }
9563 if (val != 0)
9564 printf (" %lx", val);
9565 puts ("");
9566 }
9567 }
9568 break;
9569
9570 case DT_FLAGS_1:
9571 if (do_dynamic)
9572 {
9573 printf (_("Flags:"));
9574 if (entry->d_un.d_val == 0)
9575 printf (_(" None\n"));
9576 else
9577 {
9578 unsigned long int val = entry->d_un.d_val;
86f55779 9579
252b5132
RH
9580 if (val & DF_1_NOW)
9581 {
9582 printf (" NOW");
9583 val ^= DF_1_NOW;
9584 }
9585 if (val & DF_1_GLOBAL)
9586 {
9587 printf (" GLOBAL");
9588 val ^= DF_1_GLOBAL;
9589 }
9590 if (val & DF_1_GROUP)
9591 {
9592 printf (" GROUP");
9593 val ^= DF_1_GROUP;
9594 }
9595 if (val & DF_1_NODELETE)
9596 {
9597 printf (" NODELETE");
9598 val ^= DF_1_NODELETE;
9599 }
9600 if (val & DF_1_LOADFLTR)
9601 {
9602 printf (" LOADFLTR");
9603 val ^= DF_1_LOADFLTR;
9604 }
9605 if (val & DF_1_INITFIRST)
9606 {
9607 printf (" INITFIRST");
9608 val ^= DF_1_INITFIRST;
9609 }
9610 if (val & DF_1_NOOPEN)
9611 {
9612 printf (" NOOPEN");
9613 val ^= DF_1_NOOPEN;
9614 }
9615 if (val & DF_1_ORIGIN)
9616 {
9617 printf (" ORIGIN");
9618 val ^= DF_1_ORIGIN;
9619 }
9620 if (val & DF_1_DIRECT)
9621 {
9622 printf (" DIRECT");
9623 val ^= DF_1_DIRECT;
9624 }
9625 if (val & DF_1_TRANS)
9626 {
9627 printf (" TRANS");
9628 val ^= DF_1_TRANS;
9629 }
9630 if (val & DF_1_INTERPOSE)
9631 {
9632 printf (" INTERPOSE");
9633 val ^= DF_1_INTERPOSE;
9634 }
f7db6139 9635 if (val & DF_1_NODEFLIB)
dcefbbbd 9636 {
f7db6139
L
9637 printf (" NODEFLIB");
9638 val ^= DF_1_NODEFLIB;
dcefbbbd
L
9639 }
9640 if (val & DF_1_NODUMP)
9641 {
9642 printf (" NODUMP");
9643 val ^= DF_1_NODUMP;
9644 }
34b60028 9645 if (val & DF_1_CONFALT)
dcefbbbd 9646 {
34b60028
L
9647 printf (" CONFALT");
9648 val ^= DF_1_CONFALT;
9649 }
9650 if (val & DF_1_ENDFILTEE)
9651 {
9652 printf (" ENDFILTEE");
9653 val ^= DF_1_ENDFILTEE;
9654 }
9655 if (val & DF_1_DISPRELDNE)
9656 {
9657 printf (" DISPRELDNE");
9658 val ^= DF_1_DISPRELDNE;
9659 }
9660 if (val & DF_1_DISPRELPND)
9661 {
9662 printf (" DISPRELPND");
9663 val ^= DF_1_DISPRELPND;
9664 }
9665 if (val & DF_1_NODIRECT)
9666 {
9667 printf (" NODIRECT");
9668 val ^= DF_1_NODIRECT;
9669 }
9670 if (val & DF_1_IGNMULDEF)
9671 {
9672 printf (" IGNMULDEF");
9673 val ^= DF_1_IGNMULDEF;
9674 }
9675 if (val & DF_1_NOKSYMS)
9676 {
9677 printf (" NOKSYMS");
9678 val ^= DF_1_NOKSYMS;
9679 }
9680 if (val & DF_1_NOHDR)
9681 {
9682 printf (" NOHDR");
9683 val ^= DF_1_NOHDR;
9684 }
9685 if (val & DF_1_EDITED)
9686 {
9687 printf (" EDITED");
9688 val ^= DF_1_EDITED;
9689 }
9690 if (val & DF_1_NORELOC)
9691 {
9692 printf (" NORELOC");
9693 val ^= DF_1_NORELOC;
9694 }
9695 if (val & DF_1_SYMINTPOSE)
9696 {
9697 printf (" SYMINTPOSE");
9698 val ^= DF_1_SYMINTPOSE;
9699 }
9700 if (val & DF_1_GLOBAUDIT)
9701 {
9702 printf (" GLOBAUDIT");
9703 val ^= DF_1_GLOBAUDIT;
9704 }
9705 if (val & DF_1_SINGLETON)
9706 {
9707 printf (" SINGLETON");
9708 val ^= DF_1_SINGLETON;
dcefbbbd 9709 }
5c383f02
RO
9710 if (val & DF_1_STUB)
9711 {
9712 printf (" STUB");
9713 val ^= DF_1_STUB;
9714 }
9715 if (val & DF_1_PIE)
9716 {
9717 printf (" PIE");
9718 val ^= DF_1_PIE;
9719 }
252b5132
RH
9720 if (val != 0)
9721 printf (" %lx", val);
9722 puts ("");
9723 }
9724 }
9725 break;
9726
9727 case DT_PLTREL:
566b0d53 9728 dynamic_info[entry->d_tag] = entry->d_un.d_val;
252b5132
RH
9729 if (do_dynamic)
9730 puts (get_dynamic_type (entry->d_un.d_val));
9731 break;
9732
9733 case DT_NULL :
9734 case DT_NEEDED :
9735 case DT_PLTGOT :
9736 case DT_HASH :
9737 case DT_STRTAB :
9738 case DT_SYMTAB :
9739 case DT_RELA :
9740 case DT_INIT :
9741 case DT_FINI :
9742 case DT_SONAME :
9743 case DT_RPATH :
9744 case DT_SYMBOLIC:
9745 case DT_REL :
9746 case DT_DEBUG :
9747 case DT_TEXTREL :
9748 case DT_JMPREL :
019148e4 9749 case DT_RUNPATH :
252b5132
RH
9750 dynamic_info[entry->d_tag] = entry->d_un.d_val;
9751
9752 if (do_dynamic)
9753 {
2cf0635d 9754 char * name;
252b5132 9755
d79b3d50
NC
9756 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9757 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
252b5132 9758 else
d79b3d50 9759 name = NULL;
252b5132
RH
9760
9761 if (name)
9762 {
9763 switch (entry->d_tag)
9764 {
9765 case DT_NEEDED:
9766 printf (_("Shared library: [%s]"), name);
9767
18bd398b 9768 if (streq (name, program_interpreter))
f7a99963 9769 printf (_(" program interpreter"));
252b5132
RH
9770 break;
9771
9772 case DT_SONAME:
f7a99963 9773 printf (_("Library soname: [%s]"), name);
252b5132
RH
9774 break;
9775
9776 case DT_RPATH:
f7a99963 9777 printf (_("Library rpath: [%s]"), name);
252b5132
RH
9778 break;
9779
019148e4
L
9780 case DT_RUNPATH:
9781 printf (_("Library runpath: [%s]"), name);
9782 break;
9783
252b5132 9784 default:
f7a99963
NC
9785 print_vma (entry->d_un.d_val, PREFIX_HEX);
9786 break;
252b5132
RH
9787 }
9788 }
9789 else
f7a99963
NC
9790 print_vma (entry->d_un.d_val, PREFIX_HEX);
9791
9792 putchar ('\n');
252b5132
RH
9793 }
9794 break;
9795
9796 case DT_PLTRELSZ:
9797 case DT_RELASZ :
9798 case DT_STRSZ :
9799 case DT_RELSZ :
9800 case DT_RELAENT :
9801 case DT_SYMENT :
9802 case DT_RELENT :
566b0d53 9803 dynamic_info[entry->d_tag] = entry->d_un.d_val;
1a0670f3 9804 /* Fall through. */
252b5132
RH
9805 case DT_PLTPADSZ:
9806 case DT_MOVEENT :
9807 case DT_MOVESZ :
9808 case DT_INIT_ARRAYSZ:
9809 case DT_FINI_ARRAYSZ:
047b2264
JJ
9810 case DT_GNU_CONFLICTSZ:
9811 case DT_GNU_LIBLISTSZ:
252b5132 9812 if (do_dynamic)
f7a99963
NC
9813 {
9814 print_vma (entry->d_un.d_val, UNSIGNED);
2b692964 9815 printf (_(" (bytes)\n"));
f7a99963 9816 }
252b5132
RH
9817 break;
9818
9819 case DT_VERDEFNUM:
9820 case DT_VERNEEDNUM:
9821 case DT_RELACOUNT:
9822 case DT_RELCOUNT:
9823 if (do_dynamic)
f7a99963
NC
9824 {
9825 print_vma (entry->d_un.d_val, UNSIGNED);
9826 putchar ('\n');
9827 }
252b5132
RH
9828 break;
9829
9830 case DT_SYMINSZ:
9831 case DT_SYMINENT:
9832 case DT_SYMINFO:
9833 case DT_USED:
9834 case DT_INIT_ARRAY:
9835 case DT_FINI_ARRAY:
9836 if (do_dynamic)
9837 {
d79b3d50
NC
9838 if (entry->d_tag == DT_USED
9839 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
252b5132 9840 {
2cf0635d 9841 char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
252b5132 9842
b34976b6 9843 if (*name)
252b5132
RH
9844 {
9845 printf (_("Not needed object: [%s]\n"), name);
9846 break;
9847 }
9848 }
103f02d3 9849
f7a99963
NC
9850 print_vma (entry->d_un.d_val, PREFIX_HEX);
9851 putchar ('\n');
252b5132
RH
9852 }
9853 break;
9854
9855 case DT_BIND_NOW:
9856 /* The value of this entry is ignored. */
35b1837e
AM
9857 if (do_dynamic)
9858 putchar ('\n');
252b5132 9859 break;
103f02d3 9860
047b2264
JJ
9861 case DT_GNU_PRELINKED:
9862 if (do_dynamic)
9863 {
2cf0635d 9864 struct tm * tmp;
91d6fa6a 9865 time_t atime = entry->d_un.d_val;
047b2264 9866
91d6fa6a 9867 tmp = gmtime (&atime);
071436c6
NC
9868 /* PR 17533 file: 041-1244816-0.004. */
9869 if (tmp == NULL)
5a2cbcf4
L
9870 printf (_("<corrupt time val: %lx"),
9871 (unsigned long) atime);
071436c6
NC
9872 else
9873 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
9874 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9875 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
047b2264
JJ
9876
9877 }
9878 break;
9879
fdc90cb4
JJ
9880 case DT_GNU_HASH:
9881 dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
9882 if (do_dynamic)
9883 {
9884 print_vma (entry->d_un.d_val, PREFIX_HEX);
9885 putchar ('\n');
9886 }
9887 break;
9888
252b5132
RH
9889 default:
9890 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
b34976b6 9891 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
252b5132
RH
9892 entry->d_un.d_val;
9893
9894 if (do_dynamic)
9895 {
9896 switch (elf_header.e_machine)
9897 {
9898 case EM_MIPS:
4fe85591 9899 case EM_MIPS_RS3_LE:
b2d38a17 9900 dynamic_section_mips_val (entry);
252b5132 9901 break;
103f02d3 9902 case EM_PARISC:
b2d38a17 9903 dynamic_section_parisc_val (entry);
103f02d3 9904 break;
ecc51f48 9905 case EM_IA_64:
b2d38a17 9906 dynamic_section_ia64_val (entry);
ecc51f48 9907 break;
252b5132 9908 default:
f7a99963
NC
9909 print_vma (entry->d_un.d_val, PREFIX_HEX);
9910 putchar ('\n');
252b5132
RH
9911 }
9912 }
9913 break;
9914 }
9915 }
9916
9917 return 1;
9918}
9919
9920static char *
d3ba0551 9921get_ver_flags (unsigned int flags)
252b5132 9922{
b34976b6 9923 static char buff[32];
252b5132
RH
9924
9925 buff[0] = 0;
9926
9927 if (flags == 0)
9928 return _("none");
9929
9930 if (flags & VER_FLG_BASE)
9931 strcat (buff, "BASE ");
9932
9933 if (flags & VER_FLG_WEAK)
9934 {
9935 if (flags & VER_FLG_BASE)
9936 strcat (buff, "| ");
9937
9938 strcat (buff, "WEAK ");
9939 }
9940
44ec90b9
RO
9941 if (flags & VER_FLG_INFO)
9942 {
9943 if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
9944 strcat (buff, "| ");
9945
9946 strcat (buff, "INFO ");
9947 }
9948
9949 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
2b692964 9950 strcat (buff, _("| <unknown>"));
252b5132
RH
9951
9952 return buff;
9953}
9954
9955/* Display the contents of the version sections. */
98fb390a 9956
252b5132 9957static int
2cf0635d 9958process_version_sections (FILE * file)
252b5132 9959{
2cf0635d 9960 Elf_Internal_Shdr * section;
b34976b6
AM
9961 unsigned i;
9962 int found = 0;
252b5132
RH
9963
9964 if (! do_version)
9965 return 1;
9966
9967 for (i = 0, section = section_headers;
9968 i < elf_header.e_shnum;
b34976b6 9969 i++, section++)
252b5132
RH
9970 {
9971 switch (section->sh_type)
9972 {
9973 case SHT_GNU_verdef:
9974 {
2cf0635d 9975 Elf_External_Verdef * edefs;
b34976b6
AM
9976 unsigned int idx;
9977 unsigned int cnt;
2cf0635d 9978 char * endbuf;
252b5132
RH
9979
9980 found = 1;
9981
74e1a04b
NC
9982 printf (_("\nVersion definition section '%s' contains %u entries:\n"),
9983 printable_section_name (section),
9984 section->sh_info);
252b5132
RH
9985
9986 printf (_(" Addr: 0x"));
9987 printf_vma (section->sh_addr);
74e1a04b 9988 printf (_(" Offset: %#08lx Link: %u (%s)"),
1b228002 9989 (unsigned long) section->sh_offset, section->sh_link,
74e1a04b 9990 printable_section_name_from_index (section->sh_link));
252b5132 9991
3f5e193b
NC
9992 edefs = (Elf_External_Verdef *)
9993 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
9994 _("version definition section"));
a6e9f9df
AM
9995 if (!edefs)
9996 break;
59245841 9997 endbuf = (char *) edefs + section->sh_size;
252b5132 9998
b34976b6 9999 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
252b5132 10000 {
2cf0635d
NC
10001 char * vstart;
10002 Elf_External_Verdef * edef;
b34976b6 10003 Elf_Internal_Verdef ent;
2cf0635d 10004 Elf_External_Verdaux * eaux;
b34976b6
AM
10005 Elf_Internal_Verdaux aux;
10006 int j;
10007 int isum;
103f02d3 10008
222c2bf0 10009 /* Check for very large indices. */
7e26601c 10010 if (idx > (size_t) (endbuf - (char *) edefs))
dd24e3da
NC
10011 break;
10012
252b5132 10013 vstart = ((char *) edefs) + idx;
54806181
AM
10014 if (vstart + sizeof (*edef) > endbuf)
10015 break;
252b5132
RH
10016
10017 edef = (Elf_External_Verdef *) vstart;
10018
10019 ent.vd_version = BYTE_GET (edef->vd_version);
10020 ent.vd_flags = BYTE_GET (edef->vd_flags);
10021 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
10022 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
10023 ent.vd_hash = BYTE_GET (edef->vd_hash);
10024 ent.vd_aux = BYTE_GET (edef->vd_aux);
10025 ent.vd_next = BYTE_GET (edef->vd_next);
10026
10027 printf (_(" %#06x: Rev: %d Flags: %s"),
10028 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
10029
10030 printf (_(" Index: %d Cnt: %d "),
10031 ent.vd_ndx, ent.vd_cnt);
10032
dd24e3da 10033 /* Check for overflow. */
4aeb00ad 10034 if (ent.vd_aux + sizeof (* eaux) > (size_t) (endbuf - vstart))
dd24e3da
NC
10035 break;
10036
252b5132
RH
10037 vstart += ent.vd_aux;
10038
10039 eaux = (Elf_External_Verdaux *) vstart;
10040
10041 aux.vda_name = BYTE_GET (eaux->vda_name);
10042 aux.vda_next = BYTE_GET (eaux->vda_next);
10043
d79b3d50
NC
10044 if (VALID_DYNAMIC_NAME (aux.vda_name))
10045 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
252b5132
RH
10046 else
10047 printf (_("Name index: %ld\n"), aux.vda_name);
10048
10049 isum = idx + ent.vd_aux;
10050
b34976b6 10051 for (j = 1; j < ent.vd_cnt; j++)
252b5132 10052 {
dd24e3da 10053 /* Check for overflow. */
7e26601c 10054 if (aux.vda_next > (size_t) (endbuf - vstart))
dd24e3da
NC
10055 break;
10056
252b5132
RH
10057 isum += aux.vda_next;
10058 vstart += aux.vda_next;
10059
10060 eaux = (Elf_External_Verdaux *) vstart;
54806181
AM
10061 if (vstart + sizeof (*eaux) > endbuf)
10062 break;
252b5132
RH
10063
10064 aux.vda_name = BYTE_GET (eaux->vda_name);
10065 aux.vda_next = BYTE_GET (eaux->vda_next);
10066
d79b3d50 10067 if (VALID_DYNAMIC_NAME (aux.vda_name))
252b5132 10068 printf (_(" %#06x: Parent %d: %s\n"),
d79b3d50 10069 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
252b5132
RH
10070 else
10071 printf (_(" %#06x: Parent %d, name index: %ld\n"),
10072 isum, j, aux.vda_name);
10073 }
dd24e3da 10074
54806181
AM
10075 if (j < ent.vd_cnt)
10076 printf (_(" Version def aux past end of section\n"));
252b5132 10077
5d921cbd
NC
10078 /* PR 17531: file: id:000001,src:000172+005151,op:splice,rep:2. */
10079 if (idx + ent.vd_next <= idx)
10080 break;
10081
252b5132
RH
10082 idx += ent.vd_next;
10083 }
dd24e3da 10084
54806181
AM
10085 if (cnt < section->sh_info)
10086 printf (_(" Version definition past end of section\n"));
252b5132
RH
10087
10088 free (edefs);
10089 }
10090 break;
103f02d3 10091
252b5132
RH
10092 case SHT_GNU_verneed:
10093 {
2cf0635d 10094 Elf_External_Verneed * eneed;
b34976b6
AM
10095 unsigned int idx;
10096 unsigned int cnt;
2cf0635d 10097 char * endbuf;
252b5132
RH
10098
10099 found = 1;
10100
72de5009 10101 printf (_("\nVersion needs section '%s' contains %u entries:\n"),
74e1a04b 10102 printable_section_name (section), section->sh_info);
252b5132
RH
10103
10104 printf (_(" Addr: 0x"));
10105 printf_vma (section->sh_addr);
72de5009 10106 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
1b228002 10107 (unsigned long) section->sh_offset, section->sh_link,
74e1a04b 10108 printable_section_name_from_index (section->sh_link));
252b5132 10109
3f5e193b
NC
10110 eneed = (Elf_External_Verneed *) get_data (NULL, file,
10111 section->sh_offset, 1,
10112 section->sh_size,
9cf03b7e 10113 _("Version Needs section"));
a6e9f9df
AM
10114 if (!eneed)
10115 break;
59245841 10116 endbuf = (char *) eneed + section->sh_size;
252b5132
RH
10117
10118 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10119 {
2cf0635d 10120 Elf_External_Verneed * entry;
b34976b6
AM
10121 Elf_Internal_Verneed ent;
10122 int j;
10123 int isum;
2cf0635d 10124 char * vstart;
252b5132 10125
7e26601c 10126 if (idx > (size_t) (endbuf - (char *) eneed))
dd24e3da
NC
10127 break;
10128
252b5132 10129 vstart = ((char *) eneed) + idx;
54806181
AM
10130 if (vstart + sizeof (*entry) > endbuf)
10131 break;
252b5132
RH
10132
10133 entry = (Elf_External_Verneed *) vstart;
10134
10135 ent.vn_version = BYTE_GET (entry->vn_version);
10136 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
10137 ent.vn_file = BYTE_GET (entry->vn_file);
10138 ent.vn_aux = BYTE_GET (entry->vn_aux);
10139 ent.vn_next = BYTE_GET (entry->vn_next);
10140
10141 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
10142
d79b3d50
NC
10143 if (VALID_DYNAMIC_NAME (ent.vn_file))
10144 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
252b5132
RH
10145 else
10146 printf (_(" File: %lx"), ent.vn_file);
10147
10148 printf (_(" Cnt: %d\n"), ent.vn_cnt);
10149
dd24e3da 10150 /* Check for overflow. */
7e26601c 10151 if (ent.vn_aux > (size_t) (endbuf - vstart))
dd24e3da 10152 break;
252b5132
RH
10153 vstart += ent.vn_aux;
10154
10155 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
10156 {
2cf0635d 10157 Elf_External_Vernaux * eaux;
b34976b6 10158 Elf_Internal_Vernaux aux;
252b5132 10159
54806181
AM
10160 if (vstart + sizeof (*eaux) > endbuf)
10161 break;
252b5132
RH
10162 eaux = (Elf_External_Vernaux *) vstart;
10163
10164 aux.vna_hash = BYTE_GET (eaux->vna_hash);
10165 aux.vna_flags = BYTE_GET (eaux->vna_flags);
10166 aux.vna_other = BYTE_GET (eaux->vna_other);
10167 aux.vna_name = BYTE_GET (eaux->vna_name);
10168 aux.vna_next = BYTE_GET (eaux->vna_next);
10169
d79b3d50 10170 if (VALID_DYNAMIC_NAME (aux.vna_name))
ecc2063b 10171 printf (_(" %#06x: Name: %s"),
d79b3d50 10172 isum, GET_DYNAMIC_NAME (aux.vna_name));
252b5132 10173 else
ecc2063b 10174 printf (_(" %#06x: Name index: %lx"),
252b5132
RH
10175 isum, aux.vna_name);
10176
10177 printf (_(" Flags: %s Version: %d\n"),
10178 get_ver_flags (aux.vna_flags), aux.vna_other);
10179
dd24e3da 10180 /* Check for overflow. */
53774b7e
NC
10181 if (aux.vna_next > (size_t) (endbuf - vstart)
10182 || (aux.vna_next == 0 && j < ent.vn_cnt - 1))
10183 {
10184 warn (_("Invalid vna_next field of %lx\n"),
10185 aux.vna_next);
10186 j = ent.vn_cnt;
10187 break;
10188 }
252b5132
RH
10189 isum += aux.vna_next;
10190 vstart += aux.vna_next;
10191 }
9cf03b7e 10192
54806181 10193 if (j < ent.vn_cnt)
9cf03b7e 10194 warn (_("Missing Version Needs auxillary information\n"));
252b5132 10195
bcf83b2a 10196 if (ent.vn_next == 0 && cnt < section->sh_info - 1)
c24cf8b6
NC
10197 {
10198 warn (_("Corrupt Version Needs structure - offset to next structure is zero with entries still left to be processed\n"));
10199 cnt = section->sh_info;
10200 break;
10201 }
252b5132
RH
10202 idx += ent.vn_next;
10203 }
9cf03b7e 10204
54806181 10205 if (cnt < section->sh_info)
9cf03b7e 10206 warn (_("Missing Version Needs information\n"));
103f02d3 10207
252b5132
RH
10208 free (eneed);
10209 }
10210 break;
10211
10212 case SHT_GNU_versym:
10213 {
2cf0635d 10214 Elf_Internal_Shdr * link_section;
8b73c356
NC
10215 size_t total;
10216 unsigned int cnt;
2cf0635d
NC
10217 unsigned char * edata;
10218 unsigned short * data;
10219 char * strtab;
10220 Elf_Internal_Sym * symbols;
10221 Elf_Internal_Shdr * string_sec;
ba5cdace 10222 unsigned long num_syms;
d3ba0551 10223 long off;
252b5132 10224
4fbb74a6 10225 if (section->sh_link >= elf_header.e_shnum)
c256ffe7
JJ
10226 break;
10227
4fbb74a6 10228 link_section = section_headers + section->sh_link;
08d8fa11 10229 total = section->sh_size / sizeof (Elf_External_Versym);
252b5132 10230
4fbb74a6 10231 if (link_section->sh_link >= elf_header.e_shnum)
c256ffe7
JJ
10232 break;
10233
252b5132
RH
10234 found = 1;
10235
ba5cdace 10236 symbols = GET_ELF_SYMBOLS (file, link_section, & num_syms);
dd24e3da
NC
10237 if (symbols == NULL)
10238 break;
252b5132 10239
4fbb74a6 10240 string_sec = section_headers + link_section->sh_link;
252b5132 10241
3f5e193b
NC
10242 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
10243 string_sec->sh_size,
10244 _("version string table"));
a6e9f9df 10245 if (!strtab)
0429c154
MS
10246 {
10247 free (symbols);
10248 break;
10249 }
252b5132 10250
8b73c356
NC
10251 printf (_("\nVersion symbols section '%s' contains %lu entries:\n"),
10252 printable_section_name (section), (unsigned long) total);
252b5132
RH
10253
10254 printf (_(" Addr: "));
10255 printf_vma (section->sh_addr);
72de5009 10256 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
1b228002 10257 (unsigned long) section->sh_offset, section->sh_link,
74e1a04b 10258 printable_section_name (link_section));
252b5132 10259
d3ba0551
AM
10260 off = offset_from_vma (file,
10261 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10262 total * sizeof (short));
3f5e193b
NC
10263 edata = (unsigned char *) get_data (NULL, file, off, total,
10264 sizeof (short),
10265 _("version symbol data"));
a6e9f9df
AM
10266 if (!edata)
10267 {
10268 free (strtab);
0429c154 10269 free (symbols);
a6e9f9df
AM
10270 break;
10271 }
252b5132 10272
3f5e193b 10273 data = (short unsigned int *) cmalloc (total, sizeof (short));
252b5132
RH
10274
10275 for (cnt = total; cnt --;)
b34976b6
AM
10276 data[cnt] = byte_get (edata + cnt * sizeof (short),
10277 sizeof (short));
252b5132
RH
10278
10279 free (edata);
10280
10281 for (cnt = 0; cnt < total; cnt += 4)
10282 {
10283 int j, nn;
ab273396
AM
10284 char *name;
10285 char *invalid = _("*invalid*");
252b5132
RH
10286
10287 printf (" %03x:", cnt);
10288
10289 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
b34976b6 10290 switch (data[cnt + j])
252b5132
RH
10291 {
10292 case 0:
10293 fputs (_(" 0 (*local*) "), stdout);
10294 break;
10295
10296 case 1:
10297 fputs (_(" 1 (*global*) "), stdout);
10298 break;
10299
10300 default:
c244d050
NC
10301 nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
10302 data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
252b5132 10303
dd24e3da 10304 /* If this index value is greater than the size of the symbols
ba5cdace
NC
10305 array, break to avoid an out-of-bounds read. */
10306 if ((unsigned long)(cnt + j) >= num_syms)
dd24e3da
NC
10307 {
10308 warn (_("invalid index into symbol array\n"));
10309 break;
10310 }
10311
ab273396
AM
10312 name = NULL;
10313 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
252b5132 10314 {
b34976b6
AM
10315 Elf_Internal_Verneed ivn;
10316 unsigned long offset;
252b5132 10317
d93f0186
NC
10318 offset = offset_from_vma
10319 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10320 sizeof (Elf_External_Verneed));
252b5132 10321
b34976b6 10322 do
252b5132 10323 {
b34976b6
AM
10324 Elf_Internal_Vernaux ivna;
10325 Elf_External_Verneed evn;
10326 Elf_External_Vernaux evna;
10327 unsigned long a_off;
252b5132 10328
59245841
NC
10329 if (get_data (&evn, file, offset, sizeof (evn), 1,
10330 _("version need")) == NULL)
10331 break;
0b4362b0 10332
252b5132
RH
10333 ivn.vn_aux = BYTE_GET (evn.vn_aux);
10334 ivn.vn_next = BYTE_GET (evn.vn_next);
10335
10336 a_off = offset + ivn.vn_aux;
10337
10338 do
10339 {
59245841
NC
10340 if (get_data (&evna, file, a_off, sizeof (evna),
10341 1, _("version need aux (2)")) == NULL)
10342 {
10343 ivna.vna_next = 0;
10344 ivna.vna_other = 0;
10345 }
10346 else
10347 {
10348 ivna.vna_next = BYTE_GET (evna.vna_next);
10349 ivna.vna_other = BYTE_GET (evna.vna_other);
10350 }
252b5132
RH
10351
10352 a_off += ivna.vna_next;
10353 }
b34976b6 10354 while (ivna.vna_other != data[cnt + j]
252b5132
RH
10355 && ivna.vna_next != 0);
10356
b34976b6 10357 if (ivna.vna_other == data[cnt + j])
252b5132
RH
10358 {
10359 ivna.vna_name = BYTE_GET (evna.vna_name);
10360
54806181 10361 if (ivna.vna_name >= string_sec->sh_size)
ab273396 10362 name = invalid;
54806181
AM
10363 else
10364 name = strtab + ivna.vna_name;
252b5132
RH
10365 break;
10366 }
10367
10368 offset += ivn.vn_next;
10369 }
10370 while (ivn.vn_next);
10371 }
00d93f34 10372
ab273396 10373 if (data[cnt + j] != 0x8001
b34976b6 10374 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
252b5132 10375 {
b34976b6
AM
10376 Elf_Internal_Verdef ivd;
10377 Elf_External_Verdef evd;
10378 unsigned long offset;
252b5132 10379
d93f0186
NC
10380 offset = offset_from_vma
10381 (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10382 sizeof evd);
252b5132
RH
10383
10384 do
10385 {
59245841
NC
10386 if (get_data (&evd, file, offset, sizeof (evd), 1,
10387 _("version def")) == NULL)
10388 {
10389 ivd.vd_next = 0;
948f632f 10390 /* PR 17531: file: 046-1082287-0.004. */
3102e897
NC
10391 ivd.vd_ndx = (data[cnt + j] & VERSYM_VERSION) + 1;
10392 break;
59245841
NC
10393 }
10394 else
10395 {
10396 ivd.vd_next = BYTE_GET (evd.vd_next);
10397 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10398 }
252b5132
RH
10399
10400 offset += ivd.vd_next;
10401 }
c244d050 10402 while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
252b5132
RH
10403 && ivd.vd_next != 0);
10404
c244d050 10405 if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
252b5132 10406 {
b34976b6
AM
10407 Elf_External_Verdaux evda;
10408 Elf_Internal_Verdaux ivda;
252b5132
RH
10409
10410 ivd.vd_aux = BYTE_GET (evd.vd_aux);
10411
59245841
NC
10412 if (get_data (&evda, file,
10413 offset - ivd.vd_next + ivd.vd_aux,
10414 sizeof (evda), 1,
10415 _("version def aux")) == NULL)
10416 break;
252b5132
RH
10417
10418 ivda.vda_name = BYTE_GET (evda.vda_name);
10419
54806181 10420 if (ivda.vda_name >= string_sec->sh_size)
ab273396
AM
10421 name = invalid;
10422 else if (name != NULL && name != invalid)
10423 name = _("*both*");
54806181
AM
10424 else
10425 name = strtab + ivda.vda_name;
252b5132
RH
10426 }
10427 }
ab273396
AM
10428 if (name != NULL)
10429 nn += printf ("(%s%-*s",
10430 name,
10431 12 - (int) strlen (name),
10432 ")");
252b5132
RH
10433
10434 if (nn < 18)
10435 printf ("%*c", 18 - nn, ' ');
10436 }
10437
10438 putchar ('\n');
10439 }
10440
10441 free (data);
10442 free (strtab);
10443 free (symbols);
10444 }
10445 break;
103f02d3 10446
252b5132
RH
10447 default:
10448 break;
10449 }
10450 }
10451
10452 if (! found)
10453 printf (_("\nNo version information found in this file.\n"));
10454
10455 return 1;
10456}
10457
d1133906 10458static const char *
d3ba0551 10459get_symbol_binding (unsigned int binding)
252b5132 10460{
b34976b6 10461 static char buff[32];
252b5132
RH
10462
10463 switch (binding)
10464 {
b34976b6
AM
10465 case STB_LOCAL: return "LOCAL";
10466 case STB_GLOBAL: return "GLOBAL";
10467 case STB_WEAK: return "WEAK";
252b5132
RH
10468 default:
10469 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
e9e44622
JJ
10470 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
10471 binding);
252b5132 10472 else if (binding >= STB_LOOS && binding <= STB_HIOS)
3e7a7d11
NC
10473 {
10474 if (binding == STB_GNU_UNIQUE
9c55345c
TS
10475 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10476 /* GNU is still using the default value 0. */
3e7a7d11
NC
10477 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10478 return "UNIQUE";
10479 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
10480 }
252b5132 10481 else
e9e44622 10482 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
252b5132
RH
10483 return buff;
10484 }
10485}
10486
d1133906 10487static const char *
d3ba0551 10488get_symbol_type (unsigned int type)
252b5132 10489{
b34976b6 10490 static char buff[32];
252b5132
RH
10491
10492 switch (type)
10493 {
b34976b6
AM
10494 case STT_NOTYPE: return "NOTYPE";
10495 case STT_OBJECT: return "OBJECT";
10496 case STT_FUNC: return "FUNC";
10497 case STT_SECTION: return "SECTION";
10498 case STT_FILE: return "FILE";
10499 case STT_COMMON: return "COMMON";
10500 case STT_TLS: return "TLS";
15ab5209
DB
10501 case STT_RELC: return "RELC";
10502 case STT_SRELC: return "SRELC";
252b5132
RH
10503 default:
10504 if (type >= STT_LOPROC && type <= STT_HIPROC)
df75f1af 10505 {
3510a7b8
NC
10506 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
10507 return "THUMB_FUNC";
103f02d3 10508
351b4b40 10509 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
103f02d3
UD
10510 return "REGISTER";
10511
10512 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
10513 return "PARISC_MILLI";
10514
e9e44622 10515 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
df75f1af 10516 }
252b5132 10517 else if (type >= STT_LOOS && type <= STT_HIOS)
103f02d3
UD
10518 {
10519 if (elf_header.e_machine == EM_PARISC)
10520 {
10521 if (type == STT_HP_OPAQUE)
10522 return "HP_OPAQUE";
10523 if (type == STT_HP_STUB)
10524 return "HP_STUB";
10525 }
10526
d8045f23 10527 if (type == STT_GNU_IFUNC
9c55345c 10528 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
83c257ca 10529 || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
9c55345c 10530 /* GNU is still using the default value 0. */
d8045f23
NC
10531 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10532 return "IFUNC";
10533
e9e44622 10534 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
103f02d3 10535 }
252b5132 10536 else
e9e44622 10537 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
252b5132
RH
10538 return buff;
10539 }
10540}
10541
d1133906 10542static const char *
d3ba0551 10543get_symbol_visibility (unsigned int visibility)
d1133906
NC
10544{
10545 switch (visibility)
10546 {
b34976b6
AM
10547 case STV_DEFAULT: return "DEFAULT";
10548 case STV_INTERNAL: return "INTERNAL";
10549 case STV_HIDDEN: return "HIDDEN";
d1133906 10550 case STV_PROTECTED: return "PROTECTED";
bee0ee85
NC
10551 default:
10552 error (_("Unrecognized visibility value: %u"), visibility);
10553 return _("<unknown>");
d1133906
NC
10554 }
10555}
10556
fd85a6a1
NC
10557static const char *
10558get_solaris_symbol_visibility (unsigned int visibility)
10559{
10560 switch (visibility)
10561 {
10562 case 4: return "EXPORTED";
10563 case 5: return "SINGLETON";
10564 case 6: return "ELIMINATE";
10565 default: return get_symbol_visibility (visibility);
10566 }
10567}
10568
5e2b0d47
NC
10569static const char *
10570get_mips_symbol_other (unsigned int other)
10571{
10572 switch (other)
10573 {
df58fc94
RS
10574 case STO_OPTIONAL:
10575 return "OPTIONAL";
10576 case STO_MIPS_PLT:
10577 return "MIPS PLT";
10578 case STO_MIPS_PIC:
10579 return "MIPS PIC";
10580 case STO_MICROMIPS:
10581 return "MICROMIPS";
10582 case STO_MICROMIPS | STO_MIPS_PIC:
10583 return "MICROMIPS, MIPS PIC";
10584 case STO_MIPS16:
10585 return "MIPS16";
10586 default:
10587 return NULL;
5e2b0d47
NC
10588 }
10589}
10590
28f997cf
TG
10591static const char *
10592get_ia64_symbol_other (unsigned int other)
10593{
10594 if (is_ia64_vms ())
10595 {
10596 static char res[32];
10597
10598 res[0] = 0;
10599
10600 /* Function types is for images and .STB files only. */
10601 switch (elf_header.e_type)
10602 {
10603 case ET_DYN:
10604 case ET_EXEC:
10605 switch (VMS_ST_FUNC_TYPE (other))
10606 {
10607 case VMS_SFT_CODE_ADDR:
10608 strcat (res, " CA");
10609 break;
10610 case VMS_SFT_SYMV_IDX:
10611 strcat (res, " VEC");
10612 break;
10613 case VMS_SFT_FD:
10614 strcat (res, " FD");
10615 break;
10616 case VMS_SFT_RESERVE:
10617 strcat (res, " RSV");
10618 break;
10619 default:
bee0ee85
NC
10620 warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
10621 VMS_ST_FUNC_TYPE (other));
10622 strcat (res, " <unknown>");
10623 break;
28f997cf
TG
10624 }
10625 break;
10626 default:
10627 break;
10628 }
10629 switch (VMS_ST_LINKAGE (other))
10630 {
10631 case VMS_STL_IGNORE:
10632 strcat (res, " IGN");
10633 break;
10634 case VMS_STL_RESERVE:
10635 strcat (res, " RSV");
10636 break;
10637 case VMS_STL_STD:
10638 strcat (res, " STD");
10639 break;
10640 case VMS_STL_LNK:
10641 strcat (res, " LNK");
10642 break;
10643 default:
bee0ee85
NC
10644 warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
10645 VMS_ST_LINKAGE (other));
10646 strcat (res, " <unknown>");
10647 break;
28f997cf
TG
10648 }
10649
10650 if (res[0] != 0)
10651 return res + 1;
10652 else
10653 return res;
10654 }
10655 return NULL;
10656}
10657
6911b7dc
AM
10658static const char *
10659get_ppc64_symbol_other (unsigned int other)
10660{
10661 if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
10662 {
10663 static char buf[32];
10664 snprintf (buf, sizeof buf, _("<localentry>: %d"),
10665 PPC64_LOCAL_ENTRY_OFFSET (other));
10666 return buf;
10667 }
10668 return NULL;
10669}
10670
5e2b0d47
NC
10671static const char *
10672get_symbol_other (unsigned int other)
10673{
10674 const char * result = NULL;
10675 static char buff [32];
10676
10677 if (other == 0)
10678 return "";
10679
10680 switch (elf_header.e_machine)
10681 {
10682 case EM_MIPS:
10683 result = get_mips_symbol_other (other);
28f997cf
TG
10684 break;
10685 case EM_IA_64:
10686 result = get_ia64_symbol_other (other);
10687 break;
6911b7dc
AM
10688 case EM_PPC64:
10689 result = get_ppc64_symbol_other (other);
10690 break;
5e2b0d47 10691 default:
fd85a6a1 10692 result = NULL;
5e2b0d47
NC
10693 break;
10694 }
10695
10696 if (result)
10697 return result;
10698
10699 snprintf (buff, sizeof buff, _("<other>: %x"), other);
10700 return buff;
10701}
10702
d1133906 10703static const char *
d3ba0551 10704get_symbol_index_type (unsigned int type)
252b5132 10705{
b34976b6 10706 static char buff[32];
5cf1065c 10707
252b5132
RH
10708 switch (type)
10709 {
b34976b6
AM
10710 case SHN_UNDEF: return "UND";
10711 case SHN_ABS: return "ABS";
10712 case SHN_COMMON: return "COM";
252b5132 10713 default:
9ce701e2
L
10714 if (type == SHN_IA_64_ANSI_COMMON
10715 && elf_header.e_machine == EM_IA_64
10716 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
10717 return "ANSI_COM";
8a9036a4 10718 else if ((elf_header.e_machine == EM_X86_64
7a9068fe
L
10719 || elf_header.e_machine == EM_L1OM
10720 || elf_header.e_machine == EM_K1OM)
3b22753a
L
10721 && type == SHN_X86_64_LCOMMON)
10722 return "LARGE_COM";
ac145307
BS
10723 else if ((type == SHN_MIPS_SCOMMON
10724 && elf_header.e_machine == EM_MIPS)
10725 || (type == SHN_TIC6X_SCOMMON
10726 && elf_header.e_machine == EM_TI_C6000))
172553c7
TS
10727 return "SCOM";
10728 else if (type == SHN_MIPS_SUNDEFINED
10729 && elf_header.e_machine == EM_MIPS)
10730 return "SUND";
9ce701e2 10731 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
4fbb74a6 10732 sprintf (buff, "PRC[0x%04x]", type & 0xffff);
252b5132 10733 else if (type >= SHN_LOOS && type <= SHN_HIOS)
4fbb74a6
AM
10734 sprintf (buff, "OS [0x%04x]", type & 0xffff);
10735 else if (type >= SHN_LORESERVE)
10736 sprintf (buff, "RSV[0x%04x]", type & 0xffff);
c6d8cab4 10737 else if (type >= elf_header.e_shnum)
e0a31db1 10738 sprintf (buff, _("bad section index[%3d]"), type);
252b5132 10739 else
232e7cb8 10740 sprintf (buff, "%3d", type);
5cf1065c 10741 break;
252b5132 10742 }
5cf1065c
NC
10743
10744 return buff;
252b5132
RH
10745}
10746
66543521 10747static bfd_vma *
57028622 10748get_dynamic_data (FILE * file, bfd_size_type number, unsigned int ent_size)
252b5132 10749{
2cf0635d
NC
10750 unsigned char * e_data;
10751 bfd_vma * i_data;
252b5132 10752
57028622
NC
10753 /* If the size_t type is smaller than the bfd_size_type, eg because
10754 you are building a 32-bit tool on a 64-bit host, then make sure
10755 that when (number) is cast to (size_t) no information is lost. */
10756 if (sizeof (size_t) < sizeof (bfd_size_type)
10757 && (bfd_size_type) ((size_t) number) != number)
10758 {
ed754a13
AM
10759 error (_("Size truncation prevents reading %" BFD_VMA_FMT "u"
10760 " elements of size %u\n"),
10761 number, ent_size);
57028622
NC
10762 return NULL;
10763 }
948f632f 10764
3102e897
NC
10765 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
10766 attempting to allocate memory when the read is bound to fail. */
10767 if (ent_size * number > current_file_size)
10768 {
ed754a13
AM
10769 error (_("Invalid number of dynamic entries: %" BFD_VMA_FMT "u\n"),
10770 number);
3102e897
NC
10771 return NULL;
10772 }
10773
57028622 10774 e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
252b5132
RH
10775 if (e_data == NULL)
10776 {
ed754a13
AM
10777 error (_("Out of memory reading %" BFD_VMA_FMT "u dynamic entries\n"),
10778 number);
252b5132
RH
10779 return NULL;
10780 }
10781
57028622 10782 if (fread (e_data, ent_size, (size_t) number, file) != number)
252b5132 10783 {
ed754a13
AM
10784 error (_("Unable to read in %" BFD_VMA_FMT "u bytes of dynamic data\n"),
10785 number * ent_size);
3102e897 10786 free (e_data);
252b5132
RH
10787 return NULL;
10788 }
10789
57028622 10790 i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
252b5132
RH
10791 if (i_data == NULL)
10792 {
ed754a13
AM
10793 error (_("Out of memory allocating space for %" BFD_VMA_FMT "u"
10794 " dynamic entries\n"),
10795 number);
252b5132
RH
10796 free (e_data);
10797 return NULL;
10798 }
10799
10800 while (number--)
66543521 10801 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
252b5132
RH
10802
10803 free (e_data);
10804
10805 return i_data;
10806}
10807
6bd1a22c
L
10808static void
10809print_dynamic_symbol (bfd_vma si, unsigned long hn)
10810{
2cf0635d 10811 Elf_Internal_Sym * psym;
6bd1a22c
L
10812 int n;
10813
6bd1a22c
L
10814 n = print_vma (si, DEC_5);
10815 if (n < 5)
0b4362b0 10816 fputs (&" "[n], stdout);
6bd1a22c 10817 printf (" %3lu: ", hn);
e0a31db1
NC
10818
10819 if (dynamic_symbols == NULL || si >= num_dynamic_syms)
10820 {
3102e897
NC
10821 printf (_("<No info available for dynamic symbol number %lu>\n"),
10822 (unsigned long) si);
e0a31db1
NC
10823 return;
10824 }
10825
10826 psym = dynamic_symbols + si;
6bd1a22c
L
10827 print_vma (psym->st_value, LONG_HEX);
10828 putchar (' ');
10829 print_vma (psym->st_size, DEC_5);
10830
f4be36b3
AM
10831 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10832 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
fd85a6a1
NC
10833
10834 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
10835 printf (" %-7s", get_solaris_symbol_visibility (psym->st_other));
10836 else
10837 {
10838 unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
10839
10840 printf (" %-7s", get_symbol_visibility (vis));
10841 /* Check to see if any other bits in the st_other field are set.
10842 Note - displaying this information disrupts the layout of the
10843 table being generated, but for the moment this case is very
10844 rare. */
10845 if (psym->st_other ^ vis)
10846 printf (" [%s] ", get_symbol_other (psym->st_other ^ vis));
10847 }
10848
6bd1a22c
L
10849 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
10850 if (VALID_DYNAMIC_NAME (psym->st_name))
10851 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
10852 else
2b692964 10853 printf (_(" <corrupt: %14ld>"), psym->st_name);
6bd1a22c
L
10854 putchar ('\n');
10855}
10856
bb4d2ac2 10857static const char *
1449284b
NC
10858get_symbol_version_string (FILE * file,
10859 bfd_boolean is_dynsym,
10860 const char * strtab,
10861 unsigned long int strtab_size,
10862 unsigned int si,
10863 Elf_Internal_Sym * psym,
10864 enum versioned_symbol_info * sym_info,
10865 unsigned short * vna_other)
bb4d2ac2 10866{
ab273396
AM
10867 unsigned char data[2];
10868 unsigned short vers_data;
10869 unsigned long offset;
bb4d2ac2 10870
ab273396
AM
10871 if (!is_dynsym
10872 || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
10873 return NULL;
bb4d2ac2 10874
ab273396
AM
10875 offset = offset_from_vma (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10876 sizeof data + si * sizeof (vers_data));
bb4d2ac2 10877
ab273396
AM
10878 if (get_data (&data, file, offset + si * sizeof (vers_data),
10879 sizeof (data), 1, _("version data")) == NULL)
10880 return NULL;
10881
10882 vers_data = byte_get (data, 2);
bb4d2ac2 10883
ab273396
AM
10884 if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data <= 1)
10885 return NULL;
bb4d2ac2 10886
ab273396
AM
10887 /* Usually we'd only see verdef for defined symbols, and verneed for
10888 undefined symbols. However, symbols defined by the linker in
10889 .dynbss for variables copied from a shared library in order to
10890 avoid text relocations are defined yet have verneed. We could
10891 use a heuristic to detect the special case, for example, check
10892 for verneed first on symbols defined in SHT_NOBITS sections, but
10893 it is simpler and more reliable to just look for both verdef and
10894 verneed. .dynbss might not be mapped to a SHT_NOBITS section. */
bb4d2ac2 10895
ab273396
AM
10896 if (psym->st_shndx != SHN_UNDEF
10897 && vers_data != 0x8001
10898 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10899 {
10900 Elf_Internal_Verdef ivd;
10901 Elf_Internal_Verdaux ivda;
10902 Elf_External_Verdaux evda;
10903 unsigned long off;
bb4d2ac2 10904
ab273396
AM
10905 off = offset_from_vma (file,
10906 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10907 sizeof (Elf_External_Verdef));
10908
10909 do
bb4d2ac2 10910 {
ab273396
AM
10911 Elf_External_Verdef evd;
10912
10913 if (get_data (&evd, file, off, sizeof (evd), 1,
10914 _("version def")) == NULL)
10915 {
10916 ivd.vd_ndx = 0;
10917 ivd.vd_aux = 0;
10918 ivd.vd_next = 0;
10919 }
10920 else
bb4d2ac2 10921 {
ab273396
AM
10922 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10923 ivd.vd_aux = BYTE_GET (evd.vd_aux);
10924 ivd.vd_next = BYTE_GET (evd.vd_next);
10925 }
bb4d2ac2 10926
ab273396
AM
10927 off += ivd.vd_next;
10928 }
10929 while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
bb4d2ac2 10930
ab273396
AM
10931 if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
10932 {
10933 off -= ivd.vd_next;
10934 off += ivd.vd_aux;
bb4d2ac2 10935
ab273396
AM
10936 if (get_data (&evda, file, off, sizeof (evda), 1,
10937 _("version def aux")) != NULL)
10938 {
10939 ivda.vda_name = BYTE_GET (evda.vda_name);
bb4d2ac2 10940
ab273396
AM
10941 if (psym->st_name != ivda.vda_name)
10942 {
10943 *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
10944 ? symbol_hidden : symbol_public);
10945 return (ivda.vda_name < strtab_size
10946 ? strtab + ivda.vda_name : _("<corrupt>"));
10947 }
10948 }
10949 }
10950 }
bb4d2ac2 10951
ab273396
AM
10952 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10953 {
10954 Elf_External_Verneed evn;
10955 Elf_Internal_Verneed ivn;
10956 Elf_Internal_Vernaux ivna;
bb4d2ac2 10957
ab273396
AM
10958 offset = offset_from_vma (file,
10959 version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10960 sizeof evn);
10961 do
10962 {
10963 unsigned long vna_off;
bb4d2ac2 10964
ab273396
AM
10965 if (get_data (&evn, file, offset, sizeof (evn), 1,
10966 _("version need")) == NULL)
10967 {
10968 ivna.vna_next = 0;
10969 ivna.vna_other = 0;
10970 ivna.vna_name = 0;
10971 break;
10972 }
bb4d2ac2 10973
ab273396
AM
10974 ivn.vn_aux = BYTE_GET (evn.vn_aux);
10975 ivn.vn_next = BYTE_GET (evn.vn_next);
bb4d2ac2 10976
ab273396 10977 vna_off = offset + ivn.vn_aux;
bb4d2ac2 10978
ab273396
AM
10979 do
10980 {
10981 Elf_External_Vernaux evna;
bb4d2ac2 10982
ab273396
AM
10983 if (get_data (&evna, file, vna_off, sizeof (evna), 1,
10984 _("version need aux (3)")) == NULL)
bb4d2ac2 10985 {
ab273396
AM
10986 ivna.vna_next = 0;
10987 ivna.vna_other = 0;
10988 ivna.vna_name = 0;
bb4d2ac2 10989 }
bb4d2ac2 10990 else
bb4d2ac2 10991 {
ab273396
AM
10992 ivna.vna_other = BYTE_GET (evna.vna_other);
10993 ivna.vna_next = BYTE_GET (evna.vna_next);
10994 ivna.vna_name = BYTE_GET (evna.vna_name);
10995 }
bb4d2ac2 10996
ab273396
AM
10997 vna_off += ivna.vna_next;
10998 }
10999 while (ivna.vna_other != vers_data && ivna.vna_next != 0);
bb4d2ac2 11000
ab273396
AM
11001 if (ivna.vna_other == vers_data)
11002 break;
bb4d2ac2 11003
ab273396
AM
11004 offset += ivn.vn_next;
11005 }
11006 while (ivn.vn_next != 0);
bb4d2ac2 11007
ab273396
AM
11008 if (ivna.vna_other == vers_data)
11009 {
11010 *sym_info = symbol_undefined;
11011 *vna_other = ivna.vna_other;
11012 return (ivna.vna_name < strtab_size
11013 ? strtab + ivna.vna_name : _("<corrupt>"));
bb4d2ac2
L
11014 }
11015 }
ab273396 11016 return NULL;
bb4d2ac2
L
11017}
11018
e3c8793a 11019/* Dump the symbol table. */
252b5132 11020static int
2cf0635d 11021process_symbol_table (FILE * file)
252b5132 11022{
2cf0635d 11023 Elf_Internal_Shdr * section;
8b73c356
NC
11024 bfd_size_type nbuckets = 0;
11025 bfd_size_type nchains = 0;
2cf0635d
NC
11026 bfd_vma * buckets = NULL;
11027 bfd_vma * chains = NULL;
fdc90cb4 11028 bfd_vma ngnubuckets = 0;
2cf0635d
NC
11029 bfd_vma * gnubuckets = NULL;
11030 bfd_vma * gnuchains = NULL;
6bd1a22c 11031 bfd_vma gnusymidx = 0;
071436c6 11032 bfd_size_type ngnuchains = 0;
252b5132 11033
2c610e4b 11034 if (!do_syms && !do_dyn_syms && !do_histogram)
252b5132
RH
11035 return 1;
11036
6bd1a22c
L
11037 if (dynamic_info[DT_HASH]
11038 && (do_histogram
2c610e4b
L
11039 || (do_using_dynamic
11040 && !do_dyn_syms
11041 && dynamic_strings != NULL)))
252b5132 11042 {
66543521
AM
11043 unsigned char nb[8];
11044 unsigned char nc[8];
8b73c356 11045 unsigned int hash_ent_size = 4;
66543521
AM
11046
11047 if ((elf_header.e_machine == EM_ALPHA
11048 || elf_header.e_machine == EM_S390
11049 || elf_header.e_machine == EM_S390_OLD)
11050 && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
11051 hash_ent_size = 8;
11052
fb52b2f4
NC
11053 if (fseek (file,
11054 (archive_file_offset
11055 + offset_from_vma (file, dynamic_info[DT_HASH],
11056 sizeof nb + sizeof nc)),
d93f0186 11057 SEEK_SET))
252b5132 11058 {
591a748a 11059 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 11060 goto no_hash;
252b5132
RH
11061 }
11062
66543521 11063 if (fread (nb, hash_ent_size, 1, file) != 1)
252b5132
RH
11064 {
11065 error (_("Failed to read in number of buckets\n"));
d3a44ec6 11066 goto no_hash;
252b5132
RH
11067 }
11068
66543521 11069 if (fread (nc, hash_ent_size, 1, file) != 1)
252b5132
RH
11070 {
11071 error (_("Failed to read in number of chains\n"));
d3a44ec6 11072 goto no_hash;
252b5132
RH
11073 }
11074
66543521
AM
11075 nbuckets = byte_get (nb, hash_ent_size);
11076 nchains = byte_get (nc, hash_ent_size);
252b5132 11077
66543521
AM
11078 buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
11079 chains = get_dynamic_data (file, nchains, hash_ent_size);
252b5132 11080
d3a44ec6 11081 no_hash:
252b5132 11082 if (buckets == NULL || chains == NULL)
d3a44ec6
JJ
11083 {
11084 if (do_using_dynamic)
11085 return 0;
11086 free (buckets);
11087 free (chains);
11088 buckets = NULL;
11089 chains = NULL;
11090 nbuckets = 0;
11091 nchains = 0;
11092 }
252b5132
RH
11093 }
11094
6bd1a22c
L
11095 if (dynamic_info_DT_GNU_HASH
11096 && (do_histogram
2c610e4b
L
11097 || (do_using_dynamic
11098 && !do_dyn_syms
11099 && dynamic_strings != NULL)))
252b5132 11100 {
6bd1a22c
L
11101 unsigned char nb[16];
11102 bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
11103 bfd_vma buckets_vma;
11104
11105 if (fseek (file,
11106 (archive_file_offset
11107 + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
11108 sizeof nb)),
11109 SEEK_SET))
11110 {
11111 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 11112 goto no_gnu_hash;
6bd1a22c 11113 }
252b5132 11114
6bd1a22c
L
11115 if (fread (nb, 16, 1, file) != 1)
11116 {
11117 error (_("Failed to read in number of buckets\n"));
d3a44ec6 11118 goto no_gnu_hash;
6bd1a22c
L
11119 }
11120
11121 ngnubuckets = byte_get (nb, 4);
11122 gnusymidx = byte_get (nb + 4, 4);
11123 bitmaskwords = byte_get (nb + 8, 4);
11124 buckets_vma = dynamic_info_DT_GNU_HASH + 16;
f7a99963 11125 if (is_32bit_elf)
6bd1a22c 11126 buckets_vma += bitmaskwords * 4;
f7a99963 11127 else
6bd1a22c 11128 buckets_vma += bitmaskwords * 8;
252b5132 11129
6bd1a22c
L
11130 if (fseek (file,
11131 (archive_file_offset
11132 + offset_from_vma (file, buckets_vma, 4)),
11133 SEEK_SET))
252b5132 11134 {
6bd1a22c 11135 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 11136 goto no_gnu_hash;
6bd1a22c
L
11137 }
11138
11139 gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
252b5132 11140
6bd1a22c 11141 if (gnubuckets == NULL)
d3a44ec6 11142 goto no_gnu_hash;
6bd1a22c
L
11143
11144 for (i = 0; i < ngnubuckets; i++)
11145 if (gnubuckets[i] != 0)
11146 {
11147 if (gnubuckets[i] < gnusymidx)
11148 return 0;
11149
11150 if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
11151 maxchain = gnubuckets[i];
11152 }
11153
11154 if (maxchain == 0xffffffff)
d3a44ec6 11155 goto no_gnu_hash;
6bd1a22c
L
11156
11157 maxchain -= gnusymidx;
11158
11159 if (fseek (file,
11160 (archive_file_offset
11161 + offset_from_vma (file, buckets_vma
11162 + 4 * (ngnubuckets + maxchain), 4)),
11163 SEEK_SET))
11164 {
11165 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 11166 goto no_gnu_hash;
6bd1a22c
L
11167 }
11168
11169 do
11170 {
11171 if (fread (nb, 4, 1, file) != 1)
252b5132 11172 {
6bd1a22c 11173 error (_("Failed to determine last chain length\n"));
d3a44ec6 11174 goto no_gnu_hash;
6bd1a22c 11175 }
252b5132 11176
6bd1a22c 11177 if (maxchain + 1 == 0)
d3a44ec6 11178 goto no_gnu_hash;
252b5132 11179
6bd1a22c
L
11180 ++maxchain;
11181 }
11182 while ((byte_get (nb, 4) & 1) == 0);
76da6bbe 11183
6bd1a22c
L
11184 if (fseek (file,
11185 (archive_file_offset
11186 + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
11187 SEEK_SET))
11188 {
11189 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 11190 goto no_gnu_hash;
6bd1a22c
L
11191 }
11192
11193 gnuchains = get_dynamic_data (file, maxchain, 4);
071436c6 11194 ngnuchains = maxchain;
6bd1a22c 11195
d3a44ec6 11196 no_gnu_hash:
6bd1a22c 11197 if (gnuchains == NULL)
d3a44ec6
JJ
11198 {
11199 free (gnubuckets);
d3a44ec6
JJ
11200 gnubuckets = NULL;
11201 ngnubuckets = 0;
f64fddf1
NC
11202 if (do_using_dynamic)
11203 return 0;
d3a44ec6 11204 }
6bd1a22c
L
11205 }
11206
11207 if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
11208 && do_syms
11209 && do_using_dynamic
3102e897
NC
11210 && dynamic_strings != NULL
11211 && dynamic_symbols != NULL)
6bd1a22c
L
11212 {
11213 unsigned long hn;
11214
11215 if (dynamic_info[DT_HASH])
11216 {
11217 bfd_vma si;
11218
11219 printf (_("\nSymbol table for image:\n"));
11220 if (is_32bit_elf)
11221 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11222 else
11223 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11224
11225 for (hn = 0; hn < nbuckets; hn++)
11226 {
11227 if (! buckets[hn])
11228 continue;
11229
11230 for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
11231 print_dynamic_symbol (si, hn);
252b5132
RH
11232 }
11233 }
6bd1a22c
L
11234
11235 if (dynamic_info_DT_GNU_HASH)
11236 {
11237 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
11238 if (is_32bit_elf)
11239 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11240 else
11241 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11242
11243 for (hn = 0; hn < ngnubuckets; ++hn)
11244 if (gnubuckets[hn] != 0)
11245 {
11246 bfd_vma si = gnubuckets[hn];
11247 bfd_vma off = si - gnusymidx;
11248
11249 do
11250 {
11251 print_dynamic_symbol (si, hn);
11252 si++;
11253 }
071436c6 11254 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
6bd1a22c
L
11255 }
11256 }
252b5132 11257 }
8b73c356
NC
11258 else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
11259 && section_headers != NULL)
252b5132 11260 {
b34976b6 11261 unsigned int i;
252b5132
RH
11262
11263 for (i = 0, section = section_headers;
11264 i < elf_header.e_shnum;
11265 i++, section++)
11266 {
b34976b6 11267 unsigned int si;
2cf0635d 11268 char * strtab = NULL;
c256ffe7 11269 unsigned long int strtab_size = 0;
2cf0635d
NC
11270 Elf_Internal_Sym * symtab;
11271 Elf_Internal_Sym * psym;
ba5cdace 11272 unsigned long num_syms;
252b5132 11273
2c610e4b
L
11274 if ((section->sh_type != SHT_SYMTAB
11275 && section->sh_type != SHT_DYNSYM)
11276 || (!do_syms
11277 && section->sh_type == SHT_SYMTAB))
252b5132
RH
11278 continue;
11279
dd24e3da
NC
11280 if (section->sh_entsize == 0)
11281 {
11282 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
74e1a04b 11283 printable_section_name (section));
dd24e3da
NC
11284 continue;
11285 }
11286
252b5132 11287 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
74e1a04b 11288 printable_section_name (section),
252b5132 11289 (unsigned long) (section->sh_size / section->sh_entsize));
dd24e3da 11290
f7a99963 11291 if (is_32bit_elf)
ca47b30c 11292 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
f7a99963 11293 else
ca47b30c 11294 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
252b5132 11295
ba5cdace 11296 symtab = GET_ELF_SYMBOLS (file, section, & num_syms);
252b5132
RH
11297 if (symtab == NULL)
11298 continue;
11299
11300 if (section->sh_link == elf_header.e_shstrndx)
c256ffe7
JJ
11301 {
11302 strtab = string_table;
11303 strtab_size = string_table_length;
11304 }
4fbb74a6 11305 else if (section->sh_link < elf_header.e_shnum)
252b5132 11306 {
2cf0635d 11307 Elf_Internal_Shdr * string_sec;
252b5132 11308
4fbb74a6 11309 string_sec = section_headers + section->sh_link;
252b5132 11310
3f5e193b
NC
11311 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
11312 1, string_sec->sh_size,
11313 _("string table"));
c256ffe7 11314 strtab_size = strtab != NULL ? string_sec->sh_size : 0;
252b5132
RH
11315 }
11316
ba5cdace 11317 for (si = 0, psym = symtab; si < num_syms; si++, psym++)
252b5132 11318 {
bb4d2ac2
L
11319 const char *version_string;
11320 enum versioned_symbol_info sym_info;
11321 unsigned short vna_other;
11322
5e220199 11323 printf ("%6d: ", si);
f7a99963
NC
11324 print_vma (psym->st_value, LONG_HEX);
11325 putchar (' ');
11326 print_vma (psym->st_size, DEC_5);
d1133906
NC
11327 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
11328 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
fd85a6a1
NC
11329 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11330 printf (" %-7s", get_solaris_symbol_visibility (psym->st_other));
11331 else
11332 {
11333 unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11334
11335 printf (" %-7s", get_symbol_visibility (vis));
11336 /* Check to see if any other bits in the st_other field are set.
11337 Note - displaying this information disrupts the layout of the
11338 table being generated, but for the moment this case is very rare. */
11339 if (psym->st_other ^ vis)
11340 printf (" [%s] ", get_symbol_other (psym->st_other ^ vis));
11341 }
31104126 11342 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
c256ffe7 11343 print_symbol (25, psym->st_name < strtab_size
2b692964 11344 ? strtab + psym->st_name : _("<corrupt>"));
252b5132 11345
bb4d2ac2
L
11346 version_string
11347 = get_symbol_version_string (file,
11348 section->sh_type == SHT_DYNSYM,
11349 strtab, strtab_size, si,
11350 psym, &sym_info, &vna_other);
11351 if (version_string)
252b5132 11352 {
bb4d2ac2
L
11353 if (sym_info == symbol_undefined)
11354 printf ("@%s (%d)", version_string, vna_other);
11355 else
11356 printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
11357 version_string);
252b5132
RH
11358 }
11359
11360 putchar ('\n');
52c3c391
NC
11361
11362 if (ELF_ST_BIND (psym->st_info) == STB_LOCAL
dd905818
NC
11363 && si >= section->sh_info
11364 /* Irix 5 and 6 MIPS binaries are known to ignore this requirement. */
11365 && elf_header.e_machine != EM_MIPS
11366 /* Solaris binaries have been found to violate this requirement as
11367 well. Not sure if this is a bug or an ABI requirement. */
11368 && elf_header.e_ident[EI_OSABI] != ELFOSABI_SOLARIS)
52c3c391
NC
11369 warn (_("local symbol %u found at index >= %s's sh_info value of %u\n"),
11370 si, printable_section_name (section), section->sh_info);
252b5132
RH
11371 }
11372
11373 free (symtab);
11374 if (strtab != string_table)
11375 free (strtab);
11376 }
11377 }
11378 else if (do_syms)
11379 printf
11380 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
11381
11382 if (do_histogram && buckets != NULL)
11383 {
2cf0635d
NC
11384 unsigned long * lengths;
11385 unsigned long * counts;
66543521
AM
11386 unsigned long hn;
11387 bfd_vma si;
11388 unsigned long maxlength = 0;
11389 unsigned long nzero_counts = 0;
11390 unsigned long nsyms = 0;
94d15024 11391 unsigned long chained;
252b5132 11392
66543521
AM
11393 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
11394 (unsigned long) nbuckets);
252b5132 11395
3f5e193b 11396 lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
252b5132
RH
11397 if (lengths == NULL)
11398 {
8b73c356 11399 error (_("Out of memory allocating space for histogram buckets\n"));
252b5132
RH
11400 return 0;
11401 }
8b73c356
NC
11402
11403 printf (_(" Length Number %% of total Coverage\n"));
252b5132
RH
11404 for (hn = 0; hn < nbuckets; ++hn)
11405 {
94d15024
MF
11406 for (si = buckets[hn], chained = 0;
11407 si > 0 && si < nchains && si < nbuckets && chained <= nchains;
11408 si = chains[si], ++chained)
252b5132 11409 {
b34976b6 11410 ++nsyms;
252b5132 11411 if (maxlength < ++lengths[hn])
b34976b6 11412 ++maxlength;
252b5132 11413 }
94d15024
MF
11414
11415 /* PR binutils/17531: A corrupt binary could contain broken
11416 histogram data. Do not go into an infinite loop trying
11417 to process it. */
11418 if (chained > nchains)
11419 {
11420 error (_("histogram chain is corrupt\n"));
11421 break;
11422 }
252b5132
RH
11423 }
11424
3f5e193b 11425 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
252b5132
RH
11426 if (counts == NULL)
11427 {
b2e951ec 11428 free (lengths);
8b73c356 11429 error (_("Out of memory allocating space for histogram counts\n"));
252b5132
RH
11430 return 0;
11431 }
11432
11433 for (hn = 0; hn < nbuckets; ++hn)
b34976b6 11434 ++counts[lengths[hn]];
252b5132 11435
103f02d3 11436 if (nbuckets > 0)
252b5132 11437 {
66543521
AM
11438 unsigned long i;
11439 printf (" 0 %-10lu (%5.1f%%)\n",
103f02d3 11440 counts[0], (counts[0] * 100.0) / nbuckets);
66543521 11441 for (i = 1; i <= maxlength; ++i)
103f02d3 11442 {
66543521
AM
11443 nzero_counts += counts[i] * i;
11444 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11445 i, counts[i], (counts[i] * 100.0) / nbuckets,
103f02d3
UD
11446 (nzero_counts * 100.0) / nsyms);
11447 }
252b5132
RH
11448 }
11449
11450 free (counts);
11451 free (lengths);
11452 }
11453
11454 if (buckets != NULL)
11455 {
11456 free (buckets);
11457 free (chains);
11458 }
11459
d3a44ec6 11460 if (do_histogram && gnubuckets != NULL)
fdc90cb4 11461 {
2cf0635d
NC
11462 unsigned long * lengths;
11463 unsigned long * counts;
fdc90cb4
JJ
11464 unsigned long hn;
11465 unsigned long maxlength = 0;
11466 unsigned long nzero_counts = 0;
11467 unsigned long nsyms = 0;
fdc90cb4 11468
8b73c356
NC
11469 printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
11470 (unsigned long) ngnubuckets);
11471
3f5e193b 11472 lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
fdc90cb4
JJ
11473 if (lengths == NULL)
11474 {
8b73c356 11475 error (_("Out of memory allocating space for gnu histogram buckets\n"));
fdc90cb4
JJ
11476 return 0;
11477 }
11478
fdc90cb4
JJ
11479 printf (_(" Length Number %% of total Coverage\n"));
11480
11481 for (hn = 0; hn < ngnubuckets; ++hn)
11482 if (gnubuckets[hn] != 0)
11483 {
11484 bfd_vma off, length = 1;
11485
6bd1a22c 11486 for (off = gnubuckets[hn] - gnusymidx;
071436c6
NC
11487 /* PR 17531 file: 010-77222-0.004. */
11488 off < ngnuchains && (gnuchains[off] & 1) == 0;
11489 ++off)
fdc90cb4
JJ
11490 ++length;
11491 lengths[hn] = length;
11492 if (length > maxlength)
11493 maxlength = length;
11494 nsyms += length;
11495 }
11496
3f5e193b 11497 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
fdc90cb4
JJ
11498 if (counts == NULL)
11499 {
b2e951ec 11500 free (lengths);
8b73c356 11501 error (_("Out of memory allocating space for gnu histogram counts\n"));
fdc90cb4
JJ
11502 return 0;
11503 }
11504
11505 for (hn = 0; hn < ngnubuckets; ++hn)
11506 ++counts[lengths[hn]];
11507
11508 if (ngnubuckets > 0)
11509 {
11510 unsigned long j;
11511 printf (" 0 %-10lu (%5.1f%%)\n",
11512 counts[0], (counts[0] * 100.0) / ngnubuckets);
11513 for (j = 1; j <= maxlength; ++j)
11514 {
11515 nzero_counts += counts[j] * j;
11516 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11517 j, counts[j], (counts[j] * 100.0) / ngnubuckets,
11518 (nzero_counts * 100.0) / nsyms);
11519 }
11520 }
11521
11522 free (counts);
11523 free (lengths);
11524 free (gnubuckets);
11525 free (gnuchains);
11526 }
11527
252b5132
RH
11528 return 1;
11529}
11530
11531static int
2cf0635d 11532process_syminfo (FILE * file ATTRIBUTE_UNUSED)
252b5132 11533{
b4c96d0d 11534 unsigned int i;
252b5132
RH
11535
11536 if (dynamic_syminfo == NULL
11537 || !do_dynamic)
11538 /* No syminfo, this is ok. */
11539 return 1;
11540
11541 /* There better should be a dynamic symbol section. */
11542 if (dynamic_symbols == NULL || dynamic_strings == NULL)
11543 return 0;
11544
11545 if (dynamic_addr)
11546 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
11547 dynamic_syminfo_offset, dynamic_syminfo_nent);
11548
11549 printf (_(" Num: Name BoundTo Flags\n"));
11550 for (i = 0; i < dynamic_syminfo_nent; ++i)
11551 {
11552 unsigned short int flags = dynamic_syminfo[i].si_flags;
11553
31104126 11554 printf ("%4d: ", i);
4082ef84
NC
11555 if (i >= num_dynamic_syms)
11556 printf (_("<corrupt index>"));
11557 else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
d79b3d50
NC
11558 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
11559 else
2b692964 11560 printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
31104126 11561 putchar (' ');
252b5132
RH
11562
11563 switch (dynamic_syminfo[i].si_boundto)
11564 {
11565 case SYMINFO_BT_SELF:
11566 fputs ("SELF ", stdout);
11567 break;
11568 case SYMINFO_BT_PARENT:
11569 fputs ("PARENT ", stdout);
11570 break;
11571 default:
11572 if (dynamic_syminfo[i].si_boundto > 0
d79b3d50
NC
11573 && dynamic_syminfo[i].si_boundto < dynamic_nent
11574 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
31104126 11575 {
d79b3d50 11576 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
31104126
NC
11577 putchar (' ' );
11578 }
252b5132
RH
11579 else
11580 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
11581 break;
11582 }
11583
11584 if (flags & SYMINFO_FLG_DIRECT)
11585 printf (" DIRECT");
11586 if (flags & SYMINFO_FLG_PASSTHRU)
11587 printf (" PASSTHRU");
11588 if (flags & SYMINFO_FLG_COPY)
11589 printf (" COPY");
11590 if (flags & SYMINFO_FLG_LAZYLOAD)
11591 printf (" LAZYLOAD");
11592
11593 puts ("");
11594 }
11595
11596 return 1;
11597}
11598
cf13d699
NC
11599/* Check to see if the given reloc needs to be handled in a target specific
11600 manner. If so then process the reloc and return TRUE otherwise return
f84ce13b
NC
11601 FALSE.
11602
11603 If called with reloc == NULL, then this is a signal that reloc processing
11604 for the current section has finished, and any saved state should be
11605 discarded. */
09c11c86 11606
cf13d699
NC
11607static bfd_boolean
11608target_specific_reloc_handling (Elf_Internal_Rela * reloc,
11609 unsigned char * start,
03f7786e 11610 unsigned char * end,
f84ce13b
NC
11611 Elf_Internal_Sym * symtab,
11612 unsigned long num_syms)
252b5132 11613{
f84ce13b
NC
11614 unsigned int reloc_type = 0;
11615 unsigned long sym_index = 0;
11616
11617 if (reloc)
11618 {
11619 reloc_type = get_reloc_type (reloc->r_info);
11620 sym_index = get_reloc_symindex (reloc->r_info);
11621 }
252b5132 11622
cf13d699 11623 switch (elf_header.e_machine)
252b5132 11624 {
13761a11
NC
11625 case EM_MSP430:
11626 case EM_MSP430_OLD:
11627 {
11628 static Elf_Internal_Sym * saved_sym = NULL;
11629
f84ce13b
NC
11630 if (reloc == NULL)
11631 {
11632 saved_sym = NULL;
11633 return TRUE;
11634 }
11635
13761a11
NC
11636 switch (reloc_type)
11637 {
11638 case 10: /* R_MSP430_SYM_DIFF */
11639 if (uses_msp430x_relocs ())
11640 break;
1a0670f3 11641 /* Fall through. */
13761a11 11642 case 21: /* R_MSP430X_SYM_DIFF */
f84ce13b
NC
11643 /* PR 21139. */
11644 if (sym_index >= num_syms)
11645 error (_("MSP430 SYM_DIFF reloc contains invalid symbol index %lu\n"),
11646 sym_index);
11647 else
11648 saved_sym = symtab + sym_index;
13761a11
NC
11649 return TRUE;
11650
11651 case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
11652 case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
11653 goto handle_sym_diff;
0b4362b0 11654
13761a11
NC
11655 case 5: /* R_MSP430_16_BYTE */
11656 case 9: /* R_MSP430_8 */
11657 if (uses_msp430x_relocs ())
11658 break;
11659 goto handle_sym_diff;
11660
11661 case 2: /* R_MSP430_ABS16 */
11662 case 15: /* R_MSP430X_ABS16 */
11663 if (! uses_msp430x_relocs ())
11664 break;
11665 goto handle_sym_diff;
0b4362b0 11666
13761a11
NC
11667 handle_sym_diff:
11668 if (saved_sym != NULL)
11669 {
03f7786e 11670 int reloc_size = reloc_type == 1 ? 4 : 2;
13761a11
NC
11671 bfd_vma value;
11672
f84ce13b
NC
11673 if (sym_index >= num_syms)
11674 error (_("MSP430 reloc contains invalid symbol index %lu\n"),
11675 sym_index);
03f7786e 11676 else
f84ce13b
NC
11677 {
11678 value = reloc->r_addend + (symtab[sym_index].st_value
11679 - saved_sym->st_value);
11680
11681 if (start + reloc->r_offset + reloc_size >= end)
11682 /* PR 21137 */
11683 error (_("MSP430 sym diff reloc writes past end of section (%p vs %p)\n"),
11684 start + reloc->r_offset + reloc_size, end);
11685 else
11686 byte_put (start + reloc->r_offset, value, reloc_size);
11687 }
13761a11
NC
11688
11689 saved_sym = NULL;
11690 return TRUE;
11691 }
11692 break;
11693
11694 default:
11695 if (saved_sym != NULL)
071436c6 11696 error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
13761a11
NC
11697 break;
11698 }
11699 break;
11700 }
11701
cf13d699
NC
11702 case EM_MN10300:
11703 case EM_CYGNUS_MN10300:
11704 {
11705 static Elf_Internal_Sym * saved_sym = NULL;
252b5132 11706
f84ce13b
NC
11707 if (reloc == NULL)
11708 {
11709 saved_sym = NULL;
11710 return TRUE;
11711 }
11712
cf13d699
NC
11713 switch (reloc_type)
11714 {
11715 case 34: /* R_MN10300_ALIGN */
11716 return TRUE;
11717 case 33: /* R_MN10300_SYM_DIFF */
f84ce13b
NC
11718 if (sym_index >= num_syms)
11719 error (_("MN10300_SYM_DIFF reloc contains invalid symbol index %lu\n"),
11720 sym_index);
11721 else
11722 saved_sym = symtab + sym_index;
cf13d699 11723 return TRUE;
f84ce13b 11724
cf13d699
NC
11725 case 1: /* R_MN10300_32 */
11726 case 2: /* R_MN10300_16 */
11727 if (saved_sym != NULL)
11728 {
03f7786e 11729 int reloc_size = reloc_type == 1 ? 4 : 2;
cf13d699 11730 bfd_vma value;
252b5132 11731
f84ce13b
NC
11732 if (sym_index >= num_syms)
11733 error (_("MN10300 reloc contains invalid symbol index %lu\n"),
11734 sym_index);
03f7786e 11735 else
f84ce13b
NC
11736 {
11737 value = reloc->r_addend + (symtab[sym_index].st_value
11738 - saved_sym->st_value);
11739
11740 if (start + reloc->r_offset + reloc_size >= end)
11741 error (_("MN10300 sym diff reloc writes past end of section (%p vs %p)\n"),
11742 start + reloc->r_offset + reloc_size, end);
11743 else
11744 byte_put (start + reloc->r_offset, value, reloc_size);
11745 }
252b5132 11746
cf13d699
NC
11747 saved_sym = NULL;
11748 return TRUE;
11749 }
11750 break;
11751 default:
11752 if (saved_sym != NULL)
071436c6 11753 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
cf13d699
NC
11754 break;
11755 }
11756 break;
11757 }
6ff71e76
NC
11758
11759 case EM_RL78:
11760 {
11761 static bfd_vma saved_sym1 = 0;
11762 static bfd_vma saved_sym2 = 0;
11763 static bfd_vma value;
11764
f84ce13b
NC
11765 if (reloc == NULL)
11766 {
11767 saved_sym1 = saved_sym2 = 0;
11768 return TRUE;
11769 }
11770
6ff71e76
NC
11771 switch (reloc_type)
11772 {
11773 case 0x80: /* R_RL78_SYM. */
11774 saved_sym1 = saved_sym2;
f84ce13b
NC
11775 if (sym_index >= num_syms)
11776 error (_("RL78_SYM reloc contains invalid symbol index %lu\n"),
11777 sym_index);
11778 else
11779 {
11780 saved_sym2 = symtab[sym_index].st_value;
11781 saved_sym2 += reloc->r_addend;
11782 }
6ff71e76
NC
11783 return TRUE;
11784
11785 case 0x83: /* R_RL78_OPsub. */
11786 value = saved_sym1 - saved_sym2;
11787 saved_sym2 = saved_sym1 = 0;
11788 return TRUE;
11789 break;
11790
11791 case 0x41: /* R_RL78_ABS32. */
03f7786e
NC
11792 if (start + reloc->r_offset + 4 >= end)
11793 error (_("RL78 sym diff reloc writes past end of section (%p vs %p)\n"),
11794 start + reloc->r_offset + 2, end);
11795 else
11796 byte_put (start + reloc->r_offset, value, 4);
6ff71e76
NC
11797 value = 0;
11798 return TRUE;
11799
11800 case 0x43: /* R_RL78_ABS16. */
03f7786e
NC
11801 if (start + reloc->r_offset + 2 >= end)
11802 error (_("RL78 sym diff reloc writes past end of section (%p vs %p)\n"),
11803 start + reloc->r_offset + 2, end);
11804 else
11805 byte_put (start + reloc->r_offset, value, 2);
6ff71e76
NC
11806 value = 0;
11807 return TRUE;
11808
11809 default:
11810 break;
11811 }
11812 break;
11813 }
252b5132
RH
11814 }
11815
cf13d699 11816 return FALSE;
252b5132
RH
11817}
11818
aca88567
NC
11819/* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
11820 DWARF debug sections. This is a target specific test. Note - we do not
11821 go through the whole including-target-headers-multiple-times route, (as
11822 we have already done with <elf/h8.h>) because this would become very
11823 messy and even then this function would have to contain target specific
11824 information (the names of the relocs instead of their numeric values).
11825 FIXME: This is not the correct way to solve this problem. The proper way
11826 is to have target specific reloc sizing and typing functions created by
11827 the reloc-macros.h header, in the same way that it already creates the
11828 reloc naming functions. */
11829
11830static bfd_boolean
11831is_32bit_abs_reloc (unsigned int reloc_type)
11832{
d347c9df 11833 /* Please keep this table alpha-sorted for ease of visual lookup. */
aca88567
NC
11834 switch (elf_header.e_machine)
11835 {
41e92641 11836 case EM_386:
22abe556 11837 case EM_IAMCU:
41e92641 11838 return reloc_type == 1; /* R_386_32. */
aca88567
NC
11839 case EM_68K:
11840 return reloc_type == 1; /* R_68K_32. */
11841 case EM_860:
11842 return reloc_type == 1; /* R_860_32. */
137b6b5f
AM
11843 case EM_960:
11844 return reloc_type == 2; /* R_960_32. */
a06ea964 11845 case EM_AARCH64:
9282b95a
JW
11846 return (reloc_type == 258
11847 || reloc_type == 1); /* R_AARCH64_ABS32 || R_AARCH64_P32_ABS32 */
d347c9df
PS
11848 case EM_ADAPTEVA_EPIPHANY:
11849 return reloc_type == 3;
aca88567 11850 case EM_ALPHA:
137b6b5f 11851 return reloc_type == 1; /* R_ALPHA_REFLONG. */
41e92641
NC
11852 case EM_ARC:
11853 return reloc_type == 1; /* R_ARC_32. */
886a2506
NC
11854 case EM_ARC_COMPACT:
11855 case EM_ARC_COMPACT2:
11856 return reloc_type == 4; /* R_ARC_32. */
41e92641
NC
11857 case EM_ARM:
11858 return reloc_type == 2; /* R_ARM_ABS32 */
cb8f3167 11859 case EM_AVR_OLD:
aca88567
NC
11860 case EM_AVR:
11861 return reloc_type == 1;
11862 case EM_BLACKFIN:
11863 return reloc_type == 0x12; /* R_byte4_data. */
11864 case EM_CRIS:
11865 return reloc_type == 3; /* R_CRIS_32. */
11866 case EM_CR16:
11867 return reloc_type == 3; /* R_CR16_NUM32. */
11868 case EM_CRX:
11869 return reloc_type == 15; /* R_CRX_NUM32. */
11870 case EM_CYGNUS_FRV:
11871 return reloc_type == 1;
41e92641
NC
11872 case EM_CYGNUS_D10V:
11873 case EM_D10V:
11874 return reloc_type == 6; /* R_D10V_32. */
aca88567
NC
11875 case EM_CYGNUS_D30V:
11876 case EM_D30V:
11877 return reloc_type == 12; /* R_D30V_32_NORMAL. */
41e92641
NC
11878 case EM_DLX:
11879 return reloc_type == 3; /* R_DLX_RELOC_32. */
aca88567
NC
11880 case EM_CYGNUS_FR30:
11881 case EM_FR30:
11882 return reloc_type == 3; /* R_FR30_32. */
3f8107ab
AM
11883 case EM_FT32:
11884 return reloc_type == 1; /* R_FT32_32. */
aca88567
NC
11885 case EM_H8S:
11886 case EM_H8_300:
11887 case EM_H8_300H:
11888 return reloc_type == 1; /* R_H8_DIR32. */
3730236a 11889 case EM_IA_64:
d1c4b12b
NC
11890 return reloc_type == 0x65 /* R_IA64_SECREL32LSB. */
11891 || reloc_type == 0x25; /* R_IA64_DIR32LSB. */
aca88567
NC
11892 case EM_IP2K_OLD:
11893 case EM_IP2K:
11894 return reloc_type == 2; /* R_IP2K_32. */
11895 case EM_IQ2000:
11896 return reloc_type == 2; /* R_IQ2000_32. */
84e94c90
NC
11897 case EM_LATTICEMICO32:
11898 return reloc_type == 3; /* R_LM32_32. */
ff7eeb89 11899 case EM_M32C_OLD:
aca88567
NC
11900 case EM_M32C:
11901 return reloc_type == 3; /* R_M32C_32. */
11902 case EM_M32R:
11903 return reloc_type == 34; /* R_M32R_32_RELA. */
adec12c1
AM
11904 case EM_68HC11:
11905 case EM_68HC12:
11906 return reloc_type == 6; /* R_M68HC11_32. */
aca88567
NC
11907 case EM_MCORE:
11908 return reloc_type == 1; /* R_MCORE_ADDR32. */
11909 case EM_CYGNUS_MEP:
11910 return reloc_type == 4; /* R_MEP_32. */
a3c62988
NC
11911 case EM_METAG:
11912 return reloc_type == 2; /* R_METAG_ADDR32. */
137b6b5f
AM
11913 case EM_MICROBLAZE:
11914 return reloc_type == 1; /* R_MICROBLAZE_32. */
aca88567
NC
11915 case EM_MIPS:
11916 return reloc_type == 2; /* R_MIPS_32. */
11917 case EM_MMIX:
11918 return reloc_type == 4; /* R_MMIX_32. */
11919 case EM_CYGNUS_MN10200:
11920 case EM_MN10200:
11921 return reloc_type == 1; /* R_MN10200_32. */
11922 case EM_CYGNUS_MN10300:
11923 case EM_MN10300:
11924 return reloc_type == 1; /* R_MN10300_32. */
5506d11a
AM
11925 case EM_MOXIE:
11926 return reloc_type == 1; /* R_MOXIE_32. */
aca88567
NC
11927 case EM_MSP430_OLD:
11928 case EM_MSP430:
13761a11 11929 return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32. */
aca88567
NC
11930 case EM_MT:
11931 return reloc_type == 2; /* R_MT_32. */
35c08157
KLC
11932 case EM_NDS32:
11933 return reloc_type == 20; /* R_NDS32_RELA. */
3e0873ac 11934 case EM_ALTERA_NIOS2:
36591ba1 11935 return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32. */
3e0873ac
NC
11936 case EM_NIOS32:
11937 return reloc_type == 1; /* R_NIOS_32. */
73589c9d
CS
11938 case EM_OR1K:
11939 return reloc_type == 1; /* R_OR1K_32. */
aca88567 11940 case EM_PARISC:
5fda8eca
NC
11941 return (reloc_type == 1 /* R_PARISC_DIR32. */
11942 || reloc_type == 41); /* R_PARISC_SECREL32. */
aca88567
NC
11943 case EM_PJ:
11944 case EM_PJ_OLD:
11945 return reloc_type == 1; /* R_PJ_DATA_DIR32. */
11946 case EM_PPC64:
11947 return reloc_type == 1; /* R_PPC64_ADDR32. */
11948 case EM_PPC:
11949 return reloc_type == 1; /* R_PPC_ADDR32. */
2b100bb5
DD
11950 case EM_TI_PRU:
11951 return reloc_type == 11; /* R_PRU_BFD_RELOC_32. */
e23eba97
NC
11952 case EM_RISCV:
11953 return reloc_type == 1; /* R_RISCV_32. */
99c513f6
DD
11954 case EM_RL78:
11955 return reloc_type == 1; /* R_RL78_DIR32. */
c7927a3c
NC
11956 case EM_RX:
11957 return reloc_type == 1; /* R_RX_DIR32. */
aca88567
NC
11958 case EM_S370:
11959 return reloc_type == 1; /* R_I370_ADDR31. */
11960 case EM_S390_OLD:
11961 case EM_S390:
11962 return reloc_type == 4; /* R_S390_32. */
41e92641
NC
11963 case EM_SCORE:
11964 return reloc_type == 8; /* R_SCORE_ABS32. */
aca88567
NC
11965 case EM_SH:
11966 return reloc_type == 1; /* R_SH_DIR32. */
11967 case EM_SPARC32PLUS:
11968 case EM_SPARCV9:
11969 case EM_SPARC:
11970 return reloc_type == 3 /* R_SPARC_32. */
11971 || reloc_type == 23; /* R_SPARC_UA32. */
a7dd7d05
AM
11972 case EM_SPU:
11973 return reloc_type == 6; /* R_SPU_ADDR32 */
40b36596
JM
11974 case EM_TI_C6000:
11975 return reloc_type == 1; /* R_C6000_ABS32. */
aa137e4d
NC
11976 case EM_TILEGX:
11977 return reloc_type == 2; /* R_TILEGX_32. */
11978 case EM_TILEPRO:
11979 return reloc_type == 1; /* R_TILEPRO_32. */
aca88567
NC
11980 case EM_CYGNUS_V850:
11981 case EM_V850:
11982 return reloc_type == 6; /* R_V850_ABS32. */
708e2187
NC
11983 case EM_V800:
11984 return reloc_type == 0x33; /* R_V810_WORD. */
aca88567
NC
11985 case EM_VAX:
11986 return reloc_type == 1; /* R_VAX_32. */
619ed720
EB
11987 case EM_VISIUM:
11988 return reloc_type == 3; /* R_VISIUM_32. */
aca88567 11989 case EM_X86_64:
8a9036a4 11990 case EM_L1OM:
7a9068fe 11991 case EM_K1OM:
aca88567 11992 return reloc_type == 10; /* R_X86_64_32. */
c29aca4a
NC
11993 case EM_XC16X:
11994 case EM_C166:
11995 return reloc_type == 3; /* R_XC16C_ABS_32. */
f6c1a2d5
NC
11996 case EM_XGATE:
11997 return reloc_type == 4; /* R_XGATE_32. */
aca88567
NC
11998 case EM_XSTORMY16:
11999 return reloc_type == 1; /* R_XSTROMY16_32. */
12000 case EM_XTENSA_OLD:
12001 case EM_XTENSA:
12002 return reloc_type == 1; /* R_XTENSA_32. */
aca88567 12003 default:
bee0ee85
NC
12004 {
12005 static unsigned int prev_warn = 0;
12006
12007 /* Avoid repeating the same warning multiple times. */
12008 if (prev_warn != elf_header.e_machine)
12009 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
12010 elf_header.e_machine);
12011 prev_warn = elf_header.e_machine;
12012 return FALSE;
12013 }
aca88567
NC
12014 }
12015}
12016
12017/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12018 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
12019
12020static bfd_boolean
12021is_32bit_pcrel_reloc (unsigned int reloc_type)
12022{
12023 switch (elf_header.e_machine)
d347c9df 12024 /* Please keep this table alpha-sorted for ease of visual lookup. */
aca88567 12025 {
41e92641 12026 case EM_386:
22abe556 12027 case EM_IAMCU:
3e0873ac 12028 return reloc_type == 2; /* R_386_PC32. */
aca88567 12029 case EM_68K:
3e0873ac 12030 return reloc_type == 4; /* R_68K_PC32. */
a06ea964
NC
12031 case EM_AARCH64:
12032 return reloc_type == 261; /* R_AARCH64_PREL32 */
cfb8c092
NC
12033 case EM_ADAPTEVA_EPIPHANY:
12034 return reloc_type == 6;
aca88567
NC
12035 case EM_ALPHA:
12036 return reloc_type == 10; /* R_ALPHA_SREL32. */
726c18e1
CZ
12037 case EM_ARC_COMPACT:
12038 case EM_ARC_COMPACT2:
12039 return reloc_type == 49; /* R_ARC_32_PCREL. */
41e92641 12040 case EM_ARM:
3e0873ac 12041 return reloc_type == 3; /* R_ARM_REL32 */
d347c9df
PS
12042 case EM_AVR_OLD:
12043 case EM_AVR:
12044 return reloc_type == 36; /* R_AVR_32_PCREL. */
137b6b5f
AM
12045 case EM_MICROBLAZE:
12046 return reloc_type == 2; /* R_MICROBLAZE_32_PCREL. */
73589c9d
CS
12047 case EM_OR1K:
12048 return reloc_type == 9; /* R_OR1K_32_PCREL. */
aca88567 12049 case EM_PARISC:
85acf597 12050 return reloc_type == 9; /* R_PARISC_PCREL32. */
aca88567
NC
12051 case EM_PPC:
12052 return reloc_type == 26; /* R_PPC_REL32. */
12053 case EM_PPC64:
3e0873ac 12054 return reloc_type == 26; /* R_PPC64_REL32. */
aca88567
NC
12055 case EM_S390_OLD:
12056 case EM_S390:
3e0873ac 12057 return reloc_type == 5; /* R_390_PC32. */
aca88567 12058 case EM_SH:
3e0873ac 12059 return reloc_type == 2; /* R_SH_REL32. */
aca88567
NC
12060 case EM_SPARC32PLUS:
12061 case EM_SPARCV9:
12062 case EM_SPARC:
3e0873ac 12063 return reloc_type == 6; /* R_SPARC_DISP32. */
a7dd7d05
AM
12064 case EM_SPU:
12065 return reloc_type == 13; /* R_SPU_REL32. */
aa137e4d
NC
12066 case EM_TILEGX:
12067 return reloc_type == 6; /* R_TILEGX_32_PCREL. */
12068 case EM_TILEPRO:
12069 return reloc_type == 4; /* R_TILEPRO_32_PCREL. */
619ed720
EB
12070 case EM_VISIUM:
12071 return reloc_type == 6; /* R_VISIUM_32_PCREL */
aca88567 12072 case EM_X86_64:
8a9036a4 12073 case EM_L1OM:
7a9068fe 12074 case EM_K1OM:
3e0873ac 12075 return reloc_type == 2; /* R_X86_64_PC32. */
2fcb9706
BW
12076 case EM_XTENSA_OLD:
12077 case EM_XTENSA:
12078 return reloc_type == 14; /* R_XTENSA_32_PCREL. */
aca88567
NC
12079 default:
12080 /* Do not abort or issue an error message here. Not all targets use
12081 pc-relative 32-bit relocs in their DWARF debug information and we
12082 have already tested for target coverage in is_32bit_abs_reloc. A
cf13d699
NC
12083 more helpful warning message will be generated by apply_relocations
12084 anyway, so just return. */
aca88567
NC
12085 return FALSE;
12086 }
12087}
12088
12089/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12090 a 64-bit absolute RELA relocation used in DWARF debug sections. */
12091
12092static bfd_boolean
12093is_64bit_abs_reloc (unsigned int reloc_type)
12094{
12095 switch (elf_header.e_machine)
12096 {
a06ea964
NC
12097 case EM_AARCH64:
12098 return reloc_type == 257; /* R_AARCH64_ABS64. */
aca88567
NC
12099 case EM_ALPHA:
12100 return reloc_type == 2; /* R_ALPHA_REFQUAD. */
3730236a
NC
12101 case EM_IA_64:
12102 return reloc_type == 0x27; /* R_IA64_DIR64LSB. */
3e0873ac
NC
12103 case EM_PARISC:
12104 return reloc_type == 80; /* R_PARISC_DIR64. */
aca88567
NC
12105 case EM_PPC64:
12106 return reloc_type == 38; /* R_PPC64_ADDR64. */
e23eba97
NC
12107 case EM_RISCV:
12108 return reloc_type == 2; /* R_RISCV_64. */
aca88567
NC
12109 case EM_SPARC32PLUS:
12110 case EM_SPARCV9:
12111 case EM_SPARC:
12112 return reloc_type == 54; /* R_SPARC_UA64. */
12113 case EM_X86_64:
8a9036a4 12114 case EM_L1OM:
7a9068fe 12115 case EM_K1OM:
aca88567 12116 return reloc_type == 1; /* R_X86_64_64. */
e819ade1
AS
12117 case EM_S390_OLD:
12118 case EM_S390:
aa137e4d
NC
12119 return reloc_type == 22; /* R_S390_64. */
12120 case EM_TILEGX:
12121 return reloc_type == 1; /* R_TILEGX_64. */
85a82265 12122 case EM_MIPS:
aa137e4d 12123 return reloc_type == 18; /* R_MIPS_64. */
aca88567
NC
12124 default:
12125 return FALSE;
12126 }
12127}
12128
85acf597
RH
12129/* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
12130 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
12131
12132static bfd_boolean
12133is_64bit_pcrel_reloc (unsigned int reloc_type)
12134{
12135 switch (elf_header.e_machine)
12136 {
a06ea964
NC
12137 case EM_AARCH64:
12138 return reloc_type == 260; /* R_AARCH64_PREL64. */
85acf597 12139 case EM_ALPHA:
aa137e4d 12140 return reloc_type == 11; /* R_ALPHA_SREL64. */
85acf597 12141 case EM_IA_64:
aa137e4d 12142 return reloc_type == 0x4f; /* R_IA64_PCREL64LSB. */
85acf597 12143 case EM_PARISC:
aa137e4d 12144 return reloc_type == 72; /* R_PARISC_PCREL64. */
85acf597 12145 case EM_PPC64:
aa137e4d 12146 return reloc_type == 44; /* R_PPC64_REL64. */
85acf597
RH
12147 case EM_SPARC32PLUS:
12148 case EM_SPARCV9:
12149 case EM_SPARC:
aa137e4d 12150 return reloc_type == 46; /* R_SPARC_DISP64. */
85acf597 12151 case EM_X86_64:
8a9036a4 12152 case EM_L1OM:
7a9068fe 12153 case EM_K1OM:
aa137e4d 12154 return reloc_type == 24; /* R_X86_64_PC64. */
85acf597
RH
12155 case EM_S390_OLD:
12156 case EM_S390:
aa137e4d
NC
12157 return reloc_type == 23; /* R_S390_PC64. */
12158 case EM_TILEGX:
12159 return reloc_type == 5; /* R_TILEGX_64_PCREL. */
85acf597
RH
12160 default:
12161 return FALSE;
12162 }
12163}
12164
4dc3c23d
AM
12165/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12166 a 24-bit absolute RELA relocation used in DWARF debug sections. */
12167
12168static bfd_boolean
12169is_24bit_abs_reloc (unsigned int reloc_type)
12170{
12171 switch (elf_header.e_machine)
12172 {
12173 case EM_CYGNUS_MN10200:
12174 case EM_MN10200:
12175 return reloc_type == 4; /* R_MN10200_24. */
3ee6e4fb
NC
12176 case EM_FT32:
12177 return reloc_type == 5; /* R_FT32_20. */
4dc3c23d
AM
12178 default:
12179 return FALSE;
12180 }
12181}
12182
aca88567
NC
12183/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12184 a 16-bit absolute RELA relocation used in DWARF debug sections. */
12185
12186static bfd_boolean
12187is_16bit_abs_reloc (unsigned int reloc_type)
4b78141a 12188{
d347c9df 12189 /* Please keep this table alpha-sorted for ease of visual lookup. */
4b78141a
NC
12190 switch (elf_header.e_machine)
12191 {
886a2506
NC
12192 case EM_ARC:
12193 case EM_ARC_COMPACT:
12194 case EM_ARC_COMPACT2:
12195 return reloc_type == 2; /* R_ARC_16. */
d347c9df
PS
12196 case EM_ADAPTEVA_EPIPHANY:
12197 return reloc_type == 5;
aca88567
NC
12198 case EM_AVR_OLD:
12199 case EM_AVR:
12200 return reloc_type == 4; /* R_AVR_16. */
41e92641
NC
12201 case EM_CYGNUS_D10V:
12202 case EM_D10V:
12203 return reloc_type == 3; /* R_D10V_16. */
4b78141a
NC
12204 case EM_H8S:
12205 case EM_H8_300:
12206 case EM_H8_300H:
aca88567
NC
12207 return reloc_type == R_H8_DIR16;
12208 case EM_IP2K_OLD:
12209 case EM_IP2K:
12210 return reloc_type == 1; /* R_IP2K_16. */
ff7eeb89 12211 case EM_M32C_OLD:
f4236fe4
DD
12212 case EM_M32C:
12213 return reloc_type == 1; /* R_M32C_16 */
d347c9df
PS
12214 case EM_CYGNUS_MN10200:
12215 case EM_MN10200:
12216 return reloc_type == 2; /* R_MN10200_16. */
12217 case EM_CYGNUS_MN10300:
12218 case EM_MN10300:
12219 return reloc_type == 2; /* R_MN10300_16. */
aca88567 12220 case EM_MSP430:
13761a11
NC
12221 if (uses_msp430x_relocs ())
12222 return reloc_type == 2; /* R_MSP430_ABS16. */
1a0670f3 12223 /* Fall through. */
78c8d46c 12224 case EM_MSP430_OLD:
aca88567 12225 return reloc_type == 5; /* R_MSP430_16_BYTE. */
35c08157
KLC
12226 case EM_NDS32:
12227 return reloc_type == 19; /* R_NDS32_RELA. */
3e0873ac 12228 case EM_ALTERA_NIOS2:
36591ba1 12229 return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16. */
3e0873ac
NC
12230 case EM_NIOS32:
12231 return reloc_type == 9; /* R_NIOS_16. */
73589c9d
CS
12232 case EM_OR1K:
12233 return reloc_type == 2; /* R_OR1K_16. */
2b100bb5
DD
12234 case EM_TI_PRU:
12235 return reloc_type == 8; /* R_PRU_BFD_RELOC_16. */
40b36596
JM
12236 case EM_TI_C6000:
12237 return reloc_type == 2; /* R_C6000_ABS16. */
d347c9df
PS
12238 case EM_VISIUM:
12239 return reloc_type == 2; /* R_VISIUM_16. */
c29aca4a
NC
12240 case EM_XC16X:
12241 case EM_C166:
12242 return reloc_type == 2; /* R_XC16C_ABS_16. */
f6c1a2d5
NC
12243 case EM_XGATE:
12244 return reloc_type == 3; /* R_XGATE_16. */
4b78141a 12245 default:
aca88567 12246 return FALSE;
4b78141a
NC
12247 }
12248}
12249
2a7b2e88
JK
12250/* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
12251 relocation entries (possibly formerly used for SHT_GROUP sections). */
12252
12253static bfd_boolean
12254is_none_reloc (unsigned int reloc_type)
12255{
12256 switch (elf_header.e_machine)
12257 {
cb8f3167 12258 case EM_386: /* R_386_NONE. */
d347c9df 12259 case EM_68K: /* R_68K_NONE. */
cfb8c092 12260 case EM_ADAPTEVA_EPIPHANY:
d347c9df
PS
12261 case EM_ALPHA: /* R_ALPHA_NONE. */
12262 case EM_ALTERA_NIOS2: /* R_NIOS2_NONE. */
886a2506 12263 case EM_ARC: /* R_ARC_NONE. */
886a2506 12264 case EM_ARC_COMPACT2: /* R_ARC_NONE. */
d347c9df 12265 case EM_ARC_COMPACT: /* R_ARC_NONE. */
cb8f3167 12266 case EM_ARM: /* R_ARM_NONE. */
d347c9df 12267 case EM_C166: /* R_XC16X_NONE. */
cb8f3167 12268 case EM_CRIS: /* R_CRIS_NONE. */
d347c9df
PS
12269 case EM_FT32: /* R_FT32_NONE. */
12270 case EM_IA_64: /* R_IA64_NONE. */
7a9068fe 12271 case EM_K1OM: /* R_X86_64_NONE. */
d347c9df
PS
12272 case EM_L1OM: /* R_X86_64_NONE. */
12273 case EM_M32R: /* R_M32R_NONE. */
12274 case EM_MIPS: /* R_MIPS_NONE. */
cb8f3167 12275 case EM_MN10300: /* R_MN10300_NONE. */
5506d11a 12276 case EM_MOXIE: /* R_MOXIE_NONE. */
d347c9df
PS
12277 case EM_NIOS32: /* R_NIOS_NONE. */
12278 case EM_OR1K: /* R_OR1K_NONE. */
12279 case EM_PARISC: /* R_PARISC_NONE. */
12280 case EM_PPC64: /* R_PPC64_NONE. */
12281 case EM_PPC: /* R_PPC_NONE. */
e23eba97 12282 case EM_RISCV: /* R_RISCV_NONE. */
d347c9df
PS
12283 case EM_S390: /* R_390_NONE. */
12284 case EM_S390_OLD:
12285 case EM_SH: /* R_SH_NONE. */
12286 case EM_SPARC32PLUS:
12287 case EM_SPARC: /* R_SPARC_NONE. */
12288 case EM_SPARCV9:
aa137e4d
NC
12289 case EM_TILEGX: /* R_TILEGX_NONE. */
12290 case EM_TILEPRO: /* R_TILEPRO_NONE. */
d347c9df
PS
12291 case EM_TI_C6000:/* R_C6000_NONE. */
12292 case EM_X86_64: /* R_X86_64_NONE. */
c29aca4a 12293 case EM_XC16X:
cb8f3167 12294 return reloc_type == 0;
d347c9df 12295
a06ea964
NC
12296 case EM_AARCH64:
12297 return reloc_type == 0 || reloc_type == 256;
d347c9df
PS
12298 case EM_AVR_OLD:
12299 case EM_AVR:
12300 return (reloc_type == 0 /* R_AVR_NONE. */
12301 || reloc_type == 30 /* R_AVR_DIFF8. */
12302 || reloc_type == 31 /* R_AVR_DIFF16. */
12303 || reloc_type == 32 /* R_AVR_DIFF32. */);
12304 case EM_METAG:
12305 return reloc_type == 3; /* R_METAG_NONE. */
35c08157
KLC
12306 case EM_NDS32:
12307 return (reloc_type == 0 /* R_XTENSA_NONE. */
12308 || reloc_type == 204 /* R_NDS32_DIFF8. */
12309 || reloc_type == 205 /* R_NDS32_DIFF16. */
12310 || reloc_type == 206 /* R_NDS32_DIFF32. */
12311 || reloc_type == 207 /* R_NDS32_ULEB128. */);
2b100bb5
DD
12312 case EM_TI_PRU:
12313 return (reloc_type == 0 /* R_PRU_NONE. */
12314 || reloc_type == 65 /* R_PRU_DIFF8. */
12315 || reloc_type == 66 /* R_PRU_DIFF16. */
12316 || reloc_type == 67 /* R_PRU_DIFF32. */);
58332dda
JK
12317 case EM_XTENSA_OLD:
12318 case EM_XTENSA:
4dc3c23d
AM
12319 return (reloc_type == 0 /* R_XTENSA_NONE. */
12320 || reloc_type == 17 /* R_XTENSA_DIFF8. */
12321 || reloc_type == 18 /* R_XTENSA_DIFF16. */
12322 || reloc_type == 19 /* R_XTENSA_DIFF32. */);
2a7b2e88
JK
12323 }
12324 return FALSE;
12325}
12326
d1c4b12b
NC
12327/* Returns TRUE if there is a relocation against
12328 section NAME at OFFSET bytes. */
12329
12330bfd_boolean
12331reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
12332{
12333 Elf_Internal_Rela * relocs;
12334 Elf_Internal_Rela * rp;
12335
12336 if (dsec == NULL || dsec->reloc_info == NULL)
12337 return FALSE;
12338
12339 relocs = (Elf_Internal_Rela *) dsec->reloc_info;
12340
12341 for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
12342 if (rp->r_offset == offset)
12343 return TRUE;
12344
12345 return FALSE;
12346}
12347
cf13d699
NC
12348/* Apply relocations to a section.
12349 Note: So far support has been added only for those relocations
12350 which can be found in debug sections.
d1c4b12b
NC
12351 If RELOCS_RETURN is non-NULL then returns in it a pointer to the
12352 loaded relocs. It is then the caller's responsibility to free them.
cf13d699 12353 FIXME: Add support for more relocations ? */
1b315056 12354
cf13d699 12355static void
d1c4b12b
NC
12356apply_relocations (void * file,
12357 const Elf_Internal_Shdr * section,
12358 unsigned char * start,
12359 bfd_size_type size,
1449284b 12360 void ** relocs_return,
d1c4b12b 12361 unsigned long * num_relocs_return)
1b315056 12362{
cf13d699 12363 Elf_Internal_Shdr * relsec;
0d2a7a93 12364 unsigned char * end = start + size;
cb8f3167 12365
d1c4b12b
NC
12366 if (relocs_return != NULL)
12367 {
12368 * (Elf_Internal_Rela **) relocs_return = NULL;
12369 * num_relocs_return = 0;
12370 }
12371
cf13d699
NC
12372 if (elf_header.e_type != ET_REL)
12373 return;
1b315056 12374
cf13d699 12375 /* Find the reloc section associated with the section. */
5b18a4bc
NC
12376 for (relsec = section_headers;
12377 relsec < section_headers + elf_header.e_shnum;
12378 ++relsec)
252b5132 12379 {
41e92641
NC
12380 bfd_boolean is_rela;
12381 unsigned long num_relocs;
2cf0635d
NC
12382 Elf_Internal_Rela * relocs;
12383 Elf_Internal_Rela * rp;
12384 Elf_Internal_Shdr * symsec;
12385 Elf_Internal_Sym * symtab;
ba5cdace 12386 unsigned long num_syms;
2cf0635d 12387 Elf_Internal_Sym * sym;
252b5132 12388
41e92641 12389 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
4fbb74a6
AM
12390 || relsec->sh_info >= elf_header.e_shnum
12391 || section_headers + relsec->sh_info != section
c256ffe7 12392 || relsec->sh_size == 0
4fbb74a6 12393 || relsec->sh_link >= elf_header.e_shnum)
5b18a4bc 12394 continue;
428409d5 12395
41e92641
NC
12396 is_rela = relsec->sh_type == SHT_RELA;
12397
12398 if (is_rela)
12399 {
3f5e193b
NC
12400 if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
12401 relsec->sh_size, & relocs, & num_relocs))
41e92641
NC
12402 return;
12403 }
12404 else
12405 {
3f5e193b
NC
12406 if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
12407 relsec->sh_size, & relocs, & num_relocs))
41e92641
NC
12408 return;
12409 }
12410
12411 /* SH uses RELA but uses in place value instead of the addend field. */
12412 if (elf_header.e_machine == EM_SH)
12413 is_rela = FALSE;
428409d5 12414
4fbb74a6 12415 symsec = section_headers + relsec->sh_link;
1449284b
NC
12416 if (symsec->sh_type != SHT_SYMTAB
12417 && symsec->sh_type != SHT_DYNSYM)
12418 return;
ba5cdace 12419 symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec, & num_syms);
103f02d3 12420
41e92641 12421 for (rp = relocs; rp < relocs + num_relocs; ++rp)
252b5132 12422 {
41e92641
NC
12423 bfd_vma addend;
12424 unsigned int reloc_type;
12425 unsigned int reloc_size;
91d6fa6a 12426 unsigned char * rloc;
ba5cdace 12427 unsigned long sym_index;
4b78141a 12428
aca88567 12429 reloc_type = get_reloc_type (rp->r_info);
41e92641 12430
f84ce13b 12431 if (target_specific_reloc_handling (rp, start, end, symtab, num_syms))
2a7b2e88 12432 continue;
98fb390a
NC
12433 else if (is_none_reloc (reloc_type))
12434 continue;
12435 else if (is_32bit_abs_reloc (reloc_type)
12436 || is_32bit_pcrel_reloc (reloc_type))
aca88567 12437 reloc_size = 4;
85acf597
RH
12438 else if (is_64bit_abs_reloc (reloc_type)
12439 || is_64bit_pcrel_reloc (reloc_type))
aca88567 12440 reloc_size = 8;
4dc3c23d
AM
12441 else if (is_24bit_abs_reloc (reloc_type))
12442 reloc_size = 3;
aca88567
NC
12443 else if (is_16bit_abs_reloc (reloc_type))
12444 reloc_size = 2;
12445 else
4b78141a 12446 {
bee0ee85
NC
12447 static unsigned int prev_reloc = 0;
12448 if (reloc_type != prev_reloc)
12449 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
12450 reloc_type, printable_section_name (section));
12451 prev_reloc = reloc_type;
4b78141a
NC
12452 continue;
12453 }
103f02d3 12454
91d6fa6a 12455 rloc = start + rp->r_offset;
c8da6823 12456 if ((rloc + reloc_size) > end || (rloc < start))
700dd8b7
L
12457 {
12458 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
12459 (unsigned long) rp->r_offset,
74e1a04b 12460 printable_section_name (section));
700dd8b7
L
12461 continue;
12462 }
103f02d3 12463
ba5cdace
NC
12464 sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
12465 if (sym_index >= num_syms)
12466 {
12467 warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
74e1a04b 12468 sym_index, printable_section_name (section));
ba5cdace
NC
12469 continue;
12470 }
12471 sym = symtab + sym_index;
41e92641
NC
12472
12473 /* If the reloc has a symbol associated with it,
55f25fc3
L
12474 make sure that it is of an appropriate type.
12475
12476 Relocations against symbols without type can happen.
12477 Gcc -feliminate-dwarf2-dups may generate symbols
12478 without type for debug info.
12479
12480 Icc generates relocations against function symbols
12481 instead of local labels.
12482
12483 Relocations against object symbols can happen, eg when
12484 referencing a global array. For an example of this see
12485 the _clz.o binary in libgcc.a. */
aca88567 12486 if (sym != symtab
b8871f35 12487 && ELF_ST_TYPE (sym->st_info) != STT_COMMON
55f25fc3 12488 && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
5b18a4bc 12489 {
41e92641 12490 warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
aca88567 12491 get_symbol_type (ELF_ST_TYPE (sym->st_info)),
99dcb0b9 12492 (long int)(rp - relocs),
74e1a04b 12493 printable_section_name (relsec));
aca88567 12494 continue;
5b18a4bc 12495 }
252b5132 12496
4dc3c23d
AM
12497 addend = 0;
12498 if (is_rela)
12499 addend += rp->r_addend;
c47320c3
AM
12500 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
12501 partial_inplace. */
4dc3c23d
AM
12502 if (!is_rela
12503 || (elf_header.e_machine == EM_XTENSA
12504 && reloc_type == 1)
12505 || ((elf_header.e_machine == EM_PJ
12506 || elf_header.e_machine == EM_PJ_OLD)
c47320c3
AM
12507 && reloc_type == 1)
12508 || ((elf_header.e_machine == EM_D30V
12509 || elf_header.e_machine == EM_CYGNUS_D30V)
12510 && reloc_type == 12))
91d6fa6a 12511 addend += byte_get (rloc, reloc_size);
cb8f3167 12512
85acf597
RH
12513 if (is_32bit_pcrel_reloc (reloc_type)
12514 || is_64bit_pcrel_reloc (reloc_type))
12515 {
12516 /* On HPPA, all pc-relative relocations are biased by 8. */
12517 if (elf_header.e_machine == EM_PARISC)
12518 addend -= 8;
91d6fa6a 12519 byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
85acf597
RH
12520 reloc_size);
12521 }
41e92641 12522 else
91d6fa6a 12523 byte_put (rloc, addend + sym->st_value, reloc_size);
5b18a4bc 12524 }
252b5132 12525
5b18a4bc 12526 free (symtab);
f84ce13b
NC
12527 /* Let the target specific reloc processing code know that
12528 we have finished with these relocs. */
12529 target_specific_reloc_handling (NULL, NULL, NULL, NULL, 0);
d1c4b12b
NC
12530
12531 if (relocs_return)
12532 {
12533 * (Elf_Internal_Rela **) relocs_return = relocs;
12534 * num_relocs_return = num_relocs;
12535 }
12536 else
12537 free (relocs);
12538
5b18a4bc
NC
12539 break;
12540 }
5b18a4bc 12541}
103f02d3 12542
cf13d699
NC
12543#ifdef SUPPORT_DISASSEMBLY
12544static int
12545disassemble_section (Elf_Internal_Shdr * section, FILE * file)
12546{
74e1a04b 12547 printf (_("\nAssembly dump of section %s\n"), printable_section_name (section));
cf13d699 12548
74e1a04b 12549 /* FIXME: XXX -- to be done --- XXX */
cf13d699
NC
12550
12551 return 1;
12552}
12553#endif
12554
12555/* Reads in the contents of SECTION from FILE, returning a pointer
12556 to a malloc'ed buffer or NULL if something went wrong. */
12557
12558static char *
12559get_section_contents (Elf_Internal_Shdr * section, FILE * file)
12560{
12561 bfd_size_type num_bytes;
12562
12563 num_bytes = section->sh_size;
12564
12565 if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
12566 {
12567 printf (_("\nSection '%s' has no data to dump.\n"),
74e1a04b 12568 printable_section_name (section));
cf13d699
NC
12569 return NULL;
12570 }
12571
3f5e193b
NC
12572 return (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
12573 _("section contents"));
cf13d699
NC
12574}
12575
0e602686
NC
12576/* Uncompresses a section that was compressed using zlib, in place. */
12577
12578static bfd_boolean
12579uncompress_section_contents (unsigned char **buffer,
12580 dwarf_size_type uncompressed_size,
12581 dwarf_size_type *size)
12582{
12583 dwarf_size_type compressed_size = *size;
12584 unsigned char * compressed_buffer = *buffer;
12585 unsigned char * uncompressed_buffer;
12586 z_stream strm;
12587 int rc;
12588
12589 /* It is possible the section consists of several compressed
12590 buffers concatenated together, so we uncompress in a loop. */
12591 /* PR 18313: The state field in the z_stream structure is supposed
12592 to be invisible to the user (ie us), but some compilers will
12593 still complain about it being used without initialisation. So
12594 we first zero the entire z_stream structure and then set the fields
12595 that we need. */
12596 memset (& strm, 0, sizeof strm);
12597 strm.avail_in = compressed_size;
12598 strm.next_in = (Bytef *) compressed_buffer;
12599 strm.avail_out = uncompressed_size;
12600 uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
12601
12602 rc = inflateInit (& strm);
12603 while (strm.avail_in > 0)
12604 {
12605 if (rc != Z_OK)
12606 goto fail;
12607 strm.next_out = ((Bytef *) uncompressed_buffer
12608 + (uncompressed_size - strm.avail_out));
12609 rc = inflate (&strm, Z_FINISH);
12610 if (rc != Z_STREAM_END)
12611 goto fail;
12612 rc = inflateReset (& strm);
12613 }
12614 rc = inflateEnd (& strm);
12615 if (rc != Z_OK
12616 || strm.avail_out != 0)
12617 goto fail;
12618
12619 *buffer = uncompressed_buffer;
12620 *size = uncompressed_size;
12621 return TRUE;
12622
12623 fail:
12624 free (uncompressed_buffer);
12625 /* Indicate decompression failure. */
12626 *buffer = NULL;
12627 return FALSE;
12628}
dd24e3da 12629
cf13d699
NC
12630static void
12631dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
12632{
0e602686
NC
12633 Elf_Internal_Shdr * relsec;
12634 bfd_size_type num_bytes;
fd8008d8
L
12635 unsigned char * data;
12636 unsigned char * end;
12637 unsigned char * real_start;
12638 unsigned char * start;
0e602686 12639 bfd_boolean some_strings_shown;
cf13d699 12640
fd8008d8
L
12641 real_start = start = (unsigned char *) get_section_contents (section,
12642 file);
cf13d699
NC
12643 if (start == NULL)
12644 return;
0e602686 12645 num_bytes = section->sh_size;
cf13d699 12646
74e1a04b 12647 printf (_("\nString dump of section '%s':\n"), printable_section_name (section));
cf13d699 12648
0e602686
NC
12649 if (decompress_dumps)
12650 {
12651 dwarf_size_type new_size = num_bytes;
12652 dwarf_size_type uncompressed_size = 0;
12653
12654 if ((section->sh_flags & SHF_COMPRESSED) != 0)
12655 {
12656 Elf_Internal_Chdr chdr;
12657 unsigned int compression_header_size
ebdf1ebf
NC
12658 = get_compression_header (& chdr, (unsigned char *) start,
12659 num_bytes);
0e602686 12660
813dabb9 12661 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
0e602686 12662 {
813dabb9
L
12663 warn (_("section '%s' has unsupported compress type: %d\n"),
12664 printable_section_name (section), chdr.ch_type);
12665 return;
12666 }
12667 else if (chdr.ch_addralign != section->sh_addralign)
12668 {
12669 warn (_("compressed section '%s' is corrupted\n"),
12670 printable_section_name (section));
12671 return;
0e602686 12672 }
813dabb9
L
12673 uncompressed_size = chdr.ch_size;
12674 start += compression_header_size;
12675 new_size -= compression_header_size;
0e602686
NC
12676 }
12677 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12678 {
12679 /* Read the zlib header. In this case, it should be "ZLIB"
12680 followed by the uncompressed section size, 8 bytes in
12681 big-endian order. */
12682 uncompressed_size = start[4]; uncompressed_size <<= 8;
12683 uncompressed_size += start[5]; uncompressed_size <<= 8;
12684 uncompressed_size += start[6]; uncompressed_size <<= 8;
12685 uncompressed_size += start[7]; uncompressed_size <<= 8;
12686 uncompressed_size += start[8]; uncompressed_size <<= 8;
12687 uncompressed_size += start[9]; uncompressed_size <<= 8;
12688 uncompressed_size += start[10]; uncompressed_size <<= 8;
12689 uncompressed_size += start[11];
12690 start += 12;
12691 new_size -= 12;
12692 }
12693
12694 if (uncompressed_size
fd8008d8 12695 && uncompress_section_contents (& start,
0e602686
NC
12696 uncompressed_size, & new_size))
12697 num_bytes = new_size;
12698 }
fd8008d8 12699
cf13d699
NC
12700 /* If the section being dumped has relocations against it the user might
12701 be expecting these relocations to have been applied. Check for this
12702 case and issue a warning message in order to avoid confusion.
12703 FIXME: Maybe we ought to have an option that dumps a section with
12704 relocs applied ? */
12705 for (relsec = section_headers;
12706 relsec < section_headers + elf_header.e_shnum;
12707 ++relsec)
12708 {
12709 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12710 || relsec->sh_info >= elf_header.e_shnum
12711 || section_headers + relsec->sh_info != section
12712 || relsec->sh_size == 0
12713 || relsec->sh_link >= elf_header.e_shnum)
12714 continue;
12715
12716 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12717 break;
12718 }
12719
cf13d699
NC
12720 data = start;
12721 end = start + num_bytes;
12722 some_strings_shown = FALSE;
12723
12724 while (data < end)
12725 {
12726 while (!ISPRINT (* data))
12727 if (++ data >= end)
12728 break;
12729
12730 if (data < end)
12731 {
071436c6
NC
12732 size_t maxlen = end - data;
12733
cf13d699 12734#ifndef __MSVCRT__
c975cc98
NC
12735 /* PR 11128: Use two separate invocations in order to work
12736 around bugs in the Solaris 8 implementation of printf. */
12737 printf (" [%6tx] ", data - start);
cf13d699 12738#else
071436c6 12739 printf (" [%6Ix] ", (size_t) (data - start));
cf13d699 12740#endif
4082ef84
NC
12741 if (maxlen > 0)
12742 {
fd8008d8 12743 print_symbol ((int) maxlen, (const char *) data);
4082ef84 12744 putchar ('\n');
fd8008d8 12745 data += strnlen ((const char *) data, maxlen);
4082ef84
NC
12746 }
12747 else
12748 {
12749 printf (_("<corrupt>\n"));
12750 data = end;
12751 }
cf13d699
NC
12752 some_strings_shown = TRUE;
12753 }
12754 }
12755
12756 if (! some_strings_shown)
12757 printf (_(" No strings found in this section."));
12758
0e602686 12759 free (real_start);
cf13d699
NC
12760
12761 putchar ('\n');
12762}
12763
12764static void
12765dump_section_as_bytes (Elf_Internal_Shdr * section,
12766 FILE * file,
12767 bfd_boolean relocate)
12768{
12769 Elf_Internal_Shdr * relsec;
0e602686
NC
12770 bfd_size_type bytes;
12771 bfd_size_type section_size;
12772 bfd_vma addr;
12773 unsigned char * data;
12774 unsigned char * real_start;
12775 unsigned char * start;
12776
12777 real_start = start = (unsigned char *) get_section_contents (section, file);
cf13d699
NC
12778 if (start == NULL)
12779 return;
0e602686 12780 section_size = section->sh_size;
cf13d699 12781
74e1a04b 12782 printf (_("\nHex dump of section '%s':\n"), printable_section_name (section));
cf13d699 12783
0e602686
NC
12784 if (decompress_dumps)
12785 {
12786 dwarf_size_type new_size = section_size;
12787 dwarf_size_type uncompressed_size = 0;
12788
12789 if ((section->sh_flags & SHF_COMPRESSED) != 0)
12790 {
12791 Elf_Internal_Chdr chdr;
12792 unsigned int compression_header_size
ebdf1ebf 12793 = get_compression_header (& chdr, start, section_size);
0e602686 12794
813dabb9 12795 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
0e602686 12796 {
813dabb9
L
12797 warn (_("section '%s' has unsupported compress type: %d\n"),
12798 printable_section_name (section), chdr.ch_type);
12799 return;
0e602686 12800 }
813dabb9
L
12801 else if (chdr.ch_addralign != section->sh_addralign)
12802 {
12803 warn (_("compressed section '%s' is corrupted\n"),
12804 printable_section_name (section));
12805 return;
12806 }
12807 uncompressed_size = chdr.ch_size;
12808 start += compression_header_size;
12809 new_size -= compression_header_size;
0e602686
NC
12810 }
12811 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12812 {
12813 /* Read the zlib header. In this case, it should be "ZLIB"
12814 followed by the uncompressed section size, 8 bytes in
12815 big-endian order. */
12816 uncompressed_size = start[4]; uncompressed_size <<= 8;
12817 uncompressed_size += start[5]; uncompressed_size <<= 8;
12818 uncompressed_size += start[6]; uncompressed_size <<= 8;
12819 uncompressed_size += start[7]; uncompressed_size <<= 8;
12820 uncompressed_size += start[8]; uncompressed_size <<= 8;
12821 uncompressed_size += start[9]; uncompressed_size <<= 8;
12822 uncompressed_size += start[10]; uncompressed_size <<= 8;
12823 uncompressed_size += start[11];
12824 start += 12;
12825 new_size -= 12;
12826 }
12827
f055032e
NC
12828 if (uncompressed_size)
12829 {
12830 if (uncompress_section_contents (& start, uncompressed_size,
12831 & new_size))
12832 section_size = new_size;
12833 else
12834 {
12835 error (_("Unable to decompress section %s\n"),
12836 printable_section_name (section));
12837 return;
12838 }
12839 }
0e602686 12840 }
14ae95f2 12841
cf13d699
NC
12842 if (relocate)
12843 {
0e602686 12844 apply_relocations (file, section, start, section_size, NULL, NULL);
cf13d699
NC
12845 }
12846 else
12847 {
12848 /* If the section being dumped has relocations against it the user might
12849 be expecting these relocations to have been applied. Check for this
12850 case and issue a warning message in order to avoid confusion.
12851 FIXME: Maybe we ought to have an option that dumps a section with
12852 relocs applied ? */
12853 for (relsec = section_headers;
12854 relsec < section_headers + elf_header.e_shnum;
12855 ++relsec)
12856 {
12857 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12858 || relsec->sh_info >= elf_header.e_shnum
12859 || section_headers + relsec->sh_info != section
12860 || relsec->sh_size == 0
12861 || relsec->sh_link >= elf_header.e_shnum)
12862 continue;
12863
12864 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12865 break;
12866 }
12867 }
12868
12869 addr = section->sh_addr;
0e602686 12870 bytes = section_size;
cf13d699
NC
12871 data = start;
12872
12873 while (bytes)
12874 {
12875 int j;
12876 int k;
12877 int lbytes;
12878
12879 lbytes = (bytes > 16 ? 16 : bytes);
12880
12881 printf (" 0x%8.8lx ", (unsigned long) addr);
12882
12883 for (j = 0; j < 16; j++)
12884 {
12885 if (j < lbytes)
12886 printf ("%2.2x", data[j]);
12887 else
12888 printf (" ");
12889
12890 if ((j & 3) == 3)
12891 printf (" ");
12892 }
12893
12894 for (j = 0; j < lbytes; j++)
12895 {
12896 k = data[j];
12897 if (k >= ' ' && k < 0x7f)
12898 printf ("%c", k);
12899 else
12900 printf (".");
12901 }
12902
12903 putchar ('\n');
12904
12905 data += lbytes;
12906 addr += lbytes;
12907 bytes -= lbytes;
12908 }
12909
0e602686 12910 free (real_start);
cf13d699
NC
12911
12912 putchar ('\n');
12913}
12914
d966045b
DJ
12915static int
12916load_specific_debug_section (enum dwarf_section_display_enum debug,
0d2a7a93 12917 const Elf_Internal_Shdr * sec, void * file)
1007acb3 12918{
2cf0635d 12919 struct dwarf_section * section = &debug_displays [debug].section;
19e6b90e 12920 char buf [64];
1007acb3 12921
19e6b90e
L
12922 /* If it is already loaded, do nothing. */
12923 if (section->start != NULL)
12924 return 1;
1007acb3 12925
19e6b90e
L
12926 snprintf (buf, sizeof (buf), _("%s section data"), section->name);
12927 section->address = sec->sh_addr;
06614111 12928 section->user_data = NULL;
3f5e193b
NC
12929 section->start = (unsigned char *) get_data (NULL, (FILE *) file,
12930 sec->sh_offset, 1,
12931 sec->sh_size, buf);
59245841
NC
12932 if (section->start == NULL)
12933 section->size = 0;
12934 else
12935 {
77115a4a
L
12936 unsigned char *start = section->start;
12937 dwarf_size_type size = sec->sh_size;
dab394de 12938 dwarf_size_type uncompressed_size = 0;
77115a4a
L
12939
12940 if ((sec->sh_flags & SHF_COMPRESSED) != 0)
12941 {
12942 Elf_Internal_Chdr chdr;
d8024a91
NC
12943 unsigned int compression_header_size;
12944
f53be977
L
12945 if (size < (is_32bit_elf
12946 ? sizeof (Elf32_External_Chdr)
12947 : sizeof (Elf64_External_Chdr)))
d8024a91
NC
12948 {
12949 warn (_("compressed section %s is too small to contain a compression header"),
12950 section->name);
12951 return 0;
12952 }
12953
ebdf1ebf 12954 compression_header_size = get_compression_header (&chdr, start, size);
d8024a91 12955
813dabb9
L
12956 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12957 {
12958 warn (_("section '%s' has unsupported compress type: %d\n"),
12959 section->name, chdr.ch_type);
12960 return 0;
12961 }
12962 else if (chdr.ch_addralign != sec->sh_addralign)
12963 {
12964 warn (_("compressed section '%s' is corrupted\n"),
12965 section->name);
12966 return 0;
12967 }
dab394de 12968 uncompressed_size = chdr.ch_size;
77115a4a
L
12969 start += compression_header_size;
12970 size -= compression_header_size;
12971 }
dab394de
L
12972 else if (size > 12 && streq ((char *) start, "ZLIB"))
12973 {
12974 /* Read the zlib header. In this case, it should be "ZLIB"
12975 followed by the uncompressed section size, 8 bytes in
12976 big-endian order. */
12977 uncompressed_size = start[4]; uncompressed_size <<= 8;
12978 uncompressed_size += start[5]; uncompressed_size <<= 8;
12979 uncompressed_size += start[6]; uncompressed_size <<= 8;
12980 uncompressed_size += start[7]; uncompressed_size <<= 8;
12981 uncompressed_size += start[8]; uncompressed_size <<= 8;
12982 uncompressed_size += start[9]; uncompressed_size <<= 8;
12983 uncompressed_size += start[10]; uncompressed_size <<= 8;
12984 uncompressed_size += start[11];
12985 start += 12;
12986 size -= 12;
12987 }
12988
12989 if (uncompressed_size
12990 && uncompress_section_contents (&start, uncompressed_size,
12991 &size))
77115a4a
L
12992 {
12993 /* Free the compressed buffer, update the section buffer
12994 and the section size if uncompress is successful. */
12995 free (section->start);
12996 section->start = start;
77115a4a
L
12997 }
12998 section->size = size;
59245841 12999 }
4a114e3e 13000
1b315056
CS
13001 if (section->start == NULL)
13002 return 0;
13003
19e6b90e 13004 if (debug_displays [debug].relocate)
d1c4b12b
NC
13005 apply_relocations ((FILE *) file, sec, section->start, section->size,
13006 & section->reloc_info, & section->num_relocs);
13007 else
13008 {
13009 section->reloc_info = NULL;
13010 section->num_relocs = 0;
13011 }
1007acb3 13012
1b315056 13013 return 1;
1007acb3
L
13014}
13015
657d0d47
CC
13016/* If this is not NULL, load_debug_section will only look for sections
13017 within the list of sections given here. */
13018unsigned int *section_subset = NULL;
13019
d966045b 13020int
2cf0635d 13021load_debug_section (enum dwarf_section_display_enum debug, void * file)
d966045b 13022{
2cf0635d
NC
13023 struct dwarf_section * section = &debug_displays [debug].section;
13024 Elf_Internal_Shdr * sec;
d966045b
DJ
13025
13026 /* Locate the debug section. */
657d0d47 13027 sec = find_section_in_set (section->uncompressed_name, section_subset);
d966045b
DJ
13028 if (sec != NULL)
13029 section->name = section->uncompressed_name;
13030 else
13031 {
657d0d47 13032 sec = find_section_in_set (section->compressed_name, section_subset);
d966045b
DJ
13033 if (sec != NULL)
13034 section->name = section->compressed_name;
13035 }
13036 if (sec == NULL)
13037 return 0;
13038
657d0d47
CC
13039 /* If we're loading from a subset of sections, and we've loaded
13040 a section matching this name before, it's likely that it's a
13041 different one. */
13042 if (section_subset != NULL)
13043 free_debug_section (debug);
13044
3f5e193b 13045 return load_specific_debug_section (debug, sec, (FILE *) file);
d966045b
DJ
13046}
13047
19e6b90e
L
13048void
13049free_debug_section (enum dwarf_section_display_enum debug)
1007acb3 13050{
2cf0635d 13051 struct dwarf_section * section = &debug_displays [debug].section;
1007acb3 13052
19e6b90e
L
13053 if (section->start == NULL)
13054 return;
1007acb3 13055
19e6b90e
L
13056 free ((char *) section->start);
13057 section->start = NULL;
13058 section->address = 0;
13059 section->size = 0;
1007acb3
L
13060}
13061
1007acb3 13062static int
657d0d47 13063display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
1007acb3 13064{
2cf0635d 13065 char * name = SECTION_NAME (section);
74e1a04b 13066 const char * print_name = printable_section_name (section);
19e6b90e
L
13067 bfd_size_type length;
13068 int result = 1;
3f5e193b 13069 int i;
1007acb3 13070
19e6b90e
L
13071 length = section->sh_size;
13072 if (length == 0)
1007acb3 13073 {
74e1a04b 13074 printf (_("\nSection '%s' has no debugging data.\n"), print_name);
19e6b90e 13075 return 0;
1007acb3 13076 }
5dff79d8
NC
13077 if (section->sh_type == SHT_NOBITS)
13078 {
13079 /* There is no point in dumping the contents of a debugging section
13080 which has the NOBITS type - the bits in the file will be random.
13081 This can happen when a file containing a .eh_frame section is
13082 stripped with the --only-keep-debug command line option. */
74e1a04b
NC
13083 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
13084 print_name);
5dff79d8
NC
13085 return 0;
13086 }
1007acb3 13087
0112cd26 13088 if (const_strneq (name, ".gnu.linkonce.wi."))
19e6b90e 13089 name = ".debug_info";
1007acb3 13090
19e6b90e
L
13091 /* See if we know how to display the contents of this section. */
13092 for (i = 0; i < max; i++)
1b315056 13093 if (streq (debug_displays[i].section.uncompressed_name, name)
b40bf0a2 13094 || (i == line && const_strneq (name, ".debug_line."))
1b315056 13095 || streq (debug_displays[i].section.compressed_name, name))
19e6b90e 13096 {
2cf0635d 13097 struct dwarf_section * sec = &debug_displays [i].section;
d966045b
DJ
13098 int secondary = (section != find_section (name));
13099
13100 if (secondary)
3f5e193b 13101 free_debug_section ((enum dwarf_section_display_enum) i);
1007acb3 13102
b40bf0a2
NC
13103 if (i == line && const_strneq (name, ".debug_line."))
13104 sec->name = name;
13105 else if (streq (sec->uncompressed_name, name))
d966045b
DJ
13106 sec->name = sec->uncompressed_name;
13107 else
13108 sec->name = sec->compressed_name;
3f5e193b
NC
13109 if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
13110 section, file))
19e6b90e 13111 {
657d0d47
CC
13112 /* If this debug section is part of a CU/TU set in a .dwp file,
13113 restrict load_debug_section to the sections in that set. */
13114 section_subset = find_cu_tu_set (file, shndx);
13115
19e6b90e 13116 result &= debug_displays[i].display (sec, file);
1007acb3 13117
657d0d47
CC
13118 section_subset = NULL;
13119
d966045b 13120 if (secondary || (i != info && i != abbrev))
3f5e193b 13121 free_debug_section ((enum dwarf_section_display_enum) i);
19e6b90e 13122 }
1007acb3 13123
19e6b90e
L
13124 break;
13125 }
1007acb3 13126
19e6b90e 13127 if (i == max)
1007acb3 13128 {
74e1a04b 13129 printf (_("Unrecognized debug section: %s\n"), print_name);
19e6b90e 13130 result = 0;
1007acb3
L
13131 }
13132
19e6b90e 13133 return result;
5b18a4bc 13134}
103f02d3 13135
aef1f6d0
DJ
13136/* Set DUMP_SECTS for all sections where dumps were requested
13137 based on section name. */
13138
13139static void
13140initialise_dumps_byname (void)
13141{
2cf0635d 13142 struct dump_list_entry * cur;
aef1f6d0
DJ
13143
13144 for (cur = dump_sects_byname; cur; cur = cur->next)
13145 {
13146 unsigned int i;
13147 int any;
13148
13149 for (i = 0, any = 0; i < elf_header.e_shnum; i++)
13150 if (streq (SECTION_NAME (section_headers + i), cur->name))
13151 {
09c11c86 13152 request_dump_bynumber (i, cur->type);
aef1f6d0
DJ
13153 any = 1;
13154 }
13155
13156 if (!any)
13157 warn (_("Section '%s' was not dumped because it does not exist!\n"),
13158 cur->name);
13159 }
13160}
13161
5b18a4bc 13162static void
2cf0635d 13163process_section_contents (FILE * file)
5b18a4bc 13164{
2cf0635d 13165 Elf_Internal_Shdr * section;
19e6b90e 13166 unsigned int i;
103f02d3 13167
19e6b90e
L
13168 if (! do_dump)
13169 return;
103f02d3 13170
aef1f6d0
DJ
13171 initialise_dumps_byname ();
13172
19e6b90e
L
13173 for (i = 0, section = section_headers;
13174 i < elf_header.e_shnum && i < num_dump_sects;
13175 i++, section++)
13176 {
13177#ifdef SUPPORT_DISASSEMBLY
13178 if (dump_sects[i] & DISASS_DUMP)
13179 disassemble_section (section, file);
13180#endif
13181 if (dump_sects[i] & HEX_DUMP)
cf13d699 13182 dump_section_as_bytes (section, file, FALSE);
103f02d3 13183
cf13d699
NC
13184 if (dump_sects[i] & RELOC_DUMP)
13185 dump_section_as_bytes (section, file, TRUE);
09c11c86
NC
13186
13187 if (dump_sects[i] & STRING_DUMP)
13188 dump_section_as_strings (section, file);
cf13d699
NC
13189
13190 if (dump_sects[i] & DEBUG_DUMP)
657d0d47 13191 display_debug_section (i, section, file);
5b18a4bc 13192 }
103f02d3 13193
19e6b90e
L
13194 /* Check to see if the user requested a
13195 dump of a section that does not exist. */
0ee3043f
NC
13196 while (i < num_dump_sects)
13197 {
13198 if (dump_sects[i])
13199 warn (_("Section %d was not dumped because it does not exist!\n"), i);
13200 i++;
13201 }
5b18a4bc 13202}
103f02d3 13203
5b18a4bc 13204static void
19e6b90e 13205process_mips_fpe_exception (int mask)
5b18a4bc 13206{
19e6b90e
L
13207 if (mask)
13208 {
13209 int first = 1;
13210 if (mask & OEX_FPU_INEX)
13211 fputs ("INEX", stdout), first = 0;
13212 if (mask & OEX_FPU_UFLO)
13213 printf ("%sUFLO", first ? "" : "|"), first = 0;
13214 if (mask & OEX_FPU_OFLO)
13215 printf ("%sOFLO", first ? "" : "|"), first = 0;
13216 if (mask & OEX_FPU_DIV0)
13217 printf ("%sDIV0", first ? "" : "|"), first = 0;
13218 if (mask & OEX_FPU_INVAL)
13219 printf ("%sINVAL", first ? "" : "|");
13220 }
5b18a4bc 13221 else
19e6b90e 13222 fputs ("0", stdout);
5b18a4bc 13223}
103f02d3 13224
f6f0e17b
NC
13225/* Display's the value of TAG at location P. If TAG is
13226 greater than 0 it is assumed to be an unknown tag, and
13227 a message is printed to this effect. Otherwise it is
13228 assumed that a message has already been printed.
13229
13230 If the bottom bit of TAG is set it assumed to have a
13231 string value, otherwise it is assumed to have an integer
13232 value.
13233
13234 Returns an updated P pointing to the first unread byte
13235 beyond the end of TAG's value.
13236
13237 Reads at or beyond END will not be made. */
13238
13239static unsigned char *
13240display_tag_value (int tag,
13241 unsigned char * p,
13242 const unsigned char * const end)
13243{
13244 unsigned long val;
13245
13246 if (tag > 0)
13247 printf (" Tag_unknown_%d: ", tag);
13248
13249 if (p >= end)
13250 {
4082ef84 13251 warn (_("<corrupt tag>\n"));
f6f0e17b
NC
13252 }
13253 else if (tag & 1)
13254 {
071436c6
NC
13255 /* PR 17531 file: 027-19978-0.004. */
13256 size_t maxlen = (end - p) - 1;
13257
13258 putchar ('"');
4082ef84
NC
13259 if (maxlen > 0)
13260 {
13261 print_symbol ((int) maxlen, (const char *) p);
13262 p += strnlen ((char *) p, maxlen) + 1;
13263 }
13264 else
13265 {
13266 printf (_("<corrupt string tag>"));
13267 p = (unsigned char *) end;
13268 }
071436c6 13269 printf ("\"\n");
f6f0e17b
NC
13270 }
13271 else
13272 {
13273 unsigned int len;
13274
13275 val = read_uleb128 (p, &len, end);
13276 p += len;
13277 printf ("%ld (0x%lx)\n", val, val);
13278 }
13279
4082ef84 13280 assert (p <= end);
f6f0e17b
NC
13281 return p;
13282}
13283
11c1ff18
PB
13284/* ARM EABI attributes section. */
13285typedef struct
13286{
70e99720 13287 unsigned int tag;
2cf0635d 13288 const char * name;
11c1ff18 13289 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
70e99720 13290 unsigned int type;
2cf0635d 13291 const char ** table;
11c1ff18
PB
13292} arm_attr_public_tag;
13293
2cf0635d 13294static const char * arm_attr_tag_CPU_arch[] =
11c1ff18 13295 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
ff8646ee
TP
13296 "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "", "v8-M.baseline",
13297 "v8-M.mainline"};
2cf0635d
NC
13298static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
13299static const char * arm_attr_tag_THUMB_ISA_use[] =
4ed7ed8d 13300 {"No", "Thumb-1", "Thumb-2", "Yes"};
75375b3e 13301static const char * arm_attr_tag_FP_arch[] =
bca38921 13302 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
a715796b 13303 "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
2cf0635d 13304static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
dd24e3da 13305static const char * arm_attr_tag_Advanced_SIMD_arch[] =
9411fd44
MW
13306 {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
13307 "NEON for ARMv8.1"};
2cf0635d 13308static const char * arm_attr_tag_PCS_config[] =
11c1ff18
PB
13309 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
13310 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
2cf0635d 13311static const char * arm_attr_tag_ABI_PCS_R9_use[] =
11c1ff18 13312 {"V6", "SB", "TLS", "Unused"};
2cf0635d 13313static const char * arm_attr_tag_ABI_PCS_RW_data[] =
11c1ff18 13314 {"Absolute", "PC-relative", "SB-relative", "None"};
2cf0635d 13315static const char * arm_attr_tag_ABI_PCS_RO_data[] =
11c1ff18 13316 {"Absolute", "PC-relative", "None"};
2cf0635d 13317static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
11c1ff18 13318 {"None", "direct", "GOT-indirect"};
2cf0635d 13319static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
11c1ff18 13320 {"None", "??? 1", "2", "??? 3", "4"};
2cf0635d
NC
13321static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
13322static const char * arm_attr_tag_ABI_FP_denormal[] =
f5f53991 13323 {"Unused", "Needed", "Sign only"};
2cf0635d
NC
13324static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
13325static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
13326static const char * arm_attr_tag_ABI_FP_number_model[] =
11c1ff18 13327 {"Unused", "Finite", "RTABI", "IEEE 754"};
2cf0635d 13328static const char * arm_attr_tag_ABI_enum_size[] =
11c1ff18 13329 {"Unused", "small", "int", "forced to int"};
2cf0635d 13330static const char * arm_attr_tag_ABI_HardFP_use[] =
99654aaf 13331 {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
2cf0635d 13332static const char * arm_attr_tag_ABI_VFP_args[] =
5c294fee 13333 {"AAPCS", "VFP registers", "custom", "compatible"};
2cf0635d 13334static const char * arm_attr_tag_ABI_WMMX_args[] =
11c1ff18 13335 {"AAPCS", "WMMX registers", "custom"};
2cf0635d 13336static const char * arm_attr_tag_ABI_optimization_goals[] =
11c1ff18
PB
13337 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
13338 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
2cf0635d 13339static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
11c1ff18
PB
13340 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
13341 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
2cf0635d 13342static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
75375b3e 13343static const char * arm_attr_tag_FP_HP_extension[] =
8e79c3df 13344 {"Not Allowed", "Allowed"};
2cf0635d 13345static const char * arm_attr_tag_ABI_FP_16bit_format[] =
8e79c3df 13346 {"None", "IEEE 754", "Alternative Format"};
15afaa63
TP
13347static const char * arm_attr_tag_DSP_extension[] =
13348 {"Follow architecture", "Allowed"};
dd24e3da 13349static const char * arm_attr_tag_MPextension_use[] =
cd21e546
MGD
13350 {"Not Allowed", "Allowed"};
13351static const char * arm_attr_tag_DIV_use[] =
dd24e3da 13352 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
cd21e546 13353 "Allowed in v7-A with integer division extension"};
2cf0635d
NC
13354static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
13355static const char * arm_attr_tag_Virtualization_use[] =
dd24e3da 13356 {"Not Allowed", "TrustZone", "Virtualization Extensions",
cd21e546 13357 "TrustZone and Virtualization Extensions"};
dd24e3da 13358static const char * arm_attr_tag_MPextension_use_legacy[] =
f5f53991 13359 {"Not Allowed", "Allowed"};
11c1ff18
PB
13360
13361#define LOOKUP(id, name) \
13362 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
d70c5fc7 13363static arm_attr_public_tag arm_attr_public_tags[] =
11c1ff18
PB
13364{
13365 {4, "CPU_raw_name", 1, NULL},
13366 {5, "CPU_name", 1, NULL},
13367 LOOKUP(6, CPU_arch),
13368 {7, "CPU_arch_profile", 0, NULL},
13369 LOOKUP(8, ARM_ISA_use),
13370 LOOKUP(9, THUMB_ISA_use),
75375b3e 13371 LOOKUP(10, FP_arch),
11c1ff18 13372 LOOKUP(11, WMMX_arch),
f5f53991
AS
13373 LOOKUP(12, Advanced_SIMD_arch),
13374 LOOKUP(13, PCS_config),
11c1ff18
PB
13375 LOOKUP(14, ABI_PCS_R9_use),
13376 LOOKUP(15, ABI_PCS_RW_data),
f5f53991 13377 LOOKUP(16, ABI_PCS_RO_data),
11c1ff18
PB
13378 LOOKUP(17, ABI_PCS_GOT_use),
13379 LOOKUP(18, ABI_PCS_wchar_t),
13380 LOOKUP(19, ABI_FP_rounding),
13381 LOOKUP(20, ABI_FP_denormal),
13382 LOOKUP(21, ABI_FP_exceptions),
13383 LOOKUP(22, ABI_FP_user_exceptions),
13384 LOOKUP(23, ABI_FP_number_model),
75375b3e
MGD
13385 {24, "ABI_align_needed", 0, NULL},
13386 {25, "ABI_align_preserved", 0, NULL},
11c1ff18
PB
13387 LOOKUP(26, ABI_enum_size),
13388 LOOKUP(27, ABI_HardFP_use),
13389 LOOKUP(28, ABI_VFP_args),
13390 LOOKUP(29, ABI_WMMX_args),
13391 LOOKUP(30, ABI_optimization_goals),
13392 LOOKUP(31, ABI_FP_optimization_goals),
8e79c3df 13393 {32, "compatibility", 0, NULL},
f5f53991 13394 LOOKUP(34, CPU_unaligned_access),
75375b3e 13395 LOOKUP(36, FP_HP_extension),
8e79c3df 13396 LOOKUP(38, ABI_FP_16bit_format),
cd21e546
MGD
13397 LOOKUP(42, MPextension_use),
13398 LOOKUP(44, DIV_use),
15afaa63 13399 LOOKUP(46, DSP_extension),
f5f53991
AS
13400 {64, "nodefaults", 0, NULL},
13401 {65, "also_compatible_with", 0, NULL},
13402 LOOKUP(66, T2EE_use),
13403 {67, "conformance", 1, NULL},
13404 LOOKUP(68, Virtualization_use),
cd21e546 13405 LOOKUP(70, MPextension_use_legacy)
11c1ff18
PB
13406};
13407#undef LOOKUP
13408
11c1ff18 13409static unsigned char *
f6f0e17b
NC
13410display_arm_attribute (unsigned char * p,
13411 const unsigned char * const end)
11c1ff18 13412{
70e99720 13413 unsigned int tag;
11c1ff18 13414 unsigned int len;
70e99720 13415 unsigned int val;
2cf0635d 13416 arm_attr_public_tag * attr;
11c1ff18 13417 unsigned i;
70e99720 13418 unsigned int type;
11c1ff18 13419
f6f0e17b 13420 tag = read_uleb128 (p, &len, end);
11c1ff18
PB
13421 p += len;
13422 attr = NULL;
2cf0635d 13423 for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
11c1ff18
PB
13424 {
13425 if (arm_attr_public_tags[i].tag == tag)
13426 {
13427 attr = &arm_attr_public_tags[i];
13428 break;
13429 }
13430 }
13431
13432 if (attr)
13433 {
13434 printf (" Tag_%s: ", attr->name);
13435 switch (attr->type)
13436 {
13437 case 0:
13438 switch (tag)
13439 {
13440 case 7: /* Tag_CPU_arch_profile. */
f6f0e17b 13441 val = read_uleb128 (p, &len, end);
11c1ff18
PB
13442 p += len;
13443 switch (val)
13444 {
2b692964
NC
13445 case 0: printf (_("None\n")); break;
13446 case 'A': printf (_("Application\n")); break;
13447 case 'R': printf (_("Realtime\n")); break;
13448 case 'M': printf (_("Microcontroller\n")); break;
13449 case 'S': printf (_("Application or Realtime\n")); break;
11c1ff18
PB
13450 default: printf ("??? (%d)\n", val); break;
13451 }
13452 break;
13453
75375b3e 13454 case 24: /* Tag_align_needed. */
f6f0e17b 13455 val = read_uleb128 (p, &len, end);
75375b3e
MGD
13456 p += len;
13457 switch (val)
13458 {
2b692964
NC
13459 case 0: printf (_("None\n")); break;
13460 case 1: printf (_("8-byte\n")); break;
13461 case 2: printf (_("4-byte\n")); break;
75375b3e
MGD
13462 case 3: printf ("??? 3\n"); break;
13463 default:
13464 if (val <= 12)
dd24e3da 13465 printf (_("8-byte and up to %d-byte extended\n"),
75375b3e
MGD
13466 1 << val);
13467 else
13468 printf ("??? (%d)\n", val);
13469 break;
13470 }
13471 break;
13472
13473 case 25: /* Tag_align_preserved. */
f6f0e17b 13474 val = read_uleb128 (p, &len, end);
75375b3e
MGD
13475 p += len;
13476 switch (val)
13477 {
2b692964
NC
13478 case 0: printf (_("None\n")); break;
13479 case 1: printf (_("8-byte, except leaf SP\n")); break;
13480 case 2: printf (_("8-byte\n")); break;
75375b3e
MGD
13481 case 3: printf ("??? 3\n"); break;
13482 default:
13483 if (val <= 12)
dd24e3da 13484 printf (_("8-byte and up to %d-byte extended\n"),
75375b3e
MGD
13485 1 << val);
13486 else
13487 printf ("??? (%d)\n", val);
13488 break;
13489 }
13490 break;
13491
11c1ff18 13492 case 32: /* Tag_compatibility. */
071436c6 13493 {
071436c6
NC
13494 val = read_uleb128 (p, &len, end);
13495 p += len;
071436c6 13496 printf (_("flag = %d, vendor = "), val);
4082ef84
NC
13497 if (p < end - 1)
13498 {
13499 size_t maxlen = (end - p) - 1;
13500
13501 print_symbol ((int) maxlen, (const char *) p);
13502 p += strnlen ((char *) p, maxlen) + 1;
13503 }
13504 else
13505 {
13506 printf (_("<corrupt>"));
13507 p = (unsigned char *) end;
13508 }
071436c6 13509 putchar ('\n');
071436c6 13510 }
11c1ff18
PB
13511 break;
13512
f5f53991 13513 case 64: /* Tag_nodefaults. */
541a3cbd
NC
13514 /* PR 17531: file: 001-505008-0.01. */
13515 if (p < end)
13516 p++;
2b692964 13517 printf (_("True\n"));
f5f53991
AS
13518 break;
13519
13520 case 65: /* Tag_also_compatible_with. */
f6f0e17b 13521 val = read_uleb128 (p, &len, end);
f5f53991
AS
13522 p += len;
13523 if (val == 6 /* Tag_CPU_arch. */)
13524 {
f6f0e17b 13525 val = read_uleb128 (p, &len, end);
f5f53991 13526 p += len;
071436c6 13527 if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
f5f53991
AS
13528 printf ("??? (%d)\n", val);
13529 else
13530 printf ("%s\n", arm_attr_tag_CPU_arch[val]);
13531 }
13532 else
13533 printf ("???\n");
071436c6
NC
13534 while (p < end && *(p++) != '\0' /* NUL terminator. */)
13535 ;
f5f53991
AS
13536 break;
13537
11c1ff18 13538 default:
bee0ee85
NC
13539 printf (_("<unknown: %d>\n"), tag);
13540 break;
11c1ff18
PB
13541 }
13542 return p;
13543
13544 case 1:
f6f0e17b 13545 return display_tag_value (-1, p, end);
11c1ff18 13546 case 2:
f6f0e17b 13547 return display_tag_value (0, p, end);
11c1ff18
PB
13548
13549 default:
13550 assert (attr->type & 0x80);
f6f0e17b 13551 val = read_uleb128 (p, &len, end);
11c1ff18
PB
13552 p += len;
13553 type = attr->type & 0x7f;
13554 if (val >= type)
13555 printf ("??? (%d)\n", val);
13556 else
13557 printf ("%s\n", attr->table[val]);
13558 return p;
13559 }
13560 }
11c1ff18 13561
f6f0e17b 13562 return display_tag_value (tag, p, end);
11c1ff18
PB
13563}
13564
104d59d1 13565static unsigned char *
60bca95a 13566display_gnu_attribute (unsigned char * p,
f6f0e17b
NC
13567 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const),
13568 const unsigned char * const end)
104d59d1
JM
13569{
13570 int tag;
13571 unsigned int len;
13572 int val;
104d59d1 13573
f6f0e17b 13574 tag = read_uleb128 (p, &len, end);
104d59d1
JM
13575 p += len;
13576
13577 /* Tag_compatibility is the only generic GNU attribute defined at
13578 present. */
13579 if (tag == 32)
13580 {
f6f0e17b 13581 val = read_uleb128 (p, &len, end);
104d59d1 13582 p += len;
071436c6
NC
13583
13584 printf (_("flag = %d, vendor = "), val);
f6f0e17b
NC
13585 if (p == end)
13586 {
071436c6 13587 printf (_("<corrupt>\n"));
f6f0e17b
NC
13588 warn (_("corrupt vendor attribute\n"));
13589 }
13590 else
13591 {
4082ef84
NC
13592 if (p < end - 1)
13593 {
13594 size_t maxlen = (end - p) - 1;
071436c6 13595
4082ef84
NC
13596 print_symbol ((int) maxlen, (const char *) p);
13597 p += strnlen ((char *) p, maxlen) + 1;
13598 }
13599 else
13600 {
13601 printf (_("<corrupt>"));
13602 p = (unsigned char *) end;
13603 }
071436c6 13604 putchar ('\n');
f6f0e17b 13605 }
104d59d1
JM
13606 return p;
13607 }
13608
13609 if ((tag & 2) == 0 && display_proc_gnu_attribute)
f6f0e17b 13610 return display_proc_gnu_attribute (p, tag, end);
104d59d1 13611
f6f0e17b 13612 return display_tag_value (tag, p, end);
104d59d1
JM
13613}
13614
34c8bcba 13615static unsigned char *
f6f0e17b
NC
13616display_power_gnu_attribute (unsigned char * p,
13617 int tag,
13618 const unsigned char * const end)
34c8bcba 13619{
34c8bcba 13620 unsigned int len;
005d79fd 13621 unsigned int val;
34c8bcba
JM
13622
13623 if (tag == Tag_GNU_Power_ABI_FP)
13624 {
f6f0e17b 13625 val = read_uleb128 (p, &len, end);
34c8bcba
JM
13626 p += len;
13627 printf (" Tag_GNU_Power_ABI_FP: ");
005d79fd
AM
13628 if (len == 0)
13629 {
13630 printf (_("<corrupt>\n"));
13631 return p;
13632 }
60bca95a 13633
005d79fd
AM
13634 if (val > 15)
13635 printf ("(%#x), ", val);
13636
13637 switch (val & 3)
34c8bcba
JM
13638 {
13639 case 0:
005d79fd 13640 printf (_("unspecified hard/soft float, "));
34c8bcba
JM
13641 break;
13642 case 1:
005d79fd 13643 printf (_("hard float, "));
34c8bcba
JM
13644 break;
13645 case 2:
005d79fd 13646 printf (_("soft float, "));
34c8bcba 13647 break;
3c7b9897 13648 case 3:
005d79fd 13649 printf (_("single-precision hard float, "));
3c7b9897 13650 break;
005d79fd
AM
13651 }
13652
13653 switch (val & 0xC)
13654 {
13655 case 0:
13656 printf (_("unspecified long double\n"));
13657 break;
13658 case 4:
13659 printf (_("128-bit IBM long double\n"));
13660 break;
13661 case 8:
13662 printf (_("64-bit long double\n"));
13663 break;
13664 case 12:
13665 printf (_("128-bit IEEE long double\n"));
34c8bcba
JM
13666 break;
13667 }
13668 return p;
005d79fd 13669 }
34c8bcba 13670
c6e65352
DJ
13671 if (tag == Tag_GNU_Power_ABI_Vector)
13672 {
f6f0e17b 13673 val = read_uleb128 (p, &len, end);
c6e65352
DJ
13674 p += len;
13675 printf (" Tag_GNU_Power_ABI_Vector: ");
005d79fd
AM
13676 if (len == 0)
13677 {
13678 printf (_("<corrupt>\n"));
13679 return p;
13680 }
13681
13682 if (val > 3)
13683 printf ("(%#x), ", val);
13684
13685 switch (val & 3)
c6e65352
DJ
13686 {
13687 case 0:
005d79fd 13688 printf (_("unspecified\n"));
c6e65352
DJ
13689 break;
13690 case 1:
005d79fd 13691 printf (_("generic\n"));
c6e65352
DJ
13692 break;
13693 case 2:
13694 printf ("AltiVec\n");
13695 break;
13696 case 3:
13697 printf ("SPE\n");
13698 break;
c6e65352
DJ
13699 }
13700 return p;
005d79fd 13701 }
c6e65352 13702
f82e0623
NF
13703 if (tag == Tag_GNU_Power_ABI_Struct_Return)
13704 {
005d79fd
AM
13705 val = read_uleb128 (p, &len, end);
13706 p += len;
13707 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
13708 if (len == 0)
f6f0e17b 13709 {
005d79fd 13710 printf (_("<corrupt>\n"));
f6f0e17b
NC
13711 return p;
13712 }
0b4362b0 13713
005d79fd
AM
13714 if (val > 2)
13715 printf ("(%#x), ", val);
13716
13717 switch (val & 3)
13718 {
13719 case 0:
13720 printf (_("unspecified\n"));
13721 break;
13722 case 1:
13723 printf ("r3/r4\n");
13724 break;
13725 case 2:
13726 printf (_("memory\n"));
13727 break;
13728 case 3:
13729 printf ("???\n");
13730 break;
13731 }
f82e0623
NF
13732 return p;
13733 }
13734
f6f0e17b 13735 return display_tag_value (tag & 1, p, end);
34c8bcba
JM
13736}
13737
643f7afb
AK
13738static unsigned char *
13739display_s390_gnu_attribute (unsigned char * p,
13740 int tag,
13741 const unsigned char * const end)
13742{
13743 unsigned int len;
13744 int val;
13745
13746 if (tag == Tag_GNU_S390_ABI_Vector)
13747 {
13748 val = read_uleb128 (p, &len, end);
13749 p += len;
13750 printf (" Tag_GNU_S390_ABI_Vector: ");
13751
13752 switch (val)
13753 {
13754 case 0:
13755 printf (_("any\n"));
13756 break;
13757 case 1:
13758 printf (_("software\n"));
13759 break;
13760 case 2:
13761 printf (_("hardware\n"));
13762 break;
13763 default:
13764 printf ("??? (%d)\n", val);
13765 break;
13766 }
13767 return p;
13768 }
13769
13770 return display_tag_value (tag & 1, p, end);
13771}
13772
9e8c70f9
DM
13773static void
13774display_sparc_hwcaps (int mask)
13775{
13776 if (mask)
13777 {
13778 int first = 1;
071436c6 13779
9e8c70f9
DM
13780 if (mask & ELF_SPARC_HWCAP_MUL32)
13781 fputs ("mul32", stdout), first = 0;
13782 if (mask & ELF_SPARC_HWCAP_DIV32)
13783 printf ("%sdiv32", first ? "" : "|"), first = 0;
13784 if (mask & ELF_SPARC_HWCAP_FSMULD)
13785 printf ("%sfsmuld", first ? "" : "|"), first = 0;
13786 if (mask & ELF_SPARC_HWCAP_V8PLUS)
13787 printf ("%sv8plus", first ? "" : "|"), first = 0;
13788 if (mask & ELF_SPARC_HWCAP_POPC)
13789 printf ("%spopc", first ? "" : "|"), first = 0;
13790 if (mask & ELF_SPARC_HWCAP_VIS)
13791 printf ("%svis", first ? "" : "|"), first = 0;
13792 if (mask & ELF_SPARC_HWCAP_VIS2)
13793 printf ("%svis2", first ? "" : "|"), first = 0;
13794 if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
13795 printf ("%sASIBlkInit", first ? "" : "|"), first = 0;
13796 if (mask & ELF_SPARC_HWCAP_FMAF)
13797 printf ("%sfmaf", first ? "" : "|"), first = 0;
13798 if (mask & ELF_SPARC_HWCAP_VIS3)
13799 printf ("%svis3", first ? "" : "|"), first = 0;
13800 if (mask & ELF_SPARC_HWCAP_HPC)
13801 printf ("%shpc", first ? "" : "|"), first = 0;
13802 if (mask & ELF_SPARC_HWCAP_RANDOM)
13803 printf ("%srandom", first ? "" : "|"), first = 0;
13804 if (mask & ELF_SPARC_HWCAP_TRANS)
13805 printf ("%strans", first ? "" : "|"), first = 0;
13806 if (mask & ELF_SPARC_HWCAP_FJFMAU)
13807 printf ("%sfjfmau", first ? "" : "|"), first = 0;
13808 if (mask & ELF_SPARC_HWCAP_IMA)
13809 printf ("%sima", first ? "" : "|"), first = 0;
13810 if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
13811 printf ("%scspare", first ? "" : "|"), first = 0;
13812 }
13813 else
071436c6
NC
13814 fputc ('0', stdout);
13815 fputc ('\n', stdout);
9e8c70f9
DM
13816}
13817
3d68f91c
JM
13818static void
13819display_sparc_hwcaps2 (int mask)
13820{
13821 if (mask)
13822 {
13823 int first = 1;
071436c6 13824
3d68f91c
JM
13825 if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
13826 fputs ("fjathplus", stdout), first = 0;
13827 if (mask & ELF_SPARC_HWCAP2_VIS3B)
13828 printf ("%svis3b", first ? "" : "|"), first = 0;
13829 if (mask & ELF_SPARC_HWCAP2_ADP)
13830 printf ("%sadp", first ? "" : "|"), first = 0;
13831 if (mask & ELF_SPARC_HWCAP2_SPARC5)
13832 printf ("%ssparc5", first ? "" : "|"), first = 0;
13833 if (mask & ELF_SPARC_HWCAP2_MWAIT)
13834 printf ("%smwait", first ? "" : "|"), first = 0;
13835 if (mask & ELF_SPARC_HWCAP2_XMPMUL)
13836 printf ("%sxmpmul", first ? "" : "|"), first = 0;
13837 if (mask & ELF_SPARC_HWCAP2_XMONT)
13838 printf ("%sxmont2", first ? "" : "|"), first = 0;
13839 if (mask & ELF_SPARC_HWCAP2_NSEC)
13840 printf ("%snsec", first ? "" : "|"), first = 0;
13841 if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
13842 printf ("%sfjathhpc", first ? "" : "|"), first = 0;
13843 if (mask & ELF_SPARC_HWCAP2_FJDES)
13844 printf ("%sfjdes", first ? "" : "|"), first = 0;
13845 if (mask & ELF_SPARC_HWCAP2_FJAES)
13846 printf ("%sfjaes", first ? "" : "|"), first = 0;
13847 }
13848 else
071436c6
NC
13849 fputc ('0', stdout);
13850 fputc ('\n', stdout);
3d68f91c
JM
13851}
13852
9e8c70f9 13853static unsigned char *
f6f0e17b
NC
13854display_sparc_gnu_attribute (unsigned char * p,
13855 int tag,
13856 const unsigned char * const end)
9e8c70f9 13857{
3d68f91c
JM
13858 unsigned int len;
13859 int val;
13860
9e8c70f9
DM
13861 if (tag == Tag_GNU_Sparc_HWCAPS)
13862 {
f6f0e17b 13863 val = read_uleb128 (p, &len, end);
9e8c70f9
DM
13864 p += len;
13865 printf (" Tag_GNU_Sparc_HWCAPS: ");
9e8c70f9
DM
13866 display_sparc_hwcaps (val);
13867 return p;
3d68f91c
JM
13868 }
13869 if (tag == Tag_GNU_Sparc_HWCAPS2)
13870 {
13871 val = read_uleb128 (p, &len, end);
13872 p += len;
13873 printf (" Tag_GNU_Sparc_HWCAPS2: ");
13874 display_sparc_hwcaps2 (val);
13875 return p;
13876 }
9e8c70f9 13877
f6f0e17b 13878 return display_tag_value (tag, p, end);
9e8c70f9
DM
13879}
13880
351cdf24
MF
13881static void
13882print_mips_fp_abi_value (int val)
13883{
13884 switch (val)
13885 {
13886 case Val_GNU_MIPS_ABI_FP_ANY:
13887 printf (_("Hard or soft float\n"));
13888 break;
13889 case Val_GNU_MIPS_ABI_FP_DOUBLE:
13890 printf (_("Hard float (double precision)\n"));
13891 break;
13892 case Val_GNU_MIPS_ABI_FP_SINGLE:
13893 printf (_("Hard float (single precision)\n"));
13894 break;
13895 case Val_GNU_MIPS_ABI_FP_SOFT:
13896 printf (_("Soft float\n"));
13897 break;
13898 case Val_GNU_MIPS_ABI_FP_OLD_64:
13899 printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
13900 break;
13901 case Val_GNU_MIPS_ABI_FP_XX:
13902 printf (_("Hard float (32-bit CPU, Any FPU)\n"));
13903 break;
13904 case Val_GNU_MIPS_ABI_FP_64:
13905 printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
13906 break;
13907 case Val_GNU_MIPS_ABI_FP_64A:
13908 printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
13909 break;
3350cc01
CM
13910 case Val_GNU_MIPS_ABI_FP_NAN2008:
13911 printf (_("NaN 2008 compatibility\n"));
13912 break;
351cdf24
MF
13913 default:
13914 printf ("??? (%d)\n", val);
13915 break;
13916 }
13917}
13918
2cf19d5c 13919static unsigned char *
f6f0e17b
NC
13920display_mips_gnu_attribute (unsigned char * p,
13921 int tag,
13922 const unsigned char * const end)
2cf19d5c 13923{
2cf19d5c
JM
13924 if (tag == Tag_GNU_MIPS_ABI_FP)
13925 {
f6f0e17b
NC
13926 unsigned int len;
13927 int val;
13928
13929 val = read_uleb128 (p, &len, end);
2cf19d5c
JM
13930 p += len;
13931 printf (" Tag_GNU_MIPS_ABI_FP: ");
60bca95a 13932
351cdf24
MF
13933 print_mips_fp_abi_value (val);
13934
2cf19d5c
JM
13935 return p;
13936 }
13937
a9f58168
CF
13938 if (tag == Tag_GNU_MIPS_ABI_MSA)
13939 {
13940 unsigned int len;
13941 int val;
13942
13943 val = read_uleb128 (p, &len, end);
13944 p += len;
13945 printf (" Tag_GNU_MIPS_ABI_MSA: ");
13946
13947 switch (val)
13948 {
13949 case Val_GNU_MIPS_ABI_MSA_ANY:
13950 printf (_("Any MSA or not\n"));
13951 break;
13952 case Val_GNU_MIPS_ABI_MSA_128:
13953 printf (_("128-bit MSA\n"));
13954 break;
13955 default:
13956 printf ("??? (%d)\n", val);
13957 break;
13958 }
13959 return p;
13960 }
13961
f6f0e17b 13962 return display_tag_value (tag & 1, p, end);
2cf19d5c
JM
13963}
13964
59e6276b 13965static unsigned char *
f6f0e17b
NC
13966display_tic6x_attribute (unsigned char * p,
13967 const unsigned char * const end)
59e6276b
JM
13968{
13969 int tag;
13970 unsigned int len;
13971 int val;
13972
f6f0e17b 13973 tag = read_uleb128 (p, &len, end);
59e6276b
JM
13974 p += len;
13975
13976 switch (tag)
13977 {
75fa6dc1 13978 case Tag_ISA:
f6f0e17b 13979 val = read_uleb128 (p, &len, end);
59e6276b 13980 p += len;
75fa6dc1 13981 printf (" Tag_ISA: ");
59e6276b
JM
13982
13983 switch (val)
13984 {
75fa6dc1 13985 case C6XABI_Tag_ISA_none:
59e6276b
JM
13986 printf (_("None\n"));
13987 break;
75fa6dc1 13988 case C6XABI_Tag_ISA_C62X:
59e6276b
JM
13989 printf ("C62x\n");
13990 break;
75fa6dc1 13991 case C6XABI_Tag_ISA_C67X:
59e6276b
JM
13992 printf ("C67x\n");
13993 break;
75fa6dc1 13994 case C6XABI_Tag_ISA_C67XP:
59e6276b
JM
13995 printf ("C67x+\n");
13996 break;
75fa6dc1 13997 case C6XABI_Tag_ISA_C64X:
59e6276b
JM
13998 printf ("C64x\n");
13999 break;
75fa6dc1 14000 case C6XABI_Tag_ISA_C64XP:
59e6276b
JM
14001 printf ("C64x+\n");
14002 break;
75fa6dc1 14003 case C6XABI_Tag_ISA_C674X:
59e6276b
JM
14004 printf ("C674x\n");
14005 break;
14006 default:
14007 printf ("??? (%d)\n", val);
14008 break;
14009 }
14010 return p;
14011
87779176 14012 case Tag_ABI_wchar_t:
f6f0e17b 14013 val = read_uleb128 (p, &len, end);
87779176
JM
14014 p += len;
14015 printf (" Tag_ABI_wchar_t: ");
14016 switch (val)
14017 {
14018 case 0:
14019 printf (_("Not used\n"));
14020 break;
14021 case 1:
14022 printf (_("2 bytes\n"));
14023 break;
14024 case 2:
14025 printf (_("4 bytes\n"));
14026 break;
14027 default:
14028 printf ("??? (%d)\n", val);
14029 break;
14030 }
14031 return p;
14032
14033 case Tag_ABI_stack_align_needed:
f6f0e17b 14034 val = read_uleb128 (p, &len, end);
87779176
JM
14035 p += len;
14036 printf (" Tag_ABI_stack_align_needed: ");
14037 switch (val)
14038 {
14039 case 0:
14040 printf (_("8-byte\n"));
14041 break;
14042 case 1:
14043 printf (_("16-byte\n"));
14044 break;
14045 default:
14046 printf ("??? (%d)\n", val);
14047 break;
14048 }
14049 return p;
14050
14051 case Tag_ABI_stack_align_preserved:
f6f0e17b 14052 val = read_uleb128 (p, &len, end);
87779176
JM
14053 p += len;
14054 printf (" Tag_ABI_stack_align_preserved: ");
14055 switch (val)
14056 {
14057 case 0:
14058 printf (_("8-byte\n"));
14059 break;
14060 case 1:
14061 printf (_("16-byte\n"));
14062 break;
14063 default:
14064 printf ("??? (%d)\n", val);
14065 break;
14066 }
14067 return p;
14068
b5593623 14069 case Tag_ABI_DSBT:
f6f0e17b 14070 val = read_uleb128 (p, &len, end);
b5593623
JM
14071 p += len;
14072 printf (" Tag_ABI_DSBT: ");
14073 switch (val)
14074 {
14075 case 0:
14076 printf (_("DSBT addressing not used\n"));
14077 break;
14078 case 1:
14079 printf (_("DSBT addressing used\n"));
14080 break;
14081 default:
14082 printf ("??? (%d)\n", val);
14083 break;
14084 }
14085 return p;
14086
87779176 14087 case Tag_ABI_PID:
f6f0e17b 14088 val = read_uleb128 (p, &len, end);
87779176
JM
14089 p += len;
14090 printf (" Tag_ABI_PID: ");
14091 switch (val)
14092 {
14093 case 0:
14094 printf (_("Data addressing position-dependent\n"));
14095 break;
14096 case 1:
14097 printf (_("Data addressing position-independent, GOT near DP\n"));
14098 break;
14099 case 2:
14100 printf (_("Data addressing position-independent, GOT far from DP\n"));
14101 break;
14102 default:
14103 printf ("??? (%d)\n", val);
14104 break;
14105 }
14106 return p;
14107
14108 case Tag_ABI_PIC:
f6f0e17b 14109 val = read_uleb128 (p, &len, end);
87779176
JM
14110 p += len;
14111 printf (" Tag_ABI_PIC: ");
14112 switch (val)
14113 {
14114 case 0:
14115 printf (_("Code addressing position-dependent\n"));
14116 break;
14117 case 1:
14118 printf (_("Code addressing position-independent\n"));
14119 break;
14120 default:
14121 printf ("??? (%d)\n", val);
14122 break;
14123 }
14124 return p;
14125
14126 case Tag_ABI_array_object_alignment:
f6f0e17b 14127 val = read_uleb128 (p, &len, end);
87779176
JM
14128 p += len;
14129 printf (" Tag_ABI_array_object_alignment: ");
14130 switch (val)
14131 {
14132 case 0:
14133 printf (_("8-byte\n"));
14134 break;
14135 case 1:
14136 printf (_("4-byte\n"));
14137 break;
14138 case 2:
14139 printf (_("16-byte\n"));
14140 break;
14141 default:
14142 printf ("??? (%d)\n", val);
14143 break;
14144 }
14145 return p;
14146
14147 case Tag_ABI_array_object_align_expected:
f6f0e17b 14148 val = read_uleb128 (p, &len, end);
87779176
JM
14149 p += len;
14150 printf (" Tag_ABI_array_object_align_expected: ");
14151 switch (val)
14152 {
14153 case 0:
14154 printf (_("8-byte\n"));
14155 break;
14156 case 1:
14157 printf (_("4-byte\n"));
14158 break;
14159 case 2:
14160 printf (_("16-byte\n"));
14161 break;
14162 default:
14163 printf ("??? (%d)\n", val);
14164 break;
14165 }
14166 return p;
14167
3cbd1c06 14168 case Tag_ABI_compatibility:
071436c6 14169 {
071436c6
NC
14170 val = read_uleb128 (p, &len, end);
14171 p += len;
14172 printf (" Tag_ABI_compatibility: ");
071436c6 14173 printf (_("flag = %d, vendor = "), val);
4082ef84
NC
14174 if (p < end - 1)
14175 {
14176 size_t maxlen = (end - p) - 1;
14177
14178 print_symbol ((int) maxlen, (const char *) p);
14179 p += strnlen ((char *) p, maxlen) + 1;
14180 }
14181 else
14182 {
14183 printf (_("<corrupt>"));
14184 p = (unsigned char *) end;
14185 }
071436c6 14186 putchar ('\n');
071436c6
NC
14187 return p;
14188 }
87779176
JM
14189
14190 case Tag_ABI_conformance:
071436c6 14191 {
4082ef84
NC
14192 printf (" Tag_ABI_conformance: \"");
14193 if (p < end - 1)
14194 {
14195 size_t maxlen = (end - p) - 1;
071436c6 14196
4082ef84
NC
14197 print_symbol ((int) maxlen, (const char *) p);
14198 p += strnlen ((char *) p, maxlen) + 1;
14199 }
14200 else
14201 {
14202 printf (_("<corrupt>"));
14203 p = (unsigned char *) end;
14204 }
071436c6 14205 printf ("\"\n");
071436c6
NC
14206 return p;
14207 }
59e6276b
JM
14208 }
14209
f6f0e17b
NC
14210 return display_tag_value (tag, p, end);
14211}
59e6276b 14212
f6f0e17b
NC
14213static void
14214display_raw_attribute (unsigned char * p, unsigned char * end)
14215{
14216 unsigned long addr = 0;
14217 size_t bytes = end - p;
14218
e0a31db1 14219 assert (end > p);
f6f0e17b 14220 while (bytes)
87779176 14221 {
f6f0e17b
NC
14222 int j;
14223 int k;
14224 int lbytes = (bytes > 16 ? 16 : bytes);
14225
14226 printf (" 0x%8.8lx ", addr);
14227
14228 for (j = 0; j < 16; j++)
14229 {
14230 if (j < lbytes)
14231 printf ("%2.2x", p[j]);
14232 else
14233 printf (" ");
14234
14235 if ((j & 3) == 3)
14236 printf (" ");
14237 }
14238
14239 for (j = 0; j < lbytes; j++)
14240 {
14241 k = p[j];
14242 if (k >= ' ' && k < 0x7f)
14243 printf ("%c", k);
14244 else
14245 printf (".");
14246 }
14247
14248 putchar ('\n');
14249
14250 p += lbytes;
14251 bytes -= lbytes;
14252 addr += lbytes;
87779176 14253 }
59e6276b 14254
f6f0e17b 14255 putchar ('\n');
59e6276b
JM
14256}
14257
13761a11
NC
14258static unsigned char *
14259display_msp430x_attribute (unsigned char * p,
14260 const unsigned char * const end)
14261{
14262 unsigned int len;
14263 int val;
14264 int tag;
14265
14266 tag = read_uleb128 (p, & len, end);
14267 p += len;
0b4362b0 14268
13761a11
NC
14269 switch (tag)
14270 {
14271 case OFBA_MSPABI_Tag_ISA:
14272 val = read_uleb128 (p, &len, end);
14273 p += len;
14274 printf (" Tag_ISA: ");
14275 switch (val)
14276 {
14277 case 0: printf (_("None\n")); break;
14278 case 1: printf (_("MSP430\n")); break;
14279 case 2: printf (_("MSP430X\n")); break;
14280 default: printf ("??? (%d)\n", val); break;
14281 }
14282 break;
14283
14284 case OFBA_MSPABI_Tag_Code_Model:
14285 val = read_uleb128 (p, &len, end);
14286 p += len;
14287 printf (" Tag_Code_Model: ");
14288 switch (val)
14289 {
14290 case 0: printf (_("None\n")); break;
14291 case 1: printf (_("Small\n")); break;
14292 case 2: printf (_("Large\n")); break;
14293 default: printf ("??? (%d)\n", val); break;
14294 }
14295 break;
14296
14297 case OFBA_MSPABI_Tag_Data_Model:
14298 val = read_uleb128 (p, &len, end);
14299 p += len;
14300 printf (" Tag_Data_Model: ");
14301 switch (val)
14302 {
14303 case 0: printf (_("None\n")); break;
14304 case 1: printf (_("Small\n")); break;
14305 case 2: printf (_("Large\n")); break;
14306 case 3: printf (_("Restricted Large\n")); break;
14307 default: printf ("??? (%d)\n", val); break;
14308 }
14309 break;
14310
14311 default:
14312 printf (_(" <unknown tag %d>: "), tag);
14313
14314 if (tag & 1)
14315 {
071436c6 14316 putchar ('"');
4082ef84
NC
14317 if (p < end - 1)
14318 {
14319 size_t maxlen = (end - p) - 1;
14320
14321 print_symbol ((int) maxlen, (const char *) p);
14322 p += strnlen ((char *) p, maxlen) + 1;
14323 }
14324 else
14325 {
14326 printf (_("<corrupt>"));
14327 p = (unsigned char *) end;
14328 }
071436c6 14329 printf ("\"\n");
13761a11
NC
14330 }
14331 else
14332 {
14333 val = read_uleb128 (p, &len, end);
14334 p += len;
14335 printf ("%d (0x%x)\n", val, val);
14336 }
14337 break;
14338 }
14339
4082ef84 14340 assert (p <= end);
13761a11
NC
14341 return p;
14342}
14343
11c1ff18 14344static int
60bca95a
NC
14345process_attributes (FILE * file,
14346 const char * public_name,
104d59d1 14347 unsigned int proc_type,
f6f0e17b
NC
14348 unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
14349 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const))
11c1ff18 14350{
2cf0635d 14351 Elf_Internal_Shdr * sect;
11c1ff18
PB
14352 unsigned i;
14353
14354 /* Find the section header so that we get the size. */
14355 for (i = 0, sect = section_headers;
14356 i < elf_header.e_shnum;
14357 i++, sect++)
14358 {
071436c6
NC
14359 unsigned char * contents;
14360 unsigned char * p;
14361
104d59d1 14362 if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
11c1ff18
PB
14363 continue;
14364
3f5e193b
NC
14365 contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
14366 sect->sh_size, _("attributes"));
60bca95a 14367 if (contents == NULL)
11c1ff18 14368 continue;
60bca95a 14369
11c1ff18
PB
14370 p = contents;
14371 if (*p == 'A')
14372 {
071436c6
NC
14373 bfd_vma section_len;
14374
14375 section_len = sect->sh_size - 1;
11c1ff18 14376 p++;
60bca95a 14377
071436c6 14378 while (section_len > 0)
11c1ff18 14379 {
071436c6 14380 bfd_vma attr_len;
e9847026 14381 unsigned int namelen;
11c1ff18 14382 bfd_boolean public_section;
104d59d1 14383 bfd_boolean gnu_section;
11c1ff18 14384
071436c6 14385 if (section_len <= 4)
e0a31db1
NC
14386 {
14387 error (_("Tag section ends prematurely\n"));
14388 break;
14389 }
071436c6 14390 attr_len = byte_get (p, 4);
11c1ff18 14391 p += 4;
60bca95a 14392
071436c6 14393 if (attr_len > section_len)
11c1ff18 14394 {
071436c6
NC
14395 error (_("Bad attribute length (%u > %u)\n"),
14396 (unsigned) attr_len, (unsigned) section_len);
14397 attr_len = section_len;
11c1ff18 14398 }
74e1a04b 14399 /* PR 17531: file: 001-101425-0.004 */
071436c6 14400 else if (attr_len < 5)
74e1a04b 14401 {
071436c6 14402 error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
74e1a04b
NC
14403 break;
14404 }
e9847026 14405
071436c6
NC
14406 section_len -= attr_len;
14407 attr_len -= 4;
14408
14409 namelen = strnlen ((char *) p, attr_len) + 1;
14410 if (namelen == 0 || namelen >= attr_len)
e9847026
NC
14411 {
14412 error (_("Corrupt attribute section name\n"));
14413 break;
14414 }
14415
071436c6
NC
14416 printf (_("Attribute Section: "));
14417 print_symbol (INT_MAX, (const char *) p);
14418 putchar ('\n');
60bca95a
NC
14419
14420 if (public_name && streq ((char *) p, public_name))
11c1ff18
PB
14421 public_section = TRUE;
14422 else
14423 public_section = FALSE;
60bca95a
NC
14424
14425 if (streq ((char *) p, "gnu"))
104d59d1
JM
14426 gnu_section = TRUE;
14427 else
14428 gnu_section = FALSE;
60bca95a 14429
11c1ff18 14430 p += namelen;
071436c6 14431 attr_len -= namelen;
e0a31db1 14432
071436c6 14433 while (attr_len > 0 && p < contents + sect->sh_size)
11c1ff18 14434 {
e0a31db1 14435 int tag;
11c1ff18
PB
14436 int val;
14437 bfd_vma size;
071436c6 14438 unsigned char * end;
60bca95a 14439
e0a31db1 14440 /* PR binutils/17531: Safe handling of corrupt files. */
071436c6 14441 if (attr_len < 6)
e0a31db1
NC
14442 {
14443 error (_("Unused bytes at end of section\n"));
14444 section_len = 0;
14445 break;
14446 }
14447
14448 tag = *(p++);
11c1ff18 14449 size = byte_get (p, 4);
071436c6 14450 if (size > attr_len)
11c1ff18 14451 {
e9847026 14452 error (_("Bad subsection length (%u > %u)\n"),
071436c6
NC
14453 (unsigned) size, (unsigned) attr_len);
14454 size = attr_len;
11c1ff18 14455 }
e0a31db1
NC
14456 /* PR binutils/17531: Safe handling of corrupt files. */
14457 if (size < 6)
14458 {
14459 error (_("Bad subsection length (%u < 6)\n"),
14460 (unsigned) size);
14461 section_len = 0;
14462 break;
14463 }
60bca95a 14464
071436c6 14465 attr_len -= size;
11c1ff18 14466 end = p + size - 1;
071436c6 14467 assert (end <= contents + sect->sh_size);
11c1ff18 14468 p += 4;
60bca95a 14469
11c1ff18
PB
14470 switch (tag)
14471 {
14472 case 1:
2b692964 14473 printf (_("File Attributes\n"));
11c1ff18
PB
14474 break;
14475 case 2:
2b692964 14476 printf (_("Section Attributes:"));
11c1ff18
PB
14477 goto do_numlist;
14478 case 3:
2b692964 14479 printf (_("Symbol Attributes:"));
1a0670f3 14480 /* Fall through. */
11c1ff18
PB
14481 do_numlist:
14482 for (;;)
14483 {
91d6fa6a 14484 unsigned int j;
60bca95a 14485
f6f0e17b 14486 val = read_uleb128 (p, &j, end);
91d6fa6a 14487 p += j;
11c1ff18
PB
14488 if (val == 0)
14489 break;
14490 printf (" %d", val);
14491 }
14492 printf ("\n");
14493 break;
14494 default:
2b692964 14495 printf (_("Unknown tag: %d\n"), tag);
11c1ff18
PB
14496 public_section = FALSE;
14497 break;
14498 }
60bca95a 14499
071436c6 14500 if (public_section && display_pub_attribute != NULL)
11c1ff18
PB
14501 {
14502 while (p < end)
f6f0e17b 14503 p = display_pub_attribute (p, end);
071436c6 14504 assert (p <= end);
104d59d1 14505 }
071436c6 14506 else if (gnu_section && display_proc_gnu_attribute != NULL)
104d59d1
JM
14507 {
14508 while (p < end)
14509 p = display_gnu_attribute (p,
f6f0e17b
NC
14510 display_proc_gnu_attribute,
14511 end);
071436c6 14512 assert (p <= end);
11c1ff18 14513 }
071436c6 14514 else if (p < end)
11c1ff18 14515 {
071436c6 14516 printf (_(" Unknown attribute:\n"));
f6f0e17b 14517 display_raw_attribute (p, end);
11c1ff18
PB
14518 p = end;
14519 }
071436c6
NC
14520 else
14521 attr_len = 0;
11c1ff18
PB
14522 }
14523 }
14524 }
14525 else
e9847026 14526 printf (_("Unknown format '%c' (%d)\n"), *p, *p);
d70c5fc7 14527
60bca95a 14528 free (contents);
11c1ff18
PB
14529 }
14530 return 1;
14531}
14532
104d59d1 14533static int
2cf0635d 14534process_arm_specific (FILE * file)
104d59d1
JM
14535{
14536 return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
14537 display_arm_attribute, NULL);
14538}
14539
34c8bcba 14540static int
2cf0635d 14541process_power_specific (FILE * file)
34c8bcba
JM
14542{
14543 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14544 display_power_gnu_attribute);
14545}
14546
643f7afb
AK
14547static int
14548process_s390_specific (FILE * file)
14549{
14550 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14551 display_s390_gnu_attribute);
14552}
14553
9e8c70f9
DM
14554static int
14555process_sparc_specific (FILE * file)
14556{
14557 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14558 display_sparc_gnu_attribute);
14559}
14560
59e6276b
JM
14561static int
14562process_tic6x_specific (FILE * file)
14563{
14564 return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
14565 display_tic6x_attribute, NULL);
14566}
14567
13761a11
NC
14568static int
14569process_msp430x_specific (FILE * file)
14570{
14571 return process_attributes (file, "mspabi", SHT_MSP430_ATTRIBUTES,
14572 display_msp430x_attribute, NULL);
14573}
14574
ccb4c951
RS
14575/* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
14576 Print the Address, Access and Initial fields of an entry at VMA ADDR
82b1b41b
NC
14577 and return the VMA of the next entry, or -1 if there was a problem.
14578 Does not read from DATA_END or beyond. */
ccb4c951
RS
14579
14580static bfd_vma
82b1b41b
NC
14581print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
14582 unsigned char * data_end)
ccb4c951
RS
14583{
14584 printf (" ");
14585 print_vma (addr, LONG_HEX);
14586 printf (" ");
14587 if (addr < pltgot + 0xfff0)
14588 printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
14589 else
14590 printf ("%10s", "");
14591 printf (" ");
14592 if (data == NULL)
2b692964 14593 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
ccb4c951
RS
14594 else
14595 {
14596 bfd_vma entry;
82b1b41b 14597 unsigned char * from = data + addr - pltgot;
ccb4c951 14598
82b1b41b
NC
14599 if (from + (is_32bit_elf ? 4 : 8) > data_end)
14600 {
14601 warn (_("MIPS GOT entry extends beyond the end of available data\n"));
14602 printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
14603 return (bfd_vma) -1;
14604 }
14605 else
14606 {
14607 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14608 print_vma (entry, LONG_HEX);
14609 }
ccb4c951
RS
14610 }
14611 return addr + (is_32bit_elf ? 4 : 8);
14612}
14613
861fb55a
DJ
14614/* DATA points to the contents of a MIPS PLT GOT that starts at VMA
14615 PLTGOT. Print the Address and Initial fields of an entry at VMA
14616 ADDR and return the VMA of the next entry. */
14617
14618static bfd_vma
2cf0635d 14619print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
861fb55a
DJ
14620{
14621 printf (" ");
14622 print_vma (addr, LONG_HEX);
14623 printf (" ");
14624 if (data == NULL)
2b692964 14625 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
861fb55a
DJ
14626 else
14627 {
14628 bfd_vma entry;
14629
14630 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14631 print_vma (entry, LONG_HEX);
14632 }
14633 return addr + (is_32bit_elf ? 4 : 8);
14634}
14635
351cdf24
MF
14636static void
14637print_mips_ases (unsigned int mask)
14638{
14639 if (mask & AFL_ASE_DSP)
14640 fputs ("\n\tDSP ASE", stdout);
14641 if (mask & AFL_ASE_DSPR2)
14642 fputs ("\n\tDSP R2 ASE", stdout);
8f4f9071
MF
14643 if (mask & AFL_ASE_DSPR3)
14644 fputs ("\n\tDSP R3 ASE", stdout);
351cdf24
MF
14645 if (mask & AFL_ASE_EVA)
14646 fputs ("\n\tEnhanced VA Scheme", stdout);
14647 if (mask & AFL_ASE_MCU)
14648 fputs ("\n\tMCU (MicroController) ASE", stdout);
14649 if (mask & AFL_ASE_MDMX)
14650 fputs ("\n\tMDMX ASE", stdout);
14651 if (mask & AFL_ASE_MIPS3D)
14652 fputs ("\n\tMIPS-3D ASE", stdout);
14653 if (mask & AFL_ASE_MT)
14654 fputs ("\n\tMT ASE", stdout);
14655 if (mask & AFL_ASE_SMARTMIPS)
14656 fputs ("\n\tSmartMIPS ASE", stdout);
14657 if (mask & AFL_ASE_VIRT)
14658 fputs ("\n\tVZ ASE", stdout);
14659 if (mask & AFL_ASE_MSA)
14660 fputs ("\n\tMSA ASE", stdout);
14661 if (mask & AFL_ASE_MIPS16)
14662 fputs ("\n\tMIPS16 ASE", stdout);
14663 if (mask & AFL_ASE_MICROMIPS)
14664 fputs ("\n\tMICROMIPS ASE", stdout);
14665 if (mask & AFL_ASE_XPA)
14666 fputs ("\n\tXPA ASE", stdout);
14667 if (mask == 0)
14668 fprintf (stdout, "\n\t%s", _("None"));
00ac7aa0
MF
14669 else if ((mask & ~AFL_ASE_MASK) != 0)
14670 fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
351cdf24
MF
14671}
14672
14673static void
14674print_mips_isa_ext (unsigned int isa_ext)
14675{
14676 switch (isa_ext)
14677 {
14678 case 0:
14679 fputs (_("None"), stdout);
14680 break;
14681 case AFL_EXT_XLR:
14682 fputs ("RMI XLR", stdout);
14683 break;
2c629856
N
14684 case AFL_EXT_OCTEON3:
14685 fputs ("Cavium Networks Octeon3", stdout);
14686 break;
351cdf24
MF
14687 case AFL_EXT_OCTEON2:
14688 fputs ("Cavium Networks Octeon2", stdout);
14689 break;
14690 case AFL_EXT_OCTEONP:
14691 fputs ("Cavium Networks OcteonP", stdout);
14692 break;
14693 case AFL_EXT_LOONGSON_3A:
14694 fputs ("Loongson 3A", stdout);
14695 break;
14696 case AFL_EXT_OCTEON:
14697 fputs ("Cavium Networks Octeon", stdout);
14698 break;
14699 case AFL_EXT_5900:
14700 fputs ("Toshiba R5900", stdout);
14701 break;
14702 case AFL_EXT_4650:
14703 fputs ("MIPS R4650", stdout);
14704 break;
14705 case AFL_EXT_4010:
14706 fputs ("LSI R4010", stdout);
14707 break;
14708 case AFL_EXT_4100:
14709 fputs ("NEC VR4100", stdout);
14710 break;
14711 case AFL_EXT_3900:
14712 fputs ("Toshiba R3900", stdout);
14713 break;
14714 case AFL_EXT_10000:
14715 fputs ("MIPS R10000", stdout);
14716 break;
14717 case AFL_EXT_SB1:
14718 fputs ("Broadcom SB-1", stdout);
14719 break;
14720 case AFL_EXT_4111:
14721 fputs ("NEC VR4111/VR4181", stdout);
14722 break;
14723 case AFL_EXT_4120:
14724 fputs ("NEC VR4120", stdout);
14725 break;
14726 case AFL_EXT_5400:
14727 fputs ("NEC VR5400", stdout);
14728 break;
14729 case AFL_EXT_5500:
14730 fputs ("NEC VR5500", stdout);
14731 break;
14732 case AFL_EXT_LOONGSON_2E:
14733 fputs ("ST Microelectronics Loongson 2E", stdout);
14734 break;
14735 case AFL_EXT_LOONGSON_2F:
14736 fputs ("ST Microelectronics Loongson 2F", stdout);
14737 break;
14738 default:
00ac7aa0 14739 fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
351cdf24
MF
14740 }
14741}
14742
14743static int
14744get_mips_reg_size (int reg_size)
14745{
14746 return (reg_size == AFL_REG_NONE) ? 0
14747 : (reg_size == AFL_REG_32) ? 32
14748 : (reg_size == AFL_REG_64) ? 64
14749 : (reg_size == AFL_REG_128) ? 128
14750 : -1;
14751}
14752
19e6b90e 14753static int
2cf0635d 14754process_mips_specific (FILE * file)
5b18a4bc 14755{
2cf0635d 14756 Elf_Internal_Dyn * entry;
351cdf24 14757 Elf_Internal_Shdr *sect = NULL;
19e6b90e
L
14758 size_t liblist_offset = 0;
14759 size_t liblistno = 0;
14760 size_t conflictsno = 0;
14761 size_t options_offset = 0;
14762 size_t conflicts_offset = 0;
861fb55a
DJ
14763 size_t pltrelsz = 0;
14764 size_t pltrel = 0;
ccb4c951 14765 bfd_vma pltgot = 0;
861fb55a
DJ
14766 bfd_vma mips_pltgot = 0;
14767 bfd_vma jmprel = 0;
ccb4c951
RS
14768 bfd_vma local_gotno = 0;
14769 bfd_vma gotsym = 0;
14770 bfd_vma symtabno = 0;
103f02d3 14771
2cf19d5c
JM
14772 process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14773 display_mips_gnu_attribute);
14774
351cdf24
MF
14775 sect = find_section (".MIPS.abiflags");
14776
14777 if (sect != NULL)
14778 {
14779 Elf_External_ABIFlags_v0 *abiflags_ext;
14780 Elf_Internal_ABIFlags_v0 abiflags_in;
14781
14782 if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
14783 fputs ("\nCorrupt ABI Flags section.\n", stdout);
14784 else
14785 {
14786 abiflags_ext = get_data (NULL, file, sect->sh_offset, 1,
14787 sect->sh_size, _("MIPS ABI Flags section"));
14788 if (abiflags_ext)
14789 {
14790 abiflags_in.version = BYTE_GET (abiflags_ext->version);
14791 abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
14792 abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
14793 abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
14794 abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
14795 abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
14796 abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
14797 abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
14798 abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
14799 abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
14800 abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
14801
14802 printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
14803 printf ("\nISA: MIPS%d", abiflags_in.isa_level);
14804 if (abiflags_in.isa_rev > 1)
14805 printf ("r%d", abiflags_in.isa_rev);
14806 printf ("\nGPR size: %d",
14807 get_mips_reg_size (abiflags_in.gpr_size));
14808 printf ("\nCPR1 size: %d",
14809 get_mips_reg_size (abiflags_in.cpr1_size));
14810 printf ("\nCPR2 size: %d",
14811 get_mips_reg_size (abiflags_in.cpr2_size));
14812 fputs ("\nFP ABI: ", stdout);
14813 print_mips_fp_abi_value (abiflags_in.fp_abi);
14814 fputs ("ISA Extension: ", stdout);
14815 print_mips_isa_ext (abiflags_in.isa_ext);
14816 fputs ("\nASEs:", stdout);
14817 print_mips_ases (abiflags_in.ases);
14818 printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
14819 printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
14820 fputc ('\n', stdout);
14821 free (abiflags_ext);
14822 }
14823 }
14824 }
14825
19e6b90e
L
14826 /* We have a lot of special sections. Thanks SGI! */
14827 if (dynamic_section == NULL)
14828 /* No information available. */
14829 return 0;
252b5132 14830
071436c6
NC
14831 for (entry = dynamic_section;
14832 /* PR 17531 file: 012-50589-0.004. */
14833 entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
14834 ++entry)
252b5132
RH
14835 switch (entry->d_tag)
14836 {
14837 case DT_MIPS_LIBLIST:
d93f0186
NC
14838 liblist_offset
14839 = offset_from_vma (file, entry->d_un.d_val,
14840 liblistno * sizeof (Elf32_External_Lib));
252b5132
RH
14841 break;
14842 case DT_MIPS_LIBLISTNO:
14843 liblistno = entry->d_un.d_val;
14844 break;
14845 case DT_MIPS_OPTIONS:
d93f0186 14846 options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
252b5132
RH
14847 break;
14848 case DT_MIPS_CONFLICT:
d93f0186
NC
14849 conflicts_offset
14850 = offset_from_vma (file, entry->d_un.d_val,
14851 conflictsno * sizeof (Elf32_External_Conflict));
252b5132
RH
14852 break;
14853 case DT_MIPS_CONFLICTNO:
14854 conflictsno = entry->d_un.d_val;
14855 break;
ccb4c951 14856 case DT_PLTGOT:
861fb55a
DJ
14857 pltgot = entry->d_un.d_ptr;
14858 break;
ccb4c951
RS
14859 case DT_MIPS_LOCAL_GOTNO:
14860 local_gotno = entry->d_un.d_val;
14861 break;
14862 case DT_MIPS_GOTSYM:
14863 gotsym = entry->d_un.d_val;
14864 break;
14865 case DT_MIPS_SYMTABNO:
14866 symtabno = entry->d_un.d_val;
14867 break;
861fb55a
DJ
14868 case DT_MIPS_PLTGOT:
14869 mips_pltgot = entry->d_un.d_ptr;
14870 break;
14871 case DT_PLTREL:
14872 pltrel = entry->d_un.d_val;
14873 break;
14874 case DT_PLTRELSZ:
14875 pltrelsz = entry->d_un.d_val;
14876 break;
14877 case DT_JMPREL:
14878 jmprel = entry->d_un.d_ptr;
14879 break;
252b5132
RH
14880 default:
14881 break;
14882 }
14883
14884 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
14885 {
2cf0635d 14886 Elf32_External_Lib * elib;
252b5132
RH
14887 size_t cnt;
14888
3f5e193b
NC
14889 elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
14890 liblistno,
14891 sizeof (Elf32_External_Lib),
9cf03b7e 14892 _("liblist section data"));
a6e9f9df 14893 if (elib)
252b5132 14894 {
2b692964 14895 printf (_("\nSection '.liblist' contains %lu entries:\n"),
a6e9f9df 14896 (unsigned long) liblistno);
2b692964 14897 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
a6e9f9df
AM
14898 stdout);
14899
14900 for (cnt = 0; cnt < liblistno; ++cnt)
252b5132 14901 {
a6e9f9df 14902 Elf32_Lib liblist;
91d6fa6a 14903 time_t atime;
d5b07ef4 14904 char timebuf[128];
2cf0635d 14905 struct tm * tmp;
a6e9f9df
AM
14906
14907 liblist.l_name = BYTE_GET (elib[cnt].l_name);
91d6fa6a 14908 atime = BYTE_GET (elib[cnt].l_time_stamp);
a6e9f9df
AM
14909 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
14910 liblist.l_version = BYTE_GET (elib[cnt].l_version);
14911 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
14912
91d6fa6a 14913 tmp = gmtime (&atime);
e9e44622
JJ
14914 snprintf (timebuf, sizeof (timebuf),
14915 "%04u-%02u-%02uT%02u:%02u:%02u",
14916 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
14917 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
a6e9f9df 14918
31104126 14919 printf ("%3lu: ", (unsigned long) cnt);
d79b3d50
NC
14920 if (VALID_DYNAMIC_NAME (liblist.l_name))
14921 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
14922 else
2b692964 14923 printf (_("<corrupt: %9ld>"), liblist.l_name);
31104126
NC
14924 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
14925 liblist.l_version);
a6e9f9df
AM
14926
14927 if (liblist.l_flags == 0)
2b692964 14928 puts (_(" NONE"));
a6e9f9df
AM
14929 else
14930 {
14931 static const struct
252b5132 14932 {
2cf0635d 14933 const char * name;
a6e9f9df 14934 int bit;
252b5132 14935 }
a6e9f9df
AM
14936 l_flags_vals[] =
14937 {
14938 { " EXACT_MATCH", LL_EXACT_MATCH },
14939 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
14940 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
14941 { " EXPORTS", LL_EXPORTS },
14942 { " DELAY_LOAD", LL_DELAY_LOAD },
14943 { " DELTA", LL_DELTA }
14944 };
14945 int flags = liblist.l_flags;
14946 size_t fcnt;
14947
60bca95a 14948 for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
a6e9f9df
AM
14949 if ((flags & l_flags_vals[fcnt].bit) != 0)
14950 {
14951 fputs (l_flags_vals[fcnt].name, stdout);
14952 flags ^= l_flags_vals[fcnt].bit;
14953 }
14954 if (flags != 0)
14955 printf (" %#x", (unsigned int) flags);
252b5132 14956
a6e9f9df
AM
14957 puts ("");
14958 }
252b5132 14959 }
252b5132 14960
a6e9f9df
AM
14961 free (elib);
14962 }
252b5132
RH
14963 }
14964
14965 if (options_offset != 0)
14966 {
2cf0635d 14967 Elf_External_Options * eopt;
2cf0635d
NC
14968 Elf_Internal_Options * iopt;
14969 Elf_Internal_Options * option;
252b5132
RH
14970 size_t offset;
14971 int cnt;
351cdf24 14972 sect = section_headers;
252b5132
RH
14973
14974 /* Find the section header so that we get the size. */
071436c6 14975 sect = find_section_by_type (SHT_MIPS_OPTIONS);
948f632f 14976 /* PR 17533 file: 012-277276-0.004. */
071436c6
NC
14977 if (sect == NULL)
14978 {
14979 error (_("No MIPS_OPTIONS header found\n"));
14980 return 0;
14981 }
252b5132 14982
3f5e193b
NC
14983 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
14984 sect->sh_size, _("options"));
a6e9f9df 14985 if (eopt)
252b5132 14986 {
3f5e193b
NC
14987 iopt = (Elf_Internal_Options *)
14988 cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
a6e9f9df
AM
14989 if (iopt == NULL)
14990 {
fb324ee9 14991 error (_("Out of memory allocating space for MIPS options\n"));
a6e9f9df
AM
14992 return 0;
14993 }
76da6bbe 14994
a6e9f9df
AM
14995 offset = cnt = 0;
14996 option = iopt;
252b5132 14997
82b1b41b 14998 while (offset <= sect->sh_size - sizeof (* eopt))
a6e9f9df 14999 {
2cf0635d 15000 Elf_External_Options * eoption;
252b5132 15001
a6e9f9df 15002 eoption = (Elf_External_Options *) ((char *) eopt + offset);
252b5132 15003
a6e9f9df
AM
15004 option->kind = BYTE_GET (eoption->kind);
15005 option->size = BYTE_GET (eoption->size);
15006 option->section = BYTE_GET (eoption->section);
15007 option->info = BYTE_GET (eoption->info);
76da6bbe 15008
82b1b41b
NC
15009 /* PR 17531: file: ffa0fa3b. */
15010 if (option->size < sizeof (* eopt)
15011 || offset + option->size > sect->sh_size)
15012 {
55325047
NC
15013 error (_("Invalid size (%u) for MIPS option\n"), option->size);
15014 return 0;
82b1b41b 15015 }
a6e9f9df 15016 offset += option->size;
14ae95f2 15017
a6e9f9df
AM
15018 ++option;
15019 ++cnt;
15020 }
252b5132 15021
a6e9f9df 15022 printf (_("\nSection '%s' contains %d entries:\n"),
74e1a04b 15023 printable_section_name (sect), cnt);
76da6bbe 15024
a6e9f9df 15025 option = iopt;
82b1b41b 15026 offset = 0;
252b5132 15027
a6e9f9df 15028 while (cnt-- > 0)
252b5132 15029 {
a6e9f9df
AM
15030 size_t len;
15031
15032 switch (option->kind)
252b5132 15033 {
a6e9f9df
AM
15034 case ODK_NULL:
15035 /* This shouldn't happen. */
15036 printf (" NULL %d %lx", option->section, option->info);
15037 break;
15038 case ODK_REGINFO:
15039 printf (" REGINFO ");
15040 if (elf_header.e_machine == EM_MIPS)
15041 {
15042 /* 32bit form. */
2cf0635d 15043 Elf32_External_RegInfo * ereg;
b34976b6 15044 Elf32_RegInfo reginfo;
a6e9f9df
AM
15045
15046 ereg = (Elf32_External_RegInfo *) (option + 1);
15047 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
15048 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
15049 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
15050 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
15051 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
15052 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
15053
15054 printf ("GPR %08lx GP 0x%lx\n",
15055 reginfo.ri_gprmask,
15056 (unsigned long) reginfo.ri_gp_value);
15057 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
15058 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
15059 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
15060 }
15061 else
15062 {
15063 /* 64 bit form. */
2cf0635d 15064 Elf64_External_RegInfo * ereg;
a6e9f9df
AM
15065 Elf64_Internal_RegInfo reginfo;
15066
15067 ereg = (Elf64_External_RegInfo *) (option + 1);
15068 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
15069 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
15070 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
15071 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
15072 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
66543521 15073 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
a6e9f9df
AM
15074
15075 printf ("GPR %08lx GP 0x",
15076 reginfo.ri_gprmask);
15077 printf_vma (reginfo.ri_gp_value);
15078 printf ("\n");
15079
15080 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
15081 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
15082 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
15083 }
15084 ++option;
15085 continue;
15086 case ODK_EXCEPTIONS:
15087 fputs (" EXCEPTIONS fpe_min(", stdout);
15088 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
15089 fputs (") fpe_max(", stdout);
15090 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
15091 fputs (")", stdout);
15092
15093 if (option->info & OEX_PAGE0)
15094 fputs (" PAGE0", stdout);
15095 if (option->info & OEX_SMM)
15096 fputs (" SMM", stdout);
15097 if (option->info & OEX_FPDBUG)
15098 fputs (" FPDBUG", stdout);
15099 if (option->info & OEX_DISMISS)
15100 fputs (" DISMISS", stdout);
15101 break;
15102 case ODK_PAD:
15103 fputs (" PAD ", stdout);
15104 if (option->info & OPAD_PREFIX)
15105 fputs (" PREFIX", stdout);
15106 if (option->info & OPAD_POSTFIX)
15107 fputs (" POSTFIX", stdout);
15108 if (option->info & OPAD_SYMBOL)
15109 fputs (" SYMBOL", stdout);
15110 break;
15111 case ODK_HWPATCH:
15112 fputs (" HWPATCH ", stdout);
15113 if (option->info & OHW_R4KEOP)
15114 fputs (" R4KEOP", stdout);
15115 if (option->info & OHW_R8KPFETCH)
15116 fputs (" R8KPFETCH", stdout);
15117 if (option->info & OHW_R5KEOP)
15118 fputs (" R5KEOP", stdout);
15119 if (option->info & OHW_R5KCVTL)
15120 fputs (" R5KCVTL", stdout);
15121 break;
15122 case ODK_FILL:
15123 fputs (" FILL ", stdout);
15124 /* XXX Print content of info word? */
15125 break;
15126 case ODK_TAGS:
15127 fputs (" TAGS ", stdout);
15128 /* XXX Print content of info word? */
15129 break;
15130 case ODK_HWAND:
15131 fputs (" HWAND ", stdout);
15132 if (option->info & OHWA0_R4KEOP_CHECKED)
15133 fputs (" R4KEOP_CHECKED", stdout);
15134 if (option->info & OHWA0_R4KEOP_CLEAN)
15135 fputs (" R4KEOP_CLEAN", stdout);
15136 break;
15137 case ODK_HWOR:
15138 fputs (" HWOR ", stdout);
15139 if (option->info & OHWA0_R4KEOP_CHECKED)
15140 fputs (" R4KEOP_CHECKED", stdout);
15141 if (option->info & OHWA0_R4KEOP_CLEAN)
15142 fputs (" R4KEOP_CLEAN", stdout);
15143 break;
15144 case ODK_GP_GROUP:
15145 printf (" GP_GROUP %#06lx self-contained %#06lx",
15146 option->info & OGP_GROUP,
15147 (option->info & OGP_SELF) >> 16);
15148 break;
15149 case ODK_IDENT:
15150 printf (" IDENT %#06lx self-contained %#06lx",
15151 option->info & OGP_GROUP,
15152 (option->info & OGP_SELF) >> 16);
15153 break;
15154 default:
15155 /* This shouldn't happen. */
15156 printf (" %3d ??? %d %lx",
15157 option->kind, option->section, option->info);
15158 break;
252b5132 15159 }
a6e9f9df 15160
2cf0635d 15161 len = sizeof (* eopt);
a6e9f9df 15162 while (len < option->size)
82b1b41b 15163 {
7e27a9d5 15164 unsigned char datum = * ((unsigned char *) eopt + offset + len);
a6e9f9df 15165
82b1b41b
NC
15166 if (ISPRINT (datum))
15167 printf ("%c", datum);
15168 else
15169 printf ("\\%03o", datum);
15170 len ++;
15171 }
a6e9f9df 15172 fputs ("\n", stdout);
82b1b41b
NC
15173
15174 offset += option->size;
252b5132 15175 ++option;
252b5132
RH
15176 }
15177
a6e9f9df 15178 free (eopt);
252b5132 15179 }
252b5132
RH
15180 }
15181
15182 if (conflicts_offset != 0 && conflictsno != 0)
15183 {
2cf0635d 15184 Elf32_Conflict * iconf;
252b5132
RH
15185 size_t cnt;
15186
15187 if (dynamic_symbols == NULL)
15188 {
591a748a 15189 error (_("conflict list found without a dynamic symbol table\n"));
252b5132
RH
15190 return 0;
15191 }
15192
3f5e193b 15193 iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
252b5132
RH
15194 if (iconf == NULL)
15195 {
8b73c356 15196 error (_("Out of memory allocating space for dynamic conflicts\n"));
252b5132
RH
15197 return 0;
15198 }
15199
9ea033b2 15200 if (is_32bit_elf)
252b5132 15201 {
2cf0635d 15202 Elf32_External_Conflict * econf32;
a6e9f9df 15203
3f5e193b
NC
15204 econf32 = (Elf32_External_Conflict *)
15205 get_data (NULL, file, conflicts_offset, conflictsno,
15206 sizeof (* econf32), _("conflict"));
a6e9f9df
AM
15207 if (!econf32)
15208 return 0;
252b5132
RH
15209
15210 for (cnt = 0; cnt < conflictsno; ++cnt)
15211 iconf[cnt] = BYTE_GET (econf32[cnt]);
a6e9f9df
AM
15212
15213 free (econf32);
252b5132
RH
15214 }
15215 else
15216 {
2cf0635d 15217 Elf64_External_Conflict * econf64;
a6e9f9df 15218
3f5e193b
NC
15219 econf64 = (Elf64_External_Conflict *)
15220 get_data (NULL, file, conflicts_offset, conflictsno,
15221 sizeof (* econf64), _("conflict"));
a6e9f9df
AM
15222 if (!econf64)
15223 return 0;
252b5132
RH
15224
15225 for (cnt = 0; cnt < conflictsno; ++cnt)
15226 iconf[cnt] = BYTE_GET (econf64[cnt]);
a6e9f9df
AM
15227
15228 free (econf64);
252b5132
RH
15229 }
15230
c7e7ca54
NC
15231 printf (_("\nSection '.conflict' contains %lu entries:\n"),
15232 (unsigned long) conflictsno);
252b5132
RH
15233 puts (_(" Num: Index Value Name"));
15234
15235 for (cnt = 0; cnt < conflictsno; ++cnt)
15236 {
b34976b6 15237 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
e0a31db1
NC
15238
15239 if (iconf[cnt] >= num_dynamic_syms)
15240 printf (_("<corrupt symbol index>"));
d79b3d50 15241 else
e0a31db1
NC
15242 {
15243 Elf_Internal_Sym * psym;
15244
15245 psym = & dynamic_symbols[iconf[cnt]];
15246 print_vma (psym->st_value, FULL_HEX);
15247 putchar (' ');
15248 if (VALID_DYNAMIC_NAME (psym->st_name))
15249 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
15250 else
15251 printf (_("<corrupt: %14ld>"), psym->st_name);
15252 }
31104126 15253 putchar ('\n');
252b5132
RH
15254 }
15255
252b5132
RH
15256 free (iconf);
15257 }
15258
ccb4c951
RS
15259 if (pltgot != 0 && local_gotno != 0)
15260 {
91d6fa6a 15261 bfd_vma ent, local_end, global_end;
bbeee7ea 15262 size_t i, offset;
2cf0635d 15263 unsigned char * data;
82b1b41b 15264 unsigned char * data_end;
bbeee7ea 15265 int addr_size;
ccb4c951 15266
91d6fa6a 15267 ent = pltgot;
ccb4c951
RS
15268 addr_size = (is_32bit_elf ? 4 : 8);
15269 local_end = pltgot + local_gotno * addr_size;
ccb4c951 15270
74e1a04b
NC
15271 /* PR binutils/17533 file: 012-111227-0.004 */
15272 if (symtabno < gotsym)
15273 {
15274 error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
82b1b41b 15275 (unsigned long) gotsym, (unsigned long) symtabno);
74e1a04b
NC
15276 return 0;
15277 }
82b1b41b 15278
74e1a04b 15279 global_end = local_end + (symtabno - gotsym) * addr_size;
82b1b41b
NC
15280 /* PR 17531: file: 54c91a34. */
15281 if (global_end < local_end)
15282 {
15283 error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
15284 return 0;
15285 }
948f632f 15286
ccb4c951 15287 offset = offset_from_vma (file, pltgot, global_end - pltgot);
3f5e193b 15288 data = (unsigned char *) get_data (NULL, file, offset,
9cf03b7e
NC
15289 global_end - pltgot, 1,
15290 _("Global Offset Table data"));
59245841
NC
15291 if (data == NULL)
15292 return 0;
82b1b41b 15293 data_end = data + (global_end - pltgot);
59245841 15294
ccb4c951
RS
15295 printf (_("\nPrimary GOT:\n"));
15296 printf (_(" Canonical gp value: "));
15297 print_vma (pltgot + 0x7ff0, LONG_HEX);
15298 printf ("\n\n");
15299
15300 printf (_(" Reserved entries:\n"));
15301 printf (_(" %*s %10s %*s Purpose\n"),
2b692964
NC
15302 addr_size * 2, _("Address"), _("Access"),
15303 addr_size * 2, _("Initial"));
82b1b41b 15304 ent = print_mips_got_entry (data, pltgot, ent, data_end);
2b692964 15305 printf (_(" Lazy resolver\n"));
82b1b41b
NC
15306 if (ent == (bfd_vma) -1)
15307 goto got_print_fail;
ccb4c951 15308 if (data
91d6fa6a 15309 && (byte_get (data + ent - pltgot, addr_size)
ccb4c951
RS
15310 >> (addr_size * 8 - 1)) != 0)
15311 {
82b1b41b 15312 ent = print_mips_got_entry (data, pltgot, ent, data_end);
2b692964 15313 printf (_(" Module pointer (GNU extension)\n"));
82b1b41b
NC
15314 if (ent == (bfd_vma) -1)
15315 goto got_print_fail;
ccb4c951
RS
15316 }
15317 printf ("\n");
15318
91d6fa6a 15319 if (ent < local_end)
ccb4c951
RS
15320 {
15321 printf (_(" Local entries:\n"));
cc5914eb 15322 printf (" %*s %10s %*s\n",
2b692964
NC
15323 addr_size * 2, _("Address"), _("Access"),
15324 addr_size * 2, _("Initial"));
91d6fa6a 15325 while (ent < local_end)
ccb4c951 15326 {
82b1b41b 15327 ent = print_mips_got_entry (data, pltgot, ent, data_end);
ccb4c951 15328 printf ("\n");
82b1b41b
NC
15329 if (ent == (bfd_vma) -1)
15330 goto got_print_fail;
ccb4c951
RS
15331 }
15332 printf ("\n");
15333 }
15334
15335 if (gotsym < symtabno)
15336 {
15337 int sym_width;
15338
15339 printf (_(" Global entries:\n"));
cc5914eb 15340 printf (" %*s %10s %*s %*s %-7s %3s %s\n",
9cf03b7e
NC
15341 addr_size * 2, _("Address"),
15342 _("Access"),
2b692964 15343 addr_size * 2, _("Initial"),
9cf03b7e
NC
15344 addr_size * 2, _("Sym.Val."),
15345 _("Type"),
15346 /* Note for translators: "Ndx" = abbreviated form of "Index". */
15347 _("Ndx"), _("Name"));
0b4362b0 15348
ccb4c951 15349 sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
e0a31db1 15350
ccb4c951
RS
15351 for (i = gotsym; i < symtabno; i++)
15352 {
82b1b41b 15353 ent = print_mips_got_entry (data, pltgot, ent, data_end);
ccb4c951 15354 printf (" ");
e0a31db1
NC
15355
15356 if (dynamic_symbols == NULL)
15357 printf (_("<no dynamic symbols>"));
15358 else if (i < num_dynamic_syms)
15359 {
15360 Elf_Internal_Sym * psym = dynamic_symbols + i;
15361
15362 print_vma (psym->st_value, LONG_HEX);
15363 printf (" %-7s %3s ",
15364 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
15365 get_symbol_index_type (psym->st_shndx));
15366
15367 if (VALID_DYNAMIC_NAME (psym->st_name))
15368 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
15369 else
15370 printf (_("<corrupt: %14ld>"), psym->st_name);
15371 }
ccb4c951 15372 else
7fc5ac57
JBG
15373 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
15374 (unsigned long) i);
e0a31db1 15375
ccb4c951 15376 printf ("\n");
82b1b41b
NC
15377 if (ent == (bfd_vma) -1)
15378 break;
ccb4c951
RS
15379 }
15380 printf ("\n");
15381 }
15382
82b1b41b 15383 got_print_fail:
ccb4c951
RS
15384 if (data)
15385 free (data);
15386 }
15387
861fb55a
DJ
15388 if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
15389 {
91d6fa6a 15390 bfd_vma ent, end;
861fb55a
DJ
15391 size_t offset, rel_offset;
15392 unsigned long count, i;
2cf0635d 15393 unsigned char * data;
861fb55a 15394 int addr_size, sym_width;
2cf0635d 15395 Elf_Internal_Rela * rels;
861fb55a
DJ
15396
15397 rel_offset = offset_from_vma (file, jmprel, pltrelsz);
15398 if (pltrel == DT_RELA)
15399 {
15400 if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
15401 return 0;
15402 }
15403 else
15404 {
15405 if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
15406 return 0;
15407 }
15408
91d6fa6a 15409 ent = mips_pltgot;
861fb55a
DJ
15410 addr_size = (is_32bit_elf ? 4 : 8);
15411 end = mips_pltgot + (2 + count) * addr_size;
15412
15413 offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
3f5e193b 15414 data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
9cf03b7e 15415 1, _("Procedure Linkage Table data"));
59245841
NC
15416 if (data == NULL)
15417 return 0;
15418
9cf03b7e 15419 printf ("\nPLT GOT:\n\n");
861fb55a
DJ
15420 printf (_(" Reserved entries:\n"));
15421 printf (_(" %*s %*s Purpose\n"),
2b692964 15422 addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
91d6fa6a 15423 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
2b692964 15424 printf (_(" PLT lazy resolver\n"));
91d6fa6a 15425 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
2b692964 15426 printf (_(" Module pointer\n"));
861fb55a
DJ
15427 printf ("\n");
15428
15429 printf (_(" Entries:\n"));
cc5914eb 15430 printf (" %*s %*s %*s %-7s %3s %s\n",
2b692964
NC
15431 addr_size * 2, _("Address"),
15432 addr_size * 2, _("Initial"),
15433 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
861fb55a
DJ
15434 sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
15435 for (i = 0; i < count; i++)
15436 {
df97ab2a 15437 unsigned long idx = get_reloc_symindex (rels[i].r_info);
861fb55a 15438
91d6fa6a 15439 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
861fb55a 15440 printf (" ");
e0a31db1 15441
df97ab2a
MF
15442 if (idx >= num_dynamic_syms)
15443 printf (_("<corrupt symbol index: %lu>"), idx);
861fb55a 15444 else
e0a31db1 15445 {
df97ab2a 15446 Elf_Internal_Sym * psym = dynamic_symbols + idx;
e0a31db1
NC
15447
15448 print_vma (psym->st_value, LONG_HEX);
15449 printf (" %-7s %3s ",
15450 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
15451 get_symbol_index_type (psym->st_shndx));
15452 if (VALID_DYNAMIC_NAME (psym->st_name))
15453 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
15454 else
15455 printf (_("<corrupt: %14ld>"), psym->st_name);
15456 }
861fb55a
DJ
15457 printf ("\n");
15458 }
15459 printf ("\n");
15460
15461 if (data)
15462 free (data);
15463 free (rels);
15464 }
15465
252b5132
RH
15466 return 1;
15467}
15468
35c08157
KLC
15469static int
15470process_nds32_specific (FILE * file)
15471{
15472 Elf_Internal_Shdr *sect = NULL;
15473
15474 sect = find_section (".nds32_e_flags");
15475 if (sect != NULL)
15476 {
15477 unsigned int *flag;
15478
15479 printf ("\nNDS32 elf flags section:\n");
15480 flag = get_data (NULL, file, sect->sh_offset, 1,
15481 sect->sh_size, _("NDS32 elf flags section"));
15482
15483 switch ((*flag) & 0x3)
15484 {
15485 case 0:
15486 printf ("(VEC_SIZE):\tNo entry.\n");
15487 break;
15488 case 1:
15489 printf ("(VEC_SIZE):\t4 bytes\n");
15490 break;
15491 case 2:
15492 printf ("(VEC_SIZE):\t16 bytes\n");
15493 break;
15494 case 3:
15495 printf ("(VEC_SIZE):\treserved\n");
15496 break;
15497 }
15498 }
15499
15500 return TRUE;
15501}
15502
047b2264 15503static int
2cf0635d 15504process_gnu_liblist (FILE * file)
047b2264 15505{
2cf0635d
NC
15506 Elf_Internal_Shdr * section;
15507 Elf_Internal_Shdr * string_sec;
15508 Elf32_External_Lib * elib;
15509 char * strtab;
c256ffe7 15510 size_t strtab_size;
047b2264
JJ
15511 size_t cnt;
15512 unsigned i;
15513
15514 if (! do_arch)
15515 return 0;
15516
15517 for (i = 0, section = section_headers;
15518 i < elf_header.e_shnum;
b34976b6 15519 i++, section++)
047b2264
JJ
15520 {
15521 switch (section->sh_type)
15522 {
15523 case SHT_GNU_LIBLIST:
4fbb74a6 15524 if (section->sh_link >= elf_header.e_shnum)
c256ffe7
JJ
15525 break;
15526
3f5e193b
NC
15527 elib = (Elf32_External_Lib *)
15528 get_data (NULL, file, section->sh_offset, 1, section->sh_size,
9cf03b7e 15529 _("liblist section data"));
047b2264
JJ
15530
15531 if (elib == NULL)
15532 break;
4fbb74a6 15533 string_sec = section_headers + section->sh_link;
047b2264 15534
3f5e193b
NC
15535 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
15536 string_sec->sh_size,
15537 _("liblist string table"));
047b2264
JJ
15538 if (strtab == NULL
15539 || section->sh_entsize != sizeof (Elf32_External_Lib))
15540 {
15541 free (elib);
2842702f 15542 free (strtab);
047b2264
JJ
15543 break;
15544 }
59245841 15545 strtab_size = string_sec->sh_size;
047b2264
JJ
15546
15547 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
74e1a04b 15548 printable_section_name (section),
0af1713e 15549 (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
047b2264 15550
2b692964 15551 puts (_(" Library Time Stamp Checksum Version Flags"));
047b2264
JJ
15552
15553 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
15554 ++cnt)
15555 {
15556 Elf32_Lib liblist;
91d6fa6a 15557 time_t atime;
d5b07ef4 15558 char timebuf[128];
2cf0635d 15559 struct tm * tmp;
047b2264
JJ
15560
15561 liblist.l_name = BYTE_GET (elib[cnt].l_name);
91d6fa6a 15562 atime = BYTE_GET (elib[cnt].l_time_stamp);
047b2264
JJ
15563 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
15564 liblist.l_version = BYTE_GET (elib[cnt].l_version);
15565 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
15566
91d6fa6a 15567 tmp = gmtime (&atime);
e9e44622
JJ
15568 snprintf (timebuf, sizeof (timebuf),
15569 "%04u-%02u-%02uT%02u:%02u:%02u",
15570 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
15571 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
047b2264
JJ
15572
15573 printf ("%3lu: ", (unsigned long) cnt);
15574 if (do_wide)
c256ffe7 15575 printf ("%-20s", liblist.l_name < strtab_size
2b692964 15576 ? strtab + liblist.l_name : _("<corrupt>"));
047b2264 15577 else
c256ffe7 15578 printf ("%-20.20s", liblist.l_name < strtab_size
2b692964 15579 ? strtab + liblist.l_name : _("<corrupt>"));
047b2264
JJ
15580 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
15581 liblist.l_version, liblist.l_flags);
15582 }
15583
15584 free (elib);
2842702f 15585 free (strtab);
047b2264
JJ
15586 }
15587 }
15588
15589 return 1;
15590}
15591
9437c45b 15592static const char *
d3ba0551 15593get_note_type (unsigned e_type)
779fe533
NC
15594{
15595 static char buff[64];
103f02d3 15596
1ec5cd37
NC
15597 if (elf_header.e_type == ET_CORE)
15598 switch (e_type)
15599 {
57346661 15600 case NT_AUXV:
1ec5cd37 15601 return _("NT_AUXV (auxiliary vector)");
57346661 15602 case NT_PRSTATUS:
1ec5cd37 15603 return _("NT_PRSTATUS (prstatus structure)");
57346661 15604 case NT_FPREGSET:
1ec5cd37 15605 return _("NT_FPREGSET (floating point registers)");
57346661 15606 case NT_PRPSINFO:
1ec5cd37 15607 return _("NT_PRPSINFO (prpsinfo structure)");
57346661 15608 case NT_TASKSTRUCT:
1ec5cd37 15609 return _("NT_TASKSTRUCT (task structure)");
57346661 15610 case NT_PRXFPREG:
1ec5cd37 15611 return _("NT_PRXFPREG (user_xfpregs structure)");
e1e95dec
AM
15612 case NT_PPC_VMX:
15613 return _("NT_PPC_VMX (ppc Altivec registers)");
89eeb0bc
LM
15614 case NT_PPC_VSX:
15615 return _("NT_PPC_VSX (ppc VSX registers)");
ff826ef3
TT
15616 case NT_386_TLS:
15617 return _("NT_386_TLS (x86 TLS information)");
15618 case NT_386_IOPERM:
15619 return _("NT_386_IOPERM (x86 I/O permissions)");
4339cae0
L
15620 case NT_X86_XSTATE:
15621 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
0675e188
UW
15622 case NT_S390_HIGH_GPRS:
15623 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
d7eeb400
MS
15624 case NT_S390_TIMER:
15625 return _("NT_S390_TIMER (s390 timer register)");
15626 case NT_S390_TODCMP:
15627 return _("NT_S390_TODCMP (s390 TOD comparator register)");
15628 case NT_S390_TODPREG:
15629 return _("NT_S390_TODPREG (s390 TOD programmable register)");
15630 case NT_S390_CTRS:
15631 return _("NT_S390_CTRS (s390 control registers)");
15632 case NT_S390_PREFIX:
15633 return _("NT_S390_PREFIX (s390 prefix register)");
a367d729
AK
15634 case NT_S390_LAST_BREAK:
15635 return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
15636 case NT_S390_SYSTEM_CALL:
15637 return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
abb3f6cc
NC
15638 case NT_S390_TDB:
15639 return _("NT_S390_TDB (s390 transaction diagnostic block)");
4ef9f41a
AA
15640 case NT_S390_VXRS_LOW:
15641 return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
15642 case NT_S390_VXRS_HIGH:
15643 return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
faa9a424
UW
15644 case NT_ARM_VFP:
15645 return _("NT_ARM_VFP (arm VFP registers)");
652451f8
YZ
15646 case NT_ARM_TLS:
15647 return _("NT_ARM_TLS (AArch TLS registers)");
15648 case NT_ARM_HW_BREAK:
15649 return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
15650 case NT_ARM_HW_WATCH:
15651 return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
57346661 15652 case NT_PSTATUS:
1ec5cd37 15653 return _("NT_PSTATUS (pstatus structure)");
57346661 15654 case NT_FPREGS:
1ec5cd37 15655 return _("NT_FPREGS (floating point registers)");
57346661 15656 case NT_PSINFO:
1ec5cd37 15657 return _("NT_PSINFO (psinfo structure)");
57346661 15658 case NT_LWPSTATUS:
1ec5cd37 15659 return _("NT_LWPSTATUS (lwpstatus_t structure)");
57346661 15660 case NT_LWPSINFO:
1ec5cd37 15661 return _("NT_LWPSINFO (lwpsinfo_t structure)");
57346661 15662 case NT_WIN32PSTATUS:
1ec5cd37 15663 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
9ece1fa9
TT
15664 case NT_SIGINFO:
15665 return _("NT_SIGINFO (siginfo_t data)");
15666 case NT_FILE:
15667 return _("NT_FILE (mapped files)");
1ec5cd37
NC
15668 default:
15669 break;
15670 }
15671 else
15672 switch (e_type)
15673 {
15674 case NT_VERSION:
15675 return _("NT_VERSION (version)");
15676 case NT_ARCH:
15677 return _("NT_ARCH (architecture)");
15678 default:
15679 break;
15680 }
15681
e9e44622 15682 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
1ec5cd37 15683 return buff;
779fe533
NC
15684}
15685
9ece1fa9
TT
15686static int
15687print_core_note (Elf_Internal_Note *pnote)
15688{
15689 unsigned int addr_size = is_32bit_elf ? 4 : 8;
15690 bfd_vma count, page_size;
15691 unsigned char *descdata, *filenames, *descend;
15692
15693 if (pnote->type != NT_FILE)
15694 return 1;
15695
15696#ifndef BFD64
15697 if (!is_32bit_elf)
15698 {
15699 printf (_(" Cannot decode 64-bit note in 32-bit build\n"));
15700 /* Still "successful". */
15701 return 1;
15702 }
15703#endif
15704
15705 if (pnote->descsz < 2 * addr_size)
15706 {
15707 printf (_(" Malformed note - too short for header\n"));
15708 return 0;
15709 }
15710
15711 descdata = (unsigned char *) pnote->descdata;
15712 descend = descdata + pnote->descsz;
15713
15714 if (descdata[pnote->descsz - 1] != '\0')
15715 {
15716 printf (_(" Malformed note - does not end with \\0\n"));
15717 return 0;
15718 }
15719
15720 count = byte_get (descdata, addr_size);
15721 descdata += addr_size;
15722
15723 page_size = byte_get (descdata, addr_size);
15724 descdata += addr_size;
15725
15726 if (pnote->descsz < 2 * addr_size + count * 3 * addr_size)
15727 {
15728 printf (_(" Malformed note - too short for supplied file count\n"));
15729 return 0;
15730 }
15731
15732 printf (_(" Page size: "));
15733 print_vma (page_size, DEC);
15734 printf ("\n");
15735
15736 printf (_(" %*s%*s%*s\n"),
15737 (int) (2 + 2 * addr_size), _("Start"),
15738 (int) (4 + 2 * addr_size), _("End"),
15739 (int) (4 + 2 * addr_size), _("Page Offset"));
15740 filenames = descdata + count * 3 * addr_size;
595712bb 15741 while (count-- > 0)
9ece1fa9
TT
15742 {
15743 bfd_vma start, end, file_ofs;
15744
15745 if (filenames == descend)
15746 {
15747 printf (_(" Malformed note - filenames end too early\n"));
15748 return 0;
15749 }
15750
15751 start = byte_get (descdata, addr_size);
15752 descdata += addr_size;
15753 end = byte_get (descdata, addr_size);
15754 descdata += addr_size;
15755 file_ofs = byte_get (descdata, addr_size);
15756 descdata += addr_size;
15757
15758 printf (" ");
15759 print_vma (start, FULL_HEX);
15760 printf (" ");
15761 print_vma (end, FULL_HEX);
15762 printf (" ");
15763 print_vma (file_ofs, FULL_HEX);
15764 printf ("\n %s\n", filenames);
15765
15766 filenames += 1 + strlen ((char *) filenames);
15767 }
15768
15769 return 1;
15770}
15771
1118d252
RM
15772static const char *
15773get_gnu_elf_note_type (unsigned e_type)
15774{
1449284b 15775 /* NB/ Keep this switch statement in sync with print_gnu_note (). */
1118d252
RM
15776 switch (e_type)
15777 {
15778 case NT_GNU_ABI_TAG:
15779 return _("NT_GNU_ABI_TAG (ABI version tag)");
15780 case NT_GNU_HWCAP:
15781 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
15782 case NT_GNU_BUILD_ID:
15783 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
0297aed6
DM
15784 case NT_GNU_GOLD_VERSION:
15785 return _("NT_GNU_GOLD_VERSION (gold version)");
1118d252 15786 default:
1449284b
NC
15787 {
15788 static char buff[64];
1118d252 15789
1449284b
NC
15790 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15791 return buff;
15792 }
15793 }
1118d252
RM
15794}
15795
664f90a3
TT
15796static int
15797print_gnu_note (Elf_Internal_Note *pnote)
15798{
1449284b 15799 /* NB/ Keep this switch statement in sync with get_gnu_elf_note_type (). */
664f90a3
TT
15800 switch (pnote->type)
15801 {
15802 case NT_GNU_BUILD_ID:
15803 {
15804 unsigned long i;
15805
15806 printf (_(" Build ID: "));
15807 for (i = 0; i < pnote->descsz; ++i)
15808 printf ("%02x", pnote->descdata[i] & 0xff);
9cf03b7e 15809 printf ("\n");
664f90a3
TT
15810 }
15811 break;
15812
15813 case NT_GNU_ABI_TAG:
15814 {
15815 unsigned long os, major, minor, subminor;
15816 const char *osname;
15817
3102e897
NC
15818 /* PR 17531: file: 030-599401-0.004. */
15819 if (pnote->descsz < 16)
15820 {
15821 printf (_(" <corrupt GNU_ABI_TAG>\n"));
15822 break;
15823 }
15824
664f90a3
TT
15825 os = byte_get ((unsigned char *) pnote->descdata, 4);
15826 major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
15827 minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
15828 subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
15829
15830 switch (os)
15831 {
15832 case GNU_ABI_TAG_LINUX:
15833 osname = "Linux";
15834 break;
15835 case GNU_ABI_TAG_HURD:
15836 osname = "Hurd";
15837 break;
15838 case GNU_ABI_TAG_SOLARIS:
15839 osname = "Solaris";
15840 break;
15841 case GNU_ABI_TAG_FREEBSD:
15842 osname = "FreeBSD";
15843 break;
15844 case GNU_ABI_TAG_NETBSD:
15845 osname = "NetBSD";
15846 break;
14ae95f2
RM
15847 case GNU_ABI_TAG_SYLLABLE:
15848 osname = "Syllable";
15849 break;
15850 case GNU_ABI_TAG_NACL:
15851 osname = "NaCl";
15852 break;
664f90a3
TT
15853 default:
15854 osname = "Unknown";
15855 break;
15856 }
15857
15858 printf (_(" OS: %s, ABI: %ld.%ld.%ld\n"), osname,
15859 major, minor, subminor);
15860 }
15861 break;
926c5385
CC
15862
15863 case NT_GNU_GOLD_VERSION:
15864 {
15865 unsigned long i;
15866
15867 printf (_(" Version: "));
15868 for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
15869 printf ("%c", pnote->descdata[i]);
15870 printf ("\n");
15871 }
15872 break;
1449284b
NC
15873
15874 case NT_GNU_HWCAP:
15875 {
15876 unsigned long num_entries, mask;
15877
15878 /* Hardware capabilities information. Word 0 is the number of entries.
15879 Word 1 is a bitmask of enabled entries. The rest of the descriptor
15880 is a series of entries, where each entry is a single byte followed
15881 by a nul terminated string. The byte gives the bit number to test
15882 if enabled in the bitmask. */
15883 printf (_(" Hardware Capabilities: "));
15884 if (pnote->descsz < 8)
15885 {
15886 printf (_("<corrupt GNU_HWCAP>\n"));
15887 break;
15888 }
15889 num_entries = byte_get ((unsigned char *) pnote->descdata, 4);
15890 mask = byte_get ((unsigned char *) pnote->descdata + 4, 4);
15891 printf (_("num entries: %ld, enabled mask: %lx\n"), num_entries, mask);
15892 /* FIXME: Add code to display the entries... */
15893 }
15894 break;
15895
15896 default:
15897 /* Handle unrecognised types. An error message should have already been
15898 created by get_gnu_elf_note_type(), so all that we need to do is to
15899 display the data. */
15900 {
15901 unsigned long i;
15902
15903 printf (_(" Description data: "));
15904 for (i = 0; i < pnote->descsz; ++i)
15905 printf ("%02x ", pnote->descdata[i] & 0xff);
15906 printf ("\n");
15907 }
15908 break;
664f90a3
TT
15909 }
15910
15911 return 1;
15912}
15913
685080f2
NC
15914static const char *
15915get_v850_elf_note_type (enum v850_notes n_type)
15916{
15917 static char buff[64];
15918
15919 switch (n_type)
15920 {
15921 case V850_NOTE_ALIGNMENT: return _("Alignment of 8-byte objects");
15922 case V850_NOTE_DATA_SIZE: return _("Sizeof double and long double");
15923 case V850_NOTE_FPU_INFO: return _("Type of FPU support needed");
15924 case V850_NOTE_SIMD_INFO: return _("Use of SIMD instructions");
15925 case V850_NOTE_CACHE_INFO: return _("Use of cache");
15926 case V850_NOTE_MMU_INFO: return _("Use of MMU");
15927 default:
15928 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
15929 return buff;
15930 }
15931}
15932
15933static int
15934print_v850_note (Elf_Internal_Note * pnote)
15935{
15936 unsigned int val;
15937
15938 if (pnote->descsz != 4)
15939 return 0;
15940 val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
15941
15942 if (val == 0)
15943 {
15944 printf (_("not set\n"));
15945 return 1;
15946 }
15947
15948 switch (pnote->type)
15949 {
15950 case V850_NOTE_ALIGNMENT:
15951 switch (val)
15952 {
15953 case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return 1;
15954 case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return 1;
15955 }
15956 break;
14ae95f2 15957
685080f2
NC
15958 case V850_NOTE_DATA_SIZE:
15959 switch (val)
15960 {
15961 case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return 1;
15962 case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return 1;
15963 }
15964 break;
14ae95f2 15965
685080f2
NC
15966 case V850_NOTE_FPU_INFO:
15967 switch (val)
15968 {
15969 case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return 1;
15970 case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return 1;
15971 }
15972 break;
14ae95f2 15973
685080f2
NC
15974 case V850_NOTE_MMU_INFO:
15975 case V850_NOTE_CACHE_INFO:
15976 case V850_NOTE_SIMD_INFO:
15977 if (val == EF_RH850_SIMD)
15978 {
15979 printf (_("yes\n"));
15980 return 1;
15981 }
15982 break;
15983
15984 default:
15985 /* An 'unknown note type' message will already have been displayed. */
15986 break;
15987 }
15988
15989 printf (_("unknown value: %x\n"), val);
15990 return 0;
15991}
15992
15f205b1 15993static int
c6056a74
SF
15994process_netbsd_elf_note (Elf_Internal_Note * pnote)
15995{
15996 unsigned int version;
15997
15998 switch (pnote->type)
15999 {
16000 case NT_NETBSD_IDENT:
16001 version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
16002 if ((version / 10000) % 100)
16003 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
16004 version, version / 100000000, (version / 1000000) % 100,
16005 (version / 10000) % 100 > 26 ? "Z" : "",
15f205b1 16006 'A' + (version / 10000) % 26);
c6056a74
SF
16007 else
16008 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
16009 version, version / 100000000, (version / 1000000) % 100,
15f205b1 16010 (version / 100) % 100);
c6056a74
SF
16011 return 1;
16012
16013 case NT_NETBSD_MARCH:
16014 printf (" NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
16015 pnote->descdata);
16016 return 1;
16017
16018 default:
16019 break;
16020 }
16021
16022 printf (" NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
16023 pnote->type);
16024 return 1;
16025}
16026
f4ddf30f
JB
16027static const char *
16028get_freebsd_elfcore_note_type (unsigned e_type)
16029{
f4ddf30f
JB
16030 switch (e_type)
16031 {
16032 case NT_FREEBSD_THRMISC:
16033 return _("NT_THRMISC (thrmisc structure)");
16034 case NT_FREEBSD_PROCSTAT_PROC:
16035 return _("NT_PROCSTAT_PROC (proc data)");
16036 case NT_FREEBSD_PROCSTAT_FILES:
16037 return _("NT_PROCSTAT_FILES (files data)");
16038 case NT_FREEBSD_PROCSTAT_VMMAP:
16039 return _("NT_PROCSTAT_VMMAP (vmmap data)");
16040 case NT_FREEBSD_PROCSTAT_GROUPS:
16041 return _("NT_PROCSTAT_GROUPS (groups data)");
16042 case NT_FREEBSD_PROCSTAT_UMASK:
16043 return _("NT_PROCSTAT_UMASK (umask data)");
16044 case NT_FREEBSD_PROCSTAT_RLIMIT:
16045 return _("NT_PROCSTAT_RLIMIT (rlimit data)");
16046 case NT_FREEBSD_PROCSTAT_OSREL:
16047 return _("NT_PROCSTAT_OSREL (osreldate data)");
16048 case NT_FREEBSD_PROCSTAT_PSSTRINGS:
16049 return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
16050 case NT_FREEBSD_PROCSTAT_AUXV:
16051 return _("NT_PROCSTAT_AUXV (auxv data)");
16052 }
16053 return get_note_type (e_type);
16054}
16055
9437c45b 16056static const char *
d3ba0551 16057get_netbsd_elfcore_note_type (unsigned e_type)
9437c45b
JT
16058{
16059 static char buff[64];
16060
b4db1224 16061 if (e_type == NT_NETBSDCORE_PROCINFO)
9437c45b
JT
16062 {
16063 /* NetBSD core "procinfo" structure. */
16064 return _("NetBSD procinfo structure");
16065 }
16066
16067 /* As of Jan 2002 there are no other machine-independent notes
16068 defined for NetBSD core files. If the note type is less
16069 than the start of the machine-dependent note types, we don't
16070 understand it. */
16071
b4db1224 16072 if (e_type < NT_NETBSDCORE_FIRSTMACH)
9437c45b 16073 {
e9e44622 16074 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
9437c45b
JT
16075 return buff;
16076 }
16077
16078 switch (elf_header.e_machine)
16079 {
16080 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
16081 and PT_GETFPREGS == mach+2. */
16082
16083 case EM_OLD_ALPHA:
16084 case EM_ALPHA:
16085 case EM_SPARC:
16086 case EM_SPARC32PLUS:
16087 case EM_SPARCV9:
16088 switch (e_type)
16089 {
2b692964 16090 case NT_NETBSDCORE_FIRSTMACH + 0:
b4db1224 16091 return _("PT_GETREGS (reg structure)");
2b692964 16092 case NT_NETBSDCORE_FIRSTMACH + 2:
b4db1224 16093 return _("PT_GETFPREGS (fpreg structure)");
9437c45b
JT
16094 default:
16095 break;
16096 }
16097 break;
16098
16099 /* On all other arch's, PT_GETREGS == mach+1 and
16100 PT_GETFPREGS == mach+3. */
16101 default:
16102 switch (e_type)
16103 {
2b692964 16104 case NT_NETBSDCORE_FIRSTMACH + 1:
b4db1224 16105 return _("PT_GETREGS (reg structure)");
2b692964 16106 case NT_NETBSDCORE_FIRSTMACH + 3:
b4db1224 16107 return _("PT_GETFPREGS (fpreg structure)");
9437c45b
JT
16108 default:
16109 break;
16110 }
16111 }
16112
9cf03b7e 16113 snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
e9e44622 16114 e_type - NT_NETBSDCORE_FIRSTMACH);
9437c45b
JT
16115 return buff;
16116}
16117
70616151
TT
16118static const char *
16119get_stapsdt_note_type (unsigned e_type)
16120{
16121 static char buff[64];
16122
16123 switch (e_type)
16124 {
16125 case NT_STAPSDT:
16126 return _("NT_STAPSDT (SystemTap probe descriptors)");
16127
16128 default:
16129 break;
16130 }
16131
16132 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
16133 return buff;
16134}
16135
c6a9fc58
TT
16136static int
16137print_stapsdt_note (Elf_Internal_Note *pnote)
16138{
16139 int addr_size = is_32bit_elf ? 4 : 8;
16140 char *data = pnote->descdata;
16141 char *data_end = pnote->descdata + pnote->descsz;
16142 bfd_vma pc, base_addr, semaphore;
16143 char *provider, *probe, *arg_fmt;
16144
16145 pc = byte_get ((unsigned char *) data, addr_size);
16146 data += addr_size;
16147 base_addr = byte_get ((unsigned char *) data, addr_size);
16148 data += addr_size;
16149 semaphore = byte_get ((unsigned char *) data, addr_size);
16150 data += addr_size;
16151
16152 provider = data;
16153 data += strlen (data) + 1;
16154 probe = data;
16155 data += strlen (data) + 1;
16156 arg_fmt = data;
16157 data += strlen (data) + 1;
16158
16159 printf (_(" Provider: %s\n"), provider);
16160 printf (_(" Name: %s\n"), probe);
16161 printf (_(" Location: "));
16162 print_vma (pc, FULL_HEX);
16163 printf (_(", Base: "));
16164 print_vma (base_addr, FULL_HEX);
16165 printf (_(", Semaphore: "));
16166 print_vma (semaphore, FULL_HEX);
9cf03b7e 16167 printf ("\n");
c6a9fc58
TT
16168 printf (_(" Arguments: %s\n"), arg_fmt);
16169
16170 return data == data_end;
16171}
16172
00e98fc7
TG
16173static const char *
16174get_ia64_vms_note_type (unsigned e_type)
16175{
16176 static char buff[64];
16177
16178 switch (e_type)
16179 {
16180 case NT_VMS_MHD:
16181 return _("NT_VMS_MHD (module header)");
16182 case NT_VMS_LNM:
16183 return _("NT_VMS_LNM (language name)");
16184 case NT_VMS_SRC:
16185 return _("NT_VMS_SRC (source files)");
16186 case NT_VMS_TITLE:
9cf03b7e 16187 return "NT_VMS_TITLE";
00e98fc7
TG
16188 case NT_VMS_EIDC:
16189 return _("NT_VMS_EIDC (consistency check)");
16190 case NT_VMS_FPMODE:
16191 return _("NT_VMS_FPMODE (FP mode)");
16192 case NT_VMS_LINKTIME:
9cf03b7e 16193 return "NT_VMS_LINKTIME";
00e98fc7
TG
16194 case NT_VMS_IMGNAM:
16195 return _("NT_VMS_IMGNAM (image name)");
16196 case NT_VMS_IMGID:
16197 return _("NT_VMS_IMGID (image id)");
16198 case NT_VMS_LINKID:
16199 return _("NT_VMS_LINKID (link id)");
16200 case NT_VMS_IMGBID:
16201 return _("NT_VMS_IMGBID (build id)");
16202 case NT_VMS_GSTNAM:
16203 return _("NT_VMS_GSTNAM (sym table name)");
16204 case NT_VMS_ORIG_DYN:
9cf03b7e 16205 return "NT_VMS_ORIG_DYN";
00e98fc7 16206 case NT_VMS_PATCHTIME:
9cf03b7e 16207 return "NT_VMS_PATCHTIME";
00e98fc7
TG
16208 default:
16209 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
16210 return buff;
16211 }
16212}
16213
16214static int
16215print_ia64_vms_note (Elf_Internal_Note * pnote)
16216{
16217 switch (pnote->type)
16218 {
16219 case NT_VMS_MHD:
16220 if (pnote->descsz > 36)
16221 {
16222 size_t l = strlen (pnote->descdata + 34);
16223 printf (_(" Creation date : %.17s\n"), pnote->descdata);
16224 printf (_(" Last patch date: %.17s\n"), pnote->descdata + 17);
16225 printf (_(" Module name : %s\n"), pnote->descdata + 34);
16226 printf (_(" Module version : %s\n"), pnote->descdata + 34 + l + 1);
16227 }
16228 else
16229 printf (_(" Invalid size\n"));
16230 break;
16231 case NT_VMS_LNM:
16232 printf (_(" Language: %s\n"), pnote->descdata);
16233 break;
16234#ifdef BFD64
16235 case NT_VMS_FPMODE:
9cf03b7e 16236 printf (_(" Floating Point mode: "));
4a5cb34f 16237 printf ("0x%016" BFD_VMA_FMT "x\n",
948f632f 16238 (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
00e98fc7
TG
16239 break;
16240 case NT_VMS_LINKTIME:
16241 printf (_(" Link time: "));
16242 print_vms_time
16243 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
16244 printf ("\n");
16245 break;
16246 case NT_VMS_PATCHTIME:
16247 printf (_(" Patch time: "));
16248 print_vms_time
16249 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
16250 printf ("\n");
16251 break;
16252 case NT_VMS_ORIG_DYN:
16253 printf (_(" Major id: %u, minor id: %u\n"),
16254 (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
16255 (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
9cf03b7e 16256 printf (_(" Last modified : "));
00e98fc7
TG
16257 print_vms_time
16258 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
9cf03b7e 16259 printf (_("\n Link flags : "));
4a5cb34f 16260 printf ("0x%016" BFD_VMA_FMT "x\n",
948f632f 16261 (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
00e98fc7 16262 printf (_(" Header flags: 0x%08x\n"),
948f632f 16263 (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
00e98fc7
TG
16264 printf (_(" Image id : %s\n"), pnote->descdata + 32);
16265 break;
16266#endif
16267 case NT_VMS_IMGNAM:
16268 printf (_(" Image name: %s\n"), pnote->descdata);
16269 break;
16270 case NT_VMS_GSTNAM:
16271 printf (_(" Global symbol table name: %s\n"), pnote->descdata);
16272 break;
16273 case NT_VMS_IMGID:
16274 printf (_(" Image id: %s\n"), pnote->descdata);
16275 break;
16276 case NT_VMS_LINKID:
16277 printf (_(" Linker id: %s\n"), pnote->descdata);
16278 break;
16279 default:
16280 break;
16281 }
16282 return 1;
16283}
16284
6d118b09
NC
16285/* Note that by the ELF standard, the name field is already null byte
16286 terminated, and namesz includes the terminating null byte.
16287 I.E. the value of namesz for the name "FSF" is 4.
16288
e3c8793a 16289 If the value of namesz is zero, there is no name present. */
779fe533 16290static int
1449284b
NC
16291process_note (Elf_Internal_Note * pnote,
16292 FILE * file ATTRIBUTE_UNUSED,
16293 Elf_Internal_Shdr * section ATTRIBUTE_UNUSED)
779fe533 16294{
2cf0635d
NC
16295 const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
16296 const char * nt;
9437c45b
JT
16297
16298 if (pnote->namesz == 0)
1ec5cd37
NC
16299 /* If there is no note name, then use the default set of
16300 note type strings. */
16301 nt = get_note_type (pnote->type);
16302
1118d252
RM
16303 else if (const_strneq (pnote->namedata, "GNU"))
16304 /* GNU-specific object file notes. */
16305 nt = get_gnu_elf_note_type (pnote->type);
f4ddf30f
JB
16306
16307 else if (const_strneq (pnote->namedata, "FreeBSD"))
16308 /* FreeBSD-specific core file notes. */
16309 nt = get_freebsd_elfcore_note_type (pnote->type);
1118d252 16310
0112cd26 16311 else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
1ec5cd37
NC
16312 /* NetBSD-specific core file notes. */
16313 nt = get_netbsd_elfcore_note_type (pnote->type);
16314
c6056a74
SF
16315 else if (const_strneq (pnote->namedata, "NetBSD"))
16316 /* NetBSD-specific core file notes. */
16317 return process_netbsd_elf_note (pnote);
16318
b15fa79e
AM
16319 else if (strneq (pnote->namedata, "SPU/", 4))
16320 {
16321 /* SPU-specific core file notes. */
16322 nt = pnote->namedata + 4;
16323 name = "SPU";
16324 }
16325
00e98fc7
TG
16326 else if (const_strneq (pnote->namedata, "IPF/VMS"))
16327 /* VMS/ia64-specific file notes. */
16328 nt = get_ia64_vms_note_type (pnote->type);
16329
70616151
TT
16330 else if (const_strneq (pnote->namedata, "stapsdt"))
16331 nt = get_stapsdt_note_type (pnote->type);
16332
9437c45b 16333 else
1ec5cd37
NC
16334 /* Don't recognize this note name; just use the default set of
16335 note type strings. */
00e98fc7 16336 nt = get_note_type (pnote->type);
9437c45b 16337
1449284b
NC
16338 printf (" ");
16339 print_symbol (-20, name);
16340 printf (" 0x%08lx\t%s\n", pnote->descsz, nt);
00e98fc7
TG
16341
16342 if (const_strneq (pnote->namedata, "IPF/VMS"))
16343 return print_ia64_vms_note (pnote);
664f90a3
TT
16344 else if (const_strneq (pnote->namedata, "GNU"))
16345 return print_gnu_note (pnote);
c6a9fc58
TT
16346 else if (const_strneq (pnote->namedata, "stapsdt"))
16347 return print_stapsdt_note (pnote);
9ece1fa9
TT
16348 else if (const_strneq (pnote->namedata, "CORE"))
16349 return print_core_note (pnote);
779fe533 16350
1449284b
NC
16351 else if (pnote->descsz)
16352 {
16353 unsigned long i;
16354
16355 printf (_(" description data: "));
16356 for (i = 0; i < pnote->descsz; i++)
16357 printf ("%02x ", pnote->descdata[i]);
16358 printf ("\n");
16359 }
16360
16361 return 1;
16362}
6d118b09 16363
779fe533 16364static int
1449284b
NC
16365process_notes_at (FILE * file,
16366 Elf_Internal_Shdr * section,
16367 bfd_vma offset,
16368 bfd_vma length)
779fe533 16369{
2cf0635d
NC
16370 Elf_External_Note * pnotes;
16371 Elf_External_Note * external;
c8071705 16372 char * end;
b34976b6 16373 int res = 1;
103f02d3 16374
779fe533
NC
16375 if (length <= 0)
16376 return 0;
103f02d3 16377
1449284b
NC
16378 if (section)
16379 {
16380 pnotes = (Elf_External_Note *) get_section_contents (section, file);
16381 if (pnotes)
16382 apply_relocations (file, section, (unsigned char *) pnotes, length, NULL, NULL);
16383 }
16384 else
16385 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
16386 _("notes"));
dd24e3da 16387 if (pnotes == NULL)
a6e9f9df 16388 return 0;
779fe533 16389
103f02d3 16390 external = pnotes;
103f02d3 16391
1449284b
NC
16392 if (section)
16393 printf (_("\nDisplaying notes found in: %s\n"), printable_section_name (section));
16394 else
16395 printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
16396 (unsigned long) offset, (unsigned long) length);
16397
2aee03ae 16398 printf (_(" %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
103f02d3 16399
c8071705
NC
16400 end = (char *) pnotes + length;
16401 while ((char *) external < end)
779fe533 16402 {
b34976b6 16403 Elf_Internal_Note inote;
15b42fb0
AM
16404 size_t min_notesz;
16405 char *next;
2cf0635d 16406 char * temp = NULL;
c8071705 16407 size_t data_remaining = end - (char *) external;
6d118b09 16408
00e98fc7 16409 if (!is_ia64_vms ())
15b42fb0 16410 {
9dd3a467
NC
16411 /* PR binutils/15191
16412 Make sure that there is enough data to read. */
15b42fb0
AM
16413 min_notesz = offsetof (Elf_External_Note, name);
16414 if (data_remaining < min_notesz)
9dd3a467
NC
16415 {
16416 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
16417 (int) data_remaining);
16418 break;
16419 }
15b42fb0
AM
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);
834f871c 16425 /* PR 17531: file: 3443835e. */
c8071705 16426 if (inote.descdata < (char *) pnotes || inote.descdata > end)
834f871c
NC
16427 {
16428 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
16429 inote.descdata = inote.namedata;
16430 inote.namesz = 0;
16431 }
14ae95f2 16432
15b42fb0
AM
16433 inote.descpos = offset + (inote.descdata - (char *) pnotes);
16434 next = inote.descdata + align_power (inote.descsz, 2);
16435 }
00e98fc7 16436 else
15b42fb0
AM
16437 {
16438 Elf64_External_VMS_Note *vms_external;
00e98fc7 16439
9dd3a467
NC
16440 /* PR binutils/15191
16441 Make sure that there is enough data to read. */
15b42fb0
AM
16442 min_notesz = offsetof (Elf64_External_VMS_Note, name);
16443 if (data_remaining < min_notesz)
9dd3a467
NC
16444 {
16445 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
16446 (int) data_remaining);
16447 break;
16448 }
3e55a963 16449
15b42fb0
AM
16450 vms_external = (Elf64_External_VMS_Note *) external;
16451 inote.type = BYTE_GET (vms_external->type);
16452 inote.namesz = BYTE_GET (vms_external->namesz);
16453 inote.namedata = vms_external->name;
16454 inote.descsz = BYTE_GET (vms_external->descsz);
16455 inote.descdata = inote.namedata + align_power (inote.namesz, 3);
16456 inote.descpos = offset + (inote.descdata - (char *) pnotes);
16457 next = inote.descdata + align_power (inote.descsz, 3);
16458 }
16459
16460 if (inote.descdata < (char *) external + min_notesz
16461 || next < (char *) external + min_notesz
5d921cbd
NC
16462 /* PR binutils/17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4. */
16463 || inote.namedata + inote.namesz < inote.namedata
16464 || inote.descdata + inote.descsz < inote.descdata
15b42fb0 16465 || data_remaining < (size_t)(next - (char *) external))
3e55a963 16466 {
15b42fb0 16467 warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
0af1713e 16468 (unsigned long) ((char *) external - (char *) pnotes));
9dd3a467 16469 warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
3e55a963
NC
16470 inote.type, inote.namesz, inote.descsz);
16471 break;
16472 }
16473
15b42fb0 16474 external = (Elf_External_Note *) next;
dd24e3da 16475
6d118b09
NC
16476 /* Verify that name is null terminated. It appears that at least
16477 one version of Linux (RedHat 6.0) generates corefiles that don't
16478 comply with the ELF spec by failing to include the null byte in
16479 namesz. */
8b971f9f 16480 if (inote.namedata[inote.namesz - 1] != '\0')
6d118b09 16481 {
3f5e193b 16482 temp = (char *) malloc (inote.namesz + 1);
6d118b09
NC
16483 if (temp == NULL)
16484 {
8b73c356 16485 error (_("Out of memory allocating space for inote name\n"));
6d118b09
NC
16486 res = 0;
16487 break;
16488 }
76da6bbe 16489
6d118b09
NC
16490 strncpy (temp, inote.namedata, inote.namesz);
16491 temp[inote.namesz] = 0;
76da6bbe 16492
6d118b09
NC
16493 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
16494 inote.namedata = temp;
16495 }
16496
1449284b 16497 res &= process_note (& inote, file, section);
103f02d3 16498
6d118b09
NC
16499 if (temp != NULL)
16500 {
16501 free (temp);
16502 temp = NULL;
16503 }
779fe533
NC
16504 }
16505
16506 free (pnotes);
103f02d3 16507
779fe533
NC
16508 return res;
16509}
16510
16511static int
2cf0635d 16512process_corefile_note_segments (FILE * file)
779fe533 16513{
2cf0635d 16514 Elf_Internal_Phdr * segment;
b34976b6
AM
16515 unsigned int i;
16516 int res = 1;
103f02d3 16517
d93f0186 16518 if (! get_program_headers (file))
779fe533 16519 return 0;
103f02d3 16520
779fe533
NC
16521 for (i = 0, segment = program_headers;
16522 i < elf_header.e_phnum;
b34976b6 16523 i++, segment++)
779fe533
NC
16524 {
16525 if (segment->p_type == PT_NOTE)
1449284b
NC
16526 res &= process_notes_at (file, NULL,
16527 (bfd_vma) segment->p_offset,
16528 (bfd_vma) segment->p_filesz);
779fe533 16529 }
103f02d3 16530
779fe533
NC
16531 return res;
16532}
16533
685080f2
NC
16534static int
16535process_v850_notes (FILE * file, bfd_vma offset, bfd_vma length)
16536{
16537 Elf_External_Note * pnotes;
16538 Elf_External_Note * external;
c8071705 16539 char * end;
685080f2
NC
16540 int res = 1;
16541
16542 if (length <= 0)
16543 return 0;
16544
16545 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
16546 _("v850 notes"));
16547 if (pnotes == NULL)
16548 return 0;
16549
16550 external = pnotes;
c8071705 16551 end = (char*) pnotes + length;
685080f2
NC
16552
16553 printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
16554 (unsigned long) offset, (unsigned long) length);
16555
c8071705 16556 while ((char *) external + sizeof (Elf_External_Note) < end)
685080f2
NC
16557 {
16558 Elf_External_Note * next;
16559 Elf_Internal_Note inote;
16560
16561 inote.type = BYTE_GET (external->type);
16562 inote.namesz = BYTE_GET (external->namesz);
16563 inote.namedata = external->name;
16564 inote.descsz = BYTE_GET (external->descsz);
16565 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
16566 inote.descpos = offset + (inote.descdata - (char *) pnotes);
16567
c8071705
NC
16568 if (inote.descdata < (char *) pnotes || inote.descdata >= end)
16569 {
16570 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
16571 inote.descdata = inote.namedata;
16572 inote.namesz = 0;
16573 }
16574
685080f2
NC
16575 next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
16576
c8071705 16577 if ( ((char *) next > end)
685080f2
NC
16578 || ((char *) next < (char *) pnotes))
16579 {
16580 warn (_("corrupt descsz found in note at offset 0x%lx\n"),
16581 (unsigned long) ((char *) external - (char *) pnotes));
16582 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
16583 inote.type, inote.namesz, inote.descsz);
16584 break;
16585 }
16586
16587 external = next;
16588
16589 /* Prevent out-of-bounds indexing. */
c8071705 16590 if ( inote.namedata + inote.namesz > end
685080f2
NC
16591 || inote.namedata + inote.namesz < inote.namedata)
16592 {
16593 warn (_("corrupt namesz found in note at offset 0x%lx\n"),
16594 (unsigned long) ((char *) external - (char *) pnotes));
16595 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
16596 inote.type, inote.namesz, inote.descsz);
16597 break;
16598 }
16599
16600 printf (" %s: ", get_v850_elf_note_type (inote.type));
16601
16602 if (! print_v850_note (& inote))
16603 {
16604 res = 0;
16605 printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
16606 inote.namesz, inote.descsz);
16607 }
16608 }
16609
16610 free (pnotes);
16611
16612 return res;
16613}
16614
779fe533 16615static int
2cf0635d 16616process_note_sections (FILE * file)
1ec5cd37 16617{
2cf0635d 16618 Elf_Internal_Shdr * section;
1ec5cd37 16619 unsigned long i;
df565f32 16620 int n = 0;
1ec5cd37
NC
16621 int res = 1;
16622
16623 for (i = 0, section = section_headers;
fa1908fd 16624 i < elf_header.e_shnum && section != NULL;
1ec5cd37 16625 i++, section++)
685080f2
NC
16626 {
16627 if (section->sh_type == SHT_NOTE)
16628 {
1449284b
NC
16629 res &= process_notes_at (file, section,
16630 (bfd_vma) section->sh_offset,
16631 (bfd_vma) section->sh_size);
685080f2
NC
16632 n++;
16633 }
16634
16635 if (( elf_header.e_machine == EM_V800
16636 || elf_header.e_machine == EM_V850
16637 || elf_header.e_machine == EM_CYGNUS_V850)
16638 && section->sh_type == SHT_RENESAS_INFO)
16639 {
16640 res &= process_v850_notes (file,
16641 (bfd_vma) section->sh_offset,
16642 (bfd_vma) section->sh_size);
16643 n++;
16644 }
16645 }
df565f32
NC
16646
16647 if (n == 0)
16648 /* Try processing NOTE segments instead. */
16649 return process_corefile_note_segments (file);
1ec5cd37
NC
16650
16651 return res;
16652}
16653
16654static int
2cf0635d 16655process_notes (FILE * file)
779fe533
NC
16656{
16657 /* If we have not been asked to display the notes then do nothing. */
16658 if (! do_notes)
16659 return 1;
103f02d3 16660
779fe533 16661 if (elf_header.e_type != ET_CORE)
1ec5cd37 16662 return process_note_sections (file);
103f02d3 16663
779fe533 16664 /* No program headers means no NOTE segment. */
1ec5cd37
NC
16665 if (elf_header.e_phnum > 0)
16666 return process_corefile_note_segments (file);
779fe533 16667
1ec5cd37
NC
16668 printf (_("No note segments present in the core file.\n"));
16669 return 1;
779fe533
NC
16670}
16671
252b5132 16672static int
2cf0635d 16673process_arch_specific (FILE * file)
252b5132 16674{
a952a375
NC
16675 if (! do_arch)
16676 return 1;
16677
252b5132
RH
16678 switch (elf_header.e_machine)
16679 {
11c1ff18
PB
16680 case EM_ARM:
16681 return process_arm_specific (file);
252b5132 16682 case EM_MIPS:
4fe85591 16683 case EM_MIPS_RS3_LE:
252b5132
RH
16684 return process_mips_specific (file);
16685 break;
35c08157
KLC
16686 case EM_NDS32:
16687 return process_nds32_specific (file);
16688 break;
34c8bcba 16689 case EM_PPC:
b82317dd 16690 case EM_PPC64:
34c8bcba
JM
16691 return process_power_specific (file);
16692 break;
643f7afb
AK
16693 case EM_S390:
16694 case EM_S390_OLD:
16695 return process_s390_specific (file);
16696 break;
9e8c70f9
DM
16697 case EM_SPARC:
16698 case EM_SPARC32PLUS:
16699 case EM_SPARCV9:
16700 return process_sparc_specific (file);
16701 break;
59e6276b
JM
16702 case EM_TI_C6000:
16703 return process_tic6x_specific (file);
16704 break;
13761a11
NC
16705 case EM_MSP430:
16706 return process_msp430x_specific (file);
252b5132
RH
16707 default:
16708 break;
16709 }
16710 return 1;
16711}
16712
16713static int
2cf0635d 16714get_file_header (FILE * file)
252b5132 16715{
9ea033b2
NC
16716 /* Read in the identity array. */
16717 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
252b5132
RH
16718 return 0;
16719
9ea033b2 16720 /* Determine how to read the rest of the header. */
b34976b6 16721 switch (elf_header.e_ident[EI_DATA])
9ea033b2 16722 {
1a0670f3
AM
16723 default:
16724 case ELFDATANONE:
adab8cdc
AO
16725 case ELFDATA2LSB:
16726 byte_get = byte_get_little_endian;
16727 byte_put = byte_put_little_endian;
16728 break;
16729 case ELFDATA2MSB:
16730 byte_get = byte_get_big_endian;
16731 byte_put = byte_put_big_endian;
16732 break;
9ea033b2
NC
16733 }
16734
16735 /* For now we only support 32 bit and 64 bit ELF files. */
b34976b6 16736 is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
9ea033b2
NC
16737
16738 /* Read in the rest of the header. */
16739 if (is_32bit_elf)
16740 {
16741 Elf32_External_Ehdr ehdr32;
252b5132 16742
9ea033b2
NC
16743 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
16744 return 0;
103f02d3 16745
9ea033b2
NC
16746 elf_header.e_type = BYTE_GET (ehdr32.e_type);
16747 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
16748 elf_header.e_version = BYTE_GET (ehdr32.e_version);
16749 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
16750 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
16751 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
16752 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
16753 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
16754 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
16755 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
16756 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
16757 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
16758 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
16759 }
252b5132 16760 else
9ea033b2
NC
16761 {
16762 Elf64_External_Ehdr ehdr64;
a952a375
NC
16763
16764 /* If we have been compiled with sizeof (bfd_vma) == 4, then
16765 we will not be able to cope with the 64bit data found in
16766 64 ELF files. Detect this now and abort before we start
50c2245b 16767 overwriting things. */
a952a375
NC
16768 if (sizeof (bfd_vma) < 8)
16769 {
e3c8793a
NC
16770 error (_("This instance of readelf has been built without support for a\n\
1677164 bit data type and so it cannot read 64 bit ELF files.\n"));
a952a375
NC
16772 return 0;
16773 }
103f02d3 16774
9ea033b2
NC
16775 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
16776 return 0;
103f02d3 16777
9ea033b2
NC
16778 elf_header.e_type = BYTE_GET (ehdr64.e_type);
16779 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
16780 elf_header.e_version = BYTE_GET (ehdr64.e_version);
66543521
AM
16781 elf_header.e_entry = BYTE_GET (ehdr64.e_entry);
16782 elf_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
16783 elf_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
9ea033b2
NC
16784 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
16785 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
16786 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
16787 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
16788 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
16789 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
16790 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
16791 }
252b5132 16792
7ece0d85
JJ
16793 if (elf_header.e_shoff)
16794 {
16795 /* There may be some extensions in the first section header. Don't
16796 bomb if we can't read it. */
16797 if (is_32bit_elf)
049b0c3a 16798 get_32bit_section_headers (file, TRUE);
7ece0d85 16799 else
049b0c3a 16800 get_64bit_section_headers (file, TRUE);
7ece0d85 16801 }
560f3c1c 16802
252b5132
RH
16803 return 1;
16804}
16805
fb52b2f4
NC
16806/* Process one ELF object file according to the command line options.
16807 This file may actually be stored in an archive. The file is
16808 positioned at the start of the ELF object. */
16809
ff78d6d6 16810static int
2cf0635d 16811process_object (char * file_name, FILE * file)
252b5132 16812{
252b5132
RH
16813 unsigned int i;
16814
252b5132
RH
16815 if (! get_file_header (file))
16816 {
16817 error (_("%s: Failed to read file header\n"), file_name);
ff78d6d6 16818 return 1;
252b5132
RH
16819 }
16820
16821 /* Initialise per file variables. */
60bca95a 16822 for (i = ARRAY_SIZE (version_info); i--;)
252b5132
RH
16823 version_info[i] = 0;
16824
60bca95a 16825 for (i = ARRAY_SIZE (dynamic_info); i--;)
252b5132 16826 dynamic_info[i] = 0;
5115b233 16827 dynamic_info_DT_GNU_HASH = 0;
252b5132
RH
16828
16829 /* Process the file. */
16830 if (show_name)
16831 printf (_("\nFile: %s\n"), file_name);
16832
18bd398b
NC
16833 /* Initialise the dump_sects array from the cmdline_dump_sects array.
16834 Note we do this even if cmdline_dump_sects is empty because we
16835 must make sure that the dump_sets array is zeroed out before each
16836 object file is processed. */
16837 if (num_dump_sects > num_cmdline_dump_sects)
09c11c86 16838 memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
18bd398b
NC
16839
16840 if (num_cmdline_dump_sects > 0)
16841 {
16842 if (num_dump_sects == 0)
16843 /* A sneaky way of allocating the dump_sects array. */
09c11c86 16844 request_dump_bynumber (num_cmdline_dump_sects, 0);
18bd398b
NC
16845
16846 assert (num_dump_sects >= num_cmdline_dump_sects);
09c11c86
NC
16847 memcpy (dump_sects, cmdline_dump_sects,
16848 num_cmdline_dump_sects * sizeof (* dump_sects));
18bd398b 16849 }
d70c5fc7 16850
252b5132 16851 if (! process_file_header ())
fb52b2f4 16852 return 1;
252b5132 16853
d1f5c6e3 16854 if (! process_section_headers (file))
2f62977e 16855 {
d1f5c6e3
L
16856 /* Without loaded section headers we cannot process lots of
16857 things. */
2f62977e 16858 do_unwind = do_version = do_dump = do_arch = 0;
252b5132 16859
2f62977e 16860 if (! do_using_dynamic)
2c610e4b 16861 do_syms = do_dyn_syms = do_reloc = 0;
2f62977e 16862 }
252b5132 16863
d1f5c6e3
L
16864 if (! process_section_groups (file))
16865 {
16866 /* Without loaded section groups we cannot process unwind. */
16867 do_unwind = 0;
16868 }
16869
2f62977e 16870 if (process_program_headers (file))
b2d38a17 16871 process_dynamic_section (file);
252b5132
RH
16872
16873 process_relocs (file);
16874
4d6ed7c8
NC
16875 process_unwind (file);
16876
252b5132
RH
16877 process_symbol_table (file);
16878
16879 process_syminfo (file);
16880
16881 process_version_sections (file);
16882
16883 process_section_contents (file);
f5842774 16884
1ec5cd37 16885 process_notes (file);
103f02d3 16886
047b2264
JJ
16887 process_gnu_liblist (file);
16888
252b5132
RH
16889 process_arch_specific (file);
16890
d93f0186
NC
16891 if (program_headers)
16892 {
16893 free (program_headers);
16894 program_headers = NULL;
16895 }
16896
252b5132
RH
16897 if (section_headers)
16898 {
16899 free (section_headers);
16900 section_headers = NULL;
16901 }
16902
16903 if (string_table)
16904 {
16905 free (string_table);
16906 string_table = NULL;
d40ac9bd 16907 string_table_length = 0;
252b5132
RH
16908 }
16909
16910 if (dynamic_strings)
16911 {
16912 free (dynamic_strings);
16913 dynamic_strings = NULL;
d79b3d50 16914 dynamic_strings_length = 0;
252b5132
RH
16915 }
16916
16917 if (dynamic_symbols)
16918 {
16919 free (dynamic_symbols);
16920 dynamic_symbols = NULL;
19936277 16921 num_dynamic_syms = 0;
252b5132
RH
16922 }
16923
16924 if (dynamic_syminfo)
16925 {
16926 free (dynamic_syminfo);
16927 dynamic_syminfo = NULL;
16928 }
ff78d6d6 16929
293c573e
MR
16930 if (dynamic_section)
16931 {
16932 free (dynamic_section);
16933 dynamic_section = NULL;
16934 }
16935
e4b17d5c
L
16936 if (section_headers_groups)
16937 {
16938 free (section_headers_groups);
16939 section_headers_groups = NULL;
16940 }
16941
16942 if (section_groups)
16943 {
2cf0635d
NC
16944 struct group_list * g;
16945 struct group_list * next;
e4b17d5c
L
16946
16947 for (i = 0; i < group_count; i++)
16948 {
16949 for (g = section_groups [i].root; g != NULL; g = next)
16950 {
16951 next = g->next;
16952 free (g);
16953 }
16954 }
16955
16956 free (section_groups);
16957 section_groups = NULL;
16958 }
16959
19e6b90e 16960 free_debug_memory ();
18bd398b 16961
ff78d6d6 16962 return 0;
252b5132
RH
16963}
16964
2cf0635d
NC
16965/* Process an ELF archive.
16966 On entry the file is positioned just after the ARMAG string. */
16967
16968static int
16969process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
16970{
16971 struct archive_info arch;
16972 struct archive_info nested_arch;
16973 size_t got;
2cf0635d
NC
16974 int ret;
16975
16976 show_name = 1;
16977
16978 /* The ARCH structure is used to hold information about this archive. */
16979 arch.file_name = NULL;
16980 arch.file = NULL;
16981 arch.index_array = NULL;
16982 arch.sym_table = NULL;
16983 arch.longnames = NULL;
16984
16985 /* The NESTED_ARCH structure is used as a single-item cache of information
16986 about a nested archive (when members of a thin archive reside within
16987 another regular archive file). */
16988 nested_arch.file_name = NULL;
16989 nested_arch.file = NULL;
16990 nested_arch.index_array = NULL;
16991 nested_arch.sym_table = NULL;
16992 nested_arch.longnames = NULL;
16993
16994 if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
16995 {
16996 ret = 1;
16997 goto out;
4145f1d5 16998 }
fb52b2f4 16999
4145f1d5
NC
17000 if (do_archive_index)
17001 {
2cf0635d 17002 if (arch.sym_table == NULL)
4145f1d5
NC
17003 error (_("%s: unable to dump the index as none was found\n"), file_name);
17004 else
17005 {
591f7597 17006 unsigned long i, l;
4145f1d5
NC
17007 unsigned long current_pos;
17008
591f7597
NC
17009 printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
17010 file_name, (unsigned long) arch.index_num, arch.sym_size);
4145f1d5
NC
17011 current_pos = ftell (file);
17012
2cf0635d 17013 for (i = l = 0; i < arch.index_num; i++)
4145f1d5 17014 {
2cf0635d
NC
17015 if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
17016 {
17017 char * member_name;
4145f1d5 17018
2cf0635d
NC
17019 member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
17020
17021 if (member_name != NULL)
17022 {
17023 char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
17024
17025 if (qualified_name != NULL)
17026 {
c2a7d3f5
NC
17027 printf (_("Contents of binary %s at offset "), qualified_name);
17028 (void) print_vma (arch.index_array[i], PREFIX_HEX);
17029 putchar ('\n');
2cf0635d
NC
17030 free (qualified_name);
17031 }
4145f1d5
NC
17032 }
17033 }
2cf0635d
NC
17034
17035 if (l >= arch.sym_size)
4145f1d5
NC
17036 {
17037 error (_("%s: end of the symbol table reached before the end of the index\n"),
17038 file_name);
cb8f3167 17039 break;
4145f1d5 17040 }
591f7597
NC
17041 /* PR 17531: file: 0b6630b2. */
17042 printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
17043 l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
4145f1d5
NC
17044 }
17045
c2a7d3f5
NC
17046 if (arch.uses_64bit_indicies)
17047 l = (l + 7) & ~ 7;
17048 else
17049 l += l & 1;
17050
2cf0635d 17051 if (l < arch.sym_size)
c2a7d3f5
NC
17052 error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
17053 file_name, arch.sym_size - l);
4145f1d5 17054
4145f1d5
NC
17055 if (fseek (file, current_pos, SEEK_SET) != 0)
17056 {
17057 error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
2cf0635d
NC
17058 ret = 1;
17059 goto out;
4145f1d5 17060 }
fb52b2f4 17061 }
4145f1d5
NC
17062
17063 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
17064 && !do_segments && !do_header && !do_dump && !do_version
17065 && !do_histogram && !do_debugging && !do_arch && !do_notes
2c610e4b 17066 && !do_section_groups && !do_dyn_syms)
2cf0635d
NC
17067 {
17068 ret = 0; /* Archive index only. */
17069 goto out;
17070 }
fb52b2f4
NC
17071 }
17072
d989285c 17073 ret = 0;
fb52b2f4
NC
17074
17075 while (1)
17076 {
2cf0635d
NC
17077 char * name;
17078 size_t namelen;
17079 char * qualified_name;
17080
17081 /* Read the next archive header. */
17082 if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
17083 {
17084 error (_("%s: failed to seek to next archive header\n"), file_name);
17085 return 1;
17086 }
17087 got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
17088 if (got != sizeof arch.arhdr)
17089 {
17090 if (got == 0)
17091 break;
17092 error (_("%s: failed to read archive header\n"), file_name);
17093 ret = 1;
17094 break;
17095 }
17096 if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
17097 {
17098 error (_("%s: did not find a valid archive header\n"), arch.file_name);
17099 ret = 1;
17100 break;
17101 }
17102
17103 arch.next_arhdr_offset += sizeof arch.arhdr;
17104
17105 archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
17106 if (archive_file_size & 01)
17107 ++archive_file_size;
17108
17109 name = get_archive_member_name (&arch, &nested_arch);
17110 if (name == NULL)
fb52b2f4 17111 {
0fd3a477 17112 error (_("%s: bad archive file name\n"), file_name);
d989285c
ILT
17113 ret = 1;
17114 break;
fb52b2f4 17115 }
2cf0635d 17116 namelen = strlen (name);
fb52b2f4 17117
2cf0635d
NC
17118 qualified_name = make_qualified_name (&arch, &nested_arch, name);
17119 if (qualified_name == NULL)
fb52b2f4 17120 {
2cf0635d 17121 error (_("%s: bad archive file name\n"), file_name);
d989285c
ILT
17122 ret = 1;
17123 break;
fb52b2f4
NC
17124 }
17125
2cf0635d
NC
17126 if (is_thin_archive && arch.nested_member_origin == 0)
17127 {
17128 /* This is a proxy for an external member of a thin archive. */
17129 FILE * member_file;
17130 char * member_file_name = adjust_relative_path (file_name, name, namelen);
17131 if (member_file_name == NULL)
17132 {
17133 ret = 1;
17134 break;
17135 }
17136
17137 member_file = fopen (member_file_name, "rb");
17138 if (member_file == NULL)
17139 {
17140 error (_("Input file '%s' is not readable.\n"), member_file_name);
17141 free (member_file_name);
17142 ret = 1;
17143 break;
17144 }
17145
17146 archive_file_offset = arch.nested_member_origin;
17147
17148 ret |= process_object (qualified_name, member_file);
17149
17150 fclose (member_file);
17151 free (member_file_name);
17152 }
17153 else if (is_thin_archive)
17154 {
a043396b
NC
17155 /* PR 15140: Allow for corrupt thin archives. */
17156 if (nested_arch.file == NULL)
17157 {
17158 error (_("%s: contains corrupt thin archive: %s\n"),
17159 file_name, name);
17160 ret = 1;
17161 break;
17162 }
17163
2cf0635d
NC
17164 /* This is a proxy for a member of a nested archive. */
17165 archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
17166
17167 /* The nested archive file will have been opened and setup by
17168 get_archive_member_name. */
17169 if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
17170 {
17171 error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
17172 ret = 1;
17173 break;
17174 }
17175
17176 ret |= process_object (qualified_name, nested_arch.file);
17177 }
17178 else
17179 {
17180 archive_file_offset = arch.next_arhdr_offset;
17181 arch.next_arhdr_offset += archive_file_size;
fb52b2f4 17182
2cf0635d
NC
17183 ret |= process_object (qualified_name, file);
17184 }
fb52b2f4 17185
2b52916e
L
17186 if (dump_sects != NULL)
17187 {
17188 free (dump_sects);
17189 dump_sects = NULL;
17190 num_dump_sects = 0;
17191 }
17192
2cf0635d 17193 free (qualified_name);
fb52b2f4
NC
17194 }
17195
4145f1d5 17196 out:
2cf0635d
NC
17197 if (nested_arch.file != NULL)
17198 fclose (nested_arch.file);
17199 release_archive (&nested_arch);
17200 release_archive (&arch);
fb52b2f4 17201
d989285c 17202 return ret;
fb52b2f4
NC
17203}
17204
17205static int
2cf0635d 17206process_file (char * file_name)
fb52b2f4 17207{
2cf0635d 17208 FILE * file;
fb52b2f4
NC
17209 struct stat statbuf;
17210 char armag[SARMAG];
17211 int ret;
17212
17213 if (stat (file_name, &statbuf) < 0)
17214 {
f24ddbdd
NC
17215 if (errno == ENOENT)
17216 error (_("'%s': No such file\n"), file_name);
17217 else
17218 error (_("Could not locate '%s'. System error message: %s\n"),
17219 file_name, strerror (errno));
17220 return 1;
17221 }
17222
17223 if (! S_ISREG (statbuf.st_mode))
17224 {
17225 error (_("'%s' is not an ordinary file\n"), file_name);
fb52b2f4
NC
17226 return 1;
17227 }
17228
17229 file = fopen (file_name, "rb");
17230 if (file == NULL)
17231 {
f24ddbdd 17232 error (_("Input file '%s' is not readable.\n"), file_name);
fb52b2f4
NC
17233 return 1;
17234 }
17235
17236 if (fread (armag, SARMAG, 1, file) != 1)
17237 {
4145f1d5 17238 error (_("%s: Failed to read file's magic number\n"), file_name);
fb52b2f4
NC
17239 fclose (file);
17240 return 1;
17241 }
17242
f54498b4
NC
17243 current_file_size = (bfd_size_type) statbuf.st_size;
17244
fb52b2f4 17245 if (memcmp (armag, ARMAG, SARMAG) == 0)
2cf0635d
NC
17246 ret = process_archive (file_name, file, FALSE);
17247 else if (memcmp (armag, ARMAGT, SARMAG) == 0)
17248 ret = process_archive (file_name, file, TRUE);
fb52b2f4
NC
17249 else
17250 {
4145f1d5
NC
17251 if (do_archive_index)
17252 error (_("File %s is not an archive so its index cannot be displayed.\n"),
17253 file_name);
17254
fb52b2f4
NC
17255 rewind (file);
17256 archive_file_size = archive_file_offset = 0;
17257 ret = process_object (file_name, file);
17258 }
17259
17260 fclose (file);
17261
f54498b4 17262 current_file_size = 0;
fb52b2f4
NC
17263 return ret;
17264}
17265
252b5132
RH
17266#ifdef SUPPORT_DISASSEMBLY
17267/* Needed by the i386 disassembler. For extra credit, someone could
9ea033b2 17268 fix this so that we insert symbolic addresses here, esp for GOT/PLT
e3c8793a 17269 symbols. */
252b5132
RH
17270
17271void
2cf0635d 17272print_address (unsigned int addr, FILE * outfile)
252b5132
RH
17273{
17274 fprintf (outfile,"0x%8.8x", addr);
17275}
17276
e3c8793a 17277/* Needed by the i386 disassembler. */
252b5132
RH
17278void
17279db_task_printsym (unsigned int addr)
17280{
17281 print_address (addr, stderr);
17282}
17283#endif
17284
17285int
2cf0635d 17286main (int argc, char ** argv)
252b5132 17287{
ff78d6d6
L
17288 int err;
17289
252b5132
RH
17290#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
17291 setlocale (LC_MESSAGES, "");
3882b010
L
17292#endif
17293#if defined (HAVE_SETLOCALE)
17294 setlocale (LC_CTYPE, "");
252b5132
RH
17295#endif
17296 bindtextdomain (PACKAGE, LOCALEDIR);
17297 textdomain (PACKAGE);
17298
869b9d07
MM
17299 expandargv (&argc, &argv);
17300
252b5132
RH
17301 parse_args (argc, argv);
17302
18bd398b 17303 if (num_dump_sects > 0)
59f14fc0 17304 {
18bd398b 17305 /* Make a copy of the dump_sects array. */
3f5e193b
NC
17306 cmdline_dump_sects = (dump_type *)
17307 malloc (num_dump_sects * sizeof (* dump_sects));
59f14fc0 17308 if (cmdline_dump_sects == NULL)
591a748a 17309 error (_("Out of memory allocating dump request table.\n"));
59f14fc0
AS
17310 else
17311 {
09c11c86
NC
17312 memcpy (cmdline_dump_sects, dump_sects,
17313 num_dump_sects * sizeof (* dump_sects));
59f14fc0
AS
17314 num_cmdline_dump_sects = num_dump_sects;
17315 }
17316 }
17317
18bd398b
NC
17318 if (optind < (argc - 1))
17319 show_name = 1;
5656ba2c
L
17320 else if (optind >= argc)
17321 {
17322 warn (_("Nothing to do.\n"));
17323 usage (stderr);
17324 }
18bd398b 17325
ff78d6d6 17326 err = 0;
252b5132 17327 while (optind < argc)
18bd398b 17328 err |= process_file (argv[optind++]);
252b5132
RH
17329
17330 if (dump_sects != NULL)
17331 free (dump_sects);
59f14fc0
AS
17332 if (cmdline_dump_sects != NULL)
17333 free (cmdline_dump_sects);
252b5132 17334
ff78d6d6 17335 return err;
252b5132 17336}
This page took 2.807036 seconds and 4 git commands to generate.