RISC-V: Support ELF attribute for gas and readelf.
[deliverable/binutils-gdb.git] / binutils / readelf.c
CommitLineData
252b5132 1/* readelf.c -- display contents of an ELF format file
82704155 2 Copyright (C) 1998-2019 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"
b8891f8d 101#include "elf/csky.h"
252b5132
RH
102#include "elf/d10v.h"
103#include "elf/d30v.h"
d172d4ba 104#include "elf/dlx.h"
cfb8c092 105#include "elf/epiphany.h"
252b5132 106#include "elf/fr30.h"
5c70f934 107#include "elf/frv.h"
3f8107ab 108#include "elf/ft32.h"
3b16e843
NC
109#include "elf/h8.h"
110#include "elf/hppa.h"
111#include "elf/i386.h"
f954747f
AM
112#include "elf/i370.h"
113#include "elf/i860.h"
114#include "elf/i960.h"
3b16e843 115#include "elf/ia64.h"
1e4cf259 116#include "elf/ip2k.h"
84e94c90 117#include "elf/lm32.h"
1c0d3aa6 118#include "elf/iq2000.h"
49f58d10 119#include "elf/m32c.h"
3b16e843
NC
120#include "elf/m32r.h"
121#include "elf/m68k.h"
75751cd9 122#include "elf/m68hc11.h"
7b4ae824 123#include "elf/s12z.h"
252b5132 124#include "elf/mcore.h"
15ab5209 125#include "elf/mep.h"
a3c62988 126#include "elf/metag.h"
7ba29e2a 127#include "elf/microblaze.h"
3b16e843 128#include "elf/mips.h"
3c3bdf30 129#include "elf/mmix.h"
3b16e843
NC
130#include "elf/mn10200.h"
131#include "elf/mn10300.h"
5506d11a 132#include "elf/moxie.h"
4970f871 133#include "elf/mt.h"
2469cfa2 134#include "elf/msp430.h"
35c08157 135#include "elf/nds32.h"
fe944acf 136#include "elf/nfp.h"
13761a11 137#include "elf/nios2.h"
73589c9d 138#include "elf/or1k.h"
7d466069 139#include "elf/pj.h"
3b16e843 140#include "elf/ppc.h"
c833c019 141#include "elf/ppc64.h"
2b100bb5 142#include "elf/pru.h"
03336641 143#include "elf/riscv.h"
99c513f6 144#include "elf/rl78.h"
c7927a3c 145#include "elf/rx.h"
a85d7ed0 146#include "elf/s390.h"
1c0d3aa6 147#include "elf/score.h"
3b16e843
NC
148#include "elf/sh.h"
149#include "elf/sparc.h"
e9f53129 150#include "elf/spu.h"
40b36596 151#include "elf/tic6x.h"
aa137e4d
NC
152#include "elf/tilegx.h"
153#include "elf/tilepro.h"
3b16e843 154#include "elf/v850.h"
179d3252 155#include "elf/vax.h"
619ed720 156#include "elf/visium.h"
f96bd6c2 157#include "elf/wasm32.h"
3b16e843 158#include "elf/x86-64.h"
c29aca4a 159#include "elf/xc16x.h"
f6c1a2d5 160#include "elf/xgate.h"
93fbbb04 161#include "elf/xstormy16.h"
88da6820 162#include "elf/xtensa.h"
252b5132 163
252b5132 164#include "getopt.h"
566b0d53 165#include "libiberty.h"
09c11c86 166#include "safe-ctype.h"
2cf0635d 167#include "filenames.h"
252b5132 168
15b42fb0
AM
169#ifndef offsetof
170#define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
171#endif
172
6a40cf0c
NC
173typedef struct elf_section_list
174{
dda8d76d
NC
175 Elf_Internal_Shdr * hdr;
176 struct elf_section_list * next;
6a40cf0c
NC
177} elf_section_list;
178
dda8d76d
NC
179/* Flag bits indicating particular types of dump. */
180#define HEX_DUMP (1 << 0) /* The -x command line switch. */
181#define DISASS_DUMP (1 << 1) /* The -i command line switch. */
182#define DEBUG_DUMP (1 << 2) /* The -w command line switch. */
183#define STRING_DUMP (1 << 3) /* The -p command line switch. */
184#define RELOC_DUMP (1 << 4) /* The -R command line switch. */
185
186typedef unsigned char dump_type;
187
188/* A linked list of the section names for which dumps were requested. */
189struct dump_list_entry
190{
191 char * name;
192 dump_type type;
193 struct dump_list_entry * next;
194};
195
196typedef struct filedata
197{
198 const char * file_name;
199 FILE * handle;
200 bfd_size_type file_size;
201 Elf_Internal_Ehdr file_header;
202 Elf_Internal_Shdr * section_headers;
203 Elf_Internal_Phdr * program_headers;
204 char * string_table;
205 unsigned long string_table_length;
206 /* A dynamic array of flags indicating for which sections a dump of
207 some kind has been requested. It is reset on a per-object file
208 basis and then initialised from the cmdline_dump_sects array,
209 the results of interpreting the -w switch, and the
210 dump_sects_byname list. */
211 dump_type * dump_sects;
212 unsigned int num_dump_sects;
213} Filedata;
214
2cf0635d 215char * program_name = "readelf";
dda8d76d 216
c9c1d674 217static unsigned long archive_file_offset;
85b1c36d
BE
218static unsigned long archive_file_size;
219static unsigned long dynamic_addr;
220static bfd_size_type dynamic_size;
8b73c356 221static size_t dynamic_nent;
2cf0635d 222static char * dynamic_strings;
85b1c36d 223static unsigned long dynamic_strings_length;
85b1c36d 224static unsigned long num_dynamic_syms;
2cf0635d
NC
225static Elf_Internal_Sym * dynamic_symbols;
226static Elf_Internal_Syminfo * dynamic_syminfo;
85b1c36d
BE
227static unsigned long dynamic_syminfo_offset;
228static unsigned int dynamic_syminfo_nent;
f8eae8b2 229static char program_interpreter[PATH_MAX];
bb8a0291 230static bfd_vma dynamic_info[DT_ENCODING];
fdc90cb4 231static bfd_vma dynamic_info_DT_GNU_HASH;
85b1c36d 232static bfd_vma version_info[16];
2cf0635d 233static Elf_Internal_Dyn * dynamic_section;
6a40cf0c 234static elf_section_list * symtab_shndx_list;
32ec8896
NC
235static bfd_boolean show_name = FALSE;
236static bfd_boolean do_dynamic = FALSE;
237static bfd_boolean do_syms = FALSE;
238static bfd_boolean do_dyn_syms = FALSE;
239static bfd_boolean do_reloc = FALSE;
240static bfd_boolean do_sections = FALSE;
241static bfd_boolean do_section_groups = FALSE;
242static bfd_boolean do_section_details = FALSE;
243static bfd_boolean do_segments = FALSE;
244static bfd_boolean do_unwind = FALSE;
245static bfd_boolean do_using_dynamic = FALSE;
246static bfd_boolean do_header = FALSE;
247static bfd_boolean do_dump = FALSE;
248static bfd_boolean do_version = FALSE;
249static bfd_boolean do_histogram = FALSE;
250static bfd_boolean do_debugging = FALSE;
251static bfd_boolean do_arch = FALSE;
252static bfd_boolean do_notes = FALSE;
253static bfd_boolean do_archive_index = FALSE;
254static bfd_boolean is_32bit_elf = FALSE;
255static bfd_boolean decompress_dumps = FALSE;
252b5132 256
e4b17d5c
L
257struct group_list
258{
dda8d76d
NC
259 struct group_list * next;
260 unsigned int section_index;
e4b17d5c
L
261};
262
263struct group
264{
dda8d76d
NC
265 struct group_list * root;
266 unsigned int group_index;
e4b17d5c
L
267};
268
dda8d76d
NC
269static size_t group_count;
270static struct group * section_groups;
271static struct group ** section_headers_groups;
aef1f6d0 272
09c11c86
NC
273/* A dynamic array of flags indicating for which sections a dump
274 has been requested via command line switches. */
dda8d76d 275static Filedata cmdline;
252b5132 276
dda8d76d 277static struct dump_list_entry * dump_sects_byname;
252b5132 278
c256ffe7 279/* How to print a vma value. */
843dd992
NC
280typedef enum print_mode
281{
282 HEX,
283 DEC,
284 DEC_5,
285 UNSIGNED,
286 PREFIX_HEX,
287 FULL_HEX,
288 LONG_HEX
289}
290print_mode;
291
bb4d2ac2
L
292/* Versioned symbol info. */
293enum versioned_symbol_info
294{
295 symbol_undefined,
296 symbol_hidden,
297 symbol_public
298};
299
32ec8896 300static const char * get_symbol_version_string
dda8d76d 301 (Filedata *, bfd_boolean, const char *, unsigned long, unsigned,
32ec8896 302 Elf_Internal_Sym *, enum versioned_symbol_info *, unsigned short *);
bb4d2ac2 303
9c19a809
NC
304#define UNKNOWN -1
305
2b692964
NC
306#define SECTION_NAME(X) \
307 ((X) == NULL ? _("<none>") \
dda8d76d
NC
308 : filedata->string_table == NULL ? _("<no-strings>") \
309 : ((X)->sh_name >= filedata->string_table_length ? _("<corrupt>") \
310 : filedata->string_table + (X)->sh_name))
252b5132 311
ee42cf8c 312#define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
252b5132 313
ba5cdace
NC
314#define GET_ELF_SYMBOLS(file, section, sym_count) \
315 (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count) \
316 : get_64bit_elf_symbols (file, section, sym_count))
9ea033b2 317
d79b3d50
NC
318#define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
319/* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
320 already been called and verified that the string exists. */
321#define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
18bd398b 322
61865e30
NC
323#define REMOVE_ARCH_BITS(ADDR) \
324 do \
325 { \
dda8d76d 326 if (filedata->file_header.e_machine == EM_ARM) \
61865e30
NC
327 (ADDR) &= ~1; \
328 } \
329 while (0)
d79b3d50 330\f
66cfc0fd
AM
331/* Print a BFD_VMA to an internal buffer, for use in error messages.
332 BFD_FMA_FMT can't be used in translated strings. */
333
334static const char *
335bfd_vmatoa (char *fmtch, bfd_vma value)
336{
337 /* bfd_vmatoa is used more then once in a printf call for output.
338 Cycle through an array of buffers. */
339 static int buf_pos = 0;
340 static struct bfd_vmatoa_buf
341 {
342 char place[64];
343 } buf[4];
344 char *ret;
345 char fmt[32];
346
347 ret = buf[buf_pos++].place;
348 buf_pos %= ARRAY_SIZE (buf);
349
350 sprintf (fmt, "%%%s%s", BFD_VMA_FMT, fmtch);
351 snprintf (ret, sizeof (buf[0].place), fmt, value);
352 return ret;
353}
354
dda8d76d
NC
355/* Retrieve NMEMB structures, each SIZE bytes long from FILEDATA starting at
356 OFFSET + the offset of the current archive member, if we are examining an
357 archive. Put the retrieved data into VAR, if it is not NULL. Otherwise
358 allocate a buffer using malloc and fill that. In either case return the
359 pointer to the start of the retrieved data or NULL if something went wrong.
360 If something does go wrong and REASON is not NULL then emit an error
361 message using REASON as part of the context. */
59245841 362
c256ffe7 363static void *
dda8d76d
NC
364get_data (void * var,
365 Filedata * filedata,
366 unsigned long offset,
367 bfd_size_type size,
368 bfd_size_type nmemb,
369 const char * reason)
a6e9f9df 370{
2cf0635d 371 void * mvar;
57028622 372 bfd_size_type amt = size * nmemb;
a6e9f9df 373
c256ffe7 374 if (size == 0 || nmemb == 0)
a6e9f9df
AM
375 return NULL;
376
57028622
NC
377 /* If the size_t type is smaller than the bfd_size_type, eg because
378 you are building a 32-bit tool on a 64-bit host, then make sure
379 that when the sizes are cast to (size_t) no information is lost. */
380 if (sizeof (size_t) < sizeof (bfd_size_type)
381 && ( (bfd_size_type) ((size_t) size) != size
382 || (bfd_size_type) ((size_t) nmemb) != nmemb))
383 {
384 if (reason)
66cfc0fd
AM
385 error (_("Size truncation prevents reading %s"
386 " elements of size %s for %s\n"),
387 bfd_vmatoa ("u", nmemb), bfd_vmatoa ("u", size), reason);
57028622
NC
388 return NULL;
389 }
390
391 /* Check for size overflow. */
392 if (amt < nmemb)
393 {
394 if (reason)
66cfc0fd
AM
395 error (_("Size overflow prevents reading %s"
396 " elements of size %s for %s\n"),
397 bfd_vmatoa ("u", nmemb), bfd_vmatoa ("u", size), reason);
57028622
NC
398 return NULL;
399 }
400
c9c1d674
EG
401 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
402 attempting to allocate memory when the read is bound to fail. */
dda8d76d
NC
403 if (amt > filedata->file_size
404 || offset + archive_file_offset + amt > filedata->file_size)
a6e9f9df 405 {
049b0c3a 406 if (reason)
66cfc0fd
AM
407 error (_("Reading %s bytes extends past end of file for %s\n"),
408 bfd_vmatoa ("u", amt), reason);
a6e9f9df
AM
409 return NULL;
410 }
411
dda8d76d 412 if (fseek (filedata->handle, archive_file_offset + offset, SEEK_SET))
071436c6
NC
413 {
414 if (reason)
c9c1d674 415 error (_("Unable to seek to 0x%lx for %s\n"),
ed754a13 416 archive_file_offset + offset, reason);
071436c6
NC
417 return NULL;
418 }
419
a6e9f9df
AM
420 mvar = var;
421 if (mvar == NULL)
422 {
c256ffe7 423 /* Check for overflow. */
57028622 424 if (nmemb < (~(bfd_size_type) 0 - 1) / size)
c256ffe7 425 /* + 1 so that we can '\0' terminate invalid string table sections. */
57028622 426 mvar = malloc ((size_t) amt + 1);
a6e9f9df
AM
427
428 if (mvar == NULL)
429 {
049b0c3a 430 if (reason)
66cfc0fd
AM
431 error (_("Out of memory allocating %s bytes for %s\n"),
432 bfd_vmatoa ("u", amt), reason);
a6e9f9df
AM
433 return NULL;
434 }
c256ffe7 435
c9c1d674 436 ((char *) mvar)[amt] = '\0';
a6e9f9df
AM
437 }
438
dda8d76d 439 if (fread (mvar, (size_t) size, (size_t) nmemb, filedata->handle) != nmemb)
a6e9f9df 440 {
049b0c3a 441 if (reason)
66cfc0fd
AM
442 error (_("Unable to read in %s bytes of %s\n"),
443 bfd_vmatoa ("u", amt), reason);
a6e9f9df
AM
444 if (mvar != var)
445 free (mvar);
446 return NULL;
447 }
448
449 return mvar;
450}
451
32ec8896
NC
452/* Print a VMA value in the MODE specified.
453 Returns the number of characters displayed. */
cb8f3167 454
32ec8896 455static unsigned int
14a91970 456print_vma (bfd_vma vma, print_mode mode)
66543521 457{
32ec8896 458 unsigned int nc = 0;
66543521 459
14a91970 460 switch (mode)
66543521 461 {
14a91970
AM
462 case FULL_HEX:
463 nc = printf ("0x");
1a0670f3 464 /* Fall through. */
14a91970 465 case LONG_HEX:
f7a99963 466#ifdef BFD64
14a91970 467 if (is_32bit_elf)
437c2fb7 468 return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
f7a99963 469#endif
14a91970
AM
470 printf_vma (vma);
471 return nc + 16;
b19aac67 472
14a91970
AM
473 case DEC_5:
474 if (vma <= 99999)
475 return printf ("%5" BFD_VMA_FMT "d", vma);
1a0670f3 476 /* Fall through. */
14a91970
AM
477 case PREFIX_HEX:
478 nc = printf ("0x");
1a0670f3 479 /* Fall through. */
14a91970
AM
480 case HEX:
481 return nc + printf ("%" BFD_VMA_FMT "x", vma);
b19aac67 482
14a91970
AM
483 case DEC:
484 return printf ("%" BFD_VMA_FMT "d", vma);
b19aac67 485
14a91970
AM
486 case UNSIGNED:
487 return printf ("%" BFD_VMA_FMT "u", vma);
32ec8896
NC
488
489 default:
490 /* FIXME: Report unrecognised mode ? */
491 return 0;
f7a99963 492 }
f7a99963
NC
493}
494
7bfd842d 495/* Display a symbol on stdout. Handles the display of control characters and
3bfcb652 496 multibye characters (assuming the host environment supports them).
31104126 497
7bfd842d
NC
498 Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
499
500 If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
501 padding as necessary.
171191ba
NC
502
503 Returns the number of emitted characters. */
504
505static unsigned int
32ec8896 506print_symbol (signed int width, const char *symbol)
31104126 507{
171191ba 508 bfd_boolean extra_padding = FALSE;
32ec8896 509 signed int num_printed = 0;
3bfcb652 510#ifdef HAVE_MBSTATE_T
7bfd842d 511 mbstate_t state;
3bfcb652 512#endif
32ec8896 513 unsigned int width_remaining;
961c521f 514
7bfd842d 515 if (width < 0)
961c521f 516 {
88305e1b 517 /* Keep the width positive. This helps the code below. */
961c521f 518 width = - width;
171191ba 519 extra_padding = TRUE;
0b4362b0 520 }
56d8f8a9
NC
521 else if (width == 0)
522 return 0;
961c521f 523
7bfd842d
NC
524 if (do_wide)
525 /* Set the remaining width to a very large value.
526 This simplifies the code below. */
527 width_remaining = INT_MAX;
528 else
529 width_remaining = width;
cb8f3167 530
3bfcb652 531#ifdef HAVE_MBSTATE_T
7bfd842d
NC
532 /* Initialise the multibyte conversion state. */
533 memset (& state, 0, sizeof (state));
3bfcb652 534#endif
961c521f 535
7bfd842d
NC
536 while (width_remaining)
537 {
538 size_t n;
7bfd842d 539 const char c = *symbol++;
961c521f 540
7bfd842d 541 if (c == 0)
961c521f
NC
542 break;
543
7bfd842d
NC
544 /* Do not print control characters directly as they can affect terminal
545 settings. Such characters usually appear in the names generated
546 by the assembler for local labels. */
547 if (ISCNTRL (c))
961c521f 548 {
7bfd842d 549 if (width_remaining < 2)
961c521f
NC
550 break;
551
7bfd842d
NC
552 printf ("^%c", c + 0x40);
553 width_remaining -= 2;
171191ba 554 num_printed += 2;
961c521f 555 }
7bfd842d
NC
556 else if (ISPRINT (c))
557 {
558 putchar (c);
559 width_remaining --;
560 num_printed ++;
561 }
961c521f
NC
562 else
563 {
3bfcb652
NC
564#ifdef HAVE_MBSTATE_T
565 wchar_t w;
566#endif
7bfd842d
NC
567 /* Let printf do the hard work of displaying multibyte characters. */
568 printf ("%.1s", symbol - 1);
569 width_remaining --;
570 num_printed ++;
571
3bfcb652 572#ifdef HAVE_MBSTATE_T
7bfd842d
NC
573 /* Try to find out how many bytes made up the character that was
574 just printed. Advance the symbol pointer past the bytes that
575 were displayed. */
576 n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
3bfcb652
NC
577#else
578 n = 1;
579#endif
7bfd842d
NC
580 if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
581 symbol += (n - 1);
961c521f 582 }
961c521f 583 }
171191ba 584
7bfd842d 585 if (extra_padding && num_printed < width)
171191ba
NC
586 {
587 /* Fill in the remaining spaces. */
7bfd842d
NC
588 printf ("%-*s", width - num_printed, " ");
589 num_printed = width;
171191ba
NC
590 }
591
592 return num_printed;
31104126
NC
593}
594
1449284b 595/* Returns a pointer to a static buffer containing a printable version of
74e1a04b
NC
596 the given section's name. Like print_symbol, except that it does not try
597 to print multibyte characters, it just interprets them as hex values. */
598
599static const char *
dda8d76d 600printable_section_name (Filedata * filedata, const Elf_Internal_Shdr * sec)
74e1a04b
NC
601{
602#define MAX_PRINT_SEC_NAME_LEN 128
603 static char sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
604 const char * name = SECTION_NAME (sec);
605 char * buf = sec_name_buf;
606 char c;
607 unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
608
609 while ((c = * name ++) != 0)
610 {
611 if (ISCNTRL (c))
612 {
613 if (remaining < 2)
614 break;
948f632f 615
74e1a04b
NC
616 * buf ++ = '^';
617 * buf ++ = c + 0x40;
618 remaining -= 2;
619 }
620 else if (ISPRINT (c))
621 {
622 * buf ++ = c;
623 remaining -= 1;
624 }
625 else
626 {
627 static char hex[17] = "0123456789ABCDEF";
628
629 if (remaining < 4)
630 break;
631 * buf ++ = '<';
632 * buf ++ = hex[(c & 0xf0) >> 4];
633 * buf ++ = hex[c & 0x0f];
634 * buf ++ = '>';
635 remaining -= 4;
636 }
637
638 if (remaining == 0)
639 break;
640 }
641
642 * buf = 0;
643 return sec_name_buf;
644}
645
646static const char *
dda8d76d 647printable_section_name_from_index (Filedata * filedata, unsigned long ndx)
74e1a04b 648{
dda8d76d 649 if (ndx >= filedata->file_header.e_shnum)
74e1a04b
NC
650 return _("<corrupt>");
651
dda8d76d 652 return printable_section_name (filedata, filedata->section_headers + ndx);
74e1a04b
NC
653}
654
89fac5e3
RS
655/* Return a pointer to section NAME, or NULL if no such section exists. */
656
657static Elf_Internal_Shdr *
dda8d76d 658find_section (Filedata * filedata, const char * name)
89fac5e3
RS
659{
660 unsigned int i;
661
68807c3c
NC
662 if (filedata->section_headers == NULL)
663 return NULL;
dda8d76d
NC
664
665 for (i = 0; i < filedata->file_header.e_shnum; i++)
666 if (streq (SECTION_NAME (filedata->section_headers + i), name))
667 return filedata->section_headers + i;
89fac5e3
RS
668
669 return NULL;
670}
671
0b6ae522
DJ
672/* Return a pointer to a section containing ADDR, or NULL if no such
673 section exists. */
674
675static Elf_Internal_Shdr *
dda8d76d 676find_section_by_address (Filedata * filedata, bfd_vma addr)
0b6ae522
DJ
677{
678 unsigned int i;
679
68807c3c
NC
680 if (filedata->section_headers == NULL)
681 return NULL;
682
dda8d76d 683 for (i = 0; i < filedata->file_header.e_shnum; i++)
0b6ae522 684 {
dda8d76d
NC
685 Elf_Internal_Shdr *sec = filedata->section_headers + i;
686
0b6ae522
DJ
687 if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
688 return sec;
689 }
690
691 return NULL;
692}
693
071436c6 694static Elf_Internal_Shdr *
dda8d76d 695find_section_by_type (Filedata * filedata, unsigned int type)
071436c6
NC
696{
697 unsigned int i;
698
68807c3c
NC
699 if (filedata->section_headers == NULL)
700 return NULL;
701
dda8d76d 702 for (i = 0; i < filedata->file_header.e_shnum; i++)
071436c6 703 {
dda8d76d
NC
704 Elf_Internal_Shdr *sec = filedata->section_headers + i;
705
071436c6
NC
706 if (sec->sh_type == type)
707 return sec;
708 }
709
710 return NULL;
711}
712
657d0d47
CC
713/* Return a pointer to section NAME, or NULL if no such section exists,
714 restricted to the list of sections given in SET. */
715
716static Elf_Internal_Shdr *
dda8d76d 717find_section_in_set (Filedata * filedata, const char * name, unsigned int * set)
657d0d47
CC
718{
719 unsigned int i;
720
68807c3c
NC
721 if (filedata->section_headers == NULL)
722 return NULL;
723
657d0d47
CC
724 if (set != NULL)
725 {
726 while ((i = *set++) > 0)
b814a36d
NC
727 {
728 /* See PR 21156 for a reproducer. */
dda8d76d 729 if (i >= filedata->file_header.e_shnum)
b814a36d
NC
730 continue; /* FIXME: Should we issue an error message ? */
731
dda8d76d
NC
732 if (streq (SECTION_NAME (filedata->section_headers + i), name))
733 return filedata->section_headers + i;
b814a36d 734 }
657d0d47
CC
735 }
736
dda8d76d 737 return find_section (filedata, name);
657d0d47
CC
738}
739
32ec8896
NC
740/* Read an unsigned LEB128 encoded value from DATA.
741 Set *LENGTH_RETURN to the number of bytes read. */
0b6ae522 742
f6f0e17b 743static inline unsigned long
32ec8896
NC
744read_uleb128 (unsigned char * data,
745 unsigned int * length_return,
f6f0e17b 746 const unsigned char * const end)
0b6ae522 747{
f6f0e17b 748 return read_leb128 (data, length_return, FALSE, end);
0b6ae522
DJ
749}
750
32ec8896 751/* Return TRUE if the current file is for IA-64 machine and OpenVMS ABI.
28f997cf
TG
752 This OS has so many departures from the ELF standard that we test it at
753 many places. */
754
32ec8896 755static inline bfd_boolean
dda8d76d 756is_ia64_vms (Filedata * filedata)
28f997cf 757{
dda8d76d
NC
758 return filedata->file_header.e_machine == EM_IA_64
759 && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
28f997cf
TG
760}
761
bcedfee6 762/* Guess the relocation size commonly used by the specific machines. */
252b5132 763
32ec8896 764static bfd_boolean
2dc4cec1 765guess_is_rela (unsigned int e_machine)
252b5132 766{
9c19a809 767 switch (e_machine)
252b5132
RH
768 {
769 /* Targets that use REL relocations. */
252b5132 770 case EM_386:
22abe556 771 case EM_IAMCU:
f954747f 772 case EM_960:
e9f53129 773 case EM_ARM:
2b0337b0 774 case EM_D10V:
252b5132 775 case EM_CYGNUS_D10V:
e9f53129 776 case EM_DLX:
252b5132 777 case EM_MIPS:
4fe85591 778 case EM_MIPS_RS3_LE:
e9f53129 779 case EM_CYGNUS_M32R:
1c0d3aa6 780 case EM_SCORE:
f6c1a2d5 781 case EM_XGATE:
fe944acf 782 case EM_NFP:
9c19a809 783 return FALSE;
103f02d3 784
252b5132
RH
785 /* Targets that use RELA relocations. */
786 case EM_68K:
f954747f 787 case EM_860:
a06ea964 788 case EM_AARCH64:
cfb8c092 789 case EM_ADAPTEVA_EPIPHANY:
e9f53129
AM
790 case EM_ALPHA:
791 case EM_ALTERA_NIOS2:
886a2506
NC
792 case EM_ARC:
793 case EM_ARC_COMPACT:
794 case EM_ARC_COMPACT2:
e9f53129
AM
795 case EM_AVR:
796 case EM_AVR_OLD:
797 case EM_BLACKFIN:
60bca95a 798 case EM_CR16:
e9f53129
AM
799 case EM_CRIS:
800 case EM_CRX:
b8891f8d 801 case EM_CSKY:
2b0337b0 802 case EM_D30V:
252b5132 803 case EM_CYGNUS_D30V:
2b0337b0 804 case EM_FR30:
3f8107ab 805 case EM_FT32:
252b5132 806 case EM_CYGNUS_FR30:
5c70f934 807 case EM_CYGNUS_FRV:
e9f53129
AM
808 case EM_H8S:
809 case EM_H8_300:
810 case EM_H8_300H:
800eeca4 811 case EM_IA_64:
1e4cf259
NC
812 case EM_IP2K:
813 case EM_IP2K_OLD:
3b36097d 814 case EM_IQ2000:
84e94c90 815 case EM_LATTICEMICO32:
ff7eeb89 816 case EM_M32C_OLD:
49f58d10 817 case EM_M32C:
e9f53129
AM
818 case EM_M32R:
819 case EM_MCORE:
15ab5209 820 case EM_CYGNUS_MEP:
a3c62988 821 case EM_METAG:
e9f53129
AM
822 case EM_MMIX:
823 case EM_MN10200:
824 case EM_CYGNUS_MN10200:
825 case EM_MN10300:
826 case EM_CYGNUS_MN10300:
5506d11a 827 case EM_MOXIE:
e9f53129
AM
828 case EM_MSP430:
829 case EM_MSP430_OLD:
d031aafb 830 case EM_MT:
35c08157 831 case EM_NDS32:
64fd6348 832 case EM_NIOS32:
73589c9d 833 case EM_OR1K:
e9f53129
AM
834 case EM_PPC64:
835 case EM_PPC:
2b100bb5 836 case EM_TI_PRU:
e23eba97 837 case EM_RISCV:
99c513f6 838 case EM_RL78:
c7927a3c 839 case EM_RX:
e9f53129
AM
840 case EM_S390:
841 case EM_S390_OLD:
842 case EM_SH:
843 case EM_SPARC:
844 case EM_SPARC32PLUS:
845 case EM_SPARCV9:
846 case EM_SPU:
40b36596 847 case EM_TI_C6000:
aa137e4d
NC
848 case EM_TILEGX:
849 case EM_TILEPRO:
708e2187 850 case EM_V800:
e9f53129
AM
851 case EM_V850:
852 case EM_CYGNUS_V850:
853 case EM_VAX:
619ed720 854 case EM_VISIUM:
e9f53129 855 case EM_X86_64:
8a9036a4 856 case EM_L1OM:
7a9068fe 857 case EM_K1OM:
e9f53129
AM
858 case EM_XSTORMY16:
859 case EM_XTENSA:
860 case EM_XTENSA_OLD:
7ba29e2a
NC
861 case EM_MICROBLAZE:
862 case EM_MICROBLAZE_OLD:
f96bd6c2 863 case EM_WEBASSEMBLY:
9c19a809 864 return TRUE;
103f02d3 865
e9f53129
AM
866 case EM_68HC05:
867 case EM_68HC08:
868 case EM_68HC11:
869 case EM_68HC16:
870 case EM_FX66:
871 case EM_ME16:
d1133906 872 case EM_MMA:
d1133906
NC
873 case EM_NCPU:
874 case EM_NDR1:
e9f53129 875 case EM_PCP:
d1133906 876 case EM_ST100:
e9f53129 877 case EM_ST19:
d1133906 878 case EM_ST7:
e9f53129
AM
879 case EM_ST9PLUS:
880 case EM_STARCORE:
d1133906 881 case EM_SVX:
e9f53129 882 case EM_TINYJ:
9c19a809
NC
883 default:
884 warn (_("Don't know about relocations on this machine architecture\n"));
885 return FALSE;
886 }
887}
252b5132 888
dda8d76d 889/* Load RELA type relocations from FILEDATA at REL_OFFSET extending for REL_SIZE bytes.
32ec8896
NC
890 Returns TRUE upon success, FALSE otherwise. If successful then a
891 pointer to a malloc'ed buffer containing the relocs is placed in *RELASP,
892 and the number of relocs loaded is placed in *NRELASP. It is the caller's
893 responsibility to free the allocated buffer. */
894
895static bfd_boolean
dda8d76d
NC
896slurp_rela_relocs (Filedata * filedata,
897 unsigned long rel_offset,
898 unsigned long rel_size,
899 Elf_Internal_Rela ** relasp,
900 unsigned long * nrelasp)
9c19a809 901{
2cf0635d 902 Elf_Internal_Rela * relas;
8b73c356 903 size_t nrelas;
4d6ed7c8 904 unsigned int i;
252b5132 905
4d6ed7c8
NC
906 if (is_32bit_elf)
907 {
2cf0635d 908 Elf32_External_Rela * erelas;
103f02d3 909
dda8d76d 910 erelas = (Elf32_External_Rela *) get_data (NULL, filedata, rel_offset, 1,
9cf03b7e 911 rel_size, _("32-bit relocation data"));
a6e9f9df 912 if (!erelas)
32ec8896 913 return FALSE;
252b5132 914
4d6ed7c8 915 nrelas = rel_size / sizeof (Elf32_External_Rela);
103f02d3 916
3f5e193b
NC
917 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
918 sizeof (Elf_Internal_Rela));
103f02d3 919
4d6ed7c8
NC
920 if (relas == NULL)
921 {
c256ffe7 922 free (erelas);
591a748a 923 error (_("out of memory parsing relocs\n"));
32ec8896 924 return FALSE;
4d6ed7c8 925 }
103f02d3 926
4d6ed7c8
NC
927 for (i = 0; i < nrelas; i++)
928 {
929 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
930 relas[i].r_info = BYTE_GET (erelas[i].r_info);
598aaa76 931 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
4d6ed7c8 932 }
103f02d3 933
4d6ed7c8
NC
934 free (erelas);
935 }
936 else
937 {
2cf0635d 938 Elf64_External_Rela * erelas;
103f02d3 939
dda8d76d 940 erelas = (Elf64_External_Rela *) get_data (NULL, filedata, rel_offset, 1,
9cf03b7e 941 rel_size, _("64-bit relocation data"));
a6e9f9df 942 if (!erelas)
32ec8896 943 return FALSE;
4d6ed7c8
NC
944
945 nrelas = rel_size / sizeof (Elf64_External_Rela);
103f02d3 946
3f5e193b
NC
947 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
948 sizeof (Elf_Internal_Rela));
103f02d3 949
4d6ed7c8
NC
950 if (relas == NULL)
951 {
c256ffe7 952 free (erelas);
591a748a 953 error (_("out of memory parsing relocs\n"));
32ec8896 954 return FALSE;
9c19a809 955 }
4d6ed7c8
NC
956
957 for (i = 0; i < nrelas; i++)
9c19a809 958 {
66543521
AM
959 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
960 relas[i].r_info = BYTE_GET (erelas[i].r_info);
598aaa76 961 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
861fb55a
DJ
962
963 /* The #ifdef BFD64 below is to prevent a compile time
964 warning. We know that if we do not have a 64 bit data
965 type that we will never execute this code anyway. */
966#ifdef BFD64
dda8d76d
NC
967 if (filedata->file_header.e_machine == EM_MIPS
968 && filedata->file_header.e_ident[EI_DATA] != ELFDATA2MSB)
861fb55a
DJ
969 {
970 /* In little-endian objects, r_info isn't really a
971 64-bit little-endian value: it has a 32-bit
972 little-endian symbol index followed by four
973 individual byte fields. Reorder INFO
974 accordingly. */
91d6fa6a
NC
975 bfd_vma inf = relas[i].r_info;
976 inf = (((inf & 0xffffffff) << 32)
977 | ((inf >> 56) & 0xff)
978 | ((inf >> 40) & 0xff00)
979 | ((inf >> 24) & 0xff0000)
980 | ((inf >> 8) & 0xff000000));
981 relas[i].r_info = inf;
861fb55a
DJ
982 }
983#endif /* BFD64 */
4d6ed7c8 984 }
103f02d3 985
4d6ed7c8
NC
986 free (erelas);
987 }
32ec8896 988
4d6ed7c8
NC
989 *relasp = relas;
990 *nrelasp = nrelas;
32ec8896 991 return TRUE;
4d6ed7c8 992}
103f02d3 993
dda8d76d 994/* Load REL type relocations from FILEDATA at REL_OFFSET extending for REL_SIZE bytes.
32ec8896
NC
995 Returns TRUE upon success, FALSE otherwise. If successful then a
996 pointer to a malloc'ed buffer containing the relocs is placed in *RELSP,
997 and the number of relocs loaded is placed in *NRELSP. It is the caller's
998 responsibility to free the allocated buffer. */
999
1000static bfd_boolean
dda8d76d
NC
1001slurp_rel_relocs (Filedata * filedata,
1002 unsigned long rel_offset,
1003 unsigned long rel_size,
1004 Elf_Internal_Rela ** relsp,
1005 unsigned long * nrelsp)
4d6ed7c8 1006{
2cf0635d 1007 Elf_Internal_Rela * rels;
8b73c356 1008 size_t nrels;
4d6ed7c8 1009 unsigned int i;
103f02d3 1010
4d6ed7c8
NC
1011 if (is_32bit_elf)
1012 {
2cf0635d 1013 Elf32_External_Rel * erels;
103f02d3 1014
dda8d76d 1015 erels = (Elf32_External_Rel *) get_data (NULL, filedata, rel_offset, 1,
9cf03b7e 1016 rel_size, _("32-bit relocation data"));
a6e9f9df 1017 if (!erels)
32ec8896 1018 return FALSE;
103f02d3 1019
4d6ed7c8 1020 nrels = rel_size / sizeof (Elf32_External_Rel);
103f02d3 1021
3f5e193b 1022 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
103f02d3 1023
4d6ed7c8
NC
1024 if (rels == NULL)
1025 {
c256ffe7 1026 free (erels);
591a748a 1027 error (_("out of memory parsing relocs\n"));
32ec8896 1028 return FALSE;
4d6ed7c8
NC
1029 }
1030
1031 for (i = 0; i < nrels; i++)
1032 {
1033 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
1034 rels[i].r_info = BYTE_GET (erels[i].r_info);
c8286bd1 1035 rels[i].r_addend = 0;
9ea033b2 1036 }
4d6ed7c8
NC
1037
1038 free (erels);
9c19a809
NC
1039 }
1040 else
1041 {
2cf0635d 1042 Elf64_External_Rel * erels;
9ea033b2 1043
dda8d76d 1044 erels = (Elf64_External_Rel *) get_data (NULL, filedata, rel_offset, 1,
9cf03b7e 1045 rel_size, _("64-bit relocation data"));
a6e9f9df 1046 if (!erels)
32ec8896 1047 return FALSE;
103f02d3 1048
4d6ed7c8 1049 nrels = rel_size / sizeof (Elf64_External_Rel);
103f02d3 1050
3f5e193b 1051 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
103f02d3 1052
4d6ed7c8 1053 if (rels == NULL)
9c19a809 1054 {
c256ffe7 1055 free (erels);
591a748a 1056 error (_("out of memory parsing relocs\n"));
32ec8896 1057 return FALSE;
4d6ed7c8 1058 }
103f02d3 1059
4d6ed7c8
NC
1060 for (i = 0; i < nrels; i++)
1061 {
66543521
AM
1062 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
1063 rels[i].r_info = BYTE_GET (erels[i].r_info);
c8286bd1 1064 rels[i].r_addend = 0;
861fb55a
DJ
1065
1066 /* The #ifdef BFD64 below is to prevent a compile time
1067 warning. We know that if we do not have a 64 bit data
1068 type that we will never execute this code anyway. */
1069#ifdef BFD64
dda8d76d
NC
1070 if (filedata->file_header.e_machine == EM_MIPS
1071 && filedata->file_header.e_ident[EI_DATA] != ELFDATA2MSB)
861fb55a
DJ
1072 {
1073 /* In little-endian objects, r_info isn't really a
1074 64-bit little-endian value: it has a 32-bit
1075 little-endian symbol index followed by four
1076 individual byte fields. Reorder INFO
1077 accordingly. */
91d6fa6a
NC
1078 bfd_vma inf = rels[i].r_info;
1079 inf = (((inf & 0xffffffff) << 32)
1080 | ((inf >> 56) & 0xff)
1081 | ((inf >> 40) & 0xff00)
1082 | ((inf >> 24) & 0xff0000)
1083 | ((inf >> 8) & 0xff000000));
1084 rels[i].r_info = inf;
861fb55a
DJ
1085 }
1086#endif /* BFD64 */
4d6ed7c8 1087 }
103f02d3 1088
4d6ed7c8
NC
1089 free (erels);
1090 }
32ec8896 1091
4d6ed7c8
NC
1092 *relsp = rels;
1093 *nrelsp = nrels;
32ec8896 1094 return TRUE;
4d6ed7c8 1095}
103f02d3 1096
aca88567
NC
1097/* Returns the reloc type extracted from the reloc info field. */
1098
1099static unsigned int
dda8d76d 1100get_reloc_type (Filedata * filedata, bfd_vma reloc_info)
aca88567
NC
1101{
1102 if (is_32bit_elf)
1103 return ELF32_R_TYPE (reloc_info);
1104
dda8d76d 1105 switch (filedata->file_header.e_machine)
aca88567
NC
1106 {
1107 case EM_MIPS:
1108 /* Note: We assume that reloc_info has already been adjusted for us. */
1109 return ELF64_MIPS_R_TYPE (reloc_info);
1110
1111 case EM_SPARCV9:
1112 return ELF64_R_TYPE_ID (reloc_info);
1113
1114 default:
1115 return ELF64_R_TYPE (reloc_info);
1116 }
1117}
1118
1119/* Return the symbol index extracted from the reloc info field. */
1120
1121static bfd_vma
1122get_reloc_symindex (bfd_vma reloc_info)
1123{
1124 return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
1125}
1126
13761a11 1127static inline bfd_boolean
dda8d76d 1128uses_msp430x_relocs (Filedata * filedata)
13761a11
NC
1129{
1130 return
dda8d76d 1131 filedata->file_header.e_machine == EM_MSP430 /* Paranoia. */
13761a11 1132 /* GCC uses osabi == ELFOSBI_STANDALONE. */
dda8d76d 1133 && (((filedata->file_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
13761a11 1134 /* TI compiler uses ELFOSABI_NONE. */
dda8d76d 1135 || (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
13761a11
NC
1136}
1137
d3ba0551
AM
1138/* Display the contents of the relocation data found at the specified
1139 offset. */
ee42cf8c 1140
32ec8896 1141static bfd_boolean
dda8d76d
NC
1142dump_relocations (Filedata * filedata,
1143 unsigned long rel_offset,
1144 unsigned long rel_size,
1145 Elf_Internal_Sym * symtab,
1146 unsigned long nsyms,
1147 char * strtab,
1148 unsigned long strtablen,
1149 int is_rela,
1150 bfd_boolean is_dynsym)
4d6ed7c8 1151{
32ec8896 1152 unsigned long i;
2cf0635d 1153 Elf_Internal_Rela * rels;
32ec8896 1154 bfd_boolean res = TRUE;
103f02d3 1155
4d6ed7c8 1156 if (is_rela == UNKNOWN)
dda8d76d 1157 is_rela = guess_is_rela (filedata->file_header.e_machine);
103f02d3 1158
4d6ed7c8
NC
1159 if (is_rela)
1160 {
dda8d76d 1161 if (!slurp_rela_relocs (filedata, rel_offset, rel_size, &rels, &rel_size))
32ec8896 1162 return FALSE;
4d6ed7c8
NC
1163 }
1164 else
1165 {
dda8d76d 1166 if (!slurp_rel_relocs (filedata, rel_offset, rel_size, &rels, &rel_size))
32ec8896 1167 return FALSE;
252b5132
RH
1168 }
1169
410f7a12
L
1170 if (is_32bit_elf)
1171 {
1172 if (is_rela)
2c71103e
NC
1173 {
1174 if (do_wide)
1175 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
1176 else
1177 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
1178 }
410f7a12 1179 else
2c71103e
NC
1180 {
1181 if (do_wide)
1182 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
1183 else
1184 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
1185 }
410f7a12 1186 }
252b5132 1187 else
410f7a12
L
1188 {
1189 if (is_rela)
2c71103e
NC
1190 {
1191 if (do_wide)
8beeaeb7 1192 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
2c71103e
NC
1193 else
1194 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
1195 }
410f7a12 1196 else
2c71103e
NC
1197 {
1198 if (do_wide)
8beeaeb7 1199 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
2c71103e
NC
1200 else
1201 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
1202 }
410f7a12 1203 }
252b5132
RH
1204
1205 for (i = 0; i < rel_size; i++)
1206 {
2cf0635d 1207 const char * rtype;
b34976b6 1208 bfd_vma offset;
91d6fa6a 1209 bfd_vma inf;
b34976b6
AM
1210 bfd_vma symtab_index;
1211 bfd_vma type;
103f02d3 1212
b34976b6 1213 offset = rels[i].r_offset;
91d6fa6a 1214 inf = rels[i].r_info;
103f02d3 1215
dda8d76d 1216 type = get_reloc_type (filedata, inf);
91d6fa6a 1217 symtab_index = get_reloc_symindex (inf);
252b5132 1218
410f7a12
L
1219 if (is_32bit_elf)
1220 {
39dbeff8
AM
1221 printf ("%8.8lx %8.8lx ",
1222 (unsigned long) offset & 0xffffffff,
91d6fa6a 1223 (unsigned long) inf & 0xffffffff);
410f7a12
L
1224 }
1225 else
1226 {
39dbeff8
AM
1227#if BFD_HOST_64BIT_LONG
1228 printf (do_wide
1229 ? "%16.16lx %16.16lx "
1230 : "%12.12lx %12.12lx ",
91d6fa6a 1231 offset, inf);
39dbeff8 1232#elif BFD_HOST_64BIT_LONG_LONG
6e3d6dc1 1233#ifndef __MSVCRT__
39dbeff8
AM
1234 printf (do_wide
1235 ? "%16.16llx %16.16llx "
1236 : "%12.12llx %12.12llx ",
91d6fa6a 1237 offset, inf);
6e3d6dc1
NC
1238#else
1239 printf (do_wide
1240 ? "%16.16I64x %16.16I64x "
1241 : "%12.12I64x %12.12I64x ",
91d6fa6a 1242 offset, inf);
6e3d6dc1 1243#endif
39dbeff8 1244#else
2c71103e
NC
1245 printf (do_wide
1246 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1247 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
410f7a12
L
1248 _bfd_int64_high (offset),
1249 _bfd_int64_low (offset),
91d6fa6a
NC
1250 _bfd_int64_high (inf),
1251 _bfd_int64_low (inf));
9ea033b2 1252#endif
410f7a12 1253 }
103f02d3 1254
dda8d76d 1255 switch (filedata->file_header.e_machine)
252b5132
RH
1256 {
1257 default:
1258 rtype = NULL;
1259 break;
1260
a06ea964
NC
1261 case EM_AARCH64:
1262 rtype = elf_aarch64_reloc_type (type);
1263 break;
1264
2b0337b0 1265 case EM_M32R:
252b5132 1266 case EM_CYGNUS_M32R:
9ea033b2 1267 rtype = elf_m32r_reloc_type (type);
252b5132
RH
1268 break;
1269
1270 case EM_386:
22abe556 1271 case EM_IAMCU:
9ea033b2 1272 rtype = elf_i386_reloc_type (type);
252b5132
RH
1273 break;
1274
ba2685cc
AM
1275 case EM_68HC11:
1276 case EM_68HC12:
1277 rtype = elf_m68hc11_reloc_type (type);
1278 break;
75751cd9 1279
7b4ae824
JD
1280 case EM_S12Z:
1281 rtype = elf_s12z_reloc_type (type);
1282 break;
1283
252b5132 1284 case EM_68K:
9ea033b2 1285 rtype = elf_m68k_reloc_type (type);
252b5132
RH
1286 break;
1287
f954747f
AM
1288 case EM_960:
1289 rtype = elf_i960_reloc_type (type);
1290 break;
1291
adde6300 1292 case EM_AVR:
2b0337b0 1293 case EM_AVR_OLD:
adde6300
AM
1294 rtype = elf_avr_reloc_type (type);
1295 break;
1296
9ea033b2
NC
1297 case EM_OLD_SPARCV9:
1298 case EM_SPARC32PLUS:
1299 case EM_SPARCV9:
252b5132 1300 case EM_SPARC:
9ea033b2 1301 rtype = elf_sparc_reloc_type (type);
252b5132
RH
1302 break;
1303
e9f53129
AM
1304 case EM_SPU:
1305 rtype = elf_spu_reloc_type (type);
1306 break;
1307
708e2187
NC
1308 case EM_V800:
1309 rtype = v800_reloc_type (type);
1310 break;
2b0337b0 1311 case EM_V850:
252b5132 1312 case EM_CYGNUS_V850:
9ea033b2 1313 rtype = v850_reloc_type (type);
252b5132
RH
1314 break;
1315
2b0337b0 1316 case EM_D10V:
252b5132 1317 case EM_CYGNUS_D10V:
9ea033b2 1318 rtype = elf_d10v_reloc_type (type);
252b5132
RH
1319 break;
1320
2b0337b0 1321 case EM_D30V:
252b5132 1322 case EM_CYGNUS_D30V:
9ea033b2 1323 rtype = elf_d30v_reloc_type (type);
252b5132
RH
1324 break;
1325
d172d4ba
NC
1326 case EM_DLX:
1327 rtype = elf_dlx_reloc_type (type);
1328 break;
1329
252b5132 1330 case EM_SH:
9ea033b2 1331 rtype = elf_sh_reloc_type (type);
252b5132
RH
1332 break;
1333
2b0337b0 1334 case EM_MN10300:
252b5132 1335 case EM_CYGNUS_MN10300:
9ea033b2 1336 rtype = elf_mn10300_reloc_type (type);
252b5132
RH
1337 break;
1338
2b0337b0 1339 case EM_MN10200:
252b5132 1340 case EM_CYGNUS_MN10200:
9ea033b2 1341 rtype = elf_mn10200_reloc_type (type);
252b5132
RH
1342 break;
1343
2b0337b0 1344 case EM_FR30:
252b5132 1345 case EM_CYGNUS_FR30:
9ea033b2 1346 rtype = elf_fr30_reloc_type (type);
252b5132
RH
1347 break;
1348
ba2685cc
AM
1349 case EM_CYGNUS_FRV:
1350 rtype = elf_frv_reloc_type (type);
1351 break;
5c70f934 1352
b8891f8d
AJ
1353 case EM_CSKY:
1354 rtype = elf_csky_reloc_type (type);
1355 break;
1356
3f8107ab
AM
1357 case EM_FT32:
1358 rtype = elf_ft32_reloc_type (type);
1359 break;
1360
252b5132 1361 case EM_MCORE:
9ea033b2 1362 rtype = elf_mcore_reloc_type (type);
252b5132
RH
1363 break;
1364
3c3bdf30
NC
1365 case EM_MMIX:
1366 rtype = elf_mmix_reloc_type (type);
1367 break;
1368
5506d11a
AM
1369 case EM_MOXIE:
1370 rtype = elf_moxie_reloc_type (type);
1371 break;
1372
2469cfa2 1373 case EM_MSP430:
dda8d76d 1374 if (uses_msp430x_relocs (filedata))
13761a11
NC
1375 {
1376 rtype = elf_msp430x_reloc_type (type);
1377 break;
1378 }
1a0670f3 1379 /* Fall through. */
2469cfa2
NC
1380 case EM_MSP430_OLD:
1381 rtype = elf_msp430_reloc_type (type);
1382 break;
1383
35c08157
KLC
1384 case EM_NDS32:
1385 rtype = elf_nds32_reloc_type (type);
1386 break;
1387
252b5132 1388 case EM_PPC:
9ea033b2 1389 rtype = elf_ppc_reloc_type (type);
252b5132
RH
1390 break;
1391
c833c019
AM
1392 case EM_PPC64:
1393 rtype = elf_ppc64_reloc_type (type);
1394 break;
1395
252b5132 1396 case EM_MIPS:
4fe85591 1397 case EM_MIPS_RS3_LE:
9ea033b2 1398 rtype = elf_mips_reloc_type (type);
252b5132
RH
1399 break;
1400
e23eba97
NC
1401 case EM_RISCV:
1402 rtype = elf_riscv_reloc_type (type);
1403 break;
1404
252b5132 1405 case EM_ALPHA:
9ea033b2 1406 rtype = elf_alpha_reloc_type (type);
252b5132
RH
1407 break;
1408
1409 case EM_ARM:
9ea033b2 1410 rtype = elf_arm_reloc_type (type);
252b5132
RH
1411 break;
1412
584da044 1413 case EM_ARC:
886a2506
NC
1414 case EM_ARC_COMPACT:
1415 case EM_ARC_COMPACT2:
9ea033b2 1416 rtype = elf_arc_reloc_type (type);
252b5132
RH
1417 break;
1418
1419 case EM_PARISC:
69e617ca 1420 rtype = elf_hppa_reloc_type (type);
252b5132 1421 break;
7d466069 1422
b8720f9d
JL
1423 case EM_H8_300:
1424 case EM_H8_300H:
1425 case EM_H8S:
1426 rtype = elf_h8_reloc_type (type);
1427 break;
1428
73589c9d
CS
1429 case EM_OR1K:
1430 rtype = elf_or1k_reloc_type (type);
3b16e843
NC
1431 break;
1432
7d466069 1433 case EM_PJ:
2b0337b0 1434 case EM_PJ_OLD:
7d466069
ILT
1435 rtype = elf_pj_reloc_type (type);
1436 break;
800eeca4
JW
1437 case EM_IA_64:
1438 rtype = elf_ia64_reloc_type (type);
1439 break;
1b61cf92
HPN
1440
1441 case EM_CRIS:
1442 rtype = elf_cris_reloc_type (type);
1443 break;
535c37ff 1444
f954747f
AM
1445 case EM_860:
1446 rtype = elf_i860_reloc_type (type);
1447 break;
1448
bcedfee6 1449 case EM_X86_64:
8a9036a4 1450 case EM_L1OM:
7a9068fe 1451 case EM_K1OM:
bcedfee6
NC
1452 rtype = elf_x86_64_reloc_type (type);
1453 break;
a85d7ed0 1454
f954747f
AM
1455 case EM_S370:
1456 rtype = i370_reloc_type (type);
1457 break;
1458
53c7db4b
KH
1459 case EM_S390_OLD:
1460 case EM_S390:
1461 rtype = elf_s390_reloc_type (type);
1462 break;
93fbbb04 1463
1c0d3aa6
NC
1464 case EM_SCORE:
1465 rtype = elf_score_reloc_type (type);
1466 break;
1467
93fbbb04
GK
1468 case EM_XSTORMY16:
1469 rtype = elf_xstormy16_reloc_type (type);
1470 break;
179d3252 1471
1fe1f39c
NC
1472 case EM_CRX:
1473 rtype = elf_crx_reloc_type (type);
1474 break;
1475
179d3252
JT
1476 case EM_VAX:
1477 rtype = elf_vax_reloc_type (type);
1478 break;
1e4cf259 1479
619ed720
EB
1480 case EM_VISIUM:
1481 rtype = elf_visium_reloc_type (type);
1482 break;
1483
cfb8c092
NC
1484 case EM_ADAPTEVA_EPIPHANY:
1485 rtype = elf_epiphany_reloc_type (type);
1486 break;
1487
1e4cf259
NC
1488 case EM_IP2K:
1489 case EM_IP2K_OLD:
1490 rtype = elf_ip2k_reloc_type (type);
1491 break;
3b36097d
SC
1492
1493 case EM_IQ2000:
1494 rtype = elf_iq2000_reloc_type (type);
1495 break;
88da6820
NC
1496
1497 case EM_XTENSA_OLD:
1498 case EM_XTENSA:
1499 rtype = elf_xtensa_reloc_type (type);
1500 break;
a34e3ecb 1501
84e94c90
NC
1502 case EM_LATTICEMICO32:
1503 rtype = elf_lm32_reloc_type (type);
1504 break;
1505
ff7eeb89 1506 case EM_M32C_OLD:
49f58d10
JB
1507 case EM_M32C:
1508 rtype = elf_m32c_reloc_type (type);
1509 break;
1510
d031aafb
NS
1511 case EM_MT:
1512 rtype = elf_mt_reloc_type (type);
a34e3ecb 1513 break;
1d65ded4
CM
1514
1515 case EM_BLACKFIN:
1516 rtype = elf_bfin_reloc_type (type);
1517 break;
15ab5209
DB
1518
1519 case EM_CYGNUS_MEP:
1520 rtype = elf_mep_reloc_type (type);
1521 break;
60bca95a
NC
1522
1523 case EM_CR16:
1524 rtype = elf_cr16_reloc_type (type);
1525 break;
dd24e3da 1526
7ba29e2a
NC
1527 case EM_MICROBLAZE:
1528 case EM_MICROBLAZE_OLD:
1529 rtype = elf_microblaze_reloc_type (type);
1530 break;
c7927a3c 1531
99c513f6
DD
1532 case EM_RL78:
1533 rtype = elf_rl78_reloc_type (type);
1534 break;
1535
c7927a3c
NC
1536 case EM_RX:
1537 rtype = elf_rx_reloc_type (type);
1538 break;
c29aca4a 1539
a3c62988
NC
1540 case EM_METAG:
1541 rtype = elf_metag_reloc_type (type);
1542 break;
1543
c29aca4a
NC
1544 case EM_XC16X:
1545 case EM_C166:
1546 rtype = elf_xc16x_reloc_type (type);
1547 break;
40b36596
JM
1548
1549 case EM_TI_C6000:
1550 rtype = elf_tic6x_reloc_type (type);
1551 break;
aa137e4d
NC
1552
1553 case EM_TILEGX:
1554 rtype = elf_tilegx_reloc_type (type);
1555 break;
1556
1557 case EM_TILEPRO:
1558 rtype = elf_tilepro_reloc_type (type);
1559 break;
f6c1a2d5 1560
f96bd6c2
PC
1561 case EM_WEBASSEMBLY:
1562 rtype = elf_wasm32_reloc_type (type);
1563 break;
1564
f6c1a2d5
NC
1565 case EM_XGATE:
1566 rtype = elf_xgate_reloc_type (type);
1567 break;
36591ba1
SL
1568
1569 case EM_ALTERA_NIOS2:
1570 rtype = elf_nios2_reloc_type (type);
1571 break;
2b100bb5
DD
1572
1573 case EM_TI_PRU:
1574 rtype = elf_pru_reloc_type (type);
1575 break;
fe944acf
FT
1576
1577 case EM_NFP:
1578 if (EF_NFP_MACH (filedata->file_header.e_flags) == E_NFP_MACH_3200)
1579 rtype = elf_nfp3200_reloc_type (type);
1580 else
1581 rtype = elf_nfp_reloc_type (type);
1582 break;
252b5132
RH
1583 }
1584
1585 if (rtype == NULL)
39dbeff8 1586 printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
252b5132 1587 else
5c144731 1588 printf (do_wide ? "%-22s" : "%-17.17s", rtype);
252b5132 1589
dda8d76d 1590 if (filedata->file_header.e_machine == EM_ALPHA
157c2599 1591 && rtype != NULL
7ace3541
RH
1592 && streq (rtype, "R_ALPHA_LITUSE")
1593 && is_rela)
1594 {
1595 switch (rels[i].r_addend)
1596 {
1597 case LITUSE_ALPHA_ADDR: rtype = "ADDR"; break;
1598 case LITUSE_ALPHA_BASE: rtype = "BASE"; break;
1599 case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1600 case LITUSE_ALPHA_JSR: rtype = "JSR"; break;
1601 case LITUSE_ALPHA_TLSGD: rtype = "TLSGD"; break;
1602 case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1603 case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1604 default: rtype = NULL;
1605 }
32ec8896 1606
7ace3541
RH
1607 if (rtype)
1608 printf (" (%s)", rtype);
1609 else
1610 {
1611 putchar (' ');
1612 printf (_("<unknown addend: %lx>"),
1613 (unsigned long) rels[i].r_addend);
32ec8896 1614 res = FALSE;
7ace3541
RH
1615 }
1616 }
1617 else if (symtab_index)
252b5132 1618 {
af3fc3bc 1619 if (symtab == NULL || symtab_index >= nsyms)
32ec8896
NC
1620 {
1621 error (_(" bad symbol index: %08lx in reloc"), (unsigned long) symtab_index);
1622 res = FALSE;
1623 }
af3fc3bc 1624 else
19936277 1625 {
2cf0635d 1626 Elf_Internal_Sym * psym;
bb4d2ac2
L
1627 const char * version_string;
1628 enum versioned_symbol_info sym_info;
1629 unsigned short vna_other;
19936277 1630
af3fc3bc 1631 psym = symtab + symtab_index;
103f02d3 1632
bb4d2ac2 1633 version_string
dda8d76d 1634 = get_symbol_version_string (filedata, is_dynsym,
bb4d2ac2
L
1635 strtab, strtablen,
1636 symtab_index,
1637 psym,
1638 &sym_info,
1639 &vna_other);
1640
af3fc3bc 1641 printf (" ");
171191ba 1642
d8045f23
NC
1643 if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1644 {
1645 const char * name;
1646 unsigned int len;
1647 unsigned int width = is_32bit_elf ? 8 : 14;
1648
1649 /* Relocations against GNU_IFUNC symbols do not use the value
1650 of the symbol as the address to relocate against. Instead
1651 they invoke the function named by the symbol and use its
1652 result as the address for relocation.
1653
1654 To indicate this to the user, do not display the value of
1655 the symbol in the "Symbols's Value" field. Instead show
1656 its name followed by () as a hint that the symbol is
1657 invoked. */
1658
1659 if (strtab == NULL
1660 || psym->st_name == 0
1661 || psym->st_name >= strtablen)
1662 name = "??";
1663 else
1664 name = strtab + psym->st_name;
1665
1666 len = print_symbol (width, name);
bb4d2ac2
L
1667 if (version_string)
1668 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1669 version_string);
d8045f23
NC
1670 printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1671 }
1672 else
1673 {
1674 print_vma (psym->st_value, LONG_HEX);
171191ba 1675
d8045f23
NC
1676 printf (is_32bit_elf ? " " : " ");
1677 }
103f02d3 1678
af3fc3bc 1679 if (psym->st_name == 0)
f1ef08cb 1680 {
2cf0635d 1681 const char * sec_name = "<null>";
f1ef08cb
AM
1682 char name_buf[40];
1683
1684 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1685 {
dda8d76d
NC
1686 if (psym->st_shndx < filedata->file_header.e_shnum)
1687 sec_name = SECTION_NAME (filedata->section_headers + psym->st_shndx);
f1ef08cb
AM
1688 else if (psym->st_shndx == SHN_ABS)
1689 sec_name = "ABS";
1690 else if (psym->st_shndx == SHN_COMMON)
1691 sec_name = "COMMON";
dda8d76d 1692 else if ((filedata->file_header.e_machine == EM_MIPS
ac145307 1693 && psym->st_shndx == SHN_MIPS_SCOMMON)
dda8d76d 1694 || (filedata->file_header.e_machine == EM_TI_C6000
ac145307 1695 && psym->st_shndx == SHN_TIC6X_SCOMMON))
172553c7 1696 sec_name = "SCOMMON";
dda8d76d 1697 else if (filedata->file_header.e_machine == EM_MIPS
172553c7
TS
1698 && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1699 sec_name = "SUNDEF";
dda8d76d
NC
1700 else if ((filedata->file_header.e_machine == EM_X86_64
1701 || filedata->file_header.e_machine == EM_L1OM
1702 || filedata->file_header.e_machine == EM_K1OM)
3b22753a
L
1703 && psym->st_shndx == SHN_X86_64_LCOMMON)
1704 sec_name = "LARGE_COMMON";
dda8d76d
NC
1705 else if (filedata->file_header.e_machine == EM_IA_64
1706 && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
9ce701e2
L
1707 && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1708 sec_name = "ANSI_COM";
dda8d76d 1709 else if (is_ia64_vms (filedata)
148b93f2
NC
1710 && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1711 sec_name = "VMS_SYMVEC";
f1ef08cb
AM
1712 else
1713 {
1714 sprintf (name_buf, "<section 0x%x>",
1715 (unsigned int) psym->st_shndx);
1716 sec_name = name_buf;
1717 }
1718 }
1719 print_symbol (22, sec_name);
1720 }
af3fc3bc 1721 else if (strtab == NULL)
d79b3d50 1722 printf (_("<string table index: %3ld>"), psym->st_name);
c256ffe7 1723 else if (psym->st_name >= strtablen)
32ec8896
NC
1724 {
1725 error (_("<corrupt string table index: %3ld>"), psym->st_name);
1726 res = FALSE;
1727 }
af3fc3bc 1728 else
bb4d2ac2
L
1729 {
1730 print_symbol (22, strtab + psym->st_name);
1731 if (version_string)
1732 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1733 version_string);
1734 }
103f02d3 1735
af3fc3bc 1736 if (is_rela)
171191ba 1737 {
7360e63f 1738 bfd_vma off = rels[i].r_addend;
171191ba 1739
7360e63f 1740 if ((bfd_signed_vma) off < 0)
598aaa76 1741 printf (" - %" BFD_VMA_FMT "x", - off);
171191ba 1742 else
598aaa76 1743 printf (" + %" BFD_VMA_FMT "x", off);
171191ba 1744 }
19936277 1745 }
252b5132 1746 }
1b228002 1747 else if (is_rela)
f7a99963 1748 {
7360e63f 1749 bfd_vma off = rels[i].r_addend;
e04d7088
L
1750
1751 printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
7360e63f 1752 if ((bfd_signed_vma) off < 0)
e04d7088
L
1753 printf ("-%" BFD_VMA_FMT "x", - off);
1754 else
1755 printf ("%" BFD_VMA_FMT "x", off);
f7a99963 1756 }
252b5132 1757
dda8d76d 1758 if (filedata->file_header.e_machine == EM_SPARCV9
157c2599
NC
1759 && rtype != NULL
1760 && streq (rtype, "R_SPARC_OLO10"))
91d6fa6a 1761 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
351b4b40 1762
252b5132 1763 putchar ('\n');
2c71103e 1764
aca88567 1765#ifdef BFD64
dda8d76d 1766 if (! is_32bit_elf && filedata->file_header.e_machine == EM_MIPS)
2c71103e 1767 {
91d6fa6a
NC
1768 bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1769 bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
2cf0635d
NC
1770 const char * rtype2 = elf_mips_reloc_type (type2);
1771 const char * rtype3 = elf_mips_reloc_type (type3);
aca88567 1772
2c71103e
NC
1773 printf (" Type2: ");
1774
1775 if (rtype2 == NULL)
39dbeff8
AM
1776 printf (_("unrecognized: %-7lx"),
1777 (unsigned long) type2 & 0xffffffff);
2c71103e
NC
1778 else
1779 printf ("%-17.17s", rtype2);
1780
18bd398b 1781 printf ("\n Type3: ");
2c71103e
NC
1782
1783 if (rtype3 == NULL)
39dbeff8
AM
1784 printf (_("unrecognized: %-7lx"),
1785 (unsigned long) type3 & 0xffffffff);
2c71103e
NC
1786 else
1787 printf ("%-17.17s", rtype3);
1788
53c7db4b 1789 putchar ('\n');
2c71103e 1790 }
aca88567 1791#endif /* BFD64 */
252b5132
RH
1792 }
1793
c8286bd1 1794 free (rels);
32ec8896
NC
1795
1796 return res;
252b5132
RH
1797}
1798
1799static const char *
d3ba0551 1800get_mips_dynamic_type (unsigned long type)
252b5132
RH
1801{
1802 switch (type)
1803 {
1804 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1805 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1806 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1807 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1808 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1809 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1810 case DT_MIPS_MSYM: return "MIPS_MSYM";
1811 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1812 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1813 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1814 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1815 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1816 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1817 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1818 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1819 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1820 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
a5499fa4 1821 case DT_MIPS_RLD_MAP_REL: return "MIPS_RLD_MAP_REL";
252b5132
RH
1822 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1823 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1824 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1825 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1826 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1827 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1828 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1829 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1830 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1831 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1832 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1833 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1834 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1835 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1836 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1837 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1838 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1839 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1840 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1841 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1842 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1843 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1844 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1845 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1846 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1847 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
861fb55a
DJ
1848 case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1849 case DT_MIPS_RWPLT: return "MIPS_RWPLT";
252b5132
RH
1850 default:
1851 return NULL;
1852 }
1853}
1854
9a097730 1855static const char *
d3ba0551 1856get_sparc64_dynamic_type (unsigned long type)
9a097730
RH
1857{
1858 switch (type)
1859 {
1860 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1861 default:
1862 return NULL;
1863 }
103f02d3
UD
1864}
1865
7490d522
AM
1866static const char *
1867get_ppc_dynamic_type (unsigned long type)
1868{
1869 switch (type)
1870 {
a7f2871e 1871 case DT_PPC_GOT: return "PPC_GOT";
e8910a83 1872 case DT_PPC_OPT: return "PPC_OPT";
7490d522
AM
1873 default:
1874 return NULL;
1875 }
1876}
1877
f1cb7e17 1878static const char *
d3ba0551 1879get_ppc64_dynamic_type (unsigned long type)
f1cb7e17
AM
1880{
1881 switch (type)
1882 {
a7f2871e
AM
1883 case DT_PPC64_GLINK: return "PPC64_GLINK";
1884 case DT_PPC64_OPD: return "PPC64_OPD";
1885 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
e8910a83 1886 case DT_PPC64_OPT: return "PPC64_OPT";
f1cb7e17
AM
1887 default:
1888 return NULL;
1889 }
1890}
1891
103f02d3 1892static const char *
d3ba0551 1893get_parisc_dynamic_type (unsigned long type)
103f02d3
UD
1894{
1895 switch (type)
1896 {
1897 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1898 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1899 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1900 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1901 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1902 case DT_HP_PREINIT: return "HP_PREINIT";
1903 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1904 case DT_HP_NEEDED: return "HP_NEEDED";
1905 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1906 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1907 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1908 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1909 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
eec8f817
DA
1910 case DT_HP_EPLTREL: return "HP_GST_EPLTREL";
1911 case DT_HP_EPLTRELSZ: return "HP_GST_EPLTRELSZ";
1912 case DT_HP_FILTERED: return "HP_FILTERED";
1913 case DT_HP_FILTER_TLS: return "HP_FILTER_TLS";
1914 case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1915 case DT_HP_LAZYLOAD: return "HP_LAZYLOAD";
1916 case DT_HP_BIND_NOW_COUNT: return "HP_BIND_NOW_COUNT";
1917 case DT_PLT: return "PLT";
1918 case DT_PLT_SIZE: return "PLT_SIZE";
1919 case DT_DLT: return "DLT";
1920 case DT_DLT_SIZE: return "DLT_SIZE";
103f02d3
UD
1921 default:
1922 return NULL;
1923 }
1924}
9a097730 1925
ecc51f48 1926static const char *
d3ba0551 1927get_ia64_dynamic_type (unsigned long type)
ecc51f48
NC
1928{
1929 switch (type)
1930 {
148b93f2
NC
1931 case DT_IA_64_PLT_RESERVE: return "IA_64_PLT_RESERVE";
1932 case DT_IA_64_VMS_SUBTYPE: return "VMS_SUBTYPE";
1933 case DT_IA_64_VMS_IMGIOCNT: return "VMS_IMGIOCNT";
1934 case DT_IA_64_VMS_LNKFLAGS: return "VMS_LNKFLAGS";
1935 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1936 case DT_IA_64_VMS_IDENT: return "VMS_IDENT";
1937 case DT_IA_64_VMS_NEEDED_IDENT: return "VMS_NEEDED_IDENT";
1938 case DT_IA_64_VMS_IMG_RELA_CNT: return "VMS_IMG_RELA_CNT";
1939 case DT_IA_64_VMS_SEG_RELA_CNT: return "VMS_SEG_RELA_CNT";
1940 case DT_IA_64_VMS_FIXUP_RELA_CNT: return "VMS_FIXUP_RELA_CNT";
1941 case DT_IA_64_VMS_FIXUP_NEEDED: return "VMS_FIXUP_NEEDED";
1942 case DT_IA_64_VMS_SYMVEC_CNT: return "VMS_SYMVEC_CNT";
1943 case DT_IA_64_VMS_XLATED: return "VMS_XLATED";
1944 case DT_IA_64_VMS_STACKSIZE: return "VMS_STACKSIZE";
1945 case DT_IA_64_VMS_UNWINDSZ: return "VMS_UNWINDSZ";
1946 case DT_IA_64_VMS_UNWIND_CODSEG: return "VMS_UNWIND_CODSEG";
1947 case DT_IA_64_VMS_UNWIND_INFOSEG: return "VMS_UNWIND_INFOSEG";
1948 case DT_IA_64_VMS_LINKTIME: return "VMS_LINKTIME";
1949 case DT_IA_64_VMS_SEG_NO: return "VMS_SEG_NO";
1950 case DT_IA_64_VMS_SYMVEC_OFFSET: return "VMS_SYMVEC_OFFSET";
1951 case DT_IA_64_VMS_SYMVEC_SEG: return "VMS_SYMVEC_SEG";
1952 case DT_IA_64_VMS_UNWIND_OFFSET: return "VMS_UNWIND_OFFSET";
1953 case DT_IA_64_VMS_UNWIND_SEG: return "VMS_UNWIND_SEG";
1954 case DT_IA_64_VMS_STRTAB_OFFSET: return "VMS_STRTAB_OFFSET";
1955 case DT_IA_64_VMS_SYSVER_OFFSET: return "VMS_SYSVER_OFFSET";
1956 case DT_IA_64_VMS_IMG_RELA_OFF: return "VMS_IMG_RELA_OFF";
1957 case DT_IA_64_VMS_SEG_RELA_OFF: return "VMS_SEG_RELA_OFF";
1958 case DT_IA_64_VMS_FIXUP_RELA_OFF: return "VMS_FIXUP_RELA_OFF";
1959 case DT_IA_64_VMS_PLTGOT_OFFSET: return "VMS_PLTGOT_OFFSET";
1960 case DT_IA_64_VMS_PLTGOT_SEG: return "VMS_PLTGOT_SEG";
1961 case DT_IA_64_VMS_FPMODE: return "VMS_FPMODE";
ecc51f48
NC
1962 default:
1963 return NULL;
1964 }
1965}
1966
fd85a6a1
NC
1967static const char *
1968get_solaris_section_type (unsigned long type)
1969{
1970 switch (type)
1971 {
1972 case 0x6fffffee: return "SUNW_ancillary";
1973 case 0x6fffffef: return "SUNW_capchain";
1974 case 0x6ffffff0: return "SUNW_capinfo";
1975 case 0x6ffffff1: return "SUNW_symsort";
1976 case 0x6ffffff2: return "SUNW_tlssort";
1977 case 0x6ffffff3: return "SUNW_LDYNSYM";
1978 case 0x6ffffff4: return "SUNW_dof";
1979 case 0x6ffffff5: return "SUNW_cap";
1980 case 0x6ffffff6: return "SUNW_SIGNATURE";
1981 case 0x6ffffff7: return "SUNW_ANNOTATE";
1982 case 0x6ffffff8: return "SUNW_DEBUGSTR";
1983 case 0x6ffffff9: return "SUNW_DEBUG";
1984 case 0x6ffffffa: return "SUNW_move";
1985 case 0x6ffffffb: return "SUNW_COMDAT";
1986 case 0x6ffffffc: return "SUNW_syminfo";
1987 case 0x6ffffffd: return "SUNW_verdef";
1988 case 0x6ffffffe: return "SUNW_verneed";
1989 case 0x6fffffff: return "SUNW_versym";
1990 case 0x70000000: return "SPARC_GOTDATA";
1991 default: return NULL;
1992 }
1993}
1994
fabcb361
RH
1995static const char *
1996get_alpha_dynamic_type (unsigned long type)
1997{
1998 switch (type)
1999 {
2000 case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
32ec8896 2001 default: return NULL;
fabcb361
RH
2002 }
2003}
2004
1c0d3aa6
NC
2005static const char *
2006get_score_dynamic_type (unsigned long type)
2007{
2008 switch (type)
2009 {
2010 case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
2011 case DT_SCORE_LOCAL_GOTNO: return "SCORE_LOCAL_GOTNO";
2012 case DT_SCORE_SYMTABNO: return "SCORE_SYMTABNO";
2013 case DT_SCORE_GOTSYM: return "SCORE_GOTSYM";
2014 case DT_SCORE_UNREFEXTNO: return "SCORE_UNREFEXTNO";
2015 case DT_SCORE_HIPAGENO: return "SCORE_HIPAGENO";
32ec8896 2016 default: return NULL;
1c0d3aa6
NC
2017 }
2018}
2019
40b36596
JM
2020static const char *
2021get_tic6x_dynamic_type (unsigned long type)
2022{
2023 switch (type)
2024 {
2025 case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
2026 case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
2027 case DT_C6000_DSBT_BASE: return "C6000_DSBT_BASE";
2028 case DT_C6000_DSBT_SIZE: return "C6000_DSBT_SIZE";
2029 case DT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
2030 case DT_C6000_DSBT_INDEX: return "C6000_DSBT_INDEX";
32ec8896 2031 default: return NULL;
40b36596
JM
2032 }
2033}
1c0d3aa6 2034
36591ba1
SL
2035static const char *
2036get_nios2_dynamic_type (unsigned long type)
2037{
2038 switch (type)
2039 {
2040 case DT_NIOS2_GP: return "NIOS2_GP";
32ec8896 2041 default: return NULL;
36591ba1
SL
2042 }
2043}
2044
fd85a6a1
NC
2045static const char *
2046get_solaris_dynamic_type (unsigned long type)
2047{
2048 switch (type)
2049 {
2050 case 0x6000000d: return "SUNW_AUXILIARY";
2051 case 0x6000000e: return "SUNW_RTLDINF";
2052 case 0x6000000f: return "SUNW_FILTER";
2053 case 0x60000010: return "SUNW_CAP";
2054 case 0x60000011: return "SUNW_SYMTAB";
2055 case 0x60000012: return "SUNW_SYMSZ";
2056 case 0x60000013: return "SUNW_SORTENT";
2057 case 0x60000014: return "SUNW_SYMSORT";
2058 case 0x60000015: return "SUNW_SYMSORTSZ";
2059 case 0x60000016: return "SUNW_TLSSORT";
2060 case 0x60000017: return "SUNW_TLSSORTSZ";
2061 case 0x60000018: return "SUNW_CAPINFO";
2062 case 0x60000019: return "SUNW_STRPAD";
2063 case 0x6000001a: return "SUNW_CAPCHAIN";
2064 case 0x6000001b: return "SUNW_LDMACH";
2065 case 0x6000001d: return "SUNW_CAPCHAINENT";
2066 case 0x6000001f: return "SUNW_CAPCHAINSZ";
2067 case 0x60000021: return "SUNW_PARENT";
2068 case 0x60000023: return "SUNW_ASLR";
2069 case 0x60000025: return "SUNW_RELAX";
2070 case 0x60000029: return "SUNW_NXHEAP";
2071 case 0x6000002b: return "SUNW_NXSTACK";
2072
2073 case 0x70000001: return "SPARC_REGISTER";
2074 case 0x7ffffffd: return "AUXILIARY";
2075 case 0x7ffffffe: return "USED";
2076 case 0x7fffffff: return "FILTER";
2077
15f205b1 2078 default: return NULL;
fd85a6a1
NC
2079 }
2080}
2081
252b5132 2082static const char *
dda8d76d 2083get_dynamic_type (Filedata * filedata, unsigned long type)
252b5132 2084{
e9e44622 2085 static char buff[64];
252b5132
RH
2086
2087 switch (type)
2088 {
2089 case DT_NULL: return "NULL";
2090 case DT_NEEDED: return "NEEDED";
2091 case DT_PLTRELSZ: return "PLTRELSZ";
2092 case DT_PLTGOT: return "PLTGOT";
2093 case DT_HASH: return "HASH";
2094 case DT_STRTAB: return "STRTAB";
2095 case DT_SYMTAB: return "SYMTAB";
2096 case DT_RELA: return "RELA";
2097 case DT_RELASZ: return "RELASZ";
2098 case DT_RELAENT: return "RELAENT";
2099 case DT_STRSZ: return "STRSZ";
2100 case DT_SYMENT: return "SYMENT";
2101 case DT_INIT: return "INIT";
2102 case DT_FINI: return "FINI";
2103 case DT_SONAME: return "SONAME";
2104 case DT_RPATH: return "RPATH";
2105 case DT_SYMBOLIC: return "SYMBOLIC";
2106 case DT_REL: return "REL";
2107 case DT_RELSZ: return "RELSZ";
2108 case DT_RELENT: return "RELENT";
2109 case DT_PLTREL: return "PLTREL";
2110 case DT_DEBUG: return "DEBUG";
2111 case DT_TEXTREL: return "TEXTREL";
2112 case DT_JMPREL: return "JMPREL";
2113 case DT_BIND_NOW: return "BIND_NOW";
2114 case DT_INIT_ARRAY: return "INIT_ARRAY";
2115 case DT_FINI_ARRAY: return "FINI_ARRAY";
2116 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
2117 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
d1133906
NC
2118 case DT_RUNPATH: return "RUNPATH";
2119 case DT_FLAGS: return "FLAGS";
2d0e6f43 2120
d1133906
NC
2121 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2122 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
6d913794 2123 case DT_SYMTAB_SHNDX: return "SYMTAB_SHNDX";
103f02d3 2124
05107a46 2125 case DT_CHECKSUM: return "CHECKSUM";
252b5132
RH
2126 case DT_PLTPADSZ: return "PLTPADSZ";
2127 case DT_MOVEENT: return "MOVEENT";
2128 case DT_MOVESZ: return "MOVESZ";
dcefbbbd 2129 case DT_FEATURE: return "FEATURE";
252b5132
RH
2130 case DT_POSFLAG_1: return "POSFLAG_1";
2131 case DT_SYMINSZ: return "SYMINSZ";
2132 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
103f02d3 2133
252b5132 2134 case DT_ADDRRNGLO: return "ADDRRNGLO";
dcefbbbd
L
2135 case DT_CONFIG: return "CONFIG";
2136 case DT_DEPAUDIT: return "DEPAUDIT";
2137 case DT_AUDIT: return "AUDIT";
2138 case DT_PLTPAD: return "PLTPAD";
2139 case DT_MOVETAB: return "MOVETAB";
252b5132 2140 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
103f02d3 2141
252b5132 2142 case DT_VERSYM: return "VERSYM";
103f02d3 2143
67a4f2b7
AO
2144 case DT_TLSDESC_GOT: return "TLSDESC_GOT";
2145 case DT_TLSDESC_PLT: return "TLSDESC_PLT";
252b5132
RH
2146 case DT_RELACOUNT: return "RELACOUNT";
2147 case DT_RELCOUNT: return "RELCOUNT";
2148 case DT_FLAGS_1: return "FLAGS_1";
2149 case DT_VERDEF: return "VERDEF";
2150 case DT_VERDEFNUM: return "VERDEFNUM";
2151 case DT_VERNEED: return "VERNEED";
2152 case DT_VERNEEDNUM: return "VERNEEDNUM";
103f02d3 2153
019148e4 2154 case DT_AUXILIARY: return "AUXILIARY";
252b5132
RH
2155 case DT_USED: return "USED";
2156 case DT_FILTER: return "FILTER";
103f02d3 2157
047b2264
JJ
2158 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
2159 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
2160 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
2161 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
2162 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
fdc90cb4 2163 case DT_GNU_HASH: return "GNU_HASH";
047b2264 2164
252b5132
RH
2165 default:
2166 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
2167 {
2cf0635d 2168 const char * result;
103f02d3 2169
dda8d76d 2170 switch (filedata->file_header.e_machine)
252b5132
RH
2171 {
2172 case EM_MIPS:
4fe85591 2173 case EM_MIPS_RS3_LE:
252b5132
RH
2174 result = get_mips_dynamic_type (type);
2175 break;
9a097730
RH
2176 case EM_SPARCV9:
2177 result = get_sparc64_dynamic_type (type);
2178 break;
7490d522
AM
2179 case EM_PPC:
2180 result = get_ppc_dynamic_type (type);
2181 break;
f1cb7e17
AM
2182 case EM_PPC64:
2183 result = get_ppc64_dynamic_type (type);
2184 break;
ecc51f48
NC
2185 case EM_IA_64:
2186 result = get_ia64_dynamic_type (type);
2187 break;
fabcb361
RH
2188 case EM_ALPHA:
2189 result = get_alpha_dynamic_type (type);
2190 break;
1c0d3aa6
NC
2191 case EM_SCORE:
2192 result = get_score_dynamic_type (type);
2193 break;
40b36596
JM
2194 case EM_TI_C6000:
2195 result = get_tic6x_dynamic_type (type);
2196 break;
36591ba1
SL
2197 case EM_ALTERA_NIOS2:
2198 result = get_nios2_dynamic_type (type);
2199 break;
252b5132 2200 default:
dda8d76d 2201 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
fd85a6a1
NC
2202 result = get_solaris_dynamic_type (type);
2203 else
2204 result = NULL;
252b5132
RH
2205 break;
2206 }
2207
2208 if (result != NULL)
2209 return result;
2210
e9e44622 2211 snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
252b5132 2212 }
eec8f817 2213 else if (((type >= DT_LOOS) && (type <= DT_HIOS))
dda8d76d 2214 || (filedata->file_header.e_machine == EM_PARISC
eec8f817 2215 && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
103f02d3 2216 {
2cf0635d 2217 const char * result;
103f02d3 2218
dda8d76d 2219 switch (filedata->file_header.e_machine)
103f02d3
UD
2220 {
2221 case EM_PARISC:
2222 result = get_parisc_dynamic_type (type);
2223 break;
148b93f2
NC
2224 case EM_IA_64:
2225 result = get_ia64_dynamic_type (type);
2226 break;
103f02d3 2227 default:
dda8d76d 2228 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
fd85a6a1
NC
2229 result = get_solaris_dynamic_type (type);
2230 else
2231 result = NULL;
103f02d3
UD
2232 break;
2233 }
2234
2235 if (result != NULL)
2236 return result;
2237
e9e44622
JJ
2238 snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2239 type);
103f02d3 2240 }
252b5132 2241 else
e9e44622 2242 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
103f02d3 2243
252b5132
RH
2244 return buff;
2245 }
2246}
2247
2248static char *
d3ba0551 2249get_file_type (unsigned e_type)
252b5132 2250{
b34976b6 2251 static char buff[32];
252b5132
RH
2252
2253 switch (e_type)
2254 {
32ec8896
NC
2255 case ET_NONE: return _("NONE (None)");
2256 case ET_REL: return _("REL (Relocatable file)");
2257 case ET_EXEC: return _("EXEC (Executable file)");
2258 case ET_DYN: return _("DYN (Shared object file)");
2259 case ET_CORE: return _("CORE (Core file)");
252b5132
RH
2260
2261 default:
2262 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
e9e44622 2263 snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
252b5132 2264 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
e9e44622 2265 snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
252b5132 2266 else
e9e44622 2267 snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
252b5132
RH
2268 return buff;
2269 }
2270}
2271
2272static char *
d3ba0551 2273get_machine_name (unsigned e_machine)
252b5132 2274{
b34976b6 2275 static char buff[64]; /* XXX */
252b5132
RH
2276
2277 switch (e_machine)
2278 {
55e22ca8
NC
2279 /* Please keep this switch table sorted by increasing EM_ value. */
2280 /* 0 */
c45021f2
NC
2281 case EM_NONE: return _("None");
2282 case EM_M32: return "WE32100";
2283 case EM_SPARC: return "Sparc";
2284 case EM_386: return "Intel 80386";
2285 case EM_68K: return "MC68000";
2286 case EM_88K: return "MC88000";
22abe556 2287 case EM_IAMCU: return "Intel MCU";
fb70ec17 2288 case EM_860: return "Intel 80860";
c45021f2
NC
2289 case EM_MIPS: return "MIPS R3000";
2290 case EM_S370: return "IBM System/370";
55e22ca8 2291 /* 10 */
7036c0e1 2292 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
252b5132 2293 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
c45021f2 2294 case EM_PARISC: return "HPPA";
55e22ca8 2295 case EM_VPP550: return "Fujitsu VPP500";
7036c0e1 2296 case EM_SPARC32PLUS: return "Sparc v8+" ;
d7867d17 2297 case EM_960: return "Intel 80960";
c45021f2 2298 case EM_PPC: return "PowerPC";
55e22ca8 2299 /* 20 */
285d1771 2300 case EM_PPC64: return "PowerPC64";
55e22ca8
NC
2301 case EM_S390_OLD:
2302 case EM_S390: return "IBM S/390";
2303 case EM_SPU: return "SPU";
2304 /* 30 */
2305 case EM_V800: return "Renesas V850 (using RH850 ABI)";
c45021f2
NC
2306 case EM_FR20: return "Fujitsu FR20";
2307 case EM_RH32: return "TRW RH32";
b34976b6 2308 case EM_MCORE: return "MCORE";
55e22ca8 2309 /* 40 */
7036c0e1
AJ
2310 case EM_ARM: return "ARM";
2311 case EM_OLD_ALPHA: return "Digital Alpha (old)";
ef230218 2312 case EM_SH: return "Renesas / SuperH SH";
c45021f2
NC
2313 case EM_SPARCV9: return "Sparc v9";
2314 case EM_TRICORE: return "Siemens Tricore";
584da044 2315 case EM_ARC: return "ARC";
c2dcd04e
NC
2316 case EM_H8_300: return "Renesas H8/300";
2317 case EM_H8_300H: return "Renesas H8/300H";
2318 case EM_H8S: return "Renesas H8S";
2319 case EM_H8_500: return "Renesas H8/500";
55e22ca8 2320 /* 50 */
30800947 2321 case EM_IA_64: return "Intel IA-64";
252b5132
RH
2322 case EM_MIPS_X: return "Stanford MIPS-X";
2323 case EM_COLDFIRE: return "Motorola Coldfire";
55e22ca8 2324 case EM_68HC12: return "Motorola MC68HC12 Microcontroller";
7036c0e1
AJ
2325 case EM_MMA: return "Fujitsu Multimedia Accelerator";
2326 case EM_PCP: return "Siemens PCP";
2327 case EM_NCPU: return "Sony nCPU embedded RISC processor";
2328 case EM_NDR1: return "Denso NDR1 microprocesspr";
2329 case EM_STARCORE: return "Motorola Star*Core processor";
2330 case EM_ME16: return "Toyota ME16 processor";
55e22ca8 2331 /* 60 */
7036c0e1
AJ
2332 case EM_ST100: return "STMicroelectronics ST100 processor";
2333 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
55e22ca8 2334 case EM_X86_64: return "Advanced Micro Devices X86-64";
11636f9e
JM
2335 case EM_PDSP: return "Sony DSP processor";
2336 case EM_PDP10: return "Digital Equipment Corp. PDP-10";
2337 case EM_PDP11: return "Digital Equipment Corp. PDP-11";
7036c0e1
AJ
2338 case EM_FX66: return "Siemens FX66 microcontroller";
2339 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2340 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
2341 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
55e22ca8 2342 /* 70 */
7036c0e1
AJ
2343 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
2344 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
2345 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
2346 case EM_SVX: return "Silicon Graphics SVx";
2347 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
2348 case EM_VAX: return "Digital VAX";
1b61cf92 2349 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
c45021f2
NC
2350 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
2351 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
2352 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
55e22ca8 2353 /* 80 */
b34976b6 2354 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
c45021f2 2355 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
3b36097d 2356 case EM_PRISM: return "Vitesse Prism";
55e22ca8
NC
2357 case EM_AVR_OLD:
2358 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
2359 case EM_CYGNUS_FR30:
2360 case EM_FR30: return "Fujitsu FR30";
2361 case EM_CYGNUS_D10V:
2362 case EM_D10V: return "d10v";
2363 case EM_CYGNUS_D30V:
2364 case EM_D30V: return "d30v";
2365 case EM_CYGNUS_V850:
2366 case EM_V850: return "Renesas V850";
2367 case EM_CYGNUS_M32R:
2368 case EM_M32R: return "Renesas M32R (formerly Mitsubishi M32r)";
2369 case EM_CYGNUS_MN10300:
2370 case EM_MN10300: return "mn10300";
2371 /* 90 */
2372 case EM_CYGNUS_MN10200:
2373 case EM_MN10200: return "mn10200";
2374 case EM_PJ: return "picoJava";
73589c9d 2375 case EM_OR1K: return "OpenRISC 1000";
55e22ca8 2376 case EM_ARC_COMPACT: return "ARCompact";
88da6820
NC
2377 case EM_XTENSA_OLD:
2378 case EM_XTENSA: return "Tensilica Xtensa Processor";
11636f9e
JM
2379 case EM_VIDEOCORE: return "Alphamosaic VideoCore processor";
2380 case EM_TMM_GPP: return "Thompson Multimedia General Purpose Processor";
2381 case EM_NS32K: return "National Semiconductor 32000 series";
2382 case EM_TPC: return "Tenor Network TPC processor";
55e22ca8
NC
2383 case EM_SNP1K: return "Trebia SNP 1000 processor";
2384 /* 100 */
2385 case EM_ST200: return "STMicroelectronics ST200 microcontroller";
2386 case EM_IP2K_OLD:
2387 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
11636f9e
JM
2388 case EM_MAX: return "MAX Processor";
2389 case EM_CR: return "National Semiconductor CompactRISC";
2390 case EM_F2MC16: return "Fujitsu F2MC16";
2391 case EM_MSP430: return "Texas Instruments msp430 microcontroller";
7bbe5bc5 2392 case EM_BLACKFIN: return "Analog Devices Blackfin";
11636f9e
JM
2393 case EM_SE_C33: return "S1C33 Family of Seiko Epson processors";
2394 case EM_SEP: return "Sharp embedded microprocessor";
2395 case EM_ARCA: return "Arca RISC microprocessor";
55e22ca8 2396 /* 110 */
11636f9e
JM
2397 case EM_UNICORE: return "Unicore";
2398 case EM_EXCESS: return "eXcess 16/32/64-bit configurable embedded CPU";
2399 case EM_DXP: return "Icera Semiconductor Inc. Deep Execution Processor";
64fd6348 2400 case EM_ALTERA_NIOS2: return "Altera Nios II";
55e22ca8
NC
2401 case EM_CRX: return "National Semiconductor CRX microprocessor";
2402 case EM_XGATE: return "Motorola XGATE embedded processor";
c29aca4a 2403 case EM_C166:
d70c5fc7 2404 case EM_XC16X: return "Infineon Technologies xc16x";
11636f9e
JM
2405 case EM_M16C: return "Renesas M16C series microprocessors";
2406 case EM_DSPIC30F: return "Microchip Technology dsPIC30F Digital Signal Controller";
2407 case EM_CE: return "Freescale Communication Engine RISC core";
55e22ca8
NC
2408 /* 120 */
2409 case EM_M32C: return "Renesas M32c";
2410 /* 130 */
11636f9e
JM
2411 case EM_TSK3000: return "Altium TSK3000 core";
2412 case EM_RS08: return "Freescale RS08 embedded processor";
2413 case EM_ECOG2: return "Cyan Technology eCOG2 microprocessor";
55e22ca8 2414 case EM_SCORE: return "SUNPLUS S+Core";
11636f9e
JM
2415 case EM_DSP24: return "New Japan Radio (NJR) 24-bit DSP Processor";
2416 case EM_VIDEOCORE3: return "Broadcom VideoCore III processor";
55e22ca8 2417 case EM_LATTICEMICO32: return "Lattice Mico32";
11636f9e 2418 case EM_SE_C17: return "Seiko Epson C17 family";
55e22ca8 2419 /* 140 */
11636f9e
JM
2420 case EM_TI_C6000: return "Texas Instruments TMS320C6000 DSP family";
2421 case EM_TI_C2000: return "Texas Instruments TMS320C2000 DSP family";
2422 case EM_TI_C5500: return "Texas Instruments TMS320C55x DSP family";
55e22ca8
NC
2423 case EM_TI_PRU: return "TI PRU I/O processor";
2424 /* 160 */
11636f9e
JM
2425 case EM_MMDSP_PLUS: return "STMicroelectronics 64bit VLIW Data Signal Processor";
2426 case EM_CYPRESS_M8C: return "Cypress M8C microprocessor";
2427 case EM_R32C: return "Renesas R32C series microprocessors";
2428 case EM_TRIMEDIA: return "NXP Semiconductors TriMedia architecture family";
2429 case EM_QDSP6: return "QUALCOMM DSP6 Processor";
2430 case EM_8051: return "Intel 8051 and variants";
2431 case EM_STXP7X: return "STMicroelectronics STxP7x family";
2432 case EM_NDS32: return "Andes Technology compact code size embedded RISC processor family";
2433 case EM_ECOG1X: return "Cyan Technology eCOG1X family";
2434 case EM_MAXQ30: return "Dallas Semiconductor MAXQ30 Core microcontrollers";
55e22ca8 2435 /* 170 */
11636f9e
JM
2436 case EM_XIMO16: return "New Japan Radio (NJR) 16-bit DSP Processor";
2437 case EM_MANIK: return "M2000 Reconfigurable RISC Microprocessor";
2438 case EM_CRAYNV2: return "Cray Inc. NV2 vector architecture";
c7927a3c 2439 case EM_RX: return "Renesas RX";
a3c62988 2440 case EM_METAG: return "Imagination Technologies Meta processor architecture";
11636f9e
JM
2441 case EM_MCST_ELBRUS: return "MCST Elbrus general purpose hardware architecture";
2442 case EM_ECOG16: return "Cyan Technology eCOG16 family";
55e22ca8
NC
2443 case EM_CR16:
2444 case EM_MICROBLAZE:
2445 case EM_MICROBLAZE_OLD: return "Xilinx MicroBlaze";
11636f9e
JM
2446 case EM_ETPU: return "Freescale Extended Time Processing Unit";
2447 case EM_SLE9X: return "Infineon Technologies SLE9X core";
55e22ca8
NC
2448 /* 180 */
2449 case EM_L1OM: return "Intel L1OM";
2450 case EM_K1OM: return "Intel K1OM";
2451 case EM_INTEL182: return "Intel (reserved)";
2452 case EM_AARCH64: return "AArch64";
2453 case EM_ARM184: return "ARM (reserved)";
2454 case EM_AVR32: return "Atmel Corporation 32-bit microprocessor";
11636f9e
JM
2455 case EM_STM8: return "STMicroeletronics STM8 8-bit microcontroller";
2456 case EM_TILE64: return "Tilera TILE64 multicore architecture family";
2457 case EM_TILEPRO: return "Tilera TILEPro multicore architecture family";
55e22ca8 2458 /* 190 */
11636f9e 2459 case EM_CUDA: return "NVIDIA CUDA architecture";
55e22ca8 2460 case EM_TILEGX: return "Tilera TILE-Gx multicore architecture family";
6d913794
NC
2461 case EM_CLOUDSHIELD: return "CloudShield architecture family";
2462 case EM_COREA_1ST: return "KIPO-KAIST Core-A 1st generation processor family";
2463 case EM_COREA_2ND: return "KIPO-KAIST Core-A 2nd generation processor family";
55e22ca8 2464 case EM_ARC_COMPACT2: return "ARCv2";
6d913794 2465 case EM_OPEN8: return "Open8 8-bit RISC soft processor core";
55e22ca8 2466 case EM_RL78: return "Renesas RL78";
6d913794 2467 case EM_VIDEOCORE5: return "Broadcom VideoCore V processor";
55e22ca8
NC
2468 case EM_78K0R: return "Renesas 78K0R";
2469 /* 200 */
6d913794 2470 case EM_56800EX: return "Freescale 56800EX Digital Signal Controller (DSC)";
15f205b1
NC
2471 case EM_BA1: return "Beyond BA1 CPU architecture";
2472 case EM_BA2: return "Beyond BA2 CPU architecture";
6d913794
NC
2473 case EM_XCORE: return "XMOS xCORE processor family";
2474 case EM_MCHP_PIC: return "Microchip 8-bit PIC(r) family";
55e22ca8 2475 /* 210 */
6d913794
NC
2476 case EM_KM32: return "KM211 KM32 32-bit processor";
2477 case EM_KMX32: return "KM211 KMX32 32-bit processor";
2478 case EM_KMX16: return "KM211 KMX16 16-bit processor";
2479 case EM_KMX8: return "KM211 KMX8 8-bit processor";
2480 case EM_KVARC: return "KM211 KVARC processor";
15f205b1 2481 case EM_CDP: return "Paneve CDP architecture family";
6d913794
NC
2482 case EM_COGE: return "Cognitive Smart Memory Processor";
2483 case EM_COOL: return "Bluechip Systems CoolEngine";
2484 case EM_NORC: return "Nanoradio Optimized RISC";
2485 case EM_CSR_KALIMBA: return "CSR Kalimba architecture family";
55e22ca8 2486 /* 220 */
15f205b1 2487 case EM_Z80: return "Zilog Z80";
55e22ca8
NC
2488 case EM_VISIUM: return "CDS VISIUMcore processor";
2489 case EM_FT32: return "FTDI Chip FT32";
2490 case EM_MOXIE: return "Moxie";
2491 case EM_AMDGPU: return "AMD GPU";
2492 case EM_RISCV: return "RISC-V";
2493 case EM_LANAI: return "Lanai 32-bit processor";
2494 case EM_BPF: return "Linux BPF";
fe944acf 2495 case EM_NFP: return "Netronome Flow Processor";
55e22ca8
NC
2496
2497 /* Large numbers... */
2498 case EM_MT: return "Morpho Techologies MT processor";
2499 case EM_ALPHA: return "Alpha";
2500 case EM_WEBASSEMBLY: return "Web Assembly";
2501 case EM_DLX: return "OpenDLX";
2502 case EM_XSTORMY16: return "Sanyo XStormy16 CPU core";
2503 case EM_IQ2000: return "Vitesse IQ2000";
2504 case EM_M32C_OLD:
2505 case EM_NIOS32: return "Altera Nios";
2506 case EM_CYGNUS_MEP: return "Toshiba MeP Media Engine";
2507 case EM_ADAPTEVA_EPIPHANY: return "Adapteva EPIPHANY";
2508 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
637b1970 2509 case EM_S12Z: return "Freescale S12Z";
b8891f8d 2510 case EM_CSKY: return "C-SKY";
55e22ca8 2511
252b5132 2512 default:
35d9dd2f 2513 snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
252b5132
RH
2514 return buff;
2515 }
2516}
2517
a9522a21
AB
2518static void
2519decode_ARC_machine_flags (unsigned e_flags, unsigned e_machine, char buf[])
2520{
2521 /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2. Some
2522 other compilers don't a specific architecture type in the e_flags, and
2523 instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
2524 architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
2525 architectures.
2526
2527 Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
2528 but also sets a specific architecture type in the e_flags field.
2529
2530 However, when decoding the flags we don't worry if we see an
2531 unexpected pairing, for example EM_ARC_COMPACT machine type, with
2532 ARCEM architecture type. */
2533
2534 switch (e_flags & EF_ARC_MACH_MSK)
2535 {
2536 /* We only expect these to occur for EM_ARC_COMPACT2. */
2537 case EF_ARC_CPU_ARCV2EM:
2538 strcat (buf, ", ARC EM");
2539 break;
2540 case EF_ARC_CPU_ARCV2HS:
2541 strcat (buf, ", ARC HS");
2542 break;
2543
2544 /* We only expect these to occur for EM_ARC_COMPACT. */
2545 case E_ARC_MACH_ARC600:
2546 strcat (buf, ", ARC600");
2547 break;
2548 case E_ARC_MACH_ARC601:
2549 strcat (buf, ", ARC601");
2550 break;
2551 case E_ARC_MACH_ARC700:
2552 strcat (buf, ", ARC700");
2553 break;
2554
2555 /* The only times we should end up here are (a) A corrupt ELF, (b) A
2556 new ELF with new architecture being read by an old version of
2557 readelf, or (c) An ELF built with non-GNU compiler that does not
2558 set the architecture in the e_flags. */
2559 default:
2560 if (e_machine == EM_ARC_COMPACT)
2561 strcat (buf, ", Unknown ARCompact");
2562 else
2563 strcat (buf, ", Unknown ARC");
2564 break;
2565 }
2566
2567 switch (e_flags & EF_ARC_OSABI_MSK)
2568 {
2569 case E_ARC_OSABI_ORIG:
2570 strcat (buf, ", (ABI:legacy)");
2571 break;
2572 case E_ARC_OSABI_V2:
2573 strcat (buf, ", (ABI:v2)");
2574 break;
2575 /* Only upstream 3.9+ kernels will support ARCv2 ISA. */
2576 case E_ARC_OSABI_V3:
2577 strcat (buf, ", v3 no-legacy-syscalls ABI");
2578 break;
53a346d8
CZ
2579 case E_ARC_OSABI_V4:
2580 strcat (buf, ", v4 ABI");
2581 break;
a9522a21
AB
2582 default:
2583 strcat (buf, ", unrecognised ARC OSABI flag");
2584 break;
2585 }
2586}
2587
f3485b74 2588static void
d3ba0551 2589decode_ARM_machine_flags (unsigned e_flags, char buf[])
f3485b74
NC
2590{
2591 unsigned eabi;
32ec8896 2592 bfd_boolean unknown = FALSE;
f3485b74
NC
2593
2594 eabi = EF_ARM_EABI_VERSION (e_flags);
2595 e_flags &= ~ EF_ARM_EABIMASK;
2596
2597 /* Handle "generic" ARM flags. */
2598 if (e_flags & EF_ARM_RELEXEC)
2599 {
2600 strcat (buf, ", relocatable executable");
2601 e_flags &= ~ EF_ARM_RELEXEC;
2602 }
76da6bbe 2603
18a20338
CL
2604 if (e_flags & EF_ARM_PIC)
2605 {
2606 strcat (buf, ", position independent");
2607 e_flags &= ~ EF_ARM_PIC;
2608 }
2609
f3485b74
NC
2610 /* Now handle EABI specific flags. */
2611 switch (eabi)
2612 {
2613 default:
2c71103e 2614 strcat (buf, ", <unrecognized EABI>");
f3485b74 2615 if (e_flags)
32ec8896 2616 unknown = TRUE;
f3485b74
NC
2617 break;
2618
2619 case EF_ARM_EABI_VER1:
a5bcd848 2620 strcat (buf, ", Version1 EABI");
f3485b74
NC
2621 while (e_flags)
2622 {
2623 unsigned flag;
76da6bbe 2624
f3485b74
NC
2625 /* Process flags one bit at a time. */
2626 flag = e_flags & - e_flags;
2627 e_flags &= ~ flag;
76da6bbe 2628
f3485b74
NC
2629 switch (flag)
2630 {
a5bcd848 2631 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
f3485b74
NC
2632 strcat (buf, ", sorted symbol tables");
2633 break;
76da6bbe 2634
f3485b74 2635 default:
32ec8896 2636 unknown = TRUE;
f3485b74
NC
2637 break;
2638 }
2639 }
2640 break;
76da6bbe 2641
a5bcd848
PB
2642 case EF_ARM_EABI_VER2:
2643 strcat (buf, ", Version2 EABI");
2644 while (e_flags)
2645 {
2646 unsigned flag;
2647
2648 /* Process flags one bit at a time. */
2649 flag = e_flags & - e_flags;
2650 e_flags &= ~ flag;
2651
2652 switch (flag)
2653 {
2654 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2655 strcat (buf, ", sorted symbol tables");
2656 break;
2657
2658 case EF_ARM_DYNSYMSUSESEGIDX:
2659 strcat (buf, ", dynamic symbols use segment index");
2660 break;
2661
2662 case EF_ARM_MAPSYMSFIRST:
2663 strcat (buf, ", mapping symbols precede others");
2664 break;
2665
2666 default:
32ec8896 2667 unknown = TRUE;
a5bcd848
PB
2668 break;
2669 }
2670 }
2671 break;
2672
d507cf36
PB
2673 case EF_ARM_EABI_VER3:
2674 strcat (buf, ", Version3 EABI");
8cb51566
PB
2675 break;
2676
2677 case EF_ARM_EABI_VER4:
2678 strcat (buf, ", Version4 EABI");
3bfcb652
NC
2679 while (e_flags)
2680 {
2681 unsigned flag;
2682
2683 /* Process flags one bit at a time. */
2684 flag = e_flags & - e_flags;
2685 e_flags &= ~ flag;
2686
2687 switch (flag)
2688 {
2689 case EF_ARM_BE8:
2690 strcat (buf, ", BE8");
2691 break;
2692
2693 case EF_ARM_LE8:
2694 strcat (buf, ", LE8");
2695 break;
2696
2697 default:
32ec8896 2698 unknown = TRUE;
3bfcb652
NC
2699 break;
2700 }
3bfcb652
NC
2701 }
2702 break;
3a4a14e9
PB
2703
2704 case EF_ARM_EABI_VER5:
2705 strcat (buf, ", Version5 EABI");
d507cf36
PB
2706 while (e_flags)
2707 {
2708 unsigned flag;
2709
2710 /* Process flags one bit at a time. */
2711 flag = e_flags & - e_flags;
2712 e_flags &= ~ flag;
2713
2714 switch (flag)
2715 {
2716 case EF_ARM_BE8:
2717 strcat (buf, ", BE8");
2718 break;
2719
2720 case EF_ARM_LE8:
2721 strcat (buf, ", LE8");
2722 break;
2723
3bfcb652
NC
2724 case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT. */
2725 strcat (buf, ", soft-float ABI");
2726 break;
2727
2728 case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT. */
2729 strcat (buf, ", hard-float ABI");
2730 break;
2731
d507cf36 2732 default:
32ec8896 2733 unknown = TRUE;
d507cf36
PB
2734 break;
2735 }
2736 }
2737 break;
2738
f3485b74 2739 case EF_ARM_EABI_UNKNOWN:
a5bcd848 2740 strcat (buf, ", GNU EABI");
f3485b74
NC
2741 while (e_flags)
2742 {
2743 unsigned flag;
76da6bbe 2744
f3485b74
NC
2745 /* Process flags one bit at a time. */
2746 flag = e_flags & - e_flags;
2747 e_flags &= ~ flag;
76da6bbe 2748
f3485b74
NC
2749 switch (flag)
2750 {
a5bcd848 2751 case EF_ARM_INTERWORK:
f3485b74
NC
2752 strcat (buf, ", interworking enabled");
2753 break;
76da6bbe 2754
a5bcd848 2755 case EF_ARM_APCS_26:
f3485b74
NC
2756 strcat (buf, ", uses APCS/26");
2757 break;
76da6bbe 2758
a5bcd848 2759 case EF_ARM_APCS_FLOAT:
f3485b74
NC
2760 strcat (buf, ", uses APCS/float");
2761 break;
76da6bbe 2762
a5bcd848 2763 case EF_ARM_PIC:
f3485b74
NC
2764 strcat (buf, ", position independent");
2765 break;
76da6bbe 2766
a5bcd848 2767 case EF_ARM_ALIGN8:
f3485b74
NC
2768 strcat (buf, ", 8 bit structure alignment");
2769 break;
76da6bbe 2770
a5bcd848 2771 case EF_ARM_NEW_ABI:
f3485b74
NC
2772 strcat (buf, ", uses new ABI");
2773 break;
76da6bbe 2774
a5bcd848 2775 case EF_ARM_OLD_ABI:
f3485b74
NC
2776 strcat (buf, ", uses old ABI");
2777 break;
76da6bbe 2778
a5bcd848 2779 case EF_ARM_SOFT_FLOAT:
f3485b74
NC
2780 strcat (buf, ", software FP");
2781 break;
76da6bbe 2782
90e01f86
ILT
2783 case EF_ARM_VFP_FLOAT:
2784 strcat (buf, ", VFP");
2785 break;
2786
fde78edd
NC
2787 case EF_ARM_MAVERICK_FLOAT:
2788 strcat (buf, ", Maverick FP");
2789 break;
2790
f3485b74 2791 default:
32ec8896 2792 unknown = TRUE;
f3485b74
NC
2793 break;
2794 }
2795 }
2796 }
f3485b74
NC
2797
2798 if (unknown)
2b692964 2799 strcat (buf,_(", <unknown>"));
f3485b74
NC
2800}
2801
343433df
AB
2802static void
2803decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2804{
2805 --size; /* Leave space for null terminator. */
2806
2807 switch (e_flags & EF_AVR_MACH)
2808 {
2809 case E_AVR_MACH_AVR1:
2810 strncat (buf, ", avr:1", size);
2811 break;
2812 case E_AVR_MACH_AVR2:
2813 strncat (buf, ", avr:2", size);
2814 break;
2815 case E_AVR_MACH_AVR25:
2816 strncat (buf, ", avr:25", size);
2817 break;
2818 case E_AVR_MACH_AVR3:
2819 strncat (buf, ", avr:3", size);
2820 break;
2821 case E_AVR_MACH_AVR31:
2822 strncat (buf, ", avr:31", size);
2823 break;
2824 case E_AVR_MACH_AVR35:
2825 strncat (buf, ", avr:35", size);
2826 break;
2827 case E_AVR_MACH_AVR4:
2828 strncat (buf, ", avr:4", size);
2829 break;
2830 case E_AVR_MACH_AVR5:
2831 strncat (buf, ", avr:5", size);
2832 break;
2833 case E_AVR_MACH_AVR51:
2834 strncat (buf, ", avr:51", size);
2835 break;
2836 case E_AVR_MACH_AVR6:
2837 strncat (buf, ", avr:6", size);
2838 break;
2839 case E_AVR_MACH_AVRTINY:
2840 strncat (buf, ", avr:100", size);
2841 break;
2842 case E_AVR_MACH_XMEGA1:
2843 strncat (buf, ", avr:101", size);
2844 break;
2845 case E_AVR_MACH_XMEGA2:
2846 strncat (buf, ", avr:102", size);
2847 break;
2848 case E_AVR_MACH_XMEGA3:
2849 strncat (buf, ", avr:103", size);
2850 break;
2851 case E_AVR_MACH_XMEGA4:
2852 strncat (buf, ", avr:104", size);
2853 break;
2854 case E_AVR_MACH_XMEGA5:
2855 strncat (buf, ", avr:105", size);
2856 break;
2857 case E_AVR_MACH_XMEGA6:
2858 strncat (buf, ", avr:106", size);
2859 break;
2860 case E_AVR_MACH_XMEGA7:
2861 strncat (buf, ", avr:107", size);
2862 break;
2863 default:
2864 strncat (buf, ", avr:<unknown>", size);
2865 break;
2866 }
2867
2868 size -= strlen (buf);
2869 if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2870 strncat (buf, ", link-relax", size);
2871}
2872
35c08157
KLC
2873static void
2874decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2875{
2876 unsigned abi;
2877 unsigned arch;
2878 unsigned config;
2879 unsigned version;
32ec8896
NC
2880 bfd_boolean has_fpu = FALSE;
2881 unsigned int r = 0;
35c08157
KLC
2882
2883 static const char *ABI_STRINGS[] =
2884 {
2885 "ABI v0", /* use r5 as return register; only used in N1213HC */
2886 "ABI v1", /* use r0 as return register */
2887 "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2888 "ABI v2fp", /* for FPU */
40c7a7cb
KLC
2889 "AABI",
2890 "ABI2 FP+"
35c08157
KLC
2891 };
2892 static const char *VER_STRINGS[] =
2893 {
2894 "Andes ELF V1.3 or older",
2895 "Andes ELF V1.3.1",
2896 "Andes ELF V1.4"
2897 };
2898 static const char *ARCH_STRINGS[] =
2899 {
2900 "",
2901 "Andes Star v1.0",
2902 "Andes Star v2.0",
2903 "Andes Star v3.0",
2904 "Andes Star v3.0m"
2905 };
2906
2907 abi = EF_NDS_ABI & e_flags;
2908 arch = EF_NDS_ARCH & e_flags;
2909 config = EF_NDS_INST & e_flags;
2910 version = EF_NDS32_ELF_VERSION & e_flags;
2911
2912 memset (buf, 0, size);
2913
2914 switch (abi)
2915 {
2916 case E_NDS_ABI_V0:
2917 case E_NDS_ABI_V1:
2918 case E_NDS_ABI_V2:
2919 case E_NDS_ABI_V2FP:
2920 case E_NDS_ABI_AABI:
40c7a7cb 2921 case E_NDS_ABI_V2FP_PLUS:
35c08157
KLC
2922 /* In case there are holes in the array. */
2923 r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2924 break;
2925
2926 default:
2927 r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2928 break;
2929 }
2930
2931 switch (version)
2932 {
2933 case E_NDS32_ELF_VER_1_2:
2934 case E_NDS32_ELF_VER_1_3:
2935 case E_NDS32_ELF_VER_1_4:
2936 r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2937 break;
2938
2939 default:
2940 r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2941 break;
2942 }
2943
2944 if (E_NDS_ABI_V0 == abi)
2945 {
2946 /* OLD ABI; only used in N1213HC, has performance extension 1. */
2947 r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2948 if (arch == E_NDS_ARCH_STAR_V1_0)
2949 r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2950 return;
2951 }
2952
2953 switch (arch)
2954 {
2955 case E_NDS_ARCH_STAR_V1_0:
2956 case E_NDS_ARCH_STAR_V2_0:
2957 case E_NDS_ARCH_STAR_V3_0:
2958 case E_NDS_ARCH_STAR_V3_M:
2959 r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2960 break;
2961
2962 default:
2963 r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2964 /* ARCH version determines how the e_flags are interpreted.
2965 If it is unknown, we cannot proceed. */
2966 return;
2967 }
2968
2969 /* Newer ABI; Now handle architecture specific flags. */
2970 if (arch == E_NDS_ARCH_STAR_V1_0)
2971 {
2972 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2973 r += snprintf (buf + r, size -r, ", MFUSR_PC");
2974
2975 if (!(config & E_NDS32_HAS_NO_MAC_INST))
2976 r += snprintf (buf + r, size -r, ", MAC");
2977
2978 if (config & E_NDS32_HAS_DIV_INST)
2979 r += snprintf (buf + r, size -r, ", DIV");
2980
2981 if (config & E_NDS32_HAS_16BIT_INST)
2982 r += snprintf (buf + r, size -r, ", 16b");
2983 }
2984 else
2985 {
2986 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2987 {
2988 if (version <= E_NDS32_ELF_VER_1_3)
2989 r += snprintf (buf + r, size -r, ", [B8]");
2990 else
2991 r += snprintf (buf + r, size -r, ", EX9");
2992 }
2993
2994 if (config & E_NDS32_HAS_MAC_DX_INST)
2995 r += snprintf (buf + r, size -r, ", MAC_DX");
2996
2997 if (config & E_NDS32_HAS_DIV_DX_INST)
2998 r += snprintf (buf + r, size -r, ", DIV_DX");
2999
3000 if (config & E_NDS32_HAS_16BIT_INST)
3001 {
3002 if (version <= E_NDS32_ELF_VER_1_3)
3003 r += snprintf (buf + r, size -r, ", 16b");
3004 else
3005 r += snprintf (buf + r, size -r, ", IFC");
3006 }
3007 }
3008
3009 if (config & E_NDS32_HAS_EXT_INST)
3010 r += snprintf (buf + r, size -r, ", PERF1");
3011
3012 if (config & E_NDS32_HAS_EXT2_INST)
3013 r += snprintf (buf + r, size -r, ", PERF2");
3014
3015 if (config & E_NDS32_HAS_FPU_INST)
3016 {
32ec8896 3017 has_fpu = TRUE;
35c08157
KLC
3018 r += snprintf (buf + r, size -r, ", FPU_SP");
3019 }
3020
3021 if (config & E_NDS32_HAS_FPU_DP_INST)
3022 {
32ec8896 3023 has_fpu = TRUE;
35c08157
KLC
3024 r += snprintf (buf + r, size -r, ", FPU_DP");
3025 }
3026
3027 if (config & E_NDS32_HAS_FPU_MAC_INST)
3028 {
32ec8896 3029 has_fpu = TRUE;
35c08157
KLC
3030 r += snprintf (buf + r, size -r, ", FPU_MAC");
3031 }
3032
3033 if (has_fpu)
3034 {
3035 switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
3036 {
3037 case E_NDS32_FPU_REG_8SP_4DP:
3038 r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
3039 break;
3040 case E_NDS32_FPU_REG_16SP_8DP:
3041 r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
3042 break;
3043 case E_NDS32_FPU_REG_32SP_16DP:
3044 r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
3045 break;
3046 case E_NDS32_FPU_REG_32SP_32DP:
3047 r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
3048 break;
3049 }
3050 }
3051
3052 if (config & E_NDS32_HAS_AUDIO_INST)
3053 r += snprintf (buf + r, size -r, ", AUDIO");
3054
3055 if (config & E_NDS32_HAS_STRING_INST)
3056 r += snprintf (buf + r, size -r, ", STR");
3057
3058 if (config & E_NDS32_HAS_REDUCED_REGS)
3059 r += snprintf (buf + r, size -r, ", 16REG");
3060
3061 if (config & E_NDS32_HAS_VIDEO_INST)
3062 {
3063 if (version <= E_NDS32_ELF_VER_1_3)
3064 r += snprintf (buf + r, size -r, ", VIDEO");
3065 else
3066 r += snprintf (buf + r, size -r, ", SATURATION");
3067 }
3068
3069 if (config & E_NDS32_HAS_ENCRIPT_INST)
3070 r += snprintf (buf + r, size -r, ", ENCRP");
3071
3072 if (config & E_NDS32_HAS_L2C_INST)
3073 r += snprintf (buf + r, size -r, ", L2C");
3074}
3075
252b5132 3076static char *
dda8d76d 3077get_machine_flags (Filedata * filedata, unsigned e_flags, unsigned e_machine)
252b5132 3078{
b34976b6 3079 static char buf[1024];
252b5132
RH
3080
3081 buf[0] = '\0';
76da6bbe 3082
252b5132
RH
3083 if (e_flags)
3084 {
3085 switch (e_machine)
3086 {
3087 default:
3088 break;
3089
886a2506 3090 case EM_ARC_COMPACT2:
886a2506 3091 case EM_ARC_COMPACT:
a9522a21
AB
3092 decode_ARC_machine_flags (e_flags, e_machine, buf);
3093 break;
886a2506 3094
f3485b74
NC
3095 case EM_ARM:
3096 decode_ARM_machine_flags (e_flags, buf);
3097 break;
76da6bbe 3098
343433df
AB
3099 case EM_AVR:
3100 decode_AVR_machine_flags (e_flags, buf, sizeof buf);
3101 break;
3102
781303ce
MF
3103 case EM_BLACKFIN:
3104 if (e_flags & EF_BFIN_PIC)
3105 strcat (buf, ", PIC");
3106
3107 if (e_flags & EF_BFIN_FDPIC)
3108 strcat (buf, ", FDPIC");
3109
3110 if (e_flags & EF_BFIN_CODE_IN_L1)
3111 strcat (buf, ", code in L1");
3112
3113 if (e_flags & EF_BFIN_DATA_IN_L1)
3114 strcat (buf, ", data in L1");
3115
3116 break;
3117
ec2dfb42
AO
3118 case EM_CYGNUS_FRV:
3119 switch (e_flags & EF_FRV_CPU_MASK)
3120 {
3121 case EF_FRV_CPU_GENERIC:
3122 break;
3123
3124 default:
3125 strcat (buf, ", fr???");
3126 break;
57346661 3127
ec2dfb42
AO
3128 case EF_FRV_CPU_FR300:
3129 strcat (buf, ", fr300");
3130 break;
3131
3132 case EF_FRV_CPU_FR400:
3133 strcat (buf, ", fr400");
3134 break;
3135 case EF_FRV_CPU_FR405:
3136 strcat (buf, ", fr405");
3137 break;
3138
3139 case EF_FRV_CPU_FR450:
3140 strcat (buf, ", fr450");
3141 break;
3142
3143 case EF_FRV_CPU_FR500:
3144 strcat (buf, ", fr500");
3145 break;
3146 case EF_FRV_CPU_FR550:
3147 strcat (buf, ", fr550");
3148 break;
3149
3150 case EF_FRV_CPU_SIMPLE:
3151 strcat (buf, ", simple");
3152 break;
3153 case EF_FRV_CPU_TOMCAT:
3154 strcat (buf, ", tomcat");
3155 break;
3156 }
1c877e87 3157 break;
ec2dfb42 3158
53c7db4b 3159 case EM_68K:
425c6cb0 3160 if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
76f57f3a 3161 strcat (buf, ", m68000");
425c6cb0 3162 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
3bdcfdf4
KH
3163 strcat (buf, ", cpu32");
3164 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
3165 strcat (buf, ", fido_a");
425c6cb0 3166 else
266abb8f 3167 {
2cf0635d
NC
3168 char const * isa = _("unknown");
3169 char const * mac = _("unknown mac");
3170 char const * additional = NULL;
0112cd26 3171
c694fd50 3172 switch (e_flags & EF_M68K_CF_ISA_MASK)
266abb8f 3173 {
c694fd50 3174 case EF_M68K_CF_ISA_A_NODIV:
0b2e31dc
NS
3175 isa = "A";
3176 additional = ", nodiv";
3177 break;
c694fd50 3178 case EF_M68K_CF_ISA_A:
266abb8f
NS
3179 isa = "A";
3180 break;
c694fd50 3181 case EF_M68K_CF_ISA_A_PLUS:
266abb8f
NS
3182 isa = "A+";
3183 break;
c694fd50 3184 case EF_M68K_CF_ISA_B_NOUSP:
0b2e31dc
NS
3185 isa = "B";
3186 additional = ", nousp";
3187 break;
c694fd50 3188 case EF_M68K_CF_ISA_B:
266abb8f
NS
3189 isa = "B";
3190 break;
f608cd77
NS
3191 case EF_M68K_CF_ISA_C:
3192 isa = "C";
3193 break;
3194 case EF_M68K_CF_ISA_C_NODIV:
3195 isa = "C";
3196 additional = ", nodiv";
3197 break;
266abb8f
NS
3198 }
3199 strcat (buf, ", cf, isa ");
3200 strcat (buf, isa);
0b2e31dc
NS
3201 if (additional)
3202 strcat (buf, additional);
c694fd50 3203 if (e_flags & EF_M68K_CF_FLOAT)
0b2e31dc 3204 strcat (buf, ", float");
c694fd50 3205 switch (e_flags & EF_M68K_CF_MAC_MASK)
266abb8f
NS
3206 {
3207 case 0:
3208 mac = NULL;
3209 break;
c694fd50 3210 case EF_M68K_CF_MAC:
266abb8f
NS
3211 mac = "mac";
3212 break;
c694fd50 3213 case EF_M68K_CF_EMAC:
266abb8f
NS
3214 mac = "emac";
3215 break;
f608cd77
NS
3216 case EF_M68K_CF_EMAC_B:
3217 mac = "emac_b";
3218 break;
266abb8f
NS
3219 }
3220 if (mac)
3221 {
3222 strcat (buf, ", ");
3223 strcat (buf, mac);
3224 }
266abb8f 3225 }
53c7db4b 3226 break;
33c63f9d 3227
153a2776
NC
3228 case EM_CYGNUS_MEP:
3229 switch (e_flags & EF_MEP_CPU_MASK)
3230 {
3231 case EF_MEP_CPU_MEP: strcat (buf, ", generic MeP"); break;
3232 case EF_MEP_CPU_C2: strcat (buf, ", MeP C2"); break;
3233 case EF_MEP_CPU_C3: strcat (buf, ", MeP C3"); break;
3234 case EF_MEP_CPU_C4: strcat (buf, ", MeP C4"); break;
3235 case EF_MEP_CPU_C5: strcat (buf, ", MeP C5"); break;
3236 case EF_MEP_CPU_H1: strcat (buf, ", MeP H1"); break;
3237 default: strcat (buf, _(", <unknown MeP cpu type>")); break;
3238 }
3239
3240 switch (e_flags & EF_MEP_COP_MASK)
3241 {
3242 case EF_MEP_COP_NONE: break;
3243 case EF_MEP_COP_AVC: strcat (buf, ", AVC coprocessor"); break;
3244 case EF_MEP_COP_AVC2: strcat (buf, ", AVC2 coprocessor"); break;
3245 case EF_MEP_COP_FMAX: strcat (buf, ", FMAX coprocessor"); break;
3246 case EF_MEP_COP_IVC2: strcat (buf, ", IVC2 coprocessor"); break;
3247 default: strcat (buf, _("<unknown MeP copro type>")); break;
3248 }
3249
3250 if (e_flags & EF_MEP_LIBRARY)
3251 strcat (buf, ", Built for Library");
3252
3253 if (e_flags & EF_MEP_INDEX_MASK)
3254 sprintf (buf + strlen (buf), ", Configuration Index: %#x",
3255 e_flags & EF_MEP_INDEX_MASK);
3256
3257 if (e_flags & ~ EF_MEP_ALL_FLAGS)
3258 sprintf (buf + strlen (buf), _(", unknown flags bits: %#x"),
3259 e_flags & ~ EF_MEP_ALL_FLAGS);
3260 break;
3261
252b5132
RH
3262 case EM_PPC:
3263 if (e_flags & EF_PPC_EMB)
3264 strcat (buf, ", emb");
3265
3266 if (e_flags & EF_PPC_RELOCATABLE)
2b692964 3267 strcat (buf, _(", relocatable"));
252b5132
RH
3268
3269 if (e_flags & EF_PPC_RELOCATABLE_LIB)
2b692964 3270 strcat (buf, _(", relocatable-lib"));
252b5132
RH
3271 break;
3272
ee67d69a
AM
3273 case EM_PPC64:
3274 if (e_flags & EF_PPC64_ABI)
3275 {
3276 char abi[] = ", abiv0";
3277
3278 abi[6] += e_flags & EF_PPC64_ABI;
3279 strcat (buf, abi);
3280 }
3281 break;
3282
708e2187
NC
3283 case EM_V800:
3284 if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
3285 strcat (buf, ", RH850 ABI");
0b4362b0 3286
708e2187
NC
3287 if (e_flags & EF_V800_850E3)
3288 strcat (buf, ", V3 architecture");
3289
3290 if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
3291 strcat (buf, ", FPU not used");
3292
3293 if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
3294 strcat (buf, ", regmode: COMMON");
3295
3296 if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
3297 strcat (buf, ", r4 not used");
3298
3299 if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
3300 strcat (buf, ", r30 not used");
3301
3302 if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
3303 strcat (buf, ", r5 not used");
3304
3305 if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
3306 strcat (buf, ", r2 not used");
3307
3308 for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
3309 {
3310 switch (e_flags & - e_flags)
3311 {
3312 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
3313 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
708e2187
NC
3314 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
3315 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
708e2187
NC
3316 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
3317 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
3318 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
3319 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
3320 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
3321 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
3322 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
3323 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
3324 default: break;
3325 }
3326 }
3327 break;
3328
2b0337b0 3329 case EM_V850:
252b5132
RH
3330 case EM_CYGNUS_V850:
3331 switch (e_flags & EF_V850_ARCH)
3332 {
78c8d46c
NC
3333 case E_V850E3V5_ARCH:
3334 strcat (buf, ", v850e3v5");
3335 break;
1cd986c5
NC
3336 case E_V850E2V3_ARCH:
3337 strcat (buf, ", v850e2v3");
3338 break;
3339 case E_V850E2_ARCH:
3340 strcat (buf, ", v850e2");
3341 break;
3342 case E_V850E1_ARCH:
3343 strcat (buf, ", v850e1");
8ad30312 3344 break;
252b5132
RH
3345 case E_V850E_ARCH:
3346 strcat (buf, ", v850e");
3347 break;
252b5132
RH
3348 case E_V850_ARCH:
3349 strcat (buf, ", v850");
3350 break;
3351 default:
2b692964 3352 strcat (buf, _(", unknown v850 architecture variant"));
252b5132
RH
3353 break;
3354 }
3355 break;
3356
2b0337b0 3357 case EM_M32R:
252b5132
RH
3358 case EM_CYGNUS_M32R:
3359 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3360 strcat (buf, ", m32r");
252b5132
RH
3361 break;
3362
3363 case EM_MIPS:
4fe85591 3364 case EM_MIPS_RS3_LE:
252b5132
RH
3365 if (e_flags & EF_MIPS_NOREORDER)
3366 strcat (buf, ", noreorder");
3367
3368 if (e_flags & EF_MIPS_PIC)
3369 strcat (buf, ", pic");
3370
3371 if (e_flags & EF_MIPS_CPIC)
3372 strcat (buf, ", cpic");
3373
d1bdd336
TS
3374 if (e_flags & EF_MIPS_UCODE)
3375 strcat (buf, ", ugen_reserved");
3376
252b5132
RH
3377 if (e_flags & EF_MIPS_ABI2)
3378 strcat (buf, ", abi2");
3379
43521d43
TS
3380 if (e_flags & EF_MIPS_OPTIONS_FIRST)
3381 strcat (buf, ", odk first");
3382
a5d22d2a
TS
3383 if (e_flags & EF_MIPS_32BITMODE)
3384 strcat (buf, ", 32bitmode");
3385
ba92f887
MR
3386 if (e_flags & EF_MIPS_NAN2008)
3387 strcat (buf, ", nan2008");
3388
fef1b0b3
SE
3389 if (e_flags & EF_MIPS_FP64)
3390 strcat (buf, ", fp64");
3391
156c2f8b
NC
3392 switch ((e_flags & EF_MIPS_MACH))
3393 {
3394 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3395 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3396 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
156c2f8b 3397 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
810dfa6e
L
3398 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3399 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3400 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3401 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
ef272caa 3402 case E_MIPS_MACH_5900: strcat (buf, ", 5900"); break;
c6c98b38 3403 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
ebcb91b7 3404 case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
350cc38d
MS
3405 case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3406 case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
ac8cb70f 3407 case E_MIPS_MACH_GS464: strcat (buf, ", gs464"); break;
bd782c07 3408 case E_MIPS_MACH_GS464E: strcat (buf, ", gs464e"); break;
9108bc33 3409 case E_MIPS_MACH_GS264E: strcat (buf, ", gs264e"); break;
05c6f050 3410 case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
67c2a3e8 3411 case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
d32e5c54 3412 case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
52b6b6b9 3413 case E_MIPS_MACH_XLR: strcat (buf, ", xlr"); break;
38bf472a 3414 case E_MIPS_MACH_IAMR2: strcat (buf, ", interaptiv-mr2"); break;
43521d43
TS
3415 case 0:
3416 /* We simply ignore the field in this case to avoid confusion:
3417 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3418 extension. */
3419 break;
2b692964 3420 default: strcat (buf, _(", unknown CPU")); break;
156c2f8b 3421 }
43521d43
TS
3422
3423 switch ((e_flags & EF_MIPS_ABI))
3424 {
3425 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3426 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3427 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3428 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3429 case 0:
3430 /* We simply ignore the field in this case to avoid confusion:
3431 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3432 This means it is likely to be an o32 file, but not for
3433 sure. */
3434 break;
2b692964 3435 default: strcat (buf, _(", unknown ABI")); break;
43521d43
TS
3436 }
3437
3438 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3439 strcat (buf, ", mdmx");
3440
3441 if (e_flags & EF_MIPS_ARCH_ASE_M16)
3442 strcat (buf, ", mips16");
3443
df58fc94
RS
3444 if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3445 strcat (buf, ", micromips");
3446
43521d43
TS
3447 switch ((e_flags & EF_MIPS_ARCH))
3448 {
3449 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3450 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3451 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3452 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3453 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3454 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
cb44e358 3455 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
7361da2c 3456 case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
43521d43 3457 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
5f74bc13 3458 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
7361da2c 3459 case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
2b692964 3460 default: strcat (buf, _(", unknown ISA")); break;
43521d43 3461 }
252b5132 3462 break;
351b4b40 3463
35c08157
KLC
3464 case EM_NDS32:
3465 decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3466 break;
3467
fe944acf
FT
3468 case EM_NFP:
3469 switch (EF_NFP_MACH (e_flags))
3470 {
3471 case E_NFP_MACH_3200:
3472 strcat (buf, ", NFP-32xx");
3473 break;
3474 case E_NFP_MACH_6000:
3475 strcat (buf, ", NFP-6xxx");
3476 break;
3477 }
3478 break;
3479
e23eba97
NC
3480 case EM_RISCV:
3481 if (e_flags & EF_RISCV_RVC)
3482 strcat (buf, ", RVC");
2922d21d 3483
7f999549
JW
3484 if (e_flags & EF_RISCV_RVE)
3485 strcat (buf, ", RVE");
3486
2922d21d
AW
3487 switch (e_flags & EF_RISCV_FLOAT_ABI)
3488 {
3489 case EF_RISCV_FLOAT_ABI_SOFT:
3490 strcat (buf, ", soft-float ABI");
3491 break;
3492
3493 case EF_RISCV_FLOAT_ABI_SINGLE:
3494 strcat (buf, ", single-float ABI");
3495 break;
3496
3497 case EF_RISCV_FLOAT_ABI_DOUBLE:
3498 strcat (buf, ", double-float ABI");
3499 break;
3500
3501 case EF_RISCV_FLOAT_ABI_QUAD:
3502 strcat (buf, ", quad-float ABI");
3503 break;
3504 }
e23eba97
NC
3505 break;
3506
ccde1100
AO
3507 case EM_SH:
3508 switch ((e_flags & EF_SH_MACH_MASK))
3509 {
3510 case EF_SH1: strcat (buf, ", sh1"); break;
3511 case EF_SH2: strcat (buf, ", sh2"); break;
3512 case EF_SH3: strcat (buf, ", sh3"); break;
3513 case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3514 case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3515 case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3516 case EF_SH3E: strcat (buf, ", sh3e"); break;
3517 case EF_SH4: strcat (buf, ", sh4"); break;
3518 case EF_SH5: strcat (buf, ", sh5"); break;
3519 case EF_SH2E: strcat (buf, ", sh2e"); break;
3520 case EF_SH4A: strcat (buf, ", sh4a"); break;
1d70c7fb 3521 case EF_SH2A: strcat (buf, ", sh2a"); break;
ccde1100
AO
3522 case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3523 case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
1d70c7fb 3524 case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
0b92ab21
NH
3525 case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3526 case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3527 case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3528 case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3529 case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3530 case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
2b692964 3531 default: strcat (buf, _(", unknown ISA")); break;
ccde1100
AO
3532 }
3533
cec6a5b8
MR
3534 if (e_flags & EF_SH_PIC)
3535 strcat (buf, ", pic");
3536
3537 if (e_flags & EF_SH_FDPIC)
3538 strcat (buf, ", fdpic");
ccde1100 3539 break;
948f632f 3540
73589c9d
CS
3541 case EM_OR1K:
3542 if (e_flags & EF_OR1K_NODELAY)
3543 strcat (buf, ", no delay");
3544 break;
57346661 3545
351b4b40
RH
3546 case EM_SPARCV9:
3547 if (e_flags & EF_SPARC_32PLUS)
3548 strcat (buf, ", v8+");
3549
3550 if (e_flags & EF_SPARC_SUN_US1)
d07faca2
RH
3551 strcat (buf, ", ultrasparcI");
3552
3553 if (e_flags & EF_SPARC_SUN_US3)
3554 strcat (buf, ", ultrasparcIII");
351b4b40
RH
3555
3556 if (e_flags & EF_SPARC_HAL_R1)
3557 strcat (buf, ", halr1");
3558
3559 if (e_flags & EF_SPARC_LEDATA)
3560 strcat (buf, ", ledata");
3561
3562 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3563 strcat (buf, ", tso");
3564
3565 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3566 strcat (buf, ", pso");
3567
3568 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3569 strcat (buf, ", rmo");
3570 break;
7d466069 3571
103f02d3
UD
3572 case EM_PARISC:
3573 switch (e_flags & EF_PARISC_ARCH)
3574 {
3575 case EFA_PARISC_1_0:
3576 strcpy (buf, ", PA-RISC 1.0");
3577 break;
3578 case EFA_PARISC_1_1:
3579 strcpy (buf, ", PA-RISC 1.1");
3580 break;
3581 case EFA_PARISC_2_0:
3582 strcpy (buf, ", PA-RISC 2.0");
3583 break;
3584 default:
3585 break;
3586 }
3587 if (e_flags & EF_PARISC_TRAPNIL)
3588 strcat (buf, ", trapnil");
3589 if (e_flags & EF_PARISC_EXT)
3590 strcat (buf, ", ext");
3591 if (e_flags & EF_PARISC_LSB)
3592 strcat (buf, ", lsb");
3593 if (e_flags & EF_PARISC_WIDE)
3594 strcat (buf, ", wide");
3595 if (e_flags & EF_PARISC_NO_KABP)
3596 strcat (buf, ", no kabp");
3597 if (e_flags & EF_PARISC_LAZYSWAP)
3598 strcat (buf, ", lazyswap");
30800947 3599 break;
76da6bbe 3600
7d466069 3601 case EM_PJ:
2b0337b0 3602 case EM_PJ_OLD:
7d466069
ILT
3603 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3604 strcat (buf, ", new calling convention");
3605
3606 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3607 strcat (buf, ", gnu calling convention");
3608 break;
4d6ed7c8
NC
3609
3610 case EM_IA_64:
3611 if ((e_flags & EF_IA_64_ABI64))
3612 strcat (buf, ", 64-bit");
3613 else
3614 strcat (buf, ", 32-bit");
3615 if ((e_flags & EF_IA_64_REDUCEDFP))
3616 strcat (buf, ", reduced fp model");
3617 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3618 strcat (buf, ", no function descriptors, constant gp");
3619 else if ((e_flags & EF_IA_64_CONS_GP))
3620 strcat (buf, ", constant gp");
3621 if ((e_flags & EF_IA_64_ABSOLUTE))
3622 strcat (buf, ", absolute");
dda8d76d 3623 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
28f997cf
TG
3624 {
3625 if ((e_flags & EF_IA_64_VMS_LINKAGES))
3626 strcat (buf, ", vms_linkages");
3627 switch ((e_flags & EF_IA_64_VMS_COMCOD))
3628 {
3629 case EF_IA_64_VMS_COMCOD_SUCCESS:
3630 break;
3631 case EF_IA_64_VMS_COMCOD_WARNING:
3632 strcat (buf, ", warning");
3633 break;
3634 case EF_IA_64_VMS_COMCOD_ERROR:
3635 strcat (buf, ", error");
3636 break;
3637 case EF_IA_64_VMS_COMCOD_ABORT:
3638 strcat (buf, ", abort");
3639 break;
3640 default:
bee0ee85
NC
3641 warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3642 e_flags & EF_IA_64_VMS_COMCOD);
3643 strcat (buf, ", <unknown>");
28f997cf
TG
3644 }
3645 }
4d6ed7c8 3646 break;
179d3252
JT
3647
3648 case EM_VAX:
3649 if ((e_flags & EF_VAX_NONPIC))
3650 strcat (buf, ", non-PIC");
3651 if ((e_flags & EF_VAX_DFLOAT))
3652 strcat (buf, ", D-Float");
3653 if ((e_flags & EF_VAX_GFLOAT))
3654 strcat (buf, ", G-Float");
3655 break;
c7927a3c 3656
619ed720
EB
3657 case EM_VISIUM:
3658 if (e_flags & EF_VISIUM_ARCH_MCM)
3659 strcat (buf, ", mcm");
3660 else if (e_flags & EF_VISIUM_ARCH_MCM24)
3661 strcat (buf, ", mcm24");
3662 if (e_flags & EF_VISIUM_ARCH_GR6)
3663 strcat (buf, ", gr6");
3664 break;
3665
4046d87a 3666 case EM_RL78:
1740ba0c
NC
3667 switch (e_flags & E_FLAG_RL78_CPU_MASK)
3668 {
3669 case E_FLAG_RL78_ANY_CPU: break;
3670 case E_FLAG_RL78_G10: strcat (buf, ", G10"); break;
3671 case E_FLAG_RL78_G13: strcat (buf, ", G13"); break;
3672 case E_FLAG_RL78_G14: strcat (buf, ", G14"); break;
3673 }
856ea05c
KP
3674 if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3675 strcat (buf, ", 64-bit doubles");
4046d87a 3676 break;
0b4362b0 3677
c7927a3c
NC
3678 case EM_RX:
3679 if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3680 strcat (buf, ", 64-bit doubles");
3681 if (e_flags & E_FLAG_RX_DSP)
dd24e3da 3682 strcat (buf, ", dsp");
d4cb0ea0 3683 if (e_flags & E_FLAG_RX_PID)
0b4362b0 3684 strcat (buf, ", pid");
708e2187
NC
3685 if (e_flags & E_FLAG_RX_ABI)
3686 strcat (buf, ", RX ABI");
3525236c
NC
3687 if (e_flags & E_FLAG_RX_SINSNS_SET)
3688 strcat (buf, e_flags & E_FLAG_RX_SINSNS_YES
3689 ? ", uses String instructions" : ", bans String instructions");
a117b0a5
YS
3690 if (e_flags & E_FLAG_RX_V2)
3691 strcat (buf, ", V2");
f87673e0
YS
3692 if (e_flags & E_FLAG_RX_V3)
3693 strcat (buf, ", V3");
d4cb0ea0 3694 break;
55786da2
AK
3695
3696 case EM_S390:
3697 if (e_flags & EF_S390_HIGH_GPRS)
3698 strcat (buf, ", highgprs");
d4cb0ea0 3699 break;
40b36596
JM
3700
3701 case EM_TI_C6000:
3702 if ((e_flags & EF_C6000_REL))
3703 strcat (buf, ", relocatable module");
d4cb0ea0 3704 break;
13761a11
NC
3705
3706 case EM_MSP430:
3707 strcat (buf, _(": architecture variant: "));
3708 switch (e_flags & EF_MSP430_MACH)
3709 {
3710 case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3711 case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3712 case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3713 case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3714 case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3715 case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3716 case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3717 case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3718 case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3719 case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3720 case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3721 case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3722 case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3723 case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3724 case E_MSP430_MACH_MSP430X : strcat (buf, "MSP430X"); break;
3725 default:
3726 strcat (buf, _(": unknown")); break;
3727 }
3728
3729 if (e_flags & ~ EF_MSP430_MACH)
3730 strcat (buf, _(": unknown extra flag bits also present"));
252b5132
RH
3731 }
3732 }
3733
3734 return buf;
3735}
3736
252b5132 3737static const char *
dda8d76d 3738get_osabi_name (Filedata * filedata, unsigned int osabi)
d3ba0551
AM
3739{
3740 static char buff[32];
3741
3742 switch (osabi)
3743 {
3744 case ELFOSABI_NONE: return "UNIX - System V";
3745 case ELFOSABI_HPUX: return "UNIX - HP-UX";
3746 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
9c55345c 3747 case ELFOSABI_GNU: return "UNIX - GNU";
d3ba0551
AM
3748 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
3749 case ELFOSABI_AIX: return "UNIX - AIX";
3750 case ELFOSABI_IRIX: return "UNIX - IRIX";
3751 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
3752 case ELFOSABI_TRU64: return "UNIX - TRU64";
3753 case ELFOSABI_MODESTO: return "Novell - Modesto";
3754 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
3755 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
3756 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
3b26c801 3757 case ELFOSABI_AROS: return "AROS";
11636f9e 3758 case ELFOSABI_FENIXOS: return "FenixOS";
6d913794
NC
3759 case ELFOSABI_CLOUDABI: return "Nuxi CloudABI";
3760 case ELFOSABI_OPENVOS: return "Stratus Technologies OpenVOS";
d3ba0551 3761 default:
40b36596 3762 if (osabi >= 64)
dda8d76d 3763 switch (filedata->file_header.e_machine)
40b36596
JM
3764 {
3765 case EM_ARM:
3766 switch (osabi)
3767 {
3768 case ELFOSABI_ARM: return "ARM";
18a20338 3769 case ELFOSABI_ARM_FDPIC: return "ARM FDPIC";
40b36596
JM
3770 default:
3771 break;
3772 }
3773 break;
3774
3775 case EM_MSP430:
3776 case EM_MSP430_OLD:
619ed720 3777 case EM_VISIUM:
40b36596
JM
3778 switch (osabi)
3779 {
3780 case ELFOSABI_STANDALONE: return _("Standalone App");
3781 default:
3782 break;
3783 }
3784 break;
3785
3786 case EM_TI_C6000:
3787 switch (osabi)
3788 {
3789 case ELFOSABI_C6000_ELFABI: return _("Bare-metal C6000");
3790 case ELFOSABI_C6000_LINUX: return "Linux C6000";
3791 default:
3792 break;
3793 }
3794 break;
3795
3796 default:
3797 break;
3798 }
e9e44622 3799 snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
d3ba0551
AM
3800 return buff;
3801 }
3802}
3803
a06ea964
NC
3804static const char *
3805get_aarch64_segment_type (unsigned long type)
3806{
3807 switch (type)
3808 {
32ec8896
NC
3809 case PT_AARCH64_ARCHEXT: return "AARCH64_ARCHEXT";
3810 default: return NULL;
a06ea964 3811 }
a06ea964
NC
3812}
3813
b294bdf8
MM
3814static const char *
3815get_arm_segment_type (unsigned long type)
3816{
3817 switch (type)
3818 {
32ec8896
NC
3819 case PT_ARM_EXIDX: return "EXIDX";
3820 default: return NULL;
b294bdf8 3821 }
b294bdf8
MM
3822}
3823
b4cbbe8f
AK
3824static const char *
3825get_s390_segment_type (unsigned long type)
3826{
3827 switch (type)
3828 {
3829 case PT_S390_PGSTE: return "S390_PGSTE";
3830 default: return NULL;
3831 }
3832}
3833
d3ba0551
AM
3834static const char *
3835get_mips_segment_type (unsigned long type)
252b5132
RH
3836{
3837 switch (type)
3838 {
32ec8896
NC
3839 case PT_MIPS_REGINFO: return "REGINFO";
3840 case PT_MIPS_RTPROC: return "RTPROC";
3841 case PT_MIPS_OPTIONS: return "OPTIONS";
3842 case PT_MIPS_ABIFLAGS: return "ABIFLAGS";
3843 default: return NULL;
252b5132 3844 }
252b5132
RH
3845}
3846
103f02d3 3847static const char *
d3ba0551 3848get_parisc_segment_type (unsigned long type)
103f02d3
UD
3849{
3850 switch (type)
3851 {
3852 case PT_HP_TLS: return "HP_TLS";
3853 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
3854 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
3855 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
3856 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
3857 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
3858 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
3859 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
3860 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
3861 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
3862 case PT_HP_PARALLEL: return "HP_PARALLEL";
3863 case PT_HP_FASTBIND: return "HP_FASTBIND";
eec8f817
DA
3864 case PT_HP_OPT_ANNOT: return "HP_OPT_ANNOT";
3865 case PT_HP_HSL_ANNOT: return "HP_HSL_ANNOT";
3866 case PT_HP_STACK: return "HP_STACK";
3867 case PT_HP_CORE_UTSNAME: return "HP_CORE_UTSNAME";
103f02d3
UD
3868 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
3869 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
61472819 3870 case PT_PARISC_WEAKORDER: return "PARISC_WEAKORDER";
32ec8896 3871 default: return NULL;
103f02d3 3872 }
103f02d3
UD
3873}
3874
4d6ed7c8 3875static const char *
d3ba0551 3876get_ia64_segment_type (unsigned long type)
4d6ed7c8
NC
3877{
3878 switch (type)
3879 {
3880 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
3881 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
00428cca
AM
3882 case PT_HP_TLS: return "HP_TLS";
3883 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
3884 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
3885 case PT_IA_64_HP_STACK: return "HP_STACK";
32ec8896 3886 default: return NULL;
4d6ed7c8 3887 }
4d6ed7c8
NC
3888}
3889
40b36596
JM
3890static const char *
3891get_tic6x_segment_type (unsigned long type)
3892{
3893 switch (type)
3894 {
32ec8896
NC
3895 case PT_C6000_PHATTR: return "C6000_PHATTR";
3896 default: return NULL;
40b36596 3897 }
40b36596
JM
3898}
3899
5522f910
NC
3900static const char *
3901get_solaris_segment_type (unsigned long type)
3902{
3903 switch (type)
3904 {
3905 case 0x6464e550: return "PT_SUNW_UNWIND";
3906 case 0x6474e550: return "PT_SUNW_EH_FRAME";
3907 case 0x6ffffff7: return "PT_LOSUNW";
3908 case 0x6ffffffa: return "PT_SUNWBSS";
3909 case 0x6ffffffb: return "PT_SUNWSTACK";
3910 case 0x6ffffffc: return "PT_SUNWDTRACE";
3911 case 0x6ffffffd: return "PT_SUNWCAP";
3912 case 0x6fffffff: return "PT_HISUNW";
32ec8896 3913 default: return NULL;
5522f910
NC
3914 }
3915}
3916
252b5132 3917static const char *
dda8d76d 3918get_segment_type (Filedata * filedata, unsigned long p_type)
252b5132 3919{
b34976b6 3920 static char buff[32];
252b5132
RH
3921
3922 switch (p_type)
3923 {
b34976b6
AM
3924 case PT_NULL: return "NULL";
3925 case PT_LOAD: return "LOAD";
252b5132 3926 case PT_DYNAMIC: return "DYNAMIC";
b34976b6
AM
3927 case PT_INTERP: return "INTERP";
3928 case PT_NOTE: return "NOTE";
3929 case PT_SHLIB: return "SHLIB";
3930 case PT_PHDR: return "PHDR";
13ae64f3 3931 case PT_TLS: return "TLS";
32ec8896 3932 case PT_GNU_EH_FRAME: return "GNU_EH_FRAME";
2b05f1b7 3933 case PT_GNU_STACK: return "GNU_STACK";
8c37241b 3934 case PT_GNU_RELRO: return "GNU_RELRO";
0a59decb 3935 case PT_GNU_PROPERTY: return "GNU_PROPERTY";
65765700 3936
252b5132 3937 default:
a91e1603
L
3938 if (p_type >= PT_GNU_MBIND_LO && p_type <= PT_GNU_MBIND_HI)
3939 {
3940 sprintf (buff, "GNU_MBIND+%#lx",
3941 p_type - PT_GNU_MBIND_LO);
3942 }
3943 else if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
252b5132 3944 {
2cf0635d 3945 const char * result;
103f02d3 3946
dda8d76d 3947 switch (filedata->file_header.e_machine)
252b5132 3948 {
a06ea964
NC
3949 case EM_AARCH64:
3950 result = get_aarch64_segment_type (p_type);
3951 break;
b294bdf8
MM
3952 case EM_ARM:
3953 result = get_arm_segment_type (p_type);
3954 break;
252b5132 3955 case EM_MIPS:
4fe85591 3956 case EM_MIPS_RS3_LE:
252b5132
RH
3957 result = get_mips_segment_type (p_type);
3958 break;
103f02d3
UD
3959 case EM_PARISC:
3960 result = get_parisc_segment_type (p_type);
3961 break;
4d6ed7c8
NC
3962 case EM_IA_64:
3963 result = get_ia64_segment_type (p_type);
3964 break;
40b36596
JM
3965 case EM_TI_C6000:
3966 result = get_tic6x_segment_type (p_type);
3967 break;
b4cbbe8f
AK
3968 case EM_S390:
3969 case EM_S390_OLD:
3970 result = get_s390_segment_type (p_type);
3971 break;
252b5132
RH
3972 default:
3973 result = NULL;
3974 break;
3975 }
103f02d3 3976
252b5132
RH
3977 if (result != NULL)
3978 return result;
103f02d3 3979
1a9ccd70 3980 sprintf (buff, "LOPROC+%#lx", p_type - PT_LOPROC);
252b5132
RH
3981 }
3982 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
103f02d3 3983 {
2cf0635d 3984 const char * result;
103f02d3 3985
dda8d76d 3986 switch (filedata->file_header.e_machine)
103f02d3
UD
3987 {
3988 case EM_PARISC:
3989 result = get_parisc_segment_type (p_type);
3990 break;
00428cca
AM
3991 case EM_IA_64:
3992 result = get_ia64_segment_type (p_type);
3993 break;
103f02d3 3994 default:
dda8d76d 3995 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
5522f910
NC
3996 result = get_solaris_segment_type (p_type);
3997 else
3998 result = NULL;
103f02d3
UD
3999 break;
4000 }
4001
4002 if (result != NULL)
4003 return result;
4004
1a9ccd70 4005 sprintf (buff, "LOOS+%#lx", p_type - PT_LOOS);
103f02d3 4006 }
252b5132 4007 else
e9e44622 4008 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
252b5132
RH
4009
4010 return buff;
4011 }
4012}
4013
53a346d8
CZ
4014static const char *
4015get_arc_section_type_name (unsigned int sh_type)
4016{
4017 switch (sh_type)
4018 {
4019 case SHT_ARC_ATTRIBUTES: return "ARC_ATTRIBUTES";
4020 default:
4021 break;
4022 }
4023 return NULL;
4024}
4025
252b5132 4026static const char *
d3ba0551 4027get_mips_section_type_name (unsigned int sh_type)
252b5132
RH
4028{
4029 switch (sh_type)
4030 {
b34976b6
AM
4031 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
4032 case SHT_MIPS_MSYM: return "MIPS_MSYM";
4033 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
4034 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
4035 case SHT_MIPS_UCODE: return "MIPS_UCODE";
4036 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
4037 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
4038 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
4039 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
4040 case SHT_MIPS_RELD: return "MIPS_RELD";
4041 case SHT_MIPS_IFACE: return "MIPS_IFACE";
4042 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
4043 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
4044 case SHT_MIPS_SHDR: return "MIPS_SHDR";
4045 case SHT_MIPS_FDESC: return "MIPS_FDESC";
4046 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
4047 case SHT_MIPS_DENSE: return "MIPS_DENSE";
4048 case SHT_MIPS_PDESC: return "MIPS_PDESC";
4049 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
4050 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
4051 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
4052 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
4053 case SHT_MIPS_LINE: return "MIPS_LINE";
4054 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
4055 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
4056 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
4057 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
4058 case SHT_MIPS_DWARF: return "MIPS_DWARF";
4059 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
4060 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
4061 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
4062 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
4063 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
4064 case SHT_MIPS_XLATE: return "MIPS_XLATE";
4065 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
4066 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
4067 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
4068 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
252b5132 4069 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
351cdf24 4070 case SHT_MIPS_ABIFLAGS: return "MIPS_ABIFLAGS";
252b5132
RH
4071 default:
4072 break;
4073 }
4074 return NULL;
4075}
4076
103f02d3 4077static const char *
d3ba0551 4078get_parisc_section_type_name (unsigned int sh_type)
103f02d3
UD
4079{
4080 switch (sh_type)
4081 {
4082 case SHT_PARISC_EXT: return "PARISC_EXT";
4083 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
4084 case SHT_PARISC_DOC: return "PARISC_DOC";
eec8f817
DA
4085 case SHT_PARISC_ANNOT: return "PARISC_ANNOT";
4086 case SHT_PARISC_SYMEXTN: return "PARISC_SYMEXTN";
4087 case SHT_PARISC_STUBS: return "PARISC_STUBS";
61472819 4088 case SHT_PARISC_DLKM: return "PARISC_DLKM";
32ec8896 4089 default: return NULL;
103f02d3 4090 }
103f02d3
UD
4091}
4092
4d6ed7c8 4093static const char *
dda8d76d 4094get_ia64_section_type_name (Filedata * filedata, unsigned int sh_type)
4d6ed7c8 4095{
18bd398b 4096 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
ecc51f48 4097 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
dda8d76d 4098 return get_osabi_name (filedata, (sh_type & 0x00FF0000) >> 16);
0de14b54 4099
4d6ed7c8
NC
4100 switch (sh_type)
4101 {
148b93f2
NC
4102 case SHT_IA_64_EXT: return "IA_64_EXT";
4103 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
4104 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
4105 case SHT_IA_64_VMS_TRACE: return "VMS_TRACE";
4106 case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
4107 case SHT_IA_64_VMS_DEBUG: return "VMS_DEBUG";
4108 case SHT_IA_64_VMS_DEBUG_STR: return "VMS_DEBUG_STR";
4109 case SHT_IA_64_VMS_LINKAGES: return "VMS_LINKAGES";
4110 case SHT_IA_64_VMS_SYMBOL_VECTOR: return "VMS_SYMBOL_VECTOR";
4111 case SHT_IA_64_VMS_FIXUP: return "VMS_FIXUP";
4d6ed7c8
NC
4112 default:
4113 break;
4114 }
4115 return NULL;
4116}
4117
d2b2c203
DJ
4118static const char *
4119get_x86_64_section_type_name (unsigned int sh_type)
4120{
4121 switch (sh_type)
4122 {
4123 case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
32ec8896 4124 default: return NULL;
d2b2c203 4125 }
d2b2c203
DJ
4126}
4127
a06ea964
NC
4128static const char *
4129get_aarch64_section_type_name (unsigned int sh_type)
4130{
4131 switch (sh_type)
4132 {
32ec8896
NC
4133 case SHT_AARCH64_ATTRIBUTES: return "AARCH64_ATTRIBUTES";
4134 default: return NULL;
a06ea964 4135 }
a06ea964
NC
4136}
4137
40a18ebd
NC
4138static const char *
4139get_arm_section_type_name (unsigned int sh_type)
4140{
4141 switch (sh_type)
4142 {
7f6fed87
NC
4143 case SHT_ARM_EXIDX: return "ARM_EXIDX";
4144 case SHT_ARM_PREEMPTMAP: return "ARM_PREEMPTMAP";
4145 case SHT_ARM_ATTRIBUTES: return "ARM_ATTRIBUTES";
4146 case SHT_ARM_DEBUGOVERLAY: return "ARM_DEBUGOVERLAY";
4147 case SHT_ARM_OVERLAYSECTION: return "ARM_OVERLAYSECTION";
32ec8896 4148 default: return NULL;
40a18ebd 4149 }
40a18ebd
NC
4150}
4151
40b36596
JM
4152static const char *
4153get_tic6x_section_type_name (unsigned int sh_type)
4154{
4155 switch (sh_type)
4156 {
32ec8896
NC
4157 case SHT_C6000_UNWIND: return "C6000_UNWIND";
4158 case SHT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
4159 case SHT_C6000_ATTRIBUTES: return "C6000_ATTRIBUTES";
4160 case SHT_TI_ICODE: return "TI_ICODE";
4161 case SHT_TI_XREF: return "TI_XREF";
4162 case SHT_TI_HANDLER: return "TI_HANDLER";
4163 case SHT_TI_INITINFO: return "TI_INITINFO";
4164 case SHT_TI_PHATTRS: return "TI_PHATTRS";
4165 default: return NULL;
40b36596 4166 }
40b36596
JM
4167}
4168
13761a11
NC
4169static const char *
4170get_msp430x_section_type_name (unsigned int sh_type)
4171{
4172 switch (sh_type)
4173 {
32ec8896
NC
4174 case SHT_MSP430_SEC_FLAGS: return "MSP430_SEC_FLAGS";
4175 case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
4176 case SHT_MSP430_ATTRIBUTES: return "MSP430_ATTRIBUTES";
4177 default: return NULL;
13761a11
NC
4178 }
4179}
4180
fe944acf
FT
4181static const char *
4182get_nfp_section_type_name (unsigned int sh_type)
4183{
4184 switch (sh_type)
4185 {
4186 case SHT_NFP_MECONFIG: return "NFP_MECONFIG";
4187 case SHT_NFP_INITREG: return "NFP_INITREG";
4188 case SHT_NFP_UDEBUG: return "NFP_UDEBUG";
4189 default: return NULL;
4190 }
4191}
4192
685080f2
NC
4193static const char *
4194get_v850_section_type_name (unsigned int sh_type)
4195{
4196 switch (sh_type)
4197 {
32ec8896
NC
4198 case SHT_V850_SCOMMON: return "V850 Small Common";
4199 case SHT_V850_TCOMMON: return "V850 Tiny Common";
4200 case SHT_V850_ZCOMMON: return "V850 Zero Common";
4201 case SHT_RENESAS_IOP: return "RENESAS IOP";
4202 case SHT_RENESAS_INFO: return "RENESAS INFO";
4203 default: return NULL;
685080f2
NC
4204 }
4205}
4206
2dc8dd17
JW
4207static const char *
4208get_riscv_section_type_name (unsigned int sh_type)
4209{
4210 switch (sh_type)
4211 {
4212 case SHT_RISCV_ATTRIBUTES: return "RISCV_ATTRIBUTES";
4213 default: return NULL;
4214 }
4215}
4216
252b5132 4217static const char *
dda8d76d 4218get_section_type_name (Filedata * filedata, unsigned int sh_type)
252b5132 4219{
b34976b6 4220 static char buff[32];
9fb71ee4 4221 const char * result;
252b5132
RH
4222
4223 switch (sh_type)
4224 {
4225 case SHT_NULL: return "NULL";
4226 case SHT_PROGBITS: return "PROGBITS";
4227 case SHT_SYMTAB: return "SYMTAB";
4228 case SHT_STRTAB: return "STRTAB";
4229 case SHT_RELA: return "RELA";
4230 case SHT_HASH: return "HASH";
4231 case SHT_DYNAMIC: return "DYNAMIC";
4232 case SHT_NOTE: return "NOTE";
4233 case SHT_NOBITS: return "NOBITS";
4234 case SHT_REL: return "REL";
4235 case SHT_SHLIB: return "SHLIB";
4236 case SHT_DYNSYM: return "DYNSYM";
d1133906
NC
4237 case SHT_INIT_ARRAY: return "INIT_ARRAY";
4238 case SHT_FINI_ARRAY: return "FINI_ARRAY";
4239 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
fdc90cb4 4240 case SHT_GNU_HASH: return "GNU_HASH";
93ebe586 4241 case SHT_GROUP: return "GROUP";
67ce483b 4242 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICES";
252b5132
RH
4243 case SHT_GNU_verdef: return "VERDEF";
4244 case SHT_GNU_verneed: return "VERNEED";
4245 case SHT_GNU_versym: return "VERSYM";
b34976b6
AM
4246 case 0x6ffffff0: return "VERSYM";
4247 case 0x6ffffffc: return "VERDEF";
252b5132
RH
4248 case 0x7ffffffd: return "AUXILIARY";
4249 case 0x7fffffff: return "FILTER";
047b2264 4250 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
252b5132
RH
4251
4252 default:
4253 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
4254 {
dda8d76d 4255 switch (filedata->file_header.e_machine)
252b5132 4256 {
53a346d8
CZ
4257 case EM_ARC:
4258 case EM_ARC_COMPACT:
4259 case EM_ARC_COMPACT2:
4260 result = get_arc_section_type_name (sh_type);
4261 break;
252b5132 4262 case EM_MIPS:
4fe85591 4263 case EM_MIPS_RS3_LE:
252b5132
RH
4264 result = get_mips_section_type_name (sh_type);
4265 break;
103f02d3
UD
4266 case EM_PARISC:
4267 result = get_parisc_section_type_name (sh_type);
4268 break;
4d6ed7c8 4269 case EM_IA_64:
dda8d76d 4270 result = get_ia64_section_type_name (filedata, sh_type);
4d6ed7c8 4271 break;
d2b2c203 4272 case EM_X86_64:
8a9036a4 4273 case EM_L1OM:
7a9068fe 4274 case EM_K1OM:
d2b2c203
DJ
4275 result = get_x86_64_section_type_name (sh_type);
4276 break;
a06ea964
NC
4277 case EM_AARCH64:
4278 result = get_aarch64_section_type_name (sh_type);
4279 break;
40a18ebd
NC
4280 case EM_ARM:
4281 result = get_arm_section_type_name (sh_type);
4282 break;
40b36596
JM
4283 case EM_TI_C6000:
4284 result = get_tic6x_section_type_name (sh_type);
4285 break;
13761a11
NC
4286 case EM_MSP430:
4287 result = get_msp430x_section_type_name (sh_type);
4288 break;
fe944acf
FT
4289 case EM_NFP:
4290 result = get_nfp_section_type_name (sh_type);
4291 break;
685080f2
NC
4292 case EM_V800:
4293 case EM_V850:
4294 case EM_CYGNUS_V850:
4295 result = get_v850_section_type_name (sh_type);
4296 break;
2dc8dd17
JW
4297 case EM_RISCV:
4298 result = get_riscv_section_type_name (sh_type);
4299 break;
252b5132
RH
4300 default:
4301 result = NULL;
4302 break;
4303 }
4304
4305 if (result != NULL)
4306 return result;
4307
9fb71ee4 4308 sprintf (buff, "LOPROC+%#x", sh_type - SHT_LOPROC);
252b5132
RH
4309 }
4310 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
148b93f2 4311 {
dda8d76d 4312 switch (filedata->file_header.e_machine)
148b93f2
NC
4313 {
4314 case EM_IA_64:
dda8d76d 4315 result = get_ia64_section_type_name (filedata, sh_type);
148b93f2
NC
4316 break;
4317 default:
dda8d76d 4318 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
fd85a6a1
NC
4319 result = get_solaris_section_type (sh_type);
4320 else
1b4b80bf
NC
4321 {
4322 switch (sh_type)
4323 {
4324 case SHT_GNU_INCREMENTAL_INPUTS: result = "GNU_INCREMENTAL_INPUTS"; break;
4325 case SHT_GNU_ATTRIBUTES: result = "GNU_ATTRIBUTES"; break;
4326 case SHT_GNU_HASH: result = "GNU_HASH"; break;
4327 case SHT_GNU_LIBLIST: result = "GNU_LIBLIST"; break;
4328 default:
4329 result = NULL;
4330 break;
4331 }
4332 }
148b93f2
NC
4333 break;
4334 }
4335
4336 if (result != NULL)
4337 return result;
4338
9fb71ee4 4339 sprintf (buff, "LOOS+%#x", sh_type - SHT_LOOS);
148b93f2 4340 }
252b5132 4341 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
685080f2 4342 {
dda8d76d 4343 switch (filedata->file_header.e_machine)
685080f2
NC
4344 {
4345 case EM_V800:
4346 case EM_V850:
4347 case EM_CYGNUS_V850:
9fb71ee4 4348 result = get_v850_section_type_name (sh_type);
a9fb83be 4349 break;
685080f2 4350 default:
9fb71ee4 4351 result = NULL;
685080f2
NC
4352 break;
4353 }
4354
9fb71ee4
NC
4355 if (result != NULL)
4356 return result;
4357
4358 sprintf (buff, "LOUSER+%#x", sh_type - SHT_LOUSER);
685080f2 4359 }
252b5132 4360 else
a7dbfd1c
NC
4361 /* This message is probably going to be displayed in a 15
4362 character wide field, so put the hex value first. */
4363 snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
103f02d3 4364
252b5132
RH
4365 return buff;
4366 }
4367}
4368
2979dc34 4369#define OPTION_DEBUG_DUMP 512
2c610e4b 4370#define OPTION_DYN_SYMS 513
fd2f0033
TT
4371#define OPTION_DWARF_DEPTH 514
4372#define OPTION_DWARF_START 515
4723351a 4373#define OPTION_DWARF_CHECK 516
2979dc34 4374
85b1c36d 4375static struct option options[] =
252b5132 4376{
b34976b6 4377 {"all", no_argument, 0, 'a'},
252b5132
RH
4378 {"file-header", no_argument, 0, 'h'},
4379 {"program-headers", no_argument, 0, 'l'},
b34976b6
AM
4380 {"headers", no_argument, 0, 'e'},
4381 {"histogram", no_argument, 0, 'I'},
4382 {"segments", no_argument, 0, 'l'},
4383 {"sections", no_argument, 0, 'S'},
252b5132 4384 {"section-headers", no_argument, 0, 'S'},
f5842774 4385 {"section-groups", no_argument, 0, 'g'},
5477e8a0 4386 {"section-details", no_argument, 0, 't'},
595cf52e 4387 {"full-section-name",no_argument, 0, 'N'},
b34976b6
AM
4388 {"symbols", no_argument, 0, 's'},
4389 {"syms", no_argument, 0, 's'},
2c610e4b 4390 {"dyn-syms", no_argument, 0, OPTION_DYN_SYMS},
b34976b6
AM
4391 {"relocs", no_argument, 0, 'r'},
4392 {"notes", no_argument, 0, 'n'},
4393 {"dynamic", no_argument, 0, 'd'},
a952a375 4394 {"arch-specific", no_argument, 0, 'A'},
252b5132
RH
4395 {"version-info", no_argument, 0, 'V'},
4396 {"use-dynamic", no_argument, 0, 'D'},
09c11c86 4397 {"unwind", no_argument, 0, 'u'},
4145f1d5 4398 {"archive-index", no_argument, 0, 'c'},
b34976b6 4399 {"hex-dump", required_argument, 0, 'x'},
cf13d699 4400 {"relocated-dump", required_argument, 0, 'R'},
09c11c86 4401 {"string-dump", required_argument, 0, 'p'},
0e602686 4402 {"decompress", no_argument, 0, 'z'},
252b5132
RH
4403#ifdef SUPPORT_DISASSEMBLY
4404 {"instruction-dump", required_argument, 0, 'i'},
4405#endif
cf13d699 4406 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
252b5132 4407
fd2f0033
TT
4408 {"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH},
4409 {"dwarf-start", required_argument, 0, OPTION_DWARF_START},
4723351a 4410 {"dwarf-check", no_argument, 0, OPTION_DWARF_CHECK},
fd2f0033 4411
b34976b6
AM
4412 {"version", no_argument, 0, 'v'},
4413 {"wide", no_argument, 0, 'W'},
4414 {"help", no_argument, 0, 'H'},
4415 {0, no_argument, 0, 0}
252b5132
RH
4416};
4417
4418static void
2cf0635d 4419usage (FILE * stream)
252b5132 4420{
92f01d61
JM
4421 fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
4422 fprintf (stream, _(" Display information about the contents of ELF format files\n"));
4423 fprintf (stream, _(" Options are:\n\
8b53311e
NC
4424 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4425 -h --file-header Display the ELF file header\n\
4426 -l --program-headers Display the program headers\n\
4427 --segments An alias for --program-headers\n\
4428 -S --section-headers Display the sections' header\n\
4429 --sections An alias for --section-headers\n\
f5842774 4430 -g --section-groups Display the section groups\n\
5477e8a0 4431 -t --section-details Display the section details\n\
8b53311e
NC
4432 -e --headers Equivalent to: -h -l -S\n\
4433 -s --syms Display the symbol table\n\
3f08eb35 4434 --symbols An alias for --syms\n\
2c610e4b 4435 --dyn-syms Display the dynamic symbol table\n\
8b53311e
NC
4436 -n --notes Display the core notes (if present)\n\
4437 -r --relocs Display the relocations (if present)\n\
4438 -u --unwind Display the unwind info (if present)\n\
b2d38a17 4439 -d --dynamic Display the dynamic section (if present)\n\
8b53311e 4440 -V --version-info Display the version sections (if present)\n\
1b31d05e 4441 -A --arch-specific Display architecture specific information (if any)\n\
4145f1d5 4442 -c --archive-index Display the symbol/file index in an archive\n\
8b53311e 4443 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
09c11c86
NC
4444 -x --hex-dump=<number|name>\n\
4445 Dump the contents of section <number|name> as bytes\n\
4446 -p --string-dump=<number|name>\n\
4447 Dump the contents of section <number|name> as strings\n\
cf13d699
NC
4448 -R --relocated-dump=<number|name>\n\
4449 Dump the contents of section <number|name> as relocated bytes\n\
0e602686 4450 -z --decompress Decompress section before dumping it\n\
dda8d76d 4451 -w[lLiaprmfFsoRtUuTgAckK] or\n\
1ed06042 4452 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
6f875884 4453 =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
657d0d47 4454 =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
dda8d76d
NC
4455 =addr,=cu_index,=links,=follow-links]\n\
4456 Display the contents of DWARF debug sections\n"));
fd2f0033
TT
4457 fprintf (stream, _("\
4458 --dwarf-depth=N Do not display DIEs at depth N or greater\n\
4459 --dwarf-start=N Display DIEs starting with N, at the same depth\n\
4460 or deeper\n"));
252b5132 4461#ifdef SUPPORT_DISASSEMBLY
92f01d61 4462 fprintf (stream, _("\
09c11c86
NC
4463 -i --instruction-dump=<number|name>\n\
4464 Disassemble the contents of section <number|name>\n"));
252b5132 4465#endif
92f01d61 4466 fprintf (stream, _("\
8b53311e
NC
4467 -I --histogram Display histogram of bucket list lengths\n\
4468 -W --wide Allow output width to exceed 80 characters\n\
07012eee 4469 @<file> Read options from <file>\n\
8b53311e
NC
4470 -H --help Display this information\n\
4471 -v --version Display the version number of readelf\n"));
1118d252 4472
92f01d61
JM
4473 if (REPORT_BUGS_TO[0] && stream == stdout)
4474 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
252b5132 4475
92f01d61 4476 exit (stream == stdout ? 0 : 1);
252b5132
RH
4477}
4478
18bd398b
NC
4479/* Record the fact that the user wants the contents of section number
4480 SECTION to be displayed using the method(s) encoded as flags bits
4481 in TYPE. Note, TYPE can be zero if we are creating the array for
4482 the first time. */
4483
252b5132 4484static void
dda8d76d 4485request_dump_bynumber (Filedata * filedata, unsigned int section, dump_type type)
252b5132 4486{
dda8d76d 4487 if (section >= filedata->num_dump_sects)
252b5132 4488 {
2cf0635d 4489 dump_type * new_dump_sects;
252b5132 4490
3f5e193b 4491 new_dump_sects = (dump_type *) calloc (section + 1,
dda8d76d 4492 sizeof (* new_dump_sects));
252b5132
RH
4493
4494 if (new_dump_sects == NULL)
591a748a 4495 error (_("Out of memory allocating dump request table.\n"));
252b5132
RH
4496 else
4497 {
dda8d76d 4498 if (filedata->dump_sects)
21b65bac
NC
4499 {
4500 /* Copy current flag settings. */
dda8d76d
NC
4501 memcpy (new_dump_sects, filedata->dump_sects,
4502 filedata->num_dump_sects * sizeof (* new_dump_sects));
252b5132 4503
dda8d76d 4504 free (filedata->dump_sects);
21b65bac 4505 }
252b5132 4506
dda8d76d
NC
4507 filedata->dump_sects = new_dump_sects;
4508 filedata->num_dump_sects = section + 1;
252b5132
RH
4509 }
4510 }
4511
dda8d76d
NC
4512 if (filedata->dump_sects)
4513 filedata->dump_sects[section] |= type;
252b5132
RH
4514}
4515
aef1f6d0
DJ
4516/* Request a dump by section name. */
4517
4518static void
2cf0635d 4519request_dump_byname (const char * section, dump_type type)
aef1f6d0 4520{
2cf0635d 4521 struct dump_list_entry * new_request;
aef1f6d0 4522
3f5e193b
NC
4523 new_request = (struct dump_list_entry *)
4524 malloc (sizeof (struct dump_list_entry));
aef1f6d0 4525 if (!new_request)
591a748a 4526 error (_("Out of memory allocating dump request table.\n"));
aef1f6d0
DJ
4527
4528 new_request->name = strdup (section);
4529 if (!new_request->name)
591a748a 4530 error (_("Out of memory allocating dump request table.\n"));
aef1f6d0
DJ
4531
4532 new_request->type = type;
4533
4534 new_request->next = dump_sects_byname;
4535 dump_sects_byname = new_request;
4536}
4537
cf13d699 4538static inline void
dda8d76d 4539request_dump (Filedata * filedata, dump_type type)
cf13d699
NC
4540{
4541 int section;
4542 char * cp;
4543
4544 do_dump++;
4545 section = strtoul (optarg, & cp, 0);
4546
4547 if (! *cp && section >= 0)
dda8d76d 4548 request_dump_bynumber (filedata, section, type);
cf13d699
NC
4549 else
4550 request_dump_byname (optarg, type);
4551}
4552
252b5132 4553static void
dda8d76d 4554parse_args (Filedata * filedata, int argc, char ** argv)
252b5132
RH
4555{
4556 int c;
4557
4558 if (argc < 2)
92f01d61 4559 usage (stderr);
252b5132
RH
4560
4561 while ((c = getopt_long
0e602686 4562 (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
252b5132 4563 {
252b5132
RH
4564 switch (c)
4565 {
4566 case 0:
4567 /* Long options. */
4568 break;
4569 case 'H':
92f01d61 4570 usage (stdout);
252b5132
RH
4571 break;
4572
4573 case 'a':
32ec8896
NC
4574 do_syms = TRUE;
4575 do_reloc = TRUE;
4576 do_unwind = TRUE;
4577 do_dynamic = TRUE;
4578 do_header = TRUE;
4579 do_sections = TRUE;
4580 do_section_groups = TRUE;
4581 do_segments = TRUE;
4582 do_version = TRUE;
4583 do_histogram = TRUE;
4584 do_arch = TRUE;
4585 do_notes = TRUE;
252b5132 4586 break;
f5842774 4587 case 'g':
32ec8896 4588 do_section_groups = TRUE;
f5842774 4589 break;
5477e8a0 4590 case 't':
595cf52e 4591 case 'N':
32ec8896
NC
4592 do_sections = TRUE;
4593 do_section_details = TRUE;
595cf52e 4594 break;
252b5132 4595 case 'e':
32ec8896
NC
4596 do_header = TRUE;
4597 do_sections = TRUE;
4598 do_segments = TRUE;
252b5132 4599 break;
a952a375 4600 case 'A':
32ec8896 4601 do_arch = TRUE;
a952a375 4602 break;
252b5132 4603 case 'D':
32ec8896 4604 do_using_dynamic = TRUE;
252b5132
RH
4605 break;
4606 case 'r':
32ec8896 4607 do_reloc = TRUE;
252b5132 4608 break;
4d6ed7c8 4609 case 'u':
32ec8896 4610 do_unwind = TRUE;
4d6ed7c8 4611 break;
252b5132 4612 case 'h':
32ec8896 4613 do_header = TRUE;
252b5132
RH
4614 break;
4615 case 'l':
32ec8896 4616 do_segments = TRUE;
252b5132
RH
4617 break;
4618 case 's':
32ec8896 4619 do_syms = TRUE;
252b5132
RH
4620 break;
4621 case 'S':
32ec8896 4622 do_sections = TRUE;
252b5132
RH
4623 break;
4624 case 'd':
32ec8896 4625 do_dynamic = TRUE;
252b5132 4626 break;
a952a375 4627 case 'I':
32ec8896 4628 do_histogram = TRUE;
a952a375 4629 break;
779fe533 4630 case 'n':
32ec8896 4631 do_notes = TRUE;
779fe533 4632 break;
4145f1d5 4633 case 'c':
32ec8896 4634 do_archive_index = TRUE;
4145f1d5 4635 break;
252b5132 4636 case 'x':
dda8d76d 4637 request_dump (filedata, HEX_DUMP);
aef1f6d0 4638 break;
09c11c86 4639 case 'p':
dda8d76d 4640 request_dump (filedata, STRING_DUMP);
cf13d699
NC
4641 break;
4642 case 'R':
dda8d76d 4643 request_dump (filedata, RELOC_DUMP);
09c11c86 4644 break;
0e602686 4645 case 'z':
32ec8896 4646 decompress_dumps = TRUE;
0e602686 4647 break;
252b5132 4648 case 'w':
32ec8896 4649 do_dump = TRUE;
252b5132 4650 if (optarg == 0)
613ff48b 4651 {
32ec8896 4652 do_debugging = TRUE;
613ff48b
CC
4653 dwarf_select_sections_all ();
4654 }
252b5132
RH
4655 else
4656 {
32ec8896 4657 do_debugging = FALSE;
4cb93e3b 4658 dwarf_select_sections_by_letters (optarg);
252b5132
RH
4659 }
4660 break;
2979dc34 4661 case OPTION_DEBUG_DUMP:
32ec8896 4662 do_dump = TRUE;
2979dc34 4663 if (optarg == 0)
32ec8896 4664 do_debugging = TRUE;
2979dc34
JJ
4665 else
4666 {
32ec8896 4667 do_debugging = FALSE;
4cb93e3b 4668 dwarf_select_sections_by_names (optarg);
2979dc34
JJ
4669 }
4670 break;
fd2f0033
TT
4671 case OPTION_DWARF_DEPTH:
4672 {
4673 char *cp;
4674
4675 dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4676 }
4677 break;
4678 case OPTION_DWARF_START:
4679 {
4680 char *cp;
4681
4682 dwarf_start_die = strtoul (optarg, & cp, 0);
4683 }
4684 break;
4723351a 4685 case OPTION_DWARF_CHECK:
32ec8896 4686 dwarf_check = TRUE;
4723351a 4687 break;
2c610e4b 4688 case OPTION_DYN_SYMS:
32ec8896 4689 do_dyn_syms = TRUE;
2c610e4b 4690 break;
252b5132
RH
4691#ifdef SUPPORT_DISASSEMBLY
4692 case 'i':
dda8d76d 4693 request_dump (filedata, DISASS_DUMP);
cf13d699 4694 break;
252b5132
RH
4695#endif
4696 case 'v':
4697 print_version (program_name);
4698 break;
4699 case 'V':
32ec8896 4700 do_version = TRUE;
252b5132 4701 break;
d974e256 4702 case 'W':
32ec8896 4703 do_wide = TRUE;
d974e256 4704 break;
252b5132 4705 default:
252b5132
RH
4706 /* xgettext:c-format */
4707 error (_("Invalid option '-%c'\n"), c);
1a0670f3 4708 /* Fall through. */
252b5132 4709 case '?':
92f01d61 4710 usage (stderr);
252b5132
RH
4711 }
4712 }
4713
4d6ed7c8 4714 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
252b5132 4715 && !do_segments && !do_header && !do_dump && !do_version
f5842774 4716 && !do_histogram && !do_debugging && !do_arch && !do_notes
2c610e4b
L
4717 && !do_section_groups && !do_archive_index
4718 && !do_dyn_syms)
92f01d61 4719 usage (stderr);
252b5132
RH
4720}
4721
4722static const char *
d3ba0551 4723get_elf_class (unsigned int elf_class)
252b5132 4724{
b34976b6 4725 static char buff[32];
103f02d3 4726
252b5132
RH
4727 switch (elf_class)
4728 {
4729 case ELFCLASSNONE: return _("none");
e3c8793a
NC
4730 case ELFCLASS32: return "ELF32";
4731 case ELFCLASS64: return "ELF64";
ab5e7794 4732 default:
e9e44622 4733 snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
ab5e7794 4734 return buff;
252b5132
RH
4735 }
4736}
4737
4738static const char *
d3ba0551 4739get_data_encoding (unsigned int encoding)
252b5132 4740{
b34976b6 4741 static char buff[32];
103f02d3 4742
252b5132
RH
4743 switch (encoding)
4744 {
4745 case ELFDATANONE: return _("none");
33c63f9d
CM
4746 case ELFDATA2LSB: return _("2's complement, little endian");
4747 case ELFDATA2MSB: return _("2's complement, big endian");
103f02d3 4748 default:
e9e44622 4749 snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
ab5e7794 4750 return buff;
252b5132
RH
4751 }
4752}
4753
dda8d76d 4754/* Decode the data held in 'filedata->file_header'. */
ee42cf8c 4755
32ec8896 4756static bfd_boolean
dda8d76d 4757process_file_header (Filedata * filedata)
252b5132 4758{
dda8d76d
NC
4759 Elf_Internal_Ehdr * header = & filedata->file_header;
4760
4761 if ( header->e_ident[EI_MAG0] != ELFMAG0
4762 || header->e_ident[EI_MAG1] != ELFMAG1
4763 || header->e_ident[EI_MAG2] != ELFMAG2
4764 || header->e_ident[EI_MAG3] != ELFMAG3)
252b5132
RH
4765 {
4766 error
4767 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
32ec8896 4768 return FALSE;
252b5132
RH
4769 }
4770
dda8d76d 4771 init_dwarf_regnames (header->e_machine);
2dc4cec1 4772
252b5132
RH
4773 if (do_header)
4774 {
32ec8896 4775 unsigned i;
252b5132
RH
4776
4777 printf (_("ELF Header:\n"));
4778 printf (_(" Magic: "));
b34976b6 4779 for (i = 0; i < EI_NIDENT; i++)
dda8d76d 4780 printf ("%2.2x ", header->e_ident[i]);
252b5132
RH
4781 printf ("\n");
4782 printf (_(" Class: %s\n"),
dda8d76d 4783 get_elf_class (header->e_ident[EI_CLASS]));
252b5132 4784 printf (_(" Data: %s\n"),
dda8d76d 4785 get_data_encoding (header->e_ident[EI_DATA]));
e8a64888 4786 printf (_(" Version: %d%s\n"),
dda8d76d
NC
4787 header->e_ident[EI_VERSION],
4788 (header->e_ident[EI_VERSION] == EV_CURRENT
e8a64888 4789 ? _(" (current)")
dda8d76d 4790 : (header->e_ident[EI_VERSION] != EV_NONE
e8a64888 4791 ? _(" <unknown>")
789be9f7 4792 : "")));
252b5132 4793 printf (_(" OS/ABI: %s\n"),
dda8d76d 4794 get_osabi_name (filedata, header->e_ident[EI_OSABI]));
252b5132 4795 printf (_(" ABI Version: %d\n"),
dda8d76d 4796 header->e_ident[EI_ABIVERSION]);
252b5132 4797 printf (_(" Type: %s\n"),
dda8d76d 4798 get_file_type (header->e_type));
252b5132 4799 printf (_(" Machine: %s\n"),
dda8d76d 4800 get_machine_name (header->e_machine));
252b5132 4801 printf (_(" Version: 0x%lx\n"),
e8a64888 4802 header->e_version);
76da6bbe 4803
f7a99963 4804 printf (_(" Entry point address: "));
e8a64888 4805 print_vma (header->e_entry, PREFIX_HEX);
f7a99963 4806 printf (_("\n Start of program headers: "));
e8a64888 4807 print_vma (header->e_phoff, DEC);
f7a99963 4808 printf (_(" (bytes into file)\n Start of section headers: "));
e8a64888 4809 print_vma (header->e_shoff, DEC);
f7a99963 4810 printf (_(" (bytes into file)\n"));
76da6bbe 4811
252b5132 4812 printf (_(" Flags: 0x%lx%s\n"),
e8a64888 4813 header->e_flags,
dda8d76d 4814 get_machine_flags (filedata, header->e_flags, header->e_machine));
e8a64888
AM
4815 printf (_(" Size of this header: %u (bytes)\n"),
4816 header->e_ehsize);
4817 printf (_(" Size of program headers: %u (bytes)\n"),
4818 header->e_phentsize);
4819 printf (_(" Number of program headers: %u"),
4820 header->e_phnum);
dda8d76d
NC
4821 if (filedata->section_headers != NULL
4822 && header->e_phnum == PN_XNUM
4823 && filedata->section_headers[0].sh_info != 0)
e8a64888
AM
4824 {
4825 header->e_phnum = filedata->section_headers[0].sh_info;
4826 printf (" (%u)", header->e_phnum);
4827 }
2046a35d 4828 putc ('\n', stdout);
e8a64888
AM
4829 printf (_(" Size of section headers: %u (bytes)\n"),
4830 header->e_shentsize);
4831 printf (_(" Number of section headers: %u"),
4832 header->e_shnum);
dda8d76d 4833 if (filedata->section_headers != NULL && header->e_shnum == SHN_UNDEF)
e8a64888
AM
4834 {
4835 header->e_shnum = filedata->section_headers[0].sh_size;
4836 printf (" (%u)", header->e_shnum);
4837 }
560f3c1c 4838 putc ('\n', stdout);
e8a64888
AM
4839 printf (_(" Section header string table index: %u"),
4840 header->e_shstrndx);
dda8d76d
NC
4841 if (filedata->section_headers != NULL
4842 && header->e_shstrndx == (SHN_XINDEX & 0xffff))
e8a64888
AM
4843 {
4844 header->e_shstrndx = filedata->section_headers[0].sh_link;
4845 printf (" (%u)", header->e_shstrndx);
4846 }
4847 if (header->e_shstrndx != SHN_UNDEF
4848 && header->e_shstrndx >= header->e_shnum)
4849 {
4850 header->e_shstrndx = SHN_UNDEF;
4851 printf (_(" <corrupt: out of range>"));
4852 }
560f3c1c
AM
4853 putc ('\n', stdout);
4854 }
4855
dda8d76d 4856 if (filedata->section_headers != NULL)
560f3c1c 4857 {
dda8d76d
NC
4858 if (header->e_phnum == PN_XNUM
4859 && filedata->section_headers[0].sh_info != 0)
4860 header->e_phnum = filedata->section_headers[0].sh_info;
4861 if (header->e_shnum == SHN_UNDEF)
4862 header->e_shnum = filedata->section_headers[0].sh_size;
4863 if (header->e_shstrndx == (SHN_XINDEX & 0xffff))
4864 header->e_shstrndx = filedata->section_headers[0].sh_link;
9c1ce108 4865 if (header->e_shstrndx >= header->e_shnum)
dda8d76d
NC
4866 header->e_shstrndx = SHN_UNDEF;
4867 free (filedata->section_headers);
4868 filedata->section_headers = NULL;
252b5132 4869 }
103f02d3 4870
32ec8896 4871 return TRUE;
9ea033b2
NC
4872}
4873
dda8d76d
NC
4874/* Read in the program headers from FILEDATA and store them in PHEADERS.
4875 Returns TRUE upon success, FALSE otherwise. Loads 32-bit headers. */
4876
e0a31db1 4877static bfd_boolean
dda8d76d 4878get_32bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
9ea033b2 4879{
2cf0635d
NC
4880 Elf32_External_Phdr * phdrs;
4881 Elf32_External_Phdr * external;
4882 Elf_Internal_Phdr * internal;
b34976b6 4883 unsigned int i;
dda8d76d
NC
4884 unsigned int size = filedata->file_header.e_phentsize;
4885 unsigned int num = filedata->file_header.e_phnum;
e0a31db1
NC
4886
4887 /* PR binutils/17531: Cope with unexpected section header sizes. */
4888 if (size == 0 || num == 0)
4889 return FALSE;
4890 if (size < sizeof * phdrs)
4891 {
4892 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4893 return FALSE;
4894 }
4895 if (size > sizeof * phdrs)
4896 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
103f02d3 4897
dda8d76d 4898 phdrs = (Elf32_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
e0a31db1
NC
4899 size, num, _("program headers"));
4900 if (phdrs == NULL)
4901 return FALSE;
9ea033b2 4902
91d6fa6a 4903 for (i = 0, internal = pheaders, external = phdrs;
dda8d76d 4904 i < filedata->file_header.e_phnum;
b34976b6 4905 i++, internal++, external++)
252b5132 4906 {
9ea033b2
NC
4907 internal->p_type = BYTE_GET (external->p_type);
4908 internal->p_offset = BYTE_GET (external->p_offset);
4909 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4910 internal->p_paddr = BYTE_GET (external->p_paddr);
4911 internal->p_filesz = BYTE_GET (external->p_filesz);
4912 internal->p_memsz = BYTE_GET (external->p_memsz);
4913 internal->p_flags = BYTE_GET (external->p_flags);
4914 internal->p_align = BYTE_GET (external->p_align);
252b5132
RH
4915 }
4916
9ea033b2 4917 free (phdrs);
e0a31db1 4918 return TRUE;
252b5132
RH
4919}
4920
dda8d76d
NC
4921/* Read in the program headers from FILEDATA and store them in PHEADERS.
4922 Returns TRUE upon success, FALSE otherwise. Loads 64-bit headers. */
4923
e0a31db1 4924static bfd_boolean
dda8d76d 4925get_64bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
9ea033b2 4926{
2cf0635d
NC
4927 Elf64_External_Phdr * phdrs;
4928 Elf64_External_Phdr * external;
4929 Elf_Internal_Phdr * internal;
b34976b6 4930 unsigned int i;
dda8d76d
NC
4931 unsigned int size = filedata->file_header.e_phentsize;
4932 unsigned int num = filedata->file_header.e_phnum;
e0a31db1
NC
4933
4934 /* PR binutils/17531: Cope with unexpected section header sizes. */
4935 if (size == 0 || num == 0)
4936 return FALSE;
4937 if (size < sizeof * phdrs)
4938 {
4939 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4940 return FALSE;
4941 }
4942 if (size > sizeof * phdrs)
4943 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
103f02d3 4944
dda8d76d 4945 phdrs = (Elf64_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
e0a31db1 4946 size, num, _("program headers"));
a6e9f9df 4947 if (!phdrs)
e0a31db1 4948 return FALSE;
9ea033b2 4949
91d6fa6a 4950 for (i = 0, internal = pheaders, external = phdrs;
dda8d76d 4951 i < filedata->file_header.e_phnum;
b34976b6 4952 i++, internal++, external++)
9ea033b2
NC
4953 {
4954 internal->p_type = BYTE_GET (external->p_type);
4955 internal->p_flags = BYTE_GET (external->p_flags);
66543521
AM
4956 internal->p_offset = BYTE_GET (external->p_offset);
4957 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4958 internal->p_paddr = BYTE_GET (external->p_paddr);
4959 internal->p_filesz = BYTE_GET (external->p_filesz);
4960 internal->p_memsz = BYTE_GET (external->p_memsz);
4961 internal->p_align = BYTE_GET (external->p_align);
9ea033b2
NC
4962 }
4963
4964 free (phdrs);
e0a31db1 4965 return TRUE;
9ea033b2 4966}
252b5132 4967
32ec8896 4968/* Returns TRUE if the program headers were read into `program_headers'. */
d93f0186 4969
32ec8896 4970static bfd_boolean
dda8d76d 4971get_program_headers (Filedata * filedata)
d93f0186 4972{
2cf0635d 4973 Elf_Internal_Phdr * phdrs;
d93f0186
NC
4974
4975 /* Check cache of prior read. */
dda8d76d 4976 if (filedata->program_headers != NULL)
32ec8896 4977 return TRUE;
d93f0186 4978
82156ab7
NC
4979 /* Be kind to memory checkers by looking for
4980 e_phnum values which we know must be invalid. */
dda8d76d 4981 if (filedata->file_header.e_phnum
82156ab7 4982 * (is_32bit_elf ? sizeof (Elf32_External_Phdr) : sizeof (Elf64_External_Phdr))
dda8d76d 4983 >= filedata->file_size)
82156ab7
NC
4984 {
4985 error (_("Too many program headers - %#x - the file is not that big\n"),
dda8d76d 4986 filedata->file_header.e_phnum);
82156ab7
NC
4987 return FALSE;
4988 }
d93f0186 4989
dda8d76d 4990 phdrs = (Elf_Internal_Phdr *) cmalloc (filedata->file_header.e_phnum,
82156ab7 4991 sizeof (Elf_Internal_Phdr));
d93f0186
NC
4992 if (phdrs == NULL)
4993 {
8b73c356 4994 error (_("Out of memory reading %u program headers\n"),
dda8d76d 4995 filedata->file_header.e_phnum);
32ec8896 4996 return FALSE;
d93f0186
NC
4997 }
4998
4999 if (is_32bit_elf
dda8d76d
NC
5000 ? get_32bit_program_headers (filedata, phdrs)
5001 : get_64bit_program_headers (filedata, phdrs))
d93f0186 5002 {
dda8d76d 5003 filedata->program_headers = phdrs;
32ec8896 5004 return TRUE;
d93f0186
NC
5005 }
5006
5007 free (phdrs);
32ec8896 5008 return FALSE;
d93f0186
NC
5009}
5010
32ec8896 5011/* Returns TRUE if the program headers were loaded. */
2f62977e 5012
32ec8896 5013static bfd_boolean
dda8d76d 5014process_program_headers (Filedata * filedata)
252b5132 5015{
2cf0635d 5016 Elf_Internal_Phdr * segment;
b34976b6 5017 unsigned int i;
1a9ccd70 5018 Elf_Internal_Phdr * previous_load = NULL;
252b5132 5019
dda8d76d 5020 if (filedata->file_header.e_phnum == 0)
252b5132 5021 {
82f2dbf7 5022 /* PR binutils/12467. */
dda8d76d 5023 if (filedata->file_header.e_phoff != 0)
32ec8896
NC
5024 {
5025 warn (_("possibly corrupt ELF header - it has a non-zero program"
5026 " header offset, but no program headers\n"));
5027 return FALSE;
5028 }
82f2dbf7 5029 else if (do_segments)
252b5132 5030 printf (_("\nThere are no program headers in this file.\n"));
32ec8896 5031 return TRUE;
252b5132
RH
5032 }
5033
5034 if (do_segments && !do_header)
5035 {
dda8d76d
NC
5036 printf (_("\nElf file type is %s\n"), get_file_type (filedata->file_header.e_type));
5037 printf (_("Entry point 0x%s\n"), bfd_vmatoa ("x", filedata->file_header.e_entry));
d3a49aa8
AM
5038 printf (ngettext ("There is %d program header, starting at offset %s\n",
5039 "There are %d program headers, starting at offset %s\n",
dda8d76d
NC
5040 filedata->file_header.e_phnum),
5041 filedata->file_header.e_phnum,
5042 bfd_vmatoa ("u", filedata->file_header.e_phoff));
252b5132
RH
5043 }
5044
dda8d76d 5045 if (! get_program_headers (filedata))
6b4bf3bc 5046 return TRUE;
103f02d3 5047
252b5132
RH
5048 if (do_segments)
5049 {
dda8d76d 5050 if (filedata->file_header.e_phnum > 1)
3a1a2036
NC
5051 printf (_("\nProgram Headers:\n"));
5052 else
5053 printf (_("\nProgram Headers:\n"));
76da6bbe 5054
f7a99963
NC
5055 if (is_32bit_elf)
5056 printf
5057 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
d974e256
JJ
5058 else if (do_wide)
5059 printf
5060 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
f7a99963
NC
5061 else
5062 {
5063 printf
5064 (_(" Type Offset VirtAddr PhysAddr\n"));
5065 printf
5066 (_(" FileSiz MemSiz Flags Align\n"));
5067 }
252b5132
RH
5068 }
5069
252b5132 5070 dynamic_addr = 0;
1b228002 5071 dynamic_size = 0;
252b5132 5072
dda8d76d
NC
5073 for (i = 0, segment = filedata->program_headers;
5074 i < filedata->file_header.e_phnum;
b34976b6 5075 i++, segment++)
252b5132
RH
5076 {
5077 if (do_segments)
5078 {
dda8d76d 5079 printf (" %-14.14s ", get_segment_type (filedata, segment->p_type));
f7a99963
NC
5080
5081 if (is_32bit_elf)
5082 {
5083 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
5084 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
5085 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
5086 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
5087 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
5088 printf ("%c%c%c ",
5089 (segment->p_flags & PF_R ? 'R' : ' '),
5090 (segment->p_flags & PF_W ? 'W' : ' '),
5091 (segment->p_flags & PF_X ? 'E' : ' '));
5092 printf ("%#lx", (unsigned long) segment->p_align);
5093 }
d974e256
JJ
5094 else if (do_wide)
5095 {
5096 if ((unsigned long) segment->p_offset == segment->p_offset)
5097 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
5098 else
5099 {
5100 print_vma (segment->p_offset, FULL_HEX);
5101 putchar (' ');
5102 }
5103
5104 print_vma (segment->p_vaddr, FULL_HEX);
5105 putchar (' ');
5106 print_vma (segment->p_paddr, FULL_HEX);
5107 putchar (' ');
5108
5109 if ((unsigned long) segment->p_filesz == segment->p_filesz)
5110 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
5111 else
5112 {
5113 print_vma (segment->p_filesz, FULL_HEX);
5114 putchar (' ');
5115 }
5116
5117 if ((unsigned long) segment->p_memsz == segment->p_memsz)
5118 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
5119 else
5120 {
f48e6c45 5121 print_vma (segment->p_memsz, FULL_HEX);
d974e256
JJ
5122 }
5123
5124 printf (" %c%c%c ",
5125 (segment->p_flags & PF_R ? 'R' : ' '),
5126 (segment->p_flags & PF_W ? 'W' : ' '),
5127 (segment->p_flags & PF_X ? 'E' : ' '));
5128
5129 if ((unsigned long) segment->p_align == segment->p_align)
5130 printf ("%#lx", (unsigned long) segment->p_align);
5131 else
5132 {
5133 print_vma (segment->p_align, PREFIX_HEX);
5134 }
5135 }
f7a99963
NC
5136 else
5137 {
5138 print_vma (segment->p_offset, FULL_HEX);
5139 putchar (' ');
5140 print_vma (segment->p_vaddr, FULL_HEX);
5141 putchar (' ');
5142 print_vma (segment->p_paddr, FULL_HEX);
5143 printf ("\n ");
5144 print_vma (segment->p_filesz, FULL_HEX);
5145 putchar (' ');
5146 print_vma (segment->p_memsz, FULL_HEX);
5147 printf (" %c%c%c ",
5148 (segment->p_flags & PF_R ? 'R' : ' '),
5149 (segment->p_flags & PF_W ? 'W' : ' '),
5150 (segment->p_flags & PF_X ? 'E' : ' '));
1d262527 5151 print_vma (segment->p_align, PREFIX_HEX);
f7a99963 5152 }
252b5132 5153
1a9ccd70
NC
5154 putc ('\n', stdout);
5155 }
f54498b4 5156
252b5132
RH
5157 switch (segment->p_type)
5158 {
1a9ccd70 5159 case PT_LOAD:
502d895c
NC
5160#if 0 /* Do not warn about out of order PT_LOAD segments. Although officially
5161 required by the ELF standard, several programs, including the Linux
5162 kernel, make use of non-ordered segments. */
1a9ccd70
NC
5163 if (previous_load
5164 && previous_load->p_vaddr > segment->p_vaddr)
5165 error (_("LOAD segments must be sorted in order of increasing VirtAddr\n"));
502d895c 5166#endif
1a9ccd70
NC
5167 if (segment->p_memsz < segment->p_filesz)
5168 error (_("the segment's file size is larger than its memory size\n"));
5169 previous_load = segment;
5170 break;
5171
5172 case PT_PHDR:
5173 /* PR 20815 - Verify that the program header is loaded into memory. */
5174 if (i > 0 && previous_load != NULL)
5175 error (_("the PHDR segment must occur before any LOAD segment\n"));
dda8d76d 5176 if (filedata->file_header.e_machine != EM_PARISC)
1a9ccd70
NC
5177 {
5178 unsigned int j;
5179
dda8d76d
NC
5180 for (j = 1; j < filedata->file_header.e_phnum; j++)
5181 if (filedata->program_headers[j].p_vaddr <= segment->p_vaddr
5182 && (filedata->program_headers[j].p_vaddr
5183 + filedata->program_headers[j].p_memsz)
1a9ccd70
NC
5184 >= (segment->p_vaddr + segment->p_filesz))
5185 break;
dda8d76d 5186 if (j == filedata->file_header.e_phnum)
1a9ccd70
NC
5187 error (_("the PHDR segment is not covered by a LOAD segment\n"));
5188 }
5189 break;
5190
252b5132
RH
5191 case PT_DYNAMIC:
5192 if (dynamic_addr)
5193 error (_("more than one dynamic segment\n"));
5194
20737c13
AM
5195 /* By default, assume that the .dynamic section is the first
5196 section in the DYNAMIC segment. */
5197 dynamic_addr = segment->p_offset;
5198 dynamic_size = segment->p_filesz;
5199
b2d38a17
NC
5200 /* Try to locate the .dynamic section. If there is
5201 a section header table, we can easily locate it. */
dda8d76d 5202 if (filedata->section_headers != NULL)
b2d38a17 5203 {
2cf0635d 5204 Elf_Internal_Shdr * sec;
b2d38a17 5205
dda8d76d 5206 sec = find_section (filedata, ".dynamic");
89fac5e3 5207 if (sec == NULL || sec->sh_size == 0)
b2d38a17 5208 {
28f997cf
TG
5209 /* A corresponding .dynamic section is expected, but on
5210 IA-64/OpenVMS it is OK for it to be missing. */
dda8d76d 5211 if (!is_ia64_vms (filedata))
28f997cf 5212 error (_("no .dynamic section in the dynamic segment\n"));
b2d38a17
NC
5213 break;
5214 }
5215
42bb2e33 5216 if (sec->sh_type == SHT_NOBITS)
20737c13
AM
5217 {
5218 dynamic_size = 0;
5219 break;
5220 }
42bb2e33 5221
b2d38a17
NC
5222 dynamic_addr = sec->sh_offset;
5223 dynamic_size = sec->sh_size;
5224
5225 if (dynamic_addr < segment->p_offset
5226 || dynamic_addr > segment->p_offset + segment->p_filesz)
20737c13
AM
5227 warn (_("the .dynamic section is not contained"
5228 " within the dynamic segment\n"));
b2d38a17 5229 else if (dynamic_addr > segment->p_offset)
20737c13
AM
5230 warn (_("the .dynamic section is not the first section"
5231 " in the dynamic segment.\n"));
b2d38a17 5232 }
39e224f6
MW
5233
5234 /* PR binutils/17512: Avoid corrupt dynamic section info in the
5235 segment. Check this after matching against the section headers
5236 so we don't warn on debuginfo file (which have NOBITS .dynamic
5237 sections). */
dda8d76d 5238 if (dynamic_addr + dynamic_size >= filedata->file_size)
39e224f6
MW
5239 {
5240 error (_("the dynamic segment offset + size exceeds the size of the file\n"));
5241 dynamic_addr = dynamic_size = 0;
5242 }
252b5132
RH
5243 break;
5244
5245 case PT_INTERP:
dda8d76d 5246 if (fseek (filedata->handle, archive_file_offset + (long) segment->p_offset,
fb52b2f4 5247 SEEK_SET))
252b5132
RH
5248 error (_("Unable to find program interpreter name\n"));
5249 else
5250 {
f8eae8b2 5251 char fmt [32];
9495b2e6 5252 int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
f8eae8b2
L
5253
5254 if (ret >= (int) sizeof (fmt) || ret < 0)
591a748a 5255 error (_("Internal error: failed to create format string to display program interpreter\n"));
f8eae8b2 5256
252b5132 5257 program_interpreter[0] = 0;
dda8d76d 5258 if (fscanf (filedata->handle, fmt, program_interpreter) <= 0)
7bd7b3ef 5259 error (_("Unable to read program interpreter name\n"));
252b5132
RH
5260
5261 if (do_segments)
f54498b4 5262 printf (_(" [Requesting program interpreter: %s]\n"),
252b5132
RH
5263 program_interpreter);
5264 }
5265 break;
5266 }
252b5132
RH
5267 }
5268
dda8d76d
NC
5269 if (do_segments
5270 && filedata->section_headers != NULL
5271 && filedata->string_table != NULL)
252b5132
RH
5272 {
5273 printf (_("\n Section to Segment mapping:\n"));
5274 printf (_(" Segment Sections...\n"));
5275
dda8d76d 5276 for (i = 0; i < filedata->file_header.e_phnum; i++)
252b5132 5277 {
9ad5cbcf 5278 unsigned int j;
2cf0635d 5279 Elf_Internal_Shdr * section;
252b5132 5280
dda8d76d
NC
5281 segment = filedata->program_headers + i;
5282 section = filedata->section_headers + 1;
252b5132
RH
5283
5284 printf (" %2.2d ", i);
5285
dda8d76d 5286 for (j = 1; j < filedata->file_header.e_shnum; j++, section++)
252b5132 5287 {
f4638467
AM
5288 if (!ELF_TBSS_SPECIAL (section, segment)
5289 && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
dda8d76d 5290 printf ("%s ", printable_section_name (filedata, section));
252b5132
RH
5291 }
5292
5293 putc ('\n',stdout);
5294 }
5295 }
5296
32ec8896 5297 return TRUE;
252b5132
RH
5298}
5299
5300
d93f0186
NC
5301/* Find the file offset corresponding to VMA by using the program headers. */
5302
5303static long
dda8d76d 5304offset_from_vma (Filedata * filedata, bfd_vma vma, bfd_size_type size)
d93f0186 5305{
2cf0635d 5306 Elf_Internal_Phdr * seg;
d93f0186 5307
dda8d76d 5308 if (! get_program_headers (filedata))
d93f0186
NC
5309 {
5310 warn (_("Cannot interpret virtual addresses without program headers.\n"));
5311 return (long) vma;
5312 }
5313
dda8d76d
NC
5314 for (seg = filedata->program_headers;
5315 seg < filedata->program_headers + filedata->file_header.e_phnum;
d93f0186
NC
5316 ++seg)
5317 {
5318 if (seg->p_type != PT_LOAD)
5319 continue;
5320
5321 if (vma >= (seg->p_vaddr & -seg->p_align)
5322 && vma + size <= seg->p_vaddr + seg->p_filesz)
5323 return vma - seg->p_vaddr + seg->p_offset;
5324 }
5325
5326 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
0af1713e 5327 (unsigned long) vma);
d93f0186
NC
5328 return (long) vma;
5329}
5330
5331
dda8d76d
NC
5332/* Allocate memory and load the sections headers into FILEDATA->filedata->section_headers.
5333 If PROBE is true, this is just a probe and we do not generate any error
5334 messages if the load fails. */
049b0c3a
NC
5335
5336static bfd_boolean
dda8d76d 5337get_32bit_section_headers (Filedata * filedata, bfd_boolean probe)
252b5132 5338{
2cf0635d
NC
5339 Elf32_External_Shdr * shdrs;
5340 Elf_Internal_Shdr * internal;
dda8d76d
NC
5341 unsigned int i;
5342 unsigned int size = filedata->file_header.e_shentsize;
5343 unsigned int num = probe ? 1 : filedata->file_header.e_shnum;
049b0c3a
NC
5344
5345 /* PR binutils/17531: Cope with unexpected section header sizes. */
5346 if (size == 0 || num == 0)
5347 return FALSE;
5348 if (size < sizeof * shdrs)
5349 {
5350 if (! probe)
5351 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5352 return FALSE;
5353 }
5354 if (!probe && size > sizeof * shdrs)
5355 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
252b5132 5356
dda8d76d 5357 shdrs = (Elf32_External_Shdr *) get_data (NULL, filedata, filedata->file_header.e_shoff,
049b0c3a
NC
5358 size, num,
5359 probe ? NULL : _("section headers"));
5360 if (shdrs == NULL)
5361 return FALSE;
252b5132 5362
dda8d76d
NC
5363 free (filedata->section_headers);
5364 filedata->section_headers = (Elf_Internal_Shdr *)
5365 cmalloc (num, sizeof (Elf_Internal_Shdr));
5366 if (filedata->section_headers == NULL)
252b5132 5367 {
049b0c3a 5368 if (!probe)
8b73c356 5369 error (_("Out of memory reading %u section headers\n"), num);
e3d39609 5370 free (shdrs);
049b0c3a 5371 return FALSE;
252b5132
RH
5372 }
5373
dda8d76d 5374 for (i = 0, internal = filedata->section_headers;
560f3c1c 5375 i < num;
b34976b6 5376 i++, internal++)
252b5132
RH
5377 {
5378 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5379 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
5380 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5381 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5382 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5383 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5384 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5385 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5386 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5387 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
315350be
NC
5388 if (!probe && internal->sh_link > num)
5389 warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5390 if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5391 warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
252b5132
RH
5392 }
5393
5394 free (shdrs);
049b0c3a 5395 return TRUE;
252b5132
RH
5396}
5397
dda8d76d
NC
5398/* Like get_32bit_section_headers, except that it fetches 64-bit headers. */
5399
049b0c3a 5400static bfd_boolean
dda8d76d 5401get_64bit_section_headers (Filedata * filedata, bfd_boolean probe)
9ea033b2 5402{
dda8d76d
NC
5403 Elf64_External_Shdr * shdrs;
5404 Elf_Internal_Shdr * internal;
5405 unsigned int i;
5406 unsigned int size = filedata->file_header.e_shentsize;
5407 unsigned int num = probe ? 1 : filedata->file_header.e_shnum;
049b0c3a
NC
5408
5409 /* PR binutils/17531: Cope with unexpected section header sizes. */
5410 if (size == 0 || num == 0)
5411 return FALSE;
dda8d76d 5412
049b0c3a
NC
5413 if (size < sizeof * shdrs)
5414 {
5415 if (! probe)
5416 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5417 return FALSE;
5418 }
dda8d76d 5419
049b0c3a
NC
5420 if (! probe && size > sizeof * shdrs)
5421 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
9ea033b2 5422
dda8d76d
NC
5423 shdrs = (Elf64_External_Shdr *) get_data (NULL, filedata,
5424 filedata->file_header.e_shoff,
049b0c3a
NC
5425 size, num,
5426 probe ? NULL : _("section headers"));
5427 if (shdrs == NULL)
5428 return FALSE;
9ea033b2 5429
dda8d76d
NC
5430 free (filedata->section_headers);
5431 filedata->section_headers = (Elf_Internal_Shdr *)
5432 cmalloc (num, sizeof (Elf_Internal_Shdr));
5433 if (filedata->section_headers == NULL)
9ea033b2 5434 {
049b0c3a 5435 if (! probe)
8b73c356 5436 error (_("Out of memory reading %u section headers\n"), num);
e3d39609 5437 free (shdrs);
049b0c3a 5438 return FALSE;
9ea033b2
NC
5439 }
5440
dda8d76d 5441 for (i = 0, internal = filedata->section_headers;
560f3c1c 5442 i < num;
b34976b6 5443 i++, internal++)
9ea033b2
NC
5444 {
5445 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5446 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
66543521
AM
5447 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5448 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5449 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5450 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
9ea033b2
NC
5451 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5452 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5453 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5454 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
315350be
NC
5455 if (!probe && internal->sh_link > num)
5456 warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5457 if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5458 warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
9ea033b2
NC
5459 }
5460
5461 free (shdrs);
049b0c3a 5462 return TRUE;
9ea033b2
NC
5463}
5464
252b5132 5465static Elf_Internal_Sym *
dda8d76d
NC
5466get_32bit_elf_symbols (Filedata * filedata,
5467 Elf_Internal_Shdr * section,
5468 unsigned long * num_syms_return)
252b5132 5469{
ba5cdace 5470 unsigned long number = 0;
dd24e3da 5471 Elf32_External_Sym * esyms = NULL;
ba5cdace 5472 Elf_External_Sym_Shndx * shndx = NULL;
dd24e3da 5473 Elf_Internal_Sym * isyms = NULL;
2cf0635d 5474 Elf_Internal_Sym * psym;
b34976b6 5475 unsigned int j;
e3d39609 5476 elf_section_list * entry;
252b5132 5477
c9c1d674
EG
5478 if (section->sh_size == 0)
5479 {
5480 if (num_syms_return != NULL)
5481 * num_syms_return = 0;
5482 return NULL;
5483 }
5484
dd24e3da 5485 /* Run some sanity checks first. */
c9c1d674 5486 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
dd24e3da 5487 {
c9c1d674 5488 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
dda8d76d
NC
5489 printable_section_name (filedata, section),
5490 (unsigned long) section->sh_entsize);
ba5cdace 5491 goto exit_point;
dd24e3da
NC
5492 }
5493
dda8d76d 5494 if (section->sh_size > filedata->file_size)
f54498b4
NC
5495 {
5496 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
dda8d76d
NC
5497 printable_section_name (filedata, section),
5498 (unsigned long) section->sh_size);
f54498b4
NC
5499 goto exit_point;
5500 }
5501
dd24e3da
NC
5502 number = section->sh_size / section->sh_entsize;
5503
5504 if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
5505 {
c9c1d674 5506 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
8066deb1 5507 (unsigned long) section->sh_size,
dda8d76d 5508 printable_section_name (filedata, section),
8066deb1 5509 (unsigned long) section->sh_entsize);
ba5cdace 5510 goto exit_point;
dd24e3da
NC
5511 }
5512
dda8d76d 5513 esyms = (Elf32_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
3f5e193b 5514 section->sh_size, _("symbols"));
dd24e3da 5515 if (esyms == NULL)
ba5cdace 5516 goto exit_point;
252b5132 5517
e3d39609
NC
5518 shndx = NULL;
5519 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5520 {
5521 if (entry->hdr->sh_link != (unsigned long) (section - filedata->section_headers))
5522 continue;
5523
5524 if (shndx != NULL)
5525 {
5526 error (_("Multiple symbol table index sections associated with the same symbol section\n"));
5527 free (shndx);
5528 }
5529
5530 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
5531 entry->hdr->sh_offset,
5532 1, entry->hdr->sh_size,
5533 _("symbol table section indices"));
5534 if (shndx == NULL)
5535 goto exit_point;
5536
5537 /* PR17531: file: heap-buffer-overflow */
5538 if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5539 {
5540 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5541 printable_section_name (filedata, entry->hdr),
5542 (unsigned long) entry->hdr->sh_size,
5543 (unsigned long) section->sh_size);
5544 goto exit_point;
c9c1d674 5545 }
e3d39609 5546 }
9ad5cbcf 5547
3f5e193b 5548 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
252b5132
RH
5549
5550 if (isyms == NULL)
5551 {
8b73c356
NC
5552 error (_("Out of memory reading %lu symbols\n"),
5553 (unsigned long) number);
dd24e3da 5554 goto exit_point;
252b5132
RH
5555 }
5556
dd24e3da 5557 for (j = 0, psym = isyms; j < number; j++, psym++)
252b5132
RH
5558 {
5559 psym->st_name = BYTE_GET (esyms[j].st_name);
5560 psym->st_value = BYTE_GET (esyms[j].st_value);
5561 psym->st_size = BYTE_GET (esyms[j].st_size);
5562 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4fbb74a6 5563 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
9ad5cbcf
AM
5564 psym->st_shndx
5565 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4fbb74a6
AM
5566 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5567 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
252b5132
RH
5568 psym->st_info = BYTE_GET (esyms[j].st_info);
5569 psym->st_other = BYTE_GET (esyms[j].st_other);
5570 }
5571
dd24e3da 5572 exit_point:
e3d39609
NC
5573 free (shndx);
5574 free (esyms);
252b5132 5575
ba5cdace
NC
5576 if (num_syms_return != NULL)
5577 * num_syms_return = isyms == NULL ? 0 : number;
5578
252b5132
RH
5579 return isyms;
5580}
5581
9ea033b2 5582static Elf_Internal_Sym *
dda8d76d
NC
5583get_64bit_elf_symbols (Filedata * filedata,
5584 Elf_Internal_Shdr * section,
5585 unsigned long * num_syms_return)
9ea033b2 5586{
ba5cdace
NC
5587 unsigned long number = 0;
5588 Elf64_External_Sym * esyms = NULL;
5589 Elf_External_Sym_Shndx * shndx = NULL;
5590 Elf_Internal_Sym * isyms = NULL;
2cf0635d 5591 Elf_Internal_Sym * psym;
b34976b6 5592 unsigned int j;
e3d39609 5593 elf_section_list * entry;
9ea033b2 5594
c9c1d674
EG
5595 if (section->sh_size == 0)
5596 {
5597 if (num_syms_return != NULL)
5598 * num_syms_return = 0;
5599 return NULL;
5600 }
5601
dd24e3da 5602 /* Run some sanity checks first. */
c9c1d674 5603 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
dd24e3da 5604 {
c9c1d674 5605 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
dda8d76d 5606 printable_section_name (filedata, section),
8066deb1 5607 (unsigned long) section->sh_entsize);
ba5cdace 5608 goto exit_point;
dd24e3da
NC
5609 }
5610
dda8d76d 5611 if (section->sh_size > filedata->file_size)
f54498b4
NC
5612 {
5613 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
dda8d76d 5614 printable_section_name (filedata, section),
8066deb1 5615 (unsigned long) section->sh_size);
f54498b4
NC
5616 goto exit_point;
5617 }
5618
dd24e3da
NC
5619 number = section->sh_size / section->sh_entsize;
5620
5621 if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5622 {
c9c1d674 5623 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
8066deb1 5624 (unsigned long) section->sh_size,
dda8d76d 5625 printable_section_name (filedata, section),
8066deb1 5626 (unsigned long) section->sh_entsize);
ba5cdace 5627 goto exit_point;
dd24e3da
NC
5628 }
5629
dda8d76d 5630 esyms = (Elf64_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
3f5e193b 5631 section->sh_size, _("symbols"));
a6e9f9df 5632 if (!esyms)
ba5cdace 5633 goto exit_point;
9ea033b2 5634
e3d39609
NC
5635 shndx = NULL;
5636 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5637 {
5638 if (entry->hdr->sh_link != (unsigned long) (section - filedata->section_headers))
5639 continue;
5640
5641 if (shndx != NULL)
5642 {
5643 error (_("Multiple symbol table index sections associated with the same symbol section\n"));
5644 free (shndx);
c9c1d674 5645 }
e3d39609
NC
5646
5647 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
5648 entry->hdr->sh_offset,
5649 1, entry->hdr->sh_size,
5650 _("symbol table section indices"));
5651 if (shndx == NULL)
5652 goto exit_point;
5653
5654 /* PR17531: file: heap-buffer-overflow */
5655 if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5656 {
5657 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5658 printable_section_name (filedata, entry->hdr),
5659 (unsigned long) entry->hdr->sh_size,
5660 (unsigned long) section->sh_size);
5661 goto exit_point;
5662 }
5663 }
9ad5cbcf 5664
3f5e193b 5665 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
9ea033b2
NC
5666
5667 if (isyms == NULL)
5668 {
8b73c356
NC
5669 error (_("Out of memory reading %lu symbols\n"),
5670 (unsigned long) number);
ba5cdace 5671 goto exit_point;
9ea033b2
NC
5672 }
5673
ba5cdace 5674 for (j = 0, psym = isyms; j < number; j++, psym++)
9ea033b2
NC
5675 {
5676 psym->st_name = BYTE_GET (esyms[j].st_name);
5677 psym->st_info = BYTE_GET (esyms[j].st_info);
5678 psym->st_other = BYTE_GET (esyms[j].st_other);
5679 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
ba5cdace 5680
4fbb74a6 5681 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
9ad5cbcf
AM
5682 psym->st_shndx
5683 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4fbb74a6
AM
5684 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5685 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
ba5cdace 5686
66543521
AM
5687 psym->st_value = BYTE_GET (esyms[j].st_value);
5688 psym->st_size = BYTE_GET (esyms[j].st_size);
9ea033b2
NC
5689 }
5690
ba5cdace 5691 exit_point:
e3d39609
NC
5692 free (shndx);
5693 free (esyms);
ba5cdace
NC
5694
5695 if (num_syms_return != NULL)
5696 * num_syms_return = isyms == NULL ? 0 : number;
9ea033b2
NC
5697
5698 return isyms;
5699}
5700
d1133906 5701static const char *
dda8d76d 5702get_elf_section_flags (Filedata * filedata, bfd_vma sh_flags)
d1133906 5703{
5477e8a0 5704 static char buff[1024];
2cf0635d 5705 char * p = buff;
32ec8896
NC
5706 unsigned int field_size = is_32bit_elf ? 8 : 16;
5707 signed int sindex;
5708 unsigned int size = sizeof (buff) - (field_size + 4 + 1);
8d5ff12c
L
5709 bfd_vma os_flags = 0;
5710 bfd_vma proc_flags = 0;
5711 bfd_vma unknown_flags = 0;
148b93f2 5712 static const struct
5477e8a0 5713 {
2cf0635d 5714 const char * str;
32ec8896 5715 unsigned int len;
5477e8a0
L
5716 }
5717 flags [] =
5718 {
cfcac11d
NC
5719 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
5720 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
5721 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
5722 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
5723 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
5724 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
5725 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5726 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5727 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
5728 /* 9 */ { STRING_COMMA_LEN ("TLS") },
5729 /* IA-64 specific. */
5730 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5731 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5732 /* IA-64 OpenVMS specific. */
5733 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5734 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5735 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5736 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5737 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5738 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
18ae9cc1 5739 /* Generic. */
cfcac11d 5740 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
18ae9cc1 5741 /* SPARC specific. */
77115a4a 5742 /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
ac4c9b04
MG
5743 /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5744 /* ARM specific. */
5745 /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
f0728ee3 5746 /* 22 */ { STRING_COMMA_LEN ("ARM_PURECODE") },
a91e1603
L
5747 /* 23 */ { STRING_COMMA_LEN ("COMDEF") },
5748 /* GNU specific. */
5749 /* 24 */ { STRING_COMMA_LEN ("GNU_MBIND") },
83eef883
AFB
5750 /* VLE specific. */
5751 /* 25 */ { STRING_COMMA_LEN ("VLE") },
5477e8a0
L
5752 };
5753
5754 if (do_section_details)
5755 {
8d5ff12c
L
5756 sprintf (buff, "[%*.*lx]: ",
5757 field_size, field_size, (unsigned long) sh_flags);
5758 p += field_size + 4;
5477e8a0 5759 }
76da6bbe 5760
d1133906
NC
5761 while (sh_flags)
5762 {
5763 bfd_vma flag;
5764
5765 flag = sh_flags & - sh_flags;
5766 sh_flags &= ~ flag;
76da6bbe 5767
5477e8a0 5768 if (do_section_details)
d1133906 5769 {
5477e8a0
L
5770 switch (flag)
5771 {
91d6fa6a
NC
5772 case SHF_WRITE: sindex = 0; break;
5773 case SHF_ALLOC: sindex = 1; break;
5774 case SHF_EXECINSTR: sindex = 2; break;
5775 case SHF_MERGE: sindex = 3; break;
5776 case SHF_STRINGS: sindex = 4; break;
5777 case SHF_INFO_LINK: sindex = 5; break;
5778 case SHF_LINK_ORDER: sindex = 6; break;
5779 case SHF_OS_NONCONFORMING: sindex = 7; break;
5780 case SHF_GROUP: sindex = 8; break;
5781 case SHF_TLS: sindex = 9; break;
18ae9cc1 5782 case SHF_EXCLUDE: sindex = 18; break;
77115a4a 5783 case SHF_COMPRESSED: sindex = 20; break;
a91e1603 5784 case SHF_GNU_MBIND: sindex = 24; break;
76da6bbe 5785
5477e8a0 5786 default:
91d6fa6a 5787 sindex = -1;
dda8d76d 5788 switch (filedata->file_header.e_machine)
148b93f2 5789 {
cfcac11d 5790 case EM_IA_64:
148b93f2 5791 if (flag == SHF_IA_64_SHORT)
91d6fa6a 5792 sindex = 10;
148b93f2 5793 else if (flag == SHF_IA_64_NORECOV)
91d6fa6a 5794 sindex = 11;
148b93f2 5795#ifdef BFD64
dda8d76d 5796 else if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
148b93f2
NC
5797 switch (flag)
5798 {
91d6fa6a
NC
5799 case SHF_IA_64_VMS_GLOBAL: sindex = 12; break;
5800 case SHF_IA_64_VMS_OVERLAID: sindex = 13; break;
5801 case SHF_IA_64_VMS_SHARED: sindex = 14; break;
5802 case SHF_IA_64_VMS_VECTOR: sindex = 15; break;
5803 case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5804 case SHF_IA_64_VMS_PROTECTED: sindex = 17; break;
148b93f2
NC
5805 default: break;
5806 }
5807#endif
cfcac11d
NC
5808 break;
5809
caa83f8b 5810 case EM_386:
22abe556 5811 case EM_IAMCU:
caa83f8b 5812 case EM_X86_64:
7f502d6c 5813 case EM_L1OM:
7a9068fe 5814 case EM_K1OM:
cfcac11d
NC
5815 case EM_OLD_SPARCV9:
5816 case EM_SPARC32PLUS:
5817 case EM_SPARCV9:
5818 case EM_SPARC:
18ae9cc1 5819 if (flag == SHF_ORDERED)
91d6fa6a 5820 sindex = 19;
cfcac11d 5821 break;
ac4c9b04
MG
5822
5823 case EM_ARM:
5824 switch (flag)
5825 {
5826 case SHF_ENTRYSECT: sindex = 21; break;
f0728ee3 5827 case SHF_ARM_PURECODE: sindex = 22; break;
ac4c9b04
MG
5828 case SHF_COMDEF: sindex = 23; break;
5829 default: break;
5830 }
5831 break;
83eef883
AFB
5832 case EM_PPC:
5833 if (flag == SHF_PPC_VLE)
5834 sindex = 25;
5835 break;
ac4c9b04 5836
cfcac11d
NC
5837 default:
5838 break;
148b93f2 5839 }
5477e8a0
L
5840 }
5841
91d6fa6a 5842 if (sindex != -1)
5477e8a0 5843 {
8d5ff12c
L
5844 if (p != buff + field_size + 4)
5845 {
5846 if (size < (10 + 2))
bee0ee85
NC
5847 {
5848 warn (_("Internal error: not enough buffer room for section flag info"));
5849 return _("<unknown>");
5850 }
8d5ff12c
L
5851 size -= 2;
5852 *p++ = ',';
5853 *p++ = ' ';
5854 }
5855
91d6fa6a
NC
5856 size -= flags [sindex].len;
5857 p = stpcpy (p, flags [sindex].str);
5477e8a0 5858 }
3b22753a 5859 else if (flag & SHF_MASKOS)
8d5ff12c 5860 os_flags |= flag;
d1133906 5861 else if (flag & SHF_MASKPROC)
8d5ff12c 5862 proc_flags |= flag;
d1133906 5863 else
8d5ff12c 5864 unknown_flags |= flag;
5477e8a0
L
5865 }
5866 else
5867 {
5868 switch (flag)
5869 {
5870 case SHF_WRITE: *p = 'W'; break;
5871 case SHF_ALLOC: *p = 'A'; break;
5872 case SHF_EXECINSTR: *p = 'X'; break;
5873 case SHF_MERGE: *p = 'M'; break;
5874 case SHF_STRINGS: *p = 'S'; break;
5875 case SHF_INFO_LINK: *p = 'I'; break;
5876 case SHF_LINK_ORDER: *p = 'L'; break;
5877 case SHF_OS_NONCONFORMING: *p = 'O'; break;
5878 case SHF_GROUP: *p = 'G'; break;
5879 case SHF_TLS: *p = 'T'; break;
18ae9cc1 5880 case SHF_EXCLUDE: *p = 'E'; break;
77115a4a 5881 case SHF_COMPRESSED: *p = 'C'; break;
a91e1603 5882 case SHF_GNU_MBIND: *p = 'D'; break;
5477e8a0
L
5883
5884 default:
dda8d76d
NC
5885 if ((filedata->file_header.e_machine == EM_X86_64
5886 || filedata->file_header.e_machine == EM_L1OM
5887 || filedata->file_header.e_machine == EM_K1OM)
5477e8a0
L
5888 && flag == SHF_X86_64_LARGE)
5889 *p = 'l';
dda8d76d 5890 else if (filedata->file_header.e_machine == EM_ARM
f0728ee3 5891 && flag == SHF_ARM_PURECODE)
91f68a68 5892 *p = 'y';
dda8d76d 5893 else if (filedata->file_header.e_machine == EM_PPC
83eef883
AFB
5894 && flag == SHF_PPC_VLE)
5895 *p = 'v';
5477e8a0
L
5896 else if (flag & SHF_MASKOS)
5897 {
5898 *p = 'o';
5899 sh_flags &= ~ SHF_MASKOS;
5900 }
5901 else if (flag & SHF_MASKPROC)
5902 {
5903 *p = 'p';
5904 sh_flags &= ~ SHF_MASKPROC;
5905 }
5906 else
5907 *p = 'x';
5908 break;
5909 }
5910 p++;
d1133906
NC
5911 }
5912 }
76da6bbe 5913
8d5ff12c
L
5914 if (do_section_details)
5915 {
5916 if (os_flags)
5917 {
5918 size -= 5 + field_size;
5919 if (p != buff + field_size + 4)
5920 {
5921 if (size < (2 + 1))
bee0ee85
NC
5922 {
5923 warn (_("Internal error: not enough buffer room for section flag info"));
5924 return _("<unknown>");
5925 }
8d5ff12c
L
5926 size -= 2;
5927 *p++ = ',';
5928 *p++ = ' ';
5929 }
5930 sprintf (p, "OS (%*.*lx)", field_size, field_size,
5931 (unsigned long) os_flags);
5932 p += 5 + field_size;
5933 }
5934 if (proc_flags)
5935 {
5936 size -= 7 + field_size;
5937 if (p != buff + field_size + 4)
5938 {
5939 if (size < (2 + 1))
bee0ee85
NC
5940 {
5941 warn (_("Internal error: not enough buffer room for section flag info"));
5942 return _("<unknown>");
5943 }
8d5ff12c
L
5944 size -= 2;
5945 *p++ = ',';
5946 *p++ = ' ';
5947 }
5948 sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5949 (unsigned long) proc_flags);
5950 p += 7 + field_size;
5951 }
5952 if (unknown_flags)
5953 {
5954 size -= 10 + field_size;
5955 if (p != buff + field_size + 4)
5956 {
5957 if (size < (2 + 1))
bee0ee85
NC
5958 {
5959 warn (_("Internal error: not enough buffer room for section flag info"));
5960 return _("<unknown>");
5961 }
8d5ff12c
L
5962 size -= 2;
5963 *p++ = ',';
5964 *p++ = ' ';
5965 }
2b692964 5966 sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
8d5ff12c
L
5967 (unsigned long) unknown_flags);
5968 p += 10 + field_size;
5969 }
5970 }
5971
e9e44622 5972 *p = '\0';
d1133906
NC
5973 return buff;
5974}
5975
77115a4a 5976static unsigned int
ebdf1ebf 5977get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf, bfd_size_type size)
77115a4a
L
5978{
5979 if (is_32bit_elf)
5980 {
5981 Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
d8024a91 5982
ebdf1ebf
NC
5983 if (size < sizeof (* echdr))
5984 {
5985 error (_("Compressed section is too small even for a compression header\n"));
5986 return 0;
5987 }
5988
77115a4a
L
5989 chdr->ch_type = BYTE_GET (echdr->ch_type);
5990 chdr->ch_size = BYTE_GET (echdr->ch_size);
5991 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5992 return sizeof (*echdr);
5993 }
5994 else
5995 {
5996 Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) buf;
d8024a91 5997
ebdf1ebf
NC
5998 if (size < sizeof (* echdr))
5999 {
6000 error (_("Compressed section is too small even for a compression header\n"));
6001 return 0;
6002 }
6003
77115a4a
L
6004 chdr->ch_type = BYTE_GET (echdr->ch_type);
6005 chdr->ch_size = BYTE_GET (echdr->ch_size);
6006 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
6007 return sizeof (*echdr);
6008 }
6009}
6010
32ec8896 6011static bfd_boolean
dda8d76d 6012process_section_headers (Filedata * filedata)
252b5132 6013{
2cf0635d 6014 Elf_Internal_Shdr * section;
b34976b6 6015 unsigned int i;
252b5132 6016
dda8d76d 6017 filedata->section_headers = NULL;
252b5132 6018
dda8d76d 6019 if (filedata->file_header.e_shnum == 0)
252b5132 6020 {
82f2dbf7 6021 /* PR binutils/12467. */
dda8d76d 6022 if (filedata->file_header.e_shoff != 0)
32ec8896
NC
6023 {
6024 warn (_("possibly corrupt ELF file header - it has a non-zero"
6025 " section header offset, but no section headers\n"));
6026 return FALSE;
6027 }
82f2dbf7 6028 else if (do_sections)
252b5132
RH
6029 printf (_("\nThere are no sections in this file.\n"));
6030
32ec8896 6031 return TRUE;
252b5132
RH
6032 }
6033
6034 if (do_sections && !do_header)
d3a49aa8
AM
6035 printf (ngettext ("There is %d section header, "
6036 "starting at offset 0x%lx:\n",
6037 "There are %d section headers, "
6038 "starting at offset 0x%lx:\n",
dda8d76d
NC
6039 filedata->file_header.e_shnum),
6040 filedata->file_header.e_shnum,
6041 (unsigned long) filedata->file_header.e_shoff);
252b5132 6042
9ea033b2
NC
6043 if (is_32bit_elf)
6044 {
dda8d76d 6045 if (! get_32bit_section_headers (filedata, FALSE))
32ec8896
NC
6046 return FALSE;
6047 }
6048 else
6049 {
dda8d76d 6050 if (! get_64bit_section_headers (filedata, FALSE))
32ec8896 6051 return FALSE;
9ea033b2 6052 }
252b5132
RH
6053
6054 /* Read in the string table, so that we have names to display. */
dda8d76d
NC
6055 if (filedata->file_header.e_shstrndx != SHN_UNDEF
6056 && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
252b5132 6057 {
dda8d76d 6058 section = filedata->section_headers + filedata->file_header.e_shstrndx;
d40ac9bd 6059
c256ffe7
JJ
6060 if (section->sh_size != 0)
6061 {
dda8d76d
NC
6062 filedata->string_table = (char *) get_data (NULL, filedata, section->sh_offset,
6063 1, section->sh_size,
6064 _("string table"));
0de14b54 6065
dda8d76d 6066 filedata->string_table_length = filedata->string_table != NULL ? section->sh_size : 0;
c256ffe7 6067 }
252b5132
RH
6068 }
6069
6070 /* Scan the sections for the dynamic symbol table
e3c8793a 6071 and dynamic string table and debug sections. */
252b5132
RH
6072 dynamic_symbols = NULL;
6073 dynamic_strings = NULL;
6074 dynamic_syminfo = NULL;
6a40cf0c 6075 symtab_shndx_list = NULL;
103f02d3 6076
89fac5e3 6077 eh_addr_size = is_32bit_elf ? 4 : 8;
dda8d76d 6078 switch (filedata->file_header.e_machine)
89fac5e3
RS
6079 {
6080 case EM_MIPS:
6081 case EM_MIPS_RS3_LE:
6082 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
6083 FDE addresses. However, the ABI also has a semi-official ILP32
6084 variant for which the normal FDE address size rules apply.
6085
6086 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
6087 section, where XX is the size of longs in bits. Unfortunately,
6088 earlier compilers provided no way of distinguishing ILP32 objects
6089 from LP64 objects, so if there's any doubt, we should assume that
6090 the official LP64 form is being used. */
dda8d76d
NC
6091 if ((filedata->file_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
6092 && find_section (filedata, ".gcc_compiled_long32") == NULL)
89fac5e3
RS
6093 eh_addr_size = 8;
6094 break;
0f56a26a
DD
6095
6096 case EM_H8_300:
6097 case EM_H8_300H:
dda8d76d 6098 switch (filedata->file_header.e_flags & EF_H8_MACH)
0f56a26a
DD
6099 {
6100 case E_H8_MACH_H8300:
6101 case E_H8_MACH_H8300HN:
6102 case E_H8_MACH_H8300SN:
6103 case E_H8_MACH_H8300SXN:
6104 eh_addr_size = 2;
6105 break;
6106 case E_H8_MACH_H8300H:
6107 case E_H8_MACH_H8300S:
6108 case E_H8_MACH_H8300SX:
6109 eh_addr_size = 4;
6110 break;
6111 }
f4236fe4
DD
6112 break;
6113
ff7eeb89 6114 case EM_M32C_OLD:
f4236fe4 6115 case EM_M32C:
dda8d76d 6116 switch (filedata->file_header.e_flags & EF_M32C_CPU_MASK)
f4236fe4
DD
6117 {
6118 case EF_M32C_CPU_M16C:
6119 eh_addr_size = 2;
6120 break;
6121 }
6122 break;
89fac5e3
RS
6123 }
6124
76ca31c0
NC
6125#define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
6126 do \
6127 { \
6128 bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64; \
6129 if (section->sh_entsize != expected_entsize) \
9dd3a467 6130 { \
76ca31c0
NC
6131 char buf[40]; \
6132 sprintf_vma (buf, section->sh_entsize); \
6133 /* Note: coded this way so that there is a single string for \
6134 translation. */ \
6135 error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
6136 error (_("(Using the expected size of %u for the rest of this dump)\n"), \
6137 (unsigned) expected_entsize); \
9dd3a467 6138 section->sh_entsize = expected_entsize; \
76ca31c0
NC
6139 } \
6140 } \
08d8fa11 6141 while (0)
9dd3a467
NC
6142
6143#define CHECK_ENTSIZE(section, i, type) \
08d8fa11
JJ
6144 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
6145 sizeof (Elf64_External_##type))
6146
dda8d76d
NC
6147 for (i = 0, section = filedata->section_headers;
6148 i < filedata->file_header.e_shnum;
b34976b6 6149 i++, section++)
252b5132 6150 {
2cf0635d 6151 char * name = SECTION_NAME (section);
252b5132
RH
6152
6153 if (section->sh_type == SHT_DYNSYM)
6154 {
6155 if (dynamic_symbols != NULL)
6156 {
6157 error (_("File contains multiple dynamic symbol tables\n"));
6158 continue;
6159 }
6160
08d8fa11 6161 CHECK_ENTSIZE (section, i, Sym);
dda8d76d 6162 dynamic_symbols = GET_ELF_SYMBOLS (filedata, section, & num_dynamic_syms);
252b5132
RH
6163 }
6164 else if (section->sh_type == SHT_STRTAB
18bd398b 6165 && streq (name, ".dynstr"))
252b5132
RH
6166 {
6167 if (dynamic_strings != NULL)
6168 {
6169 error (_("File contains multiple dynamic string tables\n"));
6170 continue;
6171 }
6172
dda8d76d 6173 dynamic_strings = (char *) get_data (NULL, filedata, section->sh_offset,
3f5e193b
NC
6174 1, section->sh_size,
6175 _("dynamic strings"));
59245841 6176 dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
252b5132 6177 }
9ad5cbcf
AM
6178 else if (section->sh_type == SHT_SYMTAB_SHNDX)
6179 {
6a40cf0c 6180 elf_section_list * entry = xmalloc (sizeof * entry);
dda8d76d 6181
6a40cf0c
NC
6182 entry->hdr = section;
6183 entry->next = symtab_shndx_list;
6184 symtab_shndx_list = entry;
9ad5cbcf 6185 }
08d8fa11
JJ
6186 else if (section->sh_type == SHT_SYMTAB)
6187 CHECK_ENTSIZE (section, i, Sym);
6188 else if (section->sh_type == SHT_GROUP)
6189 CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
6190 else if (section->sh_type == SHT_REL)
6191 CHECK_ENTSIZE (section, i, Rel);
6192 else if (section->sh_type == SHT_RELA)
6193 CHECK_ENTSIZE (section, i, Rela);
252b5132 6194 else if ((do_debugging || do_debug_info || do_debug_abbrevs
f9f0e732 6195 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
cb8f3167 6196 || do_debug_aranges || do_debug_frames || do_debug_macinfo
657d0d47 6197 || do_debug_str || do_debug_loc || do_debug_ranges
d85bf2ba 6198 || do_debug_addr || do_debug_cu_index || do_debug_links)
1b315056
CS
6199 && (const_strneq (name, ".debug_")
6200 || const_strneq (name, ".zdebug_")))
252b5132 6201 {
1b315056
CS
6202 if (name[1] == 'z')
6203 name += sizeof (".zdebug_") - 1;
6204 else
6205 name += sizeof (".debug_") - 1;
252b5132
RH
6206
6207 if (do_debugging
4723351a
CC
6208 || (do_debug_info && const_strneq (name, "info"))
6209 || (do_debug_info && const_strneq (name, "types"))
6210 || (do_debug_abbrevs && const_strneq (name, "abbrev"))
b40bf0a2
NC
6211 || (do_debug_lines && strcmp (name, "line") == 0)
6212 || (do_debug_lines && const_strneq (name, "line."))
4723351a
CC
6213 || (do_debug_pubnames && const_strneq (name, "pubnames"))
6214 || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
459d52c8
DE
6215 || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
6216 || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
4723351a
CC
6217 || (do_debug_aranges && const_strneq (name, "aranges"))
6218 || (do_debug_ranges && const_strneq (name, "ranges"))
77145576 6219 || (do_debug_ranges && const_strneq (name, "rnglists"))
4723351a
CC
6220 || (do_debug_frames && const_strneq (name, "frame"))
6221 || (do_debug_macinfo && const_strneq (name, "macinfo"))
6222 || (do_debug_macinfo && const_strneq (name, "macro"))
6223 || (do_debug_str && const_strneq (name, "str"))
6224 || (do_debug_loc && const_strneq (name, "loc"))
77145576 6225 || (do_debug_loc && const_strneq (name, "loclists"))
657d0d47
CC
6226 || (do_debug_addr && const_strneq (name, "addr"))
6227 || (do_debug_cu_index && const_strneq (name, "cu_index"))
6228 || (do_debug_cu_index && const_strneq (name, "tu_index"))
252b5132 6229 )
dda8d76d 6230 request_dump_bynumber (filedata, i, DEBUG_DUMP);
252b5132 6231 }
a262ae96 6232 /* Linkonce section to be combined with .debug_info at link time. */
09fd7e38 6233 else if ((do_debugging || do_debug_info)
0112cd26 6234 && const_strneq (name, ".gnu.linkonce.wi."))
dda8d76d 6235 request_dump_bynumber (filedata, i, DEBUG_DUMP);
18bd398b 6236 else if (do_debug_frames && streq (name, ".eh_frame"))
dda8d76d 6237 request_dump_bynumber (filedata, i, DEBUG_DUMP);
61364358
JK
6238 else if (do_gdb_index && (streq (name, ".gdb_index")
6239 || streq (name, ".debug_names")))
dda8d76d 6240 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6f875884
TG
6241 /* Trace sections for Itanium VMS. */
6242 else if ((do_debugging || do_trace_info || do_trace_abbrevs
6243 || do_trace_aranges)
6244 && const_strneq (name, ".trace_"))
6245 {
6246 name += sizeof (".trace_") - 1;
6247
6248 if (do_debugging
6249 || (do_trace_info && streq (name, "info"))
6250 || (do_trace_abbrevs && streq (name, "abbrev"))
6251 || (do_trace_aranges && streq (name, "aranges"))
6252 )
dda8d76d 6253 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6f875884 6254 }
dda8d76d
NC
6255 else if ((do_debugging || do_debug_links)
6256 && (const_strneq (name, ".gnu_debuglink")
6257 || const_strneq (name, ".gnu_debugaltlink")))
6258 request_dump_bynumber (filedata, i, DEBUG_DUMP);
252b5132
RH
6259 }
6260
6261 if (! do_sections)
32ec8896 6262 return TRUE;
252b5132 6263
dda8d76d 6264 if (filedata->file_header.e_shnum > 1)
3a1a2036
NC
6265 printf (_("\nSection Headers:\n"));
6266 else
6267 printf (_("\nSection Header:\n"));
76da6bbe 6268
f7a99963 6269 if (is_32bit_elf)
595cf52e 6270 {
5477e8a0 6271 if (do_section_details)
595cf52e
L
6272 {
6273 printf (_(" [Nr] Name\n"));
5477e8a0 6274 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
595cf52e
L
6275 }
6276 else
6277 printf
6278 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
6279 }
d974e256 6280 else if (do_wide)
595cf52e 6281 {
5477e8a0 6282 if (do_section_details)
595cf52e
L
6283 {
6284 printf (_(" [Nr] Name\n"));
5477e8a0 6285 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
595cf52e
L
6286 }
6287 else
6288 printf
6289 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
6290 }
f7a99963
NC
6291 else
6292 {
5477e8a0 6293 if (do_section_details)
595cf52e
L
6294 {
6295 printf (_(" [Nr] Name\n"));
5477e8a0
L
6296 printf (_(" Type Address Offset Link\n"));
6297 printf (_(" Size EntSize Info Align\n"));
595cf52e
L
6298 }
6299 else
6300 {
6301 printf (_(" [Nr] Name Type Address Offset\n"));
6302 printf (_(" Size EntSize Flags Link Info Align\n"));
6303 }
f7a99963 6304 }
252b5132 6305
5477e8a0
L
6306 if (do_section_details)
6307 printf (_(" Flags\n"));
6308
dda8d76d
NC
6309 for (i = 0, section = filedata->section_headers;
6310 i < filedata->file_header.e_shnum;
b34976b6 6311 i++, section++)
252b5132 6312 {
dd905818
NC
6313 /* Run some sanity checks on the section header. */
6314
6315 /* Check the sh_link field. */
6316 switch (section->sh_type)
6317 {
285e3f99
AM
6318 case SHT_REL:
6319 case SHT_RELA:
6320 if (section->sh_link == 0
6321 && (filedata->file_header.e_type == ET_EXEC
6322 || filedata->file_header.e_type == ET_DYN))
6323 /* A dynamic relocation section where all entries use a
6324 zero symbol index need not specify a symtab section. */
6325 break;
6326 /* Fall through. */
dd905818
NC
6327 case SHT_SYMTAB_SHNDX:
6328 case SHT_GROUP:
6329 case SHT_HASH:
6330 case SHT_GNU_HASH:
6331 case SHT_GNU_versym:
285e3f99 6332 if (section->sh_link == 0
dda8d76d
NC
6333 || section->sh_link >= filedata->file_header.e_shnum
6334 || (filedata->section_headers[section->sh_link].sh_type != SHT_SYMTAB
6335 && filedata->section_headers[section->sh_link].sh_type != SHT_DYNSYM))
dd905818
NC
6336 warn (_("[%2u]: Link field (%u) should index a symtab section.\n"),
6337 i, section->sh_link);
6338 break;
6339
6340 case SHT_DYNAMIC:
6341 case SHT_SYMTAB:
6342 case SHT_DYNSYM:
6343 case SHT_GNU_verneed:
6344 case SHT_GNU_verdef:
6345 case SHT_GNU_LIBLIST:
285e3f99 6346 if (section->sh_link == 0
dda8d76d
NC
6347 || section->sh_link >= filedata->file_header.e_shnum
6348 || filedata->section_headers[section->sh_link].sh_type != SHT_STRTAB)
dd905818
NC
6349 warn (_("[%2u]: Link field (%u) should index a string section.\n"),
6350 i, section->sh_link);
6351 break;
6352
6353 case SHT_INIT_ARRAY:
6354 case SHT_FINI_ARRAY:
6355 case SHT_PREINIT_ARRAY:
6356 if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6357 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6358 i, section->sh_link);
6359 break;
6360
6361 default:
6362 /* FIXME: Add support for target specific section types. */
6363#if 0 /* Currently we do not check other section types as there are too
6364 many special cases. Stab sections for example have a type
6365 of SHT_PROGBITS but an sh_link field that links to the .stabstr
6366 section. */
6367 if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6368 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6369 i, section->sh_link);
6370#endif
6371 break;
6372 }
6373
6374 /* Check the sh_info field. */
6375 switch (section->sh_type)
6376 {
6377 case SHT_REL:
6378 case SHT_RELA:
285e3f99
AM
6379 if (section->sh_info == 0
6380 && (filedata->file_header.e_type == ET_EXEC
6381 || filedata->file_header.e_type == ET_DYN))
6382 /* Dynamic relocations apply to segments, so they do not
6383 need to specify the section they relocate. */
6384 break;
6385 if (section->sh_info == 0
dda8d76d
NC
6386 || section->sh_info >= filedata->file_header.e_shnum
6387 || (filedata->section_headers[section->sh_info].sh_type != SHT_PROGBITS
6388 && filedata->section_headers[section->sh_info].sh_type != SHT_NOBITS
6389 && filedata->section_headers[section->sh_info].sh_type != SHT_NOTE
6390 && filedata->section_headers[section->sh_info].sh_type != SHT_INIT_ARRAY
385e5b90
L
6391 && filedata->section_headers[section->sh_info].sh_type != SHT_FINI_ARRAY
6392 && filedata->section_headers[section->sh_info].sh_type != SHT_PREINIT_ARRAY
dd905818 6393 /* FIXME: Are other section types valid ? */
dda8d76d 6394 && filedata->section_headers[section->sh_info].sh_type < SHT_LOOS))
285e3f99
AM
6395 warn (_("[%2u]: Info field (%u) should index a relocatable section.\n"),
6396 i, section->sh_info);
dd905818
NC
6397 break;
6398
6399 case SHT_DYNAMIC:
6400 case SHT_HASH:
6401 case SHT_SYMTAB_SHNDX:
6402 case SHT_INIT_ARRAY:
6403 case SHT_FINI_ARRAY:
6404 case SHT_PREINIT_ARRAY:
6405 if (section->sh_info != 0)
6406 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6407 i, section->sh_info);
6408 break;
6409
6410 case SHT_GROUP:
6411 case SHT_SYMTAB:
6412 case SHT_DYNSYM:
6413 /* A symbol index - we assume that it is valid. */
6414 break;
6415
6416 default:
6417 /* FIXME: Add support for target specific section types. */
6418 if (section->sh_type == SHT_NOBITS)
6419 /* NOBITS section headers with non-zero sh_info fields can be
6420 created when a binary is stripped of everything but its debug
1a9ccd70
NC
6421 information. The stripped sections have their headers
6422 preserved but their types set to SHT_NOBITS. So do not check
6423 this type of section. */
dd905818
NC
6424 ;
6425 else if (section->sh_flags & SHF_INFO_LINK)
6426 {
dda8d76d 6427 if (section->sh_info < 1 || section->sh_info >= filedata->file_header.e_shnum)
dd905818
NC
6428 warn (_("[%2u]: Expected link to another section in info field"), i);
6429 }
a91e1603
L
6430 else if (section->sh_type < SHT_LOOS
6431 && (section->sh_flags & SHF_GNU_MBIND) == 0
6432 && section->sh_info != 0)
dd905818
NC
6433 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6434 i, section->sh_info);
6435 break;
6436 }
6437
3e6b6445 6438 /* Check the sh_size field. */
dda8d76d 6439 if (section->sh_size > filedata->file_size
3e6b6445
NC
6440 && section->sh_type != SHT_NOBITS
6441 && section->sh_type != SHT_NULL
6442 && section->sh_type < SHT_LOOS)
6443 warn (_("Size of section %u is larger than the entire file!\n"), i);
6444
7bfd842d 6445 printf (" [%2u] ", i);
5477e8a0 6446 if (do_section_details)
dda8d76d 6447 printf ("%s\n ", printable_section_name (filedata, section));
595cf52e 6448 else
74e1a04b 6449 print_symbol (-17, SECTION_NAME (section));
0b4362b0 6450
ea52a088 6451 printf (do_wide ? " %-15s " : " %-15.15s ",
dda8d76d 6452 get_section_type_name (filedata, section->sh_type));
0b4362b0 6453
f7a99963
NC
6454 if (is_32bit_elf)
6455 {
cfcac11d
NC
6456 const char * link_too_big = NULL;
6457
f7a99963 6458 print_vma (section->sh_addr, LONG_HEX);
76da6bbe 6459
f7a99963
NC
6460 printf ( " %6.6lx %6.6lx %2.2lx",
6461 (unsigned long) section->sh_offset,
6462 (unsigned long) section->sh_size,
6463 (unsigned long) section->sh_entsize);
d1133906 6464
5477e8a0
L
6465 if (do_section_details)
6466 fputs (" ", stdout);
6467 else
dda8d76d 6468 printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
76da6bbe 6469
dda8d76d 6470 if (section->sh_link >= filedata->file_header.e_shnum)
cfcac11d
NC
6471 {
6472 link_too_big = "";
6473 /* The sh_link value is out of range. Normally this indicates
caa83f8b 6474 an error but it can have special values in Solaris binaries. */
dda8d76d 6475 switch (filedata->file_header.e_machine)
cfcac11d 6476 {
caa83f8b 6477 case EM_386:
22abe556 6478 case EM_IAMCU:
caa83f8b 6479 case EM_X86_64:
7f502d6c 6480 case EM_L1OM:
7a9068fe 6481 case EM_K1OM:
cfcac11d
NC
6482 case EM_OLD_SPARCV9:
6483 case EM_SPARC32PLUS:
6484 case EM_SPARCV9:
6485 case EM_SPARC:
6486 if (section->sh_link == (SHN_BEFORE & 0xffff))
6487 link_too_big = "BEFORE";
6488 else if (section->sh_link == (SHN_AFTER & 0xffff))
6489 link_too_big = "AFTER";
6490 break;
6491 default:
6492 break;
6493 }
6494 }
6495
6496 if (do_section_details)
6497 {
6498 if (link_too_big != NULL && * link_too_big)
6499 printf ("<%s> ", link_too_big);
6500 else
6501 printf ("%2u ", section->sh_link);
6502 printf ("%3u %2lu\n", section->sh_info,
6503 (unsigned long) section->sh_addralign);
6504 }
6505 else
6506 printf ("%2u %3u %2lu\n",
6507 section->sh_link,
6508 section->sh_info,
6509 (unsigned long) section->sh_addralign);
6510
6511 if (link_too_big && ! * link_too_big)
6512 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
6513 i, section->sh_link);
f7a99963 6514 }
d974e256
JJ
6515 else if (do_wide)
6516 {
6517 print_vma (section->sh_addr, LONG_HEX);
6518
6519 if ((long) section->sh_offset == section->sh_offset)
6520 printf (" %6.6lx", (unsigned long) section->sh_offset);
6521 else
6522 {
6523 putchar (' ');
6524 print_vma (section->sh_offset, LONG_HEX);
6525 }
6526
6527 if ((unsigned long) section->sh_size == section->sh_size)
6528 printf (" %6.6lx", (unsigned long) section->sh_size);
6529 else
6530 {
6531 putchar (' ');
6532 print_vma (section->sh_size, LONG_HEX);
6533 }
6534
6535 if ((unsigned long) section->sh_entsize == section->sh_entsize)
6536 printf (" %2.2lx", (unsigned long) section->sh_entsize);
6537 else
6538 {
6539 putchar (' ');
6540 print_vma (section->sh_entsize, LONG_HEX);
6541 }
6542
5477e8a0
L
6543 if (do_section_details)
6544 fputs (" ", stdout);
6545 else
dda8d76d 6546 printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
d974e256 6547
72de5009 6548 printf ("%2u %3u ", section->sh_link, section->sh_info);
d974e256
JJ
6549
6550 if ((unsigned long) section->sh_addralign == section->sh_addralign)
72de5009 6551 printf ("%2lu\n", (unsigned long) section->sh_addralign);
d974e256
JJ
6552 else
6553 {
6554 print_vma (section->sh_addralign, DEC);
6555 putchar ('\n');
6556 }
6557 }
5477e8a0 6558 else if (do_section_details)
595cf52e 6559 {
55cc53e9 6560 putchar (' ');
595cf52e
L
6561 print_vma (section->sh_addr, LONG_HEX);
6562 if ((long) section->sh_offset == section->sh_offset)
5477e8a0 6563 printf (" %16.16lx", (unsigned long) section->sh_offset);
595cf52e
L
6564 else
6565 {
6566 printf (" ");
6567 print_vma (section->sh_offset, LONG_HEX);
6568 }
72de5009 6569 printf (" %u\n ", section->sh_link);
595cf52e 6570 print_vma (section->sh_size, LONG_HEX);
5477e8a0 6571 putchar (' ');
595cf52e
L
6572 print_vma (section->sh_entsize, LONG_HEX);
6573
72de5009
AM
6574 printf (" %-16u %lu\n",
6575 section->sh_info,
595cf52e
L
6576 (unsigned long) section->sh_addralign);
6577 }
f7a99963
NC
6578 else
6579 {
6580 putchar (' ');
6581 print_vma (section->sh_addr, LONG_HEX);
53c7db4b
KH
6582 if ((long) section->sh_offset == section->sh_offset)
6583 printf (" %8.8lx", (unsigned long) section->sh_offset);
6584 else
6585 {
6586 printf (" ");
6587 print_vma (section->sh_offset, LONG_HEX);
6588 }
f7a99963
NC
6589 printf ("\n ");
6590 print_vma (section->sh_size, LONG_HEX);
6591 printf (" ");
6592 print_vma (section->sh_entsize, LONG_HEX);
76da6bbe 6593
dda8d76d 6594 printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
76da6bbe 6595
72de5009
AM
6596 printf (" %2u %3u %lu\n",
6597 section->sh_link,
6598 section->sh_info,
f7a99963
NC
6599 (unsigned long) section->sh_addralign);
6600 }
5477e8a0
L
6601
6602 if (do_section_details)
77115a4a 6603 {
dda8d76d 6604 printf (" %s\n", get_elf_section_flags (filedata, section->sh_flags));
77115a4a
L
6605 if ((section->sh_flags & SHF_COMPRESSED) != 0)
6606 {
6607 /* Minimum section size is 12 bytes for 32-bit compression
6608 header + 12 bytes for compressed data header. */
6609 unsigned char buf[24];
d8024a91 6610
77115a4a 6611 assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
dda8d76d 6612 if (get_data (&buf, filedata, section->sh_offset, 1,
77115a4a
L
6613 sizeof (buf), _("compression header")))
6614 {
6615 Elf_Internal_Chdr chdr;
d8024a91 6616
ebdf1ebf 6617 (void) get_compression_header (&chdr, buf, sizeof (buf));
d8024a91 6618
77115a4a
L
6619 if (chdr.ch_type == ELFCOMPRESS_ZLIB)
6620 printf (" ZLIB, ");
6621 else
6622 printf (_(" [<unknown>: 0x%x], "),
6623 chdr.ch_type);
6624 print_vma (chdr.ch_size, LONG_HEX);
6625 printf (", %lu\n", (unsigned long) chdr.ch_addralign);
6626 }
6627 }
6628 }
252b5132
RH
6629 }
6630
5477e8a0 6631 if (!do_section_details)
3dbcc61d 6632 {
9fb71ee4
NC
6633 /* The ordering of the letters shown here matches the ordering of the
6634 corresponding SHF_xxx values, and hence the order in which these
6635 letters will be displayed to the user. */
6636 printf (_("Key to Flags:\n\
6637 W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6638 L (link order), O (extra OS processing required), G (group), T (TLS),\n\
fd85a6a1 6639 C (compressed), x (unknown), o (OS specific), E (exclude),\n "));
dda8d76d
NC
6640 if (filedata->file_header.e_machine == EM_X86_64
6641 || filedata->file_header.e_machine == EM_L1OM
6642 || filedata->file_header.e_machine == EM_K1OM)
9fb71ee4 6643 printf (_("l (large), "));
dda8d76d 6644 else if (filedata->file_header.e_machine == EM_ARM)
f0728ee3 6645 printf (_("y (purecode), "));
dda8d76d 6646 else if (filedata->file_header.e_machine == EM_PPC)
83eef883 6647 printf (_("v (VLE), "));
9fb71ee4 6648 printf ("p (processor specific)\n");
0b4362b0 6649 }
d1133906 6650
32ec8896 6651 return TRUE;
252b5132
RH
6652}
6653
f5842774
L
6654static const char *
6655get_group_flags (unsigned int flags)
6656{
1449284b 6657 static char buff[128];
220453ec 6658
6d913794
NC
6659 if (flags == 0)
6660 return "";
6661 else if (flags == GRP_COMDAT)
6662 return "COMDAT ";
f5842774 6663
6d913794
NC
6664 snprintf (buff, 14, _("[0x%x: "), flags);
6665
6666 flags &= ~ GRP_COMDAT;
6667 if (flags & GRP_MASKOS)
6668 {
6669 strcat (buff, "<OS specific>");
6670 flags &= ~ GRP_MASKOS;
f5842774 6671 }
6d913794
NC
6672
6673 if (flags & GRP_MASKPROC)
6674 {
6675 strcat (buff, "<PROC specific>");
6676 flags &= ~ GRP_MASKPROC;
6677 }
6678
6679 if (flags)
6680 strcat (buff, "<unknown>");
6681
6682 strcat (buff, "]");
f5842774
L
6683 return buff;
6684}
6685
32ec8896 6686static bfd_boolean
dda8d76d 6687process_section_groups (Filedata * filedata)
f5842774 6688{
2cf0635d 6689 Elf_Internal_Shdr * section;
f5842774 6690 unsigned int i;
2cf0635d
NC
6691 struct group * group;
6692 Elf_Internal_Shdr * symtab_sec;
6693 Elf_Internal_Shdr * strtab_sec;
6694 Elf_Internal_Sym * symtab;
ba5cdace 6695 unsigned long num_syms;
2cf0635d 6696 char * strtab;
c256ffe7 6697 size_t strtab_size;
d1f5c6e3
L
6698
6699 /* Don't process section groups unless needed. */
6700 if (!do_unwind && !do_section_groups)
32ec8896 6701 return TRUE;
f5842774 6702
dda8d76d 6703 if (filedata->file_header.e_shnum == 0)
f5842774
L
6704 {
6705 if (do_section_groups)
82f2dbf7 6706 printf (_("\nThere are no sections to group in this file.\n"));
f5842774 6707
32ec8896 6708 return TRUE;
f5842774
L
6709 }
6710
dda8d76d 6711 if (filedata->section_headers == NULL)
f5842774
L
6712 {
6713 error (_("Section headers are not available!\n"));
fa1908fd 6714 /* PR 13622: This can happen with a corrupt ELF header. */
32ec8896 6715 return FALSE;
f5842774
L
6716 }
6717
dda8d76d 6718 section_headers_groups = (struct group **) calloc (filedata->file_header.e_shnum,
3f5e193b 6719 sizeof (struct group *));
e4b17d5c
L
6720
6721 if (section_headers_groups == NULL)
6722 {
8b73c356 6723 error (_("Out of memory reading %u section group headers\n"),
dda8d76d 6724 filedata->file_header.e_shnum);
32ec8896 6725 return FALSE;
e4b17d5c
L
6726 }
6727
f5842774 6728 /* Scan the sections for the group section. */
d1f5c6e3 6729 group_count = 0;
dda8d76d
NC
6730 for (i = 0, section = filedata->section_headers;
6731 i < filedata->file_header.e_shnum;
f5842774 6732 i++, section++)
e4b17d5c
L
6733 if (section->sh_type == SHT_GROUP)
6734 group_count++;
6735
d1f5c6e3
L
6736 if (group_count == 0)
6737 {
6738 if (do_section_groups)
6739 printf (_("\nThere are no section groups in this file.\n"));
6740
32ec8896 6741 return TRUE;
d1f5c6e3
L
6742 }
6743
3f5e193b 6744 section_groups = (struct group *) calloc (group_count, sizeof (struct group));
e4b17d5c
L
6745
6746 if (section_groups == NULL)
6747 {
8b73c356
NC
6748 error (_("Out of memory reading %lu groups\n"),
6749 (unsigned long) group_count);
32ec8896 6750 return FALSE;
e4b17d5c
L
6751 }
6752
d1f5c6e3
L
6753 symtab_sec = NULL;
6754 strtab_sec = NULL;
6755 symtab = NULL;
ba5cdace 6756 num_syms = 0;
d1f5c6e3 6757 strtab = NULL;
c256ffe7 6758 strtab_size = 0;
dda8d76d
NC
6759 for (i = 0, section = filedata->section_headers, group = section_groups;
6760 i < filedata->file_header.e_shnum;
e4b17d5c 6761 i++, section++)
f5842774
L
6762 {
6763 if (section->sh_type == SHT_GROUP)
6764 {
dda8d76d 6765 const char * name = printable_section_name (filedata, section);
74e1a04b 6766 const char * group_name;
2cf0635d
NC
6767 unsigned char * start;
6768 unsigned char * indices;
f5842774 6769 unsigned int entry, j, size;
2cf0635d
NC
6770 Elf_Internal_Shdr * sec;
6771 Elf_Internal_Sym * sym;
f5842774
L
6772
6773 /* Get the symbol table. */
dda8d76d
NC
6774 if (section->sh_link >= filedata->file_header.e_shnum
6775 || ((sec = filedata->section_headers + section->sh_link)->sh_type
c256ffe7 6776 != SHT_SYMTAB))
f5842774
L
6777 {
6778 error (_("Bad sh_link in group section `%s'\n"), name);
6779 continue;
6780 }
d1f5c6e3
L
6781
6782 if (symtab_sec != sec)
6783 {
6784 symtab_sec = sec;
6785 if (symtab)
6786 free (symtab);
dda8d76d 6787 symtab = GET_ELF_SYMBOLS (filedata, symtab_sec, & num_syms);
d1f5c6e3 6788 }
f5842774 6789
dd24e3da
NC
6790 if (symtab == NULL)
6791 {
6792 error (_("Corrupt header in group section `%s'\n"), name);
6793 continue;
6794 }
6795
ba5cdace
NC
6796 if (section->sh_info >= num_syms)
6797 {
6798 error (_("Bad sh_info in group section `%s'\n"), name);
6799 continue;
6800 }
6801
f5842774
L
6802 sym = symtab + section->sh_info;
6803
6804 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6805 {
4fbb74a6 6806 if (sym->st_shndx == 0
dda8d76d 6807 || sym->st_shndx >= filedata->file_header.e_shnum)
f5842774
L
6808 {
6809 error (_("Bad sh_info in group section `%s'\n"), name);
6810 continue;
6811 }
ba2685cc 6812
dda8d76d 6813 group_name = SECTION_NAME (filedata->section_headers + sym->st_shndx);
c256ffe7
JJ
6814 strtab_sec = NULL;
6815 if (strtab)
6816 free (strtab);
f5842774 6817 strtab = NULL;
c256ffe7 6818 strtab_size = 0;
f5842774
L
6819 }
6820 else
6821 {
6822 /* Get the string table. */
dda8d76d 6823 if (symtab_sec->sh_link >= filedata->file_header.e_shnum)
c256ffe7
JJ
6824 {
6825 strtab_sec = NULL;
6826 if (strtab)
6827 free (strtab);
6828 strtab = NULL;
6829 strtab_size = 0;
6830 }
6831 else if (strtab_sec
dda8d76d 6832 != (sec = filedata->section_headers + symtab_sec->sh_link))
d1f5c6e3
L
6833 {
6834 strtab_sec = sec;
6835 if (strtab)
6836 free (strtab);
071436c6 6837
dda8d76d 6838 strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
071436c6
NC
6839 1, strtab_sec->sh_size,
6840 _("string table"));
c256ffe7 6841 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
d1f5c6e3 6842 }
c256ffe7 6843 group_name = sym->st_name < strtab_size
2b692964 6844 ? strtab + sym->st_name : _("<corrupt>");
f5842774
L
6845 }
6846
c9c1d674
EG
6847 /* PR 17531: file: loop. */
6848 if (section->sh_entsize > section->sh_size)
6849 {
6850 error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
dda8d76d 6851 printable_section_name (filedata, section),
8066deb1
AM
6852 (unsigned long) section->sh_entsize,
6853 (unsigned long) section->sh_size);
c9c1d674
EG
6854 break;
6855 }
6856
dda8d76d 6857 start = (unsigned char *) get_data (NULL, filedata, section->sh_offset,
3f5e193b
NC
6858 1, section->sh_size,
6859 _("section data"));
59245841
NC
6860 if (start == NULL)
6861 continue;
f5842774
L
6862
6863 indices = start;
6864 size = (section->sh_size / section->sh_entsize) - 1;
6865 entry = byte_get (indices, 4);
6866 indices += 4;
e4b17d5c
L
6867
6868 if (do_section_groups)
6869 {
2b692964 6870 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
391cb864 6871 get_group_flags (entry), i, name, group_name, size);
ba2685cc 6872
e4b17d5c
L
6873 printf (_(" [Index] Name\n"));
6874 }
6875
6876 group->group_index = i;
6877
f5842774
L
6878 for (j = 0; j < size; j++)
6879 {
2cf0635d 6880 struct group_list * g;
e4b17d5c 6881
f5842774
L
6882 entry = byte_get (indices, 4);
6883 indices += 4;
6884
dda8d76d 6885 if (entry >= filedata->file_header.e_shnum)
391cb864 6886 {
57028622
NC
6887 static unsigned num_group_errors = 0;
6888
6889 if (num_group_errors ++ < 10)
6890 {
6891 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
dda8d76d 6892 entry, i, filedata->file_header.e_shnum - 1);
57028622 6893 if (num_group_errors == 10)
67ce483b 6894 warn (_("Further error messages about overlarge group section indices suppressed\n"));
57028622 6895 }
391cb864
L
6896 continue;
6897 }
391cb864 6898
4fbb74a6 6899 if (section_headers_groups [entry] != NULL)
e4b17d5c 6900 {
d1f5c6e3
L
6901 if (entry)
6902 {
57028622
NC
6903 static unsigned num_errs = 0;
6904
6905 if (num_errs ++ < 10)
6906 {
6907 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6908 entry, i,
6909 section_headers_groups [entry]->group_index);
6910 if (num_errs == 10)
6911 warn (_("Further error messages about already contained group sections suppressed\n"));
6912 }
d1f5c6e3
L
6913 continue;
6914 }
6915 else
6916 {
6917 /* Intel C/C++ compiler may put section 0 in a
32ec8896 6918 section group. We just warn it the first time
d1f5c6e3 6919 and ignore it afterwards. */
32ec8896 6920 static bfd_boolean warned = FALSE;
d1f5c6e3
L
6921 if (!warned)
6922 {
6923 error (_("section 0 in group section [%5u]\n"),
4fbb74a6 6924 section_headers_groups [entry]->group_index);
32ec8896 6925 warned = TRUE;
d1f5c6e3
L
6926 }
6927 }
e4b17d5c
L
6928 }
6929
4fbb74a6 6930 section_headers_groups [entry] = group;
e4b17d5c
L
6931
6932 if (do_section_groups)
6933 {
dda8d76d
NC
6934 sec = filedata->section_headers + entry;
6935 printf (" [%5u] %s\n", entry, printable_section_name (filedata, sec));
ba2685cc
AM
6936 }
6937
3f5e193b 6938 g = (struct group_list *) xmalloc (sizeof (struct group_list));
e4b17d5c
L
6939 g->section_index = entry;
6940 g->next = group->root;
6941 group->root = g;
f5842774
L
6942 }
6943
f5842774
L
6944 if (start)
6945 free (start);
e4b17d5c
L
6946
6947 group++;
f5842774
L
6948 }
6949 }
6950
d1f5c6e3
L
6951 if (symtab)
6952 free (symtab);
6953 if (strtab)
6954 free (strtab);
32ec8896 6955 return TRUE;
f5842774
L
6956}
6957
28f997cf
TG
6958/* Data used to display dynamic fixups. */
6959
6960struct ia64_vms_dynfixup
6961{
6962 bfd_vma needed_ident; /* Library ident number. */
6963 bfd_vma needed; /* Index in the dstrtab of the library name. */
6964 bfd_vma fixup_needed; /* Index of the library. */
6965 bfd_vma fixup_rela_cnt; /* Number of fixups. */
6966 bfd_vma fixup_rela_off; /* Fixups offset in the dynamic segment. */
6967};
6968
6969/* Data used to display dynamic relocations. */
6970
6971struct ia64_vms_dynimgrela
6972{
6973 bfd_vma img_rela_cnt; /* Number of relocations. */
6974 bfd_vma img_rela_off; /* Reloc offset in the dynamic segment. */
6975};
6976
6977/* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6978 library). */
6979
32ec8896 6980static bfd_boolean
dda8d76d
NC
6981dump_ia64_vms_dynamic_fixups (Filedata * filedata,
6982 struct ia64_vms_dynfixup * fixup,
6983 const char * strtab,
6984 unsigned int strtab_sz)
28f997cf 6985{
32ec8896 6986 Elf64_External_VMS_IMAGE_FIXUP * imfs;
28f997cf 6987 long i;
32ec8896 6988 const char * lib_name;
28f997cf 6989
dda8d76d 6990 imfs = get_data (NULL, filedata, dynamic_addr + fixup->fixup_rela_off,
28f997cf
TG
6991 1, fixup->fixup_rela_cnt * sizeof (*imfs),
6992 _("dynamic section image fixups"));
6993 if (!imfs)
32ec8896 6994 return FALSE;
28f997cf
TG
6995
6996 if (fixup->needed < strtab_sz)
6997 lib_name = strtab + fixup->needed;
6998 else
6999 {
32ec8896 7000 warn (_("corrupt library name index of 0x%lx found in dynamic entry"),
7f01b0c6 7001 (unsigned long) fixup->needed);
28f997cf
TG
7002 lib_name = "???";
7003 }
7004 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
7005 (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
7006 printf
7007 (_("Seg Offset Type SymVec DataType\n"));
7008
7009 for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
7010 {
7011 unsigned int type;
7012 const char *rtype;
7013
7014 printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
7015 printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
7016 type = BYTE_GET (imfs [i].type);
7017 rtype = elf_ia64_reloc_type (type);
7018 if (rtype == NULL)
7019 printf (" 0x%08x ", type);
7020 else
7021 printf (" %-32s ", rtype);
7022 printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
7023 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
7024 }
7025
7026 free (imfs);
32ec8896 7027 return TRUE;
28f997cf
TG
7028}
7029
7030/* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
7031
32ec8896 7032static bfd_boolean
dda8d76d 7033dump_ia64_vms_dynamic_relocs (Filedata * filedata, struct ia64_vms_dynimgrela *imgrela)
28f997cf
TG
7034{
7035 Elf64_External_VMS_IMAGE_RELA *imrs;
7036 long i;
7037
dda8d76d 7038 imrs = get_data (NULL, filedata, dynamic_addr + imgrela->img_rela_off,
28f997cf 7039 1, imgrela->img_rela_cnt * sizeof (*imrs),
9cf03b7e 7040 _("dynamic section image relocations"));
28f997cf 7041 if (!imrs)
32ec8896 7042 return FALSE;
28f997cf
TG
7043
7044 printf (_("\nImage relocs\n"));
7045 printf
7046 (_("Seg Offset Type Addend Seg Sym Off\n"));
7047
7048 for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
7049 {
7050 unsigned int type;
7051 const char *rtype;
7052
7053 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
7054 printf ("%08" BFD_VMA_FMT "x ",
7055 (bfd_vma) BYTE_GET (imrs [i].rela_offset));
7056 type = BYTE_GET (imrs [i].type);
7057 rtype = elf_ia64_reloc_type (type);
7058 if (rtype == NULL)
7059 printf ("0x%08x ", type);
7060 else
7061 printf ("%-31s ", rtype);
7062 print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
7063 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
7064 printf ("%08" BFD_VMA_FMT "x\n",
7065 (bfd_vma) BYTE_GET (imrs [i].sym_offset));
7066 }
7067
7068 free (imrs);
32ec8896 7069 return TRUE;
28f997cf
TG
7070}
7071
7072/* Display IA-64 OpenVMS dynamic relocations and fixups. */
7073
32ec8896 7074static bfd_boolean
dda8d76d 7075process_ia64_vms_dynamic_relocs (Filedata * filedata)
28f997cf
TG
7076{
7077 struct ia64_vms_dynfixup fixup;
7078 struct ia64_vms_dynimgrela imgrela;
7079 Elf_Internal_Dyn *entry;
28f997cf
TG
7080 bfd_vma strtab_off = 0;
7081 bfd_vma strtab_sz = 0;
7082 char *strtab = NULL;
32ec8896 7083 bfd_boolean res = TRUE;
28f997cf
TG
7084
7085 memset (&fixup, 0, sizeof (fixup));
7086 memset (&imgrela, 0, sizeof (imgrela));
7087
7088 /* Note: the order of the entries is specified by the OpenVMS specs. */
7089 for (entry = dynamic_section;
7090 entry < dynamic_section + dynamic_nent;
7091 entry++)
7092 {
7093 switch (entry->d_tag)
7094 {
7095 case DT_IA_64_VMS_STRTAB_OFFSET:
7096 strtab_off = entry->d_un.d_val;
7097 break;
7098 case DT_STRSZ:
7099 strtab_sz = entry->d_un.d_val;
7100 if (strtab == NULL)
dda8d76d 7101 strtab = get_data (NULL, filedata, dynamic_addr + strtab_off,
28f997cf
TG
7102 1, strtab_sz, _("dynamic string section"));
7103 break;
7104
7105 case DT_IA_64_VMS_NEEDED_IDENT:
7106 fixup.needed_ident = entry->d_un.d_val;
7107 break;
7108 case DT_NEEDED:
7109 fixup.needed = entry->d_un.d_val;
7110 break;
7111 case DT_IA_64_VMS_FIXUP_NEEDED:
7112 fixup.fixup_needed = entry->d_un.d_val;
7113 break;
7114 case DT_IA_64_VMS_FIXUP_RELA_CNT:
7115 fixup.fixup_rela_cnt = entry->d_un.d_val;
7116 break;
7117 case DT_IA_64_VMS_FIXUP_RELA_OFF:
7118 fixup.fixup_rela_off = entry->d_un.d_val;
dda8d76d 7119 if (! dump_ia64_vms_dynamic_fixups (filedata, &fixup, strtab, strtab_sz))
32ec8896 7120 res = FALSE;
28f997cf 7121 break;
28f997cf
TG
7122 case DT_IA_64_VMS_IMG_RELA_CNT:
7123 imgrela.img_rela_cnt = entry->d_un.d_val;
7124 break;
7125 case DT_IA_64_VMS_IMG_RELA_OFF:
7126 imgrela.img_rela_off = entry->d_un.d_val;
dda8d76d 7127 if (! dump_ia64_vms_dynamic_relocs (filedata, &imgrela))
32ec8896 7128 res = FALSE;
28f997cf
TG
7129 break;
7130
7131 default:
7132 break;
7133 }
7134 }
7135
7136 if (strtab != NULL)
7137 free (strtab);
7138
7139 return res;
7140}
7141
85b1c36d 7142static struct
566b0d53 7143{
2cf0635d 7144 const char * name;
566b0d53
L
7145 int reloc;
7146 int size;
7147 int rela;
32ec8896
NC
7148}
7149 dynamic_relocations [] =
566b0d53 7150{
32ec8896
NC
7151 { "REL", DT_REL, DT_RELSZ, FALSE },
7152 { "RELA", DT_RELA, DT_RELASZ, TRUE },
7153 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
566b0d53
L
7154};
7155
252b5132 7156/* Process the reloc section. */
18bd398b 7157
32ec8896 7158static bfd_boolean
dda8d76d 7159process_relocs (Filedata * filedata)
252b5132 7160{
b34976b6
AM
7161 unsigned long rel_size;
7162 unsigned long rel_offset;
252b5132 7163
252b5132 7164 if (!do_reloc)
32ec8896 7165 return TRUE;
252b5132
RH
7166
7167 if (do_using_dynamic)
7168 {
32ec8896 7169 int is_rela;
2cf0635d 7170 const char * name;
32ec8896 7171 bfd_boolean has_dynamic_reloc;
566b0d53 7172 unsigned int i;
0de14b54 7173
32ec8896 7174 has_dynamic_reloc = FALSE;
252b5132 7175
566b0d53 7176 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
252b5132 7177 {
566b0d53
L
7178 is_rela = dynamic_relocations [i].rela;
7179 name = dynamic_relocations [i].name;
7180 rel_size = dynamic_info [dynamic_relocations [i].size];
7181 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
103f02d3 7182
32ec8896
NC
7183 if (rel_size)
7184 has_dynamic_reloc = TRUE;
566b0d53
L
7185
7186 if (is_rela == UNKNOWN)
aa903cfb 7187 {
566b0d53
L
7188 if (dynamic_relocations [i].reloc == DT_JMPREL)
7189 switch (dynamic_info[DT_PLTREL])
7190 {
7191 case DT_REL:
7192 is_rela = FALSE;
7193 break;
7194 case DT_RELA:
7195 is_rela = TRUE;
7196 break;
7197 }
aa903cfb 7198 }
252b5132 7199
566b0d53
L
7200 if (rel_size)
7201 {
7202 printf
7203 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
7204 name, rel_offset, rel_size);
252b5132 7205
dda8d76d
NC
7206 dump_relocations (filedata,
7207 offset_from_vma (filedata, rel_offset, rel_size),
d93f0186 7208 rel_size,
566b0d53 7209 dynamic_symbols, num_dynamic_syms,
bb4d2ac2 7210 dynamic_strings, dynamic_strings_length,
32ec8896 7211 is_rela, TRUE /* is_dynamic */);
566b0d53 7212 }
252b5132 7213 }
566b0d53 7214
dda8d76d
NC
7215 if (is_ia64_vms (filedata))
7216 if (process_ia64_vms_dynamic_relocs (filedata))
32ec8896 7217 has_dynamic_reloc = TRUE;
28f997cf 7218
566b0d53 7219 if (! has_dynamic_reloc)
252b5132
RH
7220 printf (_("\nThere are no dynamic relocations in this file.\n"));
7221 }
7222 else
7223 {
2cf0635d 7224 Elf_Internal_Shdr * section;
b34976b6 7225 unsigned long i;
32ec8896 7226 bfd_boolean found = FALSE;
252b5132 7227
dda8d76d
NC
7228 for (i = 0, section = filedata->section_headers;
7229 i < filedata->file_header.e_shnum;
b34976b6 7230 i++, section++)
252b5132
RH
7231 {
7232 if ( section->sh_type != SHT_RELA
7233 && section->sh_type != SHT_REL)
7234 continue;
7235
7236 rel_offset = section->sh_offset;
7237 rel_size = section->sh_size;
7238
7239 if (rel_size)
7240 {
2cf0635d 7241 Elf_Internal_Shdr * strsec;
b34976b6 7242 int is_rela;
d3a49aa8 7243 unsigned long num_rela;
103f02d3 7244
252b5132
RH
7245 printf (_("\nRelocation section "));
7246
dda8d76d 7247 if (filedata->string_table == NULL)
19936277 7248 printf ("%d", section->sh_name);
252b5132 7249 else
dda8d76d 7250 printf ("'%s'", printable_section_name (filedata, section));
252b5132 7251
d3a49aa8
AM
7252 num_rela = rel_size / section->sh_entsize;
7253 printf (ngettext (" at offset 0x%lx contains %lu entry:\n",
7254 " at offset 0x%lx contains %lu entries:\n",
7255 num_rela),
7256 rel_offset, num_rela);
252b5132 7257
d79b3d50
NC
7258 is_rela = section->sh_type == SHT_RELA;
7259
4fbb74a6 7260 if (section->sh_link != 0
dda8d76d 7261 && section->sh_link < filedata->file_header.e_shnum)
af3fc3bc 7262 {
2cf0635d
NC
7263 Elf_Internal_Shdr * symsec;
7264 Elf_Internal_Sym * symtab;
d79b3d50 7265 unsigned long nsyms;
c256ffe7 7266 unsigned long strtablen = 0;
2cf0635d 7267 char * strtab = NULL;
57346661 7268
dda8d76d 7269 symsec = filedata->section_headers + section->sh_link;
08d8fa11
JJ
7270 if (symsec->sh_type != SHT_SYMTAB
7271 && symsec->sh_type != SHT_DYNSYM)
7272 continue;
7273
dda8d76d 7274 symtab = GET_ELF_SYMBOLS (filedata, symsec, & nsyms);
252b5132 7275
af3fc3bc
AM
7276 if (symtab == NULL)
7277 continue;
252b5132 7278
4fbb74a6 7279 if (symsec->sh_link != 0
dda8d76d 7280 && symsec->sh_link < filedata->file_header.e_shnum)
c256ffe7 7281 {
dda8d76d 7282 strsec = filedata->section_headers + symsec->sh_link;
103f02d3 7283
dda8d76d 7284 strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
071436c6
NC
7285 1, strsec->sh_size,
7286 _("string table"));
c256ffe7
JJ
7287 strtablen = strtab == NULL ? 0 : strsec->sh_size;
7288 }
252b5132 7289
dda8d76d 7290 dump_relocations (filedata, rel_offset, rel_size,
bb4d2ac2
L
7291 symtab, nsyms, strtab, strtablen,
7292 is_rela,
7293 symsec->sh_type == SHT_DYNSYM);
d79b3d50
NC
7294 if (strtab)
7295 free (strtab);
7296 free (symtab);
7297 }
7298 else
dda8d76d 7299 dump_relocations (filedata, rel_offset, rel_size,
32ec8896
NC
7300 NULL, 0, NULL, 0, is_rela,
7301 FALSE /* is_dynamic */);
252b5132 7302
32ec8896 7303 found = TRUE;
252b5132
RH
7304 }
7305 }
7306
7307 if (! found)
45ac8f4f
NC
7308 {
7309 /* Users sometimes forget the -D option, so try to be helpful. */
7310 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
7311 {
7312 if (dynamic_info [dynamic_relocations [i].size])
7313 {
7314 printf (_("\nThere are no static relocations in this file."));
7315 printf (_("\nTo see the dynamic relocations add --use-dynamic to the command line.\n"));
7316
7317 break;
7318 }
7319 }
7320 if (i == ARRAY_SIZE (dynamic_relocations))
7321 printf (_("\nThere are no relocations in this file.\n"));
7322 }
252b5132
RH
7323 }
7324
32ec8896 7325 return TRUE;
252b5132
RH
7326}
7327
4d6ed7c8
NC
7328/* An absolute address consists of a section and an offset. If the
7329 section is NULL, the offset itself is the address, otherwise, the
7330 address equals to LOAD_ADDRESS(section) + offset. */
7331
7332struct absaddr
948f632f
DA
7333{
7334 unsigned short section;
7335 bfd_vma offset;
7336};
4d6ed7c8 7337
1949de15
L
7338#define ABSADDR(a) \
7339 ((a).section \
dda8d76d 7340 ? filedata->section_headers [(a).section].sh_addr + (a).offset \
1949de15
L
7341 : (a).offset)
7342
948f632f
DA
7343/* Find the nearest symbol at or below ADDR. Returns the symbol
7344 name, if found, and the offset from the symbol to ADDR. */
4d6ed7c8 7345
4d6ed7c8 7346static void
dda8d76d
NC
7347find_symbol_for_address (Filedata * filedata,
7348 Elf_Internal_Sym * symtab,
7349 unsigned long nsyms,
7350 const char * strtab,
7351 unsigned long strtab_size,
7352 struct absaddr addr,
7353 const char ** symname,
7354 bfd_vma * offset)
4d6ed7c8 7355{
d3ba0551 7356 bfd_vma dist = 0x100000;
2cf0635d 7357 Elf_Internal_Sym * sym;
948f632f
DA
7358 Elf_Internal_Sym * beg;
7359 Elf_Internal_Sym * end;
2cf0635d 7360 Elf_Internal_Sym * best = NULL;
4d6ed7c8 7361
0b6ae522 7362 REMOVE_ARCH_BITS (addr.offset);
948f632f
DA
7363 beg = symtab;
7364 end = symtab + nsyms;
0b6ae522 7365
948f632f 7366 while (beg < end)
4d6ed7c8 7367 {
948f632f
DA
7368 bfd_vma value;
7369
7370 sym = beg + (end - beg) / 2;
0b6ae522 7371
948f632f 7372 value = sym->st_value;
0b6ae522
DJ
7373 REMOVE_ARCH_BITS (value);
7374
948f632f 7375 if (sym->st_name != 0
4d6ed7c8 7376 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
0b6ae522
DJ
7377 && addr.offset >= value
7378 && addr.offset - value < dist)
4d6ed7c8
NC
7379 {
7380 best = sym;
0b6ae522 7381 dist = addr.offset - value;
4d6ed7c8
NC
7382 if (!dist)
7383 break;
7384 }
948f632f
DA
7385
7386 if (addr.offset < value)
7387 end = sym;
7388 else
7389 beg = sym + 1;
4d6ed7c8 7390 }
1b31d05e 7391
4d6ed7c8
NC
7392 if (best)
7393 {
57346661 7394 *symname = (best->st_name >= strtab_size
2b692964 7395 ? _("<corrupt>") : strtab + best->st_name);
4d6ed7c8
NC
7396 *offset = dist;
7397 return;
7398 }
1b31d05e 7399
4d6ed7c8
NC
7400 *symname = NULL;
7401 *offset = addr.offset;
7402}
7403
32ec8896 7404static /* signed */ int
948f632f
DA
7405symcmp (const void *p, const void *q)
7406{
7407 Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
7408 Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
7409
7410 return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
7411}
7412
7413/* Process the unwind section. */
7414
7415#include "unwind-ia64.h"
7416
7417struct ia64_unw_table_entry
7418{
7419 struct absaddr start;
7420 struct absaddr end;
7421 struct absaddr info;
7422};
7423
7424struct ia64_unw_aux_info
7425{
32ec8896
NC
7426 struct ia64_unw_table_entry * table; /* Unwind table. */
7427 unsigned long table_len; /* Length of unwind table. */
7428 unsigned char * info; /* Unwind info. */
7429 unsigned long info_size; /* Size of unwind info. */
7430 bfd_vma info_addr; /* Starting address of unwind info. */
7431 bfd_vma seg_base; /* Starting address of segment. */
7432 Elf_Internal_Sym * symtab; /* The symbol table. */
7433 unsigned long nsyms; /* Number of symbols. */
7434 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7435 unsigned long nfuns; /* Number of entries in funtab. */
7436 char * strtab; /* The string table. */
7437 unsigned long strtab_size; /* Size of string table. */
948f632f
DA
7438};
7439
32ec8896 7440static bfd_boolean
dda8d76d 7441dump_ia64_unwind (Filedata * filedata, struct ia64_unw_aux_info * aux)
4d6ed7c8 7442{
2cf0635d 7443 struct ia64_unw_table_entry * tp;
948f632f 7444 unsigned long j, nfuns;
4d6ed7c8 7445 int in_body;
32ec8896 7446 bfd_boolean res = TRUE;
7036c0e1 7447
948f632f
DA
7448 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7449 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7450 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7451 aux->funtab[nfuns++] = aux->symtab[j];
7452 aux->nfuns = nfuns;
7453 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7454
4d6ed7c8
NC
7455 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7456 {
7457 bfd_vma stamp;
7458 bfd_vma offset;
2cf0635d
NC
7459 const unsigned char * dp;
7460 const unsigned char * head;
53774b7e 7461 const unsigned char * end;
2cf0635d 7462 const char * procname;
4d6ed7c8 7463
dda8d76d 7464 find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
57346661 7465 aux->strtab_size, tp->start, &procname, &offset);
4d6ed7c8
NC
7466
7467 fputs ("\n<", stdout);
7468
7469 if (procname)
7470 {
7471 fputs (procname, stdout);
7472
7473 if (offset)
7474 printf ("+%lx", (unsigned long) offset);
7475 }
7476
7477 fputs (">: [", stdout);
7478 print_vma (tp->start.offset, PREFIX_HEX);
7479 fputc ('-', stdout);
7480 print_vma (tp->end.offset, PREFIX_HEX);
86f55779 7481 printf ("], info at +0x%lx\n",
4d6ed7c8
NC
7482 (unsigned long) (tp->info.offset - aux->seg_base));
7483
53774b7e
NC
7484 /* PR 17531: file: 86232b32. */
7485 if (aux->info == NULL)
7486 continue;
7487
7488 /* PR 17531: file: 0997b4d1. */
7489 if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
7490 {
7491 warn (_("Invalid offset %lx in table entry %ld\n"),
7492 (long) tp->info.offset, (long) (tp - aux->table));
32ec8896 7493 res = FALSE;
53774b7e
NC
7494 continue;
7495 }
7496
1949de15 7497 head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
a4a00738 7498 stamp = byte_get ((unsigned char *) head, sizeof (stamp));
4d6ed7c8 7499
86f55779 7500 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4d6ed7c8
NC
7501 (unsigned) UNW_VER (stamp),
7502 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
7503 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
7504 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
89fac5e3 7505 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
4d6ed7c8
NC
7506
7507 if (UNW_VER (stamp) != 1)
7508 {
2b692964 7509 printf (_("\tUnknown version.\n"));
4d6ed7c8
NC
7510 continue;
7511 }
7512
7513 in_body = 0;
53774b7e
NC
7514 end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
7515 /* PR 17531: file: 16ceda89. */
7516 if (end > aux->info + aux->info_size)
7517 end = aux->info + aux->info_size;
7518 for (dp = head + 8; dp < end;)
b4477bc8 7519 dp = unw_decode (dp, in_body, & in_body, end);
4d6ed7c8 7520 }
948f632f
DA
7521
7522 free (aux->funtab);
32ec8896
NC
7523
7524 return res;
4d6ed7c8
NC
7525}
7526
53774b7e 7527static bfd_boolean
dda8d76d
NC
7528slurp_ia64_unwind_table (Filedata * filedata,
7529 struct ia64_unw_aux_info * aux,
7530 Elf_Internal_Shdr * sec)
4d6ed7c8 7531{
89fac5e3 7532 unsigned long size, nrelas, i;
2cf0635d
NC
7533 Elf_Internal_Phdr * seg;
7534 struct ia64_unw_table_entry * tep;
7535 Elf_Internal_Shdr * relsec;
7536 Elf_Internal_Rela * rela;
7537 Elf_Internal_Rela * rp;
7538 unsigned char * table;
7539 unsigned char * tp;
7540 Elf_Internal_Sym * sym;
7541 const char * relname;
4d6ed7c8 7542
53774b7e
NC
7543 aux->table_len = 0;
7544
4d6ed7c8
NC
7545 /* First, find the starting address of the segment that includes
7546 this section: */
7547
dda8d76d 7548 if (filedata->file_header.e_phnum)
4d6ed7c8 7549 {
dda8d76d 7550 if (! get_program_headers (filedata))
53774b7e 7551 return FALSE;
4d6ed7c8 7552
dda8d76d
NC
7553 for (seg = filedata->program_headers;
7554 seg < filedata->program_headers + filedata->file_header.e_phnum;
d93f0186 7555 ++seg)
4d6ed7c8
NC
7556 {
7557 if (seg->p_type != PT_LOAD)
7558 continue;
7559
7560 if (sec->sh_addr >= seg->p_vaddr
7561 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7562 {
7563 aux->seg_base = seg->p_vaddr;
7564 break;
7565 }
7566 }
4d6ed7c8
NC
7567 }
7568
7569 /* Second, build the unwind table from the contents of the unwind section: */
7570 size = sec->sh_size;
dda8d76d 7571 table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
3f5e193b 7572 _("unwind table"));
a6e9f9df 7573 if (!table)
53774b7e 7574 return FALSE;
4d6ed7c8 7575
53774b7e 7576 aux->table_len = size / (3 * eh_addr_size);
3f5e193b 7577 aux->table = (struct ia64_unw_table_entry *)
53774b7e 7578 xcmalloc (aux->table_len, sizeof (aux->table[0]));
89fac5e3 7579 tep = aux->table;
53774b7e
NC
7580
7581 for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
4d6ed7c8
NC
7582 {
7583 tep->start.section = SHN_UNDEF;
7584 tep->end.section = SHN_UNDEF;
7585 tep->info.section = SHN_UNDEF;
c6a0c689
AM
7586 tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7587 tep->end.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7588 tep->info.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
4d6ed7c8
NC
7589 tep->start.offset += aux->seg_base;
7590 tep->end.offset += aux->seg_base;
7591 tep->info.offset += aux->seg_base;
7592 }
7593 free (table);
7594
41e92641 7595 /* Third, apply any relocations to the unwind table: */
dda8d76d
NC
7596 for (relsec = filedata->section_headers;
7597 relsec < filedata->section_headers + filedata->file_header.e_shnum;
4d6ed7c8
NC
7598 ++relsec)
7599 {
7600 if (relsec->sh_type != SHT_RELA
dda8d76d
NC
7601 || relsec->sh_info >= filedata->file_header.e_shnum
7602 || filedata->section_headers + relsec->sh_info != sec)
4d6ed7c8
NC
7603 continue;
7604
dda8d76d 7605 if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
4d6ed7c8 7606 & rela, & nrelas))
53774b7e
NC
7607 {
7608 free (aux->table);
7609 aux->table = NULL;
7610 aux->table_len = 0;
7611 return FALSE;
7612 }
4d6ed7c8
NC
7613
7614 for (rp = rela; rp < rela + nrelas; ++rp)
7615 {
4770fb94 7616 unsigned int sym_ndx;
726bd37d
AM
7617 unsigned int r_type = get_reloc_type (filedata, rp->r_info);
7618 relname = elf_ia64_reloc_type (r_type);
4d6ed7c8 7619
82b1b41b
NC
7620 /* PR 17531: file: 9fa67536. */
7621 if (relname == NULL)
7622 {
726bd37d 7623 warn (_("Skipping unknown relocation type: %u\n"), r_type);
82b1b41b
NC
7624 continue;
7625 }
948f632f 7626
0112cd26 7627 if (! const_strneq (relname, "R_IA64_SEGREL"))
4d6ed7c8 7628 {
82b1b41b 7629 warn (_("Skipping unexpected relocation type: %s\n"), relname);
4d6ed7c8
NC
7630 continue;
7631 }
7632
89fac5e3 7633 i = rp->r_offset / (3 * eh_addr_size);
4d6ed7c8 7634
53774b7e
NC
7635 /* PR 17531: file: 5bc8d9bf. */
7636 if (i >= aux->table_len)
7637 {
7638 warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
7639 continue;
7640 }
7641
4770fb94
AM
7642 sym_ndx = get_reloc_symindex (rp->r_info);
7643 if (sym_ndx >= aux->nsyms)
7644 {
7645 warn (_("Skipping reloc with invalid symbol index: %u\n"),
7646 sym_ndx);
7647 continue;
7648 }
7649 sym = aux->symtab + sym_ndx;
7650
53774b7e 7651 switch (rp->r_offset / eh_addr_size % 3)
4d6ed7c8
NC
7652 {
7653 case 0:
7654 aux->table[i].start.section = sym->st_shndx;
e466bc6e 7655 aux->table[i].start.offset = rp->r_addend + sym->st_value;
4d6ed7c8
NC
7656 break;
7657 case 1:
7658 aux->table[i].end.section = sym->st_shndx;
e466bc6e 7659 aux->table[i].end.offset = rp->r_addend + sym->st_value;
4d6ed7c8
NC
7660 break;
7661 case 2:
7662 aux->table[i].info.section = sym->st_shndx;
e466bc6e 7663 aux->table[i].info.offset = rp->r_addend + sym->st_value;
4d6ed7c8
NC
7664 break;
7665 default:
7666 break;
7667 }
7668 }
7669
7670 free (rela);
7671 }
7672
53774b7e 7673 return TRUE;
4d6ed7c8
NC
7674}
7675
32ec8896 7676static bfd_boolean
dda8d76d 7677ia64_process_unwind (Filedata * filedata)
4d6ed7c8 7678{
2cf0635d
NC
7679 Elf_Internal_Shdr * sec;
7680 Elf_Internal_Shdr * unwsec = NULL;
7681 Elf_Internal_Shdr * strsec;
89fac5e3 7682 unsigned long i, unwcount = 0, unwstart = 0;
57346661 7683 struct ia64_unw_aux_info aux;
32ec8896 7684 bfd_boolean res = TRUE;
f1467e33 7685
4d6ed7c8
NC
7686 memset (& aux, 0, sizeof (aux));
7687
dda8d76d 7688 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
4d6ed7c8 7689 {
c256ffe7 7690 if (sec->sh_type == SHT_SYMTAB
dda8d76d 7691 && sec->sh_link < filedata->file_header.e_shnum)
4d6ed7c8 7692 {
dda8d76d 7693 aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
4d6ed7c8 7694
dda8d76d 7695 strsec = filedata->section_headers + sec->sh_link;
4082ef84
NC
7696 if (aux.strtab != NULL)
7697 {
7698 error (_("Multiple auxillary string tables encountered\n"));
7699 free (aux.strtab);
32ec8896 7700 res = FALSE;
4082ef84 7701 }
dda8d76d 7702 aux.strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
3f5e193b
NC
7703 1, strsec->sh_size,
7704 _("string table"));
c256ffe7 7705 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
4d6ed7c8
NC
7706 }
7707 else if (sec->sh_type == SHT_IA_64_UNWIND)
579f31ac
JJ
7708 unwcount++;
7709 }
7710
7711 if (!unwcount)
7712 printf (_("\nThere are no unwind sections in this file.\n"));
7713
7714 while (unwcount-- > 0)
7715 {
2cf0635d 7716 char * suffix;
579f31ac
JJ
7717 size_t len, len2;
7718
dda8d76d
NC
7719 for (i = unwstart, sec = filedata->section_headers + unwstart, unwsec = NULL;
7720 i < filedata->file_header.e_shnum; ++i, ++sec)
579f31ac
JJ
7721 if (sec->sh_type == SHT_IA_64_UNWIND)
7722 {
7723 unwsec = sec;
7724 break;
7725 }
4082ef84
NC
7726 /* We have already counted the number of SHT_IA64_UNWIND
7727 sections so the loop above should never fail. */
7728 assert (unwsec != NULL);
579f31ac
JJ
7729
7730 unwstart = i + 1;
7731 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
7732
e4b17d5c
L
7733 if ((unwsec->sh_flags & SHF_GROUP) != 0)
7734 {
7735 /* We need to find which section group it is in. */
4082ef84 7736 struct group_list * g;
e4b17d5c 7737
4082ef84
NC
7738 if (section_headers_groups == NULL
7739 || section_headers_groups [i] == NULL)
dda8d76d 7740 i = filedata->file_header.e_shnum;
4082ef84 7741 else
e4b17d5c 7742 {
4082ef84 7743 g = section_headers_groups [i]->root;
18bd398b 7744
4082ef84
NC
7745 for (; g != NULL; g = g->next)
7746 {
dda8d76d 7747 sec = filedata->section_headers + g->section_index;
e4b17d5c 7748
4082ef84
NC
7749 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
7750 break;
7751 }
7752
7753 if (g == NULL)
dda8d76d 7754 i = filedata->file_header.e_shnum;
4082ef84 7755 }
e4b17d5c 7756 }
18bd398b 7757 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
579f31ac 7758 {
18bd398b 7759 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
579f31ac
JJ
7760 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
7761 suffix = SECTION_NAME (unwsec) + len;
dda8d76d 7762 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum;
579f31ac 7763 ++i, ++sec)
18bd398b
NC
7764 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
7765 && streq (SECTION_NAME (sec) + len2, suffix))
579f31ac
JJ
7766 break;
7767 }
7768 else
7769 {
7770 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
18bd398b 7771 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
579f31ac
JJ
7772 len = sizeof (ELF_STRING_ia64_unwind) - 1;
7773 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
7774 suffix = "";
18bd398b 7775 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
579f31ac 7776 suffix = SECTION_NAME (unwsec) + len;
dda8d76d 7777 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum;
579f31ac 7778 ++i, ++sec)
18bd398b
NC
7779 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
7780 && streq (SECTION_NAME (sec) + len2, suffix))
579f31ac
JJ
7781 break;
7782 }
7783
dda8d76d 7784 if (i == filedata->file_header.e_shnum)
579f31ac
JJ
7785 {
7786 printf (_("\nCould not find unwind info section for "));
7787
dda8d76d 7788 if (filedata->string_table == NULL)
579f31ac
JJ
7789 printf ("%d", unwsec->sh_name);
7790 else
dda8d76d 7791 printf ("'%s'", printable_section_name (filedata, unwsec));
579f31ac
JJ
7792 }
7793 else
4d6ed7c8 7794 {
4d6ed7c8 7795 aux.info_addr = sec->sh_addr;
dda8d76d 7796 aux.info = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1,
4082ef84
NC
7797 sec->sh_size,
7798 _("unwind info"));
59245841 7799 aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
4d6ed7c8 7800
579f31ac 7801 printf (_("\nUnwind section "));
4d6ed7c8 7802
dda8d76d 7803 if (filedata->string_table == NULL)
579f31ac
JJ
7804 printf ("%d", unwsec->sh_name);
7805 else
dda8d76d 7806 printf ("'%s'", printable_section_name (filedata, unwsec));
4d6ed7c8 7807
579f31ac 7808 printf (_(" at offset 0x%lx contains %lu entries:\n"),
e59b4dfb 7809 (unsigned long) unwsec->sh_offset,
89fac5e3 7810 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
4d6ed7c8 7811
dda8d76d 7812 if (slurp_ia64_unwind_table (filedata, & aux, unwsec)
53774b7e 7813 && aux.table_len > 0)
dda8d76d 7814 dump_ia64_unwind (filedata, & aux);
579f31ac
JJ
7815
7816 if (aux.table)
7817 free ((char *) aux.table);
7818 if (aux.info)
7819 free ((char *) aux.info);
7820 aux.table = NULL;
7821 aux.info = NULL;
7822 }
4d6ed7c8 7823 }
4d6ed7c8 7824
4d6ed7c8
NC
7825 if (aux.symtab)
7826 free (aux.symtab);
7827 if (aux.strtab)
7828 free ((char *) aux.strtab);
32ec8896
NC
7829
7830 return res;
4d6ed7c8
NC
7831}
7832
3f5e193b 7833struct hppa_unw_table_entry
32ec8896
NC
7834{
7835 struct absaddr start;
7836 struct absaddr end;
7837 unsigned int Cannot_unwind:1; /* 0 */
7838 unsigned int Millicode:1; /* 1 */
7839 unsigned int Millicode_save_sr0:1; /* 2 */
7840 unsigned int Region_description:2; /* 3..4 */
7841 unsigned int reserved1:1; /* 5 */
7842 unsigned int Entry_SR:1; /* 6 */
7843 unsigned int Entry_FR:4; /* Number saved 7..10 */
7844 unsigned int Entry_GR:5; /* Number saved 11..15 */
7845 unsigned int Args_stored:1; /* 16 */
7846 unsigned int Variable_Frame:1; /* 17 */
7847 unsigned int Separate_Package_Body:1; /* 18 */
7848 unsigned int Frame_Extension_Millicode:1; /* 19 */
7849 unsigned int Stack_Overflow_Check:1; /* 20 */
7850 unsigned int Two_Instruction_SP_Increment:1; /* 21 */
7851 unsigned int Ada_Region:1; /* 22 */
7852 unsigned int cxx_info:1; /* 23 */
7853 unsigned int cxx_try_catch:1; /* 24 */
7854 unsigned int sched_entry_seq:1; /* 25 */
7855 unsigned int reserved2:1; /* 26 */
7856 unsigned int Save_SP:1; /* 27 */
7857 unsigned int Save_RP:1; /* 28 */
7858 unsigned int Save_MRP_in_frame:1; /* 29 */
7859 unsigned int extn_ptr_defined:1; /* 30 */
7860 unsigned int Cleanup_defined:1; /* 31 */
7861
7862 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
7863 unsigned int HP_UX_interrupt_marker:1; /* 1 */
7864 unsigned int Large_frame:1; /* 2 */
7865 unsigned int Pseudo_SP_Set:1; /* 3 */
7866 unsigned int reserved4:1; /* 4 */
7867 unsigned int Total_frame_size:27; /* 5..31 */
7868};
3f5e193b 7869
57346661 7870struct hppa_unw_aux_info
948f632f 7871{
32ec8896
NC
7872 struct hppa_unw_table_entry * table; /* Unwind table. */
7873 unsigned long table_len; /* Length of unwind table. */
7874 bfd_vma seg_base; /* Starting address of segment. */
7875 Elf_Internal_Sym * symtab; /* The symbol table. */
7876 unsigned long nsyms; /* Number of symbols. */
7877 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7878 unsigned long nfuns; /* Number of entries in funtab. */
7879 char * strtab; /* The string table. */
7880 unsigned long strtab_size; /* Size of string table. */
948f632f 7881};
57346661 7882
32ec8896 7883static bfd_boolean
dda8d76d 7884dump_hppa_unwind (Filedata * filedata, struct hppa_unw_aux_info * aux)
57346661 7885{
2cf0635d 7886 struct hppa_unw_table_entry * tp;
948f632f 7887 unsigned long j, nfuns;
32ec8896 7888 bfd_boolean res = TRUE;
948f632f
DA
7889
7890 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7891 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7892 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7893 aux->funtab[nfuns++] = aux->symtab[j];
7894 aux->nfuns = nfuns;
7895 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
57346661 7896
57346661
AM
7897 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7898 {
7899 bfd_vma offset;
2cf0635d 7900 const char * procname;
57346661 7901
dda8d76d 7902 find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
57346661
AM
7903 aux->strtab_size, tp->start, &procname,
7904 &offset);
7905
7906 fputs ("\n<", stdout);
7907
7908 if (procname)
7909 {
7910 fputs (procname, stdout);
7911
7912 if (offset)
7913 printf ("+%lx", (unsigned long) offset);
7914 }
7915
7916 fputs (">: [", stdout);
7917 print_vma (tp->start.offset, PREFIX_HEX);
7918 fputc ('-', stdout);
7919 print_vma (tp->end.offset, PREFIX_HEX);
7920 printf ("]\n\t");
7921
18bd398b
NC
7922#define PF(_m) if (tp->_m) printf (#_m " ");
7923#define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
57346661
AM
7924 PF(Cannot_unwind);
7925 PF(Millicode);
7926 PF(Millicode_save_sr0);
18bd398b 7927 /* PV(Region_description); */
57346661
AM
7928 PF(Entry_SR);
7929 PV(Entry_FR);
7930 PV(Entry_GR);
7931 PF(Args_stored);
7932 PF(Variable_Frame);
7933 PF(Separate_Package_Body);
7934 PF(Frame_Extension_Millicode);
7935 PF(Stack_Overflow_Check);
7936 PF(Two_Instruction_SP_Increment);
7937 PF(Ada_Region);
7938 PF(cxx_info);
7939 PF(cxx_try_catch);
7940 PF(sched_entry_seq);
7941 PF(Save_SP);
7942 PF(Save_RP);
7943 PF(Save_MRP_in_frame);
7944 PF(extn_ptr_defined);
7945 PF(Cleanup_defined);
7946 PF(MPE_XL_interrupt_marker);
7947 PF(HP_UX_interrupt_marker);
7948 PF(Large_frame);
7949 PF(Pseudo_SP_Set);
7950 PV(Total_frame_size);
7951#undef PF
7952#undef PV
7953 }
7954
18bd398b 7955 printf ("\n");
948f632f
DA
7956
7957 free (aux->funtab);
32ec8896
NC
7958
7959 return res;
57346661
AM
7960}
7961
32ec8896 7962static bfd_boolean
dda8d76d
NC
7963slurp_hppa_unwind_table (Filedata * filedata,
7964 struct hppa_unw_aux_info * aux,
7965 Elf_Internal_Shdr * sec)
57346661 7966{
1c0751b2 7967 unsigned long size, unw_ent_size, nentries, nrelas, i;
2cf0635d
NC
7968 Elf_Internal_Phdr * seg;
7969 struct hppa_unw_table_entry * tep;
7970 Elf_Internal_Shdr * relsec;
7971 Elf_Internal_Rela * rela;
7972 Elf_Internal_Rela * rp;
7973 unsigned char * table;
7974 unsigned char * tp;
7975 Elf_Internal_Sym * sym;
7976 const char * relname;
57346661 7977
57346661
AM
7978 /* First, find the starting address of the segment that includes
7979 this section. */
dda8d76d 7980 if (filedata->file_header.e_phnum)
57346661 7981 {
dda8d76d 7982 if (! get_program_headers (filedata))
32ec8896 7983 return FALSE;
57346661 7984
dda8d76d
NC
7985 for (seg = filedata->program_headers;
7986 seg < filedata->program_headers + filedata->file_header.e_phnum;
57346661
AM
7987 ++seg)
7988 {
7989 if (seg->p_type != PT_LOAD)
7990 continue;
7991
7992 if (sec->sh_addr >= seg->p_vaddr
7993 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7994 {
7995 aux->seg_base = seg->p_vaddr;
7996 break;
7997 }
7998 }
7999 }
8000
8001 /* Second, build the unwind table from the contents of the unwind
8002 section. */
8003 size = sec->sh_size;
dda8d76d 8004 table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
3f5e193b 8005 _("unwind table"));
57346661 8006 if (!table)
32ec8896 8007 return FALSE;
57346661 8008
1c0751b2
DA
8009 unw_ent_size = 16;
8010 nentries = size / unw_ent_size;
8011 size = unw_ent_size * nentries;
57346661 8012
3f5e193b
NC
8013 tep = aux->table = (struct hppa_unw_table_entry *)
8014 xcmalloc (nentries, sizeof (aux->table[0]));
57346661 8015
1c0751b2 8016 for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
57346661
AM
8017 {
8018 unsigned int tmp1, tmp2;
8019
8020 tep->start.section = SHN_UNDEF;
8021 tep->end.section = SHN_UNDEF;
8022
1c0751b2
DA
8023 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
8024 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
8025 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
8026 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
8027
8028 tep->start.offset += aux->seg_base;
8029 tep->end.offset += aux->seg_base;
57346661
AM
8030
8031 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
8032 tep->Millicode = (tmp1 >> 30) & 0x1;
8033 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
8034 tep->Region_description = (tmp1 >> 27) & 0x3;
8035 tep->reserved1 = (tmp1 >> 26) & 0x1;
8036 tep->Entry_SR = (tmp1 >> 25) & 0x1;
8037 tep->Entry_FR = (tmp1 >> 21) & 0xf;
8038 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
8039 tep->Args_stored = (tmp1 >> 15) & 0x1;
8040 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
8041 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
8042 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
8043 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
8044 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
8045 tep->Ada_Region = (tmp1 >> 9) & 0x1;
8046 tep->cxx_info = (tmp1 >> 8) & 0x1;
8047 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
8048 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
8049 tep->reserved2 = (tmp1 >> 5) & 0x1;
8050 tep->Save_SP = (tmp1 >> 4) & 0x1;
8051 tep->Save_RP = (tmp1 >> 3) & 0x1;
8052 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
8053 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
8054 tep->Cleanup_defined = tmp1 & 0x1;
8055
8056 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
8057 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
8058 tep->Large_frame = (tmp2 >> 29) & 0x1;
8059 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
8060 tep->reserved4 = (tmp2 >> 27) & 0x1;
8061 tep->Total_frame_size = tmp2 & 0x7ffffff;
57346661
AM
8062 }
8063 free (table);
8064
8065 /* Third, apply any relocations to the unwind table. */
dda8d76d
NC
8066 for (relsec = filedata->section_headers;
8067 relsec < filedata->section_headers + filedata->file_header.e_shnum;
57346661
AM
8068 ++relsec)
8069 {
8070 if (relsec->sh_type != SHT_RELA
dda8d76d
NC
8071 || relsec->sh_info >= filedata->file_header.e_shnum
8072 || filedata->section_headers + relsec->sh_info != sec)
57346661
AM
8073 continue;
8074
dda8d76d 8075 if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
57346661 8076 & rela, & nrelas))
32ec8896 8077 return FALSE;
57346661
AM
8078
8079 for (rp = rela; rp < rela + nrelas; ++rp)
8080 {
4770fb94 8081 unsigned int sym_ndx;
726bd37d
AM
8082 unsigned int r_type = get_reloc_type (filedata, rp->r_info);
8083 relname = elf_hppa_reloc_type (r_type);
57346661 8084
726bd37d
AM
8085 if (relname == NULL)
8086 {
8087 warn (_("Skipping unknown relocation type: %u\n"), r_type);
8088 continue;
8089 }
8090
57346661 8091 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
0112cd26 8092 if (! const_strneq (relname, "R_PARISC_SEGREL"))
57346661 8093 {
726bd37d 8094 warn (_("Skipping unexpected relocation type: %s\n"), relname);
57346661
AM
8095 continue;
8096 }
8097
8098 i = rp->r_offset / unw_ent_size;
726bd37d
AM
8099 if (i >= aux->table_len)
8100 {
8101 warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
8102 continue;
8103 }
57346661 8104
4770fb94
AM
8105 sym_ndx = get_reloc_symindex (rp->r_info);
8106 if (sym_ndx >= aux->nsyms)
8107 {
8108 warn (_("Skipping reloc with invalid symbol index: %u\n"),
8109 sym_ndx);
8110 continue;
8111 }
8112 sym = aux->symtab + sym_ndx;
8113
43f6cd05 8114 switch ((rp->r_offset % unw_ent_size) / 4)
57346661
AM
8115 {
8116 case 0:
8117 aux->table[i].start.section = sym->st_shndx;
1e456d54 8118 aux->table[i].start.offset = sym->st_value + rp->r_addend;
57346661
AM
8119 break;
8120 case 1:
8121 aux->table[i].end.section = sym->st_shndx;
1e456d54 8122 aux->table[i].end.offset = sym->st_value + rp->r_addend;
57346661
AM
8123 break;
8124 default:
8125 break;
8126 }
8127 }
8128
8129 free (rela);
8130 }
8131
1c0751b2 8132 aux->table_len = nentries;
57346661 8133
32ec8896 8134 return TRUE;
57346661
AM
8135}
8136
32ec8896 8137static bfd_boolean
dda8d76d 8138hppa_process_unwind (Filedata * filedata)
57346661 8139{
57346661 8140 struct hppa_unw_aux_info aux;
2cf0635d
NC
8141 Elf_Internal_Shdr * unwsec = NULL;
8142 Elf_Internal_Shdr * strsec;
8143 Elf_Internal_Shdr * sec;
18bd398b 8144 unsigned long i;
32ec8896 8145 bfd_boolean res = TRUE;
57346661 8146
dda8d76d 8147 if (filedata->string_table == NULL)
32ec8896 8148 return FALSE;
1b31d05e
NC
8149
8150 memset (& aux, 0, sizeof (aux));
57346661 8151
dda8d76d 8152 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
57346661 8153 {
c256ffe7 8154 if (sec->sh_type == SHT_SYMTAB
dda8d76d 8155 && sec->sh_link < filedata->file_header.e_shnum)
57346661 8156 {
dda8d76d 8157 aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
57346661 8158
dda8d76d 8159 strsec = filedata->section_headers + sec->sh_link;
4082ef84
NC
8160 if (aux.strtab != NULL)
8161 {
8162 error (_("Multiple auxillary string tables encountered\n"));
8163 free (aux.strtab);
32ec8896 8164 res = FALSE;
4082ef84 8165 }
dda8d76d 8166 aux.strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
3f5e193b
NC
8167 1, strsec->sh_size,
8168 _("string table"));
c256ffe7 8169 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
57346661 8170 }
18bd398b 8171 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
57346661
AM
8172 unwsec = sec;
8173 }
8174
8175 if (!unwsec)
8176 printf (_("\nThere are no unwind sections in this file.\n"));
8177
dda8d76d 8178 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
57346661 8179 {
18bd398b 8180 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
57346661 8181 {
43f6cd05 8182 unsigned long num_unwind = sec->sh_size / 16;
dda8d76d 8183
d3a49aa8
AM
8184 printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
8185 "contains %lu entry:\n",
8186 "\nUnwind section '%s' at offset 0x%lx "
8187 "contains %lu entries:\n",
8188 num_unwind),
dda8d76d 8189 printable_section_name (filedata, sec),
57346661 8190 (unsigned long) sec->sh_offset,
d3a49aa8 8191 num_unwind);
57346661 8192
dda8d76d 8193 if (! slurp_hppa_unwind_table (filedata, &aux, sec))
32ec8896 8194 res = FALSE;
66b09c7e
S
8195
8196 if (res && aux.table_len > 0)
32ec8896 8197 {
dda8d76d 8198 if (! dump_hppa_unwind (filedata, &aux))
32ec8896
NC
8199 res = FALSE;
8200 }
57346661
AM
8201
8202 if (aux.table)
8203 free ((char *) aux.table);
8204 aux.table = NULL;
8205 }
8206 }
8207
8208 if (aux.symtab)
8209 free (aux.symtab);
8210 if (aux.strtab)
8211 free ((char *) aux.strtab);
32ec8896
NC
8212
8213 return res;
57346661
AM
8214}
8215
0b6ae522
DJ
8216struct arm_section
8217{
a734115a
NC
8218 unsigned char * data; /* The unwind data. */
8219 Elf_Internal_Shdr * sec; /* The cached unwind section header. */
8220 Elf_Internal_Rela * rela; /* The cached relocations for this section. */
8221 unsigned long nrelas; /* The number of relocations. */
8222 unsigned int rel_type; /* REL or RELA ? */
8223 Elf_Internal_Rela * next_rela; /* Cyclic pointer to the next reloc to process. */
0b6ae522
DJ
8224};
8225
8226struct arm_unw_aux_info
8227{
dda8d76d 8228 Filedata * filedata; /* The file containing the unwind sections. */
a734115a
NC
8229 Elf_Internal_Sym * symtab; /* The file's symbol table. */
8230 unsigned long nsyms; /* Number of symbols. */
948f632f
DA
8231 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
8232 unsigned long nfuns; /* Number of these symbols. */
a734115a
NC
8233 char * strtab; /* The file's string table. */
8234 unsigned long strtab_size; /* Size of string table. */
0b6ae522
DJ
8235};
8236
8237static const char *
dda8d76d
NC
8238arm_print_vma_and_name (Filedata * filedata,
8239 struct arm_unw_aux_info * aux,
8240 bfd_vma fn,
8241 struct absaddr addr)
0b6ae522
DJ
8242{
8243 const char *procname;
8244 bfd_vma sym_offset;
8245
8246 if (addr.section == SHN_UNDEF)
8247 addr.offset = fn;
8248
dda8d76d 8249 find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
0b6ae522
DJ
8250 aux->strtab_size, addr, &procname,
8251 &sym_offset);
8252
8253 print_vma (fn, PREFIX_HEX);
8254
8255 if (procname)
8256 {
8257 fputs (" <", stdout);
8258 fputs (procname, stdout);
8259
8260 if (sym_offset)
8261 printf ("+0x%lx", (unsigned long) sym_offset);
8262 fputc ('>', stdout);
8263 }
8264
8265 return procname;
8266}
8267
8268static void
8269arm_free_section (struct arm_section *arm_sec)
8270{
8271 if (arm_sec->data != NULL)
8272 free (arm_sec->data);
8273
8274 if (arm_sec->rela != NULL)
8275 free (arm_sec->rela);
8276}
8277
a734115a
NC
8278/* 1) If SEC does not match the one cached in ARM_SEC, then free the current
8279 cached section and install SEC instead.
8280 2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
8281 and return its valued in * WORDP, relocating if necessary.
1b31d05e 8282 3) Update the NEXT_RELA field in ARM_SEC and store the section index and
a734115a 8283 relocation's offset in ADDR.
1b31d05e
NC
8284 4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
8285 into the string table of the symbol associated with the reloc. If no
8286 reloc was applied store -1 there.
8287 5) Return TRUE upon success, FALSE otherwise. */
a734115a
NC
8288
8289static bfd_boolean
dda8d76d
NC
8290get_unwind_section_word (Filedata * filedata,
8291 struct arm_unw_aux_info * aux,
1b31d05e
NC
8292 struct arm_section * arm_sec,
8293 Elf_Internal_Shdr * sec,
8294 bfd_vma word_offset,
8295 unsigned int * wordp,
8296 struct absaddr * addr,
8297 bfd_vma * sym_name)
0b6ae522
DJ
8298{
8299 Elf_Internal_Rela *rp;
8300 Elf_Internal_Sym *sym;
8301 const char * relname;
8302 unsigned int word;
8303 bfd_boolean wrapped;
8304
e0a31db1
NC
8305 if (sec == NULL || arm_sec == NULL)
8306 return FALSE;
8307
0b6ae522
DJ
8308 addr->section = SHN_UNDEF;
8309 addr->offset = 0;
8310
1b31d05e
NC
8311 if (sym_name != NULL)
8312 *sym_name = (bfd_vma) -1;
8313
a734115a 8314 /* If necessary, update the section cache. */
0b6ae522
DJ
8315 if (sec != arm_sec->sec)
8316 {
8317 Elf_Internal_Shdr *relsec;
8318
8319 arm_free_section (arm_sec);
8320
8321 arm_sec->sec = sec;
dda8d76d 8322 arm_sec->data = get_data (NULL, aux->filedata, sec->sh_offset, 1,
0b6ae522 8323 sec->sh_size, _("unwind data"));
0b6ae522
DJ
8324 arm_sec->rela = NULL;
8325 arm_sec->nrelas = 0;
8326
dda8d76d
NC
8327 for (relsec = filedata->section_headers;
8328 relsec < filedata->section_headers + filedata->file_header.e_shnum;
0b6ae522
DJ
8329 ++relsec)
8330 {
dda8d76d
NC
8331 if (relsec->sh_info >= filedata->file_header.e_shnum
8332 || filedata->section_headers + relsec->sh_info != sec
1ae40aa4
NC
8333 /* PR 15745: Check the section type as well. */
8334 || (relsec->sh_type != SHT_REL
8335 && relsec->sh_type != SHT_RELA))
0b6ae522
DJ
8336 continue;
8337
a734115a 8338 arm_sec->rel_type = relsec->sh_type;
0b6ae522
DJ
8339 if (relsec->sh_type == SHT_REL)
8340 {
dda8d76d 8341 if (!slurp_rel_relocs (aux->filedata, relsec->sh_offset,
0b6ae522
DJ
8342 relsec->sh_size,
8343 & arm_sec->rela, & arm_sec->nrelas))
a734115a 8344 return FALSE;
0b6ae522 8345 }
1ae40aa4 8346 else /* relsec->sh_type == SHT_RELA */
0b6ae522 8347 {
dda8d76d 8348 if (!slurp_rela_relocs (aux->filedata, relsec->sh_offset,
0b6ae522
DJ
8349 relsec->sh_size,
8350 & arm_sec->rela, & arm_sec->nrelas))
a734115a 8351 return FALSE;
0b6ae522 8352 }
1ae40aa4 8353 break;
0b6ae522
DJ
8354 }
8355
8356 arm_sec->next_rela = arm_sec->rela;
8357 }
8358
a734115a 8359 /* If there is no unwind data we can do nothing. */
0b6ae522 8360 if (arm_sec->data == NULL)
a734115a 8361 return FALSE;
0b6ae522 8362
e0a31db1 8363 /* If the offset is invalid then fail. */
f32ba729
NC
8364 if (/* PR 21343 *//* PR 18879 */
8365 sec->sh_size < 4
8366 || word_offset > (sec->sh_size - 4)
1a915552 8367 || ((bfd_signed_vma) word_offset) < 0)
e0a31db1
NC
8368 return FALSE;
8369
a734115a 8370 /* Get the word at the required offset. */
0b6ae522
DJ
8371 word = byte_get (arm_sec->data + word_offset, 4);
8372
0eff7165
NC
8373 /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128. */
8374 if (arm_sec->rela == NULL)
8375 {
8376 * wordp = word;
8377 return TRUE;
8378 }
8379
a734115a 8380 /* Look through the relocs to find the one that applies to the provided offset. */
0b6ae522
DJ
8381 wrapped = FALSE;
8382 for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
8383 {
8384 bfd_vma prelval, offset;
8385
8386 if (rp->r_offset > word_offset && !wrapped)
8387 {
8388 rp = arm_sec->rela;
8389 wrapped = TRUE;
8390 }
8391 if (rp->r_offset > word_offset)
8392 break;
8393
8394 if (rp->r_offset & 3)
8395 {
8396 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
8397 (unsigned long) rp->r_offset);
8398 continue;
8399 }
8400
8401 if (rp->r_offset < word_offset)
8402 continue;
8403
74e1a04b
NC
8404 /* PR 17531: file: 027-161405-0.004 */
8405 if (aux->symtab == NULL)
8406 continue;
8407
0b6ae522
DJ
8408 if (arm_sec->rel_type == SHT_REL)
8409 {
8410 offset = word & 0x7fffffff;
8411 if (offset & 0x40000000)
8412 offset |= ~ (bfd_vma) 0x7fffffff;
8413 }
a734115a 8414 else if (arm_sec->rel_type == SHT_RELA)
0b6ae522 8415 offset = rp->r_addend;
a734115a 8416 else
74e1a04b
NC
8417 {
8418 error (_("Unknown section relocation type %d encountered\n"),
8419 arm_sec->rel_type);
8420 break;
8421 }
0b6ae522 8422
071436c6
NC
8423 /* PR 17531 file: 027-1241568-0.004. */
8424 if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
8425 {
8426 error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
8427 (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
8428 break;
8429 }
8430
8431 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
0b6ae522
DJ
8432 offset += sym->st_value;
8433 prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
8434
a734115a 8435 /* Check that we are processing the expected reloc type. */
dda8d76d 8436 if (filedata->file_header.e_machine == EM_ARM)
a734115a
NC
8437 {
8438 relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
071436c6
NC
8439 if (relname == NULL)
8440 {
8441 warn (_("Skipping unknown ARM relocation type: %d\n"),
8442 (int) ELF32_R_TYPE (rp->r_info));
8443 continue;
8444 }
a734115a
NC
8445
8446 if (streq (relname, "R_ARM_NONE"))
8447 continue;
0b4362b0 8448
a734115a
NC
8449 if (! streq (relname, "R_ARM_PREL31"))
8450 {
071436c6 8451 warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
a734115a
NC
8452 continue;
8453 }
8454 }
dda8d76d 8455 else if (filedata->file_header.e_machine == EM_TI_C6000)
a734115a
NC
8456 {
8457 relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
071436c6
NC
8458 if (relname == NULL)
8459 {
8460 warn (_("Skipping unknown C6000 relocation type: %d\n"),
8461 (int) ELF32_R_TYPE (rp->r_info));
8462 continue;
8463 }
0b4362b0 8464
a734115a
NC
8465 if (streq (relname, "R_C6000_NONE"))
8466 continue;
8467
8468 if (! streq (relname, "R_C6000_PREL31"))
8469 {
071436c6 8470 warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
a734115a
NC
8471 continue;
8472 }
8473
8474 prelval >>= 1;
8475 }
8476 else
74e1a04b
NC
8477 {
8478 /* This function currently only supports ARM and TI unwinders. */
8479 warn (_("Only TI and ARM unwinders are currently supported\n"));
8480 break;
8481 }
fa197c1c 8482
0b6ae522
DJ
8483 word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
8484 addr->section = sym->st_shndx;
8485 addr->offset = offset;
74e1a04b 8486
1b31d05e
NC
8487 if (sym_name)
8488 * sym_name = sym->st_name;
0b6ae522
DJ
8489 break;
8490 }
8491
8492 *wordp = word;
8493 arm_sec->next_rela = rp;
8494
a734115a 8495 return TRUE;
0b6ae522
DJ
8496}
8497
a734115a
NC
8498static const char *tic6x_unwind_regnames[16] =
8499{
0b4362b0
RM
8500 "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
8501 "A14", "A13", "A12", "A11", "A10",
a734115a
NC
8502 "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
8503};
fa197c1c 8504
0b6ae522 8505static void
fa197c1c 8506decode_tic6x_unwind_regmask (unsigned int mask)
0b6ae522 8507{
fa197c1c
PB
8508 int i;
8509
8510 for (i = 12; mask; mask >>= 1, i--)
8511 {
8512 if (mask & 1)
8513 {
8514 fputs (tic6x_unwind_regnames[i], stdout);
8515 if (mask > 1)
8516 fputs (", ", stdout);
8517 }
8518 }
8519}
0b6ae522
DJ
8520
8521#define ADVANCE \
8522 if (remaining == 0 && more_words) \
8523 { \
8524 data_offset += 4; \
dda8d76d 8525 if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec, \
1b31d05e 8526 data_offset, & word, & addr, NULL)) \
32ec8896 8527 return FALSE; \
0b6ae522
DJ
8528 remaining = 4; \
8529 more_words--; \
8530 } \
8531
8532#define GET_OP(OP) \
8533 ADVANCE; \
8534 if (remaining) \
8535 { \
8536 remaining--; \
8537 (OP) = word >> 24; \
8538 word <<= 8; \
8539 } \
8540 else \
8541 { \
2b692964 8542 printf (_("[Truncated opcode]\n")); \
32ec8896 8543 return FALSE; \
0b6ae522 8544 } \
cc5914eb 8545 printf ("0x%02x ", OP)
0b6ae522 8546
32ec8896 8547static bfd_boolean
dda8d76d
NC
8548decode_arm_unwind_bytecode (Filedata * filedata,
8549 struct arm_unw_aux_info * aux,
948f632f
DA
8550 unsigned int word,
8551 unsigned int remaining,
8552 unsigned int more_words,
8553 bfd_vma data_offset,
8554 Elf_Internal_Shdr * data_sec,
8555 struct arm_section * data_arm_sec)
fa197c1c
PB
8556{
8557 struct absaddr addr;
32ec8896 8558 bfd_boolean res = TRUE;
0b6ae522
DJ
8559
8560 /* Decode the unwinding instructions. */
8561 while (1)
8562 {
8563 unsigned int op, op2;
8564
8565 ADVANCE;
8566 if (remaining == 0)
8567 break;
8568 remaining--;
8569 op = word >> 24;
8570 word <<= 8;
8571
cc5914eb 8572 printf (" 0x%02x ", op);
0b6ae522
DJ
8573
8574 if ((op & 0xc0) == 0x00)
8575 {
8576 int offset = ((op & 0x3f) << 2) + 4;
61865e30 8577
cc5914eb 8578 printf (" vsp = vsp + %d", offset);
0b6ae522
DJ
8579 }
8580 else if ((op & 0xc0) == 0x40)
8581 {
8582 int offset = ((op & 0x3f) << 2) + 4;
61865e30 8583
cc5914eb 8584 printf (" vsp = vsp - %d", offset);
0b6ae522
DJ
8585 }
8586 else if ((op & 0xf0) == 0x80)
8587 {
8588 GET_OP (op2);
8589 if (op == 0x80 && op2 == 0)
8590 printf (_("Refuse to unwind"));
8591 else
8592 {
8593 unsigned int mask = ((op & 0x0f) << 8) | op2;
32ec8896 8594 bfd_boolean first = TRUE;
0b6ae522 8595 int i;
2b692964 8596
0b6ae522
DJ
8597 printf ("pop {");
8598 for (i = 0; i < 12; i++)
8599 if (mask & (1 << i))
8600 {
8601 if (first)
32ec8896 8602 first = FALSE;
0b6ae522
DJ
8603 else
8604 printf (", ");
8605 printf ("r%d", 4 + i);
8606 }
8607 printf ("}");
8608 }
8609 }
8610 else if ((op & 0xf0) == 0x90)
8611 {
8612 if (op == 0x9d || op == 0x9f)
8613 printf (_(" [Reserved]"));
8614 else
cc5914eb 8615 printf (" vsp = r%d", op & 0x0f);
0b6ae522
DJ
8616 }
8617 else if ((op & 0xf0) == 0xa0)
8618 {
8619 int end = 4 + (op & 0x07);
32ec8896 8620 bfd_boolean first = TRUE;
0b6ae522 8621 int i;
61865e30 8622
0b6ae522
DJ
8623 printf (" pop {");
8624 for (i = 4; i <= end; i++)
8625 {
8626 if (first)
32ec8896 8627 first = FALSE;
0b6ae522
DJ
8628 else
8629 printf (", ");
8630 printf ("r%d", i);
8631 }
8632 if (op & 0x08)
8633 {
1b31d05e 8634 if (!first)
0b6ae522
DJ
8635 printf (", ");
8636 printf ("r14");
8637 }
8638 printf ("}");
8639 }
8640 else if (op == 0xb0)
8641 printf (_(" finish"));
8642 else if (op == 0xb1)
8643 {
8644 GET_OP (op2);
8645 if (op2 == 0 || (op2 & 0xf0) != 0)
8646 printf (_("[Spare]"));
8647 else
8648 {
8649 unsigned int mask = op2 & 0x0f;
32ec8896 8650 bfd_boolean first = TRUE;
0b6ae522 8651 int i;
61865e30 8652
0b6ae522
DJ
8653 printf ("pop {");
8654 for (i = 0; i < 12; i++)
8655 if (mask & (1 << i))
8656 {
8657 if (first)
32ec8896 8658 first = FALSE;
0b6ae522
DJ
8659 else
8660 printf (", ");
8661 printf ("r%d", i);
8662 }
8663 printf ("}");
8664 }
8665 }
8666 else if (op == 0xb2)
8667 {
b115cf96 8668 unsigned char buf[9];
0b6ae522
DJ
8669 unsigned int i, len;
8670 unsigned long offset;
61865e30 8671
b115cf96 8672 for (i = 0; i < sizeof (buf); i++)
0b6ae522
DJ
8673 {
8674 GET_OP (buf[i]);
8675 if ((buf[i] & 0x80) == 0)
8676 break;
8677 }
4082ef84 8678 if (i == sizeof (buf))
32ec8896
NC
8679 {
8680 error (_("corrupt change to vsp"));
8681 res = FALSE;
8682 }
4082ef84
NC
8683 else
8684 {
8685 offset = read_uleb128 (buf, &len, buf + i + 1);
8686 assert (len == i + 1);
8687 offset = offset * 4 + 0x204;
8688 printf ("vsp = vsp + %ld", offset);
8689 }
0b6ae522 8690 }
61865e30 8691 else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
0b6ae522 8692 {
61865e30
NC
8693 unsigned int first, last;
8694
8695 GET_OP (op2);
8696 first = op2 >> 4;
8697 last = op2 & 0x0f;
8698 if (op == 0xc8)
8699 first = first + 16;
8700 printf ("pop {D%d", first);
8701 if (last)
8702 printf ("-D%d", first + last);
8703 printf ("}");
8704 }
8705 else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
8706 {
8707 unsigned int count = op & 0x07;
8708
8709 printf ("pop {D8");
8710 if (count)
8711 printf ("-D%d", 8 + count);
8712 printf ("}");
8713 }
8714 else if (op >= 0xc0 && op <= 0xc5)
8715 {
8716 unsigned int count = op & 0x07;
8717
8718 printf (" pop {wR10");
8719 if (count)
8720 printf ("-wR%d", 10 + count);
8721 printf ("}");
8722 }
8723 else if (op == 0xc6)
8724 {
8725 unsigned int first, last;
8726
8727 GET_OP (op2);
8728 first = op2 >> 4;
8729 last = op2 & 0x0f;
8730 printf ("pop {wR%d", first);
8731 if (last)
8732 printf ("-wR%d", first + last);
8733 printf ("}");
8734 }
8735 else if (op == 0xc7)
8736 {
8737 GET_OP (op2);
8738 if (op2 == 0 || (op2 & 0xf0) != 0)
8739 printf (_("[Spare]"));
0b6ae522
DJ
8740 else
8741 {
61865e30 8742 unsigned int mask = op2 & 0x0f;
32ec8896 8743 bfd_boolean first = TRUE;
61865e30
NC
8744 int i;
8745
8746 printf ("pop {");
8747 for (i = 0; i < 4; i++)
8748 if (mask & (1 << i))
8749 {
8750 if (first)
32ec8896 8751 first = FALSE;
61865e30
NC
8752 else
8753 printf (", ");
8754 printf ("wCGR%d", i);
8755 }
8756 printf ("}");
0b6ae522
DJ
8757 }
8758 }
61865e30 8759 else
32ec8896
NC
8760 {
8761 printf (_(" [unsupported opcode]"));
8762 res = FALSE;
8763 }
8764
0b6ae522
DJ
8765 printf ("\n");
8766 }
32ec8896
NC
8767
8768 return res;
fa197c1c
PB
8769}
8770
32ec8896 8771static bfd_boolean
dda8d76d
NC
8772decode_tic6x_unwind_bytecode (Filedata * filedata,
8773 struct arm_unw_aux_info * aux,
948f632f
DA
8774 unsigned int word,
8775 unsigned int remaining,
8776 unsigned int more_words,
8777 bfd_vma data_offset,
8778 Elf_Internal_Shdr * data_sec,
8779 struct arm_section * data_arm_sec)
fa197c1c
PB
8780{
8781 struct absaddr addr;
8782
8783 /* Decode the unwinding instructions. */
8784 while (1)
8785 {
8786 unsigned int op, op2;
8787
8788 ADVANCE;
8789 if (remaining == 0)
8790 break;
8791 remaining--;
8792 op = word >> 24;
8793 word <<= 8;
8794
9cf03b7e 8795 printf (" 0x%02x ", op);
fa197c1c
PB
8796
8797 if ((op & 0xc0) == 0x00)
8798 {
8799 int offset = ((op & 0x3f) << 3) + 8;
9cf03b7e 8800 printf (" sp = sp + %d", offset);
fa197c1c
PB
8801 }
8802 else if ((op & 0xc0) == 0x80)
8803 {
8804 GET_OP (op2);
8805 if (op == 0x80 && op2 == 0)
8806 printf (_("Refuse to unwind"));
8807 else
8808 {
8809 unsigned int mask = ((op & 0x1f) << 8) | op2;
8810 if (op & 0x20)
8811 printf ("pop compact {");
8812 else
8813 printf ("pop {");
8814
8815 decode_tic6x_unwind_regmask (mask);
8816 printf("}");
8817 }
8818 }
8819 else if ((op & 0xf0) == 0xc0)
8820 {
8821 unsigned int reg;
8822 unsigned int nregs;
8823 unsigned int i;
8824 const char *name;
a734115a
NC
8825 struct
8826 {
32ec8896
NC
8827 unsigned int offset;
8828 unsigned int reg;
fa197c1c
PB
8829 } regpos[16];
8830
8831 /* Scan entire instruction first so that GET_OP output is not
8832 interleaved with disassembly. */
8833 nregs = 0;
8834 for (i = 0; nregs < (op & 0xf); i++)
8835 {
8836 GET_OP (op2);
8837 reg = op2 >> 4;
8838 if (reg != 0xf)
8839 {
8840 regpos[nregs].offset = i * 2;
8841 regpos[nregs].reg = reg;
8842 nregs++;
8843 }
8844
8845 reg = op2 & 0xf;
8846 if (reg != 0xf)
8847 {
8848 regpos[nregs].offset = i * 2 + 1;
8849 regpos[nregs].reg = reg;
8850 nregs++;
8851 }
8852 }
8853
8854 printf (_("pop frame {"));
8855 reg = nregs - 1;
8856 for (i = i * 2; i > 0; i--)
8857 {
8858 if (regpos[reg].offset == i - 1)
8859 {
8860 name = tic6x_unwind_regnames[regpos[reg].reg];
8861 if (reg > 0)
8862 reg--;
8863 }
8864 else
8865 name = _("[pad]");
8866
8867 fputs (name, stdout);
8868 if (i > 1)
8869 printf (", ");
8870 }
8871
8872 printf ("}");
8873 }
8874 else if (op == 0xd0)
8875 printf (" MOV FP, SP");
8876 else if (op == 0xd1)
8877 printf (" __c6xabi_pop_rts");
8878 else if (op == 0xd2)
8879 {
8880 unsigned char buf[9];
8881 unsigned int i, len;
8882 unsigned long offset;
a734115a 8883
fa197c1c
PB
8884 for (i = 0; i < sizeof (buf); i++)
8885 {
8886 GET_OP (buf[i]);
8887 if ((buf[i] & 0x80) == 0)
8888 break;
8889 }
0eff7165
NC
8890 /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2. */
8891 if (i == sizeof (buf))
8892 {
0eff7165 8893 warn (_("Corrupt stack pointer adjustment detected\n"));
32ec8896 8894 return FALSE;
0eff7165 8895 }
948f632f 8896
f6f0e17b 8897 offset = read_uleb128 (buf, &len, buf + i + 1);
fa197c1c
PB
8898 assert (len == i + 1);
8899 offset = offset * 8 + 0x408;
8900 printf (_("sp = sp + %ld"), offset);
8901 }
8902 else if ((op & 0xf0) == 0xe0)
8903 {
8904 if ((op & 0x0f) == 7)
8905 printf (" RETURN");
8906 else
8907 printf (" MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
8908 }
8909 else
8910 {
8911 printf (_(" [unsupported opcode]"));
8912 }
8913 putchar ('\n');
8914 }
32ec8896
NC
8915
8916 return TRUE;
fa197c1c
PB
8917}
8918
8919static bfd_vma
dda8d76d 8920arm_expand_prel31 (Filedata * filedata, bfd_vma word, bfd_vma where)
fa197c1c
PB
8921{
8922 bfd_vma offset;
8923
8924 offset = word & 0x7fffffff;
8925 if (offset & 0x40000000)
8926 offset |= ~ (bfd_vma) 0x7fffffff;
8927
dda8d76d 8928 if (filedata->file_header.e_machine == EM_TI_C6000)
fa197c1c
PB
8929 offset <<= 1;
8930
8931 return offset + where;
8932}
8933
32ec8896 8934static bfd_boolean
dda8d76d
NC
8935decode_arm_unwind (Filedata * filedata,
8936 struct arm_unw_aux_info * aux,
1b31d05e
NC
8937 unsigned int word,
8938 unsigned int remaining,
8939 bfd_vma data_offset,
8940 Elf_Internal_Shdr * data_sec,
8941 struct arm_section * data_arm_sec)
fa197c1c
PB
8942{
8943 int per_index;
8944 unsigned int more_words = 0;
37e14bc3 8945 struct absaddr addr;
1b31d05e 8946 bfd_vma sym_name = (bfd_vma) -1;
97953bab 8947 bfd_boolean res = TRUE;
fa197c1c
PB
8948
8949 if (remaining == 0)
8950 {
1b31d05e
NC
8951 /* Fetch the first word.
8952 Note - when decoding an object file the address extracted
8953 here will always be 0. So we also pass in the sym_name
8954 parameter so that we can find the symbol associated with
8955 the personality routine. */
dda8d76d 8956 if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec, data_offset,
1b31d05e 8957 & word, & addr, & sym_name))
32ec8896 8958 return FALSE;
1b31d05e 8959
fa197c1c
PB
8960 remaining = 4;
8961 }
8962
8963 if ((word & 0x80000000) == 0)
8964 {
8965 /* Expand prel31 for personality routine. */
8966 bfd_vma fn;
8967 const char *procname;
8968
dda8d76d 8969 fn = arm_expand_prel31 (filedata, word, data_sec->sh_addr + data_offset);
fa197c1c 8970 printf (_(" Personality routine: "));
1b31d05e
NC
8971 if (fn == 0
8972 && addr.section == SHN_UNDEF && addr.offset == 0
8973 && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
8974 {
8975 procname = aux->strtab + sym_name;
8976 print_vma (fn, PREFIX_HEX);
8977 if (procname)
8978 {
8979 fputs (" <", stdout);
8980 fputs (procname, stdout);
8981 fputc ('>', stdout);
8982 }
8983 }
8984 else
dda8d76d 8985 procname = arm_print_vma_and_name (filedata, aux, fn, addr);
fa197c1c
PB
8986 fputc ('\n', stdout);
8987
8988 /* The GCC personality routines use the standard compact
8989 encoding, starting with one byte giving the number of
8990 words. */
8991 if (procname != NULL
8992 && (const_strneq (procname, "__gcc_personality_v0")
8993 || const_strneq (procname, "__gxx_personality_v0")
8994 || const_strneq (procname, "__gcj_personality_v0")
8995 || const_strneq (procname, "__gnu_objc_personality_v0")))
8996 {
8997 remaining = 0;
8998 more_words = 1;
8999 ADVANCE;
9000 if (!remaining)
9001 {
9002 printf (_(" [Truncated data]\n"));
32ec8896 9003 return FALSE;
fa197c1c
PB
9004 }
9005 more_words = word >> 24;
9006 word <<= 8;
9007 remaining--;
9008 per_index = -1;
9009 }
9010 else
32ec8896 9011 return TRUE;
fa197c1c
PB
9012 }
9013 else
9014 {
1b31d05e 9015 /* ARM EHABI Section 6.3:
0b4362b0 9016
1b31d05e 9017 An exception-handling table entry for the compact model looks like:
0b4362b0 9018
1b31d05e
NC
9019 31 30-28 27-24 23-0
9020 -- ----- ----- ----
9021 1 0 index Data for personalityRoutine[index] */
9022
dda8d76d 9023 if (filedata->file_header.e_machine == EM_ARM
1b31d05e 9024 && (word & 0x70000000))
32ec8896
NC
9025 {
9026 warn (_("Corrupt ARM compact model table entry: %x \n"), word);
9027 res = FALSE;
9028 }
1b31d05e 9029
fa197c1c 9030 per_index = (word >> 24) & 0x7f;
1b31d05e 9031 printf (_(" Compact model index: %d\n"), per_index);
fa197c1c
PB
9032 if (per_index == 0)
9033 {
9034 more_words = 0;
9035 word <<= 8;
9036 remaining--;
9037 }
9038 else if (per_index < 3)
9039 {
9040 more_words = (word >> 16) & 0xff;
9041 word <<= 16;
9042 remaining -= 2;
9043 }
9044 }
9045
dda8d76d 9046 switch (filedata->file_header.e_machine)
fa197c1c
PB
9047 {
9048 case EM_ARM:
9049 if (per_index < 3)
9050 {
dda8d76d 9051 if (! decode_arm_unwind_bytecode (filedata, aux, word, remaining, more_words,
32ec8896
NC
9052 data_offset, data_sec, data_arm_sec))
9053 res = FALSE;
fa197c1c
PB
9054 }
9055 else
1b31d05e
NC
9056 {
9057 warn (_("Unknown ARM compact model index encountered\n"));
9058 printf (_(" [reserved]\n"));
32ec8896 9059 res = FALSE;
1b31d05e 9060 }
fa197c1c
PB
9061 break;
9062
9063 case EM_TI_C6000:
9064 if (per_index < 3)
9065 {
dda8d76d 9066 if (! decode_tic6x_unwind_bytecode (filedata, aux, word, remaining, more_words,
32ec8896
NC
9067 data_offset, data_sec, data_arm_sec))
9068 res = FALSE;
fa197c1c
PB
9069 }
9070 else if (per_index < 5)
9071 {
9072 if (((word >> 17) & 0x7f) == 0x7f)
9073 printf (_(" Restore stack from frame pointer\n"));
9074 else
9075 printf (_(" Stack increment %d\n"), (word >> 14) & 0x1fc);
9076 printf (_(" Registers restored: "));
9077 if (per_index == 4)
9078 printf (" (compact) ");
9079 decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
9080 putchar ('\n');
9081 printf (_(" Return register: %s\n"),
9082 tic6x_unwind_regnames[word & 0xf]);
9083 }
9084 else
1b31d05e 9085 printf (_(" [reserved (%d)]\n"), per_index);
fa197c1c
PB
9086 break;
9087
9088 default:
74e1a04b 9089 error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
dda8d76d 9090 filedata->file_header.e_machine);
32ec8896 9091 res = FALSE;
fa197c1c 9092 }
0b6ae522
DJ
9093
9094 /* Decode the descriptors. Not implemented. */
32ec8896
NC
9095
9096 return res;
0b6ae522
DJ
9097}
9098
32ec8896 9099static bfd_boolean
dda8d76d
NC
9100dump_arm_unwind (Filedata * filedata,
9101 struct arm_unw_aux_info * aux,
9102 Elf_Internal_Shdr * exidx_sec)
0b6ae522
DJ
9103{
9104 struct arm_section exidx_arm_sec, extab_arm_sec;
9105 unsigned int i, exidx_len;
948f632f 9106 unsigned long j, nfuns;
32ec8896 9107 bfd_boolean res = TRUE;
0b6ae522
DJ
9108
9109 memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
9110 memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
9111 exidx_len = exidx_sec->sh_size / 8;
9112
948f632f
DA
9113 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
9114 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
9115 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
9116 aux->funtab[nfuns++] = aux->symtab[j];
9117 aux->nfuns = nfuns;
9118 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
9119
0b6ae522
DJ
9120 for (i = 0; i < exidx_len; i++)
9121 {
9122 unsigned int exidx_fn, exidx_entry;
9123 struct absaddr fn_addr, entry_addr;
9124 bfd_vma fn;
9125
9126 fputc ('\n', stdout);
9127
dda8d76d 9128 if (! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
1b31d05e 9129 8 * i, & exidx_fn, & fn_addr, NULL)
dda8d76d 9130 || ! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
1b31d05e 9131 8 * i + 4, & exidx_entry, & entry_addr, NULL))
0b6ae522 9132 {
948f632f 9133 free (aux->funtab);
1b31d05e
NC
9134 arm_free_section (& exidx_arm_sec);
9135 arm_free_section (& extab_arm_sec);
32ec8896 9136 return FALSE;
0b6ae522
DJ
9137 }
9138
83c257ca
NC
9139 /* ARM EHABI, Section 5:
9140 An index table entry consists of 2 words.
9141 The first word contains a prel31 offset to the start of a function, with bit 31 clear. */
9142 if (exidx_fn & 0x80000000)
32ec8896
NC
9143 {
9144 warn (_("corrupt index table entry: %x\n"), exidx_fn);
9145 res = FALSE;
9146 }
83c257ca 9147
dda8d76d 9148 fn = arm_expand_prel31 (filedata, exidx_fn, exidx_sec->sh_addr + 8 * i);
0b6ae522 9149
dda8d76d 9150 arm_print_vma_and_name (filedata, aux, fn, fn_addr);
0b6ae522
DJ
9151 fputs (": ", stdout);
9152
9153 if (exidx_entry == 1)
9154 {
9155 print_vma (exidx_entry, PREFIX_HEX);
9156 fputs (" [cantunwind]\n", stdout);
9157 }
9158 else if (exidx_entry & 0x80000000)
9159 {
9160 print_vma (exidx_entry, PREFIX_HEX);
9161 fputc ('\n', stdout);
dda8d76d 9162 decode_arm_unwind (filedata, aux, exidx_entry, 4, 0, NULL, NULL);
0b6ae522
DJ
9163 }
9164 else
9165 {
8f73510c 9166 bfd_vma table, table_offset = 0;
0b6ae522
DJ
9167 Elf_Internal_Shdr *table_sec;
9168
9169 fputs ("@", stdout);
dda8d76d 9170 table = arm_expand_prel31 (filedata, exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
0b6ae522
DJ
9171 print_vma (table, PREFIX_HEX);
9172 printf ("\n");
9173
9174 /* Locate the matching .ARM.extab. */
9175 if (entry_addr.section != SHN_UNDEF
dda8d76d 9176 && entry_addr.section < filedata->file_header.e_shnum)
0b6ae522 9177 {
dda8d76d 9178 table_sec = filedata->section_headers + entry_addr.section;
0b6ae522 9179 table_offset = entry_addr.offset;
1a915552
NC
9180 /* PR 18879 */
9181 if (table_offset > table_sec->sh_size
9182 || ((bfd_signed_vma) table_offset) < 0)
9183 {
9184 warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
9185 (unsigned long) table_offset,
dda8d76d 9186 printable_section_name (filedata, table_sec));
32ec8896 9187 res = FALSE;
1a915552
NC
9188 continue;
9189 }
0b6ae522
DJ
9190 }
9191 else
9192 {
dda8d76d 9193 table_sec = find_section_by_address (filedata, table);
0b6ae522
DJ
9194 if (table_sec != NULL)
9195 table_offset = table - table_sec->sh_addr;
9196 }
32ec8896 9197
0b6ae522
DJ
9198 if (table_sec == NULL)
9199 {
9200 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
9201 (unsigned long) table);
32ec8896 9202 res = FALSE;
0b6ae522
DJ
9203 continue;
9204 }
32ec8896 9205
dda8d76d 9206 if (! decode_arm_unwind (filedata, aux, 0, 0, table_offset, table_sec,
32ec8896
NC
9207 &extab_arm_sec))
9208 res = FALSE;
0b6ae522
DJ
9209 }
9210 }
9211
9212 printf ("\n");
9213
948f632f 9214 free (aux->funtab);
0b6ae522
DJ
9215 arm_free_section (&exidx_arm_sec);
9216 arm_free_section (&extab_arm_sec);
32ec8896
NC
9217
9218 return res;
0b6ae522
DJ
9219}
9220
fa197c1c 9221/* Used for both ARM and C6X unwinding tables. */
1b31d05e 9222
32ec8896 9223static bfd_boolean
dda8d76d 9224arm_process_unwind (Filedata * filedata)
0b6ae522
DJ
9225{
9226 struct arm_unw_aux_info aux;
9227 Elf_Internal_Shdr *unwsec = NULL;
9228 Elf_Internal_Shdr *strsec;
9229 Elf_Internal_Shdr *sec;
9230 unsigned long i;
fa197c1c 9231 unsigned int sec_type;
32ec8896 9232 bfd_boolean res = TRUE;
0b6ae522 9233
dda8d76d 9234 switch (filedata->file_header.e_machine)
fa197c1c
PB
9235 {
9236 case EM_ARM:
9237 sec_type = SHT_ARM_EXIDX;
9238 break;
9239
9240 case EM_TI_C6000:
9241 sec_type = SHT_C6000_UNWIND;
9242 break;
9243
0b4362b0 9244 default:
74e1a04b 9245 error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
dda8d76d 9246 filedata->file_header.e_machine);
32ec8896 9247 return FALSE;
fa197c1c
PB
9248 }
9249
dda8d76d 9250 if (filedata->string_table == NULL)
32ec8896 9251 return FALSE;
1b31d05e
NC
9252
9253 memset (& aux, 0, sizeof (aux));
dda8d76d 9254 aux.filedata = filedata;
0b6ae522 9255
dda8d76d 9256 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
0b6ae522 9257 {
dda8d76d 9258 if (sec->sh_type == SHT_SYMTAB && sec->sh_link < filedata->file_header.e_shnum)
0b6ae522 9259 {
dda8d76d 9260 aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
0b6ae522 9261
dda8d76d 9262 strsec = filedata->section_headers + sec->sh_link;
74e1a04b
NC
9263
9264 /* PR binutils/17531 file: 011-12666-0.004. */
9265 if (aux.strtab != NULL)
9266 {
4082ef84 9267 error (_("Multiple string tables found in file.\n"));
74e1a04b 9268 free (aux.strtab);
32ec8896 9269 res = FALSE;
74e1a04b 9270 }
dda8d76d 9271 aux.strtab = get_data (NULL, filedata, strsec->sh_offset,
0b6ae522
DJ
9272 1, strsec->sh_size, _("string table"));
9273 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
9274 }
fa197c1c 9275 else if (sec->sh_type == sec_type)
0b6ae522
DJ
9276 unwsec = sec;
9277 }
9278
1b31d05e 9279 if (unwsec == NULL)
0b6ae522 9280 printf (_("\nThere are no unwind sections in this file.\n"));
1b31d05e 9281 else
dda8d76d 9282 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
1b31d05e
NC
9283 {
9284 if (sec->sh_type == sec_type)
9285 {
d3a49aa8
AM
9286 unsigned long num_unwind = sec->sh_size / (2 * eh_addr_size);
9287 printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
9288 "contains %lu entry:\n",
9289 "\nUnwind section '%s' at offset 0x%lx "
9290 "contains %lu entries:\n",
9291 num_unwind),
dda8d76d 9292 printable_section_name (filedata, sec),
1b31d05e 9293 (unsigned long) sec->sh_offset,
d3a49aa8 9294 num_unwind);
0b6ae522 9295
dda8d76d 9296 if (! dump_arm_unwind (filedata, &aux, sec))
32ec8896 9297 res = FALSE;
1b31d05e
NC
9298 }
9299 }
0b6ae522
DJ
9300
9301 if (aux.symtab)
9302 free (aux.symtab);
9303 if (aux.strtab)
9304 free ((char *) aux.strtab);
32ec8896
NC
9305
9306 return res;
0b6ae522
DJ
9307}
9308
32ec8896 9309static bfd_boolean
dda8d76d 9310process_unwind (Filedata * filedata)
57346661 9311{
2cf0635d
NC
9312 struct unwind_handler
9313 {
32ec8896 9314 unsigned int machtype;
dda8d76d 9315 bfd_boolean (* handler)(Filedata *);
2cf0635d
NC
9316 } handlers[] =
9317 {
0b6ae522 9318 { EM_ARM, arm_process_unwind },
57346661
AM
9319 { EM_IA_64, ia64_process_unwind },
9320 { EM_PARISC, hppa_process_unwind },
fa197c1c 9321 { EM_TI_C6000, arm_process_unwind },
32ec8896 9322 { 0, NULL }
57346661
AM
9323 };
9324 int i;
9325
9326 if (!do_unwind)
32ec8896 9327 return TRUE;
57346661
AM
9328
9329 for (i = 0; handlers[i].handler != NULL; i++)
dda8d76d
NC
9330 if (filedata->file_header.e_machine == handlers[i].machtype)
9331 return handlers[i].handler (filedata);
57346661 9332
1b31d05e 9333 printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
dda8d76d 9334 get_machine_name (filedata->file_header.e_machine));
32ec8896 9335 return TRUE;
57346661
AM
9336}
9337
252b5132 9338static void
2cf0635d 9339dynamic_section_mips_val (Elf_Internal_Dyn * entry)
252b5132
RH
9340{
9341 switch (entry->d_tag)
9342 {
9343 case DT_MIPS_FLAGS:
9344 if (entry->d_un.d_val == 0)
4b68bca3 9345 printf (_("NONE"));
252b5132
RH
9346 else
9347 {
9348 static const char * opts[] =
9349 {
9350 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
9351 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
9352 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
9353 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
9354 "RLD_ORDER_SAFE"
9355 };
9356 unsigned int cnt;
32ec8896 9357 bfd_boolean first = TRUE;
2b692964 9358
60bca95a 9359 for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
252b5132
RH
9360 if (entry->d_un.d_val & (1 << cnt))
9361 {
9362 printf ("%s%s", first ? "" : " ", opts[cnt]);
32ec8896 9363 first = FALSE;
252b5132 9364 }
252b5132
RH
9365 }
9366 break;
103f02d3 9367
252b5132 9368 case DT_MIPS_IVERSION:
d79b3d50 9369 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
4b68bca3 9370 printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
252b5132 9371 else
76ca31c0
NC
9372 {
9373 char buf[40];
9374 sprintf_vma (buf, entry->d_un.d_ptr);
9375 /* Note: coded this way so that there is a single string for translation. */
9376 printf (_("<corrupt: %s>"), buf);
9377 }
252b5132 9378 break;
103f02d3 9379
252b5132
RH
9380 case DT_MIPS_TIME_STAMP:
9381 {
d5b07ef4 9382 char timebuf[128];
2cf0635d 9383 struct tm * tmp;
91d6fa6a 9384 time_t atime = entry->d_un.d_val;
82b1b41b 9385
91d6fa6a 9386 tmp = gmtime (&atime);
82b1b41b
NC
9387 /* PR 17531: file: 6accc532. */
9388 if (tmp == NULL)
9389 snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
9390 else
9391 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
9392 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9393 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
4b68bca3 9394 printf (_("Time Stamp: %s"), timebuf);
252b5132
RH
9395 }
9396 break;
103f02d3 9397
252b5132
RH
9398 case DT_MIPS_RLD_VERSION:
9399 case DT_MIPS_LOCAL_GOTNO:
9400 case DT_MIPS_CONFLICTNO:
9401 case DT_MIPS_LIBLISTNO:
9402 case DT_MIPS_SYMTABNO:
9403 case DT_MIPS_UNREFEXTNO:
9404 case DT_MIPS_HIPAGENO:
9405 case DT_MIPS_DELTA_CLASS_NO:
9406 case DT_MIPS_DELTA_INSTANCE_NO:
9407 case DT_MIPS_DELTA_RELOC_NO:
9408 case DT_MIPS_DELTA_SYM_NO:
9409 case DT_MIPS_DELTA_CLASSSYM_NO:
9410 case DT_MIPS_COMPACT_SIZE:
c69075ac 9411 print_vma (entry->d_un.d_val, DEC);
252b5132 9412 break;
103f02d3
UD
9413
9414 default:
4b68bca3 9415 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
103f02d3 9416 }
4b68bca3 9417 putchar ('\n');
103f02d3
UD
9418}
9419
103f02d3 9420static void
2cf0635d 9421dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
103f02d3
UD
9422{
9423 switch (entry->d_tag)
9424 {
9425 case DT_HP_DLD_FLAGS:
9426 {
9427 static struct
9428 {
9429 long int bit;
2cf0635d 9430 const char * str;
5e220199
NC
9431 }
9432 flags[] =
9433 {
9434 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
9435 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
9436 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
9437 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
9438 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
9439 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
9440 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
9441 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
9442 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
9443 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
eec8f817
DA
9444 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
9445 { DT_HP_GST, "HP_GST" },
9446 { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
9447 { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
9448 { DT_HP_NODELETE, "HP_NODELETE" },
9449 { DT_HP_GROUP, "HP_GROUP" },
9450 { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
5e220199 9451 };
32ec8896 9452 bfd_boolean first = TRUE;
5e220199 9453 size_t cnt;
f7a99963 9454 bfd_vma val = entry->d_un.d_val;
103f02d3 9455
60bca95a 9456 for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
103f02d3 9457 if (val & flags[cnt].bit)
30800947
NC
9458 {
9459 if (! first)
9460 putchar (' ');
9461 fputs (flags[cnt].str, stdout);
32ec8896 9462 first = FALSE;
30800947
NC
9463 val ^= flags[cnt].bit;
9464 }
76da6bbe 9465
103f02d3 9466 if (val != 0 || first)
f7a99963
NC
9467 {
9468 if (! first)
9469 putchar (' ');
9470 print_vma (val, HEX);
9471 }
103f02d3
UD
9472 }
9473 break;
76da6bbe 9474
252b5132 9475 default:
f7a99963
NC
9476 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9477 break;
252b5132 9478 }
35b1837e 9479 putchar ('\n');
252b5132
RH
9480}
9481
28f997cf
TG
9482#ifdef BFD64
9483
9484/* VMS vs Unix time offset and factor. */
9485
9486#define VMS_EPOCH_OFFSET 35067168000000000LL
9487#define VMS_GRANULARITY_FACTOR 10000000
9488
9489/* Display a VMS time in a human readable format. */
9490
9491static void
9492print_vms_time (bfd_int64_t vmstime)
9493{
9494 struct tm *tm;
9495 time_t unxtime;
9496
9497 unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
9498 tm = gmtime (&unxtime);
9499 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
9500 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
9501 tm->tm_hour, tm->tm_min, tm->tm_sec);
9502}
9503#endif /* BFD64 */
9504
ecc51f48 9505static void
2cf0635d 9506dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
ecc51f48
NC
9507{
9508 switch (entry->d_tag)
9509 {
0de14b54 9510 case DT_IA_64_PLT_RESERVE:
bdf4d63a 9511 /* First 3 slots reserved. */
ecc51f48
NC
9512 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9513 printf (" -- ");
9514 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
bdf4d63a
JJ
9515 break;
9516
28f997cf
TG
9517 case DT_IA_64_VMS_LINKTIME:
9518#ifdef BFD64
9519 print_vms_time (entry->d_un.d_val);
9520#endif
9521 break;
9522
9523 case DT_IA_64_VMS_LNKFLAGS:
9524 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9525 if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
9526 printf (" CALL_DEBUG");
9527 if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
9528 printf (" NOP0BUFS");
9529 if (entry->d_un.d_val & VMS_LF_P0IMAGE)
9530 printf (" P0IMAGE");
9531 if (entry->d_un.d_val & VMS_LF_MKTHREADS)
9532 printf (" MKTHREADS");
9533 if (entry->d_un.d_val & VMS_LF_UPCALLS)
9534 printf (" UPCALLS");
9535 if (entry->d_un.d_val & VMS_LF_IMGSTA)
9536 printf (" IMGSTA");
9537 if (entry->d_un.d_val & VMS_LF_INITIALIZE)
9538 printf (" INITIALIZE");
9539 if (entry->d_un.d_val & VMS_LF_MAIN)
9540 printf (" MAIN");
9541 if (entry->d_un.d_val & VMS_LF_EXE_INIT)
9542 printf (" EXE_INIT");
9543 if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
9544 printf (" TBK_IN_IMG");
9545 if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
9546 printf (" DBG_IN_IMG");
9547 if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
9548 printf (" TBK_IN_DSF");
9549 if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
9550 printf (" DBG_IN_DSF");
9551 if (entry->d_un.d_val & VMS_LF_SIGNATURES)
9552 printf (" SIGNATURES");
9553 if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
9554 printf (" REL_SEG_OFF");
9555 break;
9556
bdf4d63a
JJ
9557 default:
9558 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9559 break;
ecc51f48 9560 }
bdf4d63a 9561 putchar ('\n');
ecc51f48
NC
9562}
9563
32ec8896 9564static bfd_boolean
dda8d76d 9565get_32bit_dynamic_section (Filedata * filedata)
252b5132 9566{
2cf0635d
NC
9567 Elf32_External_Dyn * edyn;
9568 Elf32_External_Dyn * ext;
9569 Elf_Internal_Dyn * entry;
103f02d3 9570
dda8d76d 9571 edyn = (Elf32_External_Dyn *) get_data (NULL, filedata, dynamic_addr, 1,
3f5e193b 9572 dynamic_size, _("dynamic section"));
a6e9f9df 9573 if (!edyn)
32ec8896 9574 return FALSE;
103f02d3 9575
071436c6
NC
9576 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9577 might not have the luxury of section headers. Look for the DT_NULL
9578 terminator to determine the number of entries. */
ba2685cc 9579 for (ext = edyn, dynamic_nent = 0;
53c3012c 9580 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
ba2685cc
AM
9581 ext++)
9582 {
9583 dynamic_nent++;
9584 if (BYTE_GET (ext->d_tag) == DT_NULL)
9585 break;
9586 }
252b5132 9587
3f5e193b
NC
9588 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9589 sizeof (* entry));
b2d38a17 9590 if (dynamic_section == NULL)
252b5132 9591 {
8b73c356
NC
9592 error (_("Out of memory allocating space for %lu dynamic entries\n"),
9593 (unsigned long) dynamic_nent);
9ea033b2 9594 free (edyn);
32ec8896 9595 return FALSE;
9ea033b2 9596 }
252b5132 9597
fb514b26 9598 for (ext = edyn, entry = dynamic_section;
ba2685cc 9599 entry < dynamic_section + dynamic_nent;
fb514b26 9600 ext++, entry++)
9ea033b2 9601 {
fb514b26
AM
9602 entry->d_tag = BYTE_GET (ext->d_tag);
9603 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
252b5132
RH
9604 }
9605
9ea033b2
NC
9606 free (edyn);
9607
32ec8896 9608 return TRUE;
9ea033b2
NC
9609}
9610
32ec8896 9611static bfd_boolean
dda8d76d 9612get_64bit_dynamic_section (Filedata * filedata)
9ea033b2 9613{
2cf0635d
NC
9614 Elf64_External_Dyn * edyn;
9615 Elf64_External_Dyn * ext;
9616 Elf_Internal_Dyn * entry;
103f02d3 9617
071436c6 9618 /* Read in the data. */
dda8d76d 9619 edyn = (Elf64_External_Dyn *) get_data (NULL, filedata, dynamic_addr, 1,
3f5e193b 9620 dynamic_size, _("dynamic section"));
a6e9f9df 9621 if (!edyn)
32ec8896 9622 return FALSE;
103f02d3 9623
071436c6
NC
9624 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9625 might not have the luxury of section headers. Look for the DT_NULL
9626 terminator to determine the number of entries. */
ba2685cc 9627 for (ext = edyn, dynamic_nent = 0;
53c3012c
AM
9628 /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer. */
9629 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
ba2685cc
AM
9630 ext++)
9631 {
9632 dynamic_nent++;
66543521 9633 if (BYTE_GET (ext->d_tag) == DT_NULL)
ba2685cc
AM
9634 break;
9635 }
252b5132 9636
3f5e193b
NC
9637 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9638 sizeof (* entry));
b2d38a17 9639 if (dynamic_section == NULL)
252b5132 9640 {
8b73c356
NC
9641 error (_("Out of memory allocating space for %lu dynamic entries\n"),
9642 (unsigned long) dynamic_nent);
252b5132 9643 free (edyn);
32ec8896 9644 return FALSE;
252b5132
RH
9645 }
9646
071436c6 9647 /* Convert from external to internal formats. */
fb514b26 9648 for (ext = edyn, entry = dynamic_section;
ba2685cc 9649 entry < dynamic_section + dynamic_nent;
fb514b26 9650 ext++, entry++)
252b5132 9651 {
66543521
AM
9652 entry->d_tag = BYTE_GET (ext->d_tag);
9653 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
252b5132
RH
9654 }
9655
9656 free (edyn);
9657
32ec8896 9658 return TRUE;
9ea033b2
NC
9659}
9660
e9e44622
JJ
9661static void
9662print_dynamic_flags (bfd_vma flags)
d1133906 9663{
32ec8896 9664 bfd_boolean first = TRUE;
13ae64f3 9665
d1133906
NC
9666 while (flags)
9667 {
9668 bfd_vma flag;
9669
9670 flag = flags & - flags;
9671 flags &= ~ flag;
9672
e9e44622 9673 if (first)
32ec8896 9674 first = FALSE;
e9e44622
JJ
9675 else
9676 putc (' ', stdout);
13ae64f3 9677
d1133906
NC
9678 switch (flag)
9679 {
e9e44622
JJ
9680 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
9681 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
9682 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
9683 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
9684 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
2b692964 9685 default: fputs (_("unknown"), stdout); break;
d1133906
NC
9686 }
9687 }
e9e44622 9688 puts ("");
d1133906
NC
9689}
9690
b2d38a17
NC
9691/* Parse and display the contents of the dynamic section. */
9692
32ec8896 9693static bfd_boolean
dda8d76d 9694process_dynamic_section (Filedata * filedata)
9ea033b2 9695{
2cf0635d 9696 Elf_Internal_Dyn * entry;
9ea033b2
NC
9697
9698 if (dynamic_size == 0)
9699 {
9700 if (do_dynamic)
b2d38a17 9701 printf (_("\nThere is no dynamic section in this file.\n"));
9ea033b2 9702
32ec8896 9703 return TRUE;
9ea033b2
NC
9704 }
9705
9706 if (is_32bit_elf)
9707 {
dda8d76d 9708 if (! get_32bit_dynamic_section (filedata))
32ec8896
NC
9709 return FALSE;
9710 }
9711 else
9712 {
dda8d76d 9713 if (! get_64bit_dynamic_section (filedata))
32ec8896 9714 return FALSE;
9ea033b2 9715 }
9ea033b2 9716
252b5132
RH
9717 /* Find the appropriate symbol table. */
9718 if (dynamic_symbols == NULL)
9719 {
86dba8ee
AM
9720 for (entry = dynamic_section;
9721 entry < dynamic_section + dynamic_nent;
9722 ++entry)
252b5132 9723 {
c8286bd1 9724 Elf_Internal_Shdr section;
252b5132
RH
9725
9726 if (entry->d_tag != DT_SYMTAB)
9727 continue;
9728
9729 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
9730
9731 /* Since we do not know how big the symbol table is,
9732 we default to reading in the entire file (!) and
9733 processing that. This is overkill, I know, but it
e3c8793a 9734 should work. */
dda8d76d
NC
9735 section.sh_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
9736 if ((bfd_size_type) section.sh_offset > filedata->file_size)
7296a62a
NC
9737 {
9738 /* See PR 21379 for a reproducer. */
9739 error (_("Invalid DT_SYMTAB entry: %lx"), (long) section.sh_offset);
9740 return FALSE;
9741 }
252b5132 9742
fb52b2f4
NC
9743 if (archive_file_offset != 0)
9744 section.sh_size = archive_file_size - section.sh_offset;
9745 else
dda8d76d 9746 section.sh_size = filedata->file_size - section.sh_offset;
252b5132 9747
9ea033b2 9748 if (is_32bit_elf)
9ad5cbcf 9749 section.sh_entsize = sizeof (Elf32_External_Sym);
9ea033b2 9750 else
9ad5cbcf 9751 section.sh_entsize = sizeof (Elf64_External_Sym);
dda8d76d 9752 section.sh_name = filedata->string_table_length;
252b5132 9753
e3d39609
NC
9754 if (dynamic_symbols != NULL)
9755 {
9756 error (_("Multiple dynamic symbol table sections found\n"));
9757 free (dynamic_symbols);
9758 }
dda8d76d 9759 dynamic_symbols = GET_ELF_SYMBOLS (filedata, &section, & num_dynamic_syms);
19936277 9760 if (num_dynamic_syms < 1)
252b5132
RH
9761 {
9762 error (_("Unable to determine the number of symbols to load\n"));
9763 continue;
9764 }
252b5132
RH
9765 }
9766 }
9767
9768 /* Similarly find a string table. */
9769 if (dynamic_strings == NULL)
9770 {
86dba8ee
AM
9771 for (entry = dynamic_section;
9772 entry < dynamic_section + dynamic_nent;
9773 ++entry)
252b5132
RH
9774 {
9775 unsigned long offset;
b34976b6 9776 long str_tab_len;
252b5132
RH
9777
9778 if (entry->d_tag != DT_STRTAB)
9779 continue;
9780
9781 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
9782
9783 /* Since we do not know how big the string table is,
9784 we default to reading in the entire file (!) and
9785 processing that. This is overkill, I know, but it
e3c8793a 9786 should work. */
252b5132 9787
dda8d76d 9788 offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
fb52b2f4
NC
9789
9790 if (archive_file_offset != 0)
9791 str_tab_len = archive_file_size - offset;
9792 else
86c6c6df 9793 str_tab_len = filedata->file_size - offset;
252b5132
RH
9794
9795 if (str_tab_len < 1)
9796 {
9797 error
9798 (_("Unable to determine the length of the dynamic string table\n"));
9799 continue;
9800 }
9801
e3d39609
NC
9802 if (dynamic_strings != NULL)
9803 {
9804 error (_("Multiple dynamic string tables found\n"));
9805 free (dynamic_strings);
9806 }
9807
dda8d76d 9808 dynamic_strings = (char *) get_data (NULL, filedata, offset, 1,
3f5e193b
NC
9809 str_tab_len,
9810 _("dynamic string table"));
59245841 9811 dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
252b5132
RH
9812 }
9813 }
9814
9815 /* And find the syminfo section if available. */
9816 if (dynamic_syminfo == NULL)
9817 {
3e8bba36 9818 unsigned long syminsz = 0;
252b5132 9819
86dba8ee
AM
9820 for (entry = dynamic_section;
9821 entry < dynamic_section + dynamic_nent;
9822 ++entry)
252b5132
RH
9823 {
9824 if (entry->d_tag == DT_SYMINENT)
9825 {
9826 /* Note: these braces are necessary to avoid a syntax
9827 error from the SunOS4 C compiler. */
049b0c3a
NC
9828 /* PR binutils/17531: A corrupt file can trigger this test.
9829 So do not use an assert, instead generate an error message. */
9830 if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
071436c6 9831 error (_("Bad value (%d) for SYMINENT entry\n"),
049b0c3a 9832 (int) entry->d_un.d_val);
252b5132
RH
9833 }
9834 else if (entry->d_tag == DT_SYMINSZ)
9835 syminsz = entry->d_un.d_val;
9836 else if (entry->d_tag == DT_SYMINFO)
dda8d76d 9837 dynamic_syminfo_offset = offset_from_vma (filedata, entry->d_un.d_val,
d93f0186 9838 syminsz);
252b5132
RH
9839 }
9840
9841 if (dynamic_syminfo_offset != 0 && syminsz != 0)
9842 {
2cf0635d
NC
9843 Elf_External_Syminfo * extsyminfo;
9844 Elf_External_Syminfo * extsym;
9845 Elf_Internal_Syminfo * syminfo;
252b5132
RH
9846
9847 /* There is a syminfo section. Read the data. */
3f5e193b 9848 extsyminfo = (Elf_External_Syminfo *)
dda8d76d 9849 get_data (NULL, filedata, dynamic_syminfo_offset, 1, syminsz,
3f5e193b 9850 _("symbol information"));
a6e9f9df 9851 if (!extsyminfo)
32ec8896 9852 return FALSE;
252b5132 9853
e3d39609
NC
9854 if (dynamic_syminfo != NULL)
9855 {
9856 error (_("Multiple dynamic symbol information sections found\n"));
9857 free (dynamic_syminfo);
9858 }
3f5e193b 9859 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
252b5132
RH
9860 if (dynamic_syminfo == NULL)
9861 {
8b73c356
NC
9862 error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9863 (unsigned long) syminsz);
32ec8896 9864 return FALSE;
252b5132
RH
9865 }
9866
9867 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
86dba8ee
AM
9868 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
9869 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
9870 ++syminfo, ++extsym)
252b5132 9871 {
86dba8ee
AM
9872 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
9873 syminfo->si_flags = BYTE_GET (extsym->si_flags);
252b5132
RH
9874 }
9875
9876 free (extsyminfo);
9877 }
9878 }
9879
9880 if (do_dynamic && dynamic_addr)
d3a49aa8
AM
9881 printf (ngettext ("\nDynamic section at offset 0x%lx "
9882 "contains %lu entry:\n",
9883 "\nDynamic section at offset 0x%lx "
9884 "contains %lu entries:\n",
9885 dynamic_nent),
8b73c356 9886 dynamic_addr, (unsigned long) dynamic_nent);
252b5132
RH
9887 if (do_dynamic)
9888 printf (_(" Tag Type Name/Value\n"));
9889
86dba8ee
AM
9890 for (entry = dynamic_section;
9891 entry < dynamic_section + dynamic_nent;
9892 entry++)
252b5132
RH
9893 {
9894 if (do_dynamic)
f7a99963 9895 {
2cf0635d 9896 const char * dtype;
e699b9ff 9897
f7a99963
NC
9898 putchar (' ');
9899 print_vma (entry->d_tag, FULL_HEX);
dda8d76d 9900 dtype = get_dynamic_type (filedata, entry->d_tag);
e699b9ff 9901 printf (" (%s)%*s", dtype,
32ec8896 9902 ((is_32bit_elf ? 27 : 19) - (int) strlen (dtype)), " ");
f7a99963 9903 }
252b5132
RH
9904
9905 switch (entry->d_tag)
9906 {
d1133906
NC
9907 case DT_FLAGS:
9908 if (do_dynamic)
e9e44622 9909 print_dynamic_flags (entry->d_un.d_val);
d1133906 9910 break;
76da6bbe 9911
252b5132
RH
9912 case DT_AUXILIARY:
9913 case DT_FILTER:
019148e4
L
9914 case DT_CONFIG:
9915 case DT_DEPAUDIT:
9916 case DT_AUDIT:
252b5132
RH
9917 if (do_dynamic)
9918 {
019148e4 9919 switch (entry->d_tag)
b34976b6 9920 {
019148e4
L
9921 case DT_AUXILIARY:
9922 printf (_("Auxiliary library"));
9923 break;
9924
9925 case DT_FILTER:
9926 printf (_("Filter library"));
9927 break;
9928
b34976b6 9929 case DT_CONFIG:
019148e4
L
9930 printf (_("Configuration file"));
9931 break;
9932
9933 case DT_DEPAUDIT:
9934 printf (_("Dependency audit library"));
9935 break;
9936
9937 case DT_AUDIT:
9938 printf (_("Audit library"));
9939 break;
9940 }
252b5132 9941
d79b3d50
NC
9942 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9943 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
252b5132 9944 else
f7a99963
NC
9945 {
9946 printf (": ");
9947 print_vma (entry->d_un.d_val, PREFIX_HEX);
9948 putchar ('\n');
9949 }
252b5132
RH
9950 }
9951 break;
9952
dcefbbbd 9953 case DT_FEATURE:
252b5132
RH
9954 if (do_dynamic)
9955 {
9956 printf (_("Flags:"));
86f55779 9957
252b5132
RH
9958 if (entry->d_un.d_val == 0)
9959 printf (_(" None\n"));
9960 else
9961 {
9962 unsigned long int val = entry->d_un.d_val;
86f55779 9963
252b5132
RH
9964 if (val & DTF_1_PARINIT)
9965 {
9966 printf (" PARINIT");
9967 val ^= DTF_1_PARINIT;
9968 }
dcefbbbd
L
9969 if (val & DTF_1_CONFEXP)
9970 {
9971 printf (" CONFEXP");
9972 val ^= DTF_1_CONFEXP;
9973 }
252b5132
RH
9974 if (val != 0)
9975 printf (" %lx", val);
9976 puts ("");
9977 }
9978 }
9979 break;
9980
9981 case DT_POSFLAG_1:
9982 if (do_dynamic)
9983 {
9984 printf (_("Flags:"));
86f55779 9985
252b5132
RH
9986 if (entry->d_un.d_val == 0)
9987 printf (_(" None\n"));
9988 else
9989 {
9990 unsigned long int val = entry->d_un.d_val;
86f55779 9991
252b5132
RH
9992 if (val & DF_P1_LAZYLOAD)
9993 {
9994 printf (" LAZYLOAD");
9995 val ^= DF_P1_LAZYLOAD;
9996 }
9997 if (val & DF_P1_GROUPPERM)
9998 {
9999 printf (" GROUPPERM");
10000 val ^= DF_P1_GROUPPERM;
10001 }
10002 if (val != 0)
10003 printf (" %lx", val);
10004 puts ("");
10005 }
10006 }
10007 break;
10008
10009 case DT_FLAGS_1:
10010 if (do_dynamic)
10011 {
10012 printf (_("Flags:"));
10013 if (entry->d_un.d_val == 0)
10014 printf (_(" None\n"));
10015 else
10016 {
10017 unsigned long int val = entry->d_un.d_val;
86f55779 10018
252b5132
RH
10019 if (val & DF_1_NOW)
10020 {
10021 printf (" NOW");
10022 val ^= DF_1_NOW;
10023 }
10024 if (val & DF_1_GLOBAL)
10025 {
10026 printf (" GLOBAL");
10027 val ^= DF_1_GLOBAL;
10028 }
10029 if (val & DF_1_GROUP)
10030 {
10031 printf (" GROUP");
10032 val ^= DF_1_GROUP;
10033 }
10034 if (val & DF_1_NODELETE)
10035 {
10036 printf (" NODELETE");
10037 val ^= DF_1_NODELETE;
10038 }
10039 if (val & DF_1_LOADFLTR)
10040 {
10041 printf (" LOADFLTR");
10042 val ^= DF_1_LOADFLTR;
10043 }
10044 if (val & DF_1_INITFIRST)
10045 {
10046 printf (" INITFIRST");
10047 val ^= DF_1_INITFIRST;
10048 }
10049 if (val & DF_1_NOOPEN)
10050 {
10051 printf (" NOOPEN");
10052 val ^= DF_1_NOOPEN;
10053 }
10054 if (val & DF_1_ORIGIN)
10055 {
10056 printf (" ORIGIN");
10057 val ^= DF_1_ORIGIN;
10058 }
10059 if (val & DF_1_DIRECT)
10060 {
10061 printf (" DIRECT");
10062 val ^= DF_1_DIRECT;
10063 }
10064 if (val & DF_1_TRANS)
10065 {
10066 printf (" TRANS");
10067 val ^= DF_1_TRANS;
10068 }
10069 if (val & DF_1_INTERPOSE)
10070 {
10071 printf (" INTERPOSE");
10072 val ^= DF_1_INTERPOSE;
10073 }
f7db6139 10074 if (val & DF_1_NODEFLIB)
dcefbbbd 10075 {
f7db6139
L
10076 printf (" NODEFLIB");
10077 val ^= DF_1_NODEFLIB;
dcefbbbd
L
10078 }
10079 if (val & DF_1_NODUMP)
10080 {
10081 printf (" NODUMP");
10082 val ^= DF_1_NODUMP;
10083 }
34b60028 10084 if (val & DF_1_CONFALT)
dcefbbbd 10085 {
34b60028
L
10086 printf (" CONFALT");
10087 val ^= DF_1_CONFALT;
10088 }
10089 if (val & DF_1_ENDFILTEE)
10090 {
10091 printf (" ENDFILTEE");
10092 val ^= DF_1_ENDFILTEE;
10093 }
10094 if (val & DF_1_DISPRELDNE)
10095 {
10096 printf (" DISPRELDNE");
10097 val ^= DF_1_DISPRELDNE;
10098 }
10099 if (val & DF_1_DISPRELPND)
10100 {
10101 printf (" DISPRELPND");
10102 val ^= DF_1_DISPRELPND;
10103 }
10104 if (val & DF_1_NODIRECT)
10105 {
10106 printf (" NODIRECT");
10107 val ^= DF_1_NODIRECT;
10108 }
10109 if (val & DF_1_IGNMULDEF)
10110 {
10111 printf (" IGNMULDEF");
10112 val ^= DF_1_IGNMULDEF;
10113 }
10114 if (val & DF_1_NOKSYMS)
10115 {
10116 printf (" NOKSYMS");
10117 val ^= DF_1_NOKSYMS;
10118 }
10119 if (val & DF_1_NOHDR)
10120 {
10121 printf (" NOHDR");
10122 val ^= DF_1_NOHDR;
10123 }
10124 if (val & DF_1_EDITED)
10125 {
10126 printf (" EDITED");
10127 val ^= DF_1_EDITED;
10128 }
10129 if (val & DF_1_NORELOC)
10130 {
10131 printf (" NORELOC");
10132 val ^= DF_1_NORELOC;
10133 }
10134 if (val & DF_1_SYMINTPOSE)
10135 {
10136 printf (" SYMINTPOSE");
10137 val ^= DF_1_SYMINTPOSE;
10138 }
10139 if (val & DF_1_GLOBAUDIT)
10140 {
10141 printf (" GLOBAUDIT");
10142 val ^= DF_1_GLOBAUDIT;
10143 }
10144 if (val & DF_1_SINGLETON)
10145 {
10146 printf (" SINGLETON");
10147 val ^= DF_1_SINGLETON;
dcefbbbd 10148 }
5c383f02
RO
10149 if (val & DF_1_STUB)
10150 {
10151 printf (" STUB");
10152 val ^= DF_1_STUB;
10153 }
10154 if (val & DF_1_PIE)
10155 {
10156 printf (" PIE");
10157 val ^= DF_1_PIE;
10158 }
b1202ffa
L
10159 if (val & DF_1_KMOD)
10160 {
10161 printf (" KMOD");
10162 val ^= DF_1_KMOD;
10163 }
10164 if (val & DF_1_WEAKFILTER)
10165 {
10166 printf (" WEAKFILTER");
10167 val ^= DF_1_WEAKFILTER;
10168 }
10169 if (val & DF_1_NOCOMMON)
10170 {
10171 printf (" NOCOMMON");
10172 val ^= DF_1_NOCOMMON;
10173 }
252b5132
RH
10174 if (val != 0)
10175 printf (" %lx", val);
10176 puts ("");
10177 }
10178 }
10179 break;
10180
10181 case DT_PLTREL:
566b0d53 10182 dynamic_info[entry->d_tag] = entry->d_un.d_val;
252b5132 10183 if (do_dynamic)
dda8d76d 10184 puts (get_dynamic_type (filedata, entry->d_un.d_val));
252b5132
RH
10185 break;
10186
10187 case DT_NULL :
10188 case DT_NEEDED :
10189 case DT_PLTGOT :
10190 case DT_HASH :
10191 case DT_STRTAB :
10192 case DT_SYMTAB :
10193 case DT_RELA :
10194 case DT_INIT :
10195 case DT_FINI :
10196 case DT_SONAME :
10197 case DT_RPATH :
10198 case DT_SYMBOLIC:
10199 case DT_REL :
10200 case DT_DEBUG :
10201 case DT_TEXTREL :
10202 case DT_JMPREL :
019148e4 10203 case DT_RUNPATH :
252b5132
RH
10204 dynamic_info[entry->d_tag] = entry->d_un.d_val;
10205
10206 if (do_dynamic)
10207 {
2cf0635d 10208 char * name;
252b5132 10209
d79b3d50
NC
10210 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
10211 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
252b5132 10212 else
d79b3d50 10213 name = NULL;
252b5132
RH
10214
10215 if (name)
10216 {
10217 switch (entry->d_tag)
10218 {
10219 case DT_NEEDED:
10220 printf (_("Shared library: [%s]"), name);
10221
18bd398b 10222 if (streq (name, program_interpreter))
f7a99963 10223 printf (_(" program interpreter"));
252b5132
RH
10224 break;
10225
10226 case DT_SONAME:
f7a99963 10227 printf (_("Library soname: [%s]"), name);
252b5132
RH
10228 break;
10229
10230 case DT_RPATH:
f7a99963 10231 printf (_("Library rpath: [%s]"), name);
252b5132
RH
10232 break;
10233
019148e4
L
10234 case DT_RUNPATH:
10235 printf (_("Library runpath: [%s]"), name);
10236 break;
10237
252b5132 10238 default:
f7a99963
NC
10239 print_vma (entry->d_un.d_val, PREFIX_HEX);
10240 break;
252b5132
RH
10241 }
10242 }
10243 else
f7a99963
NC
10244 print_vma (entry->d_un.d_val, PREFIX_HEX);
10245
10246 putchar ('\n');
252b5132
RH
10247 }
10248 break;
10249
10250 case DT_PLTRELSZ:
10251 case DT_RELASZ :
10252 case DT_STRSZ :
10253 case DT_RELSZ :
10254 case DT_RELAENT :
10255 case DT_SYMENT :
10256 case DT_RELENT :
566b0d53 10257 dynamic_info[entry->d_tag] = entry->d_un.d_val;
1a0670f3 10258 /* Fall through. */
252b5132
RH
10259 case DT_PLTPADSZ:
10260 case DT_MOVEENT :
10261 case DT_MOVESZ :
10262 case DT_INIT_ARRAYSZ:
10263 case DT_FINI_ARRAYSZ:
047b2264
JJ
10264 case DT_GNU_CONFLICTSZ:
10265 case DT_GNU_LIBLISTSZ:
252b5132 10266 if (do_dynamic)
f7a99963
NC
10267 {
10268 print_vma (entry->d_un.d_val, UNSIGNED);
2b692964 10269 printf (_(" (bytes)\n"));
f7a99963 10270 }
252b5132
RH
10271 break;
10272
10273 case DT_VERDEFNUM:
10274 case DT_VERNEEDNUM:
10275 case DT_RELACOUNT:
10276 case DT_RELCOUNT:
10277 if (do_dynamic)
f7a99963
NC
10278 {
10279 print_vma (entry->d_un.d_val, UNSIGNED);
10280 putchar ('\n');
10281 }
252b5132
RH
10282 break;
10283
10284 case DT_SYMINSZ:
10285 case DT_SYMINENT:
10286 case DT_SYMINFO:
10287 case DT_USED:
10288 case DT_INIT_ARRAY:
10289 case DT_FINI_ARRAY:
10290 if (do_dynamic)
10291 {
d79b3d50
NC
10292 if (entry->d_tag == DT_USED
10293 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
252b5132 10294 {
2cf0635d 10295 char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
252b5132 10296
b34976b6 10297 if (*name)
252b5132
RH
10298 {
10299 printf (_("Not needed object: [%s]\n"), name);
10300 break;
10301 }
10302 }
103f02d3 10303
f7a99963
NC
10304 print_vma (entry->d_un.d_val, PREFIX_HEX);
10305 putchar ('\n');
252b5132
RH
10306 }
10307 break;
10308
10309 case DT_BIND_NOW:
10310 /* The value of this entry is ignored. */
35b1837e
AM
10311 if (do_dynamic)
10312 putchar ('\n');
252b5132 10313 break;
103f02d3 10314
047b2264
JJ
10315 case DT_GNU_PRELINKED:
10316 if (do_dynamic)
10317 {
2cf0635d 10318 struct tm * tmp;
91d6fa6a 10319 time_t atime = entry->d_un.d_val;
047b2264 10320
91d6fa6a 10321 tmp = gmtime (&atime);
071436c6
NC
10322 /* PR 17533 file: 041-1244816-0.004. */
10323 if (tmp == NULL)
5a2cbcf4
L
10324 printf (_("<corrupt time val: %lx"),
10325 (unsigned long) atime);
071436c6
NC
10326 else
10327 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
10328 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
10329 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
047b2264
JJ
10330
10331 }
10332 break;
10333
fdc90cb4
JJ
10334 case DT_GNU_HASH:
10335 dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
10336 if (do_dynamic)
10337 {
10338 print_vma (entry->d_un.d_val, PREFIX_HEX);
10339 putchar ('\n');
10340 }
10341 break;
10342
252b5132
RH
10343 default:
10344 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
b34976b6 10345 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
252b5132
RH
10346 entry->d_un.d_val;
10347
10348 if (do_dynamic)
10349 {
dda8d76d 10350 switch (filedata->file_header.e_machine)
252b5132
RH
10351 {
10352 case EM_MIPS:
4fe85591 10353 case EM_MIPS_RS3_LE:
b2d38a17 10354 dynamic_section_mips_val (entry);
252b5132 10355 break;
103f02d3 10356 case EM_PARISC:
b2d38a17 10357 dynamic_section_parisc_val (entry);
103f02d3 10358 break;
ecc51f48 10359 case EM_IA_64:
b2d38a17 10360 dynamic_section_ia64_val (entry);
ecc51f48 10361 break;
252b5132 10362 default:
f7a99963
NC
10363 print_vma (entry->d_un.d_val, PREFIX_HEX);
10364 putchar ('\n');
252b5132
RH
10365 }
10366 }
10367 break;
10368 }
10369 }
10370
32ec8896 10371 return TRUE;
252b5132
RH
10372}
10373
10374static char *
d3ba0551 10375get_ver_flags (unsigned int flags)
252b5132 10376{
6d4f21f6 10377 static char buff[128];
252b5132
RH
10378
10379 buff[0] = 0;
10380
10381 if (flags == 0)
10382 return _("none");
10383
10384 if (flags & VER_FLG_BASE)
7bb1ad17 10385 strcat (buff, "BASE");
252b5132
RH
10386
10387 if (flags & VER_FLG_WEAK)
10388 {
10389 if (flags & VER_FLG_BASE)
7bb1ad17 10390 strcat (buff, " | ");
252b5132 10391
7bb1ad17 10392 strcat (buff, "WEAK");
252b5132
RH
10393 }
10394
44ec90b9
RO
10395 if (flags & VER_FLG_INFO)
10396 {
10397 if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
7bb1ad17 10398 strcat (buff, " | ");
44ec90b9 10399
7bb1ad17 10400 strcat (buff, "INFO");
44ec90b9
RO
10401 }
10402
10403 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
7bb1ad17
MR
10404 {
10405 if (flags & (VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
10406 strcat (buff, " | ");
10407
10408 strcat (buff, _("<unknown>"));
10409 }
252b5132
RH
10410
10411 return buff;
10412}
10413
10414/* Display the contents of the version sections. */
98fb390a 10415
32ec8896 10416static bfd_boolean
dda8d76d 10417process_version_sections (Filedata * filedata)
252b5132 10418{
2cf0635d 10419 Elf_Internal_Shdr * section;
b34976b6 10420 unsigned i;
32ec8896 10421 bfd_boolean found = FALSE;
252b5132
RH
10422
10423 if (! do_version)
32ec8896 10424 return TRUE;
252b5132 10425
dda8d76d
NC
10426 for (i = 0, section = filedata->section_headers;
10427 i < filedata->file_header.e_shnum;
b34976b6 10428 i++, section++)
252b5132
RH
10429 {
10430 switch (section->sh_type)
10431 {
10432 case SHT_GNU_verdef:
10433 {
2cf0635d 10434 Elf_External_Verdef * edefs;
452bf675
AM
10435 unsigned long idx;
10436 unsigned long cnt;
2cf0635d 10437 char * endbuf;
252b5132 10438
32ec8896 10439 found = TRUE;
252b5132 10440
d3a49aa8
AM
10441 printf (ngettext ("\nVersion definition section '%s' "
10442 "contains %u entry:\n",
10443 "\nVersion definition section '%s' "
10444 "contains %u entries:\n",
10445 section->sh_info),
dda8d76d 10446 printable_section_name (filedata, section),
74e1a04b 10447 section->sh_info);
252b5132
RH
10448
10449 printf (_(" Addr: 0x"));
10450 printf_vma (section->sh_addr);
233f82cf 10451 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
1b228002 10452 (unsigned long) section->sh_offset, section->sh_link,
dda8d76d 10453 printable_section_name_from_index (filedata, section->sh_link));
252b5132 10454
3f5e193b 10455 edefs = (Elf_External_Verdef *)
dda8d76d 10456 get_data (NULL, filedata, section->sh_offset, 1,section->sh_size,
3f5e193b 10457 _("version definition section"));
a6e9f9df
AM
10458 if (!edefs)
10459 break;
59245841 10460 endbuf = (char *) edefs + section->sh_size;
252b5132 10461
1445030f 10462 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
252b5132 10463 {
2cf0635d
NC
10464 char * vstart;
10465 Elf_External_Verdef * edef;
b34976b6 10466 Elf_Internal_Verdef ent;
2cf0635d 10467 Elf_External_Verdaux * eaux;
b34976b6 10468 Elf_Internal_Verdaux aux;
452bf675 10469 unsigned long isum;
b34976b6 10470 int j;
103f02d3 10471
252b5132 10472 vstart = ((char *) edefs) + idx;
54806181
AM
10473 if (vstart + sizeof (*edef) > endbuf)
10474 break;
252b5132
RH
10475
10476 edef = (Elf_External_Verdef *) vstart;
10477
10478 ent.vd_version = BYTE_GET (edef->vd_version);
10479 ent.vd_flags = BYTE_GET (edef->vd_flags);
10480 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
10481 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
10482 ent.vd_hash = BYTE_GET (edef->vd_hash);
10483 ent.vd_aux = BYTE_GET (edef->vd_aux);
10484 ent.vd_next = BYTE_GET (edef->vd_next);
10485
452bf675 10486 printf (_(" %#06lx: Rev: %d Flags: %s"),
252b5132
RH
10487 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
10488
10489 printf (_(" Index: %d Cnt: %d "),
10490 ent.vd_ndx, ent.vd_cnt);
10491
452bf675 10492 /* Check for overflow. */
1445030f 10493 if (ent.vd_aux > (size_t) (endbuf - vstart))
dd24e3da
NC
10494 break;
10495
252b5132
RH
10496 vstart += ent.vd_aux;
10497
1445030f
AM
10498 if (vstart + sizeof (*eaux) > endbuf)
10499 break;
252b5132
RH
10500 eaux = (Elf_External_Verdaux *) vstart;
10501
10502 aux.vda_name = BYTE_GET (eaux->vda_name);
10503 aux.vda_next = BYTE_GET (eaux->vda_next);
10504
d79b3d50
NC
10505 if (VALID_DYNAMIC_NAME (aux.vda_name))
10506 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
252b5132
RH
10507 else
10508 printf (_("Name index: %ld\n"), aux.vda_name);
10509
10510 isum = idx + ent.vd_aux;
10511
b34976b6 10512 for (j = 1; j < ent.vd_cnt; j++)
252b5132 10513 {
1445030f
AM
10514 if (aux.vda_next < sizeof (*eaux)
10515 && !(j == ent.vd_cnt - 1 && aux.vda_next == 0))
10516 {
10517 warn (_("Invalid vda_next field of %lx\n"),
10518 aux.vda_next);
10519 j = ent.vd_cnt;
10520 break;
10521 }
dd24e3da 10522 /* Check for overflow. */
7e26601c 10523 if (aux.vda_next > (size_t) (endbuf - vstart))
dd24e3da
NC
10524 break;
10525
252b5132
RH
10526 isum += aux.vda_next;
10527 vstart += aux.vda_next;
10528
54806181
AM
10529 if (vstart + sizeof (*eaux) > endbuf)
10530 break;
1445030f 10531 eaux = (Elf_External_Verdaux *) vstart;
252b5132
RH
10532
10533 aux.vda_name = BYTE_GET (eaux->vda_name);
10534 aux.vda_next = BYTE_GET (eaux->vda_next);
10535
d79b3d50 10536 if (VALID_DYNAMIC_NAME (aux.vda_name))
452bf675 10537 printf (_(" %#06lx: Parent %d: %s\n"),
d79b3d50 10538 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
252b5132 10539 else
452bf675 10540 printf (_(" %#06lx: Parent %d, name index: %ld\n"),
252b5132
RH
10541 isum, j, aux.vda_name);
10542 }
dd24e3da 10543
54806181
AM
10544 if (j < ent.vd_cnt)
10545 printf (_(" Version def aux past end of section\n"));
252b5132 10546
c9f02c3e
MR
10547 /* PR 17531:
10548 file: id:000001,src:000172+005151,op:splice,rep:2. */
1445030f
AM
10549 if (ent.vd_next < sizeof (*edef)
10550 && !(cnt == section->sh_info - 1 && ent.vd_next == 0))
10551 {
10552 warn (_("Invalid vd_next field of %lx\n"), ent.vd_next);
10553 cnt = section->sh_info;
10554 break;
10555 }
452bf675 10556 if (ent.vd_next > (size_t) (endbuf - ((char *) edefs + idx)))
5d921cbd
NC
10557 break;
10558
252b5132
RH
10559 idx += ent.vd_next;
10560 }
dd24e3da 10561
54806181
AM
10562 if (cnt < section->sh_info)
10563 printf (_(" Version definition past end of section\n"));
252b5132
RH
10564
10565 free (edefs);
10566 }
10567 break;
103f02d3 10568
252b5132
RH
10569 case SHT_GNU_verneed:
10570 {
2cf0635d 10571 Elf_External_Verneed * eneed;
452bf675
AM
10572 unsigned long idx;
10573 unsigned long cnt;
2cf0635d 10574 char * endbuf;
252b5132 10575
32ec8896 10576 found = TRUE;
252b5132 10577
d3a49aa8
AM
10578 printf (ngettext ("\nVersion needs section '%s' "
10579 "contains %u entry:\n",
10580 "\nVersion needs section '%s' "
10581 "contains %u entries:\n",
10582 section->sh_info),
dda8d76d 10583 printable_section_name (filedata, section), section->sh_info);
252b5132
RH
10584
10585 printf (_(" Addr: 0x"));
10586 printf_vma (section->sh_addr);
72de5009 10587 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
1b228002 10588 (unsigned long) section->sh_offset, section->sh_link,
dda8d76d 10589 printable_section_name_from_index (filedata, section->sh_link));
252b5132 10590
dda8d76d 10591 eneed = (Elf_External_Verneed *) get_data (NULL, filedata,
3f5e193b
NC
10592 section->sh_offset, 1,
10593 section->sh_size,
9cf03b7e 10594 _("Version Needs section"));
a6e9f9df
AM
10595 if (!eneed)
10596 break;
59245841 10597 endbuf = (char *) eneed + section->sh_size;
252b5132
RH
10598
10599 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10600 {
2cf0635d 10601 Elf_External_Verneed * entry;
b34976b6 10602 Elf_Internal_Verneed ent;
452bf675 10603 unsigned long isum;
b34976b6 10604 int j;
2cf0635d 10605 char * vstart;
252b5132
RH
10606
10607 vstart = ((char *) eneed) + idx;
54806181
AM
10608 if (vstart + sizeof (*entry) > endbuf)
10609 break;
252b5132
RH
10610
10611 entry = (Elf_External_Verneed *) vstart;
10612
10613 ent.vn_version = BYTE_GET (entry->vn_version);
10614 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
10615 ent.vn_file = BYTE_GET (entry->vn_file);
10616 ent.vn_aux = BYTE_GET (entry->vn_aux);
10617 ent.vn_next = BYTE_GET (entry->vn_next);
10618
452bf675 10619 printf (_(" %#06lx: Version: %d"), idx, ent.vn_version);
252b5132 10620
d79b3d50
NC
10621 if (VALID_DYNAMIC_NAME (ent.vn_file))
10622 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
252b5132
RH
10623 else
10624 printf (_(" File: %lx"), ent.vn_file);
10625
10626 printf (_(" Cnt: %d\n"), ent.vn_cnt);
10627
dd24e3da 10628 /* Check for overflow. */
7e26601c 10629 if (ent.vn_aux > (size_t) (endbuf - vstart))
dd24e3da 10630 break;
252b5132
RH
10631 vstart += ent.vn_aux;
10632
10633 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
10634 {
2cf0635d 10635 Elf_External_Vernaux * eaux;
b34976b6 10636 Elf_Internal_Vernaux aux;
252b5132 10637
54806181
AM
10638 if (vstart + sizeof (*eaux) > endbuf)
10639 break;
252b5132
RH
10640 eaux = (Elf_External_Vernaux *) vstart;
10641
10642 aux.vna_hash = BYTE_GET (eaux->vna_hash);
10643 aux.vna_flags = BYTE_GET (eaux->vna_flags);
10644 aux.vna_other = BYTE_GET (eaux->vna_other);
10645 aux.vna_name = BYTE_GET (eaux->vna_name);
10646 aux.vna_next = BYTE_GET (eaux->vna_next);
10647
d79b3d50 10648 if (VALID_DYNAMIC_NAME (aux.vna_name))
452bf675 10649 printf (_(" %#06lx: Name: %s"),
d79b3d50 10650 isum, GET_DYNAMIC_NAME (aux.vna_name));
252b5132 10651 else
452bf675 10652 printf (_(" %#06lx: Name index: %lx"),
252b5132
RH
10653 isum, aux.vna_name);
10654
10655 printf (_(" Flags: %s Version: %d\n"),
10656 get_ver_flags (aux.vna_flags), aux.vna_other);
10657
1445030f
AM
10658 if (aux.vna_next < sizeof (*eaux)
10659 && !(j == ent.vn_cnt - 1 && aux.vna_next == 0))
53774b7e
NC
10660 {
10661 warn (_("Invalid vna_next field of %lx\n"),
10662 aux.vna_next);
10663 j = ent.vn_cnt;
10664 break;
10665 }
1445030f
AM
10666 /* Check for overflow. */
10667 if (aux.vna_next > (size_t) (endbuf - vstart))
10668 break;
252b5132
RH
10669 isum += aux.vna_next;
10670 vstart += aux.vna_next;
10671 }
9cf03b7e 10672
54806181 10673 if (j < ent.vn_cnt)
9cf03b7e 10674 warn (_("Missing Version Needs auxillary information\n"));
252b5132 10675
1445030f
AM
10676 if (ent.vn_next < sizeof (*entry)
10677 && !(cnt == section->sh_info - 1 && ent.vn_next == 0))
c24cf8b6 10678 {
452bf675 10679 warn (_("Invalid vn_next field of %lx\n"), ent.vn_next);
c24cf8b6
NC
10680 cnt = section->sh_info;
10681 break;
10682 }
1445030f
AM
10683 if (ent.vn_next > (size_t) (endbuf - ((char *) eneed + idx)))
10684 break;
252b5132
RH
10685 idx += ent.vn_next;
10686 }
9cf03b7e 10687
54806181 10688 if (cnt < section->sh_info)
9cf03b7e 10689 warn (_("Missing Version Needs information\n"));
103f02d3 10690
252b5132
RH
10691 free (eneed);
10692 }
10693 break;
10694
10695 case SHT_GNU_versym:
10696 {
2cf0635d 10697 Elf_Internal_Shdr * link_section;
8b73c356
NC
10698 size_t total;
10699 unsigned int cnt;
2cf0635d
NC
10700 unsigned char * edata;
10701 unsigned short * data;
10702 char * strtab;
10703 Elf_Internal_Sym * symbols;
10704 Elf_Internal_Shdr * string_sec;
ba5cdace 10705 unsigned long num_syms;
d3ba0551 10706 long off;
252b5132 10707
dda8d76d 10708 if (section->sh_link >= filedata->file_header.e_shnum)
c256ffe7
JJ
10709 break;
10710
dda8d76d 10711 link_section = filedata->section_headers + section->sh_link;
08d8fa11 10712 total = section->sh_size / sizeof (Elf_External_Versym);
252b5132 10713
dda8d76d 10714 if (link_section->sh_link >= filedata->file_header.e_shnum)
c256ffe7
JJ
10715 break;
10716
32ec8896 10717 found = TRUE;
252b5132 10718
dda8d76d 10719 symbols = GET_ELF_SYMBOLS (filedata, link_section, & num_syms);
dd24e3da
NC
10720 if (symbols == NULL)
10721 break;
252b5132 10722
dda8d76d 10723 string_sec = filedata->section_headers + link_section->sh_link;
252b5132 10724
dda8d76d 10725 strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
3f5e193b
NC
10726 string_sec->sh_size,
10727 _("version string table"));
a6e9f9df 10728 if (!strtab)
0429c154
MS
10729 {
10730 free (symbols);
10731 break;
10732 }
252b5132 10733
d3a49aa8
AM
10734 printf (ngettext ("\nVersion symbols section '%s' "
10735 "contains %lu entry:\n",
10736 "\nVersion symbols section '%s' "
10737 "contains %lu entries:\n",
10738 total),
dda8d76d 10739 printable_section_name (filedata, section), (unsigned long) total);
252b5132
RH
10740
10741 printf (_(" Addr: "));
10742 printf_vma (section->sh_addr);
72de5009 10743 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
1b228002 10744 (unsigned long) section->sh_offset, section->sh_link,
dda8d76d 10745 printable_section_name (filedata, link_section));
252b5132 10746
dda8d76d 10747 off = offset_from_vma (filedata,
d3ba0551
AM
10748 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10749 total * sizeof (short));
dda8d76d 10750 edata = (unsigned char *) get_data (NULL, filedata, off, total,
3f5e193b
NC
10751 sizeof (short),
10752 _("version symbol data"));
a6e9f9df
AM
10753 if (!edata)
10754 {
10755 free (strtab);
0429c154 10756 free (symbols);
a6e9f9df
AM
10757 break;
10758 }
252b5132 10759
3f5e193b 10760 data = (short unsigned int *) cmalloc (total, sizeof (short));
252b5132
RH
10761
10762 for (cnt = total; cnt --;)
b34976b6
AM
10763 data[cnt] = byte_get (edata + cnt * sizeof (short),
10764 sizeof (short));
252b5132
RH
10765
10766 free (edata);
10767
10768 for (cnt = 0; cnt < total; cnt += 4)
10769 {
10770 int j, nn;
ab273396
AM
10771 char *name;
10772 char *invalid = _("*invalid*");
252b5132
RH
10773
10774 printf (" %03x:", cnt);
10775
10776 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
b34976b6 10777 switch (data[cnt + j])
252b5132
RH
10778 {
10779 case 0:
10780 fputs (_(" 0 (*local*) "), stdout);
10781 break;
10782
10783 case 1:
10784 fputs (_(" 1 (*global*) "), stdout);
10785 break;
10786
10787 default:
c244d050
NC
10788 nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
10789 data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
252b5132 10790
dd24e3da 10791 /* If this index value is greater than the size of the symbols
ba5cdace
NC
10792 array, break to avoid an out-of-bounds read. */
10793 if ((unsigned long)(cnt + j) >= num_syms)
dd24e3da
NC
10794 {
10795 warn (_("invalid index into symbol array\n"));
10796 break;
10797 }
10798
ab273396
AM
10799 name = NULL;
10800 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
252b5132 10801 {
b34976b6
AM
10802 Elf_Internal_Verneed ivn;
10803 unsigned long offset;
252b5132 10804
d93f0186 10805 offset = offset_from_vma
dda8d76d 10806 (filedata, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
d93f0186 10807 sizeof (Elf_External_Verneed));
252b5132 10808
b34976b6 10809 do
252b5132 10810 {
b34976b6
AM
10811 Elf_Internal_Vernaux ivna;
10812 Elf_External_Verneed evn;
10813 Elf_External_Vernaux evna;
10814 unsigned long a_off;
252b5132 10815
dda8d76d 10816 if (get_data (&evn, filedata, offset, sizeof (evn), 1,
59245841
NC
10817 _("version need")) == NULL)
10818 break;
0b4362b0 10819
252b5132
RH
10820 ivn.vn_aux = BYTE_GET (evn.vn_aux);
10821 ivn.vn_next = BYTE_GET (evn.vn_next);
10822
10823 a_off = offset + ivn.vn_aux;
10824
10825 do
10826 {
dda8d76d 10827 if (get_data (&evna, filedata, a_off, sizeof (evna),
59245841
NC
10828 1, _("version need aux (2)")) == NULL)
10829 {
10830 ivna.vna_next = 0;
10831 ivna.vna_other = 0;
10832 }
10833 else
10834 {
10835 ivna.vna_next = BYTE_GET (evna.vna_next);
10836 ivna.vna_other = BYTE_GET (evna.vna_other);
10837 }
252b5132
RH
10838
10839 a_off += ivna.vna_next;
10840 }
b34976b6 10841 while (ivna.vna_other != data[cnt + j]
252b5132
RH
10842 && ivna.vna_next != 0);
10843
b34976b6 10844 if (ivna.vna_other == data[cnt + j])
252b5132
RH
10845 {
10846 ivna.vna_name = BYTE_GET (evna.vna_name);
10847
54806181 10848 if (ivna.vna_name >= string_sec->sh_size)
ab273396 10849 name = invalid;
54806181
AM
10850 else
10851 name = strtab + ivna.vna_name;
252b5132
RH
10852 break;
10853 }
10854
10855 offset += ivn.vn_next;
10856 }
10857 while (ivn.vn_next);
10858 }
00d93f34 10859
ab273396 10860 if (data[cnt + j] != 0x8001
b34976b6 10861 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
252b5132 10862 {
b34976b6
AM
10863 Elf_Internal_Verdef ivd;
10864 Elf_External_Verdef evd;
10865 unsigned long offset;
252b5132 10866
d93f0186 10867 offset = offset_from_vma
dda8d76d 10868 (filedata, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
d93f0186 10869 sizeof evd);
252b5132
RH
10870
10871 do
10872 {
dda8d76d 10873 if (get_data (&evd, filedata, offset, sizeof (evd), 1,
59245841
NC
10874 _("version def")) == NULL)
10875 {
10876 ivd.vd_next = 0;
948f632f 10877 /* PR 17531: file: 046-1082287-0.004. */
3102e897
NC
10878 ivd.vd_ndx = (data[cnt + j] & VERSYM_VERSION) + 1;
10879 break;
59245841
NC
10880 }
10881 else
10882 {
10883 ivd.vd_next = BYTE_GET (evd.vd_next);
10884 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10885 }
252b5132
RH
10886
10887 offset += ivd.vd_next;
10888 }
c244d050 10889 while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
252b5132
RH
10890 && ivd.vd_next != 0);
10891
c244d050 10892 if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
252b5132 10893 {
b34976b6
AM
10894 Elf_External_Verdaux evda;
10895 Elf_Internal_Verdaux ivda;
252b5132
RH
10896
10897 ivd.vd_aux = BYTE_GET (evd.vd_aux);
10898
dda8d76d 10899 if (get_data (&evda, filedata,
59245841
NC
10900 offset - ivd.vd_next + ivd.vd_aux,
10901 sizeof (evda), 1,
10902 _("version def aux")) == NULL)
10903 break;
252b5132
RH
10904
10905 ivda.vda_name = BYTE_GET (evda.vda_name);
10906
54806181 10907 if (ivda.vda_name >= string_sec->sh_size)
ab273396
AM
10908 name = invalid;
10909 else if (name != NULL && name != invalid)
10910 name = _("*both*");
54806181
AM
10911 else
10912 name = strtab + ivda.vda_name;
252b5132
RH
10913 }
10914 }
ab273396
AM
10915 if (name != NULL)
10916 nn += printf ("(%s%-*s",
10917 name,
10918 12 - (int) strlen (name),
10919 ")");
252b5132
RH
10920
10921 if (nn < 18)
10922 printf ("%*c", 18 - nn, ' ');
10923 }
10924
10925 putchar ('\n');
10926 }
10927
10928 free (data);
10929 free (strtab);
10930 free (symbols);
10931 }
10932 break;
103f02d3 10933
252b5132
RH
10934 default:
10935 break;
10936 }
10937 }
10938
10939 if (! found)
10940 printf (_("\nNo version information found in this file.\n"));
10941
32ec8896 10942 return TRUE;
252b5132
RH
10943}
10944
d1133906 10945static const char *
dda8d76d 10946get_symbol_binding (Filedata * filedata, unsigned int binding)
252b5132 10947{
b34976b6 10948 static char buff[32];
252b5132
RH
10949
10950 switch (binding)
10951 {
b34976b6
AM
10952 case STB_LOCAL: return "LOCAL";
10953 case STB_GLOBAL: return "GLOBAL";
10954 case STB_WEAK: return "WEAK";
252b5132
RH
10955 default:
10956 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
e9e44622
JJ
10957 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
10958 binding);
252b5132 10959 else if (binding >= STB_LOOS && binding <= STB_HIOS)
3e7a7d11
NC
10960 {
10961 if (binding == STB_GNU_UNIQUE
dda8d76d 10962 && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
9c55345c 10963 /* GNU is still using the default value 0. */
dda8d76d 10964 || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
3e7a7d11
NC
10965 return "UNIQUE";
10966 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
10967 }
252b5132 10968 else
e9e44622 10969 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
252b5132
RH
10970 return buff;
10971 }
10972}
10973
d1133906 10974static const char *
dda8d76d 10975get_symbol_type (Filedata * filedata, unsigned int type)
252b5132 10976{
b34976b6 10977 static char buff[32];
252b5132
RH
10978
10979 switch (type)
10980 {
b34976b6
AM
10981 case STT_NOTYPE: return "NOTYPE";
10982 case STT_OBJECT: return "OBJECT";
10983 case STT_FUNC: return "FUNC";
10984 case STT_SECTION: return "SECTION";
10985 case STT_FILE: return "FILE";
10986 case STT_COMMON: return "COMMON";
10987 case STT_TLS: return "TLS";
15ab5209
DB
10988 case STT_RELC: return "RELC";
10989 case STT_SRELC: return "SRELC";
252b5132
RH
10990 default:
10991 if (type >= STT_LOPROC && type <= STT_HIPROC)
df75f1af 10992 {
dda8d76d 10993 if (filedata->file_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
3510a7b8 10994 return "THUMB_FUNC";
103f02d3 10995
dda8d76d 10996 if (filedata->file_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
103f02d3
UD
10997 return "REGISTER";
10998
dda8d76d 10999 if (filedata->file_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
103f02d3
UD
11000 return "PARISC_MILLI";
11001
e9e44622 11002 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
df75f1af 11003 }
252b5132 11004 else if (type >= STT_LOOS && type <= STT_HIOS)
103f02d3 11005 {
dda8d76d 11006 if (filedata->file_header.e_machine == EM_PARISC)
103f02d3
UD
11007 {
11008 if (type == STT_HP_OPAQUE)
11009 return "HP_OPAQUE";
11010 if (type == STT_HP_STUB)
11011 return "HP_STUB";
11012 }
11013
d8045f23 11014 if (type == STT_GNU_IFUNC
dda8d76d
NC
11015 && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
11016 || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
9c55345c 11017 /* GNU is still using the default value 0. */
dda8d76d 11018 || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
d8045f23
NC
11019 return "IFUNC";
11020
e9e44622 11021 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
103f02d3 11022 }
252b5132 11023 else
e9e44622 11024 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
252b5132
RH
11025 return buff;
11026 }
11027}
11028
d1133906 11029static const char *
d3ba0551 11030get_symbol_visibility (unsigned int visibility)
d1133906
NC
11031{
11032 switch (visibility)
11033 {
b34976b6
AM
11034 case STV_DEFAULT: return "DEFAULT";
11035 case STV_INTERNAL: return "INTERNAL";
11036 case STV_HIDDEN: return "HIDDEN";
d1133906 11037 case STV_PROTECTED: return "PROTECTED";
bee0ee85
NC
11038 default:
11039 error (_("Unrecognized visibility value: %u"), visibility);
11040 return _("<unknown>");
d1133906
NC
11041 }
11042}
11043
fd85a6a1
NC
11044static const char *
11045get_solaris_symbol_visibility (unsigned int visibility)
11046{
11047 switch (visibility)
11048 {
11049 case 4: return "EXPORTED";
11050 case 5: return "SINGLETON";
11051 case 6: return "ELIMINATE";
11052 default: return get_symbol_visibility (visibility);
11053 }
11054}
11055
5e2b0d47
NC
11056static const char *
11057get_mips_symbol_other (unsigned int other)
11058{
11059 switch (other)
11060 {
32ec8896
NC
11061 case STO_OPTIONAL: return "OPTIONAL";
11062 case STO_MIPS_PLT: return "MIPS PLT";
11063 case STO_MIPS_PIC: return "MIPS PIC";
11064 case STO_MICROMIPS: return "MICROMIPS";
11065 case STO_MICROMIPS | STO_MIPS_PIC: return "MICROMIPS, MIPS PIC";
11066 case STO_MIPS16: return "MIPS16";
11067 default: return NULL;
5e2b0d47
NC
11068 }
11069}
11070
28f997cf 11071static const char *
dda8d76d 11072get_ia64_symbol_other (Filedata * filedata, unsigned int other)
28f997cf 11073{
dda8d76d 11074 if (is_ia64_vms (filedata))
28f997cf
TG
11075 {
11076 static char res[32];
11077
11078 res[0] = 0;
11079
11080 /* Function types is for images and .STB files only. */
dda8d76d 11081 switch (filedata->file_header.e_type)
28f997cf
TG
11082 {
11083 case ET_DYN:
11084 case ET_EXEC:
11085 switch (VMS_ST_FUNC_TYPE (other))
11086 {
11087 case VMS_SFT_CODE_ADDR:
11088 strcat (res, " CA");
11089 break;
11090 case VMS_SFT_SYMV_IDX:
11091 strcat (res, " VEC");
11092 break;
11093 case VMS_SFT_FD:
11094 strcat (res, " FD");
11095 break;
11096 case VMS_SFT_RESERVE:
11097 strcat (res, " RSV");
11098 break;
11099 default:
bee0ee85
NC
11100 warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
11101 VMS_ST_FUNC_TYPE (other));
11102 strcat (res, " <unknown>");
11103 break;
28f997cf
TG
11104 }
11105 break;
11106 default:
11107 break;
11108 }
11109 switch (VMS_ST_LINKAGE (other))
11110 {
11111 case VMS_STL_IGNORE:
11112 strcat (res, " IGN");
11113 break;
11114 case VMS_STL_RESERVE:
11115 strcat (res, " RSV");
11116 break;
11117 case VMS_STL_STD:
11118 strcat (res, " STD");
11119 break;
11120 case VMS_STL_LNK:
11121 strcat (res, " LNK");
11122 break;
11123 default:
bee0ee85
NC
11124 warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
11125 VMS_ST_LINKAGE (other));
11126 strcat (res, " <unknown>");
11127 break;
28f997cf
TG
11128 }
11129
11130 if (res[0] != 0)
11131 return res + 1;
11132 else
11133 return res;
11134 }
11135 return NULL;
11136}
11137
6911b7dc
AM
11138static const char *
11139get_ppc64_symbol_other (unsigned int other)
11140{
14732552
AM
11141 if ((other & ~STO_PPC64_LOCAL_MASK) != 0)
11142 return NULL;
11143
11144 other >>= STO_PPC64_LOCAL_BIT;
11145 if (other <= 6)
6911b7dc
AM
11146 {
11147 static char buf[32];
14732552
AM
11148 if (other >= 2)
11149 other = ppc64_decode_local_entry (other);
11150 snprintf (buf, sizeof buf, _("<localentry>: %d"), other);
6911b7dc
AM
11151 return buf;
11152 }
11153 return NULL;
11154}
11155
5e2b0d47 11156static const char *
dda8d76d 11157get_symbol_other (Filedata * filedata, unsigned int other)
5e2b0d47
NC
11158{
11159 const char * result = NULL;
11160 static char buff [32];
11161
11162 if (other == 0)
11163 return "";
11164
dda8d76d 11165 switch (filedata->file_header.e_machine)
5e2b0d47
NC
11166 {
11167 case EM_MIPS:
11168 result = get_mips_symbol_other (other);
28f997cf
TG
11169 break;
11170 case EM_IA_64:
dda8d76d 11171 result = get_ia64_symbol_other (filedata, other);
28f997cf 11172 break;
6911b7dc
AM
11173 case EM_PPC64:
11174 result = get_ppc64_symbol_other (other);
11175 break;
5e2b0d47 11176 default:
fd85a6a1 11177 result = NULL;
5e2b0d47
NC
11178 break;
11179 }
11180
11181 if (result)
11182 return result;
11183
11184 snprintf (buff, sizeof buff, _("<other>: %x"), other);
11185 return buff;
11186}
11187
d1133906 11188static const char *
dda8d76d 11189get_symbol_index_type (Filedata * filedata, unsigned int type)
252b5132 11190{
b34976b6 11191 static char buff[32];
5cf1065c 11192
252b5132
RH
11193 switch (type)
11194 {
b34976b6
AM
11195 case SHN_UNDEF: return "UND";
11196 case SHN_ABS: return "ABS";
11197 case SHN_COMMON: return "COM";
252b5132 11198 default:
9ce701e2 11199 if (type == SHN_IA_64_ANSI_COMMON
dda8d76d
NC
11200 && filedata->file_header.e_machine == EM_IA_64
11201 && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
9ce701e2 11202 return "ANSI_COM";
dda8d76d
NC
11203 else if ((filedata->file_header.e_machine == EM_X86_64
11204 || filedata->file_header.e_machine == EM_L1OM
11205 || filedata->file_header.e_machine == EM_K1OM)
3b22753a
L
11206 && type == SHN_X86_64_LCOMMON)
11207 return "LARGE_COM";
ac145307 11208 else if ((type == SHN_MIPS_SCOMMON
dda8d76d 11209 && filedata->file_header.e_machine == EM_MIPS)
ac145307 11210 || (type == SHN_TIC6X_SCOMMON
dda8d76d 11211 && filedata->file_header.e_machine == EM_TI_C6000))
172553c7
TS
11212 return "SCOM";
11213 else if (type == SHN_MIPS_SUNDEFINED
dda8d76d 11214 && filedata->file_header.e_machine == EM_MIPS)
172553c7 11215 return "SUND";
9ce701e2 11216 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
4fbb74a6 11217 sprintf (buff, "PRC[0x%04x]", type & 0xffff);
252b5132 11218 else if (type >= SHN_LOOS && type <= SHN_HIOS)
4fbb74a6
AM
11219 sprintf (buff, "OS [0x%04x]", type & 0xffff);
11220 else if (type >= SHN_LORESERVE)
11221 sprintf (buff, "RSV[0x%04x]", type & 0xffff);
dda8d76d 11222 else if (type >= filedata->file_header.e_shnum)
e0a31db1 11223 sprintf (buff, _("bad section index[%3d]"), type);
252b5132 11224 else
232e7cb8 11225 sprintf (buff, "%3d", type);
5cf1065c 11226 break;
252b5132 11227 }
5cf1065c
NC
11228
11229 return buff;
252b5132
RH
11230}
11231
66543521 11232static bfd_vma *
dda8d76d 11233get_dynamic_data (Filedata * filedata, bfd_size_type number, unsigned int ent_size)
252b5132 11234{
2cf0635d
NC
11235 unsigned char * e_data;
11236 bfd_vma * i_data;
252b5132 11237
57028622
NC
11238 /* If the size_t type is smaller than the bfd_size_type, eg because
11239 you are building a 32-bit tool on a 64-bit host, then make sure
11240 that when (number) is cast to (size_t) no information is lost. */
11241 if (sizeof (size_t) < sizeof (bfd_size_type)
11242 && (bfd_size_type) ((size_t) number) != number)
11243 {
66cfc0fd
AM
11244 error (_("Size truncation prevents reading %s elements of size %u\n"),
11245 bfd_vmatoa ("u", number), ent_size);
57028622
NC
11246 return NULL;
11247 }
948f632f 11248
3102e897
NC
11249 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
11250 attempting to allocate memory when the read is bound to fail. */
dda8d76d 11251 if (ent_size * number > filedata->file_size)
3102e897 11252 {
66cfc0fd
AM
11253 error (_("Invalid number of dynamic entries: %s\n"),
11254 bfd_vmatoa ("u", number));
3102e897
NC
11255 return NULL;
11256 }
11257
57028622 11258 e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
252b5132
RH
11259 if (e_data == NULL)
11260 {
66cfc0fd
AM
11261 error (_("Out of memory reading %s dynamic entries\n"),
11262 bfd_vmatoa ("u", number));
252b5132
RH
11263 return NULL;
11264 }
11265
dda8d76d 11266 if (fread (e_data, ent_size, (size_t) number, filedata->handle) != number)
252b5132 11267 {
66cfc0fd
AM
11268 error (_("Unable to read in %s bytes of dynamic data\n"),
11269 bfd_vmatoa ("u", number * ent_size));
3102e897 11270 free (e_data);
252b5132
RH
11271 return NULL;
11272 }
11273
57028622 11274 i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
252b5132
RH
11275 if (i_data == NULL)
11276 {
66cfc0fd
AM
11277 error (_("Out of memory allocating space for %s dynamic entries\n"),
11278 bfd_vmatoa ("u", number));
252b5132
RH
11279 free (e_data);
11280 return NULL;
11281 }
11282
11283 while (number--)
66543521 11284 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
252b5132
RH
11285
11286 free (e_data);
11287
11288 return i_data;
11289}
11290
6bd1a22c 11291static void
dda8d76d 11292print_dynamic_symbol (Filedata * filedata, bfd_vma si, unsigned long hn)
6bd1a22c 11293{
2cf0635d 11294 Elf_Internal_Sym * psym;
6bd1a22c
L
11295 int n;
11296
6bd1a22c
L
11297 n = print_vma (si, DEC_5);
11298 if (n < 5)
0b4362b0 11299 fputs (&" "[n], stdout);
6bd1a22c 11300 printf (" %3lu: ", hn);
e0a31db1
NC
11301
11302 if (dynamic_symbols == NULL || si >= num_dynamic_syms)
11303 {
3102e897
NC
11304 printf (_("<No info available for dynamic symbol number %lu>\n"),
11305 (unsigned long) si);
e0a31db1
NC
11306 return;
11307 }
11308
11309 psym = dynamic_symbols + si;
6bd1a22c
L
11310 print_vma (psym->st_value, LONG_HEX);
11311 putchar (' ');
11312 print_vma (psym->st_size, DEC_5);
11313
dda8d76d
NC
11314 printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
11315 printf (" %-6s", get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
fd85a6a1 11316
dda8d76d 11317 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
fd85a6a1
NC
11318 printf (" %-7s", get_solaris_symbol_visibility (psym->st_other));
11319 else
11320 {
11321 unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11322
11323 printf (" %-7s", get_symbol_visibility (vis));
11324 /* Check to see if any other bits in the st_other field are set.
11325 Note - displaying this information disrupts the layout of the
11326 table being generated, but for the moment this case is very
11327 rare. */
11328 if (psym->st_other ^ vis)
dda8d76d 11329 printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
fd85a6a1
NC
11330 }
11331
dda8d76d 11332 printf (" %3.3s ", get_symbol_index_type (filedata, psym->st_shndx));
6bd1a22c
L
11333 if (VALID_DYNAMIC_NAME (psym->st_name))
11334 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
11335 else
2b692964 11336 printf (_(" <corrupt: %14ld>"), psym->st_name);
6bd1a22c
L
11337 putchar ('\n');
11338}
11339
bb4d2ac2 11340static const char *
dda8d76d 11341get_symbol_version_string (Filedata * filedata,
1449284b
NC
11342 bfd_boolean is_dynsym,
11343 const char * strtab,
11344 unsigned long int strtab_size,
11345 unsigned int si,
11346 Elf_Internal_Sym * psym,
11347 enum versioned_symbol_info * sym_info,
11348 unsigned short * vna_other)
bb4d2ac2 11349{
ab273396
AM
11350 unsigned char data[2];
11351 unsigned short vers_data;
11352 unsigned long offset;
7a815dd5 11353 unsigned short max_vd_ndx;
bb4d2ac2 11354
ab273396
AM
11355 if (!is_dynsym
11356 || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
11357 return NULL;
bb4d2ac2 11358
dda8d76d 11359 offset = offset_from_vma (filedata, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
ab273396 11360 sizeof data + si * sizeof (vers_data));
bb4d2ac2 11361
dda8d76d 11362 if (get_data (&data, filedata, offset + si * sizeof (vers_data),
ab273396
AM
11363 sizeof (data), 1, _("version data")) == NULL)
11364 return NULL;
11365
11366 vers_data = byte_get (data, 2);
bb4d2ac2 11367
1f6f5dba 11368 if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data == 0)
ab273396 11369 return NULL;
bb4d2ac2 11370
7a815dd5
L
11371 max_vd_ndx = 0;
11372
ab273396
AM
11373 /* Usually we'd only see verdef for defined symbols, and verneed for
11374 undefined symbols. However, symbols defined by the linker in
11375 .dynbss for variables copied from a shared library in order to
11376 avoid text relocations are defined yet have verneed. We could
11377 use a heuristic to detect the special case, for example, check
11378 for verneed first on symbols defined in SHT_NOBITS sections, but
11379 it is simpler and more reliable to just look for both verdef and
11380 verneed. .dynbss might not be mapped to a SHT_NOBITS section. */
bb4d2ac2 11381
ab273396
AM
11382 if (psym->st_shndx != SHN_UNDEF
11383 && vers_data != 0x8001
11384 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
11385 {
11386 Elf_Internal_Verdef ivd;
11387 Elf_Internal_Verdaux ivda;
11388 Elf_External_Verdaux evda;
11389 unsigned long off;
bb4d2ac2 11390
dda8d76d 11391 off = offset_from_vma (filedata,
ab273396
AM
11392 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
11393 sizeof (Elf_External_Verdef));
11394
11395 do
bb4d2ac2 11396 {
ab273396
AM
11397 Elf_External_Verdef evd;
11398
dda8d76d 11399 if (get_data (&evd, filedata, off, sizeof (evd), 1,
ab273396
AM
11400 _("version def")) == NULL)
11401 {
11402 ivd.vd_ndx = 0;
11403 ivd.vd_aux = 0;
11404 ivd.vd_next = 0;
1f6f5dba 11405 ivd.vd_flags = 0;
ab273396
AM
11406 }
11407 else
bb4d2ac2 11408 {
ab273396
AM
11409 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
11410 ivd.vd_aux = BYTE_GET (evd.vd_aux);
11411 ivd.vd_next = BYTE_GET (evd.vd_next);
1f6f5dba 11412 ivd.vd_flags = BYTE_GET (evd.vd_flags);
ab273396 11413 }
bb4d2ac2 11414
7a815dd5
L
11415 if ((ivd.vd_ndx & VERSYM_VERSION) > max_vd_ndx)
11416 max_vd_ndx = ivd.vd_ndx & VERSYM_VERSION;
11417
ab273396
AM
11418 off += ivd.vd_next;
11419 }
11420 while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
bb4d2ac2 11421
ab273396
AM
11422 if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
11423 {
1f6f5dba
L
11424 if (ivd.vd_ndx == 1 && ivd.vd_flags == VER_FLG_BASE)
11425 return NULL;
11426
ab273396
AM
11427 off -= ivd.vd_next;
11428 off += ivd.vd_aux;
bb4d2ac2 11429
dda8d76d 11430 if (get_data (&evda, filedata, off, sizeof (evda), 1,
ab273396
AM
11431 _("version def aux")) != NULL)
11432 {
11433 ivda.vda_name = BYTE_GET (evda.vda_name);
bb4d2ac2 11434
ab273396
AM
11435 if (psym->st_name != ivda.vda_name)
11436 {
11437 *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
11438 ? symbol_hidden : symbol_public);
11439 return (ivda.vda_name < strtab_size
11440 ? strtab + ivda.vda_name : _("<corrupt>"));
11441 }
11442 }
11443 }
11444 }
bb4d2ac2 11445
ab273396
AM
11446 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
11447 {
11448 Elf_External_Verneed evn;
11449 Elf_Internal_Verneed ivn;
11450 Elf_Internal_Vernaux ivna;
bb4d2ac2 11451
dda8d76d 11452 offset = offset_from_vma (filedata,
ab273396
AM
11453 version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
11454 sizeof evn);
11455 do
11456 {
11457 unsigned long vna_off;
bb4d2ac2 11458
dda8d76d 11459 if (get_data (&evn, filedata, offset, sizeof (evn), 1,
ab273396
AM
11460 _("version need")) == NULL)
11461 {
11462 ivna.vna_next = 0;
11463 ivna.vna_other = 0;
11464 ivna.vna_name = 0;
11465 break;
11466 }
bb4d2ac2 11467
ab273396
AM
11468 ivn.vn_aux = BYTE_GET (evn.vn_aux);
11469 ivn.vn_next = BYTE_GET (evn.vn_next);
bb4d2ac2 11470
ab273396 11471 vna_off = offset + ivn.vn_aux;
bb4d2ac2 11472
ab273396
AM
11473 do
11474 {
11475 Elf_External_Vernaux evna;
bb4d2ac2 11476
dda8d76d 11477 if (get_data (&evna, filedata, vna_off, sizeof (evna), 1,
ab273396 11478 _("version need aux (3)")) == NULL)
bb4d2ac2 11479 {
ab273396
AM
11480 ivna.vna_next = 0;
11481 ivna.vna_other = 0;
11482 ivna.vna_name = 0;
bb4d2ac2 11483 }
bb4d2ac2 11484 else
bb4d2ac2 11485 {
ab273396
AM
11486 ivna.vna_other = BYTE_GET (evna.vna_other);
11487 ivna.vna_next = BYTE_GET (evna.vna_next);
11488 ivna.vna_name = BYTE_GET (evna.vna_name);
11489 }
bb4d2ac2 11490
ab273396
AM
11491 vna_off += ivna.vna_next;
11492 }
11493 while (ivna.vna_other != vers_data && ivna.vna_next != 0);
bb4d2ac2 11494
ab273396
AM
11495 if (ivna.vna_other == vers_data)
11496 break;
bb4d2ac2 11497
ab273396
AM
11498 offset += ivn.vn_next;
11499 }
11500 while (ivn.vn_next != 0);
bb4d2ac2 11501
ab273396
AM
11502 if (ivna.vna_other == vers_data)
11503 {
11504 *sym_info = symbol_undefined;
11505 *vna_other = ivna.vna_other;
11506 return (ivna.vna_name < strtab_size
11507 ? strtab + ivna.vna_name : _("<corrupt>"));
bb4d2ac2 11508 }
7a815dd5
L
11509 else if ((max_vd_ndx || (vers_data & VERSYM_VERSION) != 1)
11510 && (vers_data & VERSYM_VERSION) > max_vd_ndx)
11511 return _("<corrupt>");
bb4d2ac2 11512 }
ab273396 11513 return NULL;
bb4d2ac2
L
11514}
11515
e3c8793a 11516/* Dump the symbol table. */
32ec8896 11517static bfd_boolean
dda8d76d 11518process_symbol_table (Filedata * filedata)
252b5132 11519{
2cf0635d 11520 Elf_Internal_Shdr * section;
8b73c356
NC
11521 bfd_size_type nbuckets = 0;
11522 bfd_size_type nchains = 0;
2cf0635d
NC
11523 bfd_vma * buckets = NULL;
11524 bfd_vma * chains = NULL;
fdc90cb4 11525 bfd_vma ngnubuckets = 0;
2cf0635d
NC
11526 bfd_vma * gnubuckets = NULL;
11527 bfd_vma * gnuchains = NULL;
6bd1a22c 11528 bfd_vma gnusymidx = 0;
071436c6 11529 bfd_size_type ngnuchains = 0;
252b5132 11530
2c610e4b 11531 if (!do_syms && !do_dyn_syms && !do_histogram)
32ec8896 11532 return TRUE;
252b5132 11533
6bd1a22c
L
11534 if (dynamic_info[DT_HASH]
11535 && (do_histogram
2c610e4b
L
11536 || (do_using_dynamic
11537 && !do_dyn_syms
11538 && dynamic_strings != NULL)))
252b5132 11539 {
66543521
AM
11540 unsigned char nb[8];
11541 unsigned char nc[8];
8b73c356 11542 unsigned int hash_ent_size = 4;
66543521 11543
dda8d76d
NC
11544 if ((filedata->file_header.e_machine == EM_ALPHA
11545 || filedata->file_header.e_machine == EM_S390
11546 || filedata->file_header.e_machine == EM_S390_OLD)
11547 && filedata->file_header.e_ident[EI_CLASS] == ELFCLASS64)
66543521
AM
11548 hash_ent_size = 8;
11549
dda8d76d 11550 if (fseek (filedata->handle,
fb52b2f4 11551 (archive_file_offset
dda8d76d 11552 + offset_from_vma (filedata, dynamic_info[DT_HASH],
fb52b2f4 11553 sizeof nb + sizeof nc)),
d93f0186 11554 SEEK_SET))
252b5132 11555 {
591a748a 11556 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 11557 goto no_hash;
252b5132
RH
11558 }
11559
dda8d76d 11560 if (fread (nb, hash_ent_size, 1, filedata->handle) != 1)
252b5132
RH
11561 {
11562 error (_("Failed to read in number of buckets\n"));
d3a44ec6 11563 goto no_hash;
252b5132
RH
11564 }
11565
dda8d76d 11566 if (fread (nc, hash_ent_size, 1, filedata->handle) != 1)
252b5132
RH
11567 {
11568 error (_("Failed to read in number of chains\n"));
d3a44ec6 11569 goto no_hash;
252b5132
RH
11570 }
11571
66543521
AM
11572 nbuckets = byte_get (nb, hash_ent_size);
11573 nchains = byte_get (nc, hash_ent_size);
252b5132 11574
dda8d76d
NC
11575 buckets = get_dynamic_data (filedata, nbuckets, hash_ent_size);
11576 chains = get_dynamic_data (filedata, nchains, hash_ent_size);
252b5132 11577
d3a44ec6 11578 no_hash:
252b5132 11579 if (buckets == NULL || chains == NULL)
d3a44ec6
JJ
11580 {
11581 if (do_using_dynamic)
32ec8896 11582 return FALSE;
d3a44ec6
JJ
11583 free (buckets);
11584 free (chains);
11585 buckets = NULL;
11586 chains = NULL;
11587 nbuckets = 0;
11588 nchains = 0;
11589 }
252b5132
RH
11590 }
11591
6bd1a22c
L
11592 if (dynamic_info_DT_GNU_HASH
11593 && (do_histogram
2c610e4b
L
11594 || (do_using_dynamic
11595 && !do_dyn_syms
11596 && dynamic_strings != NULL)))
252b5132 11597 {
6bd1a22c
L
11598 unsigned char nb[16];
11599 bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
11600 bfd_vma buckets_vma;
11601
dda8d76d 11602 if (fseek (filedata->handle,
6bd1a22c 11603 (archive_file_offset
dda8d76d 11604 + offset_from_vma (filedata, dynamic_info_DT_GNU_HASH,
6bd1a22c
L
11605 sizeof nb)),
11606 SEEK_SET))
11607 {
11608 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 11609 goto no_gnu_hash;
6bd1a22c 11610 }
252b5132 11611
dda8d76d 11612 if (fread (nb, 16, 1, filedata->handle) != 1)
6bd1a22c
L
11613 {
11614 error (_("Failed to read in number of buckets\n"));
d3a44ec6 11615 goto no_gnu_hash;
6bd1a22c
L
11616 }
11617
11618 ngnubuckets = byte_get (nb, 4);
11619 gnusymidx = byte_get (nb + 4, 4);
11620 bitmaskwords = byte_get (nb + 8, 4);
11621 buckets_vma = dynamic_info_DT_GNU_HASH + 16;
f7a99963 11622 if (is_32bit_elf)
6bd1a22c 11623 buckets_vma += bitmaskwords * 4;
f7a99963 11624 else
6bd1a22c 11625 buckets_vma += bitmaskwords * 8;
252b5132 11626
dda8d76d 11627 if (fseek (filedata->handle,
6bd1a22c 11628 (archive_file_offset
dda8d76d 11629 + offset_from_vma (filedata, buckets_vma, 4)),
6bd1a22c 11630 SEEK_SET))
252b5132 11631 {
6bd1a22c 11632 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 11633 goto no_gnu_hash;
6bd1a22c
L
11634 }
11635
dda8d76d 11636 gnubuckets = get_dynamic_data (filedata, ngnubuckets, 4);
252b5132 11637
6bd1a22c 11638 if (gnubuckets == NULL)
d3a44ec6 11639 goto no_gnu_hash;
6bd1a22c
L
11640
11641 for (i = 0; i < ngnubuckets; i++)
11642 if (gnubuckets[i] != 0)
11643 {
11644 if (gnubuckets[i] < gnusymidx)
32ec8896 11645 return FALSE;
6bd1a22c
L
11646
11647 if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
11648 maxchain = gnubuckets[i];
11649 }
11650
11651 if (maxchain == 0xffffffff)
d3a44ec6 11652 goto no_gnu_hash;
6bd1a22c
L
11653
11654 maxchain -= gnusymidx;
11655
dda8d76d 11656 if (fseek (filedata->handle,
6bd1a22c 11657 (archive_file_offset
dda8d76d 11658 + offset_from_vma (filedata, buckets_vma
6bd1a22c
L
11659 + 4 * (ngnubuckets + maxchain), 4)),
11660 SEEK_SET))
11661 {
11662 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 11663 goto no_gnu_hash;
6bd1a22c
L
11664 }
11665
11666 do
11667 {
dda8d76d 11668 if (fread (nb, 4, 1, filedata->handle) != 1)
252b5132 11669 {
6bd1a22c 11670 error (_("Failed to determine last chain length\n"));
d3a44ec6 11671 goto no_gnu_hash;
6bd1a22c 11672 }
252b5132 11673
6bd1a22c 11674 if (maxchain + 1 == 0)
d3a44ec6 11675 goto no_gnu_hash;
252b5132 11676
6bd1a22c
L
11677 ++maxchain;
11678 }
11679 while ((byte_get (nb, 4) & 1) == 0);
76da6bbe 11680
dda8d76d 11681 if (fseek (filedata->handle,
6bd1a22c 11682 (archive_file_offset
dda8d76d 11683 + offset_from_vma (filedata, buckets_vma + 4 * ngnubuckets, 4)),
6bd1a22c
L
11684 SEEK_SET))
11685 {
11686 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 11687 goto no_gnu_hash;
6bd1a22c
L
11688 }
11689
dda8d76d 11690 gnuchains = get_dynamic_data (filedata, maxchain, 4);
071436c6 11691 ngnuchains = maxchain;
6bd1a22c 11692
d3a44ec6 11693 no_gnu_hash:
6bd1a22c 11694 if (gnuchains == NULL)
d3a44ec6
JJ
11695 {
11696 free (gnubuckets);
d3a44ec6
JJ
11697 gnubuckets = NULL;
11698 ngnubuckets = 0;
f64fddf1 11699 if (do_using_dynamic)
32ec8896 11700 return FALSE;
d3a44ec6 11701 }
6bd1a22c
L
11702 }
11703
11704 if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
11705 && do_syms
11706 && do_using_dynamic
3102e897
NC
11707 && dynamic_strings != NULL
11708 && dynamic_symbols != NULL)
6bd1a22c
L
11709 {
11710 unsigned long hn;
11711
11712 if (dynamic_info[DT_HASH])
11713 {
11714 bfd_vma si;
6bd6a03d 11715 char *visited;
6bd1a22c
L
11716
11717 printf (_("\nSymbol table for image:\n"));
11718 if (is_32bit_elf)
11719 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11720 else
11721 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11722
6bd6a03d
AM
11723 visited = xcmalloc (nchains, 1);
11724 memset (visited, 0, nchains);
6bd1a22c
L
11725 for (hn = 0; hn < nbuckets; hn++)
11726 {
6bd6a03d
AM
11727 for (si = buckets[hn]; si > 0; si = chains[si])
11728 {
dda8d76d 11729 print_dynamic_symbol (filedata, si, hn);
6bd6a03d
AM
11730 if (si >= nchains || visited[si])
11731 {
11732 error (_("histogram chain is corrupt\n"));
11733 break;
11734 }
11735 visited[si] = 1;
11736 }
252b5132 11737 }
6bd6a03d 11738 free (visited);
252b5132 11739 }
6bd1a22c
L
11740
11741 if (dynamic_info_DT_GNU_HASH)
11742 {
11743 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
11744 if (is_32bit_elf)
11745 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11746 else
11747 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11748
11749 for (hn = 0; hn < ngnubuckets; ++hn)
11750 if (gnubuckets[hn] != 0)
11751 {
11752 bfd_vma si = gnubuckets[hn];
11753 bfd_vma off = si - gnusymidx;
11754
11755 do
11756 {
dda8d76d 11757 print_dynamic_symbol (filedata, si, hn);
6bd1a22c
L
11758 si++;
11759 }
071436c6 11760 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
6bd1a22c
L
11761 }
11762 }
252b5132 11763 }
8b73c356 11764 else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
dda8d76d 11765 && filedata->section_headers != NULL)
252b5132 11766 {
b34976b6 11767 unsigned int i;
252b5132 11768
dda8d76d
NC
11769 for (i = 0, section = filedata->section_headers;
11770 i < filedata->file_header.e_shnum;
252b5132
RH
11771 i++, section++)
11772 {
b34976b6 11773 unsigned int si;
2cf0635d 11774 char * strtab = NULL;
c256ffe7 11775 unsigned long int strtab_size = 0;
2cf0635d
NC
11776 Elf_Internal_Sym * symtab;
11777 Elf_Internal_Sym * psym;
ba5cdace 11778 unsigned long num_syms;
252b5132 11779
2c610e4b
L
11780 if ((section->sh_type != SHT_SYMTAB
11781 && section->sh_type != SHT_DYNSYM)
11782 || (!do_syms
11783 && section->sh_type == SHT_SYMTAB))
252b5132
RH
11784 continue;
11785
dd24e3da
NC
11786 if (section->sh_entsize == 0)
11787 {
11788 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
dda8d76d 11789 printable_section_name (filedata, section));
dd24e3da
NC
11790 continue;
11791 }
11792
d3a49aa8
AM
11793 num_syms = section->sh_size / section->sh_entsize;
11794 printf (ngettext ("\nSymbol table '%s' contains %lu entry:\n",
11795 "\nSymbol table '%s' contains %lu entries:\n",
11796 num_syms),
dda8d76d 11797 printable_section_name (filedata, section),
d3a49aa8 11798 num_syms);
dd24e3da 11799
f7a99963 11800 if (is_32bit_elf)
ca47b30c 11801 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
f7a99963 11802 else
ca47b30c 11803 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
252b5132 11804
dda8d76d 11805 symtab = GET_ELF_SYMBOLS (filedata, section, & num_syms);
252b5132
RH
11806 if (symtab == NULL)
11807 continue;
11808
dda8d76d 11809 if (section->sh_link == filedata->file_header.e_shstrndx)
c256ffe7 11810 {
dda8d76d
NC
11811 strtab = filedata->string_table;
11812 strtab_size = filedata->string_table_length;
c256ffe7 11813 }
dda8d76d 11814 else if (section->sh_link < filedata->file_header.e_shnum)
252b5132 11815 {
2cf0635d 11816 Elf_Internal_Shdr * string_sec;
252b5132 11817
dda8d76d 11818 string_sec = filedata->section_headers + section->sh_link;
252b5132 11819
dda8d76d 11820 strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset,
3f5e193b
NC
11821 1, string_sec->sh_size,
11822 _("string table"));
c256ffe7 11823 strtab_size = strtab != NULL ? string_sec->sh_size : 0;
252b5132
RH
11824 }
11825
ba5cdace 11826 for (si = 0, psym = symtab; si < num_syms; si++, psym++)
252b5132 11827 {
bb4d2ac2
L
11828 const char *version_string;
11829 enum versioned_symbol_info sym_info;
11830 unsigned short vna_other;
11831
5e220199 11832 printf ("%6d: ", si);
f7a99963
NC
11833 print_vma (psym->st_value, LONG_HEX);
11834 putchar (' ');
11835 print_vma (psym->st_size, DEC_5);
dda8d76d
NC
11836 printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
11837 printf (" %-6s", get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
11838 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
fd85a6a1
NC
11839 printf (" %-7s", get_solaris_symbol_visibility (psym->st_other));
11840 else
11841 {
11842 unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11843
11844 printf (" %-7s", get_symbol_visibility (vis));
11845 /* Check to see if any other bits in the st_other field are set.
11846 Note - displaying this information disrupts the layout of the
11847 table being generated, but for the moment this case is very rare. */
11848 if (psym->st_other ^ vis)
dda8d76d 11849 printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
fd85a6a1 11850 }
dda8d76d 11851 printf (" %4s ", get_symbol_index_type (filedata, psym->st_shndx));
c256ffe7 11852 print_symbol (25, psym->st_name < strtab_size
2b692964 11853 ? strtab + psym->st_name : _("<corrupt>"));
252b5132 11854
bb4d2ac2 11855 version_string
dda8d76d 11856 = get_symbol_version_string (filedata,
bb4d2ac2
L
11857 section->sh_type == SHT_DYNSYM,
11858 strtab, strtab_size, si,
11859 psym, &sym_info, &vna_other);
11860 if (version_string)
252b5132 11861 {
bb4d2ac2
L
11862 if (sym_info == symbol_undefined)
11863 printf ("@%s (%d)", version_string, vna_other);
11864 else
11865 printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
11866 version_string);
252b5132
RH
11867 }
11868
11869 putchar ('\n');
52c3c391
NC
11870
11871 if (ELF_ST_BIND (psym->st_info) == STB_LOCAL
dd905818
NC
11872 && si >= section->sh_info
11873 /* Irix 5 and 6 MIPS binaries are known to ignore this requirement. */
dda8d76d 11874 && filedata->file_header.e_machine != EM_MIPS
dd905818
NC
11875 /* Solaris binaries have been found to violate this requirement as
11876 well. Not sure if this is a bug or an ABI requirement. */
dda8d76d 11877 && filedata->file_header.e_ident[EI_OSABI] != ELFOSABI_SOLARIS)
52c3c391 11878 warn (_("local symbol %u found at index >= %s's sh_info value of %u\n"),
dda8d76d 11879 si, printable_section_name (filedata, section), section->sh_info);
252b5132
RH
11880 }
11881
11882 free (symtab);
dda8d76d 11883 if (strtab != filedata->string_table)
252b5132
RH
11884 free (strtab);
11885 }
11886 }
11887 else if (do_syms)
11888 printf
11889 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
11890
11891 if (do_histogram && buckets != NULL)
11892 {
2cf0635d
NC
11893 unsigned long * lengths;
11894 unsigned long * counts;
66543521
AM
11895 unsigned long hn;
11896 bfd_vma si;
11897 unsigned long maxlength = 0;
11898 unsigned long nzero_counts = 0;
11899 unsigned long nsyms = 0;
6bd6a03d 11900 char *visited;
252b5132 11901
d3a49aa8
AM
11902 printf (ngettext ("\nHistogram for bucket list length "
11903 "(total of %lu bucket):\n",
11904 "\nHistogram for bucket list length "
11905 "(total of %lu buckets):\n",
11906 (unsigned long) nbuckets),
66543521 11907 (unsigned long) nbuckets);
252b5132 11908
3f5e193b 11909 lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
252b5132
RH
11910 if (lengths == NULL)
11911 {
8b73c356 11912 error (_("Out of memory allocating space for histogram buckets\n"));
32ec8896 11913 return FALSE;
252b5132 11914 }
6bd6a03d
AM
11915 visited = xcmalloc (nchains, 1);
11916 memset (visited, 0, nchains);
8b73c356
NC
11917
11918 printf (_(" Length Number %% of total Coverage\n"));
252b5132
RH
11919 for (hn = 0; hn < nbuckets; ++hn)
11920 {
6bd6a03d 11921 for (si = buckets[hn]; si > 0; si = chains[si])
252b5132 11922 {
b34976b6 11923 ++nsyms;
252b5132 11924 if (maxlength < ++lengths[hn])
b34976b6 11925 ++maxlength;
6bd6a03d
AM
11926 if (si >= nchains || visited[si])
11927 {
11928 error (_("histogram chain is corrupt\n"));
11929 break;
11930 }
11931 visited[si] = 1;
252b5132
RH
11932 }
11933 }
6bd6a03d 11934 free (visited);
252b5132 11935
3f5e193b 11936 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
252b5132
RH
11937 if (counts == NULL)
11938 {
b2e951ec 11939 free (lengths);
8b73c356 11940 error (_("Out of memory allocating space for histogram counts\n"));
32ec8896 11941 return FALSE;
252b5132
RH
11942 }
11943
11944 for (hn = 0; hn < nbuckets; ++hn)
b34976b6 11945 ++counts[lengths[hn]];
252b5132 11946
103f02d3 11947 if (nbuckets > 0)
252b5132 11948 {
66543521
AM
11949 unsigned long i;
11950 printf (" 0 %-10lu (%5.1f%%)\n",
103f02d3 11951 counts[0], (counts[0] * 100.0) / nbuckets);
66543521 11952 for (i = 1; i <= maxlength; ++i)
103f02d3 11953 {
66543521
AM
11954 nzero_counts += counts[i] * i;
11955 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11956 i, counts[i], (counts[i] * 100.0) / nbuckets,
103f02d3
UD
11957 (nzero_counts * 100.0) / nsyms);
11958 }
252b5132
RH
11959 }
11960
11961 free (counts);
11962 free (lengths);
11963 }
11964
11965 if (buckets != NULL)
11966 {
11967 free (buckets);
11968 free (chains);
11969 }
11970
d3a44ec6 11971 if (do_histogram && gnubuckets != NULL)
fdc90cb4 11972 {
2cf0635d
NC
11973 unsigned long * lengths;
11974 unsigned long * counts;
fdc90cb4
JJ
11975 unsigned long hn;
11976 unsigned long maxlength = 0;
11977 unsigned long nzero_counts = 0;
11978 unsigned long nsyms = 0;
fdc90cb4 11979
d3a49aa8
AM
11980 printf (ngettext ("\nHistogram for `.gnu.hash' bucket list length "
11981 "(total of %lu bucket):\n",
11982 "\nHistogram for `.gnu.hash' bucket list length "
11983 "(total of %lu buckets):\n",
11984 (unsigned long) ngnubuckets),
8b73c356
NC
11985 (unsigned long) ngnubuckets);
11986
3f5e193b 11987 lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
fdc90cb4
JJ
11988 if (lengths == NULL)
11989 {
8b73c356 11990 error (_("Out of memory allocating space for gnu histogram buckets\n"));
32ec8896 11991 return FALSE;
fdc90cb4
JJ
11992 }
11993
fdc90cb4
JJ
11994 printf (_(" Length Number %% of total Coverage\n"));
11995
11996 for (hn = 0; hn < ngnubuckets; ++hn)
11997 if (gnubuckets[hn] != 0)
11998 {
11999 bfd_vma off, length = 1;
12000
6bd1a22c 12001 for (off = gnubuckets[hn] - gnusymidx;
071436c6
NC
12002 /* PR 17531 file: 010-77222-0.004. */
12003 off < ngnuchains && (gnuchains[off] & 1) == 0;
12004 ++off)
fdc90cb4
JJ
12005 ++length;
12006 lengths[hn] = length;
12007 if (length > maxlength)
12008 maxlength = length;
12009 nsyms += length;
12010 }
12011
3f5e193b 12012 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
fdc90cb4
JJ
12013 if (counts == NULL)
12014 {
b2e951ec 12015 free (lengths);
8b73c356 12016 error (_("Out of memory allocating space for gnu histogram counts\n"));
32ec8896 12017 return FALSE;
fdc90cb4
JJ
12018 }
12019
12020 for (hn = 0; hn < ngnubuckets; ++hn)
12021 ++counts[lengths[hn]];
12022
12023 if (ngnubuckets > 0)
12024 {
12025 unsigned long j;
12026 printf (" 0 %-10lu (%5.1f%%)\n",
12027 counts[0], (counts[0] * 100.0) / ngnubuckets);
12028 for (j = 1; j <= maxlength; ++j)
12029 {
12030 nzero_counts += counts[j] * j;
12031 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
12032 j, counts[j], (counts[j] * 100.0) / ngnubuckets,
12033 (nzero_counts * 100.0) / nsyms);
12034 }
12035 }
12036
12037 free (counts);
12038 free (lengths);
12039 free (gnubuckets);
12040 free (gnuchains);
12041 }
12042
32ec8896 12043 return TRUE;
252b5132
RH
12044}
12045
32ec8896 12046static bfd_boolean
dda8d76d 12047process_syminfo (Filedata * filedata ATTRIBUTE_UNUSED)
252b5132 12048{
b4c96d0d 12049 unsigned int i;
252b5132
RH
12050
12051 if (dynamic_syminfo == NULL
12052 || !do_dynamic)
12053 /* No syminfo, this is ok. */
32ec8896 12054 return TRUE;
252b5132
RH
12055
12056 /* There better should be a dynamic symbol section. */
12057 if (dynamic_symbols == NULL || dynamic_strings == NULL)
32ec8896 12058 return FALSE;
252b5132
RH
12059
12060 if (dynamic_addr)
d3a49aa8
AM
12061 printf (ngettext ("\nDynamic info segment at offset 0x%lx "
12062 "contains %d entry:\n",
12063 "\nDynamic info segment at offset 0x%lx "
12064 "contains %d entries:\n",
12065 dynamic_syminfo_nent),
252b5132
RH
12066 dynamic_syminfo_offset, dynamic_syminfo_nent);
12067
12068 printf (_(" Num: Name BoundTo Flags\n"));
12069 for (i = 0; i < dynamic_syminfo_nent; ++i)
12070 {
12071 unsigned short int flags = dynamic_syminfo[i].si_flags;
12072
31104126 12073 printf ("%4d: ", i);
4082ef84
NC
12074 if (i >= num_dynamic_syms)
12075 printf (_("<corrupt index>"));
12076 else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
d79b3d50
NC
12077 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
12078 else
2b692964 12079 printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
31104126 12080 putchar (' ');
252b5132
RH
12081
12082 switch (dynamic_syminfo[i].si_boundto)
12083 {
12084 case SYMINFO_BT_SELF:
12085 fputs ("SELF ", stdout);
12086 break;
12087 case SYMINFO_BT_PARENT:
12088 fputs ("PARENT ", stdout);
12089 break;
12090 default:
12091 if (dynamic_syminfo[i].si_boundto > 0
d79b3d50
NC
12092 && dynamic_syminfo[i].si_boundto < dynamic_nent
12093 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
31104126 12094 {
d79b3d50 12095 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
31104126
NC
12096 putchar (' ' );
12097 }
252b5132
RH
12098 else
12099 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
12100 break;
12101 }
12102
12103 if (flags & SYMINFO_FLG_DIRECT)
12104 printf (" DIRECT");
12105 if (flags & SYMINFO_FLG_PASSTHRU)
12106 printf (" PASSTHRU");
12107 if (flags & SYMINFO_FLG_COPY)
12108 printf (" COPY");
12109 if (flags & SYMINFO_FLG_LAZYLOAD)
12110 printf (" LAZYLOAD");
12111
12112 puts ("");
12113 }
12114
32ec8896 12115 return TRUE;
252b5132
RH
12116}
12117
b32e566b
NC
12118#define IN_RANGE(START,END,ADDR,OFF) \
12119 (((ADDR) >= (START)) && ((ADDR) + (OFF) < (END)))
12120
cf13d699
NC
12121/* Check to see if the given reloc needs to be handled in a target specific
12122 manner. If so then process the reloc and return TRUE otherwise return
f84ce13b
NC
12123 FALSE.
12124
12125 If called with reloc == NULL, then this is a signal that reloc processing
12126 for the current section has finished, and any saved state should be
12127 discarded. */
09c11c86 12128
cf13d699 12129static bfd_boolean
dda8d76d
NC
12130target_specific_reloc_handling (Filedata * filedata,
12131 Elf_Internal_Rela * reloc,
12132 unsigned char * start,
12133 unsigned char * end,
12134 Elf_Internal_Sym * symtab,
12135 unsigned long num_syms)
252b5132 12136{
f84ce13b
NC
12137 unsigned int reloc_type = 0;
12138 unsigned long sym_index = 0;
12139
12140 if (reloc)
12141 {
dda8d76d 12142 reloc_type = get_reloc_type (filedata, reloc->r_info);
f84ce13b
NC
12143 sym_index = get_reloc_symindex (reloc->r_info);
12144 }
252b5132 12145
dda8d76d 12146 switch (filedata->file_header.e_machine)
252b5132 12147 {
13761a11
NC
12148 case EM_MSP430:
12149 case EM_MSP430_OLD:
12150 {
12151 static Elf_Internal_Sym * saved_sym = NULL;
12152
f84ce13b
NC
12153 if (reloc == NULL)
12154 {
12155 saved_sym = NULL;
12156 return TRUE;
12157 }
12158
13761a11
NC
12159 switch (reloc_type)
12160 {
12161 case 10: /* R_MSP430_SYM_DIFF */
dda8d76d 12162 if (uses_msp430x_relocs (filedata))
13761a11 12163 break;
1a0670f3 12164 /* Fall through. */
13761a11 12165 case 21: /* R_MSP430X_SYM_DIFF */
f84ce13b
NC
12166 /* PR 21139. */
12167 if (sym_index >= num_syms)
12168 error (_("MSP430 SYM_DIFF reloc contains invalid symbol index %lu\n"),
12169 sym_index);
12170 else
12171 saved_sym = symtab + sym_index;
13761a11
NC
12172 return TRUE;
12173
12174 case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
12175 case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
12176 goto handle_sym_diff;
0b4362b0 12177
13761a11
NC
12178 case 5: /* R_MSP430_16_BYTE */
12179 case 9: /* R_MSP430_8 */
dda8d76d 12180 if (uses_msp430x_relocs (filedata))
13761a11
NC
12181 break;
12182 goto handle_sym_diff;
12183
12184 case 2: /* R_MSP430_ABS16 */
12185 case 15: /* R_MSP430X_ABS16 */
dda8d76d 12186 if (! uses_msp430x_relocs (filedata))
13761a11
NC
12187 break;
12188 goto handle_sym_diff;
0b4362b0 12189
13761a11
NC
12190 handle_sym_diff:
12191 if (saved_sym != NULL)
12192 {
03f7786e 12193 int reloc_size = reloc_type == 1 ? 4 : 2;
13761a11
NC
12194 bfd_vma value;
12195
f84ce13b
NC
12196 if (sym_index >= num_syms)
12197 error (_("MSP430 reloc contains invalid symbol index %lu\n"),
12198 sym_index);
03f7786e 12199 else
f84ce13b
NC
12200 {
12201 value = reloc->r_addend + (symtab[sym_index].st_value
12202 - saved_sym->st_value);
12203
b32e566b 12204 if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
f84ce13b 12205 byte_put (start + reloc->r_offset, value, reloc_size);
b32e566b
NC
12206 else
12207 /* PR 21137 */
12208 error (_("MSP430 sym diff reloc contains invalid offset: 0x%lx\n"),
12209 (long) reloc->r_offset);
f84ce13b 12210 }
13761a11
NC
12211
12212 saved_sym = NULL;
12213 return TRUE;
12214 }
12215 break;
12216
12217 default:
12218 if (saved_sym != NULL)
071436c6 12219 error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
13761a11
NC
12220 break;
12221 }
12222 break;
12223 }
12224
cf13d699
NC
12225 case EM_MN10300:
12226 case EM_CYGNUS_MN10300:
12227 {
12228 static Elf_Internal_Sym * saved_sym = NULL;
252b5132 12229
f84ce13b
NC
12230 if (reloc == NULL)
12231 {
12232 saved_sym = NULL;
12233 return TRUE;
12234 }
12235
cf13d699
NC
12236 switch (reloc_type)
12237 {
12238 case 34: /* R_MN10300_ALIGN */
12239 return TRUE;
12240 case 33: /* R_MN10300_SYM_DIFF */
f84ce13b
NC
12241 if (sym_index >= num_syms)
12242 error (_("MN10300_SYM_DIFF reloc contains invalid symbol index %lu\n"),
12243 sym_index);
12244 else
12245 saved_sym = symtab + sym_index;
cf13d699 12246 return TRUE;
f84ce13b 12247
cf13d699
NC
12248 case 1: /* R_MN10300_32 */
12249 case 2: /* R_MN10300_16 */
12250 if (saved_sym != NULL)
12251 {
03f7786e 12252 int reloc_size = reloc_type == 1 ? 4 : 2;
cf13d699 12253 bfd_vma value;
252b5132 12254
f84ce13b
NC
12255 if (sym_index >= num_syms)
12256 error (_("MN10300 reloc contains invalid symbol index %lu\n"),
12257 sym_index);
03f7786e 12258 else
f84ce13b
NC
12259 {
12260 value = reloc->r_addend + (symtab[sym_index].st_value
12261 - saved_sym->st_value);
12262
b32e566b 12263 if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
f84ce13b 12264 byte_put (start + reloc->r_offset, value, reloc_size);
b32e566b
NC
12265 else
12266 error (_("MN10300 sym diff reloc contains invalid offset: 0x%lx\n"),
12267 (long) reloc->r_offset);
f84ce13b 12268 }
252b5132 12269
cf13d699
NC
12270 saved_sym = NULL;
12271 return TRUE;
12272 }
12273 break;
12274 default:
12275 if (saved_sym != NULL)
071436c6 12276 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
cf13d699
NC
12277 break;
12278 }
12279 break;
12280 }
6ff71e76
NC
12281
12282 case EM_RL78:
12283 {
12284 static bfd_vma saved_sym1 = 0;
12285 static bfd_vma saved_sym2 = 0;
12286 static bfd_vma value;
12287
f84ce13b
NC
12288 if (reloc == NULL)
12289 {
12290 saved_sym1 = saved_sym2 = 0;
12291 return TRUE;
12292 }
12293
6ff71e76
NC
12294 switch (reloc_type)
12295 {
12296 case 0x80: /* R_RL78_SYM. */
12297 saved_sym1 = saved_sym2;
f84ce13b
NC
12298 if (sym_index >= num_syms)
12299 error (_("RL78_SYM reloc contains invalid symbol index %lu\n"),
12300 sym_index);
12301 else
12302 {
12303 saved_sym2 = symtab[sym_index].st_value;
12304 saved_sym2 += reloc->r_addend;
12305 }
6ff71e76
NC
12306 return TRUE;
12307
12308 case 0x83: /* R_RL78_OPsub. */
12309 value = saved_sym1 - saved_sym2;
12310 saved_sym2 = saved_sym1 = 0;
12311 return TRUE;
12312 break;
12313
12314 case 0x41: /* R_RL78_ABS32. */
b32e566b 12315 if (IN_RANGE (start, end, start + reloc->r_offset, 4))
03f7786e 12316 byte_put (start + reloc->r_offset, value, 4);
b32e566b
NC
12317 else
12318 error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12319 (long) reloc->r_offset);
6ff71e76
NC
12320 value = 0;
12321 return TRUE;
12322
12323 case 0x43: /* R_RL78_ABS16. */
b32e566b 12324 if (IN_RANGE (start, end, start + reloc->r_offset, 2))
03f7786e 12325 byte_put (start + reloc->r_offset, value, 2);
b32e566b
NC
12326 else
12327 error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12328 (long) reloc->r_offset);
6ff71e76
NC
12329 value = 0;
12330 return TRUE;
12331
12332 default:
12333 break;
12334 }
12335 break;
12336 }
252b5132
RH
12337 }
12338
cf13d699 12339 return FALSE;
252b5132
RH
12340}
12341
aca88567
NC
12342/* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
12343 DWARF debug sections. This is a target specific test. Note - we do not
12344 go through the whole including-target-headers-multiple-times route, (as
12345 we have already done with <elf/h8.h>) because this would become very
12346 messy and even then this function would have to contain target specific
12347 information (the names of the relocs instead of their numeric values).
12348 FIXME: This is not the correct way to solve this problem. The proper way
12349 is to have target specific reloc sizing and typing functions created by
12350 the reloc-macros.h header, in the same way that it already creates the
12351 reloc naming functions. */
12352
12353static bfd_boolean
dda8d76d 12354is_32bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
aca88567 12355{
d347c9df 12356 /* Please keep this table alpha-sorted for ease of visual lookup. */
dda8d76d 12357 switch (filedata->file_header.e_machine)
aca88567 12358 {
41e92641 12359 case EM_386:
22abe556 12360 case EM_IAMCU:
41e92641 12361 return reloc_type == 1; /* R_386_32. */
aca88567
NC
12362 case EM_68K:
12363 return reloc_type == 1; /* R_68K_32. */
f954747f
AM
12364 case EM_860:
12365 return reloc_type == 1; /* R_860_32. */
12366 case EM_960:
12367 return reloc_type == 2; /* R_960_32. */
a06ea964 12368 case EM_AARCH64:
9282b95a
JW
12369 return (reloc_type == 258
12370 || reloc_type == 1); /* R_AARCH64_ABS32 || R_AARCH64_P32_ABS32 */
d347c9df
PS
12371 case EM_ADAPTEVA_EPIPHANY:
12372 return reloc_type == 3;
aca88567 12373 case EM_ALPHA:
137b6b5f 12374 return reloc_type == 1; /* R_ALPHA_REFLONG. */
41e92641
NC
12375 case EM_ARC:
12376 return reloc_type == 1; /* R_ARC_32. */
886a2506
NC
12377 case EM_ARC_COMPACT:
12378 case EM_ARC_COMPACT2:
12379 return reloc_type == 4; /* R_ARC_32. */
41e92641
NC
12380 case EM_ARM:
12381 return reloc_type == 2; /* R_ARM_ABS32 */
cb8f3167 12382 case EM_AVR_OLD:
aca88567
NC
12383 case EM_AVR:
12384 return reloc_type == 1;
12385 case EM_BLACKFIN:
12386 return reloc_type == 0x12; /* R_byte4_data. */
12387 case EM_CRIS:
12388 return reloc_type == 3; /* R_CRIS_32. */
12389 case EM_CR16:
12390 return reloc_type == 3; /* R_CR16_NUM32. */
12391 case EM_CRX:
12392 return reloc_type == 15; /* R_CRX_NUM32. */
b8891f8d
AJ
12393 case EM_CSKY:
12394 return reloc_type == 1; /* R_CKCORE_ADDR32. */
aca88567
NC
12395 case EM_CYGNUS_FRV:
12396 return reloc_type == 1;
41e92641
NC
12397 case EM_CYGNUS_D10V:
12398 case EM_D10V:
12399 return reloc_type == 6; /* R_D10V_32. */
aca88567
NC
12400 case EM_CYGNUS_D30V:
12401 case EM_D30V:
12402 return reloc_type == 12; /* R_D30V_32_NORMAL. */
41e92641
NC
12403 case EM_DLX:
12404 return reloc_type == 3; /* R_DLX_RELOC_32. */
aca88567
NC
12405 case EM_CYGNUS_FR30:
12406 case EM_FR30:
12407 return reloc_type == 3; /* R_FR30_32. */
3f8107ab
AM
12408 case EM_FT32:
12409 return reloc_type == 1; /* R_FT32_32. */
aca88567
NC
12410 case EM_H8S:
12411 case EM_H8_300:
12412 case EM_H8_300H:
12413 return reloc_type == 1; /* R_H8_DIR32. */
3730236a 12414 case EM_IA_64:
262cdac7
AM
12415 return (reloc_type == 0x64 /* R_IA64_SECREL32MSB. */
12416 || reloc_type == 0x65 /* R_IA64_SECREL32LSB. */
12417 || reloc_type == 0x24 /* R_IA64_DIR32MSB. */
12418 || reloc_type == 0x25 /* R_IA64_DIR32LSB. */);
aca88567
NC
12419 case EM_IP2K_OLD:
12420 case EM_IP2K:
12421 return reloc_type == 2; /* R_IP2K_32. */
12422 case EM_IQ2000:
12423 return reloc_type == 2; /* R_IQ2000_32. */
84e94c90
NC
12424 case EM_LATTICEMICO32:
12425 return reloc_type == 3; /* R_LM32_32. */
ff7eeb89 12426 case EM_M32C_OLD:
aca88567
NC
12427 case EM_M32C:
12428 return reloc_type == 3; /* R_M32C_32. */
12429 case EM_M32R:
12430 return reloc_type == 34; /* R_M32R_32_RELA. */
adec12c1
AM
12431 case EM_68HC11:
12432 case EM_68HC12:
12433 return reloc_type == 6; /* R_M68HC11_32. */
7b4ae824 12434 case EM_S12Z:
2849d19f
JD
12435 return reloc_type == 7 || /* R_S12Z_EXT32 */
12436 reloc_type == 6; /* R_S12Z_CW32. */
aca88567
NC
12437 case EM_MCORE:
12438 return reloc_type == 1; /* R_MCORE_ADDR32. */
12439 case EM_CYGNUS_MEP:
12440 return reloc_type == 4; /* R_MEP_32. */
a3c62988
NC
12441 case EM_METAG:
12442 return reloc_type == 2; /* R_METAG_ADDR32. */
137b6b5f
AM
12443 case EM_MICROBLAZE:
12444 return reloc_type == 1; /* R_MICROBLAZE_32. */
aca88567
NC
12445 case EM_MIPS:
12446 return reloc_type == 2; /* R_MIPS_32. */
12447 case EM_MMIX:
12448 return reloc_type == 4; /* R_MMIX_32. */
12449 case EM_CYGNUS_MN10200:
12450 case EM_MN10200:
12451 return reloc_type == 1; /* R_MN10200_32. */
12452 case EM_CYGNUS_MN10300:
12453 case EM_MN10300:
12454 return reloc_type == 1; /* R_MN10300_32. */
5506d11a
AM
12455 case EM_MOXIE:
12456 return reloc_type == 1; /* R_MOXIE_32. */
aca88567
NC
12457 case EM_MSP430_OLD:
12458 case EM_MSP430:
13761a11 12459 return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32. */
aca88567
NC
12460 case EM_MT:
12461 return reloc_type == 2; /* R_MT_32. */
35c08157
KLC
12462 case EM_NDS32:
12463 return reloc_type == 20; /* R_NDS32_RELA. */
3e0873ac 12464 case EM_ALTERA_NIOS2:
36591ba1 12465 return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32. */
3e0873ac
NC
12466 case EM_NIOS32:
12467 return reloc_type == 1; /* R_NIOS_32. */
73589c9d
CS
12468 case EM_OR1K:
12469 return reloc_type == 1; /* R_OR1K_32. */
aca88567 12470 case EM_PARISC:
0df8ad28
NC
12471 return (reloc_type == 1 /* R_PARISC_DIR32. */
12472 || reloc_type == 2 /* R_PARISC_DIR21L. */
5fda8eca 12473 || reloc_type == 41); /* R_PARISC_SECREL32. */
aca88567
NC
12474 case EM_PJ:
12475 case EM_PJ_OLD:
12476 return reloc_type == 1; /* R_PJ_DATA_DIR32. */
12477 case EM_PPC64:
12478 return reloc_type == 1; /* R_PPC64_ADDR32. */
12479 case EM_PPC:
12480 return reloc_type == 1; /* R_PPC_ADDR32. */
2b100bb5
DD
12481 case EM_TI_PRU:
12482 return reloc_type == 11; /* R_PRU_BFD_RELOC_32. */
e23eba97
NC
12483 case EM_RISCV:
12484 return reloc_type == 1; /* R_RISCV_32. */
99c513f6
DD
12485 case EM_RL78:
12486 return reloc_type == 1; /* R_RL78_DIR32. */
c7927a3c
NC
12487 case EM_RX:
12488 return reloc_type == 1; /* R_RX_DIR32. */
f954747f
AM
12489 case EM_S370:
12490 return reloc_type == 1; /* R_I370_ADDR31. */
aca88567
NC
12491 case EM_S390_OLD:
12492 case EM_S390:
12493 return reloc_type == 4; /* R_S390_32. */
41e92641
NC
12494 case EM_SCORE:
12495 return reloc_type == 8; /* R_SCORE_ABS32. */
aca88567
NC
12496 case EM_SH:
12497 return reloc_type == 1; /* R_SH_DIR32. */
12498 case EM_SPARC32PLUS:
12499 case EM_SPARCV9:
12500 case EM_SPARC:
12501 return reloc_type == 3 /* R_SPARC_32. */
12502 || reloc_type == 23; /* R_SPARC_UA32. */
a7dd7d05
AM
12503 case EM_SPU:
12504 return reloc_type == 6; /* R_SPU_ADDR32 */
40b36596
JM
12505 case EM_TI_C6000:
12506 return reloc_type == 1; /* R_C6000_ABS32. */
aa137e4d
NC
12507 case EM_TILEGX:
12508 return reloc_type == 2; /* R_TILEGX_32. */
12509 case EM_TILEPRO:
12510 return reloc_type == 1; /* R_TILEPRO_32. */
aca88567
NC
12511 case EM_CYGNUS_V850:
12512 case EM_V850:
12513 return reloc_type == 6; /* R_V850_ABS32. */
708e2187
NC
12514 case EM_V800:
12515 return reloc_type == 0x33; /* R_V810_WORD. */
aca88567
NC
12516 case EM_VAX:
12517 return reloc_type == 1; /* R_VAX_32. */
619ed720
EB
12518 case EM_VISIUM:
12519 return reloc_type == 3; /* R_VISIUM_32. */
f96bd6c2
PC
12520 case EM_WEBASSEMBLY:
12521 return reloc_type == 1; /* R_WASM32_32. */
aca88567 12522 case EM_X86_64:
8a9036a4 12523 case EM_L1OM:
7a9068fe 12524 case EM_K1OM:
aca88567 12525 return reloc_type == 10; /* R_X86_64_32. */
c29aca4a
NC
12526 case EM_XC16X:
12527 case EM_C166:
12528 return reloc_type == 3; /* R_XC16C_ABS_32. */
f6c1a2d5
NC
12529 case EM_XGATE:
12530 return reloc_type == 4; /* R_XGATE_32. */
aca88567
NC
12531 case EM_XSTORMY16:
12532 return reloc_type == 1; /* R_XSTROMY16_32. */
12533 case EM_XTENSA_OLD:
12534 case EM_XTENSA:
12535 return reloc_type == 1; /* R_XTENSA_32. */
aca88567 12536 default:
bee0ee85
NC
12537 {
12538 static unsigned int prev_warn = 0;
12539
12540 /* Avoid repeating the same warning multiple times. */
dda8d76d 12541 if (prev_warn != filedata->file_header.e_machine)
bee0ee85 12542 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
dda8d76d
NC
12543 filedata->file_header.e_machine);
12544 prev_warn = filedata->file_header.e_machine;
bee0ee85
NC
12545 return FALSE;
12546 }
aca88567
NC
12547 }
12548}
12549
12550/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12551 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
12552
12553static bfd_boolean
dda8d76d 12554is_32bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
aca88567 12555{
dda8d76d 12556 switch (filedata->file_header.e_machine)
d347c9df 12557 /* Please keep this table alpha-sorted for ease of visual lookup. */
aca88567 12558 {
41e92641 12559 case EM_386:
22abe556 12560 case EM_IAMCU:
3e0873ac 12561 return reloc_type == 2; /* R_386_PC32. */
aca88567 12562 case EM_68K:
3e0873ac 12563 return reloc_type == 4; /* R_68K_PC32. */
a06ea964
NC
12564 case EM_AARCH64:
12565 return reloc_type == 261; /* R_AARCH64_PREL32 */
cfb8c092
NC
12566 case EM_ADAPTEVA_EPIPHANY:
12567 return reloc_type == 6;
aca88567
NC
12568 case EM_ALPHA:
12569 return reloc_type == 10; /* R_ALPHA_SREL32. */
726c18e1
CZ
12570 case EM_ARC_COMPACT:
12571 case EM_ARC_COMPACT2:
12572 return reloc_type == 49; /* R_ARC_32_PCREL. */
41e92641 12573 case EM_ARM:
3e0873ac 12574 return reloc_type == 3; /* R_ARM_REL32 */
d347c9df
PS
12575 case EM_AVR_OLD:
12576 case EM_AVR:
12577 return reloc_type == 36; /* R_AVR_32_PCREL. */
137b6b5f
AM
12578 case EM_MICROBLAZE:
12579 return reloc_type == 2; /* R_MICROBLAZE_32_PCREL. */
73589c9d
CS
12580 case EM_OR1K:
12581 return reloc_type == 9; /* R_OR1K_32_PCREL. */
aca88567 12582 case EM_PARISC:
85acf597 12583 return reloc_type == 9; /* R_PARISC_PCREL32. */
aca88567
NC
12584 case EM_PPC:
12585 return reloc_type == 26; /* R_PPC_REL32. */
12586 case EM_PPC64:
3e0873ac 12587 return reloc_type == 26; /* R_PPC64_REL32. */
25cbdcbb
AS
12588 case EM_RISCV:
12589 return reloc_type == 57; /* R_RISCV_32_PCREL. */
aca88567
NC
12590 case EM_S390_OLD:
12591 case EM_S390:
3e0873ac 12592 return reloc_type == 5; /* R_390_PC32. */
aca88567 12593 case EM_SH:
3e0873ac 12594 return reloc_type == 2; /* R_SH_REL32. */
aca88567
NC
12595 case EM_SPARC32PLUS:
12596 case EM_SPARCV9:
12597 case EM_SPARC:
3e0873ac 12598 return reloc_type == 6; /* R_SPARC_DISP32. */
a7dd7d05
AM
12599 case EM_SPU:
12600 return reloc_type == 13; /* R_SPU_REL32. */
aa137e4d
NC
12601 case EM_TILEGX:
12602 return reloc_type == 6; /* R_TILEGX_32_PCREL. */
12603 case EM_TILEPRO:
12604 return reloc_type == 4; /* R_TILEPRO_32_PCREL. */
619ed720
EB
12605 case EM_VISIUM:
12606 return reloc_type == 6; /* R_VISIUM_32_PCREL */
aca88567 12607 case EM_X86_64:
8a9036a4 12608 case EM_L1OM:
7a9068fe 12609 case EM_K1OM:
3e0873ac 12610 return reloc_type == 2; /* R_X86_64_PC32. */
2fcb9706
BW
12611 case EM_XTENSA_OLD:
12612 case EM_XTENSA:
12613 return reloc_type == 14; /* R_XTENSA_32_PCREL. */
aca88567
NC
12614 default:
12615 /* Do not abort or issue an error message here. Not all targets use
12616 pc-relative 32-bit relocs in their DWARF debug information and we
12617 have already tested for target coverage in is_32bit_abs_reloc. A
cf13d699
NC
12618 more helpful warning message will be generated by apply_relocations
12619 anyway, so just return. */
aca88567
NC
12620 return FALSE;
12621 }
12622}
12623
12624/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12625 a 64-bit absolute RELA relocation used in DWARF debug sections. */
12626
12627static bfd_boolean
dda8d76d 12628is_64bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
aca88567 12629{
dda8d76d 12630 switch (filedata->file_header.e_machine)
aca88567 12631 {
a06ea964
NC
12632 case EM_AARCH64:
12633 return reloc_type == 257; /* R_AARCH64_ABS64. */
aca88567
NC
12634 case EM_ALPHA:
12635 return reloc_type == 2; /* R_ALPHA_REFQUAD. */
3730236a 12636 case EM_IA_64:
262cdac7
AM
12637 return (reloc_type == 0x26 /* R_IA64_DIR64MSB. */
12638 || reloc_type == 0x27 /* R_IA64_DIR64LSB. */);
3e0873ac
NC
12639 case EM_PARISC:
12640 return reloc_type == 80; /* R_PARISC_DIR64. */
aca88567
NC
12641 case EM_PPC64:
12642 return reloc_type == 38; /* R_PPC64_ADDR64. */
e23eba97
NC
12643 case EM_RISCV:
12644 return reloc_type == 2; /* R_RISCV_64. */
aca88567
NC
12645 case EM_SPARC32PLUS:
12646 case EM_SPARCV9:
12647 case EM_SPARC:
714da62f
NC
12648 return reloc_type == 32 /* R_SPARC_64. */
12649 || reloc_type == 54; /* R_SPARC_UA64. */
aca88567 12650 case EM_X86_64:
8a9036a4 12651 case EM_L1OM:
7a9068fe 12652 case EM_K1OM:
aca88567 12653 return reloc_type == 1; /* R_X86_64_64. */
e819ade1
AS
12654 case EM_S390_OLD:
12655 case EM_S390:
aa137e4d
NC
12656 return reloc_type == 22; /* R_S390_64. */
12657 case EM_TILEGX:
12658 return reloc_type == 1; /* R_TILEGX_64. */
85a82265 12659 case EM_MIPS:
aa137e4d 12660 return reloc_type == 18; /* R_MIPS_64. */
aca88567
NC
12661 default:
12662 return FALSE;
12663 }
12664}
12665
85acf597
RH
12666/* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
12667 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
12668
12669static bfd_boolean
dda8d76d 12670is_64bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
85acf597 12671{
dda8d76d 12672 switch (filedata->file_header.e_machine)
85acf597 12673 {
a06ea964
NC
12674 case EM_AARCH64:
12675 return reloc_type == 260; /* R_AARCH64_PREL64. */
85acf597 12676 case EM_ALPHA:
aa137e4d 12677 return reloc_type == 11; /* R_ALPHA_SREL64. */
85acf597 12678 case EM_IA_64:
262cdac7
AM
12679 return (reloc_type == 0x4e /* R_IA64_PCREL64MSB. */
12680 || reloc_type == 0x4f /* R_IA64_PCREL64LSB. */);
85acf597 12681 case EM_PARISC:
aa137e4d 12682 return reloc_type == 72; /* R_PARISC_PCREL64. */
85acf597 12683 case EM_PPC64:
aa137e4d 12684 return reloc_type == 44; /* R_PPC64_REL64. */
85acf597
RH
12685 case EM_SPARC32PLUS:
12686 case EM_SPARCV9:
12687 case EM_SPARC:
aa137e4d 12688 return reloc_type == 46; /* R_SPARC_DISP64. */
85acf597 12689 case EM_X86_64:
8a9036a4 12690 case EM_L1OM:
7a9068fe 12691 case EM_K1OM:
aa137e4d 12692 return reloc_type == 24; /* R_X86_64_PC64. */
85acf597
RH
12693 case EM_S390_OLD:
12694 case EM_S390:
aa137e4d
NC
12695 return reloc_type == 23; /* R_S390_PC64. */
12696 case EM_TILEGX:
12697 return reloc_type == 5; /* R_TILEGX_64_PCREL. */
85acf597
RH
12698 default:
12699 return FALSE;
12700 }
12701}
12702
4dc3c23d
AM
12703/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12704 a 24-bit absolute RELA relocation used in DWARF debug sections. */
12705
12706static bfd_boolean
dda8d76d 12707is_24bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
4dc3c23d 12708{
dda8d76d 12709 switch (filedata->file_header.e_machine)
4dc3c23d
AM
12710 {
12711 case EM_CYGNUS_MN10200:
12712 case EM_MN10200:
12713 return reloc_type == 4; /* R_MN10200_24. */
3ee6e4fb
NC
12714 case EM_FT32:
12715 return reloc_type == 5; /* R_FT32_20. */
4dc3c23d
AM
12716 default:
12717 return FALSE;
12718 }
12719}
12720
aca88567
NC
12721/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12722 a 16-bit absolute RELA relocation used in DWARF debug sections. */
12723
12724static bfd_boolean
dda8d76d 12725is_16bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
4b78141a 12726{
d347c9df 12727 /* Please keep this table alpha-sorted for ease of visual lookup. */
dda8d76d 12728 switch (filedata->file_header.e_machine)
4b78141a 12729 {
886a2506
NC
12730 case EM_ARC:
12731 case EM_ARC_COMPACT:
12732 case EM_ARC_COMPACT2:
12733 return reloc_type == 2; /* R_ARC_16. */
d347c9df
PS
12734 case EM_ADAPTEVA_EPIPHANY:
12735 return reloc_type == 5;
aca88567
NC
12736 case EM_AVR_OLD:
12737 case EM_AVR:
12738 return reloc_type == 4; /* R_AVR_16. */
41e92641
NC
12739 case EM_CYGNUS_D10V:
12740 case EM_D10V:
12741 return reloc_type == 3; /* R_D10V_16. */
81b42bca
JB
12742 case EM_FT32:
12743 return reloc_type == 2; /* R_FT32_16. */
4b78141a
NC
12744 case EM_H8S:
12745 case EM_H8_300:
12746 case EM_H8_300H:
aca88567
NC
12747 return reloc_type == R_H8_DIR16;
12748 case EM_IP2K_OLD:
12749 case EM_IP2K:
12750 return reloc_type == 1; /* R_IP2K_16. */
ff7eeb89 12751 case EM_M32C_OLD:
f4236fe4
DD
12752 case EM_M32C:
12753 return reloc_type == 1; /* R_M32C_16 */
d347c9df
PS
12754 case EM_CYGNUS_MN10200:
12755 case EM_MN10200:
12756 return reloc_type == 2; /* R_MN10200_16. */
12757 case EM_CYGNUS_MN10300:
12758 case EM_MN10300:
12759 return reloc_type == 2; /* R_MN10300_16. */
aca88567 12760 case EM_MSP430:
dda8d76d 12761 if (uses_msp430x_relocs (filedata))
13761a11 12762 return reloc_type == 2; /* R_MSP430_ABS16. */
1a0670f3 12763 /* Fall through. */
78c8d46c 12764 case EM_MSP430_OLD:
aca88567 12765 return reloc_type == 5; /* R_MSP430_16_BYTE. */
35c08157
KLC
12766 case EM_NDS32:
12767 return reloc_type == 19; /* R_NDS32_RELA. */
3e0873ac 12768 case EM_ALTERA_NIOS2:
36591ba1 12769 return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16. */
3e0873ac
NC
12770 case EM_NIOS32:
12771 return reloc_type == 9; /* R_NIOS_16. */
73589c9d
CS
12772 case EM_OR1K:
12773 return reloc_type == 2; /* R_OR1K_16. */
39e07931
AS
12774 case EM_RISCV:
12775 return reloc_type == 55; /* R_RISCV_SET16. */
2b100bb5
DD
12776 case EM_TI_PRU:
12777 return reloc_type == 8; /* R_PRU_BFD_RELOC_16. */
40b36596
JM
12778 case EM_TI_C6000:
12779 return reloc_type == 2; /* R_C6000_ABS16. */
d347c9df
PS
12780 case EM_VISIUM:
12781 return reloc_type == 2; /* R_VISIUM_16. */
c29aca4a
NC
12782 case EM_XC16X:
12783 case EM_C166:
12784 return reloc_type == 2; /* R_XC16C_ABS_16. */
f6c1a2d5
NC
12785 case EM_XGATE:
12786 return reloc_type == 3; /* R_XGATE_16. */
4b78141a 12787 default:
aca88567 12788 return FALSE;
4b78141a
NC
12789 }
12790}
12791
39e07931
AS
12792/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12793 a 8-bit absolute RELA relocation used in DWARF debug sections. */
12794
12795static bfd_boolean
12796is_8bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12797{
12798 switch (filedata->file_header.e_machine)
12799 {
12800 case EM_RISCV:
12801 return reloc_type == 54; /* R_RISCV_SET8. */
12802 default:
12803 return FALSE;
12804 }
12805}
12806
12807/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12808 a 6-bit absolute RELA relocation used in DWARF debug sections. */
12809
12810static bfd_boolean
12811is_6bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12812{
12813 switch (filedata->file_header.e_machine)
12814 {
12815 case EM_RISCV:
12816 return reloc_type == 53; /* R_RISCV_SET6. */
12817 default:
12818 return FALSE;
12819 }
12820}
12821
03336641
JW
12822/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12823 a 32-bit inplace add RELA relocation used in DWARF debug sections. */
12824
12825static bfd_boolean
12826is_32bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12827{
12828 /* Please keep this table alpha-sorted for ease of visual lookup. */
12829 switch (filedata->file_header.e_machine)
12830 {
12831 case EM_RISCV:
12832 return reloc_type == 35; /* R_RISCV_ADD32. */
12833 default:
12834 return FALSE;
12835 }
12836}
12837
12838/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12839 a 32-bit inplace sub RELA relocation used in DWARF debug sections. */
12840
12841static bfd_boolean
12842is_32bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12843{
12844 /* Please keep this table alpha-sorted for ease of visual lookup. */
12845 switch (filedata->file_header.e_machine)
12846 {
12847 case EM_RISCV:
12848 return reloc_type == 39; /* R_RISCV_SUB32. */
12849 default:
12850 return FALSE;
12851 }
12852}
12853
12854/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12855 a 64-bit inplace add RELA relocation used in DWARF debug sections. */
12856
12857static bfd_boolean
12858is_64bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12859{
12860 /* Please keep this table alpha-sorted for ease of visual lookup. */
12861 switch (filedata->file_header.e_machine)
12862 {
12863 case EM_RISCV:
12864 return reloc_type == 36; /* R_RISCV_ADD64. */
12865 default:
12866 return FALSE;
12867 }
12868}
12869
12870/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12871 a 64-bit inplace sub RELA relocation used in DWARF debug sections. */
12872
12873static bfd_boolean
12874is_64bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12875{
12876 /* Please keep this table alpha-sorted for ease of visual lookup. */
12877 switch (filedata->file_header.e_machine)
12878 {
12879 case EM_RISCV:
12880 return reloc_type == 40; /* R_RISCV_SUB64. */
12881 default:
12882 return FALSE;
12883 }
12884}
12885
12886/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12887 a 16-bit inplace add RELA relocation used in DWARF debug sections. */
12888
12889static bfd_boolean
12890is_16bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12891{
12892 /* Please keep this table alpha-sorted for ease of visual lookup. */
12893 switch (filedata->file_header.e_machine)
12894 {
12895 case EM_RISCV:
12896 return reloc_type == 34; /* R_RISCV_ADD16. */
12897 default:
12898 return FALSE;
12899 }
12900}
12901
12902/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12903 a 16-bit inplace sub RELA relocation used in DWARF debug sections. */
12904
12905static bfd_boolean
12906is_16bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12907{
12908 /* Please keep this table alpha-sorted for ease of visual lookup. */
12909 switch (filedata->file_header.e_machine)
12910 {
12911 case EM_RISCV:
12912 return reloc_type == 38; /* R_RISCV_SUB16. */
12913 default:
12914 return FALSE;
12915 }
12916}
12917
12918/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12919 a 8-bit inplace add RELA relocation used in DWARF debug sections. */
12920
12921static bfd_boolean
12922is_8bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12923{
12924 /* Please keep this table alpha-sorted for ease of visual lookup. */
12925 switch (filedata->file_header.e_machine)
12926 {
12927 case EM_RISCV:
12928 return reloc_type == 33; /* R_RISCV_ADD8. */
12929 default:
12930 return FALSE;
12931 }
12932}
12933
12934/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12935 a 8-bit inplace sub RELA relocation used in DWARF debug sections. */
12936
12937static bfd_boolean
12938is_8bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12939{
12940 /* Please keep this table alpha-sorted for ease of visual lookup. */
12941 switch (filedata->file_header.e_machine)
12942 {
12943 case EM_RISCV:
12944 return reloc_type == 37; /* R_RISCV_SUB8. */
12945 default:
12946 return FALSE;
12947 }
12948}
12949
39e07931
AS
12950/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12951 a 6-bit inplace sub RELA relocation used in DWARF debug sections. */
12952
12953static bfd_boolean
12954is_6bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12955{
12956 switch (filedata->file_header.e_machine)
12957 {
12958 case EM_RISCV:
12959 return reloc_type == 52; /* R_RISCV_SUB6. */
12960 default:
12961 return FALSE;
12962 }
12963}
12964
2a7b2e88
JK
12965/* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
12966 relocation entries (possibly formerly used for SHT_GROUP sections). */
12967
12968static bfd_boolean
dda8d76d 12969is_none_reloc (Filedata * filedata, unsigned int reloc_type)
2a7b2e88 12970{
dda8d76d 12971 switch (filedata->file_header.e_machine)
2a7b2e88 12972 {
cb8f3167 12973 case EM_386: /* R_386_NONE. */
d347c9df 12974 case EM_68K: /* R_68K_NONE. */
cfb8c092 12975 case EM_ADAPTEVA_EPIPHANY:
d347c9df
PS
12976 case EM_ALPHA: /* R_ALPHA_NONE. */
12977 case EM_ALTERA_NIOS2: /* R_NIOS2_NONE. */
886a2506 12978 case EM_ARC: /* R_ARC_NONE. */
886a2506 12979 case EM_ARC_COMPACT2: /* R_ARC_NONE. */
d347c9df 12980 case EM_ARC_COMPACT: /* R_ARC_NONE. */
cb8f3167 12981 case EM_ARM: /* R_ARM_NONE. */
d347c9df 12982 case EM_C166: /* R_XC16X_NONE. */
cb8f3167 12983 case EM_CRIS: /* R_CRIS_NONE. */
d347c9df
PS
12984 case EM_FT32: /* R_FT32_NONE. */
12985 case EM_IA_64: /* R_IA64_NONE. */
7a9068fe 12986 case EM_K1OM: /* R_X86_64_NONE. */
d347c9df
PS
12987 case EM_L1OM: /* R_X86_64_NONE. */
12988 case EM_M32R: /* R_M32R_NONE. */
12989 case EM_MIPS: /* R_MIPS_NONE. */
cb8f3167 12990 case EM_MN10300: /* R_MN10300_NONE. */
5506d11a 12991 case EM_MOXIE: /* R_MOXIE_NONE. */
d347c9df
PS
12992 case EM_NIOS32: /* R_NIOS_NONE. */
12993 case EM_OR1K: /* R_OR1K_NONE. */
12994 case EM_PARISC: /* R_PARISC_NONE. */
12995 case EM_PPC64: /* R_PPC64_NONE. */
12996 case EM_PPC: /* R_PPC_NONE. */
e23eba97 12997 case EM_RISCV: /* R_RISCV_NONE. */
d347c9df
PS
12998 case EM_S390: /* R_390_NONE. */
12999 case EM_S390_OLD:
13000 case EM_SH: /* R_SH_NONE. */
13001 case EM_SPARC32PLUS:
13002 case EM_SPARC: /* R_SPARC_NONE. */
13003 case EM_SPARCV9:
aa137e4d
NC
13004 case EM_TILEGX: /* R_TILEGX_NONE. */
13005 case EM_TILEPRO: /* R_TILEPRO_NONE. */
d347c9df
PS
13006 case EM_TI_C6000:/* R_C6000_NONE. */
13007 case EM_X86_64: /* R_X86_64_NONE. */
c29aca4a 13008 case EM_XC16X:
f96bd6c2 13009 case EM_WEBASSEMBLY: /* R_WASM32_NONE. */
cb8f3167 13010 return reloc_type == 0;
d347c9df 13011
a06ea964
NC
13012 case EM_AARCH64:
13013 return reloc_type == 0 || reloc_type == 256;
d347c9df
PS
13014 case EM_AVR_OLD:
13015 case EM_AVR:
13016 return (reloc_type == 0 /* R_AVR_NONE. */
13017 || reloc_type == 30 /* R_AVR_DIFF8. */
13018 || reloc_type == 31 /* R_AVR_DIFF16. */
13019 || reloc_type == 32 /* R_AVR_DIFF32. */);
13020 case EM_METAG:
13021 return reloc_type == 3; /* R_METAG_NONE. */
35c08157
KLC
13022 case EM_NDS32:
13023 return (reloc_type == 0 /* R_XTENSA_NONE. */
13024 || reloc_type == 204 /* R_NDS32_DIFF8. */
13025 || reloc_type == 205 /* R_NDS32_DIFF16. */
13026 || reloc_type == 206 /* R_NDS32_DIFF32. */
13027 || reloc_type == 207 /* R_NDS32_ULEB128. */);
2b100bb5
DD
13028 case EM_TI_PRU:
13029 return (reloc_type == 0 /* R_PRU_NONE. */
13030 || reloc_type == 65 /* R_PRU_DIFF8. */
13031 || reloc_type == 66 /* R_PRU_DIFF16. */
13032 || reloc_type == 67 /* R_PRU_DIFF32. */);
58332dda
JK
13033 case EM_XTENSA_OLD:
13034 case EM_XTENSA:
4dc3c23d
AM
13035 return (reloc_type == 0 /* R_XTENSA_NONE. */
13036 || reloc_type == 17 /* R_XTENSA_DIFF8. */
13037 || reloc_type == 18 /* R_XTENSA_DIFF16. */
13038 || reloc_type == 19 /* R_XTENSA_DIFF32. */);
2a7b2e88
JK
13039 }
13040 return FALSE;
13041}
13042
d1c4b12b
NC
13043/* Returns TRUE if there is a relocation against
13044 section NAME at OFFSET bytes. */
13045
13046bfd_boolean
13047reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
13048{
13049 Elf_Internal_Rela * relocs;
13050 Elf_Internal_Rela * rp;
13051
13052 if (dsec == NULL || dsec->reloc_info == NULL)
13053 return FALSE;
13054
13055 relocs = (Elf_Internal_Rela *) dsec->reloc_info;
13056
13057 for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
13058 if (rp->r_offset == offset)
13059 return TRUE;
13060
13061 return FALSE;
13062}
13063
cf13d699 13064/* Apply relocations to a section.
32ec8896
NC
13065 Returns TRUE upon success, FALSE otherwise.
13066 If RELOCS_RETURN is non-NULL then it is set to point to the loaded relocs.
13067 It is then the caller's responsibility to free them. NUM_RELOCS_RETURN
13068 will be set to the number of relocs loaded.
13069
cf13d699 13070 Note: So far support has been added only for those relocations
32ec8896
NC
13071 which can be found in debug sections. FIXME: Add support for
13072 more relocations ? */
1b315056 13073
32ec8896 13074static bfd_boolean
dda8d76d 13075apply_relocations (Filedata * filedata,
d1c4b12b
NC
13076 const Elf_Internal_Shdr * section,
13077 unsigned char * start,
13078 bfd_size_type size,
1449284b 13079 void ** relocs_return,
d1c4b12b 13080 unsigned long * num_relocs_return)
1b315056 13081{
cf13d699 13082 Elf_Internal_Shdr * relsec;
0d2a7a93 13083 unsigned char * end = start + size;
cb8f3167 13084
d1c4b12b
NC
13085 if (relocs_return != NULL)
13086 {
13087 * (Elf_Internal_Rela **) relocs_return = NULL;
13088 * num_relocs_return = 0;
13089 }
13090
dda8d76d 13091 if (filedata->file_header.e_type != ET_REL)
32ec8896
NC
13092 /* No relocs to apply. */
13093 return TRUE;
1b315056 13094
cf13d699 13095 /* Find the reloc section associated with the section. */
dda8d76d
NC
13096 for (relsec = filedata->section_headers;
13097 relsec < filedata->section_headers + filedata->file_header.e_shnum;
5b18a4bc 13098 ++relsec)
252b5132 13099 {
41e92641
NC
13100 bfd_boolean is_rela;
13101 unsigned long num_relocs;
2cf0635d
NC
13102 Elf_Internal_Rela * relocs;
13103 Elf_Internal_Rela * rp;
13104 Elf_Internal_Shdr * symsec;
13105 Elf_Internal_Sym * symtab;
ba5cdace 13106 unsigned long num_syms;
2cf0635d 13107 Elf_Internal_Sym * sym;
252b5132 13108
41e92641 13109 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
dda8d76d
NC
13110 || relsec->sh_info >= filedata->file_header.e_shnum
13111 || filedata->section_headers + relsec->sh_info != section
c256ffe7 13112 || relsec->sh_size == 0
dda8d76d 13113 || relsec->sh_link >= filedata->file_header.e_shnum)
5b18a4bc 13114 continue;
428409d5 13115
41e92641
NC
13116 is_rela = relsec->sh_type == SHT_RELA;
13117
13118 if (is_rela)
13119 {
dda8d76d 13120 if (!slurp_rela_relocs (filedata, relsec->sh_offset,
3f5e193b 13121 relsec->sh_size, & relocs, & num_relocs))
32ec8896 13122 return FALSE;
41e92641
NC
13123 }
13124 else
13125 {
dda8d76d 13126 if (!slurp_rel_relocs (filedata, relsec->sh_offset,
3f5e193b 13127 relsec->sh_size, & relocs, & num_relocs))
32ec8896 13128 return FALSE;
41e92641
NC
13129 }
13130
13131 /* SH uses RELA but uses in place value instead of the addend field. */
dda8d76d 13132 if (filedata->file_header.e_machine == EM_SH)
41e92641 13133 is_rela = FALSE;
428409d5 13134
dda8d76d 13135 symsec = filedata->section_headers + relsec->sh_link;
1449284b
NC
13136 if (symsec->sh_type != SHT_SYMTAB
13137 && symsec->sh_type != SHT_DYNSYM)
32ec8896 13138 return FALSE;
dda8d76d 13139 symtab = GET_ELF_SYMBOLS (filedata, symsec, & num_syms);
103f02d3 13140
41e92641 13141 for (rp = relocs; rp < relocs + num_relocs; ++rp)
252b5132 13142 {
41e92641
NC
13143 bfd_vma addend;
13144 unsigned int reloc_type;
13145 unsigned int reloc_size;
03336641
JW
13146 bfd_boolean reloc_inplace = FALSE;
13147 bfd_boolean reloc_subtract = FALSE;
91d6fa6a 13148 unsigned char * rloc;
ba5cdace 13149 unsigned long sym_index;
4b78141a 13150
dda8d76d 13151 reloc_type = get_reloc_type (filedata, rp->r_info);
41e92641 13152
dda8d76d 13153 if (target_specific_reloc_handling (filedata, rp, start, end, symtab, num_syms))
2a7b2e88 13154 continue;
dda8d76d 13155 else if (is_none_reloc (filedata, reloc_type))
98fb390a 13156 continue;
dda8d76d
NC
13157 else if (is_32bit_abs_reloc (filedata, reloc_type)
13158 || is_32bit_pcrel_reloc (filedata, reloc_type))
aca88567 13159 reloc_size = 4;
dda8d76d
NC
13160 else if (is_64bit_abs_reloc (filedata, reloc_type)
13161 || is_64bit_pcrel_reloc (filedata, reloc_type))
aca88567 13162 reloc_size = 8;
dda8d76d 13163 else if (is_24bit_abs_reloc (filedata, reloc_type))
4dc3c23d 13164 reloc_size = 3;
dda8d76d 13165 else if (is_16bit_abs_reloc (filedata, reloc_type))
aca88567 13166 reloc_size = 2;
39e07931
AS
13167 else if (is_8bit_abs_reloc (filedata, reloc_type)
13168 || is_6bit_abs_reloc (filedata, reloc_type))
13169 reloc_size = 1;
03336641
JW
13170 else if ((reloc_subtract = is_32bit_inplace_sub_reloc (filedata,
13171 reloc_type))
13172 || is_32bit_inplace_add_reloc (filedata, reloc_type))
13173 {
13174 reloc_size = 4;
13175 reloc_inplace = TRUE;
13176 }
13177 else if ((reloc_subtract = is_64bit_inplace_sub_reloc (filedata,
13178 reloc_type))
13179 || is_64bit_inplace_add_reloc (filedata, reloc_type))
13180 {
13181 reloc_size = 8;
13182 reloc_inplace = TRUE;
13183 }
13184 else if ((reloc_subtract = is_16bit_inplace_sub_reloc (filedata,
13185 reloc_type))
13186 || is_16bit_inplace_add_reloc (filedata, reloc_type))
13187 {
13188 reloc_size = 2;
13189 reloc_inplace = TRUE;
13190 }
13191 else if ((reloc_subtract = is_8bit_inplace_sub_reloc (filedata,
13192 reloc_type))
13193 || is_8bit_inplace_add_reloc (filedata, reloc_type))
13194 {
13195 reloc_size = 1;
13196 reloc_inplace = TRUE;
13197 }
39e07931
AS
13198 else if ((reloc_subtract = is_6bit_inplace_sub_reloc (filedata,
13199 reloc_type)))
13200 {
13201 reloc_size = 1;
13202 reloc_inplace = TRUE;
13203 }
aca88567 13204 else
4b78141a 13205 {
bee0ee85 13206 static unsigned int prev_reloc = 0;
dda8d76d 13207
bee0ee85
NC
13208 if (reloc_type != prev_reloc)
13209 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
dda8d76d 13210 reloc_type, printable_section_name (filedata, section));
bee0ee85 13211 prev_reloc = reloc_type;
4b78141a
NC
13212 continue;
13213 }
103f02d3 13214
91d6fa6a 13215 rloc = start + rp->r_offset;
c8da6823 13216 if ((rloc + reloc_size) > end || (rloc < start))
700dd8b7
L
13217 {
13218 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
13219 (unsigned long) rp->r_offset,
dda8d76d 13220 printable_section_name (filedata, section));
700dd8b7
L
13221 continue;
13222 }
103f02d3 13223
ba5cdace
NC
13224 sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
13225 if (sym_index >= num_syms)
13226 {
13227 warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
dda8d76d 13228 sym_index, printable_section_name (filedata, section));
ba5cdace
NC
13229 continue;
13230 }
13231 sym = symtab + sym_index;
41e92641
NC
13232
13233 /* If the reloc has a symbol associated with it,
55f25fc3
L
13234 make sure that it is of an appropriate type.
13235
13236 Relocations against symbols without type can happen.
13237 Gcc -feliminate-dwarf2-dups may generate symbols
13238 without type for debug info.
13239
13240 Icc generates relocations against function symbols
13241 instead of local labels.
13242
13243 Relocations against object symbols can happen, eg when
13244 referencing a global array. For an example of this see
13245 the _clz.o binary in libgcc.a. */
aca88567 13246 if (sym != symtab
b8871f35 13247 && ELF_ST_TYPE (sym->st_info) != STT_COMMON
55f25fc3 13248 && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
5b18a4bc 13249 {
d3a49aa8 13250 warn (_("skipping unexpected symbol type %s in section %s relocation %ld\n"),
dda8d76d
NC
13251 get_symbol_type (filedata, ELF_ST_TYPE (sym->st_info)),
13252 printable_section_name (filedata, relsec),
d3a49aa8 13253 (long int)(rp - relocs));
aca88567 13254 continue;
5b18a4bc 13255 }
252b5132 13256
4dc3c23d
AM
13257 addend = 0;
13258 if (is_rela)
13259 addend += rp->r_addend;
c47320c3
AM
13260 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
13261 partial_inplace. */
4dc3c23d 13262 if (!is_rela
dda8d76d 13263 || (filedata->file_header.e_machine == EM_XTENSA
4dc3c23d 13264 && reloc_type == 1)
dda8d76d
NC
13265 || ((filedata->file_header.e_machine == EM_PJ
13266 || filedata->file_header.e_machine == EM_PJ_OLD)
c47320c3 13267 && reloc_type == 1)
dda8d76d
NC
13268 || ((filedata->file_header.e_machine == EM_D30V
13269 || filedata->file_header.e_machine == EM_CYGNUS_D30V)
03336641
JW
13270 && reloc_type == 12)
13271 || reloc_inplace)
39e07931
AS
13272 {
13273 if (is_6bit_inplace_sub_reloc (filedata, reloc_type))
13274 addend += byte_get (rloc, reloc_size) & 0x3f;
13275 else
13276 addend += byte_get (rloc, reloc_size);
13277 }
cb8f3167 13278
dda8d76d
NC
13279 if (is_32bit_pcrel_reloc (filedata, reloc_type)
13280 || is_64bit_pcrel_reloc (filedata, reloc_type))
85acf597
RH
13281 {
13282 /* On HPPA, all pc-relative relocations are biased by 8. */
dda8d76d 13283 if (filedata->file_header.e_machine == EM_PARISC)
85acf597 13284 addend -= 8;
91d6fa6a 13285 byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
85acf597
RH
13286 reloc_size);
13287 }
39e07931
AS
13288 else if (is_6bit_abs_reloc (filedata, reloc_type)
13289 || is_6bit_inplace_sub_reloc (filedata, reloc_type))
13290 {
13291 if (reloc_subtract)
13292 addend -= sym->st_value;
13293 else
13294 addend += sym->st_value;
13295 addend = (addend & 0x3f) | (byte_get (rloc, reloc_size) & 0xc0);
13296 byte_put (rloc, addend, reloc_size);
13297 }
03336641
JW
13298 else if (reloc_subtract)
13299 byte_put (rloc, addend - sym->st_value, reloc_size);
41e92641 13300 else
91d6fa6a 13301 byte_put (rloc, addend + sym->st_value, reloc_size);
5b18a4bc 13302 }
252b5132 13303
5b18a4bc 13304 free (symtab);
f84ce13b
NC
13305 /* Let the target specific reloc processing code know that
13306 we have finished with these relocs. */
dda8d76d 13307 target_specific_reloc_handling (filedata, NULL, NULL, NULL, NULL, 0);
d1c4b12b
NC
13308
13309 if (relocs_return)
13310 {
13311 * (Elf_Internal_Rela **) relocs_return = relocs;
13312 * num_relocs_return = num_relocs;
13313 }
13314 else
13315 free (relocs);
13316
5b18a4bc
NC
13317 break;
13318 }
32ec8896 13319
dfc616fa 13320 return TRUE;
5b18a4bc 13321}
103f02d3 13322
cf13d699 13323#ifdef SUPPORT_DISASSEMBLY
32ec8896 13324static bfd_boolean
dda8d76d 13325disassemble_section (Elf_Internal_Shdr * section, Filedata * filedata)
cf13d699 13326{
dda8d76d 13327 printf (_("\nAssembly dump of section %s\n"), printable_section_name (filedata, section));
cf13d699 13328
74e1a04b 13329 /* FIXME: XXX -- to be done --- XXX */
cf13d699 13330
32ec8896 13331 return TRUE;
cf13d699
NC
13332}
13333#endif
13334
13335/* Reads in the contents of SECTION from FILE, returning a pointer
13336 to a malloc'ed buffer or NULL if something went wrong. */
13337
13338static char *
dda8d76d 13339get_section_contents (Elf_Internal_Shdr * section, Filedata * filedata)
cf13d699 13340{
dda8d76d 13341 bfd_size_type num_bytes = section->sh_size;
cf13d699
NC
13342
13343 if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
13344 {
c6b78c96 13345 printf (_("Section '%s' has no data to dump.\n"),
dda8d76d 13346 printable_section_name (filedata, section));
cf13d699
NC
13347 return NULL;
13348 }
13349
dda8d76d 13350 return (char *) get_data (NULL, filedata, section->sh_offset, 1, num_bytes,
3f5e193b 13351 _("section contents"));
cf13d699
NC
13352}
13353
0e602686
NC
13354/* Uncompresses a section that was compressed using zlib, in place. */
13355
13356static bfd_boolean
dda8d76d
NC
13357uncompress_section_contents (unsigned char ** buffer,
13358 dwarf_size_type uncompressed_size,
13359 dwarf_size_type * size)
0e602686
NC
13360{
13361 dwarf_size_type compressed_size = *size;
13362 unsigned char * compressed_buffer = *buffer;
13363 unsigned char * uncompressed_buffer;
13364 z_stream strm;
13365 int rc;
13366
13367 /* It is possible the section consists of several compressed
13368 buffers concatenated together, so we uncompress in a loop. */
13369 /* PR 18313: The state field in the z_stream structure is supposed
13370 to be invisible to the user (ie us), but some compilers will
13371 still complain about it being used without initialisation. So
13372 we first zero the entire z_stream structure and then set the fields
13373 that we need. */
13374 memset (& strm, 0, sizeof strm);
13375 strm.avail_in = compressed_size;
13376 strm.next_in = (Bytef *) compressed_buffer;
13377 strm.avail_out = uncompressed_size;
13378 uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
13379
13380 rc = inflateInit (& strm);
13381 while (strm.avail_in > 0)
13382 {
13383 if (rc != Z_OK)
13384 goto fail;
13385 strm.next_out = ((Bytef *) uncompressed_buffer
13386 + (uncompressed_size - strm.avail_out));
13387 rc = inflate (&strm, Z_FINISH);
13388 if (rc != Z_STREAM_END)
13389 goto fail;
13390 rc = inflateReset (& strm);
13391 }
13392 rc = inflateEnd (& strm);
13393 if (rc != Z_OK
13394 || strm.avail_out != 0)
13395 goto fail;
13396
13397 *buffer = uncompressed_buffer;
13398 *size = uncompressed_size;
13399 return TRUE;
13400
13401 fail:
13402 free (uncompressed_buffer);
13403 /* Indicate decompression failure. */
13404 *buffer = NULL;
13405 return FALSE;
13406}
dd24e3da 13407
32ec8896 13408static bfd_boolean
dda8d76d 13409dump_section_as_strings (Elf_Internal_Shdr * section, Filedata * filedata)
cf13d699 13410{
0e602686
NC
13411 Elf_Internal_Shdr * relsec;
13412 bfd_size_type num_bytes;
fd8008d8
L
13413 unsigned char * data;
13414 unsigned char * end;
13415 unsigned char * real_start;
13416 unsigned char * start;
0e602686 13417 bfd_boolean some_strings_shown;
cf13d699 13418
dda8d76d 13419 real_start = start = (unsigned char *) get_section_contents (section, filedata);
cf13d699 13420 if (start == NULL)
c6b78c96
NC
13421 /* PR 21820: Do not fail if the section was empty. */
13422 return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
13423
0e602686 13424 num_bytes = section->sh_size;
cf13d699 13425
dda8d76d 13426 printf (_("\nString dump of section '%s':\n"), printable_section_name (filedata, section));
cf13d699 13427
0e602686
NC
13428 if (decompress_dumps)
13429 {
13430 dwarf_size_type new_size = num_bytes;
13431 dwarf_size_type uncompressed_size = 0;
13432
13433 if ((section->sh_flags & SHF_COMPRESSED) != 0)
13434 {
13435 Elf_Internal_Chdr chdr;
13436 unsigned int compression_header_size
ebdf1ebf
NC
13437 = get_compression_header (& chdr, (unsigned char *) start,
13438 num_bytes);
0e602686 13439
813dabb9 13440 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
0e602686 13441 {
813dabb9 13442 warn (_("section '%s' has unsupported compress type: %d\n"),
dda8d76d 13443 printable_section_name (filedata, section), chdr.ch_type);
32ec8896 13444 return FALSE;
813dabb9 13445 }
813dabb9
L
13446 uncompressed_size = chdr.ch_size;
13447 start += compression_header_size;
13448 new_size -= compression_header_size;
0e602686
NC
13449 }
13450 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
13451 {
13452 /* Read the zlib header. In this case, it should be "ZLIB"
13453 followed by the uncompressed section size, 8 bytes in
13454 big-endian order. */
13455 uncompressed_size = start[4]; uncompressed_size <<= 8;
13456 uncompressed_size += start[5]; uncompressed_size <<= 8;
13457 uncompressed_size += start[6]; uncompressed_size <<= 8;
13458 uncompressed_size += start[7]; uncompressed_size <<= 8;
13459 uncompressed_size += start[8]; uncompressed_size <<= 8;
13460 uncompressed_size += start[9]; uncompressed_size <<= 8;
13461 uncompressed_size += start[10]; uncompressed_size <<= 8;
13462 uncompressed_size += start[11];
13463 start += 12;
13464 new_size -= 12;
13465 }
13466
1835f746
NC
13467 if (uncompressed_size)
13468 {
13469 if (uncompress_section_contents (& start,
13470 uncompressed_size, & new_size))
13471 num_bytes = new_size;
13472 else
13473 {
13474 error (_("Unable to decompress section %s\n"),
dda8d76d 13475 printable_section_name (filedata, section));
32ec8896 13476 return FALSE;
1835f746
NC
13477 }
13478 }
bc303e5d
NC
13479 else
13480 start = real_start;
0e602686 13481 }
fd8008d8 13482
cf13d699
NC
13483 /* If the section being dumped has relocations against it the user might
13484 be expecting these relocations to have been applied. Check for this
13485 case and issue a warning message in order to avoid confusion.
13486 FIXME: Maybe we ought to have an option that dumps a section with
13487 relocs applied ? */
dda8d76d
NC
13488 for (relsec = filedata->section_headers;
13489 relsec < filedata->section_headers + filedata->file_header.e_shnum;
cf13d699
NC
13490 ++relsec)
13491 {
13492 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
dda8d76d
NC
13493 || relsec->sh_info >= filedata->file_header.e_shnum
13494 || filedata->section_headers + relsec->sh_info != section
cf13d699 13495 || relsec->sh_size == 0
dda8d76d 13496 || relsec->sh_link >= filedata->file_header.e_shnum)
cf13d699
NC
13497 continue;
13498
13499 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
13500 break;
13501 }
13502
cf13d699
NC
13503 data = start;
13504 end = start + num_bytes;
13505 some_strings_shown = FALSE;
13506
13507 while (data < end)
13508 {
13509 while (!ISPRINT (* data))
13510 if (++ data >= end)
13511 break;
13512
13513 if (data < end)
13514 {
071436c6
NC
13515 size_t maxlen = end - data;
13516
cf13d699 13517#ifndef __MSVCRT__
c975cc98
NC
13518 /* PR 11128: Use two separate invocations in order to work
13519 around bugs in the Solaris 8 implementation of printf. */
13520 printf (" [%6tx] ", data - start);
cf13d699 13521#else
071436c6 13522 printf (" [%6Ix] ", (size_t) (data - start));
cf13d699 13523#endif
4082ef84
NC
13524 if (maxlen > 0)
13525 {
fd8008d8 13526 print_symbol ((int) maxlen, (const char *) data);
4082ef84 13527 putchar ('\n');
fd8008d8 13528 data += strnlen ((const char *) data, maxlen);
4082ef84
NC
13529 }
13530 else
13531 {
13532 printf (_("<corrupt>\n"));
13533 data = end;
13534 }
cf13d699
NC
13535 some_strings_shown = TRUE;
13536 }
13537 }
13538
13539 if (! some_strings_shown)
13540 printf (_(" No strings found in this section."));
13541
0e602686 13542 free (real_start);
cf13d699
NC
13543
13544 putchar ('\n');
32ec8896 13545 return TRUE;
cf13d699
NC
13546}
13547
32ec8896 13548static bfd_boolean
dda8d76d
NC
13549dump_section_as_bytes (Elf_Internal_Shdr * section,
13550 Filedata * filedata,
13551 bfd_boolean relocate)
cf13d699
NC
13552{
13553 Elf_Internal_Shdr * relsec;
0e602686
NC
13554 bfd_size_type bytes;
13555 bfd_size_type section_size;
13556 bfd_vma addr;
13557 unsigned char * data;
13558 unsigned char * real_start;
13559 unsigned char * start;
13560
dda8d76d 13561 real_start = start = (unsigned char *) get_section_contents (section, filedata);
cf13d699 13562 if (start == NULL)
c6b78c96
NC
13563 /* PR 21820: Do not fail if the section was empty. */
13564 return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
32ec8896 13565
0e602686 13566 section_size = section->sh_size;
cf13d699 13567
dda8d76d 13568 printf (_("\nHex dump of section '%s':\n"), printable_section_name (filedata, section));
cf13d699 13569
0e602686
NC
13570 if (decompress_dumps)
13571 {
13572 dwarf_size_type new_size = section_size;
13573 dwarf_size_type uncompressed_size = 0;
13574
13575 if ((section->sh_flags & SHF_COMPRESSED) != 0)
13576 {
13577 Elf_Internal_Chdr chdr;
13578 unsigned int compression_header_size
ebdf1ebf 13579 = get_compression_header (& chdr, start, section_size);
0e602686 13580
813dabb9 13581 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
0e602686 13582 {
813dabb9 13583 warn (_("section '%s' has unsupported compress type: %d\n"),
dda8d76d 13584 printable_section_name (filedata, section), chdr.ch_type);
32ec8896 13585 return FALSE;
0e602686 13586 }
813dabb9
L
13587 uncompressed_size = chdr.ch_size;
13588 start += compression_header_size;
13589 new_size -= compression_header_size;
0e602686
NC
13590 }
13591 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
13592 {
13593 /* Read the zlib header. In this case, it should be "ZLIB"
13594 followed by the uncompressed section size, 8 bytes in
13595 big-endian order. */
13596 uncompressed_size = start[4]; uncompressed_size <<= 8;
13597 uncompressed_size += start[5]; uncompressed_size <<= 8;
13598 uncompressed_size += start[6]; uncompressed_size <<= 8;
13599 uncompressed_size += start[7]; uncompressed_size <<= 8;
13600 uncompressed_size += start[8]; uncompressed_size <<= 8;
13601 uncompressed_size += start[9]; uncompressed_size <<= 8;
13602 uncompressed_size += start[10]; uncompressed_size <<= 8;
13603 uncompressed_size += start[11];
13604 start += 12;
13605 new_size -= 12;
13606 }
13607
f055032e
NC
13608 if (uncompressed_size)
13609 {
13610 if (uncompress_section_contents (& start, uncompressed_size,
13611 & new_size))
bc303e5d
NC
13612 {
13613 section_size = new_size;
13614 }
f055032e
NC
13615 else
13616 {
13617 error (_("Unable to decompress section %s\n"),
dda8d76d 13618 printable_section_name (filedata, section));
bc303e5d 13619 /* FIXME: Print the section anyway ? */
32ec8896 13620 return FALSE;
f055032e
NC
13621 }
13622 }
bc303e5d
NC
13623 else
13624 start = real_start;
0e602686 13625 }
14ae95f2 13626
cf13d699
NC
13627 if (relocate)
13628 {
dda8d76d 13629 if (! apply_relocations (filedata, section, start, section_size, NULL, NULL))
32ec8896 13630 return FALSE;
cf13d699
NC
13631 }
13632 else
13633 {
13634 /* If the section being dumped has relocations against it the user might
13635 be expecting these relocations to have been applied. Check for this
13636 case and issue a warning message in order to avoid confusion.
13637 FIXME: Maybe we ought to have an option that dumps a section with
13638 relocs applied ? */
dda8d76d
NC
13639 for (relsec = filedata->section_headers;
13640 relsec < filedata->section_headers + filedata->file_header.e_shnum;
cf13d699
NC
13641 ++relsec)
13642 {
13643 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
dda8d76d
NC
13644 || relsec->sh_info >= filedata->file_header.e_shnum
13645 || filedata->section_headers + relsec->sh_info != section
cf13d699 13646 || relsec->sh_size == 0
dda8d76d 13647 || relsec->sh_link >= filedata->file_header.e_shnum)
cf13d699
NC
13648 continue;
13649
13650 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
13651 break;
13652 }
13653 }
13654
13655 addr = section->sh_addr;
0e602686 13656 bytes = section_size;
cf13d699
NC
13657 data = start;
13658
13659 while (bytes)
13660 {
13661 int j;
13662 int k;
13663 int lbytes;
13664
13665 lbytes = (bytes > 16 ? 16 : bytes);
13666
13667 printf (" 0x%8.8lx ", (unsigned long) addr);
13668
13669 for (j = 0; j < 16; j++)
13670 {
13671 if (j < lbytes)
13672 printf ("%2.2x", data[j]);
13673 else
13674 printf (" ");
13675
13676 if ((j & 3) == 3)
13677 printf (" ");
13678 }
13679
13680 for (j = 0; j < lbytes; j++)
13681 {
13682 k = data[j];
13683 if (k >= ' ' && k < 0x7f)
13684 printf ("%c", k);
13685 else
13686 printf (".");
13687 }
13688
13689 putchar ('\n');
13690
13691 data += lbytes;
13692 addr += lbytes;
13693 bytes -= lbytes;
13694 }
13695
0e602686 13696 free (real_start);
cf13d699
NC
13697
13698 putchar ('\n');
32ec8896 13699 return TRUE;
cf13d699
NC
13700}
13701
32ec8896 13702static bfd_boolean
dda8d76d
NC
13703load_specific_debug_section (enum dwarf_section_display_enum debug,
13704 const Elf_Internal_Shdr * sec,
13705 void * data)
1007acb3 13706{
2cf0635d 13707 struct dwarf_section * section = &debug_displays [debug].section;
19e6b90e 13708 char buf [64];
dda8d76d
NC
13709 Filedata * filedata = (Filedata *) data;
13710
19e6b90e 13711 if (section->start != NULL)
dda8d76d
NC
13712 {
13713 /* If it is already loaded, do nothing. */
13714 if (streq (section->filename, filedata->file_name))
13715 return TRUE;
13716 free (section->start);
13717 }
1007acb3 13718
19e6b90e
L
13719 snprintf (buf, sizeof (buf), _("%s section data"), section->name);
13720 section->address = sec->sh_addr;
06614111 13721 section->user_data = NULL;
dda8d76d
NC
13722 section->filename = filedata->file_name;
13723 section->start = (unsigned char *) get_data (NULL, filedata,
3f5e193b
NC
13724 sec->sh_offset, 1,
13725 sec->sh_size, buf);
59245841
NC
13726 if (section->start == NULL)
13727 section->size = 0;
13728 else
13729 {
77115a4a
L
13730 unsigned char *start = section->start;
13731 dwarf_size_type size = sec->sh_size;
dab394de 13732 dwarf_size_type uncompressed_size = 0;
77115a4a
L
13733
13734 if ((sec->sh_flags & SHF_COMPRESSED) != 0)
13735 {
13736 Elf_Internal_Chdr chdr;
d8024a91
NC
13737 unsigned int compression_header_size;
13738
f53be977
L
13739 if (size < (is_32bit_elf
13740 ? sizeof (Elf32_External_Chdr)
13741 : sizeof (Elf64_External_Chdr)))
d8024a91
NC
13742 {
13743 warn (_("compressed section %s is too small to contain a compression header"),
13744 section->name);
32ec8896 13745 return FALSE;
d8024a91
NC
13746 }
13747
ebdf1ebf 13748 compression_header_size = get_compression_header (&chdr, start, size);
d8024a91 13749
813dabb9
L
13750 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13751 {
13752 warn (_("section '%s' has unsupported compress type: %d\n"),
13753 section->name, chdr.ch_type);
32ec8896 13754 return FALSE;
813dabb9 13755 }
dab394de 13756 uncompressed_size = chdr.ch_size;
77115a4a
L
13757 start += compression_header_size;
13758 size -= compression_header_size;
13759 }
dab394de
L
13760 else if (size > 12 && streq ((char *) start, "ZLIB"))
13761 {
13762 /* Read the zlib header. In this case, it should be "ZLIB"
13763 followed by the uncompressed section size, 8 bytes in
13764 big-endian order. */
13765 uncompressed_size = start[4]; uncompressed_size <<= 8;
13766 uncompressed_size += start[5]; uncompressed_size <<= 8;
13767 uncompressed_size += start[6]; uncompressed_size <<= 8;
13768 uncompressed_size += start[7]; uncompressed_size <<= 8;
13769 uncompressed_size += start[8]; uncompressed_size <<= 8;
13770 uncompressed_size += start[9]; uncompressed_size <<= 8;
13771 uncompressed_size += start[10]; uncompressed_size <<= 8;
13772 uncompressed_size += start[11];
13773 start += 12;
13774 size -= 12;
13775 }
13776
1835f746 13777 if (uncompressed_size)
77115a4a 13778 {
1835f746
NC
13779 if (uncompress_section_contents (&start, uncompressed_size,
13780 &size))
13781 {
13782 /* Free the compressed buffer, update the section buffer
13783 and the section size if uncompress is successful. */
13784 free (section->start);
13785 section->start = start;
13786 }
13787 else
13788 {
13789 error (_("Unable to decompress section %s\n"),
dda8d76d 13790 printable_section_name (filedata, sec));
32ec8896 13791 return FALSE;
1835f746 13792 }
77115a4a 13793 }
bc303e5d 13794
77115a4a 13795 section->size = size;
59245841 13796 }
4a114e3e 13797
1b315056 13798 if (section->start == NULL)
32ec8896 13799 return FALSE;
1b315056 13800
19e6b90e 13801 if (debug_displays [debug].relocate)
32ec8896 13802 {
dda8d76d 13803 if (! apply_relocations (filedata, sec, section->start, section->size,
32ec8896
NC
13804 & section->reloc_info, & section->num_relocs))
13805 return FALSE;
13806 }
d1c4b12b
NC
13807 else
13808 {
13809 section->reloc_info = NULL;
13810 section->num_relocs = 0;
13811 }
1007acb3 13812
32ec8896 13813 return TRUE;
1007acb3
L
13814}
13815
657d0d47
CC
13816/* If this is not NULL, load_debug_section will only look for sections
13817 within the list of sections given here. */
32ec8896 13818static unsigned int * section_subset = NULL;
657d0d47 13819
32ec8896 13820bfd_boolean
dda8d76d 13821load_debug_section (enum dwarf_section_display_enum debug, void * data)
d966045b 13822{
2cf0635d
NC
13823 struct dwarf_section * section = &debug_displays [debug].section;
13824 Elf_Internal_Shdr * sec;
dda8d76d
NC
13825 Filedata * filedata = (Filedata *) data;
13826
f425ec66
NC
13827 /* Without section headers we cannot find any sections. */
13828 if (filedata->section_headers == NULL)
13829 return FALSE;
13830
9c1ce108
AM
13831 if (filedata->string_table == NULL
13832 && filedata->file_header.e_shstrndx != SHN_UNDEF
13833 && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
dda8d76d
NC
13834 {
13835 Elf_Internal_Shdr * strs;
13836
13837 /* Read in the string table, so that we have section names to scan. */
13838 strs = filedata->section_headers + filedata->file_header.e_shstrndx;
13839
4dff97b2 13840 if (strs != NULL && strs->sh_size != 0)
dda8d76d 13841 {
9c1ce108
AM
13842 filedata->string_table
13843 = (char *) get_data (NULL, filedata, strs->sh_offset,
13844 1, strs->sh_size, _("string table"));
dda8d76d 13845
9c1ce108
AM
13846 filedata->string_table_length
13847 = filedata->string_table != NULL ? strs->sh_size : 0;
dda8d76d
NC
13848 }
13849 }
d966045b
DJ
13850
13851 /* Locate the debug section. */
dda8d76d 13852 sec = find_section_in_set (filedata, section->uncompressed_name, section_subset);
d966045b
DJ
13853 if (sec != NULL)
13854 section->name = section->uncompressed_name;
13855 else
13856 {
dda8d76d 13857 sec = find_section_in_set (filedata, section->compressed_name, section_subset);
d966045b
DJ
13858 if (sec != NULL)
13859 section->name = section->compressed_name;
13860 }
13861 if (sec == NULL)
32ec8896 13862 return FALSE;
d966045b 13863
657d0d47
CC
13864 /* If we're loading from a subset of sections, and we've loaded
13865 a section matching this name before, it's likely that it's a
13866 different one. */
13867 if (section_subset != NULL)
13868 free_debug_section (debug);
13869
dda8d76d 13870 return load_specific_debug_section (debug, sec, data);
d966045b
DJ
13871}
13872
19e6b90e
L
13873void
13874free_debug_section (enum dwarf_section_display_enum debug)
1007acb3 13875{
2cf0635d 13876 struct dwarf_section * section = &debug_displays [debug].section;
1007acb3 13877
19e6b90e
L
13878 if (section->start == NULL)
13879 return;
1007acb3 13880
19e6b90e
L
13881 free ((char *) section->start);
13882 section->start = NULL;
13883 section->address = 0;
13884 section->size = 0;
1007acb3
L
13885}
13886
32ec8896 13887static bfd_boolean
dda8d76d 13888display_debug_section (int shndx, Elf_Internal_Shdr * section, Filedata * filedata)
1007acb3 13889{
2cf0635d 13890 char * name = SECTION_NAME (section);
dda8d76d 13891 const char * print_name = printable_section_name (filedata, section);
19e6b90e 13892 bfd_size_type length;
32ec8896 13893 bfd_boolean result = TRUE;
3f5e193b 13894 int i;
1007acb3 13895
19e6b90e
L
13896 length = section->sh_size;
13897 if (length == 0)
1007acb3 13898 {
74e1a04b 13899 printf (_("\nSection '%s' has no debugging data.\n"), print_name);
32ec8896 13900 return TRUE;
1007acb3 13901 }
5dff79d8
NC
13902 if (section->sh_type == SHT_NOBITS)
13903 {
13904 /* There is no point in dumping the contents of a debugging section
13905 which has the NOBITS type - the bits in the file will be random.
13906 This can happen when a file containing a .eh_frame section is
13907 stripped with the --only-keep-debug command line option. */
74e1a04b
NC
13908 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
13909 print_name);
32ec8896 13910 return FALSE;
5dff79d8 13911 }
1007acb3 13912
0112cd26 13913 if (const_strneq (name, ".gnu.linkonce.wi."))
19e6b90e 13914 name = ".debug_info";
1007acb3 13915
19e6b90e
L
13916 /* See if we know how to display the contents of this section. */
13917 for (i = 0; i < max; i++)
d85bf2ba
NC
13918 {
13919 enum dwarf_section_display_enum id = (enum dwarf_section_display_enum) i;
13920 struct dwarf_section_display * display = debug_displays + i;
13921 struct dwarf_section * sec = & display->section;
d966045b 13922
d85bf2ba
NC
13923 if (streq (sec->uncompressed_name, name)
13924 || (id == line && const_strneq (name, ".debug_line."))
13925 || streq (sec->compressed_name, name))
13926 {
13927 bfd_boolean secondary = (section != find_section (filedata, name));
1007acb3 13928
d85bf2ba
NC
13929 if (secondary)
13930 free_debug_section (id);
dda8d76d 13931
d85bf2ba
NC
13932 if (i == line && const_strneq (name, ".debug_line."))
13933 sec->name = name;
13934 else if (streq (sec->uncompressed_name, name))
13935 sec->name = sec->uncompressed_name;
13936 else
13937 sec->name = sec->compressed_name;
657d0d47 13938
d85bf2ba
NC
13939 if (load_specific_debug_section (id, section, filedata))
13940 {
13941 /* If this debug section is part of a CU/TU set in a .dwp file,
13942 restrict load_debug_section to the sections in that set. */
13943 section_subset = find_cu_tu_set (filedata, shndx);
1007acb3 13944
d85bf2ba 13945 result &= display->display (sec, filedata);
657d0d47 13946
d85bf2ba 13947 section_subset = NULL;
1007acb3 13948
d85bf2ba
NC
13949 if (secondary || (id != info && id != abbrev))
13950 free_debug_section (id);
13951 }
13952 break;
13953 }
13954 }
1007acb3 13955
19e6b90e 13956 if (i == max)
1007acb3 13957 {
74e1a04b 13958 printf (_("Unrecognized debug section: %s\n"), print_name);
32ec8896 13959 result = FALSE;
1007acb3
L
13960 }
13961
19e6b90e 13962 return result;
5b18a4bc 13963}
103f02d3 13964
aef1f6d0
DJ
13965/* Set DUMP_SECTS for all sections where dumps were requested
13966 based on section name. */
13967
13968static void
dda8d76d 13969initialise_dumps_byname (Filedata * filedata)
aef1f6d0 13970{
2cf0635d 13971 struct dump_list_entry * cur;
aef1f6d0
DJ
13972
13973 for (cur = dump_sects_byname; cur; cur = cur->next)
13974 {
13975 unsigned int i;
32ec8896 13976 bfd_boolean any = FALSE;
aef1f6d0 13977
dda8d76d
NC
13978 for (i = 0; i < filedata->file_header.e_shnum; i++)
13979 if (streq (SECTION_NAME (filedata->section_headers + i), cur->name))
aef1f6d0 13980 {
dda8d76d 13981 request_dump_bynumber (filedata, i, cur->type);
32ec8896 13982 any = TRUE;
aef1f6d0
DJ
13983 }
13984
13985 if (!any)
13986 warn (_("Section '%s' was not dumped because it does not exist!\n"),
13987 cur->name);
13988 }
13989}
13990
32ec8896 13991static bfd_boolean
dda8d76d 13992process_section_contents (Filedata * filedata)
5b18a4bc 13993{
2cf0635d 13994 Elf_Internal_Shdr * section;
19e6b90e 13995 unsigned int i;
32ec8896 13996 bfd_boolean res = TRUE;
103f02d3 13997
19e6b90e 13998 if (! do_dump)
32ec8896 13999 return TRUE;
103f02d3 14000
dda8d76d 14001 initialise_dumps_byname (filedata);
aef1f6d0 14002
dda8d76d
NC
14003 for (i = 0, section = filedata->section_headers;
14004 i < filedata->file_header.e_shnum && i < filedata->num_dump_sects;
19e6b90e
L
14005 i++, section++)
14006 {
dda8d76d
NC
14007 dump_type dump = filedata->dump_sects[i];
14008
19e6b90e 14009#ifdef SUPPORT_DISASSEMBLY
dda8d76d
NC
14010 if (dump & DISASS_DUMP)
14011 {
14012 if (! disassemble_section (section, filedata))
14013 res = FALSE;
14014 }
19e6b90e 14015#endif
dda8d76d 14016 if (dump & HEX_DUMP)
32ec8896 14017 {
dda8d76d 14018 if (! dump_section_as_bytes (section, filedata, FALSE))
32ec8896
NC
14019 res = FALSE;
14020 }
103f02d3 14021
dda8d76d 14022 if (dump & RELOC_DUMP)
32ec8896 14023 {
dda8d76d 14024 if (! dump_section_as_bytes (section, filedata, TRUE))
32ec8896
NC
14025 res = FALSE;
14026 }
09c11c86 14027
dda8d76d 14028 if (dump & STRING_DUMP)
32ec8896 14029 {
dda8d76d 14030 if (! dump_section_as_strings (section, filedata))
32ec8896
NC
14031 res = FALSE;
14032 }
cf13d699 14033
dda8d76d 14034 if (dump & DEBUG_DUMP)
32ec8896 14035 {
dda8d76d 14036 if (! display_debug_section (i, section, filedata))
32ec8896
NC
14037 res = FALSE;
14038 }
5b18a4bc 14039 }
103f02d3 14040
19e6b90e
L
14041 /* Check to see if the user requested a
14042 dump of a section that does not exist. */
dda8d76d 14043 while (i < filedata->num_dump_sects)
0ee3043f 14044 {
dda8d76d 14045 if (filedata->dump_sects[i])
32ec8896
NC
14046 {
14047 warn (_("Section %d was not dumped because it does not exist!\n"), i);
14048 res = FALSE;
14049 }
0ee3043f
NC
14050 i++;
14051 }
32ec8896
NC
14052
14053 return res;
5b18a4bc 14054}
103f02d3 14055
5b18a4bc 14056static void
19e6b90e 14057process_mips_fpe_exception (int mask)
5b18a4bc 14058{
19e6b90e
L
14059 if (mask)
14060 {
32ec8896
NC
14061 bfd_boolean first = TRUE;
14062
19e6b90e 14063 if (mask & OEX_FPU_INEX)
32ec8896 14064 fputs ("INEX", stdout), first = FALSE;
19e6b90e 14065 if (mask & OEX_FPU_UFLO)
32ec8896 14066 printf ("%sUFLO", first ? "" : "|"), first = FALSE;
19e6b90e 14067 if (mask & OEX_FPU_OFLO)
32ec8896 14068 printf ("%sOFLO", first ? "" : "|"), first = FALSE;
19e6b90e 14069 if (mask & OEX_FPU_DIV0)
32ec8896 14070 printf ("%sDIV0", first ? "" : "|"), first = FALSE;
19e6b90e
L
14071 if (mask & OEX_FPU_INVAL)
14072 printf ("%sINVAL", first ? "" : "|");
14073 }
5b18a4bc 14074 else
19e6b90e 14075 fputs ("0", stdout);
5b18a4bc 14076}
103f02d3 14077
f6f0e17b
NC
14078/* Display's the value of TAG at location P. If TAG is
14079 greater than 0 it is assumed to be an unknown tag, and
14080 a message is printed to this effect. Otherwise it is
14081 assumed that a message has already been printed.
14082
14083 If the bottom bit of TAG is set it assumed to have a
14084 string value, otherwise it is assumed to have an integer
14085 value.
14086
14087 Returns an updated P pointing to the first unread byte
14088 beyond the end of TAG's value.
14089
14090 Reads at or beyond END will not be made. */
14091
14092static unsigned char *
60abdbed 14093display_tag_value (signed int tag,
f6f0e17b
NC
14094 unsigned char * p,
14095 const unsigned char * const end)
14096{
14097 unsigned long val;
14098
14099 if (tag > 0)
14100 printf (" Tag_unknown_%d: ", tag);
14101
14102 if (p >= end)
14103 {
4082ef84 14104 warn (_("<corrupt tag>\n"));
f6f0e17b
NC
14105 }
14106 else if (tag & 1)
14107 {
071436c6
NC
14108 /* PR 17531 file: 027-19978-0.004. */
14109 size_t maxlen = (end - p) - 1;
14110
14111 putchar ('"');
4082ef84
NC
14112 if (maxlen > 0)
14113 {
14114 print_symbol ((int) maxlen, (const char *) p);
14115 p += strnlen ((char *) p, maxlen) + 1;
14116 }
14117 else
14118 {
14119 printf (_("<corrupt string tag>"));
14120 p = (unsigned char *) end;
14121 }
071436c6 14122 printf ("\"\n");
f6f0e17b
NC
14123 }
14124 else
14125 {
14126 unsigned int len;
14127
14128 val = read_uleb128 (p, &len, end);
14129 p += len;
14130 printf ("%ld (0x%lx)\n", val, val);
14131 }
14132
4082ef84 14133 assert (p <= end);
f6f0e17b
NC
14134 return p;
14135}
14136
53a346d8
CZ
14137/* ARC ABI attributes section. */
14138
14139static unsigned char *
14140display_arc_attribute (unsigned char * p,
14141 const unsigned char * const end)
14142{
14143 unsigned int tag;
14144 unsigned int len;
14145 unsigned int val;
14146
14147 tag = read_uleb128 (p, &len, end);
14148 p += len;
14149
14150 switch (tag)
14151 {
14152 case Tag_ARC_PCS_config:
14153 val = read_uleb128 (p, &len, end);
14154 p += len;
14155 printf (" Tag_ARC_PCS_config: ");
14156 switch (val)
14157 {
14158 case 0:
14159 printf (_("Absent/Non standard\n"));
14160 break;
14161 case 1:
14162 printf (_("Bare metal/mwdt\n"));
14163 break;
14164 case 2:
14165 printf (_("Bare metal/newlib\n"));
14166 break;
14167 case 3:
14168 printf (_("Linux/uclibc\n"));
14169 break;
14170 case 4:
14171 printf (_("Linux/glibc\n"));
14172 break;
14173 default:
14174 printf (_("Unknown\n"));
14175 break;
14176 }
14177 break;
14178
14179 case Tag_ARC_CPU_base:
14180 val = read_uleb128 (p, &len, end);
14181 p += len;
14182 printf (" Tag_ARC_CPU_base: ");
14183 switch (val)
14184 {
14185 default:
14186 case TAG_CPU_NONE:
14187 printf (_("Absent\n"));
14188 break;
14189 case TAG_CPU_ARC6xx:
14190 printf ("ARC6xx\n");
14191 break;
14192 case TAG_CPU_ARC7xx:
14193 printf ("ARC7xx\n");
14194 break;
14195 case TAG_CPU_ARCEM:
14196 printf ("ARCEM\n");
14197 break;
14198 case TAG_CPU_ARCHS:
14199 printf ("ARCHS\n");
14200 break;
14201 }
14202 break;
14203
14204 case Tag_ARC_CPU_variation:
14205 val = read_uleb128 (p, &len, end);
14206 p += len;
14207 printf (" Tag_ARC_CPU_variation: ");
14208 switch (val)
14209 {
14210 default:
14211 if (val > 0 && val < 16)
53a346d8 14212 printf ("Core%d\n", val);
d8cbc93b
JL
14213 else
14214 printf ("Unknown\n");
14215 break;
14216
53a346d8
CZ
14217 case 0:
14218 printf (_("Absent\n"));
14219 break;
14220 }
14221 break;
14222
14223 case Tag_ARC_CPU_name:
14224 printf (" Tag_ARC_CPU_name: ");
14225 p = display_tag_value (-1, p, end);
14226 break;
14227
14228 case Tag_ARC_ABI_rf16:
14229 val = read_uleb128 (p, &len, end);
14230 p += len;
14231 printf (" Tag_ARC_ABI_rf16: %s\n", val ? _("yes") : _("no"));
14232 break;
14233
14234 case Tag_ARC_ABI_osver:
14235 val = read_uleb128 (p, &len, end);
14236 p += len;
14237 printf (" Tag_ARC_ABI_osver: v%d\n", val);
14238 break;
14239
14240 case Tag_ARC_ABI_pic:
14241 case Tag_ARC_ABI_sda:
14242 val = read_uleb128 (p, &len, end);
14243 p += len;
14244 printf (tag == Tag_ARC_ABI_sda ? " Tag_ARC_ABI_sda: "
14245 : " Tag_ARC_ABI_pic: ");
14246 switch (val)
14247 {
14248 case 0:
14249 printf (_("Absent\n"));
14250 break;
14251 case 1:
14252 printf ("MWDT\n");
14253 break;
14254 case 2:
14255 printf ("GNU\n");
14256 break;
14257 default:
14258 printf (_("Unknown\n"));
14259 break;
14260 }
14261 break;
14262
14263 case Tag_ARC_ABI_tls:
14264 val = read_uleb128 (p, &len, end);
14265 p += len;
14266 printf (" Tag_ARC_ABI_tls: %s\n", val ? "r25": "none");
14267 break;
14268
14269 case Tag_ARC_ABI_enumsize:
14270 val = read_uleb128 (p, &len, end);
14271 p += len;
14272 printf (" Tag_ARC_ABI_enumsize: %s\n", val ? _("default") :
14273 _("smallest"));
14274 break;
14275
14276 case Tag_ARC_ABI_exceptions:
14277 val = read_uleb128 (p, &len, end);
14278 p += len;
14279 printf (" Tag_ARC_ABI_exceptions: %s\n", val ? _("OPTFP")
14280 : _("default"));
14281 break;
14282
14283 case Tag_ARC_ABI_double_size:
14284 val = read_uleb128 (p, &len, end);
14285 p += len;
14286 printf (" Tag_ARC_ABI_double_size: %d\n", val);
14287 break;
14288
14289 case Tag_ARC_ISA_config:
14290 printf (" Tag_ARC_ISA_config: ");
14291 p = display_tag_value (-1, p, end);
14292 break;
14293
14294 case Tag_ARC_ISA_apex:
14295 printf (" Tag_ARC_ISA_apex: ");
14296 p = display_tag_value (-1, p, end);
14297 break;
14298
14299 case Tag_ARC_ISA_mpy_option:
14300 val = read_uleb128 (p, &len, end);
14301 p += len;
14302 printf (" Tag_ARC_ISA_mpy_option: %d\n", val);
14303 break;
14304
db1e1b45 14305 case Tag_ARC_ATR_version:
14306 val = read_uleb128 (p, &len, end);
14307 p += len;
14308 printf (" Tag_ARC_ATR_version: %d\n", val);
14309 break;
14310
53a346d8
CZ
14311 default:
14312 return display_tag_value (tag & 1, p, end);
14313 }
14314
14315 return p;
14316}
14317
11c1ff18
PB
14318/* ARM EABI attributes section. */
14319typedef struct
14320{
70e99720 14321 unsigned int tag;
2cf0635d 14322 const char * name;
11c1ff18 14323 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
70e99720 14324 unsigned int type;
2cf0635d 14325 const char ** table;
11c1ff18
PB
14326} arm_attr_public_tag;
14327
2cf0635d 14328static const char * arm_attr_tag_CPU_arch[] =
11c1ff18 14329 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
ced40572 14330 "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "v8-R", "v8-M.baseline",
ff8646ee 14331 "v8-M.mainline"};
2cf0635d
NC
14332static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
14333static const char * arm_attr_tag_THUMB_ISA_use[] =
4ed7ed8d 14334 {"No", "Thumb-1", "Thumb-2", "Yes"};
75375b3e 14335static const char * arm_attr_tag_FP_arch[] =
bca38921 14336 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
a715796b 14337 "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
2cf0635d 14338static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
dd24e3da 14339static const char * arm_attr_tag_Advanced_SIMD_arch[] =
9411fd44
MW
14340 {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
14341 "NEON for ARMv8.1"};
2cf0635d 14342static const char * arm_attr_tag_PCS_config[] =
11c1ff18
PB
14343 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
14344 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
2cf0635d 14345static const char * arm_attr_tag_ABI_PCS_R9_use[] =
11c1ff18 14346 {"V6", "SB", "TLS", "Unused"};
2cf0635d 14347static const char * arm_attr_tag_ABI_PCS_RW_data[] =
11c1ff18 14348 {"Absolute", "PC-relative", "SB-relative", "None"};
2cf0635d 14349static const char * arm_attr_tag_ABI_PCS_RO_data[] =
11c1ff18 14350 {"Absolute", "PC-relative", "None"};
2cf0635d 14351static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
11c1ff18 14352 {"None", "direct", "GOT-indirect"};
2cf0635d 14353static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
11c1ff18 14354 {"None", "??? 1", "2", "??? 3", "4"};
2cf0635d
NC
14355static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
14356static const char * arm_attr_tag_ABI_FP_denormal[] =
f5f53991 14357 {"Unused", "Needed", "Sign only"};
2cf0635d
NC
14358static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
14359static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
14360static const char * arm_attr_tag_ABI_FP_number_model[] =
11c1ff18 14361 {"Unused", "Finite", "RTABI", "IEEE 754"};
2cf0635d 14362static const char * arm_attr_tag_ABI_enum_size[] =
11c1ff18 14363 {"Unused", "small", "int", "forced to int"};
2cf0635d 14364static const char * arm_attr_tag_ABI_HardFP_use[] =
99654aaf 14365 {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
2cf0635d 14366static const char * arm_attr_tag_ABI_VFP_args[] =
5c294fee 14367 {"AAPCS", "VFP registers", "custom", "compatible"};
2cf0635d 14368static const char * arm_attr_tag_ABI_WMMX_args[] =
11c1ff18 14369 {"AAPCS", "WMMX registers", "custom"};
2cf0635d 14370static const char * arm_attr_tag_ABI_optimization_goals[] =
11c1ff18
PB
14371 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14372 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
2cf0635d 14373static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
11c1ff18
PB
14374 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14375 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
2cf0635d 14376static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
75375b3e 14377static const char * arm_attr_tag_FP_HP_extension[] =
8e79c3df 14378 {"Not Allowed", "Allowed"};
2cf0635d 14379static const char * arm_attr_tag_ABI_FP_16bit_format[] =
8e79c3df 14380 {"None", "IEEE 754", "Alternative Format"};
15afaa63
TP
14381static const char * arm_attr_tag_DSP_extension[] =
14382 {"Follow architecture", "Allowed"};
dd24e3da 14383static const char * arm_attr_tag_MPextension_use[] =
cd21e546
MGD
14384 {"Not Allowed", "Allowed"};
14385static const char * arm_attr_tag_DIV_use[] =
dd24e3da 14386 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
cd21e546 14387 "Allowed in v7-A with integer division extension"};
2cf0635d
NC
14388static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
14389static const char * arm_attr_tag_Virtualization_use[] =
dd24e3da 14390 {"Not Allowed", "TrustZone", "Virtualization Extensions",
cd21e546 14391 "TrustZone and Virtualization Extensions"};
dd24e3da 14392static const char * arm_attr_tag_MPextension_use_legacy[] =
f5f53991 14393 {"Not Allowed", "Allowed"};
11c1ff18
PB
14394
14395#define LOOKUP(id, name) \
14396 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
d70c5fc7 14397static arm_attr_public_tag arm_attr_public_tags[] =
11c1ff18
PB
14398{
14399 {4, "CPU_raw_name", 1, NULL},
14400 {5, "CPU_name", 1, NULL},
14401 LOOKUP(6, CPU_arch),
14402 {7, "CPU_arch_profile", 0, NULL},
14403 LOOKUP(8, ARM_ISA_use),
14404 LOOKUP(9, THUMB_ISA_use),
75375b3e 14405 LOOKUP(10, FP_arch),
11c1ff18 14406 LOOKUP(11, WMMX_arch),
f5f53991
AS
14407 LOOKUP(12, Advanced_SIMD_arch),
14408 LOOKUP(13, PCS_config),
11c1ff18
PB
14409 LOOKUP(14, ABI_PCS_R9_use),
14410 LOOKUP(15, ABI_PCS_RW_data),
f5f53991 14411 LOOKUP(16, ABI_PCS_RO_data),
11c1ff18
PB
14412 LOOKUP(17, ABI_PCS_GOT_use),
14413 LOOKUP(18, ABI_PCS_wchar_t),
14414 LOOKUP(19, ABI_FP_rounding),
14415 LOOKUP(20, ABI_FP_denormal),
14416 LOOKUP(21, ABI_FP_exceptions),
14417 LOOKUP(22, ABI_FP_user_exceptions),
14418 LOOKUP(23, ABI_FP_number_model),
75375b3e
MGD
14419 {24, "ABI_align_needed", 0, NULL},
14420 {25, "ABI_align_preserved", 0, NULL},
11c1ff18
PB
14421 LOOKUP(26, ABI_enum_size),
14422 LOOKUP(27, ABI_HardFP_use),
14423 LOOKUP(28, ABI_VFP_args),
14424 LOOKUP(29, ABI_WMMX_args),
14425 LOOKUP(30, ABI_optimization_goals),
14426 LOOKUP(31, ABI_FP_optimization_goals),
8e79c3df 14427 {32, "compatibility", 0, NULL},
f5f53991 14428 LOOKUP(34, CPU_unaligned_access),
75375b3e 14429 LOOKUP(36, FP_HP_extension),
8e79c3df 14430 LOOKUP(38, ABI_FP_16bit_format),
cd21e546
MGD
14431 LOOKUP(42, MPextension_use),
14432 LOOKUP(44, DIV_use),
15afaa63 14433 LOOKUP(46, DSP_extension),
f5f53991
AS
14434 {64, "nodefaults", 0, NULL},
14435 {65, "also_compatible_with", 0, NULL},
14436 LOOKUP(66, T2EE_use),
14437 {67, "conformance", 1, NULL},
14438 LOOKUP(68, Virtualization_use),
cd21e546 14439 LOOKUP(70, MPextension_use_legacy)
11c1ff18
PB
14440};
14441#undef LOOKUP
14442
11c1ff18 14443static unsigned char *
f6f0e17b
NC
14444display_arm_attribute (unsigned char * p,
14445 const unsigned char * const end)
11c1ff18 14446{
70e99720 14447 unsigned int tag;
11c1ff18 14448 unsigned int len;
70e99720 14449 unsigned int val;
2cf0635d 14450 arm_attr_public_tag * attr;
11c1ff18 14451 unsigned i;
70e99720 14452 unsigned int type;
11c1ff18 14453
f6f0e17b 14454 tag = read_uleb128 (p, &len, end);
11c1ff18
PB
14455 p += len;
14456 attr = NULL;
2cf0635d 14457 for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
11c1ff18
PB
14458 {
14459 if (arm_attr_public_tags[i].tag == tag)
14460 {
14461 attr = &arm_attr_public_tags[i];
14462 break;
14463 }
14464 }
14465
14466 if (attr)
14467 {
14468 printf (" Tag_%s: ", attr->name);
14469 switch (attr->type)
14470 {
14471 case 0:
14472 switch (tag)
14473 {
14474 case 7: /* Tag_CPU_arch_profile. */
f6f0e17b 14475 val = read_uleb128 (p, &len, end);
11c1ff18
PB
14476 p += len;
14477 switch (val)
14478 {
2b692964
NC
14479 case 0: printf (_("None\n")); break;
14480 case 'A': printf (_("Application\n")); break;
14481 case 'R': printf (_("Realtime\n")); break;
14482 case 'M': printf (_("Microcontroller\n")); break;
14483 case 'S': printf (_("Application or Realtime\n")); break;
11c1ff18
PB
14484 default: printf ("??? (%d)\n", val); break;
14485 }
14486 break;
14487
75375b3e 14488 case 24: /* Tag_align_needed. */
f6f0e17b 14489 val = read_uleb128 (p, &len, end);
75375b3e
MGD
14490 p += len;
14491 switch (val)
14492 {
2b692964
NC
14493 case 0: printf (_("None\n")); break;
14494 case 1: printf (_("8-byte\n")); break;
14495 case 2: printf (_("4-byte\n")); break;
75375b3e
MGD
14496 case 3: printf ("??? 3\n"); break;
14497 default:
14498 if (val <= 12)
dd24e3da 14499 printf (_("8-byte and up to %d-byte extended\n"),
75375b3e
MGD
14500 1 << val);
14501 else
14502 printf ("??? (%d)\n", val);
14503 break;
14504 }
14505 break;
14506
14507 case 25: /* Tag_align_preserved. */
f6f0e17b 14508 val = read_uleb128 (p, &len, end);
75375b3e
MGD
14509 p += len;
14510 switch (val)
14511 {
2b692964
NC
14512 case 0: printf (_("None\n")); break;
14513 case 1: printf (_("8-byte, except leaf SP\n")); break;
14514 case 2: printf (_("8-byte\n")); break;
75375b3e
MGD
14515 case 3: printf ("??? 3\n"); break;
14516 default:
14517 if (val <= 12)
dd24e3da 14518 printf (_("8-byte and up to %d-byte extended\n"),
75375b3e
MGD
14519 1 << val);
14520 else
14521 printf ("??? (%d)\n", val);
14522 break;
14523 }
14524 break;
14525
11c1ff18 14526 case 32: /* Tag_compatibility. */
071436c6 14527 {
071436c6
NC
14528 val = read_uleb128 (p, &len, end);
14529 p += len;
071436c6 14530 printf (_("flag = %d, vendor = "), val);
4082ef84
NC
14531 if (p < end - 1)
14532 {
14533 size_t maxlen = (end - p) - 1;
14534
14535 print_symbol ((int) maxlen, (const char *) p);
14536 p += strnlen ((char *) p, maxlen) + 1;
14537 }
14538 else
14539 {
14540 printf (_("<corrupt>"));
14541 p = (unsigned char *) end;
14542 }
071436c6 14543 putchar ('\n');
071436c6 14544 }
11c1ff18
PB
14545 break;
14546
f5f53991 14547 case 64: /* Tag_nodefaults. */
541a3cbd
NC
14548 /* PR 17531: file: 001-505008-0.01. */
14549 if (p < end)
14550 p++;
2b692964 14551 printf (_("True\n"));
f5f53991
AS
14552 break;
14553
14554 case 65: /* Tag_also_compatible_with. */
f6f0e17b 14555 val = read_uleb128 (p, &len, end);
f5f53991
AS
14556 p += len;
14557 if (val == 6 /* Tag_CPU_arch. */)
14558 {
f6f0e17b 14559 val = read_uleb128 (p, &len, end);
f5f53991 14560 p += len;
071436c6 14561 if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
f5f53991
AS
14562 printf ("??? (%d)\n", val);
14563 else
14564 printf ("%s\n", arm_attr_tag_CPU_arch[val]);
14565 }
14566 else
14567 printf ("???\n");
071436c6
NC
14568 while (p < end && *(p++) != '\0' /* NUL terminator. */)
14569 ;
f5f53991
AS
14570 break;
14571
11c1ff18 14572 default:
bee0ee85
NC
14573 printf (_("<unknown: %d>\n"), tag);
14574 break;
11c1ff18
PB
14575 }
14576 return p;
14577
14578 case 1:
f6f0e17b 14579 return display_tag_value (-1, p, end);
11c1ff18 14580 case 2:
f6f0e17b 14581 return display_tag_value (0, p, end);
11c1ff18
PB
14582
14583 default:
14584 assert (attr->type & 0x80);
f6f0e17b 14585 val = read_uleb128 (p, &len, end);
11c1ff18
PB
14586 p += len;
14587 type = attr->type & 0x7f;
14588 if (val >= type)
14589 printf ("??? (%d)\n", val);
14590 else
14591 printf ("%s\n", attr->table[val]);
14592 return p;
14593 }
14594 }
11c1ff18 14595
f6f0e17b 14596 return display_tag_value (tag, p, end);
11c1ff18
PB
14597}
14598
104d59d1 14599static unsigned char *
60bca95a 14600display_gnu_attribute (unsigned char * p,
60abdbed 14601 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const),
f6f0e17b 14602 const unsigned char * const end)
104d59d1
JM
14603{
14604 int tag;
14605 unsigned int len;
60abdbed 14606 unsigned int val;
104d59d1 14607
f6f0e17b 14608 tag = read_uleb128 (p, &len, end);
104d59d1
JM
14609 p += len;
14610
14611 /* Tag_compatibility is the only generic GNU attribute defined at
14612 present. */
14613 if (tag == 32)
14614 {
f6f0e17b 14615 val = read_uleb128 (p, &len, end);
104d59d1 14616 p += len;
071436c6
NC
14617
14618 printf (_("flag = %d, vendor = "), val);
f6f0e17b
NC
14619 if (p == end)
14620 {
071436c6 14621 printf (_("<corrupt>\n"));
f6f0e17b
NC
14622 warn (_("corrupt vendor attribute\n"));
14623 }
14624 else
14625 {
4082ef84
NC
14626 if (p < end - 1)
14627 {
14628 size_t maxlen = (end - p) - 1;
071436c6 14629
4082ef84
NC
14630 print_symbol ((int) maxlen, (const char *) p);
14631 p += strnlen ((char *) p, maxlen) + 1;
14632 }
14633 else
14634 {
14635 printf (_("<corrupt>"));
14636 p = (unsigned char *) end;
14637 }
071436c6 14638 putchar ('\n');
f6f0e17b 14639 }
104d59d1
JM
14640 return p;
14641 }
14642
14643 if ((tag & 2) == 0 && display_proc_gnu_attribute)
f6f0e17b 14644 return display_proc_gnu_attribute (p, tag, end);
104d59d1 14645
f6f0e17b 14646 return display_tag_value (tag, p, end);
104d59d1
JM
14647}
14648
34c8bcba 14649static unsigned char *
f6f0e17b 14650display_power_gnu_attribute (unsigned char * p,
60abdbed 14651 unsigned int tag,
f6f0e17b 14652 const unsigned char * const end)
34c8bcba 14653{
34c8bcba 14654 unsigned int len;
005d79fd 14655 unsigned int val;
34c8bcba
JM
14656
14657 if (tag == Tag_GNU_Power_ABI_FP)
14658 {
f6f0e17b 14659 val = read_uleb128 (p, &len, end);
34c8bcba
JM
14660 p += len;
14661 printf (" Tag_GNU_Power_ABI_FP: ");
005d79fd
AM
14662 if (len == 0)
14663 {
14664 printf (_("<corrupt>\n"));
14665 return p;
14666 }
60bca95a 14667
005d79fd
AM
14668 if (val > 15)
14669 printf ("(%#x), ", val);
14670
14671 switch (val & 3)
34c8bcba
JM
14672 {
14673 case 0:
005d79fd 14674 printf (_("unspecified hard/soft float, "));
34c8bcba
JM
14675 break;
14676 case 1:
005d79fd 14677 printf (_("hard float, "));
34c8bcba
JM
14678 break;
14679 case 2:
005d79fd 14680 printf (_("soft float, "));
34c8bcba 14681 break;
3c7b9897 14682 case 3:
005d79fd 14683 printf (_("single-precision hard float, "));
3c7b9897 14684 break;
005d79fd
AM
14685 }
14686
14687 switch (val & 0xC)
14688 {
14689 case 0:
14690 printf (_("unspecified long double\n"));
14691 break;
14692 case 4:
14693 printf (_("128-bit IBM long double\n"));
14694 break;
14695 case 8:
14696 printf (_("64-bit long double\n"));
14697 break;
14698 case 12:
14699 printf (_("128-bit IEEE long double\n"));
34c8bcba
JM
14700 break;
14701 }
14702 return p;
005d79fd 14703 }
34c8bcba 14704
c6e65352
DJ
14705 if (tag == Tag_GNU_Power_ABI_Vector)
14706 {
f6f0e17b 14707 val = read_uleb128 (p, &len, end);
c6e65352
DJ
14708 p += len;
14709 printf (" Tag_GNU_Power_ABI_Vector: ");
005d79fd
AM
14710 if (len == 0)
14711 {
14712 printf (_("<corrupt>\n"));
14713 return p;
14714 }
14715
14716 if (val > 3)
14717 printf ("(%#x), ", val);
14718
14719 switch (val & 3)
c6e65352
DJ
14720 {
14721 case 0:
005d79fd 14722 printf (_("unspecified\n"));
c6e65352
DJ
14723 break;
14724 case 1:
005d79fd 14725 printf (_("generic\n"));
c6e65352
DJ
14726 break;
14727 case 2:
14728 printf ("AltiVec\n");
14729 break;
14730 case 3:
14731 printf ("SPE\n");
14732 break;
c6e65352
DJ
14733 }
14734 return p;
005d79fd 14735 }
c6e65352 14736
f82e0623
NF
14737 if (tag == Tag_GNU_Power_ABI_Struct_Return)
14738 {
005d79fd
AM
14739 val = read_uleb128 (p, &len, end);
14740 p += len;
14741 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
14742 if (len == 0)
f6f0e17b 14743 {
005d79fd 14744 printf (_("<corrupt>\n"));
f6f0e17b
NC
14745 return p;
14746 }
0b4362b0 14747
005d79fd
AM
14748 if (val > 2)
14749 printf ("(%#x), ", val);
14750
14751 switch (val & 3)
14752 {
14753 case 0:
14754 printf (_("unspecified\n"));
14755 break;
14756 case 1:
14757 printf ("r3/r4\n");
14758 break;
14759 case 2:
14760 printf (_("memory\n"));
14761 break;
14762 case 3:
14763 printf ("???\n");
14764 break;
14765 }
f82e0623
NF
14766 return p;
14767 }
14768
f6f0e17b 14769 return display_tag_value (tag & 1, p, end);
34c8bcba
JM
14770}
14771
643f7afb
AK
14772static unsigned char *
14773display_s390_gnu_attribute (unsigned char * p,
60abdbed 14774 unsigned int tag,
643f7afb
AK
14775 const unsigned char * const end)
14776{
14777 unsigned int len;
14778 int val;
14779
14780 if (tag == Tag_GNU_S390_ABI_Vector)
14781 {
14782 val = read_uleb128 (p, &len, end);
14783 p += len;
14784 printf (" Tag_GNU_S390_ABI_Vector: ");
14785
14786 switch (val)
14787 {
14788 case 0:
14789 printf (_("any\n"));
14790 break;
14791 case 1:
14792 printf (_("software\n"));
14793 break;
14794 case 2:
14795 printf (_("hardware\n"));
14796 break;
14797 default:
14798 printf ("??? (%d)\n", val);
14799 break;
14800 }
14801 return p;
14802 }
14803
14804 return display_tag_value (tag & 1, p, end);
14805}
14806
9e8c70f9 14807static void
60abdbed 14808display_sparc_hwcaps (unsigned int mask)
9e8c70f9
DM
14809{
14810 if (mask)
14811 {
32ec8896 14812 bfd_boolean first = TRUE;
071436c6 14813
9e8c70f9 14814 if (mask & ELF_SPARC_HWCAP_MUL32)
32ec8896 14815 fputs ("mul32", stdout), first = FALSE;
9e8c70f9 14816 if (mask & ELF_SPARC_HWCAP_DIV32)
32ec8896 14817 printf ("%sdiv32", first ? "" : "|"), first = FALSE;
9e8c70f9 14818 if (mask & ELF_SPARC_HWCAP_FSMULD)
32ec8896 14819 printf ("%sfsmuld", first ? "" : "|"), first = FALSE;
9e8c70f9 14820 if (mask & ELF_SPARC_HWCAP_V8PLUS)
32ec8896 14821 printf ("%sv8plus", first ? "" : "|"), first = FALSE;
9e8c70f9 14822 if (mask & ELF_SPARC_HWCAP_POPC)
32ec8896 14823 printf ("%spopc", first ? "" : "|"), first = FALSE;
9e8c70f9 14824 if (mask & ELF_SPARC_HWCAP_VIS)
32ec8896 14825 printf ("%svis", first ? "" : "|"), first = FALSE;
9e8c70f9 14826 if (mask & ELF_SPARC_HWCAP_VIS2)
32ec8896 14827 printf ("%svis2", first ? "" : "|"), first = FALSE;
9e8c70f9 14828 if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
32ec8896 14829 printf ("%sASIBlkInit", first ? "" : "|"), first = FALSE;
9e8c70f9 14830 if (mask & ELF_SPARC_HWCAP_FMAF)
32ec8896 14831 printf ("%sfmaf", first ? "" : "|"), first = FALSE;
9e8c70f9 14832 if (mask & ELF_SPARC_HWCAP_VIS3)
32ec8896 14833 printf ("%svis3", first ? "" : "|"), first = FALSE;
9e8c70f9 14834 if (mask & ELF_SPARC_HWCAP_HPC)
32ec8896 14835 printf ("%shpc", first ? "" : "|"), first = FALSE;
9e8c70f9 14836 if (mask & ELF_SPARC_HWCAP_RANDOM)
32ec8896 14837 printf ("%srandom", first ? "" : "|"), first = FALSE;
9e8c70f9 14838 if (mask & ELF_SPARC_HWCAP_TRANS)
32ec8896 14839 printf ("%strans", first ? "" : "|"), first = FALSE;
9e8c70f9 14840 if (mask & ELF_SPARC_HWCAP_FJFMAU)
32ec8896 14841 printf ("%sfjfmau", first ? "" : "|"), first = FALSE;
9e8c70f9 14842 if (mask & ELF_SPARC_HWCAP_IMA)
32ec8896 14843 printf ("%sima", first ? "" : "|"), first = FALSE;
9e8c70f9 14844 if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
32ec8896 14845 printf ("%scspare", first ? "" : "|"), first = FALSE;
9e8c70f9
DM
14846 }
14847 else
071436c6
NC
14848 fputc ('0', stdout);
14849 fputc ('\n', stdout);
9e8c70f9
DM
14850}
14851
3d68f91c 14852static void
60abdbed 14853display_sparc_hwcaps2 (unsigned int mask)
3d68f91c
JM
14854{
14855 if (mask)
14856 {
32ec8896 14857 bfd_boolean first = TRUE;
071436c6 14858
3d68f91c 14859 if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
32ec8896 14860 fputs ("fjathplus", stdout), first = FALSE;
3d68f91c 14861 if (mask & ELF_SPARC_HWCAP2_VIS3B)
32ec8896 14862 printf ("%svis3b", first ? "" : "|"), first = FALSE;
3d68f91c 14863 if (mask & ELF_SPARC_HWCAP2_ADP)
32ec8896 14864 printf ("%sadp", first ? "" : "|"), first = FALSE;
3d68f91c 14865 if (mask & ELF_SPARC_HWCAP2_SPARC5)
32ec8896 14866 printf ("%ssparc5", first ? "" : "|"), first = FALSE;
3d68f91c 14867 if (mask & ELF_SPARC_HWCAP2_MWAIT)
32ec8896 14868 printf ("%smwait", first ? "" : "|"), first = FALSE;
3d68f91c 14869 if (mask & ELF_SPARC_HWCAP2_XMPMUL)
32ec8896 14870 printf ("%sxmpmul", first ? "" : "|"), first = FALSE;
3d68f91c 14871 if (mask & ELF_SPARC_HWCAP2_XMONT)
32ec8896 14872 printf ("%sxmont2", first ? "" : "|"), first = FALSE;
3d68f91c 14873 if (mask & ELF_SPARC_HWCAP2_NSEC)
32ec8896 14874 printf ("%snsec", first ? "" : "|"), first = FALSE;
3d68f91c 14875 if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
32ec8896 14876 printf ("%sfjathhpc", first ? "" : "|"), first = FALSE;
3d68f91c 14877 if (mask & ELF_SPARC_HWCAP2_FJDES)
32ec8896 14878 printf ("%sfjdes", first ? "" : "|"), first = FALSE;
3d68f91c 14879 if (mask & ELF_SPARC_HWCAP2_FJAES)
32ec8896 14880 printf ("%sfjaes", first ? "" : "|"), first = FALSE;
3d68f91c
JM
14881 }
14882 else
071436c6
NC
14883 fputc ('0', stdout);
14884 fputc ('\n', stdout);
3d68f91c
JM
14885}
14886
9e8c70f9 14887static unsigned char *
f6f0e17b 14888display_sparc_gnu_attribute (unsigned char * p,
60abdbed 14889 unsigned int tag,
f6f0e17b 14890 const unsigned char * const end)
9e8c70f9 14891{
3d68f91c
JM
14892 unsigned int len;
14893 int val;
14894
9e8c70f9
DM
14895 if (tag == Tag_GNU_Sparc_HWCAPS)
14896 {
f6f0e17b 14897 val = read_uleb128 (p, &len, end);
9e8c70f9
DM
14898 p += len;
14899 printf (" Tag_GNU_Sparc_HWCAPS: ");
9e8c70f9
DM
14900 display_sparc_hwcaps (val);
14901 return p;
3d68f91c
JM
14902 }
14903 if (tag == Tag_GNU_Sparc_HWCAPS2)
14904 {
14905 val = read_uleb128 (p, &len, end);
14906 p += len;
14907 printf (" Tag_GNU_Sparc_HWCAPS2: ");
14908 display_sparc_hwcaps2 (val);
14909 return p;
14910 }
9e8c70f9 14911
f6f0e17b 14912 return display_tag_value (tag, p, end);
9e8c70f9
DM
14913}
14914
351cdf24 14915static void
32ec8896 14916print_mips_fp_abi_value (unsigned int val)
351cdf24
MF
14917{
14918 switch (val)
14919 {
14920 case Val_GNU_MIPS_ABI_FP_ANY:
14921 printf (_("Hard or soft float\n"));
14922 break;
14923 case Val_GNU_MIPS_ABI_FP_DOUBLE:
14924 printf (_("Hard float (double precision)\n"));
14925 break;
14926 case Val_GNU_MIPS_ABI_FP_SINGLE:
14927 printf (_("Hard float (single precision)\n"));
14928 break;
14929 case Val_GNU_MIPS_ABI_FP_SOFT:
14930 printf (_("Soft float\n"));
14931 break;
14932 case Val_GNU_MIPS_ABI_FP_OLD_64:
14933 printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
14934 break;
14935 case Val_GNU_MIPS_ABI_FP_XX:
14936 printf (_("Hard float (32-bit CPU, Any FPU)\n"));
14937 break;
14938 case Val_GNU_MIPS_ABI_FP_64:
14939 printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
14940 break;
14941 case Val_GNU_MIPS_ABI_FP_64A:
14942 printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
14943 break;
3350cc01
CM
14944 case Val_GNU_MIPS_ABI_FP_NAN2008:
14945 printf (_("NaN 2008 compatibility\n"));
14946 break;
351cdf24
MF
14947 default:
14948 printf ("??? (%d)\n", val);
14949 break;
14950 }
14951}
14952
2cf19d5c 14953static unsigned char *
f6f0e17b 14954display_mips_gnu_attribute (unsigned char * p,
60abdbed 14955 unsigned int tag,
f6f0e17b 14956 const unsigned char * const end)
2cf19d5c 14957{
2cf19d5c
JM
14958 if (tag == Tag_GNU_MIPS_ABI_FP)
14959 {
f6f0e17b 14960 unsigned int len;
32ec8896 14961 unsigned int val;
f6f0e17b
NC
14962
14963 val = read_uleb128 (p, &len, end);
2cf19d5c
JM
14964 p += len;
14965 printf (" Tag_GNU_MIPS_ABI_FP: ");
60bca95a 14966
351cdf24
MF
14967 print_mips_fp_abi_value (val);
14968
2cf19d5c
JM
14969 return p;
14970 }
14971
a9f58168
CF
14972 if (tag == Tag_GNU_MIPS_ABI_MSA)
14973 {
14974 unsigned int len;
32ec8896 14975 unsigned int val;
a9f58168
CF
14976
14977 val = read_uleb128 (p, &len, end);
14978 p += len;
14979 printf (" Tag_GNU_MIPS_ABI_MSA: ");
14980
14981 switch (val)
14982 {
14983 case Val_GNU_MIPS_ABI_MSA_ANY:
14984 printf (_("Any MSA or not\n"));
14985 break;
14986 case Val_GNU_MIPS_ABI_MSA_128:
14987 printf (_("128-bit MSA\n"));
14988 break;
14989 default:
14990 printf ("??? (%d)\n", val);
14991 break;
14992 }
14993 return p;
14994 }
14995
f6f0e17b 14996 return display_tag_value (tag & 1, p, end);
2cf19d5c
JM
14997}
14998
59e6276b 14999static unsigned char *
f6f0e17b
NC
15000display_tic6x_attribute (unsigned char * p,
15001 const unsigned char * const end)
59e6276b 15002{
60abdbed 15003 unsigned int tag;
59e6276b
JM
15004 unsigned int len;
15005 int val;
15006
f6f0e17b 15007 tag = read_uleb128 (p, &len, end);
59e6276b
JM
15008 p += len;
15009
15010 switch (tag)
15011 {
75fa6dc1 15012 case Tag_ISA:
f6f0e17b 15013 val = read_uleb128 (p, &len, end);
59e6276b 15014 p += len;
75fa6dc1 15015 printf (" Tag_ISA: ");
59e6276b
JM
15016
15017 switch (val)
15018 {
75fa6dc1 15019 case C6XABI_Tag_ISA_none:
59e6276b
JM
15020 printf (_("None\n"));
15021 break;
75fa6dc1 15022 case C6XABI_Tag_ISA_C62X:
59e6276b
JM
15023 printf ("C62x\n");
15024 break;
75fa6dc1 15025 case C6XABI_Tag_ISA_C67X:
59e6276b
JM
15026 printf ("C67x\n");
15027 break;
75fa6dc1 15028 case C6XABI_Tag_ISA_C67XP:
59e6276b
JM
15029 printf ("C67x+\n");
15030 break;
75fa6dc1 15031 case C6XABI_Tag_ISA_C64X:
59e6276b
JM
15032 printf ("C64x\n");
15033 break;
75fa6dc1 15034 case C6XABI_Tag_ISA_C64XP:
59e6276b
JM
15035 printf ("C64x+\n");
15036 break;
75fa6dc1 15037 case C6XABI_Tag_ISA_C674X:
59e6276b
JM
15038 printf ("C674x\n");
15039 break;
15040 default:
15041 printf ("??? (%d)\n", val);
15042 break;
15043 }
15044 return p;
15045
87779176 15046 case Tag_ABI_wchar_t:
f6f0e17b 15047 val = read_uleb128 (p, &len, end);
87779176
JM
15048 p += len;
15049 printf (" Tag_ABI_wchar_t: ");
15050 switch (val)
15051 {
15052 case 0:
15053 printf (_("Not used\n"));
15054 break;
15055 case 1:
15056 printf (_("2 bytes\n"));
15057 break;
15058 case 2:
15059 printf (_("4 bytes\n"));
15060 break;
15061 default:
15062 printf ("??? (%d)\n", val);
15063 break;
15064 }
15065 return p;
15066
15067 case Tag_ABI_stack_align_needed:
f6f0e17b 15068 val = read_uleb128 (p, &len, end);
87779176
JM
15069 p += len;
15070 printf (" Tag_ABI_stack_align_needed: ");
15071 switch (val)
15072 {
15073 case 0:
15074 printf (_("8-byte\n"));
15075 break;
15076 case 1:
15077 printf (_("16-byte\n"));
15078 break;
15079 default:
15080 printf ("??? (%d)\n", val);
15081 break;
15082 }
15083 return p;
15084
15085 case Tag_ABI_stack_align_preserved:
f6f0e17b 15086 val = read_uleb128 (p, &len, end);
87779176
JM
15087 p += len;
15088 printf (" Tag_ABI_stack_align_preserved: ");
15089 switch (val)
15090 {
15091 case 0:
15092 printf (_("8-byte\n"));
15093 break;
15094 case 1:
15095 printf (_("16-byte\n"));
15096 break;
15097 default:
15098 printf ("??? (%d)\n", val);
15099 break;
15100 }
15101 return p;
15102
b5593623 15103 case Tag_ABI_DSBT:
f6f0e17b 15104 val = read_uleb128 (p, &len, end);
b5593623
JM
15105 p += len;
15106 printf (" Tag_ABI_DSBT: ");
15107 switch (val)
15108 {
15109 case 0:
15110 printf (_("DSBT addressing not used\n"));
15111 break;
15112 case 1:
15113 printf (_("DSBT addressing used\n"));
15114 break;
15115 default:
15116 printf ("??? (%d)\n", val);
15117 break;
15118 }
15119 return p;
15120
87779176 15121 case Tag_ABI_PID:
f6f0e17b 15122 val = read_uleb128 (p, &len, end);
87779176
JM
15123 p += len;
15124 printf (" Tag_ABI_PID: ");
15125 switch (val)
15126 {
15127 case 0:
15128 printf (_("Data addressing position-dependent\n"));
15129 break;
15130 case 1:
15131 printf (_("Data addressing position-independent, GOT near DP\n"));
15132 break;
15133 case 2:
15134 printf (_("Data addressing position-independent, GOT far from DP\n"));
15135 break;
15136 default:
15137 printf ("??? (%d)\n", val);
15138 break;
15139 }
15140 return p;
15141
15142 case Tag_ABI_PIC:
f6f0e17b 15143 val = read_uleb128 (p, &len, end);
87779176
JM
15144 p += len;
15145 printf (" Tag_ABI_PIC: ");
15146 switch (val)
15147 {
15148 case 0:
15149 printf (_("Code addressing position-dependent\n"));
15150 break;
15151 case 1:
15152 printf (_("Code addressing position-independent\n"));
15153 break;
15154 default:
15155 printf ("??? (%d)\n", val);
15156 break;
15157 }
15158 return p;
15159
15160 case Tag_ABI_array_object_alignment:
f6f0e17b 15161 val = read_uleb128 (p, &len, end);
87779176
JM
15162 p += len;
15163 printf (" Tag_ABI_array_object_alignment: ");
15164 switch (val)
15165 {
15166 case 0:
15167 printf (_("8-byte\n"));
15168 break;
15169 case 1:
15170 printf (_("4-byte\n"));
15171 break;
15172 case 2:
15173 printf (_("16-byte\n"));
15174 break;
15175 default:
15176 printf ("??? (%d)\n", val);
15177 break;
15178 }
15179 return p;
15180
15181 case Tag_ABI_array_object_align_expected:
f6f0e17b 15182 val = read_uleb128 (p, &len, end);
87779176
JM
15183 p += len;
15184 printf (" Tag_ABI_array_object_align_expected: ");
15185 switch (val)
15186 {
15187 case 0:
15188 printf (_("8-byte\n"));
15189 break;
15190 case 1:
15191 printf (_("4-byte\n"));
15192 break;
15193 case 2:
15194 printf (_("16-byte\n"));
15195 break;
15196 default:
15197 printf ("??? (%d)\n", val);
15198 break;
15199 }
15200 return p;
15201
3cbd1c06 15202 case Tag_ABI_compatibility:
071436c6 15203 {
071436c6
NC
15204 val = read_uleb128 (p, &len, end);
15205 p += len;
15206 printf (" Tag_ABI_compatibility: ");
071436c6 15207 printf (_("flag = %d, vendor = "), val);
4082ef84
NC
15208 if (p < end - 1)
15209 {
15210 size_t maxlen = (end - p) - 1;
15211
15212 print_symbol ((int) maxlen, (const char *) p);
15213 p += strnlen ((char *) p, maxlen) + 1;
15214 }
15215 else
15216 {
15217 printf (_("<corrupt>"));
15218 p = (unsigned char *) end;
15219 }
071436c6 15220 putchar ('\n');
071436c6
NC
15221 return p;
15222 }
87779176
JM
15223
15224 case Tag_ABI_conformance:
071436c6 15225 {
4082ef84
NC
15226 printf (" Tag_ABI_conformance: \"");
15227 if (p < end - 1)
15228 {
15229 size_t maxlen = (end - p) - 1;
071436c6 15230
4082ef84
NC
15231 print_symbol ((int) maxlen, (const char *) p);
15232 p += strnlen ((char *) p, maxlen) + 1;
15233 }
15234 else
15235 {
15236 printf (_("<corrupt>"));
15237 p = (unsigned char *) end;
15238 }
071436c6 15239 printf ("\"\n");
071436c6
NC
15240 return p;
15241 }
59e6276b
JM
15242 }
15243
f6f0e17b
NC
15244 return display_tag_value (tag, p, end);
15245}
59e6276b 15246
f6f0e17b 15247static void
60abdbed 15248display_raw_attribute (unsigned char * p, unsigned char const * const end)
f6f0e17b
NC
15249{
15250 unsigned long addr = 0;
15251 size_t bytes = end - p;
15252
feceaa59 15253 assert (end >= p);
f6f0e17b 15254 while (bytes)
87779176 15255 {
f6f0e17b
NC
15256 int j;
15257 int k;
15258 int lbytes = (bytes > 16 ? 16 : bytes);
15259
15260 printf (" 0x%8.8lx ", addr);
15261
15262 for (j = 0; j < 16; j++)
15263 {
15264 if (j < lbytes)
15265 printf ("%2.2x", p[j]);
15266 else
15267 printf (" ");
15268
15269 if ((j & 3) == 3)
15270 printf (" ");
15271 }
15272
15273 for (j = 0; j < lbytes; j++)
15274 {
15275 k = p[j];
15276 if (k >= ' ' && k < 0x7f)
15277 printf ("%c", k);
15278 else
15279 printf (".");
15280 }
15281
15282 putchar ('\n');
15283
15284 p += lbytes;
15285 bytes -= lbytes;
15286 addr += lbytes;
87779176 15287 }
59e6276b 15288
f6f0e17b 15289 putchar ('\n');
59e6276b
JM
15290}
15291
13761a11
NC
15292static unsigned char *
15293display_msp430x_attribute (unsigned char * p,
15294 const unsigned char * const end)
15295{
15296 unsigned int len;
60abdbed
NC
15297 unsigned int val;
15298 unsigned int tag;
13761a11
NC
15299
15300 tag = read_uleb128 (p, & len, end);
15301 p += len;
0b4362b0 15302
13761a11
NC
15303 switch (tag)
15304 {
15305 case OFBA_MSPABI_Tag_ISA:
15306 val = read_uleb128 (p, &len, end);
15307 p += len;
15308 printf (" Tag_ISA: ");
15309 switch (val)
15310 {
15311 case 0: printf (_("None\n")); break;
15312 case 1: printf (_("MSP430\n")); break;
15313 case 2: printf (_("MSP430X\n")); break;
15314 default: printf ("??? (%d)\n", val); break;
15315 }
15316 break;
15317
15318 case OFBA_MSPABI_Tag_Code_Model:
15319 val = read_uleb128 (p, &len, end);
15320 p += len;
15321 printf (" Tag_Code_Model: ");
15322 switch (val)
15323 {
15324 case 0: printf (_("None\n")); break;
15325 case 1: printf (_("Small\n")); break;
15326 case 2: printf (_("Large\n")); break;
15327 default: printf ("??? (%d)\n", val); break;
15328 }
15329 break;
15330
15331 case OFBA_MSPABI_Tag_Data_Model:
15332 val = read_uleb128 (p, &len, end);
15333 p += len;
15334 printf (" Tag_Data_Model: ");
15335 switch (val)
15336 {
15337 case 0: printf (_("None\n")); break;
15338 case 1: printf (_("Small\n")); break;
15339 case 2: printf (_("Large\n")); break;
15340 case 3: printf (_("Restricted Large\n")); break;
15341 default: printf ("??? (%d)\n", val); break;
15342 }
15343 break;
15344
15345 default:
15346 printf (_(" <unknown tag %d>: "), tag);
15347
15348 if (tag & 1)
15349 {
071436c6 15350 putchar ('"');
4082ef84
NC
15351 if (p < end - 1)
15352 {
15353 size_t maxlen = (end - p) - 1;
15354
15355 print_symbol ((int) maxlen, (const char *) p);
15356 p += strnlen ((char *) p, maxlen) + 1;
15357 }
15358 else
15359 {
15360 printf (_("<corrupt>"));
15361 p = (unsigned char *) end;
15362 }
071436c6 15363 printf ("\"\n");
13761a11
NC
15364 }
15365 else
15366 {
15367 val = read_uleb128 (p, &len, end);
15368 p += len;
15369 printf ("%d (0x%x)\n", val, val);
15370 }
15371 break;
15372 }
15373
4082ef84 15374 assert (p <= end);
13761a11
NC
15375 return p;
15376}
15377
2dc8dd17
JW
15378struct riscv_attr_tag_t {
15379 const char *name;
15380 int tag;
15381};
15382
15383static struct riscv_attr_tag_t riscv_attr_tag[] =
15384{
15385#define T(tag) {"Tag_RISCV_" #tag, Tag_RISCV_##tag}
15386 T(arch),
15387 T(priv_spec),
15388 T(priv_spec_minor),
15389 T(priv_spec_revision),
15390 T(unaligned_access),
15391 T(stack_align),
15392#undef T
15393};
15394
15395static unsigned char *
15396display_riscv_attribute (unsigned char *p,
15397 const unsigned char * const end)
15398{
15399 unsigned int len;
15400 int val;
15401 int tag;
15402 struct riscv_attr_tag_t *attr = NULL;
15403 unsigned i;
15404
15405 tag = read_uleb128 (p, &len, end);
15406 p += len;
15407
15408 /* Find the name of attribute. */
15409 for (i = 0; i < ARRAY_SIZE (riscv_attr_tag); i++)
15410 {
15411 if (riscv_attr_tag[i].tag == tag)
15412 {
15413 attr = &riscv_attr_tag[i];
15414 break;
15415 }
15416 }
15417
15418 if (attr)
15419 printf (" %s: ", attr->name);
15420 else
15421 return display_tag_value (tag, p, end);
15422
15423 switch (tag)
15424 {
15425 case Tag_RISCV_priv_spec:
15426 case Tag_RISCV_priv_spec_minor:
15427 case Tag_RISCV_priv_spec_revision:
15428 val = read_uleb128 (p, &len, end);
15429 p += len;
15430 printf (_("%d\n"), val);
15431 break;
15432 case Tag_RISCV_unaligned_access:
15433 val = read_uleb128 (p, &len, end);
15434 p += len;
15435 switch (val)
15436 {
15437 case 0:
15438 printf (_("No unaligned access\n"));
15439 break;
15440 case 1:
15441 printf (_("Unaligned access\n"));
15442 break;
15443 }
15444 break;
15445 case Tag_RISCV_stack_align:
15446 val = read_uleb128 (p, &len, end);
15447 p += len;
15448 printf (_("%d-bytes\n"), val);
15449 break;
15450 case Tag_RISCV_arch:
15451 p = display_tag_value (-1, p, end);
15452 break;
15453 default:
15454 return display_tag_value (tag, p, end);
15455 }
15456
15457 return p;
15458}
15459
32ec8896 15460static bfd_boolean
dda8d76d 15461process_attributes (Filedata * filedata,
60bca95a 15462 const char * public_name,
104d59d1 15463 unsigned int proc_type,
f6f0e17b 15464 unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
60abdbed 15465 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const))
11c1ff18 15466{
2cf0635d 15467 Elf_Internal_Shdr * sect;
11c1ff18 15468 unsigned i;
32ec8896 15469 bfd_boolean res = TRUE;
11c1ff18
PB
15470
15471 /* Find the section header so that we get the size. */
dda8d76d
NC
15472 for (i = 0, sect = filedata->section_headers;
15473 i < filedata->file_header.e_shnum;
11c1ff18
PB
15474 i++, sect++)
15475 {
071436c6
NC
15476 unsigned char * contents;
15477 unsigned char * p;
15478
104d59d1 15479 if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
11c1ff18
PB
15480 continue;
15481
dda8d76d 15482 contents = (unsigned char *) get_data (NULL, filedata, sect->sh_offset, 1,
3f5e193b 15483 sect->sh_size, _("attributes"));
60bca95a 15484 if (contents == NULL)
32ec8896
NC
15485 {
15486 res = FALSE;
15487 continue;
15488 }
60bca95a 15489
11c1ff18 15490 p = contents;
60abdbed
NC
15491 /* The first character is the version of the attributes.
15492 Currently only version 1, (aka 'A') is recognised here. */
15493 if (*p != 'A')
32ec8896
NC
15494 {
15495 printf (_("Unknown attributes version '%c'(%d) - expecting 'A'\n"), *p, *p);
15496 res = FALSE;
15497 }
60abdbed 15498 else
11c1ff18 15499 {
071436c6
NC
15500 bfd_vma section_len;
15501
15502 section_len = sect->sh_size - 1;
11c1ff18 15503 p++;
60bca95a 15504
071436c6 15505 while (section_len > 0)
11c1ff18 15506 {
071436c6 15507 bfd_vma attr_len;
e9847026 15508 unsigned int namelen;
11c1ff18 15509 bfd_boolean public_section;
104d59d1 15510 bfd_boolean gnu_section;
11c1ff18 15511
071436c6 15512 if (section_len <= 4)
e0a31db1
NC
15513 {
15514 error (_("Tag section ends prematurely\n"));
32ec8896 15515 res = FALSE;
e0a31db1
NC
15516 break;
15517 }
071436c6 15518 attr_len = byte_get (p, 4);
11c1ff18 15519 p += 4;
60bca95a 15520
071436c6 15521 if (attr_len > section_len)
11c1ff18 15522 {
071436c6
NC
15523 error (_("Bad attribute length (%u > %u)\n"),
15524 (unsigned) attr_len, (unsigned) section_len);
15525 attr_len = section_len;
32ec8896 15526 res = FALSE;
11c1ff18 15527 }
74e1a04b 15528 /* PR 17531: file: 001-101425-0.004 */
071436c6 15529 else if (attr_len < 5)
74e1a04b 15530 {
071436c6 15531 error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
32ec8896 15532 res = FALSE;
74e1a04b
NC
15533 break;
15534 }
e9847026 15535
071436c6
NC
15536 section_len -= attr_len;
15537 attr_len -= 4;
15538
15539 namelen = strnlen ((char *) p, attr_len) + 1;
15540 if (namelen == 0 || namelen >= attr_len)
e9847026
NC
15541 {
15542 error (_("Corrupt attribute section name\n"));
32ec8896 15543 res = FALSE;
e9847026
NC
15544 break;
15545 }
15546
071436c6
NC
15547 printf (_("Attribute Section: "));
15548 print_symbol (INT_MAX, (const char *) p);
15549 putchar ('\n');
60bca95a
NC
15550
15551 if (public_name && streq ((char *) p, public_name))
11c1ff18
PB
15552 public_section = TRUE;
15553 else
15554 public_section = FALSE;
60bca95a
NC
15555
15556 if (streq ((char *) p, "gnu"))
104d59d1
JM
15557 gnu_section = TRUE;
15558 else
15559 gnu_section = FALSE;
60bca95a 15560
11c1ff18 15561 p += namelen;
071436c6 15562 attr_len -= namelen;
e0a31db1 15563
071436c6 15564 while (attr_len > 0 && p < contents + sect->sh_size)
11c1ff18 15565 {
e0a31db1 15566 int tag;
11c1ff18
PB
15567 int val;
15568 bfd_vma size;
071436c6 15569 unsigned char * end;
60bca95a 15570
e0a31db1 15571 /* PR binutils/17531: Safe handling of corrupt files. */
071436c6 15572 if (attr_len < 6)
e0a31db1
NC
15573 {
15574 error (_("Unused bytes at end of section\n"));
32ec8896 15575 res = FALSE;
e0a31db1
NC
15576 section_len = 0;
15577 break;
15578 }
15579
15580 tag = *(p++);
11c1ff18 15581 size = byte_get (p, 4);
071436c6 15582 if (size > attr_len)
11c1ff18 15583 {
e9847026 15584 error (_("Bad subsection length (%u > %u)\n"),
071436c6 15585 (unsigned) size, (unsigned) attr_len);
32ec8896 15586 res = FALSE;
071436c6 15587 size = attr_len;
11c1ff18 15588 }
e0a31db1
NC
15589 /* PR binutils/17531: Safe handling of corrupt files. */
15590 if (size < 6)
15591 {
15592 error (_("Bad subsection length (%u < 6)\n"),
15593 (unsigned) size);
32ec8896 15594 res = FALSE;
e0a31db1
NC
15595 section_len = 0;
15596 break;
15597 }
60bca95a 15598
071436c6 15599 attr_len -= size;
11c1ff18 15600 end = p + size - 1;
071436c6 15601 assert (end <= contents + sect->sh_size);
11c1ff18 15602 p += 4;
60bca95a 15603
11c1ff18
PB
15604 switch (tag)
15605 {
15606 case 1:
2b692964 15607 printf (_("File Attributes\n"));
11c1ff18
PB
15608 break;
15609 case 2:
2b692964 15610 printf (_("Section Attributes:"));
11c1ff18
PB
15611 goto do_numlist;
15612 case 3:
2b692964 15613 printf (_("Symbol Attributes:"));
1a0670f3 15614 /* Fall through. */
11c1ff18
PB
15615 do_numlist:
15616 for (;;)
15617 {
91d6fa6a 15618 unsigned int j;
60bca95a 15619
f6f0e17b 15620 val = read_uleb128 (p, &j, end);
91d6fa6a 15621 p += j;
11c1ff18
PB
15622 if (val == 0)
15623 break;
15624 printf (" %d", val);
15625 }
15626 printf ("\n");
15627 break;
15628 default:
2b692964 15629 printf (_("Unknown tag: %d\n"), tag);
11c1ff18
PB
15630 public_section = FALSE;
15631 break;
15632 }
60bca95a 15633
071436c6 15634 if (public_section && display_pub_attribute != NULL)
11c1ff18
PB
15635 {
15636 while (p < end)
f6f0e17b 15637 p = display_pub_attribute (p, end);
60abdbed 15638 assert (p == end);
104d59d1 15639 }
071436c6 15640 else if (gnu_section && display_proc_gnu_attribute != NULL)
104d59d1
JM
15641 {
15642 while (p < end)
15643 p = display_gnu_attribute (p,
f6f0e17b
NC
15644 display_proc_gnu_attribute,
15645 end);
60abdbed 15646 assert (p == end);
11c1ff18 15647 }
071436c6 15648 else if (p < end)
11c1ff18 15649 {
071436c6 15650 printf (_(" Unknown attribute:\n"));
f6f0e17b 15651 display_raw_attribute (p, end);
11c1ff18
PB
15652 p = end;
15653 }
071436c6
NC
15654 else
15655 attr_len = 0;
11c1ff18
PB
15656 }
15657 }
15658 }
d70c5fc7 15659
60bca95a 15660 free (contents);
11c1ff18 15661 }
32ec8896
NC
15662
15663 return res;
11c1ff18
PB
15664}
15665
ccb4c951
RS
15666/* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
15667 Print the Address, Access and Initial fields of an entry at VMA ADDR
82b1b41b
NC
15668 and return the VMA of the next entry, or -1 if there was a problem.
15669 Does not read from DATA_END or beyond. */
ccb4c951
RS
15670
15671static bfd_vma
82b1b41b
NC
15672print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
15673 unsigned char * data_end)
ccb4c951
RS
15674{
15675 printf (" ");
15676 print_vma (addr, LONG_HEX);
15677 printf (" ");
15678 if (addr < pltgot + 0xfff0)
15679 printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
15680 else
15681 printf ("%10s", "");
15682 printf (" ");
15683 if (data == NULL)
2b692964 15684 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
ccb4c951
RS
15685 else
15686 {
15687 bfd_vma entry;
82b1b41b 15688 unsigned char * from = data + addr - pltgot;
ccb4c951 15689
82b1b41b
NC
15690 if (from + (is_32bit_elf ? 4 : 8) > data_end)
15691 {
15692 warn (_("MIPS GOT entry extends beyond the end of available data\n"));
15693 printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
15694 return (bfd_vma) -1;
15695 }
15696 else
15697 {
15698 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
15699 print_vma (entry, LONG_HEX);
15700 }
ccb4c951
RS
15701 }
15702 return addr + (is_32bit_elf ? 4 : 8);
15703}
15704
861fb55a
DJ
15705/* DATA points to the contents of a MIPS PLT GOT that starts at VMA
15706 PLTGOT. Print the Address and Initial fields of an entry at VMA
15707 ADDR and return the VMA of the next entry. */
15708
15709static bfd_vma
2cf0635d 15710print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
861fb55a
DJ
15711{
15712 printf (" ");
15713 print_vma (addr, LONG_HEX);
15714 printf (" ");
15715 if (data == NULL)
2b692964 15716 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
861fb55a
DJ
15717 else
15718 {
15719 bfd_vma entry;
15720
15721 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
15722 print_vma (entry, LONG_HEX);
15723 }
15724 return addr + (is_32bit_elf ? 4 : 8);
15725}
15726
351cdf24
MF
15727static void
15728print_mips_ases (unsigned int mask)
15729{
15730 if (mask & AFL_ASE_DSP)
15731 fputs ("\n\tDSP ASE", stdout);
15732 if (mask & AFL_ASE_DSPR2)
15733 fputs ("\n\tDSP R2 ASE", stdout);
8f4f9071
MF
15734 if (mask & AFL_ASE_DSPR3)
15735 fputs ("\n\tDSP R3 ASE", stdout);
351cdf24
MF
15736 if (mask & AFL_ASE_EVA)
15737 fputs ("\n\tEnhanced VA Scheme", stdout);
15738 if (mask & AFL_ASE_MCU)
15739 fputs ("\n\tMCU (MicroController) ASE", stdout);
15740 if (mask & AFL_ASE_MDMX)
15741 fputs ("\n\tMDMX ASE", stdout);
15742 if (mask & AFL_ASE_MIPS3D)
15743 fputs ("\n\tMIPS-3D ASE", stdout);
15744 if (mask & AFL_ASE_MT)
15745 fputs ("\n\tMT ASE", stdout);
15746 if (mask & AFL_ASE_SMARTMIPS)
15747 fputs ("\n\tSmartMIPS ASE", stdout);
15748 if (mask & AFL_ASE_VIRT)
15749 fputs ("\n\tVZ ASE", stdout);
15750 if (mask & AFL_ASE_MSA)
15751 fputs ("\n\tMSA ASE", stdout);
15752 if (mask & AFL_ASE_MIPS16)
15753 fputs ("\n\tMIPS16 ASE", stdout);
15754 if (mask & AFL_ASE_MICROMIPS)
15755 fputs ("\n\tMICROMIPS ASE", stdout);
15756 if (mask & AFL_ASE_XPA)
15757 fputs ("\n\tXPA ASE", stdout);
25499ac7
MR
15758 if (mask & AFL_ASE_MIPS16E2)
15759 fputs ("\n\tMIPS16e2 ASE", stdout);
730c3174
SE
15760 if (mask & AFL_ASE_CRC)
15761 fputs ("\n\tCRC ASE", stdout);
6f20c942
FS
15762 if (mask & AFL_ASE_GINV)
15763 fputs ("\n\tGINV ASE", stdout);
8095d2f7
CX
15764 if (mask & AFL_ASE_LOONGSON_MMI)
15765 fputs ("\n\tLoongson MMI ASE", stdout);
716c08de
CX
15766 if (mask & AFL_ASE_LOONGSON_CAM)
15767 fputs ("\n\tLoongson CAM ASE", stdout);
bdc6c06e
CX
15768 if (mask & AFL_ASE_LOONGSON_EXT)
15769 fputs ("\n\tLoongson EXT ASE", stdout);
a693765e
CX
15770 if (mask & AFL_ASE_LOONGSON_EXT2)
15771 fputs ("\n\tLoongson EXT2 ASE", stdout);
351cdf24
MF
15772 if (mask == 0)
15773 fprintf (stdout, "\n\t%s", _("None"));
00ac7aa0
MF
15774 else if ((mask & ~AFL_ASE_MASK) != 0)
15775 fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
351cdf24
MF
15776}
15777
15778static void
15779print_mips_isa_ext (unsigned int isa_ext)
15780{
15781 switch (isa_ext)
15782 {
15783 case 0:
15784 fputs (_("None"), stdout);
15785 break;
15786 case AFL_EXT_XLR:
15787 fputs ("RMI XLR", stdout);
15788 break;
2c629856
N
15789 case AFL_EXT_OCTEON3:
15790 fputs ("Cavium Networks Octeon3", stdout);
15791 break;
351cdf24
MF
15792 case AFL_EXT_OCTEON2:
15793 fputs ("Cavium Networks Octeon2", stdout);
15794 break;
15795 case AFL_EXT_OCTEONP:
15796 fputs ("Cavium Networks OcteonP", stdout);
15797 break;
351cdf24
MF
15798 case AFL_EXT_OCTEON:
15799 fputs ("Cavium Networks Octeon", stdout);
15800 break;
15801 case AFL_EXT_5900:
15802 fputs ("Toshiba R5900", stdout);
15803 break;
15804 case AFL_EXT_4650:
15805 fputs ("MIPS R4650", stdout);
15806 break;
15807 case AFL_EXT_4010:
15808 fputs ("LSI R4010", stdout);
15809 break;
15810 case AFL_EXT_4100:
15811 fputs ("NEC VR4100", stdout);
15812 break;
15813 case AFL_EXT_3900:
15814 fputs ("Toshiba R3900", stdout);
15815 break;
15816 case AFL_EXT_10000:
15817 fputs ("MIPS R10000", stdout);
15818 break;
15819 case AFL_EXT_SB1:
15820 fputs ("Broadcom SB-1", stdout);
15821 break;
15822 case AFL_EXT_4111:
15823 fputs ("NEC VR4111/VR4181", stdout);
15824 break;
15825 case AFL_EXT_4120:
15826 fputs ("NEC VR4120", stdout);
15827 break;
15828 case AFL_EXT_5400:
15829 fputs ("NEC VR5400", stdout);
15830 break;
15831 case AFL_EXT_5500:
15832 fputs ("NEC VR5500", stdout);
15833 break;
15834 case AFL_EXT_LOONGSON_2E:
15835 fputs ("ST Microelectronics Loongson 2E", stdout);
15836 break;
15837 case AFL_EXT_LOONGSON_2F:
15838 fputs ("ST Microelectronics Loongson 2F", stdout);
15839 break;
38bf472a
MR
15840 case AFL_EXT_INTERAPTIV_MR2:
15841 fputs ("Imagination interAptiv MR2", stdout);
15842 break;
351cdf24 15843 default:
00ac7aa0 15844 fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
351cdf24
MF
15845 }
15846}
15847
32ec8896 15848static signed int
351cdf24
MF
15849get_mips_reg_size (int reg_size)
15850{
15851 return (reg_size == AFL_REG_NONE) ? 0
15852 : (reg_size == AFL_REG_32) ? 32
15853 : (reg_size == AFL_REG_64) ? 64
15854 : (reg_size == AFL_REG_128) ? 128
15855 : -1;
15856}
15857
32ec8896 15858static bfd_boolean
dda8d76d 15859process_mips_specific (Filedata * filedata)
5b18a4bc 15860{
2cf0635d 15861 Elf_Internal_Dyn * entry;
351cdf24 15862 Elf_Internal_Shdr *sect = NULL;
19e6b90e
L
15863 size_t liblist_offset = 0;
15864 size_t liblistno = 0;
15865 size_t conflictsno = 0;
15866 size_t options_offset = 0;
15867 size_t conflicts_offset = 0;
861fb55a
DJ
15868 size_t pltrelsz = 0;
15869 size_t pltrel = 0;
ccb4c951 15870 bfd_vma pltgot = 0;
861fb55a
DJ
15871 bfd_vma mips_pltgot = 0;
15872 bfd_vma jmprel = 0;
ccb4c951
RS
15873 bfd_vma local_gotno = 0;
15874 bfd_vma gotsym = 0;
15875 bfd_vma symtabno = 0;
32ec8896 15876 bfd_boolean res = TRUE;
103f02d3 15877
dda8d76d 15878 if (! process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
32ec8896
NC
15879 display_mips_gnu_attribute))
15880 res = FALSE;
2cf19d5c 15881
dda8d76d 15882 sect = find_section (filedata, ".MIPS.abiflags");
351cdf24
MF
15883
15884 if (sect != NULL)
15885 {
15886 Elf_External_ABIFlags_v0 *abiflags_ext;
15887 Elf_Internal_ABIFlags_v0 abiflags_in;
15888
15889 if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
32ec8896
NC
15890 {
15891 error (_("Corrupt MIPS ABI Flags section.\n"));
15892 res = FALSE;
15893 }
351cdf24
MF
15894 else
15895 {
dda8d76d 15896 abiflags_ext = get_data (NULL, filedata, sect->sh_offset, 1,
351cdf24
MF
15897 sect->sh_size, _("MIPS ABI Flags section"));
15898 if (abiflags_ext)
15899 {
15900 abiflags_in.version = BYTE_GET (abiflags_ext->version);
15901 abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
15902 abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
15903 abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
15904 abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
15905 abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
15906 abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
15907 abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
15908 abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
15909 abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
15910 abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
15911
15912 printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
15913 printf ("\nISA: MIPS%d", abiflags_in.isa_level);
15914 if (abiflags_in.isa_rev > 1)
15915 printf ("r%d", abiflags_in.isa_rev);
15916 printf ("\nGPR size: %d",
15917 get_mips_reg_size (abiflags_in.gpr_size));
15918 printf ("\nCPR1 size: %d",
15919 get_mips_reg_size (abiflags_in.cpr1_size));
15920 printf ("\nCPR2 size: %d",
15921 get_mips_reg_size (abiflags_in.cpr2_size));
15922 fputs ("\nFP ABI: ", stdout);
15923 print_mips_fp_abi_value (abiflags_in.fp_abi);
15924 fputs ("ISA Extension: ", stdout);
15925 print_mips_isa_ext (abiflags_in.isa_ext);
15926 fputs ("\nASEs:", stdout);
15927 print_mips_ases (abiflags_in.ases);
15928 printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
15929 printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
15930 fputc ('\n', stdout);
15931 free (abiflags_ext);
15932 }
15933 }
15934 }
15935
19e6b90e
L
15936 /* We have a lot of special sections. Thanks SGI! */
15937 if (dynamic_section == NULL)
bbdd9a68
MR
15938 {
15939 /* No dynamic information available. See if there is static GOT. */
dda8d76d 15940 sect = find_section (filedata, ".got");
bbdd9a68
MR
15941 if (sect != NULL)
15942 {
15943 unsigned char *data_end;
15944 unsigned char *data;
15945 bfd_vma ent, end;
15946 int addr_size;
15947
15948 pltgot = sect->sh_addr;
15949
15950 ent = pltgot;
15951 addr_size = (is_32bit_elf ? 4 : 8);
15952 end = pltgot + sect->sh_size;
15953
dda8d76d 15954 data = (unsigned char *) get_data (NULL, filedata, sect->sh_offset,
bbdd9a68
MR
15955 end - pltgot, 1,
15956 _("Global Offset Table data"));
15957 /* PR 12855: Null data is handled gracefully throughout. */
15958 data_end = data + (end - pltgot);
15959
15960 printf (_("\nStatic GOT:\n"));
15961 printf (_(" Canonical gp value: "));
15962 print_vma (ent + 0x7ff0, LONG_HEX);
15963 printf ("\n\n");
15964
15965 /* In a dynamic binary GOT[0] is reserved for the dynamic
15966 loader to store the lazy resolver pointer, however in
15967 a static binary it may well have been omitted and GOT
15968 reduced to a table of addresses.
15969 PR 21344: Check for the entry being fully available
15970 before fetching it. */
15971 if (data
15972 && data + ent - pltgot + addr_size <= data_end
15973 && byte_get (data + ent - pltgot, addr_size) == 0)
15974 {
15975 printf (_(" Reserved entries:\n"));
15976 printf (_(" %*s %10s %*s\n"),
15977 addr_size * 2, _("Address"), _("Access"),
15978 addr_size * 2, _("Value"));
15979 ent = print_mips_got_entry (data, pltgot, ent, data_end);
15980 printf ("\n");
15981 if (ent == (bfd_vma) -1)
15982 goto sgot_print_fail;
15983
15984 /* Check for the MSB of GOT[1] being set, identifying a
15985 GNU object. This entry will be used by some runtime
15986 loaders, to store the module pointer. Otherwise this
15987 is an ordinary local entry.
15988 PR 21344: Check for the entry being fully available
15989 before fetching it. */
15990 if (data
15991 && data + ent - pltgot + addr_size <= data_end
15992 && (byte_get (data + ent - pltgot, addr_size)
15993 >> (addr_size * 8 - 1)) != 0)
15994 {
15995 ent = print_mips_got_entry (data, pltgot, ent, data_end);
15996 printf ("\n");
15997 if (ent == (bfd_vma) -1)
15998 goto sgot_print_fail;
15999 }
16000 printf ("\n");
16001 }
16002
f17e9d8a 16003 if (data != NULL && ent < end)
bbdd9a68
MR
16004 {
16005 printf (_(" Local entries:\n"));
16006 printf (" %*s %10s %*s\n",
16007 addr_size * 2, _("Address"), _("Access"),
16008 addr_size * 2, _("Value"));
16009 while (ent < end)
16010 {
16011 ent = print_mips_got_entry (data, pltgot, ent, data_end);
16012 printf ("\n");
16013 if (ent == (bfd_vma) -1)
16014 goto sgot_print_fail;
16015 }
16016 printf ("\n");
16017 }
16018
16019 sgot_print_fail:
16020 if (data)
16021 free (data);
16022 }
16023 return res;
16024 }
252b5132 16025
071436c6
NC
16026 for (entry = dynamic_section;
16027 /* PR 17531 file: 012-50589-0.004. */
16028 entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
16029 ++entry)
252b5132
RH
16030 switch (entry->d_tag)
16031 {
16032 case DT_MIPS_LIBLIST:
d93f0186 16033 liblist_offset
dda8d76d 16034 = offset_from_vma (filedata, entry->d_un.d_val,
d93f0186 16035 liblistno * sizeof (Elf32_External_Lib));
252b5132
RH
16036 break;
16037 case DT_MIPS_LIBLISTNO:
16038 liblistno = entry->d_un.d_val;
16039 break;
16040 case DT_MIPS_OPTIONS:
dda8d76d 16041 options_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
252b5132
RH
16042 break;
16043 case DT_MIPS_CONFLICT:
d93f0186 16044 conflicts_offset
dda8d76d 16045 = offset_from_vma (filedata, entry->d_un.d_val,
d93f0186 16046 conflictsno * sizeof (Elf32_External_Conflict));
252b5132
RH
16047 break;
16048 case DT_MIPS_CONFLICTNO:
16049 conflictsno = entry->d_un.d_val;
16050 break;
ccb4c951 16051 case DT_PLTGOT:
861fb55a
DJ
16052 pltgot = entry->d_un.d_ptr;
16053 break;
ccb4c951
RS
16054 case DT_MIPS_LOCAL_GOTNO:
16055 local_gotno = entry->d_un.d_val;
16056 break;
16057 case DT_MIPS_GOTSYM:
16058 gotsym = entry->d_un.d_val;
16059 break;
16060 case DT_MIPS_SYMTABNO:
16061 symtabno = entry->d_un.d_val;
16062 break;
861fb55a
DJ
16063 case DT_MIPS_PLTGOT:
16064 mips_pltgot = entry->d_un.d_ptr;
16065 break;
16066 case DT_PLTREL:
16067 pltrel = entry->d_un.d_val;
16068 break;
16069 case DT_PLTRELSZ:
16070 pltrelsz = entry->d_un.d_val;
16071 break;
16072 case DT_JMPREL:
16073 jmprel = entry->d_un.d_ptr;
16074 break;
252b5132
RH
16075 default:
16076 break;
16077 }
16078
16079 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
16080 {
2cf0635d 16081 Elf32_External_Lib * elib;
252b5132
RH
16082 size_t cnt;
16083
dda8d76d 16084 elib = (Elf32_External_Lib *) get_data (NULL, filedata, liblist_offset,
3f5e193b
NC
16085 liblistno,
16086 sizeof (Elf32_External_Lib),
9cf03b7e 16087 _("liblist section data"));
a6e9f9df 16088 if (elib)
252b5132 16089 {
d3a49aa8
AM
16090 printf (ngettext ("\nSection '.liblist' contains %lu entry:\n",
16091 "\nSection '.liblist' contains %lu entries:\n",
16092 (unsigned long) liblistno),
a6e9f9df 16093 (unsigned long) liblistno);
2b692964 16094 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
a6e9f9df
AM
16095 stdout);
16096
16097 for (cnt = 0; cnt < liblistno; ++cnt)
252b5132 16098 {
a6e9f9df 16099 Elf32_Lib liblist;
91d6fa6a 16100 time_t atime;
d5b07ef4 16101 char timebuf[128];
2cf0635d 16102 struct tm * tmp;
a6e9f9df
AM
16103
16104 liblist.l_name = BYTE_GET (elib[cnt].l_name);
91d6fa6a 16105 atime = BYTE_GET (elib[cnt].l_time_stamp);
a6e9f9df
AM
16106 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
16107 liblist.l_version = BYTE_GET (elib[cnt].l_version);
16108 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
16109
91d6fa6a 16110 tmp = gmtime (&atime);
e9e44622
JJ
16111 snprintf (timebuf, sizeof (timebuf),
16112 "%04u-%02u-%02uT%02u:%02u:%02u",
16113 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
16114 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
a6e9f9df 16115
31104126 16116 printf ("%3lu: ", (unsigned long) cnt);
d79b3d50
NC
16117 if (VALID_DYNAMIC_NAME (liblist.l_name))
16118 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
16119 else
2b692964 16120 printf (_("<corrupt: %9ld>"), liblist.l_name);
31104126
NC
16121 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
16122 liblist.l_version);
a6e9f9df
AM
16123
16124 if (liblist.l_flags == 0)
2b692964 16125 puts (_(" NONE"));
a6e9f9df
AM
16126 else
16127 {
16128 static const struct
252b5132 16129 {
2cf0635d 16130 const char * name;
a6e9f9df 16131 int bit;
252b5132 16132 }
a6e9f9df
AM
16133 l_flags_vals[] =
16134 {
16135 { " EXACT_MATCH", LL_EXACT_MATCH },
16136 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
16137 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
16138 { " EXPORTS", LL_EXPORTS },
16139 { " DELAY_LOAD", LL_DELAY_LOAD },
16140 { " DELTA", LL_DELTA }
16141 };
16142 int flags = liblist.l_flags;
16143 size_t fcnt;
16144
60bca95a 16145 for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
a6e9f9df
AM
16146 if ((flags & l_flags_vals[fcnt].bit) != 0)
16147 {
16148 fputs (l_flags_vals[fcnt].name, stdout);
16149 flags ^= l_flags_vals[fcnt].bit;
16150 }
16151 if (flags != 0)
16152 printf (" %#x", (unsigned int) flags);
252b5132 16153
a6e9f9df
AM
16154 puts ("");
16155 }
252b5132 16156 }
252b5132 16157
a6e9f9df
AM
16158 free (elib);
16159 }
32ec8896
NC
16160 else
16161 res = FALSE;
252b5132
RH
16162 }
16163
16164 if (options_offset != 0)
16165 {
2cf0635d 16166 Elf_External_Options * eopt;
2cf0635d
NC
16167 Elf_Internal_Options * iopt;
16168 Elf_Internal_Options * option;
252b5132
RH
16169 size_t offset;
16170 int cnt;
dda8d76d 16171 sect = filedata->section_headers;
252b5132
RH
16172
16173 /* Find the section header so that we get the size. */
dda8d76d 16174 sect = find_section_by_type (filedata, SHT_MIPS_OPTIONS);
948f632f 16175 /* PR 17533 file: 012-277276-0.004. */
071436c6
NC
16176 if (sect == NULL)
16177 {
16178 error (_("No MIPS_OPTIONS header found\n"));
32ec8896 16179 return FALSE;
071436c6 16180 }
252b5132 16181
dda8d76d 16182 eopt = (Elf_External_Options *) get_data (NULL, filedata, options_offset, 1,
3f5e193b 16183 sect->sh_size, _("options"));
a6e9f9df 16184 if (eopt)
252b5132 16185 {
3f5e193b
NC
16186 iopt = (Elf_Internal_Options *)
16187 cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
a6e9f9df
AM
16188 if (iopt == NULL)
16189 {
fb324ee9 16190 error (_("Out of memory allocating space for MIPS options\n"));
32ec8896 16191 return FALSE;
a6e9f9df 16192 }
76da6bbe 16193
a6e9f9df
AM
16194 offset = cnt = 0;
16195 option = iopt;
252b5132 16196
82b1b41b 16197 while (offset <= sect->sh_size - sizeof (* eopt))
a6e9f9df 16198 {
2cf0635d 16199 Elf_External_Options * eoption;
252b5132 16200
a6e9f9df 16201 eoption = (Elf_External_Options *) ((char *) eopt + offset);
252b5132 16202
a6e9f9df
AM
16203 option->kind = BYTE_GET (eoption->kind);
16204 option->size = BYTE_GET (eoption->size);
16205 option->section = BYTE_GET (eoption->section);
16206 option->info = BYTE_GET (eoption->info);
76da6bbe 16207
82b1b41b
NC
16208 /* PR 17531: file: ffa0fa3b. */
16209 if (option->size < sizeof (* eopt)
16210 || offset + option->size > sect->sh_size)
16211 {
55325047 16212 error (_("Invalid size (%u) for MIPS option\n"), option->size);
32ec8896 16213 return FALSE;
82b1b41b 16214 }
a6e9f9df 16215 offset += option->size;
14ae95f2 16216
a6e9f9df
AM
16217 ++option;
16218 ++cnt;
16219 }
252b5132 16220
d3a49aa8
AM
16221 printf (ngettext ("\nSection '%s' contains %d entry:\n",
16222 "\nSection '%s' contains %d entries:\n",
16223 cnt),
dda8d76d 16224 printable_section_name (filedata, sect), cnt);
76da6bbe 16225
a6e9f9df 16226 option = iopt;
82b1b41b 16227 offset = 0;
252b5132 16228
a6e9f9df 16229 while (cnt-- > 0)
252b5132 16230 {
a6e9f9df
AM
16231 size_t len;
16232
16233 switch (option->kind)
252b5132 16234 {
a6e9f9df
AM
16235 case ODK_NULL:
16236 /* This shouldn't happen. */
16237 printf (" NULL %d %lx", option->section, option->info);
16238 break;
16239 case ODK_REGINFO:
16240 printf (" REGINFO ");
dda8d76d 16241 if (filedata->file_header.e_machine == EM_MIPS)
a6e9f9df
AM
16242 {
16243 /* 32bit form. */
2cf0635d 16244 Elf32_External_RegInfo * ereg;
b34976b6 16245 Elf32_RegInfo reginfo;
a6e9f9df
AM
16246
16247 ereg = (Elf32_External_RegInfo *) (option + 1);
16248 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
16249 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
16250 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
16251 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
16252 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
16253 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
16254
16255 printf ("GPR %08lx GP 0x%lx\n",
16256 reginfo.ri_gprmask,
16257 (unsigned long) reginfo.ri_gp_value);
16258 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
16259 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
16260 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
16261 }
16262 else
16263 {
16264 /* 64 bit form. */
2cf0635d 16265 Elf64_External_RegInfo * ereg;
a6e9f9df
AM
16266 Elf64_Internal_RegInfo reginfo;
16267
16268 ereg = (Elf64_External_RegInfo *) (option + 1);
16269 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
16270 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
16271 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
16272 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
16273 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
66543521 16274 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
a6e9f9df
AM
16275
16276 printf ("GPR %08lx GP 0x",
16277 reginfo.ri_gprmask);
16278 printf_vma (reginfo.ri_gp_value);
16279 printf ("\n");
16280
16281 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
16282 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
16283 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
16284 }
16285 ++option;
16286 continue;
16287 case ODK_EXCEPTIONS:
16288 fputs (" EXCEPTIONS fpe_min(", stdout);
16289 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
16290 fputs (") fpe_max(", stdout);
16291 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
16292 fputs (")", stdout);
16293
16294 if (option->info & OEX_PAGE0)
16295 fputs (" PAGE0", stdout);
16296 if (option->info & OEX_SMM)
16297 fputs (" SMM", stdout);
16298 if (option->info & OEX_FPDBUG)
16299 fputs (" FPDBUG", stdout);
16300 if (option->info & OEX_DISMISS)
16301 fputs (" DISMISS", stdout);
16302 break;
16303 case ODK_PAD:
16304 fputs (" PAD ", stdout);
16305 if (option->info & OPAD_PREFIX)
16306 fputs (" PREFIX", stdout);
16307 if (option->info & OPAD_POSTFIX)
16308 fputs (" POSTFIX", stdout);
16309 if (option->info & OPAD_SYMBOL)
16310 fputs (" SYMBOL", stdout);
16311 break;
16312 case ODK_HWPATCH:
16313 fputs (" HWPATCH ", stdout);
16314 if (option->info & OHW_R4KEOP)
16315 fputs (" R4KEOP", stdout);
16316 if (option->info & OHW_R8KPFETCH)
16317 fputs (" R8KPFETCH", stdout);
16318 if (option->info & OHW_R5KEOP)
16319 fputs (" R5KEOP", stdout);
16320 if (option->info & OHW_R5KCVTL)
16321 fputs (" R5KCVTL", stdout);
16322 break;
16323 case ODK_FILL:
16324 fputs (" FILL ", stdout);
16325 /* XXX Print content of info word? */
16326 break;
16327 case ODK_TAGS:
16328 fputs (" TAGS ", stdout);
16329 /* XXX Print content of info word? */
16330 break;
16331 case ODK_HWAND:
16332 fputs (" HWAND ", stdout);
16333 if (option->info & OHWA0_R4KEOP_CHECKED)
16334 fputs (" R4KEOP_CHECKED", stdout);
16335 if (option->info & OHWA0_R4KEOP_CLEAN)
16336 fputs (" R4KEOP_CLEAN", stdout);
16337 break;
16338 case ODK_HWOR:
16339 fputs (" HWOR ", stdout);
16340 if (option->info & OHWA0_R4KEOP_CHECKED)
16341 fputs (" R4KEOP_CHECKED", stdout);
16342 if (option->info & OHWA0_R4KEOP_CLEAN)
16343 fputs (" R4KEOP_CLEAN", stdout);
16344 break;
16345 case ODK_GP_GROUP:
16346 printf (" GP_GROUP %#06lx self-contained %#06lx",
16347 option->info & OGP_GROUP,
16348 (option->info & OGP_SELF) >> 16);
16349 break;
16350 case ODK_IDENT:
16351 printf (" IDENT %#06lx self-contained %#06lx",
16352 option->info & OGP_GROUP,
16353 (option->info & OGP_SELF) >> 16);
16354 break;
16355 default:
16356 /* This shouldn't happen. */
16357 printf (" %3d ??? %d %lx",
16358 option->kind, option->section, option->info);
16359 break;
252b5132 16360 }
a6e9f9df 16361
2cf0635d 16362 len = sizeof (* eopt);
a6e9f9df 16363 while (len < option->size)
82b1b41b 16364 {
7e27a9d5 16365 unsigned char datum = * ((unsigned char *) eopt + offset + len);
a6e9f9df 16366
82b1b41b
NC
16367 if (ISPRINT (datum))
16368 printf ("%c", datum);
16369 else
16370 printf ("\\%03o", datum);
16371 len ++;
16372 }
a6e9f9df 16373 fputs ("\n", stdout);
82b1b41b
NC
16374
16375 offset += option->size;
252b5132 16376 ++option;
252b5132
RH
16377 }
16378
a6e9f9df 16379 free (eopt);
252b5132 16380 }
32ec8896
NC
16381 else
16382 res = FALSE;
252b5132
RH
16383 }
16384
16385 if (conflicts_offset != 0 && conflictsno != 0)
16386 {
2cf0635d 16387 Elf32_Conflict * iconf;
252b5132
RH
16388 size_t cnt;
16389
16390 if (dynamic_symbols == NULL)
16391 {
591a748a 16392 error (_("conflict list found without a dynamic symbol table\n"));
32ec8896 16393 return FALSE;
252b5132
RH
16394 }
16395
7296a62a
NC
16396 /* PR 21345 - print a slightly more helpful error message
16397 if we are sure that the cmalloc will fail. */
dda8d76d 16398 if (conflictsno * sizeof (* iconf) > filedata->file_size)
7296a62a
NC
16399 {
16400 error (_("Overlarge number of conflicts detected: %lx\n"),
16401 (long) conflictsno);
16402 return FALSE;
16403 }
16404
3f5e193b 16405 iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
252b5132
RH
16406 if (iconf == NULL)
16407 {
8b73c356 16408 error (_("Out of memory allocating space for dynamic conflicts\n"));
32ec8896 16409 return FALSE;
252b5132
RH
16410 }
16411
9ea033b2 16412 if (is_32bit_elf)
252b5132 16413 {
2cf0635d 16414 Elf32_External_Conflict * econf32;
a6e9f9df 16415
3f5e193b 16416 econf32 = (Elf32_External_Conflict *)
dda8d76d 16417 get_data (NULL, filedata, conflicts_offset, conflictsno,
3f5e193b 16418 sizeof (* econf32), _("conflict"));
a6e9f9df 16419 if (!econf32)
32ec8896 16420 return FALSE;
252b5132
RH
16421
16422 for (cnt = 0; cnt < conflictsno; ++cnt)
16423 iconf[cnt] = BYTE_GET (econf32[cnt]);
a6e9f9df
AM
16424
16425 free (econf32);
252b5132
RH
16426 }
16427 else
16428 {
2cf0635d 16429 Elf64_External_Conflict * econf64;
a6e9f9df 16430
3f5e193b 16431 econf64 = (Elf64_External_Conflict *)
dda8d76d 16432 get_data (NULL, filedata, conflicts_offset, conflictsno,
3f5e193b 16433 sizeof (* econf64), _("conflict"));
a6e9f9df 16434 if (!econf64)
32ec8896 16435 return FALSE;
252b5132
RH
16436
16437 for (cnt = 0; cnt < conflictsno; ++cnt)
16438 iconf[cnt] = BYTE_GET (econf64[cnt]);
a6e9f9df
AM
16439
16440 free (econf64);
252b5132
RH
16441 }
16442
d3a49aa8
AM
16443 printf (ngettext ("\nSection '.conflict' contains %lu entry:\n",
16444 "\nSection '.conflict' contains %lu entries:\n",
16445 (unsigned long) conflictsno),
c7e7ca54 16446 (unsigned long) conflictsno);
252b5132
RH
16447 puts (_(" Num: Index Value Name"));
16448
16449 for (cnt = 0; cnt < conflictsno; ++cnt)
16450 {
b34976b6 16451 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
e0a31db1
NC
16452
16453 if (iconf[cnt] >= num_dynamic_syms)
16454 printf (_("<corrupt symbol index>"));
d79b3d50 16455 else
e0a31db1
NC
16456 {
16457 Elf_Internal_Sym * psym;
16458
16459 psym = & dynamic_symbols[iconf[cnt]];
16460 print_vma (psym->st_value, FULL_HEX);
16461 putchar (' ');
16462 if (VALID_DYNAMIC_NAME (psym->st_name))
16463 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
16464 else
16465 printf (_("<corrupt: %14ld>"), psym->st_name);
16466 }
31104126 16467 putchar ('\n');
252b5132
RH
16468 }
16469
252b5132
RH
16470 free (iconf);
16471 }
16472
ccb4c951
RS
16473 if (pltgot != 0 && local_gotno != 0)
16474 {
91d6fa6a 16475 bfd_vma ent, local_end, global_end;
bbeee7ea 16476 size_t i, offset;
2cf0635d 16477 unsigned char * data;
82b1b41b 16478 unsigned char * data_end;
bbeee7ea 16479 int addr_size;
ccb4c951 16480
91d6fa6a 16481 ent = pltgot;
ccb4c951
RS
16482 addr_size = (is_32bit_elf ? 4 : 8);
16483 local_end = pltgot + local_gotno * addr_size;
ccb4c951 16484
74e1a04b
NC
16485 /* PR binutils/17533 file: 012-111227-0.004 */
16486 if (symtabno < gotsym)
16487 {
16488 error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
82b1b41b 16489 (unsigned long) gotsym, (unsigned long) symtabno);
32ec8896 16490 return FALSE;
74e1a04b 16491 }
82b1b41b 16492
74e1a04b 16493 global_end = local_end + (symtabno - gotsym) * addr_size;
82b1b41b
NC
16494 /* PR 17531: file: 54c91a34. */
16495 if (global_end < local_end)
16496 {
16497 error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
32ec8896 16498 return FALSE;
82b1b41b 16499 }
948f632f 16500
dda8d76d
NC
16501 offset = offset_from_vma (filedata, pltgot, global_end - pltgot);
16502 data = (unsigned char *) get_data (NULL, filedata, offset,
9cf03b7e
NC
16503 global_end - pltgot, 1,
16504 _("Global Offset Table data"));
919383ac 16505 /* PR 12855: Null data is handled gracefully throughout. */
82b1b41b 16506 data_end = data + (global_end - pltgot);
59245841 16507
ccb4c951
RS
16508 printf (_("\nPrimary GOT:\n"));
16509 printf (_(" Canonical gp value: "));
16510 print_vma (pltgot + 0x7ff0, LONG_HEX);
16511 printf ("\n\n");
16512
16513 printf (_(" Reserved entries:\n"));
16514 printf (_(" %*s %10s %*s Purpose\n"),
2b692964
NC
16515 addr_size * 2, _("Address"), _("Access"),
16516 addr_size * 2, _("Initial"));
82b1b41b 16517 ent = print_mips_got_entry (data, pltgot, ent, data_end);
2b692964 16518 printf (_(" Lazy resolver\n"));
82b1b41b
NC
16519 if (ent == (bfd_vma) -1)
16520 goto got_print_fail;
75ec1fdb 16521
c4ab9505
MR
16522 /* Check for the MSB of GOT[1] being set, denoting a GNU object.
16523 This entry will be used by some runtime loaders, to store the
16524 module pointer. Otherwise this is an ordinary local entry.
16525 PR 21344: Check for the entry being fully available before
16526 fetching it. */
16527 if (data
16528 && data + ent - pltgot + addr_size <= data_end
16529 && (byte_get (data + ent - pltgot, addr_size)
16530 >> (addr_size * 8 - 1)) != 0)
16531 {
16532 ent = print_mips_got_entry (data, pltgot, ent, data_end);
16533 printf (_(" Module pointer (GNU extension)\n"));
16534 if (ent == (bfd_vma) -1)
16535 goto got_print_fail;
ccb4c951
RS
16536 }
16537 printf ("\n");
16538
f17e9d8a 16539 if (data != NULL && ent < local_end)
ccb4c951
RS
16540 {
16541 printf (_(" Local entries:\n"));
cc5914eb 16542 printf (" %*s %10s %*s\n",
2b692964
NC
16543 addr_size * 2, _("Address"), _("Access"),
16544 addr_size * 2, _("Initial"));
91d6fa6a 16545 while (ent < local_end)
ccb4c951 16546 {
82b1b41b 16547 ent = print_mips_got_entry (data, pltgot, ent, data_end);
ccb4c951 16548 printf ("\n");
82b1b41b
NC
16549 if (ent == (bfd_vma) -1)
16550 goto got_print_fail;
ccb4c951
RS
16551 }
16552 printf ("\n");
16553 }
16554
f17e9d8a 16555 if (data != NULL && gotsym < symtabno)
ccb4c951
RS
16556 {
16557 int sym_width;
16558
16559 printf (_(" Global entries:\n"));
cc5914eb 16560 printf (" %*s %10s %*s %*s %-7s %3s %s\n",
9cf03b7e
NC
16561 addr_size * 2, _("Address"),
16562 _("Access"),
2b692964 16563 addr_size * 2, _("Initial"),
9cf03b7e
NC
16564 addr_size * 2, _("Sym.Val."),
16565 _("Type"),
16566 /* Note for translators: "Ndx" = abbreviated form of "Index". */
16567 _("Ndx"), _("Name"));
0b4362b0 16568
ccb4c951 16569 sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
e0a31db1 16570
ccb4c951
RS
16571 for (i = gotsym; i < symtabno; i++)
16572 {
82b1b41b 16573 ent = print_mips_got_entry (data, pltgot, ent, data_end);
ccb4c951 16574 printf (" ");
e0a31db1
NC
16575
16576 if (dynamic_symbols == NULL)
16577 printf (_("<no dynamic symbols>"));
16578 else if (i < num_dynamic_syms)
16579 {
16580 Elf_Internal_Sym * psym = dynamic_symbols + i;
16581
16582 print_vma (psym->st_value, LONG_HEX);
16583 printf (" %-7s %3s ",
dda8d76d
NC
16584 get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
16585 get_symbol_index_type (filedata, psym->st_shndx));
e0a31db1
NC
16586
16587 if (VALID_DYNAMIC_NAME (psym->st_name))
16588 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
16589 else
16590 printf (_("<corrupt: %14ld>"), psym->st_name);
16591 }
ccb4c951 16592 else
7fc5ac57
JBG
16593 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
16594 (unsigned long) i);
e0a31db1 16595
ccb4c951 16596 printf ("\n");
82b1b41b
NC
16597 if (ent == (bfd_vma) -1)
16598 break;
ccb4c951
RS
16599 }
16600 printf ("\n");
16601 }
16602
82b1b41b 16603 got_print_fail:
ccb4c951
RS
16604 if (data)
16605 free (data);
16606 }
16607
861fb55a
DJ
16608 if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
16609 {
91d6fa6a 16610 bfd_vma ent, end;
861fb55a
DJ
16611 size_t offset, rel_offset;
16612 unsigned long count, i;
2cf0635d 16613 unsigned char * data;
861fb55a 16614 int addr_size, sym_width;
2cf0635d 16615 Elf_Internal_Rela * rels;
861fb55a 16616
dda8d76d 16617 rel_offset = offset_from_vma (filedata, jmprel, pltrelsz);
861fb55a
DJ
16618 if (pltrel == DT_RELA)
16619 {
dda8d76d 16620 if (!slurp_rela_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
32ec8896 16621 return FALSE;
861fb55a
DJ
16622 }
16623 else
16624 {
dda8d76d 16625 if (!slurp_rel_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
32ec8896 16626 return FALSE;
861fb55a
DJ
16627 }
16628
91d6fa6a 16629 ent = mips_pltgot;
861fb55a
DJ
16630 addr_size = (is_32bit_elf ? 4 : 8);
16631 end = mips_pltgot + (2 + count) * addr_size;
16632
dda8d76d
NC
16633 offset = offset_from_vma (filedata, mips_pltgot, end - mips_pltgot);
16634 data = (unsigned char *) get_data (NULL, filedata, offset, end - mips_pltgot,
9cf03b7e 16635 1, _("Procedure Linkage Table data"));
59245841 16636 if (data == NULL)
32ec8896 16637 return FALSE;
59245841 16638
9cf03b7e 16639 printf ("\nPLT GOT:\n\n");
861fb55a
DJ
16640 printf (_(" Reserved entries:\n"));
16641 printf (_(" %*s %*s Purpose\n"),
2b692964 16642 addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
91d6fa6a 16643 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
2b692964 16644 printf (_(" PLT lazy resolver\n"));
91d6fa6a 16645 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
2b692964 16646 printf (_(" Module pointer\n"));
861fb55a
DJ
16647 printf ("\n");
16648
16649 printf (_(" Entries:\n"));
cc5914eb 16650 printf (" %*s %*s %*s %-7s %3s %s\n",
2b692964
NC
16651 addr_size * 2, _("Address"),
16652 addr_size * 2, _("Initial"),
16653 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
861fb55a
DJ
16654 sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
16655 for (i = 0; i < count; i++)
16656 {
df97ab2a 16657 unsigned long idx = get_reloc_symindex (rels[i].r_info);
861fb55a 16658
91d6fa6a 16659 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
861fb55a 16660 printf (" ");
e0a31db1 16661
df97ab2a
MF
16662 if (idx >= num_dynamic_syms)
16663 printf (_("<corrupt symbol index: %lu>"), idx);
861fb55a 16664 else
e0a31db1 16665 {
df97ab2a 16666 Elf_Internal_Sym * psym = dynamic_symbols + idx;
e0a31db1
NC
16667
16668 print_vma (psym->st_value, LONG_HEX);
16669 printf (" %-7s %3s ",
dda8d76d
NC
16670 get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
16671 get_symbol_index_type (filedata, psym->st_shndx));
e0a31db1
NC
16672 if (VALID_DYNAMIC_NAME (psym->st_name))
16673 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
16674 else
16675 printf (_("<corrupt: %14ld>"), psym->st_name);
16676 }
861fb55a
DJ
16677 printf ("\n");
16678 }
16679 printf ("\n");
16680
16681 if (data)
16682 free (data);
16683 free (rels);
16684 }
16685
32ec8896 16686 return res;
252b5132
RH
16687}
16688
32ec8896 16689static bfd_boolean
dda8d76d 16690process_nds32_specific (Filedata * filedata)
35c08157
KLC
16691{
16692 Elf_Internal_Shdr *sect = NULL;
16693
dda8d76d 16694 sect = find_section (filedata, ".nds32_e_flags");
35c08157
KLC
16695 if (sect != NULL)
16696 {
16697 unsigned int *flag;
16698
16699 printf ("\nNDS32 elf flags section:\n");
dda8d76d 16700 flag = get_data (NULL, filedata, sect->sh_offset, 1,
35c08157
KLC
16701 sect->sh_size, _("NDS32 elf flags section"));
16702
32ec8896
NC
16703 if (! flag)
16704 return FALSE;
16705
35c08157
KLC
16706 switch ((*flag) & 0x3)
16707 {
16708 case 0:
16709 printf ("(VEC_SIZE):\tNo entry.\n");
16710 break;
16711 case 1:
16712 printf ("(VEC_SIZE):\t4 bytes\n");
16713 break;
16714 case 2:
16715 printf ("(VEC_SIZE):\t16 bytes\n");
16716 break;
16717 case 3:
16718 printf ("(VEC_SIZE):\treserved\n");
16719 break;
16720 }
16721 }
16722
16723 return TRUE;
16724}
16725
32ec8896 16726static bfd_boolean
dda8d76d 16727process_gnu_liblist (Filedata * filedata)
047b2264 16728{
2cf0635d
NC
16729 Elf_Internal_Shdr * section;
16730 Elf_Internal_Shdr * string_sec;
16731 Elf32_External_Lib * elib;
16732 char * strtab;
c256ffe7 16733 size_t strtab_size;
047b2264 16734 size_t cnt;
d3a49aa8 16735 unsigned long num_liblist;
047b2264 16736 unsigned i;
32ec8896 16737 bfd_boolean res = TRUE;
047b2264
JJ
16738
16739 if (! do_arch)
32ec8896 16740 return TRUE;
047b2264 16741
dda8d76d
NC
16742 for (i = 0, section = filedata->section_headers;
16743 i < filedata->file_header.e_shnum;
b34976b6 16744 i++, section++)
047b2264
JJ
16745 {
16746 switch (section->sh_type)
16747 {
16748 case SHT_GNU_LIBLIST:
dda8d76d 16749 if (section->sh_link >= filedata->file_header.e_shnum)
c256ffe7
JJ
16750 break;
16751
3f5e193b 16752 elib = (Elf32_External_Lib *)
dda8d76d 16753 get_data (NULL, filedata, section->sh_offset, 1, section->sh_size,
9cf03b7e 16754 _("liblist section data"));
047b2264
JJ
16755
16756 if (elib == NULL)
32ec8896
NC
16757 {
16758 res = FALSE;
16759 break;
16760 }
047b2264 16761
dda8d76d
NC
16762 string_sec = filedata->section_headers + section->sh_link;
16763 strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
3f5e193b
NC
16764 string_sec->sh_size,
16765 _("liblist string table"));
047b2264
JJ
16766 if (strtab == NULL
16767 || section->sh_entsize != sizeof (Elf32_External_Lib))
16768 {
16769 free (elib);
2842702f 16770 free (strtab);
32ec8896 16771 res = FALSE;
047b2264
JJ
16772 break;
16773 }
59245841 16774 strtab_size = string_sec->sh_size;
047b2264 16775
d3a49aa8
AM
16776 num_liblist = section->sh_size / sizeof (Elf32_External_Lib);
16777 printf (ngettext ("\nLibrary list section '%s' contains %lu entries:\n",
16778 "\nLibrary list section '%s' contains %lu entries:\n",
16779 num_liblist),
dda8d76d 16780 printable_section_name (filedata, section),
d3a49aa8 16781 num_liblist);
047b2264 16782
2b692964 16783 puts (_(" Library Time Stamp Checksum Version Flags"));
047b2264
JJ
16784
16785 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
16786 ++cnt)
16787 {
16788 Elf32_Lib liblist;
91d6fa6a 16789 time_t atime;
d5b07ef4 16790 char timebuf[128];
2cf0635d 16791 struct tm * tmp;
047b2264
JJ
16792
16793 liblist.l_name = BYTE_GET (elib[cnt].l_name);
91d6fa6a 16794 atime = BYTE_GET (elib[cnt].l_time_stamp);
047b2264
JJ
16795 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
16796 liblist.l_version = BYTE_GET (elib[cnt].l_version);
16797 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
16798
91d6fa6a 16799 tmp = gmtime (&atime);
e9e44622
JJ
16800 snprintf (timebuf, sizeof (timebuf),
16801 "%04u-%02u-%02uT%02u:%02u:%02u",
16802 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
16803 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
047b2264
JJ
16804
16805 printf ("%3lu: ", (unsigned long) cnt);
16806 if (do_wide)
c256ffe7 16807 printf ("%-20s", liblist.l_name < strtab_size
2b692964 16808 ? strtab + liblist.l_name : _("<corrupt>"));
047b2264 16809 else
c256ffe7 16810 printf ("%-20.20s", liblist.l_name < strtab_size
2b692964 16811 ? strtab + liblist.l_name : _("<corrupt>"));
047b2264
JJ
16812 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
16813 liblist.l_version, liblist.l_flags);
16814 }
16815
16816 free (elib);
2842702f 16817 free (strtab);
047b2264
JJ
16818 }
16819 }
16820
32ec8896 16821 return res;
047b2264
JJ
16822}
16823
9437c45b 16824static const char *
dda8d76d 16825get_note_type (Filedata * filedata, unsigned e_type)
779fe533
NC
16826{
16827 static char buff[64];
103f02d3 16828
dda8d76d 16829 if (filedata->file_header.e_type == ET_CORE)
1ec5cd37
NC
16830 switch (e_type)
16831 {
57346661 16832 case NT_AUXV:
1ec5cd37 16833 return _("NT_AUXV (auxiliary vector)");
57346661 16834 case NT_PRSTATUS:
1ec5cd37 16835 return _("NT_PRSTATUS (prstatus structure)");
57346661 16836 case NT_FPREGSET:
1ec5cd37 16837 return _("NT_FPREGSET (floating point registers)");
57346661 16838 case NT_PRPSINFO:
1ec5cd37 16839 return _("NT_PRPSINFO (prpsinfo structure)");
57346661 16840 case NT_TASKSTRUCT:
1ec5cd37 16841 return _("NT_TASKSTRUCT (task structure)");
57346661 16842 case NT_PRXFPREG:
1ec5cd37 16843 return _("NT_PRXFPREG (user_xfpregs structure)");
e1e95dec
AM
16844 case NT_PPC_VMX:
16845 return _("NT_PPC_VMX (ppc Altivec registers)");
89eeb0bc
LM
16846 case NT_PPC_VSX:
16847 return _("NT_PPC_VSX (ppc VSX registers)");
66c3b5f8
GR
16848 case NT_PPC_TAR:
16849 return _("NT_PPC_TAR (ppc TAR register)");
16850 case NT_PPC_PPR:
16851 return _("NT_PPC_PPR (ppc PPR register)");
16852 case NT_PPC_DSCR:
16853 return _("NT_PPC_DSCR (ppc DSCR register)");
16854 case NT_PPC_EBB:
16855 return _("NT_PPC_EBB (ppc EBB registers)");
16856 case NT_PPC_PMU:
16857 return _("NT_PPC_PMU (ppc PMU registers)");
16858 case NT_PPC_TM_CGPR:
16859 return _("NT_PPC_TM_CGPR (ppc checkpointed GPR registers)");
16860 case NT_PPC_TM_CFPR:
16861 return _("NT_PPC_TM_CFPR (ppc checkpointed floating point registers)");
16862 case NT_PPC_TM_CVMX:
16863 return _("NT_PPC_TM_CVMX (ppc checkpointed Altivec registers)");
16864 case NT_PPC_TM_CVSX:
3fd21718 16865 return _("NT_PPC_TM_CVSX (ppc checkpointed VSX registers)");
66c3b5f8
GR
16866 case NT_PPC_TM_SPR:
16867 return _("NT_PPC_TM_SPR (ppc TM special purpose registers)");
16868 case NT_PPC_TM_CTAR:
16869 return _("NT_PPC_TM_CTAR (ppc checkpointed TAR register)");
16870 case NT_PPC_TM_CPPR:
16871 return _("NT_PPC_TM_CPPR (ppc checkpointed PPR register)");
16872 case NT_PPC_TM_CDSCR:
16873 return _("NT_PPC_TM_CDSCR (ppc checkpointed DSCR register)");
ff826ef3
TT
16874 case NT_386_TLS:
16875 return _("NT_386_TLS (x86 TLS information)");
16876 case NT_386_IOPERM:
16877 return _("NT_386_IOPERM (x86 I/O permissions)");
4339cae0
L
16878 case NT_X86_XSTATE:
16879 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
0675e188
UW
16880 case NT_S390_HIGH_GPRS:
16881 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
d7eeb400
MS
16882 case NT_S390_TIMER:
16883 return _("NT_S390_TIMER (s390 timer register)");
16884 case NT_S390_TODCMP:
16885 return _("NT_S390_TODCMP (s390 TOD comparator register)");
16886 case NT_S390_TODPREG:
16887 return _("NT_S390_TODPREG (s390 TOD programmable register)");
16888 case NT_S390_CTRS:
16889 return _("NT_S390_CTRS (s390 control registers)");
16890 case NT_S390_PREFIX:
16891 return _("NT_S390_PREFIX (s390 prefix register)");
a367d729
AK
16892 case NT_S390_LAST_BREAK:
16893 return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
16894 case NT_S390_SYSTEM_CALL:
16895 return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
abb3f6cc
NC
16896 case NT_S390_TDB:
16897 return _("NT_S390_TDB (s390 transaction diagnostic block)");
4ef9f41a
AA
16898 case NT_S390_VXRS_LOW:
16899 return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
16900 case NT_S390_VXRS_HIGH:
16901 return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
88ab90e8
AA
16902 case NT_S390_GS_CB:
16903 return _("NT_S390_GS_CB (s390 guarded-storage registers)");
16904 case NT_S390_GS_BC:
16905 return _("NT_S390_GS_BC (s390 guarded-storage broadcast control)");
faa9a424
UW
16906 case NT_ARM_VFP:
16907 return _("NT_ARM_VFP (arm VFP registers)");
652451f8
YZ
16908 case NT_ARM_TLS:
16909 return _("NT_ARM_TLS (AArch TLS registers)");
16910 case NT_ARM_HW_BREAK:
16911 return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
16912 case NT_ARM_HW_WATCH:
16913 return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
57346661 16914 case NT_PSTATUS:
1ec5cd37 16915 return _("NT_PSTATUS (pstatus structure)");
57346661 16916 case NT_FPREGS:
1ec5cd37 16917 return _("NT_FPREGS (floating point registers)");
57346661 16918 case NT_PSINFO:
1ec5cd37 16919 return _("NT_PSINFO (psinfo structure)");
57346661 16920 case NT_LWPSTATUS:
1ec5cd37 16921 return _("NT_LWPSTATUS (lwpstatus_t structure)");
57346661 16922 case NT_LWPSINFO:
1ec5cd37 16923 return _("NT_LWPSINFO (lwpsinfo_t structure)");
57346661 16924 case NT_WIN32PSTATUS:
1ec5cd37 16925 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
9ece1fa9
TT
16926 case NT_SIGINFO:
16927 return _("NT_SIGINFO (siginfo_t data)");
16928 case NT_FILE:
16929 return _("NT_FILE (mapped files)");
1ec5cd37
NC
16930 default:
16931 break;
16932 }
16933 else
16934 switch (e_type)
16935 {
16936 case NT_VERSION:
16937 return _("NT_VERSION (version)");
16938 case NT_ARCH:
16939 return _("NT_ARCH (architecture)");
9ef920e9 16940 case NT_GNU_BUILD_ATTRIBUTE_OPEN:
6f156d7a 16941 return _("OPEN");
9ef920e9 16942 case NT_GNU_BUILD_ATTRIBUTE_FUNC:
6f156d7a 16943 return _("func");
1ec5cd37
NC
16944 default:
16945 break;
16946 }
16947
e9e44622 16948 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
1ec5cd37 16949 return buff;
779fe533
NC
16950}
16951
32ec8896 16952static bfd_boolean
9ece1fa9
TT
16953print_core_note (Elf_Internal_Note *pnote)
16954{
16955 unsigned int addr_size = is_32bit_elf ? 4 : 8;
16956 bfd_vma count, page_size;
16957 unsigned char *descdata, *filenames, *descend;
16958
16959 if (pnote->type != NT_FILE)
04ac15ab
AS
16960 {
16961 if (do_wide)
16962 printf ("\n");
16963 return TRUE;
16964 }
9ece1fa9
TT
16965
16966#ifndef BFD64
16967 if (!is_32bit_elf)
16968 {
16969 printf (_(" Cannot decode 64-bit note in 32-bit build\n"));
16970 /* Still "successful". */
32ec8896 16971 return TRUE;
9ece1fa9
TT
16972 }
16973#endif
16974
16975 if (pnote->descsz < 2 * addr_size)
16976 {
32ec8896
NC
16977 error (_(" Malformed note - too short for header\n"));
16978 return FALSE;
9ece1fa9
TT
16979 }
16980
16981 descdata = (unsigned char *) pnote->descdata;
16982 descend = descdata + pnote->descsz;
16983
16984 if (descdata[pnote->descsz - 1] != '\0')
16985 {
32ec8896
NC
16986 error (_(" Malformed note - does not end with \\0\n"));
16987 return FALSE;
9ece1fa9
TT
16988 }
16989
16990 count = byte_get (descdata, addr_size);
16991 descdata += addr_size;
16992
16993 page_size = byte_get (descdata, addr_size);
16994 descdata += addr_size;
16995
5396a86e
AM
16996 if (count > ((bfd_vma) -1 - 2 * addr_size) / (3 * addr_size)
16997 || pnote->descsz < 2 * addr_size + count * 3 * addr_size)
9ece1fa9 16998 {
32ec8896
NC
16999 error (_(" Malformed note - too short for supplied file count\n"));
17000 return FALSE;
9ece1fa9
TT
17001 }
17002
17003 printf (_(" Page size: "));
17004 print_vma (page_size, DEC);
17005 printf ("\n");
17006
17007 printf (_(" %*s%*s%*s\n"),
17008 (int) (2 + 2 * addr_size), _("Start"),
17009 (int) (4 + 2 * addr_size), _("End"),
17010 (int) (4 + 2 * addr_size), _("Page Offset"));
17011 filenames = descdata + count * 3 * addr_size;
595712bb 17012 while (count-- > 0)
9ece1fa9
TT
17013 {
17014 bfd_vma start, end, file_ofs;
17015
17016 if (filenames == descend)
17017 {
32ec8896
NC
17018 error (_(" Malformed note - filenames end too early\n"));
17019 return FALSE;
9ece1fa9
TT
17020 }
17021
17022 start = byte_get (descdata, addr_size);
17023 descdata += addr_size;
17024 end = byte_get (descdata, addr_size);
17025 descdata += addr_size;
17026 file_ofs = byte_get (descdata, addr_size);
17027 descdata += addr_size;
17028
17029 printf (" ");
17030 print_vma (start, FULL_HEX);
17031 printf (" ");
17032 print_vma (end, FULL_HEX);
17033 printf (" ");
17034 print_vma (file_ofs, FULL_HEX);
17035 printf ("\n %s\n", filenames);
17036
17037 filenames += 1 + strlen ((char *) filenames);
17038 }
17039
32ec8896 17040 return TRUE;
9ece1fa9
TT
17041}
17042
1118d252
RM
17043static const char *
17044get_gnu_elf_note_type (unsigned e_type)
17045{
1449284b 17046 /* NB/ Keep this switch statement in sync with print_gnu_note (). */
1118d252
RM
17047 switch (e_type)
17048 {
17049 case NT_GNU_ABI_TAG:
17050 return _("NT_GNU_ABI_TAG (ABI version tag)");
17051 case NT_GNU_HWCAP:
17052 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
17053 case NT_GNU_BUILD_ID:
17054 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
0297aed6
DM
17055 case NT_GNU_GOLD_VERSION:
17056 return _("NT_GNU_GOLD_VERSION (gold version)");
9ef920e9
NC
17057 case NT_GNU_PROPERTY_TYPE_0:
17058 return _("NT_GNU_PROPERTY_TYPE_0");
17059 case NT_GNU_BUILD_ATTRIBUTE_OPEN:
17060 return _("NT_GNU_BUILD_ATTRIBUTE_OPEN");
17061 case NT_GNU_BUILD_ATTRIBUTE_FUNC:
17062 return _("NT_GNU_BUILD_ATTRIBUTE_FUNC");
1118d252 17063 default:
1449284b
NC
17064 {
17065 static char buff[64];
1118d252 17066
1449284b
NC
17067 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17068 return buff;
17069 }
17070 }
1118d252
RM
17071}
17072
a9eafb08
L
17073static void
17074decode_x86_compat_isa (unsigned int bitmask)
17075{
17076 while (bitmask)
17077 {
17078 unsigned int bit = bitmask & (- bitmask);
17079
17080 bitmask &= ~ bit;
17081 switch (bit)
17082 {
17083 case GNU_PROPERTY_X86_COMPAT_ISA_1_486:
17084 printf ("i486");
17085 break;
17086 case GNU_PROPERTY_X86_COMPAT_ISA_1_586:
17087 printf ("586");
17088 break;
17089 case GNU_PROPERTY_X86_COMPAT_ISA_1_686:
17090 printf ("686");
17091 break;
17092 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE:
17093 printf ("SSE");
17094 break;
17095 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE2:
17096 printf ("SSE2");
17097 break;
17098 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE3:
17099 printf ("SSE3");
17100 break;
17101 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSSE3:
17102 printf ("SSSE3");
17103 break;
17104 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_1:
17105 printf ("SSE4_1");
17106 break;
17107 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_2:
17108 printf ("SSE4_2");
17109 break;
17110 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX:
17111 printf ("AVX");
17112 break;
17113 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX2:
17114 printf ("AVX2");
17115 break;
17116 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512F:
17117 printf ("AVX512F");
17118 break;
17119 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512CD:
17120 printf ("AVX512CD");
17121 break;
17122 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512ER:
17123 printf ("AVX512ER");
17124 break;
17125 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512PF:
17126 printf ("AVX512PF");
17127 break;
17128 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512VL:
17129 printf ("AVX512VL");
17130 break;
17131 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512DQ:
17132 printf ("AVX512DQ");
17133 break;
17134 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512BW:
17135 printf ("AVX512BW");
17136 break;
65b3d26e
L
17137 default:
17138 printf (_("<unknown: %x>"), bit);
17139 break;
a9eafb08
L
17140 }
17141 if (bitmask)
17142 printf (", ");
17143 }
17144}
17145
9ef920e9 17146static void
1fc87489 17147decode_x86_isa (unsigned int bitmask)
9ef920e9 17148{
0a59decb 17149 if (!bitmask)
90c745dc
L
17150 {
17151 printf (_("<None>"));
17152 return;
17153 }
90c745dc 17154
9ef920e9
NC
17155 while (bitmask)
17156 {
1fc87489 17157 unsigned int bit = bitmask & (- bitmask);
9ef920e9
NC
17158
17159 bitmask &= ~ bit;
17160 switch (bit)
17161 {
a9eafb08
L
17162 case GNU_PROPERTY_X86_ISA_1_CMOV:
17163 printf ("CMOV");
17164 break;
17165 case GNU_PROPERTY_X86_ISA_1_SSE:
17166 printf ("SSE");
17167 break;
17168 case GNU_PROPERTY_X86_ISA_1_SSE2:
17169 printf ("SSE2");
17170 break;
17171 case GNU_PROPERTY_X86_ISA_1_SSE3:
17172 printf ("SSE3");
17173 break;
17174 case GNU_PROPERTY_X86_ISA_1_SSSE3:
17175 printf ("SSSE3");
17176 break;
17177 case GNU_PROPERTY_X86_ISA_1_SSE4_1:
17178 printf ("SSE4_1");
17179 break;
17180 case GNU_PROPERTY_X86_ISA_1_SSE4_2:
17181 printf ("SSE4_2");
17182 break;
17183 case GNU_PROPERTY_X86_ISA_1_AVX:
17184 printf ("AVX");
17185 break;
17186 case GNU_PROPERTY_X86_ISA_1_AVX2:
17187 printf ("AVX2");
17188 break;
17189 case GNU_PROPERTY_X86_ISA_1_FMA:
17190 printf ("FMA");
17191 break;
17192 case GNU_PROPERTY_X86_ISA_1_AVX512F:
17193 printf ("AVX512F");
17194 break;
17195 case GNU_PROPERTY_X86_ISA_1_AVX512CD:
17196 printf ("AVX512CD");
17197 break;
17198 case GNU_PROPERTY_X86_ISA_1_AVX512ER:
17199 printf ("AVX512ER");
17200 break;
17201 case GNU_PROPERTY_X86_ISA_1_AVX512PF:
17202 printf ("AVX512PF");
17203 break;
17204 case GNU_PROPERTY_X86_ISA_1_AVX512VL:
17205 printf ("AVX512VL");
17206 break;
17207 case GNU_PROPERTY_X86_ISA_1_AVX512DQ:
17208 printf ("AVX512DQ");
17209 break;
17210 case GNU_PROPERTY_X86_ISA_1_AVX512BW:
17211 printf ("AVX512BW");
17212 break;
17213 case GNU_PROPERTY_X86_ISA_1_AVX512_4FMAPS:
17214 printf ("AVX512_4FMAPS");
17215 break;
17216 case GNU_PROPERTY_X86_ISA_1_AVX512_4VNNIW:
17217 printf ("AVX512_4VNNIW");
17218 break;
17219 case GNU_PROPERTY_X86_ISA_1_AVX512_BITALG:
17220 printf ("AVX512_BITALG");
17221 break;
17222 case GNU_PROPERTY_X86_ISA_1_AVX512_IFMA:
17223 printf ("AVX512_IFMA");
17224 break;
17225 case GNU_PROPERTY_X86_ISA_1_AVX512_VBMI:
17226 printf ("AVX512_VBMI");
17227 break;
17228 case GNU_PROPERTY_X86_ISA_1_AVX512_VBMI2:
17229 printf ("AVX512_VBMI2");
17230 break;
17231 case GNU_PROPERTY_X86_ISA_1_AVX512_VNNI:
17232 printf ("AVX512_VNNI");
17233 break;
65b3d26e
L
17234 default:
17235 printf (_("<unknown: %x>"), bit);
17236 break;
9ef920e9
NC
17237 }
17238 if (bitmask)
17239 printf (", ");
17240 }
17241}
17242
ee2fdd6f 17243static void
a9eafb08 17244decode_x86_feature_1 (unsigned int bitmask)
ee2fdd6f 17245{
0a59decb 17246 if (!bitmask)
90c745dc
L
17247 {
17248 printf (_("<None>"));
17249 return;
17250 }
90c745dc 17251
ee2fdd6f
L
17252 while (bitmask)
17253 {
17254 unsigned int bit = bitmask & (- bitmask);
17255
17256 bitmask &= ~ bit;
17257 switch (bit)
17258 {
17259 case GNU_PROPERTY_X86_FEATURE_1_IBT:
a9eafb08 17260 printf ("IBT");
ee2fdd6f 17261 break;
48580982 17262 case GNU_PROPERTY_X86_FEATURE_1_SHSTK:
a9eafb08 17263 printf ("SHSTK");
48580982 17264 break;
ee2fdd6f
L
17265 default:
17266 printf (_("<unknown: %x>"), bit);
17267 break;
17268 }
17269 if (bitmask)
17270 printf (", ");
17271 }
17272}
17273
a9eafb08
L
17274static void
17275decode_x86_feature_2 (unsigned int bitmask)
17276{
0a59decb 17277 if (!bitmask)
90c745dc
L
17278 {
17279 printf (_("<None>"));
17280 return;
17281 }
90c745dc 17282
a9eafb08
L
17283 while (bitmask)
17284 {
17285 unsigned int bit = bitmask & (- bitmask);
17286
17287 bitmask &= ~ bit;
17288 switch (bit)
17289 {
17290 case GNU_PROPERTY_X86_FEATURE_2_X86:
17291 printf ("x86");
17292 break;
17293 case GNU_PROPERTY_X86_FEATURE_2_X87:
17294 printf ("x87");
17295 break;
17296 case GNU_PROPERTY_X86_FEATURE_2_MMX:
17297 printf ("MMX");
17298 break;
17299 case GNU_PROPERTY_X86_FEATURE_2_XMM:
17300 printf ("XMM");
17301 break;
17302 case GNU_PROPERTY_X86_FEATURE_2_YMM:
17303 printf ("YMM");
17304 break;
17305 case GNU_PROPERTY_X86_FEATURE_2_ZMM:
17306 printf ("ZMM");
17307 break;
17308 case GNU_PROPERTY_X86_FEATURE_2_FXSR:
17309 printf ("FXSR");
17310 break;
17311 case GNU_PROPERTY_X86_FEATURE_2_XSAVE:
17312 printf ("XSAVE");
17313 break;
17314 case GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT:
17315 printf ("XSAVEOPT");
17316 break;
17317 case GNU_PROPERTY_X86_FEATURE_2_XSAVEC:
17318 printf ("XSAVEC");
17319 break;
65b3d26e
L
17320 default:
17321 printf (_("<unknown: %x>"), bit);
17322 break;
a9eafb08
L
17323 }
17324 if (bitmask)
17325 printf (", ");
17326 }
17327}
17328
9ef920e9 17329static void
dda8d76d 17330print_gnu_property_note (Filedata * filedata, Elf_Internal_Note * pnote)
9ef920e9
NC
17331{
17332 unsigned char * ptr = (unsigned char *) pnote->descdata;
17333 unsigned char * ptr_end = ptr + pnote->descsz;
17334 unsigned int size = is_32bit_elf ? 4 : 8;
17335
17336 printf (_(" Properties: "));
17337
1fc87489 17338 if (pnote->descsz < 8 || (pnote->descsz % size) != 0)
9ef920e9
NC
17339 {
17340 printf (_("<corrupt GNU_PROPERTY_TYPE, size = %#lx>\n"), pnote->descsz);
17341 return;
17342 }
17343
6ab2c4ed 17344 while (ptr < ptr_end)
9ef920e9 17345 {
1fc87489 17346 unsigned int j;
6ab2c4ed
MC
17347 unsigned int type;
17348 unsigned int datasz;
17349
17350 if ((size_t) (ptr_end - ptr) < 8)
17351 {
17352 printf (_("<corrupt descsz: %#lx>\n"), pnote->descsz);
17353 break;
17354 }
17355
17356 type = byte_get (ptr, 4);
17357 datasz = byte_get (ptr + 4, 4);
9ef920e9 17358
1fc87489 17359 ptr += 8;
9ef920e9 17360
6ab2c4ed 17361 if (datasz > (size_t) (ptr_end - ptr))
9ef920e9 17362 {
1fc87489
L
17363 printf (_("<corrupt type (%#x) datasz: %#x>\n"),
17364 type, datasz);
9ef920e9 17365 break;
1fc87489 17366 }
9ef920e9 17367
1fc87489
L
17368 if (type >= GNU_PROPERTY_LOPROC && type <= GNU_PROPERTY_HIPROC)
17369 {
dda8d76d
NC
17370 if (filedata->file_header.e_machine == EM_X86_64
17371 || filedata->file_header.e_machine == EM_IAMCU
17372 || filedata->file_header.e_machine == EM_386)
1fc87489 17373 {
aa7bca9b
L
17374 unsigned int bitmask;
17375
17376 if (datasz == 4)
0a59decb 17377 bitmask = byte_get (ptr, 4);
aa7bca9b
L
17378 else
17379 bitmask = 0;
17380
1fc87489
L
17381 switch (type)
17382 {
17383 case GNU_PROPERTY_X86_ISA_1_USED:
1fc87489 17384 if (datasz != 4)
aa7bca9b
L
17385 printf (_("x86 ISA used: <corrupt length: %#x> "),
17386 datasz);
1fc87489 17387 else
aa7bca9b
L
17388 {
17389 printf ("x86 ISA used: ");
17390 decode_x86_isa (bitmask);
17391 }
1fc87489 17392 goto next;
9ef920e9 17393
1fc87489 17394 case GNU_PROPERTY_X86_ISA_1_NEEDED:
1fc87489 17395 if (datasz != 4)
aa7bca9b
L
17396 printf (_("x86 ISA needed: <corrupt length: %#x> "),
17397 datasz);
1fc87489 17398 else
aa7bca9b
L
17399 {
17400 printf ("x86 ISA needed: ");
17401 decode_x86_isa (bitmask);
17402 }
1fc87489 17403 goto next;
9ef920e9 17404
ee2fdd6f 17405 case GNU_PROPERTY_X86_FEATURE_1_AND:
ee2fdd6f 17406 if (datasz != 4)
aa7bca9b
L
17407 printf (_("x86 feature: <corrupt length: %#x> "),
17408 datasz);
ee2fdd6f 17409 else
aa7bca9b
L
17410 {
17411 printf ("x86 feature: ");
a9eafb08
L
17412 decode_x86_feature_1 (bitmask);
17413 }
17414 goto next;
17415
17416 case GNU_PROPERTY_X86_FEATURE_2_USED:
17417 if (datasz != 4)
17418 printf (_("x86 feature used: <corrupt length: %#x> "),
17419 datasz);
17420 else
17421 {
17422 printf ("x86 feature used: ");
17423 decode_x86_feature_2 (bitmask);
17424 }
17425 goto next;
17426
17427 case GNU_PROPERTY_X86_FEATURE_2_NEEDED:
17428 if (datasz != 4)
17429 printf (_("x86 feature needed: <corrupt length: %#x> "), datasz);
17430 else
17431 {
17432 printf ("x86 feature needed: ");
17433 decode_x86_feature_2 (bitmask);
17434 }
17435 goto next;
17436
17437 case GNU_PROPERTY_X86_COMPAT_ISA_1_USED:
17438 if (datasz != 4)
17439 printf (_("x86 ISA used: <corrupt length: %#x> "),
17440 datasz);
17441 else
17442 {
17443 printf ("x86 ISA used: ");
17444 decode_x86_compat_isa (bitmask);
17445 }
17446 goto next;
17447
17448 case GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED:
17449 if (datasz != 4)
17450 printf (_("x86 ISA needed: <corrupt length: %#x> "),
17451 datasz);
17452 else
17453 {
17454 printf ("x86 ISA needed: ");
17455 decode_x86_compat_isa (bitmask);
aa7bca9b 17456 }
ee2fdd6f
L
17457 goto next;
17458
1fc87489
L
17459 default:
17460 break;
17461 }
17462 }
17463 }
17464 else
17465 {
17466 switch (type)
9ef920e9 17467 {
1fc87489
L
17468 case GNU_PROPERTY_STACK_SIZE:
17469 printf (_("stack size: "));
17470 if (datasz != size)
17471 printf (_("<corrupt length: %#x> "), datasz);
17472 else
17473 printf ("%#lx", (unsigned long) byte_get (ptr, size));
17474 goto next;
17475
17476 case GNU_PROPERTY_NO_COPY_ON_PROTECTED:
17477 printf ("no copy on protected ");
17478 if (datasz)
17479 printf (_("<corrupt length: %#x> "), datasz);
17480 goto next;
17481
17482 default:
9ef920e9
NC
17483 break;
17484 }
9ef920e9
NC
17485 }
17486
1fc87489
L
17487 if (type < GNU_PROPERTY_LOPROC)
17488 printf (_("<unknown type %#x data: "), type);
17489 else if (type < GNU_PROPERTY_LOUSER)
17490 printf (_("<procesor-specific type %#x data: "), type);
17491 else
17492 printf (_("<application-specific type %#x data: "), type);
17493 for (j = 0; j < datasz; ++j)
17494 printf ("%02x ", ptr[j] & 0xff);
17495 printf (">");
17496
17497next:
9ef920e9 17498 ptr += ((datasz + (size - 1)) & ~ (size - 1));
1fc87489
L
17499 if (ptr == ptr_end)
17500 break;
1fc87489 17501
6ab2c4ed
MC
17502 if (do_wide)
17503 printf (", ");
17504 else
17505 printf ("\n\t");
9ef920e9
NC
17506 }
17507
17508 printf ("\n");
17509}
17510
32ec8896 17511static bfd_boolean
dda8d76d 17512print_gnu_note (Filedata * filedata, Elf_Internal_Note *pnote)
664f90a3 17513{
1449284b 17514 /* NB/ Keep this switch statement in sync with get_gnu_elf_note_type (). */
664f90a3
TT
17515 switch (pnote->type)
17516 {
17517 case NT_GNU_BUILD_ID:
17518 {
17519 unsigned long i;
17520
17521 printf (_(" Build ID: "));
17522 for (i = 0; i < pnote->descsz; ++i)
17523 printf ("%02x", pnote->descdata[i] & 0xff);
9cf03b7e 17524 printf ("\n");
664f90a3
TT
17525 }
17526 break;
17527
17528 case NT_GNU_ABI_TAG:
17529 {
17530 unsigned long os, major, minor, subminor;
17531 const char *osname;
17532
3102e897
NC
17533 /* PR 17531: file: 030-599401-0.004. */
17534 if (pnote->descsz < 16)
17535 {
17536 printf (_(" <corrupt GNU_ABI_TAG>\n"));
17537 break;
17538 }
17539
664f90a3
TT
17540 os = byte_get ((unsigned char *) pnote->descdata, 4);
17541 major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17542 minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
17543 subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
17544
17545 switch (os)
17546 {
17547 case GNU_ABI_TAG_LINUX:
17548 osname = "Linux";
17549 break;
17550 case GNU_ABI_TAG_HURD:
17551 osname = "Hurd";
17552 break;
17553 case GNU_ABI_TAG_SOLARIS:
17554 osname = "Solaris";
17555 break;
17556 case GNU_ABI_TAG_FREEBSD:
17557 osname = "FreeBSD";
17558 break;
17559 case GNU_ABI_TAG_NETBSD:
17560 osname = "NetBSD";
17561 break;
14ae95f2
RM
17562 case GNU_ABI_TAG_SYLLABLE:
17563 osname = "Syllable";
17564 break;
17565 case GNU_ABI_TAG_NACL:
17566 osname = "NaCl";
17567 break;
664f90a3
TT
17568 default:
17569 osname = "Unknown";
17570 break;
17571 }
17572
17573 printf (_(" OS: %s, ABI: %ld.%ld.%ld\n"), osname,
17574 major, minor, subminor);
17575 }
17576 break;
926c5385
CC
17577
17578 case NT_GNU_GOLD_VERSION:
17579 {
17580 unsigned long i;
17581
17582 printf (_(" Version: "));
17583 for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
17584 printf ("%c", pnote->descdata[i]);
17585 printf ("\n");
17586 }
17587 break;
1449284b
NC
17588
17589 case NT_GNU_HWCAP:
17590 {
17591 unsigned long num_entries, mask;
17592
17593 /* Hardware capabilities information. Word 0 is the number of entries.
17594 Word 1 is a bitmask of enabled entries. The rest of the descriptor
17595 is a series of entries, where each entry is a single byte followed
17596 by a nul terminated string. The byte gives the bit number to test
17597 if enabled in the bitmask. */
17598 printf (_(" Hardware Capabilities: "));
17599 if (pnote->descsz < 8)
17600 {
32ec8896
NC
17601 error (_("<corrupt GNU_HWCAP>\n"));
17602 return FALSE;
1449284b
NC
17603 }
17604 num_entries = byte_get ((unsigned char *) pnote->descdata, 4);
17605 mask = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17606 printf (_("num entries: %ld, enabled mask: %lx\n"), num_entries, mask);
17607 /* FIXME: Add code to display the entries... */
17608 }
17609 break;
17610
9ef920e9 17611 case NT_GNU_PROPERTY_TYPE_0:
dda8d76d 17612 print_gnu_property_note (filedata, pnote);
9ef920e9
NC
17613 break;
17614
1449284b
NC
17615 default:
17616 /* Handle unrecognised types. An error message should have already been
17617 created by get_gnu_elf_note_type(), so all that we need to do is to
17618 display the data. */
17619 {
17620 unsigned long i;
17621
17622 printf (_(" Description data: "));
17623 for (i = 0; i < pnote->descsz; ++i)
17624 printf ("%02x ", pnote->descdata[i] & 0xff);
17625 printf ("\n");
17626 }
17627 break;
664f90a3
TT
17628 }
17629
32ec8896 17630 return TRUE;
664f90a3
TT
17631}
17632
685080f2
NC
17633static const char *
17634get_v850_elf_note_type (enum v850_notes n_type)
17635{
17636 static char buff[64];
17637
17638 switch (n_type)
17639 {
17640 case V850_NOTE_ALIGNMENT: return _("Alignment of 8-byte objects");
17641 case V850_NOTE_DATA_SIZE: return _("Sizeof double and long double");
17642 case V850_NOTE_FPU_INFO: return _("Type of FPU support needed");
17643 case V850_NOTE_SIMD_INFO: return _("Use of SIMD instructions");
17644 case V850_NOTE_CACHE_INFO: return _("Use of cache");
17645 case V850_NOTE_MMU_INFO: return _("Use of MMU");
17646 default:
17647 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
17648 return buff;
17649 }
17650}
17651
32ec8896 17652static bfd_boolean
685080f2
NC
17653print_v850_note (Elf_Internal_Note * pnote)
17654{
17655 unsigned int val;
17656
17657 if (pnote->descsz != 4)
32ec8896
NC
17658 return FALSE;
17659
685080f2
NC
17660 val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
17661
17662 if (val == 0)
17663 {
17664 printf (_("not set\n"));
32ec8896 17665 return TRUE;
685080f2
NC
17666 }
17667
17668 switch (pnote->type)
17669 {
17670 case V850_NOTE_ALIGNMENT:
17671 switch (val)
17672 {
32ec8896
NC
17673 case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return TRUE;
17674 case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return TRUE;
685080f2
NC
17675 }
17676 break;
14ae95f2 17677
685080f2
NC
17678 case V850_NOTE_DATA_SIZE:
17679 switch (val)
17680 {
32ec8896
NC
17681 case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return TRUE;
17682 case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return TRUE;
685080f2
NC
17683 }
17684 break;
14ae95f2 17685
685080f2
NC
17686 case V850_NOTE_FPU_INFO:
17687 switch (val)
17688 {
32ec8896
NC
17689 case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return TRUE;
17690 case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return TRUE;
685080f2
NC
17691 }
17692 break;
14ae95f2 17693
685080f2
NC
17694 case V850_NOTE_MMU_INFO:
17695 case V850_NOTE_CACHE_INFO:
17696 case V850_NOTE_SIMD_INFO:
17697 if (val == EF_RH850_SIMD)
17698 {
17699 printf (_("yes\n"));
32ec8896 17700 return TRUE;
685080f2
NC
17701 }
17702 break;
17703
17704 default:
17705 /* An 'unknown note type' message will already have been displayed. */
17706 break;
17707 }
17708
17709 printf (_("unknown value: %x\n"), val);
32ec8896 17710 return FALSE;
685080f2
NC
17711}
17712
32ec8896 17713static bfd_boolean
c6056a74
SF
17714process_netbsd_elf_note (Elf_Internal_Note * pnote)
17715{
17716 unsigned int version;
17717
17718 switch (pnote->type)
17719 {
17720 case NT_NETBSD_IDENT:
17721 version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
17722 if ((version / 10000) % 100)
17723 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
17724 version, version / 100000000, (version / 1000000) % 100,
17725 (version / 10000) % 100 > 26 ? "Z" : "",
15f205b1 17726 'A' + (version / 10000) % 26);
c6056a74
SF
17727 else
17728 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
17729 version, version / 100000000, (version / 1000000) % 100,
15f205b1 17730 (version / 100) % 100);
32ec8896 17731 return TRUE;
c6056a74
SF
17732
17733 case NT_NETBSD_MARCH:
17734 printf (" NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
17735 pnote->descdata);
32ec8896 17736 return TRUE;
c6056a74
SF
17737
17738 default:
32ec8896
NC
17739 printf (" NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
17740 pnote->type);
17741 return FALSE;
c6056a74 17742 }
c6056a74
SF
17743}
17744
f4ddf30f 17745static const char *
dda8d76d 17746get_freebsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
f4ddf30f 17747{
f4ddf30f
JB
17748 switch (e_type)
17749 {
17750 case NT_FREEBSD_THRMISC:
17751 return _("NT_THRMISC (thrmisc structure)");
17752 case NT_FREEBSD_PROCSTAT_PROC:
17753 return _("NT_PROCSTAT_PROC (proc data)");
17754 case NT_FREEBSD_PROCSTAT_FILES:
17755 return _("NT_PROCSTAT_FILES (files data)");
17756 case NT_FREEBSD_PROCSTAT_VMMAP:
17757 return _("NT_PROCSTAT_VMMAP (vmmap data)");
17758 case NT_FREEBSD_PROCSTAT_GROUPS:
17759 return _("NT_PROCSTAT_GROUPS (groups data)");
17760 case NT_FREEBSD_PROCSTAT_UMASK:
17761 return _("NT_PROCSTAT_UMASK (umask data)");
17762 case NT_FREEBSD_PROCSTAT_RLIMIT:
17763 return _("NT_PROCSTAT_RLIMIT (rlimit data)");
17764 case NT_FREEBSD_PROCSTAT_OSREL:
17765 return _("NT_PROCSTAT_OSREL (osreldate data)");
17766 case NT_FREEBSD_PROCSTAT_PSSTRINGS:
17767 return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
17768 case NT_FREEBSD_PROCSTAT_AUXV:
17769 return _("NT_PROCSTAT_AUXV (auxv data)");
0b9305ed
JB
17770 case NT_FREEBSD_PTLWPINFO:
17771 return _("NT_PTLWPINFO (ptrace_lwpinfo structure)");
f4ddf30f 17772 }
dda8d76d 17773 return get_note_type (filedata, e_type);
f4ddf30f
JB
17774}
17775
9437c45b 17776static const char *
dda8d76d 17777get_netbsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
9437c45b
JT
17778{
17779 static char buff[64];
17780
b4db1224 17781 if (e_type == NT_NETBSDCORE_PROCINFO)
dda8d76d 17782 return _("NetBSD procinfo structure");
9437c45b
JT
17783
17784 /* As of Jan 2002 there are no other machine-independent notes
17785 defined for NetBSD core files. If the note type is less
17786 than the start of the machine-dependent note types, we don't
17787 understand it. */
17788
b4db1224 17789 if (e_type < NT_NETBSDCORE_FIRSTMACH)
9437c45b 17790 {
e9e44622 17791 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
9437c45b
JT
17792 return buff;
17793 }
17794
dda8d76d 17795 switch (filedata->file_header.e_machine)
9437c45b
JT
17796 {
17797 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
17798 and PT_GETFPREGS == mach+2. */
17799
17800 case EM_OLD_ALPHA:
17801 case EM_ALPHA:
17802 case EM_SPARC:
17803 case EM_SPARC32PLUS:
17804 case EM_SPARCV9:
17805 switch (e_type)
17806 {
2b692964 17807 case NT_NETBSDCORE_FIRSTMACH + 0:
b4db1224 17808 return _("PT_GETREGS (reg structure)");
2b692964 17809 case NT_NETBSDCORE_FIRSTMACH + 2:
b4db1224 17810 return _("PT_GETFPREGS (fpreg structure)");
9437c45b
JT
17811 default:
17812 break;
17813 }
17814 break;
17815
17816 /* On all other arch's, PT_GETREGS == mach+1 and
17817 PT_GETFPREGS == mach+3. */
17818 default:
17819 switch (e_type)
17820 {
2b692964 17821 case NT_NETBSDCORE_FIRSTMACH + 1:
b4db1224 17822 return _("PT_GETREGS (reg structure)");
2b692964 17823 case NT_NETBSDCORE_FIRSTMACH + 3:
b4db1224 17824 return _("PT_GETFPREGS (fpreg structure)");
9437c45b
JT
17825 default:
17826 break;
17827 }
17828 }
17829
9cf03b7e 17830 snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
e9e44622 17831 e_type - NT_NETBSDCORE_FIRSTMACH);
9437c45b
JT
17832 return buff;
17833}
17834
70616151
TT
17835static const char *
17836get_stapsdt_note_type (unsigned e_type)
17837{
17838 static char buff[64];
17839
17840 switch (e_type)
17841 {
17842 case NT_STAPSDT:
17843 return _("NT_STAPSDT (SystemTap probe descriptors)");
17844
17845 default:
17846 break;
17847 }
17848
17849 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17850 return buff;
17851}
17852
32ec8896 17853static bfd_boolean
c6a9fc58
TT
17854print_stapsdt_note (Elf_Internal_Note *pnote)
17855{
17856 int addr_size = is_32bit_elf ? 4 : 8;
17857 char *data = pnote->descdata;
17858 char *data_end = pnote->descdata + pnote->descsz;
17859 bfd_vma pc, base_addr, semaphore;
17860 char *provider, *probe, *arg_fmt;
17861
17862 pc = byte_get ((unsigned char *) data, addr_size);
17863 data += addr_size;
17864 base_addr = byte_get ((unsigned char *) data, addr_size);
17865 data += addr_size;
17866 semaphore = byte_get ((unsigned char *) data, addr_size);
17867 data += addr_size;
17868
17869 provider = data;
17870 data += strlen (data) + 1;
17871 probe = data;
17872 data += strlen (data) + 1;
17873 arg_fmt = data;
17874 data += strlen (data) + 1;
17875
17876 printf (_(" Provider: %s\n"), provider);
17877 printf (_(" Name: %s\n"), probe);
17878 printf (_(" Location: "));
17879 print_vma (pc, FULL_HEX);
17880 printf (_(", Base: "));
17881 print_vma (base_addr, FULL_HEX);
17882 printf (_(", Semaphore: "));
17883 print_vma (semaphore, FULL_HEX);
9cf03b7e 17884 printf ("\n");
c6a9fc58
TT
17885 printf (_(" Arguments: %s\n"), arg_fmt);
17886
17887 return data == data_end;
17888}
17889
00e98fc7
TG
17890static const char *
17891get_ia64_vms_note_type (unsigned e_type)
17892{
17893 static char buff[64];
17894
17895 switch (e_type)
17896 {
17897 case NT_VMS_MHD:
17898 return _("NT_VMS_MHD (module header)");
17899 case NT_VMS_LNM:
17900 return _("NT_VMS_LNM (language name)");
17901 case NT_VMS_SRC:
17902 return _("NT_VMS_SRC (source files)");
17903 case NT_VMS_TITLE:
9cf03b7e 17904 return "NT_VMS_TITLE";
00e98fc7
TG
17905 case NT_VMS_EIDC:
17906 return _("NT_VMS_EIDC (consistency check)");
17907 case NT_VMS_FPMODE:
17908 return _("NT_VMS_FPMODE (FP mode)");
17909 case NT_VMS_LINKTIME:
9cf03b7e 17910 return "NT_VMS_LINKTIME";
00e98fc7
TG
17911 case NT_VMS_IMGNAM:
17912 return _("NT_VMS_IMGNAM (image name)");
17913 case NT_VMS_IMGID:
17914 return _("NT_VMS_IMGID (image id)");
17915 case NT_VMS_LINKID:
17916 return _("NT_VMS_LINKID (link id)");
17917 case NT_VMS_IMGBID:
17918 return _("NT_VMS_IMGBID (build id)");
17919 case NT_VMS_GSTNAM:
17920 return _("NT_VMS_GSTNAM (sym table name)");
17921 case NT_VMS_ORIG_DYN:
9cf03b7e 17922 return "NT_VMS_ORIG_DYN";
00e98fc7 17923 case NT_VMS_PATCHTIME:
9cf03b7e 17924 return "NT_VMS_PATCHTIME";
00e98fc7
TG
17925 default:
17926 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17927 return buff;
17928 }
17929}
17930
32ec8896 17931static bfd_boolean
00e98fc7
TG
17932print_ia64_vms_note (Elf_Internal_Note * pnote)
17933{
17934 switch (pnote->type)
17935 {
17936 case NT_VMS_MHD:
17937 if (pnote->descsz > 36)
17938 {
17939 size_t l = strlen (pnote->descdata + 34);
17940 printf (_(" Creation date : %.17s\n"), pnote->descdata);
17941 printf (_(" Last patch date: %.17s\n"), pnote->descdata + 17);
17942 printf (_(" Module name : %s\n"), pnote->descdata + 34);
17943 printf (_(" Module version : %s\n"), pnote->descdata + 34 + l + 1);
17944 }
17945 else
17946 printf (_(" Invalid size\n"));
17947 break;
17948 case NT_VMS_LNM:
17949 printf (_(" Language: %s\n"), pnote->descdata);
17950 break;
17951#ifdef BFD64
17952 case NT_VMS_FPMODE:
9cf03b7e 17953 printf (_(" Floating Point mode: "));
4a5cb34f 17954 printf ("0x%016" BFD_VMA_FMT "x\n",
948f632f 17955 (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
00e98fc7
TG
17956 break;
17957 case NT_VMS_LINKTIME:
17958 printf (_(" Link time: "));
17959 print_vms_time
17960 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
17961 printf ("\n");
17962 break;
17963 case NT_VMS_PATCHTIME:
17964 printf (_(" Patch time: "));
17965 print_vms_time
17966 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
17967 printf ("\n");
17968 break;
17969 case NT_VMS_ORIG_DYN:
17970 printf (_(" Major id: %u, minor id: %u\n"),
17971 (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
17972 (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
9cf03b7e 17973 printf (_(" Last modified : "));
00e98fc7
TG
17974 print_vms_time
17975 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
9cf03b7e 17976 printf (_("\n Link flags : "));
4a5cb34f 17977 printf ("0x%016" BFD_VMA_FMT "x\n",
948f632f 17978 (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
00e98fc7 17979 printf (_(" Header flags: 0x%08x\n"),
948f632f 17980 (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
00e98fc7
TG
17981 printf (_(" Image id : %s\n"), pnote->descdata + 32);
17982 break;
17983#endif
17984 case NT_VMS_IMGNAM:
17985 printf (_(" Image name: %s\n"), pnote->descdata);
17986 break;
17987 case NT_VMS_GSTNAM:
17988 printf (_(" Global symbol table name: %s\n"), pnote->descdata);
17989 break;
17990 case NT_VMS_IMGID:
17991 printf (_(" Image id: %s\n"), pnote->descdata);
17992 break;
17993 case NT_VMS_LINKID:
17994 printf (_(" Linker id: %s\n"), pnote->descdata);
17995 break;
17996 default:
32ec8896 17997 return FALSE;
00e98fc7 17998 }
32ec8896 17999 return TRUE;
00e98fc7
TG
18000}
18001
6f156d7a
NC
18002/* Find the symbol associated with a build attribute that is attached
18003 to address OFFSET. If PNAME is non-NULL then store the name of
18004 the symbol (if found) in the provided pointer, Returns NULL if a
18005 symbol could not be found. */
c799a79d 18006
6f156d7a
NC
18007static Elf_Internal_Sym *
18008get_symbol_for_build_attribute (Filedata * filedata,
18009 unsigned long offset,
18010 bfd_boolean is_open_attr,
18011 const char ** pname)
9ef920e9 18012{
dda8d76d 18013 static Filedata * saved_filedata = NULL;
c799a79d
NC
18014 static char * strtab;
18015 static unsigned long strtablen;
18016 static Elf_Internal_Sym * symtab;
18017 static unsigned long nsyms;
7296a62a
NC
18018 Elf_Internal_Sym * saved_sym = NULL;
18019 Elf_Internal_Sym * sym;
9ef920e9 18020
dda8d76d
NC
18021 if (filedata->section_headers != NULL
18022 && (saved_filedata == NULL || filedata != saved_filedata))
9ef920e9 18023 {
c799a79d 18024 Elf_Internal_Shdr * symsec;
9ef920e9 18025
c799a79d 18026 /* Load the symbol and string sections. */
dda8d76d
NC
18027 for (symsec = filedata->section_headers;
18028 symsec < filedata->section_headers + filedata->file_header.e_shnum;
c799a79d 18029 symsec ++)
9ef920e9 18030 {
c799a79d 18031 if (symsec->sh_type == SHT_SYMTAB)
9ef920e9 18032 {
dda8d76d 18033 symtab = GET_ELF_SYMBOLS (filedata, symsec, & nsyms);
9ef920e9 18034
dda8d76d 18035 if (symsec->sh_link < filedata->file_header.e_shnum)
c799a79d 18036 {
dda8d76d 18037 Elf_Internal_Shdr * strtab_sec = filedata->section_headers + symsec->sh_link;
c799a79d 18038
dda8d76d 18039 strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
c799a79d
NC
18040 1, strtab_sec->sh_size,
18041 _("string table"));
18042 strtablen = strtab != NULL ? strtab_sec->sh_size : 0;
18043 }
9ef920e9
NC
18044 }
18045 }
dda8d76d 18046 saved_filedata = filedata;
9ef920e9
NC
18047 }
18048
c799a79d 18049 if (symtab == NULL || strtab == NULL)
6f156d7a 18050 return NULL;
9ef920e9 18051
c799a79d
NC
18052 /* Find a symbol whose value matches offset. */
18053 for (sym = symtab; sym < symtab + nsyms; sym ++)
18054 if (sym->st_value == offset)
18055 {
18056 if (sym->st_name >= strtablen)
18057 /* Huh ? This should not happen. */
18058 continue;
9ef920e9 18059
c799a79d
NC
18060 if (strtab[sym->st_name] == 0)
18061 continue;
9ef920e9 18062
8fd75781
NC
18063 /* The AArch64 and ARM architectures define mapping symbols
18064 (eg $d, $x, $t) which we want to ignore. */
18065 if (strtab[sym->st_name] == '$'
18066 && strtab[sym->st_name + 1] != 0
18067 && strtab[sym->st_name + 2] == 0)
18068 continue;
18069
c799a79d
NC
18070 if (is_open_attr)
18071 {
18072 /* For OPEN attributes we prefer GLOBAL over LOCAL symbols
18073 and FILE or OBJECT symbols over NOTYPE symbols. We skip
18074 FUNC symbols entirely. */
18075 switch (ELF_ST_TYPE (sym->st_info))
18076 {
c799a79d 18077 case STT_OBJECT:
6f156d7a 18078 case STT_FILE:
c799a79d 18079 saved_sym = sym;
6f156d7a
NC
18080 if (sym->st_size)
18081 {
18082 /* If the symbol has a size associated
18083 with it then we can stop searching. */
18084 sym = symtab + nsyms;
18085 }
c799a79d 18086 continue;
9ef920e9 18087
c799a79d
NC
18088 case STT_FUNC:
18089 /* Ignore function symbols. */
18090 continue;
18091
18092 default:
18093 break;
18094 }
18095
18096 switch (ELF_ST_BIND (sym->st_info))
9ef920e9 18097 {
c799a79d
NC
18098 case STB_GLOBAL:
18099 if (saved_sym == NULL
18100 || ELF_ST_TYPE (saved_sym->st_info) != STT_OBJECT)
18101 saved_sym = sym;
18102 break;
c871dade 18103
c799a79d
NC
18104 case STB_LOCAL:
18105 if (saved_sym == NULL)
18106 saved_sym = sym;
18107 break;
18108
18109 default:
9ef920e9
NC
18110 break;
18111 }
18112 }
c799a79d
NC
18113 else
18114 {
18115 if (ELF_ST_TYPE (sym->st_info) != STT_FUNC)
18116 continue;
18117
18118 saved_sym = sym;
18119 break;
18120 }
18121 }
18122
6f156d7a
NC
18123 if (saved_sym && pname)
18124 * pname = strtab + saved_sym->st_name;
18125
18126 return saved_sym;
c799a79d
NC
18127}
18128
d20e98ab
NC
18129/* Returns true iff addr1 and addr2 are in the same section. */
18130
18131static bfd_boolean
18132same_section (Filedata * filedata, unsigned long addr1, unsigned long addr2)
18133{
18134 Elf_Internal_Shdr * a1;
18135 Elf_Internal_Shdr * a2;
18136
18137 a1 = find_section_by_address (filedata, addr1);
18138 a2 = find_section_by_address (filedata, addr2);
18139
18140 return a1 == a2 && a1 != NULL;
18141}
18142
c799a79d 18143static bfd_boolean
dda8d76d
NC
18144print_gnu_build_attribute_description (Elf_Internal_Note * pnote,
18145 Filedata * filedata)
c799a79d 18146{
6f156d7a
NC
18147 static unsigned long global_offset = 0;
18148 static unsigned long global_end = 0;
18149 static unsigned long func_offset = 0;
18150 static unsigned long func_end = 0;
c871dade 18151
6f156d7a
NC
18152 Elf_Internal_Sym * sym;
18153 const char * name;
18154 unsigned long start;
18155 unsigned long end;
18156 bfd_boolean is_open_attr = pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN;
18157
18158 switch (pnote->descsz)
c799a79d 18159 {
6f156d7a
NC
18160 case 0:
18161 /* A zero-length description means that the range of
18162 the previous note of the same type should be used. */
c799a79d 18163 if (is_open_attr)
c871dade 18164 {
6f156d7a
NC
18165 if (global_end > global_offset)
18166 printf (_(" Applies to region from %#lx to %#lx\n"),
18167 global_offset, global_end);
18168 else
18169 printf (_(" Applies to region from %#lx\n"), global_offset);
c799a79d
NC
18170 }
18171 else
18172 {
6f156d7a
NC
18173 if (func_end > func_offset)
18174 printf (_(" Applies to region from %#lx to %#lx\n"), func_offset, func_end);
18175 else
18176 printf (_(" Applies to region from %#lx\n"), func_offset);
c871dade 18177 }
6f156d7a 18178 return TRUE;
9ef920e9 18179
6f156d7a
NC
18180 case 4:
18181 start = byte_get ((unsigned char *) pnote->descdata, 4);
18182 end = 0;
18183 break;
18184
18185 case 8:
18186 if (is_32bit_elf)
18187 {
18188 /* FIXME: We should check that version 3+ notes are being used here... */
18189 start = byte_get ((unsigned char *) pnote->descdata, 4);
18190 end = byte_get ((unsigned char *) pnote->descdata + 4, 4);
18191 }
18192 else
18193 {
18194 start = byte_get ((unsigned char *) pnote->descdata, 8);
18195 end = 0;
18196 }
18197 break;
18198
18199 case 16:
18200 start = byte_get ((unsigned char *) pnote->descdata, 8);
18201 end = byte_get ((unsigned char *) pnote->descdata + 8, 8);
18202 break;
18203
18204 default:
c799a79d
NC
18205 error (_(" <invalid description size: %lx>\n"), pnote->descsz);
18206 printf (_(" <invalid descsz>"));
18207 return FALSE;
18208 }
18209
6f156d7a
NC
18210 name = NULL;
18211 sym = get_symbol_for_build_attribute (filedata, start, is_open_attr, & name);
8fd75781
NC
18212 /* As of version 5 of the annobin plugin, filename symbols are biased by 2
18213 in order to avoid them being confused with the start address of the
18214 first function in the file... */
18215 if (sym == NULL && is_open_attr)
18216 sym = get_symbol_for_build_attribute (filedata, start + 2, is_open_attr,
18217 & name);
6f156d7a
NC
18218
18219 if (end == 0 && sym != NULL && sym->st_size > 0)
18220 end = start + sym->st_size;
c799a79d
NC
18221
18222 if (is_open_attr)
18223 {
d20e98ab
NC
18224 /* FIXME: Need to properly allow for section alignment.
18225 16 is just the alignment used on x86_64. */
18226 if (global_end > 0
18227 && start > BFD_ALIGN (global_end, 16)
18228 /* Build notes are not guaranteed to be organised in order of
18229 increasing address, but we should find the all of the notes
18230 for one section in the same place. */
18231 && same_section (filedata, start, global_end))
6f156d7a
NC
18232 warn (_("Gap in build notes detected from %#lx to %#lx\n"),
18233 global_end + 1, start - 1);
18234
18235 printf (_(" Applies to region from %#lx"), start);
18236 global_offset = start;
18237
18238 if (end)
18239 {
18240 printf (_(" to %#lx"), end);
18241 global_end = end;
18242 }
c799a79d
NC
18243 }
18244 else
18245 {
6f156d7a
NC
18246 printf (_(" Applies to region from %#lx"), start);
18247 func_offset = start;
18248
18249 if (end)
18250 {
18251 printf (_(" to %#lx"), end);
18252 func_end = end;
18253 }
c799a79d
NC
18254 }
18255
6f156d7a
NC
18256 if (sym && name)
18257 printf (_(" (%s)"), name);
18258
18259 printf ("\n");
18260 return TRUE;
9ef920e9
NC
18261}
18262
18263static bfd_boolean
18264print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
18265{
1d15e434
NC
18266 static const char string_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_STRING, 0 };
18267 static const char number_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC, 0 };
18268 static const char bool_expected [3] = { GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE, GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE, 0 };
9ef920e9
NC
18269 char name_type;
18270 char name_attribute;
1d15e434 18271 const char * expected_types;
9ef920e9
NC
18272 const char * name = pnote->namedata;
18273 const char * text;
88305e1b 18274 signed int left;
9ef920e9
NC
18275
18276 if (name == NULL || pnote->namesz < 2)
18277 {
18278 error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
7296a62a 18279 print_symbol (-20, _(" <corrupt name>"));
9ef920e9
NC
18280 return FALSE;
18281 }
18282
6f156d7a
NC
18283 if (do_wide)
18284 left = 28;
18285 else
18286 left = 20;
88305e1b
NC
18287
18288 /* Version 2 of the spec adds a "GA" prefix to the name field. */
18289 if (name[0] == 'G' && name[1] == 'A')
18290 {
6f156d7a
NC
18291 if (pnote->namesz < 4)
18292 {
18293 error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
18294 print_symbol (-20, _(" <corrupt name>"));
18295 return FALSE;
18296 }
18297
88305e1b
NC
18298 printf ("GA");
18299 name += 2;
18300 left -= 2;
18301 }
18302
9ef920e9
NC
18303 switch ((name_type = * name))
18304 {
18305 case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
18306 case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
18307 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
18308 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
18309 printf ("%c", * name);
88305e1b 18310 left --;
9ef920e9
NC
18311 break;
18312 default:
18313 error (_("unrecognised attribute type in name field: %d\n"), name_type);
18314 print_symbol (-20, _("<unknown name type>"));
18315 return FALSE;
18316 }
18317
9ef920e9
NC
18318 ++ name;
18319 text = NULL;
18320
18321 switch ((name_attribute = * name))
18322 {
18323 case GNU_BUILD_ATTRIBUTE_VERSION:
18324 text = _("<version>");
1d15e434 18325 expected_types = string_expected;
9ef920e9
NC
18326 ++ name;
18327 break;
18328 case GNU_BUILD_ATTRIBUTE_STACK_PROT:
18329 text = _("<stack prot>");
75d7d298 18330 expected_types = "!+*";
9ef920e9
NC
18331 ++ name;
18332 break;
18333 case GNU_BUILD_ATTRIBUTE_RELRO:
18334 text = _("<relro>");
1d15e434 18335 expected_types = bool_expected;
9ef920e9
NC
18336 ++ name;
18337 break;
18338 case GNU_BUILD_ATTRIBUTE_STACK_SIZE:
18339 text = _("<stack size>");
1d15e434 18340 expected_types = number_expected;
9ef920e9
NC
18341 ++ name;
18342 break;
18343 case GNU_BUILD_ATTRIBUTE_TOOL:
18344 text = _("<tool>");
1d15e434 18345 expected_types = string_expected;
9ef920e9
NC
18346 ++ name;
18347 break;
18348 case GNU_BUILD_ATTRIBUTE_ABI:
18349 text = _("<ABI>");
18350 expected_types = "$*";
18351 ++ name;
18352 break;
18353 case GNU_BUILD_ATTRIBUTE_PIC:
18354 text = _("<PIC>");
1d15e434 18355 expected_types = number_expected;
9ef920e9
NC
18356 ++ name;
18357 break;
a8be5506
NC
18358 case GNU_BUILD_ATTRIBUTE_SHORT_ENUM:
18359 text = _("<short enum>");
1d15e434 18360 expected_types = bool_expected;
a8be5506
NC
18361 ++ name;
18362 break;
9ef920e9
NC
18363 default:
18364 if (ISPRINT (* name))
18365 {
18366 int len = strnlen (name, pnote->namesz - (name - pnote->namedata)) + 1;
18367
18368 if (len > left && ! do_wide)
18369 len = left;
75d7d298 18370 printf ("%.*s:", len, name);
9ef920e9 18371 left -= len;
0dd6ae21 18372 name += len;
9ef920e9
NC
18373 }
18374 else
18375 {
3e6b6445 18376 static char tmpbuf [128];
88305e1b 18377
3e6b6445
NC
18378 error (_("unrecognised byte in name field: %d\n"), * name);
18379 sprintf (tmpbuf, _("<unknown:_%d>"), * name);
18380 text = tmpbuf;
18381 name ++;
9ef920e9
NC
18382 }
18383 expected_types = "*$!+";
18384 break;
18385 }
18386
18387 if (text)
88305e1b 18388 left -= printf ("%s", text);
9ef920e9
NC
18389
18390 if (strchr (expected_types, name_type) == NULL)
75d7d298 18391 warn (_("attribute does not have an expected type (%c)\n"), name_type);
9ef920e9
NC
18392
18393 if ((unsigned long)(name - pnote->namedata) > pnote->namesz)
18394 {
18395 error (_("corrupt name field: namesz: %lu but parsing gets to %ld\n"),
18396 (unsigned long) pnote->namesz,
18397 (long) (name - pnote->namedata));
18398 return FALSE;
18399 }
18400
18401 if (left < 1 && ! do_wide)
18402 return TRUE;
18403
18404 switch (name_type)
18405 {
18406 case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
18407 {
b06b2c92 18408 unsigned int bytes;
ddef72cd
NC
18409 unsigned long long val = 0;
18410 unsigned int shift = 0;
18411 char * decoded = NULL;
18412
b06b2c92
NC
18413 bytes = pnote->namesz - (name - pnote->namedata);
18414 if (bytes > 0)
18415 /* The -1 is because the name field is always 0 terminated, and we
18416 want to be able to ensure that the shift in the while loop below
18417 will not overflow. */
18418 -- bytes;
18419
ddef72cd
NC
18420 if (bytes > sizeof (val))
18421 {
3e6b6445
NC
18422 error (_("corrupt numeric name field: too many bytes in the value: %x\n"),
18423 bytes);
18424 bytes = sizeof (val);
ddef72cd 18425 }
3e6b6445
NC
18426 /* We do not bother to warn if bytes == 0 as this can
18427 happen with some early versions of the gcc plugin. */
9ef920e9
NC
18428
18429 while (bytes --)
18430 {
79a964dc
NC
18431 unsigned long byte = (* name ++) & 0xff;
18432
18433 val |= byte << shift;
9ef920e9
NC
18434 shift += 8;
18435 }
18436
75d7d298 18437 switch (name_attribute)
9ef920e9 18438 {
75d7d298 18439 case GNU_BUILD_ATTRIBUTE_PIC:
9ef920e9
NC
18440 switch (val)
18441 {
75d7d298
NC
18442 case 0: decoded = "static"; break;
18443 case 1: decoded = "pic"; break;
18444 case 2: decoded = "PIC"; break;
18445 case 3: decoded = "pie"; break;
18446 case 4: decoded = "PIE"; break;
18447 default: break;
9ef920e9 18448 }
75d7d298
NC
18449 break;
18450 case GNU_BUILD_ATTRIBUTE_STACK_PROT:
18451 switch (val)
9ef920e9 18452 {
75d7d298
NC
18453 /* Based upon the SPCT_FLAG_xxx enum values in gcc/cfgexpand.c. */
18454 case 0: decoded = "off"; break;
18455 case 1: decoded = "on"; break;
18456 case 2: decoded = "all"; break;
18457 case 3: decoded = "strong"; break;
18458 case 4: decoded = "explicit"; break;
18459 default: break;
9ef920e9 18460 }
75d7d298
NC
18461 break;
18462 default:
18463 break;
9ef920e9
NC
18464 }
18465
75d7d298 18466 if (decoded != NULL)
3e6b6445
NC
18467 {
18468 print_symbol (-left, decoded);
18469 left = 0;
18470 }
18471 else if (val == 0)
18472 {
18473 printf ("0x0");
18474 left -= 3;
18475 }
9ef920e9 18476 else
75d7d298
NC
18477 {
18478 if (do_wide)
ddef72cd 18479 left -= printf ("0x%llx", val);
75d7d298 18480 else
ddef72cd 18481 left -= printf ("0x%-.*llx", left, val);
75d7d298 18482 }
9ef920e9
NC
18483 }
18484 break;
18485 case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
18486 left -= print_symbol (- left, name);
18487 break;
18488 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
18489 left -= print_symbol (- left, "true");
18490 break;
18491 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
18492 left -= print_symbol (- left, "false");
18493 break;
18494 }
18495
18496 if (do_wide && left > 0)
18497 printf ("%-*s", left, " ");
18498
18499 return TRUE;
18500}
18501
6d118b09
NC
18502/* Note that by the ELF standard, the name field is already null byte
18503 terminated, and namesz includes the terminating null byte.
18504 I.E. the value of namesz for the name "FSF" is 4.
18505
e3c8793a 18506 If the value of namesz is zero, there is no name present. */
9ef920e9 18507
32ec8896 18508static bfd_boolean
9ef920e9 18509process_note (Elf_Internal_Note * pnote,
dda8d76d 18510 Filedata * filedata)
779fe533 18511{
2cf0635d
NC
18512 const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
18513 const char * nt;
9437c45b
JT
18514
18515 if (pnote->namesz == 0)
1ec5cd37
NC
18516 /* If there is no note name, then use the default set of
18517 note type strings. */
dda8d76d 18518 nt = get_note_type (filedata, pnote->type);
1ec5cd37 18519
1118d252
RM
18520 else if (const_strneq (pnote->namedata, "GNU"))
18521 /* GNU-specific object file notes. */
18522 nt = get_gnu_elf_note_type (pnote->type);
f4ddf30f
JB
18523
18524 else if (const_strneq (pnote->namedata, "FreeBSD"))
18525 /* FreeBSD-specific core file notes. */
dda8d76d 18526 nt = get_freebsd_elfcore_note_type (filedata, pnote->type);
1118d252 18527
0112cd26 18528 else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
1ec5cd37 18529 /* NetBSD-specific core file notes. */
dda8d76d 18530 nt = get_netbsd_elfcore_note_type (filedata, pnote->type);
1ec5cd37 18531
c6056a74
SF
18532 else if (const_strneq (pnote->namedata, "NetBSD"))
18533 /* NetBSD-specific core file notes. */
18534 return process_netbsd_elf_note (pnote);
18535
b15fa79e
AM
18536 else if (strneq (pnote->namedata, "SPU/", 4))
18537 {
18538 /* SPU-specific core file notes. */
18539 nt = pnote->namedata + 4;
18540 name = "SPU";
18541 }
18542
00e98fc7
TG
18543 else if (const_strneq (pnote->namedata, "IPF/VMS"))
18544 /* VMS/ia64-specific file notes. */
18545 nt = get_ia64_vms_note_type (pnote->type);
18546
70616151
TT
18547 else if (const_strneq (pnote->namedata, "stapsdt"))
18548 nt = get_stapsdt_note_type (pnote->type);
18549
9437c45b 18550 else
1ec5cd37
NC
18551 /* Don't recognize this note name; just use the default set of
18552 note type strings. */
dda8d76d 18553 nt = get_note_type (filedata, pnote->type);
9437c45b 18554
1449284b 18555 printf (" ");
9ef920e9 18556
483767a3
AM
18557 if (((const_strneq (pnote->namedata, "GA")
18558 && strchr ("*$!+", pnote->namedata[2]) != NULL)
18559 || strchr ("*$!+", pnote->namedata[0]) != NULL)
18560 && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
18561 || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
9ef920e9
NC
18562 print_gnu_build_attribute_name (pnote);
18563 else
18564 print_symbol (-20, name);
18565
18566 if (do_wide)
18567 printf (" 0x%08lx\t%s\t", pnote->descsz, nt);
18568 else
18569 printf (" 0x%08lx\t%s\n", pnote->descsz, nt);
00e98fc7
TG
18570
18571 if (const_strneq (pnote->namedata, "IPF/VMS"))
18572 return print_ia64_vms_note (pnote);
664f90a3 18573 else if (const_strneq (pnote->namedata, "GNU"))
dda8d76d 18574 return print_gnu_note (filedata, pnote);
c6a9fc58
TT
18575 else if (const_strneq (pnote->namedata, "stapsdt"))
18576 return print_stapsdt_note (pnote);
9ece1fa9
TT
18577 else if (const_strneq (pnote->namedata, "CORE"))
18578 return print_core_note (pnote);
483767a3
AM
18579 else if (((const_strneq (pnote->namedata, "GA")
18580 && strchr ("*$!+", pnote->namedata[2]) != NULL)
18581 || strchr ("*$!+", pnote->namedata[0]) != NULL)
18582 && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
18583 || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
dda8d76d 18584 return print_gnu_build_attribute_description (pnote, filedata);
779fe533 18585
9ef920e9 18586 if (pnote->descsz)
1449284b
NC
18587 {
18588 unsigned long i;
18589
18590 printf (_(" description data: "));
18591 for (i = 0; i < pnote->descsz; i++)
18592 printf ("%02x ", pnote->descdata[i]);
04ac15ab
AS
18593 if (!do_wide)
18594 printf ("\n");
1449284b
NC
18595 }
18596
9ef920e9
NC
18597 if (do_wide)
18598 printf ("\n");
18599
32ec8896 18600 return TRUE;
1449284b 18601}
6d118b09 18602
32ec8896 18603static bfd_boolean
dda8d76d
NC
18604process_notes_at (Filedata * filedata,
18605 Elf_Internal_Shdr * section,
18606 bfd_vma offset,
82ed9683
L
18607 bfd_vma length,
18608 bfd_vma align)
779fe533 18609{
2cf0635d
NC
18610 Elf_External_Note * pnotes;
18611 Elf_External_Note * external;
4dff97b2
NC
18612 char * end;
18613 bfd_boolean res = TRUE;
103f02d3 18614
779fe533 18615 if (length <= 0)
32ec8896 18616 return FALSE;
103f02d3 18617
1449284b
NC
18618 if (section)
18619 {
dda8d76d 18620 pnotes = (Elf_External_Note *) get_section_contents (section, filedata);
1449284b 18621 if (pnotes)
32ec8896 18622 {
dda8d76d 18623 if (! apply_relocations (filedata, section, (unsigned char *) pnotes, length, NULL, NULL))
32ec8896
NC
18624 return FALSE;
18625 }
1449284b
NC
18626 }
18627 else
82ed9683 18628 pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
1449284b 18629 _("notes"));
4dff97b2 18630
dd24e3da 18631 if (pnotes == NULL)
32ec8896 18632 return FALSE;
779fe533 18633
103f02d3 18634 external = pnotes;
103f02d3 18635
1449284b 18636 if (section)
dda8d76d 18637 printf (_("\nDisplaying notes found in: %s\n"), printable_section_name (filedata, section));
1449284b
NC
18638 else
18639 printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
18640 (unsigned long) offset, (unsigned long) length);
18641
82ed9683
L
18642 /* NB: Some note sections may have alignment value of 0 or 1. gABI
18643 specifies that notes should be aligned to 4 bytes in 32-bit
18644 objects and to 8 bytes in 64-bit objects. As a Linux extension,
18645 we also support 4 byte alignment in 64-bit objects. If section
18646 alignment is less than 4, we treate alignment as 4 bytes. */
18647 if (align < 4)
18648 align = 4;
18649 else if (align != 4 && align != 8)
18650 {
18651 warn (_("Corrupt note: alignment %ld, expecting 4 or 8\n"),
18652 (long) align);
18653 return FALSE;
18654 }
18655
2aee03ae 18656 printf (_(" %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
103f02d3 18657
c8071705
NC
18658 end = (char *) pnotes + length;
18659 while ((char *) external < end)
779fe533 18660 {
b34976b6 18661 Elf_Internal_Note inote;
15b42fb0 18662 size_t min_notesz;
4dff97b2 18663 char * next;
2cf0635d 18664 char * temp = NULL;
c8071705 18665 size_t data_remaining = end - (char *) external;
6d118b09 18666
dda8d76d 18667 if (!is_ia64_vms (filedata))
15b42fb0 18668 {
9dd3a467
NC
18669 /* PR binutils/15191
18670 Make sure that there is enough data to read. */
15b42fb0
AM
18671 min_notesz = offsetof (Elf_External_Note, name);
18672 if (data_remaining < min_notesz)
9dd3a467 18673 {
d3a49aa8
AM
18674 warn (ngettext ("Corrupt note: only %ld byte remains, "
18675 "not enough for a full note\n",
18676 "Corrupt note: only %ld bytes remain, "
18677 "not enough for a full note\n",
18678 data_remaining),
18679 (long) data_remaining);
9dd3a467
NC
18680 break;
18681 }
5396a86e
AM
18682 data_remaining -= min_notesz;
18683
15b42fb0
AM
18684 inote.type = BYTE_GET (external->type);
18685 inote.namesz = BYTE_GET (external->namesz);
18686 inote.namedata = external->name;
18687 inote.descsz = BYTE_GET (external->descsz);
276da9b3 18688 inote.descdata = ((char *) external
4dff97b2 18689 + ELF_NOTE_DESC_OFFSET (inote.namesz, align));
15b42fb0 18690 inote.descpos = offset + (inote.descdata - (char *) pnotes);
276da9b3 18691 next = ((char *) external
4dff97b2 18692 + ELF_NOTE_NEXT_OFFSET (inote.namesz, inote.descsz, align));
15b42fb0 18693 }
00e98fc7 18694 else
15b42fb0
AM
18695 {
18696 Elf64_External_VMS_Note *vms_external;
00e98fc7 18697
9dd3a467
NC
18698 /* PR binutils/15191
18699 Make sure that there is enough data to read. */
15b42fb0
AM
18700 min_notesz = offsetof (Elf64_External_VMS_Note, name);
18701 if (data_remaining < min_notesz)
9dd3a467 18702 {
d3a49aa8
AM
18703 warn (ngettext ("Corrupt note: only %ld byte remains, "
18704 "not enough for a full note\n",
18705 "Corrupt note: only %ld bytes remain, "
18706 "not enough for a full note\n",
18707 data_remaining),
18708 (long) data_remaining);
9dd3a467
NC
18709 break;
18710 }
5396a86e 18711 data_remaining -= min_notesz;
3e55a963 18712
15b42fb0
AM
18713 vms_external = (Elf64_External_VMS_Note *) external;
18714 inote.type = BYTE_GET (vms_external->type);
18715 inote.namesz = BYTE_GET (vms_external->namesz);
18716 inote.namedata = vms_external->name;
18717 inote.descsz = BYTE_GET (vms_external->descsz);
18718 inote.descdata = inote.namedata + align_power (inote.namesz, 3);
18719 inote.descpos = offset + (inote.descdata - (char *) pnotes);
18720 next = inote.descdata + align_power (inote.descsz, 3);
18721 }
18722
5396a86e
AM
18723 /* PR 17531: file: 3443835e. */
18724 /* PR 17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4. */
18725 if ((size_t) (inote.descdata - inote.namedata) < inote.namesz
18726 || (size_t) (inote.descdata - inote.namedata) > data_remaining
18727 || (size_t) (next - inote.descdata) < inote.descsz
18728 || ((size_t) (next - inote.descdata)
18729 > data_remaining - (size_t) (inote.descdata - inote.namedata)))
3e55a963 18730 {
15b42fb0 18731 warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
0af1713e 18732 (unsigned long) ((char *) external - (char *) pnotes));
4dff97b2
NC
18733 warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx, alignment: %u\n"),
18734 inote.type, inote.namesz, inote.descsz, (int) align);
3e55a963
NC
18735 break;
18736 }
18737
15b42fb0 18738 external = (Elf_External_Note *) next;
dd24e3da 18739
6d118b09
NC
18740 /* Verify that name is null terminated. It appears that at least
18741 one version of Linux (RedHat 6.0) generates corefiles that don't
18742 comply with the ELF spec by failing to include the null byte in
18743 namesz. */
8b971f9f 18744 if (inote.namedata[inote.namesz - 1] != '\0')
6d118b09 18745 {
5396a86e 18746 if ((size_t) (inote.descdata - inote.namedata) == inote.namesz)
6d118b09 18747 {
5396a86e
AM
18748 temp = (char *) malloc (inote.namesz + 1);
18749 if (temp == NULL)
18750 {
18751 error (_("Out of memory allocating space for inote name\n"));
18752 res = FALSE;
18753 break;
18754 }
76da6bbe 18755
5396a86e
AM
18756 memcpy (temp, inote.namedata, inote.namesz);
18757 inote.namedata = temp;
18758 }
18759 inote.namedata[inote.namesz] = 0;
6d118b09
NC
18760 }
18761
dda8d76d 18762 if (! process_note (& inote, filedata))
6b4bf3bc 18763 res = FALSE;
103f02d3 18764
6d118b09
NC
18765 if (temp != NULL)
18766 {
18767 free (temp);
18768 temp = NULL;
18769 }
779fe533
NC
18770 }
18771
18772 free (pnotes);
103f02d3 18773
779fe533
NC
18774 return res;
18775}
18776
32ec8896 18777static bfd_boolean
dda8d76d 18778process_corefile_note_segments (Filedata * filedata)
779fe533 18779{
2cf0635d 18780 Elf_Internal_Phdr * segment;
b34976b6 18781 unsigned int i;
32ec8896 18782 bfd_boolean res = TRUE;
103f02d3 18783
dda8d76d 18784 if (! get_program_headers (filedata))
6b4bf3bc 18785 return TRUE;
103f02d3 18786
dda8d76d
NC
18787 for (i = 0, segment = filedata->program_headers;
18788 i < filedata->file_header.e_phnum;
b34976b6 18789 i++, segment++)
779fe533
NC
18790 {
18791 if (segment->p_type == PT_NOTE)
dda8d76d 18792 if (! process_notes_at (filedata, NULL,
32ec8896 18793 (bfd_vma) segment->p_offset,
82ed9683
L
18794 (bfd_vma) segment->p_filesz,
18795 (bfd_vma) segment->p_align))
32ec8896 18796 res = FALSE;
779fe533 18797 }
103f02d3 18798
779fe533
NC
18799 return res;
18800}
18801
32ec8896 18802static bfd_boolean
dda8d76d 18803process_v850_notes (Filedata * filedata, bfd_vma offset, bfd_vma length)
685080f2
NC
18804{
18805 Elf_External_Note * pnotes;
18806 Elf_External_Note * external;
c8071705 18807 char * end;
32ec8896 18808 bfd_boolean res = TRUE;
685080f2
NC
18809
18810 if (length <= 0)
32ec8896 18811 return FALSE;
685080f2 18812
dda8d76d 18813 pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
685080f2
NC
18814 _("v850 notes"));
18815 if (pnotes == NULL)
32ec8896 18816 return FALSE;
685080f2
NC
18817
18818 external = pnotes;
c8071705 18819 end = (char*) pnotes + length;
685080f2
NC
18820
18821 printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
18822 (unsigned long) offset, (unsigned long) length);
18823
c8071705 18824 while ((char *) external + sizeof (Elf_External_Note) < end)
685080f2
NC
18825 {
18826 Elf_External_Note * next;
18827 Elf_Internal_Note inote;
18828
18829 inote.type = BYTE_GET (external->type);
18830 inote.namesz = BYTE_GET (external->namesz);
18831 inote.namedata = external->name;
18832 inote.descsz = BYTE_GET (external->descsz);
18833 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
18834 inote.descpos = offset + (inote.descdata - (char *) pnotes);
18835
c8071705
NC
18836 if (inote.descdata < (char *) pnotes || inote.descdata >= end)
18837 {
18838 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
18839 inote.descdata = inote.namedata;
18840 inote.namesz = 0;
18841 }
18842
685080f2
NC
18843 next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
18844
c8071705 18845 if ( ((char *) next > end)
685080f2
NC
18846 || ((char *) next < (char *) pnotes))
18847 {
18848 warn (_("corrupt descsz found in note at offset 0x%lx\n"),
18849 (unsigned long) ((char *) external - (char *) pnotes));
18850 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
18851 inote.type, inote.namesz, inote.descsz);
18852 break;
18853 }
18854
18855 external = next;
18856
18857 /* Prevent out-of-bounds indexing. */
c8071705 18858 if ( inote.namedata + inote.namesz > end
685080f2
NC
18859 || inote.namedata + inote.namesz < inote.namedata)
18860 {
18861 warn (_("corrupt namesz found in note at offset 0x%lx\n"),
18862 (unsigned long) ((char *) external - (char *) pnotes));
18863 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
18864 inote.type, inote.namesz, inote.descsz);
18865 break;
18866 }
18867
18868 printf (" %s: ", get_v850_elf_note_type (inote.type));
18869
18870 if (! print_v850_note (& inote))
18871 {
32ec8896 18872 res = FALSE;
685080f2
NC
18873 printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
18874 inote.namesz, inote.descsz);
18875 }
18876 }
18877
18878 free (pnotes);
18879
18880 return res;
18881}
18882
32ec8896 18883static bfd_boolean
dda8d76d 18884process_note_sections (Filedata * filedata)
1ec5cd37 18885{
2cf0635d 18886 Elf_Internal_Shdr * section;
1ec5cd37 18887 unsigned long i;
32ec8896
NC
18888 unsigned int n = 0;
18889 bfd_boolean res = TRUE;
1ec5cd37 18890
dda8d76d
NC
18891 for (i = 0, section = filedata->section_headers;
18892 i < filedata->file_header.e_shnum && section != NULL;
1ec5cd37 18893 i++, section++)
685080f2
NC
18894 {
18895 if (section->sh_type == SHT_NOTE)
18896 {
dda8d76d 18897 if (! process_notes_at (filedata, section,
32ec8896 18898 (bfd_vma) section->sh_offset,
82ed9683
L
18899 (bfd_vma) section->sh_size,
18900 (bfd_vma) section->sh_addralign))
32ec8896 18901 res = FALSE;
685080f2
NC
18902 n++;
18903 }
18904
dda8d76d
NC
18905 if (( filedata->file_header.e_machine == EM_V800
18906 || filedata->file_header.e_machine == EM_V850
18907 || filedata->file_header.e_machine == EM_CYGNUS_V850)
685080f2
NC
18908 && section->sh_type == SHT_RENESAS_INFO)
18909 {
dda8d76d 18910 if (! process_v850_notes (filedata,
32ec8896
NC
18911 (bfd_vma) section->sh_offset,
18912 (bfd_vma) section->sh_size))
18913 res = FALSE;
685080f2
NC
18914 n++;
18915 }
18916 }
df565f32
NC
18917
18918 if (n == 0)
18919 /* Try processing NOTE segments instead. */
dda8d76d 18920 return process_corefile_note_segments (filedata);
1ec5cd37
NC
18921
18922 return res;
18923}
18924
32ec8896 18925static bfd_boolean
dda8d76d 18926process_notes (Filedata * filedata)
779fe533
NC
18927{
18928 /* If we have not been asked to display the notes then do nothing. */
18929 if (! do_notes)
32ec8896 18930 return TRUE;
103f02d3 18931
dda8d76d
NC
18932 if (filedata->file_header.e_type != ET_CORE)
18933 return process_note_sections (filedata);
103f02d3 18934
779fe533 18935 /* No program headers means no NOTE segment. */
dda8d76d
NC
18936 if (filedata->file_header.e_phnum > 0)
18937 return process_corefile_note_segments (filedata);
779fe533 18938
1ec5cd37 18939 printf (_("No note segments present in the core file.\n"));
32ec8896 18940 return TRUE;
779fe533
NC
18941}
18942
60abdbed
NC
18943static unsigned char *
18944display_public_gnu_attributes (unsigned char * start,
18945 const unsigned char * const end)
18946{
18947 printf (_(" Unknown GNU attribute: %s\n"), start);
18948
18949 start += strnlen ((char *) start, end - start);
18950 display_raw_attribute (start, end);
18951
18952 return (unsigned char *) end;
18953}
18954
18955static unsigned char *
18956display_generic_attribute (unsigned char * start,
18957 unsigned int tag,
18958 const unsigned char * const end)
18959{
18960 if (tag == 0)
18961 return (unsigned char *) end;
18962
18963 return display_tag_value (tag, start, end);
18964}
18965
32ec8896 18966static bfd_boolean
dda8d76d 18967process_arch_specific (Filedata * filedata)
252b5132 18968{
a952a375 18969 if (! do_arch)
32ec8896 18970 return TRUE;
a952a375 18971
dda8d76d 18972 switch (filedata->file_header.e_machine)
252b5132 18973 {
53a346d8
CZ
18974 case EM_ARC:
18975 case EM_ARC_COMPACT:
18976 case EM_ARC_COMPACT2:
dda8d76d 18977 return process_attributes (filedata, "ARC", SHT_ARC_ATTRIBUTES,
53a346d8
CZ
18978 display_arc_attribute,
18979 display_generic_attribute);
11c1ff18 18980 case EM_ARM:
dda8d76d 18981 return process_attributes (filedata, "aeabi", SHT_ARM_ATTRIBUTES,
60abdbed
NC
18982 display_arm_attribute,
18983 display_generic_attribute);
18984
252b5132 18985 case EM_MIPS:
4fe85591 18986 case EM_MIPS_RS3_LE:
dda8d76d 18987 return process_mips_specific (filedata);
60abdbed
NC
18988
18989 case EM_MSP430:
dda8d76d
NC
18990 return process_attributes (filedata, "mspabi", SHT_MSP430_ATTRIBUTES,
18991 display_msp430x_attribute,
18992 display_generic_attribute);
60abdbed 18993
2dc8dd17
JW
18994 case EM_RISCV:
18995 return process_attributes (filedata, "riscv", SHT_RISCV_ATTRIBUTES,
18996 display_riscv_attribute,
18997 display_generic_attribute);
18998
35c08157 18999 case EM_NDS32:
dda8d76d 19000 return process_nds32_specific (filedata);
60abdbed 19001
34c8bcba 19002 case EM_PPC:
b82317dd 19003 case EM_PPC64:
dda8d76d 19004 return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
60abdbed
NC
19005 display_power_gnu_attribute);
19006
643f7afb
AK
19007 case EM_S390:
19008 case EM_S390_OLD:
dda8d76d 19009 return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
60abdbed
NC
19010 display_s390_gnu_attribute);
19011
9e8c70f9
DM
19012 case EM_SPARC:
19013 case EM_SPARC32PLUS:
19014 case EM_SPARCV9:
dda8d76d 19015 return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
60abdbed
NC
19016 display_sparc_gnu_attribute);
19017
59e6276b 19018 case EM_TI_C6000:
dda8d76d 19019 return process_attributes (filedata, "c6xabi", SHT_C6000_ATTRIBUTES,
60abdbed
NC
19020 display_tic6x_attribute,
19021 display_generic_attribute);
19022
252b5132 19023 default:
dda8d76d 19024 return process_attributes (filedata, "gnu", SHT_GNU_ATTRIBUTES,
60abdbed
NC
19025 display_public_gnu_attributes,
19026 display_generic_attribute);
252b5132 19027 }
252b5132
RH
19028}
19029
32ec8896 19030static bfd_boolean
dda8d76d 19031get_file_header (Filedata * filedata)
252b5132 19032{
9ea033b2 19033 /* Read in the identity array. */
dda8d76d 19034 if (fread (filedata->file_header.e_ident, EI_NIDENT, 1, filedata->handle) != 1)
32ec8896 19035 return FALSE;
252b5132 19036
9ea033b2 19037 /* Determine how to read the rest of the header. */
dda8d76d 19038 switch (filedata->file_header.e_ident[EI_DATA])
9ea033b2 19039 {
1a0670f3
AM
19040 default:
19041 case ELFDATANONE:
adab8cdc
AO
19042 case ELFDATA2LSB:
19043 byte_get = byte_get_little_endian;
19044 byte_put = byte_put_little_endian;
19045 break;
19046 case ELFDATA2MSB:
19047 byte_get = byte_get_big_endian;
19048 byte_put = byte_put_big_endian;
19049 break;
9ea033b2
NC
19050 }
19051
19052 /* For now we only support 32 bit and 64 bit ELF files. */
dda8d76d 19053 is_32bit_elf = (filedata->file_header.e_ident[EI_CLASS] != ELFCLASS64);
9ea033b2
NC
19054
19055 /* Read in the rest of the header. */
19056 if (is_32bit_elf)
19057 {
19058 Elf32_External_Ehdr ehdr32;
252b5132 19059
dda8d76d 19060 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, filedata->handle) != 1)
32ec8896 19061 return FALSE;
103f02d3 19062
dda8d76d
NC
19063 filedata->file_header.e_type = BYTE_GET (ehdr32.e_type);
19064 filedata->file_header.e_machine = BYTE_GET (ehdr32.e_machine);
19065 filedata->file_header.e_version = BYTE_GET (ehdr32.e_version);
19066 filedata->file_header.e_entry = BYTE_GET (ehdr32.e_entry);
19067 filedata->file_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
19068 filedata->file_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
19069 filedata->file_header.e_flags = BYTE_GET (ehdr32.e_flags);
19070 filedata->file_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
19071 filedata->file_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
19072 filedata->file_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
19073 filedata->file_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
19074 filedata->file_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
19075 filedata->file_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
9ea033b2 19076 }
252b5132 19077 else
9ea033b2
NC
19078 {
19079 Elf64_External_Ehdr ehdr64;
a952a375
NC
19080
19081 /* If we have been compiled with sizeof (bfd_vma) == 4, then
19082 we will not be able to cope with the 64bit data found in
19083 64 ELF files. Detect this now and abort before we start
50c2245b 19084 overwriting things. */
a952a375
NC
19085 if (sizeof (bfd_vma) < 8)
19086 {
e3c8793a
NC
19087 error (_("This instance of readelf has been built without support for a\n\
1908864 bit data type and so it cannot read 64 bit ELF files.\n"));
32ec8896 19089 return FALSE;
a952a375 19090 }
103f02d3 19091
dda8d76d 19092 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, filedata->handle) != 1)
32ec8896 19093 return FALSE;
103f02d3 19094
dda8d76d
NC
19095 filedata->file_header.e_type = BYTE_GET (ehdr64.e_type);
19096 filedata->file_header.e_machine = BYTE_GET (ehdr64.e_machine);
19097 filedata->file_header.e_version = BYTE_GET (ehdr64.e_version);
19098 filedata->file_header.e_entry = BYTE_GET (ehdr64.e_entry);
19099 filedata->file_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
19100 filedata->file_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
19101 filedata->file_header.e_flags = BYTE_GET (ehdr64.e_flags);
19102 filedata->file_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
19103 filedata->file_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
19104 filedata->file_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
19105 filedata->file_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
19106 filedata->file_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
19107 filedata->file_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
9ea033b2 19108 }
252b5132 19109
dda8d76d 19110 if (filedata->file_header.e_shoff)
7ece0d85
JJ
19111 {
19112 /* There may be some extensions in the first section header. Don't
19113 bomb if we can't read it. */
19114 if (is_32bit_elf)
dda8d76d 19115 get_32bit_section_headers (filedata, TRUE);
7ece0d85 19116 else
dda8d76d 19117 get_64bit_section_headers (filedata, TRUE);
7ece0d85 19118 }
560f3c1c 19119
32ec8896 19120 return TRUE;
252b5132
RH
19121}
19122
dda8d76d
NC
19123static void
19124close_file (Filedata * filedata)
19125{
19126 if (filedata)
19127 {
19128 if (filedata->handle)
19129 fclose (filedata->handle);
19130 free (filedata);
19131 }
19132}
19133
19134void
19135close_debug_file (void * data)
19136{
19137 close_file ((Filedata *) data);
19138}
19139
19140static Filedata *
19141open_file (const char * pathname)
19142{
19143 struct stat statbuf;
19144 Filedata * filedata = NULL;
19145
19146 if (stat (pathname, & statbuf) < 0
19147 || ! S_ISREG (statbuf.st_mode))
19148 goto fail;
19149
19150 filedata = calloc (1, sizeof * filedata);
19151 if (filedata == NULL)
19152 goto fail;
19153
19154 filedata->handle = fopen (pathname, "rb");
19155 if (filedata->handle == NULL)
19156 goto fail;
19157
19158 filedata->file_size = (bfd_size_type) statbuf.st_size;
19159 filedata->file_name = pathname;
19160
19161 if (! get_file_header (filedata))
19162 goto fail;
19163
19164 if (filedata->file_header.e_shoff)
19165 {
19166 bfd_boolean res;
19167
19168 /* Read the section headers again, this time for real. */
19169 if (is_32bit_elf)
19170 res = get_32bit_section_headers (filedata, FALSE);
19171 else
19172 res = get_64bit_section_headers (filedata, FALSE);
19173
19174 if (!res)
19175 goto fail;
19176 }
19177
19178 return filedata;
19179
19180 fail:
19181 if (filedata)
19182 {
19183 if (filedata->handle)
19184 fclose (filedata->handle);
19185 free (filedata);
19186 }
19187 return NULL;
19188}
19189
19190void *
19191open_debug_file (const char * pathname)
19192{
19193 return open_file (pathname);
19194}
19195
fb52b2f4
NC
19196/* Process one ELF object file according to the command line options.
19197 This file may actually be stored in an archive. The file is
32ec8896
NC
19198 positioned at the start of the ELF object. Returns TRUE if no
19199 problems were encountered, FALSE otherwise. */
fb52b2f4 19200
32ec8896 19201static bfd_boolean
dda8d76d 19202process_object (Filedata * filedata)
252b5132 19203{
dda8d76d 19204 Filedata * separates;
252b5132 19205 unsigned int i;
32ec8896 19206 bfd_boolean res = TRUE;
252b5132 19207
dda8d76d 19208 if (! get_file_header (filedata))
252b5132 19209 {
dda8d76d 19210 error (_("%s: Failed to read file header\n"), filedata->file_name);
32ec8896 19211 return FALSE;
252b5132
RH
19212 }
19213
19214 /* Initialise per file variables. */
60bca95a 19215 for (i = ARRAY_SIZE (version_info); i--;)
252b5132
RH
19216 version_info[i] = 0;
19217
60bca95a 19218 for (i = ARRAY_SIZE (dynamic_info); i--;)
252b5132 19219 dynamic_info[i] = 0;
5115b233 19220 dynamic_info_DT_GNU_HASH = 0;
252b5132
RH
19221
19222 /* Process the file. */
19223 if (show_name)
dda8d76d 19224 printf (_("\nFile: %s\n"), filedata->file_name);
252b5132 19225
18bd398b
NC
19226 /* Initialise the dump_sects array from the cmdline_dump_sects array.
19227 Note we do this even if cmdline_dump_sects is empty because we
19228 must make sure that the dump_sets array is zeroed out before each
19229 object file is processed. */
dda8d76d
NC
19230 if (filedata->num_dump_sects > cmdline.num_dump_sects)
19231 memset (filedata->dump_sects, 0, filedata->num_dump_sects * sizeof (* filedata->dump_sects));
18bd398b 19232
dda8d76d 19233 if (cmdline.num_dump_sects > 0)
18bd398b 19234 {
dda8d76d 19235 if (filedata->num_dump_sects == 0)
18bd398b 19236 /* A sneaky way of allocating the dump_sects array. */
dda8d76d 19237 request_dump_bynumber (filedata, cmdline.num_dump_sects, 0);
18bd398b 19238
dda8d76d
NC
19239 assert (filedata->num_dump_sects >= cmdline.num_dump_sects);
19240 memcpy (filedata->dump_sects, cmdline.dump_sects,
19241 cmdline.num_dump_sects * sizeof (* filedata->dump_sects));
18bd398b 19242 }
d70c5fc7 19243
dda8d76d 19244 if (! process_file_header (filedata))
32ec8896 19245 return FALSE;
252b5132 19246
dda8d76d 19247 if (! process_section_headers (filedata))
2f62977e 19248 {
32ec8896
NC
19249 /* Without loaded section headers we cannot process lots of things. */
19250 do_unwind = do_version = do_dump = do_arch = FALSE;
252b5132 19251
2f62977e 19252 if (! do_using_dynamic)
32ec8896 19253 do_syms = do_dyn_syms = do_reloc = FALSE;
2f62977e 19254 }
252b5132 19255
dda8d76d 19256 if (! process_section_groups (filedata))
32ec8896
NC
19257 /* Without loaded section groups we cannot process unwind. */
19258 do_unwind = FALSE;
d1f5c6e3 19259
dda8d76d
NC
19260 if (process_program_headers (filedata))
19261 process_dynamic_section (filedata);
32ec8896
NC
19262 else
19263 res = FALSE;
252b5132 19264
dda8d76d 19265 if (! process_relocs (filedata))
32ec8896 19266 res = FALSE;
252b5132 19267
dda8d76d 19268 if (! process_unwind (filedata))
32ec8896 19269 res = FALSE;
4d6ed7c8 19270
dda8d76d 19271 if (! process_symbol_table (filedata))
32ec8896 19272 res = FALSE;
252b5132 19273
dda8d76d 19274 if (! process_syminfo (filedata))
32ec8896 19275 res = FALSE;
252b5132 19276
dda8d76d 19277 if (! process_version_sections (filedata))
32ec8896 19278 res = FALSE;
252b5132 19279
82ed9683
L
19280 if (filedata->file_header.e_shstrndx != SHN_UNDEF)
19281 separates = load_separate_debug_file (filedata, filedata->file_name);
19282 else
19283 separates = NULL;
dda8d76d
NC
19284
19285 if (! process_section_contents (filedata))
32ec8896 19286 res = FALSE;
f5842774 19287
dda8d76d
NC
19288 if (separates)
19289 {
19290 if (! process_section_headers (separates))
19291 res = FALSE;
19292 else if (! process_section_contents (separates))
19293 res = FALSE;
19294 }
19295
19296 if (! process_notes (filedata))
32ec8896 19297 res = FALSE;
103f02d3 19298
dda8d76d 19299 if (! process_gnu_liblist (filedata))
32ec8896 19300 res = FALSE;
047b2264 19301
dda8d76d 19302 if (! process_arch_specific (filedata))
32ec8896 19303 res = FALSE;
252b5132 19304
dda8d76d
NC
19305 free (filedata->program_headers);
19306 filedata->program_headers = NULL;
d93f0186 19307
dda8d76d
NC
19308 free (filedata->section_headers);
19309 filedata->section_headers = NULL;
252b5132 19310
dda8d76d
NC
19311 free (filedata->string_table);
19312 filedata->string_table = NULL;
19313 filedata->string_table_length = 0;
252b5132
RH
19314
19315 if (dynamic_strings)
19316 {
19317 free (dynamic_strings);
19318 dynamic_strings = NULL;
d79b3d50 19319 dynamic_strings_length = 0;
252b5132
RH
19320 }
19321
19322 if (dynamic_symbols)
19323 {
19324 free (dynamic_symbols);
19325 dynamic_symbols = NULL;
19936277 19326 num_dynamic_syms = 0;
252b5132
RH
19327 }
19328
19329 if (dynamic_syminfo)
19330 {
19331 free (dynamic_syminfo);
19332 dynamic_syminfo = NULL;
19333 }
ff78d6d6 19334
293c573e
MR
19335 if (dynamic_section)
19336 {
19337 free (dynamic_section);
19338 dynamic_section = NULL;
19339 }
19340
e4b17d5c
L
19341 if (section_headers_groups)
19342 {
19343 free (section_headers_groups);
19344 section_headers_groups = NULL;
19345 }
19346
19347 if (section_groups)
19348 {
2cf0635d
NC
19349 struct group_list * g;
19350 struct group_list * next;
e4b17d5c
L
19351
19352 for (i = 0; i < group_count; i++)
19353 {
19354 for (g = section_groups [i].root; g != NULL; g = next)
19355 {
19356 next = g->next;
19357 free (g);
19358 }
19359 }
19360
19361 free (section_groups);
19362 section_groups = NULL;
19363 }
19364
19e6b90e 19365 free_debug_memory ();
18bd398b 19366
32ec8896 19367 return res;
252b5132
RH
19368}
19369
2cf0635d 19370/* Process an ELF archive.
32ec8896
NC
19371 On entry the file is positioned just after the ARMAG string.
19372 Returns TRUE upon success, FALSE otherwise. */
2cf0635d 19373
32ec8896 19374static bfd_boolean
dda8d76d 19375process_archive (Filedata * filedata, bfd_boolean is_thin_archive)
2cf0635d
NC
19376{
19377 struct archive_info arch;
19378 struct archive_info nested_arch;
19379 size_t got;
32ec8896 19380 bfd_boolean ret = TRUE;
2cf0635d 19381
32ec8896 19382 show_name = TRUE;
2cf0635d
NC
19383
19384 /* The ARCH structure is used to hold information about this archive. */
19385 arch.file_name = NULL;
19386 arch.file = NULL;
19387 arch.index_array = NULL;
19388 arch.sym_table = NULL;
19389 arch.longnames = NULL;
19390
19391 /* The NESTED_ARCH structure is used as a single-item cache of information
19392 about a nested archive (when members of a thin archive reside within
19393 another regular archive file). */
19394 nested_arch.file_name = NULL;
19395 nested_arch.file = NULL;
19396 nested_arch.index_array = NULL;
19397 nested_arch.sym_table = NULL;
19398 nested_arch.longnames = NULL;
19399
dda8d76d
NC
19400 if (setup_archive (&arch, filedata->file_name, filedata->handle,
19401 is_thin_archive, do_archive_index) != 0)
2cf0635d 19402 {
32ec8896 19403 ret = FALSE;
2cf0635d 19404 goto out;
4145f1d5 19405 }
fb52b2f4 19406
4145f1d5
NC
19407 if (do_archive_index)
19408 {
2cf0635d 19409 if (arch.sym_table == NULL)
dda8d76d 19410 error (_("%s: unable to dump the index as none was found\n"), filedata->file_name);
4145f1d5
NC
19411 else
19412 {
591f7597 19413 unsigned long i, l;
4145f1d5
NC
19414 unsigned long current_pos;
19415
591f7597 19416 printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
dda8d76d
NC
19417 filedata->file_name, (unsigned long) arch.index_num, arch.sym_size);
19418
19419 current_pos = ftell (filedata->handle);
4145f1d5 19420
2cf0635d 19421 for (i = l = 0; i < arch.index_num; i++)
4145f1d5 19422 {
2cf0635d
NC
19423 if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
19424 {
19425 char * member_name;
4145f1d5 19426
2cf0635d
NC
19427 member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
19428
19429 if (member_name != NULL)
19430 {
19431 char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
19432
19433 if (qualified_name != NULL)
19434 {
c2a7d3f5
NC
19435 printf (_("Contents of binary %s at offset "), qualified_name);
19436 (void) print_vma (arch.index_array[i], PREFIX_HEX);
19437 putchar ('\n');
2cf0635d
NC
19438 free (qualified_name);
19439 }
4145f1d5
NC
19440 }
19441 }
2cf0635d
NC
19442
19443 if (l >= arch.sym_size)
4145f1d5
NC
19444 {
19445 error (_("%s: end of the symbol table reached before the end of the index\n"),
dda8d76d 19446 filedata->file_name);
32ec8896 19447 ret = FALSE;
cb8f3167 19448 break;
4145f1d5 19449 }
591f7597
NC
19450 /* PR 17531: file: 0b6630b2. */
19451 printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
19452 l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
4145f1d5
NC
19453 }
19454
67ce483b 19455 if (arch.uses_64bit_indices)
c2a7d3f5
NC
19456 l = (l + 7) & ~ 7;
19457 else
19458 l += l & 1;
19459
2cf0635d 19460 if (l < arch.sym_size)
32ec8896 19461 {
d3a49aa8
AM
19462 error (ngettext ("%s: %ld byte remains in the symbol table, "
19463 "but without corresponding entries in "
19464 "the index table\n",
19465 "%s: %ld bytes remain in the symbol table, "
19466 "but without corresponding entries in "
19467 "the index table\n",
19468 arch.sym_size - l),
dda8d76d 19469 filedata->file_name, arch.sym_size - l);
32ec8896
NC
19470 ret = FALSE;
19471 }
4145f1d5 19472
dda8d76d 19473 if (fseek (filedata->handle, current_pos, SEEK_SET) != 0)
4145f1d5 19474 {
dda8d76d
NC
19475 error (_("%s: failed to seek back to start of object files in the archive\n"),
19476 filedata->file_name);
32ec8896 19477 ret = FALSE;
2cf0635d 19478 goto out;
4145f1d5 19479 }
fb52b2f4 19480 }
4145f1d5
NC
19481
19482 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
19483 && !do_segments && !do_header && !do_dump && !do_version
19484 && !do_histogram && !do_debugging && !do_arch && !do_notes
2c610e4b 19485 && !do_section_groups && !do_dyn_syms)
2cf0635d 19486 {
32ec8896 19487 ret = TRUE; /* Archive index only. */
2cf0635d
NC
19488 goto out;
19489 }
fb52b2f4
NC
19490 }
19491
fb52b2f4
NC
19492 while (1)
19493 {
2cf0635d
NC
19494 char * name;
19495 size_t namelen;
19496 char * qualified_name;
19497
19498 /* Read the next archive header. */
dda8d76d 19499 if (fseek (filedata->handle, arch.next_arhdr_offset, SEEK_SET) != 0)
2cf0635d 19500 {
28e817cc 19501 error (_("%s: failed to seek to next archive header\n"), arch.file_name);
32ec8896 19502 return FALSE;
2cf0635d 19503 }
dda8d76d 19504 got = fread (&arch.arhdr, 1, sizeof arch.arhdr, filedata->handle);
2cf0635d
NC
19505 if (got != sizeof arch.arhdr)
19506 {
19507 if (got == 0)
19508 break;
28e817cc
NC
19509 /* PR 24049 - we cannot use filedata->file_name as this will
19510 have already been freed. */
19511 error (_("%s: failed to read archive header\n"), arch.file_name);
19512
32ec8896 19513 ret = FALSE;
2cf0635d
NC
19514 break;
19515 }
19516 if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
19517 {
19518 error (_("%s: did not find a valid archive header\n"), arch.file_name);
32ec8896 19519 ret = FALSE;
2cf0635d
NC
19520 break;
19521 }
19522
19523 arch.next_arhdr_offset += sizeof arch.arhdr;
19524
19525 archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
19526 if (archive_file_size & 01)
19527 ++archive_file_size;
19528
19529 name = get_archive_member_name (&arch, &nested_arch);
19530 if (name == NULL)
fb52b2f4 19531 {
28e817cc 19532 error (_("%s: bad archive file name\n"), arch.file_name);
32ec8896 19533 ret = FALSE;
d989285c 19534 break;
fb52b2f4 19535 }
2cf0635d 19536 namelen = strlen (name);
fb52b2f4 19537
2cf0635d
NC
19538 qualified_name = make_qualified_name (&arch, &nested_arch, name);
19539 if (qualified_name == NULL)
fb52b2f4 19540 {
28e817cc 19541 error (_("%s: bad archive file name\n"), arch.file_name);
32ec8896 19542 ret = FALSE;
d989285c 19543 break;
fb52b2f4
NC
19544 }
19545
2cf0635d
NC
19546 if (is_thin_archive && arch.nested_member_origin == 0)
19547 {
19548 /* This is a proxy for an external member of a thin archive. */
dda8d76d
NC
19549 Filedata * member_filedata;
19550 char * member_file_name = adjust_relative_path
19551 (filedata->file_name, name, namelen);
32ec8896 19552
2cf0635d
NC
19553 if (member_file_name == NULL)
19554 {
32ec8896 19555 ret = FALSE;
2cf0635d
NC
19556 break;
19557 }
19558
dda8d76d
NC
19559 member_filedata = open_file (member_file_name);
19560 if (member_filedata == NULL)
2cf0635d
NC
19561 {
19562 error (_("Input file '%s' is not readable.\n"), member_file_name);
19563 free (member_file_name);
32ec8896 19564 ret = FALSE;
2cf0635d
NC
19565 break;
19566 }
19567
19568 archive_file_offset = arch.nested_member_origin;
dda8d76d 19569 member_filedata->file_name = qualified_name;
2cf0635d 19570
dda8d76d 19571 if (! process_object (member_filedata))
32ec8896 19572 ret = FALSE;
2cf0635d 19573
dda8d76d 19574 close_file (member_filedata);
2cf0635d
NC
19575 free (member_file_name);
19576 }
19577 else if (is_thin_archive)
19578 {
eb02c04d
PK
19579 Filedata thin_filedata;
19580
19581 memset (&thin_filedata, 0, sizeof (thin_filedata));
dda8d76d 19582
a043396b
NC
19583 /* PR 15140: Allow for corrupt thin archives. */
19584 if (nested_arch.file == NULL)
19585 {
19586 error (_("%s: contains corrupt thin archive: %s\n"),
28e817cc 19587 qualified_name, name);
32ec8896 19588 ret = FALSE;
a043396b
NC
19589 break;
19590 }
19591
2cf0635d
NC
19592 /* This is a proxy for a member of a nested archive. */
19593 archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
19594
19595 /* The nested archive file will have been opened and setup by
19596 get_archive_member_name. */
19597 if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
19598 {
19599 error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
32ec8896 19600 ret = FALSE;
2cf0635d
NC
19601 break;
19602 }
19603
dda8d76d
NC
19604 thin_filedata.handle = nested_arch.file;
19605 thin_filedata.file_name = qualified_name;
19606
19607 if (! process_object (& thin_filedata))
32ec8896 19608 ret = FALSE;
2cf0635d
NC
19609 }
19610 else
19611 {
19612 archive_file_offset = arch.next_arhdr_offset;
19613 arch.next_arhdr_offset += archive_file_size;
fb52b2f4 19614
6a6196fc 19615 filedata->file_name = qualified_name;
dda8d76d 19616 if (! process_object (filedata))
32ec8896 19617 ret = FALSE;
2cf0635d 19618 }
fb52b2f4 19619
dda8d76d 19620 if (filedata->dump_sects != NULL)
2b52916e 19621 {
dda8d76d
NC
19622 free (filedata->dump_sects);
19623 filedata->dump_sects = NULL;
19624 filedata->num_dump_sects = 0;
2b52916e
L
19625 }
19626
2cf0635d 19627 free (qualified_name);
fb52b2f4
NC
19628 }
19629
4145f1d5 19630 out:
2cf0635d
NC
19631 if (nested_arch.file != NULL)
19632 fclose (nested_arch.file);
19633 release_archive (&nested_arch);
19634 release_archive (&arch);
fb52b2f4 19635
d989285c 19636 return ret;
fb52b2f4
NC
19637}
19638
32ec8896 19639static bfd_boolean
2cf0635d 19640process_file (char * file_name)
fb52b2f4 19641{
dda8d76d 19642 Filedata * filedata = NULL;
fb52b2f4
NC
19643 struct stat statbuf;
19644 char armag[SARMAG];
32ec8896 19645 bfd_boolean ret = TRUE;
fb52b2f4
NC
19646
19647 if (stat (file_name, &statbuf) < 0)
19648 {
f24ddbdd
NC
19649 if (errno == ENOENT)
19650 error (_("'%s': No such file\n"), file_name);
19651 else
19652 error (_("Could not locate '%s'. System error message: %s\n"),
19653 file_name, strerror (errno));
32ec8896 19654 return FALSE;
f24ddbdd
NC
19655 }
19656
19657 if (! S_ISREG (statbuf.st_mode))
19658 {
19659 error (_("'%s' is not an ordinary file\n"), file_name);
32ec8896 19660 return FALSE;
fb52b2f4
NC
19661 }
19662
dda8d76d
NC
19663 filedata = calloc (1, sizeof * filedata);
19664 if (filedata == NULL)
19665 {
19666 error (_("Out of memory allocating file data structure\n"));
19667 return FALSE;
19668 }
19669
19670 filedata->file_name = file_name;
19671 filedata->handle = fopen (file_name, "rb");
19672 if (filedata->handle == NULL)
fb52b2f4 19673 {
f24ddbdd 19674 error (_("Input file '%s' is not readable.\n"), file_name);
dda8d76d 19675 free (filedata);
32ec8896 19676 return FALSE;
fb52b2f4
NC
19677 }
19678
dda8d76d 19679 if (fread (armag, SARMAG, 1, filedata->handle) != 1)
fb52b2f4 19680 {
4145f1d5 19681 error (_("%s: Failed to read file's magic number\n"), file_name);
dda8d76d
NC
19682 fclose (filedata->handle);
19683 free (filedata);
32ec8896 19684 return FALSE;
fb52b2f4
NC
19685 }
19686
dda8d76d 19687 filedata->file_size = (bfd_size_type) statbuf.st_size;
f54498b4 19688
fb52b2f4 19689 if (memcmp (armag, ARMAG, SARMAG) == 0)
32ec8896 19690 {
dda8d76d 19691 if (! process_archive (filedata, FALSE))
32ec8896
NC
19692 ret = FALSE;
19693 }
2cf0635d 19694 else if (memcmp (armag, ARMAGT, SARMAG) == 0)
32ec8896 19695 {
dda8d76d 19696 if ( ! process_archive (filedata, TRUE))
32ec8896
NC
19697 ret = FALSE;
19698 }
fb52b2f4
NC
19699 else
19700 {
4145f1d5
NC
19701 if (do_archive_index)
19702 error (_("File %s is not an archive so its index cannot be displayed.\n"),
19703 file_name);
19704
dda8d76d 19705 rewind (filedata->handle);
fb52b2f4 19706 archive_file_size = archive_file_offset = 0;
32ec8896 19707
dda8d76d 19708 if (! process_object (filedata))
32ec8896 19709 ret = FALSE;
fb52b2f4
NC
19710 }
19711
dda8d76d
NC
19712 fclose (filedata->handle);
19713 free (filedata);
32ec8896 19714
fb52b2f4
NC
19715 return ret;
19716}
19717
252b5132
RH
19718#ifdef SUPPORT_DISASSEMBLY
19719/* Needed by the i386 disassembler. For extra credit, someone could
9ea033b2 19720 fix this so that we insert symbolic addresses here, esp for GOT/PLT
e3c8793a 19721 symbols. */
252b5132
RH
19722
19723void
2cf0635d 19724print_address (unsigned int addr, FILE * outfile)
252b5132
RH
19725{
19726 fprintf (outfile,"0x%8.8x", addr);
19727}
19728
e3c8793a 19729/* Needed by the i386 disassembler. */
dda8d76d 19730
252b5132
RH
19731void
19732db_task_printsym (unsigned int addr)
19733{
19734 print_address (addr, stderr);
19735}
19736#endif
19737
19738int
2cf0635d 19739main (int argc, char ** argv)
252b5132 19740{
ff78d6d6
L
19741 int err;
19742
252b5132
RH
19743#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
19744 setlocale (LC_MESSAGES, "");
3882b010
L
19745#endif
19746#if defined (HAVE_SETLOCALE)
19747 setlocale (LC_CTYPE, "");
252b5132
RH
19748#endif
19749 bindtextdomain (PACKAGE, LOCALEDIR);
19750 textdomain (PACKAGE);
19751
869b9d07
MM
19752 expandargv (&argc, &argv);
19753
dda8d76d
NC
19754 cmdline.file_name = "<cmdline>";
19755 parse_args (& cmdline, argc, argv);
59f14fc0 19756
18bd398b 19757 if (optind < (argc - 1))
32ec8896 19758 show_name = TRUE;
5656ba2c
L
19759 else if (optind >= argc)
19760 {
19761 warn (_("Nothing to do.\n"));
19762 usage (stderr);
19763 }
18bd398b 19764
32ec8896 19765 err = FALSE;
252b5132 19766 while (optind < argc)
32ec8896
NC
19767 if (! process_file (argv[optind++]))
19768 err = TRUE;
252b5132 19769
dda8d76d
NC
19770 if (cmdline.dump_sects != NULL)
19771 free (cmdline.dump_sects);
252b5132 19772
32ec8896 19773 return err ? EXIT_FAILURE : EXIT_SUCCESS;
252b5132 19774}
This page took 3.230583 seconds and 4 git commands to generate.