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