PowerPC register expression checks
[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
1835f746
NC
12694 if (uncompressed_size)
12695 {
12696 if (uncompress_section_contents (& start,
12697 uncompressed_size, & new_size))
12698 num_bytes = new_size;
12699 else
12700 {
12701 error (_("Unable to decompress section %s\n"),
12702 printable_section_name (section));
12703 return;
12704 }
12705 }
0e602686 12706 }
fd8008d8 12707
cf13d699
NC
12708 /* If the section being dumped has relocations against it the user might
12709 be expecting these relocations to have been applied. Check for this
12710 case and issue a warning message in order to avoid confusion.
12711 FIXME: Maybe we ought to have an option that dumps a section with
12712 relocs applied ? */
12713 for (relsec = section_headers;
12714 relsec < section_headers + elf_header.e_shnum;
12715 ++relsec)
12716 {
12717 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12718 || relsec->sh_info >= elf_header.e_shnum
12719 || section_headers + relsec->sh_info != section
12720 || relsec->sh_size == 0
12721 || relsec->sh_link >= elf_header.e_shnum)
12722 continue;
12723
12724 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12725 break;
12726 }
12727
cf13d699
NC
12728 data = start;
12729 end = start + num_bytes;
12730 some_strings_shown = FALSE;
12731
12732 while (data < end)
12733 {
12734 while (!ISPRINT (* data))
12735 if (++ data >= end)
12736 break;
12737
12738 if (data < end)
12739 {
071436c6
NC
12740 size_t maxlen = end - data;
12741
cf13d699 12742#ifndef __MSVCRT__
c975cc98
NC
12743 /* PR 11128: Use two separate invocations in order to work
12744 around bugs in the Solaris 8 implementation of printf. */
12745 printf (" [%6tx] ", data - start);
cf13d699 12746#else
071436c6 12747 printf (" [%6Ix] ", (size_t) (data - start));
cf13d699 12748#endif
4082ef84
NC
12749 if (maxlen > 0)
12750 {
fd8008d8 12751 print_symbol ((int) maxlen, (const char *) data);
4082ef84 12752 putchar ('\n');
fd8008d8 12753 data += strnlen ((const char *) data, maxlen);
4082ef84
NC
12754 }
12755 else
12756 {
12757 printf (_("<corrupt>\n"));
12758 data = end;
12759 }
cf13d699
NC
12760 some_strings_shown = TRUE;
12761 }
12762 }
12763
12764 if (! some_strings_shown)
12765 printf (_(" No strings found in this section."));
12766
0e602686 12767 free (real_start);
cf13d699
NC
12768
12769 putchar ('\n');
12770}
12771
12772static void
12773dump_section_as_bytes (Elf_Internal_Shdr * section,
12774 FILE * file,
12775 bfd_boolean relocate)
12776{
12777 Elf_Internal_Shdr * relsec;
0e602686
NC
12778 bfd_size_type bytes;
12779 bfd_size_type section_size;
12780 bfd_vma addr;
12781 unsigned char * data;
12782 unsigned char * real_start;
12783 unsigned char * start;
12784
12785 real_start = start = (unsigned char *) get_section_contents (section, file);
cf13d699
NC
12786 if (start == NULL)
12787 return;
0e602686 12788 section_size = section->sh_size;
cf13d699 12789
74e1a04b 12790 printf (_("\nHex dump of section '%s':\n"), printable_section_name (section));
cf13d699 12791
0e602686
NC
12792 if (decompress_dumps)
12793 {
12794 dwarf_size_type new_size = section_size;
12795 dwarf_size_type uncompressed_size = 0;
12796
12797 if ((section->sh_flags & SHF_COMPRESSED) != 0)
12798 {
12799 Elf_Internal_Chdr chdr;
12800 unsigned int compression_header_size
ebdf1ebf 12801 = get_compression_header (& chdr, start, section_size);
0e602686 12802
813dabb9 12803 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
0e602686 12804 {
813dabb9
L
12805 warn (_("section '%s' has unsupported compress type: %d\n"),
12806 printable_section_name (section), chdr.ch_type);
12807 return;
0e602686 12808 }
813dabb9
L
12809 else if (chdr.ch_addralign != section->sh_addralign)
12810 {
12811 warn (_("compressed section '%s' is corrupted\n"),
12812 printable_section_name (section));
12813 return;
12814 }
12815 uncompressed_size = chdr.ch_size;
12816 start += compression_header_size;
12817 new_size -= compression_header_size;
0e602686
NC
12818 }
12819 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12820 {
12821 /* Read the zlib header. In this case, it should be "ZLIB"
12822 followed by the uncompressed section size, 8 bytes in
12823 big-endian order. */
12824 uncompressed_size = start[4]; uncompressed_size <<= 8;
12825 uncompressed_size += start[5]; uncompressed_size <<= 8;
12826 uncompressed_size += start[6]; uncompressed_size <<= 8;
12827 uncompressed_size += start[7]; uncompressed_size <<= 8;
12828 uncompressed_size += start[8]; uncompressed_size <<= 8;
12829 uncompressed_size += start[9]; uncompressed_size <<= 8;
12830 uncompressed_size += start[10]; uncompressed_size <<= 8;
12831 uncompressed_size += start[11];
12832 start += 12;
12833 new_size -= 12;
12834 }
12835
f055032e
NC
12836 if (uncompressed_size)
12837 {
12838 if (uncompress_section_contents (& start, uncompressed_size,
12839 & new_size))
12840 section_size = new_size;
12841 else
12842 {
12843 error (_("Unable to decompress section %s\n"),
12844 printable_section_name (section));
12845 return;
12846 }
12847 }
0e602686 12848 }
14ae95f2 12849
cf13d699
NC
12850 if (relocate)
12851 {
0e602686 12852 apply_relocations (file, section, start, section_size, NULL, NULL);
cf13d699
NC
12853 }
12854 else
12855 {
12856 /* If the section being dumped has relocations against it the user might
12857 be expecting these relocations to have been applied. Check for this
12858 case and issue a warning message in order to avoid confusion.
12859 FIXME: Maybe we ought to have an option that dumps a section with
12860 relocs applied ? */
12861 for (relsec = section_headers;
12862 relsec < section_headers + elf_header.e_shnum;
12863 ++relsec)
12864 {
12865 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12866 || relsec->sh_info >= elf_header.e_shnum
12867 || section_headers + relsec->sh_info != section
12868 || relsec->sh_size == 0
12869 || relsec->sh_link >= elf_header.e_shnum)
12870 continue;
12871
12872 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12873 break;
12874 }
12875 }
12876
12877 addr = section->sh_addr;
0e602686 12878 bytes = section_size;
cf13d699
NC
12879 data = start;
12880
12881 while (bytes)
12882 {
12883 int j;
12884 int k;
12885 int lbytes;
12886
12887 lbytes = (bytes > 16 ? 16 : bytes);
12888
12889 printf (" 0x%8.8lx ", (unsigned long) addr);
12890
12891 for (j = 0; j < 16; j++)
12892 {
12893 if (j < lbytes)
12894 printf ("%2.2x", data[j]);
12895 else
12896 printf (" ");
12897
12898 if ((j & 3) == 3)
12899 printf (" ");
12900 }
12901
12902 for (j = 0; j < lbytes; j++)
12903 {
12904 k = data[j];
12905 if (k >= ' ' && k < 0x7f)
12906 printf ("%c", k);
12907 else
12908 printf (".");
12909 }
12910
12911 putchar ('\n');
12912
12913 data += lbytes;
12914 addr += lbytes;
12915 bytes -= lbytes;
12916 }
12917
0e602686 12918 free (real_start);
cf13d699
NC
12919
12920 putchar ('\n');
12921}
12922
d966045b
DJ
12923static int
12924load_specific_debug_section (enum dwarf_section_display_enum debug,
0d2a7a93 12925 const Elf_Internal_Shdr * sec, void * file)
1007acb3 12926{
2cf0635d 12927 struct dwarf_section * section = &debug_displays [debug].section;
19e6b90e 12928 char buf [64];
1007acb3 12929
19e6b90e
L
12930 /* If it is already loaded, do nothing. */
12931 if (section->start != NULL)
12932 return 1;
1007acb3 12933
19e6b90e
L
12934 snprintf (buf, sizeof (buf), _("%s section data"), section->name);
12935 section->address = sec->sh_addr;
06614111 12936 section->user_data = NULL;
3f5e193b
NC
12937 section->start = (unsigned char *) get_data (NULL, (FILE *) file,
12938 sec->sh_offset, 1,
12939 sec->sh_size, buf);
59245841
NC
12940 if (section->start == NULL)
12941 section->size = 0;
12942 else
12943 {
77115a4a
L
12944 unsigned char *start = section->start;
12945 dwarf_size_type size = sec->sh_size;
dab394de 12946 dwarf_size_type uncompressed_size = 0;
77115a4a
L
12947
12948 if ((sec->sh_flags & SHF_COMPRESSED) != 0)
12949 {
12950 Elf_Internal_Chdr chdr;
d8024a91
NC
12951 unsigned int compression_header_size;
12952
f53be977
L
12953 if (size < (is_32bit_elf
12954 ? sizeof (Elf32_External_Chdr)
12955 : sizeof (Elf64_External_Chdr)))
d8024a91
NC
12956 {
12957 warn (_("compressed section %s is too small to contain a compression header"),
12958 section->name);
12959 return 0;
12960 }
12961
ebdf1ebf 12962 compression_header_size = get_compression_header (&chdr, start, size);
d8024a91 12963
813dabb9
L
12964 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12965 {
12966 warn (_("section '%s' has unsupported compress type: %d\n"),
12967 section->name, chdr.ch_type);
12968 return 0;
12969 }
12970 else if (chdr.ch_addralign != sec->sh_addralign)
12971 {
12972 warn (_("compressed section '%s' is corrupted\n"),
12973 section->name);
12974 return 0;
12975 }
dab394de 12976 uncompressed_size = chdr.ch_size;
77115a4a
L
12977 start += compression_header_size;
12978 size -= compression_header_size;
12979 }
dab394de
L
12980 else if (size > 12 && streq ((char *) start, "ZLIB"))
12981 {
12982 /* Read the zlib header. In this case, it should be "ZLIB"
12983 followed by the uncompressed section size, 8 bytes in
12984 big-endian order. */
12985 uncompressed_size = start[4]; uncompressed_size <<= 8;
12986 uncompressed_size += start[5]; uncompressed_size <<= 8;
12987 uncompressed_size += start[6]; uncompressed_size <<= 8;
12988 uncompressed_size += start[7]; uncompressed_size <<= 8;
12989 uncompressed_size += start[8]; uncompressed_size <<= 8;
12990 uncompressed_size += start[9]; uncompressed_size <<= 8;
12991 uncompressed_size += start[10]; uncompressed_size <<= 8;
12992 uncompressed_size += start[11];
12993 start += 12;
12994 size -= 12;
12995 }
12996
1835f746 12997 if (uncompressed_size)
77115a4a 12998 {
1835f746
NC
12999 if (uncompress_section_contents (&start, uncompressed_size,
13000 &size))
13001 {
13002 /* Free the compressed buffer, update the section buffer
13003 and the section size if uncompress is successful. */
13004 free (section->start);
13005 section->start = start;
13006 }
13007 else
13008 {
13009 error (_("Unable to decompress section %s\n"),
13010 printable_section_name (sec));
13011 return 0;
13012 }
77115a4a
L
13013 }
13014 section->size = size;
59245841 13015 }
4a114e3e 13016
1b315056
CS
13017 if (section->start == NULL)
13018 return 0;
13019
19e6b90e 13020 if (debug_displays [debug].relocate)
d1c4b12b
NC
13021 apply_relocations ((FILE *) file, sec, section->start, section->size,
13022 & section->reloc_info, & section->num_relocs);
13023 else
13024 {
13025 section->reloc_info = NULL;
13026 section->num_relocs = 0;
13027 }
1007acb3 13028
1b315056 13029 return 1;
1007acb3
L
13030}
13031
657d0d47
CC
13032/* If this is not NULL, load_debug_section will only look for sections
13033 within the list of sections given here. */
13034unsigned int *section_subset = NULL;
13035
d966045b 13036int
2cf0635d 13037load_debug_section (enum dwarf_section_display_enum debug, void * file)
d966045b 13038{
2cf0635d
NC
13039 struct dwarf_section * section = &debug_displays [debug].section;
13040 Elf_Internal_Shdr * sec;
d966045b
DJ
13041
13042 /* Locate the debug section. */
657d0d47 13043 sec = find_section_in_set (section->uncompressed_name, section_subset);
d966045b
DJ
13044 if (sec != NULL)
13045 section->name = section->uncompressed_name;
13046 else
13047 {
657d0d47 13048 sec = find_section_in_set (section->compressed_name, section_subset);
d966045b
DJ
13049 if (sec != NULL)
13050 section->name = section->compressed_name;
13051 }
13052 if (sec == NULL)
13053 return 0;
13054
657d0d47
CC
13055 /* If we're loading from a subset of sections, and we've loaded
13056 a section matching this name before, it's likely that it's a
13057 different one. */
13058 if (section_subset != NULL)
13059 free_debug_section (debug);
13060
3f5e193b 13061 return load_specific_debug_section (debug, sec, (FILE *) file);
d966045b
DJ
13062}
13063
19e6b90e
L
13064void
13065free_debug_section (enum dwarf_section_display_enum debug)
1007acb3 13066{
2cf0635d 13067 struct dwarf_section * section = &debug_displays [debug].section;
1007acb3 13068
19e6b90e
L
13069 if (section->start == NULL)
13070 return;
1007acb3 13071
19e6b90e
L
13072 free ((char *) section->start);
13073 section->start = NULL;
13074 section->address = 0;
13075 section->size = 0;
1007acb3
L
13076}
13077
1007acb3 13078static int
657d0d47 13079display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
1007acb3 13080{
2cf0635d 13081 char * name = SECTION_NAME (section);
74e1a04b 13082 const char * print_name = printable_section_name (section);
19e6b90e
L
13083 bfd_size_type length;
13084 int result = 1;
3f5e193b 13085 int i;
1007acb3 13086
19e6b90e
L
13087 length = section->sh_size;
13088 if (length == 0)
1007acb3 13089 {
74e1a04b 13090 printf (_("\nSection '%s' has no debugging data.\n"), print_name);
19e6b90e 13091 return 0;
1007acb3 13092 }
5dff79d8
NC
13093 if (section->sh_type == SHT_NOBITS)
13094 {
13095 /* There is no point in dumping the contents of a debugging section
13096 which has the NOBITS type - the bits in the file will be random.
13097 This can happen when a file containing a .eh_frame section is
13098 stripped with the --only-keep-debug command line option. */
74e1a04b
NC
13099 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
13100 print_name);
5dff79d8
NC
13101 return 0;
13102 }
1007acb3 13103
0112cd26 13104 if (const_strneq (name, ".gnu.linkonce.wi."))
19e6b90e 13105 name = ".debug_info";
1007acb3 13106
19e6b90e
L
13107 /* See if we know how to display the contents of this section. */
13108 for (i = 0; i < max; i++)
1b315056 13109 if (streq (debug_displays[i].section.uncompressed_name, name)
b40bf0a2 13110 || (i == line && const_strneq (name, ".debug_line."))
1b315056 13111 || streq (debug_displays[i].section.compressed_name, name))
19e6b90e 13112 {
2cf0635d 13113 struct dwarf_section * sec = &debug_displays [i].section;
d966045b
DJ
13114 int secondary = (section != find_section (name));
13115
13116 if (secondary)
3f5e193b 13117 free_debug_section ((enum dwarf_section_display_enum) i);
1007acb3 13118
b40bf0a2
NC
13119 if (i == line && const_strneq (name, ".debug_line."))
13120 sec->name = name;
13121 else if (streq (sec->uncompressed_name, name))
d966045b
DJ
13122 sec->name = sec->uncompressed_name;
13123 else
13124 sec->name = sec->compressed_name;
3f5e193b
NC
13125 if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
13126 section, file))
19e6b90e 13127 {
657d0d47
CC
13128 /* If this debug section is part of a CU/TU set in a .dwp file,
13129 restrict load_debug_section to the sections in that set. */
13130 section_subset = find_cu_tu_set (file, shndx);
13131
19e6b90e 13132 result &= debug_displays[i].display (sec, file);
1007acb3 13133
657d0d47
CC
13134 section_subset = NULL;
13135
d966045b 13136 if (secondary || (i != info && i != abbrev))
3f5e193b 13137 free_debug_section ((enum dwarf_section_display_enum) i);
19e6b90e 13138 }
1007acb3 13139
19e6b90e
L
13140 break;
13141 }
1007acb3 13142
19e6b90e 13143 if (i == max)
1007acb3 13144 {
74e1a04b 13145 printf (_("Unrecognized debug section: %s\n"), print_name);
19e6b90e 13146 result = 0;
1007acb3
L
13147 }
13148
19e6b90e 13149 return result;
5b18a4bc 13150}
103f02d3 13151
aef1f6d0
DJ
13152/* Set DUMP_SECTS for all sections where dumps were requested
13153 based on section name. */
13154
13155static void
13156initialise_dumps_byname (void)
13157{
2cf0635d 13158 struct dump_list_entry * cur;
aef1f6d0
DJ
13159
13160 for (cur = dump_sects_byname; cur; cur = cur->next)
13161 {
13162 unsigned int i;
13163 int any;
13164
13165 for (i = 0, any = 0; i < elf_header.e_shnum; i++)
13166 if (streq (SECTION_NAME (section_headers + i), cur->name))
13167 {
09c11c86 13168 request_dump_bynumber (i, cur->type);
aef1f6d0
DJ
13169 any = 1;
13170 }
13171
13172 if (!any)
13173 warn (_("Section '%s' was not dumped because it does not exist!\n"),
13174 cur->name);
13175 }
13176}
13177
5b18a4bc 13178static void
2cf0635d 13179process_section_contents (FILE * file)
5b18a4bc 13180{
2cf0635d 13181 Elf_Internal_Shdr * section;
19e6b90e 13182 unsigned int i;
103f02d3 13183
19e6b90e
L
13184 if (! do_dump)
13185 return;
103f02d3 13186
aef1f6d0
DJ
13187 initialise_dumps_byname ();
13188
19e6b90e
L
13189 for (i = 0, section = section_headers;
13190 i < elf_header.e_shnum && i < num_dump_sects;
13191 i++, section++)
13192 {
13193#ifdef SUPPORT_DISASSEMBLY
13194 if (dump_sects[i] & DISASS_DUMP)
13195 disassemble_section (section, file);
13196#endif
13197 if (dump_sects[i] & HEX_DUMP)
cf13d699 13198 dump_section_as_bytes (section, file, FALSE);
103f02d3 13199
cf13d699
NC
13200 if (dump_sects[i] & RELOC_DUMP)
13201 dump_section_as_bytes (section, file, TRUE);
09c11c86
NC
13202
13203 if (dump_sects[i] & STRING_DUMP)
13204 dump_section_as_strings (section, file);
cf13d699
NC
13205
13206 if (dump_sects[i] & DEBUG_DUMP)
657d0d47 13207 display_debug_section (i, section, file);
5b18a4bc 13208 }
103f02d3 13209
19e6b90e
L
13210 /* Check to see if the user requested a
13211 dump of a section that does not exist. */
0ee3043f
NC
13212 while (i < num_dump_sects)
13213 {
13214 if (dump_sects[i])
13215 warn (_("Section %d was not dumped because it does not exist!\n"), i);
13216 i++;
13217 }
5b18a4bc 13218}
103f02d3 13219
5b18a4bc 13220static void
19e6b90e 13221process_mips_fpe_exception (int mask)
5b18a4bc 13222{
19e6b90e
L
13223 if (mask)
13224 {
13225 int first = 1;
13226 if (mask & OEX_FPU_INEX)
13227 fputs ("INEX", stdout), first = 0;
13228 if (mask & OEX_FPU_UFLO)
13229 printf ("%sUFLO", first ? "" : "|"), first = 0;
13230 if (mask & OEX_FPU_OFLO)
13231 printf ("%sOFLO", first ? "" : "|"), first = 0;
13232 if (mask & OEX_FPU_DIV0)
13233 printf ("%sDIV0", first ? "" : "|"), first = 0;
13234 if (mask & OEX_FPU_INVAL)
13235 printf ("%sINVAL", first ? "" : "|");
13236 }
5b18a4bc 13237 else
19e6b90e 13238 fputs ("0", stdout);
5b18a4bc 13239}
103f02d3 13240
f6f0e17b
NC
13241/* Display's the value of TAG at location P. If TAG is
13242 greater than 0 it is assumed to be an unknown tag, and
13243 a message is printed to this effect. Otherwise it is
13244 assumed that a message has already been printed.
13245
13246 If the bottom bit of TAG is set it assumed to have a
13247 string value, otherwise it is assumed to have an integer
13248 value.
13249
13250 Returns an updated P pointing to the first unread byte
13251 beyond the end of TAG's value.
13252
13253 Reads at or beyond END will not be made. */
13254
13255static unsigned char *
13256display_tag_value (int tag,
13257 unsigned char * p,
13258 const unsigned char * const end)
13259{
13260 unsigned long val;
13261
13262 if (tag > 0)
13263 printf (" Tag_unknown_%d: ", tag);
13264
13265 if (p >= end)
13266 {
4082ef84 13267 warn (_("<corrupt tag>\n"));
f6f0e17b
NC
13268 }
13269 else if (tag & 1)
13270 {
071436c6
NC
13271 /* PR 17531 file: 027-19978-0.004. */
13272 size_t maxlen = (end - p) - 1;
13273
13274 putchar ('"');
4082ef84
NC
13275 if (maxlen > 0)
13276 {
13277 print_symbol ((int) maxlen, (const char *) p);
13278 p += strnlen ((char *) p, maxlen) + 1;
13279 }
13280 else
13281 {
13282 printf (_("<corrupt string tag>"));
13283 p = (unsigned char *) end;
13284 }
071436c6 13285 printf ("\"\n");
f6f0e17b
NC
13286 }
13287 else
13288 {
13289 unsigned int len;
13290
13291 val = read_uleb128 (p, &len, end);
13292 p += len;
13293 printf ("%ld (0x%lx)\n", val, val);
13294 }
13295
4082ef84 13296 assert (p <= end);
f6f0e17b
NC
13297 return p;
13298}
13299
11c1ff18
PB
13300/* ARM EABI attributes section. */
13301typedef struct
13302{
70e99720 13303 unsigned int tag;
2cf0635d 13304 const char * name;
11c1ff18 13305 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
70e99720 13306 unsigned int type;
2cf0635d 13307 const char ** table;
11c1ff18
PB
13308} arm_attr_public_tag;
13309
2cf0635d 13310static const char * arm_attr_tag_CPU_arch[] =
11c1ff18 13311 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
ff8646ee
TP
13312 "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "", "v8-M.baseline",
13313 "v8-M.mainline"};
2cf0635d
NC
13314static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
13315static const char * arm_attr_tag_THUMB_ISA_use[] =
4ed7ed8d 13316 {"No", "Thumb-1", "Thumb-2", "Yes"};
75375b3e 13317static const char * arm_attr_tag_FP_arch[] =
bca38921 13318 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
a715796b 13319 "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
2cf0635d 13320static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
dd24e3da 13321static const char * arm_attr_tag_Advanced_SIMD_arch[] =
9411fd44
MW
13322 {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
13323 "NEON for ARMv8.1"};
2cf0635d 13324static const char * arm_attr_tag_PCS_config[] =
11c1ff18
PB
13325 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
13326 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
2cf0635d 13327static const char * arm_attr_tag_ABI_PCS_R9_use[] =
11c1ff18 13328 {"V6", "SB", "TLS", "Unused"};
2cf0635d 13329static const char * arm_attr_tag_ABI_PCS_RW_data[] =
11c1ff18 13330 {"Absolute", "PC-relative", "SB-relative", "None"};
2cf0635d 13331static const char * arm_attr_tag_ABI_PCS_RO_data[] =
11c1ff18 13332 {"Absolute", "PC-relative", "None"};
2cf0635d 13333static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
11c1ff18 13334 {"None", "direct", "GOT-indirect"};
2cf0635d 13335static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
11c1ff18 13336 {"None", "??? 1", "2", "??? 3", "4"};
2cf0635d
NC
13337static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
13338static const char * arm_attr_tag_ABI_FP_denormal[] =
f5f53991 13339 {"Unused", "Needed", "Sign only"};
2cf0635d
NC
13340static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
13341static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
13342static const char * arm_attr_tag_ABI_FP_number_model[] =
11c1ff18 13343 {"Unused", "Finite", "RTABI", "IEEE 754"};
2cf0635d 13344static const char * arm_attr_tag_ABI_enum_size[] =
11c1ff18 13345 {"Unused", "small", "int", "forced to int"};
2cf0635d 13346static const char * arm_attr_tag_ABI_HardFP_use[] =
99654aaf 13347 {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
2cf0635d 13348static const char * arm_attr_tag_ABI_VFP_args[] =
5c294fee 13349 {"AAPCS", "VFP registers", "custom", "compatible"};
2cf0635d 13350static const char * arm_attr_tag_ABI_WMMX_args[] =
11c1ff18 13351 {"AAPCS", "WMMX registers", "custom"};
2cf0635d 13352static const char * arm_attr_tag_ABI_optimization_goals[] =
11c1ff18
PB
13353 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
13354 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
2cf0635d 13355static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
11c1ff18
PB
13356 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
13357 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
2cf0635d 13358static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
75375b3e 13359static const char * arm_attr_tag_FP_HP_extension[] =
8e79c3df 13360 {"Not Allowed", "Allowed"};
2cf0635d 13361static const char * arm_attr_tag_ABI_FP_16bit_format[] =
8e79c3df 13362 {"None", "IEEE 754", "Alternative Format"};
15afaa63
TP
13363static const char * arm_attr_tag_DSP_extension[] =
13364 {"Follow architecture", "Allowed"};
dd24e3da 13365static const char * arm_attr_tag_MPextension_use[] =
cd21e546
MGD
13366 {"Not Allowed", "Allowed"};
13367static const char * arm_attr_tag_DIV_use[] =
dd24e3da 13368 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
cd21e546 13369 "Allowed in v7-A with integer division extension"};
2cf0635d
NC
13370static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
13371static const char * arm_attr_tag_Virtualization_use[] =
dd24e3da 13372 {"Not Allowed", "TrustZone", "Virtualization Extensions",
cd21e546 13373 "TrustZone and Virtualization Extensions"};
dd24e3da 13374static const char * arm_attr_tag_MPextension_use_legacy[] =
f5f53991 13375 {"Not Allowed", "Allowed"};
11c1ff18
PB
13376
13377#define LOOKUP(id, name) \
13378 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
d70c5fc7 13379static arm_attr_public_tag arm_attr_public_tags[] =
11c1ff18
PB
13380{
13381 {4, "CPU_raw_name", 1, NULL},
13382 {5, "CPU_name", 1, NULL},
13383 LOOKUP(6, CPU_arch),
13384 {7, "CPU_arch_profile", 0, NULL},
13385 LOOKUP(8, ARM_ISA_use),
13386 LOOKUP(9, THUMB_ISA_use),
75375b3e 13387 LOOKUP(10, FP_arch),
11c1ff18 13388 LOOKUP(11, WMMX_arch),
f5f53991
AS
13389 LOOKUP(12, Advanced_SIMD_arch),
13390 LOOKUP(13, PCS_config),
11c1ff18
PB
13391 LOOKUP(14, ABI_PCS_R9_use),
13392 LOOKUP(15, ABI_PCS_RW_data),
f5f53991 13393 LOOKUP(16, ABI_PCS_RO_data),
11c1ff18
PB
13394 LOOKUP(17, ABI_PCS_GOT_use),
13395 LOOKUP(18, ABI_PCS_wchar_t),
13396 LOOKUP(19, ABI_FP_rounding),
13397 LOOKUP(20, ABI_FP_denormal),
13398 LOOKUP(21, ABI_FP_exceptions),
13399 LOOKUP(22, ABI_FP_user_exceptions),
13400 LOOKUP(23, ABI_FP_number_model),
75375b3e
MGD
13401 {24, "ABI_align_needed", 0, NULL},
13402 {25, "ABI_align_preserved", 0, NULL},
11c1ff18
PB
13403 LOOKUP(26, ABI_enum_size),
13404 LOOKUP(27, ABI_HardFP_use),
13405 LOOKUP(28, ABI_VFP_args),
13406 LOOKUP(29, ABI_WMMX_args),
13407 LOOKUP(30, ABI_optimization_goals),
13408 LOOKUP(31, ABI_FP_optimization_goals),
8e79c3df 13409 {32, "compatibility", 0, NULL},
f5f53991 13410 LOOKUP(34, CPU_unaligned_access),
75375b3e 13411 LOOKUP(36, FP_HP_extension),
8e79c3df 13412 LOOKUP(38, ABI_FP_16bit_format),
cd21e546
MGD
13413 LOOKUP(42, MPextension_use),
13414 LOOKUP(44, DIV_use),
15afaa63 13415 LOOKUP(46, DSP_extension),
f5f53991
AS
13416 {64, "nodefaults", 0, NULL},
13417 {65, "also_compatible_with", 0, NULL},
13418 LOOKUP(66, T2EE_use),
13419 {67, "conformance", 1, NULL},
13420 LOOKUP(68, Virtualization_use),
cd21e546 13421 LOOKUP(70, MPextension_use_legacy)
11c1ff18
PB
13422};
13423#undef LOOKUP
13424
11c1ff18 13425static unsigned char *
f6f0e17b
NC
13426display_arm_attribute (unsigned char * p,
13427 const unsigned char * const end)
11c1ff18 13428{
70e99720 13429 unsigned int tag;
11c1ff18 13430 unsigned int len;
70e99720 13431 unsigned int val;
2cf0635d 13432 arm_attr_public_tag * attr;
11c1ff18 13433 unsigned i;
70e99720 13434 unsigned int type;
11c1ff18 13435
f6f0e17b 13436 tag = read_uleb128 (p, &len, end);
11c1ff18
PB
13437 p += len;
13438 attr = NULL;
2cf0635d 13439 for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
11c1ff18
PB
13440 {
13441 if (arm_attr_public_tags[i].tag == tag)
13442 {
13443 attr = &arm_attr_public_tags[i];
13444 break;
13445 }
13446 }
13447
13448 if (attr)
13449 {
13450 printf (" Tag_%s: ", attr->name);
13451 switch (attr->type)
13452 {
13453 case 0:
13454 switch (tag)
13455 {
13456 case 7: /* Tag_CPU_arch_profile. */
f6f0e17b 13457 val = read_uleb128 (p, &len, end);
11c1ff18
PB
13458 p += len;
13459 switch (val)
13460 {
2b692964
NC
13461 case 0: printf (_("None\n")); break;
13462 case 'A': printf (_("Application\n")); break;
13463 case 'R': printf (_("Realtime\n")); break;
13464 case 'M': printf (_("Microcontroller\n")); break;
13465 case 'S': printf (_("Application or Realtime\n")); break;
11c1ff18
PB
13466 default: printf ("??? (%d)\n", val); break;
13467 }
13468 break;
13469
75375b3e 13470 case 24: /* Tag_align_needed. */
f6f0e17b 13471 val = read_uleb128 (p, &len, end);
75375b3e
MGD
13472 p += len;
13473 switch (val)
13474 {
2b692964
NC
13475 case 0: printf (_("None\n")); break;
13476 case 1: printf (_("8-byte\n")); break;
13477 case 2: printf (_("4-byte\n")); break;
75375b3e
MGD
13478 case 3: printf ("??? 3\n"); break;
13479 default:
13480 if (val <= 12)
dd24e3da 13481 printf (_("8-byte and up to %d-byte extended\n"),
75375b3e
MGD
13482 1 << val);
13483 else
13484 printf ("??? (%d)\n", val);
13485 break;
13486 }
13487 break;
13488
13489 case 25: /* Tag_align_preserved. */
f6f0e17b 13490 val = read_uleb128 (p, &len, end);
75375b3e
MGD
13491 p += len;
13492 switch (val)
13493 {
2b692964
NC
13494 case 0: printf (_("None\n")); break;
13495 case 1: printf (_("8-byte, except leaf SP\n")); break;
13496 case 2: printf (_("8-byte\n")); break;
75375b3e
MGD
13497 case 3: printf ("??? 3\n"); break;
13498 default:
13499 if (val <= 12)
dd24e3da 13500 printf (_("8-byte and up to %d-byte extended\n"),
75375b3e
MGD
13501 1 << val);
13502 else
13503 printf ("??? (%d)\n", val);
13504 break;
13505 }
13506 break;
13507
11c1ff18 13508 case 32: /* Tag_compatibility. */
071436c6 13509 {
071436c6
NC
13510 val = read_uleb128 (p, &len, end);
13511 p += len;
071436c6 13512 printf (_("flag = %d, vendor = "), val);
4082ef84
NC
13513 if (p < end - 1)
13514 {
13515 size_t maxlen = (end - p) - 1;
13516
13517 print_symbol ((int) maxlen, (const char *) p);
13518 p += strnlen ((char *) p, maxlen) + 1;
13519 }
13520 else
13521 {
13522 printf (_("<corrupt>"));
13523 p = (unsigned char *) end;
13524 }
071436c6 13525 putchar ('\n');
071436c6 13526 }
11c1ff18
PB
13527 break;
13528
f5f53991 13529 case 64: /* Tag_nodefaults. */
541a3cbd
NC
13530 /* PR 17531: file: 001-505008-0.01. */
13531 if (p < end)
13532 p++;
2b692964 13533 printf (_("True\n"));
f5f53991
AS
13534 break;
13535
13536 case 65: /* Tag_also_compatible_with. */
f6f0e17b 13537 val = read_uleb128 (p, &len, end);
f5f53991
AS
13538 p += len;
13539 if (val == 6 /* Tag_CPU_arch. */)
13540 {
f6f0e17b 13541 val = read_uleb128 (p, &len, end);
f5f53991 13542 p += len;
071436c6 13543 if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
f5f53991
AS
13544 printf ("??? (%d)\n", val);
13545 else
13546 printf ("%s\n", arm_attr_tag_CPU_arch[val]);
13547 }
13548 else
13549 printf ("???\n");
071436c6
NC
13550 while (p < end && *(p++) != '\0' /* NUL terminator. */)
13551 ;
f5f53991
AS
13552 break;
13553
11c1ff18 13554 default:
bee0ee85
NC
13555 printf (_("<unknown: %d>\n"), tag);
13556 break;
11c1ff18
PB
13557 }
13558 return p;
13559
13560 case 1:
f6f0e17b 13561 return display_tag_value (-1, p, end);
11c1ff18 13562 case 2:
f6f0e17b 13563 return display_tag_value (0, p, end);
11c1ff18
PB
13564
13565 default:
13566 assert (attr->type & 0x80);
f6f0e17b 13567 val = read_uleb128 (p, &len, end);
11c1ff18
PB
13568 p += len;
13569 type = attr->type & 0x7f;
13570 if (val >= type)
13571 printf ("??? (%d)\n", val);
13572 else
13573 printf ("%s\n", attr->table[val]);
13574 return p;
13575 }
13576 }
11c1ff18 13577
f6f0e17b 13578 return display_tag_value (tag, p, end);
11c1ff18
PB
13579}
13580
104d59d1 13581static unsigned char *
60bca95a 13582display_gnu_attribute (unsigned char * p,
f6f0e17b
NC
13583 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const),
13584 const unsigned char * const end)
104d59d1
JM
13585{
13586 int tag;
13587 unsigned int len;
13588 int val;
104d59d1 13589
f6f0e17b 13590 tag = read_uleb128 (p, &len, end);
104d59d1
JM
13591 p += len;
13592
13593 /* Tag_compatibility is the only generic GNU attribute defined at
13594 present. */
13595 if (tag == 32)
13596 {
f6f0e17b 13597 val = read_uleb128 (p, &len, end);
104d59d1 13598 p += len;
071436c6
NC
13599
13600 printf (_("flag = %d, vendor = "), val);
f6f0e17b
NC
13601 if (p == end)
13602 {
071436c6 13603 printf (_("<corrupt>\n"));
f6f0e17b
NC
13604 warn (_("corrupt vendor attribute\n"));
13605 }
13606 else
13607 {
4082ef84
NC
13608 if (p < end - 1)
13609 {
13610 size_t maxlen = (end - p) - 1;
071436c6 13611
4082ef84
NC
13612 print_symbol ((int) maxlen, (const char *) p);
13613 p += strnlen ((char *) p, maxlen) + 1;
13614 }
13615 else
13616 {
13617 printf (_("<corrupt>"));
13618 p = (unsigned char *) end;
13619 }
071436c6 13620 putchar ('\n');
f6f0e17b 13621 }
104d59d1
JM
13622 return p;
13623 }
13624
13625 if ((tag & 2) == 0 && display_proc_gnu_attribute)
f6f0e17b 13626 return display_proc_gnu_attribute (p, tag, end);
104d59d1 13627
f6f0e17b 13628 return display_tag_value (tag, p, end);
104d59d1
JM
13629}
13630
34c8bcba 13631static unsigned char *
f6f0e17b
NC
13632display_power_gnu_attribute (unsigned char * p,
13633 int tag,
13634 const unsigned char * const end)
34c8bcba 13635{
34c8bcba 13636 unsigned int len;
005d79fd 13637 unsigned int val;
34c8bcba
JM
13638
13639 if (tag == Tag_GNU_Power_ABI_FP)
13640 {
f6f0e17b 13641 val = read_uleb128 (p, &len, end);
34c8bcba
JM
13642 p += len;
13643 printf (" Tag_GNU_Power_ABI_FP: ");
005d79fd
AM
13644 if (len == 0)
13645 {
13646 printf (_("<corrupt>\n"));
13647 return p;
13648 }
60bca95a 13649
005d79fd
AM
13650 if (val > 15)
13651 printf ("(%#x), ", val);
13652
13653 switch (val & 3)
34c8bcba
JM
13654 {
13655 case 0:
005d79fd 13656 printf (_("unspecified hard/soft float, "));
34c8bcba
JM
13657 break;
13658 case 1:
005d79fd 13659 printf (_("hard float, "));
34c8bcba
JM
13660 break;
13661 case 2:
005d79fd 13662 printf (_("soft float, "));
34c8bcba 13663 break;
3c7b9897 13664 case 3:
005d79fd 13665 printf (_("single-precision hard float, "));
3c7b9897 13666 break;
005d79fd
AM
13667 }
13668
13669 switch (val & 0xC)
13670 {
13671 case 0:
13672 printf (_("unspecified long double\n"));
13673 break;
13674 case 4:
13675 printf (_("128-bit IBM long double\n"));
13676 break;
13677 case 8:
13678 printf (_("64-bit long double\n"));
13679 break;
13680 case 12:
13681 printf (_("128-bit IEEE long double\n"));
34c8bcba
JM
13682 break;
13683 }
13684 return p;
005d79fd 13685 }
34c8bcba 13686
c6e65352
DJ
13687 if (tag == Tag_GNU_Power_ABI_Vector)
13688 {
f6f0e17b 13689 val = read_uleb128 (p, &len, end);
c6e65352
DJ
13690 p += len;
13691 printf (" Tag_GNU_Power_ABI_Vector: ");
005d79fd
AM
13692 if (len == 0)
13693 {
13694 printf (_("<corrupt>\n"));
13695 return p;
13696 }
13697
13698 if (val > 3)
13699 printf ("(%#x), ", val);
13700
13701 switch (val & 3)
c6e65352
DJ
13702 {
13703 case 0:
005d79fd 13704 printf (_("unspecified\n"));
c6e65352
DJ
13705 break;
13706 case 1:
005d79fd 13707 printf (_("generic\n"));
c6e65352
DJ
13708 break;
13709 case 2:
13710 printf ("AltiVec\n");
13711 break;
13712 case 3:
13713 printf ("SPE\n");
13714 break;
c6e65352
DJ
13715 }
13716 return p;
005d79fd 13717 }
c6e65352 13718
f82e0623
NF
13719 if (tag == Tag_GNU_Power_ABI_Struct_Return)
13720 {
005d79fd
AM
13721 val = read_uleb128 (p, &len, end);
13722 p += len;
13723 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
13724 if (len == 0)
f6f0e17b 13725 {
005d79fd 13726 printf (_("<corrupt>\n"));
f6f0e17b
NC
13727 return p;
13728 }
0b4362b0 13729
005d79fd
AM
13730 if (val > 2)
13731 printf ("(%#x), ", val);
13732
13733 switch (val & 3)
13734 {
13735 case 0:
13736 printf (_("unspecified\n"));
13737 break;
13738 case 1:
13739 printf ("r3/r4\n");
13740 break;
13741 case 2:
13742 printf (_("memory\n"));
13743 break;
13744 case 3:
13745 printf ("???\n");
13746 break;
13747 }
f82e0623
NF
13748 return p;
13749 }
13750
f6f0e17b 13751 return display_tag_value (tag & 1, p, end);
34c8bcba
JM
13752}
13753
643f7afb
AK
13754static unsigned char *
13755display_s390_gnu_attribute (unsigned char * p,
13756 int tag,
13757 const unsigned char * const end)
13758{
13759 unsigned int len;
13760 int val;
13761
13762 if (tag == Tag_GNU_S390_ABI_Vector)
13763 {
13764 val = read_uleb128 (p, &len, end);
13765 p += len;
13766 printf (" Tag_GNU_S390_ABI_Vector: ");
13767
13768 switch (val)
13769 {
13770 case 0:
13771 printf (_("any\n"));
13772 break;
13773 case 1:
13774 printf (_("software\n"));
13775 break;
13776 case 2:
13777 printf (_("hardware\n"));
13778 break;
13779 default:
13780 printf ("??? (%d)\n", val);
13781 break;
13782 }
13783 return p;
13784 }
13785
13786 return display_tag_value (tag & 1, p, end);
13787}
13788
9e8c70f9
DM
13789static void
13790display_sparc_hwcaps (int mask)
13791{
13792 if (mask)
13793 {
13794 int first = 1;
071436c6 13795
9e8c70f9
DM
13796 if (mask & ELF_SPARC_HWCAP_MUL32)
13797 fputs ("mul32", stdout), first = 0;
13798 if (mask & ELF_SPARC_HWCAP_DIV32)
13799 printf ("%sdiv32", first ? "" : "|"), first = 0;
13800 if (mask & ELF_SPARC_HWCAP_FSMULD)
13801 printf ("%sfsmuld", first ? "" : "|"), first = 0;
13802 if (mask & ELF_SPARC_HWCAP_V8PLUS)
13803 printf ("%sv8plus", first ? "" : "|"), first = 0;
13804 if (mask & ELF_SPARC_HWCAP_POPC)
13805 printf ("%spopc", first ? "" : "|"), first = 0;
13806 if (mask & ELF_SPARC_HWCAP_VIS)
13807 printf ("%svis", first ? "" : "|"), first = 0;
13808 if (mask & ELF_SPARC_HWCAP_VIS2)
13809 printf ("%svis2", first ? "" : "|"), first = 0;
13810 if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
13811 printf ("%sASIBlkInit", first ? "" : "|"), first = 0;
13812 if (mask & ELF_SPARC_HWCAP_FMAF)
13813 printf ("%sfmaf", first ? "" : "|"), first = 0;
13814 if (mask & ELF_SPARC_HWCAP_VIS3)
13815 printf ("%svis3", first ? "" : "|"), first = 0;
13816 if (mask & ELF_SPARC_HWCAP_HPC)
13817 printf ("%shpc", first ? "" : "|"), first = 0;
13818 if (mask & ELF_SPARC_HWCAP_RANDOM)
13819 printf ("%srandom", first ? "" : "|"), first = 0;
13820 if (mask & ELF_SPARC_HWCAP_TRANS)
13821 printf ("%strans", first ? "" : "|"), first = 0;
13822 if (mask & ELF_SPARC_HWCAP_FJFMAU)
13823 printf ("%sfjfmau", first ? "" : "|"), first = 0;
13824 if (mask & ELF_SPARC_HWCAP_IMA)
13825 printf ("%sima", first ? "" : "|"), first = 0;
13826 if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
13827 printf ("%scspare", first ? "" : "|"), first = 0;
13828 }
13829 else
071436c6
NC
13830 fputc ('0', stdout);
13831 fputc ('\n', stdout);
9e8c70f9
DM
13832}
13833
3d68f91c
JM
13834static void
13835display_sparc_hwcaps2 (int mask)
13836{
13837 if (mask)
13838 {
13839 int first = 1;
071436c6 13840
3d68f91c
JM
13841 if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
13842 fputs ("fjathplus", stdout), first = 0;
13843 if (mask & ELF_SPARC_HWCAP2_VIS3B)
13844 printf ("%svis3b", first ? "" : "|"), first = 0;
13845 if (mask & ELF_SPARC_HWCAP2_ADP)
13846 printf ("%sadp", first ? "" : "|"), first = 0;
13847 if (mask & ELF_SPARC_HWCAP2_SPARC5)
13848 printf ("%ssparc5", first ? "" : "|"), first = 0;
13849 if (mask & ELF_SPARC_HWCAP2_MWAIT)
13850 printf ("%smwait", first ? "" : "|"), first = 0;
13851 if (mask & ELF_SPARC_HWCAP2_XMPMUL)
13852 printf ("%sxmpmul", first ? "" : "|"), first = 0;
13853 if (mask & ELF_SPARC_HWCAP2_XMONT)
13854 printf ("%sxmont2", first ? "" : "|"), first = 0;
13855 if (mask & ELF_SPARC_HWCAP2_NSEC)
13856 printf ("%snsec", first ? "" : "|"), first = 0;
13857 if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
13858 printf ("%sfjathhpc", first ? "" : "|"), first = 0;
13859 if (mask & ELF_SPARC_HWCAP2_FJDES)
13860 printf ("%sfjdes", first ? "" : "|"), first = 0;
13861 if (mask & ELF_SPARC_HWCAP2_FJAES)
13862 printf ("%sfjaes", first ? "" : "|"), first = 0;
13863 }
13864 else
071436c6
NC
13865 fputc ('0', stdout);
13866 fputc ('\n', stdout);
3d68f91c
JM
13867}
13868
9e8c70f9 13869static unsigned char *
f6f0e17b
NC
13870display_sparc_gnu_attribute (unsigned char * p,
13871 int tag,
13872 const unsigned char * const end)
9e8c70f9 13873{
3d68f91c
JM
13874 unsigned int len;
13875 int val;
13876
9e8c70f9
DM
13877 if (tag == Tag_GNU_Sparc_HWCAPS)
13878 {
f6f0e17b 13879 val = read_uleb128 (p, &len, end);
9e8c70f9
DM
13880 p += len;
13881 printf (" Tag_GNU_Sparc_HWCAPS: ");
9e8c70f9
DM
13882 display_sparc_hwcaps (val);
13883 return p;
3d68f91c
JM
13884 }
13885 if (tag == Tag_GNU_Sparc_HWCAPS2)
13886 {
13887 val = read_uleb128 (p, &len, end);
13888 p += len;
13889 printf (" Tag_GNU_Sparc_HWCAPS2: ");
13890 display_sparc_hwcaps2 (val);
13891 return p;
13892 }
9e8c70f9 13893
f6f0e17b 13894 return display_tag_value (tag, p, end);
9e8c70f9
DM
13895}
13896
351cdf24
MF
13897static void
13898print_mips_fp_abi_value (int val)
13899{
13900 switch (val)
13901 {
13902 case Val_GNU_MIPS_ABI_FP_ANY:
13903 printf (_("Hard or soft float\n"));
13904 break;
13905 case Val_GNU_MIPS_ABI_FP_DOUBLE:
13906 printf (_("Hard float (double precision)\n"));
13907 break;
13908 case Val_GNU_MIPS_ABI_FP_SINGLE:
13909 printf (_("Hard float (single precision)\n"));
13910 break;
13911 case Val_GNU_MIPS_ABI_FP_SOFT:
13912 printf (_("Soft float\n"));
13913 break;
13914 case Val_GNU_MIPS_ABI_FP_OLD_64:
13915 printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
13916 break;
13917 case Val_GNU_MIPS_ABI_FP_XX:
13918 printf (_("Hard float (32-bit CPU, Any FPU)\n"));
13919 break;
13920 case Val_GNU_MIPS_ABI_FP_64:
13921 printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
13922 break;
13923 case Val_GNU_MIPS_ABI_FP_64A:
13924 printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
13925 break;
3350cc01
CM
13926 case Val_GNU_MIPS_ABI_FP_NAN2008:
13927 printf (_("NaN 2008 compatibility\n"));
13928 break;
351cdf24
MF
13929 default:
13930 printf ("??? (%d)\n", val);
13931 break;
13932 }
13933}
13934
2cf19d5c 13935static unsigned char *
f6f0e17b
NC
13936display_mips_gnu_attribute (unsigned char * p,
13937 int tag,
13938 const unsigned char * const end)
2cf19d5c 13939{
2cf19d5c
JM
13940 if (tag == Tag_GNU_MIPS_ABI_FP)
13941 {
f6f0e17b
NC
13942 unsigned int len;
13943 int val;
13944
13945 val = read_uleb128 (p, &len, end);
2cf19d5c
JM
13946 p += len;
13947 printf (" Tag_GNU_MIPS_ABI_FP: ");
60bca95a 13948
351cdf24
MF
13949 print_mips_fp_abi_value (val);
13950
2cf19d5c
JM
13951 return p;
13952 }
13953
a9f58168
CF
13954 if (tag == Tag_GNU_MIPS_ABI_MSA)
13955 {
13956 unsigned int len;
13957 int val;
13958
13959 val = read_uleb128 (p, &len, end);
13960 p += len;
13961 printf (" Tag_GNU_MIPS_ABI_MSA: ");
13962
13963 switch (val)
13964 {
13965 case Val_GNU_MIPS_ABI_MSA_ANY:
13966 printf (_("Any MSA or not\n"));
13967 break;
13968 case Val_GNU_MIPS_ABI_MSA_128:
13969 printf (_("128-bit MSA\n"));
13970 break;
13971 default:
13972 printf ("??? (%d)\n", val);
13973 break;
13974 }
13975 return p;
13976 }
13977
f6f0e17b 13978 return display_tag_value (tag & 1, p, end);
2cf19d5c
JM
13979}
13980
59e6276b 13981static unsigned char *
f6f0e17b
NC
13982display_tic6x_attribute (unsigned char * p,
13983 const unsigned char * const end)
59e6276b
JM
13984{
13985 int tag;
13986 unsigned int len;
13987 int val;
13988
f6f0e17b 13989 tag = read_uleb128 (p, &len, end);
59e6276b
JM
13990 p += len;
13991
13992 switch (tag)
13993 {
75fa6dc1 13994 case Tag_ISA:
f6f0e17b 13995 val = read_uleb128 (p, &len, end);
59e6276b 13996 p += len;
75fa6dc1 13997 printf (" Tag_ISA: ");
59e6276b
JM
13998
13999 switch (val)
14000 {
75fa6dc1 14001 case C6XABI_Tag_ISA_none:
59e6276b
JM
14002 printf (_("None\n"));
14003 break;
75fa6dc1 14004 case C6XABI_Tag_ISA_C62X:
59e6276b
JM
14005 printf ("C62x\n");
14006 break;
75fa6dc1 14007 case C6XABI_Tag_ISA_C67X:
59e6276b
JM
14008 printf ("C67x\n");
14009 break;
75fa6dc1 14010 case C6XABI_Tag_ISA_C67XP:
59e6276b
JM
14011 printf ("C67x+\n");
14012 break;
75fa6dc1 14013 case C6XABI_Tag_ISA_C64X:
59e6276b
JM
14014 printf ("C64x\n");
14015 break;
75fa6dc1 14016 case C6XABI_Tag_ISA_C64XP:
59e6276b
JM
14017 printf ("C64x+\n");
14018 break;
75fa6dc1 14019 case C6XABI_Tag_ISA_C674X:
59e6276b
JM
14020 printf ("C674x\n");
14021 break;
14022 default:
14023 printf ("??? (%d)\n", val);
14024 break;
14025 }
14026 return p;
14027
87779176 14028 case Tag_ABI_wchar_t:
f6f0e17b 14029 val = read_uleb128 (p, &len, end);
87779176
JM
14030 p += len;
14031 printf (" Tag_ABI_wchar_t: ");
14032 switch (val)
14033 {
14034 case 0:
14035 printf (_("Not used\n"));
14036 break;
14037 case 1:
14038 printf (_("2 bytes\n"));
14039 break;
14040 case 2:
14041 printf (_("4 bytes\n"));
14042 break;
14043 default:
14044 printf ("??? (%d)\n", val);
14045 break;
14046 }
14047 return p;
14048
14049 case Tag_ABI_stack_align_needed:
f6f0e17b 14050 val = read_uleb128 (p, &len, end);
87779176
JM
14051 p += len;
14052 printf (" Tag_ABI_stack_align_needed: ");
14053 switch (val)
14054 {
14055 case 0:
14056 printf (_("8-byte\n"));
14057 break;
14058 case 1:
14059 printf (_("16-byte\n"));
14060 break;
14061 default:
14062 printf ("??? (%d)\n", val);
14063 break;
14064 }
14065 return p;
14066
14067 case Tag_ABI_stack_align_preserved:
f6f0e17b 14068 val = read_uleb128 (p, &len, end);
87779176
JM
14069 p += len;
14070 printf (" Tag_ABI_stack_align_preserved: ");
14071 switch (val)
14072 {
14073 case 0:
14074 printf (_("8-byte\n"));
14075 break;
14076 case 1:
14077 printf (_("16-byte\n"));
14078 break;
14079 default:
14080 printf ("??? (%d)\n", val);
14081 break;
14082 }
14083 return p;
14084
b5593623 14085 case Tag_ABI_DSBT:
f6f0e17b 14086 val = read_uleb128 (p, &len, end);
b5593623
JM
14087 p += len;
14088 printf (" Tag_ABI_DSBT: ");
14089 switch (val)
14090 {
14091 case 0:
14092 printf (_("DSBT addressing not used\n"));
14093 break;
14094 case 1:
14095 printf (_("DSBT addressing used\n"));
14096 break;
14097 default:
14098 printf ("??? (%d)\n", val);
14099 break;
14100 }
14101 return p;
14102
87779176 14103 case Tag_ABI_PID:
f6f0e17b 14104 val = read_uleb128 (p, &len, end);
87779176
JM
14105 p += len;
14106 printf (" Tag_ABI_PID: ");
14107 switch (val)
14108 {
14109 case 0:
14110 printf (_("Data addressing position-dependent\n"));
14111 break;
14112 case 1:
14113 printf (_("Data addressing position-independent, GOT near DP\n"));
14114 break;
14115 case 2:
14116 printf (_("Data addressing position-independent, GOT far from DP\n"));
14117 break;
14118 default:
14119 printf ("??? (%d)\n", val);
14120 break;
14121 }
14122 return p;
14123
14124 case Tag_ABI_PIC:
f6f0e17b 14125 val = read_uleb128 (p, &len, end);
87779176
JM
14126 p += len;
14127 printf (" Tag_ABI_PIC: ");
14128 switch (val)
14129 {
14130 case 0:
14131 printf (_("Code addressing position-dependent\n"));
14132 break;
14133 case 1:
14134 printf (_("Code addressing position-independent\n"));
14135 break;
14136 default:
14137 printf ("??? (%d)\n", val);
14138 break;
14139 }
14140 return p;
14141
14142 case Tag_ABI_array_object_alignment:
f6f0e17b 14143 val = read_uleb128 (p, &len, end);
87779176
JM
14144 p += len;
14145 printf (" Tag_ABI_array_object_alignment: ");
14146 switch (val)
14147 {
14148 case 0:
14149 printf (_("8-byte\n"));
14150 break;
14151 case 1:
14152 printf (_("4-byte\n"));
14153 break;
14154 case 2:
14155 printf (_("16-byte\n"));
14156 break;
14157 default:
14158 printf ("??? (%d)\n", val);
14159 break;
14160 }
14161 return p;
14162
14163 case Tag_ABI_array_object_align_expected:
f6f0e17b 14164 val = read_uleb128 (p, &len, end);
87779176
JM
14165 p += len;
14166 printf (" Tag_ABI_array_object_align_expected: ");
14167 switch (val)
14168 {
14169 case 0:
14170 printf (_("8-byte\n"));
14171 break;
14172 case 1:
14173 printf (_("4-byte\n"));
14174 break;
14175 case 2:
14176 printf (_("16-byte\n"));
14177 break;
14178 default:
14179 printf ("??? (%d)\n", val);
14180 break;
14181 }
14182 return p;
14183
3cbd1c06 14184 case Tag_ABI_compatibility:
071436c6 14185 {
071436c6
NC
14186 val = read_uleb128 (p, &len, end);
14187 p += len;
14188 printf (" Tag_ABI_compatibility: ");
071436c6 14189 printf (_("flag = %d, vendor = "), val);
4082ef84
NC
14190 if (p < end - 1)
14191 {
14192 size_t maxlen = (end - p) - 1;
14193
14194 print_symbol ((int) maxlen, (const char *) p);
14195 p += strnlen ((char *) p, maxlen) + 1;
14196 }
14197 else
14198 {
14199 printf (_("<corrupt>"));
14200 p = (unsigned char *) end;
14201 }
071436c6 14202 putchar ('\n');
071436c6
NC
14203 return p;
14204 }
87779176
JM
14205
14206 case Tag_ABI_conformance:
071436c6 14207 {
4082ef84
NC
14208 printf (" Tag_ABI_conformance: \"");
14209 if (p < end - 1)
14210 {
14211 size_t maxlen = (end - p) - 1;
071436c6 14212
4082ef84
NC
14213 print_symbol ((int) maxlen, (const char *) p);
14214 p += strnlen ((char *) p, maxlen) + 1;
14215 }
14216 else
14217 {
14218 printf (_("<corrupt>"));
14219 p = (unsigned char *) end;
14220 }
071436c6 14221 printf ("\"\n");
071436c6
NC
14222 return p;
14223 }
59e6276b
JM
14224 }
14225
f6f0e17b
NC
14226 return display_tag_value (tag, p, end);
14227}
59e6276b 14228
f6f0e17b
NC
14229static void
14230display_raw_attribute (unsigned char * p, unsigned char * end)
14231{
14232 unsigned long addr = 0;
14233 size_t bytes = end - p;
14234
e0a31db1 14235 assert (end > p);
f6f0e17b 14236 while (bytes)
87779176 14237 {
f6f0e17b
NC
14238 int j;
14239 int k;
14240 int lbytes = (bytes > 16 ? 16 : bytes);
14241
14242 printf (" 0x%8.8lx ", addr);
14243
14244 for (j = 0; j < 16; j++)
14245 {
14246 if (j < lbytes)
14247 printf ("%2.2x", p[j]);
14248 else
14249 printf (" ");
14250
14251 if ((j & 3) == 3)
14252 printf (" ");
14253 }
14254
14255 for (j = 0; j < lbytes; j++)
14256 {
14257 k = p[j];
14258 if (k >= ' ' && k < 0x7f)
14259 printf ("%c", k);
14260 else
14261 printf (".");
14262 }
14263
14264 putchar ('\n');
14265
14266 p += lbytes;
14267 bytes -= lbytes;
14268 addr += lbytes;
87779176 14269 }
59e6276b 14270
f6f0e17b 14271 putchar ('\n');
59e6276b
JM
14272}
14273
13761a11
NC
14274static unsigned char *
14275display_msp430x_attribute (unsigned char * p,
14276 const unsigned char * const end)
14277{
14278 unsigned int len;
14279 int val;
14280 int tag;
14281
14282 tag = read_uleb128 (p, & len, end);
14283 p += len;
0b4362b0 14284
13761a11
NC
14285 switch (tag)
14286 {
14287 case OFBA_MSPABI_Tag_ISA:
14288 val = read_uleb128 (p, &len, end);
14289 p += len;
14290 printf (" Tag_ISA: ");
14291 switch (val)
14292 {
14293 case 0: printf (_("None\n")); break;
14294 case 1: printf (_("MSP430\n")); break;
14295 case 2: printf (_("MSP430X\n")); break;
14296 default: printf ("??? (%d)\n", val); break;
14297 }
14298 break;
14299
14300 case OFBA_MSPABI_Tag_Code_Model:
14301 val = read_uleb128 (p, &len, end);
14302 p += len;
14303 printf (" Tag_Code_Model: ");
14304 switch (val)
14305 {
14306 case 0: printf (_("None\n")); break;
14307 case 1: printf (_("Small\n")); break;
14308 case 2: printf (_("Large\n")); break;
14309 default: printf ("??? (%d)\n", val); break;
14310 }
14311 break;
14312
14313 case OFBA_MSPABI_Tag_Data_Model:
14314 val = read_uleb128 (p, &len, end);
14315 p += len;
14316 printf (" Tag_Data_Model: ");
14317 switch (val)
14318 {
14319 case 0: printf (_("None\n")); break;
14320 case 1: printf (_("Small\n")); break;
14321 case 2: printf (_("Large\n")); break;
14322 case 3: printf (_("Restricted Large\n")); break;
14323 default: printf ("??? (%d)\n", val); break;
14324 }
14325 break;
14326
14327 default:
14328 printf (_(" <unknown tag %d>: "), tag);
14329
14330 if (tag & 1)
14331 {
071436c6 14332 putchar ('"');
4082ef84
NC
14333 if (p < end - 1)
14334 {
14335 size_t maxlen = (end - p) - 1;
14336
14337 print_symbol ((int) maxlen, (const char *) p);
14338 p += strnlen ((char *) p, maxlen) + 1;
14339 }
14340 else
14341 {
14342 printf (_("<corrupt>"));
14343 p = (unsigned char *) end;
14344 }
071436c6 14345 printf ("\"\n");
13761a11
NC
14346 }
14347 else
14348 {
14349 val = read_uleb128 (p, &len, end);
14350 p += len;
14351 printf ("%d (0x%x)\n", val, val);
14352 }
14353 break;
14354 }
14355
4082ef84 14356 assert (p <= end);
13761a11
NC
14357 return p;
14358}
14359
11c1ff18 14360static int
60bca95a
NC
14361process_attributes (FILE * file,
14362 const char * public_name,
104d59d1 14363 unsigned int proc_type,
f6f0e17b
NC
14364 unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
14365 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const))
11c1ff18 14366{
2cf0635d 14367 Elf_Internal_Shdr * sect;
11c1ff18
PB
14368 unsigned i;
14369
14370 /* Find the section header so that we get the size. */
14371 for (i = 0, sect = section_headers;
14372 i < elf_header.e_shnum;
14373 i++, sect++)
14374 {
071436c6
NC
14375 unsigned char * contents;
14376 unsigned char * p;
14377
104d59d1 14378 if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
11c1ff18
PB
14379 continue;
14380
3f5e193b
NC
14381 contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
14382 sect->sh_size, _("attributes"));
60bca95a 14383 if (contents == NULL)
11c1ff18 14384 continue;
60bca95a 14385
11c1ff18
PB
14386 p = contents;
14387 if (*p == 'A')
14388 {
071436c6
NC
14389 bfd_vma section_len;
14390
14391 section_len = sect->sh_size - 1;
11c1ff18 14392 p++;
60bca95a 14393
071436c6 14394 while (section_len > 0)
11c1ff18 14395 {
071436c6 14396 bfd_vma attr_len;
e9847026 14397 unsigned int namelen;
11c1ff18 14398 bfd_boolean public_section;
104d59d1 14399 bfd_boolean gnu_section;
11c1ff18 14400
071436c6 14401 if (section_len <= 4)
e0a31db1
NC
14402 {
14403 error (_("Tag section ends prematurely\n"));
14404 break;
14405 }
071436c6 14406 attr_len = byte_get (p, 4);
11c1ff18 14407 p += 4;
60bca95a 14408
071436c6 14409 if (attr_len > section_len)
11c1ff18 14410 {
071436c6
NC
14411 error (_("Bad attribute length (%u > %u)\n"),
14412 (unsigned) attr_len, (unsigned) section_len);
14413 attr_len = section_len;
11c1ff18 14414 }
74e1a04b 14415 /* PR 17531: file: 001-101425-0.004 */
071436c6 14416 else if (attr_len < 5)
74e1a04b 14417 {
071436c6 14418 error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
74e1a04b
NC
14419 break;
14420 }
e9847026 14421
071436c6
NC
14422 section_len -= attr_len;
14423 attr_len -= 4;
14424
14425 namelen = strnlen ((char *) p, attr_len) + 1;
14426 if (namelen == 0 || namelen >= attr_len)
e9847026
NC
14427 {
14428 error (_("Corrupt attribute section name\n"));
14429 break;
14430 }
14431
071436c6
NC
14432 printf (_("Attribute Section: "));
14433 print_symbol (INT_MAX, (const char *) p);
14434 putchar ('\n');
60bca95a
NC
14435
14436 if (public_name && streq ((char *) p, public_name))
11c1ff18
PB
14437 public_section = TRUE;
14438 else
14439 public_section = FALSE;
60bca95a
NC
14440
14441 if (streq ((char *) p, "gnu"))
104d59d1
JM
14442 gnu_section = TRUE;
14443 else
14444 gnu_section = FALSE;
60bca95a 14445
11c1ff18 14446 p += namelen;
071436c6 14447 attr_len -= namelen;
e0a31db1 14448
071436c6 14449 while (attr_len > 0 && p < contents + sect->sh_size)
11c1ff18 14450 {
e0a31db1 14451 int tag;
11c1ff18
PB
14452 int val;
14453 bfd_vma size;
071436c6 14454 unsigned char * end;
60bca95a 14455
e0a31db1 14456 /* PR binutils/17531: Safe handling of corrupt files. */
071436c6 14457 if (attr_len < 6)
e0a31db1
NC
14458 {
14459 error (_("Unused bytes at end of section\n"));
14460 section_len = 0;
14461 break;
14462 }
14463
14464 tag = *(p++);
11c1ff18 14465 size = byte_get (p, 4);
071436c6 14466 if (size > attr_len)
11c1ff18 14467 {
e9847026 14468 error (_("Bad subsection length (%u > %u)\n"),
071436c6
NC
14469 (unsigned) size, (unsigned) attr_len);
14470 size = attr_len;
11c1ff18 14471 }
e0a31db1
NC
14472 /* PR binutils/17531: Safe handling of corrupt files. */
14473 if (size < 6)
14474 {
14475 error (_("Bad subsection length (%u < 6)\n"),
14476 (unsigned) size);
14477 section_len = 0;
14478 break;
14479 }
60bca95a 14480
071436c6 14481 attr_len -= size;
11c1ff18 14482 end = p + size - 1;
071436c6 14483 assert (end <= contents + sect->sh_size);
11c1ff18 14484 p += 4;
60bca95a 14485
11c1ff18
PB
14486 switch (tag)
14487 {
14488 case 1:
2b692964 14489 printf (_("File Attributes\n"));
11c1ff18
PB
14490 break;
14491 case 2:
2b692964 14492 printf (_("Section Attributes:"));
11c1ff18
PB
14493 goto do_numlist;
14494 case 3:
2b692964 14495 printf (_("Symbol Attributes:"));
1a0670f3 14496 /* Fall through. */
11c1ff18
PB
14497 do_numlist:
14498 for (;;)
14499 {
91d6fa6a 14500 unsigned int j;
60bca95a 14501
f6f0e17b 14502 val = read_uleb128 (p, &j, end);
91d6fa6a 14503 p += j;
11c1ff18
PB
14504 if (val == 0)
14505 break;
14506 printf (" %d", val);
14507 }
14508 printf ("\n");
14509 break;
14510 default:
2b692964 14511 printf (_("Unknown tag: %d\n"), tag);
11c1ff18
PB
14512 public_section = FALSE;
14513 break;
14514 }
60bca95a 14515
071436c6 14516 if (public_section && display_pub_attribute != NULL)
11c1ff18
PB
14517 {
14518 while (p < end)
f6f0e17b 14519 p = display_pub_attribute (p, end);
071436c6 14520 assert (p <= end);
104d59d1 14521 }
071436c6 14522 else if (gnu_section && display_proc_gnu_attribute != NULL)
104d59d1
JM
14523 {
14524 while (p < end)
14525 p = display_gnu_attribute (p,
f6f0e17b
NC
14526 display_proc_gnu_attribute,
14527 end);
071436c6 14528 assert (p <= end);
11c1ff18 14529 }
071436c6 14530 else if (p < end)
11c1ff18 14531 {
071436c6 14532 printf (_(" Unknown attribute:\n"));
f6f0e17b 14533 display_raw_attribute (p, end);
11c1ff18
PB
14534 p = end;
14535 }
071436c6
NC
14536 else
14537 attr_len = 0;
11c1ff18
PB
14538 }
14539 }
14540 }
14541 else
e9847026 14542 printf (_("Unknown format '%c' (%d)\n"), *p, *p);
d70c5fc7 14543
60bca95a 14544 free (contents);
11c1ff18
PB
14545 }
14546 return 1;
14547}
14548
104d59d1 14549static int
2cf0635d 14550process_arm_specific (FILE * file)
104d59d1
JM
14551{
14552 return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
14553 display_arm_attribute, NULL);
14554}
14555
34c8bcba 14556static int
2cf0635d 14557process_power_specific (FILE * file)
34c8bcba
JM
14558{
14559 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14560 display_power_gnu_attribute);
14561}
14562
643f7afb
AK
14563static int
14564process_s390_specific (FILE * file)
14565{
14566 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14567 display_s390_gnu_attribute);
14568}
14569
9e8c70f9
DM
14570static int
14571process_sparc_specific (FILE * file)
14572{
14573 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14574 display_sparc_gnu_attribute);
14575}
14576
59e6276b
JM
14577static int
14578process_tic6x_specific (FILE * file)
14579{
14580 return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
14581 display_tic6x_attribute, NULL);
14582}
14583
13761a11
NC
14584static int
14585process_msp430x_specific (FILE * file)
14586{
14587 return process_attributes (file, "mspabi", SHT_MSP430_ATTRIBUTES,
14588 display_msp430x_attribute, NULL);
14589}
14590
ccb4c951
RS
14591/* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
14592 Print the Address, Access and Initial fields of an entry at VMA ADDR
82b1b41b
NC
14593 and return the VMA of the next entry, or -1 if there was a problem.
14594 Does not read from DATA_END or beyond. */
ccb4c951
RS
14595
14596static bfd_vma
82b1b41b
NC
14597print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
14598 unsigned char * data_end)
ccb4c951
RS
14599{
14600 printf (" ");
14601 print_vma (addr, LONG_HEX);
14602 printf (" ");
14603 if (addr < pltgot + 0xfff0)
14604 printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
14605 else
14606 printf ("%10s", "");
14607 printf (" ");
14608 if (data == NULL)
2b692964 14609 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
ccb4c951
RS
14610 else
14611 {
14612 bfd_vma entry;
82b1b41b 14613 unsigned char * from = data + addr - pltgot;
ccb4c951 14614
82b1b41b
NC
14615 if (from + (is_32bit_elf ? 4 : 8) > data_end)
14616 {
14617 warn (_("MIPS GOT entry extends beyond the end of available data\n"));
14618 printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
14619 return (bfd_vma) -1;
14620 }
14621 else
14622 {
14623 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14624 print_vma (entry, LONG_HEX);
14625 }
ccb4c951
RS
14626 }
14627 return addr + (is_32bit_elf ? 4 : 8);
14628}
14629
861fb55a
DJ
14630/* DATA points to the contents of a MIPS PLT GOT that starts at VMA
14631 PLTGOT. Print the Address and Initial fields of an entry at VMA
14632 ADDR and return the VMA of the next entry. */
14633
14634static bfd_vma
2cf0635d 14635print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
861fb55a
DJ
14636{
14637 printf (" ");
14638 print_vma (addr, LONG_HEX);
14639 printf (" ");
14640 if (data == NULL)
2b692964 14641 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
861fb55a
DJ
14642 else
14643 {
14644 bfd_vma entry;
14645
14646 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14647 print_vma (entry, LONG_HEX);
14648 }
14649 return addr + (is_32bit_elf ? 4 : 8);
14650}
14651
351cdf24
MF
14652static void
14653print_mips_ases (unsigned int mask)
14654{
14655 if (mask & AFL_ASE_DSP)
14656 fputs ("\n\tDSP ASE", stdout);
14657 if (mask & AFL_ASE_DSPR2)
14658 fputs ("\n\tDSP R2 ASE", stdout);
8f4f9071
MF
14659 if (mask & AFL_ASE_DSPR3)
14660 fputs ("\n\tDSP R3 ASE", stdout);
351cdf24
MF
14661 if (mask & AFL_ASE_EVA)
14662 fputs ("\n\tEnhanced VA Scheme", stdout);
14663 if (mask & AFL_ASE_MCU)
14664 fputs ("\n\tMCU (MicroController) ASE", stdout);
14665 if (mask & AFL_ASE_MDMX)
14666 fputs ("\n\tMDMX ASE", stdout);
14667 if (mask & AFL_ASE_MIPS3D)
14668 fputs ("\n\tMIPS-3D ASE", stdout);
14669 if (mask & AFL_ASE_MT)
14670 fputs ("\n\tMT ASE", stdout);
14671 if (mask & AFL_ASE_SMARTMIPS)
14672 fputs ("\n\tSmartMIPS ASE", stdout);
14673 if (mask & AFL_ASE_VIRT)
14674 fputs ("\n\tVZ ASE", stdout);
14675 if (mask & AFL_ASE_MSA)
14676 fputs ("\n\tMSA ASE", stdout);
14677 if (mask & AFL_ASE_MIPS16)
14678 fputs ("\n\tMIPS16 ASE", stdout);
14679 if (mask & AFL_ASE_MICROMIPS)
14680 fputs ("\n\tMICROMIPS ASE", stdout);
14681 if (mask & AFL_ASE_XPA)
14682 fputs ("\n\tXPA ASE", stdout);
14683 if (mask == 0)
14684 fprintf (stdout, "\n\t%s", _("None"));
00ac7aa0
MF
14685 else if ((mask & ~AFL_ASE_MASK) != 0)
14686 fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
351cdf24
MF
14687}
14688
14689static void
14690print_mips_isa_ext (unsigned int isa_ext)
14691{
14692 switch (isa_ext)
14693 {
14694 case 0:
14695 fputs (_("None"), stdout);
14696 break;
14697 case AFL_EXT_XLR:
14698 fputs ("RMI XLR", stdout);
14699 break;
2c629856
N
14700 case AFL_EXT_OCTEON3:
14701 fputs ("Cavium Networks Octeon3", stdout);
14702 break;
351cdf24
MF
14703 case AFL_EXT_OCTEON2:
14704 fputs ("Cavium Networks Octeon2", stdout);
14705 break;
14706 case AFL_EXT_OCTEONP:
14707 fputs ("Cavium Networks OcteonP", stdout);
14708 break;
14709 case AFL_EXT_LOONGSON_3A:
14710 fputs ("Loongson 3A", stdout);
14711 break;
14712 case AFL_EXT_OCTEON:
14713 fputs ("Cavium Networks Octeon", stdout);
14714 break;
14715 case AFL_EXT_5900:
14716 fputs ("Toshiba R5900", stdout);
14717 break;
14718 case AFL_EXT_4650:
14719 fputs ("MIPS R4650", stdout);
14720 break;
14721 case AFL_EXT_4010:
14722 fputs ("LSI R4010", stdout);
14723 break;
14724 case AFL_EXT_4100:
14725 fputs ("NEC VR4100", stdout);
14726 break;
14727 case AFL_EXT_3900:
14728 fputs ("Toshiba R3900", stdout);
14729 break;
14730 case AFL_EXT_10000:
14731 fputs ("MIPS R10000", stdout);
14732 break;
14733 case AFL_EXT_SB1:
14734 fputs ("Broadcom SB-1", stdout);
14735 break;
14736 case AFL_EXT_4111:
14737 fputs ("NEC VR4111/VR4181", stdout);
14738 break;
14739 case AFL_EXT_4120:
14740 fputs ("NEC VR4120", stdout);
14741 break;
14742 case AFL_EXT_5400:
14743 fputs ("NEC VR5400", stdout);
14744 break;
14745 case AFL_EXT_5500:
14746 fputs ("NEC VR5500", stdout);
14747 break;
14748 case AFL_EXT_LOONGSON_2E:
14749 fputs ("ST Microelectronics Loongson 2E", stdout);
14750 break;
14751 case AFL_EXT_LOONGSON_2F:
14752 fputs ("ST Microelectronics Loongson 2F", stdout);
14753 break;
14754 default:
00ac7aa0 14755 fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
351cdf24
MF
14756 }
14757}
14758
14759static int
14760get_mips_reg_size (int reg_size)
14761{
14762 return (reg_size == AFL_REG_NONE) ? 0
14763 : (reg_size == AFL_REG_32) ? 32
14764 : (reg_size == AFL_REG_64) ? 64
14765 : (reg_size == AFL_REG_128) ? 128
14766 : -1;
14767}
14768
19e6b90e 14769static int
2cf0635d 14770process_mips_specific (FILE * file)
5b18a4bc 14771{
2cf0635d 14772 Elf_Internal_Dyn * entry;
351cdf24 14773 Elf_Internal_Shdr *sect = NULL;
19e6b90e
L
14774 size_t liblist_offset = 0;
14775 size_t liblistno = 0;
14776 size_t conflictsno = 0;
14777 size_t options_offset = 0;
14778 size_t conflicts_offset = 0;
861fb55a
DJ
14779 size_t pltrelsz = 0;
14780 size_t pltrel = 0;
ccb4c951 14781 bfd_vma pltgot = 0;
861fb55a
DJ
14782 bfd_vma mips_pltgot = 0;
14783 bfd_vma jmprel = 0;
ccb4c951
RS
14784 bfd_vma local_gotno = 0;
14785 bfd_vma gotsym = 0;
14786 bfd_vma symtabno = 0;
103f02d3 14787
2cf19d5c
JM
14788 process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14789 display_mips_gnu_attribute);
14790
351cdf24
MF
14791 sect = find_section (".MIPS.abiflags");
14792
14793 if (sect != NULL)
14794 {
14795 Elf_External_ABIFlags_v0 *abiflags_ext;
14796 Elf_Internal_ABIFlags_v0 abiflags_in;
14797
14798 if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
14799 fputs ("\nCorrupt ABI Flags section.\n", stdout);
14800 else
14801 {
14802 abiflags_ext = get_data (NULL, file, sect->sh_offset, 1,
14803 sect->sh_size, _("MIPS ABI Flags section"));
14804 if (abiflags_ext)
14805 {
14806 abiflags_in.version = BYTE_GET (abiflags_ext->version);
14807 abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
14808 abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
14809 abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
14810 abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
14811 abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
14812 abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
14813 abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
14814 abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
14815 abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
14816 abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
14817
14818 printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
14819 printf ("\nISA: MIPS%d", abiflags_in.isa_level);
14820 if (abiflags_in.isa_rev > 1)
14821 printf ("r%d", abiflags_in.isa_rev);
14822 printf ("\nGPR size: %d",
14823 get_mips_reg_size (abiflags_in.gpr_size));
14824 printf ("\nCPR1 size: %d",
14825 get_mips_reg_size (abiflags_in.cpr1_size));
14826 printf ("\nCPR2 size: %d",
14827 get_mips_reg_size (abiflags_in.cpr2_size));
14828 fputs ("\nFP ABI: ", stdout);
14829 print_mips_fp_abi_value (abiflags_in.fp_abi);
14830 fputs ("ISA Extension: ", stdout);
14831 print_mips_isa_ext (abiflags_in.isa_ext);
14832 fputs ("\nASEs:", stdout);
14833 print_mips_ases (abiflags_in.ases);
14834 printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
14835 printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
14836 fputc ('\n', stdout);
14837 free (abiflags_ext);
14838 }
14839 }
14840 }
14841
19e6b90e
L
14842 /* We have a lot of special sections. Thanks SGI! */
14843 if (dynamic_section == NULL)
14844 /* No information available. */
14845 return 0;
252b5132 14846
071436c6
NC
14847 for (entry = dynamic_section;
14848 /* PR 17531 file: 012-50589-0.004. */
14849 entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
14850 ++entry)
252b5132
RH
14851 switch (entry->d_tag)
14852 {
14853 case DT_MIPS_LIBLIST:
d93f0186
NC
14854 liblist_offset
14855 = offset_from_vma (file, entry->d_un.d_val,
14856 liblistno * sizeof (Elf32_External_Lib));
252b5132
RH
14857 break;
14858 case DT_MIPS_LIBLISTNO:
14859 liblistno = entry->d_un.d_val;
14860 break;
14861 case DT_MIPS_OPTIONS:
d93f0186 14862 options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
252b5132
RH
14863 break;
14864 case DT_MIPS_CONFLICT:
d93f0186
NC
14865 conflicts_offset
14866 = offset_from_vma (file, entry->d_un.d_val,
14867 conflictsno * sizeof (Elf32_External_Conflict));
252b5132
RH
14868 break;
14869 case DT_MIPS_CONFLICTNO:
14870 conflictsno = entry->d_un.d_val;
14871 break;
ccb4c951 14872 case DT_PLTGOT:
861fb55a
DJ
14873 pltgot = entry->d_un.d_ptr;
14874 break;
ccb4c951
RS
14875 case DT_MIPS_LOCAL_GOTNO:
14876 local_gotno = entry->d_un.d_val;
14877 break;
14878 case DT_MIPS_GOTSYM:
14879 gotsym = entry->d_un.d_val;
14880 break;
14881 case DT_MIPS_SYMTABNO:
14882 symtabno = entry->d_un.d_val;
14883 break;
861fb55a
DJ
14884 case DT_MIPS_PLTGOT:
14885 mips_pltgot = entry->d_un.d_ptr;
14886 break;
14887 case DT_PLTREL:
14888 pltrel = entry->d_un.d_val;
14889 break;
14890 case DT_PLTRELSZ:
14891 pltrelsz = entry->d_un.d_val;
14892 break;
14893 case DT_JMPREL:
14894 jmprel = entry->d_un.d_ptr;
14895 break;
252b5132
RH
14896 default:
14897 break;
14898 }
14899
14900 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
14901 {
2cf0635d 14902 Elf32_External_Lib * elib;
252b5132
RH
14903 size_t cnt;
14904
3f5e193b
NC
14905 elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
14906 liblistno,
14907 sizeof (Elf32_External_Lib),
9cf03b7e 14908 _("liblist section data"));
a6e9f9df 14909 if (elib)
252b5132 14910 {
2b692964 14911 printf (_("\nSection '.liblist' contains %lu entries:\n"),
a6e9f9df 14912 (unsigned long) liblistno);
2b692964 14913 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
a6e9f9df
AM
14914 stdout);
14915
14916 for (cnt = 0; cnt < liblistno; ++cnt)
252b5132 14917 {
a6e9f9df 14918 Elf32_Lib liblist;
91d6fa6a 14919 time_t atime;
d5b07ef4 14920 char timebuf[128];
2cf0635d 14921 struct tm * tmp;
a6e9f9df
AM
14922
14923 liblist.l_name = BYTE_GET (elib[cnt].l_name);
91d6fa6a 14924 atime = BYTE_GET (elib[cnt].l_time_stamp);
a6e9f9df
AM
14925 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
14926 liblist.l_version = BYTE_GET (elib[cnt].l_version);
14927 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
14928
91d6fa6a 14929 tmp = gmtime (&atime);
e9e44622
JJ
14930 snprintf (timebuf, sizeof (timebuf),
14931 "%04u-%02u-%02uT%02u:%02u:%02u",
14932 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
14933 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
a6e9f9df 14934
31104126 14935 printf ("%3lu: ", (unsigned long) cnt);
d79b3d50
NC
14936 if (VALID_DYNAMIC_NAME (liblist.l_name))
14937 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
14938 else
2b692964 14939 printf (_("<corrupt: %9ld>"), liblist.l_name);
31104126
NC
14940 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
14941 liblist.l_version);
a6e9f9df
AM
14942
14943 if (liblist.l_flags == 0)
2b692964 14944 puts (_(" NONE"));
a6e9f9df
AM
14945 else
14946 {
14947 static const struct
252b5132 14948 {
2cf0635d 14949 const char * name;
a6e9f9df 14950 int bit;
252b5132 14951 }
a6e9f9df
AM
14952 l_flags_vals[] =
14953 {
14954 { " EXACT_MATCH", LL_EXACT_MATCH },
14955 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
14956 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
14957 { " EXPORTS", LL_EXPORTS },
14958 { " DELAY_LOAD", LL_DELAY_LOAD },
14959 { " DELTA", LL_DELTA }
14960 };
14961 int flags = liblist.l_flags;
14962 size_t fcnt;
14963
60bca95a 14964 for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
a6e9f9df
AM
14965 if ((flags & l_flags_vals[fcnt].bit) != 0)
14966 {
14967 fputs (l_flags_vals[fcnt].name, stdout);
14968 flags ^= l_flags_vals[fcnt].bit;
14969 }
14970 if (flags != 0)
14971 printf (" %#x", (unsigned int) flags);
252b5132 14972
a6e9f9df
AM
14973 puts ("");
14974 }
252b5132 14975 }
252b5132 14976
a6e9f9df
AM
14977 free (elib);
14978 }
252b5132
RH
14979 }
14980
14981 if (options_offset != 0)
14982 {
2cf0635d 14983 Elf_External_Options * eopt;
2cf0635d
NC
14984 Elf_Internal_Options * iopt;
14985 Elf_Internal_Options * option;
252b5132
RH
14986 size_t offset;
14987 int cnt;
351cdf24 14988 sect = section_headers;
252b5132
RH
14989
14990 /* Find the section header so that we get the size. */
071436c6 14991 sect = find_section_by_type (SHT_MIPS_OPTIONS);
948f632f 14992 /* PR 17533 file: 012-277276-0.004. */
071436c6
NC
14993 if (sect == NULL)
14994 {
14995 error (_("No MIPS_OPTIONS header found\n"));
14996 return 0;
14997 }
252b5132 14998
3f5e193b
NC
14999 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
15000 sect->sh_size, _("options"));
a6e9f9df 15001 if (eopt)
252b5132 15002 {
3f5e193b
NC
15003 iopt = (Elf_Internal_Options *)
15004 cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
a6e9f9df
AM
15005 if (iopt == NULL)
15006 {
fb324ee9 15007 error (_("Out of memory allocating space for MIPS options\n"));
a6e9f9df
AM
15008 return 0;
15009 }
76da6bbe 15010
a6e9f9df
AM
15011 offset = cnt = 0;
15012 option = iopt;
252b5132 15013
82b1b41b 15014 while (offset <= sect->sh_size - sizeof (* eopt))
a6e9f9df 15015 {
2cf0635d 15016 Elf_External_Options * eoption;
252b5132 15017
a6e9f9df 15018 eoption = (Elf_External_Options *) ((char *) eopt + offset);
252b5132 15019
a6e9f9df
AM
15020 option->kind = BYTE_GET (eoption->kind);
15021 option->size = BYTE_GET (eoption->size);
15022 option->section = BYTE_GET (eoption->section);
15023 option->info = BYTE_GET (eoption->info);
76da6bbe 15024
82b1b41b
NC
15025 /* PR 17531: file: ffa0fa3b. */
15026 if (option->size < sizeof (* eopt)
15027 || offset + option->size > sect->sh_size)
15028 {
55325047
NC
15029 error (_("Invalid size (%u) for MIPS option\n"), option->size);
15030 return 0;
82b1b41b 15031 }
a6e9f9df 15032 offset += option->size;
14ae95f2 15033
a6e9f9df
AM
15034 ++option;
15035 ++cnt;
15036 }
252b5132 15037
a6e9f9df 15038 printf (_("\nSection '%s' contains %d entries:\n"),
74e1a04b 15039 printable_section_name (sect), cnt);
76da6bbe 15040
a6e9f9df 15041 option = iopt;
82b1b41b 15042 offset = 0;
252b5132 15043
a6e9f9df 15044 while (cnt-- > 0)
252b5132 15045 {
a6e9f9df
AM
15046 size_t len;
15047
15048 switch (option->kind)
252b5132 15049 {
a6e9f9df
AM
15050 case ODK_NULL:
15051 /* This shouldn't happen. */
15052 printf (" NULL %d %lx", option->section, option->info);
15053 break;
15054 case ODK_REGINFO:
15055 printf (" REGINFO ");
15056 if (elf_header.e_machine == EM_MIPS)
15057 {
15058 /* 32bit form. */
2cf0635d 15059 Elf32_External_RegInfo * ereg;
b34976b6 15060 Elf32_RegInfo reginfo;
a6e9f9df
AM
15061
15062 ereg = (Elf32_External_RegInfo *) (option + 1);
15063 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
15064 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
15065 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
15066 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
15067 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
15068 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
15069
15070 printf ("GPR %08lx GP 0x%lx\n",
15071 reginfo.ri_gprmask,
15072 (unsigned long) reginfo.ri_gp_value);
15073 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
15074 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
15075 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
15076 }
15077 else
15078 {
15079 /* 64 bit form. */
2cf0635d 15080 Elf64_External_RegInfo * ereg;
a6e9f9df
AM
15081 Elf64_Internal_RegInfo reginfo;
15082
15083 ereg = (Elf64_External_RegInfo *) (option + 1);
15084 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
15085 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
15086 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
15087 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
15088 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
66543521 15089 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
a6e9f9df
AM
15090
15091 printf ("GPR %08lx GP 0x",
15092 reginfo.ri_gprmask);
15093 printf_vma (reginfo.ri_gp_value);
15094 printf ("\n");
15095
15096 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
15097 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
15098 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
15099 }
15100 ++option;
15101 continue;
15102 case ODK_EXCEPTIONS:
15103 fputs (" EXCEPTIONS fpe_min(", stdout);
15104 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
15105 fputs (") fpe_max(", stdout);
15106 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
15107 fputs (")", stdout);
15108
15109 if (option->info & OEX_PAGE0)
15110 fputs (" PAGE0", stdout);
15111 if (option->info & OEX_SMM)
15112 fputs (" SMM", stdout);
15113 if (option->info & OEX_FPDBUG)
15114 fputs (" FPDBUG", stdout);
15115 if (option->info & OEX_DISMISS)
15116 fputs (" DISMISS", stdout);
15117 break;
15118 case ODK_PAD:
15119 fputs (" PAD ", stdout);
15120 if (option->info & OPAD_PREFIX)
15121 fputs (" PREFIX", stdout);
15122 if (option->info & OPAD_POSTFIX)
15123 fputs (" POSTFIX", stdout);
15124 if (option->info & OPAD_SYMBOL)
15125 fputs (" SYMBOL", stdout);
15126 break;
15127 case ODK_HWPATCH:
15128 fputs (" HWPATCH ", stdout);
15129 if (option->info & OHW_R4KEOP)
15130 fputs (" R4KEOP", stdout);
15131 if (option->info & OHW_R8KPFETCH)
15132 fputs (" R8KPFETCH", stdout);
15133 if (option->info & OHW_R5KEOP)
15134 fputs (" R5KEOP", stdout);
15135 if (option->info & OHW_R5KCVTL)
15136 fputs (" R5KCVTL", stdout);
15137 break;
15138 case ODK_FILL:
15139 fputs (" FILL ", stdout);
15140 /* XXX Print content of info word? */
15141 break;
15142 case ODK_TAGS:
15143 fputs (" TAGS ", stdout);
15144 /* XXX Print content of info word? */
15145 break;
15146 case ODK_HWAND:
15147 fputs (" HWAND ", stdout);
15148 if (option->info & OHWA0_R4KEOP_CHECKED)
15149 fputs (" R4KEOP_CHECKED", stdout);
15150 if (option->info & OHWA0_R4KEOP_CLEAN)
15151 fputs (" R4KEOP_CLEAN", stdout);
15152 break;
15153 case ODK_HWOR:
15154 fputs (" HWOR ", stdout);
15155 if (option->info & OHWA0_R4KEOP_CHECKED)
15156 fputs (" R4KEOP_CHECKED", stdout);
15157 if (option->info & OHWA0_R4KEOP_CLEAN)
15158 fputs (" R4KEOP_CLEAN", stdout);
15159 break;
15160 case ODK_GP_GROUP:
15161 printf (" GP_GROUP %#06lx self-contained %#06lx",
15162 option->info & OGP_GROUP,
15163 (option->info & OGP_SELF) >> 16);
15164 break;
15165 case ODK_IDENT:
15166 printf (" IDENT %#06lx self-contained %#06lx",
15167 option->info & OGP_GROUP,
15168 (option->info & OGP_SELF) >> 16);
15169 break;
15170 default:
15171 /* This shouldn't happen. */
15172 printf (" %3d ??? %d %lx",
15173 option->kind, option->section, option->info);
15174 break;
252b5132 15175 }
a6e9f9df 15176
2cf0635d 15177 len = sizeof (* eopt);
a6e9f9df 15178 while (len < option->size)
82b1b41b 15179 {
7e27a9d5 15180 unsigned char datum = * ((unsigned char *) eopt + offset + len);
a6e9f9df 15181
82b1b41b
NC
15182 if (ISPRINT (datum))
15183 printf ("%c", datum);
15184 else
15185 printf ("\\%03o", datum);
15186 len ++;
15187 }
a6e9f9df 15188 fputs ("\n", stdout);
82b1b41b
NC
15189
15190 offset += option->size;
252b5132 15191 ++option;
252b5132
RH
15192 }
15193
a6e9f9df 15194 free (eopt);
252b5132 15195 }
252b5132
RH
15196 }
15197
15198 if (conflicts_offset != 0 && conflictsno != 0)
15199 {
2cf0635d 15200 Elf32_Conflict * iconf;
252b5132
RH
15201 size_t cnt;
15202
15203 if (dynamic_symbols == NULL)
15204 {
591a748a 15205 error (_("conflict list found without a dynamic symbol table\n"));
252b5132
RH
15206 return 0;
15207 }
15208
3f5e193b 15209 iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
252b5132
RH
15210 if (iconf == NULL)
15211 {
8b73c356 15212 error (_("Out of memory allocating space for dynamic conflicts\n"));
252b5132
RH
15213 return 0;
15214 }
15215
9ea033b2 15216 if (is_32bit_elf)
252b5132 15217 {
2cf0635d 15218 Elf32_External_Conflict * econf32;
a6e9f9df 15219
3f5e193b
NC
15220 econf32 = (Elf32_External_Conflict *)
15221 get_data (NULL, file, conflicts_offset, conflictsno,
15222 sizeof (* econf32), _("conflict"));
a6e9f9df
AM
15223 if (!econf32)
15224 return 0;
252b5132
RH
15225
15226 for (cnt = 0; cnt < conflictsno; ++cnt)
15227 iconf[cnt] = BYTE_GET (econf32[cnt]);
a6e9f9df
AM
15228
15229 free (econf32);
252b5132
RH
15230 }
15231 else
15232 {
2cf0635d 15233 Elf64_External_Conflict * econf64;
a6e9f9df 15234
3f5e193b
NC
15235 econf64 = (Elf64_External_Conflict *)
15236 get_data (NULL, file, conflicts_offset, conflictsno,
15237 sizeof (* econf64), _("conflict"));
a6e9f9df
AM
15238 if (!econf64)
15239 return 0;
252b5132
RH
15240
15241 for (cnt = 0; cnt < conflictsno; ++cnt)
15242 iconf[cnt] = BYTE_GET (econf64[cnt]);
a6e9f9df
AM
15243
15244 free (econf64);
252b5132
RH
15245 }
15246
c7e7ca54
NC
15247 printf (_("\nSection '.conflict' contains %lu entries:\n"),
15248 (unsigned long) conflictsno);
252b5132
RH
15249 puts (_(" Num: Index Value Name"));
15250
15251 for (cnt = 0; cnt < conflictsno; ++cnt)
15252 {
b34976b6 15253 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
e0a31db1
NC
15254
15255 if (iconf[cnt] >= num_dynamic_syms)
15256 printf (_("<corrupt symbol index>"));
d79b3d50 15257 else
e0a31db1
NC
15258 {
15259 Elf_Internal_Sym * psym;
15260
15261 psym = & dynamic_symbols[iconf[cnt]];
15262 print_vma (psym->st_value, FULL_HEX);
15263 putchar (' ');
15264 if (VALID_DYNAMIC_NAME (psym->st_name))
15265 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
15266 else
15267 printf (_("<corrupt: %14ld>"), psym->st_name);
15268 }
31104126 15269 putchar ('\n');
252b5132
RH
15270 }
15271
252b5132
RH
15272 free (iconf);
15273 }
15274
ccb4c951
RS
15275 if (pltgot != 0 && local_gotno != 0)
15276 {
91d6fa6a 15277 bfd_vma ent, local_end, global_end;
bbeee7ea 15278 size_t i, offset;
2cf0635d 15279 unsigned char * data;
82b1b41b 15280 unsigned char * data_end;
bbeee7ea 15281 int addr_size;
ccb4c951 15282
91d6fa6a 15283 ent = pltgot;
ccb4c951
RS
15284 addr_size = (is_32bit_elf ? 4 : 8);
15285 local_end = pltgot + local_gotno * addr_size;
ccb4c951 15286
74e1a04b
NC
15287 /* PR binutils/17533 file: 012-111227-0.004 */
15288 if (symtabno < gotsym)
15289 {
15290 error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
82b1b41b 15291 (unsigned long) gotsym, (unsigned long) symtabno);
74e1a04b
NC
15292 return 0;
15293 }
82b1b41b 15294
74e1a04b 15295 global_end = local_end + (symtabno - gotsym) * addr_size;
82b1b41b
NC
15296 /* PR 17531: file: 54c91a34. */
15297 if (global_end < local_end)
15298 {
15299 error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
15300 return 0;
15301 }
948f632f 15302
ccb4c951 15303 offset = offset_from_vma (file, pltgot, global_end - pltgot);
3f5e193b 15304 data = (unsigned char *) get_data (NULL, file, offset,
9cf03b7e
NC
15305 global_end - pltgot, 1,
15306 _("Global Offset Table data"));
59245841
NC
15307 if (data == NULL)
15308 return 0;
82b1b41b 15309 data_end = data + (global_end - pltgot);
59245841 15310
ccb4c951
RS
15311 printf (_("\nPrimary GOT:\n"));
15312 printf (_(" Canonical gp value: "));
15313 print_vma (pltgot + 0x7ff0, LONG_HEX);
15314 printf ("\n\n");
15315
15316 printf (_(" Reserved entries:\n"));
15317 printf (_(" %*s %10s %*s Purpose\n"),
2b692964
NC
15318 addr_size * 2, _("Address"), _("Access"),
15319 addr_size * 2, _("Initial"));
82b1b41b 15320 ent = print_mips_got_entry (data, pltgot, ent, data_end);
2b692964 15321 printf (_(" Lazy resolver\n"));
82b1b41b
NC
15322 if (ent == (bfd_vma) -1)
15323 goto got_print_fail;
ccb4c951 15324 if (data
91d6fa6a 15325 && (byte_get (data + ent - pltgot, addr_size)
ccb4c951
RS
15326 >> (addr_size * 8 - 1)) != 0)
15327 {
82b1b41b 15328 ent = print_mips_got_entry (data, pltgot, ent, data_end);
2b692964 15329 printf (_(" Module pointer (GNU extension)\n"));
82b1b41b
NC
15330 if (ent == (bfd_vma) -1)
15331 goto got_print_fail;
ccb4c951
RS
15332 }
15333 printf ("\n");
15334
91d6fa6a 15335 if (ent < local_end)
ccb4c951
RS
15336 {
15337 printf (_(" Local entries:\n"));
cc5914eb 15338 printf (" %*s %10s %*s\n",
2b692964
NC
15339 addr_size * 2, _("Address"), _("Access"),
15340 addr_size * 2, _("Initial"));
91d6fa6a 15341 while (ent < local_end)
ccb4c951 15342 {
82b1b41b 15343 ent = print_mips_got_entry (data, pltgot, ent, data_end);
ccb4c951 15344 printf ("\n");
82b1b41b
NC
15345 if (ent == (bfd_vma) -1)
15346 goto got_print_fail;
ccb4c951
RS
15347 }
15348 printf ("\n");
15349 }
15350
15351 if (gotsym < symtabno)
15352 {
15353 int sym_width;
15354
15355 printf (_(" Global entries:\n"));
cc5914eb 15356 printf (" %*s %10s %*s %*s %-7s %3s %s\n",
9cf03b7e
NC
15357 addr_size * 2, _("Address"),
15358 _("Access"),
2b692964 15359 addr_size * 2, _("Initial"),
9cf03b7e
NC
15360 addr_size * 2, _("Sym.Val."),
15361 _("Type"),
15362 /* Note for translators: "Ndx" = abbreviated form of "Index". */
15363 _("Ndx"), _("Name"));
0b4362b0 15364
ccb4c951 15365 sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
e0a31db1 15366
ccb4c951
RS
15367 for (i = gotsym; i < symtabno; i++)
15368 {
82b1b41b 15369 ent = print_mips_got_entry (data, pltgot, ent, data_end);
ccb4c951 15370 printf (" ");
e0a31db1
NC
15371
15372 if (dynamic_symbols == NULL)
15373 printf (_("<no dynamic symbols>"));
15374 else if (i < num_dynamic_syms)
15375 {
15376 Elf_Internal_Sym * psym = dynamic_symbols + i;
15377
15378 print_vma (psym->st_value, LONG_HEX);
15379 printf (" %-7s %3s ",
15380 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
15381 get_symbol_index_type (psym->st_shndx));
15382
15383 if (VALID_DYNAMIC_NAME (psym->st_name))
15384 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
15385 else
15386 printf (_("<corrupt: %14ld>"), psym->st_name);
15387 }
ccb4c951 15388 else
7fc5ac57
JBG
15389 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
15390 (unsigned long) i);
e0a31db1 15391
ccb4c951 15392 printf ("\n");
82b1b41b
NC
15393 if (ent == (bfd_vma) -1)
15394 break;
ccb4c951
RS
15395 }
15396 printf ("\n");
15397 }
15398
82b1b41b 15399 got_print_fail:
ccb4c951
RS
15400 if (data)
15401 free (data);
15402 }
15403
861fb55a
DJ
15404 if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
15405 {
91d6fa6a 15406 bfd_vma ent, end;
861fb55a
DJ
15407 size_t offset, rel_offset;
15408 unsigned long count, i;
2cf0635d 15409 unsigned char * data;
861fb55a 15410 int addr_size, sym_width;
2cf0635d 15411 Elf_Internal_Rela * rels;
861fb55a
DJ
15412
15413 rel_offset = offset_from_vma (file, jmprel, pltrelsz);
15414 if (pltrel == DT_RELA)
15415 {
15416 if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
15417 return 0;
15418 }
15419 else
15420 {
15421 if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
15422 return 0;
15423 }
15424
91d6fa6a 15425 ent = mips_pltgot;
861fb55a
DJ
15426 addr_size = (is_32bit_elf ? 4 : 8);
15427 end = mips_pltgot + (2 + count) * addr_size;
15428
15429 offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
3f5e193b 15430 data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
9cf03b7e 15431 1, _("Procedure Linkage Table data"));
59245841
NC
15432 if (data == NULL)
15433 return 0;
15434
9cf03b7e 15435 printf ("\nPLT GOT:\n\n");
861fb55a
DJ
15436 printf (_(" Reserved entries:\n"));
15437 printf (_(" %*s %*s Purpose\n"),
2b692964 15438 addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
91d6fa6a 15439 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
2b692964 15440 printf (_(" PLT lazy resolver\n"));
91d6fa6a 15441 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
2b692964 15442 printf (_(" Module pointer\n"));
861fb55a
DJ
15443 printf ("\n");
15444
15445 printf (_(" Entries:\n"));
cc5914eb 15446 printf (" %*s %*s %*s %-7s %3s %s\n",
2b692964
NC
15447 addr_size * 2, _("Address"),
15448 addr_size * 2, _("Initial"),
15449 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
861fb55a
DJ
15450 sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
15451 for (i = 0; i < count; i++)
15452 {
df97ab2a 15453 unsigned long idx = get_reloc_symindex (rels[i].r_info);
861fb55a 15454
91d6fa6a 15455 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
861fb55a 15456 printf (" ");
e0a31db1 15457
df97ab2a
MF
15458 if (idx >= num_dynamic_syms)
15459 printf (_("<corrupt symbol index: %lu>"), idx);
861fb55a 15460 else
e0a31db1 15461 {
df97ab2a 15462 Elf_Internal_Sym * psym = dynamic_symbols + idx;
e0a31db1
NC
15463
15464 print_vma (psym->st_value, LONG_HEX);
15465 printf (" %-7s %3s ",
15466 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
15467 get_symbol_index_type (psym->st_shndx));
15468 if (VALID_DYNAMIC_NAME (psym->st_name))
15469 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
15470 else
15471 printf (_("<corrupt: %14ld>"), psym->st_name);
15472 }
861fb55a
DJ
15473 printf ("\n");
15474 }
15475 printf ("\n");
15476
15477 if (data)
15478 free (data);
15479 free (rels);
15480 }
15481
252b5132
RH
15482 return 1;
15483}
15484
35c08157
KLC
15485static int
15486process_nds32_specific (FILE * file)
15487{
15488 Elf_Internal_Shdr *sect = NULL;
15489
15490 sect = find_section (".nds32_e_flags");
15491 if (sect != NULL)
15492 {
15493 unsigned int *flag;
15494
15495 printf ("\nNDS32 elf flags section:\n");
15496 flag = get_data (NULL, file, sect->sh_offset, 1,
15497 sect->sh_size, _("NDS32 elf flags section"));
15498
15499 switch ((*flag) & 0x3)
15500 {
15501 case 0:
15502 printf ("(VEC_SIZE):\tNo entry.\n");
15503 break;
15504 case 1:
15505 printf ("(VEC_SIZE):\t4 bytes\n");
15506 break;
15507 case 2:
15508 printf ("(VEC_SIZE):\t16 bytes\n");
15509 break;
15510 case 3:
15511 printf ("(VEC_SIZE):\treserved\n");
15512 break;
15513 }
15514 }
15515
15516 return TRUE;
15517}
15518
047b2264 15519static int
2cf0635d 15520process_gnu_liblist (FILE * file)
047b2264 15521{
2cf0635d
NC
15522 Elf_Internal_Shdr * section;
15523 Elf_Internal_Shdr * string_sec;
15524 Elf32_External_Lib * elib;
15525 char * strtab;
c256ffe7 15526 size_t strtab_size;
047b2264
JJ
15527 size_t cnt;
15528 unsigned i;
15529
15530 if (! do_arch)
15531 return 0;
15532
15533 for (i = 0, section = section_headers;
15534 i < elf_header.e_shnum;
b34976b6 15535 i++, section++)
047b2264
JJ
15536 {
15537 switch (section->sh_type)
15538 {
15539 case SHT_GNU_LIBLIST:
4fbb74a6 15540 if (section->sh_link >= elf_header.e_shnum)
c256ffe7
JJ
15541 break;
15542
3f5e193b
NC
15543 elib = (Elf32_External_Lib *)
15544 get_data (NULL, file, section->sh_offset, 1, section->sh_size,
9cf03b7e 15545 _("liblist section data"));
047b2264
JJ
15546
15547 if (elib == NULL)
15548 break;
4fbb74a6 15549 string_sec = section_headers + section->sh_link;
047b2264 15550
3f5e193b
NC
15551 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
15552 string_sec->sh_size,
15553 _("liblist string table"));
047b2264
JJ
15554 if (strtab == NULL
15555 || section->sh_entsize != sizeof (Elf32_External_Lib))
15556 {
15557 free (elib);
2842702f 15558 free (strtab);
047b2264
JJ
15559 break;
15560 }
59245841 15561 strtab_size = string_sec->sh_size;
047b2264
JJ
15562
15563 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
74e1a04b 15564 printable_section_name (section),
0af1713e 15565 (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
047b2264 15566
2b692964 15567 puts (_(" Library Time Stamp Checksum Version Flags"));
047b2264
JJ
15568
15569 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
15570 ++cnt)
15571 {
15572 Elf32_Lib liblist;
91d6fa6a 15573 time_t atime;
d5b07ef4 15574 char timebuf[128];
2cf0635d 15575 struct tm * tmp;
047b2264
JJ
15576
15577 liblist.l_name = BYTE_GET (elib[cnt].l_name);
91d6fa6a 15578 atime = BYTE_GET (elib[cnt].l_time_stamp);
047b2264
JJ
15579 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
15580 liblist.l_version = BYTE_GET (elib[cnt].l_version);
15581 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
15582
91d6fa6a 15583 tmp = gmtime (&atime);
e9e44622
JJ
15584 snprintf (timebuf, sizeof (timebuf),
15585 "%04u-%02u-%02uT%02u:%02u:%02u",
15586 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
15587 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
047b2264
JJ
15588
15589 printf ("%3lu: ", (unsigned long) cnt);
15590 if (do_wide)
c256ffe7 15591 printf ("%-20s", liblist.l_name < strtab_size
2b692964 15592 ? strtab + liblist.l_name : _("<corrupt>"));
047b2264 15593 else
c256ffe7 15594 printf ("%-20.20s", liblist.l_name < strtab_size
2b692964 15595 ? strtab + liblist.l_name : _("<corrupt>"));
047b2264
JJ
15596 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
15597 liblist.l_version, liblist.l_flags);
15598 }
15599
15600 free (elib);
2842702f 15601 free (strtab);
047b2264
JJ
15602 }
15603 }
15604
15605 return 1;
15606}
15607
9437c45b 15608static const char *
d3ba0551 15609get_note_type (unsigned e_type)
779fe533
NC
15610{
15611 static char buff[64];
103f02d3 15612
1ec5cd37
NC
15613 if (elf_header.e_type == ET_CORE)
15614 switch (e_type)
15615 {
57346661 15616 case NT_AUXV:
1ec5cd37 15617 return _("NT_AUXV (auxiliary vector)");
57346661 15618 case NT_PRSTATUS:
1ec5cd37 15619 return _("NT_PRSTATUS (prstatus structure)");
57346661 15620 case NT_FPREGSET:
1ec5cd37 15621 return _("NT_FPREGSET (floating point registers)");
57346661 15622 case NT_PRPSINFO:
1ec5cd37 15623 return _("NT_PRPSINFO (prpsinfo structure)");
57346661 15624 case NT_TASKSTRUCT:
1ec5cd37 15625 return _("NT_TASKSTRUCT (task structure)");
57346661 15626 case NT_PRXFPREG:
1ec5cd37 15627 return _("NT_PRXFPREG (user_xfpregs structure)");
e1e95dec
AM
15628 case NT_PPC_VMX:
15629 return _("NT_PPC_VMX (ppc Altivec registers)");
89eeb0bc
LM
15630 case NT_PPC_VSX:
15631 return _("NT_PPC_VSX (ppc VSX registers)");
ff826ef3
TT
15632 case NT_386_TLS:
15633 return _("NT_386_TLS (x86 TLS information)");
15634 case NT_386_IOPERM:
15635 return _("NT_386_IOPERM (x86 I/O permissions)");
4339cae0
L
15636 case NT_X86_XSTATE:
15637 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
0675e188
UW
15638 case NT_S390_HIGH_GPRS:
15639 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
d7eeb400
MS
15640 case NT_S390_TIMER:
15641 return _("NT_S390_TIMER (s390 timer register)");
15642 case NT_S390_TODCMP:
15643 return _("NT_S390_TODCMP (s390 TOD comparator register)");
15644 case NT_S390_TODPREG:
15645 return _("NT_S390_TODPREG (s390 TOD programmable register)");
15646 case NT_S390_CTRS:
15647 return _("NT_S390_CTRS (s390 control registers)");
15648 case NT_S390_PREFIX:
15649 return _("NT_S390_PREFIX (s390 prefix register)");
a367d729
AK
15650 case NT_S390_LAST_BREAK:
15651 return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
15652 case NT_S390_SYSTEM_CALL:
15653 return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
abb3f6cc
NC
15654 case NT_S390_TDB:
15655 return _("NT_S390_TDB (s390 transaction diagnostic block)");
4ef9f41a
AA
15656 case NT_S390_VXRS_LOW:
15657 return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
15658 case NT_S390_VXRS_HIGH:
15659 return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
faa9a424
UW
15660 case NT_ARM_VFP:
15661 return _("NT_ARM_VFP (arm VFP registers)");
652451f8
YZ
15662 case NT_ARM_TLS:
15663 return _("NT_ARM_TLS (AArch TLS registers)");
15664 case NT_ARM_HW_BREAK:
15665 return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
15666 case NT_ARM_HW_WATCH:
15667 return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
57346661 15668 case NT_PSTATUS:
1ec5cd37 15669 return _("NT_PSTATUS (pstatus structure)");
57346661 15670 case NT_FPREGS:
1ec5cd37 15671 return _("NT_FPREGS (floating point registers)");
57346661 15672 case NT_PSINFO:
1ec5cd37 15673 return _("NT_PSINFO (psinfo structure)");
57346661 15674 case NT_LWPSTATUS:
1ec5cd37 15675 return _("NT_LWPSTATUS (lwpstatus_t structure)");
57346661 15676 case NT_LWPSINFO:
1ec5cd37 15677 return _("NT_LWPSINFO (lwpsinfo_t structure)");
57346661 15678 case NT_WIN32PSTATUS:
1ec5cd37 15679 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
9ece1fa9
TT
15680 case NT_SIGINFO:
15681 return _("NT_SIGINFO (siginfo_t data)");
15682 case NT_FILE:
15683 return _("NT_FILE (mapped files)");
1ec5cd37
NC
15684 default:
15685 break;
15686 }
15687 else
15688 switch (e_type)
15689 {
15690 case NT_VERSION:
15691 return _("NT_VERSION (version)");
15692 case NT_ARCH:
15693 return _("NT_ARCH (architecture)");
15694 default:
15695 break;
15696 }
15697
e9e44622 15698 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
1ec5cd37 15699 return buff;
779fe533
NC
15700}
15701
9ece1fa9
TT
15702static int
15703print_core_note (Elf_Internal_Note *pnote)
15704{
15705 unsigned int addr_size = is_32bit_elf ? 4 : 8;
15706 bfd_vma count, page_size;
15707 unsigned char *descdata, *filenames, *descend;
15708
15709 if (pnote->type != NT_FILE)
15710 return 1;
15711
15712#ifndef BFD64
15713 if (!is_32bit_elf)
15714 {
15715 printf (_(" Cannot decode 64-bit note in 32-bit build\n"));
15716 /* Still "successful". */
15717 return 1;
15718 }
15719#endif
15720
15721 if (pnote->descsz < 2 * addr_size)
15722 {
15723 printf (_(" Malformed note - too short for header\n"));
15724 return 0;
15725 }
15726
15727 descdata = (unsigned char *) pnote->descdata;
15728 descend = descdata + pnote->descsz;
15729
15730 if (descdata[pnote->descsz - 1] != '\0')
15731 {
15732 printf (_(" Malformed note - does not end with \\0\n"));
15733 return 0;
15734 }
15735
15736 count = byte_get (descdata, addr_size);
15737 descdata += addr_size;
15738
15739 page_size = byte_get (descdata, addr_size);
15740 descdata += addr_size;
15741
15742 if (pnote->descsz < 2 * addr_size + count * 3 * addr_size)
15743 {
15744 printf (_(" Malformed note - too short for supplied file count\n"));
15745 return 0;
15746 }
15747
15748 printf (_(" Page size: "));
15749 print_vma (page_size, DEC);
15750 printf ("\n");
15751
15752 printf (_(" %*s%*s%*s\n"),
15753 (int) (2 + 2 * addr_size), _("Start"),
15754 (int) (4 + 2 * addr_size), _("End"),
15755 (int) (4 + 2 * addr_size), _("Page Offset"));
15756 filenames = descdata + count * 3 * addr_size;
595712bb 15757 while (count-- > 0)
9ece1fa9
TT
15758 {
15759 bfd_vma start, end, file_ofs;
15760
15761 if (filenames == descend)
15762 {
15763 printf (_(" Malformed note - filenames end too early\n"));
15764 return 0;
15765 }
15766
15767 start = byte_get (descdata, addr_size);
15768 descdata += addr_size;
15769 end = byte_get (descdata, addr_size);
15770 descdata += addr_size;
15771 file_ofs = byte_get (descdata, addr_size);
15772 descdata += addr_size;
15773
15774 printf (" ");
15775 print_vma (start, FULL_HEX);
15776 printf (" ");
15777 print_vma (end, FULL_HEX);
15778 printf (" ");
15779 print_vma (file_ofs, FULL_HEX);
15780 printf ("\n %s\n", filenames);
15781
15782 filenames += 1 + strlen ((char *) filenames);
15783 }
15784
15785 return 1;
15786}
15787
1118d252
RM
15788static const char *
15789get_gnu_elf_note_type (unsigned e_type)
15790{
1449284b 15791 /* NB/ Keep this switch statement in sync with print_gnu_note (). */
1118d252
RM
15792 switch (e_type)
15793 {
15794 case NT_GNU_ABI_TAG:
15795 return _("NT_GNU_ABI_TAG (ABI version tag)");
15796 case NT_GNU_HWCAP:
15797 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
15798 case NT_GNU_BUILD_ID:
15799 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
0297aed6
DM
15800 case NT_GNU_GOLD_VERSION:
15801 return _("NT_GNU_GOLD_VERSION (gold version)");
1118d252 15802 default:
1449284b
NC
15803 {
15804 static char buff[64];
1118d252 15805
1449284b
NC
15806 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15807 return buff;
15808 }
15809 }
1118d252
RM
15810}
15811
664f90a3
TT
15812static int
15813print_gnu_note (Elf_Internal_Note *pnote)
15814{
1449284b 15815 /* NB/ Keep this switch statement in sync with get_gnu_elf_note_type (). */
664f90a3
TT
15816 switch (pnote->type)
15817 {
15818 case NT_GNU_BUILD_ID:
15819 {
15820 unsigned long i;
15821
15822 printf (_(" Build ID: "));
15823 for (i = 0; i < pnote->descsz; ++i)
15824 printf ("%02x", pnote->descdata[i] & 0xff);
9cf03b7e 15825 printf ("\n");
664f90a3
TT
15826 }
15827 break;
15828
15829 case NT_GNU_ABI_TAG:
15830 {
15831 unsigned long os, major, minor, subminor;
15832 const char *osname;
15833
3102e897
NC
15834 /* PR 17531: file: 030-599401-0.004. */
15835 if (pnote->descsz < 16)
15836 {
15837 printf (_(" <corrupt GNU_ABI_TAG>\n"));
15838 break;
15839 }
15840
664f90a3
TT
15841 os = byte_get ((unsigned char *) pnote->descdata, 4);
15842 major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
15843 minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
15844 subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
15845
15846 switch (os)
15847 {
15848 case GNU_ABI_TAG_LINUX:
15849 osname = "Linux";
15850 break;
15851 case GNU_ABI_TAG_HURD:
15852 osname = "Hurd";
15853 break;
15854 case GNU_ABI_TAG_SOLARIS:
15855 osname = "Solaris";
15856 break;
15857 case GNU_ABI_TAG_FREEBSD:
15858 osname = "FreeBSD";
15859 break;
15860 case GNU_ABI_TAG_NETBSD:
15861 osname = "NetBSD";
15862 break;
14ae95f2
RM
15863 case GNU_ABI_TAG_SYLLABLE:
15864 osname = "Syllable";
15865 break;
15866 case GNU_ABI_TAG_NACL:
15867 osname = "NaCl";
15868 break;
664f90a3
TT
15869 default:
15870 osname = "Unknown";
15871 break;
15872 }
15873
15874 printf (_(" OS: %s, ABI: %ld.%ld.%ld\n"), osname,
15875 major, minor, subminor);
15876 }
15877 break;
926c5385
CC
15878
15879 case NT_GNU_GOLD_VERSION:
15880 {
15881 unsigned long i;
15882
15883 printf (_(" Version: "));
15884 for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
15885 printf ("%c", pnote->descdata[i]);
15886 printf ("\n");
15887 }
15888 break;
1449284b
NC
15889
15890 case NT_GNU_HWCAP:
15891 {
15892 unsigned long num_entries, mask;
15893
15894 /* Hardware capabilities information. Word 0 is the number of entries.
15895 Word 1 is a bitmask of enabled entries. The rest of the descriptor
15896 is a series of entries, where each entry is a single byte followed
15897 by a nul terminated string. The byte gives the bit number to test
15898 if enabled in the bitmask. */
15899 printf (_(" Hardware Capabilities: "));
15900 if (pnote->descsz < 8)
15901 {
15902 printf (_("<corrupt GNU_HWCAP>\n"));
15903 break;
15904 }
15905 num_entries = byte_get ((unsigned char *) pnote->descdata, 4);
15906 mask = byte_get ((unsigned char *) pnote->descdata + 4, 4);
15907 printf (_("num entries: %ld, enabled mask: %lx\n"), num_entries, mask);
15908 /* FIXME: Add code to display the entries... */
15909 }
15910 break;
15911
15912 default:
15913 /* Handle unrecognised types. An error message should have already been
15914 created by get_gnu_elf_note_type(), so all that we need to do is to
15915 display the data. */
15916 {
15917 unsigned long i;
15918
15919 printf (_(" Description data: "));
15920 for (i = 0; i < pnote->descsz; ++i)
15921 printf ("%02x ", pnote->descdata[i] & 0xff);
15922 printf ("\n");
15923 }
15924 break;
664f90a3
TT
15925 }
15926
15927 return 1;
15928}
15929
685080f2
NC
15930static const char *
15931get_v850_elf_note_type (enum v850_notes n_type)
15932{
15933 static char buff[64];
15934
15935 switch (n_type)
15936 {
15937 case V850_NOTE_ALIGNMENT: return _("Alignment of 8-byte objects");
15938 case V850_NOTE_DATA_SIZE: return _("Sizeof double and long double");
15939 case V850_NOTE_FPU_INFO: return _("Type of FPU support needed");
15940 case V850_NOTE_SIMD_INFO: return _("Use of SIMD instructions");
15941 case V850_NOTE_CACHE_INFO: return _("Use of cache");
15942 case V850_NOTE_MMU_INFO: return _("Use of MMU");
15943 default:
15944 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
15945 return buff;
15946 }
15947}
15948
15949static int
15950print_v850_note (Elf_Internal_Note * pnote)
15951{
15952 unsigned int val;
15953
15954 if (pnote->descsz != 4)
15955 return 0;
15956 val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
15957
15958 if (val == 0)
15959 {
15960 printf (_("not set\n"));
15961 return 1;
15962 }
15963
15964 switch (pnote->type)
15965 {
15966 case V850_NOTE_ALIGNMENT:
15967 switch (val)
15968 {
15969 case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return 1;
15970 case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return 1;
15971 }
15972 break;
14ae95f2 15973
685080f2
NC
15974 case V850_NOTE_DATA_SIZE:
15975 switch (val)
15976 {
15977 case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return 1;
15978 case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return 1;
15979 }
15980 break;
14ae95f2 15981
685080f2
NC
15982 case V850_NOTE_FPU_INFO:
15983 switch (val)
15984 {
15985 case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return 1;
15986 case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return 1;
15987 }
15988 break;
14ae95f2 15989
685080f2
NC
15990 case V850_NOTE_MMU_INFO:
15991 case V850_NOTE_CACHE_INFO:
15992 case V850_NOTE_SIMD_INFO:
15993 if (val == EF_RH850_SIMD)
15994 {
15995 printf (_("yes\n"));
15996 return 1;
15997 }
15998 break;
15999
16000 default:
16001 /* An 'unknown note type' message will already have been displayed. */
16002 break;
16003 }
16004
16005 printf (_("unknown value: %x\n"), val);
16006 return 0;
16007}
16008
15f205b1 16009static int
c6056a74
SF
16010process_netbsd_elf_note (Elf_Internal_Note * pnote)
16011{
16012 unsigned int version;
16013
16014 switch (pnote->type)
16015 {
16016 case NT_NETBSD_IDENT:
16017 version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
16018 if ((version / 10000) % 100)
16019 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
16020 version, version / 100000000, (version / 1000000) % 100,
16021 (version / 10000) % 100 > 26 ? "Z" : "",
15f205b1 16022 'A' + (version / 10000) % 26);
c6056a74
SF
16023 else
16024 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
16025 version, version / 100000000, (version / 1000000) % 100,
15f205b1 16026 (version / 100) % 100);
c6056a74
SF
16027 return 1;
16028
16029 case NT_NETBSD_MARCH:
16030 printf (" NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
16031 pnote->descdata);
16032 return 1;
16033
16034 default:
16035 break;
16036 }
16037
16038 printf (" NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
16039 pnote->type);
16040 return 1;
16041}
16042
f4ddf30f
JB
16043static const char *
16044get_freebsd_elfcore_note_type (unsigned e_type)
16045{
f4ddf30f
JB
16046 switch (e_type)
16047 {
16048 case NT_FREEBSD_THRMISC:
16049 return _("NT_THRMISC (thrmisc structure)");
16050 case NT_FREEBSD_PROCSTAT_PROC:
16051 return _("NT_PROCSTAT_PROC (proc data)");
16052 case NT_FREEBSD_PROCSTAT_FILES:
16053 return _("NT_PROCSTAT_FILES (files data)");
16054 case NT_FREEBSD_PROCSTAT_VMMAP:
16055 return _("NT_PROCSTAT_VMMAP (vmmap data)");
16056 case NT_FREEBSD_PROCSTAT_GROUPS:
16057 return _("NT_PROCSTAT_GROUPS (groups data)");
16058 case NT_FREEBSD_PROCSTAT_UMASK:
16059 return _("NT_PROCSTAT_UMASK (umask data)");
16060 case NT_FREEBSD_PROCSTAT_RLIMIT:
16061 return _("NT_PROCSTAT_RLIMIT (rlimit data)");
16062 case NT_FREEBSD_PROCSTAT_OSREL:
16063 return _("NT_PROCSTAT_OSREL (osreldate data)");
16064 case NT_FREEBSD_PROCSTAT_PSSTRINGS:
16065 return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
16066 case NT_FREEBSD_PROCSTAT_AUXV:
16067 return _("NT_PROCSTAT_AUXV (auxv data)");
16068 }
16069 return get_note_type (e_type);
16070}
16071
9437c45b 16072static const char *
d3ba0551 16073get_netbsd_elfcore_note_type (unsigned e_type)
9437c45b
JT
16074{
16075 static char buff[64];
16076
b4db1224 16077 if (e_type == NT_NETBSDCORE_PROCINFO)
9437c45b
JT
16078 {
16079 /* NetBSD core "procinfo" structure. */
16080 return _("NetBSD procinfo structure");
16081 }
16082
16083 /* As of Jan 2002 there are no other machine-independent notes
16084 defined for NetBSD core files. If the note type is less
16085 than the start of the machine-dependent note types, we don't
16086 understand it. */
16087
b4db1224 16088 if (e_type < NT_NETBSDCORE_FIRSTMACH)
9437c45b 16089 {
e9e44622 16090 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
9437c45b
JT
16091 return buff;
16092 }
16093
16094 switch (elf_header.e_machine)
16095 {
16096 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
16097 and PT_GETFPREGS == mach+2. */
16098
16099 case EM_OLD_ALPHA:
16100 case EM_ALPHA:
16101 case EM_SPARC:
16102 case EM_SPARC32PLUS:
16103 case EM_SPARCV9:
16104 switch (e_type)
16105 {
2b692964 16106 case NT_NETBSDCORE_FIRSTMACH + 0:
b4db1224 16107 return _("PT_GETREGS (reg structure)");
2b692964 16108 case NT_NETBSDCORE_FIRSTMACH + 2:
b4db1224 16109 return _("PT_GETFPREGS (fpreg structure)");
9437c45b
JT
16110 default:
16111 break;
16112 }
16113 break;
16114
16115 /* On all other arch's, PT_GETREGS == mach+1 and
16116 PT_GETFPREGS == mach+3. */
16117 default:
16118 switch (e_type)
16119 {
2b692964 16120 case NT_NETBSDCORE_FIRSTMACH + 1:
b4db1224 16121 return _("PT_GETREGS (reg structure)");
2b692964 16122 case NT_NETBSDCORE_FIRSTMACH + 3:
b4db1224 16123 return _("PT_GETFPREGS (fpreg structure)");
9437c45b
JT
16124 default:
16125 break;
16126 }
16127 }
16128
9cf03b7e 16129 snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
e9e44622 16130 e_type - NT_NETBSDCORE_FIRSTMACH);
9437c45b
JT
16131 return buff;
16132}
16133
70616151
TT
16134static const char *
16135get_stapsdt_note_type (unsigned e_type)
16136{
16137 static char buff[64];
16138
16139 switch (e_type)
16140 {
16141 case NT_STAPSDT:
16142 return _("NT_STAPSDT (SystemTap probe descriptors)");
16143
16144 default:
16145 break;
16146 }
16147
16148 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
16149 return buff;
16150}
16151
c6a9fc58
TT
16152static int
16153print_stapsdt_note (Elf_Internal_Note *pnote)
16154{
16155 int addr_size = is_32bit_elf ? 4 : 8;
16156 char *data = pnote->descdata;
16157 char *data_end = pnote->descdata + pnote->descsz;
16158 bfd_vma pc, base_addr, semaphore;
16159 char *provider, *probe, *arg_fmt;
16160
16161 pc = byte_get ((unsigned char *) data, addr_size);
16162 data += addr_size;
16163 base_addr = byte_get ((unsigned char *) data, addr_size);
16164 data += addr_size;
16165 semaphore = byte_get ((unsigned char *) data, addr_size);
16166 data += addr_size;
16167
16168 provider = data;
16169 data += strlen (data) + 1;
16170 probe = data;
16171 data += strlen (data) + 1;
16172 arg_fmt = data;
16173 data += strlen (data) + 1;
16174
16175 printf (_(" Provider: %s\n"), provider);
16176 printf (_(" Name: %s\n"), probe);
16177 printf (_(" Location: "));
16178 print_vma (pc, FULL_HEX);
16179 printf (_(", Base: "));
16180 print_vma (base_addr, FULL_HEX);
16181 printf (_(", Semaphore: "));
16182 print_vma (semaphore, FULL_HEX);
9cf03b7e 16183 printf ("\n");
c6a9fc58
TT
16184 printf (_(" Arguments: %s\n"), arg_fmt);
16185
16186 return data == data_end;
16187}
16188
00e98fc7
TG
16189static const char *
16190get_ia64_vms_note_type (unsigned e_type)
16191{
16192 static char buff[64];
16193
16194 switch (e_type)
16195 {
16196 case NT_VMS_MHD:
16197 return _("NT_VMS_MHD (module header)");
16198 case NT_VMS_LNM:
16199 return _("NT_VMS_LNM (language name)");
16200 case NT_VMS_SRC:
16201 return _("NT_VMS_SRC (source files)");
16202 case NT_VMS_TITLE:
9cf03b7e 16203 return "NT_VMS_TITLE";
00e98fc7
TG
16204 case NT_VMS_EIDC:
16205 return _("NT_VMS_EIDC (consistency check)");
16206 case NT_VMS_FPMODE:
16207 return _("NT_VMS_FPMODE (FP mode)");
16208 case NT_VMS_LINKTIME:
9cf03b7e 16209 return "NT_VMS_LINKTIME";
00e98fc7
TG
16210 case NT_VMS_IMGNAM:
16211 return _("NT_VMS_IMGNAM (image name)");
16212 case NT_VMS_IMGID:
16213 return _("NT_VMS_IMGID (image id)");
16214 case NT_VMS_LINKID:
16215 return _("NT_VMS_LINKID (link id)");
16216 case NT_VMS_IMGBID:
16217 return _("NT_VMS_IMGBID (build id)");
16218 case NT_VMS_GSTNAM:
16219 return _("NT_VMS_GSTNAM (sym table name)");
16220 case NT_VMS_ORIG_DYN:
9cf03b7e 16221 return "NT_VMS_ORIG_DYN";
00e98fc7 16222 case NT_VMS_PATCHTIME:
9cf03b7e 16223 return "NT_VMS_PATCHTIME";
00e98fc7
TG
16224 default:
16225 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
16226 return buff;
16227 }
16228}
16229
16230static int
16231print_ia64_vms_note (Elf_Internal_Note * pnote)
16232{
16233 switch (pnote->type)
16234 {
16235 case NT_VMS_MHD:
16236 if (pnote->descsz > 36)
16237 {
16238 size_t l = strlen (pnote->descdata + 34);
16239 printf (_(" Creation date : %.17s\n"), pnote->descdata);
16240 printf (_(" Last patch date: %.17s\n"), pnote->descdata + 17);
16241 printf (_(" Module name : %s\n"), pnote->descdata + 34);
16242 printf (_(" Module version : %s\n"), pnote->descdata + 34 + l + 1);
16243 }
16244 else
16245 printf (_(" Invalid size\n"));
16246 break;
16247 case NT_VMS_LNM:
16248 printf (_(" Language: %s\n"), pnote->descdata);
16249 break;
16250#ifdef BFD64
16251 case NT_VMS_FPMODE:
9cf03b7e 16252 printf (_(" Floating Point mode: "));
4a5cb34f 16253 printf ("0x%016" BFD_VMA_FMT "x\n",
948f632f 16254 (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
00e98fc7
TG
16255 break;
16256 case NT_VMS_LINKTIME:
16257 printf (_(" Link time: "));
16258 print_vms_time
16259 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
16260 printf ("\n");
16261 break;
16262 case NT_VMS_PATCHTIME:
16263 printf (_(" Patch time: "));
16264 print_vms_time
16265 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
16266 printf ("\n");
16267 break;
16268 case NT_VMS_ORIG_DYN:
16269 printf (_(" Major id: %u, minor id: %u\n"),
16270 (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
16271 (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
9cf03b7e 16272 printf (_(" Last modified : "));
00e98fc7
TG
16273 print_vms_time
16274 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
9cf03b7e 16275 printf (_("\n Link flags : "));
4a5cb34f 16276 printf ("0x%016" BFD_VMA_FMT "x\n",
948f632f 16277 (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
00e98fc7 16278 printf (_(" Header flags: 0x%08x\n"),
948f632f 16279 (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
00e98fc7
TG
16280 printf (_(" Image id : %s\n"), pnote->descdata + 32);
16281 break;
16282#endif
16283 case NT_VMS_IMGNAM:
16284 printf (_(" Image name: %s\n"), pnote->descdata);
16285 break;
16286 case NT_VMS_GSTNAM:
16287 printf (_(" Global symbol table name: %s\n"), pnote->descdata);
16288 break;
16289 case NT_VMS_IMGID:
16290 printf (_(" Image id: %s\n"), pnote->descdata);
16291 break;
16292 case NT_VMS_LINKID:
16293 printf (_(" Linker id: %s\n"), pnote->descdata);
16294 break;
16295 default:
16296 break;
16297 }
16298 return 1;
16299}
16300
6d118b09
NC
16301/* Note that by the ELF standard, the name field is already null byte
16302 terminated, and namesz includes the terminating null byte.
16303 I.E. the value of namesz for the name "FSF" is 4.
16304
e3c8793a 16305 If the value of namesz is zero, there is no name present. */
779fe533 16306static int
1449284b
NC
16307process_note (Elf_Internal_Note * pnote,
16308 FILE * file ATTRIBUTE_UNUSED,
16309 Elf_Internal_Shdr * section ATTRIBUTE_UNUSED)
779fe533 16310{
2cf0635d
NC
16311 const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
16312 const char * nt;
9437c45b
JT
16313
16314 if (pnote->namesz == 0)
1ec5cd37
NC
16315 /* If there is no note name, then use the default set of
16316 note type strings. */
16317 nt = get_note_type (pnote->type);
16318
1118d252
RM
16319 else if (const_strneq (pnote->namedata, "GNU"))
16320 /* GNU-specific object file notes. */
16321 nt = get_gnu_elf_note_type (pnote->type);
f4ddf30f
JB
16322
16323 else if (const_strneq (pnote->namedata, "FreeBSD"))
16324 /* FreeBSD-specific core file notes. */
16325 nt = get_freebsd_elfcore_note_type (pnote->type);
1118d252 16326
0112cd26 16327 else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
1ec5cd37
NC
16328 /* NetBSD-specific core file notes. */
16329 nt = get_netbsd_elfcore_note_type (pnote->type);
16330
c6056a74
SF
16331 else if (const_strneq (pnote->namedata, "NetBSD"))
16332 /* NetBSD-specific core file notes. */
16333 return process_netbsd_elf_note (pnote);
16334
b15fa79e
AM
16335 else if (strneq (pnote->namedata, "SPU/", 4))
16336 {
16337 /* SPU-specific core file notes. */
16338 nt = pnote->namedata + 4;
16339 name = "SPU";
16340 }
16341
00e98fc7
TG
16342 else if (const_strneq (pnote->namedata, "IPF/VMS"))
16343 /* VMS/ia64-specific file notes. */
16344 nt = get_ia64_vms_note_type (pnote->type);
16345
70616151
TT
16346 else if (const_strneq (pnote->namedata, "stapsdt"))
16347 nt = get_stapsdt_note_type (pnote->type);
16348
9437c45b 16349 else
1ec5cd37
NC
16350 /* Don't recognize this note name; just use the default set of
16351 note type strings. */
00e98fc7 16352 nt = get_note_type (pnote->type);
9437c45b 16353
1449284b
NC
16354 printf (" ");
16355 print_symbol (-20, name);
16356 printf (" 0x%08lx\t%s\n", pnote->descsz, nt);
00e98fc7
TG
16357
16358 if (const_strneq (pnote->namedata, "IPF/VMS"))
16359 return print_ia64_vms_note (pnote);
664f90a3
TT
16360 else if (const_strneq (pnote->namedata, "GNU"))
16361 return print_gnu_note (pnote);
c6a9fc58
TT
16362 else if (const_strneq (pnote->namedata, "stapsdt"))
16363 return print_stapsdt_note (pnote);
9ece1fa9
TT
16364 else if (const_strneq (pnote->namedata, "CORE"))
16365 return print_core_note (pnote);
779fe533 16366
1449284b
NC
16367 else if (pnote->descsz)
16368 {
16369 unsigned long i;
16370
16371 printf (_(" description data: "));
16372 for (i = 0; i < pnote->descsz; i++)
16373 printf ("%02x ", pnote->descdata[i]);
16374 printf ("\n");
16375 }
16376
16377 return 1;
16378}
6d118b09 16379
779fe533 16380static int
1449284b
NC
16381process_notes_at (FILE * file,
16382 Elf_Internal_Shdr * section,
16383 bfd_vma offset,
16384 bfd_vma length)
779fe533 16385{
2cf0635d
NC
16386 Elf_External_Note * pnotes;
16387 Elf_External_Note * external;
c8071705 16388 char * end;
b34976b6 16389 int res = 1;
103f02d3 16390
779fe533
NC
16391 if (length <= 0)
16392 return 0;
103f02d3 16393
1449284b
NC
16394 if (section)
16395 {
16396 pnotes = (Elf_External_Note *) get_section_contents (section, file);
16397 if (pnotes)
16398 apply_relocations (file, section, (unsigned char *) pnotes, length, NULL, NULL);
16399 }
16400 else
16401 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
16402 _("notes"));
dd24e3da 16403 if (pnotes == NULL)
a6e9f9df 16404 return 0;
779fe533 16405
103f02d3 16406 external = pnotes;
103f02d3 16407
1449284b
NC
16408 if (section)
16409 printf (_("\nDisplaying notes found in: %s\n"), printable_section_name (section));
16410 else
16411 printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
16412 (unsigned long) offset, (unsigned long) length);
16413
2aee03ae 16414 printf (_(" %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
103f02d3 16415
c8071705
NC
16416 end = (char *) pnotes + length;
16417 while ((char *) external < end)
779fe533 16418 {
b34976b6 16419 Elf_Internal_Note inote;
15b42fb0
AM
16420 size_t min_notesz;
16421 char *next;
2cf0635d 16422 char * temp = NULL;
c8071705 16423 size_t data_remaining = end - (char *) external;
6d118b09 16424
00e98fc7 16425 if (!is_ia64_vms ())
15b42fb0 16426 {
9dd3a467
NC
16427 /* PR binutils/15191
16428 Make sure that there is enough data to read. */
15b42fb0
AM
16429 min_notesz = offsetof (Elf_External_Note, name);
16430 if (data_remaining < min_notesz)
9dd3a467
NC
16431 {
16432 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
16433 (int) data_remaining);
16434 break;
16435 }
15b42fb0
AM
16436 inote.type = BYTE_GET (external->type);
16437 inote.namesz = BYTE_GET (external->namesz);
16438 inote.namedata = external->name;
16439 inote.descsz = BYTE_GET (external->descsz);
16440 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
834f871c 16441 /* PR 17531: file: 3443835e. */
c8071705 16442 if (inote.descdata < (char *) pnotes || inote.descdata > end)
834f871c
NC
16443 {
16444 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
16445 inote.descdata = inote.namedata;
16446 inote.namesz = 0;
16447 }
14ae95f2 16448
15b42fb0
AM
16449 inote.descpos = offset + (inote.descdata - (char *) pnotes);
16450 next = inote.descdata + align_power (inote.descsz, 2);
16451 }
00e98fc7 16452 else
15b42fb0
AM
16453 {
16454 Elf64_External_VMS_Note *vms_external;
00e98fc7 16455
9dd3a467
NC
16456 /* PR binutils/15191
16457 Make sure that there is enough data to read. */
15b42fb0
AM
16458 min_notesz = offsetof (Elf64_External_VMS_Note, name);
16459 if (data_remaining < min_notesz)
9dd3a467
NC
16460 {
16461 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
16462 (int) data_remaining);
16463 break;
16464 }
3e55a963 16465
15b42fb0
AM
16466 vms_external = (Elf64_External_VMS_Note *) external;
16467 inote.type = BYTE_GET (vms_external->type);
16468 inote.namesz = BYTE_GET (vms_external->namesz);
16469 inote.namedata = vms_external->name;
16470 inote.descsz = BYTE_GET (vms_external->descsz);
16471 inote.descdata = inote.namedata + align_power (inote.namesz, 3);
16472 inote.descpos = offset + (inote.descdata - (char *) pnotes);
16473 next = inote.descdata + align_power (inote.descsz, 3);
16474 }
16475
16476 if (inote.descdata < (char *) external + min_notesz
16477 || next < (char *) external + min_notesz
5d921cbd
NC
16478 /* PR binutils/17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4. */
16479 || inote.namedata + inote.namesz < inote.namedata
16480 || inote.descdata + inote.descsz < inote.descdata
15b42fb0 16481 || data_remaining < (size_t)(next - (char *) external))
3e55a963 16482 {
15b42fb0 16483 warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
0af1713e 16484 (unsigned long) ((char *) external - (char *) pnotes));
9dd3a467 16485 warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
3e55a963
NC
16486 inote.type, inote.namesz, inote.descsz);
16487 break;
16488 }
16489
15b42fb0 16490 external = (Elf_External_Note *) next;
dd24e3da 16491
6d118b09
NC
16492 /* Verify that name is null terminated. It appears that at least
16493 one version of Linux (RedHat 6.0) generates corefiles that don't
16494 comply with the ELF spec by failing to include the null byte in
16495 namesz. */
8b971f9f 16496 if (inote.namedata[inote.namesz - 1] != '\0')
6d118b09 16497 {
3f5e193b 16498 temp = (char *) malloc (inote.namesz + 1);
6d118b09
NC
16499 if (temp == NULL)
16500 {
8b73c356 16501 error (_("Out of memory allocating space for inote name\n"));
6d118b09
NC
16502 res = 0;
16503 break;
16504 }
76da6bbe 16505
6d118b09
NC
16506 strncpy (temp, inote.namedata, inote.namesz);
16507 temp[inote.namesz] = 0;
76da6bbe 16508
6d118b09
NC
16509 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
16510 inote.namedata = temp;
16511 }
16512
1449284b 16513 res &= process_note (& inote, file, section);
103f02d3 16514
6d118b09
NC
16515 if (temp != NULL)
16516 {
16517 free (temp);
16518 temp = NULL;
16519 }
779fe533
NC
16520 }
16521
16522 free (pnotes);
103f02d3 16523
779fe533
NC
16524 return res;
16525}
16526
16527static int
2cf0635d 16528process_corefile_note_segments (FILE * file)
779fe533 16529{
2cf0635d 16530 Elf_Internal_Phdr * segment;
b34976b6
AM
16531 unsigned int i;
16532 int res = 1;
103f02d3 16533
d93f0186 16534 if (! get_program_headers (file))
779fe533 16535 return 0;
103f02d3 16536
779fe533
NC
16537 for (i = 0, segment = program_headers;
16538 i < elf_header.e_phnum;
b34976b6 16539 i++, segment++)
779fe533
NC
16540 {
16541 if (segment->p_type == PT_NOTE)
1449284b
NC
16542 res &= process_notes_at (file, NULL,
16543 (bfd_vma) segment->p_offset,
16544 (bfd_vma) segment->p_filesz);
779fe533 16545 }
103f02d3 16546
779fe533
NC
16547 return res;
16548}
16549
685080f2
NC
16550static int
16551process_v850_notes (FILE * file, bfd_vma offset, bfd_vma length)
16552{
16553 Elf_External_Note * pnotes;
16554 Elf_External_Note * external;
c8071705 16555 char * end;
685080f2
NC
16556 int res = 1;
16557
16558 if (length <= 0)
16559 return 0;
16560
16561 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
16562 _("v850 notes"));
16563 if (pnotes == NULL)
16564 return 0;
16565
16566 external = pnotes;
c8071705 16567 end = (char*) pnotes + length;
685080f2
NC
16568
16569 printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
16570 (unsigned long) offset, (unsigned long) length);
16571
c8071705 16572 while ((char *) external + sizeof (Elf_External_Note) < end)
685080f2
NC
16573 {
16574 Elf_External_Note * next;
16575 Elf_Internal_Note inote;
16576
16577 inote.type = BYTE_GET (external->type);
16578 inote.namesz = BYTE_GET (external->namesz);
16579 inote.namedata = external->name;
16580 inote.descsz = BYTE_GET (external->descsz);
16581 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
16582 inote.descpos = offset + (inote.descdata - (char *) pnotes);
16583
c8071705
NC
16584 if (inote.descdata < (char *) pnotes || inote.descdata >= end)
16585 {
16586 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
16587 inote.descdata = inote.namedata;
16588 inote.namesz = 0;
16589 }
16590
685080f2
NC
16591 next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
16592
c8071705 16593 if ( ((char *) next > end)
685080f2
NC
16594 || ((char *) next < (char *) pnotes))
16595 {
16596 warn (_("corrupt descsz found in note at offset 0x%lx\n"),
16597 (unsigned long) ((char *) external - (char *) pnotes));
16598 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
16599 inote.type, inote.namesz, inote.descsz);
16600 break;
16601 }
16602
16603 external = next;
16604
16605 /* Prevent out-of-bounds indexing. */
c8071705 16606 if ( inote.namedata + inote.namesz > end
685080f2
NC
16607 || inote.namedata + inote.namesz < inote.namedata)
16608 {
16609 warn (_("corrupt namesz found in note at offset 0x%lx\n"),
16610 (unsigned long) ((char *) external - (char *) pnotes));
16611 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
16612 inote.type, inote.namesz, inote.descsz);
16613 break;
16614 }
16615
16616 printf (" %s: ", get_v850_elf_note_type (inote.type));
16617
16618 if (! print_v850_note (& inote))
16619 {
16620 res = 0;
16621 printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
16622 inote.namesz, inote.descsz);
16623 }
16624 }
16625
16626 free (pnotes);
16627
16628 return res;
16629}
16630
779fe533 16631static int
2cf0635d 16632process_note_sections (FILE * file)
1ec5cd37 16633{
2cf0635d 16634 Elf_Internal_Shdr * section;
1ec5cd37 16635 unsigned long i;
df565f32 16636 int n = 0;
1ec5cd37
NC
16637 int res = 1;
16638
16639 for (i = 0, section = section_headers;
fa1908fd 16640 i < elf_header.e_shnum && section != NULL;
1ec5cd37 16641 i++, section++)
685080f2
NC
16642 {
16643 if (section->sh_type == SHT_NOTE)
16644 {
1449284b
NC
16645 res &= process_notes_at (file, section,
16646 (bfd_vma) section->sh_offset,
16647 (bfd_vma) section->sh_size);
685080f2
NC
16648 n++;
16649 }
16650
16651 if (( elf_header.e_machine == EM_V800
16652 || elf_header.e_machine == EM_V850
16653 || elf_header.e_machine == EM_CYGNUS_V850)
16654 && section->sh_type == SHT_RENESAS_INFO)
16655 {
16656 res &= process_v850_notes (file,
16657 (bfd_vma) section->sh_offset,
16658 (bfd_vma) section->sh_size);
16659 n++;
16660 }
16661 }
df565f32
NC
16662
16663 if (n == 0)
16664 /* Try processing NOTE segments instead. */
16665 return process_corefile_note_segments (file);
1ec5cd37
NC
16666
16667 return res;
16668}
16669
16670static int
2cf0635d 16671process_notes (FILE * file)
779fe533
NC
16672{
16673 /* If we have not been asked to display the notes then do nothing. */
16674 if (! do_notes)
16675 return 1;
103f02d3 16676
779fe533 16677 if (elf_header.e_type != ET_CORE)
1ec5cd37 16678 return process_note_sections (file);
103f02d3 16679
779fe533 16680 /* No program headers means no NOTE segment. */
1ec5cd37
NC
16681 if (elf_header.e_phnum > 0)
16682 return process_corefile_note_segments (file);
779fe533 16683
1ec5cd37
NC
16684 printf (_("No note segments present in the core file.\n"));
16685 return 1;
779fe533
NC
16686}
16687
252b5132 16688static int
2cf0635d 16689process_arch_specific (FILE * file)
252b5132 16690{
a952a375
NC
16691 if (! do_arch)
16692 return 1;
16693
252b5132
RH
16694 switch (elf_header.e_machine)
16695 {
11c1ff18
PB
16696 case EM_ARM:
16697 return process_arm_specific (file);
252b5132 16698 case EM_MIPS:
4fe85591 16699 case EM_MIPS_RS3_LE:
252b5132
RH
16700 return process_mips_specific (file);
16701 break;
35c08157
KLC
16702 case EM_NDS32:
16703 return process_nds32_specific (file);
16704 break;
34c8bcba 16705 case EM_PPC:
b82317dd 16706 case EM_PPC64:
34c8bcba
JM
16707 return process_power_specific (file);
16708 break;
643f7afb
AK
16709 case EM_S390:
16710 case EM_S390_OLD:
16711 return process_s390_specific (file);
16712 break;
9e8c70f9
DM
16713 case EM_SPARC:
16714 case EM_SPARC32PLUS:
16715 case EM_SPARCV9:
16716 return process_sparc_specific (file);
16717 break;
59e6276b
JM
16718 case EM_TI_C6000:
16719 return process_tic6x_specific (file);
16720 break;
13761a11
NC
16721 case EM_MSP430:
16722 return process_msp430x_specific (file);
252b5132
RH
16723 default:
16724 break;
16725 }
16726 return 1;
16727}
16728
16729static int
2cf0635d 16730get_file_header (FILE * file)
252b5132 16731{
9ea033b2
NC
16732 /* Read in the identity array. */
16733 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
252b5132
RH
16734 return 0;
16735
9ea033b2 16736 /* Determine how to read the rest of the header. */
b34976b6 16737 switch (elf_header.e_ident[EI_DATA])
9ea033b2 16738 {
1a0670f3
AM
16739 default:
16740 case ELFDATANONE:
adab8cdc
AO
16741 case ELFDATA2LSB:
16742 byte_get = byte_get_little_endian;
16743 byte_put = byte_put_little_endian;
16744 break;
16745 case ELFDATA2MSB:
16746 byte_get = byte_get_big_endian;
16747 byte_put = byte_put_big_endian;
16748 break;
9ea033b2
NC
16749 }
16750
16751 /* For now we only support 32 bit and 64 bit ELF files. */
b34976b6 16752 is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
9ea033b2
NC
16753
16754 /* Read in the rest of the header. */
16755 if (is_32bit_elf)
16756 {
16757 Elf32_External_Ehdr ehdr32;
252b5132 16758
9ea033b2
NC
16759 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
16760 return 0;
103f02d3 16761
9ea033b2
NC
16762 elf_header.e_type = BYTE_GET (ehdr32.e_type);
16763 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
16764 elf_header.e_version = BYTE_GET (ehdr32.e_version);
16765 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
16766 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
16767 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
16768 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
16769 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
16770 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
16771 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
16772 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
16773 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
16774 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
16775 }
252b5132 16776 else
9ea033b2
NC
16777 {
16778 Elf64_External_Ehdr ehdr64;
a952a375
NC
16779
16780 /* If we have been compiled with sizeof (bfd_vma) == 4, then
16781 we will not be able to cope with the 64bit data found in
16782 64 ELF files. Detect this now and abort before we start
50c2245b 16783 overwriting things. */
a952a375
NC
16784 if (sizeof (bfd_vma) < 8)
16785 {
e3c8793a
NC
16786 error (_("This instance of readelf has been built without support for a\n\
1678764 bit data type and so it cannot read 64 bit ELF files.\n"));
a952a375
NC
16788 return 0;
16789 }
103f02d3 16790
9ea033b2
NC
16791 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
16792 return 0;
103f02d3 16793
9ea033b2
NC
16794 elf_header.e_type = BYTE_GET (ehdr64.e_type);
16795 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
16796 elf_header.e_version = BYTE_GET (ehdr64.e_version);
66543521
AM
16797 elf_header.e_entry = BYTE_GET (ehdr64.e_entry);
16798 elf_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
16799 elf_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
9ea033b2
NC
16800 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
16801 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
16802 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
16803 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
16804 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
16805 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
16806 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
16807 }
252b5132 16808
7ece0d85
JJ
16809 if (elf_header.e_shoff)
16810 {
16811 /* There may be some extensions in the first section header. Don't
16812 bomb if we can't read it. */
16813 if (is_32bit_elf)
049b0c3a 16814 get_32bit_section_headers (file, TRUE);
7ece0d85 16815 else
049b0c3a 16816 get_64bit_section_headers (file, TRUE);
7ece0d85 16817 }
560f3c1c 16818
252b5132
RH
16819 return 1;
16820}
16821
fb52b2f4
NC
16822/* Process one ELF object file according to the command line options.
16823 This file may actually be stored in an archive. The file is
16824 positioned at the start of the ELF object. */
16825
ff78d6d6 16826static int
2cf0635d 16827process_object (char * file_name, FILE * file)
252b5132 16828{
252b5132
RH
16829 unsigned int i;
16830
252b5132
RH
16831 if (! get_file_header (file))
16832 {
16833 error (_("%s: Failed to read file header\n"), file_name);
ff78d6d6 16834 return 1;
252b5132
RH
16835 }
16836
16837 /* Initialise per file variables. */
60bca95a 16838 for (i = ARRAY_SIZE (version_info); i--;)
252b5132
RH
16839 version_info[i] = 0;
16840
60bca95a 16841 for (i = ARRAY_SIZE (dynamic_info); i--;)
252b5132 16842 dynamic_info[i] = 0;
5115b233 16843 dynamic_info_DT_GNU_HASH = 0;
252b5132
RH
16844
16845 /* Process the file. */
16846 if (show_name)
16847 printf (_("\nFile: %s\n"), file_name);
16848
18bd398b
NC
16849 /* Initialise the dump_sects array from the cmdline_dump_sects array.
16850 Note we do this even if cmdline_dump_sects is empty because we
16851 must make sure that the dump_sets array is zeroed out before each
16852 object file is processed. */
16853 if (num_dump_sects > num_cmdline_dump_sects)
09c11c86 16854 memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
18bd398b
NC
16855
16856 if (num_cmdline_dump_sects > 0)
16857 {
16858 if (num_dump_sects == 0)
16859 /* A sneaky way of allocating the dump_sects array. */
09c11c86 16860 request_dump_bynumber (num_cmdline_dump_sects, 0);
18bd398b
NC
16861
16862 assert (num_dump_sects >= num_cmdline_dump_sects);
09c11c86
NC
16863 memcpy (dump_sects, cmdline_dump_sects,
16864 num_cmdline_dump_sects * sizeof (* dump_sects));
18bd398b 16865 }
d70c5fc7 16866
252b5132 16867 if (! process_file_header ())
fb52b2f4 16868 return 1;
252b5132 16869
d1f5c6e3 16870 if (! process_section_headers (file))
2f62977e 16871 {
d1f5c6e3
L
16872 /* Without loaded section headers we cannot process lots of
16873 things. */
2f62977e 16874 do_unwind = do_version = do_dump = do_arch = 0;
252b5132 16875
2f62977e 16876 if (! do_using_dynamic)
2c610e4b 16877 do_syms = do_dyn_syms = do_reloc = 0;
2f62977e 16878 }
252b5132 16879
d1f5c6e3
L
16880 if (! process_section_groups (file))
16881 {
16882 /* Without loaded section groups we cannot process unwind. */
16883 do_unwind = 0;
16884 }
16885
2f62977e 16886 if (process_program_headers (file))
b2d38a17 16887 process_dynamic_section (file);
252b5132
RH
16888
16889 process_relocs (file);
16890
4d6ed7c8
NC
16891 process_unwind (file);
16892
252b5132
RH
16893 process_symbol_table (file);
16894
16895 process_syminfo (file);
16896
16897 process_version_sections (file);
16898
16899 process_section_contents (file);
f5842774 16900
1ec5cd37 16901 process_notes (file);
103f02d3 16902
047b2264
JJ
16903 process_gnu_liblist (file);
16904
252b5132
RH
16905 process_arch_specific (file);
16906
d93f0186
NC
16907 if (program_headers)
16908 {
16909 free (program_headers);
16910 program_headers = NULL;
16911 }
16912
252b5132
RH
16913 if (section_headers)
16914 {
16915 free (section_headers);
16916 section_headers = NULL;
16917 }
16918
16919 if (string_table)
16920 {
16921 free (string_table);
16922 string_table = NULL;
d40ac9bd 16923 string_table_length = 0;
252b5132
RH
16924 }
16925
16926 if (dynamic_strings)
16927 {
16928 free (dynamic_strings);
16929 dynamic_strings = NULL;
d79b3d50 16930 dynamic_strings_length = 0;
252b5132
RH
16931 }
16932
16933 if (dynamic_symbols)
16934 {
16935 free (dynamic_symbols);
16936 dynamic_symbols = NULL;
19936277 16937 num_dynamic_syms = 0;
252b5132
RH
16938 }
16939
16940 if (dynamic_syminfo)
16941 {
16942 free (dynamic_syminfo);
16943 dynamic_syminfo = NULL;
16944 }
ff78d6d6 16945
293c573e
MR
16946 if (dynamic_section)
16947 {
16948 free (dynamic_section);
16949 dynamic_section = NULL;
16950 }
16951
e4b17d5c
L
16952 if (section_headers_groups)
16953 {
16954 free (section_headers_groups);
16955 section_headers_groups = NULL;
16956 }
16957
16958 if (section_groups)
16959 {
2cf0635d
NC
16960 struct group_list * g;
16961 struct group_list * next;
e4b17d5c
L
16962
16963 for (i = 0; i < group_count; i++)
16964 {
16965 for (g = section_groups [i].root; g != NULL; g = next)
16966 {
16967 next = g->next;
16968 free (g);
16969 }
16970 }
16971
16972 free (section_groups);
16973 section_groups = NULL;
16974 }
16975
19e6b90e 16976 free_debug_memory ();
18bd398b 16977
ff78d6d6 16978 return 0;
252b5132
RH
16979}
16980
2cf0635d
NC
16981/* Process an ELF archive.
16982 On entry the file is positioned just after the ARMAG string. */
16983
16984static int
16985process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
16986{
16987 struct archive_info arch;
16988 struct archive_info nested_arch;
16989 size_t got;
2cf0635d
NC
16990 int ret;
16991
16992 show_name = 1;
16993
16994 /* The ARCH structure is used to hold information about this archive. */
16995 arch.file_name = NULL;
16996 arch.file = NULL;
16997 arch.index_array = NULL;
16998 arch.sym_table = NULL;
16999 arch.longnames = NULL;
17000
17001 /* The NESTED_ARCH structure is used as a single-item cache of information
17002 about a nested archive (when members of a thin archive reside within
17003 another regular archive file). */
17004 nested_arch.file_name = NULL;
17005 nested_arch.file = NULL;
17006 nested_arch.index_array = NULL;
17007 nested_arch.sym_table = NULL;
17008 nested_arch.longnames = NULL;
17009
17010 if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
17011 {
17012 ret = 1;
17013 goto out;
4145f1d5 17014 }
fb52b2f4 17015
4145f1d5
NC
17016 if (do_archive_index)
17017 {
2cf0635d 17018 if (arch.sym_table == NULL)
4145f1d5
NC
17019 error (_("%s: unable to dump the index as none was found\n"), file_name);
17020 else
17021 {
591f7597 17022 unsigned long i, l;
4145f1d5
NC
17023 unsigned long current_pos;
17024
591f7597
NC
17025 printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
17026 file_name, (unsigned long) arch.index_num, arch.sym_size);
4145f1d5
NC
17027 current_pos = ftell (file);
17028
2cf0635d 17029 for (i = l = 0; i < arch.index_num; i++)
4145f1d5 17030 {
2cf0635d
NC
17031 if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
17032 {
17033 char * member_name;
4145f1d5 17034
2cf0635d
NC
17035 member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
17036
17037 if (member_name != NULL)
17038 {
17039 char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
17040
17041 if (qualified_name != NULL)
17042 {
c2a7d3f5
NC
17043 printf (_("Contents of binary %s at offset "), qualified_name);
17044 (void) print_vma (arch.index_array[i], PREFIX_HEX);
17045 putchar ('\n');
2cf0635d
NC
17046 free (qualified_name);
17047 }
4145f1d5
NC
17048 }
17049 }
2cf0635d
NC
17050
17051 if (l >= arch.sym_size)
4145f1d5
NC
17052 {
17053 error (_("%s: end of the symbol table reached before the end of the index\n"),
17054 file_name);
cb8f3167 17055 break;
4145f1d5 17056 }
591f7597
NC
17057 /* PR 17531: file: 0b6630b2. */
17058 printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
17059 l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
4145f1d5
NC
17060 }
17061
c2a7d3f5
NC
17062 if (arch.uses_64bit_indicies)
17063 l = (l + 7) & ~ 7;
17064 else
17065 l += l & 1;
17066
2cf0635d 17067 if (l < arch.sym_size)
c2a7d3f5
NC
17068 error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
17069 file_name, arch.sym_size - l);
4145f1d5 17070
4145f1d5
NC
17071 if (fseek (file, current_pos, SEEK_SET) != 0)
17072 {
17073 error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
2cf0635d
NC
17074 ret = 1;
17075 goto out;
4145f1d5 17076 }
fb52b2f4 17077 }
4145f1d5
NC
17078
17079 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
17080 && !do_segments && !do_header && !do_dump && !do_version
17081 && !do_histogram && !do_debugging && !do_arch && !do_notes
2c610e4b 17082 && !do_section_groups && !do_dyn_syms)
2cf0635d
NC
17083 {
17084 ret = 0; /* Archive index only. */
17085 goto out;
17086 }
fb52b2f4
NC
17087 }
17088
d989285c 17089 ret = 0;
fb52b2f4
NC
17090
17091 while (1)
17092 {
2cf0635d
NC
17093 char * name;
17094 size_t namelen;
17095 char * qualified_name;
17096
17097 /* Read the next archive header. */
17098 if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
17099 {
17100 error (_("%s: failed to seek to next archive header\n"), file_name);
17101 return 1;
17102 }
17103 got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
17104 if (got != sizeof arch.arhdr)
17105 {
17106 if (got == 0)
17107 break;
17108 error (_("%s: failed to read archive header\n"), file_name);
17109 ret = 1;
17110 break;
17111 }
17112 if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
17113 {
17114 error (_("%s: did not find a valid archive header\n"), arch.file_name);
17115 ret = 1;
17116 break;
17117 }
17118
17119 arch.next_arhdr_offset += sizeof arch.arhdr;
17120
17121 archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
17122 if (archive_file_size & 01)
17123 ++archive_file_size;
17124
17125 name = get_archive_member_name (&arch, &nested_arch);
17126 if (name == NULL)
fb52b2f4 17127 {
0fd3a477 17128 error (_("%s: bad archive file name\n"), file_name);
d989285c
ILT
17129 ret = 1;
17130 break;
fb52b2f4 17131 }
2cf0635d 17132 namelen = strlen (name);
fb52b2f4 17133
2cf0635d
NC
17134 qualified_name = make_qualified_name (&arch, &nested_arch, name);
17135 if (qualified_name == NULL)
fb52b2f4 17136 {
2cf0635d 17137 error (_("%s: bad archive file name\n"), file_name);
d989285c
ILT
17138 ret = 1;
17139 break;
fb52b2f4
NC
17140 }
17141
2cf0635d
NC
17142 if (is_thin_archive && arch.nested_member_origin == 0)
17143 {
17144 /* This is a proxy for an external member of a thin archive. */
17145 FILE * member_file;
17146 char * member_file_name = adjust_relative_path (file_name, name, namelen);
17147 if (member_file_name == NULL)
17148 {
17149 ret = 1;
17150 break;
17151 }
17152
17153 member_file = fopen (member_file_name, "rb");
17154 if (member_file == NULL)
17155 {
17156 error (_("Input file '%s' is not readable.\n"), member_file_name);
17157 free (member_file_name);
17158 ret = 1;
17159 break;
17160 }
17161
17162 archive_file_offset = arch.nested_member_origin;
17163
17164 ret |= process_object (qualified_name, member_file);
17165
17166 fclose (member_file);
17167 free (member_file_name);
17168 }
17169 else if (is_thin_archive)
17170 {
a043396b
NC
17171 /* PR 15140: Allow for corrupt thin archives. */
17172 if (nested_arch.file == NULL)
17173 {
17174 error (_("%s: contains corrupt thin archive: %s\n"),
17175 file_name, name);
17176 ret = 1;
17177 break;
17178 }
17179
2cf0635d
NC
17180 /* This is a proxy for a member of a nested archive. */
17181 archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
17182
17183 /* The nested archive file will have been opened and setup by
17184 get_archive_member_name. */
17185 if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
17186 {
17187 error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
17188 ret = 1;
17189 break;
17190 }
17191
17192 ret |= process_object (qualified_name, nested_arch.file);
17193 }
17194 else
17195 {
17196 archive_file_offset = arch.next_arhdr_offset;
17197 arch.next_arhdr_offset += archive_file_size;
fb52b2f4 17198
2cf0635d
NC
17199 ret |= process_object (qualified_name, file);
17200 }
fb52b2f4 17201
2b52916e
L
17202 if (dump_sects != NULL)
17203 {
17204 free (dump_sects);
17205 dump_sects = NULL;
17206 num_dump_sects = 0;
17207 }
17208
2cf0635d 17209 free (qualified_name);
fb52b2f4
NC
17210 }
17211
4145f1d5 17212 out:
2cf0635d
NC
17213 if (nested_arch.file != NULL)
17214 fclose (nested_arch.file);
17215 release_archive (&nested_arch);
17216 release_archive (&arch);
fb52b2f4 17217
d989285c 17218 return ret;
fb52b2f4
NC
17219}
17220
17221static int
2cf0635d 17222process_file (char * file_name)
fb52b2f4 17223{
2cf0635d 17224 FILE * file;
fb52b2f4
NC
17225 struct stat statbuf;
17226 char armag[SARMAG];
17227 int ret;
17228
17229 if (stat (file_name, &statbuf) < 0)
17230 {
f24ddbdd
NC
17231 if (errno == ENOENT)
17232 error (_("'%s': No such file\n"), file_name);
17233 else
17234 error (_("Could not locate '%s'. System error message: %s\n"),
17235 file_name, strerror (errno));
17236 return 1;
17237 }
17238
17239 if (! S_ISREG (statbuf.st_mode))
17240 {
17241 error (_("'%s' is not an ordinary file\n"), file_name);
fb52b2f4
NC
17242 return 1;
17243 }
17244
17245 file = fopen (file_name, "rb");
17246 if (file == NULL)
17247 {
f24ddbdd 17248 error (_("Input file '%s' is not readable.\n"), file_name);
fb52b2f4
NC
17249 return 1;
17250 }
17251
17252 if (fread (armag, SARMAG, 1, file) != 1)
17253 {
4145f1d5 17254 error (_("%s: Failed to read file's magic number\n"), file_name);
fb52b2f4
NC
17255 fclose (file);
17256 return 1;
17257 }
17258
f54498b4
NC
17259 current_file_size = (bfd_size_type) statbuf.st_size;
17260
fb52b2f4 17261 if (memcmp (armag, ARMAG, SARMAG) == 0)
2cf0635d
NC
17262 ret = process_archive (file_name, file, FALSE);
17263 else if (memcmp (armag, ARMAGT, SARMAG) == 0)
17264 ret = process_archive (file_name, file, TRUE);
fb52b2f4
NC
17265 else
17266 {
4145f1d5
NC
17267 if (do_archive_index)
17268 error (_("File %s is not an archive so its index cannot be displayed.\n"),
17269 file_name);
17270
fb52b2f4
NC
17271 rewind (file);
17272 archive_file_size = archive_file_offset = 0;
17273 ret = process_object (file_name, file);
17274 }
17275
17276 fclose (file);
17277
f54498b4 17278 current_file_size = 0;
fb52b2f4
NC
17279 return ret;
17280}
17281
252b5132
RH
17282#ifdef SUPPORT_DISASSEMBLY
17283/* Needed by the i386 disassembler. For extra credit, someone could
9ea033b2 17284 fix this so that we insert symbolic addresses here, esp for GOT/PLT
e3c8793a 17285 symbols. */
252b5132
RH
17286
17287void
2cf0635d 17288print_address (unsigned int addr, FILE * outfile)
252b5132
RH
17289{
17290 fprintf (outfile,"0x%8.8x", addr);
17291}
17292
e3c8793a 17293/* Needed by the i386 disassembler. */
252b5132
RH
17294void
17295db_task_printsym (unsigned int addr)
17296{
17297 print_address (addr, stderr);
17298}
17299#endif
17300
17301int
2cf0635d 17302main (int argc, char ** argv)
252b5132 17303{
ff78d6d6
L
17304 int err;
17305
252b5132
RH
17306#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
17307 setlocale (LC_MESSAGES, "");
3882b010
L
17308#endif
17309#if defined (HAVE_SETLOCALE)
17310 setlocale (LC_CTYPE, "");
252b5132
RH
17311#endif
17312 bindtextdomain (PACKAGE, LOCALEDIR);
17313 textdomain (PACKAGE);
17314
869b9d07
MM
17315 expandargv (&argc, &argv);
17316
252b5132
RH
17317 parse_args (argc, argv);
17318
18bd398b 17319 if (num_dump_sects > 0)
59f14fc0 17320 {
18bd398b 17321 /* Make a copy of the dump_sects array. */
3f5e193b
NC
17322 cmdline_dump_sects = (dump_type *)
17323 malloc (num_dump_sects * sizeof (* dump_sects));
59f14fc0 17324 if (cmdline_dump_sects == NULL)
591a748a 17325 error (_("Out of memory allocating dump request table.\n"));
59f14fc0
AS
17326 else
17327 {
09c11c86
NC
17328 memcpy (cmdline_dump_sects, dump_sects,
17329 num_dump_sects * sizeof (* dump_sects));
59f14fc0
AS
17330 num_cmdline_dump_sects = num_dump_sects;
17331 }
17332 }
17333
18bd398b
NC
17334 if (optind < (argc - 1))
17335 show_name = 1;
5656ba2c
L
17336 else if (optind >= argc)
17337 {
17338 warn (_("Nothing to do.\n"));
17339 usage (stderr);
17340 }
18bd398b 17341
ff78d6d6 17342 err = 0;
252b5132 17343 while (optind < argc)
18bd398b 17344 err |= process_file (argv[optind++]);
252b5132
RH
17345
17346 if (dump_sects != NULL)
17347 free (dump_sects);
59f14fc0
AS
17348 if (cmdline_dump_sects != NULL)
17349 free (cmdline_dump_sects);
252b5132 17350
ff78d6d6 17351 return err;
252b5132 17352}
This page took 3.158725 seconds and 4 git commands to generate.