]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - binutils/readelf.c
Fix classification of `module.type' in D lexer.
[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;
32ec8896
NC
200static bfd_boolean show_name = FALSE;
201static bfd_boolean do_dynamic = FALSE;
202static bfd_boolean do_syms = FALSE;
203static bfd_boolean do_dyn_syms = FALSE;
204static bfd_boolean do_reloc = FALSE;
205static bfd_boolean do_sections = FALSE;
206static bfd_boolean do_section_groups = FALSE;
207static bfd_boolean do_section_details = FALSE;
208static bfd_boolean do_segments = FALSE;
209static bfd_boolean do_unwind = FALSE;
210static bfd_boolean do_using_dynamic = FALSE;
211static bfd_boolean do_header = FALSE;
212static bfd_boolean do_dump = FALSE;
213static bfd_boolean do_version = FALSE;
214static bfd_boolean do_histogram = FALSE;
215static bfd_boolean do_debugging = FALSE;
216static bfd_boolean do_arch = FALSE;
217static bfd_boolean do_notes = FALSE;
218static bfd_boolean do_archive_index = FALSE;
219static bfd_boolean is_32bit_elf = FALSE;
220static bfd_boolean decompress_dumps = FALSE;
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
32ec8896
NC
292static const char * get_symbol_version_string
293 (FILE *, bfd_boolean, const char *, unsigned long, unsigned,
294 Elf_Internal_Sym *, enum versioned_symbol_info *, unsigned short *);
bb4d2ac2 295
9c19a809
NC
296#define UNKNOWN -1
297
2b692964
NC
298#define SECTION_NAME(X) \
299 ((X) == NULL ? _("<none>") \
300 : string_table == NULL ? _("<no-name>") \
301 : ((X)->sh_name >= string_table_length ? _("<corrupt>") \
0b49d371 302 : string_table + (X)->sh_name))
252b5132 303
ee42cf8c 304#define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
252b5132 305
ba5cdace
NC
306#define GET_ELF_SYMBOLS(file, section, sym_count) \
307 (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count) \
308 : get_64bit_elf_symbols (file, section, sym_count))
9ea033b2 309
d79b3d50
NC
310#define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
311/* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
312 already been called and verified that the string exists. */
313#define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
18bd398b 314
61865e30
NC
315#define REMOVE_ARCH_BITS(ADDR) \
316 do \
317 { \
318 if (elf_header.e_machine == EM_ARM) \
319 (ADDR) &= ~1; \
320 } \
321 while (0)
d79b3d50 322\f
c9c1d674
EG
323/* Retrieve NMEMB structures, each SIZE bytes long from FILE starting at OFFSET +
324 the offset of the current archive member, if we are examining an archive.
59245841
NC
325 Put the retrieved data into VAR, if it is not NULL. Otherwise allocate a buffer
326 using malloc and fill that. In either case return the pointer to the start of
327 the retrieved data or NULL if something went wrong. If something does go wrong
c9c1d674
EG
328 and REASON is not NULL then emit an error message using REASON as part of the
329 context. */
59245841 330
c256ffe7 331static void *
57028622
NC
332get_data (void * var, FILE * file, unsigned long offset, bfd_size_type size,
333 bfd_size_type nmemb, const char * reason)
a6e9f9df 334{
2cf0635d 335 void * mvar;
57028622 336 bfd_size_type amt = size * nmemb;
a6e9f9df 337
c256ffe7 338 if (size == 0 || nmemb == 0)
a6e9f9df
AM
339 return NULL;
340
57028622
NC
341 /* If the size_t type is smaller than the bfd_size_type, eg because
342 you are building a 32-bit tool on a 64-bit host, then make sure
343 that when the sizes are cast to (size_t) no information is lost. */
344 if (sizeof (size_t) < sizeof (bfd_size_type)
345 && ( (bfd_size_type) ((size_t) size) != size
346 || (bfd_size_type) ((size_t) nmemb) != nmemb))
347 {
348 if (reason)
ed754a13
AM
349 error (_("Size truncation prevents reading 0x%" BFD_VMA_FMT "x"
350 " elements of size 0x%" BFD_VMA_FMT "x for %s\n"),
351 nmemb, size, reason);
57028622
NC
352 return NULL;
353 }
354
355 /* Check for size overflow. */
356 if (amt < nmemb)
357 {
358 if (reason)
ed754a13
AM
359 error (_("Size overflow prevents reading 0x%" BFD_VMA_FMT "x"
360 " elements of size 0x%" BFD_VMA_FMT "x for %s\n"),
361 nmemb, size, reason);
57028622
NC
362 return NULL;
363 }
364
c9c1d674
EG
365 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
366 attempting to allocate memory when the read is bound to fail. */
367 if (amt > current_file_size
368 || offset + archive_file_offset + amt > current_file_size)
a6e9f9df 369 {
049b0c3a 370 if (reason)
ed754a13
AM
371 error (_("Reading 0x%" BFD_VMA_FMT "x"
372 " bytes extends past end of file for %s\n"),
373 amt, reason);
a6e9f9df
AM
374 return NULL;
375 }
376
c9c1d674 377 if (fseek (file, archive_file_offset + offset, SEEK_SET))
071436c6
NC
378 {
379 if (reason)
c9c1d674 380 error (_("Unable to seek to 0x%lx for %s\n"),
ed754a13 381 archive_file_offset + offset, reason);
071436c6
NC
382 return NULL;
383 }
384
a6e9f9df
AM
385 mvar = var;
386 if (mvar == NULL)
387 {
c256ffe7 388 /* Check for overflow. */
57028622 389 if (nmemb < (~(bfd_size_type) 0 - 1) / size)
c256ffe7 390 /* + 1 so that we can '\0' terminate invalid string table sections. */
57028622 391 mvar = malloc ((size_t) amt + 1);
a6e9f9df
AM
392
393 if (mvar == NULL)
394 {
049b0c3a 395 if (reason)
ed754a13
AM
396 error (_("Out of memory allocating 0x%" BFD_VMA_FMT "x"
397 " bytes for %s\n"),
398 amt, reason);
a6e9f9df
AM
399 return NULL;
400 }
c256ffe7 401
c9c1d674 402 ((char *) mvar)[amt] = '\0';
a6e9f9df
AM
403 }
404
57028622 405 if (fread (mvar, (size_t) size, (size_t) nmemb, file) != nmemb)
a6e9f9df 406 {
049b0c3a 407 if (reason)
ed754a13
AM
408 error (_("Unable to read in 0x%" BFD_VMA_FMT "x bytes of %s\n"),
409 amt, reason);
a6e9f9df
AM
410 if (mvar != var)
411 free (mvar);
412 return NULL;
413 }
414
415 return mvar;
416}
417
32ec8896
NC
418/* Print a VMA value in the MODE specified.
419 Returns the number of characters displayed. */
cb8f3167 420
32ec8896 421static unsigned int
14a91970 422print_vma (bfd_vma vma, print_mode mode)
66543521 423{
32ec8896 424 unsigned int nc = 0;
66543521 425
14a91970 426 switch (mode)
66543521 427 {
14a91970
AM
428 case FULL_HEX:
429 nc = printf ("0x");
1a0670f3 430 /* Fall through. */
14a91970 431 case LONG_HEX:
f7a99963 432#ifdef BFD64
14a91970 433 if (is_32bit_elf)
437c2fb7 434 return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
f7a99963 435#endif
14a91970
AM
436 printf_vma (vma);
437 return nc + 16;
b19aac67 438
14a91970
AM
439 case DEC_5:
440 if (vma <= 99999)
441 return printf ("%5" BFD_VMA_FMT "d", vma);
1a0670f3 442 /* Fall through. */
14a91970
AM
443 case PREFIX_HEX:
444 nc = printf ("0x");
1a0670f3 445 /* Fall through. */
14a91970
AM
446 case HEX:
447 return nc + printf ("%" BFD_VMA_FMT "x", vma);
b19aac67 448
14a91970
AM
449 case DEC:
450 return printf ("%" BFD_VMA_FMT "d", vma);
b19aac67 451
14a91970
AM
452 case UNSIGNED:
453 return printf ("%" BFD_VMA_FMT "u", vma);
32ec8896
NC
454
455 default:
456 /* FIXME: Report unrecognised mode ? */
457 return 0;
f7a99963 458 }
f7a99963
NC
459}
460
7bfd842d 461/* Display a symbol on stdout. Handles the display of control characters and
3bfcb652 462 multibye characters (assuming the host environment supports them).
31104126 463
7bfd842d
NC
464 Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
465
466 If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
467 padding as necessary.
171191ba
NC
468
469 Returns the number of emitted characters. */
470
471static unsigned int
32ec8896 472print_symbol (signed int width, const char *symbol)
31104126 473{
171191ba 474 bfd_boolean extra_padding = FALSE;
32ec8896 475 signed int num_printed = 0;
3bfcb652 476#ifdef HAVE_MBSTATE_T
7bfd842d 477 mbstate_t state;
3bfcb652 478#endif
32ec8896 479 unsigned int width_remaining;
961c521f 480
7bfd842d 481 if (width < 0)
961c521f 482 {
961c521f
NC
483 /* Keep the width positive. This also helps. */
484 width = - width;
171191ba 485 extra_padding = TRUE;
0b4362b0 486 }
74e1a04b 487 assert (width != 0);
961c521f 488
7bfd842d
NC
489 if (do_wide)
490 /* Set the remaining width to a very large value.
491 This simplifies the code below. */
492 width_remaining = INT_MAX;
493 else
494 width_remaining = width;
cb8f3167 495
3bfcb652 496#ifdef HAVE_MBSTATE_T
7bfd842d
NC
497 /* Initialise the multibyte conversion state. */
498 memset (& state, 0, sizeof (state));
3bfcb652 499#endif
961c521f 500
7bfd842d
NC
501 while (width_remaining)
502 {
503 size_t n;
7bfd842d 504 const char c = *symbol++;
961c521f 505
7bfd842d 506 if (c == 0)
961c521f
NC
507 break;
508
7bfd842d
NC
509 /* Do not print control characters directly as they can affect terminal
510 settings. Such characters usually appear in the names generated
511 by the assembler for local labels. */
512 if (ISCNTRL (c))
961c521f 513 {
7bfd842d 514 if (width_remaining < 2)
961c521f
NC
515 break;
516
7bfd842d
NC
517 printf ("^%c", c + 0x40);
518 width_remaining -= 2;
171191ba 519 num_printed += 2;
961c521f 520 }
7bfd842d
NC
521 else if (ISPRINT (c))
522 {
523 putchar (c);
524 width_remaining --;
525 num_printed ++;
526 }
961c521f
NC
527 else
528 {
3bfcb652
NC
529#ifdef HAVE_MBSTATE_T
530 wchar_t w;
531#endif
7bfd842d
NC
532 /* Let printf do the hard work of displaying multibyte characters. */
533 printf ("%.1s", symbol - 1);
534 width_remaining --;
535 num_printed ++;
536
3bfcb652 537#ifdef HAVE_MBSTATE_T
7bfd842d
NC
538 /* Try to find out how many bytes made up the character that was
539 just printed. Advance the symbol pointer past the bytes that
540 were displayed. */
541 n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
3bfcb652
NC
542#else
543 n = 1;
544#endif
7bfd842d
NC
545 if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
546 symbol += (n - 1);
961c521f 547 }
961c521f 548 }
171191ba 549
7bfd842d 550 if (extra_padding && num_printed < width)
171191ba
NC
551 {
552 /* Fill in the remaining spaces. */
7bfd842d
NC
553 printf ("%-*s", width - num_printed, " ");
554 num_printed = width;
171191ba
NC
555 }
556
557 return num_printed;
31104126
NC
558}
559
1449284b 560/* Returns a pointer to a static buffer containing a printable version of
74e1a04b
NC
561 the given section's name. Like print_symbol, except that it does not try
562 to print multibyte characters, it just interprets them as hex values. */
563
564static const char *
0d2a7a93 565printable_section_name (const Elf_Internal_Shdr * sec)
74e1a04b
NC
566{
567#define MAX_PRINT_SEC_NAME_LEN 128
568 static char sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
569 const char * name = SECTION_NAME (sec);
570 char * buf = sec_name_buf;
571 char c;
572 unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
573
574 while ((c = * name ++) != 0)
575 {
576 if (ISCNTRL (c))
577 {
578 if (remaining < 2)
579 break;
948f632f 580
74e1a04b
NC
581 * buf ++ = '^';
582 * buf ++ = c + 0x40;
583 remaining -= 2;
584 }
585 else if (ISPRINT (c))
586 {
587 * buf ++ = c;
588 remaining -= 1;
589 }
590 else
591 {
592 static char hex[17] = "0123456789ABCDEF";
593
594 if (remaining < 4)
595 break;
596 * buf ++ = '<';
597 * buf ++ = hex[(c & 0xf0) >> 4];
598 * buf ++ = hex[c & 0x0f];
599 * buf ++ = '>';
600 remaining -= 4;
601 }
602
603 if (remaining == 0)
604 break;
605 }
606
607 * buf = 0;
608 return sec_name_buf;
609}
610
611static const char *
612printable_section_name_from_index (unsigned long ndx)
613{
614 if (ndx >= elf_header.e_shnum)
615 return _("<corrupt>");
616
617 return printable_section_name (section_headers + ndx);
618}
619
89fac5e3
RS
620/* Return a pointer to section NAME, or NULL if no such section exists. */
621
622static Elf_Internal_Shdr *
2cf0635d 623find_section (const char * name)
89fac5e3
RS
624{
625 unsigned int i;
626
627 for (i = 0; i < elf_header.e_shnum; i++)
628 if (streq (SECTION_NAME (section_headers + i), name))
629 return section_headers + i;
630
631 return NULL;
632}
633
0b6ae522
DJ
634/* Return a pointer to a section containing ADDR, or NULL if no such
635 section exists. */
636
637static Elf_Internal_Shdr *
638find_section_by_address (bfd_vma addr)
639{
640 unsigned int i;
641
642 for (i = 0; i < elf_header.e_shnum; i++)
643 {
644 Elf_Internal_Shdr *sec = section_headers + i;
645 if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
646 return sec;
647 }
648
649 return NULL;
650}
651
071436c6
NC
652static Elf_Internal_Shdr *
653find_section_by_type (unsigned int type)
654{
655 unsigned int i;
656
657 for (i = 0; i < elf_header.e_shnum; i++)
658 {
659 Elf_Internal_Shdr *sec = section_headers + i;
660 if (sec->sh_type == type)
661 return sec;
662 }
663
664 return NULL;
665}
666
657d0d47
CC
667/* Return a pointer to section NAME, or NULL if no such section exists,
668 restricted to the list of sections given in SET. */
669
670static Elf_Internal_Shdr *
671find_section_in_set (const char * name, unsigned int * set)
672{
673 unsigned int i;
674
675 if (set != NULL)
676 {
677 while ((i = *set++) > 0)
b814a36d
NC
678 {
679 /* See PR 21156 for a reproducer. */
680 if (i >= elf_header.e_shnum)
681 continue; /* FIXME: Should we issue an error message ? */
682
683 if (streq (SECTION_NAME (section_headers + i), name))
684 return section_headers + i;
685 }
657d0d47
CC
686 }
687
688 return find_section (name);
689}
690
32ec8896
NC
691/* Read an unsigned LEB128 encoded value from DATA.
692 Set *LENGTH_RETURN to the number of bytes read. */
0b6ae522 693
f6f0e17b 694static inline unsigned long
32ec8896
NC
695read_uleb128 (unsigned char * data,
696 unsigned int * length_return,
f6f0e17b 697 const unsigned char * const end)
0b6ae522 698{
f6f0e17b 699 return read_leb128 (data, length_return, FALSE, end);
0b6ae522
DJ
700}
701
32ec8896 702/* Return TRUE if the current file is for IA-64 machine and OpenVMS ABI.
28f997cf
TG
703 This OS has so many departures from the ELF standard that we test it at
704 many places. */
705
32ec8896 706static inline bfd_boolean
28f997cf
TG
707is_ia64_vms (void)
708{
709 return elf_header.e_machine == EM_IA_64
710 && elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
711}
712
bcedfee6 713/* Guess the relocation size commonly used by the specific machines. */
252b5132 714
32ec8896 715static bfd_boolean
2dc4cec1 716guess_is_rela (unsigned int e_machine)
252b5132 717{
9c19a809 718 switch (e_machine)
252b5132
RH
719 {
720 /* Targets that use REL relocations. */
252b5132 721 case EM_386:
22abe556 722 case EM_IAMCU:
63fcb9e9 723 case EM_960:
e9f53129 724 case EM_ARM:
2b0337b0 725 case EM_D10V:
252b5132 726 case EM_CYGNUS_D10V:
e9f53129 727 case EM_DLX:
252b5132 728 case EM_MIPS:
4fe85591 729 case EM_MIPS_RS3_LE:
e9f53129 730 case EM_CYGNUS_M32R:
1c0d3aa6 731 case EM_SCORE:
f6c1a2d5 732 case EM_XGATE:
9c19a809 733 return FALSE;
103f02d3 734
252b5132
RH
735 /* Targets that use RELA relocations. */
736 case EM_68K:
e9f53129 737 case EM_860:
a06ea964 738 case EM_AARCH64:
cfb8c092 739 case EM_ADAPTEVA_EPIPHANY:
e9f53129
AM
740 case EM_ALPHA:
741 case EM_ALTERA_NIOS2:
886a2506
NC
742 case EM_ARC:
743 case EM_ARC_COMPACT:
744 case EM_ARC_COMPACT2:
e9f53129
AM
745 case EM_AVR:
746 case EM_AVR_OLD:
747 case EM_BLACKFIN:
60bca95a 748 case EM_CR16:
e9f53129
AM
749 case EM_CRIS:
750 case EM_CRX:
2b0337b0 751 case EM_D30V:
252b5132 752 case EM_CYGNUS_D30V:
2b0337b0 753 case EM_FR30:
3f8107ab 754 case EM_FT32:
252b5132 755 case EM_CYGNUS_FR30:
5c70f934 756 case EM_CYGNUS_FRV:
e9f53129
AM
757 case EM_H8S:
758 case EM_H8_300:
759 case EM_H8_300H:
800eeca4 760 case EM_IA_64:
1e4cf259
NC
761 case EM_IP2K:
762 case EM_IP2K_OLD:
3b36097d 763 case EM_IQ2000:
84e94c90 764 case EM_LATTICEMICO32:
ff7eeb89 765 case EM_M32C_OLD:
49f58d10 766 case EM_M32C:
e9f53129
AM
767 case EM_M32R:
768 case EM_MCORE:
15ab5209 769 case EM_CYGNUS_MEP:
a3c62988 770 case EM_METAG:
e9f53129
AM
771 case EM_MMIX:
772 case EM_MN10200:
773 case EM_CYGNUS_MN10200:
774 case EM_MN10300:
775 case EM_CYGNUS_MN10300:
5506d11a 776 case EM_MOXIE:
e9f53129
AM
777 case EM_MSP430:
778 case EM_MSP430_OLD:
d031aafb 779 case EM_MT:
35c08157 780 case EM_NDS32:
64fd6348 781 case EM_NIOS32:
73589c9d 782 case EM_OR1K:
e9f53129
AM
783 case EM_PPC64:
784 case EM_PPC:
2b100bb5 785 case EM_TI_PRU:
e23eba97 786 case EM_RISCV:
99c513f6 787 case EM_RL78:
c7927a3c 788 case EM_RX:
e9f53129
AM
789 case EM_S390:
790 case EM_S390_OLD:
791 case EM_SH:
792 case EM_SPARC:
793 case EM_SPARC32PLUS:
794 case EM_SPARCV9:
795 case EM_SPU:
40b36596 796 case EM_TI_C6000:
aa137e4d
NC
797 case EM_TILEGX:
798 case EM_TILEPRO:
708e2187 799 case EM_V800:
e9f53129
AM
800 case EM_V850:
801 case EM_CYGNUS_V850:
802 case EM_VAX:
619ed720 803 case EM_VISIUM:
e9f53129 804 case EM_X86_64:
8a9036a4 805 case EM_L1OM:
7a9068fe 806 case EM_K1OM:
e9f53129
AM
807 case EM_XSTORMY16:
808 case EM_XTENSA:
809 case EM_XTENSA_OLD:
7ba29e2a
NC
810 case EM_MICROBLAZE:
811 case EM_MICROBLAZE_OLD:
9c19a809 812 return TRUE;
103f02d3 813
e9f53129
AM
814 case EM_68HC05:
815 case EM_68HC08:
816 case EM_68HC11:
817 case EM_68HC16:
818 case EM_FX66:
819 case EM_ME16:
d1133906 820 case EM_MMA:
d1133906
NC
821 case EM_NCPU:
822 case EM_NDR1:
e9f53129 823 case EM_PCP:
d1133906 824 case EM_ST100:
e9f53129 825 case EM_ST19:
d1133906 826 case EM_ST7:
e9f53129
AM
827 case EM_ST9PLUS:
828 case EM_STARCORE:
d1133906 829 case EM_SVX:
e9f53129 830 case EM_TINYJ:
9c19a809
NC
831 default:
832 warn (_("Don't know about relocations on this machine architecture\n"));
833 return FALSE;
834 }
835}
252b5132 836
32ec8896
NC
837/* Load RELA type relocations from FILE at REL_OFFSET extending for REL_SIZE bytes.
838 Returns TRUE upon success, FALSE otherwise. If successful then a
839 pointer to a malloc'ed buffer containing the relocs is placed in *RELASP,
840 and the number of relocs loaded is placed in *NRELASP. It is the caller's
841 responsibility to free the allocated buffer. */
842
843static bfd_boolean
2cf0635d 844slurp_rela_relocs (FILE * file,
d3ba0551
AM
845 unsigned long rel_offset,
846 unsigned long rel_size,
2cf0635d
NC
847 Elf_Internal_Rela ** relasp,
848 unsigned long * nrelasp)
9c19a809 849{
2cf0635d 850 Elf_Internal_Rela * relas;
8b73c356 851 size_t nrelas;
4d6ed7c8 852 unsigned int i;
252b5132 853
4d6ed7c8
NC
854 if (is_32bit_elf)
855 {
2cf0635d 856 Elf32_External_Rela * erelas;
103f02d3 857
3f5e193b 858 erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset, 1,
9cf03b7e 859 rel_size, _("32-bit relocation data"));
a6e9f9df 860 if (!erelas)
32ec8896 861 return FALSE;
252b5132 862
4d6ed7c8 863 nrelas = rel_size / sizeof (Elf32_External_Rela);
103f02d3 864
3f5e193b
NC
865 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
866 sizeof (Elf_Internal_Rela));
103f02d3 867
4d6ed7c8
NC
868 if (relas == NULL)
869 {
c256ffe7 870 free (erelas);
591a748a 871 error (_("out of memory parsing relocs\n"));
32ec8896 872 return FALSE;
4d6ed7c8 873 }
103f02d3 874
4d6ed7c8
NC
875 for (i = 0; i < nrelas; i++)
876 {
877 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
878 relas[i].r_info = BYTE_GET (erelas[i].r_info);
598aaa76 879 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
4d6ed7c8 880 }
103f02d3 881
4d6ed7c8
NC
882 free (erelas);
883 }
884 else
885 {
2cf0635d 886 Elf64_External_Rela * erelas;
103f02d3 887
3f5e193b 888 erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset, 1,
9cf03b7e 889 rel_size, _("64-bit relocation data"));
a6e9f9df 890 if (!erelas)
32ec8896 891 return FALSE;
4d6ed7c8
NC
892
893 nrelas = rel_size / sizeof (Elf64_External_Rela);
103f02d3 894
3f5e193b
NC
895 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
896 sizeof (Elf_Internal_Rela));
103f02d3 897
4d6ed7c8
NC
898 if (relas == NULL)
899 {
c256ffe7 900 free (erelas);
591a748a 901 error (_("out of memory parsing relocs\n"));
32ec8896 902 return FALSE;
9c19a809 903 }
4d6ed7c8
NC
904
905 for (i = 0; i < nrelas; i++)
9c19a809 906 {
66543521
AM
907 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
908 relas[i].r_info = BYTE_GET (erelas[i].r_info);
598aaa76 909 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
861fb55a
DJ
910
911 /* The #ifdef BFD64 below is to prevent a compile time
912 warning. We know that if we do not have a 64 bit data
913 type that we will never execute this code anyway. */
914#ifdef BFD64
915 if (elf_header.e_machine == EM_MIPS
916 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
917 {
918 /* In little-endian objects, r_info isn't really a
919 64-bit little-endian value: it has a 32-bit
920 little-endian symbol index followed by four
921 individual byte fields. Reorder INFO
922 accordingly. */
91d6fa6a
NC
923 bfd_vma inf = relas[i].r_info;
924 inf = (((inf & 0xffffffff) << 32)
925 | ((inf >> 56) & 0xff)
926 | ((inf >> 40) & 0xff00)
927 | ((inf >> 24) & 0xff0000)
928 | ((inf >> 8) & 0xff000000));
929 relas[i].r_info = inf;
861fb55a
DJ
930 }
931#endif /* BFD64 */
4d6ed7c8 932 }
103f02d3 933
4d6ed7c8
NC
934 free (erelas);
935 }
32ec8896 936
4d6ed7c8
NC
937 *relasp = relas;
938 *nrelasp = nrelas;
32ec8896 939 return TRUE;
4d6ed7c8 940}
103f02d3 941
32ec8896
NC
942/* Load REL type relocations from FILE at REL_OFFSET extending for REL_SIZE bytes.
943 Returns TRUE upon success, FALSE otherwise. If successful then a
944 pointer to a malloc'ed buffer containing the relocs is placed in *RELSP,
945 and the number of relocs loaded is placed in *NRELSP. It is the caller's
946 responsibility to free the allocated buffer. */
947
948static bfd_boolean
2cf0635d 949slurp_rel_relocs (FILE * file,
d3ba0551
AM
950 unsigned long rel_offset,
951 unsigned long rel_size,
2cf0635d
NC
952 Elf_Internal_Rela ** relsp,
953 unsigned long * nrelsp)
4d6ed7c8 954{
2cf0635d 955 Elf_Internal_Rela * rels;
8b73c356 956 size_t nrels;
4d6ed7c8 957 unsigned int i;
103f02d3 958
4d6ed7c8
NC
959 if (is_32bit_elf)
960 {
2cf0635d 961 Elf32_External_Rel * erels;
103f02d3 962
3f5e193b 963 erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset, 1,
9cf03b7e 964 rel_size, _("32-bit relocation data"));
a6e9f9df 965 if (!erels)
32ec8896 966 return FALSE;
103f02d3 967
4d6ed7c8 968 nrels = rel_size / sizeof (Elf32_External_Rel);
103f02d3 969
3f5e193b 970 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
103f02d3 971
4d6ed7c8
NC
972 if (rels == NULL)
973 {
c256ffe7 974 free (erels);
591a748a 975 error (_("out of memory parsing relocs\n"));
32ec8896 976 return FALSE;
4d6ed7c8
NC
977 }
978
979 for (i = 0; i < nrels; i++)
980 {
981 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
982 rels[i].r_info = BYTE_GET (erels[i].r_info);
c8286bd1 983 rels[i].r_addend = 0;
9ea033b2 984 }
4d6ed7c8
NC
985
986 free (erels);
9c19a809
NC
987 }
988 else
989 {
2cf0635d 990 Elf64_External_Rel * erels;
9ea033b2 991
3f5e193b 992 erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset, 1,
9cf03b7e 993 rel_size, _("64-bit relocation data"));
a6e9f9df 994 if (!erels)
32ec8896 995 return FALSE;
103f02d3 996
4d6ed7c8 997 nrels = rel_size / sizeof (Elf64_External_Rel);
103f02d3 998
3f5e193b 999 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
103f02d3 1000
4d6ed7c8 1001 if (rels == NULL)
9c19a809 1002 {
c256ffe7 1003 free (erels);
591a748a 1004 error (_("out of memory parsing relocs\n"));
32ec8896 1005 return FALSE;
4d6ed7c8 1006 }
103f02d3 1007
4d6ed7c8
NC
1008 for (i = 0; i < nrels; i++)
1009 {
66543521
AM
1010 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
1011 rels[i].r_info = BYTE_GET (erels[i].r_info);
c8286bd1 1012 rels[i].r_addend = 0;
861fb55a
DJ
1013
1014 /* The #ifdef BFD64 below is to prevent a compile time
1015 warning. We know that if we do not have a 64 bit data
1016 type that we will never execute this code anyway. */
1017#ifdef BFD64
1018 if (elf_header.e_machine == EM_MIPS
1019 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
1020 {
1021 /* In little-endian objects, r_info isn't really a
1022 64-bit little-endian value: it has a 32-bit
1023 little-endian symbol index followed by four
1024 individual byte fields. Reorder INFO
1025 accordingly. */
91d6fa6a
NC
1026 bfd_vma inf = rels[i].r_info;
1027 inf = (((inf & 0xffffffff) << 32)
1028 | ((inf >> 56) & 0xff)
1029 | ((inf >> 40) & 0xff00)
1030 | ((inf >> 24) & 0xff0000)
1031 | ((inf >> 8) & 0xff000000));
1032 rels[i].r_info = inf;
861fb55a
DJ
1033 }
1034#endif /* BFD64 */
4d6ed7c8 1035 }
103f02d3 1036
4d6ed7c8
NC
1037 free (erels);
1038 }
32ec8896 1039
4d6ed7c8
NC
1040 *relsp = rels;
1041 *nrelsp = nrels;
32ec8896 1042 return TRUE;
4d6ed7c8 1043}
103f02d3 1044
aca88567
NC
1045/* Returns the reloc type extracted from the reloc info field. */
1046
1047static unsigned int
1048get_reloc_type (bfd_vma reloc_info)
1049{
1050 if (is_32bit_elf)
1051 return ELF32_R_TYPE (reloc_info);
1052
1053 switch (elf_header.e_machine)
1054 {
1055 case EM_MIPS:
1056 /* Note: We assume that reloc_info has already been adjusted for us. */
1057 return ELF64_MIPS_R_TYPE (reloc_info);
1058
1059 case EM_SPARCV9:
1060 return ELF64_R_TYPE_ID (reloc_info);
1061
1062 default:
1063 return ELF64_R_TYPE (reloc_info);
1064 }
1065}
1066
1067/* Return the symbol index extracted from the reloc info field. */
1068
1069static bfd_vma
1070get_reloc_symindex (bfd_vma reloc_info)
1071{
1072 return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
1073}
1074
13761a11
NC
1075static inline bfd_boolean
1076uses_msp430x_relocs (void)
1077{
1078 return
1079 elf_header.e_machine == EM_MSP430 /* Paranoia. */
1080 /* GCC uses osabi == ELFOSBI_STANDALONE. */
1081 && (((elf_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
1082 /* TI compiler uses ELFOSABI_NONE. */
1083 || (elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
1084}
1085
d3ba0551
AM
1086/* Display the contents of the relocation data found at the specified
1087 offset. */
ee42cf8c 1088
32ec8896 1089static bfd_boolean
2cf0635d 1090dump_relocations (FILE * file,
d3ba0551
AM
1091 unsigned long rel_offset,
1092 unsigned long rel_size,
2cf0635d 1093 Elf_Internal_Sym * symtab,
d3ba0551 1094 unsigned long nsyms,
2cf0635d 1095 char * strtab,
d79b3d50 1096 unsigned long strtablen,
bb4d2ac2 1097 int is_rela,
32ec8896 1098 bfd_boolean is_dynsym)
4d6ed7c8 1099{
32ec8896 1100 unsigned long i;
2cf0635d 1101 Elf_Internal_Rela * rels;
32ec8896 1102 bfd_boolean res = TRUE;
103f02d3 1103
4d6ed7c8
NC
1104 if (is_rela == UNKNOWN)
1105 is_rela = guess_is_rela (elf_header.e_machine);
103f02d3 1106
4d6ed7c8
NC
1107 if (is_rela)
1108 {
c8286bd1 1109 if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
32ec8896 1110 return FALSE;
4d6ed7c8
NC
1111 }
1112 else
1113 {
1114 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
32ec8896 1115 return FALSE;
252b5132
RH
1116 }
1117
410f7a12
L
1118 if (is_32bit_elf)
1119 {
1120 if (is_rela)
2c71103e
NC
1121 {
1122 if (do_wide)
1123 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
1124 else
1125 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
1126 }
410f7a12 1127 else
2c71103e
NC
1128 {
1129 if (do_wide)
1130 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
1131 else
1132 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
1133 }
410f7a12 1134 }
252b5132 1135 else
410f7a12
L
1136 {
1137 if (is_rela)
2c71103e
NC
1138 {
1139 if (do_wide)
8beeaeb7 1140 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
2c71103e
NC
1141 else
1142 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
1143 }
410f7a12 1144 else
2c71103e
NC
1145 {
1146 if (do_wide)
8beeaeb7 1147 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
2c71103e
NC
1148 else
1149 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
1150 }
410f7a12 1151 }
252b5132
RH
1152
1153 for (i = 0; i < rel_size; i++)
1154 {
2cf0635d 1155 const char * rtype;
b34976b6 1156 bfd_vma offset;
91d6fa6a 1157 bfd_vma inf;
b34976b6
AM
1158 bfd_vma symtab_index;
1159 bfd_vma type;
103f02d3 1160
b34976b6 1161 offset = rels[i].r_offset;
91d6fa6a 1162 inf = rels[i].r_info;
103f02d3 1163
91d6fa6a
NC
1164 type = get_reloc_type (inf);
1165 symtab_index = get_reloc_symindex (inf);
252b5132 1166
410f7a12
L
1167 if (is_32bit_elf)
1168 {
39dbeff8
AM
1169 printf ("%8.8lx %8.8lx ",
1170 (unsigned long) offset & 0xffffffff,
91d6fa6a 1171 (unsigned long) inf & 0xffffffff);
410f7a12
L
1172 }
1173 else
1174 {
39dbeff8
AM
1175#if BFD_HOST_64BIT_LONG
1176 printf (do_wide
1177 ? "%16.16lx %16.16lx "
1178 : "%12.12lx %12.12lx ",
91d6fa6a 1179 offset, inf);
39dbeff8 1180#elif BFD_HOST_64BIT_LONG_LONG
6e3d6dc1 1181#ifndef __MSVCRT__
39dbeff8
AM
1182 printf (do_wide
1183 ? "%16.16llx %16.16llx "
1184 : "%12.12llx %12.12llx ",
91d6fa6a 1185 offset, inf);
6e3d6dc1
NC
1186#else
1187 printf (do_wide
1188 ? "%16.16I64x %16.16I64x "
1189 : "%12.12I64x %12.12I64x ",
91d6fa6a 1190 offset, inf);
6e3d6dc1 1191#endif
39dbeff8 1192#else
2c71103e
NC
1193 printf (do_wide
1194 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1195 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
410f7a12
L
1196 _bfd_int64_high (offset),
1197 _bfd_int64_low (offset),
91d6fa6a
NC
1198 _bfd_int64_high (inf),
1199 _bfd_int64_low (inf));
9ea033b2 1200#endif
410f7a12 1201 }
103f02d3 1202
252b5132
RH
1203 switch (elf_header.e_machine)
1204 {
1205 default:
1206 rtype = NULL;
1207 break;
1208
a06ea964
NC
1209 case EM_AARCH64:
1210 rtype = elf_aarch64_reloc_type (type);
1211 break;
1212
2b0337b0 1213 case EM_M32R:
252b5132 1214 case EM_CYGNUS_M32R:
9ea033b2 1215 rtype = elf_m32r_reloc_type (type);
252b5132
RH
1216 break;
1217
1218 case EM_386:
22abe556 1219 case EM_IAMCU:
9ea033b2 1220 rtype = elf_i386_reloc_type (type);
252b5132
RH
1221 break;
1222
ba2685cc
AM
1223 case EM_68HC11:
1224 case EM_68HC12:
1225 rtype = elf_m68hc11_reloc_type (type);
1226 break;
75751cd9 1227
252b5132 1228 case EM_68K:
9ea033b2 1229 rtype = elf_m68k_reloc_type (type);
252b5132
RH
1230 break;
1231
63fcb9e9 1232 case EM_960:
9ea033b2 1233 rtype = elf_i960_reloc_type (type);
63fcb9e9
ILT
1234 break;
1235
adde6300 1236 case EM_AVR:
2b0337b0 1237 case EM_AVR_OLD:
adde6300
AM
1238 rtype = elf_avr_reloc_type (type);
1239 break;
1240
9ea033b2
NC
1241 case EM_OLD_SPARCV9:
1242 case EM_SPARC32PLUS:
1243 case EM_SPARCV9:
252b5132 1244 case EM_SPARC:
9ea033b2 1245 rtype = elf_sparc_reloc_type (type);
252b5132
RH
1246 break;
1247
e9f53129
AM
1248 case EM_SPU:
1249 rtype = elf_spu_reloc_type (type);
1250 break;
1251
708e2187
NC
1252 case EM_V800:
1253 rtype = v800_reloc_type (type);
1254 break;
2b0337b0 1255 case EM_V850:
252b5132 1256 case EM_CYGNUS_V850:
9ea033b2 1257 rtype = v850_reloc_type (type);
252b5132
RH
1258 break;
1259
2b0337b0 1260 case EM_D10V:
252b5132 1261 case EM_CYGNUS_D10V:
9ea033b2 1262 rtype = elf_d10v_reloc_type (type);
252b5132
RH
1263 break;
1264
2b0337b0 1265 case EM_D30V:
252b5132 1266 case EM_CYGNUS_D30V:
9ea033b2 1267 rtype = elf_d30v_reloc_type (type);
252b5132
RH
1268 break;
1269
d172d4ba
NC
1270 case EM_DLX:
1271 rtype = elf_dlx_reloc_type (type);
1272 break;
1273
252b5132 1274 case EM_SH:
9ea033b2 1275 rtype = elf_sh_reloc_type (type);
252b5132
RH
1276 break;
1277
2b0337b0 1278 case EM_MN10300:
252b5132 1279 case EM_CYGNUS_MN10300:
9ea033b2 1280 rtype = elf_mn10300_reloc_type (type);
252b5132
RH
1281 break;
1282
2b0337b0 1283 case EM_MN10200:
252b5132 1284 case EM_CYGNUS_MN10200:
9ea033b2 1285 rtype = elf_mn10200_reloc_type (type);
252b5132
RH
1286 break;
1287
2b0337b0 1288 case EM_FR30:
252b5132 1289 case EM_CYGNUS_FR30:
9ea033b2 1290 rtype = elf_fr30_reloc_type (type);
252b5132
RH
1291 break;
1292
ba2685cc
AM
1293 case EM_CYGNUS_FRV:
1294 rtype = elf_frv_reloc_type (type);
1295 break;
5c70f934 1296
3f8107ab
AM
1297 case EM_FT32:
1298 rtype = elf_ft32_reloc_type (type);
1299 break;
1300
252b5132 1301 case EM_MCORE:
9ea033b2 1302 rtype = elf_mcore_reloc_type (type);
252b5132
RH
1303 break;
1304
3c3bdf30
NC
1305 case EM_MMIX:
1306 rtype = elf_mmix_reloc_type (type);
1307 break;
1308
5506d11a
AM
1309 case EM_MOXIE:
1310 rtype = elf_moxie_reloc_type (type);
1311 break;
1312
2469cfa2 1313 case EM_MSP430:
13761a11
NC
1314 if (uses_msp430x_relocs ())
1315 {
1316 rtype = elf_msp430x_reloc_type (type);
1317 break;
1318 }
1a0670f3 1319 /* Fall through. */
2469cfa2
NC
1320 case EM_MSP430_OLD:
1321 rtype = elf_msp430_reloc_type (type);
1322 break;
1323
35c08157
KLC
1324 case EM_NDS32:
1325 rtype = elf_nds32_reloc_type (type);
1326 break;
1327
252b5132 1328 case EM_PPC:
9ea033b2 1329 rtype = elf_ppc_reloc_type (type);
252b5132
RH
1330 break;
1331
c833c019
AM
1332 case EM_PPC64:
1333 rtype = elf_ppc64_reloc_type (type);
1334 break;
1335
252b5132 1336 case EM_MIPS:
4fe85591 1337 case EM_MIPS_RS3_LE:
9ea033b2 1338 rtype = elf_mips_reloc_type (type);
252b5132
RH
1339 break;
1340
e23eba97
NC
1341 case EM_RISCV:
1342 rtype = elf_riscv_reloc_type (type);
1343 break;
1344
252b5132 1345 case EM_ALPHA:
9ea033b2 1346 rtype = elf_alpha_reloc_type (type);
252b5132
RH
1347 break;
1348
1349 case EM_ARM:
9ea033b2 1350 rtype = elf_arm_reloc_type (type);
252b5132
RH
1351 break;
1352
584da044 1353 case EM_ARC:
886a2506
NC
1354 case EM_ARC_COMPACT:
1355 case EM_ARC_COMPACT2:
9ea033b2 1356 rtype = elf_arc_reloc_type (type);
252b5132
RH
1357 break;
1358
1359 case EM_PARISC:
69e617ca 1360 rtype = elf_hppa_reloc_type (type);
252b5132 1361 break;
7d466069 1362
b8720f9d
JL
1363 case EM_H8_300:
1364 case EM_H8_300H:
1365 case EM_H8S:
1366 rtype = elf_h8_reloc_type (type);
1367 break;
1368
73589c9d
CS
1369 case EM_OR1K:
1370 rtype = elf_or1k_reloc_type (type);
3b16e843
NC
1371 break;
1372
7d466069 1373 case EM_PJ:
2b0337b0 1374 case EM_PJ_OLD:
7d466069
ILT
1375 rtype = elf_pj_reloc_type (type);
1376 break;
800eeca4
JW
1377 case EM_IA_64:
1378 rtype = elf_ia64_reloc_type (type);
1379 break;
1b61cf92
HPN
1380
1381 case EM_CRIS:
1382 rtype = elf_cris_reloc_type (type);
1383 break;
535c37ff
JE
1384
1385 case EM_860:
1386 rtype = elf_i860_reloc_type (type);
1387 break;
bcedfee6
NC
1388
1389 case EM_X86_64:
8a9036a4 1390 case EM_L1OM:
7a9068fe 1391 case EM_K1OM:
bcedfee6
NC
1392 rtype = elf_x86_64_reloc_type (type);
1393 break;
a85d7ed0 1394
35b1837e
AM
1395 case EM_S370:
1396 rtype = i370_reloc_type (type);
1397 break;
1398
53c7db4b
KH
1399 case EM_S390_OLD:
1400 case EM_S390:
1401 rtype = elf_s390_reloc_type (type);
1402 break;
93fbbb04 1403
1c0d3aa6
NC
1404 case EM_SCORE:
1405 rtype = elf_score_reloc_type (type);
1406 break;
1407
93fbbb04
GK
1408 case EM_XSTORMY16:
1409 rtype = elf_xstormy16_reloc_type (type);
1410 break;
179d3252 1411
1fe1f39c
NC
1412 case EM_CRX:
1413 rtype = elf_crx_reloc_type (type);
1414 break;
1415
179d3252
JT
1416 case EM_VAX:
1417 rtype = elf_vax_reloc_type (type);
1418 break;
1e4cf259 1419
619ed720
EB
1420 case EM_VISIUM:
1421 rtype = elf_visium_reloc_type (type);
1422 break;
1423
cfb8c092
NC
1424 case EM_ADAPTEVA_EPIPHANY:
1425 rtype = elf_epiphany_reloc_type (type);
1426 break;
1427
1e4cf259
NC
1428 case EM_IP2K:
1429 case EM_IP2K_OLD:
1430 rtype = elf_ip2k_reloc_type (type);
1431 break;
3b36097d
SC
1432
1433 case EM_IQ2000:
1434 rtype = elf_iq2000_reloc_type (type);
1435 break;
88da6820
NC
1436
1437 case EM_XTENSA_OLD:
1438 case EM_XTENSA:
1439 rtype = elf_xtensa_reloc_type (type);
1440 break;
a34e3ecb 1441
84e94c90
NC
1442 case EM_LATTICEMICO32:
1443 rtype = elf_lm32_reloc_type (type);
1444 break;
1445
ff7eeb89 1446 case EM_M32C_OLD:
49f58d10
JB
1447 case EM_M32C:
1448 rtype = elf_m32c_reloc_type (type);
1449 break;
1450
d031aafb
NS
1451 case EM_MT:
1452 rtype = elf_mt_reloc_type (type);
a34e3ecb 1453 break;
1d65ded4
CM
1454
1455 case EM_BLACKFIN:
1456 rtype = elf_bfin_reloc_type (type);
1457 break;
15ab5209
DB
1458
1459 case EM_CYGNUS_MEP:
1460 rtype = elf_mep_reloc_type (type);
1461 break;
60bca95a
NC
1462
1463 case EM_CR16:
1464 rtype = elf_cr16_reloc_type (type);
1465 break;
dd24e3da 1466
7ba29e2a
NC
1467 case EM_MICROBLAZE:
1468 case EM_MICROBLAZE_OLD:
1469 rtype = elf_microblaze_reloc_type (type);
1470 break;
c7927a3c 1471
99c513f6
DD
1472 case EM_RL78:
1473 rtype = elf_rl78_reloc_type (type);
1474 break;
1475
c7927a3c
NC
1476 case EM_RX:
1477 rtype = elf_rx_reloc_type (type);
1478 break;
c29aca4a 1479
a3c62988
NC
1480 case EM_METAG:
1481 rtype = elf_metag_reloc_type (type);
1482 break;
1483
c29aca4a
NC
1484 case EM_XC16X:
1485 case EM_C166:
1486 rtype = elf_xc16x_reloc_type (type);
1487 break;
40b36596
JM
1488
1489 case EM_TI_C6000:
1490 rtype = elf_tic6x_reloc_type (type);
1491 break;
aa137e4d
NC
1492
1493 case EM_TILEGX:
1494 rtype = elf_tilegx_reloc_type (type);
1495 break;
1496
1497 case EM_TILEPRO:
1498 rtype = elf_tilepro_reloc_type (type);
1499 break;
f6c1a2d5
NC
1500
1501 case EM_XGATE:
1502 rtype = elf_xgate_reloc_type (type);
1503 break;
36591ba1
SL
1504
1505 case EM_ALTERA_NIOS2:
1506 rtype = elf_nios2_reloc_type (type);
1507 break;
2b100bb5
DD
1508
1509 case EM_TI_PRU:
1510 rtype = elf_pru_reloc_type (type);
1511 break;
252b5132
RH
1512 }
1513
1514 if (rtype == NULL)
39dbeff8 1515 printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
252b5132 1516 else
8beeaeb7 1517 printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
252b5132 1518
7ace3541 1519 if (elf_header.e_machine == EM_ALPHA
157c2599 1520 && rtype != NULL
7ace3541
RH
1521 && streq (rtype, "R_ALPHA_LITUSE")
1522 && is_rela)
1523 {
1524 switch (rels[i].r_addend)
1525 {
1526 case LITUSE_ALPHA_ADDR: rtype = "ADDR"; break;
1527 case LITUSE_ALPHA_BASE: rtype = "BASE"; break;
1528 case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1529 case LITUSE_ALPHA_JSR: rtype = "JSR"; break;
1530 case LITUSE_ALPHA_TLSGD: rtype = "TLSGD"; break;
1531 case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1532 case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1533 default: rtype = NULL;
1534 }
32ec8896 1535
7ace3541
RH
1536 if (rtype)
1537 printf (" (%s)", rtype);
1538 else
1539 {
1540 putchar (' ');
1541 printf (_("<unknown addend: %lx>"),
1542 (unsigned long) rels[i].r_addend);
32ec8896 1543 res = FALSE;
7ace3541
RH
1544 }
1545 }
1546 else if (symtab_index)
252b5132 1547 {
af3fc3bc 1548 if (symtab == NULL || symtab_index >= nsyms)
32ec8896
NC
1549 {
1550 error (_(" bad symbol index: %08lx in reloc"), (unsigned long) symtab_index);
1551 res = FALSE;
1552 }
af3fc3bc 1553 else
19936277 1554 {
2cf0635d 1555 Elf_Internal_Sym * psym;
bb4d2ac2
L
1556 const char * version_string;
1557 enum versioned_symbol_info sym_info;
1558 unsigned short vna_other;
19936277 1559
af3fc3bc 1560 psym = symtab + symtab_index;
103f02d3 1561
bb4d2ac2
L
1562 version_string
1563 = get_symbol_version_string (file, is_dynsym,
1564 strtab, strtablen,
1565 symtab_index,
1566 psym,
1567 &sym_info,
1568 &vna_other);
1569
af3fc3bc 1570 printf (" ");
171191ba 1571
d8045f23
NC
1572 if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1573 {
1574 const char * name;
1575 unsigned int len;
1576 unsigned int width = is_32bit_elf ? 8 : 14;
1577
1578 /* Relocations against GNU_IFUNC symbols do not use the value
1579 of the symbol as the address to relocate against. Instead
1580 they invoke the function named by the symbol and use its
1581 result as the address for relocation.
1582
1583 To indicate this to the user, do not display the value of
1584 the symbol in the "Symbols's Value" field. Instead show
1585 its name followed by () as a hint that the symbol is
1586 invoked. */
1587
1588 if (strtab == NULL
1589 || psym->st_name == 0
1590 || psym->st_name >= strtablen)
1591 name = "??";
1592 else
1593 name = strtab + psym->st_name;
1594
1595 len = print_symbol (width, name);
bb4d2ac2
L
1596 if (version_string)
1597 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1598 version_string);
d8045f23
NC
1599 printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1600 }
1601 else
1602 {
1603 print_vma (psym->st_value, LONG_HEX);
171191ba 1604
d8045f23
NC
1605 printf (is_32bit_elf ? " " : " ");
1606 }
103f02d3 1607
af3fc3bc 1608 if (psym->st_name == 0)
f1ef08cb 1609 {
2cf0635d 1610 const char * sec_name = "<null>";
f1ef08cb
AM
1611 char name_buf[40];
1612
1613 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1614 {
4fbb74a6 1615 if (psym->st_shndx < elf_header.e_shnum)
74e1a04b 1616 sec_name = SECTION_NAME (section_headers + psym->st_shndx);
f1ef08cb
AM
1617 else if (psym->st_shndx == SHN_ABS)
1618 sec_name = "ABS";
1619 else if (psym->st_shndx == SHN_COMMON)
1620 sec_name = "COMMON";
ac145307
BS
1621 else if ((elf_header.e_machine == EM_MIPS
1622 && psym->st_shndx == SHN_MIPS_SCOMMON)
1623 || (elf_header.e_machine == EM_TI_C6000
1624 && psym->st_shndx == SHN_TIC6X_SCOMMON))
172553c7
TS
1625 sec_name = "SCOMMON";
1626 else if (elf_header.e_machine == EM_MIPS
1627 && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1628 sec_name = "SUNDEF";
8a9036a4 1629 else if ((elf_header.e_machine == EM_X86_64
7a9068fe
L
1630 || elf_header.e_machine == EM_L1OM
1631 || elf_header.e_machine == EM_K1OM)
3b22753a
L
1632 && psym->st_shndx == SHN_X86_64_LCOMMON)
1633 sec_name = "LARGE_COMMON";
9ce701e2
L
1634 else if (elf_header.e_machine == EM_IA_64
1635 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1636 && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1637 sec_name = "ANSI_COM";
28f997cf 1638 else if (is_ia64_vms ()
148b93f2
NC
1639 && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1640 sec_name = "VMS_SYMVEC";
f1ef08cb
AM
1641 else
1642 {
1643 sprintf (name_buf, "<section 0x%x>",
1644 (unsigned int) psym->st_shndx);
1645 sec_name = name_buf;
1646 }
1647 }
1648 print_symbol (22, sec_name);
1649 }
af3fc3bc 1650 else if (strtab == NULL)
d79b3d50 1651 printf (_("<string table index: %3ld>"), psym->st_name);
c256ffe7 1652 else if (psym->st_name >= strtablen)
32ec8896
NC
1653 {
1654 error (_("<corrupt string table index: %3ld>"), psym->st_name);
1655 res = FALSE;
1656 }
af3fc3bc 1657 else
bb4d2ac2
L
1658 {
1659 print_symbol (22, strtab + psym->st_name);
1660 if (version_string)
1661 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1662 version_string);
1663 }
103f02d3 1664
af3fc3bc 1665 if (is_rela)
171191ba 1666 {
7360e63f 1667 bfd_vma off = rels[i].r_addend;
171191ba 1668
7360e63f 1669 if ((bfd_signed_vma) off < 0)
598aaa76 1670 printf (" - %" BFD_VMA_FMT "x", - off);
171191ba 1671 else
598aaa76 1672 printf (" + %" BFD_VMA_FMT "x", off);
171191ba 1673 }
19936277 1674 }
252b5132 1675 }
1b228002 1676 else if (is_rela)
f7a99963 1677 {
7360e63f 1678 bfd_vma off = rels[i].r_addend;
e04d7088
L
1679
1680 printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
7360e63f 1681 if ((bfd_signed_vma) off < 0)
e04d7088
L
1682 printf ("-%" BFD_VMA_FMT "x", - off);
1683 else
1684 printf ("%" BFD_VMA_FMT "x", off);
f7a99963 1685 }
252b5132 1686
157c2599
NC
1687 if (elf_header.e_machine == EM_SPARCV9
1688 && rtype != NULL
1689 && streq (rtype, "R_SPARC_OLO10"))
91d6fa6a 1690 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
351b4b40 1691
252b5132 1692 putchar ('\n');
2c71103e 1693
aca88567 1694#ifdef BFD64
53c7db4b 1695 if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
2c71103e 1696 {
91d6fa6a
NC
1697 bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1698 bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
2cf0635d
NC
1699 const char * rtype2 = elf_mips_reloc_type (type2);
1700 const char * rtype3 = elf_mips_reloc_type (type3);
aca88567 1701
2c71103e
NC
1702 printf (" Type2: ");
1703
1704 if (rtype2 == NULL)
39dbeff8
AM
1705 printf (_("unrecognized: %-7lx"),
1706 (unsigned long) type2 & 0xffffffff);
2c71103e
NC
1707 else
1708 printf ("%-17.17s", rtype2);
1709
18bd398b 1710 printf ("\n Type3: ");
2c71103e
NC
1711
1712 if (rtype3 == NULL)
39dbeff8
AM
1713 printf (_("unrecognized: %-7lx"),
1714 (unsigned long) type3 & 0xffffffff);
2c71103e
NC
1715 else
1716 printf ("%-17.17s", rtype3);
1717
53c7db4b 1718 putchar ('\n');
2c71103e 1719 }
aca88567 1720#endif /* BFD64 */
252b5132
RH
1721 }
1722
c8286bd1 1723 free (rels);
32ec8896
NC
1724
1725 return res;
252b5132
RH
1726}
1727
1728static const char *
d3ba0551 1729get_mips_dynamic_type (unsigned long type)
252b5132
RH
1730{
1731 switch (type)
1732 {
1733 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1734 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1735 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1736 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1737 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1738 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1739 case DT_MIPS_MSYM: return "MIPS_MSYM";
1740 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1741 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1742 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1743 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1744 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1745 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1746 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1747 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1748 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1749 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
a5499fa4 1750 case DT_MIPS_RLD_MAP_REL: return "MIPS_RLD_MAP_REL";
252b5132
RH
1751 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1752 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1753 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1754 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1755 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1756 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1757 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1758 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1759 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1760 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1761 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1762 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1763 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1764 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1765 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1766 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1767 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1768 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1769 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1770 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1771 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1772 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1773 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1774 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1775 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1776 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
861fb55a
DJ
1777 case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1778 case DT_MIPS_RWPLT: return "MIPS_RWPLT";
252b5132
RH
1779 default:
1780 return NULL;
1781 }
1782}
1783
9a097730 1784static const char *
d3ba0551 1785get_sparc64_dynamic_type (unsigned long type)
9a097730
RH
1786{
1787 switch (type)
1788 {
1789 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1790 default:
1791 return NULL;
1792 }
103f02d3
UD
1793}
1794
7490d522
AM
1795static const char *
1796get_ppc_dynamic_type (unsigned long type)
1797{
1798 switch (type)
1799 {
a7f2871e 1800 case DT_PPC_GOT: return "PPC_GOT";
e8910a83 1801 case DT_PPC_OPT: return "PPC_OPT";
7490d522
AM
1802 default:
1803 return NULL;
1804 }
1805}
1806
f1cb7e17 1807static const char *
d3ba0551 1808get_ppc64_dynamic_type (unsigned long type)
f1cb7e17
AM
1809{
1810 switch (type)
1811 {
a7f2871e
AM
1812 case DT_PPC64_GLINK: return "PPC64_GLINK";
1813 case DT_PPC64_OPD: return "PPC64_OPD";
1814 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
e8910a83 1815 case DT_PPC64_OPT: return "PPC64_OPT";
f1cb7e17
AM
1816 default:
1817 return NULL;
1818 }
1819}
1820
103f02d3 1821static const char *
d3ba0551 1822get_parisc_dynamic_type (unsigned long type)
103f02d3
UD
1823{
1824 switch (type)
1825 {
1826 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1827 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1828 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1829 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1830 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1831 case DT_HP_PREINIT: return "HP_PREINIT";
1832 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1833 case DT_HP_NEEDED: return "HP_NEEDED";
1834 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1835 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1836 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1837 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1838 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
eec8f817
DA
1839 case DT_HP_EPLTREL: return "HP_GST_EPLTREL";
1840 case DT_HP_EPLTRELSZ: return "HP_GST_EPLTRELSZ";
1841 case DT_HP_FILTERED: return "HP_FILTERED";
1842 case DT_HP_FILTER_TLS: return "HP_FILTER_TLS";
1843 case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1844 case DT_HP_LAZYLOAD: return "HP_LAZYLOAD";
1845 case DT_HP_BIND_NOW_COUNT: return "HP_BIND_NOW_COUNT";
1846 case DT_PLT: return "PLT";
1847 case DT_PLT_SIZE: return "PLT_SIZE";
1848 case DT_DLT: return "DLT";
1849 case DT_DLT_SIZE: return "DLT_SIZE";
103f02d3
UD
1850 default:
1851 return NULL;
1852 }
1853}
9a097730 1854
ecc51f48 1855static const char *
d3ba0551 1856get_ia64_dynamic_type (unsigned long type)
ecc51f48
NC
1857{
1858 switch (type)
1859 {
148b93f2
NC
1860 case DT_IA_64_PLT_RESERVE: return "IA_64_PLT_RESERVE";
1861 case DT_IA_64_VMS_SUBTYPE: return "VMS_SUBTYPE";
1862 case DT_IA_64_VMS_IMGIOCNT: return "VMS_IMGIOCNT";
1863 case DT_IA_64_VMS_LNKFLAGS: return "VMS_LNKFLAGS";
1864 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1865 case DT_IA_64_VMS_IDENT: return "VMS_IDENT";
1866 case DT_IA_64_VMS_NEEDED_IDENT: return "VMS_NEEDED_IDENT";
1867 case DT_IA_64_VMS_IMG_RELA_CNT: return "VMS_IMG_RELA_CNT";
1868 case DT_IA_64_VMS_SEG_RELA_CNT: return "VMS_SEG_RELA_CNT";
1869 case DT_IA_64_VMS_FIXUP_RELA_CNT: return "VMS_FIXUP_RELA_CNT";
1870 case DT_IA_64_VMS_FIXUP_NEEDED: return "VMS_FIXUP_NEEDED";
1871 case DT_IA_64_VMS_SYMVEC_CNT: return "VMS_SYMVEC_CNT";
1872 case DT_IA_64_VMS_XLATED: return "VMS_XLATED";
1873 case DT_IA_64_VMS_STACKSIZE: return "VMS_STACKSIZE";
1874 case DT_IA_64_VMS_UNWINDSZ: return "VMS_UNWINDSZ";
1875 case DT_IA_64_VMS_UNWIND_CODSEG: return "VMS_UNWIND_CODSEG";
1876 case DT_IA_64_VMS_UNWIND_INFOSEG: return "VMS_UNWIND_INFOSEG";
1877 case DT_IA_64_VMS_LINKTIME: return "VMS_LINKTIME";
1878 case DT_IA_64_VMS_SEG_NO: return "VMS_SEG_NO";
1879 case DT_IA_64_VMS_SYMVEC_OFFSET: return "VMS_SYMVEC_OFFSET";
1880 case DT_IA_64_VMS_SYMVEC_SEG: return "VMS_SYMVEC_SEG";
1881 case DT_IA_64_VMS_UNWIND_OFFSET: return "VMS_UNWIND_OFFSET";
1882 case DT_IA_64_VMS_UNWIND_SEG: return "VMS_UNWIND_SEG";
1883 case DT_IA_64_VMS_STRTAB_OFFSET: return "VMS_STRTAB_OFFSET";
1884 case DT_IA_64_VMS_SYSVER_OFFSET: return "VMS_SYSVER_OFFSET";
1885 case DT_IA_64_VMS_IMG_RELA_OFF: return "VMS_IMG_RELA_OFF";
1886 case DT_IA_64_VMS_SEG_RELA_OFF: return "VMS_SEG_RELA_OFF";
1887 case DT_IA_64_VMS_FIXUP_RELA_OFF: return "VMS_FIXUP_RELA_OFF";
1888 case DT_IA_64_VMS_PLTGOT_OFFSET: return "VMS_PLTGOT_OFFSET";
1889 case DT_IA_64_VMS_PLTGOT_SEG: return "VMS_PLTGOT_SEG";
1890 case DT_IA_64_VMS_FPMODE: return "VMS_FPMODE";
ecc51f48
NC
1891 default:
1892 return NULL;
1893 }
1894}
1895
fd85a6a1
NC
1896static const char *
1897get_solaris_section_type (unsigned long type)
1898{
1899 switch (type)
1900 {
1901 case 0x6fffffee: return "SUNW_ancillary";
1902 case 0x6fffffef: return "SUNW_capchain";
1903 case 0x6ffffff0: return "SUNW_capinfo";
1904 case 0x6ffffff1: return "SUNW_symsort";
1905 case 0x6ffffff2: return "SUNW_tlssort";
1906 case 0x6ffffff3: return "SUNW_LDYNSYM";
1907 case 0x6ffffff4: return "SUNW_dof";
1908 case 0x6ffffff5: return "SUNW_cap";
1909 case 0x6ffffff6: return "SUNW_SIGNATURE";
1910 case 0x6ffffff7: return "SUNW_ANNOTATE";
1911 case 0x6ffffff8: return "SUNW_DEBUGSTR";
1912 case 0x6ffffff9: return "SUNW_DEBUG";
1913 case 0x6ffffffa: return "SUNW_move";
1914 case 0x6ffffffb: return "SUNW_COMDAT";
1915 case 0x6ffffffc: return "SUNW_syminfo";
1916 case 0x6ffffffd: return "SUNW_verdef";
1917 case 0x6ffffffe: return "SUNW_verneed";
1918 case 0x6fffffff: return "SUNW_versym";
1919 case 0x70000000: return "SPARC_GOTDATA";
1920 default: return NULL;
1921 }
1922}
1923
fabcb361
RH
1924static const char *
1925get_alpha_dynamic_type (unsigned long type)
1926{
1927 switch (type)
1928 {
1929 case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
32ec8896 1930 default: return NULL;
fabcb361
RH
1931 }
1932}
1933
1c0d3aa6
NC
1934static const char *
1935get_score_dynamic_type (unsigned long type)
1936{
1937 switch (type)
1938 {
1939 case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1940 case DT_SCORE_LOCAL_GOTNO: return "SCORE_LOCAL_GOTNO";
1941 case DT_SCORE_SYMTABNO: return "SCORE_SYMTABNO";
1942 case DT_SCORE_GOTSYM: return "SCORE_GOTSYM";
1943 case DT_SCORE_UNREFEXTNO: return "SCORE_UNREFEXTNO";
1944 case DT_SCORE_HIPAGENO: return "SCORE_HIPAGENO";
32ec8896 1945 default: return NULL;
1c0d3aa6
NC
1946 }
1947}
1948
40b36596
JM
1949static const char *
1950get_tic6x_dynamic_type (unsigned long type)
1951{
1952 switch (type)
1953 {
1954 case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1955 case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1956 case DT_C6000_DSBT_BASE: return "C6000_DSBT_BASE";
1957 case DT_C6000_DSBT_SIZE: return "C6000_DSBT_SIZE";
1958 case DT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
1959 case DT_C6000_DSBT_INDEX: return "C6000_DSBT_INDEX";
32ec8896 1960 default: return NULL;
40b36596
JM
1961 }
1962}
1c0d3aa6 1963
36591ba1
SL
1964static const char *
1965get_nios2_dynamic_type (unsigned long type)
1966{
1967 switch (type)
1968 {
1969 case DT_NIOS2_GP: return "NIOS2_GP";
32ec8896 1970 default: return NULL;
36591ba1
SL
1971 }
1972}
1973
fd85a6a1
NC
1974static const char *
1975get_solaris_dynamic_type (unsigned long type)
1976{
1977 switch (type)
1978 {
1979 case 0x6000000d: return "SUNW_AUXILIARY";
1980 case 0x6000000e: return "SUNW_RTLDINF";
1981 case 0x6000000f: return "SUNW_FILTER";
1982 case 0x60000010: return "SUNW_CAP";
1983 case 0x60000011: return "SUNW_SYMTAB";
1984 case 0x60000012: return "SUNW_SYMSZ";
1985 case 0x60000013: return "SUNW_SORTENT";
1986 case 0x60000014: return "SUNW_SYMSORT";
1987 case 0x60000015: return "SUNW_SYMSORTSZ";
1988 case 0x60000016: return "SUNW_TLSSORT";
1989 case 0x60000017: return "SUNW_TLSSORTSZ";
1990 case 0x60000018: return "SUNW_CAPINFO";
1991 case 0x60000019: return "SUNW_STRPAD";
1992 case 0x6000001a: return "SUNW_CAPCHAIN";
1993 case 0x6000001b: return "SUNW_LDMACH";
1994 case 0x6000001d: return "SUNW_CAPCHAINENT";
1995 case 0x6000001f: return "SUNW_CAPCHAINSZ";
1996 case 0x60000021: return "SUNW_PARENT";
1997 case 0x60000023: return "SUNW_ASLR";
1998 case 0x60000025: return "SUNW_RELAX";
1999 case 0x60000029: return "SUNW_NXHEAP";
2000 case 0x6000002b: return "SUNW_NXSTACK";
2001
2002 case 0x70000001: return "SPARC_REGISTER";
2003 case 0x7ffffffd: return "AUXILIARY";
2004 case 0x7ffffffe: return "USED";
2005 case 0x7fffffff: return "FILTER";
2006
15f205b1 2007 default: return NULL;
fd85a6a1
NC
2008 }
2009}
2010
252b5132 2011static const char *
d3ba0551 2012get_dynamic_type (unsigned long type)
252b5132 2013{
e9e44622 2014 static char buff[64];
252b5132
RH
2015
2016 switch (type)
2017 {
2018 case DT_NULL: return "NULL";
2019 case DT_NEEDED: return "NEEDED";
2020 case DT_PLTRELSZ: return "PLTRELSZ";
2021 case DT_PLTGOT: return "PLTGOT";
2022 case DT_HASH: return "HASH";
2023 case DT_STRTAB: return "STRTAB";
2024 case DT_SYMTAB: return "SYMTAB";
2025 case DT_RELA: return "RELA";
2026 case DT_RELASZ: return "RELASZ";
2027 case DT_RELAENT: return "RELAENT";
2028 case DT_STRSZ: return "STRSZ";
2029 case DT_SYMENT: return "SYMENT";
2030 case DT_INIT: return "INIT";
2031 case DT_FINI: return "FINI";
2032 case DT_SONAME: return "SONAME";
2033 case DT_RPATH: return "RPATH";
2034 case DT_SYMBOLIC: return "SYMBOLIC";
2035 case DT_REL: return "REL";
2036 case DT_RELSZ: return "RELSZ";
2037 case DT_RELENT: return "RELENT";
2038 case DT_PLTREL: return "PLTREL";
2039 case DT_DEBUG: return "DEBUG";
2040 case DT_TEXTREL: return "TEXTREL";
2041 case DT_JMPREL: return "JMPREL";
2042 case DT_BIND_NOW: return "BIND_NOW";
2043 case DT_INIT_ARRAY: return "INIT_ARRAY";
2044 case DT_FINI_ARRAY: return "FINI_ARRAY";
2045 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
2046 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
d1133906
NC
2047 case DT_RUNPATH: return "RUNPATH";
2048 case DT_FLAGS: return "FLAGS";
2d0e6f43 2049
d1133906
NC
2050 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2051 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
6d913794 2052 case DT_SYMTAB_SHNDX: return "SYMTAB_SHNDX";
103f02d3 2053
05107a46 2054 case DT_CHECKSUM: return "CHECKSUM";
252b5132
RH
2055 case DT_PLTPADSZ: return "PLTPADSZ";
2056 case DT_MOVEENT: return "MOVEENT";
2057 case DT_MOVESZ: return "MOVESZ";
dcefbbbd 2058 case DT_FEATURE: return "FEATURE";
252b5132
RH
2059 case DT_POSFLAG_1: return "POSFLAG_1";
2060 case DT_SYMINSZ: return "SYMINSZ";
2061 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
103f02d3 2062
252b5132 2063 case DT_ADDRRNGLO: return "ADDRRNGLO";
dcefbbbd
L
2064 case DT_CONFIG: return "CONFIG";
2065 case DT_DEPAUDIT: return "DEPAUDIT";
2066 case DT_AUDIT: return "AUDIT";
2067 case DT_PLTPAD: return "PLTPAD";
2068 case DT_MOVETAB: return "MOVETAB";
252b5132 2069 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
103f02d3 2070
252b5132 2071 case DT_VERSYM: return "VERSYM";
103f02d3 2072
67a4f2b7
AO
2073 case DT_TLSDESC_GOT: return "TLSDESC_GOT";
2074 case DT_TLSDESC_PLT: return "TLSDESC_PLT";
252b5132
RH
2075 case DT_RELACOUNT: return "RELACOUNT";
2076 case DT_RELCOUNT: return "RELCOUNT";
2077 case DT_FLAGS_1: return "FLAGS_1";
2078 case DT_VERDEF: return "VERDEF";
2079 case DT_VERDEFNUM: return "VERDEFNUM";
2080 case DT_VERNEED: return "VERNEED";
2081 case DT_VERNEEDNUM: return "VERNEEDNUM";
103f02d3 2082
019148e4 2083 case DT_AUXILIARY: return "AUXILIARY";
252b5132
RH
2084 case DT_USED: return "USED";
2085 case DT_FILTER: return "FILTER";
103f02d3 2086
047b2264
JJ
2087 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
2088 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
2089 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
2090 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
2091 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
fdc90cb4 2092 case DT_GNU_HASH: return "GNU_HASH";
047b2264 2093
252b5132
RH
2094 default:
2095 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
2096 {
2cf0635d 2097 const char * result;
103f02d3 2098
252b5132
RH
2099 switch (elf_header.e_machine)
2100 {
2101 case EM_MIPS:
4fe85591 2102 case EM_MIPS_RS3_LE:
252b5132
RH
2103 result = get_mips_dynamic_type (type);
2104 break;
9a097730
RH
2105 case EM_SPARCV9:
2106 result = get_sparc64_dynamic_type (type);
2107 break;
7490d522
AM
2108 case EM_PPC:
2109 result = get_ppc_dynamic_type (type);
2110 break;
f1cb7e17
AM
2111 case EM_PPC64:
2112 result = get_ppc64_dynamic_type (type);
2113 break;
ecc51f48
NC
2114 case EM_IA_64:
2115 result = get_ia64_dynamic_type (type);
2116 break;
fabcb361
RH
2117 case EM_ALPHA:
2118 result = get_alpha_dynamic_type (type);
2119 break;
1c0d3aa6
NC
2120 case EM_SCORE:
2121 result = get_score_dynamic_type (type);
2122 break;
40b36596
JM
2123 case EM_TI_C6000:
2124 result = get_tic6x_dynamic_type (type);
2125 break;
36591ba1
SL
2126 case EM_ALTERA_NIOS2:
2127 result = get_nios2_dynamic_type (type);
2128 break;
252b5132 2129 default:
fd85a6a1
NC
2130 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2131 result = get_solaris_dynamic_type (type);
2132 else
2133 result = NULL;
252b5132
RH
2134 break;
2135 }
2136
2137 if (result != NULL)
2138 return result;
2139
e9e44622 2140 snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
252b5132 2141 }
eec8f817
DA
2142 else if (((type >= DT_LOOS) && (type <= DT_HIOS))
2143 || (elf_header.e_machine == EM_PARISC
2144 && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
103f02d3 2145 {
2cf0635d 2146 const char * result;
103f02d3
UD
2147
2148 switch (elf_header.e_machine)
2149 {
2150 case EM_PARISC:
2151 result = get_parisc_dynamic_type (type);
2152 break;
148b93f2
NC
2153 case EM_IA_64:
2154 result = get_ia64_dynamic_type (type);
2155 break;
103f02d3 2156 default:
fd85a6a1
NC
2157 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2158 result = get_solaris_dynamic_type (type);
2159 else
2160 result = NULL;
103f02d3
UD
2161 break;
2162 }
2163
2164 if (result != NULL)
2165 return result;
2166
e9e44622
JJ
2167 snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2168 type);
103f02d3 2169 }
252b5132 2170 else
e9e44622 2171 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
103f02d3 2172
252b5132
RH
2173 return buff;
2174 }
2175}
2176
2177static char *
d3ba0551 2178get_file_type (unsigned e_type)
252b5132 2179{
b34976b6 2180 static char buff[32];
252b5132
RH
2181
2182 switch (e_type)
2183 {
32ec8896
NC
2184 case ET_NONE: return _("NONE (None)");
2185 case ET_REL: return _("REL (Relocatable file)");
2186 case ET_EXEC: return _("EXEC (Executable file)");
2187 case ET_DYN: return _("DYN (Shared object file)");
2188 case ET_CORE: return _("CORE (Core file)");
252b5132
RH
2189
2190 default:
2191 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
e9e44622 2192 snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
252b5132 2193 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
e9e44622 2194 snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
252b5132 2195 else
e9e44622 2196 snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
252b5132
RH
2197 return buff;
2198 }
2199}
2200
2201static char *
d3ba0551 2202get_machine_name (unsigned e_machine)
252b5132 2203{
b34976b6 2204 static char buff[64]; /* XXX */
252b5132
RH
2205
2206 switch (e_machine)
2207 {
55e22ca8
NC
2208 /* Please keep this switch table sorted by increasing EM_ value. */
2209 /* 0 */
c45021f2
NC
2210 case EM_NONE: return _("None");
2211 case EM_M32: return "WE32100";
2212 case EM_SPARC: return "Sparc";
2213 case EM_386: return "Intel 80386";
2214 case EM_68K: return "MC68000";
2215 case EM_88K: return "MC88000";
22abe556 2216 case EM_IAMCU: return "Intel MCU";
c45021f2
NC
2217 case EM_860: return "Intel 80860";
2218 case EM_MIPS: return "MIPS R3000";
2219 case EM_S370: return "IBM System/370";
55e22ca8 2220 /* 10 */
7036c0e1 2221 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
252b5132 2222 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
c45021f2 2223 case EM_PARISC: return "HPPA";
55e22ca8 2224 case EM_VPP550: return "Fujitsu VPP500";
7036c0e1 2225 case EM_SPARC32PLUS: return "Sparc v8+" ;
c45021f2
NC
2226 case EM_960: return "Intel 90860";
2227 case EM_PPC: return "PowerPC";
55e22ca8 2228 /* 20 */
285d1771 2229 case EM_PPC64: return "PowerPC64";
55e22ca8
NC
2230 case EM_S390_OLD:
2231 case EM_S390: return "IBM S/390";
2232 case EM_SPU: return "SPU";
2233 /* 30 */
2234 case EM_V800: return "Renesas V850 (using RH850 ABI)";
c45021f2
NC
2235 case EM_FR20: return "Fujitsu FR20";
2236 case EM_RH32: return "TRW RH32";
b34976b6 2237 case EM_MCORE: return "MCORE";
55e22ca8 2238 /* 40 */
7036c0e1
AJ
2239 case EM_ARM: return "ARM";
2240 case EM_OLD_ALPHA: return "Digital Alpha (old)";
ef230218 2241 case EM_SH: return "Renesas / SuperH SH";
c45021f2
NC
2242 case EM_SPARCV9: return "Sparc v9";
2243 case EM_TRICORE: return "Siemens Tricore";
584da044 2244 case EM_ARC: return "ARC";
c2dcd04e
NC
2245 case EM_H8_300: return "Renesas H8/300";
2246 case EM_H8_300H: return "Renesas H8/300H";
2247 case EM_H8S: return "Renesas H8S";
2248 case EM_H8_500: return "Renesas H8/500";
55e22ca8 2249 /* 50 */
30800947 2250 case EM_IA_64: return "Intel IA-64";
252b5132
RH
2251 case EM_MIPS_X: return "Stanford MIPS-X";
2252 case EM_COLDFIRE: return "Motorola Coldfire";
55e22ca8 2253 case EM_68HC12: return "Motorola MC68HC12 Microcontroller";
7036c0e1
AJ
2254 case EM_MMA: return "Fujitsu Multimedia Accelerator";
2255 case EM_PCP: return "Siemens PCP";
2256 case EM_NCPU: return "Sony nCPU embedded RISC processor";
2257 case EM_NDR1: return "Denso NDR1 microprocesspr";
2258 case EM_STARCORE: return "Motorola Star*Core processor";
2259 case EM_ME16: return "Toyota ME16 processor";
55e22ca8 2260 /* 60 */
7036c0e1
AJ
2261 case EM_ST100: return "STMicroelectronics ST100 processor";
2262 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
55e22ca8 2263 case EM_X86_64: return "Advanced Micro Devices X86-64";
11636f9e
JM
2264 case EM_PDSP: return "Sony DSP processor";
2265 case EM_PDP10: return "Digital Equipment Corp. PDP-10";
2266 case EM_PDP11: return "Digital Equipment Corp. PDP-11";
7036c0e1
AJ
2267 case EM_FX66: return "Siemens FX66 microcontroller";
2268 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2269 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
2270 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
55e22ca8 2271 /* 70 */
7036c0e1
AJ
2272 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
2273 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
2274 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
2275 case EM_SVX: return "Silicon Graphics SVx";
2276 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
2277 case EM_VAX: return "Digital VAX";
1b61cf92 2278 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
c45021f2
NC
2279 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
2280 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
2281 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
55e22ca8 2282 /* 80 */
b34976b6 2283 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
c45021f2 2284 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
3b36097d 2285 case EM_PRISM: return "Vitesse Prism";
55e22ca8
NC
2286 case EM_AVR_OLD:
2287 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
2288 case EM_CYGNUS_FR30:
2289 case EM_FR30: return "Fujitsu FR30";
2290 case EM_CYGNUS_D10V:
2291 case EM_D10V: return "d10v";
2292 case EM_CYGNUS_D30V:
2293 case EM_D30V: return "d30v";
2294 case EM_CYGNUS_V850:
2295 case EM_V850: return "Renesas V850";
2296 case EM_CYGNUS_M32R:
2297 case EM_M32R: return "Renesas M32R (formerly Mitsubishi M32r)";
2298 case EM_CYGNUS_MN10300:
2299 case EM_MN10300: return "mn10300";
2300 /* 90 */
2301 case EM_CYGNUS_MN10200:
2302 case EM_MN10200: return "mn10200";
2303 case EM_PJ: return "picoJava";
73589c9d 2304 case EM_OR1K: return "OpenRISC 1000";
55e22ca8 2305 case EM_ARC_COMPACT: return "ARCompact";
88da6820
NC
2306 case EM_XTENSA_OLD:
2307 case EM_XTENSA: return "Tensilica Xtensa Processor";
11636f9e
JM
2308 case EM_VIDEOCORE: return "Alphamosaic VideoCore processor";
2309 case EM_TMM_GPP: return "Thompson Multimedia General Purpose Processor";
2310 case EM_NS32K: return "National Semiconductor 32000 series";
2311 case EM_TPC: return "Tenor Network TPC processor";
55e22ca8
NC
2312 case EM_SNP1K: return "Trebia SNP 1000 processor";
2313 /* 100 */
2314 case EM_ST200: return "STMicroelectronics ST200 microcontroller";
2315 case EM_IP2K_OLD:
2316 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
11636f9e
JM
2317 case EM_MAX: return "MAX Processor";
2318 case EM_CR: return "National Semiconductor CompactRISC";
2319 case EM_F2MC16: return "Fujitsu F2MC16";
2320 case EM_MSP430: return "Texas Instruments msp430 microcontroller";
7bbe5bc5 2321 case EM_BLACKFIN: return "Analog Devices Blackfin";
11636f9e
JM
2322 case EM_SE_C33: return "S1C33 Family of Seiko Epson processors";
2323 case EM_SEP: return "Sharp embedded microprocessor";
2324 case EM_ARCA: return "Arca RISC microprocessor";
55e22ca8 2325 /* 110 */
11636f9e
JM
2326 case EM_UNICORE: return "Unicore";
2327 case EM_EXCESS: return "eXcess 16/32/64-bit configurable embedded CPU";
2328 case EM_DXP: return "Icera Semiconductor Inc. Deep Execution Processor";
64fd6348 2329 case EM_ALTERA_NIOS2: return "Altera Nios II";
55e22ca8
NC
2330 case EM_CRX: return "National Semiconductor CRX microprocessor";
2331 case EM_XGATE: return "Motorola XGATE embedded processor";
c29aca4a 2332 case EM_C166:
d70c5fc7 2333 case EM_XC16X: return "Infineon Technologies xc16x";
11636f9e
JM
2334 case EM_M16C: return "Renesas M16C series microprocessors";
2335 case EM_DSPIC30F: return "Microchip Technology dsPIC30F Digital Signal Controller";
2336 case EM_CE: return "Freescale Communication Engine RISC core";
55e22ca8
NC
2337 /* 120 */
2338 case EM_M32C: return "Renesas M32c";
2339 /* 130 */
11636f9e
JM
2340 case EM_TSK3000: return "Altium TSK3000 core";
2341 case EM_RS08: return "Freescale RS08 embedded processor";
2342 case EM_ECOG2: return "Cyan Technology eCOG2 microprocessor";
55e22ca8 2343 case EM_SCORE: return "SUNPLUS S+Core";
11636f9e
JM
2344 case EM_DSP24: return "New Japan Radio (NJR) 24-bit DSP Processor";
2345 case EM_VIDEOCORE3: return "Broadcom VideoCore III processor";
55e22ca8 2346 case EM_LATTICEMICO32: return "Lattice Mico32";
11636f9e 2347 case EM_SE_C17: return "Seiko Epson C17 family";
55e22ca8 2348 /* 140 */
11636f9e
JM
2349 case EM_TI_C6000: return "Texas Instruments TMS320C6000 DSP family";
2350 case EM_TI_C2000: return "Texas Instruments TMS320C2000 DSP family";
2351 case EM_TI_C5500: return "Texas Instruments TMS320C55x DSP family";
55e22ca8
NC
2352 case EM_TI_PRU: return "TI PRU I/O processor";
2353 /* 160 */
11636f9e
JM
2354 case EM_MMDSP_PLUS: return "STMicroelectronics 64bit VLIW Data Signal Processor";
2355 case EM_CYPRESS_M8C: return "Cypress M8C microprocessor";
2356 case EM_R32C: return "Renesas R32C series microprocessors";
2357 case EM_TRIMEDIA: return "NXP Semiconductors TriMedia architecture family";
2358 case EM_QDSP6: return "QUALCOMM DSP6 Processor";
2359 case EM_8051: return "Intel 8051 and variants";
2360 case EM_STXP7X: return "STMicroelectronics STxP7x family";
2361 case EM_NDS32: return "Andes Technology compact code size embedded RISC processor family";
2362 case EM_ECOG1X: return "Cyan Technology eCOG1X family";
2363 case EM_MAXQ30: return "Dallas Semiconductor MAXQ30 Core microcontrollers";
55e22ca8 2364 /* 170 */
11636f9e
JM
2365 case EM_XIMO16: return "New Japan Radio (NJR) 16-bit DSP Processor";
2366 case EM_MANIK: return "M2000 Reconfigurable RISC Microprocessor";
2367 case EM_CRAYNV2: return "Cray Inc. NV2 vector architecture";
c7927a3c 2368 case EM_RX: return "Renesas RX";
a3c62988 2369 case EM_METAG: return "Imagination Technologies Meta processor architecture";
11636f9e
JM
2370 case EM_MCST_ELBRUS: return "MCST Elbrus general purpose hardware architecture";
2371 case EM_ECOG16: return "Cyan Technology eCOG16 family";
55e22ca8
NC
2372 case EM_CR16:
2373 case EM_MICROBLAZE:
2374 case EM_MICROBLAZE_OLD: return "Xilinx MicroBlaze";
11636f9e
JM
2375 case EM_ETPU: return "Freescale Extended Time Processing Unit";
2376 case EM_SLE9X: return "Infineon Technologies SLE9X core";
55e22ca8
NC
2377 /* 180 */
2378 case EM_L1OM: return "Intel L1OM";
2379 case EM_K1OM: return "Intel K1OM";
2380 case EM_INTEL182: return "Intel (reserved)";
2381 case EM_AARCH64: return "AArch64";
2382 case EM_ARM184: return "ARM (reserved)";
2383 case EM_AVR32: return "Atmel Corporation 32-bit microprocessor";
11636f9e
JM
2384 case EM_STM8: return "STMicroeletronics STM8 8-bit microcontroller";
2385 case EM_TILE64: return "Tilera TILE64 multicore architecture family";
2386 case EM_TILEPRO: return "Tilera TILEPro multicore architecture family";
55e22ca8 2387 /* 190 */
11636f9e 2388 case EM_CUDA: return "NVIDIA CUDA architecture";
55e22ca8 2389 case EM_TILEGX: return "Tilera TILE-Gx multicore architecture family";
6d913794
NC
2390 case EM_CLOUDSHIELD: return "CloudShield architecture family";
2391 case EM_COREA_1ST: return "KIPO-KAIST Core-A 1st generation processor family";
2392 case EM_COREA_2ND: return "KIPO-KAIST Core-A 2nd generation processor family";
55e22ca8 2393 case EM_ARC_COMPACT2: return "ARCv2";
6d913794 2394 case EM_OPEN8: return "Open8 8-bit RISC soft processor core";
55e22ca8 2395 case EM_RL78: return "Renesas RL78";
6d913794 2396 case EM_VIDEOCORE5: return "Broadcom VideoCore V processor";
55e22ca8
NC
2397 case EM_78K0R: return "Renesas 78K0R";
2398 /* 200 */
6d913794 2399 case EM_56800EX: return "Freescale 56800EX Digital Signal Controller (DSC)";
15f205b1
NC
2400 case EM_BA1: return "Beyond BA1 CPU architecture";
2401 case EM_BA2: return "Beyond BA2 CPU architecture";
6d913794
NC
2402 case EM_XCORE: return "XMOS xCORE processor family";
2403 case EM_MCHP_PIC: return "Microchip 8-bit PIC(r) family";
55e22ca8 2404 /* 210 */
6d913794
NC
2405 case EM_KM32: return "KM211 KM32 32-bit processor";
2406 case EM_KMX32: return "KM211 KMX32 32-bit processor";
2407 case EM_KMX16: return "KM211 KMX16 16-bit processor";
2408 case EM_KMX8: return "KM211 KMX8 8-bit processor";
2409 case EM_KVARC: return "KM211 KVARC processor";
15f205b1 2410 case EM_CDP: return "Paneve CDP architecture family";
6d913794
NC
2411 case EM_COGE: return "Cognitive Smart Memory Processor";
2412 case EM_COOL: return "Bluechip Systems CoolEngine";
2413 case EM_NORC: return "Nanoradio Optimized RISC";
2414 case EM_CSR_KALIMBA: return "CSR Kalimba architecture family";
55e22ca8 2415 /* 220 */
15f205b1 2416 case EM_Z80: return "Zilog Z80";
55e22ca8
NC
2417 case EM_VISIUM: return "CDS VISIUMcore processor";
2418 case EM_FT32: return "FTDI Chip FT32";
2419 case EM_MOXIE: return "Moxie";
2420 case EM_AMDGPU: return "AMD GPU";
2421 case EM_RISCV: return "RISC-V";
2422 case EM_LANAI: return "Lanai 32-bit processor";
2423 case EM_BPF: return "Linux BPF";
2424
2425 /* Large numbers... */
2426 case EM_MT: return "Morpho Techologies MT processor";
2427 case EM_ALPHA: return "Alpha";
2428 case EM_WEBASSEMBLY: return "Web Assembly";
2429 case EM_DLX: return "OpenDLX";
2430 case EM_XSTORMY16: return "Sanyo XStormy16 CPU core";
2431 case EM_IQ2000: return "Vitesse IQ2000";
2432 case EM_M32C_OLD:
2433 case EM_NIOS32: return "Altera Nios";
2434 case EM_CYGNUS_MEP: return "Toshiba MeP Media Engine";
2435 case EM_ADAPTEVA_EPIPHANY: return "Adapteva EPIPHANY";
2436 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
2437
252b5132 2438 default:
35d9dd2f 2439 snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
252b5132
RH
2440 return buff;
2441 }
2442}
2443
a9522a21
AB
2444static void
2445decode_ARC_machine_flags (unsigned e_flags, unsigned e_machine, char buf[])
2446{
2447 /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2. Some
2448 other compilers don't a specific architecture type in the e_flags, and
2449 instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
2450 architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
2451 architectures.
2452
2453 Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
2454 but also sets a specific architecture type in the e_flags field.
2455
2456 However, when decoding the flags we don't worry if we see an
2457 unexpected pairing, for example EM_ARC_COMPACT machine type, with
2458 ARCEM architecture type. */
2459
2460 switch (e_flags & EF_ARC_MACH_MSK)
2461 {
2462 /* We only expect these to occur for EM_ARC_COMPACT2. */
2463 case EF_ARC_CPU_ARCV2EM:
2464 strcat (buf, ", ARC EM");
2465 break;
2466 case EF_ARC_CPU_ARCV2HS:
2467 strcat (buf, ", ARC HS");
2468 break;
2469
2470 /* We only expect these to occur for EM_ARC_COMPACT. */
2471 case E_ARC_MACH_ARC600:
2472 strcat (buf, ", ARC600");
2473 break;
2474 case E_ARC_MACH_ARC601:
2475 strcat (buf, ", ARC601");
2476 break;
2477 case E_ARC_MACH_ARC700:
2478 strcat (buf, ", ARC700");
2479 break;
2480
2481 /* The only times we should end up here are (a) A corrupt ELF, (b) A
2482 new ELF with new architecture being read by an old version of
2483 readelf, or (c) An ELF built with non-GNU compiler that does not
2484 set the architecture in the e_flags. */
2485 default:
2486 if (e_machine == EM_ARC_COMPACT)
2487 strcat (buf, ", Unknown ARCompact");
2488 else
2489 strcat (buf, ", Unknown ARC");
2490 break;
2491 }
2492
2493 switch (e_flags & EF_ARC_OSABI_MSK)
2494 {
2495 case E_ARC_OSABI_ORIG:
2496 strcat (buf, ", (ABI:legacy)");
2497 break;
2498 case E_ARC_OSABI_V2:
2499 strcat (buf, ", (ABI:v2)");
2500 break;
2501 /* Only upstream 3.9+ kernels will support ARCv2 ISA. */
2502 case E_ARC_OSABI_V3:
2503 strcat (buf, ", v3 no-legacy-syscalls ABI");
2504 break;
2505 default:
2506 strcat (buf, ", unrecognised ARC OSABI flag");
2507 break;
2508 }
2509}
2510
f3485b74 2511static void
d3ba0551 2512decode_ARM_machine_flags (unsigned e_flags, char buf[])
f3485b74
NC
2513{
2514 unsigned eabi;
32ec8896 2515 bfd_boolean unknown = FALSE;
f3485b74
NC
2516
2517 eabi = EF_ARM_EABI_VERSION (e_flags);
2518 e_flags &= ~ EF_ARM_EABIMASK;
2519
2520 /* Handle "generic" ARM flags. */
2521 if (e_flags & EF_ARM_RELEXEC)
2522 {
2523 strcat (buf, ", relocatable executable");
2524 e_flags &= ~ EF_ARM_RELEXEC;
2525 }
76da6bbe 2526
f3485b74
NC
2527 /* Now handle EABI specific flags. */
2528 switch (eabi)
2529 {
2530 default:
2c71103e 2531 strcat (buf, ", <unrecognized EABI>");
f3485b74 2532 if (e_flags)
32ec8896 2533 unknown = TRUE;
f3485b74
NC
2534 break;
2535
2536 case EF_ARM_EABI_VER1:
a5bcd848 2537 strcat (buf, ", Version1 EABI");
f3485b74
NC
2538 while (e_flags)
2539 {
2540 unsigned flag;
76da6bbe 2541
f3485b74
NC
2542 /* Process flags one bit at a time. */
2543 flag = e_flags & - e_flags;
2544 e_flags &= ~ flag;
76da6bbe 2545
f3485b74
NC
2546 switch (flag)
2547 {
a5bcd848 2548 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
f3485b74
NC
2549 strcat (buf, ", sorted symbol tables");
2550 break;
76da6bbe 2551
f3485b74 2552 default:
32ec8896 2553 unknown = TRUE;
f3485b74
NC
2554 break;
2555 }
2556 }
2557 break;
76da6bbe 2558
a5bcd848
PB
2559 case EF_ARM_EABI_VER2:
2560 strcat (buf, ", Version2 EABI");
2561 while (e_flags)
2562 {
2563 unsigned flag;
2564
2565 /* Process flags one bit at a time. */
2566 flag = e_flags & - e_flags;
2567 e_flags &= ~ flag;
2568
2569 switch (flag)
2570 {
2571 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2572 strcat (buf, ", sorted symbol tables");
2573 break;
2574
2575 case EF_ARM_DYNSYMSUSESEGIDX:
2576 strcat (buf, ", dynamic symbols use segment index");
2577 break;
2578
2579 case EF_ARM_MAPSYMSFIRST:
2580 strcat (buf, ", mapping symbols precede others");
2581 break;
2582
2583 default:
32ec8896 2584 unknown = TRUE;
a5bcd848
PB
2585 break;
2586 }
2587 }
2588 break;
2589
d507cf36
PB
2590 case EF_ARM_EABI_VER3:
2591 strcat (buf, ", Version3 EABI");
8cb51566
PB
2592 break;
2593
2594 case EF_ARM_EABI_VER4:
2595 strcat (buf, ", Version4 EABI");
3bfcb652
NC
2596 while (e_flags)
2597 {
2598 unsigned flag;
2599
2600 /* Process flags one bit at a time. */
2601 flag = e_flags & - e_flags;
2602 e_flags &= ~ flag;
2603
2604 switch (flag)
2605 {
2606 case EF_ARM_BE8:
2607 strcat (buf, ", BE8");
2608 break;
2609
2610 case EF_ARM_LE8:
2611 strcat (buf, ", LE8");
2612 break;
2613
2614 default:
32ec8896 2615 unknown = TRUE;
3bfcb652
NC
2616 break;
2617 }
3bfcb652
NC
2618 }
2619 break;
3a4a14e9
PB
2620
2621 case EF_ARM_EABI_VER5:
2622 strcat (buf, ", Version5 EABI");
d507cf36
PB
2623 while (e_flags)
2624 {
2625 unsigned flag;
2626
2627 /* Process flags one bit at a time. */
2628 flag = e_flags & - e_flags;
2629 e_flags &= ~ flag;
2630
2631 switch (flag)
2632 {
2633 case EF_ARM_BE8:
2634 strcat (buf, ", BE8");
2635 break;
2636
2637 case EF_ARM_LE8:
2638 strcat (buf, ", LE8");
2639 break;
2640
3bfcb652
NC
2641 case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT. */
2642 strcat (buf, ", soft-float ABI");
2643 break;
2644
2645 case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT. */
2646 strcat (buf, ", hard-float ABI");
2647 break;
2648
d507cf36 2649 default:
32ec8896 2650 unknown = TRUE;
d507cf36
PB
2651 break;
2652 }
2653 }
2654 break;
2655
f3485b74 2656 case EF_ARM_EABI_UNKNOWN:
a5bcd848 2657 strcat (buf, ", GNU EABI");
f3485b74
NC
2658 while (e_flags)
2659 {
2660 unsigned flag;
76da6bbe 2661
f3485b74
NC
2662 /* Process flags one bit at a time. */
2663 flag = e_flags & - e_flags;
2664 e_flags &= ~ flag;
76da6bbe 2665
f3485b74
NC
2666 switch (flag)
2667 {
a5bcd848 2668 case EF_ARM_INTERWORK:
f3485b74
NC
2669 strcat (buf, ", interworking enabled");
2670 break;
76da6bbe 2671
a5bcd848 2672 case EF_ARM_APCS_26:
f3485b74
NC
2673 strcat (buf, ", uses APCS/26");
2674 break;
76da6bbe 2675
a5bcd848 2676 case EF_ARM_APCS_FLOAT:
f3485b74
NC
2677 strcat (buf, ", uses APCS/float");
2678 break;
76da6bbe 2679
a5bcd848 2680 case EF_ARM_PIC:
f3485b74
NC
2681 strcat (buf, ", position independent");
2682 break;
76da6bbe 2683
a5bcd848 2684 case EF_ARM_ALIGN8:
f3485b74
NC
2685 strcat (buf, ", 8 bit structure alignment");
2686 break;
76da6bbe 2687
a5bcd848 2688 case EF_ARM_NEW_ABI:
f3485b74
NC
2689 strcat (buf, ", uses new ABI");
2690 break;
76da6bbe 2691
a5bcd848 2692 case EF_ARM_OLD_ABI:
f3485b74
NC
2693 strcat (buf, ", uses old ABI");
2694 break;
76da6bbe 2695
a5bcd848 2696 case EF_ARM_SOFT_FLOAT:
f3485b74
NC
2697 strcat (buf, ", software FP");
2698 break;
76da6bbe 2699
90e01f86
ILT
2700 case EF_ARM_VFP_FLOAT:
2701 strcat (buf, ", VFP");
2702 break;
2703
fde78edd
NC
2704 case EF_ARM_MAVERICK_FLOAT:
2705 strcat (buf, ", Maverick FP");
2706 break;
2707
f3485b74 2708 default:
32ec8896 2709 unknown = TRUE;
f3485b74
NC
2710 break;
2711 }
2712 }
2713 }
f3485b74
NC
2714
2715 if (unknown)
2b692964 2716 strcat (buf,_(", <unknown>"));
f3485b74
NC
2717}
2718
343433df
AB
2719static void
2720decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2721{
2722 --size; /* Leave space for null terminator. */
2723
2724 switch (e_flags & EF_AVR_MACH)
2725 {
2726 case E_AVR_MACH_AVR1:
2727 strncat (buf, ", avr:1", size);
2728 break;
2729 case E_AVR_MACH_AVR2:
2730 strncat (buf, ", avr:2", size);
2731 break;
2732 case E_AVR_MACH_AVR25:
2733 strncat (buf, ", avr:25", size);
2734 break;
2735 case E_AVR_MACH_AVR3:
2736 strncat (buf, ", avr:3", size);
2737 break;
2738 case E_AVR_MACH_AVR31:
2739 strncat (buf, ", avr:31", size);
2740 break;
2741 case E_AVR_MACH_AVR35:
2742 strncat (buf, ", avr:35", size);
2743 break;
2744 case E_AVR_MACH_AVR4:
2745 strncat (buf, ", avr:4", size);
2746 break;
2747 case E_AVR_MACH_AVR5:
2748 strncat (buf, ", avr:5", size);
2749 break;
2750 case E_AVR_MACH_AVR51:
2751 strncat (buf, ", avr:51", size);
2752 break;
2753 case E_AVR_MACH_AVR6:
2754 strncat (buf, ", avr:6", size);
2755 break;
2756 case E_AVR_MACH_AVRTINY:
2757 strncat (buf, ", avr:100", size);
2758 break;
2759 case E_AVR_MACH_XMEGA1:
2760 strncat (buf, ", avr:101", size);
2761 break;
2762 case E_AVR_MACH_XMEGA2:
2763 strncat (buf, ", avr:102", size);
2764 break;
2765 case E_AVR_MACH_XMEGA3:
2766 strncat (buf, ", avr:103", size);
2767 break;
2768 case E_AVR_MACH_XMEGA4:
2769 strncat (buf, ", avr:104", size);
2770 break;
2771 case E_AVR_MACH_XMEGA5:
2772 strncat (buf, ", avr:105", size);
2773 break;
2774 case E_AVR_MACH_XMEGA6:
2775 strncat (buf, ", avr:106", size);
2776 break;
2777 case E_AVR_MACH_XMEGA7:
2778 strncat (buf, ", avr:107", size);
2779 break;
2780 default:
2781 strncat (buf, ", avr:<unknown>", size);
2782 break;
2783 }
2784
2785 size -= strlen (buf);
2786 if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2787 strncat (buf, ", link-relax", size);
2788}
2789
35c08157
KLC
2790static void
2791decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2792{
2793 unsigned abi;
2794 unsigned arch;
2795 unsigned config;
2796 unsigned version;
32ec8896
NC
2797 bfd_boolean has_fpu = FALSE;
2798 unsigned int r = 0;
35c08157
KLC
2799
2800 static const char *ABI_STRINGS[] =
2801 {
2802 "ABI v0", /* use r5 as return register; only used in N1213HC */
2803 "ABI v1", /* use r0 as return register */
2804 "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2805 "ABI v2fp", /* for FPU */
40c7a7cb
KLC
2806 "AABI",
2807 "ABI2 FP+"
35c08157
KLC
2808 };
2809 static const char *VER_STRINGS[] =
2810 {
2811 "Andes ELF V1.3 or older",
2812 "Andes ELF V1.3.1",
2813 "Andes ELF V1.4"
2814 };
2815 static const char *ARCH_STRINGS[] =
2816 {
2817 "",
2818 "Andes Star v1.0",
2819 "Andes Star v2.0",
2820 "Andes Star v3.0",
2821 "Andes Star v3.0m"
2822 };
2823
2824 abi = EF_NDS_ABI & e_flags;
2825 arch = EF_NDS_ARCH & e_flags;
2826 config = EF_NDS_INST & e_flags;
2827 version = EF_NDS32_ELF_VERSION & e_flags;
2828
2829 memset (buf, 0, size);
2830
2831 switch (abi)
2832 {
2833 case E_NDS_ABI_V0:
2834 case E_NDS_ABI_V1:
2835 case E_NDS_ABI_V2:
2836 case E_NDS_ABI_V2FP:
2837 case E_NDS_ABI_AABI:
40c7a7cb 2838 case E_NDS_ABI_V2FP_PLUS:
35c08157
KLC
2839 /* In case there are holes in the array. */
2840 r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2841 break;
2842
2843 default:
2844 r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2845 break;
2846 }
2847
2848 switch (version)
2849 {
2850 case E_NDS32_ELF_VER_1_2:
2851 case E_NDS32_ELF_VER_1_3:
2852 case E_NDS32_ELF_VER_1_4:
2853 r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2854 break;
2855
2856 default:
2857 r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2858 break;
2859 }
2860
2861 if (E_NDS_ABI_V0 == abi)
2862 {
2863 /* OLD ABI; only used in N1213HC, has performance extension 1. */
2864 r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2865 if (arch == E_NDS_ARCH_STAR_V1_0)
2866 r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2867 return;
2868 }
2869
2870 switch (arch)
2871 {
2872 case E_NDS_ARCH_STAR_V1_0:
2873 case E_NDS_ARCH_STAR_V2_0:
2874 case E_NDS_ARCH_STAR_V3_0:
2875 case E_NDS_ARCH_STAR_V3_M:
2876 r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2877 break;
2878
2879 default:
2880 r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2881 /* ARCH version determines how the e_flags are interpreted.
2882 If it is unknown, we cannot proceed. */
2883 return;
2884 }
2885
2886 /* Newer ABI; Now handle architecture specific flags. */
2887 if (arch == E_NDS_ARCH_STAR_V1_0)
2888 {
2889 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2890 r += snprintf (buf + r, size -r, ", MFUSR_PC");
2891
2892 if (!(config & E_NDS32_HAS_NO_MAC_INST))
2893 r += snprintf (buf + r, size -r, ", MAC");
2894
2895 if (config & E_NDS32_HAS_DIV_INST)
2896 r += snprintf (buf + r, size -r, ", DIV");
2897
2898 if (config & E_NDS32_HAS_16BIT_INST)
2899 r += snprintf (buf + r, size -r, ", 16b");
2900 }
2901 else
2902 {
2903 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2904 {
2905 if (version <= E_NDS32_ELF_VER_1_3)
2906 r += snprintf (buf + r, size -r, ", [B8]");
2907 else
2908 r += snprintf (buf + r, size -r, ", EX9");
2909 }
2910
2911 if (config & E_NDS32_HAS_MAC_DX_INST)
2912 r += snprintf (buf + r, size -r, ", MAC_DX");
2913
2914 if (config & E_NDS32_HAS_DIV_DX_INST)
2915 r += snprintf (buf + r, size -r, ", DIV_DX");
2916
2917 if (config & E_NDS32_HAS_16BIT_INST)
2918 {
2919 if (version <= E_NDS32_ELF_VER_1_3)
2920 r += snprintf (buf + r, size -r, ", 16b");
2921 else
2922 r += snprintf (buf + r, size -r, ", IFC");
2923 }
2924 }
2925
2926 if (config & E_NDS32_HAS_EXT_INST)
2927 r += snprintf (buf + r, size -r, ", PERF1");
2928
2929 if (config & E_NDS32_HAS_EXT2_INST)
2930 r += snprintf (buf + r, size -r, ", PERF2");
2931
2932 if (config & E_NDS32_HAS_FPU_INST)
2933 {
32ec8896 2934 has_fpu = TRUE;
35c08157
KLC
2935 r += snprintf (buf + r, size -r, ", FPU_SP");
2936 }
2937
2938 if (config & E_NDS32_HAS_FPU_DP_INST)
2939 {
32ec8896 2940 has_fpu = TRUE;
35c08157
KLC
2941 r += snprintf (buf + r, size -r, ", FPU_DP");
2942 }
2943
2944 if (config & E_NDS32_HAS_FPU_MAC_INST)
2945 {
32ec8896 2946 has_fpu = TRUE;
35c08157
KLC
2947 r += snprintf (buf + r, size -r, ", FPU_MAC");
2948 }
2949
2950 if (has_fpu)
2951 {
2952 switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
2953 {
2954 case E_NDS32_FPU_REG_8SP_4DP:
2955 r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
2956 break;
2957 case E_NDS32_FPU_REG_16SP_8DP:
2958 r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
2959 break;
2960 case E_NDS32_FPU_REG_32SP_16DP:
2961 r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
2962 break;
2963 case E_NDS32_FPU_REG_32SP_32DP:
2964 r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
2965 break;
2966 }
2967 }
2968
2969 if (config & E_NDS32_HAS_AUDIO_INST)
2970 r += snprintf (buf + r, size -r, ", AUDIO");
2971
2972 if (config & E_NDS32_HAS_STRING_INST)
2973 r += snprintf (buf + r, size -r, ", STR");
2974
2975 if (config & E_NDS32_HAS_REDUCED_REGS)
2976 r += snprintf (buf + r, size -r, ", 16REG");
2977
2978 if (config & E_NDS32_HAS_VIDEO_INST)
2979 {
2980 if (version <= E_NDS32_ELF_VER_1_3)
2981 r += snprintf (buf + r, size -r, ", VIDEO");
2982 else
2983 r += snprintf (buf + r, size -r, ", SATURATION");
2984 }
2985
2986 if (config & E_NDS32_HAS_ENCRIPT_INST)
2987 r += snprintf (buf + r, size -r, ", ENCRP");
2988
2989 if (config & E_NDS32_HAS_L2C_INST)
2990 r += snprintf (buf + r, size -r, ", L2C");
2991}
2992
252b5132 2993static char *
d3ba0551 2994get_machine_flags (unsigned e_flags, unsigned e_machine)
252b5132 2995{
b34976b6 2996 static char buf[1024];
252b5132
RH
2997
2998 buf[0] = '\0';
76da6bbe 2999
252b5132
RH
3000 if (e_flags)
3001 {
3002 switch (e_machine)
3003 {
3004 default:
3005 break;
3006
886a2506 3007 case EM_ARC_COMPACT2:
886a2506 3008 case EM_ARC_COMPACT:
a9522a21
AB
3009 decode_ARC_machine_flags (e_flags, e_machine, buf);
3010 break;
886a2506 3011
f3485b74
NC
3012 case EM_ARM:
3013 decode_ARM_machine_flags (e_flags, buf);
3014 break;
76da6bbe 3015
343433df
AB
3016 case EM_AVR:
3017 decode_AVR_machine_flags (e_flags, buf, sizeof buf);
3018 break;
3019
781303ce
MF
3020 case EM_BLACKFIN:
3021 if (e_flags & EF_BFIN_PIC)
3022 strcat (buf, ", PIC");
3023
3024 if (e_flags & EF_BFIN_FDPIC)
3025 strcat (buf, ", FDPIC");
3026
3027 if (e_flags & EF_BFIN_CODE_IN_L1)
3028 strcat (buf, ", code in L1");
3029
3030 if (e_flags & EF_BFIN_DATA_IN_L1)
3031 strcat (buf, ", data in L1");
3032
3033 break;
3034
ec2dfb42
AO
3035 case EM_CYGNUS_FRV:
3036 switch (e_flags & EF_FRV_CPU_MASK)
3037 {
3038 case EF_FRV_CPU_GENERIC:
3039 break;
3040
3041 default:
3042 strcat (buf, ", fr???");
3043 break;
57346661 3044
ec2dfb42
AO
3045 case EF_FRV_CPU_FR300:
3046 strcat (buf, ", fr300");
3047 break;
3048
3049 case EF_FRV_CPU_FR400:
3050 strcat (buf, ", fr400");
3051 break;
3052 case EF_FRV_CPU_FR405:
3053 strcat (buf, ", fr405");
3054 break;
3055
3056 case EF_FRV_CPU_FR450:
3057 strcat (buf, ", fr450");
3058 break;
3059
3060 case EF_FRV_CPU_FR500:
3061 strcat (buf, ", fr500");
3062 break;
3063 case EF_FRV_CPU_FR550:
3064 strcat (buf, ", fr550");
3065 break;
3066
3067 case EF_FRV_CPU_SIMPLE:
3068 strcat (buf, ", simple");
3069 break;
3070 case EF_FRV_CPU_TOMCAT:
3071 strcat (buf, ", tomcat");
3072 break;
3073 }
1c877e87 3074 break;
ec2dfb42 3075
53c7db4b 3076 case EM_68K:
425c6cb0 3077 if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
76f57f3a 3078 strcat (buf, ", m68000");
425c6cb0 3079 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
3bdcfdf4
KH
3080 strcat (buf, ", cpu32");
3081 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
3082 strcat (buf, ", fido_a");
425c6cb0 3083 else
266abb8f 3084 {
2cf0635d
NC
3085 char const * isa = _("unknown");
3086 char const * mac = _("unknown mac");
3087 char const * additional = NULL;
0112cd26 3088
c694fd50 3089 switch (e_flags & EF_M68K_CF_ISA_MASK)
266abb8f 3090 {
c694fd50 3091 case EF_M68K_CF_ISA_A_NODIV:
0b2e31dc
NS
3092 isa = "A";
3093 additional = ", nodiv";
3094 break;
c694fd50 3095 case EF_M68K_CF_ISA_A:
266abb8f
NS
3096 isa = "A";
3097 break;
c694fd50 3098 case EF_M68K_CF_ISA_A_PLUS:
266abb8f
NS
3099 isa = "A+";
3100 break;
c694fd50 3101 case EF_M68K_CF_ISA_B_NOUSP:
0b2e31dc
NS
3102 isa = "B";
3103 additional = ", nousp";
3104 break;
c694fd50 3105 case EF_M68K_CF_ISA_B:
266abb8f
NS
3106 isa = "B";
3107 break;
f608cd77
NS
3108 case EF_M68K_CF_ISA_C:
3109 isa = "C";
3110 break;
3111 case EF_M68K_CF_ISA_C_NODIV:
3112 isa = "C";
3113 additional = ", nodiv";
3114 break;
266abb8f
NS
3115 }
3116 strcat (buf, ", cf, isa ");
3117 strcat (buf, isa);
0b2e31dc
NS
3118 if (additional)
3119 strcat (buf, additional);
c694fd50 3120 if (e_flags & EF_M68K_CF_FLOAT)
0b2e31dc 3121 strcat (buf, ", float");
c694fd50 3122 switch (e_flags & EF_M68K_CF_MAC_MASK)
266abb8f
NS
3123 {
3124 case 0:
3125 mac = NULL;
3126 break;
c694fd50 3127 case EF_M68K_CF_MAC:
266abb8f
NS
3128 mac = "mac";
3129 break;
c694fd50 3130 case EF_M68K_CF_EMAC:
266abb8f
NS
3131 mac = "emac";
3132 break;
f608cd77
NS
3133 case EF_M68K_CF_EMAC_B:
3134 mac = "emac_b";
3135 break;
266abb8f
NS
3136 }
3137 if (mac)
3138 {
3139 strcat (buf, ", ");
3140 strcat (buf, mac);
3141 }
266abb8f 3142 }
53c7db4b 3143 break;
33c63f9d 3144
153a2776
NC
3145 case EM_CYGNUS_MEP:
3146 switch (e_flags & EF_MEP_CPU_MASK)
3147 {
3148 case EF_MEP_CPU_MEP: strcat (buf, ", generic MeP"); break;
3149 case EF_MEP_CPU_C2: strcat (buf, ", MeP C2"); break;
3150 case EF_MEP_CPU_C3: strcat (buf, ", MeP C3"); break;
3151 case EF_MEP_CPU_C4: strcat (buf, ", MeP C4"); break;
3152 case EF_MEP_CPU_C5: strcat (buf, ", MeP C5"); break;
3153 case EF_MEP_CPU_H1: strcat (buf, ", MeP H1"); break;
3154 default: strcat (buf, _(", <unknown MeP cpu type>")); break;
3155 }
3156
3157 switch (e_flags & EF_MEP_COP_MASK)
3158 {
3159 case EF_MEP_COP_NONE: break;
3160 case EF_MEP_COP_AVC: strcat (buf, ", AVC coprocessor"); break;
3161 case EF_MEP_COP_AVC2: strcat (buf, ", AVC2 coprocessor"); break;
3162 case EF_MEP_COP_FMAX: strcat (buf, ", FMAX coprocessor"); break;
3163 case EF_MEP_COP_IVC2: strcat (buf, ", IVC2 coprocessor"); break;
3164 default: strcat (buf, _("<unknown MeP copro type>")); break;
3165 }
3166
3167 if (e_flags & EF_MEP_LIBRARY)
3168 strcat (buf, ", Built for Library");
3169
3170 if (e_flags & EF_MEP_INDEX_MASK)
3171 sprintf (buf + strlen (buf), ", Configuration Index: %#x",
3172 e_flags & EF_MEP_INDEX_MASK);
3173
3174 if (e_flags & ~ EF_MEP_ALL_FLAGS)
3175 sprintf (buf + strlen (buf), _(", unknown flags bits: %#x"),
3176 e_flags & ~ EF_MEP_ALL_FLAGS);
3177 break;
3178
252b5132
RH
3179 case EM_PPC:
3180 if (e_flags & EF_PPC_EMB)
3181 strcat (buf, ", emb");
3182
3183 if (e_flags & EF_PPC_RELOCATABLE)
2b692964 3184 strcat (buf, _(", relocatable"));
252b5132
RH
3185
3186 if (e_flags & EF_PPC_RELOCATABLE_LIB)
2b692964 3187 strcat (buf, _(", relocatable-lib"));
252b5132
RH
3188 break;
3189
ee67d69a
AM
3190 case EM_PPC64:
3191 if (e_flags & EF_PPC64_ABI)
3192 {
3193 char abi[] = ", abiv0";
3194
3195 abi[6] += e_flags & EF_PPC64_ABI;
3196 strcat (buf, abi);
3197 }
3198 break;
3199
708e2187
NC
3200 case EM_V800:
3201 if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
3202 strcat (buf, ", RH850 ABI");
0b4362b0 3203
708e2187
NC
3204 if (e_flags & EF_V800_850E3)
3205 strcat (buf, ", V3 architecture");
3206
3207 if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
3208 strcat (buf, ", FPU not used");
3209
3210 if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
3211 strcat (buf, ", regmode: COMMON");
3212
3213 if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
3214 strcat (buf, ", r4 not used");
3215
3216 if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
3217 strcat (buf, ", r30 not used");
3218
3219 if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
3220 strcat (buf, ", r5 not used");
3221
3222 if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
3223 strcat (buf, ", r2 not used");
3224
3225 for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
3226 {
3227 switch (e_flags & - e_flags)
3228 {
3229 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
3230 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
708e2187
NC
3231 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
3232 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
708e2187
NC
3233 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
3234 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
3235 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
3236 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
3237 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
3238 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
3239 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
3240 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
3241 default: break;
3242 }
3243 }
3244 break;
3245
2b0337b0 3246 case EM_V850:
252b5132
RH
3247 case EM_CYGNUS_V850:
3248 switch (e_flags & EF_V850_ARCH)
3249 {
78c8d46c
NC
3250 case E_V850E3V5_ARCH:
3251 strcat (buf, ", v850e3v5");
3252 break;
1cd986c5
NC
3253 case E_V850E2V3_ARCH:
3254 strcat (buf, ", v850e2v3");
3255 break;
3256 case E_V850E2_ARCH:
3257 strcat (buf, ", v850e2");
3258 break;
3259 case E_V850E1_ARCH:
3260 strcat (buf, ", v850e1");
8ad30312 3261 break;
252b5132
RH
3262 case E_V850E_ARCH:
3263 strcat (buf, ", v850e");
3264 break;
252b5132
RH
3265 case E_V850_ARCH:
3266 strcat (buf, ", v850");
3267 break;
3268 default:
2b692964 3269 strcat (buf, _(", unknown v850 architecture variant"));
252b5132
RH
3270 break;
3271 }
3272 break;
3273
2b0337b0 3274 case EM_M32R:
252b5132
RH
3275 case EM_CYGNUS_M32R:
3276 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3277 strcat (buf, ", m32r");
252b5132
RH
3278 break;
3279
3280 case EM_MIPS:
4fe85591 3281 case EM_MIPS_RS3_LE:
252b5132
RH
3282 if (e_flags & EF_MIPS_NOREORDER)
3283 strcat (buf, ", noreorder");
3284
3285 if (e_flags & EF_MIPS_PIC)
3286 strcat (buf, ", pic");
3287
3288 if (e_flags & EF_MIPS_CPIC)
3289 strcat (buf, ", cpic");
3290
d1bdd336
TS
3291 if (e_flags & EF_MIPS_UCODE)
3292 strcat (buf, ", ugen_reserved");
3293
252b5132
RH
3294 if (e_flags & EF_MIPS_ABI2)
3295 strcat (buf, ", abi2");
3296
43521d43
TS
3297 if (e_flags & EF_MIPS_OPTIONS_FIRST)
3298 strcat (buf, ", odk first");
3299
a5d22d2a
TS
3300 if (e_flags & EF_MIPS_32BITMODE)
3301 strcat (buf, ", 32bitmode");
3302
ba92f887
MR
3303 if (e_flags & EF_MIPS_NAN2008)
3304 strcat (buf, ", nan2008");
3305
fef1b0b3
SE
3306 if (e_flags & EF_MIPS_FP64)
3307 strcat (buf, ", fp64");
3308
156c2f8b
NC
3309 switch ((e_flags & EF_MIPS_MACH))
3310 {
3311 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3312 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3313 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
156c2f8b 3314 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
810dfa6e
L
3315 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3316 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3317 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3318 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
c6c98b38 3319 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
ebcb91b7 3320 case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
350cc38d
MS
3321 case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3322 case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
fd503541 3323 case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
05c6f050 3324 case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
67c2a3e8 3325 case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
d32e5c54 3326 case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
52b6b6b9 3327 case E_MIPS_MACH_XLR: strcat (buf, ", xlr"); break;
43521d43
TS
3328 case 0:
3329 /* We simply ignore the field in this case to avoid confusion:
3330 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3331 extension. */
3332 break;
2b692964 3333 default: strcat (buf, _(", unknown CPU")); break;
156c2f8b 3334 }
43521d43
TS
3335
3336 switch ((e_flags & EF_MIPS_ABI))
3337 {
3338 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3339 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3340 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3341 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3342 case 0:
3343 /* We simply ignore the field in this case to avoid confusion:
3344 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3345 This means it is likely to be an o32 file, but not for
3346 sure. */
3347 break;
2b692964 3348 default: strcat (buf, _(", unknown ABI")); break;
43521d43
TS
3349 }
3350
3351 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3352 strcat (buf, ", mdmx");
3353
3354 if (e_flags & EF_MIPS_ARCH_ASE_M16)
3355 strcat (buf, ", mips16");
3356
df58fc94
RS
3357 if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3358 strcat (buf, ", micromips");
3359
43521d43
TS
3360 switch ((e_flags & EF_MIPS_ARCH))
3361 {
3362 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3363 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3364 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3365 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3366 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3367 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
cb44e358 3368 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
7361da2c 3369 case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
43521d43 3370 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
5f74bc13 3371 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
7361da2c 3372 case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
2b692964 3373 default: strcat (buf, _(", unknown ISA")); break;
43521d43 3374 }
252b5132 3375 break;
351b4b40 3376
35c08157
KLC
3377 case EM_NDS32:
3378 decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3379 break;
3380
e23eba97
NC
3381 case EM_RISCV:
3382 if (e_flags & EF_RISCV_RVC)
3383 strcat (buf, ", RVC");
2922d21d
AW
3384
3385 switch (e_flags & EF_RISCV_FLOAT_ABI)
3386 {
3387 case EF_RISCV_FLOAT_ABI_SOFT:
3388 strcat (buf, ", soft-float ABI");
3389 break;
3390
3391 case EF_RISCV_FLOAT_ABI_SINGLE:
3392 strcat (buf, ", single-float ABI");
3393 break;
3394
3395 case EF_RISCV_FLOAT_ABI_DOUBLE:
3396 strcat (buf, ", double-float ABI");
3397 break;
3398
3399 case EF_RISCV_FLOAT_ABI_QUAD:
3400 strcat (buf, ", quad-float ABI");
3401 break;
3402 }
e23eba97
NC
3403 break;
3404
ccde1100
AO
3405 case EM_SH:
3406 switch ((e_flags & EF_SH_MACH_MASK))
3407 {
3408 case EF_SH1: strcat (buf, ", sh1"); break;
3409 case EF_SH2: strcat (buf, ", sh2"); break;
3410 case EF_SH3: strcat (buf, ", sh3"); break;
3411 case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3412 case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3413 case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3414 case EF_SH3E: strcat (buf, ", sh3e"); break;
3415 case EF_SH4: strcat (buf, ", sh4"); break;
3416 case EF_SH5: strcat (buf, ", sh5"); break;
3417 case EF_SH2E: strcat (buf, ", sh2e"); break;
3418 case EF_SH4A: strcat (buf, ", sh4a"); break;
1d70c7fb 3419 case EF_SH2A: strcat (buf, ", sh2a"); break;
ccde1100
AO
3420 case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3421 case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
1d70c7fb 3422 case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
0b92ab21
NH
3423 case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3424 case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3425 case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3426 case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3427 case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3428 case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
2b692964 3429 default: strcat (buf, _(", unknown ISA")); break;
ccde1100
AO
3430 }
3431
cec6a5b8
MR
3432 if (e_flags & EF_SH_PIC)
3433 strcat (buf, ", pic");
3434
3435 if (e_flags & EF_SH_FDPIC)
3436 strcat (buf, ", fdpic");
ccde1100 3437 break;
948f632f 3438
73589c9d
CS
3439 case EM_OR1K:
3440 if (e_flags & EF_OR1K_NODELAY)
3441 strcat (buf, ", no delay");
3442 break;
57346661 3443
351b4b40
RH
3444 case EM_SPARCV9:
3445 if (e_flags & EF_SPARC_32PLUS)
3446 strcat (buf, ", v8+");
3447
3448 if (e_flags & EF_SPARC_SUN_US1)
d07faca2
RH
3449 strcat (buf, ", ultrasparcI");
3450
3451 if (e_flags & EF_SPARC_SUN_US3)
3452 strcat (buf, ", ultrasparcIII");
351b4b40
RH
3453
3454 if (e_flags & EF_SPARC_HAL_R1)
3455 strcat (buf, ", halr1");
3456
3457 if (e_flags & EF_SPARC_LEDATA)
3458 strcat (buf, ", ledata");
3459
3460 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3461 strcat (buf, ", tso");
3462
3463 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3464 strcat (buf, ", pso");
3465
3466 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3467 strcat (buf, ", rmo");
3468 break;
7d466069 3469
103f02d3
UD
3470 case EM_PARISC:
3471 switch (e_flags & EF_PARISC_ARCH)
3472 {
3473 case EFA_PARISC_1_0:
3474 strcpy (buf, ", PA-RISC 1.0");
3475 break;
3476 case EFA_PARISC_1_1:
3477 strcpy (buf, ", PA-RISC 1.1");
3478 break;
3479 case EFA_PARISC_2_0:
3480 strcpy (buf, ", PA-RISC 2.0");
3481 break;
3482 default:
3483 break;
3484 }
3485 if (e_flags & EF_PARISC_TRAPNIL)
3486 strcat (buf, ", trapnil");
3487 if (e_flags & EF_PARISC_EXT)
3488 strcat (buf, ", ext");
3489 if (e_flags & EF_PARISC_LSB)
3490 strcat (buf, ", lsb");
3491 if (e_flags & EF_PARISC_WIDE)
3492 strcat (buf, ", wide");
3493 if (e_flags & EF_PARISC_NO_KABP)
3494 strcat (buf, ", no kabp");
3495 if (e_flags & EF_PARISC_LAZYSWAP)
3496 strcat (buf, ", lazyswap");
30800947 3497 break;
76da6bbe 3498
7d466069 3499 case EM_PJ:
2b0337b0 3500 case EM_PJ_OLD:
7d466069
ILT
3501 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3502 strcat (buf, ", new calling convention");
3503
3504 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3505 strcat (buf, ", gnu calling convention");
3506 break;
4d6ed7c8
NC
3507
3508 case EM_IA_64:
3509 if ((e_flags & EF_IA_64_ABI64))
3510 strcat (buf, ", 64-bit");
3511 else
3512 strcat (buf, ", 32-bit");
3513 if ((e_flags & EF_IA_64_REDUCEDFP))
3514 strcat (buf, ", reduced fp model");
3515 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3516 strcat (buf, ", no function descriptors, constant gp");
3517 else if ((e_flags & EF_IA_64_CONS_GP))
3518 strcat (buf, ", constant gp");
3519 if ((e_flags & EF_IA_64_ABSOLUTE))
3520 strcat (buf, ", absolute");
28f997cf
TG
3521 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3522 {
3523 if ((e_flags & EF_IA_64_VMS_LINKAGES))
3524 strcat (buf, ", vms_linkages");
3525 switch ((e_flags & EF_IA_64_VMS_COMCOD))
3526 {
3527 case EF_IA_64_VMS_COMCOD_SUCCESS:
3528 break;
3529 case EF_IA_64_VMS_COMCOD_WARNING:
3530 strcat (buf, ", warning");
3531 break;
3532 case EF_IA_64_VMS_COMCOD_ERROR:
3533 strcat (buf, ", error");
3534 break;
3535 case EF_IA_64_VMS_COMCOD_ABORT:
3536 strcat (buf, ", abort");
3537 break;
3538 default:
bee0ee85
NC
3539 warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3540 e_flags & EF_IA_64_VMS_COMCOD);
3541 strcat (buf, ", <unknown>");
28f997cf
TG
3542 }
3543 }
4d6ed7c8 3544 break;
179d3252
JT
3545
3546 case EM_VAX:
3547 if ((e_flags & EF_VAX_NONPIC))
3548 strcat (buf, ", non-PIC");
3549 if ((e_flags & EF_VAX_DFLOAT))
3550 strcat (buf, ", D-Float");
3551 if ((e_flags & EF_VAX_GFLOAT))
3552 strcat (buf, ", G-Float");
3553 break;
c7927a3c 3554
619ed720
EB
3555 case EM_VISIUM:
3556 if (e_flags & EF_VISIUM_ARCH_MCM)
3557 strcat (buf, ", mcm");
3558 else if (e_flags & EF_VISIUM_ARCH_MCM24)
3559 strcat (buf, ", mcm24");
3560 if (e_flags & EF_VISIUM_ARCH_GR6)
3561 strcat (buf, ", gr6");
3562 break;
3563
4046d87a 3564 case EM_RL78:
1740ba0c
NC
3565 switch (e_flags & E_FLAG_RL78_CPU_MASK)
3566 {
3567 case E_FLAG_RL78_ANY_CPU: break;
3568 case E_FLAG_RL78_G10: strcat (buf, ", G10"); break;
3569 case E_FLAG_RL78_G13: strcat (buf, ", G13"); break;
3570 case E_FLAG_RL78_G14: strcat (buf, ", G14"); break;
3571 }
856ea05c
KP
3572 if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3573 strcat (buf, ", 64-bit doubles");
4046d87a 3574 break;
0b4362b0 3575
c7927a3c
NC
3576 case EM_RX:
3577 if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3578 strcat (buf, ", 64-bit doubles");
3579 if (e_flags & E_FLAG_RX_DSP)
dd24e3da 3580 strcat (buf, ", dsp");
d4cb0ea0 3581 if (e_flags & E_FLAG_RX_PID)
0b4362b0 3582 strcat (buf, ", pid");
708e2187
NC
3583 if (e_flags & E_FLAG_RX_ABI)
3584 strcat (buf, ", RX ABI");
3525236c
NC
3585 if (e_flags & E_FLAG_RX_SINSNS_SET)
3586 strcat (buf, e_flags & E_FLAG_RX_SINSNS_YES
3587 ? ", uses String instructions" : ", bans String instructions");
a117b0a5
YS
3588 if (e_flags & E_FLAG_RX_V2)
3589 strcat (buf, ", V2");
d4cb0ea0 3590 break;
55786da2
AK
3591
3592 case EM_S390:
3593 if (e_flags & EF_S390_HIGH_GPRS)
3594 strcat (buf, ", highgprs");
d4cb0ea0 3595 break;
40b36596
JM
3596
3597 case EM_TI_C6000:
3598 if ((e_flags & EF_C6000_REL))
3599 strcat (buf, ", relocatable module");
d4cb0ea0 3600 break;
13761a11
NC
3601
3602 case EM_MSP430:
3603 strcat (buf, _(": architecture variant: "));
3604 switch (e_flags & EF_MSP430_MACH)
3605 {
3606 case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3607 case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3608 case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3609 case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3610 case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3611 case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3612 case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3613 case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3614 case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3615 case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3616 case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3617 case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3618 case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3619 case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3620 case E_MSP430_MACH_MSP430X : strcat (buf, "MSP430X"); break;
3621 default:
3622 strcat (buf, _(": unknown")); break;
3623 }
3624
3625 if (e_flags & ~ EF_MSP430_MACH)
3626 strcat (buf, _(": unknown extra flag bits also present"));
252b5132
RH
3627 }
3628 }
3629
3630 return buf;
3631}
3632
252b5132 3633static const char *
d3ba0551
AM
3634get_osabi_name (unsigned int osabi)
3635{
3636 static char buff[32];
3637
3638 switch (osabi)
3639 {
3640 case ELFOSABI_NONE: return "UNIX - System V";
3641 case ELFOSABI_HPUX: return "UNIX - HP-UX";
3642 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
9c55345c 3643 case ELFOSABI_GNU: return "UNIX - GNU";
d3ba0551
AM
3644 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
3645 case ELFOSABI_AIX: return "UNIX - AIX";
3646 case ELFOSABI_IRIX: return "UNIX - IRIX";
3647 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
3648 case ELFOSABI_TRU64: return "UNIX - TRU64";
3649 case ELFOSABI_MODESTO: return "Novell - Modesto";
3650 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
3651 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
3652 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
3b26c801 3653 case ELFOSABI_AROS: return "AROS";
11636f9e 3654 case ELFOSABI_FENIXOS: return "FenixOS";
6d913794
NC
3655 case ELFOSABI_CLOUDABI: return "Nuxi CloudABI";
3656 case ELFOSABI_OPENVOS: return "Stratus Technologies OpenVOS";
d3ba0551 3657 default:
40b36596
JM
3658 if (osabi >= 64)
3659 switch (elf_header.e_machine)
3660 {
3661 case EM_ARM:
3662 switch (osabi)
3663 {
3664 case ELFOSABI_ARM: return "ARM";
3665 default:
3666 break;
3667 }
3668 break;
3669
3670 case EM_MSP430:
3671 case EM_MSP430_OLD:
619ed720 3672 case EM_VISIUM:
40b36596
JM
3673 switch (osabi)
3674 {
3675 case ELFOSABI_STANDALONE: return _("Standalone App");
3676 default:
3677 break;
3678 }
3679 break;
3680
3681 case EM_TI_C6000:
3682 switch (osabi)
3683 {
3684 case ELFOSABI_C6000_ELFABI: return _("Bare-metal C6000");
3685 case ELFOSABI_C6000_LINUX: return "Linux C6000";
3686 default:
3687 break;
3688 }
3689 break;
3690
3691 default:
3692 break;
3693 }
e9e44622 3694 snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
d3ba0551
AM
3695 return buff;
3696 }
3697}
3698
a06ea964
NC
3699static const char *
3700get_aarch64_segment_type (unsigned long type)
3701{
3702 switch (type)
3703 {
32ec8896
NC
3704 case PT_AARCH64_ARCHEXT: return "AARCH64_ARCHEXT";
3705 default: return NULL;
a06ea964 3706 }
a06ea964
NC
3707}
3708
b294bdf8
MM
3709static const char *
3710get_arm_segment_type (unsigned long type)
3711{
3712 switch (type)
3713 {
32ec8896
NC
3714 case PT_ARM_EXIDX: return "EXIDX";
3715 default: return NULL;
b294bdf8 3716 }
b294bdf8
MM
3717}
3718
d3ba0551
AM
3719static const char *
3720get_mips_segment_type (unsigned long type)
252b5132
RH
3721{
3722 switch (type)
3723 {
32ec8896
NC
3724 case PT_MIPS_REGINFO: return "REGINFO";
3725 case PT_MIPS_RTPROC: return "RTPROC";
3726 case PT_MIPS_OPTIONS: return "OPTIONS";
3727 case PT_MIPS_ABIFLAGS: return "ABIFLAGS";
3728 default: return NULL;
252b5132 3729 }
252b5132
RH
3730}
3731
103f02d3 3732static const char *
d3ba0551 3733get_parisc_segment_type (unsigned long type)
103f02d3
UD
3734{
3735 switch (type)
3736 {
3737 case PT_HP_TLS: return "HP_TLS";
3738 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
3739 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
3740 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
3741 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
3742 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
3743 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
3744 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
3745 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
3746 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
3747 case PT_HP_PARALLEL: return "HP_PARALLEL";
3748 case PT_HP_FASTBIND: return "HP_FASTBIND";
eec8f817
DA
3749 case PT_HP_OPT_ANNOT: return "HP_OPT_ANNOT";
3750 case PT_HP_HSL_ANNOT: return "HP_HSL_ANNOT";
3751 case PT_HP_STACK: return "HP_STACK";
3752 case PT_HP_CORE_UTSNAME: return "HP_CORE_UTSNAME";
103f02d3
UD
3753 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
3754 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
61472819 3755 case PT_PARISC_WEAKORDER: return "PARISC_WEAKORDER";
32ec8896 3756 default: return NULL;
103f02d3 3757 }
103f02d3
UD
3758}
3759
4d6ed7c8 3760static const char *
d3ba0551 3761get_ia64_segment_type (unsigned long type)
4d6ed7c8
NC
3762{
3763 switch (type)
3764 {
3765 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
3766 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
00428cca
AM
3767 case PT_HP_TLS: return "HP_TLS";
3768 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
3769 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
3770 case PT_IA_64_HP_STACK: return "HP_STACK";
32ec8896 3771 default: return NULL;
4d6ed7c8 3772 }
4d6ed7c8
NC
3773}
3774
40b36596
JM
3775static const char *
3776get_tic6x_segment_type (unsigned long type)
3777{
3778 switch (type)
3779 {
32ec8896
NC
3780 case PT_C6000_PHATTR: return "C6000_PHATTR";
3781 default: return NULL;
40b36596 3782 }
40b36596
JM
3783}
3784
5522f910
NC
3785static const char *
3786get_solaris_segment_type (unsigned long type)
3787{
3788 switch (type)
3789 {
3790 case 0x6464e550: return "PT_SUNW_UNWIND";
3791 case 0x6474e550: return "PT_SUNW_EH_FRAME";
3792 case 0x6ffffff7: return "PT_LOSUNW";
3793 case 0x6ffffffa: return "PT_SUNWBSS";
3794 case 0x6ffffffb: return "PT_SUNWSTACK";
3795 case 0x6ffffffc: return "PT_SUNWDTRACE";
3796 case 0x6ffffffd: return "PT_SUNWCAP";
3797 case 0x6fffffff: return "PT_HISUNW";
32ec8896 3798 default: return NULL;
5522f910
NC
3799 }
3800}
3801
252b5132 3802static const char *
d3ba0551 3803get_segment_type (unsigned long p_type)
252b5132 3804{
b34976b6 3805 static char buff[32];
252b5132
RH
3806
3807 switch (p_type)
3808 {
b34976b6
AM
3809 case PT_NULL: return "NULL";
3810 case PT_LOAD: return "LOAD";
252b5132 3811 case PT_DYNAMIC: return "DYNAMIC";
b34976b6
AM
3812 case PT_INTERP: return "INTERP";
3813 case PT_NOTE: return "NOTE";
3814 case PT_SHLIB: return "SHLIB";
3815 case PT_PHDR: return "PHDR";
13ae64f3 3816 case PT_TLS: return "TLS";
32ec8896 3817 case PT_GNU_EH_FRAME: return "GNU_EH_FRAME";
2b05f1b7 3818 case PT_GNU_STACK: return "GNU_STACK";
8c37241b 3819 case PT_GNU_RELRO: return "GNU_RELRO";
65765700 3820
252b5132
RH
3821 default:
3822 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3823 {
2cf0635d 3824 const char * result;
103f02d3 3825
252b5132
RH
3826 switch (elf_header.e_machine)
3827 {
a06ea964
NC
3828 case EM_AARCH64:
3829 result = get_aarch64_segment_type (p_type);
3830 break;
b294bdf8
MM
3831 case EM_ARM:
3832 result = get_arm_segment_type (p_type);
3833 break;
252b5132 3834 case EM_MIPS:
4fe85591 3835 case EM_MIPS_RS3_LE:
252b5132
RH
3836 result = get_mips_segment_type (p_type);
3837 break;
103f02d3
UD
3838 case EM_PARISC:
3839 result = get_parisc_segment_type (p_type);
3840 break;
4d6ed7c8
NC
3841 case EM_IA_64:
3842 result = get_ia64_segment_type (p_type);
3843 break;
40b36596
JM
3844 case EM_TI_C6000:
3845 result = get_tic6x_segment_type (p_type);
3846 break;
252b5132
RH
3847 default:
3848 result = NULL;
3849 break;
3850 }
103f02d3 3851
252b5132
RH
3852 if (result != NULL)
3853 return result;
103f02d3 3854
1a9ccd70 3855 sprintf (buff, "LOPROC+%#lx", p_type - PT_LOPROC);
252b5132
RH
3856 }
3857 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
103f02d3 3858 {
2cf0635d 3859 const char * result;
103f02d3
UD
3860
3861 switch (elf_header.e_machine)
3862 {
3863 case EM_PARISC:
3864 result = get_parisc_segment_type (p_type);
3865 break;
00428cca
AM
3866 case EM_IA_64:
3867 result = get_ia64_segment_type (p_type);
3868 break;
103f02d3 3869 default:
5522f910
NC
3870 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
3871 result = get_solaris_segment_type (p_type);
3872 else
3873 result = NULL;
103f02d3
UD
3874 break;
3875 }
3876
3877 if (result != NULL)
3878 return result;
3879
1a9ccd70 3880 sprintf (buff, "LOOS+%#lx", p_type - PT_LOOS);
103f02d3 3881 }
252b5132 3882 else
e9e44622 3883 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
252b5132
RH
3884
3885 return buff;
3886 }
3887}
3888
3889static const char *
d3ba0551 3890get_mips_section_type_name (unsigned int sh_type)
252b5132
RH
3891{
3892 switch (sh_type)
3893 {
b34976b6
AM
3894 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
3895 case SHT_MIPS_MSYM: return "MIPS_MSYM";
3896 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
3897 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
3898 case SHT_MIPS_UCODE: return "MIPS_UCODE";
3899 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
3900 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
3901 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
3902 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
3903 case SHT_MIPS_RELD: return "MIPS_RELD";
3904 case SHT_MIPS_IFACE: return "MIPS_IFACE";
3905 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
3906 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
3907 case SHT_MIPS_SHDR: return "MIPS_SHDR";
3908 case SHT_MIPS_FDESC: return "MIPS_FDESC";
3909 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
3910 case SHT_MIPS_DENSE: return "MIPS_DENSE";
3911 case SHT_MIPS_PDESC: return "MIPS_PDESC";
3912 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
3913 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
3914 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
3915 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
3916 case SHT_MIPS_LINE: return "MIPS_LINE";
3917 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
3918 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
3919 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
3920 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
3921 case SHT_MIPS_DWARF: return "MIPS_DWARF";
3922 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
3923 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
3924 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
3925 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
3926 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
3927 case SHT_MIPS_XLATE: return "MIPS_XLATE";
3928 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
3929 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
3930 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
3931 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
252b5132 3932 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
351cdf24 3933 case SHT_MIPS_ABIFLAGS: return "MIPS_ABIFLAGS";
252b5132
RH
3934 default:
3935 break;
3936 }
3937 return NULL;
3938}
3939
103f02d3 3940static const char *
d3ba0551 3941get_parisc_section_type_name (unsigned int sh_type)
103f02d3
UD
3942{
3943 switch (sh_type)
3944 {
3945 case SHT_PARISC_EXT: return "PARISC_EXT";
3946 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
3947 case SHT_PARISC_DOC: return "PARISC_DOC";
eec8f817
DA
3948 case SHT_PARISC_ANNOT: return "PARISC_ANNOT";
3949 case SHT_PARISC_SYMEXTN: return "PARISC_SYMEXTN";
3950 case SHT_PARISC_STUBS: return "PARISC_STUBS";
61472819 3951 case SHT_PARISC_DLKM: return "PARISC_DLKM";
32ec8896 3952 default: return NULL;
103f02d3 3953 }
103f02d3
UD
3954}
3955
4d6ed7c8 3956static const char *
d3ba0551 3957get_ia64_section_type_name (unsigned int sh_type)
4d6ed7c8 3958{
18bd398b 3959 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
ecc51f48
NC
3960 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
3961 return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
0de14b54 3962
4d6ed7c8
NC
3963 switch (sh_type)
3964 {
148b93f2
NC
3965 case SHT_IA_64_EXT: return "IA_64_EXT";
3966 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
3967 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
3968 case SHT_IA_64_VMS_TRACE: return "VMS_TRACE";
3969 case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
3970 case SHT_IA_64_VMS_DEBUG: return "VMS_DEBUG";
3971 case SHT_IA_64_VMS_DEBUG_STR: return "VMS_DEBUG_STR";
3972 case SHT_IA_64_VMS_LINKAGES: return "VMS_LINKAGES";
3973 case SHT_IA_64_VMS_SYMBOL_VECTOR: return "VMS_SYMBOL_VECTOR";
3974 case SHT_IA_64_VMS_FIXUP: return "VMS_FIXUP";
4d6ed7c8
NC
3975 default:
3976 break;
3977 }
3978 return NULL;
3979}
3980
d2b2c203
DJ
3981static const char *
3982get_x86_64_section_type_name (unsigned int sh_type)
3983{
3984 switch (sh_type)
3985 {
3986 case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
32ec8896 3987 default: return NULL;
d2b2c203 3988 }
d2b2c203
DJ
3989}
3990
a06ea964
NC
3991static const char *
3992get_aarch64_section_type_name (unsigned int sh_type)
3993{
3994 switch (sh_type)
3995 {
32ec8896
NC
3996 case SHT_AARCH64_ATTRIBUTES: return "AARCH64_ATTRIBUTES";
3997 default: return NULL;
a06ea964 3998 }
a06ea964
NC
3999}
4000
40a18ebd
NC
4001static const char *
4002get_arm_section_type_name (unsigned int sh_type)
4003{
4004 switch (sh_type)
4005 {
7f6fed87
NC
4006 case SHT_ARM_EXIDX: return "ARM_EXIDX";
4007 case SHT_ARM_PREEMPTMAP: return "ARM_PREEMPTMAP";
4008 case SHT_ARM_ATTRIBUTES: return "ARM_ATTRIBUTES";
4009 case SHT_ARM_DEBUGOVERLAY: return "ARM_DEBUGOVERLAY";
4010 case SHT_ARM_OVERLAYSECTION: return "ARM_OVERLAYSECTION";
32ec8896 4011 default: return NULL;
40a18ebd 4012 }
40a18ebd
NC
4013}
4014
40b36596
JM
4015static const char *
4016get_tic6x_section_type_name (unsigned int sh_type)
4017{
4018 switch (sh_type)
4019 {
32ec8896
NC
4020 case SHT_C6000_UNWIND: return "C6000_UNWIND";
4021 case SHT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
4022 case SHT_C6000_ATTRIBUTES: return "C6000_ATTRIBUTES";
4023 case SHT_TI_ICODE: return "TI_ICODE";
4024 case SHT_TI_XREF: return "TI_XREF";
4025 case SHT_TI_HANDLER: return "TI_HANDLER";
4026 case SHT_TI_INITINFO: return "TI_INITINFO";
4027 case SHT_TI_PHATTRS: return "TI_PHATTRS";
4028 default: return NULL;
40b36596 4029 }
40b36596
JM
4030}
4031
13761a11
NC
4032static const char *
4033get_msp430x_section_type_name (unsigned int sh_type)
4034{
4035 switch (sh_type)
4036 {
32ec8896
NC
4037 case SHT_MSP430_SEC_FLAGS: return "MSP430_SEC_FLAGS";
4038 case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
4039 case SHT_MSP430_ATTRIBUTES: return "MSP430_ATTRIBUTES";
4040 default: return NULL;
13761a11
NC
4041 }
4042}
4043
685080f2
NC
4044static const char *
4045get_v850_section_type_name (unsigned int sh_type)
4046{
4047 switch (sh_type)
4048 {
32ec8896
NC
4049 case SHT_V850_SCOMMON: return "V850 Small Common";
4050 case SHT_V850_TCOMMON: return "V850 Tiny Common";
4051 case SHT_V850_ZCOMMON: return "V850 Zero Common";
4052 case SHT_RENESAS_IOP: return "RENESAS IOP";
4053 case SHT_RENESAS_INFO: return "RENESAS INFO";
4054 default: return NULL;
685080f2
NC
4055 }
4056}
4057
252b5132 4058static const char *
d3ba0551 4059get_section_type_name (unsigned int sh_type)
252b5132 4060{
b34976b6 4061 static char buff[32];
9fb71ee4 4062 const char * result;
252b5132
RH
4063
4064 switch (sh_type)
4065 {
4066 case SHT_NULL: return "NULL";
4067 case SHT_PROGBITS: return "PROGBITS";
4068 case SHT_SYMTAB: return "SYMTAB";
4069 case SHT_STRTAB: return "STRTAB";
4070 case SHT_RELA: return "RELA";
4071 case SHT_HASH: return "HASH";
4072 case SHT_DYNAMIC: return "DYNAMIC";
4073 case SHT_NOTE: return "NOTE";
4074 case SHT_NOBITS: return "NOBITS";
4075 case SHT_REL: return "REL";
4076 case SHT_SHLIB: return "SHLIB";
4077 case SHT_DYNSYM: return "DYNSYM";
d1133906
NC
4078 case SHT_INIT_ARRAY: return "INIT_ARRAY";
4079 case SHT_FINI_ARRAY: return "FINI_ARRAY";
4080 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
fdc90cb4 4081 case SHT_GNU_HASH: return "GNU_HASH";
93ebe586
NC
4082 case SHT_GROUP: return "GROUP";
4083 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
252b5132
RH
4084 case SHT_GNU_verdef: return "VERDEF";
4085 case SHT_GNU_verneed: return "VERNEED";
4086 case SHT_GNU_versym: return "VERSYM";
b34976b6
AM
4087 case 0x6ffffff0: return "VERSYM";
4088 case 0x6ffffffc: return "VERDEF";
252b5132
RH
4089 case 0x7ffffffd: return "AUXILIARY";
4090 case 0x7fffffff: return "FILTER";
047b2264 4091 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
252b5132
RH
4092
4093 default:
4094 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
4095 {
252b5132
RH
4096 switch (elf_header.e_machine)
4097 {
4098 case EM_MIPS:
4fe85591 4099 case EM_MIPS_RS3_LE:
252b5132
RH
4100 result = get_mips_section_type_name (sh_type);
4101 break;
103f02d3
UD
4102 case EM_PARISC:
4103 result = get_parisc_section_type_name (sh_type);
4104 break;
4d6ed7c8
NC
4105 case EM_IA_64:
4106 result = get_ia64_section_type_name (sh_type);
4107 break;
d2b2c203 4108 case EM_X86_64:
8a9036a4 4109 case EM_L1OM:
7a9068fe 4110 case EM_K1OM:
d2b2c203
DJ
4111 result = get_x86_64_section_type_name (sh_type);
4112 break;
a06ea964
NC
4113 case EM_AARCH64:
4114 result = get_aarch64_section_type_name (sh_type);
4115 break;
40a18ebd
NC
4116 case EM_ARM:
4117 result = get_arm_section_type_name (sh_type);
4118 break;
40b36596
JM
4119 case EM_TI_C6000:
4120 result = get_tic6x_section_type_name (sh_type);
4121 break;
13761a11
NC
4122 case EM_MSP430:
4123 result = get_msp430x_section_type_name (sh_type);
4124 break;
685080f2
NC
4125 case EM_V800:
4126 case EM_V850:
4127 case EM_CYGNUS_V850:
4128 result = get_v850_section_type_name (sh_type);
4129 break;
252b5132
RH
4130 default:
4131 result = NULL;
4132 break;
4133 }
4134
4135 if (result != NULL)
4136 return result;
4137
9fb71ee4 4138 sprintf (buff, "LOPROC+%#x", sh_type - SHT_LOPROC);
252b5132
RH
4139 }
4140 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
148b93f2 4141 {
148b93f2
NC
4142 switch (elf_header.e_machine)
4143 {
4144 case EM_IA_64:
4145 result = get_ia64_section_type_name (sh_type);
4146 break;
4147 default:
fd85a6a1
NC
4148 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
4149 result = get_solaris_section_type (sh_type);
4150 else
1b4b80bf
NC
4151 {
4152 switch (sh_type)
4153 {
4154 case SHT_GNU_INCREMENTAL_INPUTS: result = "GNU_INCREMENTAL_INPUTS"; break;
4155 case SHT_GNU_ATTRIBUTES: result = "GNU_ATTRIBUTES"; break;
4156 case SHT_GNU_HASH: result = "GNU_HASH"; break;
4157 case SHT_GNU_LIBLIST: result = "GNU_LIBLIST"; break;
4158 default:
4159 result = NULL;
4160 break;
4161 }
4162 }
148b93f2
NC
4163 break;
4164 }
4165
4166 if (result != NULL)
4167 return result;
4168
9fb71ee4 4169 sprintf (buff, "LOOS+%#x", sh_type - SHT_LOOS);
148b93f2 4170 }
252b5132 4171 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
685080f2
NC
4172 {
4173 switch (elf_header.e_machine)
4174 {
4175 case EM_V800:
4176 case EM_V850:
4177 case EM_CYGNUS_V850:
9fb71ee4 4178 result = get_v850_section_type_name (sh_type);
a9fb83be 4179 break;
685080f2 4180 default:
9fb71ee4 4181 result = NULL;
685080f2
NC
4182 break;
4183 }
4184
9fb71ee4
NC
4185 if (result != NULL)
4186 return result;
4187
4188 sprintf (buff, "LOUSER+%#x", sh_type - SHT_LOUSER);
685080f2 4189 }
252b5132 4190 else
a7dbfd1c
NC
4191 /* This message is probably going to be displayed in a 15
4192 character wide field, so put the hex value first. */
4193 snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
103f02d3 4194
252b5132
RH
4195 return buff;
4196 }
4197}
4198
2979dc34 4199#define OPTION_DEBUG_DUMP 512
2c610e4b 4200#define OPTION_DYN_SYMS 513
fd2f0033
TT
4201#define OPTION_DWARF_DEPTH 514
4202#define OPTION_DWARF_START 515
4723351a 4203#define OPTION_DWARF_CHECK 516
2979dc34 4204
85b1c36d 4205static struct option options[] =
252b5132 4206{
b34976b6 4207 {"all", no_argument, 0, 'a'},
252b5132
RH
4208 {"file-header", no_argument, 0, 'h'},
4209 {"program-headers", no_argument, 0, 'l'},
b34976b6
AM
4210 {"headers", no_argument, 0, 'e'},
4211 {"histogram", no_argument, 0, 'I'},
4212 {"segments", no_argument, 0, 'l'},
4213 {"sections", no_argument, 0, 'S'},
252b5132 4214 {"section-headers", no_argument, 0, 'S'},
f5842774 4215 {"section-groups", no_argument, 0, 'g'},
5477e8a0 4216 {"section-details", no_argument, 0, 't'},
595cf52e 4217 {"full-section-name",no_argument, 0, 'N'},
b34976b6
AM
4218 {"symbols", no_argument, 0, 's'},
4219 {"syms", no_argument, 0, 's'},
2c610e4b 4220 {"dyn-syms", no_argument, 0, OPTION_DYN_SYMS},
b34976b6
AM
4221 {"relocs", no_argument, 0, 'r'},
4222 {"notes", no_argument, 0, 'n'},
4223 {"dynamic", no_argument, 0, 'd'},
a952a375 4224 {"arch-specific", no_argument, 0, 'A'},
252b5132
RH
4225 {"version-info", no_argument, 0, 'V'},
4226 {"use-dynamic", no_argument, 0, 'D'},
09c11c86 4227 {"unwind", no_argument, 0, 'u'},
4145f1d5 4228 {"archive-index", no_argument, 0, 'c'},
b34976b6 4229 {"hex-dump", required_argument, 0, 'x'},
cf13d699 4230 {"relocated-dump", required_argument, 0, 'R'},
09c11c86 4231 {"string-dump", required_argument, 0, 'p'},
0e602686 4232 {"decompress", no_argument, 0, 'z'},
252b5132
RH
4233#ifdef SUPPORT_DISASSEMBLY
4234 {"instruction-dump", required_argument, 0, 'i'},
4235#endif
cf13d699 4236 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
252b5132 4237
fd2f0033
TT
4238 {"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH},
4239 {"dwarf-start", required_argument, 0, OPTION_DWARF_START},
4723351a 4240 {"dwarf-check", no_argument, 0, OPTION_DWARF_CHECK},
fd2f0033 4241
b34976b6
AM
4242 {"version", no_argument, 0, 'v'},
4243 {"wide", no_argument, 0, 'W'},
4244 {"help", no_argument, 0, 'H'},
4245 {0, no_argument, 0, 0}
252b5132
RH
4246};
4247
4248static void
2cf0635d 4249usage (FILE * stream)
252b5132 4250{
92f01d61
JM
4251 fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
4252 fprintf (stream, _(" Display information about the contents of ELF format files\n"));
4253 fprintf (stream, _(" Options are:\n\
8b53311e
NC
4254 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4255 -h --file-header Display the ELF file header\n\
4256 -l --program-headers Display the program headers\n\
4257 --segments An alias for --program-headers\n\
4258 -S --section-headers Display the sections' header\n\
4259 --sections An alias for --section-headers\n\
f5842774 4260 -g --section-groups Display the section groups\n\
5477e8a0 4261 -t --section-details Display the section details\n\
8b53311e
NC
4262 -e --headers Equivalent to: -h -l -S\n\
4263 -s --syms Display the symbol table\n\
3f08eb35 4264 --symbols An alias for --syms\n\
2c610e4b 4265 --dyn-syms Display the dynamic symbol table\n\
8b53311e
NC
4266 -n --notes Display the core notes (if present)\n\
4267 -r --relocs Display the relocations (if present)\n\
4268 -u --unwind Display the unwind info (if present)\n\
b2d38a17 4269 -d --dynamic Display the dynamic section (if present)\n\
8b53311e 4270 -V --version-info Display the version sections (if present)\n\
1b31d05e 4271 -A --arch-specific Display architecture specific information (if any)\n\
4145f1d5 4272 -c --archive-index Display the symbol/file index in an archive\n\
8b53311e 4273 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
09c11c86
NC
4274 -x --hex-dump=<number|name>\n\
4275 Dump the contents of section <number|name> as bytes\n\
4276 -p --string-dump=<number|name>\n\
4277 Dump the contents of section <number|name> as strings\n\
cf13d699
NC
4278 -R --relocated-dump=<number|name>\n\
4279 Dump the contents of section <number|name> as relocated bytes\n\
0e602686 4280 -z --decompress Decompress section before dumping it\n\
f9f0e732 4281 -w[lLiaprmfFsoRt] or\n\
1ed06042 4282 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
6f875884 4283 =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
657d0d47
CC
4284 =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4285 =addr,=cu_index]\n\
8b53311e 4286 Display the contents of DWARF2 debug sections\n"));
fd2f0033
TT
4287 fprintf (stream, _("\
4288 --dwarf-depth=N Do not display DIEs at depth N or greater\n\
4289 --dwarf-start=N Display DIEs starting with N, at the same depth\n\
4290 or deeper\n"));
252b5132 4291#ifdef SUPPORT_DISASSEMBLY
92f01d61 4292 fprintf (stream, _("\
09c11c86
NC
4293 -i --instruction-dump=<number|name>\n\
4294 Disassemble the contents of section <number|name>\n"));
252b5132 4295#endif
92f01d61 4296 fprintf (stream, _("\
8b53311e
NC
4297 -I --histogram Display histogram of bucket list lengths\n\
4298 -W --wide Allow output width to exceed 80 characters\n\
07012eee 4299 @<file> Read options from <file>\n\
8b53311e
NC
4300 -H --help Display this information\n\
4301 -v --version Display the version number of readelf\n"));
1118d252 4302
92f01d61
JM
4303 if (REPORT_BUGS_TO[0] && stream == stdout)
4304 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
252b5132 4305
92f01d61 4306 exit (stream == stdout ? 0 : 1);
252b5132
RH
4307}
4308
18bd398b
NC
4309/* Record the fact that the user wants the contents of section number
4310 SECTION to be displayed using the method(s) encoded as flags bits
4311 in TYPE. Note, TYPE can be zero if we are creating the array for
4312 the first time. */
4313
252b5132 4314static void
09c11c86 4315request_dump_bynumber (unsigned int section, dump_type type)
252b5132
RH
4316{
4317 if (section >= num_dump_sects)
4318 {
2cf0635d 4319 dump_type * new_dump_sects;
252b5132 4320
3f5e193b
NC
4321 new_dump_sects = (dump_type *) calloc (section + 1,
4322 sizeof (* dump_sects));
252b5132
RH
4323
4324 if (new_dump_sects == NULL)
591a748a 4325 error (_("Out of memory allocating dump request table.\n"));
252b5132
RH
4326 else
4327 {
21b65bac
NC
4328 if (dump_sects)
4329 {
4330 /* Copy current flag settings. */
4331 memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
252b5132 4332
21b65bac
NC
4333 free (dump_sects);
4334 }
252b5132
RH
4335
4336 dump_sects = new_dump_sects;
4337 num_dump_sects = section + 1;
4338 }
4339 }
4340
4341 if (dump_sects)
b34976b6 4342 dump_sects[section] |= type;
252b5132
RH
4343
4344 return;
4345}
4346
aef1f6d0
DJ
4347/* Request a dump by section name. */
4348
4349static void
2cf0635d 4350request_dump_byname (const char * section, dump_type type)
aef1f6d0 4351{
2cf0635d 4352 struct dump_list_entry * new_request;
aef1f6d0 4353
3f5e193b
NC
4354 new_request = (struct dump_list_entry *)
4355 malloc (sizeof (struct dump_list_entry));
aef1f6d0 4356 if (!new_request)
591a748a 4357 error (_("Out of memory allocating dump request table.\n"));
aef1f6d0
DJ
4358
4359 new_request->name = strdup (section);
4360 if (!new_request->name)
591a748a 4361 error (_("Out of memory allocating dump request table.\n"));
aef1f6d0
DJ
4362
4363 new_request->type = type;
4364
4365 new_request->next = dump_sects_byname;
4366 dump_sects_byname = new_request;
4367}
4368
cf13d699
NC
4369static inline void
4370request_dump (dump_type type)
4371{
4372 int section;
4373 char * cp;
4374
4375 do_dump++;
4376 section = strtoul (optarg, & cp, 0);
4377
4378 if (! *cp && section >= 0)
4379 request_dump_bynumber (section, type);
4380 else
4381 request_dump_byname (optarg, type);
4382}
4383
4384
252b5132 4385static void
2cf0635d 4386parse_args (int argc, char ** argv)
252b5132
RH
4387{
4388 int c;
4389
4390 if (argc < 2)
92f01d61 4391 usage (stderr);
252b5132
RH
4392
4393 while ((c = getopt_long
0e602686 4394 (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
252b5132 4395 {
252b5132
RH
4396 switch (c)
4397 {
4398 case 0:
4399 /* Long options. */
4400 break;
4401 case 'H':
92f01d61 4402 usage (stdout);
252b5132
RH
4403 break;
4404
4405 case 'a':
32ec8896
NC
4406 do_syms = TRUE;
4407 do_reloc = TRUE;
4408 do_unwind = TRUE;
4409 do_dynamic = TRUE;
4410 do_header = TRUE;
4411 do_sections = TRUE;
4412 do_section_groups = TRUE;
4413 do_segments = TRUE;
4414 do_version = TRUE;
4415 do_histogram = TRUE;
4416 do_arch = TRUE;
4417 do_notes = TRUE;
252b5132 4418 break;
f5842774 4419 case 'g':
32ec8896 4420 do_section_groups = TRUE;
f5842774 4421 break;
5477e8a0 4422 case 't':
595cf52e 4423 case 'N':
32ec8896
NC
4424 do_sections = TRUE;
4425 do_section_details = TRUE;
595cf52e 4426 break;
252b5132 4427 case 'e':
32ec8896
NC
4428 do_header = TRUE;
4429 do_sections = TRUE;
4430 do_segments = TRUE;
252b5132 4431 break;
a952a375 4432 case 'A':
32ec8896 4433 do_arch = TRUE;
a952a375 4434 break;
252b5132 4435 case 'D':
32ec8896 4436 do_using_dynamic = TRUE;
252b5132
RH
4437 break;
4438 case 'r':
32ec8896 4439 do_reloc = TRUE;
252b5132 4440 break;
4d6ed7c8 4441 case 'u':
32ec8896 4442 do_unwind = TRUE;
4d6ed7c8 4443 break;
252b5132 4444 case 'h':
32ec8896 4445 do_header = TRUE;
252b5132
RH
4446 break;
4447 case 'l':
32ec8896 4448 do_segments = TRUE;
252b5132
RH
4449 break;
4450 case 's':
32ec8896 4451 do_syms = TRUE;
252b5132
RH
4452 break;
4453 case 'S':
32ec8896 4454 do_sections = TRUE;
252b5132
RH
4455 break;
4456 case 'd':
32ec8896 4457 do_dynamic = TRUE;
252b5132 4458 break;
a952a375 4459 case 'I':
32ec8896 4460 do_histogram = TRUE;
a952a375 4461 break;
779fe533 4462 case 'n':
32ec8896 4463 do_notes = TRUE;
779fe533 4464 break;
4145f1d5 4465 case 'c':
32ec8896 4466 do_archive_index = TRUE;
4145f1d5 4467 break;
252b5132 4468 case 'x':
cf13d699 4469 request_dump (HEX_DUMP);
aef1f6d0 4470 break;
09c11c86 4471 case 'p':
cf13d699
NC
4472 request_dump (STRING_DUMP);
4473 break;
4474 case 'R':
4475 request_dump (RELOC_DUMP);
09c11c86 4476 break;
0e602686 4477 case 'z':
32ec8896 4478 decompress_dumps = TRUE;
0e602686 4479 break;
252b5132 4480 case 'w':
32ec8896 4481 do_dump = TRUE;
252b5132 4482 if (optarg == 0)
613ff48b 4483 {
32ec8896 4484 do_debugging = TRUE;
613ff48b
CC
4485 dwarf_select_sections_all ();
4486 }
252b5132
RH
4487 else
4488 {
32ec8896 4489 do_debugging = FALSE;
4cb93e3b 4490 dwarf_select_sections_by_letters (optarg);
252b5132
RH
4491 }
4492 break;
2979dc34 4493 case OPTION_DEBUG_DUMP:
32ec8896 4494 do_dump = TRUE;
2979dc34 4495 if (optarg == 0)
32ec8896 4496 do_debugging = TRUE;
2979dc34
JJ
4497 else
4498 {
32ec8896 4499 do_debugging = FALSE;
4cb93e3b 4500 dwarf_select_sections_by_names (optarg);
2979dc34
JJ
4501 }
4502 break;
fd2f0033
TT
4503 case OPTION_DWARF_DEPTH:
4504 {
4505 char *cp;
4506
4507 dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4508 }
4509 break;
4510 case OPTION_DWARF_START:
4511 {
4512 char *cp;
4513
4514 dwarf_start_die = strtoul (optarg, & cp, 0);
4515 }
4516 break;
4723351a 4517 case OPTION_DWARF_CHECK:
32ec8896 4518 dwarf_check = TRUE;
4723351a 4519 break;
2c610e4b 4520 case OPTION_DYN_SYMS:
32ec8896 4521 do_dyn_syms = TRUE;
2c610e4b 4522 break;
252b5132
RH
4523#ifdef SUPPORT_DISASSEMBLY
4524 case 'i':
cf13d699
NC
4525 request_dump (DISASS_DUMP);
4526 break;
252b5132
RH
4527#endif
4528 case 'v':
4529 print_version (program_name);
4530 break;
4531 case 'V':
32ec8896 4532 do_version = TRUE;
252b5132 4533 break;
d974e256 4534 case 'W':
32ec8896 4535 do_wide = TRUE;
d974e256 4536 break;
252b5132 4537 default:
252b5132
RH
4538 /* xgettext:c-format */
4539 error (_("Invalid option '-%c'\n"), c);
1a0670f3 4540 /* Fall through. */
252b5132 4541 case '?':
92f01d61 4542 usage (stderr);
252b5132
RH
4543 }
4544 }
4545
4d6ed7c8 4546 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
252b5132 4547 && !do_segments && !do_header && !do_dump && !do_version
f5842774 4548 && !do_histogram && !do_debugging && !do_arch && !do_notes
2c610e4b
L
4549 && !do_section_groups && !do_archive_index
4550 && !do_dyn_syms)
92f01d61 4551 usage (stderr);
252b5132
RH
4552}
4553
4554static const char *
d3ba0551 4555get_elf_class (unsigned int elf_class)
252b5132 4556{
b34976b6 4557 static char buff[32];
103f02d3 4558
252b5132
RH
4559 switch (elf_class)
4560 {
4561 case ELFCLASSNONE: return _("none");
e3c8793a
NC
4562 case ELFCLASS32: return "ELF32";
4563 case ELFCLASS64: return "ELF64";
ab5e7794 4564 default:
e9e44622 4565 snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
ab5e7794 4566 return buff;
252b5132
RH
4567 }
4568}
4569
4570static const char *
d3ba0551 4571get_data_encoding (unsigned int encoding)
252b5132 4572{
b34976b6 4573 static char buff[32];
103f02d3 4574
252b5132
RH
4575 switch (encoding)
4576 {
4577 case ELFDATANONE: return _("none");
33c63f9d
CM
4578 case ELFDATA2LSB: return _("2's complement, little endian");
4579 case ELFDATA2MSB: return _("2's complement, big endian");
103f02d3 4580 default:
e9e44622 4581 snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
ab5e7794 4582 return buff;
252b5132
RH
4583 }
4584}
4585
252b5132 4586/* Decode the data held in 'elf_header'. */
ee42cf8c 4587
32ec8896 4588static bfd_boolean
d3ba0551 4589process_file_header (void)
252b5132 4590{
b34976b6
AM
4591 if ( elf_header.e_ident[EI_MAG0] != ELFMAG0
4592 || elf_header.e_ident[EI_MAG1] != ELFMAG1
4593 || elf_header.e_ident[EI_MAG2] != ELFMAG2
4594 || elf_header.e_ident[EI_MAG3] != ELFMAG3)
252b5132
RH
4595 {
4596 error
4597 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
32ec8896 4598 return FALSE;
252b5132
RH
4599 }
4600
2dc4cec1
L
4601 init_dwarf_regnames (elf_header.e_machine);
4602
252b5132
RH
4603 if (do_header)
4604 {
32ec8896 4605 unsigned i;
252b5132
RH
4606
4607 printf (_("ELF Header:\n"));
4608 printf (_(" Magic: "));
b34976b6
AM
4609 for (i = 0; i < EI_NIDENT; i++)
4610 printf ("%2.2x ", elf_header.e_ident[i]);
252b5132
RH
4611 printf ("\n");
4612 printf (_(" Class: %s\n"),
b34976b6 4613 get_elf_class (elf_header.e_ident[EI_CLASS]));
252b5132 4614 printf (_(" Data: %s\n"),
b34976b6 4615 get_data_encoding (elf_header.e_ident[EI_DATA]));
252b5132 4616 printf (_(" Version: %d %s\n"),
b34976b6
AM
4617 elf_header.e_ident[EI_VERSION],
4618 (elf_header.e_ident[EI_VERSION] == EV_CURRENT
789be9f7 4619 ? "(current)"
b34976b6 4620 : (elf_header.e_ident[EI_VERSION] != EV_NONE
2b692964 4621 ? _("<unknown: %lx>")
789be9f7 4622 : "")));
252b5132 4623 printf (_(" OS/ABI: %s\n"),
b34976b6 4624 get_osabi_name (elf_header.e_ident[EI_OSABI]));
252b5132 4625 printf (_(" ABI Version: %d\n"),
b34976b6 4626 elf_header.e_ident[EI_ABIVERSION]);
252b5132
RH
4627 printf (_(" Type: %s\n"),
4628 get_file_type (elf_header.e_type));
4629 printf (_(" Machine: %s\n"),
4630 get_machine_name (elf_header.e_machine));
4631 printf (_(" Version: 0x%lx\n"),
4632 (unsigned long) elf_header.e_version);
76da6bbe 4633
f7a99963
NC
4634 printf (_(" Entry point address: "));
4635 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4636 printf (_("\n Start of program headers: "));
4637 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4638 printf (_(" (bytes into file)\n Start of section headers: "));
4639 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
4640 printf (_(" (bytes into file)\n"));
76da6bbe 4641
252b5132
RH
4642 printf (_(" Flags: 0x%lx%s\n"),
4643 (unsigned long) elf_header.e_flags,
4644 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
4645 printf (_(" Size of this header: %ld (bytes)\n"),
4646 (long) elf_header.e_ehsize);
4647 printf (_(" Size of program headers: %ld (bytes)\n"),
4648 (long) elf_header.e_phentsize);
2046a35d 4649 printf (_(" Number of program headers: %ld"),
252b5132 4650 (long) elf_header.e_phnum);
2046a35d
AM
4651 if (section_headers != NULL
4652 && elf_header.e_phnum == PN_XNUM
4653 && section_headers[0].sh_info != 0)
cc5914eb 4654 printf (" (%ld)", (long) section_headers[0].sh_info);
2046a35d 4655 putc ('\n', stdout);
252b5132
RH
4656 printf (_(" Size of section headers: %ld (bytes)\n"),
4657 (long) elf_header.e_shentsize);
560f3c1c 4658 printf (_(" Number of section headers: %ld"),
252b5132 4659 (long) elf_header.e_shnum);
4fbb74a6 4660 if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
560f3c1c
AM
4661 printf (" (%ld)", (long) section_headers[0].sh_size);
4662 putc ('\n', stdout);
4663 printf (_(" Section header string table index: %ld"),
252b5132 4664 (long) elf_header.e_shstrndx);
4fbb74a6
AM
4665 if (section_headers != NULL
4666 && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
72de5009 4667 printf (" (%u)", section_headers[0].sh_link);
15ba6505
AM
4668 else if (elf_header.e_shstrndx != SHN_UNDEF
4669 && elf_header.e_shstrndx >= elf_header.e_shnum)
2b692964 4670 printf (_(" <corrupt: out of range>"));
560f3c1c
AM
4671 putc ('\n', stdout);
4672 }
4673
4674 if (section_headers != NULL)
4675 {
2046a35d
AM
4676 if (elf_header.e_phnum == PN_XNUM
4677 && section_headers[0].sh_info != 0)
4678 elf_header.e_phnum = section_headers[0].sh_info;
4fbb74a6 4679 if (elf_header.e_shnum == SHN_UNDEF)
560f3c1c 4680 elf_header.e_shnum = section_headers[0].sh_size;
4fbb74a6 4681 if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
560f3c1c 4682 elf_header.e_shstrndx = section_headers[0].sh_link;
4fbb74a6 4683 else if (elf_header.e_shstrndx >= elf_header.e_shnum)
0b49d371 4684 elf_header.e_shstrndx = SHN_UNDEF;
560f3c1c
AM
4685 free (section_headers);
4686 section_headers = NULL;
252b5132 4687 }
103f02d3 4688
32ec8896 4689 return TRUE;
9ea033b2
NC
4690}
4691
e0a31db1 4692static bfd_boolean
91d6fa6a 4693get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
9ea033b2 4694{
2cf0635d
NC
4695 Elf32_External_Phdr * phdrs;
4696 Elf32_External_Phdr * external;
4697 Elf_Internal_Phdr * internal;
b34976b6 4698 unsigned int i;
e0a31db1
NC
4699 unsigned int size = elf_header.e_phentsize;
4700 unsigned int num = elf_header.e_phnum;
4701
4702 /* PR binutils/17531: Cope with unexpected section header sizes. */
4703 if (size == 0 || num == 0)
4704 return FALSE;
4705 if (size < sizeof * phdrs)
4706 {
4707 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4708 return FALSE;
4709 }
4710 if (size > sizeof * phdrs)
4711 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
103f02d3 4712
3f5e193b 4713 phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
e0a31db1
NC
4714 size, num, _("program headers"));
4715 if (phdrs == NULL)
4716 return FALSE;
9ea033b2 4717
91d6fa6a 4718 for (i = 0, internal = pheaders, external = phdrs;
9ea033b2 4719 i < elf_header.e_phnum;
b34976b6 4720 i++, internal++, external++)
252b5132 4721 {
9ea033b2
NC
4722 internal->p_type = BYTE_GET (external->p_type);
4723 internal->p_offset = BYTE_GET (external->p_offset);
4724 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4725 internal->p_paddr = BYTE_GET (external->p_paddr);
4726 internal->p_filesz = BYTE_GET (external->p_filesz);
4727 internal->p_memsz = BYTE_GET (external->p_memsz);
4728 internal->p_flags = BYTE_GET (external->p_flags);
4729 internal->p_align = BYTE_GET (external->p_align);
252b5132
RH
4730 }
4731
9ea033b2 4732 free (phdrs);
e0a31db1 4733 return TRUE;
252b5132
RH
4734}
4735
e0a31db1 4736static bfd_boolean
91d6fa6a 4737get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
9ea033b2 4738{
2cf0635d
NC
4739 Elf64_External_Phdr * phdrs;
4740 Elf64_External_Phdr * external;
4741 Elf_Internal_Phdr * internal;
b34976b6 4742 unsigned int i;
e0a31db1
NC
4743 unsigned int size = elf_header.e_phentsize;
4744 unsigned int num = elf_header.e_phnum;
4745
4746 /* PR binutils/17531: Cope with unexpected section header sizes. */
4747 if (size == 0 || num == 0)
4748 return FALSE;
4749 if (size < sizeof * phdrs)
4750 {
4751 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4752 return FALSE;
4753 }
4754 if (size > sizeof * phdrs)
4755 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
103f02d3 4756
3f5e193b 4757 phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
e0a31db1 4758 size, num, _("program headers"));
a6e9f9df 4759 if (!phdrs)
e0a31db1 4760 return FALSE;
9ea033b2 4761
91d6fa6a 4762 for (i = 0, internal = pheaders, external = phdrs;
9ea033b2 4763 i < elf_header.e_phnum;
b34976b6 4764 i++, internal++, external++)
9ea033b2
NC
4765 {
4766 internal->p_type = BYTE_GET (external->p_type);
4767 internal->p_flags = BYTE_GET (external->p_flags);
66543521
AM
4768 internal->p_offset = BYTE_GET (external->p_offset);
4769 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4770 internal->p_paddr = BYTE_GET (external->p_paddr);
4771 internal->p_filesz = BYTE_GET (external->p_filesz);
4772 internal->p_memsz = BYTE_GET (external->p_memsz);
4773 internal->p_align = BYTE_GET (external->p_align);
9ea033b2
NC
4774 }
4775
4776 free (phdrs);
e0a31db1 4777 return TRUE;
9ea033b2 4778}
252b5132 4779
32ec8896 4780/* Returns TRUE if the program headers were read into `program_headers'. */
d93f0186 4781
32ec8896 4782static bfd_boolean
2cf0635d 4783get_program_headers (FILE * file)
d93f0186 4784{
2cf0635d 4785 Elf_Internal_Phdr * phdrs;
d93f0186
NC
4786
4787 /* Check cache of prior read. */
4788 if (program_headers != NULL)
32ec8896 4789 return TRUE;
d93f0186 4790
3f5e193b
NC
4791 phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
4792 sizeof (Elf_Internal_Phdr));
d93f0186
NC
4793
4794 if (phdrs == NULL)
4795 {
8b73c356
NC
4796 error (_("Out of memory reading %u program headers\n"),
4797 elf_header.e_phnum);
32ec8896 4798 return FALSE;
d93f0186
NC
4799 }
4800
4801 if (is_32bit_elf
4802 ? get_32bit_program_headers (file, phdrs)
4803 : get_64bit_program_headers (file, phdrs))
4804 {
4805 program_headers = phdrs;
32ec8896 4806 return TRUE;
d93f0186
NC
4807 }
4808
4809 free (phdrs);
32ec8896 4810 return FALSE;
d93f0186
NC
4811}
4812
32ec8896 4813/* Returns TRUE if the program headers were loaded. */
2f62977e 4814
32ec8896 4815static bfd_boolean
2cf0635d 4816process_program_headers (FILE * file)
252b5132 4817{
2cf0635d 4818 Elf_Internal_Phdr * segment;
b34976b6 4819 unsigned int i;
1a9ccd70 4820 Elf_Internal_Phdr * previous_load = NULL;
252b5132
RH
4821
4822 if (elf_header.e_phnum == 0)
4823 {
82f2dbf7
NC
4824 /* PR binutils/12467. */
4825 if (elf_header.e_phoff != 0)
32ec8896
NC
4826 {
4827 warn (_("possibly corrupt ELF header - it has a non-zero program"
4828 " header offset, but no program headers\n"));
4829 return FALSE;
4830 }
82f2dbf7 4831 else if (do_segments)
252b5132 4832 printf (_("\nThere are no program headers in this file.\n"));
32ec8896 4833 return TRUE;
252b5132
RH
4834 }
4835
4836 if (do_segments && !do_header)
4837 {
f7a99963
NC
4838 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
4839 printf (_("Entry point "));
4840 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4841 printf (_("\nThere are %d program headers, starting at offset "),
4842 elf_header.e_phnum);
4843 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4844 printf ("\n");
252b5132
RH
4845 }
4846
d93f0186 4847 if (! get_program_headers (file))
6b4bf3bc 4848 return TRUE;
103f02d3 4849
252b5132
RH
4850 if (do_segments)
4851 {
3a1a2036
NC
4852 if (elf_header.e_phnum > 1)
4853 printf (_("\nProgram Headers:\n"));
4854 else
4855 printf (_("\nProgram Headers:\n"));
76da6bbe 4856
f7a99963
NC
4857 if (is_32bit_elf)
4858 printf
4859 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
d974e256
JJ
4860 else if (do_wide)
4861 printf
4862 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
f7a99963
NC
4863 else
4864 {
4865 printf
4866 (_(" Type Offset VirtAddr PhysAddr\n"));
4867 printf
4868 (_(" FileSiz MemSiz Flags Align\n"));
4869 }
252b5132
RH
4870 }
4871
252b5132 4872 dynamic_addr = 0;
1b228002 4873 dynamic_size = 0;
252b5132
RH
4874
4875 for (i = 0, segment = program_headers;
4876 i < elf_header.e_phnum;
b34976b6 4877 i++, segment++)
252b5132
RH
4878 {
4879 if (do_segments)
4880 {
103f02d3 4881 printf (" %-14.14s ", get_segment_type (segment->p_type));
f7a99963
NC
4882
4883 if (is_32bit_elf)
4884 {
4885 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4886 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
4887 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
4888 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
4889 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
4890 printf ("%c%c%c ",
4891 (segment->p_flags & PF_R ? 'R' : ' '),
4892 (segment->p_flags & PF_W ? 'W' : ' '),
4893 (segment->p_flags & PF_X ? 'E' : ' '));
4894 printf ("%#lx", (unsigned long) segment->p_align);
4895 }
d974e256
JJ
4896 else if (do_wide)
4897 {
4898 if ((unsigned long) segment->p_offset == segment->p_offset)
4899 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4900 else
4901 {
4902 print_vma (segment->p_offset, FULL_HEX);
4903 putchar (' ');
4904 }
4905
4906 print_vma (segment->p_vaddr, FULL_HEX);
4907 putchar (' ');
4908 print_vma (segment->p_paddr, FULL_HEX);
4909 putchar (' ');
4910
4911 if ((unsigned long) segment->p_filesz == segment->p_filesz)
4912 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
4913 else
4914 {
4915 print_vma (segment->p_filesz, FULL_HEX);
4916 putchar (' ');
4917 }
4918
4919 if ((unsigned long) segment->p_memsz == segment->p_memsz)
4920 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
4921 else
4922 {
f48e6c45 4923 print_vma (segment->p_memsz, FULL_HEX);
d974e256
JJ
4924 }
4925
4926 printf (" %c%c%c ",
4927 (segment->p_flags & PF_R ? 'R' : ' '),
4928 (segment->p_flags & PF_W ? 'W' : ' '),
4929 (segment->p_flags & PF_X ? 'E' : ' '));
4930
4931 if ((unsigned long) segment->p_align == segment->p_align)
4932 printf ("%#lx", (unsigned long) segment->p_align);
4933 else
4934 {
4935 print_vma (segment->p_align, PREFIX_HEX);
4936 }
4937 }
f7a99963
NC
4938 else
4939 {
4940 print_vma (segment->p_offset, FULL_HEX);
4941 putchar (' ');
4942 print_vma (segment->p_vaddr, FULL_HEX);
4943 putchar (' ');
4944 print_vma (segment->p_paddr, FULL_HEX);
4945 printf ("\n ");
4946 print_vma (segment->p_filesz, FULL_HEX);
4947 putchar (' ');
4948 print_vma (segment->p_memsz, FULL_HEX);
4949 printf (" %c%c%c ",
4950 (segment->p_flags & PF_R ? 'R' : ' '),
4951 (segment->p_flags & PF_W ? 'W' : ' '),
4952 (segment->p_flags & PF_X ? 'E' : ' '));
1d262527 4953 print_vma (segment->p_align, PREFIX_HEX);
f7a99963 4954 }
252b5132 4955
1a9ccd70
NC
4956 putc ('\n', stdout);
4957 }
f54498b4 4958
252b5132
RH
4959 switch (segment->p_type)
4960 {
1a9ccd70 4961 case PT_LOAD:
502d895c
NC
4962#if 0 /* Do not warn about out of order PT_LOAD segments. Although officially
4963 required by the ELF standard, several programs, including the Linux
4964 kernel, make use of non-ordered segments. */
1a9ccd70
NC
4965 if (previous_load
4966 && previous_load->p_vaddr > segment->p_vaddr)
4967 error (_("LOAD segments must be sorted in order of increasing VirtAddr\n"));
502d895c 4968#endif
1a9ccd70
NC
4969 if (segment->p_memsz < segment->p_filesz)
4970 error (_("the segment's file size is larger than its memory size\n"));
4971 previous_load = segment;
4972 break;
4973
4974 case PT_PHDR:
4975 /* PR 20815 - Verify that the program header is loaded into memory. */
4976 if (i > 0 && previous_load != NULL)
4977 error (_("the PHDR segment must occur before any LOAD segment\n"));
4978 if (elf_header.e_machine != EM_PARISC)
4979 {
4980 unsigned int j;
4981
4982 for (j = 1; j < elf_header.e_phnum; j++)
4983 if (program_headers[j].p_vaddr <= segment->p_vaddr
4984 && (program_headers[j].p_vaddr + program_headers[j].p_memsz)
4985 >= (segment->p_vaddr + segment->p_filesz))
4986 break;
4987 if (j == elf_header.e_phnum)
4988 error (_("the PHDR segment is not covered by a LOAD segment\n"));
4989 }
4990 break;
4991
252b5132
RH
4992 case PT_DYNAMIC:
4993 if (dynamic_addr)
4994 error (_("more than one dynamic segment\n"));
4995
20737c13
AM
4996 /* By default, assume that the .dynamic section is the first
4997 section in the DYNAMIC segment. */
4998 dynamic_addr = segment->p_offset;
4999 dynamic_size = segment->p_filesz;
5000
b2d38a17
NC
5001 /* Try to locate the .dynamic section. If there is
5002 a section header table, we can easily locate it. */
5003 if (section_headers != NULL)
5004 {
2cf0635d 5005 Elf_Internal_Shdr * sec;
b2d38a17 5006
89fac5e3
RS
5007 sec = find_section (".dynamic");
5008 if (sec == NULL || sec->sh_size == 0)
b2d38a17 5009 {
28f997cf
TG
5010 /* A corresponding .dynamic section is expected, but on
5011 IA-64/OpenVMS it is OK for it to be missing. */
5012 if (!is_ia64_vms ())
5013 error (_("no .dynamic section in the dynamic segment\n"));
b2d38a17
NC
5014 break;
5015 }
5016
42bb2e33 5017 if (sec->sh_type == SHT_NOBITS)
20737c13
AM
5018 {
5019 dynamic_size = 0;
5020 break;
5021 }
42bb2e33 5022
b2d38a17
NC
5023 dynamic_addr = sec->sh_offset;
5024 dynamic_size = sec->sh_size;
5025
5026 if (dynamic_addr < segment->p_offset
5027 || dynamic_addr > segment->p_offset + segment->p_filesz)
20737c13
AM
5028 warn (_("the .dynamic section is not contained"
5029 " within the dynamic segment\n"));
b2d38a17 5030 else if (dynamic_addr > segment->p_offset)
20737c13
AM
5031 warn (_("the .dynamic section is not the first section"
5032 " in the dynamic segment.\n"));
b2d38a17 5033 }
39e224f6
MW
5034
5035 /* PR binutils/17512: Avoid corrupt dynamic section info in the
5036 segment. Check this after matching against the section headers
5037 so we don't warn on debuginfo file (which have NOBITS .dynamic
5038 sections). */
5039 if (dynamic_addr + dynamic_size >= current_file_size)
5040 {
5041 error (_("the dynamic segment offset + size exceeds the size of the file\n"));
5042 dynamic_addr = dynamic_size = 0;
5043 }
252b5132
RH
5044 break;
5045
5046 case PT_INTERP:
fb52b2f4
NC
5047 if (fseek (file, archive_file_offset + (long) segment->p_offset,
5048 SEEK_SET))
252b5132
RH
5049 error (_("Unable to find program interpreter name\n"));
5050 else
5051 {
f8eae8b2 5052 char fmt [32];
9495b2e6 5053 int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
f8eae8b2
L
5054
5055 if (ret >= (int) sizeof (fmt) || ret < 0)
591a748a 5056 error (_("Internal error: failed to create format string to display program interpreter\n"));
f8eae8b2 5057
252b5132 5058 program_interpreter[0] = 0;
7bd7b3ef
AM
5059 if (fscanf (file, fmt, program_interpreter) <= 0)
5060 error (_("Unable to read program interpreter name\n"));
252b5132
RH
5061
5062 if (do_segments)
f54498b4 5063 printf (_(" [Requesting program interpreter: %s]\n"),
252b5132
RH
5064 program_interpreter);
5065 }
5066 break;
5067 }
252b5132
RH
5068 }
5069
c256ffe7 5070 if (do_segments && section_headers != NULL && string_table != NULL)
252b5132
RH
5071 {
5072 printf (_("\n Section to Segment mapping:\n"));
5073 printf (_(" Segment Sections...\n"));
5074
252b5132
RH
5075 for (i = 0; i < elf_header.e_phnum; i++)
5076 {
9ad5cbcf 5077 unsigned int j;
2cf0635d 5078 Elf_Internal_Shdr * section;
252b5132
RH
5079
5080 segment = program_headers + i;
b391a3e3 5081 section = section_headers + 1;
252b5132
RH
5082
5083 printf (" %2.2d ", i);
5084
b34976b6 5085 for (j = 1; j < elf_header.e_shnum; j++, section++)
252b5132 5086 {
f4638467
AM
5087 if (!ELF_TBSS_SPECIAL (section, segment)
5088 && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
74e1a04b 5089 printf ("%s ", printable_section_name (section));
252b5132
RH
5090 }
5091
5092 putc ('\n',stdout);
5093 }
5094 }
5095
32ec8896 5096 return TRUE;
252b5132
RH
5097}
5098
5099
d93f0186
NC
5100/* Find the file offset corresponding to VMA by using the program headers. */
5101
5102static long
2cf0635d 5103offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
d93f0186 5104{
2cf0635d 5105 Elf_Internal_Phdr * seg;
d93f0186
NC
5106
5107 if (! get_program_headers (file))
5108 {
5109 warn (_("Cannot interpret virtual addresses without program headers.\n"));
5110 return (long) vma;
5111 }
5112
5113 for (seg = program_headers;
5114 seg < program_headers + elf_header.e_phnum;
5115 ++seg)
5116 {
5117 if (seg->p_type != PT_LOAD)
5118 continue;
5119
5120 if (vma >= (seg->p_vaddr & -seg->p_align)
5121 && vma + size <= seg->p_vaddr + seg->p_filesz)
5122 return vma - seg->p_vaddr + seg->p_offset;
5123 }
5124
5125 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
0af1713e 5126 (unsigned long) vma);
d93f0186
NC
5127 return (long) vma;
5128}
5129
5130
049b0c3a
NC
5131/* Allocate memory and load the sections headers into the global pointer
5132 SECTION_HEADERS. If PROBE is true, this is just a probe and we do not
5133 generate any error messages if the load fails. */
5134
5135static bfd_boolean
5136get_32bit_section_headers (FILE * file, bfd_boolean probe)
252b5132 5137{
2cf0635d
NC
5138 Elf32_External_Shdr * shdrs;
5139 Elf_Internal_Shdr * internal;
b34976b6 5140 unsigned int i;
049b0c3a
NC
5141 unsigned int size = elf_header.e_shentsize;
5142 unsigned int num = probe ? 1 : elf_header.e_shnum;
5143
5144 /* PR binutils/17531: Cope with unexpected section header sizes. */
5145 if (size == 0 || num == 0)
5146 return FALSE;
5147 if (size < sizeof * shdrs)
5148 {
5149 if (! probe)
5150 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5151 return FALSE;
5152 }
5153 if (!probe && size > sizeof * shdrs)
5154 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
252b5132 5155
3f5e193b 5156 shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
049b0c3a
NC
5157 size, num,
5158 probe ? NULL : _("section headers"));
5159 if (shdrs == NULL)
5160 return FALSE;
252b5132 5161
049b0c3a
NC
5162 if (section_headers != NULL)
5163 free (section_headers);
3f5e193b
NC
5164 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
5165 sizeof (Elf_Internal_Shdr));
252b5132
RH
5166 if (section_headers == NULL)
5167 {
049b0c3a 5168 if (!probe)
8b73c356 5169 error (_("Out of memory reading %u section headers\n"), num);
049b0c3a 5170 return FALSE;
252b5132
RH
5171 }
5172
5173 for (i = 0, internal = section_headers;
560f3c1c 5174 i < num;
b34976b6 5175 i++, internal++)
252b5132
RH
5176 {
5177 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5178 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
5179 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5180 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5181 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5182 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5183 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5184 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5185 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5186 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
315350be
NC
5187 if (!probe && internal->sh_link > num)
5188 warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5189 if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5190 warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
252b5132
RH
5191 }
5192
5193 free (shdrs);
049b0c3a 5194 return TRUE;
252b5132
RH
5195}
5196
049b0c3a
NC
5197static bfd_boolean
5198get_64bit_section_headers (FILE * file, bfd_boolean probe)
9ea033b2 5199{
2cf0635d
NC
5200 Elf64_External_Shdr * shdrs;
5201 Elf_Internal_Shdr * internal;
b34976b6 5202 unsigned int i;
049b0c3a
NC
5203 unsigned int size = elf_header.e_shentsize;
5204 unsigned int num = probe ? 1 : elf_header.e_shnum;
5205
5206 /* PR binutils/17531: Cope with unexpected section header sizes. */
5207 if (size == 0 || num == 0)
5208 return FALSE;
5209 if (size < sizeof * shdrs)
5210 {
5211 if (! probe)
5212 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5213 return FALSE;
5214 }
5215 if (! probe && size > sizeof * shdrs)
5216 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
9ea033b2 5217
3f5e193b 5218 shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
049b0c3a
NC
5219 size, num,
5220 probe ? NULL : _("section headers"));
5221 if (shdrs == NULL)
5222 return FALSE;
9ea033b2 5223
049b0c3a
NC
5224 if (section_headers != NULL)
5225 free (section_headers);
3f5e193b
NC
5226 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
5227 sizeof (Elf_Internal_Shdr));
9ea033b2
NC
5228 if (section_headers == NULL)
5229 {
049b0c3a 5230 if (! probe)
8b73c356 5231 error (_("Out of memory reading %u section headers\n"), num);
049b0c3a 5232 return FALSE;
9ea033b2
NC
5233 }
5234
5235 for (i = 0, internal = section_headers;
560f3c1c 5236 i < num;
b34976b6 5237 i++, internal++)
9ea033b2
NC
5238 {
5239 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5240 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
66543521
AM
5241 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5242 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5243 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5244 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
9ea033b2
NC
5245 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5246 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5247 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5248 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
315350be
NC
5249 if (!probe && internal->sh_link > num)
5250 warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5251 if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5252 warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
9ea033b2
NC
5253 }
5254
5255 free (shdrs);
049b0c3a 5256 return TRUE;
9ea033b2
NC
5257}
5258
252b5132 5259static Elf_Internal_Sym *
ba5cdace
NC
5260get_32bit_elf_symbols (FILE * file,
5261 Elf_Internal_Shdr * section,
5262 unsigned long * num_syms_return)
252b5132 5263{
ba5cdace 5264 unsigned long number = 0;
dd24e3da 5265 Elf32_External_Sym * esyms = NULL;
ba5cdace 5266 Elf_External_Sym_Shndx * shndx = NULL;
dd24e3da 5267 Elf_Internal_Sym * isyms = NULL;
2cf0635d 5268 Elf_Internal_Sym * psym;
b34976b6 5269 unsigned int j;
252b5132 5270
c9c1d674
EG
5271 if (section->sh_size == 0)
5272 {
5273 if (num_syms_return != NULL)
5274 * num_syms_return = 0;
5275 return NULL;
5276 }
5277
dd24e3da 5278 /* Run some sanity checks first. */
c9c1d674 5279 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
dd24e3da 5280 {
c9c1d674
EG
5281 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5282 printable_section_name (section), (unsigned long) section->sh_entsize);
ba5cdace 5283 goto exit_point;
dd24e3da
NC
5284 }
5285
f54498b4
NC
5286 if (section->sh_size > current_file_size)
5287 {
5288 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
74e1a04b 5289 printable_section_name (section), (unsigned long) section->sh_size);
f54498b4
NC
5290 goto exit_point;
5291 }
5292
dd24e3da
NC
5293 number = section->sh_size / section->sh_entsize;
5294
5295 if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
5296 {
c9c1d674 5297 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
8066deb1
AM
5298 (unsigned long) section->sh_size,
5299 printable_section_name (section),
5300 (unsigned long) section->sh_entsize);
ba5cdace 5301 goto exit_point;
dd24e3da
NC
5302 }
5303
3f5e193b
NC
5304 esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5305 section->sh_size, _("symbols"));
dd24e3da 5306 if (esyms == NULL)
ba5cdace 5307 goto exit_point;
252b5132 5308
6a40cf0c
NC
5309 {
5310 elf_section_list * entry;
5311
5312 shndx = NULL;
5313 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5314 if (entry->hdr->sh_link == (unsigned long) (section - section_headers))
c9c1d674 5315 {
6a40cf0c
NC
5316 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5317 entry->hdr->sh_offset,
5318 1, entry->hdr->sh_size,
5319 _("symbol table section indicies"));
5320 if (shndx == NULL)
5321 goto exit_point;
5322 /* PR17531: file: heap-buffer-overflow */
5323 else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5324 {
5325 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5326 printable_section_name (entry->hdr),
5327 (unsigned long) entry->hdr->sh_size,
5328 (unsigned long) section->sh_size);
5329 goto exit_point;
5330 }
c9c1d674 5331 }
6a40cf0c 5332 }
9ad5cbcf 5333
3f5e193b 5334 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
252b5132
RH
5335
5336 if (isyms == NULL)
5337 {
8b73c356
NC
5338 error (_("Out of memory reading %lu symbols\n"),
5339 (unsigned long) number);
dd24e3da 5340 goto exit_point;
252b5132
RH
5341 }
5342
dd24e3da 5343 for (j = 0, psym = isyms; j < number; j++, psym++)
252b5132
RH
5344 {
5345 psym->st_name = BYTE_GET (esyms[j].st_name);
5346 psym->st_value = BYTE_GET (esyms[j].st_value);
5347 psym->st_size = BYTE_GET (esyms[j].st_size);
5348 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4fbb74a6 5349 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
9ad5cbcf
AM
5350 psym->st_shndx
5351 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4fbb74a6
AM
5352 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5353 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
252b5132
RH
5354 psym->st_info = BYTE_GET (esyms[j].st_info);
5355 psym->st_other = BYTE_GET (esyms[j].st_other);
5356 }
5357
dd24e3da 5358 exit_point:
ba5cdace 5359 if (shndx != NULL)
9ad5cbcf 5360 free (shndx);
ba5cdace 5361 if (esyms != NULL)
dd24e3da 5362 free (esyms);
252b5132 5363
ba5cdace
NC
5364 if (num_syms_return != NULL)
5365 * num_syms_return = isyms == NULL ? 0 : number;
5366
252b5132
RH
5367 return isyms;
5368}
5369
9ea033b2 5370static Elf_Internal_Sym *
ba5cdace
NC
5371get_64bit_elf_symbols (FILE * file,
5372 Elf_Internal_Shdr * section,
5373 unsigned long * num_syms_return)
9ea033b2 5374{
ba5cdace
NC
5375 unsigned long number = 0;
5376 Elf64_External_Sym * esyms = NULL;
5377 Elf_External_Sym_Shndx * shndx = NULL;
5378 Elf_Internal_Sym * isyms = NULL;
2cf0635d 5379 Elf_Internal_Sym * psym;
b34976b6 5380 unsigned int j;
9ea033b2 5381
c9c1d674
EG
5382 if (section->sh_size == 0)
5383 {
5384 if (num_syms_return != NULL)
5385 * num_syms_return = 0;
5386 return NULL;
5387 }
5388
dd24e3da 5389 /* Run some sanity checks first. */
c9c1d674 5390 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
dd24e3da 5391 {
c9c1d674 5392 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
8066deb1
AM
5393 printable_section_name (section),
5394 (unsigned long) section->sh_entsize);
ba5cdace 5395 goto exit_point;
dd24e3da
NC
5396 }
5397
f54498b4
NC
5398 if (section->sh_size > current_file_size)
5399 {
5400 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
8066deb1
AM
5401 printable_section_name (section),
5402 (unsigned long) section->sh_size);
f54498b4
NC
5403 goto exit_point;
5404 }
5405
dd24e3da
NC
5406 number = section->sh_size / section->sh_entsize;
5407
5408 if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5409 {
c9c1d674 5410 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
8066deb1
AM
5411 (unsigned long) section->sh_size,
5412 printable_section_name (section),
5413 (unsigned long) section->sh_entsize);
ba5cdace 5414 goto exit_point;
dd24e3da
NC
5415 }
5416
3f5e193b
NC
5417 esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5418 section->sh_size, _("symbols"));
a6e9f9df 5419 if (!esyms)
ba5cdace 5420 goto exit_point;
9ea033b2 5421
6a40cf0c
NC
5422 {
5423 elf_section_list * entry;
5424
5425 shndx = NULL;
5426 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5427 if (entry->hdr->sh_link == (unsigned long) (section - section_headers))
c9c1d674 5428 {
6a40cf0c
NC
5429 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5430 entry->hdr->sh_offset,
5431 1, entry->hdr->sh_size,
5432 _("symbol table section indicies"));
5433 if (shndx == NULL)
5434 goto exit_point;
5435 /* PR17531: file: heap-buffer-overflow */
5436 else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5437 {
5438 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5439 printable_section_name (entry->hdr),
5440 (unsigned long) entry->hdr->sh_size,
5441 (unsigned long) section->sh_size);
5442 goto exit_point;
5443 }
c9c1d674 5444 }
6a40cf0c 5445 }
9ad5cbcf 5446
3f5e193b 5447 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
9ea033b2
NC
5448
5449 if (isyms == NULL)
5450 {
8b73c356
NC
5451 error (_("Out of memory reading %lu symbols\n"),
5452 (unsigned long) number);
ba5cdace 5453 goto exit_point;
9ea033b2
NC
5454 }
5455
ba5cdace 5456 for (j = 0, psym = isyms; j < number; j++, psym++)
9ea033b2
NC
5457 {
5458 psym->st_name = BYTE_GET (esyms[j].st_name);
5459 psym->st_info = BYTE_GET (esyms[j].st_info);
5460 psym->st_other = BYTE_GET (esyms[j].st_other);
5461 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
ba5cdace 5462
4fbb74a6 5463 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
9ad5cbcf
AM
5464 psym->st_shndx
5465 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4fbb74a6
AM
5466 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5467 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
ba5cdace 5468
66543521
AM
5469 psym->st_value = BYTE_GET (esyms[j].st_value);
5470 psym->st_size = BYTE_GET (esyms[j].st_size);
9ea033b2
NC
5471 }
5472
ba5cdace
NC
5473 exit_point:
5474 if (shndx != NULL)
9ad5cbcf 5475 free (shndx);
ba5cdace
NC
5476 if (esyms != NULL)
5477 free (esyms);
5478
5479 if (num_syms_return != NULL)
5480 * num_syms_return = isyms == NULL ? 0 : number;
9ea033b2
NC
5481
5482 return isyms;
5483}
5484
d1133906 5485static const char *
d3ba0551 5486get_elf_section_flags (bfd_vma sh_flags)
d1133906 5487{
5477e8a0 5488 static char buff[1024];
2cf0635d 5489 char * p = buff;
32ec8896
NC
5490 unsigned int field_size = is_32bit_elf ? 8 : 16;
5491 signed int sindex;
5492 unsigned int size = sizeof (buff) - (field_size + 4 + 1);
8d5ff12c
L
5493 bfd_vma os_flags = 0;
5494 bfd_vma proc_flags = 0;
5495 bfd_vma unknown_flags = 0;
148b93f2 5496 static const struct
5477e8a0 5497 {
2cf0635d 5498 const char * str;
32ec8896 5499 unsigned int len;
5477e8a0
L
5500 }
5501 flags [] =
5502 {
cfcac11d
NC
5503 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
5504 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
5505 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
5506 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
5507 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
5508 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
5509 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5510 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5511 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
5512 /* 9 */ { STRING_COMMA_LEN ("TLS") },
5513 /* IA-64 specific. */
5514 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5515 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5516 /* IA-64 OpenVMS specific. */
5517 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5518 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5519 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5520 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5521 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5522 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
18ae9cc1 5523 /* Generic. */
cfcac11d 5524 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
18ae9cc1 5525 /* SPARC specific. */
77115a4a 5526 /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
ac4c9b04
MG
5527 /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5528 /* ARM specific. */
5529 /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
f0728ee3 5530 /* 22 */ { STRING_COMMA_LEN ("ARM_PURECODE") },
ac4c9b04 5531 /* 23 */ { STRING_COMMA_LEN ("COMDEF") }
5477e8a0
L
5532 };
5533
5534 if (do_section_details)
5535 {
8d5ff12c
L
5536 sprintf (buff, "[%*.*lx]: ",
5537 field_size, field_size, (unsigned long) sh_flags);
5538 p += field_size + 4;
5477e8a0 5539 }
76da6bbe 5540
d1133906
NC
5541 while (sh_flags)
5542 {
5543 bfd_vma flag;
5544
5545 flag = sh_flags & - sh_flags;
5546 sh_flags &= ~ flag;
76da6bbe 5547
5477e8a0 5548 if (do_section_details)
d1133906 5549 {
5477e8a0
L
5550 switch (flag)
5551 {
91d6fa6a
NC
5552 case SHF_WRITE: sindex = 0; break;
5553 case SHF_ALLOC: sindex = 1; break;
5554 case SHF_EXECINSTR: sindex = 2; break;
5555 case SHF_MERGE: sindex = 3; break;
5556 case SHF_STRINGS: sindex = 4; break;
5557 case SHF_INFO_LINK: sindex = 5; break;
5558 case SHF_LINK_ORDER: sindex = 6; break;
5559 case SHF_OS_NONCONFORMING: sindex = 7; break;
5560 case SHF_GROUP: sindex = 8; break;
5561 case SHF_TLS: sindex = 9; break;
18ae9cc1 5562 case SHF_EXCLUDE: sindex = 18; break;
77115a4a 5563 case SHF_COMPRESSED: sindex = 20; break;
76da6bbe 5564
5477e8a0 5565 default:
91d6fa6a 5566 sindex = -1;
cfcac11d 5567 switch (elf_header.e_machine)
148b93f2 5568 {
cfcac11d 5569 case EM_IA_64:
148b93f2 5570 if (flag == SHF_IA_64_SHORT)
91d6fa6a 5571 sindex = 10;
148b93f2 5572 else if (flag == SHF_IA_64_NORECOV)
91d6fa6a 5573 sindex = 11;
148b93f2
NC
5574#ifdef BFD64
5575 else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5576 switch (flag)
5577 {
91d6fa6a
NC
5578 case SHF_IA_64_VMS_GLOBAL: sindex = 12; break;
5579 case SHF_IA_64_VMS_OVERLAID: sindex = 13; break;
5580 case SHF_IA_64_VMS_SHARED: sindex = 14; break;
5581 case SHF_IA_64_VMS_VECTOR: sindex = 15; break;
5582 case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5583 case SHF_IA_64_VMS_PROTECTED: sindex = 17; break;
148b93f2
NC
5584 default: break;
5585 }
5586#endif
cfcac11d
NC
5587 break;
5588
caa83f8b 5589 case EM_386:
22abe556 5590 case EM_IAMCU:
caa83f8b 5591 case EM_X86_64:
7f502d6c 5592 case EM_L1OM:
7a9068fe 5593 case EM_K1OM:
cfcac11d
NC
5594 case EM_OLD_SPARCV9:
5595 case EM_SPARC32PLUS:
5596 case EM_SPARCV9:
5597 case EM_SPARC:
18ae9cc1 5598 if (flag == SHF_ORDERED)
91d6fa6a 5599 sindex = 19;
cfcac11d 5600 break;
ac4c9b04
MG
5601
5602 case EM_ARM:
5603 switch (flag)
5604 {
5605 case SHF_ENTRYSECT: sindex = 21; break;
f0728ee3 5606 case SHF_ARM_PURECODE: sindex = 22; break;
ac4c9b04
MG
5607 case SHF_COMDEF: sindex = 23; break;
5608 default: break;
5609 }
5610 break;
5611
cfcac11d
NC
5612 default:
5613 break;
148b93f2 5614 }
5477e8a0
L
5615 }
5616
91d6fa6a 5617 if (sindex != -1)
5477e8a0 5618 {
8d5ff12c
L
5619 if (p != buff + field_size + 4)
5620 {
5621 if (size < (10 + 2))
bee0ee85
NC
5622 {
5623 warn (_("Internal error: not enough buffer room for section flag info"));
5624 return _("<unknown>");
5625 }
8d5ff12c
L
5626 size -= 2;
5627 *p++ = ',';
5628 *p++ = ' ';
5629 }
5630
91d6fa6a
NC
5631 size -= flags [sindex].len;
5632 p = stpcpy (p, flags [sindex].str);
5477e8a0 5633 }
3b22753a 5634 else if (flag & SHF_MASKOS)
8d5ff12c 5635 os_flags |= flag;
d1133906 5636 else if (flag & SHF_MASKPROC)
8d5ff12c 5637 proc_flags |= flag;
d1133906 5638 else
8d5ff12c 5639 unknown_flags |= flag;
5477e8a0
L
5640 }
5641 else
5642 {
5643 switch (flag)
5644 {
5645 case SHF_WRITE: *p = 'W'; break;
5646 case SHF_ALLOC: *p = 'A'; break;
5647 case SHF_EXECINSTR: *p = 'X'; break;
5648 case SHF_MERGE: *p = 'M'; break;
5649 case SHF_STRINGS: *p = 'S'; break;
5650 case SHF_INFO_LINK: *p = 'I'; break;
5651 case SHF_LINK_ORDER: *p = 'L'; break;
5652 case SHF_OS_NONCONFORMING: *p = 'O'; break;
5653 case SHF_GROUP: *p = 'G'; break;
5654 case SHF_TLS: *p = 'T'; break;
18ae9cc1 5655 case SHF_EXCLUDE: *p = 'E'; break;
77115a4a 5656 case SHF_COMPRESSED: *p = 'C'; break;
5477e8a0
L
5657
5658 default:
8a9036a4 5659 if ((elf_header.e_machine == EM_X86_64
7a9068fe
L
5660 || elf_header.e_machine == EM_L1OM
5661 || elf_header.e_machine == EM_K1OM)
5477e8a0
L
5662 && flag == SHF_X86_64_LARGE)
5663 *p = 'l';
91f68a68 5664 else if (elf_header.e_machine == EM_ARM
f0728ee3 5665 && flag == SHF_ARM_PURECODE)
91f68a68 5666 *p = 'y';
5477e8a0
L
5667 else if (flag & SHF_MASKOS)
5668 {
5669 *p = 'o';
5670 sh_flags &= ~ SHF_MASKOS;
5671 }
5672 else if (flag & SHF_MASKPROC)
5673 {
5674 *p = 'p';
5675 sh_flags &= ~ SHF_MASKPROC;
5676 }
5677 else
5678 *p = 'x';
5679 break;
5680 }
5681 p++;
d1133906
NC
5682 }
5683 }
76da6bbe 5684
8d5ff12c
L
5685 if (do_section_details)
5686 {
5687 if (os_flags)
5688 {
5689 size -= 5 + field_size;
5690 if (p != buff + field_size + 4)
5691 {
5692 if (size < (2 + 1))
bee0ee85
NC
5693 {
5694 warn (_("Internal error: not enough buffer room for section flag info"));
5695 return _("<unknown>");
5696 }
8d5ff12c
L
5697 size -= 2;
5698 *p++ = ',';
5699 *p++ = ' ';
5700 }
5701 sprintf (p, "OS (%*.*lx)", field_size, field_size,
5702 (unsigned long) os_flags);
5703 p += 5 + field_size;
5704 }
5705 if (proc_flags)
5706 {
5707 size -= 7 + field_size;
5708 if (p != buff + field_size + 4)
5709 {
5710 if (size < (2 + 1))
bee0ee85
NC
5711 {
5712 warn (_("Internal error: not enough buffer room for section flag info"));
5713 return _("<unknown>");
5714 }
8d5ff12c
L
5715 size -= 2;
5716 *p++ = ',';
5717 *p++ = ' ';
5718 }
5719 sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5720 (unsigned long) proc_flags);
5721 p += 7 + field_size;
5722 }
5723 if (unknown_flags)
5724 {
5725 size -= 10 + field_size;
5726 if (p != buff + field_size + 4)
5727 {
5728 if (size < (2 + 1))
bee0ee85
NC
5729 {
5730 warn (_("Internal error: not enough buffer room for section flag info"));
5731 return _("<unknown>");
5732 }
8d5ff12c
L
5733 size -= 2;
5734 *p++ = ',';
5735 *p++ = ' ';
5736 }
2b692964 5737 sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
8d5ff12c
L
5738 (unsigned long) unknown_flags);
5739 p += 10 + field_size;
5740 }
5741 }
5742
e9e44622 5743 *p = '\0';
d1133906
NC
5744 return buff;
5745}
5746
77115a4a 5747static unsigned int
ebdf1ebf 5748get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf, bfd_size_type size)
77115a4a
L
5749{
5750 if (is_32bit_elf)
5751 {
5752 Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
d8024a91 5753
ebdf1ebf
NC
5754 if (size < sizeof (* echdr))
5755 {
5756 error (_("Compressed section is too small even for a compression header\n"));
5757 return 0;
5758 }
5759
77115a4a
L
5760 chdr->ch_type = BYTE_GET (echdr->ch_type);
5761 chdr->ch_size = BYTE_GET (echdr->ch_size);
5762 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5763 return sizeof (*echdr);
5764 }
5765 else
5766 {
5767 Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) buf;
d8024a91 5768
ebdf1ebf
NC
5769 if (size < sizeof (* echdr))
5770 {
5771 error (_("Compressed section is too small even for a compression header\n"));
5772 return 0;
5773 }
5774
77115a4a
L
5775 chdr->ch_type = BYTE_GET (echdr->ch_type);
5776 chdr->ch_size = BYTE_GET (echdr->ch_size);
5777 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5778 return sizeof (*echdr);
5779 }
5780}
5781
32ec8896 5782static bfd_boolean
2cf0635d 5783process_section_headers (FILE * file)
252b5132 5784{
2cf0635d 5785 Elf_Internal_Shdr * section;
b34976b6 5786 unsigned int i;
252b5132
RH
5787
5788 section_headers = NULL;
5789
5790 if (elf_header.e_shnum == 0)
5791 {
82f2dbf7
NC
5792 /* PR binutils/12467. */
5793 if (elf_header.e_shoff != 0)
32ec8896
NC
5794 {
5795 warn (_("possibly corrupt ELF file header - it has a non-zero"
5796 " section header offset, but no section headers\n"));
5797 return FALSE;
5798 }
82f2dbf7 5799 else if (do_sections)
252b5132
RH
5800 printf (_("\nThere are no sections in this file.\n"));
5801
32ec8896 5802 return TRUE;
252b5132
RH
5803 }
5804
5805 if (do_sections && !do_header)
9ea033b2 5806 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
252b5132
RH
5807 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
5808
9ea033b2
NC
5809 if (is_32bit_elf)
5810 {
049b0c3a 5811 if (! get_32bit_section_headers (file, FALSE))
32ec8896
NC
5812 return FALSE;
5813 }
5814 else
5815 {
5816 if (! get_64bit_section_headers (file, FALSE))
5817 return FALSE;
9ea033b2 5818 }
252b5132
RH
5819
5820 /* Read in the string table, so that we have names to display. */
0b49d371 5821 if (elf_header.e_shstrndx != SHN_UNDEF
4fbb74a6 5822 && elf_header.e_shstrndx < elf_header.e_shnum)
252b5132 5823 {
4fbb74a6 5824 section = section_headers + elf_header.e_shstrndx;
d40ac9bd 5825
c256ffe7
JJ
5826 if (section->sh_size != 0)
5827 {
3f5e193b
NC
5828 string_table = (char *) get_data (NULL, file, section->sh_offset,
5829 1, section->sh_size,
5830 _("string table"));
0de14b54 5831
c256ffe7
JJ
5832 string_table_length = string_table != NULL ? section->sh_size : 0;
5833 }
252b5132
RH
5834 }
5835
5836 /* Scan the sections for the dynamic symbol table
e3c8793a 5837 and dynamic string table and debug sections. */
252b5132
RH
5838 dynamic_symbols = NULL;
5839 dynamic_strings = NULL;
5840 dynamic_syminfo = NULL;
6a40cf0c 5841 symtab_shndx_list = NULL;
103f02d3 5842
89fac5e3
RS
5843 eh_addr_size = is_32bit_elf ? 4 : 8;
5844 switch (elf_header.e_machine)
5845 {
5846 case EM_MIPS:
5847 case EM_MIPS_RS3_LE:
5848 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
5849 FDE addresses. However, the ABI also has a semi-official ILP32
5850 variant for which the normal FDE address size rules apply.
5851
5852 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
5853 section, where XX is the size of longs in bits. Unfortunately,
5854 earlier compilers provided no way of distinguishing ILP32 objects
5855 from LP64 objects, so if there's any doubt, we should assume that
5856 the official LP64 form is being used. */
5857 if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
5858 && find_section (".gcc_compiled_long32") == NULL)
5859 eh_addr_size = 8;
5860 break;
0f56a26a
DD
5861
5862 case EM_H8_300:
5863 case EM_H8_300H:
5864 switch (elf_header.e_flags & EF_H8_MACH)
5865 {
5866 case E_H8_MACH_H8300:
5867 case E_H8_MACH_H8300HN:
5868 case E_H8_MACH_H8300SN:
5869 case E_H8_MACH_H8300SXN:
5870 eh_addr_size = 2;
5871 break;
5872 case E_H8_MACH_H8300H:
5873 case E_H8_MACH_H8300S:
5874 case E_H8_MACH_H8300SX:
5875 eh_addr_size = 4;
5876 break;
5877 }
f4236fe4
DD
5878 break;
5879
ff7eeb89 5880 case EM_M32C_OLD:
f4236fe4
DD
5881 case EM_M32C:
5882 switch (elf_header.e_flags & EF_M32C_CPU_MASK)
5883 {
5884 case EF_M32C_CPU_M16C:
5885 eh_addr_size = 2;
5886 break;
5887 }
5888 break;
89fac5e3
RS
5889 }
5890
76ca31c0
NC
5891#define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
5892 do \
5893 { \
5894 bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64; \
5895 if (section->sh_entsize != expected_entsize) \
9dd3a467 5896 { \
76ca31c0
NC
5897 char buf[40]; \
5898 sprintf_vma (buf, section->sh_entsize); \
5899 /* Note: coded this way so that there is a single string for \
5900 translation. */ \
5901 error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
5902 error (_("(Using the expected size of %u for the rest of this dump)\n"), \
5903 (unsigned) expected_entsize); \
9dd3a467 5904 section->sh_entsize = expected_entsize; \
76ca31c0
NC
5905 } \
5906 } \
08d8fa11 5907 while (0)
9dd3a467
NC
5908
5909#define CHECK_ENTSIZE(section, i, type) \
08d8fa11
JJ
5910 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
5911 sizeof (Elf64_External_##type))
5912
252b5132
RH
5913 for (i = 0, section = section_headers;
5914 i < elf_header.e_shnum;
b34976b6 5915 i++, section++)
252b5132 5916 {
2cf0635d 5917 char * name = SECTION_NAME (section);
252b5132
RH
5918
5919 if (section->sh_type == SHT_DYNSYM)
5920 {
5921 if (dynamic_symbols != NULL)
5922 {
5923 error (_("File contains multiple dynamic symbol tables\n"));
5924 continue;
5925 }
5926
08d8fa11 5927 CHECK_ENTSIZE (section, i, Sym);
ba5cdace 5928 dynamic_symbols = GET_ELF_SYMBOLS (file, section, & num_dynamic_syms);
252b5132
RH
5929 }
5930 else if (section->sh_type == SHT_STRTAB
18bd398b 5931 && streq (name, ".dynstr"))
252b5132
RH
5932 {
5933 if (dynamic_strings != NULL)
5934 {
5935 error (_("File contains multiple dynamic string tables\n"));
5936 continue;
5937 }
5938
3f5e193b
NC
5939 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
5940 1, section->sh_size,
5941 _("dynamic strings"));
59245841 5942 dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
252b5132 5943 }
9ad5cbcf
AM
5944 else if (section->sh_type == SHT_SYMTAB_SHNDX)
5945 {
6a40cf0c
NC
5946 elf_section_list * entry = xmalloc (sizeof * entry);
5947 entry->hdr = section;
5948 entry->next = symtab_shndx_list;
5949 symtab_shndx_list = entry;
9ad5cbcf 5950 }
08d8fa11
JJ
5951 else if (section->sh_type == SHT_SYMTAB)
5952 CHECK_ENTSIZE (section, i, Sym);
5953 else if (section->sh_type == SHT_GROUP)
5954 CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
5955 else if (section->sh_type == SHT_REL)
5956 CHECK_ENTSIZE (section, i, Rel);
5957 else if (section->sh_type == SHT_RELA)
5958 CHECK_ENTSIZE (section, i, Rela);
252b5132 5959 else if ((do_debugging || do_debug_info || do_debug_abbrevs
f9f0e732 5960 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
cb8f3167 5961 || do_debug_aranges || do_debug_frames || do_debug_macinfo
657d0d47
CC
5962 || do_debug_str || do_debug_loc || do_debug_ranges
5963 || do_debug_addr || do_debug_cu_index)
1b315056
CS
5964 && (const_strneq (name, ".debug_")
5965 || const_strneq (name, ".zdebug_")))
252b5132 5966 {
1b315056
CS
5967 if (name[1] == 'z')
5968 name += sizeof (".zdebug_") - 1;
5969 else
5970 name += sizeof (".debug_") - 1;
252b5132
RH
5971
5972 if (do_debugging
4723351a
CC
5973 || (do_debug_info && const_strneq (name, "info"))
5974 || (do_debug_info && const_strneq (name, "types"))
5975 || (do_debug_abbrevs && const_strneq (name, "abbrev"))
b40bf0a2
NC
5976 || (do_debug_lines && strcmp (name, "line") == 0)
5977 || (do_debug_lines && const_strneq (name, "line."))
4723351a
CC
5978 || (do_debug_pubnames && const_strneq (name, "pubnames"))
5979 || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
459d52c8
DE
5980 || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
5981 || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
4723351a
CC
5982 || (do_debug_aranges && const_strneq (name, "aranges"))
5983 || (do_debug_ranges && const_strneq (name, "ranges"))
77145576 5984 || (do_debug_ranges && const_strneq (name, "rnglists"))
4723351a
CC
5985 || (do_debug_frames && const_strneq (name, "frame"))
5986 || (do_debug_macinfo && const_strneq (name, "macinfo"))
5987 || (do_debug_macinfo && const_strneq (name, "macro"))
5988 || (do_debug_str && const_strneq (name, "str"))
5989 || (do_debug_loc && const_strneq (name, "loc"))
77145576 5990 || (do_debug_loc && const_strneq (name, "loclists"))
657d0d47
CC
5991 || (do_debug_addr && const_strneq (name, "addr"))
5992 || (do_debug_cu_index && const_strneq (name, "cu_index"))
5993 || (do_debug_cu_index && const_strneq (name, "tu_index"))
252b5132 5994 )
09c11c86 5995 request_dump_bynumber (i, DEBUG_DUMP);
252b5132 5996 }
a262ae96 5997 /* Linkonce section to be combined with .debug_info at link time. */
09fd7e38 5998 else if ((do_debugging || do_debug_info)
0112cd26 5999 && const_strneq (name, ".gnu.linkonce.wi."))
09c11c86 6000 request_dump_bynumber (i, DEBUG_DUMP);
18bd398b 6001 else if (do_debug_frames && streq (name, ".eh_frame"))
09c11c86 6002 request_dump_bynumber (i, DEBUG_DUMP);
5bbdf3d5
DE
6003 else if (do_gdb_index && streq (name, ".gdb_index"))
6004 request_dump_bynumber (i, DEBUG_DUMP);
6f875884
TG
6005 /* Trace sections for Itanium VMS. */
6006 else if ((do_debugging || do_trace_info || do_trace_abbrevs
6007 || do_trace_aranges)
6008 && const_strneq (name, ".trace_"))
6009 {
6010 name += sizeof (".trace_") - 1;
6011
6012 if (do_debugging
6013 || (do_trace_info && streq (name, "info"))
6014 || (do_trace_abbrevs && streq (name, "abbrev"))
6015 || (do_trace_aranges && streq (name, "aranges"))
6016 )
6017 request_dump_bynumber (i, DEBUG_DUMP);
6018 }
252b5132
RH
6019 }
6020
6021 if (! do_sections)
32ec8896 6022 return TRUE;
252b5132 6023
3a1a2036
NC
6024 if (elf_header.e_shnum > 1)
6025 printf (_("\nSection Headers:\n"));
6026 else
6027 printf (_("\nSection Header:\n"));
76da6bbe 6028
f7a99963 6029 if (is_32bit_elf)
595cf52e 6030 {
5477e8a0 6031 if (do_section_details)
595cf52e
L
6032 {
6033 printf (_(" [Nr] Name\n"));
5477e8a0 6034 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
595cf52e
L
6035 }
6036 else
6037 printf
6038 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
6039 }
d974e256 6040 else if (do_wide)
595cf52e 6041 {
5477e8a0 6042 if (do_section_details)
595cf52e
L
6043 {
6044 printf (_(" [Nr] Name\n"));
5477e8a0 6045 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
595cf52e
L
6046 }
6047 else
6048 printf
6049 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
6050 }
f7a99963
NC
6051 else
6052 {
5477e8a0 6053 if (do_section_details)
595cf52e
L
6054 {
6055 printf (_(" [Nr] Name\n"));
5477e8a0
L
6056 printf (_(" Type Address Offset Link\n"));
6057 printf (_(" Size EntSize Info Align\n"));
595cf52e
L
6058 }
6059 else
6060 {
6061 printf (_(" [Nr] Name Type Address Offset\n"));
6062 printf (_(" Size EntSize Flags Link Info Align\n"));
6063 }
f7a99963 6064 }
252b5132 6065
5477e8a0
L
6066 if (do_section_details)
6067 printf (_(" Flags\n"));
6068
252b5132
RH
6069 for (i = 0, section = section_headers;
6070 i < elf_header.e_shnum;
b34976b6 6071 i++, section++)
252b5132 6072 {
dd905818
NC
6073 /* Run some sanity checks on the section header. */
6074
6075 /* Check the sh_link field. */
6076 switch (section->sh_type)
6077 {
6078 case SHT_SYMTAB_SHNDX:
6079 case SHT_GROUP:
6080 case SHT_HASH:
6081 case SHT_GNU_HASH:
6082 case SHT_GNU_versym:
6083 case SHT_REL:
6084 case SHT_RELA:
6085 if (section->sh_link < 1
cb64e50d 6086 || section->sh_link >= elf_header.e_shnum
dd905818
NC
6087 || (section_headers[section->sh_link].sh_type != SHT_SYMTAB
6088 && section_headers[section->sh_link].sh_type != SHT_DYNSYM))
6089 warn (_("[%2u]: Link field (%u) should index a symtab section.\n"),
6090 i, section->sh_link);
6091 break;
6092
6093 case SHT_DYNAMIC:
6094 case SHT_SYMTAB:
6095 case SHT_DYNSYM:
6096 case SHT_GNU_verneed:
6097 case SHT_GNU_verdef:
6098 case SHT_GNU_LIBLIST:
6099 if (section->sh_link < 1
cb64e50d 6100 || section->sh_link >= elf_header.e_shnum
dd905818
NC
6101 || section_headers[section->sh_link].sh_type != SHT_STRTAB)
6102 warn (_("[%2u]: Link field (%u) should index a string section.\n"),
6103 i, section->sh_link);
6104 break;
6105
6106 case SHT_INIT_ARRAY:
6107 case SHT_FINI_ARRAY:
6108 case SHT_PREINIT_ARRAY:
6109 if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6110 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6111 i, section->sh_link);
6112 break;
6113
6114 default:
6115 /* FIXME: Add support for target specific section types. */
6116#if 0 /* Currently we do not check other section types as there are too
6117 many special cases. Stab sections for example have a type
6118 of SHT_PROGBITS but an sh_link field that links to the .stabstr
6119 section. */
6120 if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6121 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6122 i, section->sh_link);
6123#endif
6124 break;
6125 }
6126
6127 /* Check the sh_info field. */
6128 switch (section->sh_type)
6129 {
6130 case SHT_REL:
6131 case SHT_RELA:
6132 if (section->sh_info < 1
cb64e50d 6133 || section->sh_info >= elf_header.e_shnum
dd905818
NC
6134 || (section_headers[section->sh_info].sh_type != SHT_PROGBITS
6135 && section_headers[section->sh_info].sh_type != SHT_NOBITS
6136 && section_headers[section->sh_info].sh_type != SHT_NOTE
6137 && section_headers[section->sh_info].sh_type != SHT_INIT_ARRAY
6138 /* FIXME: Are other section types valid ? */
6139 && section_headers[section->sh_info].sh_type < SHT_LOOS))
6140 {
6141 if (section->sh_info == 0
6142 && (streq (SECTION_NAME (section), ".rel.dyn")
6143 || streq (SECTION_NAME (section), ".rela.dyn")))
6144 /* The .rel.dyn and .rela.dyn sections have an sh_info field
4d74727a
AM
6145 of zero. The relocations in these sections may apply
6146 to many different sections. */
dd905818
NC
6147 ;
6148 else
6149 warn (_("[%2u]: Info field (%u) should index a relocatable section.\n"),
6150 i, section->sh_info);
6151 }
6152 break;
6153
6154 case SHT_DYNAMIC:
6155 case SHT_HASH:
6156 case SHT_SYMTAB_SHNDX:
6157 case SHT_INIT_ARRAY:
6158 case SHT_FINI_ARRAY:
6159 case SHT_PREINIT_ARRAY:
6160 if (section->sh_info != 0)
6161 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6162 i, section->sh_info);
6163 break;
6164
6165 case SHT_GROUP:
6166 case SHT_SYMTAB:
6167 case SHT_DYNSYM:
6168 /* A symbol index - we assume that it is valid. */
6169 break;
6170
6171 default:
6172 /* FIXME: Add support for target specific section types. */
6173 if (section->sh_type == SHT_NOBITS)
6174 /* NOBITS section headers with non-zero sh_info fields can be
6175 created when a binary is stripped of everything but its debug
1a9ccd70
NC
6176 information. The stripped sections have their headers
6177 preserved but their types set to SHT_NOBITS. So do not check
6178 this type of section. */
dd905818
NC
6179 ;
6180 else if (section->sh_flags & SHF_INFO_LINK)
6181 {
cb64e50d 6182 if (section->sh_info < 1 || section->sh_info >= elf_header.e_shnum)
dd905818
NC
6183 warn (_("[%2u]: Expected link to another section in info field"), i);
6184 }
6185 else if (section->sh_type < SHT_LOOS && section->sh_info != 0)
6186 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6187 i, section->sh_info);
6188 break;
6189 }
6190
7bfd842d 6191 printf (" [%2u] ", i);
5477e8a0 6192 if (do_section_details)
74e1a04b 6193 printf ("%s\n ", printable_section_name (section));
595cf52e 6194 else
74e1a04b 6195 print_symbol (-17, SECTION_NAME (section));
0b4362b0 6196
ea52a088
NC
6197 printf (do_wide ? " %-15s " : " %-15.15s ",
6198 get_section_type_name (section->sh_type));
0b4362b0 6199
f7a99963
NC
6200 if (is_32bit_elf)
6201 {
cfcac11d
NC
6202 const char * link_too_big = NULL;
6203
f7a99963 6204 print_vma (section->sh_addr, LONG_HEX);
76da6bbe 6205
f7a99963
NC
6206 printf ( " %6.6lx %6.6lx %2.2lx",
6207 (unsigned long) section->sh_offset,
6208 (unsigned long) section->sh_size,
6209 (unsigned long) section->sh_entsize);
d1133906 6210
5477e8a0
L
6211 if (do_section_details)
6212 fputs (" ", stdout);
6213 else
6214 printf (" %3s ", get_elf_section_flags (section->sh_flags));
76da6bbe 6215
cfcac11d
NC
6216 if (section->sh_link >= elf_header.e_shnum)
6217 {
6218 link_too_big = "";
6219 /* The sh_link value is out of range. Normally this indicates
caa83f8b 6220 an error but it can have special values in Solaris binaries. */
cfcac11d
NC
6221 switch (elf_header.e_machine)
6222 {
caa83f8b 6223 case EM_386:
22abe556 6224 case EM_IAMCU:
caa83f8b 6225 case EM_X86_64:
7f502d6c 6226 case EM_L1OM:
7a9068fe 6227 case EM_K1OM:
cfcac11d
NC
6228 case EM_OLD_SPARCV9:
6229 case EM_SPARC32PLUS:
6230 case EM_SPARCV9:
6231 case EM_SPARC:
6232 if (section->sh_link == (SHN_BEFORE & 0xffff))
6233 link_too_big = "BEFORE";
6234 else if (section->sh_link == (SHN_AFTER & 0xffff))
6235 link_too_big = "AFTER";
6236 break;
6237 default:
6238 break;
6239 }
6240 }
6241
6242 if (do_section_details)
6243 {
6244 if (link_too_big != NULL && * link_too_big)
6245 printf ("<%s> ", link_too_big);
6246 else
6247 printf ("%2u ", section->sh_link);
6248 printf ("%3u %2lu\n", section->sh_info,
6249 (unsigned long) section->sh_addralign);
6250 }
6251 else
6252 printf ("%2u %3u %2lu\n",
6253 section->sh_link,
6254 section->sh_info,
6255 (unsigned long) section->sh_addralign);
6256
6257 if (link_too_big && ! * link_too_big)
6258 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
6259 i, section->sh_link);
f7a99963 6260 }
d974e256
JJ
6261 else if (do_wide)
6262 {
6263 print_vma (section->sh_addr, LONG_HEX);
6264
6265 if ((long) section->sh_offset == section->sh_offset)
6266 printf (" %6.6lx", (unsigned long) section->sh_offset);
6267 else
6268 {
6269 putchar (' ');
6270 print_vma (section->sh_offset, LONG_HEX);
6271 }
6272
6273 if ((unsigned long) section->sh_size == section->sh_size)
6274 printf (" %6.6lx", (unsigned long) section->sh_size);
6275 else
6276 {
6277 putchar (' ');
6278 print_vma (section->sh_size, LONG_HEX);
6279 }
6280
6281 if ((unsigned long) section->sh_entsize == section->sh_entsize)
6282 printf (" %2.2lx", (unsigned long) section->sh_entsize);
6283 else
6284 {
6285 putchar (' ');
6286 print_vma (section->sh_entsize, LONG_HEX);
6287 }
6288
5477e8a0
L
6289 if (do_section_details)
6290 fputs (" ", stdout);
6291 else
6292 printf (" %3s ", get_elf_section_flags (section->sh_flags));
d974e256 6293
72de5009 6294 printf ("%2u %3u ", section->sh_link, section->sh_info);
d974e256
JJ
6295
6296 if ((unsigned long) section->sh_addralign == section->sh_addralign)
72de5009 6297 printf ("%2lu\n", (unsigned long) section->sh_addralign);
d974e256
JJ
6298 else
6299 {
6300 print_vma (section->sh_addralign, DEC);
6301 putchar ('\n');
6302 }
6303 }
5477e8a0 6304 else if (do_section_details)
595cf52e 6305 {
5477e8a0 6306 printf (" %-15.15s ",
595cf52e 6307 get_section_type_name (section->sh_type));
595cf52e
L
6308 print_vma (section->sh_addr, LONG_HEX);
6309 if ((long) section->sh_offset == section->sh_offset)
5477e8a0 6310 printf (" %16.16lx", (unsigned long) section->sh_offset);
595cf52e
L
6311 else
6312 {
6313 printf (" ");
6314 print_vma (section->sh_offset, LONG_HEX);
6315 }
72de5009 6316 printf (" %u\n ", section->sh_link);
595cf52e 6317 print_vma (section->sh_size, LONG_HEX);
5477e8a0 6318 putchar (' ');
595cf52e
L
6319 print_vma (section->sh_entsize, LONG_HEX);
6320
72de5009
AM
6321 printf (" %-16u %lu\n",
6322 section->sh_info,
595cf52e
L
6323 (unsigned long) section->sh_addralign);
6324 }
f7a99963
NC
6325 else
6326 {
6327 putchar (' ');
6328 print_vma (section->sh_addr, LONG_HEX);
53c7db4b
KH
6329 if ((long) section->sh_offset == section->sh_offset)
6330 printf (" %8.8lx", (unsigned long) section->sh_offset);
6331 else
6332 {
6333 printf (" ");
6334 print_vma (section->sh_offset, LONG_HEX);
6335 }
f7a99963
NC
6336 printf ("\n ");
6337 print_vma (section->sh_size, LONG_HEX);
6338 printf (" ");
6339 print_vma (section->sh_entsize, LONG_HEX);
76da6bbe 6340
d1133906 6341 printf (" %3s ", get_elf_section_flags (section->sh_flags));
76da6bbe 6342
72de5009
AM
6343 printf (" %2u %3u %lu\n",
6344 section->sh_link,
6345 section->sh_info,
f7a99963
NC
6346 (unsigned long) section->sh_addralign);
6347 }
5477e8a0
L
6348
6349 if (do_section_details)
77115a4a
L
6350 {
6351 printf (" %s\n", get_elf_section_flags (section->sh_flags));
6352 if ((section->sh_flags & SHF_COMPRESSED) != 0)
6353 {
6354 /* Minimum section size is 12 bytes for 32-bit compression
6355 header + 12 bytes for compressed data header. */
6356 unsigned char buf[24];
d8024a91 6357
77115a4a
L
6358 assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
6359 if (get_data (&buf, (FILE *) file, section->sh_offset, 1,
6360 sizeof (buf), _("compression header")))
6361 {
6362 Elf_Internal_Chdr chdr;
d8024a91 6363
ebdf1ebf 6364 (void) get_compression_header (&chdr, buf, sizeof (buf));
d8024a91 6365
77115a4a
L
6366 if (chdr.ch_type == ELFCOMPRESS_ZLIB)
6367 printf (" ZLIB, ");
6368 else
6369 printf (_(" [<unknown>: 0x%x], "),
6370 chdr.ch_type);
6371 print_vma (chdr.ch_size, LONG_HEX);
6372 printf (", %lu\n", (unsigned long) chdr.ch_addralign);
6373 }
6374 }
6375 }
252b5132
RH
6376 }
6377
5477e8a0 6378 if (!do_section_details)
3dbcc61d 6379 {
9fb71ee4
NC
6380 /* The ordering of the letters shown here matches the ordering of the
6381 corresponding SHF_xxx values, and hence the order in which these
6382 letters will be displayed to the user. */
6383 printf (_("Key to Flags:\n\
6384 W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6385 L (link order), O (extra OS processing required), G (group), T (TLS),\n\
fd85a6a1 6386 C (compressed), x (unknown), o (OS specific), E (exclude),\n "));
3dbcc61d 6387 if (elf_header.e_machine == EM_X86_64
7a9068fe
L
6388 || elf_header.e_machine == EM_L1OM
6389 || elf_header.e_machine == EM_K1OM)
9fb71ee4 6390 printf (_("l (large), "));
91f68a68 6391 else if (elf_header.e_machine == EM_ARM)
f0728ee3 6392 printf (_("y (purecode), "));
9fb71ee4 6393 printf ("p (processor specific)\n");
0b4362b0 6394 }
d1133906 6395
32ec8896 6396 return TRUE;
252b5132
RH
6397}
6398
f5842774
L
6399static const char *
6400get_group_flags (unsigned int flags)
6401{
1449284b 6402 static char buff[128];
220453ec 6403
6d913794
NC
6404 if (flags == 0)
6405 return "";
6406 else if (flags == GRP_COMDAT)
6407 return "COMDAT ";
f5842774 6408
6d913794
NC
6409 snprintf (buff, 14, _("[0x%x: "), flags);
6410
6411 flags &= ~ GRP_COMDAT;
6412 if (flags & GRP_MASKOS)
6413 {
6414 strcat (buff, "<OS specific>");
6415 flags &= ~ GRP_MASKOS;
f5842774 6416 }
6d913794
NC
6417
6418 if (flags & GRP_MASKPROC)
6419 {
6420 strcat (buff, "<PROC specific>");
6421 flags &= ~ GRP_MASKPROC;
6422 }
6423
6424 if (flags)
6425 strcat (buff, "<unknown>");
6426
6427 strcat (buff, "]");
f5842774
L
6428 return buff;
6429}
6430
32ec8896 6431static bfd_boolean
2cf0635d 6432process_section_groups (FILE * file)
f5842774 6433{
2cf0635d 6434 Elf_Internal_Shdr * section;
f5842774 6435 unsigned int i;
2cf0635d
NC
6436 struct group * group;
6437 Elf_Internal_Shdr * symtab_sec;
6438 Elf_Internal_Shdr * strtab_sec;
6439 Elf_Internal_Sym * symtab;
ba5cdace 6440 unsigned long num_syms;
2cf0635d 6441 char * strtab;
c256ffe7 6442 size_t strtab_size;
d1f5c6e3
L
6443
6444 /* Don't process section groups unless needed. */
6445 if (!do_unwind && !do_section_groups)
32ec8896 6446 return TRUE;
f5842774
L
6447
6448 if (elf_header.e_shnum == 0)
6449 {
6450 if (do_section_groups)
82f2dbf7 6451 printf (_("\nThere are no sections to group in this file.\n"));
f5842774 6452
32ec8896 6453 return TRUE;
f5842774
L
6454 }
6455
6456 if (section_headers == NULL)
6457 {
6458 error (_("Section headers are not available!\n"));
fa1908fd 6459 /* PR 13622: This can happen with a corrupt ELF header. */
32ec8896 6460 return FALSE;
f5842774
L
6461 }
6462
3f5e193b
NC
6463 section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
6464 sizeof (struct group *));
e4b17d5c
L
6465
6466 if (section_headers_groups == NULL)
6467 {
8b73c356
NC
6468 error (_("Out of memory reading %u section group headers\n"),
6469 elf_header.e_shnum);
32ec8896 6470 return FALSE;
e4b17d5c
L
6471 }
6472
f5842774 6473 /* Scan the sections for the group section. */
d1f5c6e3 6474 group_count = 0;
f5842774
L
6475 for (i = 0, section = section_headers;
6476 i < elf_header.e_shnum;
6477 i++, section++)
e4b17d5c
L
6478 if (section->sh_type == SHT_GROUP)
6479 group_count++;
6480
d1f5c6e3
L
6481 if (group_count == 0)
6482 {
6483 if (do_section_groups)
6484 printf (_("\nThere are no section groups in this file.\n"));
6485
32ec8896 6486 return TRUE;
d1f5c6e3
L
6487 }
6488
3f5e193b 6489 section_groups = (struct group *) calloc (group_count, sizeof (struct group));
e4b17d5c
L
6490
6491 if (section_groups == NULL)
6492 {
8b73c356
NC
6493 error (_("Out of memory reading %lu groups\n"),
6494 (unsigned long) group_count);
32ec8896 6495 return FALSE;
e4b17d5c
L
6496 }
6497
d1f5c6e3
L
6498 symtab_sec = NULL;
6499 strtab_sec = NULL;
6500 symtab = NULL;
ba5cdace 6501 num_syms = 0;
d1f5c6e3 6502 strtab = NULL;
c256ffe7 6503 strtab_size = 0;
e4b17d5c
L
6504 for (i = 0, section = section_headers, group = section_groups;
6505 i < elf_header.e_shnum;
6506 i++, section++)
f5842774
L
6507 {
6508 if (section->sh_type == SHT_GROUP)
6509 {
74e1a04b
NC
6510 const char * name = printable_section_name (section);
6511 const char * group_name;
2cf0635d
NC
6512 unsigned char * start;
6513 unsigned char * indices;
f5842774 6514 unsigned int entry, j, size;
2cf0635d
NC
6515 Elf_Internal_Shdr * sec;
6516 Elf_Internal_Sym * sym;
f5842774
L
6517
6518 /* Get the symbol table. */
4fbb74a6
AM
6519 if (section->sh_link >= elf_header.e_shnum
6520 || ((sec = section_headers + section->sh_link)->sh_type
c256ffe7 6521 != SHT_SYMTAB))
f5842774
L
6522 {
6523 error (_("Bad sh_link in group section `%s'\n"), name);
6524 continue;
6525 }
d1f5c6e3
L
6526
6527 if (symtab_sec != sec)
6528 {
6529 symtab_sec = sec;
6530 if (symtab)
6531 free (symtab);
ba5cdace 6532 symtab = GET_ELF_SYMBOLS (file, symtab_sec, & num_syms);
d1f5c6e3 6533 }
f5842774 6534
dd24e3da
NC
6535 if (symtab == NULL)
6536 {
6537 error (_("Corrupt header in group section `%s'\n"), name);
6538 continue;
6539 }
6540
ba5cdace
NC
6541 if (section->sh_info >= num_syms)
6542 {
6543 error (_("Bad sh_info in group section `%s'\n"), name);
6544 continue;
6545 }
6546
f5842774
L
6547 sym = symtab + section->sh_info;
6548
6549 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6550 {
4fbb74a6
AM
6551 if (sym->st_shndx == 0
6552 || sym->st_shndx >= elf_header.e_shnum)
f5842774
L
6553 {
6554 error (_("Bad sh_info in group section `%s'\n"), name);
6555 continue;
6556 }
ba2685cc 6557
4fbb74a6 6558 group_name = SECTION_NAME (section_headers + sym->st_shndx);
c256ffe7
JJ
6559 strtab_sec = NULL;
6560 if (strtab)
6561 free (strtab);
f5842774 6562 strtab = NULL;
c256ffe7 6563 strtab_size = 0;
f5842774
L
6564 }
6565 else
6566 {
6567 /* Get the string table. */
4fbb74a6 6568 if (symtab_sec->sh_link >= elf_header.e_shnum)
c256ffe7
JJ
6569 {
6570 strtab_sec = NULL;
6571 if (strtab)
6572 free (strtab);
6573 strtab = NULL;
6574 strtab_size = 0;
6575 }
6576 else if (strtab_sec
4fbb74a6 6577 != (sec = section_headers + symtab_sec->sh_link))
d1f5c6e3
L
6578 {
6579 strtab_sec = sec;
6580 if (strtab)
6581 free (strtab);
071436c6 6582
3f5e193b 6583 strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
071436c6
NC
6584 1, strtab_sec->sh_size,
6585 _("string table"));
c256ffe7 6586 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
d1f5c6e3 6587 }
c256ffe7 6588 group_name = sym->st_name < strtab_size
2b692964 6589 ? strtab + sym->st_name : _("<corrupt>");
f5842774
L
6590 }
6591
c9c1d674
EG
6592 /* PR 17531: file: loop. */
6593 if (section->sh_entsize > section->sh_size)
6594 {
6595 error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6596 printable_section_name (section),
8066deb1
AM
6597 (unsigned long) section->sh_entsize,
6598 (unsigned long) section->sh_size);
c9c1d674
EG
6599 break;
6600 }
6601
3f5e193b
NC
6602 start = (unsigned char *) get_data (NULL, file, section->sh_offset,
6603 1, section->sh_size,
6604 _("section data"));
59245841
NC
6605 if (start == NULL)
6606 continue;
f5842774
L
6607
6608 indices = start;
6609 size = (section->sh_size / section->sh_entsize) - 1;
6610 entry = byte_get (indices, 4);
6611 indices += 4;
e4b17d5c
L
6612
6613 if (do_section_groups)
6614 {
2b692964 6615 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
391cb864 6616 get_group_flags (entry), i, name, group_name, size);
ba2685cc 6617
e4b17d5c
L
6618 printf (_(" [Index] Name\n"));
6619 }
6620
6621 group->group_index = i;
6622
f5842774
L
6623 for (j = 0; j < size; j++)
6624 {
2cf0635d 6625 struct group_list * g;
e4b17d5c 6626
f5842774
L
6627 entry = byte_get (indices, 4);
6628 indices += 4;
6629
4fbb74a6 6630 if (entry >= elf_header.e_shnum)
391cb864 6631 {
57028622
NC
6632 static unsigned num_group_errors = 0;
6633
6634 if (num_group_errors ++ < 10)
6635 {
6636 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6637 entry, i, elf_header.e_shnum - 1);
6638 if (num_group_errors == 10)
6639 warn (_("Futher error messages about overlarge group section indicies suppressed\n"));
6640 }
391cb864
L
6641 continue;
6642 }
391cb864 6643
4fbb74a6 6644 if (section_headers_groups [entry] != NULL)
e4b17d5c 6645 {
d1f5c6e3
L
6646 if (entry)
6647 {
57028622
NC
6648 static unsigned num_errs = 0;
6649
6650 if (num_errs ++ < 10)
6651 {
6652 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6653 entry, i,
6654 section_headers_groups [entry]->group_index);
6655 if (num_errs == 10)
6656 warn (_("Further error messages about already contained group sections suppressed\n"));
6657 }
d1f5c6e3
L
6658 continue;
6659 }
6660 else
6661 {
6662 /* Intel C/C++ compiler may put section 0 in a
32ec8896 6663 section group. We just warn it the first time
d1f5c6e3 6664 and ignore it afterwards. */
32ec8896 6665 static bfd_boolean warned = FALSE;
d1f5c6e3
L
6666 if (!warned)
6667 {
6668 error (_("section 0 in group section [%5u]\n"),
4fbb74a6 6669 section_headers_groups [entry]->group_index);
32ec8896 6670 warned = TRUE;
d1f5c6e3
L
6671 }
6672 }
e4b17d5c
L
6673 }
6674
4fbb74a6 6675 section_headers_groups [entry] = group;
e4b17d5c
L
6676
6677 if (do_section_groups)
6678 {
4fbb74a6 6679 sec = section_headers + entry;
74e1a04b 6680 printf (" [%5u] %s\n", entry, printable_section_name (sec));
ba2685cc
AM
6681 }
6682
3f5e193b 6683 g = (struct group_list *) xmalloc (sizeof (struct group_list));
e4b17d5c
L
6684 g->section_index = entry;
6685 g->next = group->root;
6686 group->root = g;
f5842774
L
6687 }
6688
f5842774
L
6689 if (start)
6690 free (start);
e4b17d5c
L
6691
6692 group++;
f5842774
L
6693 }
6694 }
6695
d1f5c6e3
L
6696 if (symtab)
6697 free (symtab);
6698 if (strtab)
6699 free (strtab);
32ec8896 6700 return TRUE;
f5842774
L
6701}
6702
28f997cf
TG
6703/* Data used to display dynamic fixups. */
6704
6705struct ia64_vms_dynfixup
6706{
6707 bfd_vma needed_ident; /* Library ident number. */
6708 bfd_vma needed; /* Index in the dstrtab of the library name. */
6709 bfd_vma fixup_needed; /* Index of the library. */
6710 bfd_vma fixup_rela_cnt; /* Number of fixups. */
6711 bfd_vma fixup_rela_off; /* Fixups offset in the dynamic segment. */
6712};
6713
6714/* Data used to display dynamic relocations. */
6715
6716struct ia64_vms_dynimgrela
6717{
6718 bfd_vma img_rela_cnt; /* Number of relocations. */
6719 bfd_vma img_rela_off; /* Reloc offset in the dynamic segment. */
6720};
6721
6722/* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6723 library). */
6724
32ec8896
NC
6725static bfd_boolean
6726dump_ia64_vms_dynamic_fixups (FILE * file,
6727 struct ia64_vms_dynfixup * fixup,
6728 const char * strtab,
6729 unsigned int strtab_sz)
28f997cf 6730{
32ec8896 6731 Elf64_External_VMS_IMAGE_FIXUP * imfs;
28f997cf 6732 long i;
32ec8896 6733 const char * lib_name;
28f997cf
TG
6734
6735 imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
6736 1, fixup->fixup_rela_cnt * sizeof (*imfs),
6737 _("dynamic section image fixups"));
6738 if (!imfs)
32ec8896 6739 return FALSE;
28f997cf
TG
6740
6741 if (fixup->needed < strtab_sz)
6742 lib_name = strtab + fixup->needed;
6743 else
6744 {
32ec8896 6745 warn (_("corrupt library name index of 0x%lx found in dynamic entry"),
7f01b0c6 6746 (unsigned long) fixup->needed);
28f997cf
TG
6747 lib_name = "???";
6748 }
6749 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
6750 (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
6751 printf
6752 (_("Seg Offset Type SymVec DataType\n"));
6753
6754 for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
6755 {
6756 unsigned int type;
6757 const char *rtype;
6758
6759 printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
6760 printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
6761 type = BYTE_GET (imfs [i].type);
6762 rtype = elf_ia64_reloc_type (type);
6763 if (rtype == NULL)
6764 printf (" 0x%08x ", type);
6765 else
6766 printf (" %-32s ", rtype);
6767 printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
6768 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
6769 }
6770
6771 free (imfs);
32ec8896 6772 return TRUE;
28f997cf
TG
6773}
6774
6775/* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
6776
32ec8896 6777static bfd_boolean
28f997cf
TG
6778dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
6779{
6780 Elf64_External_VMS_IMAGE_RELA *imrs;
6781 long i;
6782
6783 imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
6784 1, imgrela->img_rela_cnt * sizeof (*imrs),
9cf03b7e 6785 _("dynamic section image relocations"));
28f997cf 6786 if (!imrs)
32ec8896 6787 return FALSE;
28f997cf
TG
6788
6789 printf (_("\nImage relocs\n"));
6790 printf
6791 (_("Seg Offset Type Addend Seg Sym Off\n"));
6792
6793 for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
6794 {
6795 unsigned int type;
6796 const char *rtype;
6797
6798 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
6799 printf ("%08" BFD_VMA_FMT "x ",
6800 (bfd_vma) BYTE_GET (imrs [i].rela_offset));
6801 type = BYTE_GET (imrs [i].type);
6802 rtype = elf_ia64_reloc_type (type);
6803 if (rtype == NULL)
6804 printf ("0x%08x ", type);
6805 else
6806 printf ("%-31s ", rtype);
6807 print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
6808 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
6809 printf ("%08" BFD_VMA_FMT "x\n",
6810 (bfd_vma) BYTE_GET (imrs [i].sym_offset));
6811 }
6812
6813 free (imrs);
32ec8896 6814 return TRUE;
28f997cf
TG
6815}
6816
6817/* Display IA-64 OpenVMS dynamic relocations and fixups. */
6818
32ec8896 6819static bfd_boolean
28f997cf
TG
6820process_ia64_vms_dynamic_relocs (FILE *file)
6821{
6822 struct ia64_vms_dynfixup fixup;
6823 struct ia64_vms_dynimgrela imgrela;
6824 Elf_Internal_Dyn *entry;
28f997cf
TG
6825 bfd_vma strtab_off = 0;
6826 bfd_vma strtab_sz = 0;
6827 char *strtab = NULL;
32ec8896 6828 bfd_boolean res = TRUE;
28f997cf
TG
6829
6830 memset (&fixup, 0, sizeof (fixup));
6831 memset (&imgrela, 0, sizeof (imgrela));
6832
6833 /* Note: the order of the entries is specified by the OpenVMS specs. */
6834 for (entry = dynamic_section;
6835 entry < dynamic_section + dynamic_nent;
6836 entry++)
6837 {
6838 switch (entry->d_tag)
6839 {
6840 case DT_IA_64_VMS_STRTAB_OFFSET:
6841 strtab_off = entry->d_un.d_val;
6842 break;
6843 case DT_STRSZ:
6844 strtab_sz = entry->d_un.d_val;
6845 if (strtab == NULL)
6846 strtab = get_data (NULL, file, dynamic_addr + strtab_off,
6847 1, strtab_sz, _("dynamic string section"));
6848 break;
6849
6850 case DT_IA_64_VMS_NEEDED_IDENT:
6851 fixup.needed_ident = entry->d_un.d_val;
6852 break;
6853 case DT_NEEDED:
6854 fixup.needed = entry->d_un.d_val;
6855 break;
6856 case DT_IA_64_VMS_FIXUP_NEEDED:
6857 fixup.fixup_needed = entry->d_un.d_val;
6858 break;
6859 case DT_IA_64_VMS_FIXUP_RELA_CNT:
6860 fixup.fixup_rela_cnt = entry->d_un.d_val;
6861 break;
6862 case DT_IA_64_VMS_FIXUP_RELA_OFF:
6863 fixup.fixup_rela_off = entry->d_un.d_val;
32ec8896
NC
6864 if (! dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz))
6865 res = FALSE;
28f997cf 6866 break;
28f997cf
TG
6867 case DT_IA_64_VMS_IMG_RELA_CNT:
6868 imgrela.img_rela_cnt = entry->d_un.d_val;
6869 break;
6870 case DT_IA_64_VMS_IMG_RELA_OFF:
6871 imgrela.img_rela_off = entry->d_un.d_val;
32ec8896
NC
6872 if (! dump_ia64_vms_dynamic_relocs (file, &imgrela))
6873 res = FALSE;
28f997cf
TG
6874 break;
6875
6876 default:
6877 break;
6878 }
6879 }
6880
6881 if (strtab != NULL)
6882 free (strtab);
6883
6884 return res;
6885}
6886
85b1c36d 6887static struct
566b0d53 6888{
2cf0635d 6889 const char * name;
566b0d53
L
6890 int reloc;
6891 int size;
6892 int rela;
32ec8896
NC
6893}
6894 dynamic_relocations [] =
566b0d53 6895{
32ec8896
NC
6896 { "REL", DT_REL, DT_RELSZ, FALSE },
6897 { "RELA", DT_RELA, DT_RELASZ, TRUE },
6898 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
566b0d53
L
6899};
6900
252b5132 6901/* Process the reloc section. */
18bd398b 6902
32ec8896 6903static bfd_boolean
2cf0635d 6904process_relocs (FILE * file)
252b5132 6905{
b34976b6
AM
6906 unsigned long rel_size;
6907 unsigned long rel_offset;
252b5132 6908
252b5132 6909 if (!do_reloc)
32ec8896 6910 return TRUE;
252b5132
RH
6911
6912 if (do_using_dynamic)
6913 {
32ec8896 6914 int is_rela;
2cf0635d 6915 const char * name;
32ec8896 6916 bfd_boolean has_dynamic_reloc;
566b0d53 6917 unsigned int i;
0de14b54 6918
32ec8896 6919 has_dynamic_reloc = FALSE;
252b5132 6920
566b0d53 6921 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
252b5132 6922 {
566b0d53
L
6923 is_rela = dynamic_relocations [i].rela;
6924 name = dynamic_relocations [i].name;
6925 rel_size = dynamic_info [dynamic_relocations [i].size];
6926 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
103f02d3 6927
32ec8896
NC
6928 if (rel_size)
6929 has_dynamic_reloc = TRUE;
566b0d53
L
6930
6931 if (is_rela == UNKNOWN)
aa903cfb 6932 {
566b0d53
L
6933 if (dynamic_relocations [i].reloc == DT_JMPREL)
6934 switch (dynamic_info[DT_PLTREL])
6935 {
6936 case DT_REL:
6937 is_rela = FALSE;
6938 break;
6939 case DT_RELA:
6940 is_rela = TRUE;
6941 break;
6942 }
aa903cfb 6943 }
252b5132 6944
566b0d53
L
6945 if (rel_size)
6946 {
6947 printf
6948 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
6949 name, rel_offset, rel_size);
252b5132 6950
d93f0186
NC
6951 dump_relocations (file,
6952 offset_from_vma (file, rel_offset, rel_size),
6953 rel_size,
566b0d53 6954 dynamic_symbols, num_dynamic_syms,
bb4d2ac2 6955 dynamic_strings, dynamic_strings_length,
32ec8896 6956 is_rela, TRUE /* is_dynamic */);
566b0d53 6957 }
252b5132 6958 }
566b0d53 6959
28f997cf 6960 if (is_ia64_vms ())
32ec8896
NC
6961 if (process_ia64_vms_dynamic_relocs (file))
6962 has_dynamic_reloc = TRUE;
28f997cf 6963
566b0d53 6964 if (! has_dynamic_reloc)
252b5132
RH
6965 printf (_("\nThere are no dynamic relocations in this file.\n"));
6966 }
6967 else
6968 {
2cf0635d 6969 Elf_Internal_Shdr * section;
b34976b6 6970 unsigned long i;
32ec8896 6971 bfd_boolean found = FALSE;
252b5132
RH
6972
6973 for (i = 0, section = section_headers;
6974 i < elf_header.e_shnum;
b34976b6 6975 i++, section++)
252b5132
RH
6976 {
6977 if ( section->sh_type != SHT_RELA
6978 && section->sh_type != SHT_REL)
6979 continue;
6980
6981 rel_offset = section->sh_offset;
6982 rel_size = section->sh_size;
6983
6984 if (rel_size)
6985 {
2cf0635d 6986 Elf_Internal_Shdr * strsec;
b34976b6 6987 int is_rela;
103f02d3 6988
252b5132
RH
6989 printf (_("\nRelocation section "));
6990
6991 if (string_table == NULL)
19936277 6992 printf ("%d", section->sh_name);
252b5132 6993 else
74e1a04b 6994 printf ("'%s'", printable_section_name (section));
252b5132
RH
6995
6996 printf (_(" at offset 0x%lx contains %lu entries:\n"),
6997 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
6998
d79b3d50
NC
6999 is_rela = section->sh_type == SHT_RELA;
7000
4fbb74a6
AM
7001 if (section->sh_link != 0
7002 && section->sh_link < elf_header.e_shnum)
af3fc3bc 7003 {
2cf0635d
NC
7004 Elf_Internal_Shdr * symsec;
7005 Elf_Internal_Sym * symtab;
d79b3d50 7006 unsigned long nsyms;
c256ffe7 7007 unsigned long strtablen = 0;
2cf0635d 7008 char * strtab = NULL;
57346661 7009
4fbb74a6 7010 symsec = section_headers + section->sh_link;
08d8fa11
JJ
7011 if (symsec->sh_type != SHT_SYMTAB
7012 && symsec->sh_type != SHT_DYNSYM)
7013 continue;
7014
ba5cdace 7015 symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms);
252b5132 7016
af3fc3bc
AM
7017 if (symtab == NULL)
7018 continue;
252b5132 7019
4fbb74a6
AM
7020 if (symsec->sh_link != 0
7021 && symsec->sh_link < elf_header.e_shnum)
c256ffe7 7022 {
4fbb74a6 7023 strsec = section_headers + symsec->sh_link;
103f02d3 7024
3f5e193b 7025 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
071436c6
NC
7026 1, strsec->sh_size,
7027 _("string table"));
c256ffe7
JJ
7028 strtablen = strtab == NULL ? 0 : strsec->sh_size;
7029 }
252b5132 7030
d79b3d50 7031 dump_relocations (file, rel_offset, rel_size,
bb4d2ac2
L
7032 symtab, nsyms, strtab, strtablen,
7033 is_rela,
7034 symsec->sh_type == SHT_DYNSYM);
d79b3d50
NC
7035 if (strtab)
7036 free (strtab);
7037 free (symtab);
7038 }
7039 else
7040 dump_relocations (file, rel_offset, rel_size,
32ec8896
NC
7041 NULL, 0, NULL, 0, is_rela,
7042 FALSE /* is_dynamic */);
252b5132 7043
32ec8896 7044 found = TRUE;
252b5132
RH
7045 }
7046 }
7047
7048 if (! found)
7049 printf (_("\nThere are no relocations in this file.\n"));
7050 }
7051
32ec8896 7052 return TRUE;
252b5132
RH
7053}
7054
4d6ed7c8
NC
7055/* An absolute address consists of a section and an offset. If the
7056 section is NULL, the offset itself is the address, otherwise, the
7057 address equals to LOAD_ADDRESS(section) + offset. */
7058
7059struct absaddr
948f632f
DA
7060{
7061 unsigned short section;
7062 bfd_vma offset;
7063};
4d6ed7c8 7064
1949de15
L
7065#define ABSADDR(a) \
7066 ((a).section \
7067 ? section_headers [(a).section].sh_addr + (a).offset \
7068 : (a).offset)
7069
948f632f
DA
7070/* Find the nearest symbol at or below ADDR. Returns the symbol
7071 name, if found, and the offset from the symbol to ADDR. */
4d6ed7c8 7072
4d6ed7c8 7073static void
2cf0635d 7074find_symbol_for_address (Elf_Internal_Sym * symtab,
948f632f
DA
7075 unsigned long nsyms,
7076 const char * strtab,
7077 unsigned long strtab_size,
7078 struct absaddr addr,
7079 const char ** symname,
7080 bfd_vma * offset)
4d6ed7c8 7081{
d3ba0551 7082 bfd_vma dist = 0x100000;
2cf0635d 7083 Elf_Internal_Sym * sym;
948f632f
DA
7084 Elf_Internal_Sym * beg;
7085 Elf_Internal_Sym * end;
2cf0635d 7086 Elf_Internal_Sym * best = NULL;
4d6ed7c8 7087
0b6ae522 7088 REMOVE_ARCH_BITS (addr.offset);
948f632f
DA
7089 beg = symtab;
7090 end = symtab + nsyms;
0b6ae522 7091
948f632f 7092 while (beg < end)
4d6ed7c8 7093 {
948f632f
DA
7094 bfd_vma value;
7095
7096 sym = beg + (end - beg) / 2;
0b6ae522 7097
948f632f 7098 value = sym->st_value;
0b6ae522
DJ
7099 REMOVE_ARCH_BITS (value);
7100
948f632f 7101 if (sym->st_name != 0
4d6ed7c8 7102 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
0b6ae522
DJ
7103 && addr.offset >= value
7104 && addr.offset - value < dist)
4d6ed7c8
NC
7105 {
7106 best = sym;
0b6ae522 7107 dist = addr.offset - value;
4d6ed7c8
NC
7108 if (!dist)
7109 break;
7110 }
948f632f
DA
7111
7112 if (addr.offset < value)
7113 end = sym;
7114 else
7115 beg = sym + 1;
4d6ed7c8 7116 }
1b31d05e 7117
4d6ed7c8
NC
7118 if (best)
7119 {
57346661 7120 *symname = (best->st_name >= strtab_size
2b692964 7121 ? _("<corrupt>") : strtab + best->st_name);
4d6ed7c8
NC
7122 *offset = dist;
7123 return;
7124 }
1b31d05e 7125
4d6ed7c8
NC
7126 *symname = NULL;
7127 *offset = addr.offset;
7128}
7129
32ec8896 7130static /* signed */ int
948f632f
DA
7131symcmp (const void *p, const void *q)
7132{
7133 Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
7134 Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
7135
7136 return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
7137}
7138
7139/* Process the unwind section. */
7140
7141#include "unwind-ia64.h"
7142
7143struct ia64_unw_table_entry
7144{
7145 struct absaddr start;
7146 struct absaddr end;
7147 struct absaddr info;
7148};
7149
7150struct ia64_unw_aux_info
7151{
32ec8896
NC
7152 struct ia64_unw_table_entry * table; /* Unwind table. */
7153 unsigned long table_len; /* Length of unwind table. */
7154 unsigned char * info; /* Unwind info. */
7155 unsigned long info_size; /* Size of unwind info. */
7156 bfd_vma info_addr; /* Starting address of unwind info. */
7157 bfd_vma seg_base; /* Starting address of segment. */
7158 Elf_Internal_Sym * symtab; /* The symbol table. */
7159 unsigned long nsyms; /* Number of symbols. */
7160 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7161 unsigned long nfuns; /* Number of entries in funtab. */
7162 char * strtab; /* The string table. */
7163 unsigned long strtab_size; /* Size of string table. */
948f632f
DA
7164};
7165
32ec8896 7166static bfd_boolean
2cf0635d 7167dump_ia64_unwind (struct ia64_unw_aux_info * aux)
4d6ed7c8 7168{
2cf0635d 7169 struct ia64_unw_table_entry * tp;
948f632f 7170 unsigned long j, nfuns;
4d6ed7c8 7171 int in_body;
32ec8896 7172 bfd_boolean res = TRUE;
7036c0e1 7173
948f632f
DA
7174 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7175 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7176 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7177 aux->funtab[nfuns++] = aux->symtab[j];
7178 aux->nfuns = nfuns;
7179 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7180
4d6ed7c8
NC
7181 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7182 {
7183 bfd_vma stamp;
7184 bfd_vma offset;
2cf0635d
NC
7185 const unsigned char * dp;
7186 const unsigned char * head;
53774b7e 7187 const unsigned char * end;
2cf0635d 7188 const char * procname;
4d6ed7c8 7189
948f632f 7190 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
57346661 7191 aux->strtab_size, tp->start, &procname, &offset);
4d6ed7c8
NC
7192
7193 fputs ("\n<", stdout);
7194
7195 if (procname)
7196 {
7197 fputs (procname, stdout);
7198
7199 if (offset)
7200 printf ("+%lx", (unsigned long) offset);
7201 }
7202
7203 fputs (">: [", stdout);
7204 print_vma (tp->start.offset, PREFIX_HEX);
7205 fputc ('-', stdout);
7206 print_vma (tp->end.offset, PREFIX_HEX);
86f55779 7207 printf ("], info at +0x%lx\n",
4d6ed7c8
NC
7208 (unsigned long) (tp->info.offset - aux->seg_base));
7209
53774b7e
NC
7210 /* PR 17531: file: 86232b32. */
7211 if (aux->info == NULL)
7212 continue;
7213
7214 /* PR 17531: file: 0997b4d1. */
7215 if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
7216 {
7217 warn (_("Invalid offset %lx in table entry %ld\n"),
7218 (long) tp->info.offset, (long) (tp - aux->table));
32ec8896 7219 res = FALSE;
53774b7e
NC
7220 continue;
7221 }
7222
1949de15 7223 head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
a4a00738 7224 stamp = byte_get ((unsigned char *) head, sizeof (stamp));
4d6ed7c8 7225
86f55779 7226 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4d6ed7c8
NC
7227 (unsigned) UNW_VER (stamp),
7228 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
7229 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
7230 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
89fac5e3 7231 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
4d6ed7c8
NC
7232
7233 if (UNW_VER (stamp) != 1)
7234 {
2b692964 7235 printf (_("\tUnknown version.\n"));
4d6ed7c8
NC
7236 continue;
7237 }
7238
7239 in_body = 0;
53774b7e
NC
7240 end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
7241 /* PR 17531: file: 16ceda89. */
7242 if (end > aux->info + aux->info_size)
7243 end = aux->info + aux->info_size;
7244 for (dp = head + 8; dp < end;)
b4477bc8 7245 dp = unw_decode (dp, in_body, & in_body, end);
4d6ed7c8 7246 }
948f632f
DA
7247
7248 free (aux->funtab);
32ec8896
NC
7249
7250 return res;
4d6ed7c8
NC
7251}
7252
53774b7e 7253static bfd_boolean
2cf0635d
NC
7254slurp_ia64_unwind_table (FILE * file,
7255 struct ia64_unw_aux_info * aux,
7256 Elf_Internal_Shdr * sec)
4d6ed7c8 7257{
89fac5e3 7258 unsigned long size, nrelas, i;
2cf0635d
NC
7259 Elf_Internal_Phdr * seg;
7260 struct ia64_unw_table_entry * tep;
7261 Elf_Internal_Shdr * relsec;
7262 Elf_Internal_Rela * rela;
7263 Elf_Internal_Rela * rp;
7264 unsigned char * table;
7265 unsigned char * tp;
7266 Elf_Internal_Sym * sym;
7267 const char * relname;
4d6ed7c8 7268
53774b7e
NC
7269 aux->table_len = 0;
7270
4d6ed7c8
NC
7271 /* First, find the starting address of the segment that includes
7272 this section: */
7273
7274 if (elf_header.e_phnum)
7275 {
d93f0186 7276 if (! get_program_headers (file))
53774b7e 7277 return FALSE;
4d6ed7c8 7278
d93f0186
NC
7279 for (seg = program_headers;
7280 seg < program_headers + elf_header.e_phnum;
7281 ++seg)
4d6ed7c8
NC
7282 {
7283 if (seg->p_type != PT_LOAD)
7284 continue;
7285
7286 if (sec->sh_addr >= seg->p_vaddr
7287 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7288 {
7289 aux->seg_base = seg->p_vaddr;
7290 break;
7291 }
7292 }
4d6ed7c8
NC
7293 }
7294
7295 /* Second, build the unwind table from the contents of the unwind section: */
7296 size = sec->sh_size;
3f5e193b
NC
7297 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7298 _("unwind table"));
a6e9f9df 7299 if (!table)
53774b7e 7300 return FALSE;
4d6ed7c8 7301
53774b7e 7302 aux->table_len = size / (3 * eh_addr_size);
3f5e193b 7303 aux->table = (struct ia64_unw_table_entry *)
53774b7e 7304 xcmalloc (aux->table_len, sizeof (aux->table[0]));
89fac5e3 7305 tep = aux->table;
53774b7e
NC
7306
7307 for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
4d6ed7c8
NC
7308 {
7309 tep->start.section = SHN_UNDEF;
7310 tep->end.section = SHN_UNDEF;
7311 tep->info.section = SHN_UNDEF;
c6a0c689
AM
7312 tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7313 tep->end.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7314 tep->info.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
4d6ed7c8
NC
7315 tep->start.offset += aux->seg_base;
7316 tep->end.offset += aux->seg_base;
7317 tep->info.offset += aux->seg_base;
7318 }
7319 free (table);
7320
41e92641 7321 /* Third, apply any relocations to the unwind table: */
4d6ed7c8
NC
7322 for (relsec = section_headers;
7323 relsec < section_headers + elf_header.e_shnum;
7324 ++relsec)
7325 {
7326 if (relsec->sh_type != SHT_RELA
4fbb74a6
AM
7327 || relsec->sh_info >= elf_header.e_shnum
7328 || section_headers + relsec->sh_info != sec)
4d6ed7c8
NC
7329 continue;
7330
7331 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7332 & rela, & nrelas))
53774b7e
NC
7333 {
7334 free (aux->table);
7335 aux->table = NULL;
7336 aux->table_len = 0;
7337 return FALSE;
7338 }
4d6ed7c8
NC
7339
7340 for (rp = rela; rp < rela + nrelas; ++rp)
7341 {
aca88567
NC
7342 relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
7343 sym = aux->symtab + get_reloc_symindex (rp->r_info);
4d6ed7c8 7344
82b1b41b
NC
7345 /* PR 17531: file: 9fa67536. */
7346 if (relname == NULL)
7347 {
7348 warn (_("Skipping unknown relocation type: %u\n"), get_reloc_type (rp->r_info));
7349 continue;
7350 }
948f632f 7351
0112cd26 7352 if (! const_strneq (relname, "R_IA64_SEGREL"))
4d6ed7c8 7353 {
82b1b41b 7354 warn (_("Skipping unexpected relocation type: %s\n"), relname);
4d6ed7c8
NC
7355 continue;
7356 }
7357
89fac5e3 7358 i = rp->r_offset / (3 * eh_addr_size);
4d6ed7c8 7359
53774b7e
NC
7360 /* PR 17531: file: 5bc8d9bf. */
7361 if (i >= aux->table_len)
7362 {
7363 warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
7364 continue;
7365 }
7366
7367 switch (rp->r_offset / eh_addr_size % 3)
4d6ed7c8
NC
7368 {
7369 case 0:
7370 aux->table[i].start.section = sym->st_shndx;
e466bc6e 7371 aux->table[i].start.offset = rp->r_addend + sym->st_value;
4d6ed7c8
NC
7372 break;
7373 case 1:
7374 aux->table[i].end.section = sym->st_shndx;
e466bc6e 7375 aux->table[i].end.offset = rp->r_addend + sym->st_value;
4d6ed7c8
NC
7376 break;
7377 case 2:
7378 aux->table[i].info.section = sym->st_shndx;
e466bc6e 7379 aux->table[i].info.offset = rp->r_addend + sym->st_value;
4d6ed7c8
NC
7380 break;
7381 default:
7382 break;
7383 }
7384 }
7385
7386 free (rela);
7387 }
7388
53774b7e 7389 return TRUE;
4d6ed7c8
NC
7390}
7391
32ec8896 7392static bfd_boolean
2cf0635d 7393ia64_process_unwind (FILE * file)
4d6ed7c8 7394{
2cf0635d
NC
7395 Elf_Internal_Shdr * sec;
7396 Elf_Internal_Shdr * unwsec = NULL;
7397 Elf_Internal_Shdr * strsec;
89fac5e3 7398 unsigned long i, unwcount = 0, unwstart = 0;
57346661 7399 struct ia64_unw_aux_info aux;
32ec8896 7400 bfd_boolean res = TRUE;
f1467e33 7401
4d6ed7c8
NC
7402 memset (& aux, 0, sizeof (aux));
7403
4d6ed7c8
NC
7404 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7405 {
c256ffe7 7406 if (sec->sh_type == SHT_SYMTAB
4fbb74a6 7407 && sec->sh_link < elf_header.e_shnum)
4d6ed7c8 7408 {
ba5cdace 7409 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
4d6ed7c8 7410
4fbb74a6 7411 strsec = section_headers + sec->sh_link;
4082ef84
NC
7412 if (aux.strtab != NULL)
7413 {
7414 error (_("Multiple auxillary string tables encountered\n"));
7415 free (aux.strtab);
32ec8896 7416 res = FALSE;
4082ef84 7417 }
3f5e193b
NC
7418 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7419 1, strsec->sh_size,
7420 _("string table"));
c256ffe7 7421 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
4d6ed7c8
NC
7422 }
7423 else if (sec->sh_type == SHT_IA_64_UNWIND)
579f31ac
JJ
7424 unwcount++;
7425 }
7426
7427 if (!unwcount)
7428 printf (_("\nThere are no unwind sections in this file.\n"));
7429
7430 while (unwcount-- > 0)
7431 {
2cf0635d 7432 char * suffix;
579f31ac
JJ
7433 size_t len, len2;
7434
4082ef84 7435 for (i = unwstart, sec = section_headers + unwstart, unwsec = NULL;
579f31ac
JJ
7436 i < elf_header.e_shnum; ++i, ++sec)
7437 if (sec->sh_type == SHT_IA_64_UNWIND)
7438 {
7439 unwsec = sec;
7440 break;
7441 }
4082ef84
NC
7442 /* We have already counted the number of SHT_IA64_UNWIND
7443 sections so the loop above should never fail. */
7444 assert (unwsec != NULL);
579f31ac
JJ
7445
7446 unwstart = i + 1;
7447 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
7448
e4b17d5c
L
7449 if ((unwsec->sh_flags & SHF_GROUP) != 0)
7450 {
7451 /* We need to find which section group it is in. */
4082ef84 7452 struct group_list * g;
e4b17d5c 7453
4082ef84
NC
7454 if (section_headers_groups == NULL
7455 || section_headers_groups [i] == NULL)
7456 i = elf_header.e_shnum;
7457 else
e4b17d5c 7458 {
4082ef84 7459 g = section_headers_groups [i]->root;
18bd398b 7460
4082ef84
NC
7461 for (; g != NULL; g = g->next)
7462 {
7463 sec = section_headers + g->section_index;
e4b17d5c 7464
4082ef84
NC
7465 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
7466 break;
7467 }
7468
7469 if (g == NULL)
7470 i = elf_header.e_shnum;
7471 }
e4b17d5c 7472 }
18bd398b 7473 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
579f31ac 7474 {
18bd398b 7475 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
579f31ac
JJ
7476 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
7477 suffix = SECTION_NAME (unwsec) + len;
7478 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7479 ++i, ++sec)
18bd398b
NC
7480 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
7481 && streq (SECTION_NAME (sec) + len2, suffix))
579f31ac
JJ
7482 break;
7483 }
7484 else
7485 {
7486 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
18bd398b 7487 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
579f31ac
JJ
7488 len = sizeof (ELF_STRING_ia64_unwind) - 1;
7489 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
7490 suffix = "";
18bd398b 7491 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
579f31ac
JJ
7492 suffix = SECTION_NAME (unwsec) + len;
7493 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7494 ++i, ++sec)
18bd398b
NC
7495 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
7496 && streq (SECTION_NAME (sec) + len2, suffix))
579f31ac
JJ
7497 break;
7498 }
7499
7500 if (i == elf_header.e_shnum)
7501 {
7502 printf (_("\nCould not find unwind info section for "));
7503
7504 if (string_table == NULL)
7505 printf ("%d", unwsec->sh_name);
7506 else
74e1a04b 7507 printf ("'%s'", printable_section_name (unwsec));
579f31ac
JJ
7508 }
7509 else
4d6ed7c8 7510 {
4d6ed7c8 7511 aux.info_addr = sec->sh_addr;
3f5e193b 7512 aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
4082ef84
NC
7513 sec->sh_size,
7514 _("unwind info"));
59245841 7515 aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
4d6ed7c8 7516
579f31ac 7517 printf (_("\nUnwind section "));
4d6ed7c8 7518
579f31ac
JJ
7519 if (string_table == NULL)
7520 printf ("%d", unwsec->sh_name);
7521 else
74e1a04b 7522 printf ("'%s'", printable_section_name (unwsec));
4d6ed7c8 7523
579f31ac 7524 printf (_(" at offset 0x%lx contains %lu entries:\n"),
e59b4dfb 7525 (unsigned long) unwsec->sh_offset,
89fac5e3 7526 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
4d6ed7c8 7527
53774b7e
NC
7528 if (slurp_ia64_unwind_table (file, & aux, unwsec)
7529 && aux.table_len > 0)
579f31ac
JJ
7530 dump_ia64_unwind (& aux);
7531
7532 if (aux.table)
7533 free ((char *) aux.table);
7534 if (aux.info)
7535 free ((char *) aux.info);
7536 aux.table = NULL;
7537 aux.info = NULL;
7538 }
4d6ed7c8 7539 }
4d6ed7c8 7540
4d6ed7c8
NC
7541 if (aux.symtab)
7542 free (aux.symtab);
7543 if (aux.strtab)
7544 free ((char *) aux.strtab);
32ec8896
NC
7545
7546 return res;
4d6ed7c8
NC
7547}
7548
3f5e193b 7549struct hppa_unw_table_entry
32ec8896
NC
7550{
7551 struct absaddr start;
7552 struct absaddr end;
7553 unsigned int Cannot_unwind:1; /* 0 */
7554 unsigned int Millicode:1; /* 1 */
7555 unsigned int Millicode_save_sr0:1; /* 2 */
7556 unsigned int Region_description:2; /* 3..4 */
7557 unsigned int reserved1:1; /* 5 */
7558 unsigned int Entry_SR:1; /* 6 */
7559 unsigned int Entry_FR:4; /* Number saved 7..10 */
7560 unsigned int Entry_GR:5; /* Number saved 11..15 */
7561 unsigned int Args_stored:1; /* 16 */
7562 unsigned int Variable_Frame:1; /* 17 */
7563 unsigned int Separate_Package_Body:1; /* 18 */
7564 unsigned int Frame_Extension_Millicode:1; /* 19 */
7565 unsigned int Stack_Overflow_Check:1; /* 20 */
7566 unsigned int Two_Instruction_SP_Increment:1; /* 21 */
7567 unsigned int Ada_Region:1; /* 22 */
7568 unsigned int cxx_info:1; /* 23 */
7569 unsigned int cxx_try_catch:1; /* 24 */
7570 unsigned int sched_entry_seq:1; /* 25 */
7571 unsigned int reserved2:1; /* 26 */
7572 unsigned int Save_SP:1; /* 27 */
7573 unsigned int Save_RP:1; /* 28 */
7574 unsigned int Save_MRP_in_frame:1; /* 29 */
7575 unsigned int extn_ptr_defined:1; /* 30 */
7576 unsigned int Cleanup_defined:1; /* 31 */
7577
7578 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
7579 unsigned int HP_UX_interrupt_marker:1; /* 1 */
7580 unsigned int Large_frame:1; /* 2 */
7581 unsigned int Pseudo_SP_Set:1; /* 3 */
7582 unsigned int reserved4:1; /* 4 */
7583 unsigned int Total_frame_size:27; /* 5..31 */
7584};
3f5e193b 7585
57346661 7586struct hppa_unw_aux_info
948f632f 7587{
32ec8896
NC
7588 struct hppa_unw_table_entry * table; /* Unwind table. */
7589 unsigned long table_len; /* Length of unwind table. */
7590 bfd_vma seg_base; /* Starting address of segment. */
7591 Elf_Internal_Sym * symtab; /* The symbol table. */
7592 unsigned long nsyms; /* Number of symbols. */
7593 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7594 unsigned long nfuns; /* Number of entries in funtab. */
7595 char * strtab; /* The string table. */
7596 unsigned long strtab_size; /* Size of string table. */
948f632f 7597};
57346661 7598
32ec8896 7599static bfd_boolean
2cf0635d 7600dump_hppa_unwind (struct hppa_unw_aux_info * aux)
57346661 7601{
2cf0635d 7602 struct hppa_unw_table_entry * tp;
948f632f 7603 unsigned long j, nfuns;
32ec8896 7604 bfd_boolean res = TRUE;
948f632f
DA
7605
7606 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7607 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7608 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7609 aux->funtab[nfuns++] = aux->symtab[j];
7610 aux->nfuns = nfuns;
7611 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
57346661 7612
57346661
AM
7613 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7614 {
7615 bfd_vma offset;
2cf0635d 7616 const char * procname;
57346661 7617
948f632f 7618 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
57346661
AM
7619 aux->strtab_size, tp->start, &procname,
7620 &offset);
7621
7622 fputs ("\n<", stdout);
7623
7624 if (procname)
7625 {
7626 fputs (procname, stdout);
7627
7628 if (offset)
7629 printf ("+%lx", (unsigned long) offset);
7630 }
7631
7632 fputs (">: [", stdout);
7633 print_vma (tp->start.offset, PREFIX_HEX);
7634 fputc ('-', stdout);
7635 print_vma (tp->end.offset, PREFIX_HEX);
7636 printf ("]\n\t");
7637
18bd398b
NC
7638#define PF(_m) if (tp->_m) printf (#_m " ");
7639#define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
57346661
AM
7640 PF(Cannot_unwind);
7641 PF(Millicode);
7642 PF(Millicode_save_sr0);
18bd398b 7643 /* PV(Region_description); */
57346661
AM
7644 PF(Entry_SR);
7645 PV(Entry_FR);
7646 PV(Entry_GR);
7647 PF(Args_stored);
7648 PF(Variable_Frame);
7649 PF(Separate_Package_Body);
7650 PF(Frame_Extension_Millicode);
7651 PF(Stack_Overflow_Check);
7652 PF(Two_Instruction_SP_Increment);
7653 PF(Ada_Region);
7654 PF(cxx_info);
7655 PF(cxx_try_catch);
7656 PF(sched_entry_seq);
7657 PF(Save_SP);
7658 PF(Save_RP);
7659 PF(Save_MRP_in_frame);
7660 PF(extn_ptr_defined);
7661 PF(Cleanup_defined);
7662 PF(MPE_XL_interrupt_marker);
7663 PF(HP_UX_interrupt_marker);
7664 PF(Large_frame);
7665 PF(Pseudo_SP_Set);
7666 PV(Total_frame_size);
7667#undef PF
7668#undef PV
7669 }
7670
18bd398b 7671 printf ("\n");
948f632f
DA
7672
7673 free (aux->funtab);
32ec8896
NC
7674
7675 return res;
57346661
AM
7676}
7677
32ec8896 7678static bfd_boolean
2cf0635d
NC
7679slurp_hppa_unwind_table (FILE * file,
7680 struct hppa_unw_aux_info * aux,
7681 Elf_Internal_Shdr * sec)
57346661 7682{
1c0751b2 7683 unsigned long size, unw_ent_size, nentries, nrelas, i;
2cf0635d
NC
7684 Elf_Internal_Phdr * seg;
7685 struct hppa_unw_table_entry * tep;
7686 Elf_Internal_Shdr * relsec;
7687 Elf_Internal_Rela * rela;
7688 Elf_Internal_Rela * rp;
7689 unsigned char * table;
7690 unsigned char * tp;
7691 Elf_Internal_Sym * sym;
7692 const char * relname;
57346661 7693
57346661
AM
7694 /* First, find the starting address of the segment that includes
7695 this section. */
57346661
AM
7696 if (elf_header.e_phnum)
7697 {
7698 if (! get_program_headers (file))
32ec8896 7699 return FALSE;
57346661
AM
7700
7701 for (seg = program_headers;
7702 seg < program_headers + elf_header.e_phnum;
7703 ++seg)
7704 {
7705 if (seg->p_type != PT_LOAD)
7706 continue;
7707
7708 if (sec->sh_addr >= seg->p_vaddr
7709 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7710 {
7711 aux->seg_base = seg->p_vaddr;
7712 break;
7713 }
7714 }
7715 }
7716
7717 /* Second, build the unwind table from the contents of the unwind
7718 section. */
7719 size = sec->sh_size;
3f5e193b
NC
7720 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7721 _("unwind table"));
57346661 7722 if (!table)
32ec8896 7723 return FALSE;
57346661 7724
1c0751b2
DA
7725 unw_ent_size = 16;
7726 nentries = size / unw_ent_size;
7727 size = unw_ent_size * nentries;
57346661 7728
3f5e193b
NC
7729 tep = aux->table = (struct hppa_unw_table_entry *)
7730 xcmalloc (nentries, sizeof (aux->table[0]));
57346661 7731
1c0751b2 7732 for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
57346661
AM
7733 {
7734 unsigned int tmp1, tmp2;
7735
7736 tep->start.section = SHN_UNDEF;
7737 tep->end.section = SHN_UNDEF;
7738
1c0751b2
DA
7739 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
7740 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
7741 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
7742 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
7743
7744 tep->start.offset += aux->seg_base;
7745 tep->end.offset += aux->seg_base;
57346661
AM
7746
7747 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
7748 tep->Millicode = (tmp1 >> 30) & 0x1;
7749 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
7750 tep->Region_description = (tmp1 >> 27) & 0x3;
7751 tep->reserved1 = (tmp1 >> 26) & 0x1;
7752 tep->Entry_SR = (tmp1 >> 25) & 0x1;
7753 tep->Entry_FR = (tmp1 >> 21) & 0xf;
7754 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
7755 tep->Args_stored = (tmp1 >> 15) & 0x1;
7756 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
7757 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
7758 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
7759 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
7760 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
7761 tep->Ada_Region = (tmp1 >> 9) & 0x1;
7762 tep->cxx_info = (tmp1 >> 8) & 0x1;
7763 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
7764 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
7765 tep->reserved2 = (tmp1 >> 5) & 0x1;
7766 tep->Save_SP = (tmp1 >> 4) & 0x1;
7767 tep->Save_RP = (tmp1 >> 3) & 0x1;
7768 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
7769 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
7770 tep->Cleanup_defined = tmp1 & 0x1;
7771
7772 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
7773 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
7774 tep->Large_frame = (tmp2 >> 29) & 0x1;
7775 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
7776 tep->reserved4 = (tmp2 >> 27) & 0x1;
7777 tep->Total_frame_size = tmp2 & 0x7ffffff;
57346661
AM
7778 }
7779 free (table);
7780
7781 /* Third, apply any relocations to the unwind table. */
57346661
AM
7782 for (relsec = section_headers;
7783 relsec < section_headers + elf_header.e_shnum;
7784 ++relsec)
7785 {
7786 if (relsec->sh_type != SHT_RELA
4fbb74a6
AM
7787 || relsec->sh_info >= elf_header.e_shnum
7788 || section_headers + relsec->sh_info != sec)
57346661
AM
7789 continue;
7790
7791 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7792 & rela, & nrelas))
32ec8896 7793 return FALSE;
57346661
AM
7794
7795 for (rp = rela; rp < rela + nrelas; ++rp)
7796 {
aca88567
NC
7797 relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
7798 sym = aux->symtab + get_reloc_symindex (rp->r_info);
57346661
AM
7799
7800 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
0112cd26 7801 if (! const_strneq (relname, "R_PARISC_SEGREL"))
57346661
AM
7802 {
7803 warn (_("Skipping unexpected relocation type %s\n"), relname);
7804 continue;
7805 }
7806
7807 i = rp->r_offset / unw_ent_size;
7808
89fac5e3 7809 switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
57346661
AM
7810 {
7811 case 0:
7812 aux->table[i].start.section = sym->st_shndx;
1e456d54 7813 aux->table[i].start.offset = sym->st_value + rp->r_addend;
57346661
AM
7814 break;
7815 case 1:
7816 aux->table[i].end.section = sym->st_shndx;
1e456d54 7817 aux->table[i].end.offset = sym->st_value + rp->r_addend;
57346661
AM
7818 break;
7819 default:
7820 break;
7821 }
7822 }
7823
7824 free (rela);
7825 }
7826
1c0751b2 7827 aux->table_len = nentries;
57346661 7828
32ec8896 7829 return TRUE;
57346661
AM
7830}
7831
32ec8896 7832static bfd_boolean
2cf0635d 7833hppa_process_unwind (FILE * file)
57346661 7834{
57346661 7835 struct hppa_unw_aux_info aux;
2cf0635d
NC
7836 Elf_Internal_Shdr * unwsec = NULL;
7837 Elf_Internal_Shdr * strsec;
7838 Elf_Internal_Shdr * sec;
18bd398b 7839 unsigned long i;
32ec8896 7840 bfd_boolean res = TRUE;
57346661 7841
c256ffe7 7842 if (string_table == NULL)
32ec8896 7843 return FALSE;
1b31d05e
NC
7844
7845 memset (& aux, 0, sizeof (aux));
57346661
AM
7846
7847 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7848 {
c256ffe7 7849 if (sec->sh_type == SHT_SYMTAB
4fbb74a6 7850 && sec->sh_link < elf_header.e_shnum)
57346661 7851 {
ba5cdace 7852 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
57346661 7853
4fbb74a6 7854 strsec = section_headers + sec->sh_link;
4082ef84
NC
7855 if (aux.strtab != NULL)
7856 {
7857 error (_("Multiple auxillary string tables encountered\n"));
7858 free (aux.strtab);
32ec8896 7859 res = FALSE;
4082ef84 7860 }
3f5e193b
NC
7861 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7862 1, strsec->sh_size,
7863 _("string table"));
c256ffe7 7864 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
57346661 7865 }
18bd398b 7866 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
57346661
AM
7867 unwsec = sec;
7868 }
7869
7870 if (!unwsec)
7871 printf (_("\nThere are no unwind sections in this file.\n"));
7872
7873 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7874 {
18bd398b 7875 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
57346661 7876 {
74e1a04b
NC
7877 printf (_("\nUnwind section '%s' at offset 0x%lx contains %lu entries:\n"),
7878 printable_section_name (sec),
57346661 7879 (unsigned long) sec->sh_offset,
89fac5e3 7880 (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
57346661 7881
32ec8896
NC
7882 if (! slurp_hppa_unwind_table (file, &aux, sec))
7883 res = FALSE;
7884
57346661 7885 if (aux.table_len > 0)
32ec8896
NC
7886 {
7887 if (! dump_hppa_unwind (&aux))
7888 res = FALSE;
7889 }
57346661
AM
7890
7891 if (aux.table)
7892 free ((char *) aux.table);
7893 aux.table = NULL;
7894 }
7895 }
7896
7897 if (aux.symtab)
7898 free (aux.symtab);
7899 if (aux.strtab)
7900 free ((char *) aux.strtab);
32ec8896
NC
7901
7902 return res;
57346661
AM
7903}
7904
0b6ae522
DJ
7905struct arm_section
7906{
a734115a
NC
7907 unsigned char * data; /* The unwind data. */
7908 Elf_Internal_Shdr * sec; /* The cached unwind section header. */
7909 Elf_Internal_Rela * rela; /* The cached relocations for this section. */
7910 unsigned long nrelas; /* The number of relocations. */
7911 unsigned int rel_type; /* REL or RELA ? */
7912 Elf_Internal_Rela * next_rela; /* Cyclic pointer to the next reloc to process. */
0b6ae522
DJ
7913};
7914
7915struct arm_unw_aux_info
7916{
a734115a
NC
7917 FILE * file; /* The file containing the unwind sections. */
7918 Elf_Internal_Sym * symtab; /* The file's symbol table. */
7919 unsigned long nsyms; /* Number of symbols. */
948f632f
DA
7920 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7921 unsigned long nfuns; /* Number of these symbols. */
a734115a
NC
7922 char * strtab; /* The file's string table. */
7923 unsigned long strtab_size; /* Size of string table. */
0b6ae522
DJ
7924};
7925
7926static const char *
7927arm_print_vma_and_name (struct arm_unw_aux_info *aux,
7928 bfd_vma fn, struct absaddr addr)
7929{
7930 const char *procname;
7931 bfd_vma sym_offset;
7932
7933 if (addr.section == SHN_UNDEF)
7934 addr.offset = fn;
7935
948f632f 7936 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
0b6ae522
DJ
7937 aux->strtab_size, addr, &procname,
7938 &sym_offset);
7939
7940 print_vma (fn, PREFIX_HEX);
7941
7942 if (procname)
7943 {
7944 fputs (" <", stdout);
7945 fputs (procname, stdout);
7946
7947 if (sym_offset)
7948 printf ("+0x%lx", (unsigned long) sym_offset);
7949 fputc ('>', stdout);
7950 }
7951
7952 return procname;
7953}
7954
7955static void
7956arm_free_section (struct arm_section *arm_sec)
7957{
7958 if (arm_sec->data != NULL)
7959 free (arm_sec->data);
7960
7961 if (arm_sec->rela != NULL)
7962 free (arm_sec->rela);
7963}
7964
a734115a
NC
7965/* 1) If SEC does not match the one cached in ARM_SEC, then free the current
7966 cached section and install SEC instead.
7967 2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
7968 and return its valued in * WORDP, relocating if necessary.
1b31d05e 7969 3) Update the NEXT_RELA field in ARM_SEC and store the section index and
a734115a 7970 relocation's offset in ADDR.
1b31d05e
NC
7971 4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
7972 into the string table of the symbol associated with the reloc. If no
7973 reloc was applied store -1 there.
7974 5) Return TRUE upon success, FALSE otherwise. */
a734115a
NC
7975
7976static bfd_boolean
1b31d05e
NC
7977get_unwind_section_word (struct arm_unw_aux_info * aux,
7978 struct arm_section * arm_sec,
7979 Elf_Internal_Shdr * sec,
7980 bfd_vma word_offset,
7981 unsigned int * wordp,
7982 struct absaddr * addr,
7983 bfd_vma * sym_name)
0b6ae522
DJ
7984{
7985 Elf_Internal_Rela *rp;
7986 Elf_Internal_Sym *sym;
7987 const char * relname;
7988 unsigned int word;
7989 bfd_boolean wrapped;
7990
e0a31db1
NC
7991 if (sec == NULL || arm_sec == NULL)
7992 return FALSE;
7993
0b6ae522
DJ
7994 addr->section = SHN_UNDEF;
7995 addr->offset = 0;
7996
1b31d05e
NC
7997 if (sym_name != NULL)
7998 *sym_name = (bfd_vma) -1;
7999
a734115a 8000 /* If necessary, update the section cache. */
0b6ae522
DJ
8001 if (sec != arm_sec->sec)
8002 {
8003 Elf_Internal_Shdr *relsec;
8004
8005 arm_free_section (arm_sec);
8006
8007 arm_sec->sec = sec;
8008 arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
8009 sec->sh_size, _("unwind data"));
0b6ae522
DJ
8010 arm_sec->rela = NULL;
8011 arm_sec->nrelas = 0;
8012
8013 for (relsec = section_headers;
8014 relsec < section_headers + elf_header.e_shnum;
8015 ++relsec)
8016 {
8017 if (relsec->sh_info >= elf_header.e_shnum
1ae40aa4
NC
8018 || section_headers + relsec->sh_info != sec
8019 /* PR 15745: Check the section type as well. */
8020 || (relsec->sh_type != SHT_REL
8021 && relsec->sh_type != SHT_RELA))
0b6ae522
DJ
8022 continue;
8023
a734115a 8024 arm_sec->rel_type = relsec->sh_type;
0b6ae522
DJ
8025 if (relsec->sh_type == SHT_REL)
8026 {
8027 if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
8028 relsec->sh_size,
8029 & arm_sec->rela, & arm_sec->nrelas))
a734115a 8030 return FALSE;
0b6ae522 8031 }
1ae40aa4 8032 else /* relsec->sh_type == SHT_RELA */
0b6ae522
DJ
8033 {
8034 if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
8035 relsec->sh_size,
8036 & arm_sec->rela, & arm_sec->nrelas))
a734115a 8037 return FALSE;
0b6ae522 8038 }
1ae40aa4 8039 break;
0b6ae522
DJ
8040 }
8041
8042 arm_sec->next_rela = arm_sec->rela;
8043 }
8044
a734115a 8045 /* If there is no unwind data we can do nothing. */
0b6ae522 8046 if (arm_sec->data == NULL)
a734115a 8047 return FALSE;
0b6ae522 8048
e0a31db1 8049 /* If the offset is invalid then fail. */
1a915552
NC
8050 if (word_offset > (sec->sh_size - 4)
8051 /* PR 18879 */
8052 || (sec->sh_size < 5 && word_offset >= sec->sh_size)
8053 || ((bfd_signed_vma) word_offset) < 0)
e0a31db1
NC
8054 return FALSE;
8055
a734115a 8056 /* Get the word at the required offset. */
0b6ae522
DJ
8057 word = byte_get (arm_sec->data + word_offset, 4);
8058
0eff7165
NC
8059 /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128. */
8060 if (arm_sec->rela == NULL)
8061 {
8062 * wordp = word;
8063 return TRUE;
8064 }
8065
a734115a 8066 /* Look through the relocs to find the one that applies to the provided offset. */
0b6ae522
DJ
8067 wrapped = FALSE;
8068 for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
8069 {
8070 bfd_vma prelval, offset;
8071
8072 if (rp->r_offset > word_offset && !wrapped)
8073 {
8074 rp = arm_sec->rela;
8075 wrapped = TRUE;
8076 }
8077 if (rp->r_offset > word_offset)
8078 break;
8079
8080 if (rp->r_offset & 3)
8081 {
8082 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
8083 (unsigned long) rp->r_offset);
8084 continue;
8085 }
8086
8087 if (rp->r_offset < word_offset)
8088 continue;
8089
74e1a04b
NC
8090 /* PR 17531: file: 027-161405-0.004 */
8091 if (aux->symtab == NULL)
8092 continue;
8093
0b6ae522
DJ
8094 if (arm_sec->rel_type == SHT_REL)
8095 {
8096 offset = word & 0x7fffffff;
8097 if (offset & 0x40000000)
8098 offset |= ~ (bfd_vma) 0x7fffffff;
8099 }
a734115a 8100 else if (arm_sec->rel_type == SHT_RELA)
0b6ae522 8101 offset = rp->r_addend;
a734115a 8102 else
74e1a04b
NC
8103 {
8104 error (_("Unknown section relocation type %d encountered\n"),
8105 arm_sec->rel_type);
8106 break;
8107 }
0b6ae522 8108
071436c6
NC
8109 /* PR 17531 file: 027-1241568-0.004. */
8110 if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
8111 {
8112 error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
8113 (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
8114 break;
8115 }
8116
8117 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
0b6ae522
DJ
8118 offset += sym->st_value;
8119 prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
8120
a734115a
NC
8121 /* Check that we are processing the expected reloc type. */
8122 if (elf_header.e_machine == EM_ARM)
8123 {
8124 relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
071436c6
NC
8125 if (relname == NULL)
8126 {
8127 warn (_("Skipping unknown ARM relocation type: %d\n"),
8128 (int) ELF32_R_TYPE (rp->r_info));
8129 continue;
8130 }
a734115a
NC
8131
8132 if (streq (relname, "R_ARM_NONE"))
8133 continue;
0b4362b0 8134
a734115a
NC
8135 if (! streq (relname, "R_ARM_PREL31"))
8136 {
071436c6 8137 warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
a734115a
NC
8138 continue;
8139 }
8140 }
8141 else if (elf_header.e_machine == EM_TI_C6000)
8142 {
8143 relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
071436c6
NC
8144 if (relname == NULL)
8145 {
8146 warn (_("Skipping unknown C6000 relocation type: %d\n"),
8147 (int) ELF32_R_TYPE (rp->r_info));
8148 continue;
8149 }
0b4362b0 8150
a734115a
NC
8151 if (streq (relname, "R_C6000_NONE"))
8152 continue;
8153
8154 if (! streq (relname, "R_C6000_PREL31"))
8155 {
071436c6 8156 warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
a734115a
NC
8157 continue;
8158 }
8159
8160 prelval >>= 1;
8161 }
8162 else
74e1a04b
NC
8163 {
8164 /* This function currently only supports ARM and TI unwinders. */
8165 warn (_("Only TI and ARM unwinders are currently supported\n"));
8166 break;
8167 }
fa197c1c 8168
0b6ae522
DJ
8169 word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
8170 addr->section = sym->st_shndx;
8171 addr->offset = offset;
74e1a04b 8172
1b31d05e
NC
8173 if (sym_name)
8174 * sym_name = sym->st_name;
0b6ae522
DJ
8175 break;
8176 }
8177
8178 *wordp = word;
8179 arm_sec->next_rela = rp;
8180
a734115a 8181 return TRUE;
0b6ae522
DJ
8182}
8183
a734115a
NC
8184static const char *tic6x_unwind_regnames[16] =
8185{
0b4362b0
RM
8186 "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
8187 "A14", "A13", "A12", "A11", "A10",
a734115a
NC
8188 "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
8189};
fa197c1c 8190
0b6ae522 8191static void
fa197c1c 8192decode_tic6x_unwind_regmask (unsigned int mask)
0b6ae522 8193{
fa197c1c
PB
8194 int i;
8195
8196 for (i = 12; mask; mask >>= 1, i--)
8197 {
8198 if (mask & 1)
8199 {
8200 fputs (tic6x_unwind_regnames[i], stdout);
8201 if (mask > 1)
8202 fputs (", ", stdout);
8203 }
8204 }
8205}
0b6ae522
DJ
8206
8207#define ADVANCE \
8208 if (remaining == 0 && more_words) \
8209 { \
8210 data_offset += 4; \
1b31d05e
NC
8211 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, \
8212 data_offset, & word, & addr, NULL)) \
32ec8896 8213 return FALSE; \
0b6ae522
DJ
8214 remaining = 4; \
8215 more_words--; \
8216 } \
8217
8218#define GET_OP(OP) \
8219 ADVANCE; \
8220 if (remaining) \
8221 { \
8222 remaining--; \
8223 (OP) = word >> 24; \
8224 word <<= 8; \
8225 } \
8226 else \
8227 { \
2b692964 8228 printf (_("[Truncated opcode]\n")); \
32ec8896 8229 return FALSE; \
0b6ae522 8230 } \
cc5914eb 8231 printf ("0x%02x ", OP)
0b6ae522 8232
32ec8896 8233static bfd_boolean
948f632f
DA
8234decode_arm_unwind_bytecode (struct arm_unw_aux_info * aux,
8235 unsigned int word,
8236 unsigned int remaining,
8237 unsigned int more_words,
8238 bfd_vma data_offset,
8239 Elf_Internal_Shdr * data_sec,
8240 struct arm_section * data_arm_sec)
fa197c1c
PB
8241{
8242 struct absaddr addr;
32ec8896 8243 bfd_boolean res = TRUE;
0b6ae522
DJ
8244
8245 /* Decode the unwinding instructions. */
8246 while (1)
8247 {
8248 unsigned int op, op2;
8249
8250 ADVANCE;
8251 if (remaining == 0)
8252 break;
8253 remaining--;
8254 op = word >> 24;
8255 word <<= 8;
8256
cc5914eb 8257 printf (" 0x%02x ", op);
0b6ae522
DJ
8258
8259 if ((op & 0xc0) == 0x00)
8260 {
8261 int offset = ((op & 0x3f) << 2) + 4;
61865e30 8262
cc5914eb 8263 printf (" vsp = vsp + %d", offset);
0b6ae522
DJ
8264 }
8265 else if ((op & 0xc0) == 0x40)
8266 {
8267 int offset = ((op & 0x3f) << 2) + 4;
61865e30 8268
cc5914eb 8269 printf (" vsp = vsp - %d", offset);
0b6ae522
DJ
8270 }
8271 else if ((op & 0xf0) == 0x80)
8272 {
8273 GET_OP (op2);
8274 if (op == 0x80 && op2 == 0)
8275 printf (_("Refuse to unwind"));
8276 else
8277 {
8278 unsigned int mask = ((op & 0x0f) << 8) | op2;
32ec8896 8279 bfd_boolean first = TRUE;
0b6ae522 8280 int i;
2b692964 8281
0b6ae522
DJ
8282 printf ("pop {");
8283 for (i = 0; i < 12; i++)
8284 if (mask & (1 << i))
8285 {
8286 if (first)
32ec8896 8287 first = FALSE;
0b6ae522
DJ
8288 else
8289 printf (", ");
8290 printf ("r%d", 4 + i);
8291 }
8292 printf ("}");
8293 }
8294 }
8295 else if ((op & 0xf0) == 0x90)
8296 {
8297 if (op == 0x9d || op == 0x9f)
8298 printf (_(" [Reserved]"));
8299 else
cc5914eb 8300 printf (" vsp = r%d", op & 0x0f);
0b6ae522
DJ
8301 }
8302 else if ((op & 0xf0) == 0xa0)
8303 {
8304 int end = 4 + (op & 0x07);
32ec8896 8305 bfd_boolean first = TRUE;
0b6ae522 8306 int i;
61865e30 8307
0b6ae522
DJ
8308 printf (" pop {");
8309 for (i = 4; i <= end; i++)
8310 {
8311 if (first)
32ec8896 8312 first = FALSE;
0b6ae522
DJ
8313 else
8314 printf (", ");
8315 printf ("r%d", i);
8316 }
8317 if (op & 0x08)
8318 {
1b31d05e 8319 if (!first)
0b6ae522
DJ
8320 printf (", ");
8321 printf ("r14");
8322 }
8323 printf ("}");
8324 }
8325 else if (op == 0xb0)
8326 printf (_(" finish"));
8327 else if (op == 0xb1)
8328 {
8329 GET_OP (op2);
8330 if (op2 == 0 || (op2 & 0xf0) != 0)
8331 printf (_("[Spare]"));
8332 else
8333 {
8334 unsigned int mask = op2 & 0x0f;
32ec8896 8335 bfd_boolean first = TRUE;
0b6ae522 8336 int i;
61865e30 8337
0b6ae522
DJ
8338 printf ("pop {");
8339 for (i = 0; i < 12; i++)
8340 if (mask & (1 << i))
8341 {
8342 if (first)
32ec8896 8343 first = FALSE;
0b6ae522
DJ
8344 else
8345 printf (", ");
8346 printf ("r%d", i);
8347 }
8348 printf ("}");
8349 }
8350 }
8351 else if (op == 0xb2)
8352 {
b115cf96 8353 unsigned char buf[9];
0b6ae522
DJ
8354 unsigned int i, len;
8355 unsigned long offset;
61865e30 8356
b115cf96 8357 for (i = 0; i < sizeof (buf); i++)
0b6ae522
DJ
8358 {
8359 GET_OP (buf[i]);
8360 if ((buf[i] & 0x80) == 0)
8361 break;
8362 }
4082ef84 8363 if (i == sizeof (buf))
32ec8896
NC
8364 {
8365 error (_("corrupt change to vsp"));
8366 res = FALSE;
8367 }
4082ef84
NC
8368 else
8369 {
8370 offset = read_uleb128 (buf, &len, buf + i + 1);
8371 assert (len == i + 1);
8372 offset = offset * 4 + 0x204;
8373 printf ("vsp = vsp + %ld", offset);
8374 }
0b6ae522 8375 }
61865e30 8376 else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
0b6ae522 8377 {
61865e30
NC
8378 unsigned int first, last;
8379
8380 GET_OP (op2);
8381 first = op2 >> 4;
8382 last = op2 & 0x0f;
8383 if (op == 0xc8)
8384 first = first + 16;
8385 printf ("pop {D%d", first);
8386 if (last)
8387 printf ("-D%d", first + last);
8388 printf ("}");
8389 }
8390 else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
8391 {
8392 unsigned int count = op & 0x07;
8393
8394 printf ("pop {D8");
8395 if (count)
8396 printf ("-D%d", 8 + count);
8397 printf ("}");
8398 }
8399 else if (op >= 0xc0 && op <= 0xc5)
8400 {
8401 unsigned int count = op & 0x07;
8402
8403 printf (" pop {wR10");
8404 if (count)
8405 printf ("-wR%d", 10 + count);
8406 printf ("}");
8407 }
8408 else if (op == 0xc6)
8409 {
8410 unsigned int first, last;
8411
8412 GET_OP (op2);
8413 first = op2 >> 4;
8414 last = op2 & 0x0f;
8415 printf ("pop {wR%d", first);
8416 if (last)
8417 printf ("-wR%d", first + last);
8418 printf ("}");
8419 }
8420 else if (op == 0xc7)
8421 {
8422 GET_OP (op2);
8423 if (op2 == 0 || (op2 & 0xf0) != 0)
8424 printf (_("[Spare]"));
0b6ae522
DJ
8425 else
8426 {
61865e30 8427 unsigned int mask = op2 & 0x0f;
32ec8896 8428 bfd_boolean first = TRUE;
61865e30
NC
8429 int i;
8430
8431 printf ("pop {");
8432 for (i = 0; i < 4; i++)
8433 if (mask & (1 << i))
8434 {
8435 if (first)
32ec8896 8436 first = FALSE;
61865e30
NC
8437 else
8438 printf (", ");
8439 printf ("wCGR%d", i);
8440 }
8441 printf ("}");
0b6ae522
DJ
8442 }
8443 }
61865e30 8444 else
32ec8896
NC
8445 {
8446 printf (_(" [unsupported opcode]"));
8447 res = FALSE;
8448 }
8449
0b6ae522
DJ
8450 printf ("\n");
8451 }
32ec8896
NC
8452
8453 return res;
fa197c1c
PB
8454}
8455
32ec8896 8456static bfd_boolean
948f632f
DA
8457decode_tic6x_unwind_bytecode (struct arm_unw_aux_info * aux,
8458 unsigned int word,
8459 unsigned int remaining,
8460 unsigned int more_words,
8461 bfd_vma data_offset,
8462 Elf_Internal_Shdr * data_sec,
8463 struct arm_section * data_arm_sec)
fa197c1c
PB
8464{
8465 struct absaddr addr;
8466
8467 /* Decode the unwinding instructions. */
8468 while (1)
8469 {
8470 unsigned int op, op2;
8471
8472 ADVANCE;
8473 if (remaining == 0)
8474 break;
8475 remaining--;
8476 op = word >> 24;
8477 word <<= 8;
8478
9cf03b7e 8479 printf (" 0x%02x ", op);
fa197c1c
PB
8480
8481 if ((op & 0xc0) == 0x00)
8482 {
8483 int offset = ((op & 0x3f) << 3) + 8;
9cf03b7e 8484 printf (" sp = sp + %d", offset);
fa197c1c
PB
8485 }
8486 else if ((op & 0xc0) == 0x80)
8487 {
8488 GET_OP (op2);
8489 if (op == 0x80 && op2 == 0)
8490 printf (_("Refuse to unwind"));
8491 else
8492 {
8493 unsigned int mask = ((op & 0x1f) << 8) | op2;
8494 if (op & 0x20)
8495 printf ("pop compact {");
8496 else
8497 printf ("pop {");
8498
8499 decode_tic6x_unwind_regmask (mask);
8500 printf("}");
8501 }
8502 }
8503 else if ((op & 0xf0) == 0xc0)
8504 {
8505 unsigned int reg;
8506 unsigned int nregs;
8507 unsigned int i;
8508 const char *name;
a734115a
NC
8509 struct
8510 {
32ec8896
NC
8511 unsigned int offset;
8512 unsigned int reg;
fa197c1c
PB
8513 } regpos[16];
8514
8515 /* Scan entire instruction first so that GET_OP output is not
8516 interleaved with disassembly. */
8517 nregs = 0;
8518 for (i = 0; nregs < (op & 0xf); i++)
8519 {
8520 GET_OP (op2);
8521 reg = op2 >> 4;
8522 if (reg != 0xf)
8523 {
8524 regpos[nregs].offset = i * 2;
8525 regpos[nregs].reg = reg;
8526 nregs++;
8527 }
8528
8529 reg = op2 & 0xf;
8530 if (reg != 0xf)
8531 {
8532 regpos[nregs].offset = i * 2 + 1;
8533 regpos[nregs].reg = reg;
8534 nregs++;
8535 }
8536 }
8537
8538 printf (_("pop frame {"));
8539 reg = nregs - 1;
8540 for (i = i * 2; i > 0; i--)
8541 {
8542 if (regpos[reg].offset == i - 1)
8543 {
8544 name = tic6x_unwind_regnames[regpos[reg].reg];
8545 if (reg > 0)
8546 reg--;
8547 }
8548 else
8549 name = _("[pad]");
8550
8551 fputs (name, stdout);
8552 if (i > 1)
8553 printf (", ");
8554 }
8555
8556 printf ("}");
8557 }
8558 else if (op == 0xd0)
8559 printf (" MOV FP, SP");
8560 else if (op == 0xd1)
8561 printf (" __c6xabi_pop_rts");
8562 else if (op == 0xd2)
8563 {
8564 unsigned char buf[9];
8565 unsigned int i, len;
8566 unsigned long offset;
a734115a 8567
fa197c1c
PB
8568 for (i = 0; i < sizeof (buf); i++)
8569 {
8570 GET_OP (buf[i]);
8571 if ((buf[i] & 0x80) == 0)
8572 break;
8573 }
0eff7165
NC
8574 /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2. */
8575 if (i == sizeof (buf))
8576 {
0eff7165 8577 warn (_("Corrupt stack pointer adjustment detected\n"));
32ec8896 8578 return FALSE;
0eff7165 8579 }
948f632f 8580
f6f0e17b 8581 offset = read_uleb128 (buf, &len, buf + i + 1);
fa197c1c
PB
8582 assert (len == i + 1);
8583 offset = offset * 8 + 0x408;
8584 printf (_("sp = sp + %ld"), offset);
8585 }
8586 else if ((op & 0xf0) == 0xe0)
8587 {
8588 if ((op & 0x0f) == 7)
8589 printf (" RETURN");
8590 else
8591 printf (" MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
8592 }
8593 else
8594 {
8595 printf (_(" [unsupported opcode]"));
8596 }
8597 putchar ('\n');
8598 }
32ec8896
NC
8599
8600 return TRUE;
fa197c1c
PB
8601}
8602
8603static bfd_vma
a734115a 8604arm_expand_prel31 (bfd_vma word, bfd_vma where)
fa197c1c
PB
8605{
8606 bfd_vma offset;
8607
8608 offset = word & 0x7fffffff;
8609 if (offset & 0x40000000)
8610 offset |= ~ (bfd_vma) 0x7fffffff;
8611
8612 if (elf_header.e_machine == EM_TI_C6000)
8613 offset <<= 1;
8614
8615 return offset + where;
8616}
8617
32ec8896 8618static bfd_boolean
1b31d05e
NC
8619decode_arm_unwind (struct arm_unw_aux_info * aux,
8620 unsigned int word,
8621 unsigned int remaining,
8622 bfd_vma data_offset,
8623 Elf_Internal_Shdr * data_sec,
8624 struct arm_section * data_arm_sec)
fa197c1c
PB
8625{
8626 int per_index;
8627 unsigned int more_words = 0;
37e14bc3 8628 struct absaddr addr;
1b31d05e 8629 bfd_vma sym_name = (bfd_vma) -1;
32ec8896 8630 bfd_boolean res = FALSE;
fa197c1c
PB
8631
8632 if (remaining == 0)
8633 {
1b31d05e
NC
8634 /* Fetch the first word.
8635 Note - when decoding an object file the address extracted
8636 here will always be 0. So we also pass in the sym_name
8637 parameter so that we can find the symbol associated with
8638 the personality routine. */
8639 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, data_offset,
8640 & word, & addr, & sym_name))
32ec8896 8641 return FALSE;
1b31d05e 8642
fa197c1c
PB
8643 remaining = 4;
8644 }
8645
8646 if ((word & 0x80000000) == 0)
8647 {
8648 /* Expand prel31 for personality routine. */
8649 bfd_vma fn;
8650 const char *procname;
8651
a734115a 8652 fn = arm_expand_prel31 (word, data_sec->sh_addr + data_offset);
fa197c1c 8653 printf (_(" Personality routine: "));
1b31d05e
NC
8654 if (fn == 0
8655 && addr.section == SHN_UNDEF && addr.offset == 0
8656 && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
8657 {
8658 procname = aux->strtab + sym_name;
8659 print_vma (fn, PREFIX_HEX);
8660 if (procname)
8661 {
8662 fputs (" <", stdout);
8663 fputs (procname, stdout);
8664 fputc ('>', stdout);
8665 }
8666 }
8667 else
8668 procname = arm_print_vma_and_name (aux, fn, addr);
fa197c1c
PB
8669 fputc ('\n', stdout);
8670
8671 /* The GCC personality routines use the standard compact
8672 encoding, starting with one byte giving the number of
8673 words. */
8674 if (procname != NULL
8675 && (const_strneq (procname, "__gcc_personality_v0")
8676 || const_strneq (procname, "__gxx_personality_v0")
8677 || const_strneq (procname, "__gcj_personality_v0")
8678 || const_strneq (procname, "__gnu_objc_personality_v0")))
8679 {
8680 remaining = 0;
8681 more_words = 1;
8682 ADVANCE;
8683 if (!remaining)
8684 {
8685 printf (_(" [Truncated data]\n"));
32ec8896 8686 return FALSE;
fa197c1c
PB
8687 }
8688 more_words = word >> 24;
8689 word <<= 8;
8690 remaining--;
8691 per_index = -1;
8692 }
8693 else
32ec8896 8694 return TRUE;
fa197c1c
PB
8695 }
8696 else
8697 {
1b31d05e 8698 /* ARM EHABI Section 6.3:
0b4362b0 8699
1b31d05e 8700 An exception-handling table entry for the compact model looks like:
0b4362b0 8701
1b31d05e
NC
8702 31 30-28 27-24 23-0
8703 -- ----- ----- ----
8704 1 0 index Data for personalityRoutine[index] */
8705
8706 if (elf_header.e_machine == EM_ARM
8707 && (word & 0x70000000))
32ec8896
NC
8708 {
8709 warn (_("Corrupt ARM compact model table entry: %x \n"), word);
8710 res = FALSE;
8711 }
1b31d05e 8712
fa197c1c 8713 per_index = (word >> 24) & 0x7f;
1b31d05e 8714 printf (_(" Compact model index: %d\n"), per_index);
fa197c1c
PB
8715 if (per_index == 0)
8716 {
8717 more_words = 0;
8718 word <<= 8;
8719 remaining--;
8720 }
8721 else if (per_index < 3)
8722 {
8723 more_words = (word >> 16) & 0xff;
8724 word <<= 16;
8725 remaining -= 2;
8726 }
8727 }
8728
8729 switch (elf_header.e_machine)
8730 {
8731 case EM_ARM:
8732 if (per_index < 3)
8733 {
32ec8896
NC
8734 if (! decode_arm_unwind_bytecode (aux, word, remaining, more_words,
8735 data_offset, data_sec, data_arm_sec))
8736 res = FALSE;
fa197c1c
PB
8737 }
8738 else
1b31d05e
NC
8739 {
8740 warn (_("Unknown ARM compact model index encountered\n"));
8741 printf (_(" [reserved]\n"));
32ec8896 8742 res = FALSE;
1b31d05e 8743 }
fa197c1c
PB
8744 break;
8745
8746 case EM_TI_C6000:
8747 if (per_index < 3)
8748 {
32ec8896
NC
8749 if (! decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
8750 data_offset, data_sec, data_arm_sec))
8751 res = FALSE;
fa197c1c
PB
8752 }
8753 else if (per_index < 5)
8754 {
8755 if (((word >> 17) & 0x7f) == 0x7f)
8756 printf (_(" Restore stack from frame pointer\n"));
8757 else
8758 printf (_(" Stack increment %d\n"), (word >> 14) & 0x1fc);
8759 printf (_(" Registers restored: "));
8760 if (per_index == 4)
8761 printf (" (compact) ");
8762 decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
8763 putchar ('\n');
8764 printf (_(" Return register: %s\n"),
8765 tic6x_unwind_regnames[word & 0xf]);
8766 }
8767 else
1b31d05e 8768 printf (_(" [reserved (%d)]\n"), per_index);
fa197c1c
PB
8769 break;
8770
8771 default:
74e1a04b 8772 error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
1b31d05e 8773 elf_header.e_machine);
32ec8896 8774 res = FALSE;
fa197c1c 8775 }
0b6ae522
DJ
8776
8777 /* Decode the descriptors. Not implemented. */
32ec8896
NC
8778
8779 return res;
0b6ae522
DJ
8780}
8781
32ec8896 8782static bfd_boolean
0b6ae522
DJ
8783dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
8784{
8785 struct arm_section exidx_arm_sec, extab_arm_sec;
8786 unsigned int i, exidx_len;
948f632f 8787 unsigned long j, nfuns;
32ec8896 8788 bfd_boolean res = TRUE;
0b6ae522
DJ
8789
8790 memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
8791 memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
8792 exidx_len = exidx_sec->sh_size / 8;
8793
948f632f
DA
8794 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
8795 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
8796 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
8797 aux->funtab[nfuns++] = aux->symtab[j];
8798 aux->nfuns = nfuns;
8799 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
8800
0b6ae522
DJ
8801 for (i = 0; i < exidx_len; i++)
8802 {
8803 unsigned int exidx_fn, exidx_entry;
8804 struct absaddr fn_addr, entry_addr;
8805 bfd_vma fn;
8806
8807 fputc ('\n', stdout);
8808
1b31d05e
NC
8809 if (! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8810 8 * i, & exidx_fn, & fn_addr, NULL)
8811 || ! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8812 8 * i + 4, & exidx_entry, & entry_addr, NULL))
0b6ae522 8813 {
948f632f 8814 free (aux->funtab);
1b31d05e
NC
8815 arm_free_section (& exidx_arm_sec);
8816 arm_free_section (& extab_arm_sec);
32ec8896 8817 return FALSE;
0b6ae522
DJ
8818 }
8819
83c257ca
NC
8820 /* ARM EHABI, Section 5:
8821 An index table entry consists of 2 words.
8822 The first word contains a prel31 offset to the start of a function, with bit 31 clear. */
8823 if (exidx_fn & 0x80000000)
32ec8896
NC
8824 {
8825 warn (_("corrupt index table entry: %x\n"), exidx_fn);
8826 res = FALSE;
8827 }
83c257ca 8828
a734115a 8829 fn = arm_expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
0b6ae522 8830
a734115a 8831 arm_print_vma_and_name (aux, fn, fn_addr);
0b6ae522
DJ
8832 fputs (": ", stdout);
8833
8834 if (exidx_entry == 1)
8835 {
8836 print_vma (exidx_entry, PREFIX_HEX);
8837 fputs (" [cantunwind]\n", stdout);
8838 }
8839 else if (exidx_entry & 0x80000000)
8840 {
8841 print_vma (exidx_entry, PREFIX_HEX);
8842 fputc ('\n', stdout);
8843 decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
8844 }
8845 else
8846 {
8f73510c 8847 bfd_vma table, table_offset = 0;
0b6ae522
DJ
8848 Elf_Internal_Shdr *table_sec;
8849
8850 fputs ("@", stdout);
a734115a 8851 table = arm_expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
0b6ae522
DJ
8852 print_vma (table, PREFIX_HEX);
8853 printf ("\n");
8854
8855 /* Locate the matching .ARM.extab. */
8856 if (entry_addr.section != SHN_UNDEF
8857 && entry_addr.section < elf_header.e_shnum)
8858 {
8859 table_sec = section_headers + entry_addr.section;
8860 table_offset = entry_addr.offset;
1a915552
NC
8861 /* PR 18879 */
8862 if (table_offset > table_sec->sh_size
8863 || ((bfd_signed_vma) table_offset) < 0)
8864 {
8865 warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
8866 (unsigned long) table_offset,
8867 printable_section_name (table_sec));
32ec8896 8868 res = FALSE;
1a915552
NC
8869 continue;
8870 }
0b6ae522
DJ
8871 }
8872 else
8873 {
8874 table_sec = find_section_by_address (table);
8875 if (table_sec != NULL)
8876 table_offset = table - table_sec->sh_addr;
8877 }
32ec8896 8878
0b6ae522
DJ
8879 if (table_sec == NULL)
8880 {
8881 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
8882 (unsigned long) table);
32ec8896 8883 res = FALSE;
0b6ae522
DJ
8884 continue;
8885 }
32ec8896
NC
8886
8887 if (! decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
8888 &extab_arm_sec))
8889 res = FALSE;
0b6ae522
DJ
8890 }
8891 }
8892
8893 printf ("\n");
8894
948f632f 8895 free (aux->funtab);
0b6ae522
DJ
8896 arm_free_section (&exidx_arm_sec);
8897 arm_free_section (&extab_arm_sec);
32ec8896
NC
8898
8899 return res;
0b6ae522
DJ
8900}
8901
fa197c1c 8902/* Used for both ARM and C6X unwinding tables. */
1b31d05e 8903
32ec8896 8904static bfd_boolean
0b6ae522
DJ
8905arm_process_unwind (FILE *file)
8906{
8907 struct arm_unw_aux_info aux;
8908 Elf_Internal_Shdr *unwsec = NULL;
8909 Elf_Internal_Shdr *strsec;
8910 Elf_Internal_Shdr *sec;
8911 unsigned long i;
fa197c1c 8912 unsigned int sec_type;
32ec8896 8913 bfd_boolean res = TRUE;
0b6ae522 8914
fa197c1c
PB
8915 switch (elf_header.e_machine)
8916 {
8917 case EM_ARM:
8918 sec_type = SHT_ARM_EXIDX;
8919 break;
8920
8921 case EM_TI_C6000:
8922 sec_type = SHT_C6000_UNWIND;
8923 break;
8924
0b4362b0 8925 default:
74e1a04b 8926 error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
1b31d05e 8927 elf_header.e_machine);
32ec8896 8928 return FALSE;
fa197c1c
PB
8929 }
8930
0b6ae522 8931 if (string_table == NULL)
32ec8896 8932 return FALSE;
1b31d05e
NC
8933
8934 memset (& aux, 0, sizeof (aux));
8935 aux.file = file;
0b6ae522
DJ
8936
8937 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8938 {
8939 if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
8940 {
ba5cdace 8941 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
0b6ae522
DJ
8942
8943 strsec = section_headers + sec->sh_link;
74e1a04b
NC
8944
8945 /* PR binutils/17531 file: 011-12666-0.004. */
8946 if (aux.strtab != NULL)
8947 {
4082ef84 8948 error (_("Multiple string tables found in file.\n"));
74e1a04b 8949 free (aux.strtab);
32ec8896 8950 res = FALSE;
74e1a04b 8951 }
0b6ae522
DJ
8952 aux.strtab = get_data (NULL, file, strsec->sh_offset,
8953 1, strsec->sh_size, _("string table"));
8954 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8955 }
fa197c1c 8956 else if (sec->sh_type == sec_type)
0b6ae522
DJ
8957 unwsec = sec;
8958 }
8959
1b31d05e 8960 if (unwsec == NULL)
0b6ae522 8961 printf (_("\nThere are no unwind sections in this file.\n"));
1b31d05e
NC
8962 else
8963 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8964 {
8965 if (sec->sh_type == sec_type)
8966 {
8967 printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
74e1a04b 8968 printable_section_name (sec),
1b31d05e
NC
8969 (unsigned long) sec->sh_offset,
8970 (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
0b6ae522 8971
32ec8896
NC
8972 if (! dump_arm_unwind (&aux, sec))
8973 res = FALSE;
1b31d05e
NC
8974 }
8975 }
0b6ae522
DJ
8976
8977 if (aux.symtab)
8978 free (aux.symtab);
8979 if (aux.strtab)
8980 free ((char *) aux.strtab);
32ec8896
NC
8981
8982 return res;
0b6ae522
DJ
8983}
8984
32ec8896 8985static bfd_boolean
2cf0635d 8986process_unwind (FILE * file)
57346661 8987{
2cf0635d
NC
8988 struct unwind_handler
8989 {
32ec8896
NC
8990 unsigned int machtype;
8991 bfd_boolean (* handler)(FILE *);
2cf0635d
NC
8992 } handlers[] =
8993 {
0b6ae522 8994 { EM_ARM, arm_process_unwind },
57346661
AM
8995 { EM_IA_64, ia64_process_unwind },
8996 { EM_PARISC, hppa_process_unwind },
fa197c1c 8997 { EM_TI_C6000, arm_process_unwind },
32ec8896 8998 { 0, NULL }
57346661
AM
8999 };
9000 int i;
9001
9002 if (!do_unwind)
32ec8896 9003 return TRUE;
57346661
AM
9004
9005 for (i = 0; handlers[i].handler != NULL; i++)
9006 if (elf_header.e_machine == handlers[i].machtype)
32ec8896 9007 return handlers[i].handler (file);
57346661 9008
1b31d05e
NC
9009 printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
9010 get_machine_name (elf_header.e_machine));
32ec8896 9011 return TRUE;
57346661
AM
9012}
9013
252b5132 9014static void
2cf0635d 9015dynamic_section_mips_val (Elf_Internal_Dyn * entry)
252b5132
RH
9016{
9017 switch (entry->d_tag)
9018 {
9019 case DT_MIPS_FLAGS:
9020 if (entry->d_un.d_val == 0)
4b68bca3 9021 printf (_("NONE"));
252b5132
RH
9022 else
9023 {
9024 static const char * opts[] =
9025 {
9026 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
9027 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
9028 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
9029 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
9030 "RLD_ORDER_SAFE"
9031 };
9032 unsigned int cnt;
32ec8896 9033 bfd_boolean first = TRUE;
2b692964 9034
60bca95a 9035 for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
252b5132
RH
9036 if (entry->d_un.d_val & (1 << cnt))
9037 {
9038 printf ("%s%s", first ? "" : " ", opts[cnt]);
32ec8896 9039 first = FALSE;
252b5132 9040 }
252b5132
RH
9041 }
9042 break;
103f02d3 9043
252b5132 9044 case DT_MIPS_IVERSION:
d79b3d50 9045 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
4b68bca3 9046 printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
252b5132 9047 else
76ca31c0
NC
9048 {
9049 char buf[40];
9050 sprintf_vma (buf, entry->d_un.d_ptr);
9051 /* Note: coded this way so that there is a single string for translation. */
9052 printf (_("<corrupt: %s>"), buf);
9053 }
252b5132 9054 break;
103f02d3 9055
252b5132
RH
9056 case DT_MIPS_TIME_STAMP:
9057 {
d5b07ef4 9058 char timebuf[128];
2cf0635d 9059 struct tm * tmp;
91d6fa6a 9060 time_t atime = entry->d_un.d_val;
82b1b41b 9061
91d6fa6a 9062 tmp = gmtime (&atime);
82b1b41b
NC
9063 /* PR 17531: file: 6accc532. */
9064 if (tmp == NULL)
9065 snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
9066 else
9067 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
9068 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9069 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
4b68bca3 9070 printf (_("Time Stamp: %s"), timebuf);
252b5132
RH
9071 }
9072 break;
103f02d3 9073
252b5132
RH
9074 case DT_MIPS_RLD_VERSION:
9075 case DT_MIPS_LOCAL_GOTNO:
9076 case DT_MIPS_CONFLICTNO:
9077 case DT_MIPS_LIBLISTNO:
9078 case DT_MIPS_SYMTABNO:
9079 case DT_MIPS_UNREFEXTNO:
9080 case DT_MIPS_HIPAGENO:
9081 case DT_MIPS_DELTA_CLASS_NO:
9082 case DT_MIPS_DELTA_INSTANCE_NO:
9083 case DT_MIPS_DELTA_RELOC_NO:
9084 case DT_MIPS_DELTA_SYM_NO:
9085 case DT_MIPS_DELTA_CLASSSYM_NO:
9086 case DT_MIPS_COMPACT_SIZE:
c69075ac 9087 print_vma (entry->d_un.d_val, DEC);
252b5132 9088 break;
103f02d3
UD
9089
9090 default:
4b68bca3 9091 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
103f02d3 9092 }
4b68bca3 9093 putchar ('\n');
103f02d3
UD
9094}
9095
103f02d3 9096static void
2cf0635d 9097dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
103f02d3
UD
9098{
9099 switch (entry->d_tag)
9100 {
9101 case DT_HP_DLD_FLAGS:
9102 {
9103 static struct
9104 {
9105 long int bit;
2cf0635d 9106 const char * str;
5e220199
NC
9107 }
9108 flags[] =
9109 {
9110 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
9111 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
9112 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
9113 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
9114 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
9115 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
9116 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
9117 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
9118 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
9119 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
eec8f817
DA
9120 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
9121 { DT_HP_GST, "HP_GST" },
9122 { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
9123 { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
9124 { DT_HP_NODELETE, "HP_NODELETE" },
9125 { DT_HP_GROUP, "HP_GROUP" },
9126 { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
5e220199 9127 };
32ec8896 9128 bfd_boolean first = TRUE;
5e220199 9129 size_t cnt;
f7a99963 9130 bfd_vma val = entry->d_un.d_val;
103f02d3 9131
60bca95a 9132 for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
103f02d3 9133 if (val & flags[cnt].bit)
30800947
NC
9134 {
9135 if (! first)
9136 putchar (' ');
9137 fputs (flags[cnt].str, stdout);
32ec8896 9138 first = FALSE;
30800947
NC
9139 val ^= flags[cnt].bit;
9140 }
76da6bbe 9141
103f02d3 9142 if (val != 0 || first)
f7a99963
NC
9143 {
9144 if (! first)
9145 putchar (' ');
9146 print_vma (val, HEX);
9147 }
103f02d3
UD
9148 }
9149 break;
76da6bbe 9150
252b5132 9151 default:
f7a99963
NC
9152 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9153 break;
252b5132 9154 }
35b1837e 9155 putchar ('\n');
252b5132
RH
9156}
9157
28f997cf
TG
9158#ifdef BFD64
9159
9160/* VMS vs Unix time offset and factor. */
9161
9162#define VMS_EPOCH_OFFSET 35067168000000000LL
9163#define VMS_GRANULARITY_FACTOR 10000000
9164
9165/* Display a VMS time in a human readable format. */
9166
9167static void
9168print_vms_time (bfd_int64_t vmstime)
9169{
9170 struct tm *tm;
9171 time_t unxtime;
9172
9173 unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
9174 tm = gmtime (&unxtime);
9175 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
9176 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
9177 tm->tm_hour, tm->tm_min, tm->tm_sec);
9178}
9179#endif /* BFD64 */
9180
ecc51f48 9181static void
2cf0635d 9182dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
ecc51f48
NC
9183{
9184 switch (entry->d_tag)
9185 {
0de14b54 9186 case DT_IA_64_PLT_RESERVE:
bdf4d63a 9187 /* First 3 slots reserved. */
ecc51f48
NC
9188 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9189 printf (" -- ");
9190 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
bdf4d63a
JJ
9191 break;
9192
28f997cf
TG
9193 case DT_IA_64_VMS_LINKTIME:
9194#ifdef BFD64
9195 print_vms_time (entry->d_un.d_val);
9196#endif
9197 break;
9198
9199 case DT_IA_64_VMS_LNKFLAGS:
9200 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9201 if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
9202 printf (" CALL_DEBUG");
9203 if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
9204 printf (" NOP0BUFS");
9205 if (entry->d_un.d_val & VMS_LF_P0IMAGE)
9206 printf (" P0IMAGE");
9207 if (entry->d_un.d_val & VMS_LF_MKTHREADS)
9208 printf (" MKTHREADS");
9209 if (entry->d_un.d_val & VMS_LF_UPCALLS)
9210 printf (" UPCALLS");
9211 if (entry->d_un.d_val & VMS_LF_IMGSTA)
9212 printf (" IMGSTA");
9213 if (entry->d_un.d_val & VMS_LF_INITIALIZE)
9214 printf (" INITIALIZE");
9215 if (entry->d_un.d_val & VMS_LF_MAIN)
9216 printf (" MAIN");
9217 if (entry->d_un.d_val & VMS_LF_EXE_INIT)
9218 printf (" EXE_INIT");
9219 if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
9220 printf (" TBK_IN_IMG");
9221 if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
9222 printf (" DBG_IN_IMG");
9223 if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
9224 printf (" TBK_IN_DSF");
9225 if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
9226 printf (" DBG_IN_DSF");
9227 if (entry->d_un.d_val & VMS_LF_SIGNATURES)
9228 printf (" SIGNATURES");
9229 if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
9230 printf (" REL_SEG_OFF");
9231 break;
9232
bdf4d63a
JJ
9233 default:
9234 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9235 break;
ecc51f48 9236 }
bdf4d63a 9237 putchar ('\n');
ecc51f48
NC
9238}
9239
32ec8896 9240static bfd_boolean
2cf0635d 9241get_32bit_dynamic_section (FILE * file)
252b5132 9242{
2cf0635d
NC
9243 Elf32_External_Dyn * edyn;
9244 Elf32_External_Dyn * ext;
9245 Elf_Internal_Dyn * entry;
103f02d3 9246
3f5e193b
NC
9247 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
9248 dynamic_size, _("dynamic section"));
a6e9f9df 9249 if (!edyn)
32ec8896 9250 return FALSE;
103f02d3 9251
071436c6
NC
9252 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9253 might not have the luxury of section headers. Look for the DT_NULL
9254 terminator to determine the number of entries. */
ba2685cc 9255 for (ext = edyn, dynamic_nent = 0;
53c3012c 9256 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
ba2685cc
AM
9257 ext++)
9258 {
9259 dynamic_nent++;
9260 if (BYTE_GET (ext->d_tag) == DT_NULL)
9261 break;
9262 }
252b5132 9263
3f5e193b
NC
9264 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9265 sizeof (* entry));
b2d38a17 9266 if (dynamic_section == NULL)
252b5132 9267 {
8b73c356
NC
9268 error (_("Out of memory allocating space for %lu dynamic entries\n"),
9269 (unsigned long) dynamic_nent);
9ea033b2 9270 free (edyn);
32ec8896 9271 return FALSE;
9ea033b2 9272 }
252b5132 9273
fb514b26 9274 for (ext = edyn, entry = dynamic_section;
ba2685cc 9275 entry < dynamic_section + dynamic_nent;
fb514b26 9276 ext++, entry++)
9ea033b2 9277 {
fb514b26
AM
9278 entry->d_tag = BYTE_GET (ext->d_tag);
9279 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
252b5132
RH
9280 }
9281
9ea033b2
NC
9282 free (edyn);
9283
32ec8896 9284 return TRUE;
9ea033b2
NC
9285}
9286
32ec8896 9287static bfd_boolean
2cf0635d 9288get_64bit_dynamic_section (FILE * file)
9ea033b2 9289{
2cf0635d
NC
9290 Elf64_External_Dyn * edyn;
9291 Elf64_External_Dyn * ext;
9292 Elf_Internal_Dyn * entry;
103f02d3 9293
071436c6 9294 /* Read in the data. */
3f5e193b
NC
9295 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
9296 dynamic_size, _("dynamic section"));
a6e9f9df 9297 if (!edyn)
32ec8896 9298 return FALSE;
103f02d3 9299
071436c6
NC
9300 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9301 might not have the luxury of section headers. Look for the DT_NULL
9302 terminator to determine the number of entries. */
ba2685cc 9303 for (ext = edyn, dynamic_nent = 0;
53c3012c
AM
9304 /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer. */
9305 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
ba2685cc
AM
9306 ext++)
9307 {
9308 dynamic_nent++;
66543521 9309 if (BYTE_GET (ext->d_tag) == DT_NULL)
ba2685cc
AM
9310 break;
9311 }
252b5132 9312
3f5e193b
NC
9313 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9314 sizeof (* entry));
b2d38a17 9315 if (dynamic_section == NULL)
252b5132 9316 {
8b73c356
NC
9317 error (_("Out of memory allocating space for %lu dynamic entries\n"),
9318 (unsigned long) dynamic_nent);
252b5132 9319 free (edyn);
32ec8896 9320 return FALSE;
252b5132
RH
9321 }
9322
071436c6 9323 /* Convert from external to internal formats. */
fb514b26 9324 for (ext = edyn, entry = dynamic_section;
ba2685cc 9325 entry < dynamic_section + dynamic_nent;
fb514b26 9326 ext++, entry++)
252b5132 9327 {
66543521
AM
9328 entry->d_tag = BYTE_GET (ext->d_tag);
9329 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
252b5132
RH
9330 }
9331
9332 free (edyn);
9333
32ec8896 9334 return TRUE;
9ea033b2
NC
9335}
9336
e9e44622
JJ
9337static void
9338print_dynamic_flags (bfd_vma flags)
d1133906 9339{
32ec8896 9340 bfd_boolean first = TRUE;
13ae64f3 9341
d1133906
NC
9342 while (flags)
9343 {
9344 bfd_vma flag;
9345
9346 flag = flags & - flags;
9347 flags &= ~ flag;
9348
e9e44622 9349 if (first)
32ec8896 9350 first = FALSE;
e9e44622
JJ
9351 else
9352 putc (' ', stdout);
13ae64f3 9353
d1133906
NC
9354 switch (flag)
9355 {
e9e44622
JJ
9356 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
9357 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
9358 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
9359 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
9360 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
2b692964 9361 default: fputs (_("unknown"), stdout); break;
d1133906
NC
9362 }
9363 }
e9e44622 9364 puts ("");
d1133906
NC
9365}
9366
b2d38a17
NC
9367/* Parse and display the contents of the dynamic section. */
9368
32ec8896 9369static bfd_boolean
2cf0635d 9370process_dynamic_section (FILE * file)
9ea033b2 9371{
2cf0635d 9372 Elf_Internal_Dyn * entry;
9ea033b2
NC
9373
9374 if (dynamic_size == 0)
9375 {
9376 if (do_dynamic)
b2d38a17 9377 printf (_("\nThere is no dynamic section in this file.\n"));
9ea033b2 9378
32ec8896 9379 return TRUE;
9ea033b2
NC
9380 }
9381
9382 if (is_32bit_elf)
9383 {
b2d38a17 9384 if (! get_32bit_dynamic_section (file))
32ec8896
NC
9385 return FALSE;
9386 }
9387 else
9388 {
9389 if (! get_64bit_dynamic_section (file))
9390 return FALSE;
9ea033b2 9391 }
9ea033b2 9392
252b5132
RH
9393 /* Find the appropriate symbol table. */
9394 if (dynamic_symbols == NULL)
9395 {
86dba8ee
AM
9396 for (entry = dynamic_section;
9397 entry < dynamic_section + dynamic_nent;
9398 ++entry)
252b5132 9399 {
c8286bd1 9400 Elf_Internal_Shdr section;
252b5132
RH
9401
9402 if (entry->d_tag != DT_SYMTAB)
9403 continue;
9404
9405 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
9406
9407 /* Since we do not know how big the symbol table is,
9408 we default to reading in the entire file (!) and
9409 processing that. This is overkill, I know, but it
e3c8793a 9410 should work. */
d93f0186 9411 section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
252b5132 9412
fb52b2f4
NC
9413 if (archive_file_offset != 0)
9414 section.sh_size = archive_file_size - section.sh_offset;
9415 else
9416 {
9417 if (fseek (file, 0, SEEK_END))
591a748a 9418 error (_("Unable to seek to end of file!\n"));
fb52b2f4
NC
9419
9420 section.sh_size = ftell (file) - section.sh_offset;
9421 }
252b5132 9422
9ea033b2 9423 if (is_32bit_elf)
9ad5cbcf 9424 section.sh_entsize = sizeof (Elf32_External_Sym);
9ea033b2 9425 else
9ad5cbcf 9426 section.sh_entsize = sizeof (Elf64_External_Sym);
071436c6 9427 section.sh_name = string_table_length;
252b5132 9428
ba5cdace 9429 dynamic_symbols = GET_ELF_SYMBOLS (file, &section, & num_dynamic_syms);
19936277 9430 if (num_dynamic_syms < 1)
252b5132
RH
9431 {
9432 error (_("Unable to determine the number of symbols to load\n"));
9433 continue;
9434 }
252b5132
RH
9435 }
9436 }
9437
9438 /* Similarly find a string table. */
9439 if (dynamic_strings == NULL)
9440 {
86dba8ee
AM
9441 for (entry = dynamic_section;
9442 entry < dynamic_section + dynamic_nent;
9443 ++entry)
252b5132
RH
9444 {
9445 unsigned long offset;
b34976b6 9446 long str_tab_len;
252b5132
RH
9447
9448 if (entry->d_tag != DT_STRTAB)
9449 continue;
9450
9451 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
9452
9453 /* Since we do not know how big the string table is,
9454 we default to reading in the entire file (!) and
9455 processing that. This is overkill, I know, but it
e3c8793a 9456 should work. */
252b5132 9457
d93f0186 9458 offset = offset_from_vma (file, entry->d_un.d_val, 0);
fb52b2f4
NC
9459
9460 if (archive_file_offset != 0)
9461 str_tab_len = archive_file_size - offset;
9462 else
9463 {
9464 if (fseek (file, 0, SEEK_END))
9465 error (_("Unable to seek to end of file\n"));
9466 str_tab_len = ftell (file) - offset;
9467 }
252b5132
RH
9468
9469 if (str_tab_len < 1)
9470 {
9471 error
9472 (_("Unable to determine the length of the dynamic string table\n"));
9473 continue;
9474 }
9475
3f5e193b
NC
9476 dynamic_strings = (char *) get_data (NULL, file, offset, 1,
9477 str_tab_len,
9478 _("dynamic string table"));
59245841 9479 dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
252b5132
RH
9480 break;
9481 }
9482 }
9483
9484 /* And find the syminfo section if available. */
9485 if (dynamic_syminfo == NULL)
9486 {
3e8bba36 9487 unsigned long syminsz = 0;
252b5132 9488
86dba8ee
AM
9489 for (entry = dynamic_section;
9490 entry < dynamic_section + dynamic_nent;
9491 ++entry)
252b5132
RH
9492 {
9493 if (entry->d_tag == DT_SYMINENT)
9494 {
9495 /* Note: these braces are necessary to avoid a syntax
9496 error from the SunOS4 C compiler. */
049b0c3a
NC
9497 /* PR binutils/17531: A corrupt file can trigger this test.
9498 So do not use an assert, instead generate an error message. */
9499 if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
071436c6 9500 error (_("Bad value (%d) for SYMINENT entry\n"),
049b0c3a 9501 (int) entry->d_un.d_val);
252b5132
RH
9502 }
9503 else if (entry->d_tag == DT_SYMINSZ)
9504 syminsz = entry->d_un.d_val;
9505 else if (entry->d_tag == DT_SYMINFO)
d93f0186
NC
9506 dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
9507 syminsz);
252b5132
RH
9508 }
9509
9510 if (dynamic_syminfo_offset != 0 && syminsz != 0)
9511 {
2cf0635d
NC
9512 Elf_External_Syminfo * extsyminfo;
9513 Elf_External_Syminfo * extsym;
9514 Elf_Internal_Syminfo * syminfo;
252b5132
RH
9515
9516 /* There is a syminfo section. Read the data. */
3f5e193b
NC
9517 extsyminfo = (Elf_External_Syminfo *)
9518 get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
9519 _("symbol information"));
a6e9f9df 9520 if (!extsyminfo)
32ec8896 9521 return FALSE;
252b5132 9522
3f5e193b 9523 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
252b5132
RH
9524 if (dynamic_syminfo == NULL)
9525 {
8b73c356
NC
9526 error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9527 (unsigned long) syminsz);
32ec8896 9528 return FALSE;
252b5132
RH
9529 }
9530
9531 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
86dba8ee
AM
9532 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
9533 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
9534 ++syminfo, ++extsym)
252b5132 9535 {
86dba8ee
AM
9536 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
9537 syminfo->si_flags = BYTE_GET (extsym->si_flags);
252b5132
RH
9538 }
9539
9540 free (extsyminfo);
9541 }
9542 }
9543
9544 if (do_dynamic && dynamic_addr)
8b73c356
NC
9545 printf (_("\nDynamic section at offset 0x%lx contains %lu entries:\n"),
9546 dynamic_addr, (unsigned long) dynamic_nent);
252b5132
RH
9547 if (do_dynamic)
9548 printf (_(" Tag Type Name/Value\n"));
9549
86dba8ee
AM
9550 for (entry = dynamic_section;
9551 entry < dynamic_section + dynamic_nent;
9552 entry++)
252b5132
RH
9553 {
9554 if (do_dynamic)
f7a99963 9555 {
2cf0635d 9556 const char * dtype;
e699b9ff 9557
f7a99963
NC
9558 putchar (' ');
9559 print_vma (entry->d_tag, FULL_HEX);
e699b9ff
ILT
9560 dtype = get_dynamic_type (entry->d_tag);
9561 printf (" (%s)%*s", dtype,
32ec8896 9562 ((is_32bit_elf ? 27 : 19) - (int) strlen (dtype)), " ");
f7a99963 9563 }
252b5132
RH
9564
9565 switch (entry->d_tag)
9566 {
d1133906
NC
9567 case DT_FLAGS:
9568 if (do_dynamic)
e9e44622 9569 print_dynamic_flags (entry->d_un.d_val);
d1133906 9570 break;
76da6bbe 9571
252b5132
RH
9572 case DT_AUXILIARY:
9573 case DT_FILTER:
019148e4
L
9574 case DT_CONFIG:
9575 case DT_DEPAUDIT:
9576 case DT_AUDIT:
252b5132
RH
9577 if (do_dynamic)
9578 {
019148e4 9579 switch (entry->d_tag)
b34976b6 9580 {
019148e4
L
9581 case DT_AUXILIARY:
9582 printf (_("Auxiliary library"));
9583 break;
9584
9585 case DT_FILTER:
9586 printf (_("Filter library"));
9587 break;
9588
b34976b6 9589 case DT_CONFIG:
019148e4
L
9590 printf (_("Configuration file"));
9591 break;
9592
9593 case DT_DEPAUDIT:
9594 printf (_("Dependency audit library"));
9595 break;
9596
9597 case DT_AUDIT:
9598 printf (_("Audit library"));
9599 break;
9600 }
252b5132 9601
d79b3d50
NC
9602 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9603 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
252b5132 9604 else
f7a99963
NC
9605 {
9606 printf (": ");
9607 print_vma (entry->d_un.d_val, PREFIX_HEX);
9608 putchar ('\n');
9609 }
252b5132
RH
9610 }
9611 break;
9612
dcefbbbd 9613 case DT_FEATURE:
252b5132
RH
9614 if (do_dynamic)
9615 {
9616 printf (_("Flags:"));
86f55779 9617
252b5132
RH
9618 if (entry->d_un.d_val == 0)
9619 printf (_(" None\n"));
9620 else
9621 {
9622 unsigned long int val = entry->d_un.d_val;
86f55779 9623
252b5132
RH
9624 if (val & DTF_1_PARINIT)
9625 {
9626 printf (" PARINIT");
9627 val ^= DTF_1_PARINIT;
9628 }
dcefbbbd
L
9629 if (val & DTF_1_CONFEXP)
9630 {
9631 printf (" CONFEXP");
9632 val ^= DTF_1_CONFEXP;
9633 }
252b5132
RH
9634 if (val != 0)
9635 printf (" %lx", val);
9636 puts ("");
9637 }
9638 }
9639 break;
9640
9641 case DT_POSFLAG_1:
9642 if (do_dynamic)
9643 {
9644 printf (_("Flags:"));
86f55779 9645
252b5132
RH
9646 if (entry->d_un.d_val == 0)
9647 printf (_(" None\n"));
9648 else
9649 {
9650 unsigned long int val = entry->d_un.d_val;
86f55779 9651
252b5132
RH
9652 if (val & DF_P1_LAZYLOAD)
9653 {
9654 printf (" LAZYLOAD");
9655 val ^= DF_P1_LAZYLOAD;
9656 }
9657 if (val & DF_P1_GROUPPERM)
9658 {
9659 printf (" GROUPPERM");
9660 val ^= DF_P1_GROUPPERM;
9661 }
9662 if (val != 0)
9663 printf (" %lx", val);
9664 puts ("");
9665 }
9666 }
9667 break;
9668
9669 case DT_FLAGS_1:
9670 if (do_dynamic)
9671 {
9672 printf (_("Flags:"));
9673 if (entry->d_un.d_val == 0)
9674 printf (_(" None\n"));
9675 else
9676 {
9677 unsigned long int val = entry->d_un.d_val;
86f55779 9678
252b5132
RH
9679 if (val & DF_1_NOW)
9680 {
9681 printf (" NOW");
9682 val ^= DF_1_NOW;
9683 }
9684 if (val & DF_1_GLOBAL)
9685 {
9686 printf (" GLOBAL");
9687 val ^= DF_1_GLOBAL;
9688 }
9689 if (val & DF_1_GROUP)
9690 {
9691 printf (" GROUP");
9692 val ^= DF_1_GROUP;
9693 }
9694 if (val & DF_1_NODELETE)
9695 {
9696 printf (" NODELETE");
9697 val ^= DF_1_NODELETE;
9698 }
9699 if (val & DF_1_LOADFLTR)
9700 {
9701 printf (" LOADFLTR");
9702 val ^= DF_1_LOADFLTR;
9703 }
9704 if (val & DF_1_INITFIRST)
9705 {
9706 printf (" INITFIRST");
9707 val ^= DF_1_INITFIRST;
9708 }
9709 if (val & DF_1_NOOPEN)
9710 {
9711 printf (" NOOPEN");
9712 val ^= DF_1_NOOPEN;
9713 }
9714 if (val & DF_1_ORIGIN)
9715 {
9716 printf (" ORIGIN");
9717 val ^= DF_1_ORIGIN;
9718 }
9719 if (val & DF_1_DIRECT)
9720 {
9721 printf (" DIRECT");
9722 val ^= DF_1_DIRECT;
9723 }
9724 if (val & DF_1_TRANS)
9725 {
9726 printf (" TRANS");
9727 val ^= DF_1_TRANS;
9728 }
9729 if (val & DF_1_INTERPOSE)
9730 {
9731 printf (" INTERPOSE");
9732 val ^= DF_1_INTERPOSE;
9733 }
f7db6139 9734 if (val & DF_1_NODEFLIB)
dcefbbbd 9735 {
f7db6139
L
9736 printf (" NODEFLIB");
9737 val ^= DF_1_NODEFLIB;
dcefbbbd
L
9738 }
9739 if (val & DF_1_NODUMP)
9740 {
9741 printf (" NODUMP");
9742 val ^= DF_1_NODUMP;
9743 }
34b60028 9744 if (val & DF_1_CONFALT)
dcefbbbd 9745 {
34b60028
L
9746 printf (" CONFALT");
9747 val ^= DF_1_CONFALT;
9748 }
9749 if (val & DF_1_ENDFILTEE)
9750 {
9751 printf (" ENDFILTEE");
9752 val ^= DF_1_ENDFILTEE;
9753 }
9754 if (val & DF_1_DISPRELDNE)
9755 {
9756 printf (" DISPRELDNE");
9757 val ^= DF_1_DISPRELDNE;
9758 }
9759 if (val & DF_1_DISPRELPND)
9760 {
9761 printf (" DISPRELPND");
9762 val ^= DF_1_DISPRELPND;
9763 }
9764 if (val & DF_1_NODIRECT)
9765 {
9766 printf (" NODIRECT");
9767 val ^= DF_1_NODIRECT;
9768 }
9769 if (val & DF_1_IGNMULDEF)
9770 {
9771 printf (" IGNMULDEF");
9772 val ^= DF_1_IGNMULDEF;
9773 }
9774 if (val & DF_1_NOKSYMS)
9775 {
9776 printf (" NOKSYMS");
9777 val ^= DF_1_NOKSYMS;
9778 }
9779 if (val & DF_1_NOHDR)
9780 {
9781 printf (" NOHDR");
9782 val ^= DF_1_NOHDR;
9783 }
9784 if (val & DF_1_EDITED)
9785 {
9786 printf (" EDITED");
9787 val ^= DF_1_EDITED;
9788 }
9789 if (val & DF_1_NORELOC)
9790 {
9791 printf (" NORELOC");
9792 val ^= DF_1_NORELOC;
9793 }
9794 if (val & DF_1_SYMINTPOSE)
9795 {
9796 printf (" SYMINTPOSE");
9797 val ^= DF_1_SYMINTPOSE;
9798 }
9799 if (val & DF_1_GLOBAUDIT)
9800 {
9801 printf (" GLOBAUDIT");
9802 val ^= DF_1_GLOBAUDIT;
9803 }
9804 if (val & DF_1_SINGLETON)
9805 {
9806 printf (" SINGLETON");
9807 val ^= DF_1_SINGLETON;
dcefbbbd 9808 }
5c383f02
RO
9809 if (val & DF_1_STUB)
9810 {
9811 printf (" STUB");
9812 val ^= DF_1_STUB;
9813 }
9814 if (val & DF_1_PIE)
9815 {
9816 printf (" PIE");
9817 val ^= DF_1_PIE;
9818 }
252b5132
RH
9819 if (val != 0)
9820 printf (" %lx", val);
9821 puts ("");
9822 }
9823 }
9824 break;
9825
9826 case DT_PLTREL:
566b0d53 9827 dynamic_info[entry->d_tag] = entry->d_un.d_val;
252b5132
RH
9828 if (do_dynamic)
9829 puts (get_dynamic_type (entry->d_un.d_val));
9830 break;
9831
9832 case DT_NULL :
9833 case DT_NEEDED :
9834 case DT_PLTGOT :
9835 case DT_HASH :
9836 case DT_STRTAB :
9837 case DT_SYMTAB :
9838 case DT_RELA :
9839 case DT_INIT :
9840 case DT_FINI :
9841 case DT_SONAME :
9842 case DT_RPATH :
9843 case DT_SYMBOLIC:
9844 case DT_REL :
9845 case DT_DEBUG :
9846 case DT_TEXTREL :
9847 case DT_JMPREL :
019148e4 9848 case DT_RUNPATH :
252b5132
RH
9849 dynamic_info[entry->d_tag] = entry->d_un.d_val;
9850
9851 if (do_dynamic)
9852 {
2cf0635d 9853 char * name;
252b5132 9854
d79b3d50
NC
9855 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9856 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
252b5132 9857 else
d79b3d50 9858 name = NULL;
252b5132
RH
9859
9860 if (name)
9861 {
9862 switch (entry->d_tag)
9863 {
9864 case DT_NEEDED:
9865 printf (_("Shared library: [%s]"), name);
9866
18bd398b 9867 if (streq (name, program_interpreter))
f7a99963 9868 printf (_(" program interpreter"));
252b5132
RH
9869 break;
9870
9871 case DT_SONAME:
f7a99963 9872 printf (_("Library soname: [%s]"), name);
252b5132
RH
9873 break;
9874
9875 case DT_RPATH:
f7a99963 9876 printf (_("Library rpath: [%s]"), name);
252b5132
RH
9877 break;
9878
019148e4
L
9879 case DT_RUNPATH:
9880 printf (_("Library runpath: [%s]"), name);
9881 break;
9882
252b5132 9883 default:
f7a99963
NC
9884 print_vma (entry->d_un.d_val, PREFIX_HEX);
9885 break;
252b5132
RH
9886 }
9887 }
9888 else
f7a99963
NC
9889 print_vma (entry->d_un.d_val, PREFIX_HEX);
9890
9891 putchar ('\n');
252b5132
RH
9892 }
9893 break;
9894
9895 case DT_PLTRELSZ:
9896 case DT_RELASZ :
9897 case DT_STRSZ :
9898 case DT_RELSZ :
9899 case DT_RELAENT :
9900 case DT_SYMENT :
9901 case DT_RELENT :
566b0d53 9902 dynamic_info[entry->d_tag] = entry->d_un.d_val;
1a0670f3 9903 /* Fall through. */
252b5132
RH
9904 case DT_PLTPADSZ:
9905 case DT_MOVEENT :
9906 case DT_MOVESZ :
9907 case DT_INIT_ARRAYSZ:
9908 case DT_FINI_ARRAYSZ:
047b2264
JJ
9909 case DT_GNU_CONFLICTSZ:
9910 case DT_GNU_LIBLISTSZ:
252b5132 9911 if (do_dynamic)
f7a99963
NC
9912 {
9913 print_vma (entry->d_un.d_val, UNSIGNED);
2b692964 9914 printf (_(" (bytes)\n"));
f7a99963 9915 }
252b5132
RH
9916 break;
9917
9918 case DT_VERDEFNUM:
9919 case DT_VERNEEDNUM:
9920 case DT_RELACOUNT:
9921 case DT_RELCOUNT:
9922 if (do_dynamic)
f7a99963
NC
9923 {
9924 print_vma (entry->d_un.d_val, UNSIGNED);
9925 putchar ('\n');
9926 }
252b5132
RH
9927 break;
9928
9929 case DT_SYMINSZ:
9930 case DT_SYMINENT:
9931 case DT_SYMINFO:
9932 case DT_USED:
9933 case DT_INIT_ARRAY:
9934 case DT_FINI_ARRAY:
9935 if (do_dynamic)
9936 {
d79b3d50
NC
9937 if (entry->d_tag == DT_USED
9938 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
252b5132 9939 {
2cf0635d 9940 char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
252b5132 9941
b34976b6 9942 if (*name)
252b5132
RH
9943 {
9944 printf (_("Not needed object: [%s]\n"), name);
9945 break;
9946 }
9947 }
103f02d3 9948
f7a99963
NC
9949 print_vma (entry->d_un.d_val, PREFIX_HEX);
9950 putchar ('\n');
252b5132
RH
9951 }
9952 break;
9953
9954 case DT_BIND_NOW:
9955 /* The value of this entry is ignored. */
35b1837e
AM
9956 if (do_dynamic)
9957 putchar ('\n');
252b5132 9958 break;
103f02d3 9959
047b2264
JJ
9960 case DT_GNU_PRELINKED:
9961 if (do_dynamic)
9962 {
2cf0635d 9963 struct tm * tmp;
91d6fa6a 9964 time_t atime = entry->d_un.d_val;
047b2264 9965
91d6fa6a 9966 tmp = gmtime (&atime);
071436c6
NC
9967 /* PR 17533 file: 041-1244816-0.004. */
9968 if (tmp == NULL)
5a2cbcf4
L
9969 printf (_("<corrupt time val: %lx"),
9970 (unsigned long) atime);
071436c6
NC
9971 else
9972 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
9973 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9974 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
047b2264
JJ
9975
9976 }
9977 break;
9978
fdc90cb4
JJ
9979 case DT_GNU_HASH:
9980 dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
9981 if (do_dynamic)
9982 {
9983 print_vma (entry->d_un.d_val, PREFIX_HEX);
9984 putchar ('\n');
9985 }
9986 break;
9987
252b5132
RH
9988 default:
9989 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
b34976b6 9990 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
252b5132
RH
9991 entry->d_un.d_val;
9992
9993 if (do_dynamic)
9994 {
9995 switch (elf_header.e_machine)
9996 {
9997 case EM_MIPS:
4fe85591 9998 case EM_MIPS_RS3_LE:
b2d38a17 9999 dynamic_section_mips_val (entry);
252b5132 10000 break;
103f02d3 10001 case EM_PARISC:
b2d38a17 10002 dynamic_section_parisc_val (entry);
103f02d3 10003 break;
ecc51f48 10004 case EM_IA_64:
b2d38a17 10005 dynamic_section_ia64_val (entry);
ecc51f48 10006 break;
252b5132 10007 default:
f7a99963
NC
10008 print_vma (entry->d_un.d_val, PREFIX_HEX);
10009 putchar ('\n');
252b5132
RH
10010 }
10011 }
10012 break;
10013 }
10014 }
10015
32ec8896 10016 return TRUE;
252b5132
RH
10017}
10018
10019static char *
d3ba0551 10020get_ver_flags (unsigned int flags)
252b5132 10021{
b34976b6 10022 static char buff[32];
252b5132
RH
10023
10024 buff[0] = 0;
10025
10026 if (flags == 0)
10027 return _("none");
10028
10029 if (flags & VER_FLG_BASE)
7bb1ad17 10030 strcat (buff, "BASE");
252b5132
RH
10031
10032 if (flags & VER_FLG_WEAK)
10033 {
10034 if (flags & VER_FLG_BASE)
7bb1ad17 10035 strcat (buff, " | ");
252b5132 10036
7bb1ad17 10037 strcat (buff, "WEAK");
252b5132
RH
10038 }
10039
44ec90b9
RO
10040 if (flags & VER_FLG_INFO)
10041 {
10042 if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
7bb1ad17 10043 strcat (buff, " | ");
44ec90b9 10044
7bb1ad17 10045 strcat (buff, "INFO");
44ec90b9
RO
10046 }
10047
10048 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
7bb1ad17
MR
10049 {
10050 if (flags & (VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
10051 strcat (buff, " | ");
10052
10053 strcat (buff, _("<unknown>"));
10054 }
252b5132
RH
10055
10056 return buff;
10057}
10058
10059/* Display the contents of the version sections. */
98fb390a 10060
32ec8896 10061static bfd_boolean
2cf0635d 10062process_version_sections (FILE * file)
252b5132 10063{
2cf0635d 10064 Elf_Internal_Shdr * section;
b34976b6 10065 unsigned i;
32ec8896 10066 bfd_boolean found = FALSE;
252b5132
RH
10067
10068 if (! do_version)
32ec8896 10069 return TRUE;
252b5132
RH
10070
10071 for (i = 0, section = section_headers;
10072 i < elf_header.e_shnum;
b34976b6 10073 i++, section++)
252b5132
RH
10074 {
10075 switch (section->sh_type)
10076 {
10077 case SHT_GNU_verdef:
10078 {
2cf0635d 10079 Elf_External_Verdef * edefs;
b34976b6
AM
10080 unsigned int idx;
10081 unsigned int cnt;
c9f02c3e 10082 unsigned int end;
2cf0635d 10083 char * endbuf;
252b5132 10084
32ec8896 10085 found = TRUE;
252b5132 10086
74e1a04b
NC
10087 printf (_("\nVersion definition section '%s' contains %u entries:\n"),
10088 printable_section_name (section),
10089 section->sh_info);
252b5132
RH
10090
10091 printf (_(" Addr: 0x"));
10092 printf_vma (section->sh_addr);
233f82cf 10093 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
1b228002 10094 (unsigned long) section->sh_offset, section->sh_link,
74e1a04b 10095 printable_section_name_from_index (section->sh_link));
252b5132 10096
3f5e193b
NC
10097 edefs = (Elf_External_Verdef *)
10098 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
10099 _("version definition section"));
a6e9f9df
AM
10100 if (!edefs)
10101 break;
59245841 10102 endbuf = (char *) edefs + section->sh_size;
252b5132 10103
c9f02c3e
MR
10104 /* PR 17531: file: id:000001,src:000172+005151,op:splice,rep:2. */
10105 end = (section->sh_info < section->sh_size
10106 ? section->sh_info : section->sh_size);
10107 for (idx = cnt = 0; cnt < end; ++cnt)
252b5132 10108 {
2cf0635d
NC
10109 char * vstart;
10110 Elf_External_Verdef * edef;
b34976b6 10111 Elf_Internal_Verdef ent;
2cf0635d 10112 Elf_External_Verdaux * eaux;
b34976b6 10113 Elf_Internal_Verdaux aux;
5235cd68 10114 unsigned int isum;
b34976b6 10115 int j;
103f02d3 10116
222c2bf0 10117 /* Check for very large indices. */
7e26601c 10118 if (idx > (size_t) (endbuf - (char *) edefs))
dd24e3da
NC
10119 break;
10120
252b5132 10121 vstart = ((char *) edefs) + idx;
54806181
AM
10122 if (vstart + sizeof (*edef) > endbuf)
10123 break;
252b5132
RH
10124
10125 edef = (Elf_External_Verdef *) vstart;
10126
10127 ent.vd_version = BYTE_GET (edef->vd_version);
10128 ent.vd_flags = BYTE_GET (edef->vd_flags);
10129 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
10130 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
10131 ent.vd_hash = BYTE_GET (edef->vd_hash);
10132 ent.vd_aux = BYTE_GET (edef->vd_aux);
10133 ent.vd_next = BYTE_GET (edef->vd_next);
10134
10135 printf (_(" %#06x: Rev: %d Flags: %s"),
10136 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
10137
10138 printf (_(" Index: %d Cnt: %d "),
10139 ent.vd_ndx, ent.vd_cnt);
10140
dd24e3da 10141 /* Check for overflow. */
4aeb00ad 10142 if (ent.vd_aux + sizeof (* eaux) > (size_t) (endbuf - vstart))
dd24e3da
NC
10143 break;
10144
252b5132
RH
10145 vstart += ent.vd_aux;
10146
10147 eaux = (Elf_External_Verdaux *) vstart;
10148
10149 aux.vda_name = BYTE_GET (eaux->vda_name);
10150 aux.vda_next = BYTE_GET (eaux->vda_next);
10151
d79b3d50
NC
10152 if (VALID_DYNAMIC_NAME (aux.vda_name))
10153 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
252b5132
RH
10154 else
10155 printf (_("Name index: %ld\n"), aux.vda_name);
10156
10157 isum = idx + ent.vd_aux;
10158
b34976b6 10159 for (j = 1; j < ent.vd_cnt; j++)
252b5132 10160 {
dd24e3da 10161 /* Check for overflow. */
7e26601c 10162 if (aux.vda_next > (size_t) (endbuf - vstart))
dd24e3da
NC
10163 break;
10164
252b5132
RH
10165 isum += aux.vda_next;
10166 vstart += aux.vda_next;
10167
10168 eaux = (Elf_External_Verdaux *) vstart;
54806181
AM
10169 if (vstart + sizeof (*eaux) > endbuf)
10170 break;
252b5132
RH
10171
10172 aux.vda_name = BYTE_GET (eaux->vda_name);
10173 aux.vda_next = BYTE_GET (eaux->vda_next);
10174
d79b3d50 10175 if (VALID_DYNAMIC_NAME (aux.vda_name))
252b5132 10176 printf (_(" %#06x: Parent %d: %s\n"),
d79b3d50 10177 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
252b5132
RH
10178 else
10179 printf (_(" %#06x: Parent %d, name index: %ld\n"),
10180 isum, j, aux.vda_name);
10181 }
dd24e3da 10182
54806181
AM
10183 if (j < ent.vd_cnt)
10184 printf (_(" Version def aux past end of section\n"));
252b5132 10185
c9f02c3e
MR
10186 /* PR 17531:
10187 file: id:000001,src:000172+005151,op:splice,rep:2. */
10188 if (idx + ent.vd_next < idx)
5d921cbd
NC
10189 break;
10190
252b5132
RH
10191 idx += ent.vd_next;
10192 }
dd24e3da 10193
54806181
AM
10194 if (cnt < section->sh_info)
10195 printf (_(" Version definition past end of section\n"));
252b5132
RH
10196
10197 free (edefs);
10198 }
10199 break;
103f02d3 10200
252b5132
RH
10201 case SHT_GNU_verneed:
10202 {
2cf0635d 10203 Elf_External_Verneed * eneed;
b34976b6
AM
10204 unsigned int idx;
10205 unsigned int cnt;
2cf0635d 10206 char * endbuf;
252b5132 10207
32ec8896 10208 found = TRUE;
252b5132 10209
72de5009 10210 printf (_("\nVersion needs section '%s' contains %u entries:\n"),
74e1a04b 10211 printable_section_name (section), section->sh_info);
252b5132
RH
10212
10213 printf (_(" Addr: 0x"));
10214 printf_vma (section->sh_addr);
72de5009 10215 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
1b228002 10216 (unsigned long) section->sh_offset, section->sh_link,
74e1a04b 10217 printable_section_name_from_index (section->sh_link));
252b5132 10218
3f5e193b
NC
10219 eneed = (Elf_External_Verneed *) get_data (NULL, file,
10220 section->sh_offset, 1,
10221 section->sh_size,
9cf03b7e 10222 _("Version Needs section"));
a6e9f9df
AM
10223 if (!eneed)
10224 break;
59245841 10225 endbuf = (char *) eneed + section->sh_size;
252b5132
RH
10226
10227 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10228 {
2cf0635d 10229 Elf_External_Verneed * entry;
b34976b6 10230 Elf_Internal_Verneed ent;
5235cd68 10231 unsigned int isum;
b34976b6 10232 int j;
2cf0635d 10233 char * vstart;
252b5132 10234
7e26601c 10235 if (idx > (size_t) (endbuf - (char *) eneed))
dd24e3da
NC
10236 break;
10237
252b5132 10238 vstart = ((char *) eneed) + idx;
54806181
AM
10239 if (vstart + sizeof (*entry) > endbuf)
10240 break;
252b5132
RH
10241
10242 entry = (Elf_External_Verneed *) vstart;
10243
10244 ent.vn_version = BYTE_GET (entry->vn_version);
10245 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
10246 ent.vn_file = BYTE_GET (entry->vn_file);
10247 ent.vn_aux = BYTE_GET (entry->vn_aux);
10248 ent.vn_next = BYTE_GET (entry->vn_next);
10249
10250 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
10251
d79b3d50
NC
10252 if (VALID_DYNAMIC_NAME (ent.vn_file))
10253 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
252b5132
RH
10254 else
10255 printf (_(" File: %lx"), ent.vn_file);
10256
10257 printf (_(" Cnt: %d\n"), ent.vn_cnt);
10258
dd24e3da 10259 /* Check for overflow. */
7e26601c 10260 if (ent.vn_aux > (size_t) (endbuf - vstart))
dd24e3da 10261 break;
252b5132
RH
10262 vstart += ent.vn_aux;
10263
10264 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
10265 {
2cf0635d 10266 Elf_External_Vernaux * eaux;
b34976b6 10267 Elf_Internal_Vernaux aux;
252b5132 10268
54806181
AM
10269 if (vstart + sizeof (*eaux) > endbuf)
10270 break;
252b5132
RH
10271 eaux = (Elf_External_Vernaux *) vstart;
10272
10273 aux.vna_hash = BYTE_GET (eaux->vna_hash);
10274 aux.vna_flags = BYTE_GET (eaux->vna_flags);
10275 aux.vna_other = BYTE_GET (eaux->vna_other);
10276 aux.vna_name = BYTE_GET (eaux->vna_name);
10277 aux.vna_next = BYTE_GET (eaux->vna_next);
10278
d79b3d50 10279 if (VALID_DYNAMIC_NAME (aux.vna_name))
ecc2063b 10280 printf (_(" %#06x: Name: %s"),
d79b3d50 10281 isum, GET_DYNAMIC_NAME (aux.vna_name));
252b5132 10282 else
ecc2063b 10283 printf (_(" %#06x: Name index: %lx"),
252b5132
RH
10284 isum, aux.vna_name);
10285
10286 printf (_(" Flags: %s Version: %d\n"),
10287 get_ver_flags (aux.vna_flags), aux.vna_other);
10288
dd24e3da 10289 /* Check for overflow. */
53774b7e
NC
10290 if (aux.vna_next > (size_t) (endbuf - vstart)
10291 || (aux.vna_next == 0 && j < ent.vn_cnt - 1))
10292 {
10293 warn (_("Invalid vna_next field of %lx\n"),
10294 aux.vna_next);
10295 j = ent.vn_cnt;
10296 break;
10297 }
252b5132
RH
10298 isum += aux.vna_next;
10299 vstart += aux.vna_next;
10300 }
9cf03b7e 10301
54806181 10302 if (j < ent.vn_cnt)
9cf03b7e 10303 warn (_("Missing Version Needs auxillary information\n"));
252b5132 10304
bcf83b2a 10305 if (ent.vn_next == 0 && cnt < section->sh_info - 1)
c24cf8b6
NC
10306 {
10307 warn (_("Corrupt Version Needs structure - offset to next structure is zero with entries still left to be processed\n"));
10308 cnt = section->sh_info;
10309 break;
10310 }
252b5132
RH
10311 idx += ent.vn_next;
10312 }
9cf03b7e 10313
54806181 10314 if (cnt < section->sh_info)
9cf03b7e 10315 warn (_("Missing Version Needs information\n"));
103f02d3 10316
252b5132
RH
10317 free (eneed);
10318 }
10319 break;
10320
10321 case SHT_GNU_versym:
10322 {
2cf0635d 10323 Elf_Internal_Shdr * link_section;
8b73c356
NC
10324 size_t total;
10325 unsigned int cnt;
2cf0635d
NC
10326 unsigned char * edata;
10327 unsigned short * data;
10328 char * strtab;
10329 Elf_Internal_Sym * symbols;
10330 Elf_Internal_Shdr * string_sec;
ba5cdace 10331 unsigned long num_syms;
d3ba0551 10332 long off;
252b5132 10333
4fbb74a6 10334 if (section->sh_link >= elf_header.e_shnum)
c256ffe7
JJ
10335 break;
10336
4fbb74a6 10337 link_section = section_headers + section->sh_link;
08d8fa11 10338 total = section->sh_size / sizeof (Elf_External_Versym);
252b5132 10339
4fbb74a6 10340 if (link_section->sh_link >= elf_header.e_shnum)
c256ffe7
JJ
10341 break;
10342
32ec8896 10343 found = TRUE;
252b5132 10344
ba5cdace 10345 symbols = GET_ELF_SYMBOLS (file, link_section, & num_syms);
dd24e3da
NC
10346 if (symbols == NULL)
10347 break;
252b5132 10348
4fbb74a6 10349 string_sec = section_headers + link_section->sh_link;
252b5132 10350
3f5e193b
NC
10351 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
10352 string_sec->sh_size,
10353 _("version string table"));
a6e9f9df 10354 if (!strtab)
0429c154
MS
10355 {
10356 free (symbols);
10357 break;
10358 }
252b5132 10359
8b73c356
NC
10360 printf (_("\nVersion symbols section '%s' contains %lu entries:\n"),
10361 printable_section_name (section), (unsigned long) total);
252b5132
RH
10362
10363 printf (_(" Addr: "));
10364 printf_vma (section->sh_addr);
72de5009 10365 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
1b228002 10366 (unsigned long) section->sh_offset, section->sh_link,
74e1a04b 10367 printable_section_name (link_section));
252b5132 10368
d3ba0551
AM
10369 off = offset_from_vma (file,
10370 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10371 total * sizeof (short));
3f5e193b
NC
10372 edata = (unsigned char *) get_data (NULL, file, off, total,
10373 sizeof (short),
10374 _("version symbol data"));
a6e9f9df
AM
10375 if (!edata)
10376 {
10377 free (strtab);
0429c154 10378 free (symbols);
a6e9f9df
AM
10379 break;
10380 }
252b5132 10381
3f5e193b 10382 data = (short unsigned int *) cmalloc (total, sizeof (short));
252b5132
RH
10383
10384 for (cnt = total; cnt --;)
b34976b6
AM
10385 data[cnt] = byte_get (edata + cnt * sizeof (short),
10386 sizeof (short));
252b5132
RH
10387
10388 free (edata);
10389
10390 for (cnt = 0; cnt < total; cnt += 4)
10391 {
10392 int j, nn;
ab273396
AM
10393 char *name;
10394 char *invalid = _("*invalid*");
252b5132
RH
10395
10396 printf (" %03x:", cnt);
10397
10398 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
b34976b6 10399 switch (data[cnt + j])
252b5132
RH
10400 {
10401 case 0:
10402 fputs (_(" 0 (*local*) "), stdout);
10403 break;
10404
10405 case 1:
10406 fputs (_(" 1 (*global*) "), stdout);
10407 break;
10408
10409 default:
c244d050
NC
10410 nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
10411 data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
252b5132 10412
dd24e3da 10413 /* If this index value is greater than the size of the symbols
ba5cdace
NC
10414 array, break to avoid an out-of-bounds read. */
10415 if ((unsigned long)(cnt + j) >= num_syms)
dd24e3da
NC
10416 {
10417 warn (_("invalid index into symbol array\n"));
10418 break;
10419 }
10420
ab273396
AM
10421 name = NULL;
10422 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
252b5132 10423 {
b34976b6
AM
10424 Elf_Internal_Verneed ivn;
10425 unsigned long offset;
252b5132 10426
d93f0186
NC
10427 offset = offset_from_vma
10428 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10429 sizeof (Elf_External_Verneed));
252b5132 10430
b34976b6 10431 do
252b5132 10432 {
b34976b6
AM
10433 Elf_Internal_Vernaux ivna;
10434 Elf_External_Verneed evn;
10435 Elf_External_Vernaux evna;
10436 unsigned long a_off;
252b5132 10437
59245841
NC
10438 if (get_data (&evn, file, offset, sizeof (evn), 1,
10439 _("version need")) == NULL)
10440 break;
0b4362b0 10441
252b5132
RH
10442 ivn.vn_aux = BYTE_GET (evn.vn_aux);
10443 ivn.vn_next = BYTE_GET (evn.vn_next);
10444
10445 a_off = offset + ivn.vn_aux;
10446
10447 do
10448 {
59245841
NC
10449 if (get_data (&evna, file, a_off, sizeof (evna),
10450 1, _("version need aux (2)")) == NULL)
10451 {
10452 ivna.vna_next = 0;
10453 ivna.vna_other = 0;
10454 }
10455 else
10456 {
10457 ivna.vna_next = BYTE_GET (evna.vna_next);
10458 ivna.vna_other = BYTE_GET (evna.vna_other);
10459 }
252b5132
RH
10460
10461 a_off += ivna.vna_next;
10462 }
b34976b6 10463 while (ivna.vna_other != data[cnt + j]
252b5132
RH
10464 && ivna.vna_next != 0);
10465
b34976b6 10466 if (ivna.vna_other == data[cnt + j])
252b5132
RH
10467 {
10468 ivna.vna_name = BYTE_GET (evna.vna_name);
10469
54806181 10470 if (ivna.vna_name >= string_sec->sh_size)
ab273396 10471 name = invalid;
54806181
AM
10472 else
10473 name = strtab + ivna.vna_name;
252b5132
RH
10474 break;
10475 }
10476
10477 offset += ivn.vn_next;
10478 }
10479 while (ivn.vn_next);
10480 }
00d93f34 10481
ab273396 10482 if (data[cnt + j] != 0x8001
b34976b6 10483 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
252b5132 10484 {
b34976b6
AM
10485 Elf_Internal_Verdef ivd;
10486 Elf_External_Verdef evd;
10487 unsigned long offset;
252b5132 10488
d93f0186
NC
10489 offset = offset_from_vma
10490 (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10491 sizeof evd);
252b5132
RH
10492
10493 do
10494 {
59245841
NC
10495 if (get_data (&evd, file, offset, sizeof (evd), 1,
10496 _("version def")) == NULL)
10497 {
10498 ivd.vd_next = 0;
948f632f 10499 /* PR 17531: file: 046-1082287-0.004. */
3102e897
NC
10500 ivd.vd_ndx = (data[cnt + j] & VERSYM_VERSION) + 1;
10501 break;
59245841
NC
10502 }
10503 else
10504 {
10505 ivd.vd_next = BYTE_GET (evd.vd_next);
10506 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10507 }
252b5132
RH
10508
10509 offset += ivd.vd_next;
10510 }
c244d050 10511 while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
252b5132
RH
10512 && ivd.vd_next != 0);
10513
c244d050 10514 if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
252b5132 10515 {
b34976b6
AM
10516 Elf_External_Verdaux evda;
10517 Elf_Internal_Verdaux ivda;
252b5132
RH
10518
10519 ivd.vd_aux = BYTE_GET (evd.vd_aux);
10520
59245841
NC
10521 if (get_data (&evda, file,
10522 offset - ivd.vd_next + ivd.vd_aux,
10523 sizeof (evda), 1,
10524 _("version def aux")) == NULL)
10525 break;
252b5132
RH
10526
10527 ivda.vda_name = BYTE_GET (evda.vda_name);
10528
54806181 10529 if (ivda.vda_name >= string_sec->sh_size)
ab273396
AM
10530 name = invalid;
10531 else if (name != NULL && name != invalid)
10532 name = _("*both*");
54806181
AM
10533 else
10534 name = strtab + ivda.vda_name;
252b5132
RH
10535 }
10536 }
ab273396
AM
10537 if (name != NULL)
10538 nn += printf ("(%s%-*s",
10539 name,
10540 12 - (int) strlen (name),
10541 ")");
252b5132
RH
10542
10543 if (nn < 18)
10544 printf ("%*c", 18 - nn, ' ');
10545 }
10546
10547 putchar ('\n');
10548 }
10549
10550 free (data);
10551 free (strtab);
10552 free (symbols);
10553 }
10554 break;
103f02d3 10555
252b5132
RH
10556 default:
10557 break;
10558 }
10559 }
10560
10561 if (! found)
10562 printf (_("\nNo version information found in this file.\n"));
10563
32ec8896 10564 return TRUE;
252b5132
RH
10565}
10566
d1133906 10567static const char *
d3ba0551 10568get_symbol_binding (unsigned int binding)
252b5132 10569{
b34976b6 10570 static char buff[32];
252b5132
RH
10571
10572 switch (binding)
10573 {
b34976b6
AM
10574 case STB_LOCAL: return "LOCAL";
10575 case STB_GLOBAL: return "GLOBAL";
10576 case STB_WEAK: return "WEAK";
252b5132
RH
10577 default:
10578 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
e9e44622
JJ
10579 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
10580 binding);
252b5132 10581 else if (binding >= STB_LOOS && binding <= STB_HIOS)
3e7a7d11
NC
10582 {
10583 if (binding == STB_GNU_UNIQUE
9c55345c
TS
10584 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10585 /* GNU is still using the default value 0. */
3e7a7d11
NC
10586 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10587 return "UNIQUE";
10588 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
10589 }
252b5132 10590 else
e9e44622 10591 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
252b5132
RH
10592 return buff;
10593 }
10594}
10595
d1133906 10596static const char *
d3ba0551 10597get_symbol_type (unsigned int type)
252b5132 10598{
b34976b6 10599 static char buff[32];
252b5132
RH
10600
10601 switch (type)
10602 {
b34976b6
AM
10603 case STT_NOTYPE: return "NOTYPE";
10604 case STT_OBJECT: return "OBJECT";
10605 case STT_FUNC: return "FUNC";
10606 case STT_SECTION: return "SECTION";
10607 case STT_FILE: return "FILE";
10608 case STT_COMMON: return "COMMON";
10609 case STT_TLS: return "TLS";
15ab5209
DB
10610 case STT_RELC: return "RELC";
10611 case STT_SRELC: return "SRELC";
252b5132
RH
10612 default:
10613 if (type >= STT_LOPROC && type <= STT_HIPROC)
df75f1af 10614 {
3510a7b8
NC
10615 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
10616 return "THUMB_FUNC";
103f02d3 10617
351b4b40 10618 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
103f02d3
UD
10619 return "REGISTER";
10620
10621 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
10622 return "PARISC_MILLI";
10623
e9e44622 10624 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
df75f1af 10625 }
252b5132 10626 else if (type >= STT_LOOS && type <= STT_HIOS)
103f02d3
UD
10627 {
10628 if (elf_header.e_machine == EM_PARISC)
10629 {
10630 if (type == STT_HP_OPAQUE)
10631 return "HP_OPAQUE";
10632 if (type == STT_HP_STUB)
10633 return "HP_STUB";
10634 }
10635
d8045f23 10636 if (type == STT_GNU_IFUNC
9c55345c 10637 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
83c257ca 10638 || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
9c55345c 10639 /* GNU is still using the default value 0. */
d8045f23
NC
10640 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10641 return "IFUNC";
10642
e9e44622 10643 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
103f02d3 10644 }
252b5132 10645 else
e9e44622 10646 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
252b5132
RH
10647 return buff;
10648 }
10649}
10650
d1133906 10651static const char *
d3ba0551 10652get_symbol_visibility (unsigned int visibility)
d1133906
NC
10653{
10654 switch (visibility)
10655 {
b34976b6
AM
10656 case STV_DEFAULT: return "DEFAULT";
10657 case STV_INTERNAL: return "INTERNAL";
10658 case STV_HIDDEN: return "HIDDEN";
d1133906 10659 case STV_PROTECTED: return "PROTECTED";
bee0ee85
NC
10660 default:
10661 error (_("Unrecognized visibility value: %u"), visibility);
10662 return _("<unknown>");
d1133906
NC
10663 }
10664}
10665
fd85a6a1
NC
10666static const char *
10667get_solaris_symbol_visibility (unsigned int visibility)
10668{
10669 switch (visibility)
10670 {
10671 case 4: return "EXPORTED";
10672 case 5: return "SINGLETON";
10673 case 6: return "ELIMINATE";
10674 default: return get_symbol_visibility (visibility);
10675 }
10676}
10677
5e2b0d47
NC
10678static const char *
10679get_mips_symbol_other (unsigned int other)
10680{
10681 switch (other)
10682 {
32ec8896
NC
10683 case STO_OPTIONAL: return "OPTIONAL";
10684 case STO_MIPS_PLT: return "MIPS PLT";
10685 case STO_MIPS_PIC: return "MIPS PIC";
10686 case STO_MICROMIPS: return "MICROMIPS";
10687 case STO_MICROMIPS | STO_MIPS_PIC: return "MICROMIPS, MIPS PIC";
10688 case STO_MIPS16: return "MIPS16";
10689 default: return NULL;
5e2b0d47
NC
10690 }
10691}
10692
28f997cf
TG
10693static const char *
10694get_ia64_symbol_other (unsigned int other)
10695{
10696 if (is_ia64_vms ())
10697 {
10698 static char res[32];
10699
10700 res[0] = 0;
10701
10702 /* Function types is for images and .STB files only. */
10703 switch (elf_header.e_type)
10704 {
10705 case ET_DYN:
10706 case ET_EXEC:
10707 switch (VMS_ST_FUNC_TYPE (other))
10708 {
10709 case VMS_SFT_CODE_ADDR:
10710 strcat (res, " CA");
10711 break;
10712 case VMS_SFT_SYMV_IDX:
10713 strcat (res, " VEC");
10714 break;
10715 case VMS_SFT_FD:
10716 strcat (res, " FD");
10717 break;
10718 case VMS_SFT_RESERVE:
10719 strcat (res, " RSV");
10720 break;
10721 default:
bee0ee85
NC
10722 warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
10723 VMS_ST_FUNC_TYPE (other));
10724 strcat (res, " <unknown>");
10725 break;
28f997cf
TG
10726 }
10727 break;
10728 default:
10729 break;
10730 }
10731 switch (VMS_ST_LINKAGE (other))
10732 {
10733 case VMS_STL_IGNORE:
10734 strcat (res, " IGN");
10735 break;
10736 case VMS_STL_RESERVE:
10737 strcat (res, " RSV");
10738 break;
10739 case VMS_STL_STD:
10740 strcat (res, " STD");
10741 break;
10742 case VMS_STL_LNK:
10743 strcat (res, " LNK");
10744 break;
10745 default:
bee0ee85
NC
10746 warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
10747 VMS_ST_LINKAGE (other));
10748 strcat (res, " <unknown>");
10749 break;
28f997cf
TG
10750 }
10751
10752 if (res[0] != 0)
10753 return res + 1;
10754 else
10755 return res;
10756 }
10757 return NULL;
10758}
10759
6911b7dc
AM
10760static const char *
10761get_ppc64_symbol_other (unsigned int other)
10762{
10763 if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
10764 {
10765 static char buf[32];
10766 snprintf (buf, sizeof buf, _("<localentry>: %d"),
10767 PPC64_LOCAL_ENTRY_OFFSET (other));
10768 return buf;
10769 }
10770 return NULL;
10771}
10772
5e2b0d47
NC
10773static const char *
10774get_symbol_other (unsigned int other)
10775{
10776 const char * result = NULL;
10777 static char buff [32];
10778
10779 if (other == 0)
10780 return "";
10781
10782 switch (elf_header.e_machine)
10783 {
10784 case EM_MIPS:
10785 result = get_mips_symbol_other (other);
28f997cf
TG
10786 break;
10787 case EM_IA_64:
10788 result = get_ia64_symbol_other (other);
10789 break;
6911b7dc
AM
10790 case EM_PPC64:
10791 result = get_ppc64_symbol_other (other);
10792 break;
5e2b0d47 10793 default:
fd85a6a1 10794 result = NULL;
5e2b0d47
NC
10795 break;
10796 }
10797
10798 if (result)
10799 return result;
10800
10801 snprintf (buff, sizeof buff, _("<other>: %x"), other);
10802 return buff;
10803}
10804
d1133906 10805static const char *
d3ba0551 10806get_symbol_index_type (unsigned int type)
252b5132 10807{
b34976b6 10808 static char buff[32];
5cf1065c 10809
252b5132
RH
10810 switch (type)
10811 {
b34976b6
AM
10812 case SHN_UNDEF: return "UND";
10813 case SHN_ABS: return "ABS";
10814 case SHN_COMMON: return "COM";
252b5132 10815 default:
9ce701e2
L
10816 if (type == SHN_IA_64_ANSI_COMMON
10817 && elf_header.e_machine == EM_IA_64
10818 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
10819 return "ANSI_COM";
8a9036a4 10820 else if ((elf_header.e_machine == EM_X86_64
7a9068fe
L
10821 || elf_header.e_machine == EM_L1OM
10822 || elf_header.e_machine == EM_K1OM)
3b22753a
L
10823 && type == SHN_X86_64_LCOMMON)
10824 return "LARGE_COM";
ac145307
BS
10825 else if ((type == SHN_MIPS_SCOMMON
10826 && elf_header.e_machine == EM_MIPS)
10827 || (type == SHN_TIC6X_SCOMMON
10828 && elf_header.e_machine == EM_TI_C6000))
172553c7
TS
10829 return "SCOM";
10830 else if (type == SHN_MIPS_SUNDEFINED
10831 && elf_header.e_machine == EM_MIPS)
10832 return "SUND";
9ce701e2 10833 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
4fbb74a6 10834 sprintf (buff, "PRC[0x%04x]", type & 0xffff);
252b5132 10835 else if (type >= SHN_LOOS && type <= SHN_HIOS)
4fbb74a6
AM
10836 sprintf (buff, "OS [0x%04x]", type & 0xffff);
10837 else if (type >= SHN_LORESERVE)
10838 sprintf (buff, "RSV[0x%04x]", type & 0xffff);
c6d8cab4 10839 else if (type >= elf_header.e_shnum)
e0a31db1 10840 sprintf (buff, _("bad section index[%3d]"), type);
252b5132 10841 else
232e7cb8 10842 sprintf (buff, "%3d", type);
5cf1065c 10843 break;
252b5132 10844 }
5cf1065c
NC
10845
10846 return buff;
252b5132
RH
10847}
10848
66543521 10849static bfd_vma *
57028622 10850get_dynamic_data (FILE * file, bfd_size_type number, unsigned int ent_size)
252b5132 10851{
2cf0635d
NC
10852 unsigned char * e_data;
10853 bfd_vma * i_data;
252b5132 10854
57028622
NC
10855 /* If the size_t type is smaller than the bfd_size_type, eg because
10856 you are building a 32-bit tool on a 64-bit host, then make sure
10857 that when (number) is cast to (size_t) no information is lost. */
10858 if (sizeof (size_t) < sizeof (bfd_size_type)
10859 && (bfd_size_type) ((size_t) number) != number)
10860 {
ed754a13
AM
10861 error (_("Size truncation prevents reading %" BFD_VMA_FMT "u"
10862 " elements of size %u\n"),
10863 number, ent_size);
57028622
NC
10864 return NULL;
10865 }
948f632f 10866
3102e897
NC
10867 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
10868 attempting to allocate memory when the read is bound to fail. */
10869 if (ent_size * number > current_file_size)
10870 {
ed754a13
AM
10871 error (_("Invalid number of dynamic entries: %" BFD_VMA_FMT "u\n"),
10872 number);
3102e897
NC
10873 return NULL;
10874 }
10875
57028622 10876 e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
252b5132
RH
10877 if (e_data == NULL)
10878 {
ed754a13
AM
10879 error (_("Out of memory reading %" BFD_VMA_FMT "u dynamic entries\n"),
10880 number);
252b5132
RH
10881 return NULL;
10882 }
10883
57028622 10884 if (fread (e_data, ent_size, (size_t) number, file) != number)
252b5132 10885 {
ed754a13
AM
10886 error (_("Unable to read in %" BFD_VMA_FMT "u bytes of dynamic data\n"),
10887 number * ent_size);
3102e897 10888 free (e_data);
252b5132
RH
10889 return NULL;
10890 }
10891
57028622 10892 i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
252b5132
RH
10893 if (i_data == NULL)
10894 {
ed754a13
AM
10895 error (_("Out of memory allocating space for %" BFD_VMA_FMT "u"
10896 " dynamic entries\n"),
10897 number);
252b5132
RH
10898 free (e_data);
10899 return NULL;
10900 }
10901
10902 while (number--)
66543521 10903 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
252b5132
RH
10904
10905 free (e_data);
10906
10907 return i_data;
10908}
10909
6bd1a22c
L
10910static void
10911print_dynamic_symbol (bfd_vma si, unsigned long hn)
10912{
2cf0635d 10913 Elf_Internal_Sym * psym;
6bd1a22c
L
10914 int n;
10915
6bd1a22c
L
10916 n = print_vma (si, DEC_5);
10917 if (n < 5)
0b4362b0 10918 fputs (&" "[n], stdout);
6bd1a22c 10919 printf (" %3lu: ", hn);
e0a31db1
NC
10920
10921 if (dynamic_symbols == NULL || si >= num_dynamic_syms)
10922 {
3102e897
NC
10923 printf (_("<No info available for dynamic symbol number %lu>\n"),
10924 (unsigned long) si);
e0a31db1
NC
10925 return;
10926 }
10927
10928 psym = dynamic_symbols + si;
6bd1a22c
L
10929 print_vma (psym->st_value, LONG_HEX);
10930 putchar (' ');
10931 print_vma (psym->st_size, DEC_5);
10932
f4be36b3
AM
10933 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10934 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
fd85a6a1
NC
10935
10936 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
10937 printf (" %-7s", get_solaris_symbol_visibility (psym->st_other));
10938 else
10939 {
10940 unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
10941
10942 printf (" %-7s", get_symbol_visibility (vis));
10943 /* Check to see if any other bits in the st_other field are set.
10944 Note - displaying this information disrupts the layout of the
10945 table being generated, but for the moment this case is very
10946 rare. */
10947 if (psym->st_other ^ vis)
10948 printf (" [%s] ", get_symbol_other (psym->st_other ^ vis));
10949 }
10950
6bd1a22c
L
10951 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
10952 if (VALID_DYNAMIC_NAME (psym->st_name))
10953 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
10954 else
2b692964 10955 printf (_(" <corrupt: %14ld>"), psym->st_name);
6bd1a22c
L
10956 putchar ('\n');
10957}
10958
bb4d2ac2 10959static const char *
1449284b
NC
10960get_symbol_version_string (FILE * file,
10961 bfd_boolean is_dynsym,
10962 const char * strtab,
10963 unsigned long int strtab_size,
10964 unsigned int si,
10965 Elf_Internal_Sym * psym,
10966 enum versioned_symbol_info * sym_info,
10967 unsigned short * vna_other)
bb4d2ac2 10968{
ab273396
AM
10969 unsigned char data[2];
10970 unsigned short vers_data;
10971 unsigned long offset;
bb4d2ac2 10972
ab273396
AM
10973 if (!is_dynsym
10974 || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
10975 return NULL;
bb4d2ac2 10976
ab273396
AM
10977 offset = offset_from_vma (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10978 sizeof data + si * sizeof (vers_data));
bb4d2ac2 10979
ab273396
AM
10980 if (get_data (&data, file, offset + si * sizeof (vers_data),
10981 sizeof (data), 1, _("version data")) == NULL)
10982 return NULL;
10983
10984 vers_data = byte_get (data, 2);
bb4d2ac2 10985
ab273396
AM
10986 if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data <= 1)
10987 return NULL;
bb4d2ac2 10988
ab273396
AM
10989 /* Usually we'd only see verdef for defined symbols, and verneed for
10990 undefined symbols. However, symbols defined by the linker in
10991 .dynbss for variables copied from a shared library in order to
10992 avoid text relocations are defined yet have verneed. We could
10993 use a heuristic to detect the special case, for example, check
10994 for verneed first on symbols defined in SHT_NOBITS sections, but
10995 it is simpler and more reliable to just look for both verdef and
10996 verneed. .dynbss might not be mapped to a SHT_NOBITS section. */
bb4d2ac2 10997
ab273396
AM
10998 if (psym->st_shndx != SHN_UNDEF
10999 && vers_data != 0x8001
11000 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
11001 {
11002 Elf_Internal_Verdef ivd;
11003 Elf_Internal_Verdaux ivda;
11004 Elf_External_Verdaux evda;
11005 unsigned long off;
bb4d2ac2 11006
ab273396
AM
11007 off = offset_from_vma (file,
11008 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
11009 sizeof (Elf_External_Verdef));
11010
11011 do
bb4d2ac2 11012 {
ab273396
AM
11013 Elf_External_Verdef evd;
11014
11015 if (get_data (&evd, file, off, sizeof (evd), 1,
11016 _("version def")) == NULL)
11017 {
11018 ivd.vd_ndx = 0;
11019 ivd.vd_aux = 0;
11020 ivd.vd_next = 0;
11021 }
11022 else
bb4d2ac2 11023 {
ab273396
AM
11024 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
11025 ivd.vd_aux = BYTE_GET (evd.vd_aux);
11026 ivd.vd_next = BYTE_GET (evd.vd_next);
11027 }
bb4d2ac2 11028
ab273396
AM
11029 off += ivd.vd_next;
11030 }
11031 while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
bb4d2ac2 11032
ab273396
AM
11033 if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
11034 {
11035 off -= ivd.vd_next;
11036 off += ivd.vd_aux;
bb4d2ac2 11037
ab273396
AM
11038 if (get_data (&evda, file, off, sizeof (evda), 1,
11039 _("version def aux")) != NULL)
11040 {
11041 ivda.vda_name = BYTE_GET (evda.vda_name);
bb4d2ac2 11042
ab273396
AM
11043 if (psym->st_name != ivda.vda_name)
11044 {
11045 *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
11046 ? symbol_hidden : symbol_public);
11047 return (ivda.vda_name < strtab_size
11048 ? strtab + ivda.vda_name : _("<corrupt>"));
11049 }
11050 }
11051 }
11052 }
bb4d2ac2 11053
ab273396
AM
11054 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
11055 {
11056 Elf_External_Verneed evn;
11057 Elf_Internal_Verneed ivn;
11058 Elf_Internal_Vernaux ivna;
bb4d2ac2 11059
ab273396
AM
11060 offset = offset_from_vma (file,
11061 version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
11062 sizeof evn);
11063 do
11064 {
11065 unsigned long vna_off;
bb4d2ac2 11066
ab273396
AM
11067 if (get_data (&evn, file, offset, sizeof (evn), 1,
11068 _("version need")) == NULL)
11069 {
11070 ivna.vna_next = 0;
11071 ivna.vna_other = 0;
11072 ivna.vna_name = 0;
11073 break;
11074 }
bb4d2ac2 11075
ab273396
AM
11076 ivn.vn_aux = BYTE_GET (evn.vn_aux);
11077 ivn.vn_next = BYTE_GET (evn.vn_next);
bb4d2ac2 11078
ab273396 11079 vna_off = offset + ivn.vn_aux;
bb4d2ac2 11080
ab273396
AM
11081 do
11082 {
11083 Elf_External_Vernaux evna;
bb4d2ac2 11084
ab273396
AM
11085 if (get_data (&evna, file, vna_off, sizeof (evna), 1,
11086 _("version need aux (3)")) == NULL)
bb4d2ac2 11087 {
ab273396
AM
11088 ivna.vna_next = 0;
11089 ivna.vna_other = 0;
11090 ivna.vna_name = 0;
bb4d2ac2 11091 }
bb4d2ac2 11092 else
bb4d2ac2 11093 {
ab273396
AM
11094 ivna.vna_other = BYTE_GET (evna.vna_other);
11095 ivna.vna_next = BYTE_GET (evna.vna_next);
11096 ivna.vna_name = BYTE_GET (evna.vna_name);
11097 }
bb4d2ac2 11098
ab273396
AM
11099 vna_off += ivna.vna_next;
11100 }
11101 while (ivna.vna_other != vers_data && ivna.vna_next != 0);
bb4d2ac2 11102
ab273396
AM
11103 if (ivna.vna_other == vers_data)
11104 break;
bb4d2ac2 11105
ab273396
AM
11106 offset += ivn.vn_next;
11107 }
11108 while (ivn.vn_next != 0);
bb4d2ac2 11109
ab273396
AM
11110 if (ivna.vna_other == vers_data)
11111 {
11112 *sym_info = symbol_undefined;
11113 *vna_other = ivna.vna_other;
11114 return (ivna.vna_name < strtab_size
11115 ? strtab + ivna.vna_name : _("<corrupt>"));
bb4d2ac2
L
11116 }
11117 }
ab273396 11118 return NULL;
bb4d2ac2
L
11119}
11120
e3c8793a 11121/* Dump the symbol table. */
32ec8896 11122static bfd_boolean
2cf0635d 11123process_symbol_table (FILE * file)
252b5132 11124{
2cf0635d 11125 Elf_Internal_Shdr * section;
8b73c356
NC
11126 bfd_size_type nbuckets = 0;
11127 bfd_size_type nchains = 0;
2cf0635d
NC
11128 bfd_vma * buckets = NULL;
11129 bfd_vma * chains = NULL;
fdc90cb4 11130 bfd_vma ngnubuckets = 0;
2cf0635d
NC
11131 bfd_vma * gnubuckets = NULL;
11132 bfd_vma * gnuchains = NULL;
6bd1a22c 11133 bfd_vma gnusymidx = 0;
071436c6 11134 bfd_size_type ngnuchains = 0;
252b5132 11135
2c610e4b 11136 if (!do_syms && !do_dyn_syms && !do_histogram)
32ec8896 11137 return TRUE;
252b5132 11138
6bd1a22c
L
11139 if (dynamic_info[DT_HASH]
11140 && (do_histogram
2c610e4b
L
11141 || (do_using_dynamic
11142 && !do_dyn_syms
11143 && dynamic_strings != NULL)))
252b5132 11144 {
66543521
AM
11145 unsigned char nb[8];
11146 unsigned char nc[8];
8b73c356 11147 unsigned int hash_ent_size = 4;
66543521
AM
11148
11149 if ((elf_header.e_machine == EM_ALPHA
11150 || elf_header.e_machine == EM_S390
11151 || elf_header.e_machine == EM_S390_OLD)
11152 && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
11153 hash_ent_size = 8;
11154
fb52b2f4
NC
11155 if (fseek (file,
11156 (archive_file_offset
11157 + offset_from_vma (file, dynamic_info[DT_HASH],
11158 sizeof nb + sizeof nc)),
d93f0186 11159 SEEK_SET))
252b5132 11160 {
591a748a 11161 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 11162 goto no_hash;
252b5132
RH
11163 }
11164
66543521 11165 if (fread (nb, hash_ent_size, 1, file) != 1)
252b5132
RH
11166 {
11167 error (_("Failed to read in number of buckets\n"));
d3a44ec6 11168 goto no_hash;
252b5132
RH
11169 }
11170
66543521 11171 if (fread (nc, hash_ent_size, 1, file) != 1)
252b5132
RH
11172 {
11173 error (_("Failed to read in number of chains\n"));
d3a44ec6 11174 goto no_hash;
252b5132
RH
11175 }
11176
66543521
AM
11177 nbuckets = byte_get (nb, hash_ent_size);
11178 nchains = byte_get (nc, hash_ent_size);
252b5132 11179
66543521
AM
11180 buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
11181 chains = get_dynamic_data (file, nchains, hash_ent_size);
252b5132 11182
d3a44ec6 11183 no_hash:
252b5132 11184 if (buckets == NULL || chains == NULL)
d3a44ec6
JJ
11185 {
11186 if (do_using_dynamic)
32ec8896 11187 return FALSE;
d3a44ec6
JJ
11188 free (buckets);
11189 free (chains);
11190 buckets = NULL;
11191 chains = NULL;
11192 nbuckets = 0;
11193 nchains = 0;
11194 }
252b5132
RH
11195 }
11196
6bd1a22c
L
11197 if (dynamic_info_DT_GNU_HASH
11198 && (do_histogram
2c610e4b
L
11199 || (do_using_dynamic
11200 && !do_dyn_syms
11201 && dynamic_strings != NULL)))
252b5132 11202 {
6bd1a22c
L
11203 unsigned char nb[16];
11204 bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
11205 bfd_vma buckets_vma;
11206
11207 if (fseek (file,
11208 (archive_file_offset
11209 + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
11210 sizeof nb)),
11211 SEEK_SET))
11212 {
11213 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 11214 goto no_gnu_hash;
6bd1a22c 11215 }
252b5132 11216
6bd1a22c
L
11217 if (fread (nb, 16, 1, file) != 1)
11218 {
11219 error (_("Failed to read in number of buckets\n"));
d3a44ec6 11220 goto no_gnu_hash;
6bd1a22c
L
11221 }
11222
11223 ngnubuckets = byte_get (nb, 4);
11224 gnusymidx = byte_get (nb + 4, 4);
11225 bitmaskwords = byte_get (nb + 8, 4);
11226 buckets_vma = dynamic_info_DT_GNU_HASH + 16;
f7a99963 11227 if (is_32bit_elf)
6bd1a22c 11228 buckets_vma += bitmaskwords * 4;
f7a99963 11229 else
6bd1a22c 11230 buckets_vma += bitmaskwords * 8;
252b5132 11231
6bd1a22c
L
11232 if (fseek (file,
11233 (archive_file_offset
11234 + offset_from_vma (file, buckets_vma, 4)),
11235 SEEK_SET))
252b5132 11236 {
6bd1a22c 11237 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 11238 goto no_gnu_hash;
6bd1a22c
L
11239 }
11240
11241 gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
252b5132 11242
6bd1a22c 11243 if (gnubuckets == NULL)
d3a44ec6 11244 goto no_gnu_hash;
6bd1a22c
L
11245
11246 for (i = 0; i < ngnubuckets; i++)
11247 if (gnubuckets[i] != 0)
11248 {
11249 if (gnubuckets[i] < gnusymidx)
32ec8896 11250 return FALSE;
6bd1a22c
L
11251
11252 if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
11253 maxchain = gnubuckets[i];
11254 }
11255
11256 if (maxchain == 0xffffffff)
d3a44ec6 11257 goto no_gnu_hash;
6bd1a22c
L
11258
11259 maxchain -= gnusymidx;
11260
11261 if (fseek (file,
11262 (archive_file_offset
11263 + offset_from_vma (file, buckets_vma
11264 + 4 * (ngnubuckets + maxchain), 4)),
11265 SEEK_SET))
11266 {
11267 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 11268 goto no_gnu_hash;
6bd1a22c
L
11269 }
11270
11271 do
11272 {
11273 if (fread (nb, 4, 1, file) != 1)
252b5132 11274 {
6bd1a22c 11275 error (_("Failed to determine last chain length\n"));
d3a44ec6 11276 goto no_gnu_hash;
6bd1a22c 11277 }
252b5132 11278
6bd1a22c 11279 if (maxchain + 1 == 0)
d3a44ec6 11280 goto no_gnu_hash;
252b5132 11281
6bd1a22c
L
11282 ++maxchain;
11283 }
11284 while ((byte_get (nb, 4) & 1) == 0);
76da6bbe 11285
6bd1a22c
L
11286 if (fseek (file,
11287 (archive_file_offset
11288 + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
11289 SEEK_SET))
11290 {
11291 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 11292 goto no_gnu_hash;
6bd1a22c
L
11293 }
11294
11295 gnuchains = get_dynamic_data (file, maxchain, 4);
071436c6 11296 ngnuchains = maxchain;
6bd1a22c 11297
d3a44ec6 11298 no_gnu_hash:
6bd1a22c 11299 if (gnuchains == NULL)
d3a44ec6
JJ
11300 {
11301 free (gnubuckets);
d3a44ec6
JJ
11302 gnubuckets = NULL;
11303 ngnubuckets = 0;
f64fddf1 11304 if (do_using_dynamic)
32ec8896 11305 return FALSE;
d3a44ec6 11306 }
6bd1a22c
L
11307 }
11308
11309 if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
11310 && do_syms
11311 && do_using_dynamic
3102e897
NC
11312 && dynamic_strings != NULL
11313 && dynamic_symbols != NULL)
6bd1a22c
L
11314 {
11315 unsigned long hn;
11316
11317 if (dynamic_info[DT_HASH])
11318 {
11319 bfd_vma si;
11320
11321 printf (_("\nSymbol table for image:\n"));
11322 if (is_32bit_elf)
11323 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11324 else
11325 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11326
11327 for (hn = 0; hn < nbuckets; hn++)
11328 {
11329 if (! buckets[hn])
11330 continue;
11331
11332 for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
11333 print_dynamic_symbol (si, hn);
252b5132
RH
11334 }
11335 }
6bd1a22c
L
11336
11337 if (dynamic_info_DT_GNU_HASH)
11338 {
11339 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
11340 if (is_32bit_elf)
11341 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11342 else
11343 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11344
11345 for (hn = 0; hn < ngnubuckets; ++hn)
11346 if (gnubuckets[hn] != 0)
11347 {
11348 bfd_vma si = gnubuckets[hn];
11349 bfd_vma off = si - gnusymidx;
11350
11351 do
11352 {
11353 print_dynamic_symbol (si, hn);
11354 si++;
11355 }
071436c6 11356 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
6bd1a22c
L
11357 }
11358 }
252b5132 11359 }
8b73c356
NC
11360 else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
11361 && section_headers != NULL)
252b5132 11362 {
b34976b6 11363 unsigned int i;
252b5132
RH
11364
11365 for (i = 0, section = section_headers;
11366 i < elf_header.e_shnum;
11367 i++, section++)
11368 {
b34976b6 11369 unsigned int si;
2cf0635d 11370 char * strtab = NULL;
c256ffe7 11371 unsigned long int strtab_size = 0;
2cf0635d
NC
11372 Elf_Internal_Sym * symtab;
11373 Elf_Internal_Sym * psym;
ba5cdace 11374 unsigned long num_syms;
252b5132 11375
2c610e4b
L
11376 if ((section->sh_type != SHT_SYMTAB
11377 && section->sh_type != SHT_DYNSYM)
11378 || (!do_syms
11379 && section->sh_type == SHT_SYMTAB))
252b5132
RH
11380 continue;
11381
dd24e3da
NC
11382 if (section->sh_entsize == 0)
11383 {
11384 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
74e1a04b 11385 printable_section_name (section));
dd24e3da
NC
11386 continue;
11387 }
11388
252b5132 11389 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
74e1a04b 11390 printable_section_name (section),
252b5132 11391 (unsigned long) (section->sh_size / section->sh_entsize));
dd24e3da 11392
f7a99963 11393 if (is_32bit_elf)
ca47b30c 11394 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
f7a99963 11395 else
ca47b30c 11396 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
252b5132 11397
ba5cdace 11398 symtab = GET_ELF_SYMBOLS (file, section, & num_syms);
252b5132
RH
11399 if (symtab == NULL)
11400 continue;
11401
11402 if (section->sh_link == elf_header.e_shstrndx)
c256ffe7
JJ
11403 {
11404 strtab = string_table;
11405 strtab_size = string_table_length;
11406 }
4fbb74a6 11407 else if (section->sh_link < elf_header.e_shnum)
252b5132 11408 {
2cf0635d 11409 Elf_Internal_Shdr * string_sec;
252b5132 11410
4fbb74a6 11411 string_sec = section_headers + section->sh_link;
252b5132 11412
3f5e193b
NC
11413 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
11414 1, string_sec->sh_size,
11415 _("string table"));
c256ffe7 11416 strtab_size = strtab != NULL ? string_sec->sh_size : 0;
252b5132
RH
11417 }
11418
ba5cdace 11419 for (si = 0, psym = symtab; si < num_syms; si++, psym++)
252b5132 11420 {
bb4d2ac2
L
11421 const char *version_string;
11422 enum versioned_symbol_info sym_info;
11423 unsigned short vna_other;
11424
5e220199 11425 printf ("%6d: ", si);
f7a99963
NC
11426 print_vma (psym->st_value, LONG_HEX);
11427 putchar (' ');
11428 print_vma (psym->st_size, DEC_5);
d1133906
NC
11429 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
11430 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
fd85a6a1
NC
11431 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11432 printf (" %-7s", get_solaris_symbol_visibility (psym->st_other));
11433 else
11434 {
11435 unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11436
11437 printf (" %-7s", get_symbol_visibility (vis));
11438 /* Check to see if any other bits in the st_other field are set.
11439 Note - displaying this information disrupts the layout of the
11440 table being generated, but for the moment this case is very rare. */
11441 if (psym->st_other ^ vis)
11442 printf (" [%s] ", get_symbol_other (psym->st_other ^ vis));
11443 }
31104126 11444 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
c256ffe7 11445 print_symbol (25, psym->st_name < strtab_size
2b692964 11446 ? strtab + psym->st_name : _("<corrupt>"));
252b5132 11447
bb4d2ac2
L
11448 version_string
11449 = get_symbol_version_string (file,
11450 section->sh_type == SHT_DYNSYM,
11451 strtab, strtab_size, si,
11452 psym, &sym_info, &vna_other);
11453 if (version_string)
252b5132 11454 {
bb4d2ac2
L
11455 if (sym_info == symbol_undefined)
11456 printf ("@%s (%d)", version_string, vna_other);
11457 else
11458 printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
11459 version_string);
252b5132
RH
11460 }
11461
11462 putchar ('\n');
52c3c391
NC
11463
11464 if (ELF_ST_BIND (psym->st_info) == STB_LOCAL
dd905818
NC
11465 && si >= section->sh_info
11466 /* Irix 5 and 6 MIPS binaries are known to ignore this requirement. */
11467 && elf_header.e_machine != EM_MIPS
11468 /* Solaris binaries have been found to violate this requirement as
11469 well. Not sure if this is a bug or an ABI requirement. */
11470 && elf_header.e_ident[EI_OSABI] != ELFOSABI_SOLARIS)
52c3c391
NC
11471 warn (_("local symbol %u found at index >= %s's sh_info value of %u\n"),
11472 si, printable_section_name (section), section->sh_info);
252b5132
RH
11473 }
11474
11475 free (symtab);
11476 if (strtab != string_table)
11477 free (strtab);
11478 }
11479 }
11480 else if (do_syms)
11481 printf
11482 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
11483
11484 if (do_histogram && buckets != NULL)
11485 {
2cf0635d
NC
11486 unsigned long * lengths;
11487 unsigned long * counts;
66543521
AM
11488 unsigned long hn;
11489 bfd_vma si;
11490 unsigned long maxlength = 0;
11491 unsigned long nzero_counts = 0;
11492 unsigned long nsyms = 0;
94d15024 11493 unsigned long chained;
252b5132 11494
66543521
AM
11495 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
11496 (unsigned long) nbuckets);
252b5132 11497
3f5e193b 11498 lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
252b5132
RH
11499 if (lengths == NULL)
11500 {
8b73c356 11501 error (_("Out of memory allocating space for histogram buckets\n"));
32ec8896 11502 return FALSE;
252b5132 11503 }
8b73c356
NC
11504
11505 printf (_(" Length Number %% of total Coverage\n"));
252b5132
RH
11506 for (hn = 0; hn < nbuckets; ++hn)
11507 {
94d15024
MF
11508 for (si = buckets[hn], chained = 0;
11509 si > 0 && si < nchains && si < nbuckets && chained <= nchains;
11510 si = chains[si], ++chained)
252b5132 11511 {
b34976b6 11512 ++nsyms;
252b5132 11513 if (maxlength < ++lengths[hn])
b34976b6 11514 ++maxlength;
252b5132 11515 }
94d15024
MF
11516
11517 /* PR binutils/17531: A corrupt binary could contain broken
11518 histogram data. Do not go into an infinite loop trying
11519 to process it. */
11520 if (chained > nchains)
11521 {
11522 error (_("histogram chain is corrupt\n"));
11523 break;
11524 }
252b5132
RH
11525 }
11526
3f5e193b 11527 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
252b5132
RH
11528 if (counts == NULL)
11529 {
b2e951ec 11530 free (lengths);
8b73c356 11531 error (_("Out of memory allocating space for histogram counts\n"));
32ec8896 11532 return FALSE;
252b5132
RH
11533 }
11534
11535 for (hn = 0; hn < nbuckets; ++hn)
b34976b6 11536 ++counts[lengths[hn]];
252b5132 11537
103f02d3 11538 if (nbuckets > 0)
252b5132 11539 {
66543521
AM
11540 unsigned long i;
11541 printf (" 0 %-10lu (%5.1f%%)\n",
103f02d3 11542 counts[0], (counts[0] * 100.0) / nbuckets);
66543521 11543 for (i = 1; i <= maxlength; ++i)
103f02d3 11544 {
66543521
AM
11545 nzero_counts += counts[i] * i;
11546 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11547 i, counts[i], (counts[i] * 100.0) / nbuckets,
103f02d3
UD
11548 (nzero_counts * 100.0) / nsyms);
11549 }
252b5132
RH
11550 }
11551
11552 free (counts);
11553 free (lengths);
11554 }
11555
11556 if (buckets != NULL)
11557 {
11558 free (buckets);
11559 free (chains);
11560 }
11561
d3a44ec6 11562 if (do_histogram && gnubuckets != NULL)
fdc90cb4 11563 {
2cf0635d
NC
11564 unsigned long * lengths;
11565 unsigned long * counts;
fdc90cb4
JJ
11566 unsigned long hn;
11567 unsigned long maxlength = 0;
11568 unsigned long nzero_counts = 0;
11569 unsigned long nsyms = 0;
fdc90cb4 11570
8b73c356
NC
11571 printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
11572 (unsigned long) ngnubuckets);
11573
3f5e193b 11574 lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
fdc90cb4
JJ
11575 if (lengths == NULL)
11576 {
8b73c356 11577 error (_("Out of memory allocating space for gnu histogram buckets\n"));
32ec8896 11578 return FALSE;
fdc90cb4
JJ
11579 }
11580
fdc90cb4
JJ
11581 printf (_(" Length Number %% of total Coverage\n"));
11582
11583 for (hn = 0; hn < ngnubuckets; ++hn)
11584 if (gnubuckets[hn] != 0)
11585 {
11586 bfd_vma off, length = 1;
11587
6bd1a22c 11588 for (off = gnubuckets[hn] - gnusymidx;
071436c6
NC
11589 /* PR 17531 file: 010-77222-0.004. */
11590 off < ngnuchains && (gnuchains[off] & 1) == 0;
11591 ++off)
fdc90cb4
JJ
11592 ++length;
11593 lengths[hn] = length;
11594 if (length > maxlength)
11595 maxlength = length;
11596 nsyms += length;
11597 }
11598
3f5e193b 11599 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
fdc90cb4
JJ
11600 if (counts == NULL)
11601 {
b2e951ec 11602 free (lengths);
8b73c356 11603 error (_("Out of memory allocating space for gnu histogram counts\n"));
32ec8896 11604 return FALSE;
fdc90cb4
JJ
11605 }
11606
11607 for (hn = 0; hn < ngnubuckets; ++hn)
11608 ++counts[lengths[hn]];
11609
11610 if (ngnubuckets > 0)
11611 {
11612 unsigned long j;
11613 printf (" 0 %-10lu (%5.1f%%)\n",
11614 counts[0], (counts[0] * 100.0) / ngnubuckets);
11615 for (j = 1; j <= maxlength; ++j)
11616 {
11617 nzero_counts += counts[j] * j;
11618 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11619 j, counts[j], (counts[j] * 100.0) / ngnubuckets,
11620 (nzero_counts * 100.0) / nsyms);
11621 }
11622 }
11623
11624 free (counts);
11625 free (lengths);
11626 free (gnubuckets);
11627 free (gnuchains);
11628 }
11629
32ec8896 11630 return TRUE;
252b5132
RH
11631}
11632
32ec8896 11633static bfd_boolean
2cf0635d 11634process_syminfo (FILE * file ATTRIBUTE_UNUSED)
252b5132 11635{
b4c96d0d 11636 unsigned int i;
252b5132
RH
11637
11638 if (dynamic_syminfo == NULL
11639 || !do_dynamic)
11640 /* No syminfo, this is ok. */
32ec8896 11641 return TRUE;
252b5132
RH
11642
11643 /* There better should be a dynamic symbol section. */
11644 if (dynamic_symbols == NULL || dynamic_strings == NULL)
32ec8896 11645 return FALSE;
252b5132
RH
11646
11647 if (dynamic_addr)
11648 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
11649 dynamic_syminfo_offset, dynamic_syminfo_nent);
11650
11651 printf (_(" Num: Name BoundTo Flags\n"));
11652 for (i = 0; i < dynamic_syminfo_nent; ++i)
11653 {
11654 unsigned short int flags = dynamic_syminfo[i].si_flags;
11655
31104126 11656 printf ("%4d: ", i);
4082ef84
NC
11657 if (i >= num_dynamic_syms)
11658 printf (_("<corrupt index>"));
11659 else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
d79b3d50
NC
11660 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
11661 else
2b692964 11662 printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
31104126 11663 putchar (' ');
252b5132
RH
11664
11665 switch (dynamic_syminfo[i].si_boundto)
11666 {
11667 case SYMINFO_BT_SELF:
11668 fputs ("SELF ", stdout);
11669 break;
11670 case SYMINFO_BT_PARENT:
11671 fputs ("PARENT ", stdout);
11672 break;
11673 default:
11674 if (dynamic_syminfo[i].si_boundto > 0
d79b3d50
NC
11675 && dynamic_syminfo[i].si_boundto < dynamic_nent
11676 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
31104126 11677 {
d79b3d50 11678 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
31104126
NC
11679 putchar (' ' );
11680 }
252b5132
RH
11681 else
11682 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
11683 break;
11684 }
11685
11686 if (flags & SYMINFO_FLG_DIRECT)
11687 printf (" DIRECT");
11688 if (flags & SYMINFO_FLG_PASSTHRU)
11689 printf (" PASSTHRU");
11690 if (flags & SYMINFO_FLG_COPY)
11691 printf (" COPY");
11692 if (flags & SYMINFO_FLG_LAZYLOAD)
11693 printf (" LAZYLOAD");
11694
11695 puts ("");
11696 }
11697
32ec8896 11698 return TRUE;
252b5132
RH
11699}
11700
b32e566b
NC
11701#define IN_RANGE(START,END,ADDR,OFF) \
11702 (((ADDR) >= (START)) && ((ADDR) + (OFF) < (END)))
11703
cf13d699
NC
11704/* Check to see if the given reloc needs to be handled in a target specific
11705 manner. If so then process the reloc and return TRUE otherwise return
f84ce13b
NC
11706 FALSE.
11707
11708 If called with reloc == NULL, then this is a signal that reloc processing
11709 for the current section has finished, and any saved state should be
11710 discarded. */
09c11c86 11711
cf13d699
NC
11712static bfd_boolean
11713target_specific_reloc_handling (Elf_Internal_Rela * reloc,
11714 unsigned char * start,
03f7786e 11715 unsigned char * end,
f84ce13b
NC
11716 Elf_Internal_Sym * symtab,
11717 unsigned long num_syms)
252b5132 11718{
f84ce13b
NC
11719 unsigned int reloc_type = 0;
11720 unsigned long sym_index = 0;
11721
11722 if (reloc)
11723 {
11724 reloc_type = get_reloc_type (reloc->r_info);
11725 sym_index = get_reloc_symindex (reloc->r_info);
11726 }
252b5132 11727
cf13d699 11728 switch (elf_header.e_machine)
252b5132 11729 {
13761a11
NC
11730 case EM_MSP430:
11731 case EM_MSP430_OLD:
11732 {
11733 static Elf_Internal_Sym * saved_sym = NULL;
11734
f84ce13b
NC
11735 if (reloc == NULL)
11736 {
11737 saved_sym = NULL;
11738 return TRUE;
11739 }
11740
13761a11
NC
11741 switch (reloc_type)
11742 {
11743 case 10: /* R_MSP430_SYM_DIFF */
11744 if (uses_msp430x_relocs ())
11745 break;
1a0670f3 11746 /* Fall through. */
13761a11 11747 case 21: /* R_MSP430X_SYM_DIFF */
f84ce13b
NC
11748 /* PR 21139. */
11749 if (sym_index >= num_syms)
11750 error (_("MSP430 SYM_DIFF reloc contains invalid symbol index %lu\n"),
11751 sym_index);
11752 else
11753 saved_sym = symtab + sym_index;
13761a11
NC
11754 return TRUE;
11755
11756 case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
11757 case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
11758 goto handle_sym_diff;
0b4362b0 11759
13761a11
NC
11760 case 5: /* R_MSP430_16_BYTE */
11761 case 9: /* R_MSP430_8 */
11762 if (uses_msp430x_relocs ())
11763 break;
11764 goto handle_sym_diff;
11765
11766 case 2: /* R_MSP430_ABS16 */
11767 case 15: /* R_MSP430X_ABS16 */
11768 if (! uses_msp430x_relocs ())
11769 break;
11770 goto handle_sym_diff;
0b4362b0 11771
13761a11
NC
11772 handle_sym_diff:
11773 if (saved_sym != NULL)
11774 {
03f7786e 11775 int reloc_size = reloc_type == 1 ? 4 : 2;
13761a11
NC
11776 bfd_vma value;
11777
f84ce13b
NC
11778 if (sym_index >= num_syms)
11779 error (_("MSP430 reloc contains invalid symbol index %lu\n"),
11780 sym_index);
03f7786e 11781 else
f84ce13b
NC
11782 {
11783 value = reloc->r_addend + (symtab[sym_index].st_value
11784 - saved_sym->st_value);
11785
b32e566b 11786 if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
f84ce13b 11787 byte_put (start + reloc->r_offset, value, reloc_size);
b32e566b
NC
11788 else
11789 /* PR 21137 */
11790 error (_("MSP430 sym diff reloc contains invalid offset: 0x%lx\n"),
11791 (long) reloc->r_offset);
f84ce13b 11792 }
13761a11
NC
11793
11794 saved_sym = NULL;
11795 return TRUE;
11796 }
11797 break;
11798
11799 default:
11800 if (saved_sym != NULL)
071436c6 11801 error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
13761a11
NC
11802 break;
11803 }
11804 break;
11805 }
11806
cf13d699
NC
11807 case EM_MN10300:
11808 case EM_CYGNUS_MN10300:
11809 {
11810 static Elf_Internal_Sym * saved_sym = NULL;
252b5132 11811
f84ce13b
NC
11812 if (reloc == NULL)
11813 {
11814 saved_sym = NULL;
11815 return TRUE;
11816 }
11817
cf13d699
NC
11818 switch (reloc_type)
11819 {
11820 case 34: /* R_MN10300_ALIGN */
11821 return TRUE;
11822 case 33: /* R_MN10300_SYM_DIFF */
f84ce13b
NC
11823 if (sym_index >= num_syms)
11824 error (_("MN10300_SYM_DIFF reloc contains invalid symbol index %lu\n"),
11825 sym_index);
11826 else
11827 saved_sym = symtab + sym_index;
cf13d699 11828 return TRUE;
f84ce13b 11829
cf13d699
NC
11830 case 1: /* R_MN10300_32 */
11831 case 2: /* R_MN10300_16 */
11832 if (saved_sym != NULL)
11833 {
03f7786e 11834 int reloc_size = reloc_type == 1 ? 4 : 2;
cf13d699 11835 bfd_vma value;
252b5132 11836
f84ce13b
NC
11837 if (sym_index >= num_syms)
11838 error (_("MN10300 reloc contains invalid symbol index %lu\n"),
11839 sym_index);
03f7786e 11840 else
f84ce13b
NC
11841 {
11842 value = reloc->r_addend + (symtab[sym_index].st_value
11843 - saved_sym->st_value);
11844
b32e566b 11845 if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
f84ce13b 11846 byte_put (start + reloc->r_offset, value, reloc_size);
b32e566b
NC
11847 else
11848 error (_("MN10300 sym diff reloc contains invalid offset: 0x%lx\n"),
11849 (long) reloc->r_offset);
f84ce13b 11850 }
252b5132 11851
cf13d699
NC
11852 saved_sym = NULL;
11853 return TRUE;
11854 }
11855 break;
11856 default:
11857 if (saved_sym != NULL)
071436c6 11858 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
cf13d699
NC
11859 break;
11860 }
11861 break;
11862 }
6ff71e76
NC
11863
11864 case EM_RL78:
11865 {
11866 static bfd_vma saved_sym1 = 0;
11867 static bfd_vma saved_sym2 = 0;
11868 static bfd_vma value;
11869
f84ce13b
NC
11870 if (reloc == NULL)
11871 {
11872 saved_sym1 = saved_sym2 = 0;
11873 return TRUE;
11874 }
11875
6ff71e76
NC
11876 switch (reloc_type)
11877 {
11878 case 0x80: /* R_RL78_SYM. */
11879 saved_sym1 = saved_sym2;
f84ce13b
NC
11880 if (sym_index >= num_syms)
11881 error (_("RL78_SYM reloc contains invalid symbol index %lu\n"),
11882 sym_index);
11883 else
11884 {
11885 saved_sym2 = symtab[sym_index].st_value;
11886 saved_sym2 += reloc->r_addend;
11887 }
6ff71e76
NC
11888 return TRUE;
11889
11890 case 0x83: /* R_RL78_OPsub. */
11891 value = saved_sym1 - saved_sym2;
11892 saved_sym2 = saved_sym1 = 0;
11893 return TRUE;
11894 break;
11895
11896 case 0x41: /* R_RL78_ABS32. */
b32e566b 11897 if (IN_RANGE (start, end, start + reloc->r_offset, 4))
03f7786e 11898 byte_put (start + reloc->r_offset, value, 4);
b32e566b
NC
11899 else
11900 error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
11901 (long) reloc->r_offset);
6ff71e76
NC
11902 value = 0;
11903 return TRUE;
11904
11905 case 0x43: /* R_RL78_ABS16. */
b32e566b 11906 if (IN_RANGE (start, end, start + reloc->r_offset, 2))
03f7786e 11907 byte_put (start + reloc->r_offset, value, 2);
b32e566b
NC
11908 else
11909 error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
11910 (long) reloc->r_offset);
6ff71e76
NC
11911 value = 0;
11912 return TRUE;
11913
11914 default:
11915 break;
11916 }
11917 break;
11918 }
252b5132
RH
11919 }
11920
cf13d699 11921 return FALSE;
252b5132
RH
11922}
11923
aca88567
NC
11924/* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
11925 DWARF debug sections. This is a target specific test. Note - we do not
11926 go through the whole including-target-headers-multiple-times route, (as
11927 we have already done with <elf/h8.h>) because this would become very
11928 messy and even then this function would have to contain target specific
11929 information (the names of the relocs instead of their numeric values).
11930 FIXME: This is not the correct way to solve this problem. The proper way
11931 is to have target specific reloc sizing and typing functions created by
11932 the reloc-macros.h header, in the same way that it already creates the
11933 reloc naming functions. */
11934
11935static bfd_boolean
11936is_32bit_abs_reloc (unsigned int reloc_type)
11937{
d347c9df 11938 /* Please keep this table alpha-sorted for ease of visual lookup. */
aca88567
NC
11939 switch (elf_header.e_machine)
11940 {
41e92641 11941 case EM_386:
22abe556 11942 case EM_IAMCU:
41e92641 11943 return reloc_type == 1; /* R_386_32. */
aca88567
NC
11944 case EM_68K:
11945 return reloc_type == 1; /* R_68K_32. */
11946 case EM_860:
11947 return reloc_type == 1; /* R_860_32. */
137b6b5f
AM
11948 case EM_960:
11949 return reloc_type == 2; /* R_960_32. */
a06ea964 11950 case EM_AARCH64:
9282b95a
JW
11951 return (reloc_type == 258
11952 || reloc_type == 1); /* R_AARCH64_ABS32 || R_AARCH64_P32_ABS32 */
d347c9df
PS
11953 case EM_ADAPTEVA_EPIPHANY:
11954 return reloc_type == 3;
aca88567 11955 case EM_ALPHA:
137b6b5f 11956 return reloc_type == 1; /* R_ALPHA_REFLONG. */
41e92641
NC
11957 case EM_ARC:
11958 return reloc_type == 1; /* R_ARC_32. */
886a2506
NC
11959 case EM_ARC_COMPACT:
11960 case EM_ARC_COMPACT2:
11961 return reloc_type == 4; /* R_ARC_32. */
41e92641
NC
11962 case EM_ARM:
11963 return reloc_type == 2; /* R_ARM_ABS32 */
cb8f3167 11964 case EM_AVR_OLD:
aca88567
NC
11965 case EM_AVR:
11966 return reloc_type == 1;
11967 case EM_BLACKFIN:
11968 return reloc_type == 0x12; /* R_byte4_data. */
11969 case EM_CRIS:
11970 return reloc_type == 3; /* R_CRIS_32. */
11971 case EM_CR16:
11972 return reloc_type == 3; /* R_CR16_NUM32. */
11973 case EM_CRX:
11974 return reloc_type == 15; /* R_CRX_NUM32. */
11975 case EM_CYGNUS_FRV:
11976 return reloc_type == 1;
41e92641
NC
11977 case EM_CYGNUS_D10V:
11978 case EM_D10V:
11979 return reloc_type == 6; /* R_D10V_32. */
aca88567
NC
11980 case EM_CYGNUS_D30V:
11981 case EM_D30V:
11982 return reloc_type == 12; /* R_D30V_32_NORMAL. */
41e92641
NC
11983 case EM_DLX:
11984 return reloc_type == 3; /* R_DLX_RELOC_32. */
aca88567
NC
11985 case EM_CYGNUS_FR30:
11986 case EM_FR30:
11987 return reloc_type == 3; /* R_FR30_32. */
3f8107ab
AM
11988 case EM_FT32:
11989 return reloc_type == 1; /* R_FT32_32. */
aca88567
NC
11990 case EM_H8S:
11991 case EM_H8_300:
11992 case EM_H8_300H:
11993 return reloc_type == 1; /* R_H8_DIR32. */
3730236a 11994 case EM_IA_64:
d1c4b12b
NC
11995 return reloc_type == 0x65 /* R_IA64_SECREL32LSB. */
11996 || reloc_type == 0x25; /* R_IA64_DIR32LSB. */
aca88567
NC
11997 case EM_IP2K_OLD:
11998 case EM_IP2K:
11999 return reloc_type == 2; /* R_IP2K_32. */
12000 case EM_IQ2000:
12001 return reloc_type == 2; /* R_IQ2000_32. */
84e94c90
NC
12002 case EM_LATTICEMICO32:
12003 return reloc_type == 3; /* R_LM32_32. */
ff7eeb89 12004 case EM_M32C_OLD:
aca88567
NC
12005 case EM_M32C:
12006 return reloc_type == 3; /* R_M32C_32. */
12007 case EM_M32R:
12008 return reloc_type == 34; /* R_M32R_32_RELA. */
adec12c1
AM
12009 case EM_68HC11:
12010 case EM_68HC12:
12011 return reloc_type == 6; /* R_M68HC11_32. */
aca88567
NC
12012 case EM_MCORE:
12013 return reloc_type == 1; /* R_MCORE_ADDR32. */
12014 case EM_CYGNUS_MEP:
12015 return reloc_type == 4; /* R_MEP_32. */
a3c62988
NC
12016 case EM_METAG:
12017 return reloc_type == 2; /* R_METAG_ADDR32. */
137b6b5f
AM
12018 case EM_MICROBLAZE:
12019 return reloc_type == 1; /* R_MICROBLAZE_32. */
aca88567
NC
12020 case EM_MIPS:
12021 return reloc_type == 2; /* R_MIPS_32. */
12022 case EM_MMIX:
12023 return reloc_type == 4; /* R_MMIX_32. */
12024 case EM_CYGNUS_MN10200:
12025 case EM_MN10200:
12026 return reloc_type == 1; /* R_MN10200_32. */
12027 case EM_CYGNUS_MN10300:
12028 case EM_MN10300:
12029 return reloc_type == 1; /* R_MN10300_32. */
5506d11a
AM
12030 case EM_MOXIE:
12031 return reloc_type == 1; /* R_MOXIE_32. */
aca88567
NC
12032 case EM_MSP430_OLD:
12033 case EM_MSP430:
13761a11 12034 return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32. */
aca88567
NC
12035 case EM_MT:
12036 return reloc_type == 2; /* R_MT_32. */
35c08157
KLC
12037 case EM_NDS32:
12038 return reloc_type == 20; /* R_NDS32_RELA. */
3e0873ac 12039 case EM_ALTERA_NIOS2:
36591ba1 12040 return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32. */
3e0873ac
NC
12041 case EM_NIOS32:
12042 return reloc_type == 1; /* R_NIOS_32. */
73589c9d
CS
12043 case EM_OR1K:
12044 return reloc_type == 1; /* R_OR1K_32. */
aca88567 12045 case EM_PARISC:
5fda8eca
NC
12046 return (reloc_type == 1 /* R_PARISC_DIR32. */
12047 || reloc_type == 41); /* R_PARISC_SECREL32. */
aca88567
NC
12048 case EM_PJ:
12049 case EM_PJ_OLD:
12050 return reloc_type == 1; /* R_PJ_DATA_DIR32. */
12051 case EM_PPC64:
12052 return reloc_type == 1; /* R_PPC64_ADDR32. */
12053 case EM_PPC:
12054 return reloc_type == 1; /* R_PPC_ADDR32. */
2b100bb5
DD
12055 case EM_TI_PRU:
12056 return reloc_type == 11; /* R_PRU_BFD_RELOC_32. */
e23eba97
NC
12057 case EM_RISCV:
12058 return reloc_type == 1; /* R_RISCV_32. */
99c513f6
DD
12059 case EM_RL78:
12060 return reloc_type == 1; /* R_RL78_DIR32. */
c7927a3c
NC
12061 case EM_RX:
12062 return reloc_type == 1; /* R_RX_DIR32. */
aca88567
NC
12063 case EM_S370:
12064 return reloc_type == 1; /* R_I370_ADDR31. */
12065 case EM_S390_OLD:
12066 case EM_S390:
12067 return reloc_type == 4; /* R_S390_32. */
41e92641
NC
12068 case EM_SCORE:
12069 return reloc_type == 8; /* R_SCORE_ABS32. */
aca88567
NC
12070 case EM_SH:
12071 return reloc_type == 1; /* R_SH_DIR32. */
12072 case EM_SPARC32PLUS:
12073 case EM_SPARCV9:
12074 case EM_SPARC:
12075 return reloc_type == 3 /* R_SPARC_32. */
12076 || reloc_type == 23; /* R_SPARC_UA32. */
a7dd7d05
AM
12077 case EM_SPU:
12078 return reloc_type == 6; /* R_SPU_ADDR32 */
40b36596
JM
12079 case EM_TI_C6000:
12080 return reloc_type == 1; /* R_C6000_ABS32. */
aa137e4d
NC
12081 case EM_TILEGX:
12082 return reloc_type == 2; /* R_TILEGX_32. */
12083 case EM_TILEPRO:
12084 return reloc_type == 1; /* R_TILEPRO_32. */
aca88567
NC
12085 case EM_CYGNUS_V850:
12086 case EM_V850:
12087 return reloc_type == 6; /* R_V850_ABS32. */
708e2187
NC
12088 case EM_V800:
12089 return reloc_type == 0x33; /* R_V810_WORD. */
aca88567
NC
12090 case EM_VAX:
12091 return reloc_type == 1; /* R_VAX_32. */
619ed720
EB
12092 case EM_VISIUM:
12093 return reloc_type == 3; /* R_VISIUM_32. */
aca88567 12094 case EM_X86_64:
8a9036a4 12095 case EM_L1OM:
7a9068fe 12096 case EM_K1OM:
aca88567 12097 return reloc_type == 10; /* R_X86_64_32. */
c29aca4a
NC
12098 case EM_XC16X:
12099 case EM_C166:
12100 return reloc_type == 3; /* R_XC16C_ABS_32. */
f6c1a2d5
NC
12101 case EM_XGATE:
12102 return reloc_type == 4; /* R_XGATE_32. */
aca88567
NC
12103 case EM_XSTORMY16:
12104 return reloc_type == 1; /* R_XSTROMY16_32. */
12105 case EM_XTENSA_OLD:
12106 case EM_XTENSA:
12107 return reloc_type == 1; /* R_XTENSA_32. */
aca88567 12108 default:
bee0ee85
NC
12109 {
12110 static unsigned int prev_warn = 0;
12111
12112 /* Avoid repeating the same warning multiple times. */
12113 if (prev_warn != elf_header.e_machine)
12114 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
12115 elf_header.e_machine);
12116 prev_warn = elf_header.e_machine;
12117 return FALSE;
12118 }
aca88567
NC
12119 }
12120}
12121
12122/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12123 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
12124
12125static bfd_boolean
12126is_32bit_pcrel_reloc (unsigned int reloc_type)
12127{
12128 switch (elf_header.e_machine)
d347c9df 12129 /* Please keep this table alpha-sorted for ease of visual lookup. */
aca88567 12130 {
41e92641 12131 case EM_386:
22abe556 12132 case EM_IAMCU:
3e0873ac 12133 return reloc_type == 2; /* R_386_PC32. */
aca88567 12134 case EM_68K:
3e0873ac 12135 return reloc_type == 4; /* R_68K_PC32. */
a06ea964
NC
12136 case EM_AARCH64:
12137 return reloc_type == 261; /* R_AARCH64_PREL32 */
cfb8c092
NC
12138 case EM_ADAPTEVA_EPIPHANY:
12139 return reloc_type == 6;
aca88567
NC
12140 case EM_ALPHA:
12141 return reloc_type == 10; /* R_ALPHA_SREL32. */
726c18e1
CZ
12142 case EM_ARC_COMPACT:
12143 case EM_ARC_COMPACT2:
12144 return reloc_type == 49; /* R_ARC_32_PCREL. */
41e92641 12145 case EM_ARM:
3e0873ac 12146 return reloc_type == 3; /* R_ARM_REL32 */
d347c9df
PS
12147 case EM_AVR_OLD:
12148 case EM_AVR:
12149 return reloc_type == 36; /* R_AVR_32_PCREL. */
137b6b5f
AM
12150 case EM_MICROBLAZE:
12151 return reloc_type == 2; /* R_MICROBLAZE_32_PCREL. */
73589c9d
CS
12152 case EM_OR1K:
12153 return reloc_type == 9; /* R_OR1K_32_PCREL. */
aca88567 12154 case EM_PARISC:
85acf597 12155 return reloc_type == 9; /* R_PARISC_PCREL32. */
aca88567
NC
12156 case EM_PPC:
12157 return reloc_type == 26; /* R_PPC_REL32. */
12158 case EM_PPC64:
3e0873ac 12159 return reloc_type == 26; /* R_PPC64_REL32. */
aca88567
NC
12160 case EM_S390_OLD:
12161 case EM_S390:
3e0873ac 12162 return reloc_type == 5; /* R_390_PC32. */
aca88567 12163 case EM_SH:
3e0873ac 12164 return reloc_type == 2; /* R_SH_REL32. */
aca88567
NC
12165 case EM_SPARC32PLUS:
12166 case EM_SPARCV9:
12167 case EM_SPARC:
3e0873ac 12168 return reloc_type == 6; /* R_SPARC_DISP32. */
a7dd7d05
AM
12169 case EM_SPU:
12170 return reloc_type == 13; /* R_SPU_REL32. */
aa137e4d
NC
12171 case EM_TILEGX:
12172 return reloc_type == 6; /* R_TILEGX_32_PCREL. */
12173 case EM_TILEPRO:
12174 return reloc_type == 4; /* R_TILEPRO_32_PCREL. */
619ed720
EB
12175 case EM_VISIUM:
12176 return reloc_type == 6; /* R_VISIUM_32_PCREL */
aca88567 12177 case EM_X86_64:
8a9036a4 12178 case EM_L1OM:
7a9068fe 12179 case EM_K1OM:
3e0873ac 12180 return reloc_type == 2; /* R_X86_64_PC32. */
2fcb9706
BW
12181 case EM_XTENSA_OLD:
12182 case EM_XTENSA:
12183 return reloc_type == 14; /* R_XTENSA_32_PCREL. */
aca88567
NC
12184 default:
12185 /* Do not abort or issue an error message here. Not all targets use
12186 pc-relative 32-bit relocs in their DWARF debug information and we
12187 have already tested for target coverage in is_32bit_abs_reloc. A
cf13d699
NC
12188 more helpful warning message will be generated by apply_relocations
12189 anyway, so just return. */
aca88567
NC
12190 return FALSE;
12191 }
12192}
12193
12194/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12195 a 64-bit absolute RELA relocation used in DWARF debug sections. */
12196
12197static bfd_boolean
12198is_64bit_abs_reloc (unsigned int reloc_type)
12199{
12200 switch (elf_header.e_machine)
12201 {
a06ea964
NC
12202 case EM_AARCH64:
12203 return reloc_type == 257; /* R_AARCH64_ABS64. */
aca88567
NC
12204 case EM_ALPHA:
12205 return reloc_type == 2; /* R_ALPHA_REFQUAD. */
3730236a
NC
12206 case EM_IA_64:
12207 return reloc_type == 0x27; /* R_IA64_DIR64LSB. */
3e0873ac
NC
12208 case EM_PARISC:
12209 return reloc_type == 80; /* R_PARISC_DIR64. */
aca88567
NC
12210 case EM_PPC64:
12211 return reloc_type == 38; /* R_PPC64_ADDR64. */
e23eba97
NC
12212 case EM_RISCV:
12213 return reloc_type == 2; /* R_RISCV_64. */
aca88567
NC
12214 case EM_SPARC32PLUS:
12215 case EM_SPARCV9:
12216 case EM_SPARC:
12217 return reloc_type == 54; /* R_SPARC_UA64. */
12218 case EM_X86_64:
8a9036a4 12219 case EM_L1OM:
7a9068fe 12220 case EM_K1OM:
aca88567 12221 return reloc_type == 1; /* R_X86_64_64. */
e819ade1
AS
12222 case EM_S390_OLD:
12223 case EM_S390:
aa137e4d
NC
12224 return reloc_type == 22; /* R_S390_64. */
12225 case EM_TILEGX:
12226 return reloc_type == 1; /* R_TILEGX_64. */
85a82265 12227 case EM_MIPS:
aa137e4d 12228 return reloc_type == 18; /* R_MIPS_64. */
aca88567
NC
12229 default:
12230 return FALSE;
12231 }
12232}
12233
85acf597
RH
12234/* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
12235 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
12236
12237static bfd_boolean
12238is_64bit_pcrel_reloc (unsigned int reloc_type)
12239{
12240 switch (elf_header.e_machine)
12241 {
a06ea964
NC
12242 case EM_AARCH64:
12243 return reloc_type == 260; /* R_AARCH64_PREL64. */
85acf597 12244 case EM_ALPHA:
aa137e4d 12245 return reloc_type == 11; /* R_ALPHA_SREL64. */
85acf597 12246 case EM_IA_64:
aa137e4d 12247 return reloc_type == 0x4f; /* R_IA64_PCREL64LSB. */
85acf597 12248 case EM_PARISC:
aa137e4d 12249 return reloc_type == 72; /* R_PARISC_PCREL64. */
85acf597 12250 case EM_PPC64:
aa137e4d 12251 return reloc_type == 44; /* R_PPC64_REL64. */
85acf597
RH
12252 case EM_SPARC32PLUS:
12253 case EM_SPARCV9:
12254 case EM_SPARC:
aa137e4d 12255 return reloc_type == 46; /* R_SPARC_DISP64. */
85acf597 12256 case EM_X86_64:
8a9036a4 12257 case EM_L1OM:
7a9068fe 12258 case EM_K1OM:
aa137e4d 12259 return reloc_type == 24; /* R_X86_64_PC64. */
85acf597
RH
12260 case EM_S390_OLD:
12261 case EM_S390:
aa137e4d
NC
12262 return reloc_type == 23; /* R_S390_PC64. */
12263 case EM_TILEGX:
12264 return reloc_type == 5; /* R_TILEGX_64_PCREL. */
85acf597
RH
12265 default:
12266 return FALSE;
12267 }
12268}
12269
4dc3c23d
AM
12270/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12271 a 24-bit absolute RELA relocation used in DWARF debug sections. */
12272
12273static bfd_boolean
12274is_24bit_abs_reloc (unsigned int reloc_type)
12275{
12276 switch (elf_header.e_machine)
12277 {
12278 case EM_CYGNUS_MN10200:
12279 case EM_MN10200:
12280 return reloc_type == 4; /* R_MN10200_24. */
3ee6e4fb
NC
12281 case EM_FT32:
12282 return reloc_type == 5; /* R_FT32_20. */
4dc3c23d
AM
12283 default:
12284 return FALSE;
12285 }
12286}
12287
aca88567
NC
12288/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12289 a 16-bit absolute RELA relocation used in DWARF debug sections. */
12290
12291static bfd_boolean
12292is_16bit_abs_reloc (unsigned int reloc_type)
4b78141a 12293{
d347c9df 12294 /* Please keep this table alpha-sorted for ease of visual lookup. */
4b78141a
NC
12295 switch (elf_header.e_machine)
12296 {
886a2506
NC
12297 case EM_ARC:
12298 case EM_ARC_COMPACT:
12299 case EM_ARC_COMPACT2:
12300 return reloc_type == 2; /* R_ARC_16. */
d347c9df
PS
12301 case EM_ADAPTEVA_EPIPHANY:
12302 return reloc_type == 5;
aca88567
NC
12303 case EM_AVR_OLD:
12304 case EM_AVR:
12305 return reloc_type == 4; /* R_AVR_16. */
41e92641
NC
12306 case EM_CYGNUS_D10V:
12307 case EM_D10V:
12308 return reloc_type == 3; /* R_D10V_16. */
4b78141a
NC
12309 case EM_H8S:
12310 case EM_H8_300:
12311 case EM_H8_300H:
aca88567
NC
12312 return reloc_type == R_H8_DIR16;
12313 case EM_IP2K_OLD:
12314 case EM_IP2K:
12315 return reloc_type == 1; /* R_IP2K_16. */
ff7eeb89 12316 case EM_M32C_OLD:
f4236fe4
DD
12317 case EM_M32C:
12318 return reloc_type == 1; /* R_M32C_16 */
d347c9df
PS
12319 case EM_CYGNUS_MN10200:
12320 case EM_MN10200:
12321 return reloc_type == 2; /* R_MN10200_16. */
12322 case EM_CYGNUS_MN10300:
12323 case EM_MN10300:
12324 return reloc_type == 2; /* R_MN10300_16. */
aca88567 12325 case EM_MSP430:
13761a11
NC
12326 if (uses_msp430x_relocs ())
12327 return reloc_type == 2; /* R_MSP430_ABS16. */
1a0670f3 12328 /* Fall through. */
78c8d46c 12329 case EM_MSP430_OLD:
aca88567 12330 return reloc_type == 5; /* R_MSP430_16_BYTE. */
35c08157
KLC
12331 case EM_NDS32:
12332 return reloc_type == 19; /* R_NDS32_RELA. */
3e0873ac 12333 case EM_ALTERA_NIOS2:
36591ba1 12334 return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16. */
3e0873ac
NC
12335 case EM_NIOS32:
12336 return reloc_type == 9; /* R_NIOS_16. */
73589c9d
CS
12337 case EM_OR1K:
12338 return reloc_type == 2; /* R_OR1K_16. */
2b100bb5
DD
12339 case EM_TI_PRU:
12340 return reloc_type == 8; /* R_PRU_BFD_RELOC_16. */
40b36596
JM
12341 case EM_TI_C6000:
12342 return reloc_type == 2; /* R_C6000_ABS16. */
d347c9df
PS
12343 case EM_VISIUM:
12344 return reloc_type == 2; /* R_VISIUM_16. */
c29aca4a
NC
12345 case EM_XC16X:
12346 case EM_C166:
12347 return reloc_type == 2; /* R_XC16C_ABS_16. */
f6c1a2d5
NC
12348 case EM_XGATE:
12349 return reloc_type == 3; /* R_XGATE_16. */
4b78141a 12350 default:
aca88567 12351 return FALSE;
4b78141a
NC
12352 }
12353}
12354
2a7b2e88
JK
12355/* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
12356 relocation entries (possibly formerly used for SHT_GROUP sections). */
12357
12358static bfd_boolean
12359is_none_reloc (unsigned int reloc_type)
12360{
12361 switch (elf_header.e_machine)
12362 {
cb8f3167 12363 case EM_386: /* R_386_NONE. */
d347c9df 12364 case EM_68K: /* R_68K_NONE. */
cfb8c092 12365 case EM_ADAPTEVA_EPIPHANY:
d347c9df
PS
12366 case EM_ALPHA: /* R_ALPHA_NONE. */
12367 case EM_ALTERA_NIOS2: /* R_NIOS2_NONE. */
886a2506 12368 case EM_ARC: /* R_ARC_NONE. */
886a2506 12369 case EM_ARC_COMPACT2: /* R_ARC_NONE. */
d347c9df 12370 case EM_ARC_COMPACT: /* R_ARC_NONE. */
cb8f3167 12371 case EM_ARM: /* R_ARM_NONE. */
d347c9df 12372 case EM_C166: /* R_XC16X_NONE. */
cb8f3167 12373 case EM_CRIS: /* R_CRIS_NONE. */
d347c9df
PS
12374 case EM_FT32: /* R_FT32_NONE. */
12375 case EM_IA_64: /* R_IA64_NONE. */
7a9068fe 12376 case EM_K1OM: /* R_X86_64_NONE. */
d347c9df
PS
12377 case EM_L1OM: /* R_X86_64_NONE. */
12378 case EM_M32R: /* R_M32R_NONE. */
12379 case EM_MIPS: /* R_MIPS_NONE. */
cb8f3167 12380 case EM_MN10300: /* R_MN10300_NONE. */
5506d11a 12381 case EM_MOXIE: /* R_MOXIE_NONE. */
d347c9df
PS
12382 case EM_NIOS32: /* R_NIOS_NONE. */
12383 case EM_OR1K: /* R_OR1K_NONE. */
12384 case EM_PARISC: /* R_PARISC_NONE. */
12385 case EM_PPC64: /* R_PPC64_NONE. */
12386 case EM_PPC: /* R_PPC_NONE. */
e23eba97 12387 case EM_RISCV: /* R_RISCV_NONE. */
d347c9df
PS
12388 case EM_S390: /* R_390_NONE. */
12389 case EM_S390_OLD:
12390 case EM_SH: /* R_SH_NONE. */
12391 case EM_SPARC32PLUS:
12392 case EM_SPARC: /* R_SPARC_NONE. */
12393 case EM_SPARCV9:
aa137e4d
NC
12394 case EM_TILEGX: /* R_TILEGX_NONE. */
12395 case EM_TILEPRO: /* R_TILEPRO_NONE. */
d347c9df
PS
12396 case EM_TI_C6000:/* R_C6000_NONE. */
12397 case EM_X86_64: /* R_X86_64_NONE. */
c29aca4a 12398 case EM_XC16X:
cb8f3167 12399 return reloc_type == 0;
d347c9df 12400
a06ea964
NC
12401 case EM_AARCH64:
12402 return reloc_type == 0 || reloc_type == 256;
d347c9df
PS
12403 case EM_AVR_OLD:
12404 case EM_AVR:
12405 return (reloc_type == 0 /* R_AVR_NONE. */
12406 || reloc_type == 30 /* R_AVR_DIFF8. */
12407 || reloc_type == 31 /* R_AVR_DIFF16. */
12408 || reloc_type == 32 /* R_AVR_DIFF32. */);
12409 case EM_METAG:
12410 return reloc_type == 3; /* R_METAG_NONE. */
35c08157
KLC
12411 case EM_NDS32:
12412 return (reloc_type == 0 /* R_XTENSA_NONE. */
12413 || reloc_type == 204 /* R_NDS32_DIFF8. */
12414 || reloc_type == 205 /* R_NDS32_DIFF16. */
12415 || reloc_type == 206 /* R_NDS32_DIFF32. */
12416 || reloc_type == 207 /* R_NDS32_ULEB128. */);
2b100bb5
DD
12417 case EM_TI_PRU:
12418 return (reloc_type == 0 /* R_PRU_NONE. */
12419 || reloc_type == 65 /* R_PRU_DIFF8. */
12420 || reloc_type == 66 /* R_PRU_DIFF16. */
12421 || reloc_type == 67 /* R_PRU_DIFF32. */);
58332dda
JK
12422 case EM_XTENSA_OLD:
12423 case EM_XTENSA:
4dc3c23d
AM
12424 return (reloc_type == 0 /* R_XTENSA_NONE. */
12425 || reloc_type == 17 /* R_XTENSA_DIFF8. */
12426 || reloc_type == 18 /* R_XTENSA_DIFF16. */
12427 || reloc_type == 19 /* R_XTENSA_DIFF32. */);
2a7b2e88
JK
12428 }
12429 return FALSE;
12430}
12431
d1c4b12b
NC
12432/* Returns TRUE if there is a relocation against
12433 section NAME at OFFSET bytes. */
12434
12435bfd_boolean
12436reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
12437{
12438 Elf_Internal_Rela * relocs;
12439 Elf_Internal_Rela * rp;
12440
12441 if (dsec == NULL || dsec->reloc_info == NULL)
12442 return FALSE;
12443
12444 relocs = (Elf_Internal_Rela *) dsec->reloc_info;
12445
12446 for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
12447 if (rp->r_offset == offset)
12448 return TRUE;
12449
12450 return FALSE;
12451}
12452
cf13d699 12453/* Apply relocations to a section.
32ec8896
NC
12454 Returns TRUE upon success, FALSE otherwise.
12455 If RELOCS_RETURN is non-NULL then it is set to point to the loaded relocs.
12456 It is then the caller's responsibility to free them. NUM_RELOCS_RETURN
12457 will be set to the number of relocs loaded.
12458
cf13d699 12459 Note: So far support has been added only for those relocations
32ec8896
NC
12460 which can be found in debug sections. FIXME: Add support for
12461 more relocations ? */
1b315056 12462
32ec8896 12463static bfd_boolean
d1c4b12b
NC
12464apply_relocations (void * file,
12465 const Elf_Internal_Shdr * section,
12466 unsigned char * start,
12467 bfd_size_type size,
1449284b 12468 void ** relocs_return,
d1c4b12b 12469 unsigned long * num_relocs_return)
1b315056 12470{
cf13d699 12471 Elf_Internal_Shdr * relsec;
0d2a7a93 12472 unsigned char * end = start + size;
32ec8896 12473 bfd_boolean res = TRUE;
cb8f3167 12474
d1c4b12b
NC
12475 if (relocs_return != NULL)
12476 {
12477 * (Elf_Internal_Rela **) relocs_return = NULL;
12478 * num_relocs_return = 0;
12479 }
12480
cf13d699 12481 if (elf_header.e_type != ET_REL)
32ec8896
NC
12482 /* No relocs to apply. */
12483 return TRUE;
1b315056 12484
cf13d699 12485 /* Find the reloc section associated with the section. */
5b18a4bc
NC
12486 for (relsec = section_headers;
12487 relsec < section_headers + elf_header.e_shnum;
12488 ++relsec)
252b5132 12489 {
41e92641
NC
12490 bfd_boolean is_rela;
12491 unsigned long num_relocs;
2cf0635d
NC
12492 Elf_Internal_Rela * relocs;
12493 Elf_Internal_Rela * rp;
12494 Elf_Internal_Shdr * symsec;
12495 Elf_Internal_Sym * symtab;
ba5cdace 12496 unsigned long num_syms;
2cf0635d 12497 Elf_Internal_Sym * sym;
252b5132 12498
41e92641 12499 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
4fbb74a6
AM
12500 || relsec->sh_info >= elf_header.e_shnum
12501 || section_headers + relsec->sh_info != section
c256ffe7 12502 || relsec->sh_size == 0
4fbb74a6 12503 || relsec->sh_link >= elf_header.e_shnum)
5b18a4bc 12504 continue;
428409d5 12505
41e92641
NC
12506 is_rela = relsec->sh_type == SHT_RELA;
12507
12508 if (is_rela)
12509 {
3f5e193b
NC
12510 if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
12511 relsec->sh_size, & relocs, & num_relocs))
32ec8896 12512 return FALSE;
41e92641
NC
12513 }
12514 else
12515 {
3f5e193b
NC
12516 if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
12517 relsec->sh_size, & relocs, & num_relocs))
32ec8896 12518 return FALSE;
41e92641
NC
12519 }
12520
12521 /* SH uses RELA but uses in place value instead of the addend field. */
12522 if (elf_header.e_machine == EM_SH)
12523 is_rela = FALSE;
428409d5 12524
4fbb74a6 12525 symsec = section_headers + relsec->sh_link;
1449284b
NC
12526 if (symsec->sh_type != SHT_SYMTAB
12527 && symsec->sh_type != SHT_DYNSYM)
32ec8896 12528 return FALSE;
ba5cdace 12529 symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec, & num_syms);
103f02d3 12530
41e92641 12531 for (rp = relocs; rp < relocs + num_relocs; ++rp)
252b5132 12532 {
41e92641
NC
12533 bfd_vma addend;
12534 unsigned int reloc_type;
12535 unsigned int reloc_size;
91d6fa6a 12536 unsigned char * rloc;
ba5cdace 12537 unsigned long sym_index;
4b78141a 12538
aca88567 12539 reloc_type = get_reloc_type (rp->r_info);
41e92641 12540
f84ce13b 12541 if (target_specific_reloc_handling (rp, start, end, symtab, num_syms))
2a7b2e88 12542 continue;
98fb390a
NC
12543 else if (is_none_reloc (reloc_type))
12544 continue;
12545 else if (is_32bit_abs_reloc (reloc_type)
12546 || is_32bit_pcrel_reloc (reloc_type))
aca88567 12547 reloc_size = 4;
85acf597
RH
12548 else if (is_64bit_abs_reloc (reloc_type)
12549 || is_64bit_pcrel_reloc (reloc_type))
aca88567 12550 reloc_size = 8;
4dc3c23d
AM
12551 else if (is_24bit_abs_reloc (reloc_type))
12552 reloc_size = 3;
aca88567
NC
12553 else if (is_16bit_abs_reloc (reloc_type))
12554 reloc_size = 2;
12555 else
4b78141a 12556 {
bee0ee85
NC
12557 static unsigned int prev_reloc = 0;
12558 if (reloc_type != prev_reloc)
12559 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
12560 reloc_type, printable_section_name (section));
12561 prev_reloc = reloc_type;
32ec8896 12562 res = FALSE;
4b78141a
NC
12563 continue;
12564 }
103f02d3 12565
91d6fa6a 12566 rloc = start + rp->r_offset;
c8da6823 12567 if ((rloc + reloc_size) > end || (rloc < start))
700dd8b7
L
12568 {
12569 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
12570 (unsigned long) rp->r_offset,
74e1a04b 12571 printable_section_name (section));
32ec8896 12572 res = FALSE;
700dd8b7
L
12573 continue;
12574 }
103f02d3 12575
ba5cdace
NC
12576 sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
12577 if (sym_index >= num_syms)
12578 {
12579 warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
74e1a04b 12580 sym_index, printable_section_name (section));
32ec8896 12581 res = FALSE;
ba5cdace
NC
12582 continue;
12583 }
12584 sym = symtab + sym_index;
41e92641
NC
12585
12586 /* If the reloc has a symbol associated with it,
55f25fc3
L
12587 make sure that it is of an appropriate type.
12588
12589 Relocations against symbols without type can happen.
12590 Gcc -feliminate-dwarf2-dups may generate symbols
12591 without type for debug info.
12592
12593 Icc generates relocations against function symbols
12594 instead of local labels.
12595
12596 Relocations against object symbols can happen, eg when
12597 referencing a global array. For an example of this see
12598 the _clz.o binary in libgcc.a. */
aca88567 12599 if (sym != symtab
b8871f35 12600 && ELF_ST_TYPE (sym->st_info) != STT_COMMON
55f25fc3 12601 && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
5b18a4bc 12602 {
41e92641 12603 warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
aca88567 12604 get_symbol_type (ELF_ST_TYPE (sym->st_info)),
99dcb0b9 12605 (long int)(rp - relocs),
74e1a04b 12606 printable_section_name (relsec));
32ec8896 12607 res = FALSE;
aca88567 12608 continue;
5b18a4bc 12609 }
252b5132 12610
4dc3c23d
AM
12611 addend = 0;
12612 if (is_rela)
12613 addend += rp->r_addend;
c47320c3
AM
12614 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
12615 partial_inplace. */
4dc3c23d
AM
12616 if (!is_rela
12617 || (elf_header.e_machine == EM_XTENSA
12618 && reloc_type == 1)
12619 || ((elf_header.e_machine == EM_PJ
12620 || elf_header.e_machine == EM_PJ_OLD)
c47320c3
AM
12621 && reloc_type == 1)
12622 || ((elf_header.e_machine == EM_D30V
12623 || elf_header.e_machine == EM_CYGNUS_D30V)
12624 && reloc_type == 12))
91d6fa6a 12625 addend += byte_get (rloc, reloc_size);
cb8f3167 12626
85acf597
RH
12627 if (is_32bit_pcrel_reloc (reloc_type)
12628 || is_64bit_pcrel_reloc (reloc_type))
12629 {
12630 /* On HPPA, all pc-relative relocations are biased by 8. */
12631 if (elf_header.e_machine == EM_PARISC)
12632 addend -= 8;
91d6fa6a 12633 byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
85acf597
RH
12634 reloc_size);
12635 }
41e92641 12636 else
91d6fa6a 12637 byte_put (rloc, addend + sym->st_value, reloc_size);
5b18a4bc 12638 }
252b5132 12639
5b18a4bc 12640 free (symtab);
f84ce13b
NC
12641 /* Let the target specific reloc processing code know that
12642 we have finished with these relocs. */
12643 target_specific_reloc_handling (NULL, NULL, NULL, NULL, 0);
d1c4b12b
NC
12644
12645 if (relocs_return)
12646 {
12647 * (Elf_Internal_Rela **) relocs_return = relocs;
12648 * num_relocs_return = num_relocs;
12649 }
12650 else
12651 free (relocs);
12652
5b18a4bc
NC
12653 break;
12654 }
32ec8896
NC
12655
12656 return res;
5b18a4bc 12657}
103f02d3 12658
cf13d699 12659#ifdef SUPPORT_DISASSEMBLY
32ec8896 12660static bfd_boolean
cf13d699
NC
12661disassemble_section (Elf_Internal_Shdr * section, FILE * file)
12662{
74e1a04b 12663 printf (_("\nAssembly dump of section %s\n"), printable_section_name (section));
cf13d699 12664
74e1a04b 12665 /* FIXME: XXX -- to be done --- XXX */
cf13d699 12666
32ec8896 12667 return TRUE;
cf13d699
NC
12668}
12669#endif
12670
12671/* Reads in the contents of SECTION from FILE, returning a pointer
12672 to a malloc'ed buffer or NULL if something went wrong. */
12673
12674static char *
12675get_section_contents (Elf_Internal_Shdr * section, FILE * file)
12676{
12677 bfd_size_type num_bytes;
12678
12679 num_bytes = section->sh_size;
12680
12681 if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
12682 {
12683 printf (_("\nSection '%s' has no data to dump.\n"),
74e1a04b 12684 printable_section_name (section));
cf13d699
NC
12685 return NULL;
12686 }
12687
3f5e193b
NC
12688 return (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
12689 _("section contents"));
cf13d699
NC
12690}
12691
0e602686
NC
12692/* Uncompresses a section that was compressed using zlib, in place. */
12693
12694static bfd_boolean
12695uncompress_section_contents (unsigned char **buffer,
12696 dwarf_size_type uncompressed_size,
12697 dwarf_size_type *size)
12698{
12699 dwarf_size_type compressed_size = *size;
12700 unsigned char * compressed_buffer = *buffer;
12701 unsigned char * uncompressed_buffer;
12702 z_stream strm;
12703 int rc;
12704
12705 /* It is possible the section consists of several compressed
12706 buffers concatenated together, so we uncompress in a loop. */
12707 /* PR 18313: The state field in the z_stream structure is supposed
12708 to be invisible to the user (ie us), but some compilers will
12709 still complain about it being used without initialisation. So
12710 we first zero the entire z_stream structure and then set the fields
12711 that we need. */
12712 memset (& strm, 0, sizeof strm);
12713 strm.avail_in = compressed_size;
12714 strm.next_in = (Bytef *) compressed_buffer;
12715 strm.avail_out = uncompressed_size;
12716 uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
12717
12718 rc = inflateInit (& strm);
12719 while (strm.avail_in > 0)
12720 {
12721 if (rc != Z_OK)
12722 goto fail;
12723 strm.next_out = ((Bytef *) uncompressed_buffer
12724 + (uncompressed_size - strm.avail_out));
12725 rc = inflate (&strm, Z_FINISH);
12726 if (rc != Z_STREAM_END)
12727 goto fail;
12728 rc = inflateReset (& strm);
12729 }
12730 rc = inflateEnd (& strm);
12731 if (rc != Z_OK
12732 || strm.avail_out != 0)
12733 goto fail;
12734
12735 *buffer = uncompressed_buffer;
12736 *size = uncompressed_size;
12737 return TRUE;
12738
12739 fail:
12740 free (uncompressed_buffer);
12741 /* Indicate decompression failure. */
12742 *buffer = NULL;
12743 return FALSE;
12744}
dd24e3da 12745
32ec8896 12746static bfd_boolean
cf13d699
NC
12747dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
12748{
0e602686
NC
12749 Elf_Internal_Shdr * relsec;
12750 bfd_size_type num_bytes;
fd8008d8
L
12751 unsigned char * data;
12752 unsigned char * end;
12753 unsigned char * real_start;
12754 unsigned char * start;
0e602686 12755 bfd_boolean some_strings_shown;
cf13d699 12756
fd8008d8
L
12757 real_start = start = (unsigned char *) get_section_contents (section,
12758 file);
cf13d699 12759 if (start == NULL)
32ec8896 12760 return FALSE;
0e602686 12761 num_bytes = section->sh_size;
cf13d699 12762
74e1a04b 12763 printf (_("\nString dump of section '%s':\n"), printable_section_name (section));
cf13d699 12764
0e602686
NC
12765 if (decompress_dumps)
12766 {
12767 dwarf_size_type new_size = num_bytes;
12768 dwarf_size_type uncompressed_size = 0;
12769
12770 if ((section->sh_flags & SHF_COMPRESSED) != 0)
12771 {
12772 Elf_Internal_Chdr chdr;
12773 unsigned int compression_header_size
ebdf1ebf
NC
12774 = get_compression_header (& chdr, (unsigned char *) start,
12775 num_bytes);
0e602686 12776
813dabb9 12777 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
0e602686 12778 {
813dabb9
L
12779 warn (_("section '%s' has unsupported compress type: %d\n"),
12780 printable_section_name (section), chdr.ch_type);
32ec8896 12781 return FALSE;
813dabb9
L
12782 }
12783 else if (chdr.ch_addralign != section->sh_addralign)
12784 {
12785 warn (_("compressed section '%s' is corrupted\n"),
12786 printable_section_name (section));
32ec8896 12787 return FALSE;
0e602686 12788 }
813dabb9
L
12789 uncompressed_size = chdr.ch_size;
12790 start += compression_header_size;
12791 new_size -= compression_header_size;
0e602686
NC
12792 }
12793 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12794 {
12795 /* Read the zlib header. In this case, it should be "ZLIB"
12796 followed by the uncompressed section size, 8 bytes in
12797 big-endian order. */
12798 uncompressed_size = start[4]; uncompressed_size <<= 8;
12799 uncompressed_size += start[5]; uncompressed_size <<= 8;
12800 uncompressed_size += start[6]; uncompressed_size <<= 8;
12801 uncompressed_size += start[7]; uncompressed_size <<= 8;
12802 uncompressed_size += start[8]; uncompressed_size <<= 8;
12803 uncompressed_size += start[9]; uncompressed_size <<= 8;
12804 uncompressed_size += start[10]; uncompressed_size <<= 8;
12805 uncompressed_size += start[11];
12806 start += 12;
12807 new_size -= 12;
12808 }
12809
1835f746
NC
12810 if (uncompressed_size)
12811 {
12812 if (uncompress_section_contents (& start,
12813 uncompressed_size, & new_size))
12814 num_bytes = new_size;
12815 else
12816 {
12817 error (_("Unable to decompress section %s\n"),
12818 printable_section_name (section));
32ec8896 12819 return FALSE;
1835f746
NC
12820 }
12821 }
bc303e5d
NC
12822 else
12823 start = real_start;
0e602686 12824 }
fd8008d8 12825
cf13d699
NC
12826 /* If the section being dumped has relocations against it the user might
12827 be expecting these relocations to have been applied. Check for this
12828 case and issue a warning message in order to avoid confusion.
12829 FIXME: Maybe we ought to have an option that dumps a section with
12830 relocs applied ? */
12831 for (relsec = section_headers;
12832 relsec < section_headers + elf_header.e_shnum;
12833 ++relsec)
12834 {
12835 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12836 || relsec->sh_info >= elf_header.e_shnum
12837 || section_headers + relsec->sh_info != section
12838 || relsec->sh_size == 0
12839 || relsec->sh_link >= elf_header.e_shnum)
12840 continue;
12841
12842 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12843 break;
12844 }
12845
cf13d699
NC
12846 data = start;
12847 end = start + num_bytes;
12848 some_strings_shown = FALSE;
12849
12850 while (data < end)
12851 {
12852 while (!ISPRINT (* data))
12853 if (++ data >= end)
12854 break;
12855
12856 if (data < end)
12857 {
071436c6
NC
12858 size_t maxlen = end - data;
12859
cf13d699 12860#ifndef __MSVCRT__
c975cc98
NC
12861 /* PR 11128: Use two separate invocations in order to work
12862 around bugs in the Solaris 8 implementation of printf. */
12863 printf (" [%6tx] ", data - start);
cf13d699 12864#else
071436c6 12865 printf (" [%6Ix] ", (size_t) (data - start));
cf13d699 12866#endif
4082ef84
NC
12867 if (maxlen > 0)
12868 {
fd8008d8 12869 print_symbol ((int) maxlen, (const char *) data);
4082ef84 12870 putchar ('\n');
fd8008d8 12871 data += strnlen ((const char *) data, maxlen);
4082ef84
NC
12872 }
12873 else
12874 {
12875 printf (_("<corrupt>\n"));
12876 data = end;
12877 }
cf13d699
NC
12878 some_strings_shown = TRUE;
12879 }
12880 }
12881
12882 if (! some_strings_shown)
12883 printf (_(" No strings found in this section."));
12884
0e602686 12885 free (real_start);
cf13d699
NC
12886
12887 putchar ('\n');
32ec8896 12888 return TRUE;
cf13d699
NC
12889}
12890
32ec8896 12891static bfd_boolean
cf13d699
NC
12892dump_section_as_bytes (Elf_Internal_Shdr * section,
12893 FILE * file,
12894 bfd_boolean relocate)
12895{
12896 Elf_Internal_Shdr * relsec;
0e602686
NC
12897 bfd_size_type bytes;
12898 bfd_size_type section_size;
12899 bfd_vma addr;
12900 unsigned char * data;
12901 unsigned char * real_start;
12902 unsigned char * start;
12903
12904 real_start = start = (unsigned char *) get_section_contents (section, file);
cf13d699 12905 if (start == NULL)
32ec8896
NC
12906 return FALSE;
12907
0e602686 12908 section_size = section->sh_size;
cf13d699 12909
74e1a04b 12910 printf (_("\nHex dump of section '%s':\n"), printable_section_name (section));
cf13d699 12911
0e602686
NC
12912 if (decompress_dumps)
12913 {
12914 dwarf_size_type new_size = section_size;
12915 dwarf_size_type uncompressed_size = 0;
12916
12917 if ((section->sh_flags & SHF_COMPRESSED) != 0)
12918 {
12919 Elf_Internal_Chdr chdr;
12920 unsigned int compression_header_size
ebdf1ebf 12921 = get_compression_header (& chdr, start, section_size);
0e602686 12922
813dabb9 12923 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
0e602686 12924 {
813dabb9
L
12925 warn (_("section '%s' has unsupported compress type: %d\n"),
12926 printable_section_name (section), chdr.ch_type);
32ec8896 12927 return FALSE;
0e602686 12928 }
813dabb9
L
12929 else if (chdr.ch_addralign != section->sh_addralign)
12930 {
12931 warn (_("compressed section '%s' is corrupted\n"),
12932 printable_section_name (section));
32ec8896 12933 return FALSE;
813dabb9
L
12934 }
12935 uncompressed_size = chdr.ch_size;
12936 start += compression_header_size;
12937 new_size -= compression_header_size;
0e602686
NC
12938 }
12939 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12940 {
12941 /* Read the zlib header. In this case, it should be "ZLIB"
12942 followed by the uncompressed section size, 8 bytes in
12943 big-endian order. */
12944 uncompressed_size = start[4]; uncompressed_size <<= 8;
12945 uncompressed_size += start[5]; uncompressed_size <<= 8;
12946 uncompressed_size += start[6]; uncompressed_size <<= 8;
12947 uncompressed_size += start[7]; uncompressed_size <<= 8;
12948 uncompressed_size += start[8]; uncompressed_size <<= 8;
12949 uncompressed_size += start[9]; uncompressed_size <<= 8;
12950 uncompressed_size += start[10]; uncompressed_size <<= 8;
12951 uncompressed_size += start[11];
12952 start += 12;
12953 new_size -= 12;
12954 }
12955
f055032e
NC
12956 if (uncompressed_size)
12957 {
12958 if (uncompress_section_contents (& start, uncompressed_size,
12959 & new_size))
bc303e5d
NC
12960 {
12961 section_size = new_size;
12962 }
f055032e
NC
12963 else
12964 {
12965 error (_("Unable to decompress section %s\n"),
12966 printable_section_name (section));
bc303e5d 12967 /* FIXME: Print the section anyway ? */
32ec8896 12968 return FALSE;
f055032e
NC
12969 }
12970 }
bc303e5d
NC
12971 else
12972 start = real_start;
0e602686 12973 }
14ae95f2 12974
cf13d699
NC
12975 if (relocate)
12976 {
32ec8896
NC
12977 if (! apply_relocations (file, section, start, section_size, NULL, NULL))
12978 return FALSE;
cf13d699
NC
12979 }
12980 else
12981 {
12982 /* If the section being dumped has relocations against it the user might
12983 be expecting these relocations to have been applied. Check for this
12984 case and issue a warning message in order to avoid confusion.
12985 FIXME: Maybe we ought to have an option that dumps a section with
12986 relocs applied ? */
12987 for (relsec = section_headers;
12988 relsec < section_headers + elf_header.e_shnum;
12989 ++relsec)
12990 {
12991 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12992 || relsec->sh_info >= elf_header.e_shnum
12993 || section_headers + relsec->sh_info != section
12994 || relsec->sh_size == 0
12995 || relsec->sh_link >= elf_header.e_shnum)
12996 continue;
12997
12998 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12999 break;
13000 }
13001 }
13002
13003 addr = section->sh_addr;
0e602686 13004 bytes = section_size;
cf13d699
NC
13005 data = start;
13006
13007 while (bytes)
13008 {
13009 int j;
13010 int k;
13011 int lbytes;
13012
13013 lbytes = (bytes > 16 ? 16 : bytes);
13014
13015 printf (" 0x%8.8lx ", (unsigned long) addr);
13016
13017 for (j = 0; j < 16; j++)
13018 {
13019 if (j < lbytes)
13020 printf ("%2.2x", data[j]);
13021 else
13022 printf (" ");
13023
13024 if ((j & 3) == 3)
13025 printf (" ");
13026 }
13027
13028 for (j = 0; j < lbytes; j++)
13029 {
13030 k = data[j];
13031 if (k >= ' ' && k < 0x7f)
13032 printf ("%c", k);
13033 else
13034 printf (".");
13035 }
13036
13037 putchar ('\n');
13038
13039 data += lbytes;
13040 addr += lbytes;
13041 bytes -= lbytes;
13042 }
13043
0e602686 13044 free (real_start);
cf13d699
NC
13045
13046 putchar ('\n');
32ec8896 13047 return TRUE;
cf13d699
NC
13048}
13049
32ec8896 13050static bfd_boolean
d966045b 13051load_specific_debug_section (enum dwarf_section_display_enum debug,
0d2a7a93 13052 const Elf_Internal_Shdr * sec, void * file)
1007acb3 13053{
2cf0635d 13054 struct dwarf_section * section = &debug_displays [debug].section;
19e6b90e 13055 char buf [64];
1007acb3 13056
19e6b90e
L
13057 /* If it is already loaded, do nothing. */
13058 if (section->start != NULL)
32ec8896 13059 return TRUE;
1007acb3 13060
19e6b90e
L
13061 snprintf (buf, sizeof (buf), _("%s section data"), section->name);
13062 section->address = sec->sh_addr;
06614111 13063 section->user_data = NULL;
3f5e193b
NC
13064 section->start = (unsigned char *) get_data (NULL, (FILE *) file,
13065 sec->sh_offset, 1,
13066 sec->sh_size, buf);
59245841
NC
13067 if (section->start == NULL)
13068 section->size = 0;
13069 else
13070 {
77115a4a
L
13071 unsigned char *start = section->start;
13072 dwarf_size_type size = sec->sh_size;
dab394de 13073 dwarf_size_type uncompressed_size = 0;
77115a4a
L
13074
13075 if ((sec->sh_flags & SHF_COMPRESSED) != 0)
13076 {
13077 Elf_Internal_Chdr chdr;
d8024a91
NC
13078 unsigned int compression_header_size;
13079
f53be977
L
13080 if (size < (is_32bit_elf
13081 ? sizeof (Elf32_External_Chdr)
13082 : sizeof (Elf64_External_Chdr)))
d8024a91
NC
13083 {
13084 warn (_("compressed section %s is too small to contain a compression header"),
13085 section->name);
32ec8896 13086 return FALSE;
d8024a91
NC
13087 }
13088
ebdf1ebf 13089 compression_header_size = get_compression_header (&chdr, start, size);
d8024a91 13090
813dabb9
L
13091 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13092 {
13093 warn (_("section '%s' has unsupported compress type: %d\n"),
13094 section->name, chdr.ch_type);
32ec8896 13095 return FALSE;
813dabb9
L
13096 }
13097 else if (chdr.ch_addralign != sec->sh_addralign)
13098 {
13099 warn (_("compressed section '%s' is corrupted\n"),
13100 section->name);
32ec8896 13101 return FALSE;
813dabb9 13102 }
dab394de 13103 uncompressed_size = chdr.ch_size;
77115a4a
L
13104 start += compression_header_size;
13105 size -= compression_header_size;
13106 }
dab394de
L
13107 else if (size > 12 && streq ((char *) start, "ZLIB"))
13108 {
13109 /* Read the zlib header. In this case, it should be "ZLIB"
13110 followed by the uncompressed section size, 8 bytes in
13111 big-endian order. */
13112 uncompressed_size = start[4]; uncompressed_size <<= 8;
13113 uncompressed_size += start[5]; uncompressed_size <<= 8;
13114 uncompressed_size += start[6]; uncompressed_size <<= 8;
13115 uncompressed_size += start[7]; uncompressed_size <<= 8;
13116 uncompressed_size += start[8]; uncompressed_size <<= 8;
13117 uncompressed_size += start[9]; uncompressed_size <<= 8;
13118 uncompressed_size += start[10]; uncompressed_size <<= 8;
13119 uncompressed_size += start[11];
13120 start += 12;
13121 size -= 12;
13122 }
13123
1835f746 13124 if (uncompressed_size)
77115a4a 13125 {
1835f746
NC
13126 if (uncompress_section_contents (&start, uncompressed_size,
13127 &size))
13128 {
13129 /* Free the compressed buffer, update the section buffer
13130 and the section size if uncompress is successful. */
13131 free (section->start);
13132 section->start = start;
13133 }
13134 else
13135 {
13136 error (_("Unable to decompress section %s\n"),
13137 printable_section_name (sec));
32ec8896 13138 return FALSE;
1835f746 13139 }
77115a4a 13140 }
bc303e5d 13141
77115a4a 13142 section->size = size;
59245841 13143 }
4a114e3e 13144
1b315056 13145 if (section->start == NULL)
32ec8896 13146 return FALSE;
1b315056 13147
19e6b90e 13148 if (debug_displays [debug].relocate)
32ec8896
NC
13149 {
13150 if (! apply_relocations ((FILE *) file, sec, section->start, section->size,
13151 & section->reloc_info, & section->num_relocs))
13152 return FALSE;
13153 }
d1c4b12b
NC
13154 else
13155 {
13156 section->reloc_info = NULL;
13157 section->num_relocs = 0;
13158 }
1007acb3 13159
32ec8896 13160 return TRUE;
1007acb3
L
13161}
13162
657d0d47
CC
13163/* If this is not NULL, load_debug_section will only look for sections
13164 within the list of sections given here. */
32ec8896 13165static unsigned int * section_subset = NULL;
657d0d47 13166
32ec8896 13167bfd_boolean
2cf0635d 13168load_debug_section (enum dwarf_section_display_enum debug, void * file)
d966045b 13169{
2cf0635d
NC
13170 struct dwarf_section * section = &debug_displays [debug].section;
13171 Elf_Internal_Shdr * sec;
d966045b
DJ
13172
13173 /* Locate the debug section. */
657d0d47 13174 sec = find_section_in_set (section->uncompressed_name, section_subset);
d966045b
DJ
13175 if (sec != NULL)
13176 section->name = section->uncompressed_name;
13177 else
13178 {
657d0d47 13179 sec = find_section_in_set (section->compressed_name, section_subset);
d966045b
DJ
13180 if (sec != NULL)
13181 section->name = section->compressed_name;
13182 }
13183 if (sec == NULL)
32ec8896 13184 return FALSE;
d966045b 13185
657d0d47
CC
13186 /* If we're loading from a subset of sections, and we've loaded
13187 a section matching this name before, it's likely that it's a
13188 different one. */
13189 if (section_subset != NULL)
13190 free_debug_section (debug);
13191
3f5e193b 13192 return load_specific_debug_section (debug, sec, (FILE *) file);
d966045b
DJ
13193}
13194
19e6b90e
L
13195void
13196free_debug_section (enum dwarf_section_display_enum debug)
1007acb3 13197{
2cf0635d 13198 struct dwarf_section * section = &debug_displays [debug].section;
1007acb3 13199
19e6b90e
L
13200 if (section->start == NULL)
13201 return;
1007acb3 13202
19e6b90e
L
13203 free ((char *) section->start);
13204 section->start = NULL;
13205 section->address = 0;
13206 section->size = 0;
1007acb3
L
13207}
13208
32ec8896 13209static bfd_boolean
657d0d47 13210display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
1007acb3 13211{
2cf0635d 13212 char * name = SECTION_NAME (section);
74e1a04b 13213 const char * print_name = printable_section_name (section);
19e6b90e 13214 bfd_size_type length;
32ec8896 13215 bfd_boolean result = TRUE;
3f5e193b 13216 int i;
1007acb3 13217
19e6b90e
L
13218 length = section->sh_size;
13219 if (length == 0)
1007acb3 13220 {
74e1a04b 13221 printf (_("\nSection '%s' has no debugging data.\n"), print_name);
32ec8896 13222 return TRUE;
1007acb3 13223 }
5dff79d8
NC
13224 if (section->sh_type == SHT_NOBITS)
13225 {
13226 /* There is no point in dumping the contents of a debugging section
13227 which has the NOBITS type - the bits in the file will be random.
13228 This can happen when a file containing a .eh_frame section is
13229 stripped with the --only-keep-debug command line option. */
74e1a04b
NC
13230 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
13231 print_name);
32ec8896 13232 return FALSE;
5dff79d8 13233 }
1007acb3 13234
0112cd26 13235 if (const_strneq (name, ".gnu.linkonce.wi."))
19e6b90e 13236 name = ".debug_info";
1007acb3 13237
19e6b90e
L
13238 /* See if we know how to display the contents of this section. */
13239 for (i = 0; i < max; i++)
1b315056 13240 if (streq (debug_displays[i].section.uncompressed_name, name)
b40bf0a2 13241 || (i == line && const_strneq (name, ".debug_line."))
1b315056 13242 || streq (debug_displays[i].section.compressed_name, name))
19e6b90e 13243 {
2cf0635d 13244 struct dwarf_section * sec = &debug_displays [i].section;
d966045b
DJ
13245 int secondary = (section != find_section (name));
13246
13247 if (secondary)
3f5e193b 13248 free_debug_section ((enum dwarf_section_display_enum) i);
1007acb3 13249
b40bf0a2
NC
13250 if (i == line && const_strneq (name, ".debug_line."))
13251 sec->name = name;
13252 else if (streq (sec->uncompressed_name, name))
d966045b
DJ
13253 sec->name = sec->uncompressed_name;
13254 else
13255 sec->name = sec->compressed_name;
3f5e193b
NC
13256 if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
13257 section, file))
19e6b90e 13258 {
657d0d47
CC
13259 /* If this debug section is part of a CU/TU set in a .dwp file,
13260 restrict load_debug_section to the sections in that set. */
13261 section_subset = find_cu_tu_set (file, shndx);
13262
19e6b90e 13263 result &= debug_displays[i].display (sec, file);
1007acb3 13264
657d0d47
CC
13265 section_subset = NULL;
13266
d966045b 13267 if (secondary || (i != info && i != abbrev))
3f5e193b 13268 free_debug_section ((enum dwarf_section_display_enum) i);
19e6b90e 13269 }
1007acb3 13270
19e6b90e
L
13271 break;
13272 }
1007acb3 13273
19e6b90e 13274 if (i == max)
1007acb3 13275 {
74e1a04b 13276 printf (_("Unrecognized debug section: %s\n"), print_name);
32ec8896 13277 result = FALSE;
1007acb3
L
13278 }
13279
19e6b90e 13280 return result;
5b18a4bc 13281}
103f02d3 13282
aef1f6d0
DJ
13283/* Set DUMP_SECTS for all sections where dumps were requested
13284 based on section name. */
13285
13286static void
13287initialise_dumps_byname (void)
13288{
2cf0635d 13289 struct dump_list_entry * cur;
aef1f6d0
DJ
13290
13291 for (cur = dump_sects_byname; cur; cur = cur->next)
13292 {
13293 unsigned int i;
32ec8896 13294 bfd_boolean any = FALSE;
aef1f6d0 13295
32ec8896 13296 for (i = 0; i < elf_header.e_shnum; i++)
aef1f6d0
DJ
13297 if (streq (SECTION_NAME (section_headers + i), cur->name))
13298 {
09c11c86 13299 request_dump_bynumber (i, cur->type);
32ec8896 13300 any = TRUE;
aef1f6d0
DJ
13301 }
13302
13303 if (!any)
13304 warn (_("Section '%s' was not dumped because it does not exist!\n"),
13305 cur->name);
13306 }
13307}
13308
32ec8896 13309static bfd_boolean
2cf0635d 13310process_section_contents (FILE * file)
5b18a4bc 13311{
2cf0635d 13312 Elf_Internal_Shdr * section;
19e6b90e 13313 unsigned int i;
32ec8896 13314 bfd_boolean res = TRUE;
103f02d3 13315
19e6b90e 13316 if (! do_dump)
32ec8896 13317 return TRUE;
103f02d3 13318
aef1f6d0
DJ
13319 initialise_dumps_byname ();
13320
19e6b90e
L
13321 for (i = 0, section = section_headers;
13322 i < elf_header.e_shnum && i < num_dump_sects;
13323 i++, section++)
13324 {
13325#ifdef SUPPORT_DISASSEMBLY
13326 if (dump_sects[i] & DISASS_DUMP)
13327 disassemble_section (section, file);
13328#endif
13329 if (dump_sects[i] & HEX_DUMP)
32ec8896
NC
13330 {
13331 if (! dump_section_as_bytes (section, file, FALSE))
13332 res = FALSE;
13333 }
103f02d3 13334
cf13d699 13335 if (dump_sects[i] & RELOC_DUMP)
32ec8896
NC
13336 {
13337 if (! dump_section_as_bytes (section, file, TRUE))
13338 res = FALSE;
13339 }
09c11c86
NC
13340
13341 if (dump_sects[i] & STRING_DUMP)
32ec8896
NC
13342 {
13343 if (! dump_section_as_strings (section, file))
13344 res = FALSE;
13345 }
cf13d699
NC
13346
13347 if (dump_sects[i] & DEBUG_DUMP)
32ec8896
NC
13348 {
13349 if (! display_debug_section (i, section, file))
13350 res = FALSE;
13351 }
5b18a4bc 13352 }
103f02d3 13353
19e6b90e
L
13354 /* Check to see if the user requested a
13355 dump of a section that does not exist. */
0ee3043f
NC
13356 while (i < num_dump_sects)
13357 {
13358 if (dump_sects[i])
32ec8896
NC
13359 {
13360 warn (_("Section %d was not dumped because it does not exist!\n"), i);
13361 res = FALSE;
13362 }
0ee3043f
NC
13363 i++;
13364 }
32ec8896
NC
13365
13366 return res;
5b18a4bc 13367}
103f02d3 13368
5b18a4bc 13369static void
19e6b90e 13370process_mips_fpe_exception (int mask)
5b18a4bc 13371{
19e6b90e
L
13372 if (mask)
13373 {
32ec8896
NC
13374 bfd_boolean first = TRUE;
13375
19e6b90e 13376 if (mask & OEX_FPU_INEX)
32ec8896 13377 fputs ("INEX", stdout), first = FALSE;
19e6b90e 13378 if (mask & OEX_FPU_UFLO)
32ec8896 13379 printf ("%sUFLO", first ? "" : "|"), first = FALSE;
19e6b90e 13380 if (mask & OEX_FPU_OFLO)
32ec8896 13381 printf ("%sOFLO", first ? "" : "|"), first = FALSE;
19e6b90e 13382 if (mask & OEX_FPU_DIV0)
32ec8896 13383 printf ("%sDIV0", first ? "" : "|"), first = FALSE;
19e6b90e
L
13384 if (mask & OEX_FPU_INVAL)
13385 printf ("%sINVAL", first ? "" : "|");
13386 }
5b18a4bc 13387 else
19e6b90e 13388 fputs ("0", stdout);
5b18a4bc 13389}
103f02d3 13390
f6f0e17b
NC
13391/* Display's the value of TAG at location P. If TAG is
13392 greater than 0 it is assumed to be an unknown tag, and
13393 a message is printed to this effect. Otherwise it is
13394 assumed that a message has already been printed.
13395
13396 If the bottom bit of TAG is set it assumed to have a
13397 string value, otherwise it is assumed to have an integer
13398 value.
13399
13400 Returns an updated P pointing to the first unread byte
13401 beyond the end of TAG's value.
13402
13403 Reads at or beyond END will not be made. */
13404
13405static unsigned char *
60abdbed 13406display_tag_value (signed int tag,
f6f0e17b
NC
13407 unsigned char * p,
13408 const unsigned char * const end)
13409{
13410 unsigned long val;
13411
13412 if (tag > 0)
13413 printf (" Tag_unknown_%d: ", tag);
13414
13415 if (p >= end)
13416 {
4082ef84 13417 warn (_("<corrupt tag>\n"));
f6f0e17b
NC
13418 }
13419 else if (tag & 1)
13420 {
071436c6
NC
13421 /* PR 17531 file: 027-19978-0.004. */
13422 size_t maxlen = (end - p) - 1;
13423
13424 putchar ('"');
4082ef84
NC
13425 if (maxlen > 0)
13426 {
13427 print_symbol ((int) maxlen, (const char *) p);
13428 p += strnlen ((char *) p, maxlen) + 1;
13429 }
13430 else
13431 {
13432 printf (_("<corrupt string tag>"));
13433 p = (unsigned char *) end;
13434 }
071436c6 13435 printf ("\"\n");
f6f0e17b
NC
13436 }
13437 else
13438 {
13439 unsigned int len;
13440
13441 val = read_uleb128 (p, &len, end);
13442 p += len;
13443 printf ("%ld (0x%lx)\n", val, val);
13444 }
13445
4082ef84 13446 assert (p <= end);
f6f0e17b
NC
13447 return p;
13448}
13449
11c1ff18
PB
13450/* ARM EABI attributes section. */
13451typedef struct
13452{
70e99720 13453 unsigned int tag;
2cf0635d 13454 const char * name;
11c1ff18 13455 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
70e99720 13456 unsigned int type;
2cf0635d 13457 const char ** table;
11c1ff18
PB
13458} arm_attr_public_tag;
13459
2cf0635d 13460static const char * arm_attr_tag_CPU_arch[] =
11c1ff18 13461 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
ff8646ee
TP
13462 "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "", "v8-M.baseline",
13463 "v8-M.mainline"};
2cf0635d
NC
13464static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
13465static const char * arm_attr_tag_THUMB_ISA_use[] =
4ed7ed8d 13466 {"No", "Thumb-1", "Thumb-2", "Yes"};
75375b3e 13467static const char * arm_attr_tag_FP_arch[] =
bca38921 13468 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
a715796b 13469 "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
2cf0635d 13470static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
dd24e3da 13471static const char * arm_attr_tag_Advanced_SIMD_arch[] =
9411fd44
MW
13472 {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
13473 "NEON for ARMv8.1"};
2cf0635d 13474static const char * arm_attr_tag_PCS_config[] =
11c1ff18
PB
13475 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
13476 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
2cf0635d 13477static const char * arm_attr_tag_ABI_PCS_R9_use[] =
11c1ff18 13478 {"V6", "SB", "TLS", "Unused"};
2cf0635d 13479static const char * arm_attr_tag_ABI_PCS_RW_data[] =
11c1ff18 13480 {"Absolute", "PC-relative", "SB-relative", "None"};
2cf0635d 13481static const char * arm_attr_tag_ABI_PCS_RO_data[] =
11c1ff18 13482 {"Absolute", "PC-relative", "None"};
2cf0635d 13483static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
11c1ff18 13484 {"None", "direct", "GOT-indirect"};
2cf0635d 13485static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
11c1ff18 13486 {"None", "??? 1", "2", "??? 3", "4"};
2cf0635d
NC
13487static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
13488static const char * arm_attr_tag_ABI_FP_denormal[] =
f5f53991 13489 {"Unused", "Needed", "Sign only"};
2cf0635d
NC
13490static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
13491static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
13492static const char * arm_attr_tag_ABI_FP_number_model[] =
11c1ff18 13493 {"Unused", "Finite", "RTABI", "IEEE 754"};
2cf0635d 13494static const char * arm_attr_tag_ABI_enum_size[] =
11c1ff18 13495 {"Unused", "small", "int", "forced to int"};
2cf0635d 13496static const char * arm_attr_tag_ABI_HardFP_use[] =
99654aaf 13497 {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
2cf0635d 13498static const char * arm_attr_tag_ABI_VFP_args[] =
5c294fee 13499 {"AAPCS", "VFP registers", "custom", "compatible"};
2cf0635d 13500static const char * arm_attr_tag_ABI_WMMX_args[] =
11c1ff18 13501 {"AAPCS", "WMMX registers", "custom"};
2cf0635d 13502static const char * arm_attr_tag_ABI_optimization_goals[] =
11c1ff18
PB
13503 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
13504 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
2cf0635d 13505static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
11c1ff18
PB
13506 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
13507 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
2cf0635d 13508static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
75375b3e 13509static const char * arm_attr_tag_FP_HP_extension[] =
8e79c3df 13510 {"Not Allowed", "Allowed"};
2cf0635d 13511static const char * arm_attr_tag_ABI_FP_16bit_format[] =
8e79c3df 13512 {"None", "IEEE 754", "Alternative Format"};
15afaa63
TP
13513static const char * arm_attr_tag_DSP_extension[] =
13514 {"Follow architecture", "Allowed"};
dd24e3da 13515static const char * arm_attr_tag_MPextension_use[] =
cd21e546
MGD
13516 {"Not Allowed", "Allowed"};
13517static const char * arm_attr_tag_DIV_use[] =
dd24e3da 13518 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
cd21e546 13519 "Allowed in v7-A with integer division extension"};
2cf0635d
NC
13520static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
13521static const char * arm_attr_tag_Virtualization_use[] =
dd24e3da 13522 {"Not Allowed", "TrustZone", "Virtualization Extensions",
cd21e546 13523 "TrustZone and Virtualization Extensions"};
dd24e3da 13524static const char * arm_attr_tag_MPextension_use_legacy[] =
f5f53991 13525 {"Not Allowed", "Allowed"};
11c1ff18
PB
13526
13527#define LOOKUP(id, name) \
13528 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
d70c5fc7 13529static arm_attr_public_tag arm_attr_public_tags[] =
11c1ff18
PB
13530{
13531 {4, "CPU_raw_name", 1, NULL},
13532 {5, "CPU_name", 1, NULL},
13533 LOOKUP(6, CPU_arch),
13534 {7, "CPU_arch_profile", 0, NULL},
13535 LOOKUP(8, ARM_ISA_use),
13536 LOOKUP(9, THUMB_ISA_use),
75375b3e 13537 LOOKUP(10, FP_arch),
11c1ff18 13538 LOOKUP(11, WMMX_arch),
f5f53991
AS
13539 LOOKUP(12, Advanced_SIMD_arch),
13540 LOOKUP(13, PCS_config),
11c1ff18
PB
13541 LOOKUP(14, ABI_PCS_R9_use),
13542 LOOKUP(15, ABI_PCS_RW_data),
f5f53991 13543 LOOKUP(16, ABI_PCS_RO_data),
11c1ff18
PB
13544 LOOKUP(17, ABI_PCS_GOT_use),
13545 LOOKUP(18, ABI_PCS_wchar_t),
13546 LOOKUP(19, ABI_FP_rounding),
13547 LOOKUP(20, ABI_FP_denormal),
13548 LOOKUP(21, ABI_FP_exceptions),
13549 LOOKUP(22, ABI_FP_user_exceptions),
13550 LOOKUP(23, ABI_FP_number_model),
75375b3e
MGD
13551 {24, "ABI_align_needed", 0, NULL},
13552 {25, "ABI_align_preserved", 0, NULL},
11c1ff18
PB
13553 LOOKUP(26, ABI_enum_size),
13554 LOOKUP(27, ABI_HardFP_use),
13555 LOOKUP(28, ABI_VFP_args),
13556 LOOKUP(29, ABI_WMMX_args),
13557 LOOKUP(30, ABI_optimization_goals),
13558 LOOKUP(31, ABI_FP_optimization_goals),
8e79c3df 13559 {32, "compatibility", 0, NULL},
f5f53991 13560 LOOKUP(34, CPU_unaligned_access),
75375b3e 13561 LOOKUP(36, FP_HP_extension),
8e79c3df 13562 LOOKUP(38, ABI_FP_16bit_format),
cd21e546
MGD
13563 LOOKUP(42, MPextension_use),
13564 LOOKUP(44, DIV_use),
15afaa63 13565 LOOKUP(46, DSP_extension),
f5f53991
AS
13566 {64, "nodefaults", 0, NULL},
13567 {65, "also_compatible_with", 0, NULL},
13568 LOOKUP(66, T2EE_use),
13569 {67, "conformance", 1, NULL},
13570 LOOKUP(68, Virtualization_use),
cd21e546 13571 LOOKUP(70, MPextension_use_legacy)
11c1ff18
PB
13572};
13573#undef LOOKUP
13574
11c1ff18 13575static unsigned char *
f6f0e17b
NC
13576display_arm_attribute (unsigned char * p,
13577 const unsigned char * const end)
11c1ff18 13578{
70e99720 13579 unsigned int tag;
11c1ff18 13580 unsigned int len;
70e99720 13581 unsigned int val;
2cf0635d 13582 arm_attr_public_tag * attr;
11c1ff18 13583 unsigned i;
70e99720 13584 unsigned int type;
11c1ff18 13585
f6f0e17b 13586 tag = read_uleb128 (p, &len, end);
11c1ff18
PB
13587 p += len;
13588 attr = NULL;
2cf0635d 13589 for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
11c1ff18
PB
13590 {
13591 if (arm_attr_public_tags[i].tag == tag)
13592 {
13593 attr = &arm_attr_public_tags[i];
13594 break;
13595 }
13596 }
13597
13598 if (attr)
13599 {
13600 printf (" Tag_%s: ", attr->name);
13601 switch (attr->type)
13602 {
13603 case 0:
13604 switch (tag)
13605 {
13606 case 7: /* Tag_CPU_arch_profile. */
f6f0e17b 13607 val = read_uleb128 (p, &len, end);
11c1ff18
PB
13608 p += len;
13609 switch (val)
13610 {
2b692964
NC
13611 case 0: printf (_("None\n")); break;
13612 case 'A': printf (_("Application\n")); break;
13613 case 'R': printf (_("Realtime\n")); break;
13614 case 'M': printf (_("Microcontroller\n")); break;
13615 case 'S': printf (_("Application or Realtime\n")); break;
11c1ff18
PB
13616 default: printf ("??? (%d)\n", val); break;
13617 }
13618 break;
13619
75375b3e 13620 case 24: /* Tag_align_needed. */
f6f0e17b 13621 val = read_uleb128 (p, &len, end);
75375b3e
MGD
13622 p += len;
13623 switch (val)
13624 {
2b692964
NC
13625 case 0: printf (_("None\n")); break;
13626 case 1: printf (_("8-byte\n")); break;
13627 case 2: printf (_("4-byte\n")); break;
75375b3e
MGD
13628 case 3: printf ("??? 3\n"); break;
13629 default:
13630 if (val <= 12)
dd24e3da 13631 printf (_("8-byte and up to %d-byte extended\n"),
75375b3e
MGD
13632 1 << val);
13633 else
13634 printf ("??? (%d)\n", val);
13635 break;
13636 }
13637 break;
13638
13639 case 25: /* Tag_align_preserved. */
f6f0e17b 13640 val = read_uleb128 (p, &len, end);
75375b3e
MGD
13641 p += len;
13642 switch (val)
13643 {
2b692964
NC
13644 case 0: printf (_("None\n")); break;
13645 case 1: printf (_("8-byte, except leaf SP\n")); break;
13646 case 2: printf (_("8-byte\n")); break;
75375b3e
MGD
13647 case 3: printf ("??? 3\n"); break;
13648 default:
13649 if (val <= 12)
dd24e3da 13650 printf (_("8-byte and up to %d-byte extended\n"),
75375b3e
MGD
13651 1 << val);
13652 else
13653 printf ("??? (%d)\n", val);
13654 break;
13655 }
13656 break;
13657
11c1ff18 13658 case 32: /* Tag_compatibility. */
071436c6 13659 {
071436c6
NC
13660 val = read_uleb128 (p, &len, end);
13661 p += len;
071436c6 13662 printf (_("flag = %d, vendor = "), val);
4082ef84
NC
13663 if (p < end - 1)
13664 {
13665 size_t maxlen = (end - p) - 1;
13666
13667 print_symbol ((int) maxlen, (const char *) p);
13668 p += strnlen ((char *) p, maxlen) + 1;
13669 }
13670 else
13671 {
13672 printf (_("<corrupt>"));
13673 p = (unsigned char *) end;
13674 }
071436c6 13675 putchar ('\n');
071436c6 13676 }
11c1ff18
PB
13677 break;
13678
f5f53991 13679 case 64: /* Tag_nodefaults. */
541a3cbd
NC
13680 /* PR 17531: file: 001-505008-0.01. */
13681 if (p < end)
13682 p++;
2b692964 13683 printf (_("True\n"));
f5f53991
AS
13684 break;
13685
13686 case 65: /* Tag_also_compatible_with. */
f6f0e17b 13687 val = read_uleb128 (p, &len, end);
f5f53991
AS
13688 p += len;
13689 if (val == 6 /* Tag_CPU_arch. */)
13690 {
f6f0e17b 13691 val = read_uleb128 (p, &len, end);
f5f53991 13692 p += len;
071436c6 13693 if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
f5f53991
AS
13694 printf ("??? (%d)\n", val);
13695 else
13696 printf ("%s\n", arm_attr_tag_CPU_arch[val]);
13697 }
13698 else
13699 printf ("???\n");
071436c6
NC
13700 while (p < end && *(p++) != '\0' /* NUL terminator. */)
13701 ;
f5f53991
AS
13702 break;
13703
11c1ff18 13704 default:
bee0ee85
NC
13705 printf (_("<unknown: %d>\n"), tag);
13706 break;
11c1ff18
PB
13707 }
13708 return p;
13709
13710 case 1:
f6f0e17b 13711 return display_tag_value (-1, p, end);
11c1ff18 13712 case 2:
f6f0e17b 13713 return display_tag_value (0, p, end);
11c1ff18
PB
13714
13715 default:
13716 assert (attr->type & 0x80);
f6f0e17b 13717 val = read_uleb128 (p, &len, end);
11c1ff18
PB
13718 p += len;
13719 type = attr->type & 0x7f;
13720 if (val >= type)
13721 printf ("??? (%d)\n", val);
13722 else
13723 printf ("%s\n", attr->table[val]);
13724 return p;
13725 }
13726 }
11c1ff18 13727
f6f0e17b 13728 return display_tag_value (tag, p, end);
11c1ff18
PB
13729}
13730
104d59d1 13731static unsigned char *
60bca95a 13732display_gnu_attribute (unsigned char * p,
60abdbed 13733 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const),
f6f0e17b 13734 const unsigned char * const end)
104d59d1
JM
13735{
13736 int tag;
13737 unsigned int len;
60abdbed 13738 unsigned int val;
104d59d1 13739
f6f0e17b 13740 tag = read_uleb128 (p, &len, end);
104d59d1
JM
13741 p += len;
13742
13743 /* Tag_compatibility is the only generic GNU attribute defined at
13744 present. */
13745 if (tag == 32)
13746 {
f6f0e17b 13747 val = read_uleb128 (p, &len, end);
104d59d1 13748 p += len;
071436c6
NC
13749
13750 printf (_("flag = %d, vendor = "), val);
f6f0e17b
NC
13751 if (p == end)
13752 {
071436c6 13753 printf (_("<corrupt>\n"));
f6f0e17b
NC
13754 warn (_("corrupt vendor attribute\n"));
13755 }
13756 else
13757 {
4082ef84
NC
13758 if (p < end - 1)
13759 {
13760 size_t maxlen = (end - p) - 1;
071436c6 13761
4082ef84
NC
13762 print_symbol ((int) maxlen, (const char *) p);
13763 p += strnlen ((char *) p, maxlen) + 1;
13764 }
13765 else
13766 {
13767 printf (_("<corrupt>"));
13768 p = (unsigned char *) end;
13769 }
071436c6 13770 putchar ('\n');
f6f0e17b 13771 }
104d59d1
JM
13772 return p;
13773 }
13774
13775 if ((tag & 2) == 0 && display_proc_gnu_attribute)
f6f0e17b 13776 return display_proc_gnu_attribute (p, tag, end);
104d59d1 13777
f6f0e17b 13778 return display_tag_value (tag, p, end);
104d59d1
JM
13779}
13780
34c8bcba 13781static unsigned char *
f6f0e17b 13782display_power_gnu_attribute (unsigned char * p,
60abdbed 13783 unsigned int tag,
f6f0e17b 13784 const unsigned char * const end)
34c8bcba 13785{
34c8bcba 13786 unsigned int len;
005d79fd 13787 unsigned int val;
34c8bcba
JM
13788
13789 if (tag == Tag_GNU_Power_ABI_FP)
13790 {
f6f0e17b 13791 val = read_uleb128 (p, &len, end);
34c8bcba
JM
13792 p += len;
13793 printf (" Tag_GNU_Power_ABI_FP: ");
005d79fd
AM
13794 if (len == 0)
13795 {
13796 printf (_("<corrupt>\n"));
13797 return p;
13798 }
60bca95a 13799
005d79fd
AM
13800 if (val > 15)
13801 printf ("(%#x), ", val);
13802
13803 switch (val & 3)
34c8bcba
JM
13804 {
13805 case 0:
005d79fd 13806 printf (_("unspecified hard/soft float, "));
34c8bcba
JM
13807 break;
13808 case 1:
005d79fd 13809 printf (_("hard float, "));
34c8bcba
JM
13810 break;
13811 case 2:
005d79fd 13812 printf (_("soft float, "));
34c8bcba 13813 break;
3c7b9897 13814 case 3:
005d79fd 13815 printf (_("single-precision hard float, "));
3c7b9897 13816 break;
005d79fd
AM
13817 }
13818
13819 switch (val & 0xC)
13820 {
13821 case 0:
13822 printf (_("unspecified long double\n"));
13823 break;
13824 case 4:
13825 printf (_("128-bit IBM long double\n"));
13826 break;
13827 case 8:
13828 printf (_("64-bit long double\n"));
13829 break;
13830 case 12:
13831 printf (_("128-bit IEEE long double\n"));
34c8bcba
JM
13832 break;
13833 }
13834 return p;
005d79fd 13835 }
34c8bcba 13836
c6e65352
DJ
13837 if (tag == Tag_GNU_Power_ABI_Vector)
13838 {
f6f0e17b 13839 val = read_uleb128 (p, &len, end);
c6e65352
DJ
13840 p += len;
13841 printf (" Tag_GNU_Power_ABI_Vector: ");
005d79fd
AM
13842 if (len == 0)
13843 {
13844 printf (_("<corrupt>\n"));
13845 return p;
13846 }
13847
13848 if (val > 3)
13849 printf ("(%#x), ", val);
13850
13851 switch (val & 3)
c6e65352
DJ
13852 {
13853 case 0:
005d79fd 13854 printf (_("unspecified\n"));
c6e65352
DJ
13855 break;
13856 case 1:
005d79fd 13857 printf (_("generic\n"));
c6e65352
DJ
13858 break;
13859 case 2:
13860 printf ("AltiVec\n");
13861 break;
13862 case 3:
13863 printf ("SPE\n");
13864 break;
c6e65352
DJ
13865 }
13866 return p;
005d79fd 13867 }
c6e65352 13868
f82e0623
NF
13869 if (tag == Tag_GNU_Power_ABI_Struct_Return)
13870 {
005d79fd
AM
13871 val = read_uleb128 (p, &len, end);
13872 p += len;
13873 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
13874 if (len == 0)
f6f0e17b 13875 {
005d79fd 13876 printf (_("<corrupt>\n"));
f6f0e17b
NC
13877 return p;
13878 }
0b4362b0 13879
005d79fd
AM
13880 if (val > 2)
13881 printf ("(%#x), ", val);
13882
13883 switch (val & 3)
13884 {
13885 case 0:
13886 printf (_("unspecified\n"));
13887 break;
13888 case 1:
13889 printf ("r3/r4\n");
13890 break;
13891 case 2:
13892 printf (_("memory\n"));
13893 break;
13894 case 3:
13895 printf ("???\n");
13896 break;
13897 }
f82e0623
NF
13898 return p;
13899 }
13900
f6f0e17b 13901 return display_tag_value (tag & 1, p, end);
34c8bcba
JM
13902}
13903
643f7afb
AK
13904static unsigned char *
13905display_s390_gnu_attribute (unsigned char * p,
60abdbed 13906 unsigned int tag,
643f7afb
AK
13907 const unsigned char * const end)
13908{
13909 unsigned int len;
13910 int val;
13911
13912 if (tag == Tag_GNU_S390_ABI_Vector)
13913 {
13914 val = read_uleb128 (p, &len, end);
13915 p += len;
13916 printf (" Tag_GNU_S390_ABI_Vector: ");
13917
13918 switch (val)
13919 {
13920 case 0:
13921 printf (_("any\n"));
13922 break;
13923 case 1:
13924 printf (_("software\n"));
13925 break;
13926 case 2:
13927 printf (_("hardware\n"));
13928 break;
13929 default:
13930 printf ("??? (%d)\n", val);
13931 break;
13932 }
13933 return p;
13934 }
13935
13936 return display_tag_value (tag & 1, p, end);
13937}
13938
9e8c70f9 13939static void
60abdbed 13940display_sparc_hwcaps (unsigned int mask)
9e8c70f9
DM
13941{
13942 if (mask)
13943 {
32ec8896 13944 bfd_boolean first = TRUE;
071436c6 13945
9e8c70f9 13946 if (mask & ELF_SPARC_HWCAP_MUL32)
32ec8896 13947 fputs ("mul32", stdout), first = FALSE;
9e8c70f9 13948 if (mask & ELF_SPARC_HWCAP_DIV32)
32ec8896 13949 printf ("%sdiv32", first ? "" : "|"), first = FALSE;
9e8c70f9 13950 if (mask & ELF_SPARC_HWCAP_FSMULD)
32ec8896 13951 printf ("%sfsmuld", first ? "" : "|"), first = FALSE;
9e8c70f9 13952 if (mask & ELF_SPARC_HWCAP_V8PLUS)
32ec8896 13953 printf ("%sv8plus", first ? "" : "|"), first = FALSE;
9e8c70f9 13954 if (mask & ELF_SPARC_HWCAP_POPC)
32ec8896 13955 printf ("%spopc", first ? "" : "|"), first = FALSE;
9e8c70f9 13956 if (mask & ELF_SPARC_HWCAP_VIS)
32ec8896 13957 printf ("%svis", first ? "" : "|"), first = FALSE;
9e8c70f9 13958 if (mask & ELF_SPARC_HWCAP_VIS2)
32ec8896 13959 printf ("%svis2", first ? "" : "|"), first = FALSE;
9e8c70f9 13960 if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
32ec8896 13961 printf ("%sASIBlkInit", first ? "" : "|"), first = FALSE;
9e8c70f9 13962 if (mask & ELF_SPARC_HWCAP_FMAF)
32ec8896 13963 printf ("%sfmaf", first ? "" : "|"), first = FALSE;
9e8c70f9 13964 if (mask & ELF_SPARC_HWCAP_VIS3)
32ec8896 13965 printf ("%svis3", first ? "" : "|"), first = FALSE;
9e8c70f9 13966 if (mask & ELF_SPARC_HWCAP_HPC)
32ec8896 13967 printf ("%shpc", first ? "" : "|"), first = FALSE;
9e8c70f9 13968 if (mask & ELF_SPARC_HWCAP_RANDOM)
32ec8896 13969 printf ("%srandom", first ? "" : "|"), first = FALSE;
9e8c70f9 13970 if (mask & ELF_SPARC_HWCAP_TRANS)
32ec8896 13971 printf ("%strans", first ? "" : "|"), first = FALSE;
9e8c70f9 13972 if (mask & ELF_SPARC_HWCAP_FJFMAU)
32ec8896 13973 printf ("%sfjfmau", first ? "" : "|"), first = FALSE;
9e8c70f9 13974 if (mask & ELF_SPARC_HWCAP_IMA)
32ec8896 13975 printf ("%sima", first ? "" : "|"), first = FALSE;
9e8c70f9 13976 if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
32ec8896 13977 printf ("%scspare", first ? "" : "|"), first = FALSE;
9e8c70f9
DM
13978 }
13979 else
071436c6
NC
13980 fputc ('0', stdout);
13981 fputc ('\n', stdout);
9e8c70f9
DM
13982}
13983
3d68f91c 13984static void
60abdbed 13985display_sparc_hwcaps2 (unsigned int mask)
3d68f91c
JM
13986{
13987 if (mask)
13988 {
32ec8896 13989 bfd_boolean first = TRUE;
071436c6 13990
3d68f91c 13991 if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
32ec8896 13992 fputs ("fjathplus", stdout), first = FALSE;
3d68f91c 13993 if (mask & ELF_SPARC_HWCAP2_VIS3B)
32ec8896 13994 printf ("%svis3b", first ? "" : "|"), first = FALSE;
3d68f91c 13995 if (mask & ELF_SPARC_HWCAP2_ADP)
32ec8896 13996 printf ("%sadp", first ? "" : "|"), first = FALSE;
3d68f91c 13997 if (mask & ELF_SPARC_HWCAP2_SPARC5)
32ec8896 13998 printf ("%ssparc5", first ? "" : "|"), first = FALSE;
3d68f91c 13999 if (mask & ELF_SPARC_HWCAP2_MWAIT)
32ec8896 14000 printf ("%smwait", first ? "" : "|"), first = FALSE;
3d68f91c 14001 if (mask & ELF_SPARC_HWCAP2_XMPMUL)
32ec8896 14002 printf ("%sxmpmul", first ? "" : "|"), first = FALSE;
3d68f91c 14003 if (mask & ELF_SPARC_HWCAP2_XMONT)
32ec8896 14004 printf ("%sxmont2", first ? "" : "|"), first = FALSE;
3d68f91c 14005 if (mask & ELF_SPARC_HWCAP2_NSEC)
32ec8896 14006 printf ("%snsec", first ? "" : "|"), first = FALSE;
3d68f91c 14007 if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
32ec8896 14008 printf ("%sfjathhpc", first ? "" : "|"), first = FALSE;
3d68f91c 14009 if (mask & ELF_SPARC_HWCAP2_FJDES)
32ec8896 14010 printf ("%sfjdes", first ? "" : "|"), first = FALSE;
3d68f91c 14011 if (mask & ELF_SPARC_HWCAP2_FJAES)
32ec8896 14012 printf ("%sfjaes", first ? "" : "|"), first = FALSE;
3d68f91c
JM
14013 }
14014 else
071436c6
NC
14015 fputc ('0', stdout);
14016 fputc ('\n', stdout);
3d68f91c
JM
14017}
14018
9e8c70f9 14019static unsigned char *
f6f0e17b 14020display_sparc_gnu_attribute (unsigned char * p,
60abdbed 14021 unsigned int tag,
f6f0e17b 14022 const unsigned char * const end)
9e8c70f9 14023{
3d68f91c
JM
14024 unsigned int len;
14025 int val;
14026
9e8c70f9
DM
14027 if (tag == Tag_GNU_Sparc_HWCAPS)
14028 {
f6f0e17b 14029 val = read_uleb128 (p, &len, end);
9e8c70f9
DM
14030 p += len;
14031 printf (" Tag_GNU_Sparc_HWCAPS: ");
9e8c70f9
DM
14032 display_sparc_hwcaps (val);
14033 return p;
3d68f91c
JM
14034 }
14035 if (tag == Tag_GNU_Sparc_HWCAPS2)
14036 {
14037 val = read_uleb128 (p, &len, end);
14038 p += len;
14039 printf (" Tag_GNU_Sparc_HWCAPS2: ");
14040 display_sparc_hwcaps2 (val);
14041 return p;
14042 }
9e8c70f9 14043
f6f0e17b 14044 return display_tag_value (tag, p, end);
9e8c70f9
DM
14045}
14046
351cdf24 14047static void
32ec8896 14048print_mips_fp_abi_value (unsigned int val)
351cdf24
MF
14049{
14050 switch (val)
14051 {
14052 case Val_GNU_MIPS_ABI_FP_ANY:
14053 printf (_("Hard or soft float\n"));
14054 break;
14055 case Val_GNU_MIPS_ABI_FP_DOUBLE:
14056 printf (_("Hard float (double precision)\n"));
14057 break;
14058 case Val_GNU_MIPS_ABI_FP_SINGLE:
14059 printf (_("Hard float (single precision)\n"));
14060 break;
14061 case Val_GNU_MIPS_ABI_FP_SOFT:
14062 printf (_("Soft float\n"));
14063 break;
14064 case Val_GNU_MIPS_ABI_FP_OLD_64:
14065 printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
14066 break;
14067 case Val_GNU_MIPS_ABI_FP_XX:
14068 printf (_("Hard float (32-bit CPU, Any FPU)\n"));
14069 break;
14070 case Val_GNU_MIPS_ABI_FP_64:
14071 printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
14072 break;
14073 case Val_GNU_MIPS_ABI_FP_64A:
14074 printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
14075 break;
3350cc01
CM
14076 case Val_GNU_MIPS_ABI_FP_NAN2008:
14077 printf (_("NaN 2008 compatibility\n"));
14078 break;
351cdf24
MF
14079 default:
14080 printf ("??? (%d)\n", val);
14081 break;
14082 }
14083}
14084
2cf19d5c 14085static unsigned char *
f6f0e17b 14086display_mips_gnu_attribute (unsigned char * p,
60abdbed 14087 unsigned int tag,
f6f0e17b 14088 const unsigned char * const end)
2cf19d5c 14089{
2cf19d5c
JM
14090 if (tag == Tag_GNU_MIPS_ABI_FP)
14091 {
f6f0e17b 14092 unsigned int len;
32ec8896 14093 unsigned int val;
f6f0e17b
NC
14094
14095 val = read_uleb128 (p, &len, end);
2cf19d5c
JM
14096 p += len;
14097 printf (" Tag_GNU_MIPS_ABI_FP: ");
60bca95a 14098
351cdf24
MF
14099 print_mips_fp_abi_value (val);
14100
2cf19d5c
JM
14101 return p;
14102 }
14103
a9f58168
CF
14104 if (tag == Tag_GNU_MIPS_ABI_MSA)
14105 {
14106 unsigned int len;
32ec8896 14107 unsigned int val;
a9f58168
CF
14108
14109 val = read_uleb128 (p, &len, end);
14110 p += len;
14111 printf (" Tag_GNU_MIPS_ABI_MSA: ");
14112
14113 switch (val)
14114 {
14115 case Val_GNU_MIPS_ABI_MSA_ANY:
14116 printf (_("Any MSA or not\n"));
14117 break;
14118 case Val_GNU_MIPS_ABI_MSA_128:
14119 printf (_("128-bit MSA\n"));
14120 break;
14121 default:
14122 printf ("??? (%d)\n", val);
14123 break;
14124 }
14125 return p;
14126 }
14127
f6f0e17b 14128 return display_tag_value (tag & 1, p, end);
2cf19d5c
JM
14129}
14130
59e6276b 14131static unsigned char *
f6f0e17b
NC
14132display_tic6x_attribute (unsigned char * p,
14133 const unsigned char * const end)
59e6276b 14134{
60abdbed 14135 unsigned int tag;
59e6276b
JM
14136 unsigned int len;
14137 int val;
14138
f6f0e17b 14139 tag = read_uleb128 (p, &len, end);
59e6276b
JM
14140 p += len;
14141
14142 switch (tag)
14143 {
75fa6dc1 14144 case Tag_ISA:
f6f0e17b 14145 val = read_uleb128 (p, &len, end);
59e6276b 14146 p += len;
75fa6dc1 14147 printf (" Tag_ISA: ");
59e6276b
JM
14148
14149 switch (val)
14150 {
75fa6dc1 14151 case C6XABI_Tag_ISA_none:
59e6276b
JM
14152 printf (_("None\n"));
14153 break;
75fa6dc1 14154 case C6XABI_Tag_ISA_C62X:
59e6276b
JM
14155 printf ("C62x\n");
14156 break;
75fa6dc1 14157 case C6XABI_Tag_ISA_C67X:
59e6276b
JM
14158 printf ("C67x\n");
14159 break;
75fa6dc1 14160 case C6XABI_Tag_ISA_C67XP:
59e6276b
JM
14161 printf ("C67x+\n");
14162 break;
75fa6dc1 14163 case C6XABI_Tag_ISA_C64X:
59e6276b
JM
14164 printf ("C64x\n");
14165 break;
75fa6dc1 14166 case C6XABI_Tag_ISA_C64XP:
59e6276b
JM
14167 printf ("C64x+\n");
14168 break;
75fa6dc1 14169 case C6XABI_Tag_ISA_C674X:
59e6276b
JM
14170 printf ("C674x\n");
14171 break;
14172 default:
14173 printf ("??? (%d)\n", val);
14174 break;
14175 }
14176 return p;
14177
87779176 14178 case Tag_ABI_wchar_t:
f6f0e17b 14179 val = read_uleb128 (p, &len, end);
87779176
JM
14180 p += len;
14181 printf (" Tag_ABI_wchar_t: ");
14182 switch (val)
14183 {
14184 case 0:
14185 printf (_("Not used\n"));
14186 break;
14187 case 1:
14188 printf (_("2 bytes\n"));
14189 break;
14190 case 2:
14191 printf (_("4 bytes\n"));
14192 break;
14193 default:
14194 printf ("??? (%d)\n", val);
14195 break;
14196 }
14197 return p;
14198
14199 case Tag_ABI_stack_align_needed:
f6f0e17b 14200 val = read_uleb128 (p, &len, end);
87779176
JM
14201 p += len;
14202 printf (" Tag_ABI_stack_align_needed: ");
14203 switch (val)
14204 {
14205 case 0:
14206 printf (_("8-byte\n"));
14207 break;
14208 case 1:
14209 printf (_("16-byte\n"));
14210 break;
14211 default:
14212 printf ("??? (%d)\n", val);
14213 break;
14214 }
14215 return p;
14216
14217 case Tag_ABI_stack_align_preserved:
f6f0e17b 14218 val = read_uleb128 (p, &len, end);
87779176
JM
14219 p += len;
14220 printf (" Tag_ABI_stack_align_preserved: ");
14221 switch (val)
14222 {
14223 case 0:
14224 printf (_("8-byte\n"));
14225 break;
14226 case 1:
14227 printf (_("16-byte\n"));
14228 break;
14229 default:
14230 printf ("??? (%d)\n", val);
14231 break;
14232 }
14233 return p;
14234
b5593623 14235 case Tag_ABI_DSBT:
f6f0e17b 14236 val = read_uleb128 (p, &len, end);
b5593623
JM
14237 p += len;
14238 printf (" Tag_ABI_DSBT: ");
14239 switch (val)
14240 {
14241 case 0:
14242 printf (_("DSBT addressing not used\n"));
14243 break;
14244 case 1:
14245 printf (_("DSBT addressing used\n"));
14246 break;
14247 default:
14248 printf ("??? (%d)\n", val);
14249 break;
14250 }
14251 return p;
14252
87779176 14253 case Tag_ABI_PID:
f6f0e17b 14254 val = read_uleb128 (p, &len, end);
87779176
JM
14255 p += len;
14256 printf (" Tag_ABI_PID: ");
14257 switch (val)
14258 {
14259 case 0:
14260 printf (_("Data addressing position-dependent\n"));
14261 break;
14262 case 1:
14263 printf (_("Data addressing position-independent, GOT near DP\n"));
14264 break;
14265 case 2:
14266 printf (_("Data addressing position-independent, GOT far from DP\n"));
14267 break;
14268 default:
14269 printf ("??? (%d)\n", val);
14270 break;
14271 }
14272 return p;
14273
14274 case Tag_ABI_PIC:
f6f0e17b 14275 val = read_uleb128 (p, &len, end);
87779176
JM
14276 p += len;
14277 printf (" Tag_ABI_PIC: ");
14278 switch (val)
14279 {
14280 case 0:
14281 printf (_("Code addressing position-dependent\n"));
14282 break;
14283 case 1:
14284 printf (_("Code addressing position-independent\n"));
14285 break;
14286 default:
14287 printf ("??? (%d)\n", val);
14288 break;
14289 }
14290 return p;
14291
14292 case Tag_ABI_array_object_alignment:
f6f0e17b 14293 val = read_uleb128 (p, &len, end);
87779176
JM
14294 p += len;
14295 printf (" Tag_ABI_array_object_alignment: ");
14296 switch (val)
14297 {
14298 case 0:
14299 printf (_("8-byte\n"));
14300 break;
14301 case 1:
14302 printf (_("4-byte\n"));
14303 break;
14304 case 2:
14305 printf (_("16-byte\n"));
14306 break;
14307 default:
14308 printf ("??? (%d)\n", val);
14309 break;
14310 }
14311 return p;
14312
14313 case Tag_ABI_array_object_align_expected:
f6f0e17b 14314 val = read_uleb128 (p, &len, end);
87779176
JM
14315 p += len;
14316 printf (" Tag_ABI_array_object_align_expected: ");
14317 switch (val)
14318 {
14319 case 0:
14320 printf (_("8-byte\n"));
14321 break;
14322 case 1:
14323 printf (_("4-byte\n"));
14324 break;
14325 case 2:
14326 printf (_("16-byte\n"));
14327 break;
14328 default:
14329 printf ("??? (%d)\n", val);
14330 break;
14331 }
14332 return p;
14333
3cbd1c06 14334 case Tag_ABI_compatibility:
071436c6 14335 {
071436c6
NC
14336 val = read_uleb128 (p, &len, end);
14337 p += len;
14338 printf (" Tag_ABI_compatibility: ");
071436c6 14339 printf (_("flag = %d, vendor = "), val);
4082ef84
NC
14340 if (p < end - 1)
14341 {
14342 size_t maxlen = (end - p) - 1;
14343
14344 print_symbol ((int) maxlen, (const char *) p);
14345 p += strnlen ((char *) p, maxlen) + 1;
14346 }
14347 else
14348 {
14349 printf (_("<corrupt>"));
14350 p = (unsigned char *) end;
14351 }
071436c6 14352 putchar ('\n');
071436c6
NC
14353 return p;
14354 }
87779176
JM
14355
14356 case Tag_ABI_conformance:
071436c6 14357 {
4082ef84
NC
14358 printf (" Tag_ABI_conformance: \"");
14359 if (p < end - 1)
14360 {
14361 size_t maxlen = (end - p) - 1;
071436c6 14362
4082ef84
NC
14363 print_symbol ((int) maxlen, (const char *) p);
14364 p += strnlen ((char *) p, maxlen) + 1;
14365 }
14366 else
14367 {
14368 printf (_("<corrupt>"));
14369 p = (unsigned char *) end;
14370 }
071436c6 14371 printf ("\"\n");
071436c6
NC
14372 return p;
14373 }
59e6276b
JM
14374 }
14375
f6f0e17b
NC
14376 return display_tag_value (tag, p, end);
14377}
59e6276b 14378
f6f0e17b 14379static void
60abdbed 14380display_raw_attribute (unsigned char * p, unsigned char const * const end)
f6f0e17b
NC
14381{
14382 unsigned long addr = 0;
14383 size_t bytes = end - p;
14384
e0a31db1 14385 assert (end > p);
f6f0e17b 14386 while (bytes)
87779176 14387 {
f6f0e17b
NC
14388 int j;
14389 int k;
14390 int lbytes = (bytes > 16 ? 16 : bytes);
14391
14392 printf (" 0x%8.8lx ", addr);
14393
14394 for (j = 0; j < 16; j++)
14395 {
14396 if (j < lbytes)
14397 printf ("%2.2x", p[j]);
14398 else
14399 printf (" ");
14400
14401 if ((j & 3) == 3)
14402 printf (" ");
14403 }
14404
14405 for (j = 0; j < lbytes; j++)
14406 {
14407 k = p[j];
14408 if (k >= ' ' && k < 0x7f)
14409 printf ("%c", k);
14410 else
14411 printf (".");
14412 }
14413
14414 putchar ('\n');
14415
14416 p += lbytes;
14417 bytes -= lbytes;
14418 addr += lbytes;
87779176 14419 }
59e6276b 14420
f6f0e17b 14421 putchar ('\n');
59e6276b
JM
14422}
14423
13761a11
NC
14424static unsigned char *
14425display_msp430x_attribute (unsigned char * p,
14426 const unsigned char * const end)
14427{
14428 unsigned int len;
60abdbed
NC
14429 unsigned int val;
14430 unsigned int tag;
13761a11
NC
14431
14432 tag = read_uleb128 (p, & len, end);
14433 p += len;
0b4362b0 14434
13761a11
NC
14435 switch (tag)
14436 {
14437 case OFBA_MSPABI_Tag_ISA:
14438 val = read_uleb128 (p, &len, end);
14439 p += len;
14440 printf (" Tag_ISA: ");
14441 switch (val)
14442 {
14443 case 0: printf (_("None\n")); break;
14444 case 1: printf (_("MSP430\n")); break;
14445 case 2: printf (_("MSP430X\n")); break;
14446 default: printf ("??? (%d)\n", val); break;
14447 }
14448 break;
14449
14450 case OFBA_MSPABI_Tag_Code_Model:
14451 val = read_uleb128 (p, &len, end);
14452 p += len;
14453 printf (" Tag_Code_Model: ");
14454 switch (val)
14455 {
14456 case 0: printf (_("None\n")); break;
14457 case 1: printf (_("Small\n")); break;
14458 case 2: printf (_("Large\n")); break;
14459 default: printf ("??? (%d)\n", val); break;
14460 }
14461 break;
14462
14463 case OFBA_MSPABI_Tag_Data_Model:
14464 val = read_uleb128 (p, &len, end);
14465 p += len;
14466 printf (" Tag_Data_Model: ");
14467 switch (val)
14468 {
14469 case 0: printf (_("None\n")); break;
14470 case 1: printf (_("Small\n")); break;
14471 case 2: printf (_("Large\n")); break;
14472 case 3: printf (_("Restricted Large\n")); break;
14473 default: printf ("??? (%d)\n", val); break;
14474 }
14475 break;
14476
14477 default:
14478 printf (_(" <unknown tag %d>: "), tag);
14479
14480 if (tag & 1)
14481 {
071436c6 14482 putchar ('"');
4082ef84
NC
14483 if (p < end - 1)
14484 {
14485 size_t maxlen = (end - p) - 1;
14486
14487 print_symbol ((int) maxlen, (const char *) p);
14488 p += strnlen ((char *) p, maxlen) + 1;
14489 }
14490 else
14491 {
14492 printf (_("<corrupt>"));
14493 p = (unsigned char *) end;
14494 }
071436c6 14495 printf ("\"\n");
13761a11
NC
14496 }
14497 else
14498 {
14499 val = read_uleb128 (p, &len, end);
14500 p += len;
14501 printf ("%d (0x%x)\n", val, val);
14502 }
14503 break;
14504 }
14505
4082ef84 14506 assert (p <= end);
13761a11
NC
14507 return p;
14508}
14509
32ec8896 14510static bfd_boolean
60bca95a
NC
14511process_attributes (FILE * file,
14512 const char * public_name,
104d59d1 14513 unsigned int proc_type,
f6f0e17b 14514 unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
60abdbed 14515 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const))
11c1ff18 14516{
2cf0635d 14517 Elf_Internal_Shdr * sect;
11c1ff18 14518 unsigned i;
32ec8896 14519 bfd_boolean res = TRUE;
11c1ff18
PB
14520
14521 /* Find the section header so that we get the size. */
14522 for (i = 0, sect = section_headers;
14523 i < elf_header.e_shnum;
14524 i++, sect++)
14525 {
071436c6
NC
14526 unsigned char * contents;
14527 unsigned char * p;
14528
104d59d1 14529 if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
11c1ff18
PB
14530 continue;
14531
3f5e193b
NC
14532 contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
14533 sect->sh_size, _("attributes"));
60bca95a 14534 if (contents == NULL)
32ec8896
NC
14535 {
14536 res = FALSE;
14537 continue;
14538 }
60bca95a 14539
11c1ff18 14540 p = contents;
60abdbed
NC
14541 /* The first character is the version of the attributes.
14542 Currently only version 1, (aka 'A') is recognised here. */
14543 if (*p != 'A')
32ec8896
NC
14544 {
14545 printf (_("Unknown attributes version '%c'(%d) - expecting 'A'\n"), *p, *p);
14546 res = FALSE;
14547 }
60abdbed 14548 else
11c1ff18 14549 {
071436c6
NC
14550 bfd_vma section_len;
14551
14552 section_len = sect->sh_size - 1;
11c1ff18 14553 p++;
60bca95a 14554
071436c6 14555 while (section_len > 0)
11c1ff18 14556 {
071436c6 14557 bfd_vma attr_len;
e9847026 14558 unsigned int namelen;
11c1ff18 14559 bfd_boolean public_section;
104d59d1 14560 bfd_boolean gnu_section;
11c1ff18 14561
071436c6 14562 if (section_len <= 4)
e0a31db1
NC
14563 {
14564 error (_("Tag section ends prematurely\n"));
32ec8896 14565 res = FALSE;
e0a31db1
NC
14566 break;
14567 }
071436c6 14568 attr_len = byte_get (p, 4);
11c1ff18 14569 p += 4;
60bca95a 14570
071436c6 14571 if (attr_len > section_len)
11c1ff18 14572 {
071436c6
NC
14573 error (_("Bad attribute length (%u > %u)\n"),
14574 (unsigned) attr_len, (unsigned) section_len);
14575 attr_len = section_len;
32ec8896 14576 res = FALSE;
11c1ff18 14577 }
74e1a04b 14578 /* PR 17531: file: 001-101425-0.004 */
071436c6 14579 else if (attr_len < 5)
74e1a04b 14580 {
071436c6 14581 error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
32ec8896 14582 res = FALSE;
74e1a04b
NC
14583 break;
14584 }
e9847026 14585
071436c6
NC
14586 section_len -= attr_len;
14587 attr_len -= 4;
14588
14589 namelen = strnlen ((char *) p, attr_len) + 1;
14590 if (namelen == 0 || namelen >= attr_len)
e9847026
NC
14591 {
14592 error (_("Corrupt attribute section name\n"));
32ec8896 14593 res = FALSE;
e9847026
NC
14594 break;
14595 }
14596
071436c6
NC
14597 printf (_("Attribute Section: "));
14598 print_symbol (INT_MAX, (const char *) p);
14599 putchar ('\n');
60bca95a
NC
14600
14601 if (public_name && streq ((char *) p, public_name))
11c1ff18
PB
14602 public_section = TRUE;
14603 else
14604 public_section = FALSE;
60bca95a
NC
14605
14606 if (streq ((char *) p, "gnu"))
104d59d1
JM
14607 gnu_section = TRUE;
14608 else
14609 gnu_section = FALSE;
60bca95a 14610
11c1ff18 14611 p += namelen;
071436c6 14612 attr_len -= namelen;
e0a31db1 14613
071436c6 14614 while (attr_len > 0 && p < contents + sect->sh_size)
11c1ff18 14615 {
e0a31db1 14616 int tag;
11c1ff18
PB
14617 int val;
14618 bfd_vma size;
071436c6 14619 unsigned char * end;
60bca95a 14620
e0a31db1 14621 /* PR binutils/17531: Safe handling of corrupt files. */
071436c6 14622 if (attr_len < 6)
e0a31db1
NC
14623 {
14624 error (_("Unused bytes at end of section\n"));
32ec8896 14625 res = FALSE;
e0a31db1
NC
14626 section_len = 0;
14627 break;
14628 }
14629
14630 tag = *(p++);
11c1ff18 14631 size = byte_get (p, 4);
071436c6 14632 if (size > attr_len)
11c1ff18 14633 {
e9847026 14634 error (_("Bad subsection length (%u > %u)\n"),
071436c6 14635 (unsigned) size, (unsigned) attr_len);
32ec8896 14636 res = FALSE;
071436c6 14637 size = attr_len;
11c1ff18 14638 }
e0a31db1
NC
14639 /* PR binutils/17531: Safe handling of corrupt files. */
14640 if (size < 6)
14641 {
14642 error (_("Bad subsection length (%u < 6)\n"),
14643 (unsigned) size);
32ec8896 14644 res = FALSE;
e0a31db1
NC
14645 section_len = 0;
14646 break;
14647 }
60bca95a 14648
071436c6 14649 attr_len -= size;
11c1ff18 14650 end = p + size - 1;
071436c6 14651 assert (end <= contents + sect->sh_size);
11c1ff18 14652 p += 4;
60bca95a 14653
11c1ff18
PB
14654 switch (tag)
14655 {
14656 case 1:
2b692964 14657 printf (_("File Attributes\n"));
11c1ff18
PB
14658 break;
14659 case 2:
2b692964 14660 printf (_("Section Attributes:"));
11c1ff18
PB
14661 goto do_numlist;
14662 case 3:
2b692964 14663 printf (_("Symbol Attributes:"));
1a0670f3 14664 /* Fall through. */
11c1ff18
PB
14665 do_numlist:
14666 for (;;)
14667 {
91d6fa6a 14668 unsigned int j;
60bca95a 14669
f6f0e17b 14670 val = read_uleb128 (p, &j, end);
91d6fa6a 14671 p += j;
11c1ff18
PB
14672 if (val == 0)
14673 break;
14674 printf (" %d", val);
14675 }
14676 printf ("\n");
14677 break;
14678 default:
2b692964 14679 printf (_("Unknown tag: %d\n"), tag);
11c1ff18
PB
14680 public_section = FALSE;
14681 break;
14682 }
60bca95a 14683
071436c6 14684 if (public_section && display_pub_attribute != NULL)
11c1ff18
PB
14685 {
14686 while (p < end)
f6f0e17b 14687 p = display_pub_attribute (p, end);
60abdbed 14688 assert (p == end);
104d59d1 14689 }
071436c6 14690 else if (gnu_section && display_proc_gnu_attribute != NULL)
104d59d1
JM
14691 {
14692 while (p < end)
14693 p = display_gnu_attribute (p,
f6f0e17b
NC
14694 display_proc_gnu_attribute,
14695 end);
60abdbed 14696 assert (p == end);
11c1ff18 14697 }
071436c6 14698 else if (p < end)
11c1ff18 14699 {
071436c6 14700 printf (_(" Unknown attribute:\n"));
f6f0e17b 14701 display_raw_attribute (p, end);
11c1ff18
PB
14702 p = end;
14703 }
071436c6
NC
14704 else
14705 attr_len = 0;
11c1ff18
PB
14706 }
14707 }
14708 }
d70c5fc7 14709
60bca95a 14710 free (contents);
11c1ff18 14711 }
32ec8896
NC
14712
14713 return res;
11c1ff18
PB
14714}
14715
ccb4c951
RS
14716/* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
14717 Print the Address, Access and Initial fields of an entry at VMA ADDR
82b1b41b
NC
14718 and return the VMA of the next entry, or -1 if there was a problem.
14719 Does not read from DATA_END or beyond. */
ccb4c951
RS
14720
14721static bfd_vma
82b1b41b
NC
14722print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
14723 unsigned char * data_end)
ccb4c951
RS
14724{
14725 printf (" ");
14726 print_vma (addr, LONG_HEX);
14727 printf (" ");
14728 if (addr < pltgot + 0xfff0)
14729 printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
14730 else
14731 printf ("%10s", "");
14732 printf (" ");
14733 if (data == NULL)
2b692964 14734 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
ccb4c951
RS
14735 else
14736 {
14737 bfd_vma entry;
82b1b41b 14738 unsigned char * from = data + addr - pltgot;
ccb4c951 14739
82b1b41b
NC
14740 if (from + (is_32bit_elf ? 4 : 8) > data_end)
14741 {
14742 warn (_("MIPS GOT entry extends beyond the end of available data\n"));
14743 printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
14744 return (bfd_vma) -1;
14745 }
14746 else
14747 {
14748 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14749 print_vma (entry, LONG_HEX);
14750 }
ccb4c951
RS
14751 }
14752 return addr + (is_32bit_elf ? 4 : 8);
14753}
14754
861fb55a
DJ
14755/* DATA points to the contents of a MIPS PLT GOT that starts at VMA
14756 PLTGOT. Print the Address and Initial fields of an entry at VMA
14757 ADDR and return the VMA of the next entry. */
14758
14759static bfd_vma
2cf0635d 14760print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
861fb55a
DJ
14761{
14762 printf (" ");
14763 print_vma (addr, LONG_HEX);
14764 printf (" ");
14765 if (data == NULL)
2b692964 14766 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
861fb55a
DJ
14767 else
14768 {
14769 bfd_vma entry;
14770
14771 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14772 print_vma (entry, LONG_HEX);
14773 }
14774 return addr + (is_32bit_elf ? 4 : 8);
14775}
14776
351cdf24
MF
14777static void
14778print_mips_ases (unsigned int mask)
14779{
14780 if (mask & AFL_ASE_DSP)
14781 fputs ("\n\tDSP ASE", stdout);
14782 if (mask & AFL_ASE_DSPR2)
14783 fputs ("\n\tDSP R2 ASE", stdout);
8f4f9071
MF
14784 if (mask & AFL_ASE_DSPR3)
14785 fputs ("\n\tDSP R3 ASE", stdout);
351cdf24
MF
14786 if (mask & AFL_ASE_EVA)
14787 fputs ("\n\tEnhanced VA Scheme", stdout);
14788 if (mask & AFL_ASE_MCU)
14789 fputs ("\n\tMCU (MicroController) ASE", stdout);
14790 if (mask & AFL_ASE_MDMX)
14791 fputs ("\n\tMDMX ASE", stdout);
14792 if (mask & AFL_ASE_MIPS3D)
14793 fputs ("\n\tMIPS-3D ASE", stdout);
14794 if (mask & AFL_ASE_MT)
14795 fputs ("\n\tMT ASE", stdout);
14796 if (mask & AFL_ASE_SMARTMIPS)
14797 fputs ("\n\tSmartMIPS ASE", stdout);
14798 if (mask & AFL_ASE_VIRT)
14799 fputs ("\n\tVZ ASE", stdout);
14800 if (mask & AFL_ASE_MSA)
14801 fputs ("\n\tMSA ASE", stdout);
14802 if (mask & AFL_ASE_MIPS16)
14803 fputs ("\n\tMIPS16 ASE", stdout);
14804 if (mask & AFL_ASE_MICROMIPS)
14805 fputs ("\n\tMICROMIPS ASE", stdout);
14806 if (mask & AFL_ASE_XPA)
14807 fputs ("\n\tXPA ASE", stdout);
14808 if (mask == 0)
14809 fprintf (stdout, "\n\t%s", _("None"));
00ac7aa0
MF
14810 else if ((mask & ~AFL_ASE_MASK) != 0)
14811 fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
351cdf24
MF
14812}
14813
14814static void
14815print_mips_isa_ext (unsigned int isa_ext)
14816{
14817 switch (isa_ext)
14818 {
14819 case 0:
14820 fputs (_("None"), stdout);
14821 break;
14822 case AFL_EXT_XLR:
14823 fputs ("RMI XLR", stdout);
14824 break;
2c629856
N
14825 case AFL_EXT_OCTEON3:
14826 fputs ("Cavium Networks Octeon3", stdout);
14827 break;
351cdf24
MF
14828 case AFL_EXT_OCTEON2:
14829 fputs ("Cavium Networks Octeon2", stdout);
14830 break;
14831 case AFL_EXT_OCTEONP:
14832 fputs ("Cavium Networks OcteonP", stdout);
14833 break;
14834 case AFL_EXT_LOONGSON_3A:
14835 fputs ("Loongson 3A", stdout);
14836 break;
14837 case AFL_EXT_OCTEON:
14838 fputs ("Cavium Networks Octeon", stdout);
14839 break;
14840 case AFL_EXT_5900:
14841 fputs ("Toshiba R5900", stdout);
14842 break;
14843 case AFL_EXT_4650:
14844 fputs ("MIPS R4650", stdout);
14845 break;
14846 case AFL_EXT_4010:
14847 fputs ("LSI R4010", stdout);
14848 break;
14849 case AFL_EXT_4100:
14850 fputs ("NEC VR4100", stdout);
14851 break;
14852 case AFL_EXT_3900:
14853 fputs ("Toshiba R3900", stdout);
14854 break;
14855 case AFL_EXT_10000:
14856 fputs ("MIPS R10000", stdout);
14857 break;
14858 case AFL_EXT_SB1:
14859 fputs ("Broadcom SB-1", stdout);
14860 break;
14861 case AFL_EXT_4111:
14862 fputs ("NEC VR4111/VR4181", stdout);
14863 break;
14864 case AFL_EXT_4120:
14865 fputs ("NEC VR4120", stdout);
14866 break;
14867 case AFL_EXT_5400:
14868 fputs ("NEC VR5400", stdout);
14869 break;
14870 case AFL_EXT_5500:
14871 fputs ("NEC VR5500", stdout);
14872 break;
14873 case AFL_EXT_LOONGSON_2E:
14874 fputs ("ST Microelectronics Loongson 2E", stdout);
14875 break;
14876 case AFL_EXT_LOONGSON_2F:
14877 fputs ("ST Microelectronics Loongson 2F", stdout);
14878 break;
14879 default:
00ac7aa0 14880 fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
351cdf24
MF
14881 }
14882}
14883
32ec8896 14884static signed int
351cdf24
MF
14885get_mips_reg_size (int reg_size)
14886{
14887 return (reg_size == AFL_REG_NONE) ? 0
14888 : (reg_size == AFL_REG_32) ? 32
14889 : (reg_size == AFL_REG_64) ? 64
14890 : (reg_size == AFL_REG_128) ? 128
14891 : -1;
14892}
14893
32ec8896 14894static bfd_boolean
2cf0635d 14895process_mips_specific (FILE * file)
5b18a4bc 14896{
2cf0635d 14897 Elf_Internal_Dyn * entry;
351cdf24 14898 Elf_Internal_Shdr *sect = NULL;
19e6b90e
L
14899 size_t liblist_offset = 0;
14900 size_t liblistno = 0;
14901 size_t conflictsno = 0;
14902 size_t options_offset = 0;
14903 size_t conflicts_offset = 0;
861fb55a
DJ
14904 size_t pltrelsz = 0;
14905 size_t pltrel = 0;
ccb4c951 14906 bfd_vma pltgot = 0;
861fb55a
DJ
14907 bfd_vma mips_pltgot = 0;
14908 bfd_vma jmprel = 0;
ccb4c951
RS
14909 bfd_vma local_gotno = 0;
14910 bfd_vma gotsym = 0;
14911 bfd_vma symtabno = 0;
32ec8896 14912 bfd_boolean res = TRUE;
103f02d3 14913
32ec8896
NC
14914 if (! process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14915 display_mips_gnu_attribute))
14916 res = FALSE;
2cf19d5c 14917
351cdf24
MF
14918 sect = find_section (".MIPS.abiflags");
14919
14920 if (sect != NULL)
14921 {
14922 Elf_External_ABIFlags_v0 *abiflags_ext;
14923 Elf_Internal_ABIFlags_v0 abiflags_in;
14924
14925 if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
32ec8896
NC
14926 {
14927 error (_("Corrupt MIPS ABI Flags section.\n"));
14928 res = FALSE;
14929 }
351cdf24
MF
14930 else
14931 {
14932 abiflags_ext = get_data (NULL, file, sect->sh_offset, 1,
14933 sect->sh_size, _("MIPS ABI Flags section"));
14934 if (abiflags_ext)
14935 {
14936 abiflags_in.version = BYTE_GET (abiflags_ext->version);
14937 abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
14938 abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
14939 abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
14940 abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
14941 abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
14942 abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
14943 abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
14944 abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
14945 abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
14946 abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
14947
14948 printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
14949 printf ("\nISA: MIPS%d", abiflags_in.isa_level);
14950 if (abiflags_in.isa_rev > 1)
14951 printf ("r%d", abiflags_in.isa_rev);
14952 printf ("\nGPR size: %d",
14953 get_mips_reg_size (abiflags_in.gpr_size));
14954 printf ("\nCPR1 size: %d",
14955 get_mips_reg_size (abiflags_in.cpr1_size));
14956 printf ("\nCPR2 size: %d",
14957 get_mips_reg_size (abiflags_in.cpr2_size));
14958 fputs ("\nFP ABI: ", stdout);
14959 print_mips_fp_abi_value (abiflags_in.fp_abi);
14960 fputs ("ISA Extension: ", stdout);
14961 print_mips_isa_ext (abiflags_in.isa_ext);
14962 fputs ("\nASEs:", stdout);
14963 print_mips_ases (abiflags_in.ases);
14964 printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
14965 printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
14966 fputc ('\n', stdout);
14967 free (abiflags_ext);
14968 }
14969 }
14970 }
14971
19e6b90e
L
14972 /* We have a lot of special sections. Thanks SGI! */
14973 if (dynamic_section == NULL)
14974 /* No information available. */
32ec8896 14975 return res;
252b5132 14976
071436c6
NC
14977 for (entry = dynamic_section;
14978 /* PR 17531 file: 012-50589-0.004. */
14979 entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
14980 ++entry)
252b5132
RH
14981 switch (entry->d_tag)
14982 {
14983 case DT_MIPS_LIBLIST:
d93f0186
NC
14984 liblist_offset
14985 = offset_from_vma (file, entry->d_un.d_val,
14986 liblistno * sizeof (Elf32_External_Lib));
252b5132
RH
14987 break;
14988 case DT_MIPS_LIBLISTNO:
14989 liblistno = entry->d_un.d_val;
14990 break;
14991 case DT_MIPS_OPTIONS:
d93f0186 14992 options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
252b5132
RH
14993 break;
14994 case DT_MIPS_CONFLICT:
d93f0186
NC
14995 conflicts_offset
14996 = offset_from_vma (file, entry->d_un.d_val,
14997 conflictsno * sizeof (Elf32_External_Conflict));
252b5132
RH
14998 break;
14999 case DT_MIPS_CONFLICTNO:
15000 conflictsno = entry->d_un.d_val;
15001 break;
ccb4c951 15002 case DT_PLTGOT:
861fb55a
DJ
15003 pltgot = entry->d_un.d_ptr;
15004 break;
ccb4c951
RS
15005 case DT_MIPS_LOCAL_GOTNO:
15006 local_gotno = entry->d_un.d_val;
15007 break;
15008 case DT_MIPS_GOTSYM:
15009 gotsym = entry->d_un.d_val;
15010 break;
15011 case DT_MIPS_SYMTABNO:
15012 symtabno = entry->d_un.d_val;
15013 break;
861fb55a
DJ
15014 case DT_MIPS_PLTGOT:
15015 mips_pltgot = entry->d_un.d_ptr;
15016 break;
15017 case DT_PLTREL:
15018 pltrel = entry->d_un.d_val;
15019 break;
15020 case DT_PLTRELSZ:
15021 pltrelsz = entry->d_un.d_val;
15022 break;
15023 case DT_JMPREL:
15024 jmprel = entry->d_un.d_ptr;
15025 break;
252b5132
RH
15026 default:
15027 break;
15028 }
15029
15030 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
15031 {
2cf0635d 15032 Elf32_External_Lib * elib;
252b5132
RH
15033 size_t cnt;
15034
3f5e193b
NC
15035 elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
15036 liblistno,
15037 sizeof (Elf32_External_Lib),
9cf03b7e 15038 _("liblist section data"));
a6e9f9df 15039 if (elib)
252b5132 15040 {
2b692964 15041 printf (_("\nSection '.liblist' contains %lu entries:\n"),
a6e9f9df 15042 (unsigned long) liblistno);
2b692964 15043 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
a6e9f9df
AM
15044 stdout);
15045
15046 for (cnt = 0; cnt < liblistno; ++cnt)
252b5132 15047 {
a6e9f9df 15048 Elf32_Lib liblist;
91d6fa6a 15049 time_t atime;
d5b07ef4 15050 char timebuf[128];
2cf0635d 15051 struct tm * tmp;
a6e9f9df
AM
15052
15053 liblist.l_name = BYTE_GET (elib[cnt].l_name);
91d6fa6a 15054 atime = BYTE_GET (elib[cnt].l_time_stamp);
a6e9f9df
AM
15055 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
15056 liblist.l_version = BYTE_GET (elib[cnt].l_version);
15057 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
15058
91d6fa6a 15059 tmp = gmtime (&atime);
e9e44622
JJ
15060 snprintf (timebuf, sizeof (timebuf),
15061 "%04u-%02u-%02uT%02u:%02u:%02u",
15062 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
15063 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
a6e9f9df 15064
31104126 15065 printf ("%3lu: ", (unsigned long) cnt);
d79b3d50
NC
15066 if (VALID_DYNAMIC_NAME (liblist.l_name))
15067 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
15068 else
2b692964 15069 printf (_("<corrupt: %9ld>"), liblist.l_name);
31104126
NC
15070 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
15071 liblist.l_version);
a6e9f9df
AM
15072
15073 if (liblist.l_flags == 0)
2b692964 15074 puts (_(" NONE"));
a6e9f9df
AM
15075 else
15076 {
15077 static const struct
252b5132 15078 {
2cf0635d 15079 const char * name;
a6e9f9df 15080 int bit;
252b5132 15081 }
a6e9f9df
AM
15082 l_flags_vals[] =
15083 {
15084 { " EXACT_MATCH", LL_EXACT_MATCH },
15085 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
15086 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
15087 { " EXPORTS", LL_EXPORTS },
15088 { " DELAY_LOAD", LL_DELAY_LOAD },
15089 { " DELTA", LL_DELTA }
15090 };
15091 int flags = liblist.l_flags;
15092 size_t fcnt;
15093
60bca95a 15094 for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
a6e9f9df
AM
15095 if ((flags & l_flags_vals[fcnt].bit) != 0)
15096 {
15097 fputs (l_flags_vals[fcnt].name, stdout);
15098 flags ^= l_flags_vals[fcnt].bit;
15099 }
15100 if (flags != 0)
15101 printf (" %#x", (unsigned int) flags);
252b5132 15102
a6e9f9df
AM
15103 puts ("");
15104 }
252b5132 15105 }
252b5132 15106
a6e9f9df
AM
15107 free (elib);
15108 }
32ec8896
NC
15109 else
15110 res = FALSE;
252b5132
RH
15111 }
15112
15113 if (options_offset != 0)
15114 {
2cf0635d 15115 Elf_External_Options * eopt;
2cf0635d
NC
15116 Elf_Internal_Options * iopt;
15117 Elf_Internal_Options * option;
252b5132
RH
15118 size_t offset;
15119 int cnt;
351cdf24 15120 sect = section_headers;
252b5132
RH
15121
15122 /* Find the section header so that we get the size. */
071436c6 15123 sect = find_section_by_type (SHT_MIPS_OPTIONS);
948f632f 15124 /* PR 17533 file: 012-277276-0.004. */
071436c6
NC
15125 if (sect == NULL)
15126 {
15127 error (_("No MIPS_OPTIONS header found\n"));
32ec8896 15128 return FALSE;
071436c6 15129 }
252b5132 15130
3f5e193b
NC
15131 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
15132 sect->sh_size, _("options"));
a6e9f9df 15133 if (eopt)
252b5132 15134 {
3f5e193b
NC
15135 iopt = (Elf_Internal_Options *)
15136 cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
a6e9f9df
AM
15137 if (iopt == NULL)
15138 {
fb324ee9 15139 error (_("Out of memory allocating space for MIPS options\n"));
32ec8896 15140 return FALSE;
a6e9f9df 15141 }
76da6bbe 15142
a6e9f9df
AM
15143 offset = cnt = 0;
15144 option = iopt;
252b5132 15145
82b1b41b 15146 while (offset <= sect->sh_size - sizeof (* eopt))
a6e9f9df 15147 {
2cf0635d 15148 Elf_External_Options * eoption;
252b5132 15149
a6e9f9df 15150 eoption = (Elf_External_Options *) ((char *) eopt + offset);
252b5132 15151
a6e9f9df
AM
15152 option->kind = BYTE_GET (eoption->kind);
15153 option->size = BYTE_GET (eoption->size);
15154 option->section = BYTE_GET (eoption->section);
15155 option->info = BYTE_GET (eoption->info);
76da6bbe 15156
82b1b41b
NC
15157 /* PR 17531: file: ffa0fa3b. */
15158 if (option->size < sizeof (* eopt)
15159 || offset + option->size > sect->sh_size)
15160 {
55325047 15161 error (_("Invalid size (%u) for MIPS option\n"), option->size);
32ec8896 15162 return FALSE;
82b1b41b 15163 }
a6e9f9df 15164 offset += option->size;
14ae95f2 15165
a6e9f9df
AM
15166 ++option;
15167 ++cnt;
15168 }
252b5132 15169
a6e9f9df 15170 printf (_("\nSection '%s' contains %d entries:\n"),
74e1a04b 15171 printable_section_name (sect), cnt);
76da6bbe 15172
a6e9f9df 15173 option = iopt;
82b1b41b 15174 offset = 0;
252b5132 15175
a6e9f9df 15176 while (cnt-- > 0)
252b5132 15177 {
a6e9f9df
AM
15178 size_t len;
15179
15180 switch (option->kind)
252b5132 15181 {
a6e9f9df
AM
15182 case ODK_NULL:
15183 /* This shouldn't happen. */
15184 printf (" NULL %d %lx", option->section, option->info);
15185 break;
15186 case ODK_REGINFO:
15187 printf (" REGINFO ");
15188 if (elf_header.e_machine == EM_MIPS)
15189 {
15190 /* 32bit form. */
2cf0635d 15191 Elf32_External_RegInfo * ereg;
b34976b6 15192 Elf32_RegInfo reginfo;
a6e9f9df
AM
15193
15194 ereg = (Elf32_External_RegInfo *) (option + 1);
15195 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
15196 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
15197 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
15198 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
15199 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
15200 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
15201
15202 printf ("GPR %08lx GP 0x%lx\n",
15203 reginfo.ri_gprmask,
15204 (unsigned long) reginfo.ri_gp_value);
15205 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
15206 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
15207 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
15208 }
15209 else
15210 {
15211 /* 64 bit form. */
2cf0635d 15212 Elf64_External_RegInfo * ereg;
a6e9f9df
AM
15213 Elf64_Internal_RegInfo reginfo;
15214
15215 ereg = (Elf64_External_RegInfo *) (option + 1);
15216 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
15217 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
15218 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
15219 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
15220 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
66543521 15221 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
a6e9f9df
AM
15222
15223 printf ("GPR %08lx GP 0x",
15224 reginfo.ri_gprmask);
15225 printf_vma (reginfo.ri_gp_value);
15226 printf ("\n");
15227
15228 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
15229 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
15230 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
15231 }
15232 ++option;
15233 continue;
15234 case ODK_EXCEPTIONS:
15235 fputs (" EXCEPTIONS fpe_min(", stdout);
15236 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
15237 fputs (") fpe_max(", stdout);
15238 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
15239 fputs (")", stdout);
15240
15241 if (option->info & OEX_PAGE0)
15242 fputs (" PAGE0", stdout);
15243 if (option->info & OEX_SMM)
15244 fputs (" SMM", stdout);
15245 if (option->info & OEX_FPDBUG)
15246 fputs (" FPDBUG", stdout);
15247 if (option->info & OEX_DISMISS)
15248 fputs (" DISMISS", stdout);
15249 break;
15250 case ODK_PAD:
15251 fputs (" PAD ", stdout);
15252 if (option->info & OPAD_PREFIX)
15253 fputs (" PREFIX", stdout);
15254 if (option->info & OPAD_POSTFIX)
15255 fputs (" POSTFIX", stdout);
15256 if (option->info & OPAD_SYMBOL)
15257 fputs (" SYMBOL", stdout);
15258 break;
15259 case ODK_HWPATCH:
15260 fputs (" HWPATCH ", stdout);
15261 if (option->info & OHW_R4KEOP)
15262 fputs (" R4KEOP", stdout);
15263 if (option->info & OHW_R8KPFETCH)
15264 fputs (" R8KPFETCH", stdout);
15265 if (option->info & OHW_R5KEOP)
15266 fputs (" R5KEOP", stdout);
15267 if (option->info & OHW_R5KCVTL)
15268 fputs (" R5KCVTL", stdout);
15269 break;
15270 case ODK_FILL:
15271 fputs (" FILL ", stdout);
15272 /* XXX Print content of info word? */
15273 break;
15274 case ODK_TAGS:
15275 fputs (" TAGS ", stdout);
15276 /* XXX Print content of info word? */
15277 break;
15278 case ODK_HWAND:
15279 fputs (" HWAND ", stdout);
15280 if (option->info & OHWA0_R4KEOP_CHECKED)
15281 fputs (" R4KEOP_CHECKED", stdout);
15282 if (option->info & OHWA0_R4KEOP_CLEAN)
15283 fputs (" R4KEOP_CLEAN", stdout);
15284 break;
15285 case ODK_HWOR:
15286 fputs (" HWOR ", stdout);
15287 if (option->info & OHWA0_R4KEOP_CHECKED)
15288 fputs (" R4KEOP_CHECKED", stdout);
15289 if (option->info & OHWA0_R4KEOP_CLEAN)
15290 fputs (" R4KEOP_CLEAN", stdout);
15291 break;
15292 case ODK_GP_GROUP:
15293 printf (" GP_GROUP %#06lx self-contained %#06lx",
15294 option->info & OGP_GROUP,
15295 (option->info & OGP_SELF) >> 16);
15296 break;
15297 case ODK_IDENT:
15298 printf (" IDENT %#06lx self-contained %#06lx",
15299 option->info & OGP_GROUP,
15300 (option->info & OGP_SELF) >> 16);
15301 break;
15302 default:
15303 /* This shouldn't happen. */
15304 printf (" %3d ??? %d %lx",
15305 option->kind, option->section, option->info);
15306 break;
252b5132 15307 }
a6e9f9df 15308
2cf0635d 15309 len = sizeof (* eopt);
a6e9f9df 15310 while (len < option->size)
82b1b41b 15311 {
7e27a9d5 15312 unsigned char datum = * ((unsigned char *) eopt + offset + len);
a6e9f9df 15313
82b1b41b
NC
15314 if (ISPRINT (datum))
15315 printf ("%c", datum);
15316 else
15317 printf ("\\%03o", datum);
15318 len ++;
15319 }
a6e9f9df 15320 fputs ("\n", stdout);
82b1b41b
NC
15321
15322 offset += option->size;
252b5132 15323 ++option;
252b5132
RH
15324 }
15325
a6e9f9df 15326 free (eopt);
252b5132 15327 }
32ec8896
NC
15328 else
15329 res = FALSE;
252b5132
RH
15330 }
15331
15332 if (conflicts_offset != 0 && conflictsno != 0)
15333 {
2cf0635d 15334 Elf32_Conflict * iconf;
252b5132
RH
15335 size_t cnt;
15336
15337 if (dynamic_symbols == NULL)
15338 {
591a748a 15339 error (_("conflict list found without a dynamic symbol table\n"));
32ec8896 15340 return FALSE;
252b5132
RH
15341 }
15342
3f5e193b 15343 iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
252b5132
RH
15344 if (iconf == NULL)
15345 {
8b73c356 15346 error (_("Out of memory allocating space for dynamic conflicts\n"));
32ec8896 15347 return FALSE;
252b5132
RH
15348 }
15349
9ea033b2 15350 if (is_32bit_elf)
252b5132 15351 {
2cf0635d 15352 Elf32_External_Conflict * econf32;
a6e9f9df 15353
3f5e193b
NC
15354 econf32 = (Elf32_External_Conflict *)
15355 get_data (NULL, file, conflicts_offset, conflictsno,
15356 sizeof (* econf32), _("conflict"));
a6e9f9df 15357 if (!econf32)
32ec8896 15358 return FALSE;
252b5132
RH
15359
15360 for (cnt = 0; cnt < conflictsno; ++cnt)
15361 iconf[cnt] = BYTE_GET (econf32[cnt]);
a6e9f9df
AM
15362
15363 free (econf32);
252b5132
RH
15364 }
15365 else
15366 {
2cf0635d 15367 Elf64_External_Conflict * econf64;
a6e9f9df 15368
3f5e193b
NC
15369 econf64 = (Elf64_External_Conflict *)
15370 get_data (NULL, file, conflicts_offset, conflictsno,
15371 sizeof (* econf64), _("conflict"));
a6e9f9df 15372 if (!econf64)
32ec8896 15373 return FALSE;
252b5132
RH
15374
15375 for (cnt = 0; cnt < conflictsno; ++cnt)
15376 iconf[cnt] = BYTE_GET (econf64[cnt]);
a6e9f9df
AM
15377
15378 free (econf64);
252b5132
RH
15379 }
15380
c7e7ca54
NC
15381 printf (_("\nSection '.conflict' contains %lu entries:\n"),
15382 (unsigned long) conflictsno);
252b5132
RH
15383 puts (_(" Num: Index Value Name"));
15384
15385 for (cnt = 0; cnt < conflictsno; ++cnt)
15386 {
b34976b6 15387 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
e0a31db1
NC
15388
15389 if (iconf[cnt] >= num_dynamic_syms)
15390 printf (_("<corrupt symbol index>"));
d79b3d50 15391 else
e0a31db1
NC
15392 {
15393 Elf_Internal_Sym * psym;
15394
15395 psym = & dynamic_symbols[iconf[cnt]];
15396 print_vma (psym->st_value, FULL_HEX);
15397 putchar (' ');
15398 if (VALID_DYNAMIC_NAME (psym->st_name))
15399 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
15400 else
15401 printf (_("<corrupt: %14ld>"), psym->st_name);
15402 }
31104126 15403 putchar ('\n');
252b5132
RH
15404 }
15405
252b5132
RH
15406 free (iconf);
15407 }
15408
ccb4c951
RS
15409 if (pltgot != 0 && local_gotno != 0)
15410 {
91d6fa6a 15411 bfd_vma ent, local_end, global_end;
bbeee7ea 15412 size_t i, offset;
2cf0635d 15413 unsigned char * data;
82b1b41b 15414 unsigned char * data_end;
bbeee7ea 15415 int addr_size;
ccb4c951 15416
91d6fa6a 15417 ent = pltgot;
ccb4c951
RS
15418 addr_size = (is_32bit_elf ? 4 : 8);
15419 local_end = pltgot + local_gotno * addr_size;
ccb4c951 15420
74e1a04b
NC
15421 /* PR binutils/17533 file: 012-111227-0.004 */
15422 if (symtabno < gotsym)
15423 {
15424 error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
82b1b41b 15425 (unsigned long) gotsym, (unsigned long) symtabno);
32ec8896 15426 return FALSE;
74e1a04b 15427 }
82b1b41b 15428
74e1a04b 15429 global_end = local_end + (symtabno - gotsym) * addr_size;
82b1b41b
NC
15430 /* PR 17531: file: 54c91a34. */
15431 if (global_end < local_end)
15432 {
15433 error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
32ec8896 15434 return FALSE;
82b1b41b 15435 }
948f632f 15436
ccb4c951 15437 offset = offset_from_vma (file, pltgot, global_end - pltgot);
3f5e193b 15438 data = (unsigned char *) get_data (NULL, file, offset,
9cf03b7e
NC
15439 global_end - pltgot, 1,
15440 _("Global Offset Table data"));
59245841 15441 if (data == NULL)
32ec8896 15442 return FALSE;
82b1b41b 15443 data_end = data + (global_end - pltgot);
59245841 15444
ccb4c951
RS
15445 printf (_("\nPrimary GOT:\n"));
15446 printf (_(" Canonical gp value: "));
15447 print_vma (pltgot + 0x7ff0, LONG_HEX);
15448 printf ("\n\n");
15449
15450 printf (_(" Reserved entries:\n"));
15451 printf (_(" %*s %10s %*s Purpose\n"),
2b692964
NC
15452 addr_size * 2, _("Address"), _("Access"),
15453 addr_size * 2, _("Initial"));
82b1b41b 15454 ent = print_mips_got_entry (data, pltgot, ent, data_end);
2b692964 15455 printf (_(" Lazy resolver\n"));
82b1b41b
NC
15456 if (ent == (bfd_vma) -1)
15457 goto got_print_fail;
ccb4c951 15458 if (data
91d6fa6a 15459 && (byte_get (data + ent - pltgot, addr_size)
ccb4c951
RS
15460 >> (addr_size * 8 - 1)) != 0)
15461 {
82b1b41b 15462 ent = print_mips_got_entry (data, pltgot, ent, data_end);
2b692964 15463 printf (_(" Module pointer (GNU extension)\n"));
82b1b41b
NC
15464 if (ent == (bfd_vma) -1)
15465 goto got_print_fail;
ccb4c951
RS
15466 }
15467 printf ("\n");
15468
91d6fa6a 15469 if (ent < local_end)
ccb4c951
RS
15470 {
15471 printf (_(" Local entries:\n"));
cc5914eb 15472 printf (" %*s %10s %*s\n",
2b692964
NC
15473 addr_size * 2, _("Address"), _("Access"),
15474 addr_size * 2, _("Initial"));
91d6fa6a 15475 while (ent < local_end)
ccb4c951 15476 {
82b1b41b 15477 ent = print_mips_got_entry (data, pltgot, ent, data_end);
ccb4c951 15478 printf ("\n");
82b1b41b
NC
15479 if (ent == (bfd_vma) -1)
15480 goto got_print_fail;
ccb4c951
RS
15481 }
15482 printf ("\n");
15483 }
15484
15485 if (gotsym < symtabno)
15486 {
15487 int sym_width;
15488
15489 printf (_(" Global entries:\n"));
cc5914eb 15490 printf (" %*s %10s %*s %*s %-7s %3s %s\n",
9cf03b7e
NC
15491 addr_size * 2, _("Address"),
15492 _("Access"),
2b692964 15493 addr_size * 2, _("Initial"),
9cf03b7e
NC
15494 addr_size * 2, _("Sym.Val."),
15495 _("Type"),
15496 /* Note for translators: "Ndx" = abbreviated form of "Index". */
15497 _("Ndx"), _("Name"));
0b4362b0 15498
ccb4c951 15499 sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
e0a31db1 15500
ccb4c951
RS
15501 for (i = gotsym; i < symtabno; i++)
15502 {
82b1b41b 15503 ent = print_mips_got_entry (data, pltgot, ent, data_end);
ccb4c951 15504 printf (" ");
e0a31db1
NC
15505
15506 if (dynamic_symbols == NULL)
15507 printf (_("<no dynamic symbols>"));
15508 else if (i < num_dynamic_syms)
15509 {
15510 Elf_Internal_Sym * psym = dynamic_symbols + i;
15511
15512 print_vma (psym->st_value, LONG_HEX);
15513 printf (" %-7s %3s ",
15514 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
15515 get_symbol_index_type (psym->st_shndx));
15516
15517 if (VALID_DYNAMIC_NAME (psym->st_name))
15518 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
15519 else
15520 printf (_("<corrupt: %14ld>"), psym->st_name);
15521 }
ccb4c951 15522 else
7fc5ac57
JBG
15523 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
15524 (unsigned long) i);
e0a31db1 15525
ccb4c951 15526 printf ("\n");
82b1b41b
NC
15527 if (ent == (bfd_vma) -1)
15528 break;
ccb4c951
RS
15529 }
15530 printf ("\n");
15531 }
15532
82b1b41b 15533 got_print_fail:
ccb4c951
RS
15534 if (data)
15535 free (data);
15536 }
15537
861fb55a
DJ
15538 if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
15539 {
91d6fa6a 15540 bfd_vma ent, end;
861fb55a
DJ
15541 size_t offset, rel_offset;
15542 unsigned long count, i;
2cf0635d 15543 unsigned char * data;
861fb55a 15544 int addr_size, sym_width;
2cf0635d 15545 Elf_Internal_Rela * rels;
861fb55a
DJ
15546
15547 rel_offset = offset_from_vma (file, jmprel, pltrelsz);
15548 if (pltrel == DT_RELA)
15549 {
15550 if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
32ec8896 15551 return FALSE;
861fb55a
DJ
15552 }
15553 else
15554 {
15555 if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
32ec8896 15556 return FALSE;
861fb55a
DJ
15557 }
15558
91d6fa6a 15559 ent = mips_pltgot;
861fb55a
DJ
15560 addr_size = (is_32bit_elf ? 4 : 8);
15561 end = mips_pltgot + (2 + count) * addr_size;
15562
15563 offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
3f5e193b 15564 data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
9cf03b7e 15565 1, _("Procedure Linkage Table data"));
59245841 15566 if (data == NULL)
32ec8896 15567 return FALSE;
59245841 15568
9cf03b7e 15569 printf ("\nPLT GOT:\n\n");
861fb55a
DJ
15570 printf (_(" Reserved entries:\n"));
15571 printf (_(" %*s %*s Purpose\n"),
2b692964 15572 addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
91d6fa6a 15573 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
2b692964 15574 printf (_(" PLT lazy resolver\n"));
91d6fa6a 15575 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
2b692964 15576 printf (_(" Module pointer\n"));
861fb55a
DJ
15577 printf ("\n");
15578
15579 printf (_(" Entries:\n"));
cc5914eb 15580 printf (" %*s %*s %*s %-7s %3s %s\n",
2b692964
NC
15581 addr_size * 2, _("Address"),
15582 addr_size * 2, _("Initial"),
15583 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
861fb55a
DJ
15584 sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
15585 for (i = 0; i < count; i++)
15586 {
df97ab2a 15587 unsigned long idx = get_reloc_symindex (rels[i].r_info);
861fb55a 15588
91d6fa6a 15589 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
861fb55a 15590 printf (" ");
e0a31db1 15591
df97ab2a
MF
15592 if (idx >= num_dynamic_syms)
15593 printf (_("<corrupt symbol index: %lu>"), idx);
861fb55a 15594 else
e0a31db1 15595 {
df97ab2a 15596 Elf_Internal_Sym * psym = dynamic_symbols + idx;
e0a31db1
NC
15597
15598 print_vma (psym->st_value, LONG_HEX);
15599 printf (" %-7s %3s ",
15600 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
15601 get_symbol_index_type (psym->st_shndx));
15602 if (VALID_DYNAMIC_NAME (psym->st_name))
15603 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
15604 else
15605 printf (_("<corrupt: %14ld>"), psym->st_name);
15606 }
861fb55a
DJ
15607 printf ("\n");
15608 }
15609 printf ("\n");
15610
15611 if (data)
15612 free (data);
15613 free (rels);
15614 }
15615
32ec8896 15616 return res;
252b5132
RH
15617}
15618
32ec8896 15619static bfd_boolean
35c08157
KLC
15620process_nds32_specific (FILE * file)
15621{
15622 Elf_Internal_Shdr *sect = NULL;
15623
15624 sect = find_section (".nds32_e_flags");
15625 if (sect != NULL)
15626 {
15627 unsigned int *flag;
15628
15629 printf ("\nNDS32 elf flags section:\n");
15630 flag = get_data (NULL, file, sect->sh_offset, 1,
15631 sect->sh_size, _("NDS32 elf flags section"));
15632
32ec8896
NC
15633 if (! flag)
15634 return FALSE;
15635
35c08157
KLC
15636 switch ((*flag) & 0x3)
15637 {
15638 case 0:
15639 printf ("(VEC_SIZE):\tNo entry.\n");
15640 break;
15641 case 1:
15642 printf ("(VEC_SIZE):\t4 bytes\n");
15643 break;
15644 case 2:
15645 printf ("(VEC_SIZE):\t16 bytes\n");
15646 break;
15647 case 3:
15648 printf ("(VEC_SIZE):\treserved\n");
15649 break;
15650 }
15651 }
15652
15653 return TRUE;
15654}
15655
32ec8896 15656static bfd_boolean
2cf0635d 15657process_gnu_liblist (FILE * file)
047b2264 15658{
2cf0635d
NC
15659 Elf_Internal_Shdr * section;
15660 Elf_Internal_Shdr * string_sec;
15661 Elf32_External_Lib * elib;
15662 char * strtab;
c256ffe7 15663 size_t strtab_size;
047b2264
JJ
15664 size_t cnt;
15665 unsigned i;
32ec8896 15666 bfd_boolean res = TRUE;
047b2264
JJ
15667
15668 if (! do_arch)
32ec8896 15669 return TRUE;
047b2264
JJ
15670
15671 for (i = 0, section = section_headers;
15672 i < elf_header.e_shnum;
b34976b6 15673 i++, section++)
047b2264
JJ
15674 {
15675 switch (section->sh_type)
15676 {
15677 case SHT_GNU_LIBLIST:
4fbb74a6 15678 if (section->sh_link >= elf_header.e_shnum)
c256ffe7
JJ
15679 break;
15680
3f5e193b
NC
15681 elib = (Elf32_External_Lib *)
15682 get_data (NULL, file, section->sh_offset, 1, section->sh_size,
9cf03b7e 15683 _("liblist section data"));
047b2264
JJ
15684
15685 if (elib == NULL)
32ec8896
NC
15686 {
15687 res = FALSE;
15688 break;
15689 }
047b2264 15690
32ec8896 15691 string_sec = section_headers + section->sh_link;
3f5e193b
NC
15692 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
15693 string_sec->sh_size,
15694 _("liblist string table"));
047b2264
JJ
15695 if (strtab == NULL
15696 || section->sh_entsize != sizeof (Elf32_External_Lib))
15697 {
15698 free (elib);
2842702f 15699 free (strtab);
32ec8896 15700 res = FALSE;
047b2264
JJ
15701 break;
15702 }
59245841 15703 strtab_size = string_sec->sh_size;
047b2264
JJ
15704
15705 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
74e1a04b 15706 printable_section_name (section),
0af1713e 15707 (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
047b2264 15708
2b692964 15709 puts (_(" Library Time Stamp Checksum Version Flags"));
047b2264
JJ
15710
15711 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
15712 ++cnt)
15713 {
15714 Elf32_Lib liblist;
91d6fa6a 15715 time_t atime;
d5b07ef4 15716 char timebuf[128];
2cf0635d 15717 struct tm * tmp;
047b2264
JJ
15718
15719 liblist.l_name = BYTE_GET (elib[cnt].l_name);
91d6fa6a 15720 atime = BYTE_GET (elib[cnt].l_time_stamp);
047b2264
JJ
15721 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
15722 liblist.l_version = BYTE_GET (elib[cnt].l_version);
15723 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
15724
91d6fa6a 15725 tmp = gmtime (&atime);
e9e44622
JJ
15726 snprintf (timebuf, sizeof (timebuf),
15727 "%04u-%02u-%02uT%02u:%02u:%02u",
15728 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
15729 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
047b2264
JJ
15730
15731 printf ("%3lu: ", (unsigned long) cnt);
15732 if (do_wide)
c256ffe7 15733 printf ("%-20s", liblist.l_name < strtab_size
2b692964 15734 ? strtab + liblist.l_name : _("<corrupt>"));
047b2264 15735 else
c256ffe7 15736 printf ("%-20.20s", liblist.l_name < strtab_size
2b692964 15737 ? strtab + liblist.l_name : _("<corrupt>"));
047b2264
JJ
15738 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
15739 liblist.l_version, liblist.l_flags);
15740 }
15741
15742 free (elib);
2842702f 15743 free (strtab);
047b2264
JJ
15744 }
15745 }
15746
32ec8896 15747 return res;
047b2264
JJ
15748}
15749
9437c45b 15750static const char *
d3ba0551 15751get_note_type (unsigned e_type)
779fe533
NC
15752{
15753 static char buff[64];
103f02d3 15754
1ec5cd37
NC
15755 if (elf_header.e_type == ET_CORE)
15756 switch (e_type)
15757 {
57346661 15758 case NT_AUXV:
1ec5cd37 15759 return _("NT_AUXV (auxiliary vector)");
57346661 15760 case NT_PRSTATUS:
1ec5cd37 15761 return _("NT_PRSTATUS (prstatus structure)");
57346661 15762 case NT_FPREGSET:
1ec5cd37 15763 return _("NT_FPREGSET (floating point registers)");
57346661 15764 case NT_PRPSINFO:
1ec5cd37 15765 return _("NT_PRPSINFO (prpsinfo structure)");
57346661 15766 case NT_TASKSTRUCT:
1ec5cd37 15767 return _("NT_TASKSTRUCT (task structure)");
57346661 15768 case NT_PRXFPREG:
1ec5cd37 15769 return _("NT_PRXFPREG (user_xfpregs structure)");
e1e95dec
AM
15770 case NT_PPC_VMX:
15771 return _("NT_PPC_VMX (ppc Altivec registers)");
89eeb0bc
LM
15772 case NT_PPC_VSX:
15773 return _("NT_PPC_VSX (ppc VSX registers)");
ff826ef3
TT
15774 case NT_386_TLS:
15775 return _("NT_386_TLS (x86 TLS information)");
15776 case NT_386_IOPERM:
15777 return _("NT_386_IOPERM (x86 I/O permissions)");
4339cae0
L
15778 case NT_X86_XSTATE:
15779 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
0675e188
UW
15780 case NT_S390_HIGH_GPRS:
15781 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
d7eeb400
MS
15782 case NT_S390_TIMER:
15783 return _("NT_S390_TIMER (s390 timer register)");
15784 case NT_S390_TODCMP:
15785 return _("NT_S390_TODCMP (s390 TOD comparator register)");
15786 case NT_S390_TODPREG:
15787 return _("NT_S390_TODPREG (s390 TOD programmable register)");
15788 case NT_S390_CTRS:
15789 return _("NT_S390_CTRS (s390 control registers)");
15790 case NT_S390_PREFIX:
15791 return _("NT_S390_PREFIX (s390 prefix register)");
a367d729
AK
15792 case NT_S390_LAST_BREAK:
15793 return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
15794 case NT_S390_SYSTEM_CALL:
15795 return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
abb3f6cc
NC
15796 case NT_S390_TDB:
15797 return _("NT_S390_TDB (s390 transaction diagnostic block)");
4ef9f41a
AA
15798 case NT_S390_VXRS_LOW:
15799 return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
15800 case NT_S390_VXRS_HIGH:
15801 return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
faa9a424
UW
15802 case NT_ARM_VFP:
15803 return _("NT_ARM_VFP (arm VFP registers)");
652451f8
YZ
15804 case NT_ARM_TLS:
15805 return _("NT_ARM_TLS (AArch TLS registers)");
15806 case NT_ARM_HW_BREAK:
15807 return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
15808 case NT_ARM_HW_WATCH:
15809 return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
57346661 15810 case NT_PSTATUS:
1ec5cd37 15811 return _("NT_PSTATUS (pstatus structure)");
57346661 15812 case NT_FPREGS:
1ec5cd37 15813 return _("NT_FPREGS (floating point registers)");
57346661 15814 case NT_PSINFO:
1ec5cd37 15815 return _("NT_PSINFO (psinfo structure)");
57346661 15816 case NT_LWPSTATUS:
1ec5cd37 15817 return _("NT_LWPSTATUS (lwpstatus_t structure)");
57346661 15818 case NT_LWPSINFO:
1ec5cd37 15819 return _("NT_LWPSINFO (lwpsinfo_t structure)");
57346661 15820 case NT_WIN32PSTATUS:
1ec5cd37 15821 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
9ece1fa9
TT
15822 case NT_SIGINFO:
15823 return _("NT_SIGINFO (siginfo_t data)");
15824 case NT_FILE:
15825 return _("NT_FILE (mapped files)");
1ec5cd37
NC
15826 default:
15827 break;
15828 }
15829 else
15830 switch (e_type)
15831 {
15832 case NT_VERSION:
15833 return _("NT_VERSION (version)");
15834 case NT_ARCH:
15835 return _("NT_ARCH (architecture)");
9ef920e9
NC
15836 case NT_GNU_BUILD_ATTRIBUTE_OPEN:
15837 return _("NT_GNU_BUILD_ATTRIBUTE_OPEN");
15838 case NT_GNU_BUILD_ATTRIBUTE_FUNC:
15839 return _("NT_GNU_BUILD_ATTRIBUTE_FUNC");
1ec5cd37
NC
15840 default:
15841 break;
15842 }
15843
e9e44622 15844 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
1ec5cd37 15845 return buff;
779fe533
NC
15846}
15847
32ec8896 15848static bfd_boolean
9ece1fa9
TT
15849print_core_note (Elf_Internal_Note *pnote)
15850{
15851 unsigned int addr_size = is_32bit_elf ? 4 : 8;
15852 bfd_vma count, page_size;
15853 unsigned char *descdata, *filenames, *descend;
15854
15855 if (pnote->type != NT_FILE)
32ec8896 15856 return TRUE;
9ece1fa9
TT
15857
15858#ifndef BFD64
15859 if (!is_32bit_elf)
15860 {
15861 printf (_(" Cannot decode 64-bit note in 32-bit build\n"));
15862 /* Still "successful". */
32ec8896 15863 return TRUE;
9ece1fa9
TT
15864 }
15865#endif
15866
15867 if (pnote->descsz < 2 * addr_size)
15868 {
32ec8896
NC
15869 error (_(" Malformed note - too short for header\n"));
15870 return FALSE;
9ece1fa9
TT
15871 }
15872
15873 descdata = (unsigned char *) pnote->descdata;
15874 descend = descdata + pnote->descsz;
15875
15876 if (descdata[pnote->descsz - 1] != '\0')
15877 {
32ec8896
NC
15878 error (_(" Malformed note - does not end with \\0\n"));
15879 return FALSE;
9ece1fa9
TT
15880 }
15881
15882 count = byte_get (descdata, addr_size);
15883 descdata += addr_size;
15884
15885 page_size = byte_get (descdata, addr_size);
15886 descdata += addr_size;
15887
15888 if (pnote->descsz < 2 * addr_size + count * 3 * addr_size)
15889 {
32ec8896
NC
15890 error (_(" Malformed note - too short for supplied file count\n"));
15891 return FALSE;
9ece1fa9
TT
15892 }
15893
15894 printf (_(" Page size: "));
15895 print_vma (page_size, DEC);
15896 printf ("\n");
15897
15898 printf (_(" %*s%*s%*s\n"),
15899 (int) (2 + 2 * addr_size), _("Start"),
15900 (int) (4 + 2 * addr_size), _("End"),
15901 (int) (4 + 2 * addr_size), _("Page Offset"));
15902 filenames = descdata + count * 3 * addr_size;
595712bb 15903 while (count-- > 0)
9ece1fa9
TT
15904 {
15905 bfd_vma start, end, file_ofs;
15906
15907 if (filenames == descend)
15908 {
32ec8896
NC
15909 error (_(" Malformed note - filenames end too early\n"));
15910 return FALSE;
9ece1fa9
TT
15911 }
15912
15913 start = byte_get (descdata, addr_size);
15914 descdata += addr_size;
15915 end = byte_get (descdata, addr_size);
15916 descdata += addr_size;
15917 file_ofs = byte_get (descdata, addr_size);
15918 descdata += addr_size;
15919
15920 printf (" ");
15921 print_vma (start, FULL_HEX);
15922 printf (" ");
15923 print_vma (end, FULL_HEX);
15924 printf (" ");
15925 print_vma (file_ofs, FULL_HEX);
15926 printf ("\n %s\n", filenames);
15927
15928 filenames += 1 + strlen ((char *) filenames);
15929 }
15930
32ec8896 15931 return TRUE;
9ece1fa9
TT
15932}
15933
1118d252
RM
15934static const char *
15935get_gnu_elf_note_type (unsigned e_type)
15936{
1449284b 15937 /* NB/ Keep this switch statement in sync with print_gnu_note (). */
1118d252
RM
15938 switch (e_type)
15939 {
15940 case NT_GNU_ABI_TAG:
15941 return _("NT_GNU_ABI_TAG (ABI version tag)");
15942 case NT_GNU_HWCAP:
15943 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
15944 case NT_GNU_BUILD_ID:
15945 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
0297aed6
DM
15946 case NT_GNU_GOLD_VERSION:
15947 return _("NT_GNU_GOLD_VERSION (gold version)");
9ef920e9
NC
15948 case NT_GNU_PROPERTY_TYPE_0:
15949 return _("NT_GNU_PROPERTY_TYPE_0");
15950 case NT_GNU_BUILD_ATTRIBUTE_OPEN:
15951 return _("NT_GNU_BUILD_ATTRIBUTE_OPEN");
15952 case NT_GNU_BUILD_ATTRIBUTE_FUNC:
15953 return _("NT_GNU_BUILD_ATTRIBUTE_FUNC");
1118d252 15954 default:
1449284b
NC
15955 {
15956 static char buff[64];
1118d252 15957
1449284b
NC
15958 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15959 return buff;
15960 }
15961 }
1118d252
RM
15962}
15963
9ef920e9 15964static void
1fc87489 15965decode_x86_isa (unsigned int bitmask)
9ef920e9
NC
15966{
15967 while (bitmask)
15968 {
1fc87489 15969 unsigned int bit = bitmask & (- bitmask);
9ef920e9
NC
15970
15971 bitmask &= ~ bit;
15972 switch (bit)
15973 {
15974 case GNU_PROPERTY_X86_ISA_1_486: printf ("i486"); break;
15975 case GNU_PROPERTY_X86_ISA_1_586: printf ("586"); break;
15976 case GNU_PROPERTY_X86_ISA_1_686: printf ("686"); break;
15977 case GNU_PROPERTY_X86_ISA_1_SSE: printf ("SSE"); break;
15978 case GNU_PROPERTY_X86_ISA_1_SSE2: printf ("SSE2"); break;
15979 case GNU_PROPERTY_X86_ISA_1_SSE3: printf ("SSE3"); break;
15980 case GNU_PROPERTY_X86_ISA_1_SSSE3: printf ("SSSE3"); break;
15981 case GNU_PROPERTY_X86_ISA_1_SSE4_1: printf ("SSE4_1"); break;
15982 case GNU_PROPERTY_X86_ISA_1_SSE4_2: printf ("SSE4_2"); break;
15983 case GNU_PROPERTY_X86_ISA_1_AVX: printf ("AVX"); break;
15984 case GNU_PROPERTY_X86_ISA_1_AVX2: printf ("AVX2"); break;
15985 case GNU_PROPERTY_X86_ISA_1_AVX512F: printf ("AVX512F"); break;
15986 case GNU_PROPERTY_X86_ISA_1_AVX512CD: printf ("AVX512CD"); break;
15987 case GNU_PROPERTY_X86_ISA_1_AVX512ER: printf ("AVX512ER"); break;
15988 case GNU_PROPERTY_X86_ISA_1_AVX512PF: printf ("AVX512PF"); break;
15989 case GNU_PROPERTY_X86_ISA_1_AVX512VL: printf ("AVX512VL"); break;
15990 case GNU_PROPERTY_X86_ISA_1_AVX512DQ: printf ("AVX512DQ"); break;
15991 case GNU_PROPERTY_X86_ISA_1_AVX512BW: printf ("AVX512BW"); break;
1fc87489 15992 default: printf (_("<unknown: %x>"), bit); break;
9ef920e9
NC
15993 }
15994 if (bitmask)
15995 printf (", ");
15996 }
15997}
15998
15999static void
16000print_gnu_property_note (Elf_Internal_Note * pnote)
16001{
16002 unsigned char * ptr = (unsigned char *) pnote->descdata;
16003 unsigned char * ptr_end = ptr + pnote->descsz;
16004 unsigned int size = is_32bit_elf ? 4 : 8;
16005
16006 printf (_(" Properties: "));
16007
1fc87489 16008 if (pnote->descsz < 8 || (pnote->descsz % size) != 0)
9ef920e9
NC
16009 {
16010 printf (_("<corrupt GNU_PROPERTY_TYPE, size = %#lx>\n"), pnote->descsz);
16011 return;
16012 }
16013
1fc87489 16014 while (1)
9ef920e9 16015 {
1fc87489
L
16016 unsigned int j;
16017 unsigned int type = byte_get (ptr, 4);
16018 unsigned int datasz = byte_get (ptr + 4, 4);
9ef920e9 16019
1fc87489 16020 ptr += 8;
9ef920e9 16021
1fc87489 16022 if ((ptr + datasz) > ptr_end)
9ef920e9 16023 {
1fc87489
L
16024 printf (_("<corrupt type (%#x) datasz: %#x>\n"),
16025 type, datasz);
9ef920e9 16026 break;
1fc87489 16027 }
9ef920e9 16028
1fc87489
L
16029 if (type >= GNU_PROPERTY_LOPROC && type <= GNU_PROPERTY_HIPROC)
16030 {
16031 if (elf_header.e_machine == EM_X86_64
16032 || elf_header.e_machine == EM_IAMCU
16033 || elf_header.e_machine == EM_386)
16034 {
16035 switch (type)
16036 {
16037 case GNU_PROPERTY_X86_ISA_1_USED:
16038 printf ("x86 ISA used: ");
16039 if (datasz != 4)
16040 printf (_("<corrupt length: %#x> "), datasz);
16041 else
16042 decode_x86_isa (byte_get (ptr, 4));
16043 goto next;
9ef920e9 16044
1fc87489
L
16045 case GNU_PROPERTY_X86_ISA_1_NEEDED:
16046 printf ("x86 ISA needed: ");
16047 if (datasz != 4)
16048 printf (_("<corrupt length: %#x> "), datasz);
16049 else
16050 decode_x86_isa (byte_get (ptr, 4));
16051 goto next;
9ef920e9 16052
1fc87489
L
16053 default:
16054 break;
16055 }
16056 }
16057 }
16058 else
16059 {
16060 switch (type)
9ef920e9 16061 {
1fc87489
L
16062 case GNU_PROPERTY_STACK_SIZE:
16063 printf (_("stack size: "));
16064 if (datasz != size)
16065 printf (_("<corrupt length: %#x> "), datasz);
16066 else
16067 printf ("%#lx", (unsigned long) byte_get (ptr, size));
16068 goto next;
16069
16070 case GNU_PROPERTY_NO_COPY_ON_PROTECTED:
16071 printf ("no copy on protected ");
16072 if (datasz)
16073 printf (_("<corrupt length: %#x> "), datasz);
16074 goto next;
16075
16076 default:
9ef920e9
NC
16077 break;
16078 }
9ef920e9
NC
16079 }
16080
1fc87489
L
16081 if (type < GNU_PROPERTY_LOPROC)
16082 printf (_("<unknown type %#x data: "), type);
16083 else if (type < GNU_PROPERTY_LOUSER)
16084 printf (_("<procesor-specific type %#x data: "), type);
16085 else
16086 printf (_("<application-specific type %#x data: "), type);
16087 for (j = 0; j < datasz; ++j)
16088 printf ("%02x ", ptr[j] & 0xff);
16089 printf (">");
16090
16091next:
9ef920e9 16092 ptr += ((datasz + (size - 1)) & ~ (size - 1));
1fc87489
L
16093 if (ptr == ptr_end)
16094 break;
16095 else
9ef920e9
NC
16096 {
16097 if (do_wide)
16098 printf (", ");
16099 else
16100 printf ("\n\t");
16101 }
1fc87489
L
16102
16103 if (ptr > (ptr_end - 8))
16104 {
16105 printf (_("<corrupt descsz: %#lx>\n"), pnote->descsz);
16106 break;
16107 }
9ef920e9
NC
16108 }
16109
16110 printf ("\n");
16111}
16112
32ec8896 16113static bfd_boolean
664f90a3
TT
16114print_gnu_note (Elf_Internal_Note *pnote)
16115{
1449284b 16116 /* NB/ Keep this switch statement in sync with get_gnu_elf_note_type (). */
664f90a3
TT
16117 switch (pnote->type)
16118 {
16119 case NT_GNU_BUILD_ID:
16120 {
16121 unsigned long i;
16122
16123 printf (_(" Build ID: "));
16124 for (i = 0; i < pnote->descsz; ++i)
16125 printf ("%02x", pnote->descdata[i] & 0xff);
9cf03b7e 16126 printf ("\n");
664f90a3
TT
16127 }
16128 break;
16129
16130 case NT_GNU_ABI_TAG:
16131 {
16132 unsigned long os, major, minor, subminor;
16133 const char *osname;
16134
3102e897
NC
16135 /* PR 17531: file: 030-599401-0.004. */
16136 if (pnote->descsz < 16)
16137 {
16138 printf (_(" <corrupt GNU_ABI_TAG>\n"));
16139 break;
16140 }
16141
664f90a3
TT
16142 os = byte_get ((unsigned char *) pnote->descdata, 4);
16143 major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
16144 minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
16145 subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
16146
16147 switch (os)
16148 {
16149 case GNU_ABI_TAG_LINUX:
16150 osname = "Linux";
16151 break;
16152 case GNU_ABI_TAG_HURD:
16153 osname = "Hurd";
16154 break;
16155 case GNU_ABI_TAG_SOLARIS:
16156 osname = "Solaris";
16157 break;
16158 case GNU_ABI_TAG_FREEBSD:
16159 osname = "FreeBSD";
16160 break;
16161 case GNU_ABI_TAG_NETBSD:
16162 osname = "NetBSD";
16163 break;
14ae95f2
RM
16164 case GNU_ABI_TAG_SYLLABLE:
16165 osname = "Syllable";
16166 break;
16167 case GNU_ABI_TAG_NACL:
16168 osname = "NaCl";
16169 break;
664f90a3
TT
16170 default:
16171 osname = "Unknown";
16172 break;
16173 }
16174
16175 printf (_(" OS: %s, ABI: %ld.%ld.%ld\n"), osname,
16176 major, minor, subminor);
16177 }
16178 break;
926c5385
CC
16179
16180 case NT_GNU_GOLD_VERSION:
16181 {
16182 unsigned long i;
16183
16184 printf (_(" Version: "));
16185 for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
16186 printf ("%c", pnote->descdata[i]);
16187 printf ("\n");
16188 }
16189 break;
1449284b
NC
16190
16191 case NT_GNU_HWCAP:
16192 {
16193 unsigned long num_entries, mask;
16194
16195 /* Hardware capabilities information. Word 0 is the number of entries.
16196 Word 1 is a bitmask of enabled entries. The rest of the descriptor
16197 is a series of entries, where each entry is a single byte followed
16198 by a nul terminated string. The byte gives the bit number to test
16199 if enabled in the bitmask. */
16200 printf (_(" Hardware Capabilities: "));
16201 if (pnote->descsz < 8)
16202 {
32ec8896
NC
16203 error (_("<corrupt GNU_HWCAP>\n"));
16204 return FALSE;
1449284b
NC
16205 }
16206 num_entries = byte_get ((unsigned char *) pnote->descdata, 4);
16207 mask = byte_get ((unsigned char *) pnote->descdata + 4, 4);
16208 printf (_("num entries: %ld, enabled mask: %lx\n"), num_entries, mask);
16209 /* FIXME: Add code to display the entries... */
16210 }
16211 break;
16212
9ef920e9
NC
16213 case NT_GNU_PROPERTY_TYPE_0:
16214 print_gnu_property_note (pnote);
16215 break;
16216
1449284b
NC
16217 default:
16218 /* Handle unrecognised types. An error message should have already been
16219 created by get_gnu_elf_note_type(), so all that we need to do is to
16220 display the data. */
16221 {
16222 unsigned long i;
16223
16224 printf (_(" Description data: "));
16225 for (i = 0; i < pnote->descsz; ++i)
16226 printf ("%02x ", pnote->descdata[i] & 0xff);
16227 printf ("\n");
16228 }
16229 break;
664f90a3
TT
16230 }
16231
32ec8896 16232 return TRUE;
664f90a3
TT
16233}
16234
685080f2
NC
16235static const char *
16236get_v850_elf_note_type (enum v850_notes n_type)
16237{
16238 static char buff[64];
16239
16240 switch (n_type)
16241 {
16242 case V850_NOTE_ALIGNMENT: return _("Alignment of 8-byte objects");
16243 case V850_NOTE_DATA_SIZE: return _("Sizeof double and long double");
16244 case V850_NOTE_FPU_INFO: return _("Type of FPU support needed");
16245 case V850_NOTE_SIMD_INFO: return _("Use of SIMD instructions");
16246 case V850_NOTE_CACHE_INFO: return _("Use of cache");
16247 case V850_NOTE_MMU_INFO: return _("Use of MMU");
16248 default:
16249 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
16250 return buff;
16251 }
16252}
16253
32ec8896 16254static bfd_boolean
685080f2
NC
16255print_v850_note (Elf_Internal_Note * pnote)
16256{
16257 unsigned int val;
16258
16259 if (pnote->descsz != 4)
32ec8896
NC
16260 return FALSE;
16261
685080f2
NC
16262 val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
16263
16264 if (val == 0)
16265 {
16266 printf (_("not set\n"));
32ec8896 16267 return TRUE;
685080f2
NC
16268 }
16269
16270 switch (pnote->type)
16271 {
16272 case V850_NOTE_ALIGNMENT:
16273 switch (val)
16274 {
32ec8896
NC
16275 case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return TRUE;
16276 case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return TRUE;
685080f2
NC
16277 }
16278 break;
14ae95f2 16279
685080f2
NC
16280 case V850_NOTE_DATA_SIZE:
16281 switch (val)
16282 {
32ec8896
NC
16283 case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return TRUE;
16284 case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return TRUE;
685080f2
NC
16285 }
16286 break;
14ae95f2 16287
685080f2
NC
16288 case V850_NOTE_FPU_INFO:
16289 switch (val)
16290 {
32ec8896
NC
16291 case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return TRUE;
16292 case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return TRUE;
685080f2
NC
16293 }
16294 break;
14ae95f2 16295
685080f2
NC
16296 case V850_NOTE_MMU_INFO:
16297 case V850_NOTE_CACHE_INFO:
16298 case V850_NOTE_SIMD_INFO:
16299 if (val == EF_RH850_SIMD)
16300 {
16301 printf (_("yes\n"));
32ec8896 16302 return TRUE;
685080f2
NC
16303 }
16304 break;
16305
16306 default:
16307 /* An 'unknown note type' message will already have been displayed. */
16308 break;
16309 }
16310
16311 printf (_("unknown value: %x\n"), val);
32ec8896 16312 return FALSE;
685080f2
NC
16313}
16314
32ec8896 16315static bfd_boolean
c6056a74
SF
16316process_netbsd_elf_note (Elf_Internal_Note * pnote)
16317{
16318 unsigned int version;
16319
16320 switch (pnote->type)
16321 {
16322 case NT_NETBSD_IDENT:
16323 version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
16324 if ((version / 10000) % 100)
16325 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
16326 version, version / 100000000, (version / 1000000) % 100,
16327 (version / 10000) % 100 > 26 ? "Z" : "",
15f205b1 16328 'A' + (version / 10000) % 26);
c6056a74
SF
16329 else
16330 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
16331 version, version / 100000000, (version / 1000000) % 100,
15f205b1 16332 (version / 100) % 100);
32ec8896 16333 return TRUE;
c6056a74
SF
16334
16335 case NT_NETBSD_MARCH:
16336 printf (" NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
16337 pnote->descdata);
32ec8896 16338 return TRUE;
c6056a74
SF
16339
16340 default:
32ec8896
NC
16341 printf (" NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
16342 pnote->type);
16343 return FALSE;
c6056a74 16344 }
c6056a74
SF
16345}
16346
f4ddf30f
JB
16347static const char *
16348get_freebsd_elfcore_note_type (unsigned e_type)
16349{
f4ddf30f
JB
16350 switch (e_type)
16351 {
16352 case NT_FREEBSD_THRMISC:
16353 return _("NT_THRMISC (thrmisc structure)");
16354 case NT_FREEBSD_PROCSTAT_PROC:
16355 return _("NT_PROCSTAT_PROC (proc data)");
16356 case NT_FREEBSD_PROCSTAT_FILES:
16357 return _("NT_PROCSTAT_FILES (files data)");
16358 case NT_FREEBSD_PROCSTAT_VMMAP:
16359 return _("NT_PROCSTAT_VMMAP (vmmap data)");
16360 case NT_FREEBSD_PROCSTAT_GROUPS:
16361 return _("NT_PROCSTAT_GROUPS (groups data)");
16362 case NT_FREEBSD_PROCSTAT_UMASK:
16363 return _("NT_PROCSTAT_UMASK (umask data)");
16364 case NT_FREEBSD_PROCSTAT_RLIMIT:
16365 return _("NT_PROCSTAT_RLIMIT (rlimit data)");
16366 case NT_FREEBSD_PROCSTAT_OSREL:
16367 return _("NT_PROCSTAT_OSREL (osreldate data)");
16368 case NT_FREEBSD_PROCSTAT_PSSTRINGS:
16369 return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
16370 case NT_FREEBSD_PROCSTAT_AUXV:
16371 return _("NT_PROCSTAT_AUXV (auxv data)");
16372 }
16373 return get_note_type (e_type);
16374}
16375
9437c45b 16376static const char *
d3ba0551 16377get_netbsd_elfcore_note_type (unsigned e_type)
9437c45b
JT
16378{
16379 static char buff[64];
16380
b4db1224 16381 if (e_type == NT_NETBSDCORE_PROCINFO)
9437c45b
JT
16382 {
16383 /* NetBSD core "procinfo" structure. */
16384 return _("NetBSD procinfo structure");
16385 }
16386
16387 /* As of Jan 2002 there are no other machine-independent notes
16388 defined for NetBSD core files. If the note type is less
16389 than the start of the machine-dependent note types, we don't
16390 understand it. */
16391
b4db1224 16392 if (e_type < NT_NETBSDCORE_FIRSTMACH)
9437c45b 16393 {
e9e44622 16394 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
9437c45b
JT
16395 return buff;
16396 }
16397
16398 switch (elf_header.e_machine)
16399 {
16400 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
16401 and PT_GETFPREGS == mach+2. */
16402
16403 case EM_OLD_ALPHA:
16404 case EM_ALPHA:
16405 case EM_SPARC:
16406 case EM_SPARC32PLUS:
16407 case EM_SPARCV9:
16408 switch (e_type)
16409 {
2b692964 16410 case NT_NETBSDCORE_FIRSTMACH + 0:
b4db1224 16411 return _("PT_GETREGS (reg structure)");
2b692964 16412 case NT_NETBSDCORE_FIRSTMACH + 2:
b4db1224 16413 return _("PT_GETFPREGS (fpreg structure)");
9437c45b
JT
16414 default:
16415 break;
16416 }
16417 break;
16418
16419 /* On all other arch's, PT_GETREGS == mach+1 and
16420 PT_GETFPREGS == mach+3. */
16421 default:
16422 switch (e_type)
16423 {
2b692964 16424 case NT_NETBSDCORE_FIRSTMACH + 1:
b4db1224 16425 return _("PT_GETREGS (reg structure)");
2b692964 16426 case NT_NETBSDCORE_FIRSTMACH + 3:
b4db1224 16427 return _("PT_GETFPREGS (fpreg structure)");
9437c45b
JT
16428 default:
16429 break;
16430 }
16431 }
16432
9cf03b7e 16433 snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
e9e44622 16434 e_type - NT_NETBSDCORE_FIRSTMACH);
9437c45b
JT
16435 return buff;
16436}
16437
70616151
TT
16438static const char *
16439get_stapsdt_note_type (unsigned e_type)
16440{
16441 static char buff[64];
16442
16443 switch (e_type)
16444 {
16445 case NT_STAPSDT:
16446 return _("NT_STAPSDT (SystemTap probe descriptors)");
16447
16448 default:
16449 break;
16450 }
16451
16452 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
16453 return buff;
16454}
16455
32ec8896 16456static bfd_boolean
c6a9fc58
TT
16457print_stapsdt_note (Elf_Internal_Note *pnote)
16458{
16459 int addr_size = is_32bit_elf ? 4 : 8;
16460 char *data = pnote->descdata;
16461 char *data_end = pnote->descdata + pnote->descsz;
16462 bfd_vma pc, base_addr, semaphore;
16463 char *provider, *probe, *arg_fmt;
16464
16465 pc = byte_get ((unsigned char *) data, addr_size);
16466 data += addr_size;
16467 base_addr = byte_get ((unsigned char *) data, addr_size);
16468 data += addr_size;
16469 semaphore = byte_get ((unsigned char *) data, addr_size);
16470 data += addr_size;
16471
16472 provider = data;
16473 data += strlen (data) + 1;
16474 probe = data;
16475 data += strlen (data) + 1;
16476 arg_fmt = data;
16477 data += strlen (data) + 1;
16478
16479 printf (_(" Provider: %s\n"), provider);
16480 printf (_(" Name: %s\n"), probe);
16481 printf (_(" Location: "));
16482 print_vma (pc, FULL_HEX);
16483 printf (_(", Base: "));
16484 print_vma (base_addr, FULL_HEX);
16485 printf (_(", Semaphore: "));
16486 print_vma (semaphore, FULL_HEX);
9cf03b7e 16487 printf ("\n");
c6a9fc58
TT
16488 printf (_(" Arguments: %s\n"), arg_fmt);
16489
16490 return data == data_end;
16491}
16492
00e98fc7
TG
16493static const char *
16494get_ia64_vms_note_type (unsigned e_type)
16495{
16496 static char buff[64];
16497
16498 switch (e_type)
16499 {
16500 case NT_VMS_MHD:
16501 return _("NT_VMS_MHD (module header)");
16502 case NT_VMS_LNM:
16503 return _("NT_VMS_LNM (language name)");
16504 case NT_VMS_SRC:
16505 return _("NT_VMS_SRC (source files)");
16506 case NT_VMS_TITLE:
9cf03b7e 16507 return "NT_VMS_TITLE";
00e98fc7
TG
16508 case NT_VMS_EIDC:
16509 return _("NT_VMS_EIDC (consistency check)");
16510 case NT_VMS_FPMODE:
16511 return _("NT_VMS_FPMODE (FP mode)");
16512 case NT_VMS_LINKTIME:
9cf03b7e 16513 return "NT_VMS_LINKTIME";
00e98fc7
TG
16514 case NT_VMS_IMGNAM:
16515 return _("NT_VMS_IMGNAM (image name)");
16516 case NT_VMS_IMGID:
16517 return _("NT_VMS_IMGID (image id)");
16518 case NT_VMS_LINKID:
16519 return _("NT_VMS_LINKID (link id)");
16520 case NT_VMS_IMGBID:
16521 return _("NT_VMS_IMGBID (build id)");
16522 case NT_VMS_GSTNAM:
16523 return _("NT_VMS_GSTNAM (sym table name)");
16524 case NT_VMS_ORIG_DYN:
9cf03b7e 16525 return "NT_VMS_ORIG_DYN";
00e98fc7 16526 case NT_VMS_PATCHTIME:
9cf03b7e 16527 return "NT_VMS_PATCHTIME";
00e98fc7
TG
16528 default:
16529 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
16530 return buff;
16531 }
16532}
16533
32ec8896 16534static bfd_boolean
00e98fc7
TG
16535print_ia64_vms_note (Elf_Internal_Note * pnote)
16536{
16537 switch (pnote->type)
16538 {
16539 case NT_VMS_MHD:
16540 if (pnote->descsz > 36)
16541 {
16542 size_t l = strlen (pnote->descdata + 34);
16543 printf (_(" Creation date : %.17s\n"), pnote->descdata);
16544 printf (_(" Last patch date: %.17s\n"), pnote->descdata + 17);
16545 printf (_(" Module name : %s\n"), pnote->descdata + 34);
16546 printf (_(" Module version : %s\n"), pnote->descdata + 34 + l + 1);
16547 }
16548 else
16549 printf (_(" Invalid size\n"));
16550 break;
16551 case NT_VMS_LNM:
16552 printf (_(" Language: %s\n"), pnote->descdata);
16553 break;
16554#ifdef BFD64
16555 case NT_VMS_FPMODE:
9cf03b7e 16556 printf (_(" Floating Point mode: "));
4a5cb34f 16557 printf ("0x%016" BFD_VMA_FMT "x\n",
948f632f 16558 (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
00e98fc7
TG
16559 break;
16560 case NT_VMS_LINKTIME:
16561 printf (_(" Link time: "));
16562 print_vms_time
16563 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
16564 printf ("\n");
16565 break;
16566 case NT_VMS_PATCHTIME:
16567 printf (_(" Patch time: "));
16568 print_vms_time
16569 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
16570 printf ("\n");
16571 break;
16572 case NT_VMS_ORIG_DYN:
16573 printf (_(" Major id: %u, minor id: %u\n"),
16574 (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
16575 (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
9cf03b7e 16576 printf (_(" Last modified : "));
00e98fc7
TG
16577 print_vms_time
16578 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
9cf03b7e 16579 printf (_("\n Link flags : "));
4a5cb34f 16580 printf ("0x%016" BFD_VMA_FMT "x\n",
948f632f 16581 (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
00e98fc7 16582 printf (_(" Header flags: 0x%08x\n"),
948f632f 16583 (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
00e98fc7
TG
16584 printf (_(" Image id : %s\n"), pnote->descdata + 32);
16585 break;
16586#endif
16587 case NT_VMS_IMGNAM:
16588 printf (_(" Image name: %s\n"), pnote->descdata);
16589 break;
16590 case NT_VMS_GSTNAM:
16591 printf (_(" Global symbol table name: %s\n"), pnote->descdata);
16592 break;
16593 case NT_VMS_IMGID:
16594 printf (_(" Image id: %s\n"), pnote->descdata);
16595 break;
16596 case NT_VMS_LINKID:
16597 printf (_(" Linker id: %s\n"), pnote->descdata);
16598 break;
16599 default:
32ec8896 16600 return FALSE;
00e98fc7 16601 }
32ec8896 16602 return TRUE;
00e98fc7
TG
16603}
16604
c799a79d
NC
16605/* Print the name of the symbol associated with a build attribute
16606 that is attached to address OFFSET. */
16607
9ef920e9 16608static bfd_boolean
c799a79d
NC
16609print_symbol_for_build_attribute (FILE * file,
16610 unsigned long offset,
16611 bfd_boolean is_open_attr)
9ef920e9 16612{
c799a79d
NC
16613 static FILE * saved_file = NULL;
16614 static char * strtab;
16615 static unsigned long strtablen;
16616 static Elf_Internal_Sym * symtab;
16617 static unsigned long nsyms;
16618 Elf_Internal_Sym * saved_sym = NULL;
16619 Elf_Internal_Sym * sym;
9ef920e9 16620
c799a79d 16621 if (saved_file == NULL || file != saved_file)
9ef920e9 16622 {
c799a79d 16623 Elf_Internal_Shdr * symsec;
9ef920e9 16624
c799a79d
NC
16625 /* Load the symbol and string sections. */
16626 for (symsec = section_headers;
16627 symsec < section_headers + elf_header.e_shnum;
16628 symsec ++)
9ef920e9 16629 {
c799a79d 16630 if (symsec->sh_type == SHT_SYMTAB)
9ef920e9 16631 {
c799a79d 16632 symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms);
9ef920e9 16633
c799a79d
NC
16634 if (symsec->sh_link < elf_header.e_shnum)
16635 {
16636 Elf_Internal_Shdr * strtab_sec = section_headers + symsec->sh_link;
16637
16638 strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
16639 1, strtab_sec->sh_size,
16640 _("string table"));
16641 strtablen = strtab != NULL ? strtab_sec->sh_size : 0;
16642 }
9ef920e9
NC
16643 }
16644 }
c799a79d 16645 saved_file = file;
9ef920e9
NC
16646 }
16647
c799a79d 16648 if (symtab == NULL || strtab == NULL)
9ef920e9 16649 {
c799a79d
NC
16650 printf ("\n");
16651 return FALSE;
16652 }
9ef920e9 16653
c799a79d
NC
16654 /* Find a symbol whose value matches offset. */
16655 for (sym = symtab; sym < symtab + nsyms; sym ++)
16656 if (sym->st_value == offset)
16657 {
16658 if (sym->st_name >= strtablen)
16659 /* Huh ? This should not happen. */
16660 continue;
9ef920e9 16661
c799a79d
NC
16662 if (strtab[sym->st_name] == 0)
16663 continue;
9ef920e9 16664
c799a79d
NC
16665 if (is_open_attr)
16666 {
16667 /* For OPEN attributes we prefer GLOBAL over LOCAL symbols
16668 and FILE or OBJECT symbols over NOTYPE symbols. We skip
16669 FUNC symbols entirely. */
16670 switch (ELF_ST_TYPE (sym->st_info))
16671 {
16672 case STT_FILE:
16673 saved_sym = sym;
16674 /* We can stop searching now. */
16675 sym = symtab + nsyms;
16676 continue;
9ef920e9 16677
c799a79d
NC
16678 case STT_OBJECT:
16679 saved_sym = sym;
16680 continue;
9ef920e9 16681
c799a79d
NC
16682 case STT_FUNC:
16683 /* Ignore function symbols. */
16684 continue;
16685
16686 default:
16687 break;
16688 }
16689
16690 switch (ELF_ST_BIND (sym->st_info))
9ef920e9 16691 {
c799a79d
NC
16692 case STB_GLOBAL:
16693 if (saved_sym == NULL
16694 || ELF_ST_TYPE (saved_sym->st_info) != STT_OBJECT)
16695 saved_sym = sym;
16696 break;
c871dade 16697
c799a79d
NC
16698 case STB_LOCAL:
16699 if (saved_sym == NULL)
16700 saved_sym = sym;
16701 break;
16702
16703 default:
9ef920e9
NC
16704 break;
16705 }
16706 }
c799a79d
NC
16707 else
16708 {
16709 if (ELF_ST_TYPE (sym->st_info) != STT_FUNC)
16710 continue;
16711
16712 saved_sym = sym;
16713 break;
16714 }
16715 }
16716
16717 printf (" (%s: %s)\n",
16718 is_open_attr ? _("file") : _("func"),
16719 saved_sym ? strtab + saved_sym->st_name : _("<no symbol found>)"));
16720 return TRUE;
16721}
16722
16723static bfd_boolean
16724print_gnu_build_attribute_description (Elf_Internal_Note * pnote,
16725 FILE * file)
16726{
16727 static unsigned long global_offset = 0;
16728 unsigned long offset;
16729 unsigned int desc_size = is_32bit_elf ? 4 : 8;
16730 bfd_boolean is_open_attr = pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN;
c871dade 16731
c799a79d
NC
16732 if (pnote->descsz == 0)
16733 {
16734 if (is_open_attr)
c871dade 16735 {
c799a79d
NC
16736 printf (_(" Applies from offset %#lx\n"), global_offset);
16737 return TRUE;
16738 }
16739 else
16740 {
16741 printf (_(" Applies to func at %#lx"), global_offset);
16742 return print_symbol_for_build_attribute (file, global_offset, is_open_attr);
c871dade 16743 }
9ef920e9
NC
16744 }
16745
c799a79d
NC
16746 if (pnote->descsz != desc_size)
16747 {
16748 error (_(" <invalid description size: %lx>\n"), pnote->descsz);
16749 printf (_(" <invalid descsz>"));
16750 return FALSE;
16751 }
16752
16753 offset = byte_get ((unsigned char *) pnote->descdata, desc_size);
16754
16755 if (is_open_attr)
16756 {
16757 printf (_(" Applies from offset %#lx"), offset);
16758 global_offset = offset;
16759 }
16760 else
16761 {
16762 printf (_(" Applies to func at %#lx"), offset);
16763 }
16764
16765 return print_symbol_for_build_attribute (file, offset, is_open_attr);
9ef920e9
NC
16766}
16767
16768static bfd_boolean
16769print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
16770{
16771 char name_type;
16772 char name_attribute;
16773 char * expected_types;
16774 const char * name = pnote->namedata;
16775 const char * text;
16776 int left;
16777
16778 if (name == NULL || pnote->namesz < 2)
16779 {
16780 error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
16781 print_symbol (-20, _(" <corrupt name field>"));
16782 return FALSE;
16783 }
16784
16785 switch ((name_type = * name))
16786 {
16787 case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
16788 case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
16789 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
16790 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
16791 printf ("%c", * name);
16792 break;
16793 default:
16794 error (_("unrecognised attribute type in name field: %d\n"), name_type);
16795 print_symbol (-20, _("<unknown name type>"));
16796 return FALSE;
16797 }
16798
16799 left = 19;
16800 ++ name;
16801 text = NULL;
16802
16803 switch ((name_attribute = * name))
16804 {
16805 case GNU_BUILD_ATTRIBUTE_VERSION:
16806 text = _("<version>");
16807 expected_types = "$";
16808 ++ name;
16809 break;
16810 case GNU_BUILD_ATTRIBUTE_STACK_PROT:
16811 text = _("<stack prot>");
75d7d298 16812 expected_types = "!+*";
9ef920e9
NC
16813 ++ name;
16814 break;
16815 case GNU_BUILD_ATTRIBUTE_RELRO:
16816 text = _("<relro>");
16817 expected_types = "!+";
16818 ++ name;
16819 break;
16820 case GNU_BUILD_ATTRIBUTE_STACK_SIZE:
16821 text = _("<stack size>");
16822 expected_types = "*";
16823 ++ name;
16824 break;
16825 case GNU_BUILD_ATTRIBUTE_TOOL:
16826 text = _("<tool>");
16827 expected_types = "$";
16828 ++ name;
16829 break;
16830 case GNU_BUILD_ATTRIBUTE_ABI:
16831 text = _("<ABI>");
16832 expected_types = "$*";
16833 ++ name;
16834 break;
16835 case GNU_BUILD_ATTRIBUTE_PIC:
16836 text = _("<PIC>");
16837 expected_types = "*";
16838 ++ name;
16839 break;
a8be5506
NC
16840 case GNU_BUILD_ATTRIBUTE_SHORT_ENUM:
16841 text = _("<short enum>");
16842 expected_types = "!+";
16843 ++ name;
16844 break;
9ef920e9
NC
16845
16846 default:
16847 if (ISPRINT (* name))
16848 {
16849 int len = strnlen (name, pnote->namesz - (name - pnote->namedata)) + 1;
16850
16851 if (len > left && ! do_wide)
16852 len = left;
75d7d298 16853 printf ("%.*s:", len, name);
9ef920e9 16854 left -= len;
0dd6ae21 16855 name += len;
9ef920e9
NC
16856 }
16857 else
16858 {
16859 error (_("unexpected character in name field\n"));
16860 print_symbol (- left, _("<unknown attribute>"));
16861 return 0;
16862 }
16863 expected_types = "*$!+";
16864 break;
16865 }
16866
16867 if (text)
16868 {
16869 printf ("%s", text);
16870 left -= strlen (text);
16871 }
16872
16873 if (strchr (expected_types, name_type) == NULL)
75d7d298 16874 warn (_("attribute does not have an expected type (%c)\n"), name_type);
9ef920e9
NC
16875
16876 if ((unsigned long)(name - pnote->namedata) > pnote->namesz)
16877 {
16878 error (_("corrupt name field: namesz: %lu but parsing gets to %ld\n"),
16879 (unsigned long) pnote->namesz,
16880 (long) (name - pnote->namedata));
16881 return FALSE;
16882 }
16883
16884 if (left < 1 && ! do_wide)
16885 return TRUE;
16886
16887 switch (name_type)
16888 {
16889 case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
16890 {
75d7d298
NC
16891 unsigned int bytes = pnote->namesz - (name - pnote->namedata);
16892 unsigned long val = 0;
16893 unsigned int shift = 0;
16894 char * decoded = NULL;
9ef920e9
NC
16895
16896 while (bytes --)
16897 {
79a964dc
NC
16898 unsigned long byte = (* name ++) & 0xff;
16899
16900 val |= byte << shift;
9ef920e9
NC
16901 shift += 8;
16902 }
16903
75d7d298 16904 switch (name_attribute)
9ef920e9 16905 {
75d7d298 16906 case GNU_BUILD_ATTRIBUTE_PIC:
9ef920e9
NC
16907 switch (val)
16908 {
75d7d298
NC
16909 case 0: decoded = "static"; break;
16910 case 1: decoded = "pic"; break;
16911 case 2: decoded = "PIC"; break;
16912 case 3: decoded = "pie"; break;
16913 case 4: decoded = "PIE"; break;
16914 default: break;
9ef920e9 16915 }
75d7d298
NC
16916 break;
16917 case GNU_BUILD_ATTRIBUTE_STACK_PROT:
16918 switch (val)
9ef920e9 16919 {
75d7d298
NC
16920 /* Based upon the SPCT_FLAG_xxx enum values in gcc/cfgexpand.c. */
16921 case 0: decoded = "off"; break;
16922 case 1: decoded = "on"; break;
16923 case 2: decoded = "all"; break;
16924 case 3: decoded = "strong"; break;
16925 case 4: decoded = "explicit"; break;
16926 default: break;
9ef920e9 16927 }
75d7d298
NC
16928 break;
16929 default:
16930 break;
9ef920e9
NC
16931 }
16932
75d7d298
NC
16933 if (decoded != NULL)
16934 print_symbol (-left, decoded);
9ef920e9 16935 else
75d7d298
NC
16936 {
16937 if (do_wide)
16938 left -= printf ("0x%lx", val);
16939 else
16940 left -= printf ("0x%-.*lx", left, val);
16941 }
9ef920e9
NC
16942 }
16943 break;
16944 case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
16945 left -= print_symbol (- left, name);
16946 break;
16947 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
16948 left -= print_symbol (- left, "true");
16949 break;
16950 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
16951 left -= print_symbol (- left, "false");
16952 break;
16953 }
16954
16955 if (do_wide && left > 0)
16956 printf ("%-*s", left, " ");
16957
16958 return TRUE;
16959}
16960
6d118b09
NC
16961/* Note that by the ELF standard, the name field is already null byte
16962 terminated, and namesz includes the terminating null byte.
16963 I.E. the value of namesz for the name "FSF" is 4.
16964
e3c8793a 16965 If the value of namesz is zero, there is no name present. */
9ef920e9 16966
32ec8896 16967static bfd_boolean
9ef920e9 16968process_note (Elf_Internal_Note * pnote,
c799a79d 16969 FILE * file)
779fe533 16970{
2cf0635d
NC
16971 const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
16972 const char * nt;
9437c45b
JT
16973
16974 if (pnote->namesz == 0)
1ec5cd37
NC
16975 /* If there is no note name, then use the default set of
16976 note type strings. */
16977 nt = get_note_type (pnote->type);
16978
1118d252
RM
16979 else if (const_strneq (pnote->namedata, "GNU"))
16980 /* GNU-specific object file notes. */
16981 nt = get_gnu_elf_note_type (pnote->type);
f4ddf30f
JB
16982
16983 else if (const_strneq (pnote->namedata, "FreeBSD"))
16984 /* FreeBSD-specific core file notes. */
16985 nt = get_freebsd_elfcore_note_type (pnote->type);
1118d252 16986
0112cd26 16987 else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
1ec5cd37
NC
16988 /* NetBSD-specific core file notes. */
16989 nt = get_netbsd_elfcore_note_type (pnote->type);
16990
c6056a74
SF
16991 else if (const_strneq (pnote->namedata, "NetBSD"))
16992 /* NetBSD-specific core file notes. */
16993 return process_netbsd_elf_note (pnote);
16994
b15fa79e
AM
16995 else if (strneq (pnote->namedata, "SPU/", 4))
16996 {
16997 /* SPU-specific core file notes. */
16998 nt = pnote->namedata + 4;
16999 name = "SPU";
17000 }
17001
00e98fc7
TG
17002 else if (const_strneq (pnote->namedata, "IPF/VMS"))
17003 /* VMS/ia64-specific file notes. */
17004 nt = get_ia64_vms_note_type (pnote->type);
17005
70616151
TT
17006 else if (const_strneq (pnote->namedata, "stapsdt"))
17007 nt = get_stapsdt_note_type (pnote->type);
17008
9437c45b 17009 else
1ec5cd37
NC
17010 /* Don't recognize this note name; just use the default set of
17011 note type strings. */
00e98fc7 17012 nt = get_note_type (pnote->type);
9437c45b 17013
1449284b 17014 printf (" ");
9ef920e9
NC
17015
17016 if (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
17017 || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC)
17018 print_gnu_build_attribute_name (pnote);
17019 else
17020 print_symbol (-20, name);
17021
17022 if (do_wide)
17023 printf (" 0x%08lx\t%s\t", pnote->descsz, nt);
17024 else
17025 printf (" 0x%08lx\t%s\n", pnote->descsz, nt);
00e98fc7
TG
17026
17027 if (const_strneq (pnote->namedata, "IPF/VMS"))
17028 return print_ia64_vms_note (pnote);
664f90a3
TT
17029 else if (const_strneq (pnote->namedata, "GNU"))
17030 return print_gnu_note (pnote);
c6a9fc58
TT
17031 else if (const_strneq (pnote->namedata, "stapsdt"))
17032 return print_stapsdt_note (pnote);
9ece1fa9
TT
17033 else if (const_strneq (pnote->namedata, "CORE"))
17034 return print_core_note (pnote);
9ef920e9
NC
17035 else if (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
17036 || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC)
c799a79d 17037 return print_gnu_build_attribute_description (pnote, file);
779fe533 17038
9ef920e9 17039 if (pnote->descsz)
1449284b
NC
17040 {
17041 unsigned long i;
17042
17043 printf (_(" description data: "));
17044 for (i = 0; i < pnote->descsz; i++)
17045 printf ("%02x ", pnote->descdata[i]);
1449284b
NC
17046 }
17047
9ef920e9
NC
17048 if (do_wide)
17049 printf ("\n");
17050
32ec8896 17051 return TRUE;
1449284b 17052}
6d118b09 17053
32ec8896 17054static bfd_boolean
1449284b
NC
17055process_notes_at (FILE * file,
17056 Elf_Internal_Shdr * section,
17057 bfd_vma offset,
17058 bfd_vma length)
779fe533 17059{
2cf0635d
NC
17060 Elf_External_Note * pnotes;
17061 Elf_External_Note * external;
c8071705 17062 char * end;
32ec8896 17063 bfd_boolean res = TRUE;
103f02d3 17064
779fe533 17065 if (length <= 0)
32ec8896 17066 return FALSE;
103f02d3 17067
1449284b
NC
17068 if (section)
17069 {
17070 pnotes = (Elf_External_Note *) get_section_contents (section, file);
17071 if (pnotes)
32ec8896
NC
17072 {
17073 if (! apply_relocations (file, section, (unsigned char *) pnotes, length, NULL, NULL))
17074 return FALSE;
17075 }
1449284b
NC
17076 }
17077 else
17078 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
17079 _("notes"));
dd24e3da 17080 if (pnotes == NULL)
32ec8896 17081 return FALSE;
779fe533 17082
103f02d3 17083 external = pnotes;
103f02d3 17084
1449284b
NC
17085 if (section)
17086 printf (_("\nDisplaying notes found in: %s\n"), printable_section_name (section));
17087 else
17088 printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
17089 (unsigned long) offset, (unsigned long) length);
17090
2aee03ae 17091 printf (_(" %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
103f02d3 17092
c8071705
NC
17093 end = (char *) pnotes + length;
17094 while ((char *) external < end)
779fe533 17095 {
b34976b6 17096 Elf_Internal_Note inote;
15b42fb0
AM
17097 size_t min_notesz;
17098 char *next;
2cf0635d 17099 char * temp = NULL;
c8071705 17100 size_t data_remaining = end - (char *) external;
6d118b09 17101
00e98fc7 17102 if (!is_ia64_vms ())
15b42fb0 17103 {
9dd3a467
NC
17104 /* PR binutils/15191
17105 Make sure that there is enough data to read. */
15b42fb0
AM
17106 min_notesz = offsetof (Elf_External_Note, name);
17107 if (data_remaining < min_notesz)
9dd3a467
NC
17108 {
17109 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
17110 (int) data_remaining);
17111 break;
17112 }
15b42fb0
AM
17113 inote.type = BYTE_GET (external->type);
17114 inote.namesz = BYTE_GET (external->namesz);
17115 inote.namedata = external->name;
17116 inote.descsz = BYTE_GET (external->descsz);
17117 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
834f871c 17118 /* PR 17531: file: 3443835e. */
c8071705 17119 if (inote.descdata < (char *) pnotes || inote.descdata > end)
834f871c 17120 {
9ef920e9
NC
17121 warn (_("Corrupt note: name size is too big: (got: %lx, expected no more than: %lx)\n"),
17122 inote.namesz, (long)(end - inote.namedata));
834f871c
NC
17123 inote.descdata = inote.namedata;
17124 inote.namesz = 0;
17125 }
14ae95f2 17126
15b42fb0
AM
17127 inote.descpos = offset + (inote.descdata - (char *) pnotes);
17128 next = inote.descdata + align_power (inote.descsz, 2);
17129 }
00e98fc7 17130 else
15b42fb0
AM
17131 {
17132 Elf64_External_VMS_Note *vms_external;
00e98fc7 17133
9dd3a467
NC
17134 /* PR binutils/15191
17135 Make sure that there is enough data to read. */
15b42fb0
AM
17136 min_notesz = offsetof (Elf64_External_VMS_Note, name);
17137 if (data_remaining < min_notesz)
9dd3a467
NC
17138 {
17139 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
17140 (int) data_remaining);
17141 break;
17142 }
3e55a963 17143
15b42fb0
AM
17144 vms_external = (Elf64_External_VMS_Note *) external;
17145 inote.type = BYTE_GET (vms_external->type);
17146 inote.namesz = BYTE_GET (vms_external->namesz);
17147 inote.namedata = vms_external->name;
17148 inote.descsz = BYTE_GET (vms_external->descsz);
17149 inote.descdata = inote.namedata + align_power (inote.namesz, 3);
17150 inote.descpos = offset + (inote.descdata - (char *) pnotes);
17151 next = inote.descdata + align_power (inote.descsz, 3);
17152 }
17153
17154 if (inote.descdata < (char *) external + min_notesz
17155 || next < (char *) external + min_notesz
5d921cbd
NC
17156 /* PR binutils/17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4. */
17157 || inote.namedata + inote.namesz < inote.namedata
17158 || inote.descdata + inote.descsz < inote.descdata
15b42fb0 17159 || data_remaining < (size_t)(next - (char *) external))
3e55a963 17160 {
15b42fb0 17161 warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
0af1713e 17162 (unsigned long) ((char *) external - (char *) pnotes));
9dd3a467 17163 warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
3e55a963
NC
17164 inote.type, inote.namesz, inote.descsz);
17165 break;
17166 }
17167
15b42fb0 17168 external = (Elf_External_Note *) next;
dd24e3da 17169
6d118b09
NC
17170 /* Verify that name is null terminated. It appears that at least
17171 one version of Linux (RedHat 6.0) generates corefiles that don't
17172 comply with the ELF spec by failing to include the null byte in
17173 namesz. */
8b971f9f 17174 if (inote.namedata[inote.namesz - 1] != '\0')
6d118b09 17175 {
3f5e193b 17176 temp = (char *) malloc (inote.namesz + 1);
6d118b09
NC
17177 if (temp == NULL)
17178 {
8b73c356 17179 error (_("Out of memory allocating space for inote name\n"));
32ec8896 17180 res = FALSE;
6d118b09
NC
17181 break;
17182 }
76da6bbe 17183
79a964dc 17184 memcpy (temp, inote.namedata, inote.namesz);
6d118b09 17185 temp[inote.namesz] = 0;
76da6bbe 17186
6d118b09
NC
17187 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
17188 inote.namedata = temp;
17189 }
17190
c799a79d 17191 if (! process_note (& inote, file))
6b4bf3bc 17192 res = FALSE;
103f02d3 17193
6d118b09
NC
17194 if (temp != NULL)
17195 {
17196 free (temp);
17197 temp = NULL;
17198 }
779fe533
NC
17199 }
17200
17201 free (pnotes);
103f02d3 17202
779fe533
NC
17203 return res;
17204}
17205
32ec8896 17206static bfd_boolean
2cf0635d 17207process_corefile_note_segments (FILE * file)
779fe533 17208{
2cf0635d 17209 Elf_Internal_Phdr * segment;
b34976b6 17210 unsigned int i;
32ec8896 17211 bfd_boolean res = TRUE;
103f02d3 17212
d93f0186 17213 if (! get_program_headers (file))
6b4bf3bc 17214 return TRUE;
103f02d3 17215
779fe533
NC
17216 for (i = 0, segment = program_headers;
17217 i < elf_header.e_phnum;
b34976b6 17218 i++, segment++)
779fe533
NC
17219 {
17220 if (segment->p_type == PT_NOTE)
32ec8896
NC
17221 if (! process_notes_at (file, NULL,
17222 (bfd_vma) segment->p_offset,
17223 (bfd_vma) segment->p_filesz))
17224 res = FALSE;
779fe533 17225 }
103f02d3 17226
779fe533
NC
17227 return res;
17228}
17229
32ec8896 17230static bfd_boolean
685080f2
NC
17231process_v850_notes (FILE * file, bfd_vma offset, bfd_vma length)
17232{
17233 Elf_External_Note * pnotes;
17234 Elf_External_Note * external;
c8071705 17235 char * end;
32ec8896 17236 bfd_boolean res = TRUE;
685080f2
NC
17237
17238 if (length <= 0)
32ec8896 17239 return FALSE;
685080f2
NC
17240
17241 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
17242 _("v850 notes"));
17243 if (pnotes == NULL)
32ec8896 17244 return FALSE;
685080f2
NC
17245
17246 external = pnotes;
c8071705 17247 end = (char*) pnotes + length;
685080f2
NC
17248
17249 printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
17250 (unsigned long) offset, (unsigned long) length);
17251
c8071705 17252 while ((char *) external + sizeof (Elf_External_Note) < end)
685080f2
NC
17253 {
17254 Elf_External_Note * next;
17255 Elf_Internal_Note inote;
17256
17257 inote.type = BYTE_GET (external->type);
17258 inote.namesz = BYTE_GET (external->namesz);
17259 inote.namedata = external->name;
17260 inote.descsz = BYTE_GET (external->descsz);
17261 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
17262 inote.descpos = offset + (inote.descdata - (char *) pnotes);
17263
c8071705
NC
17264 if (inote.descdata < (char *) pnotes || inote.descdata >= end)
17265 {
17266 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
17267 inote.descdata = inote.namedata;
17268 inote.namesz = 0;
17269 }
17270
685080f2
NC
17271 next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
17272
c8071705 17273 if ( ((char *) next > end)
685080f2
NC
17274 || ((char *) next < (char *) pnotes))
17275 {
17276 warn (_("corrupt descsz found in note at offset 0x%lx\n"),
17277 (unsigned long) ((char *) external - (char *) pnotes));
17278 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
17279 inote.type, inote.namesz, inote.descsz);
17280 break;
17281 }
17282
17283 external = next;
17284
17285 /* Prevent out-of-bounds indexing. */
c8071705 17286 if ( inote.namedata + inote.namesz > end
685080f2
NC
17287 || inote.namedata + inote.namesz < inote.namedata)
17288 {
17289 warn (_("corrupt namesz found in note at offset 0x%lx\n"),
17290 (unsigned long) ((char *) external - (char *) pnotes));
17291 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
17292 inote.type, inote.namesz, inote.descsz);
17293 break;
17294 }
17295
17296 printf (" %s: ", get_v850_elf_note_type (inote.type));
17297
17298 if (! print_v850_note (& inote))
17299 {
32ec8896 17300 res = FALSE;
685080f2
NC
17301 printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
17302 inote.namesz, inote.descsz);
17303 }
17304 }
17305
17306 free (pnotes);
17307
17308 return res;
17309}
17310
32ec8896 17311static bfd_boolean
2cf0635d 17312process_note_sections (FILE * file)
1ec5cd37 17313{
2cf0635d 17314 Elf_Internal_Shdr * section;
1ec5cd37 17315 unsigned long i;
32ec8896
NC
17316 unsigned int n = 0;
17317 bfd_boolean res = TRUE;
1ec5cd37
NC
17318
17319 for (i = 0, section = section_headers;
fa1908fd 17320 i < elf_header.e_shnum && section != NULL;
1ec5cd37 17321 i++, section++)
685080f2
NC
17322 {
17323 if (section->sh_type == SHT_NOTE)
17324 {
32ec8896
NC
17325 if (! process_notes_at (file, section,
17326 (bfd_vma) section->sh_offset,
17327 (bfd_vma) section->sh_size))
17328 res = FALSE;
685080f2
NC
17329 n++;
17330 }
17331
17332 if (( elf_header.e_machine == EM_V800
17333 || elf_header.e_machine == EM_V850
17334 || elf_header.e_machine == EM_CYGNUS_V850)
17335 && section->sh_type == SHT_RENESAS_INFO)
17336 {
32ec8896
NC
17337 if (! process_v850_notes (file,
17338 (bfd_vma) section->sh_offset,
17339 (bfd_vma) section->sh_size))
17340 res = FALSE;
685080f2
NC
17341 n++;
17342 }
17343 }
df565f32
NC
17344
17345 if (n == 0)
17346 /* Try processing NOTE segments instead. */
17347 return process_corefile_note_segments (file);
1ec5cd37
NC
17348
17349 return res;
17350}
17351
32ec8896 17352static bfd_boolean
2cf0635d 17353process_notes (FILE * file)
779fe533
NC
17354{
17355 /* If we have not been asked to display the notes then do nothing. */
17356 if (! do_notes)
32ec8896 17357 return TRUE;
103f02d3 17358
779fe533 17359 if (elf_header.e_type != ET_CORE)
1ec5cd37 17360 return process_note_sections (file);
103f02d3 17361
779fe533 17362 /* No program headers means no NOTE segment. */
1ec5cd37
NC
17363 if (elf_header.e_phnum > 0)
17364 return process_corefile_note_segments (file);
779fe533 17365
1ec5cd37 17366 printf (_("No note segments present in the core file.\n"));
32ec8896 17367 return TRUE;
779fe533
NC
17368}
17369
60abdbed
NC
17370static unsigned char *
17371display_public_gnu_attributes (unsigned char * start,
17372 const unsigned char * const end)
17373{
17374 printf (_(" Unknown GNU attribute: %s\n"), start);
17375
17376 start += strnlen ((char *) start, end - start);
17377 display_raw_attribute (start, end);
17378
17379 return (unsigned char *) end;
17380}
17381
17382static unsigned char *
17383display_generic_attribute (unsigned char * start,
17384 unsigned int tag,
17385 const unsigned char * const end)
17386{
17387 if (tag == 0)
17388 return (unsigned char *) end;
17389
17390 return display_tag_value (tag, start, end);
17391}
17392
32ec8896 17393static bfd_boolean
2cf0635d 17394process_arch_specific (FILE * file)
252b5132 17395{
a952a375 17396 if (! do_arch)
32ec8896 17397 return TRUE;
a952a375 17398
252b5132
RH
17399 switch (elf_header.e_machine)
17400 {
11c1ff18 17401 case EM_ARM:
60abdbed
NC
17402 return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
17403 display_arm_attribute,
17404 display_generic_attribute);
17405
252b5132 17406 case EM_MIPS:
4fe85591 17407 case EM_MIPS_RS3_LE:
252b5132 17408 return process_mips_specific (file);
60abdbed
NC
17409
17410 case EM_MSP430:
17411 return process_attributes (file, "mspabi", SHT_MSP430_ATTRIBUTES,
17412 display_msp430x_attribute,
17413 display_generic_attribute);
17414
35c08157
KLC
17415 case EM_NDS32:
17416 return process_nds32_specific (file);
60abdbed 17417
34c8bcba 17418 case EM_PPC:
b82317dd 17419 case EM_PPC64:
60abdbed
NC
17420 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
17421 display_power_gnu_attribute);
17422
643f7afb
AK
17423 case EM_S390:
17424 case EM_S390_OLD:
60abdbed
NC
17425 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
17426 display_s390_gnu_attribute);
17427
9e8c70f9
DM
17428 case EM_SPARC:
17429 case EM_SPARC32PLUS:
17430 case EM_SPARCV9:
60abdbed
NC
17431 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
17432 display_sparc_gnu_attribute);
17433
59e6276b 17434 case EM_TI_C6000:
60abdbed
NC
17435 return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
17436 display_tic6x_attribute,
17437 display_generic_attribute);
17438
252b5132 17439 default:
60abdbed
NC
17440 return process_attributes (file, "gnu", SHT_GNU_ATTRIBUTES,
17441 display_public_gnu_attributes,
17442 display_generic_attribute);
252b5132 17443 }
252b5132
RH
17444}
17445
32ec8896 17446static bfd_boolean
2cf0635d 17447get_file_header (FILE * file)
252b5132 17448{
9ea033b2
NC
17449 /* Read in the identity array. */
17450 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
32ec8896 17451 return FALSE;
252b5132 17452
9ea033b2 17453 /* Determine how to read the rest of the header. */
b34976b6 17454 switch (elf_header.e_ident[EI_DATA])
9ea033b2 17455 {
1a0670f3
AM
17456 default:
17457 case ELFDATANONE:
adab8cdc
AO
17458 case ELFDATA2LSB:
17459 byte_get = byte_get_little_endian;
17460 byte_put = byte_put_little_endian;
17461 break;
17462 case ELFDATA2MSB:
17463 byte_get = byte_get_big_endian;
17464 byte_put = byte_put_big_endian;
17465 break;
9ea033b2
NC
17466 }
17467
17468 /* For now we only support 32 bit and 64 bit ELF files. */
b34976b6 17469 is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
9ea033b2
NC
17470
17471 /* Read in the rest of the header. */
17472 if (is_32bit_elf)
17473 {
17474 Elf32_External_Ehdr ehdr32;
252b5132 17475
9ea033b2 17476 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
32ec8896 17477 return FALSE;
103f02d3 17478
9ea033b2
NC
17479 elf_header.e_type = BYTE_GET (ehdr32.e_type);
17480 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
17481 elf_header.e_version = BYTE_GET (ehdr32.e_version);
17482 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
17483 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
17484 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
17485 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
17486 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
17487 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
17488 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
17489 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
17490 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
17491 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
17492 }
252b5132 17493 else
9ea033b2
NC
17494 {
17495 Elf64_External_Ehdr ehdr64;
a952a375
NC
17496
17497 /* If we have been compiled with sizeof (bfd_vma) == 4, then
17498 we will not be able to cope with the 64bit data found in
17499 64 ELF files. Detect this now and abort before we start
50c2245b 17500 overwriting things. */
a952a375
NC
17501 if (sizeof (bfd_vma) < 8)
17502 {
e3c8793a
NC
17503 error (_("This instance of readelf has been built without support for a\n\
1750464 bit data type and so it cannot read 64 bit ELF files.\n"));
32ec8896 17505 return FALSE;
a952a375 17506 }
103f02d3 17507
9ea033b2 17508 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
32ec8896 17509 return FALSE;
103f02d3 17510
9ea033b2
NC
17511 elf_header.e_type = BYTE_GET (ehdr64.e_type);
17512 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
17513 elf_header.e_version = BYTE_GET (ehdr64.e_version);
66543521
AM
17514 elf_header.e_entry = BYTE_GET (ehdr64.e_entry);
17515 elf_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
17516 elf_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
9ea033b2
NC
17517 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
17518 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
17519 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
17520 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
17521 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
17522 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
17523 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
17524 }
252b5132 17525
7ece0d85
JJ
17526 if (elf_header.e_shoff)
17527 {
17528 /* There may be some extensions in the first section header. Don't
17529 bomb if we can't read it. */
17530 if (is_32bit_elf)
049b0c3a 17531 get_32bit_section_headers (file, TRUE);
7ece0d85 17532 else
049b0c3a 17533 get_64bit_section_headers (file, TRUE);
7ece0d85 17534 }
560f3c1c 17535
32ec8896 17536 return TRUE;
252b5132
RH
17537}
17538
fb52b2f4
NC
17539/* Process one ELF object file according to the command line options.
17540 This file may actually be stored in an archive. The file is
32ec8896
NC
17541 positioned at the start of the ELF object. Returns TRUE if no
17542 problems were encountered, FALSE otherwise. */
fb52b2f4 17543
32ec8896 17544static bfd_boolean
2cf0635d 17545process_object (char * file_name, FILE * file)
252b5132 17546{
252b5132 17547 unsigned int i;
32ec8896 17548 bfd_boolean res = TRUE;
252b5132 17549
252b5132
RH
17550 if (! get_file_header (file))
17551 {
17552 error (_("%s: Failed to read file header\n"), file_name);
32ec8896 17553 return FALSE;
252b5132
RH
17554 }
17555
17556 /* Initialise per file variables. */
60bca95a 17557 for (i = ARRAY_SIZE (version_info); i--;)
252b5132
RH
17558 version_info[i] = 0;
17559
60bca95a 17560 for (i = ARRAY_SIZE (dynamic_info); i--;)
252b5132 17561 dynamic_info[i] = 0;
5115b233 17562 dynamic_info_DT_GNU_HASH = 0;
252b5132
RH
17563
17564 /* Process the file. */
17565 if (show_name)
17566 printf (_("\nFile: %s\n"), file_name);
17567
18bd398b
NC
17568 /* Initialise the dump_sects array from the cmdline_dump_sects array.
17569 Note we do this even if cmdline_dump_sects is empty because we
17570 must make sure that the dump_sets array is zeroed out before each
17571 object file is processed. */
17572 if (num_dump_sects > num_cmdline_dump_sects)
09c11c86 17573 memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
18bd398b
NC
17574
17575 if (num_cmdline_dump_sects > 0)
17576 {
17577 if (num_dump_sects == 0)
17578 /* A sneaky way of allocating the dump_sects array. */
09c11c86 17579 request_dump_bynumber (num_cmdline_dump_sects, 0);
18bd398b
NC
17580
17581 assert (num_dump_sects >= num_cmdline_dump_sects);
09c11c86
NC
17582 memcpy (dump_sects, cmdline_dump_sects,
17583 num_cmdline_dump_sects * sizeof (* dump_sects));
18bd398b 17584 }
d70c5fc7 17585
252b5132 17586 if (! process_file_header ())
32ec8896 17587 return FALSE;
252b5132 17588
d1f5c6e3 17589 if (! process_section_headers (file))
2f62977e 17590 {
32ec8896
NC
17591 /* Without loaded section headers we cannot process lots of things. */
17592 do_unwind = do_version = do_dump = do_arch = FALSE;
252b5132 17593
2f62977e 17594 if (! do_using_dynamic)
32ec8896 17595 do_syms = do_dyn_syms = do_reloc = FALSE;
2f62977e 17596 }
252b5132 17597
d1f5c6e3 17598 if (! process_section_groups (file))
32ec8896
NC
17599 /* Without loaded section groups we cannot process unwind. */
17600 do_unwind = FALSE;
d1f5c6e3 17601
2f62977e 17602 if (process_program_headers (file))
b2d38a17 17603 process_dynamic_section (file);
32ec8896
NC
17604 else
17605 res = FALSE;
252b5132 17606
32ec8896
NC
17607 if (! process_relocs (file))
17608 res = FALSE;
252b5132 17609
32ec8896
NC
17610 if (! process_unwind (file))
17611 res = FALSE;
4d6ed7c8 17612
32ec8896
NC
17613 if (! process_symbol_table (file))
17614 res = FALSE;
252b5132 17615
32ec8896
NC
17616 if (! process_syminfo (file))
17617 res = FALSE;
252b5132 17618
32ec8896
NC
17619 if (! process_version_sections (file))
17620 res = FALSE;
252b5132 17621
32ec8896
NC
17622 if (! process_section_contents (file))
17623 res = FALSE;
f5842774 17624
32ec8896
NC
17625 if (! process_notes (file))
17626 res = FALSE;
103f02d3 17627
32ec8896
NC
17628 if (! process_gnu_liblist (file))
17629 res = FALSE;
047b2264 17630
32ec8896
NC
17631 if (! process_arch_specific (file))
17632 res = FALSE;
252b5132 17633
d93f0186
NC
17634 if (program_headers)
17635 {
17636 free (program_headers);
17637 program_headers = NULL;
17638 }
17639
252b5132
RH
17640 if (section_headers)
17641 {
17642 free (section_headers);
17643 section_headers = NULL;
17644 }
17645
17646 if (string_table)
17647 {
17648 free (string_table);
17649 string_table = NULL;
d40ac9bd 17650 string_table_length = 0;
252b5132
RH
17651 }
17652
17653 if (dynamic_strings)
17654 {
17655 free (dynamic_strings);
17656 dynamic_strings = NULL;
d79b3d50 17657 dynamic_strings_length = 0;
252b5132
RH
17658 }
17659
17660 if (dynamic_symbols)
17661 {
17662 free (dynamic_symbols);
17663 dynamic_symbols = NULL;
19936277 17664 num_dynamic_syms = 0;
252b5132
RH
17665 }
17666
17667 if (dynamic_syminfo)
17668 {
17669 free (dynamic_syminfo);
17670 dynamic_syminfo = NULL;
17671 }
ff78d6d6 17672
293c573e
MR
17673 if (dynamic_section)
17674 {
17675 free (dynamic_section);
17676 dynamic_section = NULL;
17677 }
17678
e4b17d5c
L
17679 if (section_headers_groups)
17680 {
17681 free (section_headers_groups);
17682 section_headers_groups = NULL;
17683 }
17684
17685 if (section_groups)
17686 {
2cf0635d
NC
17687 struct group_list * g;
17688 struct group_list * next;
e4b17d5c
L
17689
17690 for (i = 0; i < group_count; i++)
17691 {
17692 for (g = section_groups [i].root; g != NULL; g = next)
17693 {
17694 next = g->next;
17695 free (g);
17696 }
17697 }
17698
17699 free (section_groups);
17700 section_groups = NULL;
17701 }
17702
19e6b90e 17703 free_debug_memory ();
18bd398b 17704
32ec8896 17705 return res;
252b5132
RH
17706}
17707
2cf0635d 17708/* Process an ELF archive.
32ec8896
NC
17709 On entry the file is positioned just after the ARMAG string.
17710 Returns TRUE upon success, FALSE otherwise. */
2cf0635d 17711
32ec8896 17712static bfd_boolean
2cf0635d
NC
17713process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
17714{
17715 struct archive_info arch;
17716 struct archive_info nested_arch;
17717 size_t got;
32ec8896 17718 bfd_boolean ret = TRUE;
2cf0635d 17719
32ec8896 17720 show_name = TRUE;
2cf0635d
NC
17721
17722 /* The ARCH structure is used to hold information about this archive. */
17723 arch.file_name = NULL;
17724 arch.file = NULL;
17725 arch.index_array = NULL;
17726 arch.sym_table = NULL;
17727 arch.longnames = NULL;
17728
17729 /* The NESTED_ARCH structure is used as a single-item cache of information
17730 about a nested archive (when members of a thin archive reside within
17731 another regular archive file). */
17732 nested_arch.file_name = NULL;
17733 nested_arch.file = NULL;
17734 nested_arch.index_array = NULL;
17735 nested_arch.sym_table = NULL;
17736 nested_arch.longnames = NULL;
17737
17738 if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
17739 {
32ec8896 17740 ret = FALSE;
2cf0635d 17741 goto out;
4145f1d5 17742 }
fb52b2f4 17743
4145f1d5
NC
17744 if (do_archive_index)
17745 {
2cf0635d 17746 if (arch.sym_table == NULL)
4145f1d5
NC
17747 error (_("%s: unable to dump the index as none was found\n"), file_name);
17748 else
17749 {
591f7597 17750 unsigned long i, l;
4145f1d5
NC
17751 unsigned long current_pos;
17752
591f7597
NC
17753 printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
17754 file_name, (unsigned long) arch.index_num, arch.sym_size);
4145f1d5
NC
17755 current_pos = ftell (file);
17756
2cf0635d 17757 for (i = l = 0; i < arch.index_num; i++)
4145f1d5 17758 {
2cf0635d
NC
17759 if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
17760 {
17761 char * member_name;
4145f1d5 17762
2cf0635d
NC
17763 member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
17764
17765 if (member_name != NULL)
17766 {
17767 char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
17768
17769 if (qualified_name != NULL)
17770 {
c2a7d3f5
NC
17771 printf (_("Contents of binary %s at offset "), qualified_name);
17772 (void) print_vma (arch.index_array[i], PREFIX_HEX);
17773 putchar ('\n');
2cf0635d
NC
17774 free (qualified_name);
17775 }
4145f1d5
NC
17776 }
17777 }
2cf0635d
NC
17778
17779 if (l >= arch.sym_size)
4145f1d5
NC
17780 {
17781 error (_("%s: end of the symbol table reached before the end of the index\n"),
17782 file_name);
32ec8896 17783 ret = FALSE;
cb8f3167 17784 break;
4145f1d5 17785 }
591f7597
NC
17786 /* PR 17531: file: 0b6630b2. */
17787 printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
17788 l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
4145f1d5
NC
17789 }
17790
c2a7d3f5
NC
17791 if (arch.uses_64bit_indicies)
17792 l = (l + 7) & ~ 7;
17793 else
17794 l += l & 1;
17795
2cf0635d 17796 if (l < arch.sym_size)
32ec8896
NC
17797 {
17798 error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
17799 file_name, arch.sym_size - l);
17800 ret = FALSE;
17801 }
4145f1d5 17802
4145f1d5
NC
17803 if (fseek (file, current_pos, SEEK_SET) != 0)
17804 {
17805 error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
32ec8896 17806 ret = FALSE;
2cf0635d 17807 goto out;
4145f1d5 17808 }
fb52b2f4 17809 }
4145f1d5
NC
17810
17811 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
17812 && !do_segments && !do_header && !do_dump && !do_version
17813 && !do_histogram && !do_debugging && !do_arch && !do_notes
2c610e4b 17814 && !do_section_groups && !do_dyn_syms)
2cf0635d 17815 {
32ec8896 17816 ret = TRUE; /* Archive index only. */
2cf0635d
NC
17817 goto out;
17818 }
fb52b2f4
NC
17819 }
17820
fb52b2f4
NC
17821 while (1)
17822 {
2cf0635d
NC
17823 char * name;
17824 size_t namelen;
17825 char * qualified_name;
17826
17827 /* Read the next archive header. */
17828 if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
17829 {
17830 error (_("%s: failed to seek to next archive header\n"), file_name);
32ec8896 17831 return FALSE;
2cf0635d
NC
17832 }
17833 got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
17834 if (got != sizeof arch.arhdr)
17835 {
17836 if (got == 0)
17837 break;
17838 error (_("%s: failed to read archive header\n"), file_name);
32ec8896 17839 ret = FALSE;
2cf0635d
NC
17840 break;
17841 }
17842 if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
17843 {
17844 error (_("%s: did not find a valid archive header\n"), arch.file_name);
32ec8896 17845 ret = FALSE;
2cf0635d
NC
17846 break;
17847 }
17848
17849 arch.next_arhdr_offset += sizeof arch.arhdr;
17850
17851 archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
17852 if (archive_file_size & 01)
17853 ++archive_file_size;
17854
17855 name = get_archive_member_name (&arch, &nested_arch);
17856 if (name == NULL)
fb52b2f4 17857 {
0fd3a477 17858 error (_("%s: bad archive file name\n"), file_name);
32ec8896 17859 ret = FALSE;
d989285c 17860 break;
fb52b2f4 17861 }
2cf0635d 17862 namelen = strlen (name);
fb52b2f4 17863
2cf0635d
NC
17864 qualified_name = make_qualified_name (&arch, &nested_arch, name);
17865 if (qualified_name == NULL)
fb52b2f4 17866 {
2cf0635d 17867 error (_("%s: bad archive file name\n"), file_name);
32ec8896 17868 ret = FALSE;
d989285c 17869 break;
fb52b2f4
NC
17870 }
17871
2cf0635d
NC
17872 if (is_thin_archive && arch.nested_member_origin == 0)
17873 {
17874 /* This is a proxy for an external member of a thin archive. */
17875 FILE * member_file;
17876 char * member_file_name = adjust_relative_path (file_name, name, namelen);
32ec8896 17877
2cf0635d
NC
17878 if (member_file_name == NULL)
17879 {
32ec8896 17880 ret = FALSE;
2cf0635d
NC
17881 break;
17882 }
17883
17884 member_file = fopen (member_file_name, "rb");
17885 if (member_file == NULL)
17886 {
17887 error (_("Input file '%s' is not readable.\n"), member_file_name);
17888 free (member_file_name);
32ec8896 17889 ret = FALSE;
2cf0635d
NC
17890 break;
17891 }
17892
17893 archive_file_offset = arch.nested_member_origin;
17894
32ec8896
NC
17895 if (! process_object (qualified_name, member_file))
17896 ret = FALSE;
2cf0635d
NC
17897
17898 fclose (member_file);
17899 free (member_file_name);
17900 }
17901 else if (is_thin_archive)
17902 {
a043396b
NC
17903 /* PR 15140: Allow for corrupt thin archives. */
17904 if (nested_arch.file == NULL)
17905 {
17906 error (_("%s: contains corrupt thin archive: %s\n"),
17907 file_name, name);
32ec8896 17908 ret = FALSE;
a043396b
NC
17909 break;
17910 }
17911
2cf0635d
NC
17912 /* This is a proxy for a member of a nested archive. */
17913 archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
17914
17915 /* The nested archive file will have been opened and setup by
17916 get_archive_member_name. */
17917 if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
17918 {
17919 error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
32ec8896 17920 ret = FALSE;
2cf0635d
NC
17921 break;
17922 }
17923
32ec8896
NC
17924 if (! process_object (qualified_name, nested_arch.file))
17925 ret = FALSE;
2cf0635d
NC
17926 }
17927 else
17928 {
17929 archive_file_offset = arch.next_arhdr_offset;
17930 arch.next_arhdr_offset += archive_file_size;
fb52b2f4 17931
32ec8896
NC
17932 if (! process_object (qualified_name, file))
17933 ret = FALSE;
2cf0635d 17934 }
fb52b2f4 17935
2b52916e
L
17936 if (dump_sects != NULL)
17937 {
17938 free (dump_sects);
17939 dump_sects = NULL;
17940 num_dump_sects = 0;
17941 }
17942
2cf0635d 17943 free (qualified_name);
fb52b2f4
NC
17944 }
17945
4145f1d5 17946 out:
2cf0635d
NC
17947 if (nested_arch.file != NULL)
17948 fclose (nested_arch.file);
17949 release_archive (&nested_arch);
17950 release_archive (&arch);
fb52b2f4 17951
d989285c 17952 return ret;
fb52b2f4
NC
17953}
17954
32ec8896 17955static bfd_boolean
2cf0635d 17956process_file (char * file_name)
fb52b2f4 17957{
2cf0635d 17958 FILE * file;
fb52b2f4
NC
17959 struct stat statbuf;
17960 char armag[SARMAG];
32ec8896 17961 bfd_boolean ret = TRUE;
fb52b2f4
NC
17962
17963 if (stat (file_name, &statbuf) < 0)
17964 {
f24ddbdd
NC
17965 if (errno == ENOENT)
17966 error (_("'%s': No such file\n"), file_name);
17967 else
17968 error (_("Could not locate '%s'. System error message: %s\n"),
17969 file_name, strerror (errno));
32ec8896 17970 return FALSE;
f24ddbdd
NC
17971 }
17972
17973 if (! S_ISREG (statbuf.st_mode))
17974 {
17975 error (_("'%s' is not an ordinary file\n"), file_name);
32ec8896 17976 return FALSE;
fb52b2f4
NC
17977 }
17978
17979 file = fopen (file_name, "rb");
17980 if (file == NULL)
17981 {
f24ddbdd 17982 error (_("Input file '%s' is not readable.\n"), file_name);
32ec8896 17983 return FALSE;
fb52b2f4
NC
17984 }
17985
17986 if (fread (armag, SARMAG, 1, file) != 1)
17987 {
4145f1d5 17988 error (_("%s: Failed to read file's magic number\n"), file_name);
fb52b2f4 17989 fclose (file);
32ec8896 17990 return FALSE;
fb52b2f4
NC
17991 }
17992
f54498b4
NC
17993 current_file_size = (bfd_size_type) statbuf.st_size;
17994
fb52b2f4 17995 if (memcmp (armag, ARMAG, SARMAG) == 0)
32ec8896
NC
17996 {
17997 if (! process_archive (file_name, file, FALSE))
17998 ret = FALSE;
17999 }
2cf0635d 18000 else if (memcmp (armag, ARMAGT, SARMAG) == 0)
32ec8896
NC
18001 {
18002 if ( ! process_archive (file_name, file, TRUE))
18003 ret = FALSE;
18004 }
fb52b2f4
NC
18005 else
18006 {
4145f1d5
NC
18007 if (do_archive_index)
18008 error (_("File %s is not an archive so its index cannot be displayed.\n"),
18009 file_name);
18010
fb52b2f4
NC
18011 rewind (file);
18012 archive_file_size = archive_file_offset = 0;
32ec8896
NC
18013
18014 if (! process_object (file_name, file))
18015 ret = FALSE;
fb52b2f4
NC
18016 }
18017
18018 fclose (file);
f54498b4 18019 current_file_size = 0;
32ec8896 18020
fb52b2f4
NC
18021 return ret;
18022}
18023
252b5132
RH
18024#ifdef SUPPORT_DISASSEMBLY
18025/* Needed by the i386 disassembler. For extra credit, someone could
9ea033b2 18026 fix this so that we insert symbolic addresses here, esp for GOT/PLT
e3c8793a 18027 symbols. */
252b5132
RH
18028
18029void
2cf0635d 18030print_address (unsigned int addr, FILE * outfile)
252b5132
RH
18031{
18032 fprintf (outfile,"0x%8.8x", addr);
18033}
18034
e3c8793a 18035/* Needed by the i386 disassembler. */
252b5132
RH
18036void
18037db_task_printsym (unsigned int addr)
18038{
18039 print_address (addr, stderr);
18040}
18041#endif
18042
18043int
2cf0635d 18044main (int argc, char ** argv)
252b5132 18045{
ff78d6d6
L
18046 int err;
18047
252b5132
RH
18048#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
18049 setlocale (LC_MESSAGES, "");
3882b010
L
18050#endif
18051#if defined (HAVE_SETLOCALE)
18052 setlocale (LC_CTYPE, "");
252b5132
RH
18053#endif
18054 bindtextdomain (PACKAGE, LOCALEDIR);
18055 textdomain (PACKAGE);
18056
869b9d07
MM
18057 expandargv (&argc, &argv);
18058
252b5132
RH
18059 parse_args (argc, argv);
18060
18bd398b 18061 if (num_dump_sects > 0)
59f14fc0 18062 {
18bd398b 18063 /* Make a copy of the dump_sects array. */
3f5e193b
NC
18064 cmdline_dump_sects = (dump_type *)
18065 malloc (num_dump_sects * sizeof (* dump_sects));
59f14fc0 18066 if (cmdline_dump_sects == NULL)
591a748a 18067 error (_("Out of memory allocating dump request table.\n"));
59f14fc0
AS
18068 else
18069 {
09c11c86
NC
18070 memcpy (cmdline_dump_sects, dump_sects,
18071 num_dump_sects * sizeof (* dump_sects));
59f14fc0
AS
18072 num_cmdline_dump_sects = num_dump_sects;
18073 }
18074 }
18075
18bd398b 18076 if (optind < (argc - 1))
32ec8896 18077 show_name = TRUE;
5656ba2c
L
18078 else if (optind >= argc)
18079 {
18080 warn (_("Nothing to do.\n"));
18081 usage (stderr);
18082 }
18bd398b 18083
32ec8896 18084 err = FALSE;
252b5132 18085 while (optind < argc)
32ec8896
NC
18086 if (! process_file (argv[optind++]))
18087 err = TRUE;
252b5132
RH
18088
18089 if (dump_sects != NULL)
18090 free (dump_sects);
59f14fc0
AS
18091 if (cmdline_dump_sects != NULL)
18092 free (cmdline_dump_sects);
252b5132 18093
32ec8896 18094 return err ? EXIT_FAILURE : EXIT_SUCCESS;
252b5132 18095}