]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - binutils/readelf.c
S390: Make IPA recognize tdescs with guarded storage
[thirdparty/binutils-gdb.git] / binutils / readelf.c
CommitLineData
252b5132 1/* readelf.c -- display contents of an ELF format file
219d1afa 2 Copyright (C) 1998-2018 Free Software Foundation, Inc.
252b5132
RH
3
4 Originally developed by Eric Youngdale <eric@andante.jic.com>
12ab83a9 5 Modifications by Nick Clifton <nickc@redhat.com>
252b5132
RH
6
7 This file is part of GNU Binutils.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
32866df7 11 the Free Software Foundation; either version 3 of the License, or
252b5132
RH
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
b43b5d5f
NC
21 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
22 02110-1301, USA. */
252b5132 23\f
9eb20dd8 24/* The difference between readelf and objdump:
252b5132 25
74013231 26 Both programs are capable of displaying the contents of ELF format files,
9eb20dd8 27 so why does the binutils project have two file dumpers ?
0de14b54 28
9eb20dd8
NC
29 The reason is that objdump sees an ELF file through a BFD filter of the
30 world; if BFD has a bug where, say, it disagrees about a machine constant
31 in e_flags, then the odds are good that it will remain internally
32 consistent. The linker sees it the BFD way, objdump sees it the BFD way,
33 GAS sees it the BFD way. There was need for a tool to go find out what
34 the file actually says.
35
36 This is why the readelf program does not link against the BFD library - it
37 exists as an independent program to help verify the correct working of BFD.
38
39 There is also the case that readelf can provide more information about an
40 ELF file than is provided by objdump. In particular it can display DWARF
41 debugging information which (at the moment) objdump cannot. */
42\f
3db64b00 43#include "sysdep.h"
252b5132 44#include <assert.h>
252b5132 45#include <time.h>
1b315056 46#include <zlib.h>
3bfcb652 47#ifdef HAVE_WCHAR_H
7bfd842d 48#include <wchar.h>
3bfcb652 49#endif
252b5132 50
a952a375 51#if __GNUC__ >= 2
19936277 52/* Define BFD64 here, even if our default architecture is 32 bit ELF
a952a375 53 as this will allow us to read in and parse 64bit and 32bit ELF files.
b34976b6 54 Only do this if we believe that the compiler can support a 64 bit
a952a375 55 data type. For now we only rely on GCC being able to do this. */
19936277 56#define BFD64
a952a375
NC
57#endif
58
3db64b00
AM
59#include "bfd.h"
60#include "bucomm.h"
3284fe0c 61#include "elfcomm.h"
19e6b90e 62#include "dwarf.h"
252b5132
RH
63
64#include "elf/common.h"
65#include "elf/external.h"
66#include "elf/internal.h"
252b5132 67
4b78141a
NC
68
69/* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
70 we can obtain the H8 reloc numbers. We need these for the
71 get_reloc_size() function. We include h8.h again after defining
72 RELOC_MACROS_GEN_FUNC so that we get the naming function as well. */
73
74#include "elf/h8.h"
75#undef _ELF_H8_H
76
77/* Undo the effects of #including reloc-macros.h. */
78
79#undef START_RELOC_NUMBERS
80#undef RELOC_NUMBER
81#undef FAKE_RELOC
82#undef EMPTY_RELOC
83#undef END_RELOC_NUMBERS
84#undef _RELOC_MACROS_H
85
252b5132
RH
86/* The following headers use the elf/reloc-macros.h file to
87 automatically generate relocation recognition functions
88 such as elf_mips_reloc_type() */
89
90#define RELOC_MACROS_GEN_FUNC
91
a06ea964 92#include "elf/aarch64.h"
252b5132 93#include "elf/alpha.h"
3b16e843 94#include "elf/arc.h"
252b5132 95#include "elf/arm.h"
3b16e843 96#include "elf/avr.h"
1d65ded4 97#include "elf/bfin.h"
60bca95a 98#include "elf/cr16.h"
3b16e843 99#include "elf/cris.h"
1c0d3aa6 100#include "elf/crx.h"
252b5132
RH
101#include "elf/d10v.h"
102#include "elf/d30v.h"
d172d4ba 103#include "elf/dlx.h"
cfb8c092 104#include "elf/epiphany.h"
252b5132 105#include "elf/fr30.h"
5c70f934 106#include "elf/frv.h"
3f8107ab 107#include "elf/ft32.h"
3b16e843
NC
108#include "elf/h8.h"
109#include "elf/hppa.h"
110#include "elf/i386.h"
35b1837e 111#include "elf/i370.h"
3b16e843
NC
112#include "elf/i860.h"
113#include "elf/i960.h"
114#include "elf/ia64.h"
1e4cf259 115#include "elf/ip2k.h"
84e94c90 116#include "elf/lm32.h"
1c0d3aa6 117#include "elf/iq2000.h"
49f58d10 118#include "elf/m32c.h"
3b16e843
NC
119#include "elf/m32r.h"
120#include "elf/m68k.h"
75751cd9 121#include "elf/m68hc11.h"
252b5132 122#include "elf/mcore.h"
15ab5209 123#include "elf/mep.h"
a3c62988 124#include "elf/metag.h"
7ba29e2a 125#include "elf/microblaze.h"
3b16e843 126#include "elf/mips.h"
3c3bdf30 127#include "elf/mmix.h"
3b16e843
NC
128#include "elf/mn10200.h"
129#include "elf/mn10300.h"
5506d11a 130#include "elf/moxie.h"
4970f871 131#include "elf/mt.h"
2469cfa2 132#include "elf/msp430.h"
35c08157 133#include "elf/nds32.h"
13761a11 134#include "elf/nios2.h"
73589c9d 135#include "elf/or1k.h"
7d466069 136#include "elf/pj.h"
3b16e843 137#include "elf/ppc.h"
c833c019 138#include "elf/ppc64.h"
2b100bb5 139#include "elf/pru.h"
03336641 140#include "elf/riscv.h"
99c513f6 141#include "elf/rl78.h"
c7927a3c 142#include "elf/rx.h"
a85d7ed0 143#include "elf/s390.h"
1c0d3aa6 144#include "elf/score.h"
3b16e843
NC
145#include "elf/sh.h"
146#include "elf/sparc.h"
e9f53129 147#include "elf/spu.h"
40b36596 148#include "elf/tic6x.h"
aa137e4d
NC
149#include "elf/tilegx.h"
150#include "elf/tilepro.h"
3b16e843 151#include "elf/v850.h"
179d3252 152#include "elf/vax.h"
619ed720 153#include "elf/visium.h"
f96bd6c2 154#include "elf/wasm32.h"
3b16e843 155#include "elf/x86-64.h"
c29aca4a 156#include "elf/xc16x.h"
f6c1a2d5 157#include "elf/xgate.h"
93fbbb04 158#include "elf/xstormy16.h"
88da6820 159#include "elf/xtensa.h"
252b5132 160
252b5132 161#include "getopt.h"
566b0d53 162#include "libiberty.h"
09c11c86 163#include "safe-ctype.h"
2cf0635d 164#include "filenames.h"
252b5132 165
15b42fb0
AM
166#ifndef offsetof
167#define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
168#endif
169
6a40cf0c
NC
170typedef struct elf_section_list
171{
dda8d76d
NC
172 Elf_Internal_Shdr * hdr;
173 struct elf_section_list * next;
6a40cf0c
NC
174} elf_section_list;
175
dda8d76d
NC
176/* Flag bits indicating particular types of dump. */
177#define HEX_DUMP (1 << 0) /* The -x command line switch. */
178#define DISASS_DUMP (1 << 1) /* The -i command line switch. */
179#define DEBUG_DUMP (1 << 2) /* The -w command line switch. */
180#define STRING_DUMP (1 << 3) /* The -p command line switch. */
181#define RELOC_DUMP (1 << 4) /* The -R command line switch. */
182
183typedef unsigned char dump_type;
184
185/* A linked list of the section names for which dumps were requested. */
186struct dump_list_entry
187{
188 char * name;
189 dump_type type;
190 struct dump_list_entry * next;
191};
192
193typedef struct filedata
194{
195 const char * file_name;
196 FILE * handle;
197 bfd_size_type file_size;
198 Elf_Internal_Ehdr file_header;
199 Elf_Internal_Shdr * section_headers;
200 Elf_Internal_Phdr * program_headers;
201 char * string_table;
202 unsigned long string_table_length;
203 /* A dynamic array of flags indicating for which sections a dump of
204 some kind has been requested. It is reset on a per-object file
205 basis and then initialised from the cmdline_dump_sects array,
206 the results of interpreting the -w switch, and the
207 dump_sects_byname list. */
208 dump_type * dump_sects;
209 unsigned int num_dump_sects;
210} Filedata;
211
2cf0635d 212char * program_name = "readelf";
dda8d76d 213
c9c1d674 214static unsigned long archive_file_offset;
85b1c36d
BE
215static unsigned long archive_file_size;
216static unsigned long dynamic_addr;
217static bfd_size_type dynamic_size;
8b73c356 218static size_t dynamic_nent;
2cf0635d 219static char * dynamic_strings;
85b1c36d 220static unsigned long dynamic_strings_length;
85b1c36d 221static unsigned long num_dynamic_syms;
2cf0635d
NC
222static Elf_Internal_Sym * dynamic_symbols;
223static Elf_Internal_Syminfo * dynamic_syminfo;
85b1c36d
BE
224static unsigned long dynamic_syminfo_offset;
225static unsigned int dynamic_syminfo_nent;
f8eae8b2 226static char program_interpreter[PATH_MAX];
bb8a0291 227static bfd_vma dynamic_info[DT_ENCODING];
fdc90cb4 228static bfd_vma dynamic_info_DT_GNU_HASH;
85b1c36d 229static bfd_vma version_info[16];
2cf0635d 230static Elf_Internal_Dyn * dynamic_section;
6a40cf0c 231static elf_section_list * symtab_shndx_list;
32ec8896
NC
232static bfd_boolean show_name = FALSE;
233static bfd_boolean do_dynamic = FALSE;
234static bfd_boolean do_syms = FALSE;
235static bfd_boolean do_dyn_syms = FALSE;
236static bfd_boolean do_reloc = FALSE;
237static bfd_boolean do_sections = FALSE;
238static bfd_boolean do_section_groups = FALSE;
239static bfd_boolean do_section_details = FALSE;
240static bfd_boolean do_segments = FALSE;
241static bfd_boolean do_unwind = FALSE;
242static bfd_boolean do_using_dynamic = FALSE;
243static bfd_boolean do_header = FALSE;
244static bfd_boolean do_dump = FALSE;
245static bfd_boolean do_version = FALSE;
246static bfd_boolean do_histogram = FALSE;
247static bfd_boolean do_debugging = FALSE;
248static bfd_boolean do_arch = FALSE;
249static bfd_boolean do_notes = FALSE;
250static bfd_boolean do_archive_index = FALSE;
251static bfd_boolean is_32bit_elf = FALSE;
252static bfd_boolean decompress_dumps = FALSE;
252b5132 253
e4b17d5c
L
254struct group_list
255{
dda8d76d
NC
256 struct group_list * next;
257 unsigned int section_index;
e4b17d5c
L
258};
259
260struct group
261{
dda8d76d
NC
262 struct group_list * root;
263 unsigned int group_index;
e4b17d5c
L
264};
265
dda8d76d
NC
266static size_t group_count;
267static struct group * section_groups;
268static struct group ** section_headers_groups;
aef1f6d0 269
09c11c86
NC
270/* A dynamic array of flags indicating for which sections a dump
271 has been requested via command line switches. */
dda8d76d 272static Filedata cmdline;
252b5132 273
dda8d76d 274static struct dump_list_entry * dump_sects_byname;
252b5132 275
c256ffe7 276/* How to print a vma value. */
843dd992
NC
277typedef enum print_mode
278{
279 HEX,
280 DEC,
281 DEC_5,
282 UNSIGNED,
283 PREFIX_HEX,
284 FULL_HEX,
285 LONG_HEX
286}
287print_mode;
288
bb4d2ac2
L
289/* Versioned symbol info. */
290enum versioned_symbol_info
291{
292 symbol_undefined,
293 symbol_hidden,
294 symbol_public
295};
296
32ec8896 297static const char * get_symbol_version_string
dda8d76d 298 (Filedata *, bfd_boolean, const char *, unsigned long, unsigned,
32ec8896 299 Elf_Internal_Sym *, enum versioned_symbol_info *, unsigned short *);
bb4d2ac2 300
9c19a809
NC
301#define UNKNOWN -1
302
2b692964
NC
303#define SECTION_NAME(X) \
304 ((X) == NULL ? _("<none>") \
dda8d76d
NC
305 : filedata->string_table == NULL ? _("<no-strings>") \
306 : ((X)->sh_name >= filedata->string_table_length ? _("<corrupt>") \
307 : filedata->string_table + (X)->sh_name))
252b5132 308
ee42cf8c 309#define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
252b5132 310
ba5cdace
NC
311#define GET_ELF_SYMBOLS(file, section, sym_count) \
312 (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count) \
313 : get_64bit_elf_symbols (file, section, sym_count))
9ea033b2 314
d79b3d50
NC
315#define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
316/* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
317 already been called and verified that the string exists. */
318#define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
18bd398b 319
61865e30
NC
320#define REMOVE_ARCH_BITS(ADDR) \
321 do \
322 { \
dda8d76d 323 if (filedata->file_header.e_machine == EM_ARM) \
61865e30
NC
324 (ADDR) &= ~1; \
325 } \
326 while (0)
d79b3d50 327\f
66cfc0fd
AM
328/* Print a BFD_VMA to an internal buffer, for use in error messages.
329 BFD_FMA_FMT can't be used in translated strings. */
330
331static const char *
332bfd_vmatoa (char *fmtch, bfd_vma value)
333{
334 /* bfd_vmatoa is used more then once in a printf call for output.
335 Cycle through an array of buffers. */
336 static int buf_pos = 0;
337 static struct bfd_vmatoa_buf
338 {
339 char place[64];
340 } buf[4];
341 char *ret;
342 char fmt[32];
343
344 ret = buf[buf_pos++].place;
345 buf_pos %= ARRAY_SIZE (buf);
346
347 sprintf (fmt, "%%%s%s", BFD_VMA_FMT, fmtch);
348 snprintf (ret, sizeof (buf[0].place), fmt, value);
349 return ret;
350}
351
dda8d76d
NC
352/* Retrieve NMEMB structures, each SIZE bytes long from FILEDATA starting at
353 OFFSET + the offset of the current archive member, if we are examining an
354 archive. Put the retrieved data into VAR, if it is not NULL. Otherwise
355 allocate a buffer using malloc and fill that. In either case return the
356 pointer to the start of the retrieved data or NULL if something went wrong.
357 If something does go wrong and REASON is not NULL then emit an error
358 message using REASON as part of the context. */
59245841 359
c256ffe7 360static void *
dda8d76d
NC
361get_data (void * var,
362 Filedata * filedata,
363 unsigned long offset,
364 bfd_size_type size,
365 bfd_size_type nmemb,
366 const char * reason)
a6e9f9df 367{
2cf0635d 368 void * mvar;
57028622 369 bfd_size_type amt = size * nmemb;
a6e9f9df 370
c256ffe7 371 if (size == 0 || nmemb == 0)
a6e9f9df
AM
372 return NULL;
373
57028622
NC
374 /* If the size_t type is smaller than the bfd_size_type, eg because
375 you are building a 32-bit tool on a 64-bit host, then make sure
376 that when the sizes are cast to (size_t) no information is lost. */
377 if (sizeof (size_t) < sizeof (bfd_size_type)
378 && ( (bfd_size_type) ((size_t) size) != size
379 || (bfd_size_type) ((size_t) nmemb) != nmemb))
380 {
381 if (reason)
66cfc0fd
AM
382 error (_("Size truncation prevents reading %s"
383 " elements of size %s for %s\n"),
384 bfd_vmatoa ("u", nmemb), bfd_vmatoa ("u", size), reason);
57028622
NC
385 return NULL;
386 }
387
388 /* Check for size overflow. */
389 if (amt < nmemb)
390 {
391 if (reason)
66cfc0fd
AM
392 error (_("Size overflow prevents reading %s"
393 " elements of size %s for %s\n"),
394 bfd_vmatoa ("u", nmemb), bfd_vmatoa ("u", size), reason);
57028622
NC
395 return NULL;
396 }
397
c9c1d674
EG
398 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
399 attempting to allocate memory when the read is bound to fail. */
dda8d76d
NC
400 if (amt > filedata->file_size
401 || offset + archive_file_offset + amt > filedata->file_size)
a6e9f9df 402 {
049b0c3a 403 if (reason)
66cfc0fd
AM
404 error (_("Reading %s bytes extends past end of file for %s\n"),
405 bfd_vmatoa ("u", amt), reason);
a6e9f9df
AM
406 return NULL;
407 }
408
dda8d76d 409 if (fseek (filedata->handle, archive_file_offset + offset, SEEK_SET))
071436c6
NC
410 {
411 if (reason)
c9c1d674 412 error (_("Unable to seek to 0x%lx for %s\n"),
ed754a13 413 archive_file_offset + offset, reason);
071436c6
NC
414 return NULL;
415 }
416
a6e9f9df
AM
417 mvar = var;
418 if (mvar == NULL)
419 {
c256ffe7 420 /* Check for overflow. */
57028622 421 if (nmemb < (~(bfd_size_type) 0 - 1) / size)
c256ffe7 422 /* + 1 so that we can '\0' terminate invalid string table sections. */
57028622 423 mvar = malloc ((size_t) amt + 1);
a6e9f9df
AM
424
425 if (mvar == NULL)
426 {
049b0c3a 427 if (reason)
66cfc0fd
AM
428 error (_("Out of memory allocating %s bytes for %s\n"),
429 bfd_vmatoa ("u", amt), reason);
a6e9f9df
AM
430 return NULL;
431 }
c256ffe7 432
c9c1d674 433 ((char *) mvar)[amt] = '\0';
a6e9f9df
AM
434 }
435
dda8d76d 436 if (fread (mvar, (size_t) size, (size_t) nmemb, filedata->handle) != nmemb)
a6e9f9df 437 {
049b0c3a 438 if (reason)
66cfc0fd
AM
439 error (_("Unable to read in %s bytes of %s\n"),
440 bfd_vmatoa ("u", amt), reason);
a6e9f9df
AM
441 if (mvar != var)
442 free (mvar);
443 return NULL;
444 }
445
446 return mvar;
447}
448
32ec8896
NC
449/* Print a VMA value in the MODE specified.
450 Returns the number of characters displayed. */
cb8f3167 451
32ec8896 452static unsigned int
14a91970 453print_vma (bfd_vma vma, print_mode mode)
66543521 454{
32ec8896 455 unsigned int nc = 0;
66543521 456
14a91970 457 switch (mode)
66543521 458 {
14a91970
AM
459 case FULL_HEX:
460 nc = printf ("0x");
1a0670f3 461 /* Fall through. */
14a91970 462 case LONG_HEX:
f7a99963 463#ifdef BFD64
14a91970 464 if (is_32bit_elf)
437c2fb7 465 return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
f7a99963 466#endif
14a91970
AM
467 printf_vma (vma);
468 return nc + 16;
b19aac67 469
14a91970
AM
470 case DEC_5:
471 if (vma <= 99999)
472 return printf ("%5" BFD_VMA_FMT "d", vma);
1a0670f3 473 /* Fall through. */
14a91970
AM
474 case PREFIX_HEX:
475 nc = printf ("0x");
1a0670f3 476 /* Fall through. */
14a91970
AM
477 case HEX:
478 return nc + printf ("%" BFD_VMA_FMT "x", vma);
b19aac67 479
14a91970
AM
480 case DEC:
481 return printf ("%" BFD_VMA_FMT "d", vma);
b19aac67 482
14a91970
AM
483 case UNSIGNED:
484 return printf ("%" BFD_VMA_FMT "u", vma);
32ec8896
NC
485
486 default:
487 /* FIXME: Report unrecognised mode ? */
488 return 0;
f7a99963 489 }
f7a99963
NC
490}
491
7bfd842d 492/* Display a symbol on stdout. Handles the display of control characters and
3bfcb652 493 multibye characters (assuming the host environment supports them).
31104126 494
7bfd842d
NC
495 Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
496
497 If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
498 padding as necessary.
171191ba
NC
499
500 Returns the number of emitted characters. */
501
502static unsigned int
32ec8896 503print_symbol (signed int width, const char *symbol)
31104126 504{
171191ba 505 bfd_boolean extra_padding = FALSE;
32ec8896 506 signed int num_printed = 0;
3bfcb652 507#ifdef HAVE_MBSTATE_T
7bfd842d 508 mbstate_t state;
3bfcb652 509#endif
32ec8896 510 unsigned int width_remaining;
961c521f 511
7bfd842d 512 if (width < 0)
961c521f 513 {
88305e1b 514 /* Keep the width positive. This helps the code below. */
961c521f 515 width = - width;
171191ba 516 extra_padding = TRUE;
0b4362b0 517 }
74e1a04b 518 assert (width != 0);
961c521f 519
7bfd842d
NC
520 if (do_wide)
521 /* Set the remaining width to a very large value.
522 This simplifies the code below. */
523 width_remaining = INT_MAX;
524 else
525 width_remaining = width;
cb8f3167 526
3bfcb652 527#ifdef HAVE_MBSTATE_T
7bfd842d
NC
528 /* Initialise the multibyte conversion state. */
529 memset (& state, 0, sizeof (state));
3bfcb652 530#endif
961c521f 531
7bfd842d
NC
532 while (width_remaining)
533 {
534 size_t n;
7bfd842d 535 const char c = *symbol++;
961c521f 536
7bfd842d 537 if (c == 0)
961c521f
NC
538 break;
539
7bfd842d
NC
540 /* Do not print control characters directly as they can affect terminal
541 settings. Such characters usually appear in the names generated
542 by the assembler for local labels. */
543 if (ISCNTRL (c))
961c521f 544 {
7bfd842d 545 if (width_remaining < 2)
961c521f
NC
546 break;
547
7bfd842d
NC
548 printf ("^%c", c + 0x40);
549 width_remaining -= 2;
171191ba 550 num_printed += 2;
961c521f 551 }
7bfd842d
NC
552 else if (ISPRINT (c))
553 {
554 putchar (c);
555 width_remaining --;
556 num_printed ++;
557 }
961c521f
NC
558 else
559 {
3bfcb652
NC
560#ifdef HAVE_MBSTATE_T
561 wchar_t w;
562#endif
7bfd842d
NC
563 /* Let printf do the hard work of displaying multibyte characters. */
564 printf ("%.1s", symbol - 1);
565 width_remaining --;
566 num_printed ++;
567
3bfcb652 568#ifdef HAVE_MBSTATE_T
7bfd842d
NC
569 /* Try to find out how many bytes made up the character that was
570 just printed. Advance the symbol pointer past the bytes that
571 were displayed. */
572 n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
3bfcb652
NC
573#else
574 n = 1;
575#endif
7bfd842d
NC
576 if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
577 symbol += (n - 1);
961c521f 578 }
961c521f 579 }
171191ba 580
7bfd842d 581 if (extra_padding && num_printed < width)
171191ba
NC
582 {
583 /* Fill in the remaining spaces. */
7bfd842d
NC
584 printf ("%-*s", width - num_printed, " ");
585 num_printed = width;
171191ba
NC
586 }
587
588 return num_printed;
31104126
NC
589}
590
1449284b 591/* Returns a pointer to a static buffer containing a printable version of
74e1a04b
NC
592 the given section's name. Like print_symbol, except that it does not try
593 to print multibyte characters, it just interprets them as hex values. */
594
595static const char *
dda8d76d 596printable_section_name (Filedata * filedata, const Elf_Internal_Shdr * sec)
74e1a04b
NC
597{
598#define MAX_PRINT_SEC_NAME_LEN 128
599 static char sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
600 const char * name = SECTION_NAME (sec);
601 char * buf = sec_name_buf;
602 char c;
603 unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
604
605 while ((c = * name ++) != 0)
606 {
607 if (ISCNTRL (c))
608 {
609 if (remaining < 2)
610 break;
948f632f 611
74e1a04b
NC
612 * buf ++ = '^';
613 * buf ++ = c + 0x40;
614 remaining -= 2;
615 }
616 else if (ISPRINT (c))
617 {
618 * buf ++ = c;
619 remaining -= 1;
620 }
621 else
622 {
623 static char hex[17] = "0123456789ABCDEF";
624
625 if (remaining < 4)
626 break;
627 * buf ++ = '<';
628 * buf ++ = hex[(c & 0xf0) >> 4];
629 * buf ++ = hex[c & 0x0f];
630 * buf ++ = '>';
631 remaining -= 4;
632 }
633
634 if (remaining == 0)
635 break;
636 }
637
638 * buf = 0;
639 return sec_name_buf;
640}
641
642static const char *
dda8d76d 643printable_section_name_from_index (Filedata * filedata, unsigned long ndx)
74e1a04b 644{
dda8d76d 645 if (ndx >= filedata->file_header.e_shnum)
74e1a04b
NC
646 return _("<corrupt>");
647
dda8d76d 648 return printable_section_name (filedata, filedata->section_headers + ndx);
74e1a04b
NC
649}
650
89fac5e3
RS
651/* Return a pointer to section NAME, or NULL if no such section exists. */
652
653static Elf_Internal_Shdr *
dda8d76d 654find_section (Filedata * filedata, const char * name)
89fac5e3
RS
655{
656 unsigned int i;
657
68807c3c
NC
658 if (filedata->section_headers == NULL)
659 return NULL;
dda8d76d
NC
660
661 for (i = 0; i < filedata->file_header.e_shnum; i++)
662 if (streq (SECTION_NAME (filedata->section_headers + i), name))
663 return filedata->section_headers + i;
89fac5e3
RS
664
665 return NULL;
666}
667
0b6ae522
DJ
668/* Return a pointer to a section containing ADDR, or NULL if no such
669 section exists. */
670
671static Elf_Internal_Shdr *
dda8d76d 672find_section_by_address (Filedata * filedata, bfd_vma addr)
0b6ae522
DJ
673{
674 unsigned int i;
675
68807c3c
NC
676 if (filedata->section_headers == NULL)
677 return NULL;
678
dda8d76d 679 for (i = 0; i < filedata->file_header.e_shnum; i++)
0b6ae522 680 {
dda8d76d
NC
681 Elf_Internal_Shdr *sec = filedata->section_headers + i;
682
0b6ae522
DJ
683 if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
684 return sec;
685 }
686
687 return NULL;
688}
689
071436c6 690static Elf_Internal_Shdr *
dda8d76d 691find_section_by_type (Filedata * filedata, unsigned int type)
071436c6
NC
692{
693 unsigned int i;
694
68807c3c
NC
695 if (filedata->section_headers == NULL)
696 return NULL;
697
dda8d76d 698 for (i = 0; i < filedata->file_header.e_shnum; i++)
071436c6 699 {
dda8d76d
NC
700 Elf_Internal_Shdr *sec = filedata->section_headers + i;
701
071436c6
NC
702 if (sec->sh_type == type)
703 return sec;
704 }
705
706 return NULL;
707}
708
657d0d47
CC
709/* Return a pointer to section NAME, or NULL if no such section exists,
710 restricted to the list of sections given in SET. */
711
712static Elf_Internal_Shdr *
dda8d76d 713find_section_in_set (Filedata * filedata, const char * name, unsigned int * set)
657d0d47
CC
714{
715 unsigned int i;
716
68807c3c
NC
717 if (filedata->section_headers == NULL)
718 return NULL;
719
657d0d47
CC
720 if (set != NULL)
721 {
722 while ((i = *set++) > 0)
b814a36d
NC
723 {
724 /* See PR 21156 for a reproducer. */
dda8d76d 725 if (i >= filedata->file_header.e_shnum)
b814a36d
NC
726 continue; /* FIXME: Should we issue an error message ? */
727
dda8d76d
NC
728 if (streq (SECTION_NAME (filedata->section_headers + i), name))
729 return filedata->section_headers + i;
b814a36d 730 }
657d0d47
CC
731 }
732
dda8d76d 733 return find_section (filedata, name);
657d0d47
CC
734}
735
32ec8896
NC
736/* Read an unsigned LEB128 encoded value from DATA.
737 Set *LENGTH_RETURN to the number of bytes read. */
0b6ae522 738
f6f0e17b 739static inline unsigned long
32ec8896
NC
740read_uleb128 (unsigned char * data,
741 unsigned int * length_return,
f6f0e17b 742 const unsigned char * const end)
0b6ae522 743{
f6f0e17b 744 return read_leb128 (data, length_return, FALSE, end);
0b6ae522
DJ
745}
746
32ec8896 747/* Return TRUE if the current file is for IA-64 machine and OpenVMS ABI.
28f997cf
TG
748 This OS has so many departures from the ELF standard that we test it at
749 many places. */
750
32ec8896 751static inline bfd_boolean
dda8d76d 752is_ia64_vms (Filedata * filedata)
28f997cf 753{
dda8d76d
NC
754 return filedata->file_header.e_machine == EM_IA_64
755 && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
28f997cf
TG
756}
757
bcedfee6 758/* Guess the relocation size commonly used by the specific machines. */
252b5132 759
32ec8896 760static bfd_boolean
2dc4cec1 761guess_is_rela (unsigned int e_machine)
252b5132 762{
9c19a809 763 switch (e_machine)
252b5132
RH
764 {
765 /* Targets that use REL relocations. */
252b5132 766 case EM_386:
22abe556 767 case EM_IAMCU:
63fcb9e9 768 case EM_960:
e9f53129 769 case EM_ARM:
2b0337b0 770 case EM_D10V:
252b5132 771 case EM_CYGNUS_D10V:
e9f53129 772 case EM_DLX:
252b5132 773 case EM_MIPS:
4fe85591 774 case EM_MIPS_RS3_LE:
e9f53129 775 case EM_CYGNUS_M32R:
1c0d3aa6 776 case EM_SCORE:
f6c1a2d5 777 case EM_XGATE:
9c19a809 778 return FALSE;
103f02d3 779
252b5132
RH
780 /* Targets that use RELA relocations. */
781 case EM_68K:
e9f53129 782 case EM_860:
a06ea964 783 case EM_AARCH64:
cfb8c092 784 case EM_ADAPTEVA_EPIPHANY:
e9f53129
AM
785 case EM_ALPHA:
786 case EM_ALTERA_NIOS2:
886a2506
NC
787 case EM_ARC:
788 case EM_ARC_COMPACT:
789 case EM_ARC_COMPACT2:
e9f53129
AM
790 case EM_AVR:
791 case EM_AVR_OLD:
792 case EM_BLACKFIN:
60bca95a 793 case EM_CR16:
e9f53129
AM
794 case EM_CRIS:
795 case EM_CRX:
2b0337b0 796 case EM_D30V:
252b5132 797 case EM_CYGNUS_D30V:
2b0337b0 798 case EM_FR30:
3f8107ab 799 case EM_FT32:
252b5132 800 case EM_CYGNUS_FR30:
5c70f934 801 case EM_CYGNUS_FRV:
e9f53129
AM
802 case EM_H8S:
803 case EM_H8_300:
804 case EM_H8_300H:
800eeca4 805 case EM_IA_64:
1e4cf259
NC
806 case EM_IP2K:
807 case EM_IP2K_OLD:
3b36097d 808 case EM_IQ2000:
84e94c90 809 case EM_LATTICEMICO32:
ff7eeb89 810 case EM_M32C_OLD:
49f58d10 811 case EM_M32C:
e9f53129
AM
812 case EM_M32R:
813 case EM_MCORE:
15ab5209 814 case EM_CYGNUS_MEP:
a3c62988 815 case EM_METAG:
e9f53129
AM
816 case EM_MMIX:
817 case EM_MN10200:
818 case EM_CYGNUS_MN10200:
819 case EM_MN10300:
820 case EM_CYGNUS_MN10300:
5506d11a 821 case EM_MOXIE:
e9f53129
AM
822 case EM_MSP430:
823 case EM_MSP430_OLD:
d031aafb 824 case EM_MT:
35c08157 825 case EM_NDS32:
64fd6348 826 case EM_NIOS32:
73589c9d 827 case EM_OR1K:
e9f53129
AM
828 case EM_PPC64:
829 case EM_PPC:
2b100bb5 830 case EM_TI_PRU:
e23eba97 831 case EM_RISCV:
99c513f6 832 case EM_RL78:
c7927a3c 833 case EM_RX:
e9f53129
AM
834 case EM_S390:
835 case EM_S390_OLD:
836 case EM_SH:
837 case EM_SPARC:
838 case EM_SPARC32PLUS:
839 case EM_SPARCV9:
840 case EM_SPU:
40b36596 841 case EM_TI_C6000:
aa137e4d
NC
842 case EM_TILEGX:
843 case EM_TILEPRO:
708e2187 844 case EM_V800:
e9f53129
AM
845 case EM_V850:
846 case EM_CYGNUS_V850:
847 case EM_VAX:
619ed720 848 case EM_VISIUM:
e9f53129 849 case EM_X86_64:
8a9036a4 850 case EM_L1OM:
7a9068fe 851 case EM_K1OM:
e9f53129
AM
852 case EM_XSTORMY16:
853 case EM_XTENSA:
854 case EM_XTENSA_OLD:
7ba29e2a
NC
855 case EM_MICROBLAZE:
856 case EM_MICROBLAZE_OLD:
f96bd6c2 857 case EM_WEBASSEMBLY:
9c19a809 858 return TRUE;
103f02d3 859
e9f53129
AM
860 case EM_68HC05:
861 case EM_68HC08:
862 case EM_68HC11:
863 case EM_68HC16:
864 case EM_FX66:
865 case EM_ME16:
d1133906 866 case EM_MMA:
d1133906
NC
867 case EM_NCPU:
868 case EM_NDR1:
e9f53129 869 case EM_PCP:
d1133906 870 case EM_ST100:
e9f53129 871 case EM_ST19:
d1133906 872 case EM_ST7:
e9f53129
AM
873 case EM_ST9PLUS:
874 case EM_STARCORE:
d1133906 875 case EM_SVX:
e9f53129 876 case EM_TINYJ:
9c19a809
NC
877 default:
878 warn (_("Don't know about relocations on this machine architecture\n"));
879 return FALSE;
880 }
881}
252b5132 882
dda8d76d 883/* Load RELA type relocations from FILEDATA at REL_OFFSET extending for REL_SIZE bytes.
32ec8896
NC
884 Returns TRUE upon success, FALSE otherwise. If successful then a
885 pointer to a malloc'ed buffer containing the relocs is placed in *RELASP,
886 and the number of relocs loaded is placed in *NRELASP. It is the caller's
887 responsibility to free the allocated buffer. */
888
889static bfd_boolean
dda8d76d
NC
890slurp_rela_relocs (Filedata * filedata,
891 unsigned long rel_offset,
892 unsigned long rel_size,
893 Elf_Internal_Rela ** relasp,
894 unsigned long * nrelasp)
9c19a809 895{
2cf0635d 896 Elf_Internal_Rela * relas;
8b73c356 897 size_t nrelas;
4d6ed7c8 898 unsigned int i;
252b5132 899
4d6ed7c8
NC
900 if (is_32bit_elf)
901 {
2cf0635d 902 Elf32_External_Rela * erelas;
103f02d3 903
dda8d76d 904 erelas = (Elf32_External_Rela *) get_data (NULL, filedata, rel_offset, 1,
9cf03b7e 905 rel_size, _("32-bit relocation data"));
a6e9f9df 906 if (!erelas)
32ec8896 907 return FALSE;
252b5132 908
4d6ed7c8 909 nrelas = rel_size / sizeof (Elf32_External_Rela);
103f02d3 910
3f5e193b
NC
911 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
912 sizeof (Elf_Internal_Rela));
103f02d3 913
4d6ed7c8
NC
914 if (relas == NULL)
915 {
c256ffe7 916 free (erelas);
591a748a 917 error (_("out of memory parsing relocs\n"));
32ec8896 918 return FALSE;
4d6ed7c8 919 }
103f02d3 920
4d6ed7c8
NC
921 for (i = 0; i < nrelas; i++)
922 {
923 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
924 relas[i].r_info = BYTE_GET (erelas[i].r_info);
598aaa76 925 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
4d6ed7c8 926 }
103f02d3 927
4d6ed7c8
NC
928 free (erelas);
929 }
930 else
931 {
2cf0635d 932 Elf64_External_Rela * erelas;
103f02d3 933
dda8d76d 934 erelas = (Elf64_External_Rela *) get_data (NULL, filedata, rel_offset, 1,
9cf03b7e 935 rel_size, _("64-bit relocation data"));
a6e9f9df 936 if (!erelas)
32ec8896 937 return FALSE;
4d6ed7c8
NC
938
939 nrelas = rel_size / sizeof (Elf64_External_Rela);
103f02d3 940
3f5e193b
NC
941 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
942 sizeof (Elf_Internal_Rela));
103f02d3 943
4d6ed7c8
NC
944 if (relas == NULL)
945 {
c256ffe7 946 free (erelas);
591a748a 947 error (_("out of memory parsing relocs\n"));
32ec8896 948 return FALSE;
9c19a809 949 }
4d6ed7c8
NC
950
951 for (i = 0; i < nrelas; i++)
9c19a809 952 {
66543521
AM
953 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
954 relas[i].r_info = BYTE_GET (erelas[i].r_info);
598aaa76 955 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
861fb55a
DJ
956
957 /* The #ifdef BFD64 below is to prevent a compile time
958 warning. We know that if we do not have a 64 bit data
959 type that we will never execute this code anyway. */
960#ifdef BFD64
dda8d76d
NC
961 if (filedata->file_header.e_machine == EM_MIPS
962 && filedata->file_header.e_ident[EI_DATA] != ELFDATA2MSB)
861fb55a
DJ
963 {
964 /* In little-endian objects, r_info isn't really a
965 64-bit little-endian value: it has a 32-bit
966 little-endian symbol index followed by four
967 individual byte fields. Reorder INFO
968 accordingly. */
91d6fa6a
NC
969 bfd_vma inf = relas[i].r_info;
970 inf = (((inf & 0xffffffff) << 32)
971 | ((inf >> 56) & 0xff)
972 | ((inf >> 40) & 0xff00)
973 | ((inf >> 24) & 0xff0000)
974 | ((inf >> 8) & 0xff000000));
975 relas[i].r_info = inf;
861fb55a
DJ
976 }
977#endif /* BFD64 */
4d6ed7c8 978 }
103f02d3 979
4d6ed7c8
NC
980 free (erelas);
981 }
32ec8896 982
4d6ed7c8
NC
983 *relasp = relas;
984 *nrelasp = nrelas;
32ec8896 985 return TRUE;
4d6ed7c8 986}
103f02d3 987
dda8d76d 988/* Load REL type relocations from FILEDATA at REL_OFFSET extending for REL_SIZE bytes.
32ec8896
NC
989 Returns TRUE upon success, FALSE otherwise. If successful then a
990 pointer to a malloc'ed buffer containing the relocs is placed in *RELSP,
991 and the number of relocs loaded is placed in *NRELSP. It is the caller's
992 responsibility to free the allocated buffer. */
993
994static bfd_boolean
dda8d76d
NC
995slurp_rel_relocs (Filedata * filedata,
996 unsigned long rel_offset,
997 unsigned long rel_size,
998 Elf_Internal_Rela ** relsp,
999 unsigned long * nrelsp)
4d6ed7c8 1000{
2cf0635d 1001 Elf_Internal_Rela * rels;
8b73c356 1002 size_t nrels;
4d6ed7c8 1003 unsigned int i;
103f02d3 1004
4d6ed7c8
NC
1005 if (is_32bit_elf)
1006 {
2cf0635d 1007 Elf32_External_Rel * erels;
103f02d3 1008
dda8d76d 1009 erels = (Elf32_External_Rel *) get_data (NULL, filedata, rel_offset, 1,
9cf03b7e 1010 rel_size, _("32-bit relocation data"));
a6e9f9df 1011 if (!erels)
32ec8896 1012 return FALSE;
103f02d3 1013
4d6ed7c8 1014 nrels = rel_size / sizeof (Elf32_External_Rel);
103f02d3 1015
3f5e193b 1016 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
103f02d3 1017
4d6ed7c8
NC
1018 if (rels == NULL)
1019 {
c256ffe7 1020 free (erels);
591a748a 1021 error (_("out of memory parsing relocs\n"));
32ec8896 1022 return FALSE;
4d6ed7c8
NC
1023 }
1024
1025 for (i = 0; i < nrels; i++)
1026 {
1027 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
1028 rels[i].r_info = BYTE_GET (erels[i].r_info);
c8286bd1 1029 rels[i].r_addend = 0;
9ea033b2 1030 }
4d6ed7c8
NC
1031
1032 free (erels);
9c19a809
NC
1033 }
1034 else
1035 {
2cf0635d 1036 Elf64_External_Rel * erels;
9ea033b2 1037
dda8d76d 1038 erels = (Elf64_External_Rel *) get_data (NULL, filedata, rel_offset, 1,
9cf03b7e 1039 rel_size, _("64-bit relocation data"));
a6e9f9df 1040 if (!erels)
32ec8896 1041 return FALSE;
103f02d3 1042
4d6ed7c8 1043 nrels = rel_size / sizeof (Elf64_External_Rel);
103f02d3 1044
3f5e193b 1045 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
103f02d3 1046
4d6ed7c8 1047 if (rels == NULL)
9c19a809 1048 {
c256ffe7 1049 free (erels);
591a748a 1050 error (_("out of memory parsing relocs\n"));
32ec8896 1051 return FALSE;
4d6ed7c8 1052 }
103f02d3 1053
4d6ed7c8
NC
1054 for (i = 0; i < nrels; i++)
1055 {
66543521
AM
1056 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
1057 rels[i].r_info = BYTE_GET (erels[i].r_info);
c8286bd1 1058 rels[i].r_addend = 0;
861fb55a
DJ
1059
1060 /* The #ifdef BFD64 below is to prevent a compile time
1061 warning. We know that if we do not have a 64 bit data
1062 type that we will never execute this code anyway. */
1063#ifdef BFD64
dda8d76d
NC
1064 if (filedata->file_header.e_machine == EM_MIPS
1065 && filedata->file_header.e_ident[EI_DATA] != ELFDATA2MSB)
861fb55a
DJ
1066 {
1067 /* In little-endian objects, r_info isn't really a
1068 64-bit little-endian value: it has a 32-bit
1069 little-endian symbol index followed by four
1070 individual byte fields. Reorder INFO
1071 accordingly. */
91d6fa6a
NC
1072 bfd_vma inf = rels[i].r_info;
1073 inf = (((inf & 0xffffffff) << 32)
1074 | ((inf >> 56) & 0xff)
1075 | ((inf >> 40) & 0xff00)
1076 | ((inf >> 24) & 0xff0000)
1077 | ((inf >> 8) & 0xff000000));
1078 rels[i].r_info = inf;
861fb55a
DJ
1079 }
1080#endif /* BFD64 */
4d6ed7c8 1081 }
103f02d3 1082
4d6ed7c8
NC
1083 free (erels);
1084 }
32ec8896 1085
4d6ed7c8
NC
1086 *relsp = rels;
1087 *nrelsp = nrels;
32ec8896 1088 return TRUE;
4d6ed7c8 1089}
103f02d3 1090
aca88567
NC
1091/* Returns the reloc type extracted from the reloc info field. */
1092
1093static unsigned int
dda8d76d 1094get_reloc_type (Filedata * filedata, bfd_vma reloc_info)
aca88567
NC
1095{
1096 if (is_32bit_elf)
1097 return ELF32_R_TYPE (reloc_info);
1098
dda8d76d 1099 switch (filedata->file_header.e_machine)
aca88567
NC
1100 {
1101 case EM_MIPS:
1102 /* Note: We assume that reloc_info has already been adjusted for us. */
1103 return ELF64_MIPS_R_TYPE (reloc_info);
1104
1105 case EM_SPARCV9:
1106 return ELF64_R_TYPE_ID (reloc_info);
1107
1108 default:
1109 return ELF64_R_TYPE (reloc_info);
1110 }
1111}
1112
1113/* Return the symbol index extracted from the reloc info field. */
1114
1115static bfd_vma
1116get_reloc_symindex (bfd_vma reloc_info)
1117{
1118 return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
1119}
1120
13761a11 1121static inline bfd_boolean
dda8d76d 1122uses_msp430x_relocs (Filedata * filedata)
13761a11
NC
1123{
1124 return
dda8d76d 1125 filedata->file_header.e_machine == EM_MSP430 /* Paranoia. */
13761a11 1126 /* GCC uses osabi == ELFOSBI_STANDALONE. */
dda8d76d 1127 && (((filedata->file_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
13761a11 1128 /* TI compiler uses ELFOSABI_NONE. */
dda8d76d 1129 || (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
13761a11
NC
1130}
1131
d3ba0551
AM
1132/* Display the contents of the relocation data found at the specified
1133 offset. */
ee42cf8c 1134
32ec8896 1135static bfd_boolean
dda8d76d
NC
1136dump_relocations (Filedata * filedata,
1137 unsigned long rel_offset,
1138 unsigned long rel_size,
1139 Elf_Internal_Sym * symtab,
1140 unsigned long nsyms,
1141 char * strtab,
1142 unsigned long strtablen,
1143 int is_rela,
1144 bfd_boolean is_dynsym)
4d6ed7c8 1145{
32ec8896 1146 unsigned long i;
2cf0635d 1147 Elf_Internal_Rela * rels;
32ec8896 1148 bfd_boolean res = TRUE;
103f02d3 1149
4d6ed7c8 1150 if (is_rela == UNKNOWN)
dda8d76d 1151 is_rela = guess_is_rela (filedata->file_header.e_machine);
103f02d3 1152
4d6ed7c8
NC
1153 if (is_rela)
1154 {
dda8d76d 1155 if (!slurp_rela_relocs (filedata, rel_offset, rel_size, &rels, &rel_size))
32ec8896 1156 return FALSE;
4d6ed7c8
NC
1157 }
1158 else
1159 {
dda8d76d 1160 if (!slurp_rel_relocs (filedata, rel_offset, rel_size, &rels, &rel_size))
32ec8896 1161 return FALSE;
252b5132
RH
1162 }
1163
410f7a12
L
1164 if (is_32bit_elf)
1165 {
1166 if (is_rela)
2c71103e
NC
1167 {
1168 if (do_wide)
1169 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
1170 else
1171 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
1172 }
410f7a12 1173 else
2c71103e
NC
1174 {
1175 if (do_wide)
1176 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
1177 else
1178 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
1179 }
410f7a12 1180 }
252b5132 1181 else
410f7a12
L
1182 {
1183 if (is_rela)
2c71103e
NC
1184 {
1185 if (do_wide)
8beeaeb7 1186 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
2c71103e
NC
1187 else
1188 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
1189 }
410f7a12 1190 else
2c71103e
NC
1191 {
1192 if (do_wide)
8beeaeb7 1193 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
2c71103e
NC
1194 else
1195 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
1196 }
410f7a12 1197 }
252b5132
RH
1198
1199 for (i = 0; i < rel_size; i++)
1200 {
2cf0635d 1201 const char * rtype;
b34976b6 1202 bfd_vma offset;
91d6fa6a 1203 bfd_vma inf;
b34976b6
AM
1204 bfd_vma symtab_index;
1205 bfd_vma type;
103f02d3 1206
b34976b6 1207 offset = rels[i].r_offset;
91d6fa6a 1208 inf = rels[i].r_info;
103f02d3 1209
dda8d76d 1210 type = get_reloc_type (filedata, inf);
91d6fa6a 1211 symtab_index = get_reloc_symindex (inf);
252b5132 1212
410f7a12
L
1213 if (is_32bit_elf)
1214 {
39dbeff8
AM
1215 printf ("%8.8lx %8.8lx ",
1216 (unsigned long) offset & 0xffffffff,
91d6fa6a 1217 (unsigned long) inf & 0xffffffff);
410f7a12
L
1218 }
1219 else
1220 {
39dbeff8
AM
1221#if BFD_HOST_64BIT_LONG
1222 printf (do_wide
1223 ? "%16.16lx %16.16lx "
1224 : "%12.12lx %12.12lx ",
91d6fa6a 1225 offset, inf);
39dbeff8 1226#elif BFD_HOST_64BIT_LONG_LONG
6e3d6dc1 1227#ifndef __MSVCRT__
39dbeff8
AM
1228 printf (do_wide
1229 ? "%16.16llx %16.16llx "
1230 : "%12.12llx %12.12llx ",
91d6fa6a 1231 offset, inf);
6e3d6dc1
NC
1232#else
1233 printf (do_wide
1234 ? "%16.16I64x %16.16I64x "
1235 : "%12.12I64x %12.12I64x ",
91d6fa6a 1236 offset, inf);
6e3d6dc1 1237#endif
39dbeff8 1238#else
2c71103e
NC
1239 printf (do_wide
1240 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1241 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
410f7a12
L
1242 _bfd_int64_high (offset),
1243 _bfd_int64_low (offset),
91d6fa6a
NC
1244 _bfd_int64_high (inf),
1245 _bfd_int64_low (inf));
9ea033b2 1246#endif
410f7a12 1247 }
103f02d3 1248
dda8d76d 1249 switch (filedata->file_header.e_machine)
252b5132
RH
1250 {
1251 default:
1252 rtype = NULL;
1253 break;
1254
a06ea964
NC
1255 case EM_AARCH64:
1256 rtype = elf_aarch64_reloc_type (type);
1257 break;
1258
2b0337b0 1259 case EM_M32R:
252b5132 1260 case EM_CYGNUS_M32R:
9ea033b2 1261 rtype = elf_m32r_reloc_type (type);
252b5132
RH
1262 break;
1263
1264 case EM_386:
22abe556 1265 case EM_IAMCU:
9ea033b2 1266 rtype = elf_i386_reloc_type (type);
252b5132
RH
1267 break;
1268
ba2685cc
AM
1269 case EM_68HC11:
1270 case EM_68HC12:
1271 rtype = elf_m68hc11_reloc_type (type);
1272 break;
75751cd9 1273
252b5132 1274 case EM_68K:
9ea033b2 1275 rtype = elf_m68k_reloc_type (type);
252b5132
RH
1276 break;
1277
63fcb9e9 1278 case EM_960:
9ea033b2 1279 rtype = elf_i960_reloc_type (type);
63fcb9e9
ILT
1280 break;
1281
adde6300 1282 case EM_AVR:
2b0337b0 1283 case EM_AVR_OLD:
adde6300
AM
1284 rtype = elf_avr_reloc_type (type);
1285 break;
1286
9ea033b2
NC
1287 case EM_OLD_SPARCV9:
1288 case EM_SPARC32PLUS:
1289 case EM_SPARCV9:
252b5132 1290 case EM_SPARC:
9ea033b2 1291 rtype = elf_sparc_reloc_type (type);
252b5132
RH
1292 break;
1293
e9f53129
AM
1294 case EM_SPU:
1295 rtype = elf_spu_reloc_type (type);
1296 break;
1297
708e2187
NC
1298 case EM_V800:
1299 rtype = v800_reloc_type (type);
1300 break;
2b0337b0 1301 case EM_V850:
252b5132 1302 case EM_CYGNUS_V850:
9ea033b2 1303 rtype = v850_reloc_type (type);
252b5132
RH
1304 break;
1305
2b0337b0 1306 case EM_D10V:
252b5132 1307 case EM_CYGNUS_D10V:
9ea033b2 1308 rtype = elf_d10v_reloc_type (type);
252b5132
RH
1309 break;
1310
2b0337b0 1311 case EM_D30V:
252b5132 1312 case EM_CYGNUS_D30V:
9ea033b2 1313 rtype = elf_d30v_reloc_type (type);
252b5132
RH
1314 break;
1315
d172d4ba
NC
1316 case EM_DLX:
1317 rtype = elf_dlx_reloc_type (type);
1318 break;
1319
252b5132 1320 case EM_SH:
9ea033b2 1321 rtype = elf_sh_reloc_type (type);
252b5132
RH
1322 break;
1323
2b0337b0 1324 case EM_MN10300:
252b5132 1325 case EM_CYGNUS_MN10300:
9ea033b2 1326 rtype = elf_mn10300_reloc_type (type);
252b5132
RH
1327 break;
1328
2b0337b0 1329 case EM_MN10200:
252b5132 1330 case EM_CYGNUS_MN10200:
9ea033b2 1331 rtype = elf_mn10200_reloc_type (type);
252b5132
RH
1332 break;
1333
2b0337b0 1334 case EM_FR30:
252b5132 1335 case EM_CYGNUS_FR30:
9ea033b2 1336 rtype = elf_fr30_reloc_type (type);
252b5132
RH
1337 break;
1338
ba2685cc
AM
1339 case EM_CYGNUS_FRV:
1340 rtype = elf_frv_reloc_type (type);
1341 break;
5c70f934 1342
3f8107ab
AM
1343 case EM_FT32:
1344 rtype = elf_ft32_reloc_type (type);
1345 break;
1346
252b5132 1347 case EM_MCORE:
9ea033b2 1348 rtype = elf_mcore_reloc_type (type);
252b5132
RH
1349 break;
1350
3c3bdf30
NC
1351 case EM_MMIX:
1352 rtype = elf_mmix_reloc_type (type);
1353 break;
1354
5506d11a
AM
1355 case EM_MOXIE:
1356 rtype = elf_moxie_reloc_type (type);
1357 break;
1358
2469cfa2 1359 case EM_MSP430:
dda8d76d 1360 if (uses_msp430x_relocs (filedata))
13761a11
NC
1361 {
1362 rtype = elf_msp430x_reloc_type (type);
1363 break;
1364 }
1a0670f3 1365 /* Fall through. */
2469cfa2
NC
1366 case EM_MSP430_OLD:
1367 rtype = elf_msp430_reloc_type (type);
1368 break;
1369
35c08157
KLC
1370 case EM_NDS32:
1371 rtype = elf_nds32_reloc_type (type);
1372 break;
1373
252b5132 1374 case EM_PPC:
9ea033b2 1375 rtype = elf_ppc_reloc_type (type);
252b5132
RH
1376 break;
1377
c833c019
AM
1378 case EM_PPC64:
1379 rtype = elf_ppc64_reloc_type (type);
1380 break;
1381
252b5132 1382 case EM_MIPS:
4fe85591 1383 case EM_MIPS_RS3_LE:
9ea033b2 1384 rtype = elf_mips_reloc_type (type);
252b5132
RH
1385 break;
1386
e23eba97
NC
1387 case EM_RISCV:
1388 rtype = elf_riscv_reloc_type (type);
1389 break;
1390
252b5132 1391 case EM_ALPHA:
9ea033b2 1392 rtype = elf_alpha_reloc_type (type);
252b5132
RH
1393 break;
1394
1395 case EM_ARM:
9ea033b2 1396 rtype = elf_arm_reloc_type (type);
252b5132
RH
1397 break;
1398
584da044 1399 case EM_ARC:
886a2506
NC
1400 case EM_ARC_COMPACT:
1401 case EM_ARC_COMPACT2:
9ea033b2 1402 rtype = elf_arc_reloc_type (type);
252b5132
RH
1403 break;
1404
1405 case EM_PARISC:
69e617ca 1406 rtype = elf_hppa_reloc_type (type);
252b5132 1407 break;
7d466069 1408
b8720f9d
JL
1409 case EM_H8_300:
1410 case EM_H8_300H:
1411 case EM_H8S:
1412 rtype = elf_h8_reloc_type (type);
1413 break;
1414
73589c9d
CS
1415 case EM_OR1K:
1416 rtype = elf_or1k_reloc_type (type);
3b16e843
NC
1417 break;
1418
7d466069 1419 case EM_PJ:
2b0337b0 1420 case EM_PJ_OLD:
7d466069
ILT
1421 rtype = elf_pj_reloc_type (type);
1422 break;
800eeca4
JW
1423 case EM_IA_64:
1424 rtype = elf_ia64_reloc_type (type);
1425 break;
1b61cf92
HPN
1426
1427 case EM_CRIS:
1428 rtype = elf_cris_reloc_type (type);
1429 break;
535c37ff
JE
1430
1431 case EM_860:
1432 rtype = elf_i860_reloc_type (type);
1433 break;
bcedfee6
NC
1434
1435 case EM_X86_64:
8a9036a4 1436 case EM_L1OM:
7a9068fe 1437 case EM_K1OM:
bcedfee6
NC
1438 rtype = elf_x86_64_reloc_type (type);
1439 break;
a85d7ed0 1440
35b1837e
AM
1441 case EM_S370:
1442 rtype = i370_reloc_type (type);
1443 break;
1444
53c7db4b
KH
1445 case EM_S390_OLD:
1446 case EM_S390:
1447 rtype = elf_s390_reloc_type (type);
1448 break;
93fbbb04 1449
1c0d3aa6
NC
1450 case EM_SCORE:
1451 rtype = elf_score_reloc_type (type);
1452 break;
1453
93fbbb04
GK
1454 case EM_XSTORMY16:
1455 rtype = elf_xstormy16_reloc_type (type);
1456 break;
179d3252 1457
1fe1f39c
NC
1458 case EM_CRX:
1459 rtype = elf_crx_reloc_type (type);
1460 break;
1461
179d3252
JT
1462 case EM_VAX:
1463 rtype = elf_vax_reloc_type (type);
1464 break;
1e4cf259 1465
619ed720
EB
1466 case EM_VISIUM:
1467 rtype = elf_visium_reloc_type (type);
1468 break;
1469
cfb8c092
NC
1470 case EM_ADAPTEVA_EPIPHANY:
1471 rtype = elf_epiphany_reloc_type (type);
1472 break;
1473
1e4cf259
NC
1474 case EM_IP2K:
1475 case EM_IP2K_OLD:
1476 rtype = elf_ip2k_reloc_type (type);
1477 break;
3b36097d
SC
1478
1479 case EM_IQ2000:
1480 rtype = elf_iq2000_reloc_type (type);
1481 break;
88da6820
NC
1482
1483 case EM_XTENSA_OLD:
1484 case EM_XTENSA:
1485 rtype = elf_xtensa_reloc_type (type);
1486 break;
a34e3ecb 1487
84e94c90
NC
1488 case EM_LATTICEMICO32:
1489 rtype = elf_lm32_reloc_type (type);
1490 break;
1491
ff7eeb89 1492 case EM_M32C_OLD:
49f58d10
JB
1493 case EM_M32C:
1494 rtype = elf_m32c_reloc_type (type);
1495 break;
1496
d031aafb
NS
1497 case EM_MT:
1498 rtype = elf_mt_reloc_type (type);
a34e3ecb 1499 break;
1d65ded4
CM
1500
1501 case EM_BLACKFIN:
1502 rtype = elf_bfin_reloc_type (type);
1503 break;
15ab5209
DB
1504
1505 case EM_CYGNUS_MEP:
1506 rtype = elf_mep_reloc_type (type);
1507 break;
60bca95a
NC
1508
1509 case EM_CR16:
1510 rtype = elf_cr16_reloc_type (type);
1511 break;
dd24e3da 1512
7ba29e2a
NC
1513 case EM_MICROBLAZE:
1514 case EM_MICROBLAZE_OLD:
1515 rtype = elf_microblaze_reloc_type (type);
1516 break;
c7927a3c 1517
99c513f6
DD
1518 case EM_RL78:
1519 rtype = elf_rl78_reloc_type (type);
1520 break;
1521
c7927a3c
NC
1522 case EM_RX:
1523 rtype = elf_rx_reloc_type (type);
1524 break;
c29aca4a 1525
a3c62988
NC
1526 case EM_METAG:
1527 rtype = elf_metag_reloc_type (type);
1528 break;
1529
c29aca4a
NC
1530 case EM_XC16X:
1531 case EM_C166:
1532 rtype = elf_xc16x_reloc_type (type);
1533 break;
40b36596
JM
1534
1535 case EM_TI_C6000:
1536 rtype = elf_tic6x_reloc_type (type);
1537 break;
aa137e4d
NC
1538
1539 case EM_TILEGX:
1540 rtype = elf_tilegx_reloc_type (type);
1541 break;
1542
1543 case EM_TILEPRO:
1544 rtype = elf_tilepro_reloc_type (type);
1545 break;
f6c1a2d5 1546
f96bd6c2
PC
1547 case EM_WEBASSEMBLY:
1548 rtype = elf_wasm32_reloc_type (type);
1549 break;
1550
f6c1a2d5
NC
1551 case EM_XGATE:
1552 rtype = elf_xgate_reloc_type (type);
1553 break;
36591ba1
SL
1554
1555 case EM_ALTERA_NIOS2:
1556 rtype = elf_nios2_reloc_type (type);
1557 break;
2b100bb5
DD
1558
1559 case EM_TI_PRU:
1560 rtype = elf_pru_reloc_type (type);
1561 break;
252b5132
RH
1562 }
1563
1564 if (rtype == NULL)
39dbeff8 1565 printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
252b5132 1566 else
5c144731 1567 printf (do_wide ? "%-22s" : "%-17.17s", rtype);
252b5132 1568
dda8d76d 1569 if (filedata->file_header.e_machine == EM_ALPHA
157c2599 1570 && rtype != NULL
7ace3541
RH
1571 && streq (rtype, "R_ALPHA_LITUSE")
1572 && is_rela)
1573 {
1574 switch (rels[i].r_addend)
1575 {
1576 case LITUSE_ALPHA_ADDR: rtype = "ADDR"; break;
1577 case LITUSE_ALPHA_BASE: rtype = "BASE"; break;
1578 case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1579 case LITUSE_ALPHA_JSR: rtype = "JSR"; break;
1580 case LITUSE_ALPHA_TLSGD: rtype = "TLSGD"; break;
1581 case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1582 case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1583 default: rtype = NULL;
1584 }
32ec8896 1585
7ace3541
RH
1586 if (rtype)
1587 printf (" (%s)", rtype);
1588 else
1589 {
1590 putchar (' ');
1591 printf (_("<unknown addend: %lx>"),
1592 (unsigned long) rels[i].r_addend);
32ec8896 1593 res = FALSE;
7ace3541
RH
1594 }
1595 }
1596 else if (symtab_index)
252b5132 1597 {
af3fc3bc 1598 if (symtab == NULL || symtab_index >= nsyms)
32ec8896
NC
1599 {
1600 error (_(" bad symbol index: %08lx in reloc"), (unsigned long) symtab_index);
1601 res = FALSE;
1602 }
af3fc3bc 1603 else
19936277 1604 {
2cf0635d 1605 Elf_Internal_Sym * psym;
bb4d2ac2
L
1606 const char * version_string;
1607 enum versioned_symbol_info sym_info;
1608 unsigned short vna_other;
19936277 1609
af3fc3bc 1610 psym = symtab + symtab_index;
103f02d3 1611
bb4d2ac2 1612 version_string
dda8d76d 1613 = get_symbol_version_string (filedata, is_dynsym,
bb4d2ac2
L
1614 strtab, strtablen,
1615 symtab_index,
1616 psym,
1617 &sym_info,
1618 &vna_other);
1619
af3fc3bc 1620 printf (" ");
171191ba 1621
d8045f23
NC
1622 if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1623 {
1624 const char * name;
1625 unsigned int len;
1626 unsigned int width = is_32bit_elf ? 8 : 14;
1627
1628 /* Relocations against GNU_IFUNC symbols do not use the value
1629 of the symbol as the address to relocate against. Instead
1630 they invoke the function named by the symbol and use its
1631 result as the address for relocation.
1632
1633 To indicate this to the user, do not display the value of
1634 the symbol in the "Symbols's Value" field. Instead show
1635 its name followed by () as a hint that the symbol is
1636 invoked. */
1637
1638 if (strtab == NULL
1639 || psym->st_name == 0
1640 || psym->st_name >= strtablen)
1641 name = "??";
1642 else
1643 name = strtab + psym->st_name;
1644
1645 len = print_symbol (width, name);
bb4d2ac2
L
1646 if (version_string)
1647 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1648 version_string);
d8045f23
NC
1649 printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1650 }
1651 else
1652 {
1653 print_vma (psym->st_value, LONG_HEX);
171191ba 1654
d8045f23
NC
1655 printf (is_32bit_elf ? " " : " ");
1656 }
103f02d3 1657
af3fc3bc 1658 if (psym->st_name == 0)
f1ef08cb 1659 {
2cf0635d 1660 const char * sec_name = "<null>";
f1ef08cb
AM
1661 char name_buf[40];
1662
1663 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1664 {
dda8d76d
NC
1665 if (psym->st_shndx < filedata->file_header.e_shnum)
1666 sec_name = SECTION_NAME (filedata->section_headers + psym->st_shndx);
f1ef08cb
AM
1667 else if (psym->st_shndx == SHN_ABS)
1668 sec_name = "ABS";
1669 else if (psym->st_shndx == SHN_COMMON)
1670 sec_name = "COMMON";
dda8d76d 1671 else if ((filedata->file_header.e_machine == EM_MIPS
ac145307 1672 && psym->st_shndx == SHN_MIPS_SCOMMON)
dda8d76d 1673 || (filedata->file_header.e_machine == EM_TI_C6000
ac145307 1674 && psym->st_shndx == SHN_TIC6X_SCOMMON))
172553c7 1675 sec_name = "SCOMMON";
dda8d76d 1676 else if (filedata->file_header.e_machine == EM_MIPS
172553c7
TS
1677 && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1678 sec_name = "SUNDEF";
dda8d76d
NC
1679 else if ((filedata->file_header.e_machine == EM_X86_64
1680 || filedata->file_header.e_machine == EM_L1OM
1681 || filedata->file_header.e_machine == EM_K1OM)
3b22753a
L
1682 && psym->st_shndx == SHN_X86_64_LCOMMON)
1683 sec_name = "LARGE_COMMON";
dda8d76d
NC
1684 else if (filedata->file_header.e_machine == EM_IA_64
1685 && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
9ce701e2
L
1686 && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1687 sec_name = "ANSI_COM";
dda8d76d 1688 else if (is_ia64_vms (filedata)
148b93f2
NC
1689 && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1690 sec_name = "VMS_SYMVEC";
f1ef08cb
AM
1691 else
1692 {
1693 sprintf (name_buf, "<section 0x%x>",
1694 (unsigned int) psym->st_shndx);
1695 sec_name = name_buf;
1696 }
1697 }
1698 print_symbol (22, sec_name);
1699 }
af3fc3bc 1700 else if (strtab == NULL)
d79b3d50 1701 printf (_("<string table index: %3ld>"), psym->st_name);
c256ffe7 1702 else if (psym->st_name >= strtablen)
32ec8896
NC
1703 {
1704 error (_("<corrupt string table index: %3ld>"), psym->st_name);
1705 res = FALSE;
1706 }
af3fc3bc 1707 else
bb4d2ac2
L
1708 {
1709 print_symbol (22, strtab + psym->st_name);
1710 if (version_string)
1711 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1712 version_string);
1713 }
103f02d3 1714
af3fc3bc 1715 if (is_rela)
171191ba 1716 {
7360e63f 1717 bfd_vma off = rels[i].r_addend;
171191ba 1718
7360e63f 1719 if ((bfd_signed_vma) off < 0)
598aaa76 1720 printf (" - %" BFD_VMA_FMT "x", - off);
171191ba 1721 else
598aaa76 1722 printf (" + %" BFD_VMA_FMT "x", off);
171191ba 1723 }
19936277 1724 }
252b5132 1725 }
1b228002 1726 else if (is_rela)
f7a99963 1727 {
7360e63f 1728 bfd_vma off = rels[i].r_addend;
e04d7088
L
1729
1730 printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
7360e63f 1731 if ((bfd_signed_vma) off < 0)
e04d7088
L
1732 printf ("-%" BFD_VMA_FMT "x", - off);
1733 else
1734 printf ("%" BFD_VMA_FMT "x", off);
f7a99963 1735 }
252b5132 1736
dda8d76d 1737 if (filedata->file_header.e_machine == EM_SPARCV9
157c2599
NC
1738 && rtype != NULL
1739 && streq (rtype, "R_SPARC_OLO10"))
91d6fa6a 1740 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
351b4b40 1741
252b5132 1742 putchar ('\n');
2c71103e 1743
aca88567 1744#ifdef BFD64
dda8d76d 1745 if (! is_32bit_elf && filedata->file_header.e_machine == EM_MIPS)
2c71103e 1746 {
91d6fa6a
NC
1747 bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1748 bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
2cf0635d
NC
1749 const char * rtype2 = elf_mips_reloc_type (type2);
1750 const char * rtype3 = elf_mips_reloc_type (type3);
aca88567 1751
2c71103e
NC
1752 printf (" Type2: ");
1753
1754 if (rtype2 == NULL)
39dbeff8
AM
1755 printf (_("unrecognized: %-7lx"),
1756 (unsigned long) type2 & 0xffffffff);
2c71103e
NC
1757 else
1758 printf ("%-17.17s", rtype2);
1759
18bd398b 1760 printf ("\n Type3: ");
2c71103e
NC
1761
1762 if (rtype3 == NULL)
39dbeff8
AM
1763 printf (_("unrecognized: %-7lx"),
1764 (unsigned long) type3 & 0xffffffff);
2c71103e
NC
1765 else
1766 printf ("%-17.17s", rtype3);
1767
53c7db4b 1768 putchar ('\n');
2c71103e 1769 }
aca88567 1770#endif /* BFD64 */
252b5132
RH
1771 }
1772
c8286bd1 1773 free (rels);
32ec8896
NC
1774
1775 return res;
252b5132
RH
1776}
1777
1778static const char *
d3ba0551 1779get_mips_dynamic_type (unsigned long type)
252b5132
RH
1780{
1781 switch (type)
1782 {
1783 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1784 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1785 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1786 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1787 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1788 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1789 case DT_MIPS_MSYM: return "MIPS_MSYM";
1790 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1791 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1792 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1793 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1794 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1795 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1796 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1797 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1798 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1799 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
a5499fa4 1800 case DT_MIPS_RLD_MAP_REL: return "MIPS_RLD_MAP_REL";
252b5132
RH
1801 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1802 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1803 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1804 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1805 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1806 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1807 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1808 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1809 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1810 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1811 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1812 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1813 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1814 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1815 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1816 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1817 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1818 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1819 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1820 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1821 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1822 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1823 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1824 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1825 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1826 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
861fb55a
DJ
1827 case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1828 case DT_MIPS_RWPLT: return "MIPS_RWPLT";
252b5132
RH
1829 default:
1830 return NULL;
1831 }
1832}
1833
9a097730 1834static const char *
d3ba0551 1835get_sparc64_dynamic_type (unsigned long type)
9a097730
RH
1836{
1837 switch (type)
1838 {
1839 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1840 default:
1841 return NULL;
1842 }
103f02d3
UD
1843}
1844
7490d522
AM
1845static const char *
1846get_ppc_dynamic_type (unsigned long type)
1847{
1848 switch (type)
1849 {
a7f2871e 1850 case DT_PPC_GOT: return "PPC_GOT";
e8910a83 1851 case DT_PPC_OPT: return "PPC_OPT";
7490d522
AM
1852 default:
1853 return NULL;
1854 }
1855}
1856
f1cb7e17 1857static const char *
d3ba0551 1858get_ppc64_dynamic_type (unsigned long type)
f1cb7e17
AM
1859{
1860 switch (type)
1861 {
a7f2871e
AM
1862 case DT_PPC64_GLINK: return "PPC64_GLINK";
1863 case DT_PPC64_OPD: return "PPC64_OPD";
1864 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
e8910a83 1865 case DT_PPC64_OPT: return "PPC64_OPT";
f1cb7e17
AM
1866 default:
1867 return NULL;
1868 }
1869}
1870
103f02d3 1871static const char *
d3ba0551 1872get_parisc_dynamic_type (unsigned long type)
103f02d3
UD
1873{
1874 switch (type)
1875 {
1876 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1877 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1878 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1879 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1880 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1881 case DT_HP_PREINIT: return "HP_PREINIT";
1882 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1883 case DT_HP_NEEDED: return "HP_NEEDED";
1884 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1885 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1886 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1887 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1888 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
eec8f817
DA
1889 case DT_HP_EPLTREL: return "HP_GST_EPLTREL";
1890 case DT_HP_EPLTRELSZ: return "HP_GST_EPLTRELSZ";
1891 case DT_HP_FILTERED: return "HP_FILTERED";
1892 case DT_HP_FILTER_TLS: return "HP_FILTER_TLS";
1893 case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1894 case DT_HP_LAZYLOAD: return "HP_LAZYLOAD";
1895 case DT_HP_BIND_NOW_COUNT: return "HP_BIND_NOW_COUNT";
1896 case DT_PLT: return "PLT";
1897 case DT_PLT_SIZE: return "PLT_SIZE";
1898 case DT_DLT: return "DLT";
1899 case DT_DLT_SIZE: return "DLT_SIZE";
103f02d3
UD
1900 default:
1901 return NULL;
1902 }
1903}
9a097730 1904
ecc51f48 1905static const char *
d3ba0551 1906get_ia64_dynamic_type (unsigned long type)
ecc51f48
NC
1907{
1908 switch (type)
1909 {
148b93f2
NC
1910 case DT_IA_64_PLT_RESERVE: return "IA_64_PLT_RESERVE";
1911 case DT_IA_64_VMS_SUBTYPE: return "VMS_SUBTYPE";
1912 case DT_IA_64_VMS_IMGIOCNT: return "VMS_IMGIOCNT";
1913 case DT_IA_64_VMS_LNKFLAGS: return "VMS_LNKFLAGS";
1914 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1915 case DT_IA_64_VMS_IDENT: return "VMS_IDENT";
1916 case DT_IA_64_VMS_NEEDED_IDENT: return "VMS_NEEDED_IDENT";
1917 case DT_IA_64_VMS_IMG_RELA_CNT: return "VMS_IMG_RELA_CNT";
1918 case DT_IA_64_VMS_SEG_RELA_CNT: return "VMS_SEG_RELA_CNT";
1919 case DT_IA_64_VMS_FIXUP_RELA_CNT: return "VMS_FIXUP_RELA_CNT";
1920 case DT_IA_64_VMS_FIXUP_NEEDED: return "VMS_FIXUP_NEEDED";
1921 case DT_IA_64_VMS_SYMVEC_CNT: return "VMS_SYMVEC_CNT";
1922 case DT_IA_64_VMS_XLATED: return "VMS_XLATED";
1923 case DT_IA_64_VMS_STACKSIZE: return "VMS_STACKSIZE";
1924 case DT_IA_64_VMS_UNWINDSZ: return "VMS_UNWINDSZ";
1925 case DT_IA_64_VMS_UNWIND_CODSEG: return "VMS_UNWIND_CODSEG";
1926 case DT_IA_64_VMS_UNWIND_INFOSEG: return "VMS_UNWIND_INFOSEG";
1927 case DT_IA_64_VMS_LINKTIME: return "VMS_LINKTIME";
1928 case DT_IA_64_VMS_SEG_NO: return "VMS_SEG_NO";
1929 case DT_IA_64_VMS_SYMVEC_OFFSET: return "VMS_SYMVEC_OFFSET";
1930 case DT_IA_64_VMS_SYMVEC_SEG: return "VMS_SYMVEC_SEG";
1931 case DT_IA_64_VMS_UNWIND_OFFSET: return "VMS_UNWIND_OFFSET";
1932 case DT_IA_64_VMS_UNWIND_SEG: return "VMS_UNWIND_SEG";
1933 case DT_IA_64_VMS_STRTAB_OFFSET: return "VMS_STRTAB_OFFSET";
1934 case DT_IA_64_VMS_SYSVER_OFFSET: return "VMS_SYSVER_OFFSET";
1935 case DT_IA_64_VMS_IMG_RELA_OFF: return "VMS_IMG_RELA_OFF";
1936 case DT_IA_64_VMS_SEG_RELA_OFF: return "VMS_SEG_RELA_OFF";
1937 case DT_IA_64_VMS_FIXUP_RELA_OFF: return "VMS_FIXUP_RELA_OFF";
1938 case DT_IA_64_VMS_PLTGOT_OFFSET: return "VMS_PLTGOT_OFFSET";
1939 case DT_IA_64_VMS_PLTGOT_SEG: return "VMS_PLTGOT_SEG";
1940 case DT_IA_64_VMS_FPMODE: return "VMS_FPMODE";
ecc51f48
NC
1941 default:
1942 return NULL;
1943 }
1944}
1945
fd85a6a1
NC
1946static const char *
1947get_solaris_section_type (unsigned long type)
1948{
1949 switch (type)
1950 {
1951 case 0x6fffffee: return "SUNW_ancillary";
1952 case 0x6fffffef: return "SUNW_capchain";
1953 case 0x6ffffff0: return "SUNW_capinfo";
1954 case 0x6ffffff1: return "SUNW_symsort";
1955 case 0x6ffffff2: return "SUNW_tlssort";
1956 case 0x6ffffff3: return "SUNW_LDYNSYM";
1957 case 0x6ffffff4: return "SUNW_dof";
1958 case 0x6ffffff5: return "SUNW_cap";
1959 case 0x6ffffff6: return "SUNW_SIGNATURE";
1960 case 0x6ffffff7: return "SUNW_ANNOTATE";
1961 case 0x6ffffff8: return "SUNW_DEBUGSTR";
1962 case 0x6ffffff9: return "SUNW_DEBUG";
1963 case 0x6ffffffa: return "SUNW_move";
1964 case 0x6ffffffb: return "SUNW_COMDAT";
1965 case 0x6ffffffc: return "SUNW_syminfo";
1966 case 0x6ffffffd: return "SUNW_verdef";
1967 case 0x6ffffffe: return "SUNW_verneed";
1968 case 0x6fffffff: return "SUNW_versym";
1969 case 0x70000000: return "SPARC_GOTDATA";
1970 default: return NULL;
1971 }
1972}
1973
fabcb361
RH
1974static const char *
1975get_alpha_dynamic_type (unsigned long type)
1976{
1977 switch (type)
1978 {
1979 case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
32ec8896 1980 default: return NULL;
fabcb361
RH
1981 }
1982}
1983
1c0d3aa6
NC
1984static const char *
1985get_score_dynamic_type (unsigned long type)
1986{
1987 switch (type)
1988 {
1989 case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1990 case DT_SCORE_LOCAL_GOTNO: return "SCORE_LOCAL_GOTNO";
1991 case DT_SCORE_SYMTABNO: return "SCORE_SYMTABNO";
1992 case DT_SCORE_GOTSYM: return "SCORE_GOTSYM";
1993 case DT_SCORE_UNREFEXTNO: return "SCORE_UNREFEXTNO";
1994 case DT_SCORE_HIPAGENO: return "SCORE_HIPAGENO";
32ec8896 1995 default: return NULL;
1c0d3aa6
NC
1996 }
1997}
1998
40b36596
JM
1999static const char *
2000get_tic6x_dynamic_type (unsigned long type)
2001{
2002 switch (type)
2003 {
2004 case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
2005 case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
2006 case DT_C6000_DSBT_BASE: return "C6000_DSBT_BASE";
2007 case DT_C6000_DSBT_SIZE: return "C6000_DSBT_SIZE";
2008 case DT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
2009 case DT_C6000_DSBT_INDEX: return "C6000_DSBT_INDEX";
32ec8896 2010 default: return NULL;
40b36596
JM
2011 }
2012}
1c0d3aa6 2013
36591ba1
SL
2014static const char *
2015get_nios2_dynamic_type (unsigned long type)
2016{
2017 switch (type)
2018 {
2019 case DT_NIOS2_GP: return "NIOS2_GP";
32ec8896 2020 default: return NULL;
36591ba1
SL
2021 }
2022}
2023
fd85a6a1
NC
2024static const char *
2025get_solaris_dynamic_type (unsigned long type)
2026{
2027 switch (type)
2028 {
2029 case 0x6000000d: return "SUNW_AUXILIARY";
2030 case 0x6000000e: return "SUNW_RTLDINF";
2031 case 0x6000000f: return "SUNW_FILTER";
2032 case 0x60000010: return "SUNW_CAP";
2033 case 0x60000011: return "SUNW_SYMTAB";
2034 case 0x60000012: return "SUNW_SYMSZ";
2035 case 0x60000013: return "SUNW_SORTENT";
2036 case 0x60000014: return "SUNW_SYMSORT";
2037 case 0x60000015: return "SUNW_SYMSORTSZ";
2038 case 0x60000016: return "SUNW_TLSSORT";
2039 case 0x60000017: return "SUNW_TLSSORTSZ";
2040 case 0x60000018: return "SUNW_CAPINFO";
2041 case 0x60000019: return "SUNW_STRPAD";
2042 case 0x6000001a: return "SUNW_CAPCHAIN";
2043 case 0x6000001b: return "SUNW_LDMACH";
2044 case 0x6000001d: return "SUNW_CAPCHAINENT";
2045 case 0x6000001f: return "SUNW_CAPCHAINSZ";
2046 case 0x60000021: return "SUNW_PARENT";
2047 case 0x60000023: return "SUNW_ASLR";
2048 case 0x60000025: return "SUNW_RELAX";
2049 case 0x60000029: return "SUNW_NXHEAP";
2050 case 0x6000002b: return "SUNW_NXSTACK";
2051
2052 case 0x70000001: return "SPARC_REGISTER";
2053 case 0x7ffffffd: return "AUXILIARY";
2054 case 0x7ffffffe: return "USED";
2055 case 0x7fffffff: return "FILTER";
2056
15f205b1 2057 default: return NULL;
fd85a6a1
NC
2058 }
2059}
2060
252b5132 2061static const char *
dda8d76d 2062get_dynamic_type (Filedata * filedata, unsigned long type)
252b5132 2063{
e9e44622 2064 static char buff[64];
252b5132
RH
2065
2066 switch (type)
2067 {
2068 case DT_NULL: return "NULL";
2069 case DT_NEEDED: return "NEEDED";
2070 case DT_PLTRELSZ: return "PLTRELSZ";
2071 case DT_PLTGOT: return "PLTGOT";
2072 case DT_HASH: return "HASH";
2073 case DT_STRTAB: return "STRTAB";
2074 case DT_SYMTAB: return "SYMTAB";
2075 case DT_RELA: return "RELA";
2076 case DT_RELASZ: return "RELASZ";
2077 case DT_RELAENT: return "RELAENT";
2078 case DT_STRSZ: return "STRSZ";
2079 case DT_SYMENT: return "SYMENT";
2080 case DT_INIT: return "INIT";
2081 case DT_FINI: return "FINI";
2082 case DT_SONAME: return "SONAME";
2083 case DT_RPATH: return "RPATH";
2084 case DT_SYMBOLIC: return "SYMBOLIC";
2085 case DT_REL: return "REL";
2086 case DT_RELSZ: return "RELSZ";
2087 case DT_RELENT: return "RELENT";
2088 case DT_PLTREL: return "PLTREL";
2089 case DT_DEBUG: return "DEBUG";
2090 case DT_TEXTREL: return "TEXTREL";
2091 case DT_JMPREL: return "JMPREL";
2092 case DT_BIND_NOW: return "BIND_NOW";
2093 case DT_INIT_ARRAY: return "INIT_ARRAY";
2094 case DT_FINI_ARRAY: return "FINI_ARRAY";
2095 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
2096 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
d1133906
NC
2097 case DT_RUNPATH: return "RUNPATH";
2098 case DT_FLAGS: return "FLAGS";
2d0e6f43 2099
d1133906
NC
2100 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2101 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
6d913794 2102 case DT_SYMTAB_SHNDX: return "SYMTAB_SHNDX";
103f02d3 2103
05107a46 2104 case DT_CHECKSUM: return "CHECKSUM";
252b5132
RH
2105 case DT_PLTPADSZ: return "PLTPADSZ";
2106 case DT_MOVEENT: return "MOVEENT";
2107 case DT_MOVESZ: return "MOVESZ";
dcefbbbd 2108 case DT_FEATURE: return "FEATURE";
252b5132
RH
2109 case DT_POSFLAG_1: return "POSFLAG_1";
2110 case DT_SYMINSZ: return "SYMINSZ";
2111 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
103f02d3 2112
252b5132 2113 case DT_ADDRRNGLO: return "ADDRRNGLO";
dcefbbbd
L
2114 case DT_CONFIG: return "CONFIG";
2115 case DT_DEPAUDIT: return "DEPAUDIT";
2116 case DT_AUDIT: return "AUDIT";
2117 case DT_PLTPAD: return "PLTPAD";
2118 case DT_MOVETAB: return "MOVETAB";
252b5132 2119 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
103f02d3 2120
252b5132 2121 case DT_VERSYM: return "VERSYM";
103f02d3 2122
67a4f2b7
AO
2123 case DT_TLSDESC_GOT: return "TLSDESC_GOT";
2124 case DT_TLSDESC_PLT: return "TLSDESC_PLT";
252b5132
RH
2125 case DT_RELACOUNT: return "RELACOUNT";
2126 case DT_RELCOUNT: return "RELCOUNT";
2127 case DT_FLAGS_1: return "FLAGS_1";
2128 case DT_VERDEF: return "VERDEF";
2129 case DT_VERDEFNUM: return "VERDEFNUM";
2130 case DT_VERNEED: return "VERNEED";
2131 case DT_VERNEEDNUM: return "VERNEEDNUM";
103f02d3 2132
019148e4 2133 case DT_AUXILIARY: return "AUXILIARY";
252b5132
RH
2134 case DT_USED: return "USED";
2135 case DT_FILTER: return "FILTER";
103f02d3 2136
047b2264
JJ
2137 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
2138 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
2139 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
2140 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
2141 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
fdc90cb4 2142 case DT_GNU_HASH: return "GNU_HASH";
047b2264 2143
252b5132
RH
2144 default:
2145 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
2146 {
2cf0635d 2147 const char * result;
103f02d3 2148
dda8d76d 2149 switch (filedata->file_header.e_machine)
252b5132
RH
2150 {
2151 case EM_MIPS:
4fe85591 2152 case EM_MIPS_RS3_LE:
252b5132
RH
2153 result = get_mips_dynamic_type (type);
2154 break;
9a097730
RH
2155 case EM_SPARCV9:
2156 result = get_sparc64_dynamic_type (type);
2157 break;
7490d522
AM
2158 case EM_PPC:
2159 result = get_ppc_dynamic_type (type);
2160 break;
f1cb7e17
AM
2161 case EM_PPC64:
2162 result = get_ppc64_dynamic_type (type);
2163 break;
ecc51f48
NC
2164 case EM_IA_64:
2165 result = get_ia64_dynamic_type (type);
2166 break;
fabcb361
RH
2167 case EM_ALPHA:
2168 result = get_alpha_dynamic_type (type);
2169 break;
1c0d3aa6
NC
2170 case EM_SCORE:
2171 result = get_score_dynamic_type (type);
2172 break;
40b36596
JM
2173 case EM_TI_C6000:
2174 result = get_tic6x_dynamic_type (type);
2175 break;
36591ba1
SL
2176 case EM_ALTERA_NIOS2:
2177 result = get_nios2_dynamic_type (type);
2178 break;
252b5132 2179 default:
dda8d76d 2180 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
fd85a6a1
NC
2181 result = get_solaris_dynamic_type (type);
2182 else
2183 result = NULL;
252b5132
RH
2184 break;
2185 }
2186
2187 if (result != NULL)
2188 return result;
2189
e9e44622 2190 snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
252b5132 2191 }
eec8f817 2192 else if (((type >= DT_LOOS) && (type <= DT_HIOS))
dda8d76d 2193 || (filedata->file_header.e_machine == EM_PARISC
eec8f817 2194 && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
103f02d3 2195 {
2cf0635d 2196 const char * result;
103f02d3 2197
dda8d76d 2198 switch (filedata->file_header.e_machine)
103f02d3
UD
2199 {
2200 case EM_PARISC:
2201 result = get_parisc_dynamic_type (type);
2202 break;
148b93f2
NC
2203 case EM_IA_64:
2204 result = get_ia64_dynamic_type (type);
2205 break;
103f02d3 2206 default:
dda8d76d 2207 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
fd85a6a1
NC
2208 result = get_solaris_dynamic_type (type);
2209 else
2210 result = NULL;
103f02d3
UD
2211 break;
2212 }
2213
2214 if (result != NULL)
2215 return result;
2216
e9e44622
JJ
2217 snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2218 type);
103f02d3 2219 }
252b5132 2220 else
e9e44622 2221 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
103f02d3 2222
252b5132
RH
2223 return buff;
2224 }
2225}
2226
2227static char *
d3ba0551 2228get_file_type (unsigned e_type)
252b5132 2229{
b34976b6 2230 static char buff[32];
252b5132
RH
2231
2232 switch (e_type)
2233 {
32ec8896
NC
2234 case ET_NONE: return _("NONE (None)");
2235 case ET_REL: return _("REL (Relocatable file)");
2236 case ET_EXEC: return _("EXEC (Executable file)");
2237 case ET_DYN: return _("DYN (Shared object file)");
2238 case ET_CORE: return _("CORE (Core file)");
252b5132
RH
2239
2240 default:
2241 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
e9e44622 2242 snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
252b5132 2243 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
e9e44622 2244 snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
252b5132 2245 else
e9e44622 2246 snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
252b5132
RH
2247 return buff;
2248 }
2249}
2250
2251static char *
d3ba0551 2252get_machine_name (unsigned e_machine)
252b5132 2253{
b34976b6 2254 static char buff[64]; /* XXX */
252b5132
RH
2255
2256 switch (e_machine)
2257 {
55e22ca8
NC
2258 /* Please keep this switch table sorted by increasing EM_ value. */
2259 /* 0 */
c45021f2
NC
2260 case EM_NONE: return _("None");
2261 case EM_M32: return "WE32100";
2262 case EM_SPARC: return "Sparc";
2263 case EM_386: return "Intel 80386";
2264 case EM_68K: return "MC68000";
2265 case EM_88K: return "MC88000";
22abe556 2266 case EM_IAMCU: return "Intel MCU";
c45021f2
NC
2267 case EM_860: return "Intel 80860";
2268 case EM_MIPS: return "MIPS R3000";
2269 case EM_S370: return "IBM System/370";
55e22ca8 2270 /* 10 */
7036c0e1 2271 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
252b5132 2272 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
c45021f2 2273 case EM_PARISC: return "HPPA";
55e22ca8 2274 case EM_VPP550: return "Fujitsu VPP500";
7036c0e1 2275 case EM_SPARC32PLUS: return "Sparc v8+" ;
c45021f2
NC
2276 case EM_960: return "Intel 90860";
2277 case EM_PPC: return "PowerPC";
55e22ca8 2278 /* 20 */
285d1771 2279 case EM_PPC64: return "PowerPC64";
55e22ca8
NC
2280 case EM_S390_OLD:
2281 case EM_S390: return "IBM S/390";
2282 case EM_SPU: return "SPU";
2283 /* 30 */
2284 case EM_V800: return "Renesas V850 (using RH850 ABI)";
c45021f2
NC
2285 case EM_FR20: return "Fujitsu FR20";
2286 case EM_RH32: return "TRW RH32";
b34976b6 2287 case EM_MCORE: return "MCORE";
55e22ca8 2288 /* 40 */
7036c0e1
AJ
2289 case EM_ARM: return "ARM";
2290 case EM_OLD_ALPHA: return "Digital Alpha (old)";
ef230218 2291 case EM_SH: return "Renesas / SuperH SH";
c45021f2
NC
2292 case EM_SPARCV9: return "Sparc v9";
2293 case EM_TRICORE: return "Siemens Tricore";
584da044 2294 case EM_ARC: return "ARC";
c2dcd04e
NC
2295 case EM_H8_300: return "Renesas H8/300";
2296 case EM_H8_300H: return "Renesas H8/300H";
2297 case EM_H8S: return "Renesas H8S";
2298 case EM_H8_500: return "Renesas H8/500";
55e22ca8 2299 /* 50 */
30800947 2300 case EM_IA_64: return "Intel IA-64";
252b5132
RH
2301 case EM_MIPS_X: return "Stanford MIPS-X";
2302 case EM_COLDFIRE: return "Motorola Coldfire";
55e22ca8 2303 case EM_68HC12: return "Motorola MC68HC12 Microcontroller";
7036c0e1
AJ
2304 case EM_MMA: return "Fujitsu Multimedia Accelerator";
2305 case EM_PCP: return "Siemens PCP";
2306 case EM_NCPU: return "Sony nCPU embedded RISC processor";
2307 case EM_NDR1: return "Denso NDR1 microprocesspr";
2308 case EM_STARCORE: return "Motorola Star*Core processor";
2309 case EM_ME16: return "Toyota ME16 processor";
55e22ca8 2310 /* 60 */
7036c0e1
AJ
2311 case EM_ST100: return "STMicroelectronics ST100 processor";
2312 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
55e22ca8 2313 case EM_X86_64: return "Advanced Micro Devices X86-64";
11636f9e
JM
2314 case EM_PDSP: return "Sony DSP processor";
2315 case EM_PDP10: return "Digital Equipment Corp. PDP-10";
2316 case EM_PDP11: return "Digital Equipment Corp. PDP-11";
7036c0e1
AJ
2317 case EM_FX66: return "Siemens FX66 microcontroller";
2318 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2319 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
2320 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
55e22ca8 2321 /* 70 */
7036c0e1
AJ
2322 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
2323 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
2324 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
2325 case EM_SVX: return "Silicon Graphics SVx";
2326 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
2327 case EM_VAX: return "Digital VAX";
1b61cf92 2328 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
c45021f2
NC
2329 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
2330 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
2331 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
55e22ca8 2332 /* 80 */
b34976b6 2333 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
c45021f2 2334 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
3b36097d 2335 case EM_PRISM: return "Vitesse Prism";
55e22ca8
NC
2336 case EM_AVR_OLD:
2337 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
2338 case EM_CYGNUS_FR30:
2339 case EM_FR30: return "Fujitsu FR30";
2340 case EM_CYGNUS_D10V:
2341 case EM_D10V: return "d10v";
2342 case EM_CYGNUS_D30V:
2343 case EM_D30V: return "d30v";
2344 case EM_CYGNUS_V850:
2345 case EM_V850: return "Renesas V850";
2346 case EM_CYGNUS_M32R:
2347 case EM_M32R: return "Renesas M32R (formerly Mitsubishi M32r)";
2348 case EM_CYGNUS_MN10300:
2349 case EM_MN10300: return "mn10300";
2350 /* 90 */
2351 case EM_CYGNUS_MN10200:
2352 case EM_MN10200: return "mn10200";
2353 case EM_PJ: return "picoJava";
73589c9d 2354 case EM_OR1K: return "OpenRISC 1000";
55e22ca8 2355 case EM_ARC_COMPACT: return "ARCompact";
88da6820
NC
2356 case EM_XTENSA_OLD:
2357 case EM_XTENSA: return "Tensilica Xtensa Processor";
11636f9e
JM
2358 case EM_VIDEOCORE: return "Alphamosaic VideoCore processor";
2359 case EM_TMM_GPP: return "Thompson Multimedia General Purpose Processor";
2360 case EM_NS32K: return "National Semiconductor 32000 series";
2361 case EM_TPC: return "Tenor Network TPC processor";
55e22ca8
NC
2362 case EM_SNP1K: return "Trebia SNP 1000 processor";
2363 /* 100 */
2364 case EM_ST200: return "STMicroelectronics ST200 microcontroller";
2365 case EM_IP2K_OLD:
2366 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
11636f9e
JM
2367 case EM_MAX: return "MAX Processor";
2368 case EM_CR: return "National Semiconductor CompactRISC";
2369 case EM_F2MC16: return "Fujitsu F2MC16";
2370 case EM_MSP430: return "Texas Instruments msp430 microcontroller";
7bbe5bc5 2371 case EM_BLACKFIN: return "Analog Devices Blackfin";
11636f9e
JM
2372 case EM_SE_C33: return "S1C33 Family of Seiko Epson processors";
2373 case EM_SEP: return "Sharp embedded microprocessor";
2374 case EM_ARCA: return "Arca RISC microprocessor";
55e22ca8 2375 /* 110 */
11636f9e
JM
2376 case EM_UNICORE: return "Unicore";
2377 case EM_EXCESS: return "eXcess 16/32/64-bit configurable embedded CPU";
2378 case EM_DXP: return "Icera Semiconductor Inc. Deep Execution Processor";
64fd6348 2379 case EM_ALTERA_NIOS2: return "Altera Nios II";
55e22ca8
NC
2380 case EM_CRX: return "National Semiconductor CRX microprocessor";
2381 case EM_XGATE: return "Motorola XGATE embedded processor";
c29aca4a 2382 case EM_C166:
d70c5fc7 2383 case EM_XC16X: return "Infineon Technologies xc16x";
11636f9e
JM
2384 case EM_M16C: return "Renesas M16C series microprocessors";
2385 case EM_DSPIC30F: return "Microchip Technology dsPIC30F Digital Signal Controller";
2386 case EM_CE: return "Freescale Communication Engine RISC core";
55e22ca8
NC
2387 /* 120 */
2388 case EM_M32C: return "Renesas M32c";
2389 /* 130 */
11636f9e
JM
2390 case EM_TSK3000: return "Altium TSK3000 core";
2391 case EM_RS08: return "Freescale RS08 embedded processor";
2392 case EM_ECOG2: return "Cyan Technology eCOG2 microprocessor";
55e22ca8 2393 case EM_SCORE: return "SUNPLUS S+Core";
11636f9e
JM
2394 case EM_DSP24: return "New Japan Radio (NJR) 24-bit DSP Processor";
2395 case EM_VIDEOCORE3: return "Broadcom VideoCore III processor";
55e22ca8 2396 case EM_LATTICEMICO32: return "Lattice Mico32";
11636f9e 2397 case EM_SE_C17: return "Seiko Epson C17 family";
55e22ca8 2398 /* 140 */
11636f9e
JM
2399 case EM_TI_C6000: return "Texas Instruments TMS320C6000 DSP family";
2400 case EM_TI_C2000: return "Texas Instruments TMS320C2000 DSP family";
2401 case EM_TI_C5500: return "Texas Instruments TMS320C55x DSP family";
55e22ca8
NC
2402 case EM_TI_PRU: return "TI PRU I/O processor";
2403 /* 160 */
11636f9e
JM
2404 case EM_MMDSP_PLUS: return "STMicroelectronics 64bit VLIW Data Signal Processor";
2405 case EM_CYPRESS_M8C: return "Cypress M8C microprocessor";
2406 case EM_R32C: return "Renesas R32C series microprocessors";
2407 case EM_TRIMEDIA: return "NXP Semiconductors TriMedia architecture family";
2408 case EM_QDSP6: return "QUALCOMM DSP6 Processor";
2409 case EM_8051: return "Intel 8051 and variants";
2410 case EM_STXP7X: return "STMicroelectronics STxP7x family";
2411 case EM_NDS32: return "Andes Technology compact code size embedded RISC processor family";
2412 case EM_ECOG1X: return "Cyan Technology eCOG1X family";
2413 case EM_MAXQ30: return "Dallas Semiconductor MAXQ30 Core microcontrollers";
55e22ca8 2414 /* 170 */
11636f9e
JM
2415 case EM_XIMO16: return "New Japan Radio (NJR) 16-bit DSP Processor";
2416 case EM_MANIK: return "M2000 Reconfigurable RISC Microprocessor";
2417 case EM_CRAYNV2: return "Cray Inc. NV2 vector architecture";
c7927a3c 2418 case EM_RX: return "Renesas RX";
a3c62988 2419 case EM_METAG: return "Imagination Technologies Meta processor architecture";
11636f9e
JM
2420 case EM_MCST_ELBRUS: return "MCST Elbrus general purpose hardware architecture";
2421 case EM_ECOG16: return "Cyan Technology eCOG16 family";
55e22ca8
NC
2422 case EM_CR16:
2423 case EM_MICROBLAZE:
2424 case EM_MICROBLAZE_OLD: return "Xilinx MicroBlaze";
11636f9e
JM
2425 case EM_ETPU: return "Freescale Extended Time Processing Unit";
2426 case EM_SLE9X: return "Infineon Technologies SLE9X core";
55e22ca8
NC
2427 /* 180 */
2428 case EM_L1OM: return "Intel L1OM";
2429 case EM_K1OM: return "Intel K1OM";
2430 case EM_INTEL182: return "Intel (reserved)";
2431 case EM_AARCH64: return "AArch64";
2432 case EM_ARM184: return "ARM (reserved)";
2433 case EM_AVR32: return "Atmel Corporation 32-bit microprocessor";
11636f9e
JM
2434 case EM_STM8: return "STMicroeletronics STM8 8-bit microcontroller";
2435 case EM_TILE64: return "Tilera TILE64 multicore architecture family";
2436 case EM_TILEPRO: return "Tilera TILEPro multicore architecture family";
55e22ca8 2437 /* 190 */
11636f9e 2438 case EM_CUDA: return "NVIDIA CUDA architecture";
55e22ca8 2439 case EM_TILEGX: return "Tilera TILE-Gx multicore architecture family";
6d913794
NC
2440 case EM_CLOUDSHIELD: return "CloudShield architecture family";
2441 case EM_COREA_1ST: return "KIPO-KAIST Core-A 1st generation processor family";
2442 case EM_COREA_2ND: return "KIPO-KAIST Core-A 2nd generation processor family";
55e22ca8 2443 case EM_ARC_COMPACT2: return "ARCv2";
6d913794 2444 case EM_OPEN8: return "Open8 8-bit RISC soft processor core";
55e22ca8 2445 case EM_RL78: return "Renesas RL78";
6d913794 2446 case EM_VIDEOCORE5: return "Broadcom VideoCore V processor";
55e22ca8
NC
2447 case EM_78K0R: return "Renesas 78K0R";
2448 /* 200 */
6d913794 2449 case EM_56800EX: return "Freescale 56800EX Digital Signal Controller (DSC)";
15f205b1
NC
2450 case EM_BA1: return "Beyond BA1 CPU architecture";
2451 case EM_BA2: return "Beyond BA2 CPU architecture";
6d913794
NC
2452 case EM_XCORE: return "XMOS xCORE processor family";
2453 case EM_MCHP_PIC: return "Microchip 8-bit PIC(r) family";
55e22ca8 2454 /* 210 */
6d913794
NC
2455 case EM_KM32: return "KM211 KM32 32-bit processor";
2456 case EM_KMX32: return "KM211 KMX32 32-bit processor";
2457 case EM_KMX16: return "KM211 KMX16 16-bit processor";
2458 case EM_KMX8: return "KM211 KMX8 8-bit processor";
2459 case EM_KVARC: return "KM211 KVARC processor";
15f205b1 2460 case EM_CDP: return "Paneve CDP architecture family";
6d913794
NC
2461 case EM_COGE: return "Cognitive Smart Memory Processor";
2462 case EM_COOL: return "Bluechip Systems CoolEngine";
2463 case EM_NORC: return "Nanoradio Optimized RISC";
2464 case EM_CSR_KALIMBA: return "CSR Kalimba architecture family";
55e22ca8 2465 /* 220 */
15f205b1 2466 case EM_Z80: return "Zilog Z80";
55e22ca8
NC
2467 case EM_VISIUM: return "CDS VISIUMcore processor";
2468 case EM_FT32: return "FTDI Chip FT32";
2469 case EM_MOXIE: return "Moxie";
2470 case EM_AMDGPU: return "AMD GPU";
2471 case EM_RISCV: return "RISC-V";
2472 case EM_LANAI: return "Lanai 32-bit processor";
2473 case EM_BPF: return "Linux BPF";
2474
2475 /* Large numbers... */
2476 case EM_MT: return "Morpho Techologies MT processor";
2477 case EM_ALPHA: return "Alpha";
2478 case EM_WEBASSEMBLY: return "Web Assembly";
2479 case EM_DLX: return "OpenDLX";
2480 case EM_XSTORMY16: return "Sanyo XStormy16 CPU core";
2481 case EM_IQ2000: return "Vitesse IQ2000";
2482 case EM_M32C_OLD:
2483 case EM_NIOS32: return "Altera Nios";
2484 case EM_CYGNUS_MEP: return "Toshiba MeP Media Engine";
2485 case EM_ADAPTEVA_EPIPHANY: return "Adapteva EPIPHANY";
2486 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
2487
252b5132 2488 default:
35d9dd2f 2489 snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
252b5132
RH
2490 return buff;
2491 }
2492}
2493
a9522a21
AB
2494static void
2495decode_ARC_machine_flags (unsigned e_flags, unsigned e_machine, char buf[])
2496{
2497 /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2. Some
2498 other compilers don't a specific architecture type in the e_flags, and
2499 instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
2500 architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
2501 architectures.
2502
2503 Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
2504 but also sets a specific architecture type in the e_flags field.
2505
2506 However, when decoding the flags we don't worry if we see an
2507 unexpected pairing, for example EM_ARC_COMPACT machine type, with
2508 ARCEM architecture type. */
2509
2510 switch (e_flags & EF_ARC_MACH_MSK)
2511 {
2512 /* We only expect these to occur for EM_ARC_COMPACT2. */
2513 case EF_ARC_CPU_ARCV2EM:
2514 strcat (buf, ", ARC EM");
2515 break;
2516 case EF_ARC_CPU_ARCV2HS:
2517 strcat (buf, ", ARC HS");
2518 break;
2519
2520 /* We only expect these to occur for EM_ARC_COMPACT. */
2521 case E_ARC_MACH_ARC600:
2522 strcat (buf, ", ARC600");
2523 break;
2524 case E_ARC_MACH_ARC601:
2525 strcat (buf, ", ARC601");
2526 break;
2527 case E_ARC_MACH_ARC700:
2528 strcat (buf, ", ARC700");
2529 break;
2530
2531 /* The only times we should end up here are (a) A corrupt ELF, (b) A
2532 new ELF with new architecture being read by an old version of
2533 readelf, or (c) An ELF built with non-GNU compiler that does not
2534 set the architecture in the e_flags. */
2535 default:
2536 if (e_machine == EM_ARC_COMPACT)
2537 strcat (buf, ", Unknown ARCompact");
2538 else
2539 strcat (buf, ", Unknown ARC");
2540 break;
2541 }
2542
2543 switch (e_flags & EF_ARC_OSABI_MSK)
2544 {
2545 case E_ARC_OSABI_ORIG:
2546 strcat (buf, ", (ABI:legacy)");
2547 break;
2548 case E_ARC_OSABI_V2:
2549 strcat (buf, ", (ABI:v2)");
2550 break;
2551 /* Only upstream 3.9+ kernels will support ARCv2 ISA. */
2552 case E_ARC_OSABI_V3:
2553 strcat (buf, ", v3 no-legacy-syscalls ABI");
2554 break;
53a346d8
CZ
2555 case E_ARC_OSABI_V4:
2556 strcat (buf, ", v4 ABI");
2557 break;
a9522a21
AB
2558 default:
2559 strcat (buf, ", unrecognised ARC OSABI flag");
2560 break;
2561 }
2562}
2563
f3485b74 2564static void
d3ba0551 2565decode_ARM_machine_flags (unsigned e_flags, char buf[])
f3485b74
NC
2566{
2567 unsigned eabi;
32ec8896 2568 bfd_boolean unknown = FALSE;
f3485b74
NC
2569
2570 eabi = EF_ARM_EABI_VERSION (e_flags);
2571 e_flags &= ~ EF_ARM_EABIMASK;
2572
2573 /* Handle "generic" ARM flags. */
2574 if (e_flags & EF_ARM_RELEXEC)
2575 {
2576 strcat (buf, ", relocatable executable");
2577 e_flags &= ~ EF_ARM_RELEXEC;
2578 }
76da6bbe 2579
f3485b74
NC
2580 /* Now handle EABI specific flags. */
2581 switch (eabi)
2582 {
2583 default:
2c71103e 2584 strcat (buf, ", <unrecognized EABI>");
f3485b74 2585 if (e_flags)
32ec8896 2586 unknown = TRUE;
f3485b74
NC
2587 break;
2588
2589 case EF_ARM_EABI_VER1:
a5bcd848 2590 strcat (buf, ", Version1 EABI");
f3485b74
NC
2591 while (e_flags)
2592 {
2593 unsigned flag;
76da6bbe 2594
f3485b74
NC
2595 /* Process flags one bit at a time. */
2596 flag = e_flags & - e_flags;
2597 e_flags &= ~ flag;
76da6bbe 2598
f3485b74
NC
2599 switch (flag)
2600 {
a5bcd848 2601 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
f3485b74
NC
2602 strcat (buf, ", sorted symbol tables");
2603 break;
76da6bbe 2604
f3485b74 2605 default:
32ec8896 2606 unknown = TRUE;
f3485b74
NC
2607 break;
2608 }
2609 }
2610 break;
76da6bbe 2611
a5bcd848
PB
2612 case EF_ARM_EABI_VER2:
2613 strcat (buf, ", Version2 EABI");
2614 while (e_flags)
2615 {
2616 unsigned flag;
2617
2618 /* Process flags one bit at a time. */
2619 flag = e_flags & - e_flags;
2620 e_flags &= ~ flag;
2621
2622 switch (flag)
2623 {
2624 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2625 strcat (buf, ", sorted symbol tables");
2626 break;
2627
2628 case EF_ARM_DYNSYMSUSESEGIDX:
2629 strcat (buf, ", dynamic symbols use segment index");
2630 break;
2631
2632 case EF_ARM_MAPSYMSFIRST:
2633 strcat (buf, ", mapping symbols precede others");
2634 break;
2635
2636 default:
32ec8896 2637 unknown = TRUE;
a5bcd848
PB
2638 break;
2639 }
2640 }
2641 break;
2642
d507cf36
PB
2643 case EF_ARM_EABI_VER3:
2644 strcat (buf, ", Version3 EABI");
8cb51566
PB
2645 break;
2646
2647 case EF_ARM_EABI_VER4:
2648 strcat (buf, ", Version4 EABI");
3bfcb652
NC
2649 while (e_flags)
2650 {
2651 unsigned flag;
2652
2653 /* Process flags one bit at a time. */
2654 flag = e_flags & - e_flags;
2655 e_flags &= ~ flag;
2656
2657 switch (flag)
2658 {
2659 case EF_ARM_BE8:
2660 strcat (buf, ", BE8");
2661 break;
2662
2663 case EF_ARM_LE8:
2664 strcat (buf, ", LE8");
2665 break;
2666
2667 default:
32ec8896 2668 unknown = TRUE;
3bfcb652
NC
2669 break;
2670 }
3bfcb652
NC
2671 }
2672 break;
3a4a14e9
PB
2673
2674 case EF_ARM_EABI_VER5:
2675 strcat (buf, ", Version5 EABI");
d507cf36
PB
2676 while (e_flags)
2677 {
2678 unsigned flag;
2679
2680 /* Process flags one bit at a time. */
2681 flag = e_flags & - e_flags;
2682 e_flags &= ~ flag;
2683
2684 switch (flag)
2685 {
2686 case EF_ARM_BE8:
2687 strcat (buf, ", BE8");
2688 break;
2689
2690 case EF_ARM_LE8:
2691 strcat (buf, ", LE8");
2692 break;
2693
3bfcb652
NC
2694 case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT. */
2695 strcat (buf, ", soft-float ABI");
2696 break;
2697
2698 case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT. */
2699 strcat (buf, ", hard-float ABI");
2700 break;
2701
d507cf36 2702 default:
32ec8896 2703 unknown = TRUE;
d507cf36
PB
2704 break;
2705 }
2706 }
2707 break;
2708
f3485b74 2709 case EF_ARM_EABI_UNKNOWN:
a5bcd848 2710 strcat (buf, ", GNU EABI");
f3485b74
NC
2711 while (e_flags)
2712 {
2713 unsigned flag;
76da6bbe 2714
f3485b74
NC
2715 /* Process flags one bit at a time. */
2716 flag = e_flags & - e_flags;
2717 e_flags &= ~ flag;
76da6bbe 2718
f3485b74
NC
2719 switch (flag)
2720 {
a5bcd848 2721 case EF_ARM_INTERWORK:
f3485b74
NC
2722 strcat (buf, ", interworking enabled");
2723 break;
76da6bbe 2724
a5bcd848 2725 case EF_ARM_APCS_26:
f3485b74
NC
2726 strcat (buf, ", uses APCS/26");
2727 break;
76da6bbe 2728
a5bcd848 2729 case EF_ARM_APCS_FLOAT:
f3485b74
NC
2730 strcat (buf, ", uses APCS/float");
2731 break;
76da6bbe 2732
a5bcd848 2733 case EF_ARM_PIC:
f3485b74
NC
2734 strcat (buf, ", position independent");
2735 break;
76da6bbe 2736
a5bcd848 2737 case EF_ARM_ALIGN8:
f3485b74
NC
2738 strcat (buf, ", 8 bit structure alignment");
2739 break;
76da6bbe 2740
a5bcd848 2741 case EF_ARM_NEW_ABI:
f3485b74
NC
2742 strcat (buf, ", uses new ABI");
2743 break;
76da6bbe 2744
a5bcd848 2745 case EF_ARM_OLD_ABI:
f3485b74
NC
2746 strcat (buf, ", uses old ABI");
2747 break;
76da6bbe 2748
a5bcd848 2749 case EF_ARM_SOFT_FLOAT:
f3485b74
NC
2750 strcat (buf, ", software FP");
2751 break;
76da6bbe 2752
90e01f86
ILT
2753 case EF_ARM_VFP_FLOAT:
2754 strcat (buf, ", VFP");
2755 break;
2756
fde78edd
NC
2757 case EF_ARM_MAVERICK_FLOAT:
2758 strcat (buf, ", Maverick FP");
2759 break;
2760
f3485b74 2761 default:
32ec8896 2762 unknown = TRUE;
f3485b74
NC
2763 break;
2764 }
2765 }
2766 }
f3485b74
NC
2767
2768 if (unknown)
2b692964 2769 strcat (buf,_(", <unknown>"));
f3485b74
NC
2770}
2771
343433df
AB
2772static void
2773decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2774{
2775 --size; /* Leave space for null terminator. */
2776
2777 switch (e_flags & EF_AVR_MACH)
2778 {
2779 case E_AVR_MACH_AVR1:
2780 strncat (buf, ", avr:1", size);
2781 break;
2782 case E_AVR_MACH_AVR2:
2783 strncat (buf, ", avr:2", size);
2784 break;
2785 case E_AVR_MACH_AVR25:
2786 strncat (buf, ", avr:25", size);
2787 break;
2788 case E_AVR_MACH_AVR3:
2789 strncat (buf, ", avr:3", size);
2790 break;
2791 case E_AVR_MACH_AVR31:
2792 strncat (buf, ", avr:31", size);
2793 break;
2794 case E_AVR_MACH_AVR35:
2795 strncat (buf, ", avr:35", size);
2796 break;
2797 case E_AVR_MACH_AVR4:
2798 strncat (buf, ", avr:4", size);
2799 break;
2800 case E_AVR_MACH_AVR5:
2801 strncat (buf, ", avr:5", size);
2802 break;
2803 case E_AVR_MACH_AVR51:
2804 strncat (buf, ", avr:51", size);
2805 break;
2806 case E_AVR_MACH_AVR6:
2807 strncat (buf, ", avr:6", size);
2808 break;
2809 case E_AVR_MACH_AVRTINY:
2810 strncat (buf, ", avr:100", size);
2811 break;
2812 case E_AVR_MACH_XMEGA1:
2813 strncat (buf, ", avr:101", size);
2814 break;
2815 case E_AVR_MACH_XMEGA2:
2816 strncat (buf, ", avr:102", size);
2817 break;
2818 case E_AVR_MACH_XMEGA3:
2819 strncat (buf, ", avr:103", size);
2820 break;
2821 case E_AVR_MACH_XMEGA4:
2822 strncat (buf, ", avr:104", size);
2823 break;
2824 case E_AVR_MACH_XMEGA5:
2825 strncat (buf, ", avr:105", size);
2826 break;
2827 case E_AVR_MACH_XMEGA6:
2828 strncat (buf, ", avr:106", size);
2829 break;
2830 case E_AVR_MACH_XMEGA7:
2831 strncat (buf, ", avr:107", size);
2832 break;
2833 default:
2834 strncat (buf, ", avr:<unknown>", size);
2835 break;
2836 }
2837
2838 size -= strlen (buf);
2839 if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2840 strncat (buf, ", link-relax", size);
2841}
2842
35c08157
KLC
2843static void
2844decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2845{
2846 unsigned abi;
2847 unsigned arch;
2848 unsigned config;
2849 unsigned version;
32ec8896
NC
2850 bfd_boolean has_fpu = FALSE;
2851 unsigned int r = 0;
35c08157
KLC
2852
2853 static const char *ABI_STRINGS[] =
2854 {
2855 "ABI v0", /* use r5 as return register; only used in N1213HC */
2856 "ABI v1", /* use r0 as return register */
2857 "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2858 "ABI v2fp", /* for FPU */
40c7a7cb
KLC
2859 "AABI",
2860 "ABI2 FP+"
35c08157
KLC
2861 };
2862 static const char *VER_STRINGS[] =
2863 {
2864 "Andes ELF V1.3 or older",
2865 "Andes ELF V1.3.1",
2866 "Andes ELF V1.4"
2867 };
2868 static const char *ARCH_STRINGS[] =
2869 {
2870 "",
2871 "Andes Star v1.0",
2872 "Andes Star v2.0",
2873 "Andes Star v3.0",
2874 "Andes Star v3.0m"
2875 };
2876
2877 abi = EF_NDS_ABI & e_flags;
2878 arch = EF_NDS_ARCH & e_flags;
2879 config = EF_NDS_INST & e_flags;
2880 version = EF_NDS32_ELF_VERSION & e_flags;
2881
2882 memset (buf, 0, size);
2883
2884 switch (abi)
2885 {
2886 case E_NDS_ABI_V0:
2887 case E_NDS_ABI_V1:
2888 case E_NDS_ABI_V2:
2889 case E_NDS_ABI_V2FP:
2890 case E_NDS_ABI_AABI:
40c7a7cb 2891 case E_NDS_ABI_V2FP_PLUS:
35c08157
KLC
2892 /* In case there are holes in the array. */
2893 r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2894 break;
2895
2896 default:
2897 r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2898 break;
2899 }
2900
2901 switch (version)
2902 {
2903 case E_NDS32_ELF_VER_1_2:
2904 case E_NDS32_ELF_VER_1_3:
2905 case E_NDS32_ELF_VER_1_4:
2906 r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2907 break;
2908
2909 default:
2910 r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2911 break;
2912 }
2913
2914 if (E_NDS_ABI_V0 == abi)
2915 {
2916 /* OLD ABI; only used in N1213HC, has performance extension 1. */
2917 r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2918 if (arch == E_NDS_ARCH_STAR_V1_0)
2919 r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2920 return;
2921 }
2922
2923 switch (arch)
2924 {
2925 case E_NDS_ARCH_STAR_V1_0:
2926 case E_NDS_ARCH_STAR_V2_0:
2927 case E_NDS_ARCH_STAR_V3_0:
2928 case E_NDS_ARCH_STAR_V3_M:
2929 r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2930 break;
2931
2932 default:
2933 r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2934 /* ARCH version determines how the e_flags are interpreted.
2935 If it is unknown, we cannot proceed. */
2936 return;
2937 }
2938
2939 /* Newer ABI; Now handle architecture specific flags. */
2940 if (arch == E_NDS_ARCH_STAR_V1_0)
2941 {
2942 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2943 r += snprintf (buf + r, size -r, ", MFUSR_PC");
2944
2945 if (!(config & E_NDS32_HAS_NO_MAC_INST))
2946 r += snprintf (buf + r, size -r, ", MAC");
2947
2948 if (config & E_NDS32_HAS_DIV_INST)
2949 r += snprintf (buf + r, size -r, ", DIV");
2950
2951 if (config & E_NDS32_HAS_16BIT_INST)
2952 r += snprintf (buf + r, size -r, ", 16b");
2953 }
2954 else
2955 {
2956 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2957 {
2958 if (version <= E_NDS32_ELF_VER_1_3)
2959 r += snprintf (buf + r, size -r, ", [B8]");
2960 else
2961 r += snprintf (buf + r, size -r, ", EX9");
2962 }
2963
2964 if (config & E_NDS32_HAS_MAC_DX_INST)
2965 r += snprintf (buf + r, size -r, ", MAC_DX");
2966
2967 if (config & E_NDS32_HAS_DIV_DX_INST)
2968 r += snprintf (buf + r, size -r, ", DIV_DX");
2969
2970 if (config & E_NDS32_HAS_16BIT_INST)
2971 {
2972 if (version <= E_NDS32_ELF_VER_1_3)
2973 r += snprintf (buf + r, size -r, ", 16b");
2974 else
2975 r += snprintf (buf + r, size -r, ", IFC");
2976 }
2977 }
2978
2979 if (config & E_NDS32_HAS_EXT_INST)
2980 r += snprintf (buf + r, size -r, ", PERF1");
2981
2982 if (config & E_NDS32_HAS_EXT2_INST)
2983 r += snprintf (buf + r, size -r, ", PERF2");
2984
2985 if (config & E_NDS32_HAS_FPU_INST)
2986 {
32ec8896 2987 has_fpu = TRUE;
35c08157
KLC
2988 r += snprintf (buf + r, size -r, ", FPU_SP");
2989 }
2990
2991 if (config & E_NDS32_HAS_FPU_DP_INST)
2992 {
32ec8896 2993 has_fpu = TRUE;
35c08157
KLC
2994 r += snprintf (buf + r, size -r, ", FPU_DP");
2995 }
2996
2997 if (config & E_NDS32_HAS_FPU_MAC_INST)
2998 {
32ec8896 2999 has_fpu = TRUE;
35c08157
KLC
3000 r += snprintf (buf + r, size -r, ", FPU_MAC");
3001 }
3002
3003 if (has_fpu)
3004 {
3005 switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
3006 {
3007 case E_NDS32_FPU_REG_8SP_4DP:
3008 r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
3009 break;
3010 case E_NDS32_FPU_REG_16SP_8DP:
3011 r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
3012 break;
3013 case E_NDS32_FPU_REG_32SP_16DP:
3014 r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
3015 break;
3016 case E_NDS32_FPU_REG_32SP_32DP:
3017 r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
3018 break;
3019 }
3020 }
3021
3022 if (config & E_NDS32_HAS_AUDIO_INST)
3023 r += snprintf (buf + r, size -r, ", AUDIO");
3024
3025 if (config & E_NDS32_HAS_STRING_INST)
3026 r += snprintf (buf + r, size -r, ", STR");
3027
3028 if (config & E_NDS32_HAS_REDUCED_REGS)
3029 r += snprintf (buf + r, size -r, ", 16REG");
3030
3031 if (config & E_NDS32_HAS_VIDEO_INST)
3032 {
3033 if (version <= E_NDS32_ELF_VER_1_3)
3034 r += snprintf (buf + r, size -r, ", VIDEO");
3035 else
3036 r += snprintf (buf + r, size -r, ", SATURATION");
3037 }
3038
3039 if (config & E_NDS32_HAS_ENCRIPT_INST)
3040 r += snprintf (buf + r, size -r, ", ENCRP");
3041
3042 if (config & E_NDS32_HAS_L2C_INST)
3043 r += snprintf (buf + r, size -r, ", L2C");
3044}
3045
252b5132 3046static char *
dda8d76d 3047get_machine_flags (Filedata * filedata, unsigned e_flags, unsigned e_machine)
252b5132 3048{
b34976b6 3049 static char buf[1024];
252b5132
RH
3050
3051 buf[0] = '\0';
76da6bbe 3052
252b5132
RH
3053 if (e_flags)
3054 {
3055 switch (e_machine)
3056 {
3057 default:
3058 break;
3059
886a2506 3060 case EM_ARC_COMPACT2:
886a2506 3061 case EM_ARC_COMPACT:
a9522a21
AB
3062 decode_ARC_machine_flags (e_flags, e_machine, buf);
3063 break;
886a2506 3064
f3485b74
NC
3065 case EM_ARM:
3066 decode_ARM_machine_flags (e_flags, buf);
3067 break;
76da6bbe 3068
343433df
AB
3069 case EM_AVR:
3070 decode_AVR_machine_flags (e_flags, buf, sizeof buf);
3071 break;
3072
781303ce
MF
3073 case EM_BLACKFIN:
3074 if (e_flags & EF_BFIN_PIC)
3075 strcat (buf, ", PIC");
3076
3077 if (e_flags & EF_BFIN_FDPIC)
3078 strcat (buf, ", FDPIC");
3079
3080 if (e_flags & EF_BFIN_CODE_IN_L1)
3081 strcat (buf, ", code in L1");
3082
3083 if (e_flags & EF_BFIN_DATA_IN_L1)
3084 strcat (buf, ", data in L1");
3085
3086 break;
3087
ec2dfb42
AO
3088 case EM_CYGNUS_FRV:
3089 switch (e_flags & EF_FRV_CPU_MASK)
3090 {
3091 case EF_FRV_CPU_GENERIC:
3092 break;
3093
3094 default:
3095 strcat (buf, ", fr???");
3096 break;
57346661 3097
ec2dfb42
AO
3098 case EF_FRV_CPU_FR300:
3099 strcat (buf, ", fr300");
3100 break;
3101
3102 case EF_FRV_CPU_FR400:
3103 strcat (buf, ", fr400");
3104 break;
3105 case EF_FRV_CPU_FR405:
3106 strcat (buf, ", fr405");
3107 break;
3108
3109 case EF_FRV_CPU_FR450:
3110 strcat (buf, ", fr450");
3111 break;
3112
3113 case EF_FRV_CPU_FR500:
3114 strcat (buf, ", fr500");
3115 break;
3116 case EF_FRV_CPU_FR550:
3117 strcat (buf, ", fr550");
3118 break;
3119
3120 case EF_FRV_CPU_SIMPLE:
3121 strcat (buf, ", simple");
3122 break;
3123 case EF_FRV_CPU_TOMCAT:
3124 strcat (buf, ", tomcat");
3125 break;
3126 }
1c877e87 3127 break;
ec2dfb42 3128
53c7db4b 3129 case EM_68K:
425c6cb0 3130 if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
76f57f3a 3131 strcat (buf, ", m68000");
425c6cb0 3132 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
3bdcfdf4
KH
3133 strcat (buf, ", cpu32");
3134 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
3135 strcat (buf, ", fido_a");
425c6cb0 3136 else
266abb8f 3137 {
2cf0635d
NC
3138 char const * isa = _("unknown");
3139 char const * mac = _("unknown mac");
3140 char const * additional = NULL;
0112cd26 3141
c694fd50 3142 switch (e_flags & EF_M68K_CF_ISA_MASK)
266abb8f 3143 {
c694fd50 3144 case EF_M68K_CF_ISA_A_NODIV:
0b2e31dc
NS
3145 isa = "A";
3146 additional = ", nodiv";
3147 break;
c694fd50 3148 case EF_M68K_CF_ISA_A:
266abb8f
NS
3149 isa = "A";
3150 break;
c694fd50 3151 case EF_M68K_CF_ISA_A_PLUS:
266abb8f
NS
3152 isa = "A+";
3153 break;
c694fd50 3154 case EF_M68K_CF_ISA_B_NOUSP:
0b2e31dc
NS
3155 isa = "B";
3156 additional = ", nousp";
3157 break;
c694fd50 3158 case EF_M68K_CF_ISA_B:
266abb8f
NS
3159 isa = "B";
3160 break;
f608cd77
NS
3161 case EF_M68K_CF_ISA_C:
3162 isa = "C";
3163 break;
3164 case EF_M68K_CF_ISA_C_NODIV:
3165 isa = "C";
3166 additional = ", nodiv";
3167 break;
266abb8f
NS
3168 }
3169 strcat (buf, ", cf, isa ");
3170 strcat (buf, isa);
0b2e31dc
NS
3171 if (additional)
3172 strcat (buf, additional);
c694fd50 3173 if (e_flags & EF_M68K_CF_FLOAT)
0b2e31dc 3174 strcat (buf, ", float");
c694fd50 3175 switch (e_flags & EF_M68K_CF_MAC_MASK)
266abb8f
NS
3176 {
3177 case 0:
3178 mac = NULL;
3179 break;
c694fd50 3180 case EF_M68K_CF_MAC:
266abb8f
NS
3181 mac = "mac";
3182 break;
c694fd50 3183 case EF_M68K_CF_EMAC:
266abb8f
NS
3184 mac = "emac";
3185 break;
f608cd77
NS
3186 case EF_M68K_CF_EMAC_B:
3187 mac = "emac_b";
3188 break;
266abb8f
NS
3189 }
3190 if (mac)
3191 {
3192 strcat (buf, ", ");
3193 strcat (buf, mac);
3194 }
266abb8f 3195 }
53c7db4b 3196 break;
33c63f9d 3197
153a2776
NC
3198 case EM_CYGNUS_MEP:
3199 switch (e_flags & EF_MEP_CPU_MASK)
3200 {
3201 case EF_MEP_CPU_MEP: strcat (buf, ", generic MeP"); break;
3202 case EF_MEP_CPU_C2: strcat (buf, ", MeP C2"); break;
3203 case EF_MEP_CPU_C3: strcat (buf, ", MeP C3"); break;
3204 case EF_MEP_CPU_C4: strcat (buf, ", MeP C4"); break;
3205 case EF_MEP_CPU_C5: strcat (buf, ", MeP C5"); break;
3206 case EF_MEP_CPU_H1: strcat (buf, ", MeP H1"); break;
3207 default: strcat (buf, _(", <unknown MeP cpu type>")); break;
3208 }
3209
3210 switch (e_flags & EF_MEP_COP_MASK)
3211 {
3212 case EF_MEP_COP_NONE: break;
3213 case EF_MEP_COP_AVC: strcat (buf, ", AVC coprocessor"); break;
3214 case EF_MEP_COP_AVC2: strcat (buf, ", AVC2 coprocessor"); break;
3215 case EF_MEP_COP_FMAX: strcat (buf, ", FMAX coprocessor"); break;
3216 case EF_MEP_COP_IVC2: strcat (buf, ", IVC2 coprocessor"); break;
3217 default: strcat (buf, _("<unknown MeP copro type>")); break;
3218 }
3219
3220 if (e_flags & EF_MEP_LIBRARY)
3221 strcat (buf, ", Built for Library");
3222
3223 if (e_flags & EF_MEP_INDEX_MASK)
3224 sprintf (buf + strlen (buf), ", Configuration Index: %#x",
3225 e_flags & EF_MEP_INDEX_MASK);
3226
3227 if (e_flags & ~ EF_MEP_ALL_FLAGS)
3228 sprintf (buf + strlen (buf), _(", unknown flags bits: %#x"),
3229 e_flags & ~ EF_MEP_ALL_FLAGS);
3230 break;
3231
252b5132
RH
3232 case EM_PPC:
3233 if (e_flags & EF_PPC_EMB)
3234 strcat (buf, ", emb");
3235
3236 if (e_flags & EF_PPC_RELOCATABLE)
2b692964 3237 strcat (buf, _(", relocatable"));
252b5132
RH
3238
3239 if (e_flags & EF_PPC_RELOCATABLE_LIB)
2b692964 3240 strcat (buf, _(", relocatable-lib"));
252b5132
RH
3241 break;
3242
ee67d69a
AM
3243 case EM_PPC64:
3244 if (e_flags & EF_PPC64_ABI)
3245 {
3246 char abi[] = ", abiv0";
3247
3248 abi[6] += e_flags & EF_PPC64_ABI;
3249 strcat (buf, abi);
3250 }
3251 break;
3252
708e2187
NC
3253 case EM_V800:
3254 if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
3255 strcat (buf, ", RH850 ABI");
0b4362b0 3256
708e2187
NC
3257 if (e_flags & EF_V800_850E3)
3258 strcat (buf, ", V3 architecture");
3259
3260 if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
3261 strcat (buf, ", FPU not used");
3262
3263 if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
3264 strcat (buf, ", regmode: COMMON");
3265
3266 if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
3267 strcat (buf, ", r4 not used");
3268
3269 if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
3270 strcat (buf, ", r30 not used");
3271
3272 if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
3273 strcat (buf, ", r5 not used");
3274
3275 if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
3276 strcat (buf, ", r2 not used");
3277
3278 for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
3279 {
3280 switch (e_flags & - e_flags)
3281 {
3282 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
3283 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
708e2187
NC
3284 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
3285 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
708e2187
NC
3286 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
3287 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
3288 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
3289 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
3290 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
3291 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
3292 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
3293 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
3294 default: break;
3295 }
3296 }
3297 break;
3298
2b0337b0 3299 case EM_V850:
252b5132
RH
3300 case EM_CYGNUS_V850:
3301 switch (e_flags & EF_V850_ARCH)
3302 {
78c8d46c
NC
3303 case E_V850E3V5_ARCH:
3304 strcat (buf, ", v850e3v5");
3305 break;
1cd986c5
NC
3306 case E_V850E2V3_ARCH:
3307 strcat (buf, ", v850e2v3");
3308 break;
3309 case E_V850E2_ARCH:
3310 strcat (buf, ", v850e2");
3311 break;
3312 case E_V850E1_ARCH:
3313 strcat (buf, ", v850e1");
8ad30312 3314 break;
252b5132
RH
3315 case E_V850E_ARCH:
3316 strcat (buf, ", v850e");
3317 break;
252b5132
RH
3318 case E_V850_ARCH:
3319 strcat (buf, ", v850");
3320 break;
3321 default:
2b692964 3322 strcat (buf, _(", unknown v850 architecture variant"));
252b5132
RH
3323 break;
3324 }
3325 break;
3326
2b0337b0 3327 case EM_M32R:
252b5132
RH
3328 case EM_CYGNUS_M32R:
3329 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3330 strcat (buf, ", m32r");
252b5132
RH
3331 break;
3332
3333 case EM_MIPS:
4fe85591 3334 case EM_MIPS_RS3_LE:
252b5132
RH
3335 if (e_flags & EF_MIPS_NOREORDER)
3336 strcat (buf, ", noreorder");
3337
3338 if (e_flags & EF_MIPS_PIC)
3339 strcat (buf, ", pic");
3340
3341 if (e_flags & EF_MIPS_CPIC)
3342 strcat (buf, ", cpic");
3343
d1bdd336
TS
3344 if (e_flags & EF_MIPS_UCODE)
3345 strcat (buf, ", ugen_reserved");
3346
252b5132
RH
3347 if (e_flags & EF_MIPS_ABI2)
3348 strcat (buf, ", abi2");
3349
43521d43
TS
3350 if (e_flags & EF_MIPS_OPTIONS_FIRST)
3351 strcat (buf, ", odk first");
3352
a5d22d2a
TS
3353 if (e_flags & EF_MIPS_32BITMODE)
3354 strcat (buf, ", 32bitmode");
3355
ba92f887
MR
3356 if (e_flags & EF_MIPS_NAN2008)
3357 strcat (buf, ", nan2008");
3358
fef1b0b3
SE
3359 if (e_flags & EF_MIPS_FP64)
3360 strcat (buf, ", fp64");
3361
156c2f8b
NC
3362 switch ((e_flags & EF_MIPS_MACH))
3363 {
3364 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3365 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3366 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
156c2f8b 3367 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
810dfa6e
L
3368 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3369 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3370 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3371 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
ef272caa 3372 case E_MIPS_MACH_5900: strcat (buf, ", 5900"); break;
c6c98b38 3373 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
ebcb91b7 3374 case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
350cc38d
MS
3375 case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3376 case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
fd503541 3377 case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
05c6f050 3378 case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
67c2a3e8 3379 case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
d32e5c54 3380 case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
52b6b6b9 3381 case E_MIPS_MACH_XLR: strcat (buf, ", xlr"); break;
38bf472a 3382 case E_MIPS_MACH_IAMR2: strcat (buf, ", interaptiv-mr2"); break;
43521d43
TS
3383 case 0:
3384 /* We simply ignore the field in this case to avoid confusion:
3385 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3386 extension. */
3387 break;
2b692964 3388 default: strcat (buf, _(", unknown CPU")); break;
156c2f8b 3389 }
43521d43
TS
3390
3391 switch ((e_flags & EF_MIPS_ABI))
3392 {
3393 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3394 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3395 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3396 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3397 case 0:
3398 /* We simply ignore the field in this case to avoid confusion:
3399 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3400 This means it is likely to be an o32 file, but not for
3401 sure. */
3402 break;
2b692964 3403 default: strcat (buf, _(", unknown ABI")); break;
43521d43
TS
3404 }
3405
3406 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3407 strcat (buf, ", mdmx");
3408
3409 if (e_flags & EF_MIPS_ARCH_ASE_M16)
3410 strcat (buf, ", mips16");
3411
df58fc94
RS
3412 if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3413 strcat (buf, ", micromips");
3414
43521d43
TS
3415 switch ((e_flags & EF_MIPS_ARCH))
3416 {
3417 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3418 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3419 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3420 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3421 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3422 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
cb44e358 3423 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
7361da2c 3424 case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
43521d43 3425 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
5f74bc13 3426 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
7361da2c 3427 case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
2b692964 3428 default: strcat (buf, _(", unknown ISA")); break;
43521d43 3429 }
252b5132 3430 break;
351b4b40 3431
35c08157
KLC
3432 case EM_NDS32:
3433 decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3434 break;
3435
e23eba97
NC
3436 case EM_RISCV:
3437 if (e_flags & EF_RISCV_RVC)
3438 strcat (buf, ", RVC");
2922d21d
AW
3439
3440 switch (e_flags & EF_RISCV_FLOAT_ABI)
3441 {
3442 case EF_RISCV_FLOAT_ABI_SOFT:
3443 strcat (buf, ", soft-float ABI");
3444 break;
3445
3446 case EF_RISCV_FLOAT_ABI_SINGLE:
3447 strcat (buf, ", single-float ABI");
3448 break;
3449
3450 case EF_RISCV_FLOAT_ABI_DOUBLE:
3451 strcat (buf, ", double-float ABI");
3452 break;
3453
3454 case EF_RISCV_FLOAT_ABI_QUAD:
3455 strcat (buf, ", quad-float ABI");
3456 break;
3457 }
e23eba97
NC
3458 break;
3459
ccde1100
AO
3460 case EM_SH:
3461 switch ((e_flags & EF_SH_MACH_MASK))
3462 {
3463 case EF_SH1: strcat (buf, ", sh1"); break;
3464 case EF_SH2: strcat (buf, ", sh2"); break;
3465 case EF_SH3: strcat (buf, ", sh3"); break;
3466 case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3467 case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3468 case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3469 case EF_SH3E: strcat (buf, ", sh3e"); break;
3470 case EF_SH4: strcat (buf, ", sh4"); break;
3471 case EF_SH5: strcat (buf, ", sh5"); break;
3472 case EF_SH2E: strcat (buf, ", sh2e"); break;
3473 case EF_SH4A: strcat (buf, ", sh4a"); break;
1d70c7fb 3474 case EF_SH2A: strcat (buf, ", sh2a"); break;
ccde1100
AO
3475 case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3476 case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
1d70c7fb 3477 case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
0b92ab21
NH
3478 case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3479 case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3480 case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3481 case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3482 case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3483 case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
2b692964 3484 default: strcat (buf, _(", unknown ISA")); break;
ccde1100
AO
3485 }
3486
cec6a5b8
MR
3487 if (e_flags & EF_SH_PIC)
3488 strcat (buf, ", pic");
3489
3490 if (e_flags & EF_SH_FDPIC)
3491 strcat (buf, ", fdpic");
ccde1100 3492 break;
948f632f 3493
73589c9d
CS
3494 case EM_OR1K:
3495 if (e_flags & EF_OR1K_NODELAY)
3496 strcat (buf, ", no delay");
3497 break;
57346661 3498
351b4b40
RH
3499 case EM_SPARCV9:
3500 if (e_flags & EF_SPARC_32PLUS)
3501 strcat (buf, ", v8+");
3502
3503 if (e_flags & EF_SPARC_SUN_US1)
d07faca2
RH
3504 strcat (buf, ", ultrasparcI");
3505
3506 if (e_flags & EF_SPARC_SUN_US3)
3507 strcat (buf, ", ultrasparcIII");
351b4b40
RH
3508
3509 if (e_flags & EF_SPARC_HAL_R1)
3510 strcat (buf, ", halr1");
3511
3512 if (e_flags & EF_SPARC_LEDATA)
3513 strcat (buf, ", ledata");
3514
3515 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3516 strcat (buf, ", tso");
3517
3518 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3519 strcat (buf, ", pso");
3520
3521 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3522 strcat (buf, ", rmo");
3523 break;
7d466069 3524
103f02d3
UD
3525 case EM_PARISC:
3526 switch (e_flags & EF_PARISC_ARCH)
3527 {
3528 case EFA_PARISC_1_0:
3529 strcpy (buf, ", PA-RISC 1.0");
3530 break;
3531 case EFA_PARISC_1_1:
3532 strcpy (buf, ", PA-RISC 1.1");
3533 break;
3534 case EFA_PARISC_2_0:
3535 strcpy (buf, ", PA-RISC 2.0");
3536 break;
3537 default:
3538 break;
3539 }
3540 if (e_flags & EF_PARISC_TRAPNIL)
3541 strcat (buf, ", trapnil");
3542 if (e_flags & EF_PARISC_EXT)
3543 strcat (buf, ", ext");
3544 if (e_flags & EF_PARISC_LSB)
3545 strcat (buf, ", lsb");
3546 if (e_flags & EF_PARISC_WIDE)
3547 strcat (buf, ", wide");
3548 if (e_flags & EF_PARISC_NO_KABP)
3549 strcat (buf, ", no kabp");
3550 if (e_flags & EF_PARISC_LAZYSWAP)
3551 strcat (buf, ", lazyswap");
30800947 3552 break;
76da6bbe 3553
7d466069 3554 case EM_PJ:
2b0337b0 3555 case EM_PJ_OLD:
7d466069
ILT
3556 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3557 strcat (buf, ", new calling convention");
3558
3559 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3560 strcat (buf, ", gnu calling convention");
3561 break;
4d6ed7c8
NC
3562
3563 case EM_IA_64:
3564 if ((e_flags & EF_IA_64_ABI64))
3565 strcat (buf, ", 64-bit");
3566 else
3567 strcat (buf, ", 32-bit");
3568 if ((e_flags & EF_IA_64_REDUCEDFP))
3569 strcat (buf, ", reduced fp model");
3570 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3571 strcat (buf, ", no function descriptors, constant gp");
3572 else if ((e_flags & EF_IA_64_CONS_GP))
3573 strcat (buf, ", constant gp");
3574 if ((e_flags & EF_IA_64_ABSOLUTE))
3575 strcat (buf, ", absolute");
dda8d76d 3576 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
28f997cf
TG
3577 {
3578 if ((e_flags & EF_IA_64_VMS_LINKAGES))
3579 strcat (buf, ", vms_linkages");
3580 switch ((e_flags & EF_IA_64_VMS_COMCOD))
3581 {
3582 case EF_IA_64_VMS_COMCOD_SUCCESS:
3583 break;
3584 case EF_IA_64_VMS_COMCOD_WARNING:
3585 strcat (buf, ", warning");
3586 break;
3587 case EF_IA_64_VMS_COMCOD_ERROR:
3588 strcat (buf, ", error");
3589 break;
3590 case EF_IA_64_VMS_COMCOD_ABORT:
3591 strcat (buf, ", abort");
3592 break;
3593 default:
bee0ee85
NC
3594 warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3595 e_flags & EF_IA_64_VMS_COMCOD);
3596 strcat (buf, ", <unknown>");
28f997cf
TG
3597 }
3598 }
4d6ed7c8 3599 break;
179d3252
JT
3600
3601 case EM_VAX:
3602 if ((e_flags & EF_VAX_NONPIC))
3603 strcat (buf, ", non-PIC");
3604 if ((e_flags & EF_VAX_DFLOAT))
3605 strcat (buf, ", D-Float");
3606 if ((e_flags & EF_VAX_GFLOAT))
3607 strcat (buf, ", G-Float");
3608 break;
c7927a3c 3609
619ed720
EB
3610 case EM_VISIUM:
3611 if (e_flags & EF_VISIUM_ARCH_MCM)
3612 strcat (buf, ", mcm");
3613 else if (e_flags & EF_VISIUM_ARCH_MCM24)
3614 strcat (buf, ", mcm24");
3615 if (e_flags & EF_VISIUM_ARCH_GR6)
3616 strcat (buf, ", gr6");
3617 break;
3618
4046d87a 3619 case EM_RL78:
1740ba0c
NC
3620 switch (e_flags & E_FLAG_RL78_CPU_MASK)
3621 {
3622 case E_FLAG_RL78_ANY_CPU: break;
3623 case E_FLAG_RL78_G10: strcat (buf, ", G10"); break;
3624 case E_FLAG_RL78_G13: strcat (buf, ", G13"); break;
3625 case E_FLAG_RL78_G14: strcat (buf, ", G14"); break;
3626 }
856ea05c
KP
3627 if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3628 strcat (buf, ", 64-bit doubles");
4046d87a 3629 break;
0b4362b0 3630
c7927a3c
NC
3631 case EM_RX:
3632 if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3633 strcat (buf, ", 64-bit doubles");
3634 if (e_flags & E_FLAG_RX_DSP)
dd24e3da 3635 strcat (buf, ", dsp");
d4cb0ea0 3636 if (e_flags & E_FLAG_RX_PID)
0b4362b0 3637 strcat (buf, ", pid");
708e2187
NC
3638 if (e_flags & E_FLAG_RX_ABI)
3639 strcat (buf, ", RX ABI");
3525236c
NC
3640 if (e_flags & E_FLAG_RX_SINSNS_SET)
3641 strcat (buf, e_flags & E_FLAG_RX_SINSNS_YES
3642 ? ", uses String instructions" : ", bans String instructions");
a117b0a5
YS
3643 if (e_flags & E_FLAG_RX_V2)
3644 strcat (buf, ", V2");
d4cb0ea0 3645 break;
55786da2
AK
3646
3647 case EM_S390:
3648 if (e_flags & EF_S390_HIGH_GPRS)
3649 strcat (buf, ", highgprs");
d4cb0ea0 3650 break;
40b36596
JM
3651
3652 case EM_TI_C6000:
3653 if ((e_flags & EF_C6000_REL))
3654 strcat (buf, ", relocatable module");
d4cb0ea0 3655 break;
13761a11
NC
3656
3657 case EM_MSP430:
3658 strcat (buf, _(": architecture variant: "));
3659 switch (e_flags & EF_MSP430_MACH)
3660 {
3661 case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3662 case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3663 case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3664 case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3665 case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3666 case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3667 case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3668 case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3669 case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3670 case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3671 case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3672 case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3673 case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3674 case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3675 case E_MSP430_MACH_MSP430X : strcat (buf, "MSP430X"); break;
3676 default:
3677 strcat (buf, _(": unknown")); break;
3678 }
3679
3680 if (e_flags & ~ EF_MSP430_MACH)
3681 strcat (buf, _(": unknown extra flag bits also present"));
252b5132
RH
3682 }
3683 }
3684
3685 return buf;
3686}
3687
252b5132 3688static const char *
dda8d76d 3689get_osabi_name (Filedata * filedata, unsigned int osabi)
d3ba0551
AM
3690{
3691 static char buff[32];
3692
3693 switch (osabi)
3694 {
3695 case ELFOSABI_NONE: return "UNIX - System V";
3696 case ELFOSABI_HPUX: return "UNIX - HP-UX";
3697 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
9c55345c 3698 case ELFOSABI_GNU: return "UNIX - GNU";
d3ba0551
AM
3699 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
3700 case ELFOSABI_AIX: return "UNIX - AIX";
3701 case ELFOSABI_IRIX: return "UNIX - IRIX";
3702 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
3703 case ELFOSABI_TRU64: return "UNIX - TRU64";
3704 case ELFOSABI_MODESTO: return "Novell - Modesto";
3705 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
3706 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
3707 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
3b26c801 3708 case ELFOSABI_AROS: return "AROS";
11636f9e 3709 case ELFOSABI_FENIXOS: return "FenixOS";
6d913794
NC
3710 case ELFOSABI_CLOUDABI: return "Nuxi CloudABI";
3711 case ELFOSABI_OPENVOS: return "Stratus Technologies OpenVOS";
d3ba0551 3712 default:
40b36596 3713 if (osabi >= 64)
dda8d76d 3714 switch (filedata->file_header.e_machine)
40b36596
JM
3715 {
3716 case EM_ARM:
3717 switch (osabi)
3718 {
3719 case ELFOSABI_ARM: return "ARM";
3720 default:
3721 break;
3722 }
3723 break;
3724
3725 case EM_MSP430:
3726 case EM_MSP430_OLD:
619ed720 3727 case EM_VISIUM:
40b36596
JM
3728 switch (osabi)
3729 {
3730 case ELFOSABI_STANDALONE: return _("Standalone App");
3731 default:
3732 break;
3733 }
3734 break;
3735
3736 case EM_TI_C6000:
3737 switch (osabi)
3738 {
3739 case ELFOSABI_C6000_ELFABI: return _("Bare-metal C6000");
3740 case ELFOSABI_C6000_LINUX: return "Linux C6000";
3741 default:
3742 break;
3743 }
3744 break;
3745
3746 default:
3747 break;
3748 }
e9e44622 3749 snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
d3ba0551
AM
3750 return buff;
3751 }
3752}
3753
a06ea964
NC
3754static const char *
3755get_aarch64_segment_type (unsigned long type)
3756{
3757 switch (type)
3758 {
32ec8896
NC
3759 case PT_AARCH64_ARCHEXT: return "AARCH64_ARCHEXT";
3760 default: return NULL;
a06ea964 3761 }
a06ea964
NC
3762}
3763
b294bdf8
MM
3764static const char *
3765get_arm_segment_type (unsigned long type)
3766{
3767 switch (type)
3768 {
32ec8896
NC
3769 case PT_ARM_EXIDX: return "EXIDX";
3770 default: return NULL;
b294bdf8 3771 }
b294bdf8
MM
3772}
3773
b4cbbe8f
AK
3774static const char *
3775get_s390_segment_type (unsigned long type)
3776{
3777 switch (type)
3778 {
3779 case PT_S390_PGSTE: return "S390_PGSTE";
3780 default: return NULL;
3781 }
3782}
3783
d3ba0551
AM
3784static const char *
3785get_mips_segment_type (unsigned long type)
252b5132
RH
3786{
3787 switch (type)
3788 {
32ec8896
NC
3789 case PT_MIPS_REGINFO: return "REGINFO";
3790 case PT_MIPS_RTPROC: return "RTPROC";
3791 case PT_MIPS_OPTIONS: return "OPTIONS";
3792 case PT_MIPS_ABIFLAGS: return "ABIFLAGS";
3793 default: return NULL;
252b5132 3794 }
252b5132
RH
3795}
3796
103f02d3 3797static const char *
d3ba0551 3798get_parisc_segment_type (unsigned long type)
103f02d3
UD
3799{
3800 switch (type)
3801 {
3802 case PT_HP_TLS: return "HP_TLS";
3803 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
3804 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
3805 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
3806 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
3807 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
3808 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
3809 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
3810 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
3811 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
3812 case PT_HP_PARALLEL: return "HP_PARALLEL";
3813 case PT_HP_FASTBIND: return "HP_FASTBIND";
eec8f817
DA
3814 case PT_HP_OPT_ANNOT: return "HP_OPT_ANNOT";
3815 case PT_HP_HSL_ANNOT: return "HP_HSL_ANNOT";
3816 case PT_HP_STACK: return "HP_STACK";
3817 case PT_HP_CORE_UTSNAME: return "HP_CORE_UTSNAME";
103f02d3
UD
3818 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
3819 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
61472819 3820 case PT_PARISC_WEAKORDER: return "PARISC_WEAKORDER";
32ec8896 3821 default: return NULL;
103f02d3 3822 }
103f02d3
UD
3823}
3824
4d6ed7c8 3825static const char *
d3ba0551 3826get_ia64_segment_type (unsigned long type)
4d6ed7c8
NC
3827{
3828 switch (type)
3829 {
3830 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
3831 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
00428cca
AM
3832 case PT_HP_TLS: return "HP_TLS";
3833 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
3834 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
3835 case PT_IA_64_HP_STACK: return "HP_STACK";
32ec8896 3836 default: return NULL;
4d6ed7c8 3837 }
4d6ed7c8
NC
3838}
3839
40b36596
JM
3840static const char *
3841get_tic6x_segment_type (unsigned long type)
3842{
3843 switch (type)
3844 {
32ec8896
NC
3845 case PT_C6000_PHATTR: return "C6000_PHATTR";
3846 default: return NULL;
40b36596 3847 }
40b36596
JM
3848}
3849
5522f910
NC
3850static const char *
3851get_solaris_segment_type (unsigned long type)
3852{
3853 switch (type)
3854 {
3855 case 0x6464e550: return "PT_SUNW_UNWIND";
3856 case 0x6474e550: return "PT_SUNW_EH_FRAME";
3857 case 0x6ffffff7: return "PT_LOSUNW";
3858 case 0x6ffffffa: return "PT_SUNWBSS";
3859 case 0x6ffffffb: return "PT_SUNWSTACK";
3860 case 0x6ffffffc: return "PT_SUNWDTRACE";
3861 case 0x6ffffffd: return "PT_SUNWCAP";
3862 case 0x6fffffff: return "PT_HISUNW";
32ec8896 3863 default: return NULL;
5522f910
NC
3864 }
3865}
3866
252b5132 3867static const char *
dda8d76d 3868get_segment_type (Filedata * filedata, unsigned long p_type)
252b5132 3869{
b34976b6 3870 static char buff[32];
252b5132
RH
3871
3872 switch (p_type)
3873 {
b34976b6
AM
3874 case PT_NULL: return "NULL";
3875 case PT_LOAD: return "LOAD";
252b5132 3876 case PT_DYNAMIC: return "DYNAMIC";
b34976b6
AM
3877 case PT_INTERP: return "INTERP";
3878 case PT_NOTE: return "NOTE";
3879 case PT_SHLIB: return "SHLIB";
3880 case PT_PHDR: return "PHDR";
13ae64f3 3881 case PT_TLS: return "TLS";
32ec8896 3882 case PT_GNU_EH_FRAME: return "GNU_EH_FRAME";
2b05f1b7 3883 case PT_GNU_STACK: return "GNU_STACK";
8c37241b 3884 case PT_GNU_RELRO: return "GNU_RELRO";
65765700 3885
252b5132 3886 default:
a91e1603
L
3887 if (p_type >= PT_GNU_MBIND_LO && p_type <= PT_GNU_MBIND_HI)
3888 {
3889 sprintf (buff, "GNU_MBIND+%#lx",
3890 p_type - PT_GNU_MBIND_LO);
3891 }
3892 else if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
252b5132 3893 {
2cf0635d 3894 const char * result;
103f02d3 3895
dda8d76d 3896 switch (filedata->file_header.e_machine)
252b5132 3897 {
a06ea964
NC
3898 case EM_AARCH64:
3899 result = get_aarch64_segment_type (p_type);
3900 break;
b294bdf8
MM
3901 case EM_ARM:
3902 result = get_arm_segment_type (p_type);
3903 break;
252b5132 3904 case EM_MIPS:
4fe85591 3905 case EM_MIPS_RS3_LE:
252b5132
RH
3906 result = get_mips_segment_type (p_type);
3907 break;
103f02d3
UD
3908 case EM_PARISC:
3909 result = get_parisc_segment_type (p_type);
3910 break;
4d6ed7c8
NC
3911 case EM_IA_64:
3912 result = get_ia64_segment_type (p_type);
3913 break;
40b36596
JM
3914 case EM_TI_C6000:
3915 result = get_tic6x_segment_type (p_type);
3916 break;
b4cbbe8f
AK
3917 case EM_S390:
3918 case EM_S390_OLD:
3919 result = get_s390_segment_type (p_type);
3920 break;
252b5132
RH
3921 default:
3922 result = NULL;
3923 break;
3924 }
103f02d3 3925
252b5132
RH
3926 if (result != NULL)
3927 return result;
103f02d3 3928
1a9ccd70 3929 sprintf (buff, "LOPROC+%#lx", p_type - PT_LOPROC);
252b5132
RH
3930 }
3931 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
103f02d3 3932 {
2cf0635d 3933 const char * result;
103f02d3 3934
dda8d76d 3935 switch (filedata->file_header.e_machine)
103f02d3
UD
3936 {
3937 case EM_PARISC:
3938 result = get_parisc_segment_type (p_type);
3939 break;
00428cca
AM
3940 case EM_IA_64:
3941 result = get_ia64_segment_type (p_type);
3942 break;
103f02d3 3943 default:
dda8d76d 3944 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
5522f910
NC
3945 result = get_solaris_segment_type (p_type);
3946 else
3947 result = NULL;
103f02d3
UD
3948 break;
3949 }
3950
3951 if (result != NULL)
3952 return result;
3953
1a9ccd70 3954 sprintf (buff, "LOOS+%#lx", p_type - PT_LOOS);
103f02d3 3955 }
252b5132 3956 else
e9e44622 3957 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
252b5132
RH
3958
3959 return buff;
3960 }
3961}
3962
53a346d8
CZ
3963static const char *
3964get_arc_section_type_name (unsigned int sh_type)
3965{
3966 switch (sh_type)
3967 {
3968 case SHT_ARC_ATTRIBUTES: return "ARC_ATTRIBUTES";
3969 default:
3970 break;
3971 }
3972 return NULL;
3973}
3974
252b5132 3975static const char *
d3ba0551 3976get_mips_section_type_name (unsigned int sh_type)
252b5132
RH
3977{
3978 switch (sh_type)
3979 {
b34976b6
AM
3980 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
3981 case SHT_MIPS_MSYM: return "MIPS_MSYM";
3982 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
3983 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
3984 case SHT_MIPS_UCODE: return "MIPS_UCODE";
3985 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
3986 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
3987 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
3988 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
3989 case SHT_MIPS_RELD: return "MIPS_RELD";
3990 case SHT_MIPS_IFACE: return "MIPS_IFACE";
3991 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
3992 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
3993 case SHT_MIPS_SHDR: return "MIPS_SHDR";
3994 case SHT_MIPS_FDESC: return "MIPS_FDESC";
3995 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
3996 case SHT_MIPS_DENSE: return "MIPS_DENSE";
3997 case SHT_MIPS_PDESC: return "MIPS_PDESC";
3998 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
3999 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
4000 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
4001 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
4002 case SHT_MIPS_LINE: return "MIPS_LINE";
4003 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
4004 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
4005 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
4006 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
4007 case SHT_MIPS_DWARF: return "MIPS_DWARF";
4008 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
4009 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
4010 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
4011 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
4012 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
4013 case SHT_MIPS_XLATE: return "MIPS_XLATE";
4014 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
4015 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
4016 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
4017 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
252b5132 4018 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
351cdf24 4019 case SHT_MIPS_ABIFLAGS: return "MIPS_ABIFLAGS";
252b5132
RH
4020 default:
4021 break;
4022 }
4023 return NULL;
4024}
4025
103f02d3 4026static const char *
d3ba0551 4027get_parisc_section_type_name (unsigned int sh_type)
103f02d3
UD
4028{
4029 switch (sh_type)
4030 {
4031 case SHT_PARISC_EXT: return "PARISC_EXT";
4032 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
4033 case SHT_PARISC_DOC: return "PARISC_DOC";
eec8f817
DA
4034 case SHT_PARISC_ANNOT: return "PARISC_ANNOT";
4035 case SHT_PARISC_SYMEXTN: return "PARISC_SYMEXTN";
4036 case SHT_PARISC_STUBS: return "PARISC_STUBS";
61472819 4037 case SHT_PARISC_DLKM: return "PARISC_DLKM";
32ec8896 4038 default: return NULL;
103f02d3 4039 }
103f02d3
UD
4040}
4041
4d6ed7c8 4042static const char *
dda8d76d 4043get_ia64_section_type_name (Filedata * filedata, unsigned int sh_type)
4d6ed7c8 4044{
18bd398b 4045 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
ecc51f48 4046 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
dda8d76d 4047 return get_osabi_name (filedata, (sh_type & 0x00FF0000) >> 16);
0de14b54 4048
4d6ed7c8
NC
4049 switch (sh_type)
4050 {
148b93f2
NC
4051 case SHT_IA_64_EXT: return "IA_64_EXT";
4052 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
4053 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
4054 case SHT_IA_64_VMS_TRACE: return "VMS_TRACE";
4055 case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
4056 case SHT_IA_64_VMS_DEBUG: return "VMS_DEBUG";
4057 case SHT_IA_64_VMS_DEBUG_STR: return "VMS_DEBUG_STR";
4058 case SHT_IA_64_VMS_LINKAGES: return "VMS_LINKAGES";
4059 case SHT_IA_64_VMS_SYMBOL_VECTOR: return "VMS_SYMBOL_VECTOR";
4060 case SHT_IA_64_VMS_FIXUP: return "VMS_FIXUP";
4d6ed7c8
NC
4061 default:
4062 break;
4063 }
4064 return NULL;
4065}
4066
d2b2c203
DJ
4067static const char *
4068get_x86_64_section_type_name (unsigned int sh_type)
4069{
4070 switch (sh_type)
4071 {
4072 case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
32ec8896 4073 default: return NULL;
d2b2c203 4074 }
d2b2c203
DJ
4075}
4076
a06ea964
NC
4077static const char *
4078get_aarch64_section_type_name (unsigned int sh_type)
4079{
4080 switch (sh_type)
4081 {
32ec8896
NC
4082 case SHT_AARCH64_ATTRIBUTES: return "AARCH64_ATTRIBUTES";
4083 default: return NULL;
a06ea964 4084 }
a06ea964
NC
4085}
4086
40a18ebd
NC
4087static const char *
4088get_arm_section_type_name (unsigned int sh_type)
4089{
4090 switch (sh_type)
4091 {
7f6fed87
NC
4092 case SHT_ARM_EXIDX: return "ARM_EXIDX";
4093 case SHT_ARM_PREEMPTMAP: return "ARM_PREEMPTMAP";
4094 case SHT_ARM_ATTRIBUTES: return "ARM_ATTRIBUTES";
4095 case SHT_ARM_DEBUGOVERLAY: return "ARM_DEBUGOVERLAY";
4096 case SHT_ARM_OVERLAYSECTION: return "ARM_OVERLAYSECTION";
32ec8896 4097 default: return NULL;
40a18ebd 4098 }
40a18ebd
NC
4099}
4100
40b36596
JM
4101static const char *
4102get_tic6x_section_type_name (unsigned int sh_type)
4103{
4104 switch (sh_type)
4105 {
32ec8896
NC
4106 case SHT_C6000_UNWIND: return "C6000_UNWIND";
4107 case SHT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
4108 case SHT_C6000_ATTRIBUTES: return "C6000_ATTRIBUTES";
4109 case SHT_TI_ICODE: return "TI_ICODE";
4110 case SHT_TI_XREF: return "TI_XREF";
4111 case SHT_TI_HANDLER: return "TI_HANDLER";
4112 case SHT_TI_INITINFO: return "TI_INITINFO";
4113 case SHT_TI_PHATTRS: return "TI_PHATTRS";
4114 default: return NULL;
40b36596 4115 }
40b36596
JM
4116}
4117
13761a11
NC
4118static const char *
4119get_msp430x_section_type_name (unsigned int sh_type)
4120{
4121 switch (sh_type)
4122 {
32ec8896
NC
4123 case SHT_MSP430_SEC_FLAGS: return "MSP430_SEC_FLAGS";
4124 case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
4125 case SHT_MSP430_ATTRIBUTES: return "MSP430_ATTRIBUTES";
4126 default: return NULL;
13761a11
NC
4127 }
4128}
4129
685080f2
NC
4130static const char *
4131get_v850_section_type_name (unsigned int sh_type)
4132{
4133 switch (sh_type)
4134 {
32ec8896
NC
4135 case SHT_V850_SCOMMON: return "V850 Small Common";
4136 case SHT_V850_TCOMMON: return "V850 Tiny Common";
4137 case SHT_V850_ZCOMMON: return "V850 Zero Common";
4138 case SHT_RENESAS_IOP: return "RENESAS IOP";
4139 case SHT_RENESAS_INFO: return "RENESAS INFO";
4140 default: return NULL;
685080f2
NC
4141 }
4142}
4143
252b5132 4144static const char *
dda8d76d 4145get_section_type_name (Filedata * filedata, unsigned int sh_type)
252b5132 4146{
b34976b6 4147 static char buff[32];
9fb71ee4 4148 const char * result;
252b5132
RH
4149
4150 switch (sh_type)
4151 {
4152 case SHT_NULL: return "NULL";
4153 case SHT_PROGBITS: return "PROGBITS";
4154 case SHT_SYMTAB: return "SYMTAB";
4155 case SHT_STRTAB: return "STRTAB";
4156 case SHT_RELA: return "RELA";
4157 case SHT_HASH: return "HASH";
4158 case SHT_DYNAMIC: return "DYNAMIC";
4159 case SHT_NOTE: return "NOTE";
4160 case SHT_NOBITS: return "NOBITS";
4161 case SHT_REL: return "REL";
4162 case SHT_SHLIB: return "SHLIB";
4163 case SHT_DYNSYM: return "DYNSYM";
d1133906
NC
4164 case SHT_INIT_ARRAY: return "INIT_ARRAY";
4165 case SHT_FINI_ARRAY: return "FINI_ARRAY";
4166 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
fdc90cb4 4167 case SHT_GNU_HASH: return "GNU_HASH";
93ebe586
NC
4168 case SHT_GROUP: return "GROUP";
4169 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
252b5132
RH
4170 case SHT_GNU_verdef: return "VERDEF";
4171 case SHT_GNU_verneed: return "VERNEED";
4172 case SHT_GNU_versym: return "VERSYM";
b34976b6
AM
4173 case 0x6ffffff0: return "VERSYM";
4174 case 0x6ffffffc: return "VERDEF";
252b5132
RH
4175 case 0x7ffffffd: return "AUXILIARY";
4176 case 0x7fffffff: return "FILTER";
047b2264 4177 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
252b5132
RH
4178
4179 default:
4180 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
4181 {
dda8d76d 4182 switch (filedata->file_header.e_machine)
252b5132 4183 {
53a346d8
CZ
4184 case EM_ARC:
4185 case EM_ARC_COMPACT:
4186 case EM_ARC_COMPACT2:
4187 result = get_arc_section_type_name (sh_type);
4188 break;
252b5132 4189 case EM_MIPS:
4fe85591 4190 case EM_MIPS_RS3_LE:
252b5132
RH
4191 result = get_mips_section_type_name (sh_type);
4192 break;
103f02d3
UD
4193 case EM_PARISC:
4194 result = get_parisc_section_type_name (sh_type);
4195 break;
4d6ed7c8 4196 case EM_IA_64:
dda8d76d 4197 result = get_ia64_section_type_name (filedata, sh_type);
4d6ed7c8 4198 break;
d2b2c203 4199 case EM_X86_64:
8a9036a4 4200 case EM_L1OM:
7a9068fe 4201 case EM_K1OM:
d2b2c203
DJ
4202 result = get_x86_64_section_type_name (sh_type);
4203 break;
a06ea964
NC
4204 case EM_AARCH64:
4205 result = get_aarch64_section_type_name (sh_type);
4206 break;
40a18ebd
NC
4207 case EM_ARM:
4208 result = get_arm_section_type_name (sh_type);
4209 break;
40b36596
JM
4210 case EM_TI_C6000:
4211 result = get_tic6x_section_type_name (sh_type);
4212 break;
13761a11
NC
4213 case EM_MSP430:
4214 result = get_msp430x_section_type_name (sh_type);
4215 break;
685080f2
NC
4216 case EM_V800:
4217 case EM_V850:
4218 case EM_CYGNUS_V850:
4219 result = get_v850_section_type_name (sh_type);
4220 break;
252b5132
RH
4221 default:
4222 result = NULL;
4223 break;
4224 }
4225
4226 if (result != NULL)
4227 return result;
4228
9fb71ee4 4229 sprintf (buff, "LOPROC+%#x", sh_type - SHT_LOPROC);
252b5132
RH
4230 }
4231 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
148b93f2 4232 {
dda8d76d 4233 switch (filedata->file_header.e_machine)
148b93f2
NC
4234 {
4235 case EM_IA_64:
dda8d76d 4236 result = get_ia64_section_type_name (filedata, sh_type);
148b93f2
NC
4237 break;
4238 default:
dda8d76d 4239 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
fd85a6a1
NC
4240 result = get_solaris_section_type (sh_type);
4241 else
1b4b80bf
NC
4242 {
4243 switch (sh_type)
4244 {
4245 case SHT_GNU_INCREMENTAL_INPUTS: result = "GNU_INCREMENTAL_INPUTS"; break;
4246 case SHT_GNU_ATTRIBUTES: result = "GNU_ATTRIBUTES"; break;
4247 case SHT_GNU_HASH: result = "GNU_HASH"; break;
4248 case SHT_GNU_LIBLIST: result = "GNU_LIBLIST"; break;
4249 default:
4250 result = NULL;
4251 break;
4252 }
4253 }
148b93f2
NC
4254 break;
4255 }
4256
4257 if (result != NULL)
4258 return result;
4259
9fb71ee4 4260 sprintf (buff, "LOOS+%#x", sh_type - SHT_LOOS);
148b93f2 4261 }
252b5132 4262 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
685080f2 4263 {
dda8d76d 4264 switch (filedata->file_header.e_machine)
685080f2
NC
4265 {
4266 case EM_V800:
4267 case EM_V850:
4268 case EM_CYGNUS_V850:
9fb71ee4 4269 result = get_v850_section_type_name (sh_type);
a9fb83be 4270 break;
685080f2 4271 default:
9fb71ee4 4272 result = NULL;
685080f2
NC
4273 break;
4274 }
4275
9fb71ee4
NC
4276 if (result != NULL)
4277 return result;
4278
4279 sprintf (buff, "LOUSER+%#x", sh_type - SHT_LOUSER);
685080f2 4280 }
252b5132 4281 else
a7dbfd1c
NC
4282 /* This message is probably going to be displayed in a 15
4283 character wide field, so put the hex value first. */
4284 snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
103f02d3 4285
252b5132
RH
4286 return buff;
4287 }
4288}
4289
2979dc34 4290#define OPTION_DEBUG_DUMP 512
2c610e4b 4291#define OPTION_DYN_SYMS 513
fd2f0033
TT
4292#define OPTION_DWARF_DEPTH 514
4293#define OPTION_DWARF_START 515
4723351a 4294#define OPTION_DWARF_CHECK 516
2979dc34 4295
85b1c36d 4296static struct option options[] =
252b5132 4297{
b34976b6 4298 {"all", no_argument, 0, 'a'},
252b5132
RH
4299 {"file-header", no_argument, 0, 'h'},
4300 {"program-headers", no_argument, 0, 'l'},
b34976b6
AM
4301 {"headers", no_argument, 0, 'e'},
4302 {"histogram", no_argument, 0, 'I'},
4303 {"segments", no_argument, 0, 'l'},
4304 {"sections", no_argument, 0, 'S'},
252b5132 4305 {"section-headers", no_argument, 0, 'S'},
f5842774 4306 {"section-groups", no_argument, 0, 'g'},
5477e8a0 4307 {"section-details", no_argument, 0, 't'},
595cf52e 4308 {"full-section-name",no_argument, 0, 'N'},
b34976b6
AM
4309 {"symbols", no_argument, 0, 's'},
4310 {"syms", no_argument, 0, 's'},
2c610e4b 4311 {"dyn-syms", no_argument, 0, OPTION_DYN_SYMS},
b34976b6
AM
4312 {"relocs", no_argument, 0, 'r'},
4313 {"notes", no_argument, 0, 'n'},
4314 {"dynamic", no_argument, 0, 'd'},
a952a375 4315 {"arch-specific", no_argument, 0, 'A'},
252b5132
RH
4316 {"version-info", no_argument, 0, 'V'},
4317 {"use-dynamic", no_argument, 0, 'D'},
09c11c86 4318 {"unwind", no_argument, 0, 'u'},
4145f1d5 4319 {"archive-index", no_argument, 0, 'c'},
b34976b6 4320 {"hex-dump", required_argument, 0, 'x'},
cf13d699 4321 {"relocated-dump", required_argument, 0, 'R'},
09c11c86 4322 {"string-dump", required_argument, 0, 'p'},
0e602686 4323 {"decompress", no_argument, 0, 'z'},
252b5132
RH
4324#ifdef SUPPORT_DISASSEMBLY
4325 {"instruction-dump", required_argument, 0, 'i'},
4326#endif
cf13d699 4327 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
252b5132 4328
fd2f0033
TT
4329 {"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH},
4330 {"dwarf-start", required_argument, 0, OPTION_DWARF_START},
4723351a 4331 {"dwarf-check", no_argument, 0, OPTION_DWARF_CHECK},
fd2f0033 4332
b34976b6
AM
4333 {"version", no_argument, 0, 'v'},
4334 {"wide", no_argument, 0, 'W'},
4335 {"help", no_argument, 0, 'H'},
4336 {0, no_argument, 0, 0}
252b5132
RH
4337};
4338
4339static void
2cf0635d 4340usage (FILE * stream)
252b5132 4341{
92f01d61
JM
4342 fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
4343 fprintf (stream, _(" Display information about the contents of ELF format files\n"));
4344 fprintf (stream, _(" Options are:\n\
8b53311e
NC
4345 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4346 -h --file-header Display the ELF file header\n\
4347 -l --program-headers Display the program headers\n\
4348 --segments An alias for --program-headers\n\
4349 -S --section-headers Display the sections' header\n\
4350 --sections An alias for --section-headers\n\
f5842774 4351 -g --section-groups Display the section groups\n\
5477e8a0 4352 -t --section-details Display the section details\n\
8b53311e
NC
4353 -e --headers Equivalent to: -h -l -S\n\
4354 -s --syms Display the symbol table\n\
3f08eb35 4355 --symbols An alias for --syms\n\
2c610e4b 4356 --dyn-syms Display the dynamic symbol table\n\
8b53311e
NC
4357 -n --notes Display the core notes (if present)\n\
4358 -r --relocs Display the relocations (if present)\n\
4359 -u --unwind Display the unwind info (if present)\n\
b2d38a17 4360 -d --dynamic Display the dynamic section (if present)\n\
8b53311e 4361 -V --version-info Display the version sections (if present)\n\
1b31d05e 4362 -A --arch-specific Display architecture specific information (if any)\n\
4145f1d5 4363 -c --archive-index Display the symbol/file index in an archive\n\
8b53311e 4364 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
09c11c86
NC
4365 -x --hex-dump=<number|name>\n\
4366 Dump the contents of section <number|name> as bytes\n\
4367 -p --string-dump=<number|name>\n\
4368 Dump the contents of section <number|name> as strings\n\
cf13d699
NC
4369 -R --relocated-dump=<number|name>\n\
4370 Dump the contents of section <number|name> as relocated bytes\n\
0e602686 4371 -z --decompress Decompress section before dumping it\n\
dda8d76d 4372 -w[lLiaprmfFsoRtUuTgAckK] or\n\
1ed06042 4373 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
6f875884 4374 =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
657d0d47 4375 =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
dda8d76d
NC
4376 =addr,=cu_index,=links,=follow-links]\n\
4377 Display the contents of DWARF debug sections\n"));
fd2f0033
TT
4378 fprintf (stream, _("\
4379 --dwarf-depth=N Do not display DIEs at depth N or greater\n\
4380 --dwarf-start=N Display DIEs starting with N, at the same depth\n\
4381 or deeper\n"));
252b5132 4382#ifdef SUPPORT_DISASSEMBLY
92f01d61 4383 fprintf (stream, _("\
09c11c86
NC
4384 -i --instruction-dump=<number|name>\n\
4385 Disassemble the contents of section <number|name>\n"));
252b5132 4386#endif
92f01d61 4387 fprintf (stream, _("\
8b53311e
NC
4388 -I --histogram Display histogram of bucket list lengths\n\
4389 -W --wide Allow output width to exceed 80 characters\n\
07012eee 4390 @<file> Read options from <file>\n\
8b53311e
NC
4391 -H --help Display this information\n\
4392 -v --version Display the version number of readelf\n"));
1118d252 4393
92f01d61
JM
4394 if (REPORT_BUGS_TO[0] && stream == stdout)
4395 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
252b5132 4396
92f01d61 4397 exit (stream == stdout ? 0 : 1);
252b5132
RH
4398}
4399
18bd398b
NC
4400/* Record the fact that the user wants the contents of section number
4401 SECTION to be displayed using the method(s) encoded as flags bits
4402 in TYPE. Note, TYPE can be zero if we are creating the array for
4403 the first time. */
4404
252b5132 4405static void
dda8d76d 4406request_dump_bynumber (Filedata * filedata, unsigned int section, dump_type type)
252b5132 4407{
dda8d76d 4408 if (section >= filedata->num_dump_sects)
252b5132 4409 {
2cf0635d 4410 dump_type * new_dump_sects;
252b5132 4411
3f5e193b 4412 new_dump_sects = (dump_type *) calloc (section + 1,
dda8d76d 4413 sizeof (* new_dump_sects));
252b5132
RH
4414
4415 if (new_dump_sects == NULL)
591a748a 4416 error (_("Out of memory allocating dump request table.\n"));
252b5132
RH
4417 else
4418 {
dda8d76d 4419 if (filedata->dump_sects)
21b65bac
NC
4420 {
4421 /* Copy current flag settings. */
dda8d76d
NC
4422 memcpy (new_dump_sects, filedata->dump_sects,
4423 filedata->num_dump_sects * sizeof (* new_dump_sects));
252b5132 4424
dda8d76d 4425 free (filedata->dump_sects);
21b65bac 4426 }
252b5132 4427
dda8d76d
NC
4428 filedata->dump_sects = new_dump_sects;
4429 filedata->num_dump_sects = section + 1;
252b5132
RH
4430 }
4431 }
4432
dda8d76d
NC
4433 if (filedata->dump_sects)
4434 filedata->dump_sects[section] |= type;
252b5132
RH
4435}
4436
aef1f6d0
DJ
4437/* Request a dump by section name. */
4438
4439static void
2cf0635d 4440request_dump_byname (const char * section, dump_type type)
aef1f6d0 4441{
2cf0635d 4442 struct dump_list_entry * new_request;
aef1f6d0 4443
3f5e193b
NC
4444 new_request = (struct dump_list_entry *)
4445 malloc (sizeof (struct dump_list_entry));
aef1f6d0 4446 if (!new_request)
591a748a 4447 error (_("Out of memory allocating dump request table.\n"));
aef1f6d0
DJ
4448
4449 new_request->name = strdup (section);
4450 if (!new_request->name)
591a748a 4451 error (_("Out of memory allocating dump request table.\n"));
aef1f6d0
DJ
4452
4453 new_request->type = type;
4454
4455 new_request->next = dump_sects_byname;
4456 dump_sects_byname = new_request;
4457}
4458
cf13d699 4459static inline void
dda8d76d 4460request_dump (Filedata * filedata, dump_type type)
cf13d699
NC
4461{
4462 int section;
4463 char * cp;
4464
4465 do_dump++;
4466 section = strtoul (optarg, & cp, 0);
4467
4468 if (! *cp && section >= 0)
dda8d76d 4469 request_dump_bynumber (filedata, section, type);
cf13d699
NC
4470 else
4471 request_dump_byname (optarg, type);
4472}
4473
252b5132 4474static void
dda8d76d 4475parse_args (Filedata * filedata, int argc, char ** argv)
252b5132
RH
4476{
4477 int c;
4478
4479 if (argc < 2)
92f01d61 4480 usage (stderr);
252b5132
RH
4481
4482 while ((c = getopt_long
0e602686 4483 (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
252b5132 4484 {
252b5132
RH
4485 switch (c)
4486 {
4487 case 0:
4488 /* Long options. */
4489 break;
4490 case 'H':
92f01d61 4491 usage (stdout);
252b5132
RH
4492 break;
4493
4494 case 'a':
32ec8896
NC
4495 do_syms = TRUE;
4496 do_reloc = TRUE;
4497 do_unwind = TRUE;
4498 do_dynamic = TRUE;
4499 do_header = TRUE;
4500 do_sections = TRUE;
4501 do_section_groups = TRUE;
4502 do_segments = TRUE;
4503 do_version = TRUE;
4504 do_histogram = TRUE;
4505 do_arch = TRUE;
4506 do_notes = TRUE;
252b5132 4507 break;
f5842774 4508 case 'g':
32ec8896 4509 do_section_groups = TRUE;
f5842774 4510 break;
5477e8a0 4511 case 't':
595cf52e 4512 case 'N':
32ec8896
NC
4513 do_sections = TRUE;
4514 do_section_details = TRUE;
595cf52e 4515 break;
252b5132 4516 case 'e':
32ec8896
NC
4517 do_header = TRUE;
4518 do_sections = TRUE;
4519 do_segments = TRUE;
252b5132 4520 break;
a952a375 4521 case 'A':
32ec8896 4522 do_arch = TRUE;
a952a375 4523 break;
252b5132 4524 case 'D':
32ec8896 4525 do_using_dynamic = TRUE;
252b5132
RH
4526 break;
4527 case 'r':
32ec8896 4528 do_reloc = TRUE;
252b5132 4529 break;
4d6ed7c8 4530 case 'u':
32ec8896 4531 do_unwind = TRUE;
4d6ed7c8 4532 break;
252b5132 4533 case 'h':
32ec8896 4534 do_header = TRUE;
252b5132
RH
4535 break;
4536 case 'l':
32ec8896 4537 do_segments = TRUE;
252b5132
RH
4538 break;
4539 case 's':
32ec8896 4540 do_syms = TRUE;
252b5132
RH
4541 break;
4542 case 'S':
32ec8896 4543 do_sections = TRUE;
252b5132
RH
4544 break;
4545 case 'd':
32ec8896 4546 do_dynamic = TRUE;
252b5132 4547 break;
a952a375 4548 case 'I':
32ec8896 4549 do_histogram = TRUE;
a952a375 4550 break;
779fe533 4551 case 'n':
32ec8896 4552 do_notes = TRUE;
779fe533 4553 break;
4145f1d5 4554 case 'c':
32ec8896 4555 do_archive_index = TRUE;
4145f1d5 4556 break;
252b5132 4557 case 'x':
dda8d76d 4558 request_dump (filedata, HEX_DUMP);
aef1f6d0 4559 break;
09c11c86 4560 case 'p':
dda8d76d 4561 request_dump (filedata, STRING_DUMP);
cf13d699
NC
4562 break;
4563 case 'R':
dda8d76d 4564 request_dump (filedata, RELOC_DUMP);
09c11c86 4565 break;
0e602686 4566 case 'z':
32ec8896 4567 decompress_dumps = TRUE;
0e602686 4568 break;
252b5132 4569 case 'w':
32ec8896 4570 do_dump = TRUE;
252b5132 4571 if (optarg == 0)
613ff48b 4572 {
32ec8896 4573 do_debugging = TRUE;
613ff48b
CC
4574 dwarf_select_sections_all ();
4575 }
252b5132
RH
4576 else
4577 {
32ec8896 4578 do_debugging = FALSE;
4cb93e3b 4579 dwarf_select_sections_by_letters (optarg);
252b5132
RH
4580 }
4581 break;
2979dc34 4582 case OPTION_DEBUG_DUMP:
32ec8896 4583 do_dump = TRUE;
2979dc34 4584 if (optarg == 0)
32ec8896 4585 do_debugging = TRUE;
2979dc34
JJ
4586 else
4587 {
32ec8896 4588 do_debugging = FALSE;
4cb93e3b 4589 dwarf_select_sections_by_names (optarg);
2979dc34
JJ
4590 }
4591 break;
fd2f0033
TT
4592 case OPTION_DWARF_DEPTH:
4593 {
4594 char *cp;
4595
4596 dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4597 }
4598 break;
4599 case OPTION_DWARF_START:
4600 {
4601 char *cp;
4602
4603 dwarf_start_die = strtoul (optarg, & cp, 0);
4604 }
4605 break;
4723351a 4606 case OPTION_DWARF_CHECK:
32ec8896 4607 dwarf_check = TRUE;
4723351a 4608 break;
2c610e4b 4609 case OPTION_DYN_SYMS:
32ec8896 4610 do_dyn_syms = TRUE;
2c610e4b 4611 break;
252b5132
RH
4612#ifdef SUPPORT_DISASSEMBLY
4613 case 'i':
dda8d76d 4614 request_dump (filedata, DISASS_DUMP);
cf13d699 4615 break;
252b5132
RH
4616#endif
4617 case 'v':
4618 print_version (program_name);
4619 break;
4620 case 'V':
32ec8896 4621 do_version = TRUE;
252b5132 4622 break;
d974e256 4623 case 'W':
32ec8896 4624 do_wide = TRUE;
d974e256 4625 break;
252b5132 4626 default:
252b5132
RH
4627 /* xgettext:c-format */
4628 error (_("Invalid option '-%c'\n"), c);
1a0670f3 4629 /* Fall through. */
252b5132 4630 case '?':
92f01d61 4631 usage (stderr);
252b5132
RH
4632 }
4633 }
4634
4d6ed7c8 4635 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
252b5132 4636 && !do_segments && !do_header && !do_dump && !do_version
f5842774 4637 && !do_histogram && !do_debugging && !do_arch && !do_notes
2c610e4b
L
4638 && !do_section_groups && !do_archive_index
4639 && !do_dyn_syms)
92f01d61 4640 usage (stderr);
252b5132
RH
4641}
4642
4643static const char *
d3ba0551 4644get_elf_class (unsigned int elf_class)
252b5132 4645{
b34976b6 4646 static char buff[32];
103f02d3 4647
252b5132
RH
4648 switch (elf_class)
4649 {
4650 case ELFCLASSNONE: return _("none");
e3c8793a
NC
4651 case ELFCLASS32: return "ELF32";
4652 case ELFCLASS64: return "ELF64";
ab5e7794 4653 default:
e9e44622 4654 snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
ab5e7794 4655 return buff;
252b5132
RH
4656 }
4657}
4658
4659static const char *
d3ba0551 4660get_data_encoding (unsigned int encoding)
252b5132 4661{
b34976b6 4662 static char buff[32];
103f02d3 4663
252b5132
RH
4664 switch (encoding)
4665 {
4666 case ELFDATANONE: return _("none");
33c63f9d
CM
4667 case ELFDATA2LSB: return _("2's complement, little endian");
4668 case ELFDATA2MSB: return _("2's complement, big endian");
103f02d3 4669 default:
e9e44622 4670 snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
ab5e7794 4671 return buff;
252b5132
RH
4672 }
4673}
4674
dda8d76d 4675/* Decode the data held in 'filedata->file_header'. */
ee42cf8c 4676
32ec8896 4677static bfd_boolean
dda8d76d 4678process_file_header (Filedata * filedata)
252b5132 4679{
dda8d76d
NC
4680 Elf_Internal_Ehdr * header = & filedata->file_header;
4681
4682 if ( header->e_ident[EI_MAG0] != ELFMAG0
4683 || header->e_ident[EI_MAG1] != ELFMAG1
4684 || header->e_ident[EI_MAG2] != ELFMAG2
4685 || header->e_ident[EI_MAG3] != ELFMAG3)
252b5132
RH
4686 {
4687 error
4688 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
32ec8896 4689 return FALSE;
252b5132
RH
4690 }
4691
dda8d76d 4692 init_dwarf_regnames (header->e_machine);
2dc4cec1 4693
252b5132
RH
4694 if (do_header)
4695 {
32ec8896 4696 unsigned i;
252b5132
RH
4697
4698 printf (_("ELF Header:\n"));
4699 printf (_(" Magic: "));
b34976b6 4700 for (i = 0; i < EI_NIDENT; i++)
dda8d76d 4701 printf ("%2.2x ", header->e_ident[i]);
252b5132
RH
4702 printf ("\n");
4703 printf (_(" Class: %s\n"),
dda8d76d 4704 get_elf_class (header->e_ident[EI_CLASS]));
252b5132 4705 printf (_(" Data: %s\n"),
dda8d76d 4706 get_data_encoding (header->e_ident[EI_DATA]));
252b5132 4707 printf (_(" Version: %d %s\n"),
dda8d76d
NC
4708 header->e_ident[EI_VERSION],
4709 (header->e_ident[EI_VERSION] == EV_CURRENT
789be9f7 4710 ? "(current)"
dda8d76d 4711 : (header->e_ident[EI_VERSION] != EV_NONE
2b692964 4712 ? _("<unknown: %lx>")
789be9f7 4713 : "")));
252b5132 4714 printf (_(" OS/ABI: %s\n"),
dda8d76d 4715 get_osabi_name (filedata, header->e_ident[EI_OSABI]));
252b5132 4716 printf (_(" ABI Version: %d\n"),
dda8d76d 4717 header->e_ident[EI_ABIVERSION]);
252b5132 4718 printf (_(" Type: %s\n"),
dda8d76d 4719 get_file_type (header->e_type));
252b5132 4720 printf (_(" Machine: %s\n"),
dda8d76d 4721 get_machine_name (header->e_machine));
252b5132 4722 printf (_(" Version: 0x%lx\n"),
dda8d76d 4723 (unsigned long) header->e_version);
76da6bbe 4724
f7a99963 4725 printf (_(" Entry point address: "));
dda8d76d 4726 print_vma ((bfd_vma) header->e_entry, PREFIX_HEX);
f7a99963 4727 printf (_("\n Start of program headers: "));
dda8d76d 4728 print_vma ((bfd_vma) header->e_phoff, DEC);
f7a99963 4729 printf (_(" (bytes into file)\n Start of section headers: "));
dda8d76d 4730 print_vma ((bfd_vma) header->e_shoff, DEC);
f7a99963 4731 printf (_(" (bytes into file)\n"));
76da6bbe 4732
252b5132 4733 printf (_(" Flags: 0x%lx%s\n"),
dda8d76d
NC
4734 (unsigned long) header->e_flags,
4735 get_machine_flags (filedata, header->e_flags, header->e_machine));
252b5132 4736 printf (_(" Size of this header: %ld (bytes)\n"),
dda8d76d 4737 (long) header->e_ehsize);
252b5132 4738 printf (_(" Size of program headers: %ld (bytes)\n"),
dda8d76d 4739 (long) header->e_phentsize);
2046a35d 4740 printf (_(" Number of program headers: %ld"),
dda8d76d
NC
4741 (long) header->e_phnum);
4742 if (filedata->section_headers != NULL
4743 && header->e_phnum == PN_XNUM
4744 && filedata->section_headers[0].sh_info != 0)
4745 printf (" (%ld)", (long) filedata->section_headers[0].sh_info);
2046a35d 4746 putc ('\n', stdout);
252b5132 4747 printf (_(" Size of section headers: %ld (bytes)\n"),
dda8d76d 4748 (long) header->e_shentsize);
560f3c1c 4749 printf (_(" Number of section headers: %ld"),
dda8d76d
NC
4750 (long) header->e_shnum);
4751 if (filedata->section_headers != NULL && header->e_shnum == SHN_UNDEF)
4752 printf (" (%ld)", (long) filedata->section_headers[0].sh_size);
560f3c1c
AM
4753 putc ('\n', stdout);
4754 printf (_(" Section header string table index: %ld"),
dda8d76d
NC
4755 (long) header->e_shstrndx);
4756 if (filedata->section_headers != NULL
4757 && header->e_shstrndx == (SHN_XINDEX & 0xffff))
4758 printf (" (%u)", filedata->section_headers[0].sh_link);
4759 else if (header->e_shstrndx != SHN_UNDEF
4760 && header->e_shstrndx >= header->e_shnum)
2b692964 4761 printf (_(" <corrupt: out of range>"));
560f3c1c
AM
4762 putc ('\n', stdout);
4763 }
4764
dda8d76d 4765 if (filedata->section_headers != NULL)
560f3c1c 4766 {
dda8d76d
NC
4767 if (header->e_phnum == PN_XNUM
4768 && filedata->section_headers[0].sh_info != 0)
4769 header->e_phnum = filedata->section_headers[0].sh_info;
4770 if (header->e_shnum == SHN_UNDEF)
4771 header->e_shnum = filedata->section_headers[0].sh_size;
4772 if (header->e_shstrndx == (SHN_XINDEX & 0xffff))
4773 header->e_shstrndx = filedata->section_headers[0].sh_link;
9c1ce108 4774 if (header->e_shstrndx >= header->e_shnum)
dda8d76d
NC
4775 header->e_shstrndx = SHN_UNDEF;
4776 free (filedata->section_headers);
4777 filedata->section_headers = NULL;
252b5132 4778 }
103f02d3 4779
32ec8896 4780 return TRUE;
9ea033b2
NC
4781}
4782
dda8d76d
NC
4783/* Read in the program headers from FILEDATA and store them in PHEADERS.
4784 Returns TRUE upon success, FALSE otherwise. Loads 32-bit headers. */
4785
e0a31db1 4786static bfd_boolean
dda8d76d 4787get_32bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
9ea033b2 4788{
2cf0635d
NC
4789 Elf32_External_Phdr * phdrs;
4790 Elf32_External_Phdr * external;
4791 Elf_Internal_Phdr * internal;
b34976b6 4792 unsigned int i;
dda8d76d
NC
4793 unsigned int size = filedata->file_header.e_phentsize;
4794 unsigned int num = filedata->file_header.e_phnum;
e0a31db1
NC
4795
4796 /* PR binutils/17531: Cope with unexpected section header sizes. */
4797 if (size == 0 || num == 0)
4798 return FALSE;
4799 if (size < sizeof * phdrs)
4800 {
4801 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4802 return FALSE;
4803 }
4804 if (size > sizeof * phdrs)
4805 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
103f02d3 4806
dda8d76d 4807 phdrs = (Elf32_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
e0a31db1
NC
4808 size, num, _("program headers"));
4809 if (phdrs == NULL)
4810 return FALSE;
9ea033b2 4811
91d6fa6a 4812 for (i = 0, internal = pheaders, external = phdrs;
dda8d76d 4813 i < filedata->file_header.e_phnum;
b34976b6 4814 i++, internal++, external++)
252b5132 4815 {
9ea033b2
NC
4816 internal->p_type = BYTE_GET (external->p_type);
4817 internal->p_offset = BYTE_GET (external->p_offset);
4818 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4819 internal->p_paddr = BYTE_GET (external->p_paddr);
4820 internal->p_filesz = BYTE_GET (external->p_filesz);
4821 internal->p_memsz = BYTE_GET (external->p_memsz);
4822 internal->p_flags = BYTE_GET (external->p_flags);
4823 internal->p_align = BYTE_GET (external->p_align);
252b5132
RH
4824 }
4825
9ea033b2 4826 free (phdrs);
e0a31db1 4827 return TRUE;
252b5132
RH
4828}
4829
dda8d76d
NC
4830/* Read in the program headers from FILEDATA and store them in PHEADERS.
4831 Returns TRUE upon success, FALSE otherwise. Loads 64-bit headers. */
4832
e0a31db1 4833static bfd_boolean
dda8d76d 4834get_64bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
9ea033b2 4835{
2cf0635d
NC
4836 Elf64_External_Phdr * phdrs;
4837 Elf64_External_Phdr * external;
4838 Elf_Internal_Phdr * internal;
b34976b6 4839 unsigned int i;
dda8d76d
NC
4840 unsigned int size = filedata->file_header.e_phentsize;
4841 unsigned int num = filedata->file_header.e_phnum;
e0a31db1
NC
4842
4843 /* PR binutils/17531: Cope with unexpected section header sizes. */
4844 if (size == 0 || num == 0)
4845 return FALSE;
4846 if (size < sizeof * phdrs)
4847 {
4848 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4849 return FALSE;
4850 }
4851 if (size > sizeof * phdrs)
4852 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
103f02d3 4853
dda8d76d 4854 phdrs = (Elf64_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
e0a31db1 4855 size, num, _("program headers"));
a6e9f9df 4856 if (!phdrs)
e0a31db1 4857 return FALSE;
9ea033b2 4858
91d6fa6a 4859 for (i = 0, internal = pheaders, external = phdrs;
dda8d76d 4860 i < filedata->file_header.e_phnum;
b34976b6 4861 i++, internal++, external++)
9ea033b2
NC
4862 {
4863 internal->p_type = BYTE_GET (external->p_type);
4864 internal->p_flags = BYTE_GET (external->p_flags);
66543521
AM
4865 internal->p_offset = BYTE_GET (external->p_offset);
4866 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4867 internal->p_paddr = BYTE_GET (external->p_paddr);
4868 internal->p_filesz = BYTE_GET (external->p_filesz);
4869 internal->p_memsz = BYTE_GET (external->p_memsz);
4870 internal->p_align = BYTE_GET (external->p_align);
9ea033b2
NC
4871 }
4872
4873 free (phdrs);
e0a31db1 4874 return TRUE;
9ea033b2 4875}
252b5132 4876
32ec8896 4877/* Returns TRUE if the program headers were read into `program_headers'. */
d93f0186 4878
32ec8896 4879static bfd_boolean
dda8d76d 4880get_program_headers (Filedata * filedata)
d93f0186 4881{
2cf0635d 4882 Elf_Internal_Phdr * phdrs;
d93f0186
NC
4883
4884 /* Check cache of prior read. */
dda8d76d 4885 if (filedata->program_headers != NULL)
32ec8896 4886 return TRUE;
d93f0186 4887
82156ab7
NC
4888 /* Be kind to memory checkers by looking for
4889 e_phnum values which we know must be invalid. */
dda8d76d 4890 if (filedata->file_header.e_phnum
82156ab7 4891 * (is_32bit_elf ? sizeof (Elf32_External_Phdr) : sizeof (Elf64_External_Phdr))
dda8d76d 4892 >= filedata->file_size)
82156ab7
NC
4893 {
4894 error (_("Too many program headers - %#x - the file is not that big\n"),
dda8d76d 4895 filedata->file_header.e_phnum);
82156ab7
NC
4896 return FALSE;
4897 }
d93f0186 4898
dda8d76d 4899 phdrs = (Elf_Internal_Phdr *) cmalloc (filedata->file_header.e_phnum,
82156ab7 4900 sizeof (Elf_Internal_Phdr));
d93f0186
NC
4901 if (phdrs == NULL)
4902 {
8b73c356 4903 error (_("Out of memory reading %u program headers\n"),
dda8d76d 4904 filedata->file_header.e_phnum);
32ec8896 4905 return FALSE;
d93f0186
NC
4906 }
4907
4908 if (is_32bit_elf
dda8d76d
NC
4909 ? get_32bit_program_headers (filedata, phdrs)
4910 : get_64bit_program_headers (filedata, phdrs))
d93f0186 4911 {
dda8d76d 4912 filedata->program_headers = phdrs;
32ec8896 4913 return TRUE;
d93f0186
NC
4914 }
4915
4916 free (phdrs);
32ec8896 4917 return FALSE;
d93f0186
NC
4918}
4919
32ec8896 4920/* Returns TRUE if the program headers were loaded. */
2f62977e 4921
32ec8896 4922static bfd_boolean
dda8d76d 4923process_program_headers (Filedata * filedata)
252b5132 4924{
2cf0635d 4925 Elf_Internal_Phdr * segment;
b34976b6 4926 unsigned int i;
1a9ccd70 4927 Elf_Internal_Phdr * previous_load = NULL;
252b5132 4928
dda8d76d 4929 if (filedata->file_header.e_phnum == 0)
252b5132 4930 {
82f2dbf7 4931 /* PR binutils/12467. */
dda8d76d 4932 if (filedata->file_header.e_phoff != 0)
32ec8896
NC
4933 {
4934 warn (_("possibly corrupt ELF header - it has a non-zero program"
4935 " header offset, but no program headers\n"));
4936 return FALSE;
4937 }
82f2dbf7 4938 else if (do_segments)
252b5132 4939 printf (_("\nThere are no program headers in this file.\n"));
32ec8896 4940 return TRUE;
252b5132
RH
4941 }
4942
4943 if (do_segments && !do_header)
4944 {
dda8d76d
NC
4945 printf (_("\nElf file type is %s\n"), get_file_type (filedata->file_header.e_type));
4946 printf (_("Entry point 0x%s\n"), bfd_vmatoa ("x", filedata->file_header.e_entry));
d3a49aa8
AM
4947 printf (ngettext ("There is %d program header, starting at offset %s\n",
4948 "There are %d program headers, starting at offset %s\n",
dda8d76d
NC
4949 filedata->file_header.e_phnum),
4950 filedata->file_header.e_phnum,
4951 bfd_vmatoa ("u", filedata->file_header.e_phoff));
252b5132
RH
4952 }
4953
dda8d76d 4954 if (! get_program_headers (filedata))
6b4bf3bc 4955 return TRUE;
103f02d3 4956
252b5132
RH
4957 if (do_segments)
4958 {
dda8d76d 4959 if (filedata->file_header.e_phnum > 1)
3a1a2036
NC
4960 printf (_("\nProgram Headers:\n"));
4961 else
4962 printf (_("\nProgram Headers:\n"));
76da6bbe 4963
f7a99963
NC
4964 if (is_32bit_elf)
4965 printf
4966 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
d974e256
JJ
4967 else if (do_wide)
4968 printf
4969 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
f7a99963
NC
4970 else
4971 {
4972 printf
4973 (_(" Type Offset VirtAddr PhysAddr\n"));
4974 printf
4975 (_(" FileSiz MemSiz Flags Align\n"));
4976 }
252b5132
RH
4977 }
4978
252b5132 4979 dynamic_addr = 0;
1b228002 4980 dynamic_size = 0;
252b5132 4981
dda8d76d
NC
4982 for (i = 0, segment = filedata->program_headers;
4983 i < filedata->file_header.e_phnum;
b34976b6 4984 i++, segment++)
252b5132
RH
4985 {
4986 if (do_segments)
4987 {
dda8d76d 4988 printf (" %-14.14s ", get_segment_type (filedata, segment->p_type));
f7a99963
NC
4989
4990 if (is_32bit_elf)
4991 {
4992 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4993 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
4994 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
4995 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
4996 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
4997 printf ("%c%c%c ",
4998 (segment->p_flags & PF_R ? 'R' : ' '),
4999 (segment->p_flags & PF_W ? 'W' : ' '),
5000 (segment->p_flags & PF_X ? 'E' : ' '));
5001 printf ("%#lx", (unsigned long) segment->p_align);
5002 }
d974e256
JJ
5003 else if (do_wide)
5004 {
5005 if ((unsigned long) segment->p_offset == segment->p_offset)
5006 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
5007 else
5008 {
5009 print_vma (segment->p_offset, FULL_HEX);
5010 putchar (' ');
5011 }
5012
5013 print_vma (segment->p_vaddr, FULL_HEX);
5014 putchar (' ');
5015 print_vma (segment->p_paddr, FULL_HEX);
5016 putchar (' ');
5017
5018 if ((unsigned long) segment->p_filesz == segment->p_filesz)
5019 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
5020 else
5021 {
5022 print_vma (segment->p_filesz, FULL_HEX);
5023 putchar (' ');
5024 }
5025
5026 if ((unsigned long) segment->p_memsz == segment->p_memsz)
5027 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
5028 else
5029 {
f48e6c45 5030 print_vma (segment->p_memsz, FULL_HEX);
d974e256
JJ
5031 }
5032
5033 printf (" %c%c%c ",
5034 (segment->p_flags & PF_R ? 'R' : ' '),
5035 (segment->p_flags & PF_W ? 'W' : ' '),
5036 (segment->p_flags & PF_X ? 'E' : ' '));
5037
5038 if ((unsigned long) segment->p_align == segment->p_align)
5039 printf ("%#lx", (unsigned long) segment->p_align);
5040 else
5041 {
5042 print_vma (segment->p_align, PREFIX_HEX);
5043 }
5044 }
f7a99963
NC
5045 else
5046 {
5047 print_vma (segment->p_offset, FULL_HEX);
5048 putchar (' ');
5049 print_vma (segment->p_vaddr, FULL_HEX);
5050 putchar (' ');
5051 print_vma (segment->p_paddr, FULL_HEX);
5052 printf ("\n ");
5053 print_vma (segment->p_filesz, FULL_HEX);
5054 putchar (' ');
5055 print_vma (segment->p_memsz, FULL_HEX);
5056 printf (" %c%c%c ",
5057 (segment->p_flags & PF_R ? 'R' : ' '),
5058 (segment->p_flags & PF_W ? 'W' : ' '),
5059 (segment->p_flags & PF_X ? 'E' : ' '));
1d262527 5060 print_vma (segment->p_align, PREFIX_HEX);
f7a99963 5061 }
252b5132 5062
1a9ccd70
NC
5063 putc ('\n', stdout);
5064 }
f54498b4 5065
252b5132
RH
5066 switch (segment->p_type)
5067 {
1a9ccd70 5068 case PT_LOAD:
502d895c
NC
5069#if 0 /* Do not warn about out of order PT_LOAD segments. Although officially
5070 required by the ELF standard, several programs, including the Linux
5071 kernel, make use of non-ordered segments. */
1a9ccd70
NC
5072 if (previous_load
5073 && previous_load->p_vaddr > segment->p_vaddr)
5074 error (_("LOAD segments must be sorted in order of increasing VirtAddr\n"));
502d895c 5075#endif
1a9ccd70
NC
5076 if (segment->p_memsz < segment->p_filesz)
5077 error (_("the segment's file size is larger than its memory size\n"));
5078 previous_load = segment;
5079 break;
5080
5081 case PT_PHDR:
5082 /* PR 20815 - Verify that the program header is loaded into memory. */
5083 if (i > 0 && previous_load != NULL)
5084 error (_("the PHDR segment must occur before any LOAD segment\n"));
dda8d76d 5085 if (filedata->file_header.e_machine != EM_PARISC)
1a9ccd70
NC
5086 {
5087 unsigned int j;
5088
dda8d76d
NC
5089 for (j = 1; j < filedata->file_header.e_phnum; j++)
5090 if (filedata->program_headers[j].p_vaddr <= segment->p_vaddr
5091 && (filedata->program_headers[j].p_vaddr
5092 + filedata->program_headers[j].p_memsz)
1a9ccd70
NC
5093 >= (segment->p_vaddr + segment->p_filesz))
5094 break;
dda8d76d 5095 if (j == filedata->file_header.e_phnum)
1a9ccd70
NC
5096 error (_("the PHDR segment is not covered by a LOAD segment\n"));
5097 }
5098 break;
5099
252b5132
RH
5100 case PT_DYNAMIC:
5101 if (dynamic_addr)
5102 error (_("more than one dynamic segment\n"));
5103
20737c13
AM
5104 /* By default, assume that the .dynamic section is the first
5105 section in the DYNAMIC segment. */
5106 dynamic_addr = segment->p_offset;
5107 dynamic_size = segment->p_filesz;
5108
b2d38a17
NC
5109 /* Try to locate the .dynamic section. If there is
5110 a section header table, we can easily locate it. */
dda8d76d 5111 if (filedata->section_headers != NULL)
b2d38a17 5112 {
2cf0635d 5113 Elf_Internal_Shdr * sec;
b2d38a17 5114
dda8d76d 5115 sec = find_section (filedata, ".dynamic");
89fac5e3 5116 if (sec == NULL || sec->sh_size == 0)
b2d38a17 5117 {
28f997cf
TG
5118 /* A corresponding .dynamic section is expected, but on
5119 IA-64/OpenVMS it is OK for it to be missing. */
dda8d76d 5120 if (!is_ia64_vms (filedata))
28f997cf 5121 error (_("no .dynamic section in the dynamic segment\n"));
b2d38a17
NC
5122 break;
5123 }
5124
42bb2e33 5125 if (sec->sh_type == SHT_NOBITS)
20737c13
AM
5126 {
5127 dynamic_size = 0;
5128 break;
5129 }
42bb2e33 5130
b2d38a17
NC
5131 dynamic_addr = sec->sh_offset;
5132 dynamic_size = sec->sh_size;
5133
5134 if (dynamic_addr < segment->p_offset
5135 || dynamic_addr > segment->p_offset + segment->p_filesz)
20737c13
AM
5136 warn (_("the .dynamic section is not contained"
5137 " within the dynamic segment\n"));
b2d38a17 5138 else if (dynamic_addr > segment->p_offset)
20737c13
AM
5139 warn (_("the .dynamic section is not the first section"
5140 " in the dynamic segment.\n"));
b2d38a17 5141 }
39e224f6
MW
5142
5143 /* PR binutils/17512: Avoid corrupt dynamic section info in the
5144 segment. Check this after matching against the section headers
5145 so we don't warn on debuginfo file (which have NOBITS .dynamic
5146 sections). */
dda8d76d 5147 if (dynamic_addr + dynamic_size >= filedata->file_size)
39e224f6
MW
5148 {
5149 error (_("the dynamic segment offset + size exceeds the size of the file\n"));
5150 dynamic_addr = dynamic_size = 0;
5151 }
252b5132
RH
5152 break;
5153
5154 case PT_INTERP:
dda8d76d 5155 if (fseek (filedata->handle, archive_file_offset + (long) segment->p_offset,
fb52b2f4 5156 SEEK_SET))
252b5132
RH
5157 error (_("Unable to find program interpreter name\n"));
5158 else
5159 {
f8eae8b2 5160 char fmt [32];
9495b2e6 5161 int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
f8eae8b2
L
5162
5163 if (ret >= (int) sizeof (fmt) || ret < 0)
591a748a 5164 error (_("Internal error: failed to create format string to display program interpreter\n"));
f8eae8b2 5165
252b5132 5166 program_interpreter[0] = 0;
dda8d76d 5167 if (fscanf (filedata->handle, fmt, program_interpreter) <= 0)
7bd7b3ef 5168 error (_("Unable to read program interpreter name\n"));
252b5132
RH
5169
5170 if (do_segments)
f54498b4 5171 printf (_(" [Requesting program interpreter: %s]\n"),
252b5132
RH
5172 program_interpreter);
5173 }
5174 break;
5175 }
252b5132
RH
5176 }
5177
dda8d76d
NC
5178 if (do_segments
5179 && filedata->section_headers != NULL
5180 && filedata->string_table != NULL)
252b5132
RH
5181 {
5182 printf (_("\n Section to Segment mapping:\n"));
5183 printf (_(" Segment Sections...\n"));
5184
dda8d76d 5185 for (i = 0; i < filedata->file_header.e_phnum; i++)
252b5132 5186 {
9ad5cbcf 5187 unsigned int j;
2cf0635d 5188 Elf_Internal_Shdr * section;
252b5132 5189
dda8d76d
NC
5190 segment = filedata->program_headers + i;
5191 section = filedata->section_headers + 1;
252b5132
RH
5192
5193 printf (" %2.2d ", i);
5194
dda8d76d 5195 for (j = 1; j < filedata->file_header.e_shnum; j++, section++)
252b5132 5196 {
f4638467
AM
5197 if (!ELF_TBSS_SPECIAL (section, segment)
5198 && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
dda8d76d 5199 printf ("%s ", printable_section_name (filedata, section));
252b5132
RH
5200 }
5201
5202 putc ('\n',stdout);
5203 }
5204 }
5205
32ec8896 5206 return TRUE;
252b5132
RH
5207}
5208
5209
d93f0186
NC
5210/* Find the file offset corresponding to VMA by using the program headers. */
5211
5212static long
dda8d76d 5213offset_from_vma (Filedata * filedata, bfd_vma vma, bfd_size_type size)
d93f0186 5214{
2cf0635d 5215 Elf_Internal_Phdr * seg;
d93f0186 5216
dda8d76d 5217 if (! get_program_headers (filedata))
d93f0186
NC
5218 {
5219 warn (_("Cannot interpret virtual addresses without program headers.\n"));
5220 return (long) vma;
5221 }
5222
dda8d76d
NC
5223 for (seg = filedata->program_headers;
5224 seg < filedata->program_headers + filedata->file_header.e_phnum;
d93f0186
NC
5225 ++seg)
5226 {
5227 if (seg->p_type != PT_LOAD)
5228 continue;
5229
5230 if (vma >= (seg->p_vaddr & -seg->p_align)
5231 && vma + size <= seg->p_vaddr + seg->p_filesz)
5232 return vma - seg->p_vaddr + seg->p_offset;
5233 }
5234
5235 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
0af1713e 5236 (unsigned long) vma);
d93f0186
NC
5237 return (long) vma;
5238}
5239
5240
dda8d76d
NC
5241/* Allocate memory and load the sections headers into FILEDATA->filedata->section_headers.
5242 If PROBE is true, this is just a probe and we do not generate any error
5243 messages if the load fails. */
049b0c3a
NC
5244
5245static bfd_boolean
dda8d76d 5246get_32bit_section_headers (Filedata * filedata, bfd_boolean probe)
252b5132 5247{
2cf0635d
NC
5248 Elf32_External_Shdr * shdrs;
5249 Elf_Internal_Shdr * internal;
dda8d76d
NC
5250 unsigned int i;
5251 unsigned int size = filedata->file_header.e_shentsize;
5252 unsigned int num = probe ? 1 : filedata->file_header.e_shnum;
049b0c3a
NC
5253
5254 /* PR binutils/17531: Cope with unexpected section header sizes. */
5255 if (size == 0 || num == 0)
5256 return FALSE;
5257 if (size < sizeof * shdrs)
5258 {
5259 if (! probe)
5260 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5261 return FALSE;
5262 }
5263 if (!probe && size > sizeof * shdrs)
5264 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
252b5132 5265
dda8d76d 5266 shdrs = (Elf32_External_Shdr *) get_data (NULL, filedata, filedata->file_header.e_shoff,
049b0c3a
NC
5267 size, num,
5268 probe ? NULL : _("section headers"));
5269 if (shdrs == NULL)
5270 return FALSE;
252b5132 5271
dda8d76d
NC
5272 free (filedata->section_headers);
5273 filedata->section_headers = (Elf_Internal_Shdr *)
5274 cmalloc (num, sizeof (Elf_Internal_Shdr));
5275 if (filedata->section_headers == NULL)
252b5132 5276 {
049b0c3a 5277 if (!probe)
8b73c356 5278 error (_("Out of memory reading %u section headers\n"), num);
049b0c3a 5279 return FALSE;
252b5132
RH
5280 }
5281
dda8d76d 5282 for (i = 0, internal = filedata->section_headers;
560f3c1c 5283 i < num;
b34976b6 5284 i++, internal++)
252b5132
RH
5285 {
5286 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5287 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
5288 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5289 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5290 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5291 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5292 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5293 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5294 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5295 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
315350be
NC
5296 if (!probe && internal->sh_link > num)
5297 warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5298 if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5299 warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
252b5132
RH
5300 }
5301
5302 free (shdrs);
049b0c3a 5303 return TRUE;
252b5132
RH
5304}
5305
dda8d76d
NC
5306/* Like get_32bit_section_headers, except that it fetches 64-bit headers. */
5307
049b0c3a 5308static bfd_boolean
dda8d76d 5309get_64bit_section_headers (Filedata * filedata, bfd_boolean probe)
9ea033b2 5310{
dda8d76d
NC
5311 Elf64_External_Shdr * shdrs;
5312 Elf_Internal_Shdr * internal;
5313 unsigned int i;
5314 unsigned int size = filedata->file_header.e_shentsize;
5315 unsigned int num = probe ? 1 : filedata->file_header.e_shnum;
049b0c3a
NC
5316
5317 /* PR binutils/17531: Cope with unexpected section header sizes. */
5318 if (size == 0 || num == 0)
5319 return FALSE;
dda8d76d 5320
049b0c3a
NC
5321 if (size < sizeof * shdrs)
5322 {
5323 if (! probe)
5324 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5325 return FALSE;
5326 }
dda8d76d 5327
049b0c3a
NC
5328 if (! probe && size > sizeof * shdrs)
5329 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
9ea033b2 5330
dda8d76d
NC
5331 shdrs = (Elf64_External_Shdr *) get_data (NULL, filedata,
5332 filedata->file_header.e_shoff,
049b0c3a
NC
5333 size, num,
5334 probe ? NULL : _("section headers"));
5335 if (shdrs == NULL)
5336 return FALSE;
9ea033b2 5337
dda8d76d
NC
5338 free (filedata->section_headers);
5339 filedata->section_headers = (Elf_Internal_Shdr *)
5340 cmalloc (num, sizeof (Elf_Internal_Shdr));
5341 if (filedata->section_headers == NULL)
9ea033b2 5342 {
049b0c3a 5343 if (! probe)
8b73c356 5344 error (_("Out of memory reading %u section headers\n"), num);
049b0c3a 5345 return FALSE;
9ea033b2
NC
5346 }
5347
dda8d76d 5348 for (i = 0, internal = filedata->section_headers;
560f3c1c 5349 i < num;
b34976b6 5350 i++, internal++)
9ea033b2
NC
5351 {
5352 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5353 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
66543521
AM
5354 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5355 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5356 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5357 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
9ea033b2
NC
5358 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5359 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5360 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5361 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
315350be
NC
5362 if (!probe && internal->sh_link > num)
5363 warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5364 if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5365 warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
9ea033b2
NC
5366 }
5367
5368 free (shdrs);
049b0c3a 5369 return TRUE;
9ea033b2
NC
5370}
5371
252b5132 5372static Elf_Internal_Sym *
dda8d76d
NC
5373get_32bit_elf_symbols (Filedata * filedata,
5374 Elf_Internal_Shdr * section,
5375 unsigned long * num_syms_return)
252b5132 5376{
ba5cdace 5377 unsigned long number = 0;
dd24e3da 5378 Elf32_External_Sym * esyms = NULL;
ba5cdace 5379 Elf_External_Sym_Shndx * shndx = NULL;
dd24e3da 5380 Elf_Internal_Sym * isyms = NULL;
2cf0635d 5381 Elf_Internal_Sym * psym;
b34976b6 5382 unsigned int j;
252b5132 5383
c9c1d674
EG
5384 if (section->sh_size == 0)
5385 {
5386 if (num_syms_return != NULL)
5387 * num_syms_return = 0;
5388 return NULL;
5389 }
5390
dd24e3da 5391 /* Run some sanity checks first. */
c9c1d674 5392 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
dd24e3da 5393 {
c9c1d674 5394 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
dda8d76d
NC
5395 printable_section_name (filedata, section),
5396 (unsigned long) section->sh_entsize);
ba5cdace 5397 goto exit_point;
dd24e3da
NC
5398 }
5399
dda8d76d 5400 if (section->sh_size > filedata->file_size)
f54498b4
NC
5401 {
5402 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
dda8d76d
NC
5403 printable_section_name (filedata, section),
5404 (unsigned long) section->sh_size);
f54498b4
NC
5405 goto exit_point;
5406 }
5407
dd24e3da
NC
5408 number = section->sh_size / section->sh_entsize;
5409
5410 if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
5411 {
c9c1d674 5412 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
8066deb1 5413 (unsigned long) section->sh_size,
dda8d76d 5414 printable_section_name (filedata, section),
8066deb1 5415 (unsigned long) section->sh_entsize);
ba5cdace 5416 goto exit_point;
dd24e3da
NC
5417 }
5418
dda8d76d 5419 esyms = (Elf32_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
3f5e193b 5420 section->sh_size, _("symbols"));
dd24e3da 5421 if (esyms == NULL)
ba5cdace 5422 goto exit_point;
252b5132 5423
6a40cf0c
NC
5424 {
5425 elf_section_list * entry;
5426
5427 shndx = NULL;
5428 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
dda8d76d 5429 if (entry->hdr->sh_link == (unsigned long) (section - filedata->section_headers))
c9c1d674 5430 {
dda8d76d 5431 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
6a40cf0c
NC
5432 entry->hdr->sh_offset,
5433 1, entry->hdr->sh_size,
5434 _("symbol table section indicies"));
5435 if (shndx == NULL)
5436 goto exit_point;
5437 /* PR17531: file: heap-buffer-overflow */
5438 else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5439 {
5440 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
dda8d76d 5441 printable_section_name (filedata, entry->hdr),
6a40cf0c
NC
5442 (unsigned long) entry->hdr->sh_size,
5443 (unsigned long) section->sh_size);
5444 goto exit_point;
5445 }
c9c1d674 5446 }
6a40cf0c 5447 }
9ad5cbcf 5448
3f5e193b 5449 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
252b5132
RH
5450
5451 if (isyms == NULL)
5452 {
8b73c356
NC
5453 error (_("Out of memory reading %lu symbols\n"),
5454 (unsigned long) number);
dd24e3da 5455 goto exit_point;
252b5132
RH
5456 }
5457
dd24e3da 5458 for (j = 0, psym = isyms; j < number; j++, psym++)
252b5132
RH
5459 {
5460 psym->st_name = BYTE_GET (esyms[j].st_name);
5461 psym->st_value = BYTE_GET (esyms[j].st_value);
5462 psym->st_size = BYTE_GET (esyms[j].st_size);
5463 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4fbb74a6 5464 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
9ad5cbcf
AM
5465 psym->st_shndx
5466 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4fbb74a6
AM
5467 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5468 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
252b5132
RH
5469 psym->st_info = BYTE_GET (esyms[j].st_info);
5470 psym->st_other = BYTE_GET (esyms[j].st_other);
5471 }
5472
dd24e3da 5473 exit_point:
ba5cdace 5474 if (shndx != NULL)
9ad5cbcf 5475 free (shndx);
ba5cdace 5476 if (esyms != NULL)
dd24e3da 5477 free (esyms);
252b5132 5478
ba5cdace
NC
5479 if (num_syms_return != NULL)
5480 * num_syms_return = isyms == NULL ? 0 : number;
5481
252b5132
RH
5482 return isyms;
5483}
5484
9ea033b2 5485static Elf_Internal_Sym *
dda8d76d
NC
5486get_64bit_elf_symbols (Filedata * filedata,
5487 Elf_Internal_Shdr * section,
5488 unsigned long * num_syms_return)
9ea033b2 5489{
ba5cdace
NC
5490 unsigned long number = 0;
5491 Elf64_External_Sym * esyms = NULL;
5492 Elf_External_Sym_Shndx * shndx = NULL;
5493 Elf_Internal_Sym * isyms = NULL;
2cf0635d 5494 Elf_Internal_Sym * psym;
b34976b6 5495 unsigned int j;
9ea033b2 5496
c9c1d674
EG
5497 if (section->sh_size == 0)
5498 {
5499 if (num_syms_return != NULL)
5500 * num_syms_return = 0;
5501 return NULL;
5502 }
5503
dd24e3da 5504 /* Run some sanity checks first. */
c9c1d674 5505 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
dd24e3da 5506 {
c9c1d674 5507 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
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 if (section->sh_size > filedata->file_size)
f54498b4
NC
5514 {
5515 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
dda8d76d 5516 printable_section_name (filedata, section),
8066deb1 5517 (unsigned long) section->sh_size);
f54498b4
NC
5518 goto exit_point;
5519 }
5520
dd24e3da
NC
5521 number = section->sh_size / section->sh_entsize;
5522
5523 if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5524 {
c9c1d674 5525 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
8066deb1 5526 (unsigned long) section->sh_size,
dda8d76d 5527 printable_section_name (filedata, section),
8066deb1 5528 (unsigned long) section->sh_entsize);
ba5cdace 5529 goto exit_point;
dd24e3da
NC
5530 }
5531
dda8d76d 5532 esyms = (Elf64_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
3f5e193b 5533 section->sh_size, _("symbols"));
a6e9f9df 5534 if (!esyms)
ba5cdace 5535 goto exit_point;
9ea033b2 5536
6a40cf0c
NC
5537 {
5538 elf_section_list * entry;
5539
5540 shndx = NULL;
5541 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
dda8d76d 5542 if (entry->hdr->sh_link == (unsigned long) (section - filedata->section_headers))
c9c1d674 5543 {
dda8d76d 5544 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
6a40cf0c
NC
5545 entry->hdr->sh_offset,
5546 1, entry->hdr->sh_size,
5547 _("symbol table section indicies"));
5548 if (shndx == NULL)
5549 goto exit_point;
5550 /* PR17531: file: heap-buffer-overflow */
5551 else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5552 {
5553 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
dda8d76d 5554 printable_section_name (filedata, entry->hdr),
6a40cf0c
NC
5555 (unsigned long) entry->hdr->sh_size,
5556 (unsigned long) section->sh_size);
5557 goto exit_point;
5558 }
c9c1d674 5559 }
6a40cf0c 5560 }
9ad5cbcf 5561
3f5e193b 5562 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
9ea033b2
NC
5563
5564 if (isyms == NULL)
5565 {
8b73c356
NC
5566 error (_("Out of memory reading %lu symbols\n"),
5567 (unsigned long) number);
ba5cdace 5568 goto exit_point;
9ea033b2
NC
5569 }
5570
ba5cdace 5571 for (j = 0, psym = isyms; j < number; j++, psym++)
9ea033b2
NC
5572 {
5573 psym->st_name = BYTE_GET (esyms[j].st_name);
5574 psym->st_info = BYTE_GET (esyms[j].st_info);
5575 psym->st_other = BYTE_GET (esyms[j].st_other);
5576 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
ba5cdace 5577
4fbb74a6 5578 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
9ad5cbcf
AM
5579 psym->st_shndx
5580 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4fbb74a6
AM
5581 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5582 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
ba5cdace 5583
66543521
AM
5584 psym->st_value = BYTE_GET (esyms[j].st_value);
5585 psym->st_size = BYTE_GET (esyms[j].st_size);
9ea033b2
NC
5586 }
5587
ba5cdace
NC
5588 exit_point:
5589 if (shndx != NULL)
9ad5cbcf 5590 free (shndx);
ba5cdace
NC
5591 if (esyms != NULL)
5592 free (esyms);
5593
5594 if (num_syms_return != NULL)
5595 * num_syms_return = isyms == NULL ? 0 : number;
9ea033b2
NC
5596
5597 return isyms;
5598}
5599
d1133906 5600static const char *
dda8d76d 5601get_elf_section_flags (Filedata * filedata, bfd_vma sh_flags)
d1133906 5602{
5477e8a0 5603 static char buff[1024];
2cf0635d 5604 char * p = buff;
32ec8896
NC
5605 unsigned int field_size = is_32bit_elf ? 8 : 16;
5606 signed int sindex;
5607 unsigned int size = sizeof (buff) - (field_size + 4 + 1);
8d5ff12c
L
5608 bfd_vma os_flags = 0;
5609 bfd_vma proc_flags = 0;
5610 bfd_vma unknown_flags = 0;
148b93f2 5611 static const struct
5477e8a0 5612 {
2cf0635d 5613 const char * str;
32ec8896 5614 unsigned int len;
5477e8a0
L
5615 }
5616 flags [] =
5617 {
cfcac11d
NC
5618 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
5619 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
5620 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
5621 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
5622 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
5623 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
5624 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5625 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5626 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
5627 /* 9 */ { STRING_COMMA_LEN ("TLS") },
5628 /* IA-64 specific. */
5629 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5630 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5631 /* IA-64 OpenVMS specific. */
5632 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5633 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5634 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5635 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5636 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5637 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
18ae9cc1 5638 /* Generic. */
cfcac11d 5639 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
18ae9cc1 5640 /* SPARC specific. */
77115a4a 5641 /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
ac4c9b04
MG
5642 /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5643 /* ARM specific. */
5644 /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
f0728ee3 5645 /* 22 */ { STRING_COMMA_LEN ("ARM_PURECODE") },
a91e1603
L
5646 /* 23 */ { STRING_COMMA_LEN ("COMDEF") },
5647 /* GNU specific. */
5648 /* 24 */ { STRING_COMMA_LEN ("GNU_MBIND") },
83eef883
AFB
5649 /* VLE specific. */
5650 /* 25 */ { STRING_COMMA_LEN ("VLE") },
5477e8a0
L
5651 };
5652
5653 if (do_section_details)
5654 {
8d5ff12c
L
5655 sprintf (buff, "[%*.*lx]: ",
5656 field_size, field_size, (unsigned long) sh_flags);
5657 p += field_size + 4;
5477e8a0 5658 }
76da6bbe 5659
d1133906
NC
5660 while (sh_flags)
5661 {
5662 bfd_vma flag;
5663
5664 flag = sh_flags & - sh_flags;
5665 sh_flags &= ~ flag;
76da6bbe 5666
5477e8a0 5667 if (do_section_details)
d1133906 5668 {
5477e8a0
L
5669 switch (flag)
5670 {
91d6fa6a
NC
5671 case SHF_WRITE: sindex = 0; break;
5672 case SHF_ALLOC: sindex = 1; break;
5673 case SHF_EXECINSTR: sindex = 2; break;
5674 case SHF_MERGE: sindex = 3; break;
5675 case SHF_STRINGS: sindex = 4; break;
5676 case SHF_INFO_LINK: sindex = 5; break;
5677 case SHF_LINK_ORDER: sindex = 6; break;
5678 case SHF_OS_NONCONFORMING: sindex = 7; break;
5679 case SHF_GROUP: sindex = 8; break;
5680 case SHF_TLS: sindex = 9; break;
18ae9cc1 5681 case SHF_EXCLUDE: sindex = 18; break;
77115a4a 5682 case SHF_COMPRESSED: sindex = 20; break;
a91e1603 5683 case SHF_GNU_MBIND: sindex = 24; break;
76da6bbe 5684
5477e8a0 5685 default:
91d6fa6a 5686 sindex = -1;
dda8d76d 5687 switch (filedata->file_header.e_machine)
148b93f2 5688 {
cfcac11d 5689 case EM_IA_64:
148b93f2 5690 if (flag == SHF_IA_64_SHORT)
91d6fa6a 5691 sindex = 10;
148b93f2 5692 else if (flag == SHF_IA_64_NORECOV)
91d6fa6a 5693 sindex = 11;
148b93f2 5694#ifdef BFD64
dda8d76d 5695 else if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
148b93f2
NC
5696 switch (flag)
5697 {
91d6fa6a
NC
5698 case SHF_IA_64_VMS_GLOBAL: sindex = 12; break;
5699 case SHF_IA_64_VMS_OVERLAID: sindex = 13; break;
5700 case SHF_IA_64_VMS_SHARED: sindex = 14; break;
5701 case SHF_IA_64_VMS_VECTOR: sindex = 15; break;
5702 case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5703 case SHF_IA_64_VMS_PROTECTED: sindex = 17; break;
148b93f2
NC
5704 default: break;
5705 }
5706#endif
cfcac11d
NC
5707 break;
5708
caa83f8b 5709 case EM_386:
22abe556 5710 case EM_IAMCU:
caa83f8b 5711 case EM_X86_64:
7f502d6c 5712 case EM_L1OM:
7a9068fe 5713 case EM_K1OM:
cfcac11d
NC
5714 case EM_OLD_SPARCV9:
5715 case EM_SPARC32PLUS:
5716 case EM_SPARCV9:
5717 case EM_SPARC:
18ae9cc1 5718 if (flag == SHF_ORDERED)
91d6fa6a 5719 sindex = 19;
cfcac11d 5720 break;
ac4c9b04
MG
5721
5722 case EM_ARM:
5723 switch (flag)
5724 {
5725 case SHF_ENTRYSECT: sindex = 21; break;
f0728ee3 5726 case SHF_ARM_PURECODE: sindex = 22; break;
ac4c9b04
MG
5727 case SHF_COMDEF: sindex = 23; break;
5728 default: break;
5729 }
5730 break;
83eef883
AFB
5731 case EM_PPC:
5732 if (flag == SHF_PPC_VLE)
5733 sindex = 25;
5734 break;
ac4c9b04 5735
cfcac11d
NC
5736 default:
5737 break;
148b93f2 5738 }
5477e8a0
L
5739 }
5740
91d6fa6a 5741 if (sindex != -1)
5477e8a0 5742 {
8d5ff12c
L
5743 if (p != buff + field_size + 4)
5744 {
5745 if (size < (10 + 2))
bee0ee85
NC
5746 {
5747 warn (_("Internal error: not enough buffer room for section flag info"));
5748 return _("<unknown>");
5749 }
8d5ff12c
L
5750 size -= 2;
5751 *p++ = ',';
5752 *p++ = ' ';
5753 }
5754
91d6fa6a
NC
5755 size -= flags [sindex].len;
5756 p = stpcpy (p, flags [sindex].str);
5477e8a0 5757 }
3b22753a 5758 else if (flag & SHF_MASKOS)
8d5ff12c 5759 os_flags |= flag;
d1133906 5760 else if (flag & SHF_MASKPROC)
8d5ff12c 5761 proc_flags |= flag;
d1133906 5762 else
8d5ff12c 5763 unknown_flags |= flag;
5477e8a0
L
5764 }
5765 else
5766 {
5767 switch (flag)
5768 {
5769 case SHF_WRITE: *p = 'W'; break;
5770 case SHF_ALLOC: *p = 'A'; break;
5771 case SHF_EXECINSTR: *p = 'X'; break;
5772 case SHF_MERGE: *p = 'M'; break;
5773 case SHF_STRINGS: *p = 'S'; break;
5774 case SHF_INFO_LINK: *p = 'I'; break;
5775 case SHF_LINK_ORDER: *p = 'L'; break;
5776 case SHF_OS_NONCONFORMING: *p = 'O'; break;
5777 case SHF_GROUP: *p = 'G'; break;
5778 case SHF_TLS: *p = 'T'; break;
18ae9cc1 5779 case SHF_EXCLUDE: *p = 'E'; break;
77115a4a 5780 case SHF_COMPRESSED: *p = 'C'; break;
a91e1603 5781 case SHF_GNU_MBIND: *p = 'D'; break;
5477e8a0
L
5782
5783 default:
dda8d76d
NC
5784 if ((filedata->file_header.e_machine == EM_X86_64
5785 || filedata->file_header.e_machine == EM_L1OM
5786 || filedata->file_header.e_machine == EM_K1OM)
5477e8a0
L
5787 && flag == SHF_X86_64_LARGE)
5788 *p = 'l';
dda8d76d 5789 else if (filedata->file_header.e_machine == EM_ARM
f0728ee3 5790 && flag == SHF_ARM_PURECODE)
91f68a68 5791 *p = 'y';
dda8d76d 5792 else if (filedata->file_header.e_machine == EM_PPC
83eef883
AFB
5793 && flag == SHF_PPC_VLE)
5794 *p = 'v';
5477e8a0
L
5795 else if (flag & SHF_MASKOS)
5796 {
5797 *p = 'o';
5798 sh_flags &= ~ SHF_MASKOS;
5799 }
5800 else if (flag & SHF_MASKPROC)
5801 {
5802 *p = 'p';
5803 sh_flags &= ~ SHF_MASKPROC;
5804 }
5805 else
5806 *p = 'x';
5807 break;
5808 }
5809 p++;
d1133906
NC
5810 }
5811 }
76da6bbe 5812
8d5ff12c
L
5813 if (do_section_details)
5814 {
5815 if (os_flags)
5816 {
5817 size -= 5 + field_size;
5818 if (p != buff + field_size + 4)
5819 {
5820 if (size < (2 + 1))
bee0ee85
NC
5821 {
5822 warn (_("Internal error: not enough buffer room for section flag info"));
5823 return _("<unknown>");
5824 }
8d5ff12c
L
5825 size -= 2;
5826 *p++ = ',';
5827 *p++ = ' ';
5828 }
5829 sprintf (p, "OS (%*.*lx)", field_size, field_size,
5830 (unsigned long) os_flags);
5831 p += 5 + field_size;
5832 }
5833 if (proc_flags)
5834 {
5835 size -= 7 + field_size;
5836 if (p != buff + field_size + 4)
5837 {
5838 if (size < (2 + 1))
bee0ee85
NC
5839 {
5840 warn (_("Internal error: not enough buffer room for section flag info"));
5841 return _("<unknown>");
5842 }
8d5ff12c
L
5843 size -= 2;
5844 *p++ = ',';
5845 *p++ = ' ';
5846 }
5847 sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5848 (unsigned long) proc_flags);
5849 p += 7 + field_size;
5850 }
5851 if (unknown_flags)
5852 {
5853 size -= 10 + field_size;
5854 if (p != buff + field_size + 4)
5855 {
5856 if (size < (2 + 1))
bee0ee85
NC
5857 {
5858 warn (_("Internal error: not enough buffer room for section flag info"));
5859 return _("<unknown>");
5860 }
8d5ff12c
L
5861 size -= 2;
5862 *p++ = ',';
5863 *p++ = ' ';
5864 }
2b692964 5865 sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
8d5ff12c
L
5866 (unsigned long) unknown_flags);
5867 p += 10 + field_size;
5868 }
5869 }
5870
e9e44622 5871 *p = '\0';
d1133906
NC
5872 return buff;
5873}
5874
77115a4a 5875static unsigned int
ebdf1ebf 5876get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf, bfd_size_type size)
77115a4a
L
5877{
5878 if (is_32bit_elf)
5879 {
5880 Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
d8024a91 5881
ebdf1ebf
NC
5882 if (size < sizeof (* echdr))
5883 {
5884 error (_("Compressed section is too small even for a compression header\n"));
5885 return 0;
5886 }
5887
77115a4a
L
5888 chdr->ch_type = BYTE_GET (echdr->ch_type);
5889 chdr->ch_size = BYTE_GET (echdr->ch_size);
5890 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5891 return sizeof (*echdr);
5892 }
5893 else
5894 {
5895 Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) buf;
d8024a91 5896
ebdf1ebf
NC
5897 if (size < sizeof (* echdr))
5898 {
5899 error (_("Compressed section is too small even for a compression header\n"));
5900 return 0;
5901 }
5902
77115a4a
L
5903 chdr->ch_type = BYTE_GET (echdr->ch_type);
5904 chdr->ch_size = BYTE_GET (echdr->ch_size);
5905 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5906 return sizeof (*echdr);
5907 }
5908}
5909
32ec8896 5910static bfd_boolean
dda8d76d 5911process_section_headers (Filedata * filedata)
252b5132 5912{
2cf0635d 5913 Elf_Internal_Shdr * section;
b34976b6 5914 unsigned int i;
252b5132 5915
dda8d76d 5916 filedata->section_headers = NULL;
252b5132 5917
dda8d76d 5918 if (filedata->file_header.e_shnum == 0)
252b5132 5919 {
82f2dbf7 5920 /* PR binutils/12467. */
dda8d76d 5921 if (filedata->file_header.e_shoff != 0)
32ec8896
NC
5922 {
5923 warn (_("possibly corrupt ELF file header - it has a non-zero"
5924 " section header offset, but no section headers\n"));
5925 return FALSE;
5926 }
82f2dbf7 5927 else if (do_sections)
252b5132
RH
5928 printf (_("\nThere are no sections in this file.\n"));
5929
32ec8896 5930 return TRUE;
252b5132
RH
5931 }
5932
5933 if (do_sections && !do_header)
d3a49aa8
AM
5934 printf (ngettext ("There is %d section header, "
5935 "starting at offset 0x%lx:\n",
5936 "There are %d section headers, "
5937 "starting at offset 0x%lx:\n",
dda8d76d
NC
5938 filedata->file_header.e_shnum),
5939 filedata->file_header.e_shnum,
5940 (unsigned long) filedata->file_header.e_shoff);
252b5132 5941
9ea033b2
NC
5942 if (is_32bit_elf)
5943 {
dda8d76d 5944 if (! get_32bit_section_headers (filedata, FALSE))
32ec8896
NC
5945 return FALSE;
5946 }
5947 else
5948 {
dda8d76d 5949 if (! get_64bit_section_headers (filedata, FALSE))
32ec8896 5950 return FALSE;
9ea033b2 5951 }
252b5132
RH
5952
5953 /* Read in the string table, so that we have names to display. */
dda8d76d
NC
5954 if (filedata->file_header.e_shstrndx != SHN_UNDEF
5955 && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
252b5132 5956 {
dda8d76d 5957 section = filedata->section_headers + filedata->file_header.e_shstrndx;
d40ac9bd 5958
c256ffe7
JJ
5959 if (section->sh_size != 0)
5960 {
dda8d76d
NC
5961 filedata->string_table = (char *) get_data (NULL, filedata, section->sh_offset,
5962 1, section->sh_size,
5963 _("string table"));
0de14b54 5964
dda8d76d 5965 filedata->string_table_length = filedata->string_table != NULL ? section->sh_size : 0;
c256ffe7 5966 }
252b5132
RH
5967 }
5968
5969 /* Scan the sections for the dynamic symbol table
e3c8793a 5970 and dynamic string table and debug sections. */
252b5132
RH
5971 dynamic_symbols = NULL;
5972 dynamic_strings = NULL;
5973 dynamic_syminfo = NULL;
6a40cf0c 5974 symtab_shndx_list = NULL;
103f02d3 5975
89fac5e3 5976 eh_addr_size = is_32bit_elf ? 4 : 8;
dda8d76d 5977 switch (filedata->file_header.e_machine)
89fac5e3
RS
5978 {
5979 case EM_MIPS:
5980 case EM_MIPS_RS3_LE:
5981 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
5982 FDE addresses. However, the ABI also has a semi-official ILP32
5983 variant for which the normal FDE address size rules apply.
5984
5985 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
5986 section, where XX is the size of longs in bits. Unfortunately,
5987 earlier compilers provided no way of distinguishing ILP32 objects
5988 from LP64 objects, so if there's any doubt, we should assume that
5989 the official LP64 form is being used. */
dda8d76d
NC
5990 if ((filedata->file_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
5991 && find_section (filedata, ".gcc_compiled_long32") == NULL)
89fac5e3
RS
5992 eh_addr_size = 8;
5993 break;
0f56a26a
DD
5994
5995 case EM_H8_300:
5996 case EM_H8_300H:
dda8d76d 5997 switch (filedata->file_header.e_flags & EF_H8_MACH)
0f56a26a
DD
5998 {
5999 case E_H8_MACH_H8300:
6000 case E_H8_MACH_H8300HN:
6001 case E_H8_MACH_H8300SN:
6002 case E_H8_MACH_H8300SXN:
6003 eh_addr_size = 2;
6004 break;
6005 case E_H8_MACH_H8300H:
6006 case E_H8_MACH_H8300S:
6007 case E_H8_MACH_H8300SX:
6008 eh_addr_size = 4;
6009 break;
6010 }
f4236fe4
DD
6011 break;
6012
ff7eeb89 6013 case EM_M32C_OLD:
f4236fe4 6014 case EM_M32C:
dda8d76d 6015 switch (filedata->file_header.e_flags & EF_M32C_CPU_MASK)
f4236fe4
DD
6016 {
6017 case EF_M32C_CPU_M16C:
6018 eh_addr_size = 2;
6019 break;
6020 }
6021 break;
89fac5e3
RS
6022 }
6023
76ca31c0
NC
6024#define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
6025 do \
6026 { \
6027 bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64; \
6028 if (section->sh_entsize != expected_entsize) \
9dd3a467 6029 { \
76ca31c0
NC
6030 char buf[40]; \
6031 sprintf_vma (buf, section->sh_entsize); \
6032 /* Note: coded this way so that there is a single string for \
6033 translation. */ \
6034 error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
6035 error (_("(Using the expected size of %u for the rest of this dump)\n"), \
6036 (unsigned) expected_entsize); \
9dd3a467 6037 section->sh_entsize = expected_entsize; \
76ca31c0
NC
6038 } \
6039 } \
08d8fa11 6040 while (0)
9dd3a467
NC
6041
6042#define CHECK_ENTSIZE(section, i, type) \
08d8fa11
JJ
6043 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
6044 sizeof (Elf64_External_##type))
6045
dda8d76d
NC
6046 for (i = 0, section = filedata->section_headers;
6047 i < filedata->file_header.e_shnum;
b34976b6 6048 i++, section++)
252b5132 6049 {
2cf0635d 6050 char * name = SECTION_NAME (section);
252b5132
RH
6051
6052 if (section->sh_type == SHT_DYNSYM)
6053 {
6054 if (dynamic_symbols != NULL)
6055 {
6056 error (_("File contains multiple dynamic symbol tables\n"));
6057 continue;
6058 }
6059
08d8fa11 6060 CHECK_ENTSIZE (section, i, Sym);
dda8d76d 6061 dynamic_symbols = GET_ELF_SYMBOLS (filedata, section, & num_dynamic_syms);
252b5132
RH
6062 }
6063 else if (section->sh_type == SHT_STRTAB
18bd398b 6064 && streq (name, ".dynstr"))
252b5132
RH
6065 {
6066 if (dynamic_strings != NULL)
6067 {
6068 error (_("File contains multiple dynamic string tables\n"));
6069 continue;
6070 }
6071
dda8d76d 6072 dynamic_strings = (char *) get_data (NULL, filedata, section->sh_offset,
3f5e193b
NC
6073 1, section->sh_size,
6074 _("dynamic strings"));
59245841 6075 dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
252b5132 6076 }
9ad5cbcf
AM
6077 else if (section->sh_type == SHT_SYMTAB_SHNDX)
6078 {
6a40cf0c 6079 elf_section_list * entry = xmalloc (sizeof * entry);
dda8d76d 6080
6a40cf0c
NC
6081 entry->hdr = section;
6082 entry->next = symtab_shndx_list;
6083 symtab_shndx_list = entry;
9ad5cbcf 6084 }
08d8fa11
JJ
6085 else if (section->sh_type == SHT_SYMTAB)
6086 CHECK_ENTSIZE (section, i, Sym);
6087 else if (section->sh_type == SHT_GROUP)
6088 CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
6089 else if (section->sh_type == SHT_REL)
6090 CHECK_ENTSIZE (section, i, Rel);
6091 else if (section->sh_type == SHT_RELA)
6092 CHECK_ENTSIZE (section, i, Rela);
252b5132 6093 else if ((do_debugging || do_debug_info || do_debug_abbrevs
f9f0e732 6094 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
cb8f3167 6095 || do_debug_aranges || do_debug_frames || do_debug_macinfo
657d0d47 6096 || do_debug_str || do_debug_loc || do_debug_ranges
d85bf2ba 6097 || do_debug_addr || do_debug_cu_index || do_debug_links)
1b315056
CS
6098 && (const_strneq (name, ".debug_")
6099 || const_strneq (name, ".zdebug_")))
252b5132 6100 {
1b315056
CS
6101 if (name[1] == 'z')
6102 name += sizeof (".zdebug_") - 1;
6103 else
6104 name += sizeof (".debug_") - 1;
252b5132
RH
6105
6106 if (do_debugging
4723351a
CC
6107 || (do_debug_info && const_strneq (name, "info"))
6108 || (do_debug_info && const_strneq (name, "types"))
6109 || (do_debug_abbrevs && const_strneq (name, "abbrev"))
b40bf0a2
NC
6110 || (do_debug_lines && strcmp (name, "line") == 0)
6111 || (do_debug_lines && const_strneq (name, "line."))
4723351a
CC
6112 || (do_debug_pubnames && const_strneq (name, "pubnames"))
6113 || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
459d52c8
DE
6114 || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
6115 || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
4723351a
CC
6116 || (do_debug_aranges && const_strneq (name, "aranges"))
6117 || (do_debug_ranges && const_strneq (name, "ranges"))
77145576 6118 || (do_debug_ranges && const_strneq (name, "rnglists"))
4723351a
CC
6119 || (do_debug_frames && const_strneq (name, "frame"))
6120 || (do_debug_macinfo && const_strneq (name, "macinfo"))
6121 || (do_debug_macinfo && const_strneq (name, "macro"))
6122 || (do_debug_str && const_strneq (name, "str"))
6123 || (do_debug_loc && const_strneq (name, "loc"))
77145576 6124 || (do_debug_loc && const_strneq (name, "loclists"))
657d0d47
CC
6125 || (do_debug_addr && const_strneq (name, "addr"))
6126 || (do_debug_cu_index && const_strneq (name, "cu_index"))
6127 || (do_debug_cu_index && const_strneq (name, "tu_index"))
252b5132 6128 )
dda8d76d 6129 request_dump_bynumber (filedata, i, DEBUG_DUMP);
252b5132 6130 }
a262ae96 6131 /* Linkonce section to be combined with .debug_info at link time. */
09fd7e38 6132 else if ((do_debugging || do_debug_info)
0112cd26 6133 && const_strneq (name, ".gnu.linkonce.wi."))
dda8d76d 6134 request_dump_bynumber (filedata, i, DEBUG_DUMP);
18bd398b 6135 else if (do_debug_frames && streq (name, ".eh_frame"))
dda8d76d 6136 request_dump_bynumber (filedata, i, DEBUG_DUMP);
61364358
JK
6137 else if (do_gdb_index && (streq (name, ".gdb_index")
6138 || streq (name, ".debug_names")))
dda8d76d 6139 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6f875884
TG
6140 /* Trace sections for Itanium VMS. */
6141 else if ((do_debugging || do_trace_info || do_trace_abbrevs
6142 || do_trace_aranges)
6143 && const_strneq (name, ".trace_"))
6144 {
6145 name += sizeof (".trace_") - 1;
6146
6147 if (do_debugging
6148 || (do_trace_info && streq (name, "info"))
6149 || (do_trace_abbrevs && streq (name, "abbrev"))
6150 || (do_trace_aranges && streq (name, "aranges"))
6151 )
dda8d76d 6152 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6f875884 6153 }
dda8d76d
NC
6154 else if ((do_debugging || do_debug_links)
6155 && (const_strneq (name, ".gnu_debuglink")
6156 || const_strneq (name, ".gnu_debugaltlink")))
6157 request_dump_bynumber (filedata, i, DEBUG_DUMP);
252b5132
RH
6158 }
6159
6160 if (! do_sections)
32ec8896 6161 return TRUE;
252b5132 6162
dda8d76d 6163 if (filedata->file_header.e_shnum > 1)
3a1a2036
NC
6164 printf (_("\nSection Headers:\n"));
6165 else
6166 printf (_("\nSection Header:\n"));
76da6bbe 6167
f7a99963 6168 if (is_32bit_elf)
595cf52e 6169 {
5477e8a0 6170 if (do_section_details)
595cf52e
L
6171 {
6172 printf (_(" [Nr] Name\n"));
5477e8a0 6173 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
595cf52e
L
6174 }
6175 else
6176 printf
6177 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
6178 }
d974e256 6179 else if (do_wide)
595cf52e 6180 {
5477e8a0 6181 if (do_section_details)
595cf52e
L
6182 {
6183 printf (_(" [Nr] Name\n"));
5477e8a0 6184 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
595cf52e
L
6185 }
6186 else
6187 printf
6188 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
6189 }
f7a99963
NC
6190 else
6191 {
5477e8a0 6192 if (do_section_details)
595cf52e
L
6193 {
6194 printf (_(" [Nr] Name\n"));
5477e8a0
L
6195 printf (_(" Type Address Offset Link\n"));
6196 printf (_(" Size EntSize Info Align\n"));
595cf52e
L
6197 }
6198 else
6199 {
6200 printf (_(" [Nr] Name Type Address Offset\n"));
6201 printf (_(" Size EntSize Flags Link Info Align\n"));
6202 }
f7a99963 6203 }
252b5132 6204
5477e8a0
L
6205 if (do_section_details)
6206 printf (_(" Flags\n"));
6207
dda8d76d
NC
6208 for (i = 0, section = filedata->section_headers;
6209 i < filedata->file_header.e_shnum;
b34976b6 6210 i++, section++)
252b5132 6211 {
dd905818
NC
6212 /* Run some sanity checks on the section header. */
6213
6214 /* Check the sh_link field. */
6215 switch (section->sh_type)
6216 {
6217 case SHT_SYMTAB_SHNDX:
6218 case SHT_GROUP:
6219 case SHT_HASH:
6220 case SHT_GNU_HASH:
6221 case SHT_GNU_versym:
6222 case SHT_REL:
6223 case SHT_RELA:
6224 if (section->sh_link < 1
dda8d76d
NC
6225 || section->sh_link >= filedata->file_header.e_shnum
6226 || (filedata->section_headers[section->sh_link].sh_type != SHT_SYMTAB
6227 && filedata->section_headers[section->sh_link].sh_type != SHT_DYNSYM))
dd905818
NC
6228 warn (_("[%2u]: Link field (%u) should index a symtab section.\n"),
6229 i, section->sh_link);
6230 break;
6231
6232 case SHT_DYNAMIC:
6233 case SHT_SYMTAB:
6234 case SHT_DYNSYM:
6235 case SHT_GNU_verneed:
6236 case SHT_GNU_verdef:
6237 case SHT_GNU_LIBLIST:
6238 if (section->sh_link < 1
dda8d76d
NC
6239 || section->sh_link >= filedata->file_header.e_shnum
6240 || filedata->section_headers[section->sh_link].sh_type != SHT_STRTAB)
dd905818
NC
6241 warn (_("[%2u]: Link field (%u) should index a string section.\n"),
6242 i, section->sh_link);
6243 break;
6244
6245 case SHT_INIT_ARRAY:
6246 case SHT_FINI_ARRAY:
6247 case SHT_PREINIT_ARRAY:
6248 if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6249 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6250 i, section->sh_link);
6251 break;
6252
6253 default:
6254 /* FIXME: Add support for target specific section types. */
6255#if 0 /* Currently we do not check other section types as there are too
6256 many special cases. Stab sections for example have a type
6257 of SHT_PROGBITS but an sh_link field that links to the .stabstr
6258 section. */
6259 if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6260 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6261 i, section->sh_link);
6262#endif
6263 break;
6264 }
6265
6266 /* Check the sh_info field. */
6267 switch (section->sh_type)
6268 {
6269 case SHT_REL:
6270 case SHT_RELA:
6271 if (section->sh_info < 1
dda8d76d
NC
6272 || section->sh_info >= filedata->file_header.e_shnum
6273 || (filedata->section_headers[section->sh_info].sh_type != SHT_PROGBITS
6274 && filedata->section_headers[section->sh_info].sh_type != SHT_NOBITS
6275 && filedata->section_headers[section->sh_info].sh_type != SHT_NOTE
6276 && filedata->section_headers[section->sh_info].sh_type != SHT_INIT_ARRAY
dd905818 6277 /* FIXME: Are other section types valid ? */
dda8d76d 6278 && filedata->section_headers[section->sh_info].sh_type < SHT_LOOS))
dd905818
NC
6279 {
6280 if (section->sh_info == 0
bef7475f
NC
6281 && (filedata->file_header.e_type == ET_EXEC
6282 || filedata->file_header.e_type == ET_DYN
6283 /* These next two tests may be redundant, but
6284 they have been left in for paranoia's sake. */
6285 || streq (SECTION_NAME (section), ".rel.dyn")
dd905818 6286 || streq (SECTION_NAME (section), ".rela.dyn")))
bef7475f
NC
6287 /* Dynamic relocations apply to segments, not sections, so
6288 they do not need an sh_info value. */
6289 ;
dd905818
NC
6290 else
6291 warn (_("[%2u]: Info field (%u) should index a relocatable section.\n"),
6292 i, section->sh_info);
6293 }
6294 break;
6295
6296 case SHT_DYNAMIC:
6297 case SHT_HASH:
6298 case SHT_SYMTAB_SHNDX:
6299 case SHT_INIT_ARRAY:
6300 case SHT_FINI_ARRAY:
6301 case SHT_PREINIT_ARRAY:
6302 if (section->sh_info != 0)
6303 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6304 i, section->sh_info);
6305 break;
6306
6307 case SHT_GROUP:
6308 case SHT_SYMTAB:
6309 case SHT_DYNSYM:
6310 /* A symbol index - we assume that it is valid. */
6311 break;
6312
6313 default:
6314 /* FIXME: Add support for target specific section types. */
6315 if (section->sh_type == SHT_NOBITS)
6316 /* NOBITS section headers with non-zero sh_info fields can be
6317 created when a binary is stripped of everything but its debug
1a9ccd70
NC
6318 information. The stripped sections have their headers
6319 preserved but their types set to SHT_NOBITS. So do not check
6320 this type of section. */
dd905818
NC
6321 ;
6322 else if (section->sh_flags & SHF_INFO_LINK)
6323 {
dda8d76d 6324 if (section->sh_info < 1 || section->sh_info >= filedata->file_header.e_shnum)
dd905818
NC
6325 warn (_("[%2u]: Expected link to another section in info field"), i);
6326 }
a91e1603
L
6327 else if (section->sh_type < SHT_LOOS
6328 && (section->sh_flags & SHF_GNU_MBIND) == 0
6329 && section->sh_info != 0)
dd905818
NC
6330 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6331 i, section->sh_info);
6332 break;
6333 }
6334
3e6b6445 6335 /* Check the sh_size field. */
dda8d76d 6336 if (section->sh_size > filedata->file_size
3e6b6445
NC
6337 && section->sh_type != SHT_NOBITS
6338 && section->sh_type != SHT_NULL
6339 && section->sh_type < SHT_LOOS)
6340 warn (_("Size of section %u is larger than the entire file!\n"), i);
6341
7bfd842d 6342 printf (" [%2u] ", i);
5477e8a0 6343 if (do_section_details)
dda8d76d 6344 printf ("%s\n ", printable_section_name (filedata, section));
595cf52e 6345 else
74e1a04b 6346 print_symbol (-17, SECTION_NAME (section));
0b4362b0 6347
ea52a088 6348 printf (do_wide ? " %-15s " : " %-15.15s ",
dda8d76d 6349 get_section_type_name (filedata, section->sh_type));
0b4362b0 6350
f7a99963
NC
6351 if (is_32bit_elf)
6352 {
cfcac11d
NC
6353 const char * link_too_big = NULL;
6354
f7a99963 6355 print_vma (section->sh_addr, LONG_HEX);
76da6bbe 6356
f7a99963
NC
6357 printf ( " %6.6lx %6.6lx %2.2lx",
6358 (unsigned long) section->sh_offset,
6359 (unsigned long) section->sh_size,
6360 (unsigned long) section->sh_entsize);
d1133906 6361
5477e8a0
L
6362 if (do_section_details)
6363 fputs (" ", stdout);
6364 else
dda8d76d 6365 printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
76da6bbe 6366
dda8d76d 6367 if (section->sh_link >= filedata->file_header.e_shnum)
cfcac11d
NC
6368 {
6369 link_too_big = "";
6370 /* The sh_link value is out of range. Normally this indicates
caa83f8b 6371 an error but it can have special values in Solaris binaries. */
dda8d76d 6372 switch (filedata->file_header.e_machine)
cfcac11d 6373 {
caa83f8b 6374 case EM_386:
22abe556 6375 case EM_IAMCU:
caa83f8b 6376 case EM_X86_64:
7f502d6c 6377 case EM_L1OM:
7a9068fe 6378 case EM_K1OM:
cfcac11d
NC
6379 case EM_OLD_SPARCV9:
6380 case EM_SPARC32PLUS:
6381 case EM_SPARCV9:
6382 case EM_SPARC:
6383 if (section->sh_link == (SHN_BEFORE & 0xffff))
6384 link_too_big = "BEFORE";
6385 else if (section->sh_link == (SHN_AFTER & 0xffff))
6386 link_too_big = "AFTER";
6387 break;
6388 default:
6389 break;
6390 }
6391 }
6392
6393 if (do_section_details)
6394 {
6395 if (link_too_big != NULL && * link_too_big)
6396 printf ("<%s> ", link_too_big);
6397 else
6398 printf ("%2u ", section->sh_link);
6399 printf ("%3u %2lu\n", section->sh_info,
6400 (unsigned long) section->sh_addralign);
6401 }
6402 else
6403 printf ("%2u %3u %2lu\n",
6404 section->sh_link,
6405 section->sh_info,
6406 (unsigned long) section->sh_addralign);
6407
6408 if (link_too_big && ! * link_too_big)
6409 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
6410 i, section->sh_link);
f7a99963 6411 }
d974e256
JJ
6412 else if (do_wide)
6413 {
6414 print_vma (section->sh_addr, LONG_HEX);
6415
6416 if ((long) section->sh_offset == section->sh_offset)
6417 printf (" %6.6lx", (unsigned long) section->sh_offset);
6418 else
6419 {
6420 putchar (' ');
6421 print_vma (section->sh_offset, LONG_HEX);
6422 }
6423
6424 if ((unsigned long) section->sh_size == section->sh_size)
6425 printf (" %6.6lx", (unsigned long) section->sh_size);
6426 else
6427 {
6428 putchar (' ');
6429 print_vma (section->sh_size, LONG_HEX);
6430 }
6431
6432 if ((unsigned long) section->sh_entsize == section->sh_entsize)
6433 printf (" %2.2lx", (unsigned long) section->sh_entsize);
6434 else
6435 {
6436 putchar (' ');
6437 print_vma (section->sh_entsize, LONG_HEX);
6438 }
6439
5477e8a0
L
6440 if (do_section_details)
6441 fputs (" ", stdout);
6442 else
dda8d76d 6443 printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
d974e256 6444
72de5009 6445 printf ("%2u %3u ", section->sh_link, section->sh_info);
d974e256
JJ
6446
6447 if ((unsigned long) section->sh_addralign == section->sh_addralign)
72de5009 6448 printf ("%2lu\n", (unsigned long) section->sh_addralign);
d974e256
JJ
6449 else
6450 {
6451 print_vma (section->sh_addralign, DEC);
6452 putchar ('\n');
6453 }
6454 }
5477e8a0 6455 else if (do_section_details)
595cf52e 6456 {
5477e8a0 6457 printf (" %-15.15s ",
dda8d76d 6458 get_section_type_name (filedata, section->sh_type));
595cf52e
L
6459 print_vma (section->sh_addr, LONG_HEX);
6460 if ((long) section->sh_offset == section->sh_offset)
5477e8a0 6461 printf (" %16.16lx", (unsigned long) section->sh_offset);
595cf52e
L
6462 else
6463 {
6464 printf (" ");
6465 print_vma (section->sh_offset, LONG_HEX);
6466 }
72de5009 6467 printf (" %u\n ", section->sh_link);
595cf52e 6468 print_vma (section->sh_size, LONG_HEX);
5477e8a0 6469 putchar (' ');
595cf52e
L
6470 print_vma (section->sh_entsize, LONG_HEX);
6471
72de5009
AM
6472 printf (" %-16u %lu\n",
6473 section->sh_info,
595cf52e
L
6474 (unsigned long) section->sh_addralign);
6475 }
f7a99963
NC
6476 else
6477 {
6478 putchar (' ');
6479 print_vma (section->sh_addr, LONG_HEX);
53c7db4b
KH
6480 if ((long) section->sh_offset == section->sh_offset)
6481 printf (" %8.8lx", (unsigned long) section->sh_offset);
6482 else
6483 {
6484 printf (" ");
6485 print_vma (section->sh_offset, LONG_HEX);
6486 }
f7a99963
NC
6487 printf ("\n ");
6488 print_vma (section->sh_size, LONG_HEX);
6489 printf (" ");
6490 print_vma (section->sh_entsize, LONG_HEX);
76da6bbe 6491
dda8d76d 6492 printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
76da6bbe 6493
72de5009
AM
6494 printf (" %2u %3u %lu\n",
6495 section->sh_link,
6496 section->sh_info,
f7a99963
NC
6497 (unsigned long) section->sh_addralign);
6498 }
5477e8a0
L
6499
6500 if (do_section_details)
77115a4a 6501 {
dda8d76d 6502 printf (" %s\n", get_elf_section_flags (filedata, section->sh_flags));
77115a4a
L
6503 if ((section->sh_flags & SHF_COMPRESSED) != 0)
6504 {
6505 /* Minimum section size is 12 bytes for 32-bit compression
6506 header + 12 bytes for compressed data header. */
6507 unsigned char buf[24];
d8024a91 6508
77115a4a 6509 assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
dda8d76d 6510 if (get_data (&buf, filedata, section->sh_offset, 1,
77115a4a
L
6511 sizeof (buf), _("compression header")))
6512 {
6513 Elf_Internal_Chdr chdr;
d8024a91 6514
ebdf1ebf 6515 (void) get_compression_header (&chdr, buf, sizeof (buf));
d8024a91 6516
77115a4a
L
6517 if (chdr.ch_type == ELFCOMPRESS_ZLIB)
6518 printf (" ZLIB, ");
6519 else
6520 printf (_(" [<unknown>: 0x%x], "),
6521 chdr.ch_type);
6522 print_vma (chdr.ch_size, LONG_HEX);
6523 printf (", %lu\n", (unsigned long) chdr.ch_addralign);
6524 }
6525 }
6526 }
252b5132
RH
6527 }
6528
5477e8a0 6529 if (!do_section_details)
3dbcc61d 6530 {
9fb71ee4
NC
6531 /* The ordering of the letters shown here matches the ordering of the
6532 corresponding SHF_xxx values, and hence the order in which these
6533 letters will be displayed to the user. */
6534 printf (_("Key to Flags:\n\
6535 W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6536 L (link order), O (extra OS processing required), G (group), T (TLS),\n\
fd85a6a1 6537 C (compressed), x (unknown), o (OS specific), E (exclude),\n "));
dda8d76d
NC
6538 if (filedata->file_header.e_machine == EM_X86_64
6539 || filedata->file_header.e_machine == EM_L1OM
6540 || filedata->file_header.e_machine == EM_K1OM)
9fb71ee4 6541 printf (_("l (large), "));
dda8d76d 6542 else if (filedata->file_header.e_machine == EM_ARM)
f0728ee3 6543 printf (_("y (purecode), "));
dda8d76d 6544 else if (filedata->file_header.e_machine == EM_PPC)
83eef883 6545 printf (_("v (VLE), "));
9fb71ee4 6546 printf ("p (processor specific)\n");
0b4362b0 6547 }
d1133906 6548
32ec8896 6549 return TRUE;
252b5132
RH
6550}
6551
f5842774
L
6552static const char *
6553get_group_flags (unsigned int flags)
6554{
1449284b 6555 static char buff[128];
220453ec 6556
6d913794
NC
6557 if (flags == 0)
6558 return "";
6559 else if (flags == GRP_COMDAT)
6560 return "COMDAT ";
f5842774 6561
6d913794
NC
6562 snprintf (buff, 14, _("[0x%x: "), flags);
6563
6564 flags &= ~ GRP_COMDAT;
6565 if (flags & GRP_MASKOS)
6566 {
6567 strcat (buff, "<OS specific>");
6568 flags &= ~ GRP_MASKOS;
f5842774 6569 }
6d913794
NC
6570
6571 if (flags & GRP_MASKPROC)
6572 {
6573 strcat (buff, "<PROC specific>");
6574 flags &= ~ GRP_MASKPROC;
6575 }
6576
6577 if (flags)
6578 strcat (buff, "<unknown>");
6579
6580 strcat (buff, "]");
f5842774
L
6581 return buff;
6582}
6583
32ec8896 6584static bfd_boolean
dda8d76d 6585process_section_groups (Filedata * filedata)
f5842774 6586{
2cf0635d 6587 Elf_Internal_Shdr * section;
f5842774 6588 unsigned int i;
2cf0635d
NC
6589 struct group * group;
6590 Elf_Internal_Shdr * symtab_sec;
6591 Elf_Internal_Shdr * strtab_sec;
6592 Elf_Internal_Sym * symtab;
ba5cdace 6593 unsigned long num_syms;
2cf0635d 6594 char * strtab;
c256ffe7 6595 size_t strtab_size;
d1f5c6e3
L
6596
6597 /* Don't process section groups unless needed. */
6598 if (!do_unwind && !do_section_groups)
32ec8896 6599 return TRUE;
f5842774 6600
dda8d76d 6601 if (filedata->file_header.e_shnum == 0)
f5842774
L
6602 {
6603 if (do_section_groups)
82f2dbf7 6604 printf (_("\nThere are no sections to group in this file.\n"));
f5842774 6605
32ec8896 6606 return TRUE;
f5842774
L
6607 }
6608
dda8d76d 6609 if (filedata->section_headers == NULL)
f5842774
L
6610 {
6611 error (_("Section headers are not available!\n"));
fa1908fd 6612 /* PR 13622: This can happen with a corrupt ELF header. */
32ec8896 6613 return FALSE;
f5842774
L
6614 }
6615
dda8d76d 6616 section_headers_groups = (struct group **) calloc (filedata->file_header.e_shnum,
3f5e193b 6617 sizeof (struct group *));
e4b17d5c
L
6618
6619 if (section_headers_groups == NULL)
6620 {
8b73c356 6621 error (_("Out of memory reading %u section group headers\n"),
dda8d76d 6622 filedata->file_header.e_shnum);
32ec8896 6623 return FALSE;
e4b17d5c
L
6624 }
6625
f5842774 6626 /* Scan the sections for the group section. */
d1f5c6e3 6627 group_count = 0;
dda8d76d
NC
6628 for (i = 0, section = filedata->section_headers;
6629 i < filedata->file_header.e_shnum;
f5842774 6630 i++, section++)
e4b17d5c
L
6631 if (section->sh_type == SHT_GROUP)
6632 group_count++;
6633
d1f5c6e3
L
6634 if (group_count == 0)
6635 {
6636 if (do_section_groups)
6637 printf (_("\nThere are no section groups in this file.\n"));
6638
32ec8896 6639 return TRUE;
d1f5c6e3
L
6640 }
6641
3f5e193b 6642 section_groups = (struct group *) calloc (group_count, sizeof (struct group));
e4b17d5c
L
6643
6644 if (section_groups == NULL)
6645 {
8b73c356
NC
6646 error (_("Out of memory reading %lu groups\n"),
6647 (unsigned long) group_count);
32ec8896 6648 return FALSE;
e4b17d5c
L
6649 }
6650
d1f5c6e3
L
6651 symtab_sec = NULL;
6652 strtab_sec = NULL;
6653 symtab = NULL;
ba5cdace 6654 num_syms = 0;
d1f5c6e3 6655 strtab = NULL;
c256ffe7 6656 strtab_size = 0;
dda8d76d
NC
6657 for (i = 0, section = filedata->section_headers, group = section_groups;
6658 i < filedata->file_header.e_shnum;
e4b17d5c 6659 i++, section++)
f5842774
L
6660 {
6661 if (section->sh_type == SHT_GROUP)
6662 {
dda8d76d 6663 const char * name = printable_section_name (filedata, section);
74e1a04b 6664 const char * group_name;
2cf0635d
NC
6665 unsigned char * start;
6666 unsigned char * indices;
f5842774 6667 unsigned int entry, j, size;
2cf0635d
NC
6668 Elf_Internal_Shdr * sec;
6669 Elf_Internal_Sym * sym;
f5842774
L
6670
6671 /* Get the symbol table. */
dda8d76d
NC
6672 if (section->sh_link >= filedata->file_header.e_shnum
6673 || ((sec = filedata->section_headers + section->sh_link)->sh_type
c256ffe7 6674 != SHT_SYMTAB))
f5842774
L
6675 {
6676 error (_("Bad sh_link in group section `%s'\n"), name);
6677 continue;
6678 }
d1f5c6e3
L
6679
6680 if (symtab_sec != sec)
6681 {
6682 symtab_sec = sec;
6683 if (symtab)
6684 free (symtab);
dda8d76d 6685 symtab = GET_ELF_SYMBOLS (filedata, symtab_sec, & num_syms);
d1f5c6e3 6686 }
f5842774 6687
dd24e3da
NC
6688 if (symtab == NULL)
6689 {
6690 error (_("Corrupt header in group section `%s'\n"), name);
6691 continue;
6692 }
6693
ba5cdace
NC
6694 if (section->sh_info >= num_syms)
6695 {
6696 error (_("Bad sh_info in group section `%s'\n"), name);
6697 continue;
6698 }
6699
f5842774
L
6700 sym = symtab + section->sh_info;
6701
6702 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6703 {
4fbb74a6 6704 if (sym->st_shndx == 0
dda8d76d 6705 || sym->st_shndx >= filedata->file_header.e_shnum)
f5842774
L
6706 {
6707 error (_("Bad sh_info in group section `%s'\n"), name);
6708 continue;
6709 }
ba2685cc 6710
dda8d76d 6711 group_name = SECTION_NAME (filedata->section_headers + sym->st_shndx);
c256ffe7
JJ
6712 strtab_sec = NULL;
6713 if (strtab)
6714 free (strtab);
f5842774 6715 strtab = NULL;
c256ffe7 6716 strtab_size = 0;
f5842774
L
6717 }
6718 else
6719 {
6720 /* Get the string table. */
dda8d76d 6721 if (symtab_sec->sh_link >= filedata->file_header.e_shnum)
c256ffe7
JJ
6722 {
6723 strtab_sec = NULL;
6724 if (strtab)
6725 free (strtab);
6726 strtab = NULL;
6727 strtab_size = 0;
6728 }
6729 else if (strtab_sec
dda8d76d 6730 != (sec = filedata->section_headers + symtab_sec->sh_link))
d1f5c6e3
L
6731 {
6732 strtab_sec = sec;
6733 if (strtab)
6734 free (strtab);
071436c6 6735
dda8d76d 6736 strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
071436c6
NC
6737 1, strtab_sec->sh_size,
6738 _("string table"));
c256ffe7 6739 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
d1f5c6e3 6740 }
c256ffe7 6741 group_name = sym->st_name < strtab_size
2b692964 6742 ? strtab + sym->st_name : _("<corrupt>");
f5842774
L
6743 }
6744
c9c1d674
EG
6745 /* PR 17531: file: loop. */
6746 if (section->sh_entsize > section->sh_size)
6747 {
6748 error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
dda8d76d 6749 printable_section_name (filedata, section),
8066deb1
AM
6750 (unsigned long) section->sh_entsize,
6751 (unsigned long) section->sh_size);
c9c1d674
EG
6752 break;
6753 }
6754
dda8d76d 6755 start = (unsigned char *) get_data (NULL, filedata, section->sh_offset,
3f5e193b
NC
6756 1, section->sh_size,
6757 _("section data"));
59245841
NC
6758 if (start == NULL)
6759 continue;
f5842774
L
6760
6761 indices = start;
6762 size = (section->sh_size / section->sh_entsize) - 1;
6763 entry = byte_get (indices, 4);
6764 indices += 4;
e4b17d5c
L
6765
6766 if (do_section_groups)
6767 {
2b692964 6768 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
391cb864 6769 get_group_flags (entry), i, name, group_name, size);
ba2685cc 6770
e4b17d5c
L
6771 printf (_(" [Index] Name\n"));
6772 }
6773
6774 group->group_index = i;
6775
f5842774
L
6776 for (j = 0; j < size; j++)
6777 {
2cf0635d 6778 struct group_list * g;
e4b17d5c 6779
f5842774
L
6780 entry = byte_get (indices, 4);
6781 indices += 4;
6782
dda8d76d 6783 if (entry >= filedata->file_header.e_shnum)
391cb864 6784 {
57028622
NC
6785 static unsigned num_group_errors = 0;
6786
6787 if (num_group_errors ++ < 10)
6788 {
6789 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
dda8d76d 6790 entry, i, filedata->file_header.e_shnum - 1);
57028622 6791 if (num_group_errors == 10)
de194d85 6792 warn (_("Further error messages about overlarge group section indicies suppressed\n"));
57028622 6793 }
391cb864
L
6794 continue;
6795 }
391cb864 6796
4fbb74a6 6797 if (section_headers_groups [entry] != NULL)
e4b17d5c 6798 {
d1f5c6e3
L
6799 if (entry)
6800 {
57028622
NC
6801 static unsigned num_errs = 0;
6802
6803 if (num_errs ++ < 10)
6804 {
6805 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6806 entry, i,
6807 section_headers_groups [entry]->group_index);
6808 if (num_errs == 10)
6809 warn (_("Further error messages about already contained group sections suppressed\n"));
6810 }
d1f5c6e3
L
6811 continue;
6812 }
6813 else
6814 {
6815 /* Intel C/C++ compiler may put section 0 in a
32ec8896 6816 section group. We just warn it the first time
d1f5c6e3 6817 and ignore it afterwards. */
32ec8896 6818 static bfd_boolean warned = FALSE;
d1f5c6e3
L
6819 if (!warned)
6820 {
6821 error (_("section 0 in group section [%5u]\n"),
4fbb74a6 6822 section_headers_groups [entry]->group_index);
32ec8896 6823 warned = TRUE;
d1f5c6e3
L
6824 }
6825 }
e4b17d5c
L
6826 }
6827
4fbb74a6 6828 section_headers_groups [entry] = group;
e4b17d5c
L
6829
6830 if (do_section_groups)
6831 {
dda8d76d
NC
6832 sec = filedata->section_headers + entry;
6833 printf (" [%5u] %s\n", entry, printable_section_name (filedata, sec));
ba2685cc
AM
6834 }
6835
3f5e193b 6836 g = (struct group_list *) xmalloc (sizeof (struct group_list));
e4b17d5c
L
6837 g->section_index = entry;
6838 g->next = group->root;
6839 group->root = g;
f5842774
L
6840 }
6841
f5842774
L
6842 if (start)
6843 free (start);
e4b17d5c
L
6844
6845 group++;
f5842774
L
6846 }
6847 }
6848
d1f5c6e3
L
6849 if (symtab)
6850 free (symtab);
6851 if (strtab)
6852 free (strtab);
32ec8896 6853 return TRUE;
f5842774
L
6854}
6855
28f997cf
TG
6856/* Data used to display dynamic fixups. */
6857
6858struct ia64_vms_dynfixup
6859{
6860 bfd_vma needed_ident; /* Library ident number. */
6861 bfd_vma needed; /* Index in the dstrtab of the library name. */
6862 bfd_vma fixup_needed; /* Index of the library. */
6863 bfd_vma fixup_rela_cnt; /* Number of fixups. */
6864 bfd_vma fixup_rela_off; /* Fixups offset in the dynamic segment. */
6865};
6866
6867/* Data used to display dynamic relocations. */
6868
6869struct ia64_vms_dynimgrela
6870{
6871 bfd_vma img_rela_cnt; /* Number of relocations. */
6872 bfd_vma img_rela_off; /* Reloc offset in the dynamic segment. */
6873};
6874
6875/* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6876 library). */
6877
32ec8896 6878static bfd_boolean
dda8d76d
NC
6879dump_ia64_vms_dynamic_fixups (Filedata * filedata,
6880 struct ia64_vms_dynfixup * fixup,
6881 const char * strtab,
6882 unsigned int strtab_sz)
28f997cf 6883{
32ec8896 6884 Elf64_External_VMS_IMAGE_FIXUP * imfs;
28f997cf 6885 long i;
32ec8896 6886 const char * lib_name;
28f997cf 6887
dda8d76d 6888 imfs = get_data (NULL, filedata, dynamic_addr + fixup->fixup_rela_off,
28f997cf
TG
6889 1, fixup->fixup_rela_cnt * sizeof (*imfs),
6890 _("dynamic section image fixups"));
6891 if (!imfs)
32ec8896 6892 return FALSE;
28f997cf
TG
6893
6894 if (fixup->needed < strtab_sz)
6895 lib_name = strtab + fixup->needed;
6896 else
6897 {
32ec8896 6898 warn (_("corrupt library name index of 0x%lx found in dynamic entry"),
7f01b0c6 6899 (unsigned long) fixup->needed);
28f997cf
TG
6900 lib_name = "???";
6901 }
6902 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
6903 (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
6904 printf
6905 (_("Seg Offset Type SymVec DataType\n"));
6906
6907 for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
6908 {
6909 unsigned int type;
6910 const char *rtype;
6911
6912 printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
6913 printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
6914 type = BYTE_GET (imfs [i].type);
6915 rtype = elf_ia64_reloc_type (type);
6916 if (rtype == NULL)
6917 printf (" 0x%08x ", type);
6918 else
6919 printf (" %-32s ", rtype);
6920 printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
6921 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
6922 }
6923
6924 free (imfs);
32ec8896 6925 return TRUE;
28f997cf
TG
6926}
6927
6928/* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
6929
32ec8896 6930static bfd_boolean
dda8d76d 6931dump_ia64_vms_dynamic_relocs (Filedata * filedata, struct ia64_vms_dynimgrela *imgrela)
28f997cf
TG
6932{
6933 Elf64_External_VMS_IMAGE_RELA *imrs;
6934 long i;
6935
dda8d76d 6936 imrs = get_data (NULL, filedata, dynamic_addr + imgrela->img_rela_off,
28f997cf 6937 1, imgrela->img_rela_cnt * sizeof (*imrs),
9cf03b7e 6938 _("dynamic section image relocations"));
28f997cf 6939 if (!imrs)
32ec8896 6940 return FALSE;
28f997cf
TG
6941
6942 printf (_("\nImage relocs\n"));
6943 printf
6944 (_("Seg Offset Type Addend Seg Sym Off\n"));
6945
6946 for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
6947 {
6948 unsigned int type;
6949 const char *rtype;
6950
6951 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
6952 printf ("%08" BFD_VMA_FMT "x ",
6953 (bfd_vma) BYTE_GET (imrs [i].rela_offset));
6954 type = BYTE_GET (imrs [i].type);
6955 rtype = elf_ia64_reloc_type (type);
6956 if (rtype == NULL)
6957 printf ("0x%08x ", type);
6958 else
6959 printf ("%-31s ", rtype);
6960 print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
6961 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
6962 printf ("%08" BFD_VMA_FMT "x\n",
6963 (bfd_vma) BYTE_GET (imrs [i].sym_offset));
6964 }
6965
6966 free (imrs);
32ec8896 6967 return TRUE;
28f997cf
TG
6968}
6969
6970/* Display IA-64 OpenVMS dynamic relocations and fixups. */
6971
32ec8896 6972static bfd_boolean
dda8d76d 6973process_ia64_vms_dynamic_relocs (Filedata * filedata)
28f997cf
TG
6974{
6975 struct ia64_vms_dynfixup fixup;
6976 struct ia64_vms_dynimgrela imgrela;
6977 Elf_Internal_Dyn *entry;
28f997cf
TG
6978 bfd_vma strtab_off = 0;
6979 bfd_vma strtab_sz = 0;
6980 char *strtab = NULL;
32ec8896 6981 bfd_boolean res = TRUE;
28f997cf
TG
6982
6983 memset (&fixup, 0, sizeof (fixup));
6984 memset (&imgrela, 0, sizeof (imgrela));
6985
6986 /* Note: the order of the entries is specified by the OpenVMS specs. */
6987 for (entry = dynamic_section;
6988 entry < dynamic_section + dynamic_nent;
6989 entry++)
6990 {
6991 switch (entry->d_tag)
6992 {
6993 case DT_IA_64_VMS_STRTAB_OFFSET:
6994 strtab_off = entry->d_un.d_val;
6995 break;
6996 case DT_STRSZ:
6997 strtab_sz = entry->d_un.d_val;
6998 if (strtab == NULL)
dda8d76d 6999 strtab = get_data (NULL, filedata, dynamic_addr + strtab_off,
28f997cf
TG
7000 1, strtab_sz, _("dynamic string section"));
7001 break;
7002
7003 case DT_IA_64_VMS_NEEDED_IDENT:
7004 fixup.needed_ident = entry->d_un.d_val;
7005 break;
7006 case DT_NEEDED:
7007 fixup.needed = entry->d_un.d_val;
7008 break;
7009 case DT_IA_64_VMS_FIXUP_NEEDED:
7010 fixup.fixup_needed = entry->d_un.d_val;
7011 break;
7012 case DT_IA_64_VMS_FIXUP_RELA_CNT:
7013 fixup.fixup_rela_cnt = entry->d_un.d_val;
7014 break;
7015 case DT_IA_64_VMS_FIXUP_RELA_OFF:
7016 fixup.fixup_rela_off = entry->d_un.d_val;
dda8d76d 7017 if (! dump_ia64_vms_dynamic_fixups (filedata, &fixup, strtab, strtab_sz))
32ec8896 7018 res = FALSE;
28f997cf 7019 break;
28f997cf
TG
7020 case DT_IA_64_VMS_IMG_RELA_CNT:
7021 imgrela.img_rela_cnt = entry->d_un.d_val;
7022 break;
7023 case DT_IA_64_VMS_IMG_RELA_OFF:
7024 imgrela.img_rela_off = entry->d_un.d_val;
dda8d76d 7025 if (! dump_ia64_vms_dynamic_relocs (filedata, &imgrela))
32ec8896 7026 res = FALSE;
28f997cf
TG
7027 break;
7028
7029 default:
7030 break;
7031 }
7032 }
7033
7034 if (strtab != NULL)
7035 free (strtab);
7036
7037 return res;
7038}
7039
85b1c36d 7040static struct
566b0d53 7041{
2cf0635d 7042 const char * name;
566b0d53
L
7043 int reloc;
7044 int size;
7045 int rela;
32ec8896
NC
7046}
7047 dynamic_relocations [] =
566b0d53 7048{
32ec8896
NC
7049 { "REL", DT_REL, DT_RELSZ, FALSE },
7050 { "RELA", DT_RELA, DT_RELASZ, TRUE },
7051 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
566b0d53
L
7052};
7053
252b5132 7054/* Process the reloc section. */
18bd398b 7055
32ec8896 7056static bfd_boolean
dda8d76d 7057process_relocs (Filedata * filedata)
252b5132 7058{
b34976b6
AM
7059 unsigned long rel_size;
7060 unsigned long rel_offset;
252b5132 7061
252b5132 7062 if (!do_reloc)
32ec8896 7063 return TRUE;
252b5132
RH
7064
7065 if (do_using_dynamic)
7066 {
32ec8896 7067 int is_rela;
2cf0635d 7068 const char * name;
32ec8896 7069 bfd_boolean has_dynamic_reloc;
566b0d53 7070 unsigned int i;
0de14b54 7071
32ec8896 7072 has_dynamic_reloc = FALSE;
252b5132 7073
566b0d53 7074 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
252b5132 7075 {
566b0d53
L
7076 is_rela = dynamic_relocations [i].rela;
7077 name = dynamic_relocations [i].name;
7078 rel_size = dynamic_info [dynamic_relocations [i].size];
7079 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
103f02d3 7080
32ec8896
NC
7081 if (rel_size)
7082 has_dynamic_reloc = TRUE;
566b0d53
L
7083
7084 if (is_rela == UNKNOWN)
aa903cfb 7085 {
566b0d53
L
7086 if (dynamic_relocations [i].reloc == DT_JMPREL)
7087 switch (dynamic_info[DT_PLTREL])
7088 {
7089 case DT_REL:
7090 is_rela = FALSE;
7091 break;
7092 case DT_RELA:
7093 is_rela = TRUE;
7094 break;
7095 }
aa903cfb 7096 }
252b5132 7097
566b0d53
L
7098 if (rel_size)
7099 {
7100 printf
7101 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
7102 name, rel_offset, rel_size);
252b5132 7103
dda8d76d
NC
7104 dump_relocations (filedata,
7105 offset_from_vma (filedata, rel_offset, rel_size),
d93f0186 7106 rel_size,
566b0d53 7107 dynamic_symbols, num_dynamic_syms,
bb4d2ac2 7108 dynamic_strings, dynamic_strings_length,
32ec8896 7109 is_rela, TRUE /* is_dynamic */);
566b0d53 7110 }
252b5132 7111 }
566b0d53 7112
dda8d76d
NC
7113 if (is_ia64_vms (filedata))
7114 if (process_ia64_vms_dynamic_relocs (filedata))
32ec8896 7115 has_dynamic_reloc = TRUE;
28f997cf 7116
566b0d53 7117 if (! has_dynamic_reloc)
252b5132
RH
7118 printf (_("\nThere are no dynamic relocations in this file.\n"));
7119 }
7120 else
7121 {
2cf0635d 7122 Elf_Internal_Shdr * section;
b34976b6 7123 unsigned long i;
32ec8896 7124 bfd_boolean found = FALSE;
252b5132 7125
dda8d76d
NC
7126 for (i = 0, section = filedata->section_headers;
7127 i < filedata->file_header.e_shnum;
b34976b6 7128 i++, section++)
252b5132
RH
7129 {
7130 if ( section->sh_type != SHT_RELA
7131 && section->sh_type != SHT_REL)
7132 continue;
7133
7134 rel_offset = section->sh_offset;
7135 rel_size = section->sh_size;
7136
7137 if (rel_size)
7138 {
2cf0635d 7139 Elf_Internal_Shdr * strsec;
b34976b6 7140 int is_rela;
d3a49aa8 7141 unsigned long num_rela;
103f02d3 7142
252b5132
RH
7143 printf (_("\nRelocation section "));
7144
dda8d76d 7145 if (filedata->string_table == NULL)
19936277 7146 printf ("%d", section->sh_name);
252b5132 7147 else
dda8d76d 7148 printf ("'%s'", printable_section_name (filedata, section));
252b5132 7149
d3a49aa8
AM
7150 num_rela = rel_size / section->sh_entsize;
7151 printf (ngettext (" at offset 0x%lx contains %lu entry:\n",
7152 " at offset 0x%lx contains %lu entries:\n",
7153 num_rela),
7154 rel_offset, num_rela);
252b5132 7155
d79b3d50
NC
7156 is_rela = section->sh_type == SHT_RELA;
7157
4fbb74a6 7158 if (section->sh_link != 0
dda8d76d 7159 && section->sh_link < filedata->file_header.e_shnum)
af3fc3bc 7160 {
2cf0635d
NC
7161 Elf_Internal_Shdr * symsec;
7162 Elf_Internal_Sym * symtab;
d79b3d50 7163 unsigned long nsyms;
c256ffe7 7164 unsigned long strtablen = 0;
2cf0635d 7165 char * strtab = NULL;
57346661 7166
dda8d76d 7167 symsec = filedata->section_headers + section->sh_link;
08d8fa11
JJ
7168 if (symsec->sh_type != SHT_SYMTAB
7169 && symsec->sh_type != SHT_DYNSYM)
7170 continue;
7171
dda8d76d 7172 symtab = GET_ELF_SYMBOLS (filedata, symsec, & nsyms);
252b5132 7173
af3fc3bc
AM
7174 if (symtab == NULL)
7175 continue;
252b5132 7176
4fbb74a6 7177 if (symsec->sh_link != 0
dda8d76d 7178 && symsec->sh_link < filedata->file_header.e_shnum)
c256ffe7 7179 {
dda8d76d 7180 strsec = filedata->section_headers + symsec->sh_link;
103f02d3 7181
dda8d76d 7182 strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
071436c6
NC
7183 1, strsec->sh_size,
7184 _("string table"));
c256ffe7
JJ
7185 strtablen = strtab == NULL ? 0 : strsec->sh_size;
7186 }
252b5132 7187
dda8d76d 7188 dump_relocations (filedata, rel_offset, rel_size,
bb4d2ac2
L
7189 symtab, nsyms, strtab, strtablen,
7190 is_rela,
7191 symsec->sh_type == SHT_DYNSYM);
d79b3d50
NC
7192 if (strtab)
7193 free (strtab);
7194 free (symtab);
7195 }
7196 else
dda8d76d 7197 dump_relocations (filedata, rel_offset, rel_size,
32ec8896
NC
7198 NULL, 0, NULL, 0, is_rela,
7199 FALSE /* is_dynamic */);
252b5132 7200
32ec8896 7201 found = TRUE;
252b5132
RH
7202 }
7203 }
7204
7205 if (! found)
45ac8f4f
NC
7206 {
7207 /* Users sometimes forget the -D option, so try to be helpful. */
7208 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
7209 {
7210 if (dynamic_info [dynamic_relocations [i].size])
7211 {
7212 printf (_("\nThere are no static relocations in this file."));
7213 printf (_("\nTo see the dynamic relocations add --use-dynamic to the command line.\n"));
7214
7215 break;
7216 }
7217 }
7218 if (i == ARRAY_SIZE (dynamic_relocations))
7219 printf (_("\nThere are no relocations in this file.\n"));
7220 }
252b5132
RH
7221 }
7222
32ec8896 7223 return TRUE;
252b5132
RH
7224}
7225
4d6ed7c8
NC
7226/* An absolute address consists of a section and an offset. If the
7227 section is NULL, the offset itself is the address, otherwise, the
7228 address equals to LOAD_ADDRESS(section) + offset. */
7229
7230struct absaddr
948f632f
DA
7231{
7232 unsigned short section;
7233 bfd_vma offset;
7234};
4d6ed7c8 7235
1949de15
L
7236#define ABSADDR(a) \
7237 ((a).section \
dda8d76d 7238 ? filedata->section_headers [(a).section].sh_addr + (a).offset \
1949de15
L
7239 : (a).offset)
7240
948f632f
DA
7241/* Find the nearest symbol at or below ADDR. Returns the symbol
7242 name, if found, and the offset from the symbol to ADDR. */
4d6ed7c8 7243
4d6ed7c8 7244static void
dda8d76d
NC
7245find_symbol_for_address (Filedata * filedata,
7246 Elf_Internal_Sym * symtab,
7247 unsigned long nsyms,
7248 const char * strtab,
7249 unsigned long strtab_size,
7250 struct absaddr addr,
7251 const char ** symname,
7252 bfd_vma * offset)
4d6ed7c8 7253{
d3ba0551 7254 bfd_vma dist = 0x100000;
2cf0635d 7255 Elf_Internal_Sym * sym;
948f632f
DA
7256 Elf_Internal_Sym * beg;
7257 Elf_Internal_Sym * end;
2cf0635d 7258 Elf_Internal_Sym * best = NULL;
4d6ed7c8 7259
0b6ae522 7260 REMOVE_ARCH_BITS (addr.offset);
948f632f
DA
7261 beg = symtab;
7262 end = symtab + nsyms;
0b6ae522 7263
948f632f 7264 while (beg < end)
4d6ed7c8 7265 {
948f632f
DA
7266 bfd_vma value;
7267
7268 sym = beg + (end - beg) / 2;
0b6ae522 7269
948f632f 7270 value = sym->st_value;
0b6ae522
DJ
7271 REMOVE_ARCH_BITS (value);
7272
948f632f 7273 if (sym->st_name != 0
4d6ed7c8 7274 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
0b6ae522
DJ
7275 && addr.offset >= value
7276 && addr.offset - value < dist)
4d6ed7c8
NC
7277 {
7278 best = sym;
0b6ae522 7279 dist = addr.offset - value;
4d6ed7c8
NC
7280 if (!dist)
7281 break;
7282 }
948f632f
DA
7283
7284 if (addr.offset < value)
7285 end = sym;
7286 else
7287 beg = sym + 1;
4d6ed7c8 7288 }
1b31d05e 7289
4d6ed7c8
NC
7290 if (best)
7291 {
57346661 7292 *symname = (best->st_name >= strtab_size
2b692964 7293 ? _("<corrupt>") : strtab + best->st_name);
4d6ed7c8
NC
7294 *offset = dist;
7295 return;
7296 }
1b31d05e 7297
4d6ed7c8
NC
7298 *symname = NULL;
7299 *offset = addr.offset;
7300}
7301
32ec8896 7302static /* signed */ int
948f632f
DA
7303symcmp (const void *p, const void *q)
7304{
7305 Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
7306 Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
7307
7308 return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
7309}
7310
7311/* Process the unwind section. */
7312
7313#include "unwind-ia64.h"
7314
7315struct ia64_unw_table_entry
7316{
7317 struct absaddr start;
7318 struct absaddr end;
7319 struct absaddr info;
7320};
7321
7322struct ia64_unw_aux_info
7323{
32ec8896
NC
7324 struct ia64_unw_table_entry * table; /* Unwind table. */
7325 unsigned long table_len; /* Length of unwind table. */
7326 unsigned char * info; /* Unwind info. */
7327 unsigned long info_size; /* Size of unwind info. */
7328 bfd_vma info_addr; /* Starting address of unwind info. */
7329 bfd_vma seg_base; /* Starting address of segment. */
7330 Elf_Internal_Sym * symtab; /* The symbol table. */
7331 unsigned long nsyms; /* Number of symbols. */
7332 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7333 unsigned long nfuns; /* Number of entries in funtab. */
7334 char * strtab; /* The string table. */
7335 unsigned long strtab_size; /* Size of string table. */
948f632f
DA
7336};
7337
32ec8896 7338static bfd_boolean
dda8d76d 7339dump_ia64_unwind (Filedata * filedata, struct ia64_unw_aux_info * aux)
4d6ed7c8 7340{
2cf0635d 7341 struct ia64_unw_table_entry * tp;
948f632f 7342 unsigned long j, nfuns;
4d6ed7c8 7343 int in_body;
32ec8896 7344 bfd_boolean res = TRUE;
7036c0e1 7345
948f632f
DA
7346 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7347 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7348 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7349 aux->funtab[nfuns++] = aux->symtab[j];
7350 aux->nfuns = nfuns;
7351 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7352
4d6ed7c8
NC
7353 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7354 {
7355 bfd_vma stamp;
7356 bfd_vma offset;
2cf0635d
NC
7357 const unsigned char * dp;
7358 const unsigned char * head;
53774b7e 7359 const unsigned char * end;
2cf0635d 7360 const char * procname;
4d6ed7c8 7361
dda8d76d 7362 find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
57346661 7363 aux->strtab_size, tp->start, &procname, &offset);
4d6ed7c8
NC
7364
7365 fputs ("\n<", stdout);
7366
7367 if (procname)
7368 {
7369 fputs (procname, stdout);
7370
7371 if (offset)
7372 printf ("+%lx", (unsigned long) offset);
7373 }
7374
7375 fputs (">: [", stdout);
7376 print_vma (tp->start.offset, PREFIX_HEX);
7377 fputc ('-', stdout);
7378 print_vma (tp->end.offset, PREFIX_HEX);
86f55779 7379 printf ("], info at +0x%lx\n",
4d6ed7c8
NC
7380 (unsigned long) (tp->info.offset - aux->seg_base));
7381
53774b7e
NC
7382 /* PR 17531: file: 86232b32. */
7383 if (aux->info == NULL)
7384 continue;
7385
7386 /* PR 17531: file: 0997b4d1. */
7387 if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
7388 {
7389 warn (_("Invalid offset %lx in table entry %ld\n"),
7390 (long) tp->info.offset, (long) (tp - aux->table));
32ec8896 7391 res = FALSE;
53774b7e
NC
7392 continue;
7393 }
7394
1949de15 7395 head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
a4a00738 7396 stamp = byte_get ((unsigned char *) head, sizeof (stamp));
4d6ed7c8 7397
86f55779 7398 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4d6ed7c8
NC
7399 (unsigned) UNW_VER (stamp),
7400 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
7401 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
7402 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
89fac5e3 7403 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
4d6ed7c8
NC
7404
7405 if (UNW_VER (stamp) != 1)
7406 {
2b692964 7407 printf (_("\tUnknown version.\n"));
4d6ed7c8
NC
7408 continue;
7409 }
7410
7411 in_body = 0;
53774b7e
NC
7412 end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
7413 /* PR 17531: file: 16ceda89. */
7414 if (end > aux->info + aux->info_size)
7415 end = aux->info + aux->info_size;
7416 for (dp = head + 8; dp < end;)
b4477bc8 7417 dp = unw_decode (dp, in_body, & in_body, end);
4d6ed7c8 7418 }
948f632f
DA
7419
7420 free (aux->funtab);
32ec8896
NC
7421
7422 return res;
4d6ed7c8
NC
7423}
7424
53774b7e 7425static bfd_boolean
dda8d76d
NC
7426slurp_ia64_unwind_table (Filedata * filedata,
7427 struct ia64_unw_aux_info * aux,
7428 Elf_Internal_Shdr * sec)
4d6ed7c8 7429{
89fac5e3 7430 unsigned long size, nrelas, i;
2cf0635d
NC
7431 Elf_Internal_Phdr * seg;
7432 struct ia64_unw_table_entry * tep;
7433 Elf_Internal_Shdr * relsec;
7434 Elf_Internal_Rela * rela;
7435 Elf_Internal_Rela * rp;
7436 unsigned char * table;
7437 unsigned char * tp;
7438 Elf_Internal_Sym * sym;
7439 const char * relname;
4d6ed7c8 7440
53774b7e
NC
7441 aux->table_len = 0;
7442
4d6ed7c8
NC
7443 /* First, find the starting address of the segment that includes
7444 this section: */
7445
dda8d76d 7446 if (filedata->file_header.e_phnum)
4d6ed7c8 7447 {
dda8d76d 7448 if (! get_program_headers (filedata))
53774b7e 7449 return FALSE;
4d6ed7c8 7450
dda8d76d
NC
7451 for (seg = filedata->program_headers;
7452 seg < filedata->program_headers + filedata->file_header.e_phnum;
d93f0186 7453 ++seg)
4d6ed7c8
NC
7454 {
7455 if (seg->p_type != PT_LOAD)
7456 continue;
7457
7458 if (sec->sh_addr >= seg->p_vaddr
7459 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7460 {
7461 aux->seg_base = seg->p_vaddr;
7462 break;
7463 }
7464 }
4d6ed7c8
NC
7465 }
7466
7467 /* Second, build the unwind table from the contents of the unwind section: */
7468 size = sec->sh_size;
dda8d76d 7469 table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
3f5e193b 7470 _("unwind table"));
a6e9f9df 7471 if (!table)
53774b7e 7472 return FALSE;
4d6ed7c8 7473
53774b7e 7474 aux->table_len = size / (3 * eh_addr_size);
3f5e193b 7475 aux->table = (struct ia64_unw_table_entry *)
53774b7e 7476 xcmalloc (aux->table_len, sizeof (aux->table[0]));
89fac5e3 7477 tep = aux->table;
53774b7e
NC
7478
7479 for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
4d6ed7c8
NC
7480 {
7481 tep->start.section = SHN_UNDEF;
7482 tep->end.section = SHN_UNDEF;
7483 tep->info.section = SHN_UNDEF;
c6a0c689
AM
7484 tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7485 tep->end.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7486 tep->info.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
4d6ed7c8
NC
7487 tep->start.offset += aux->seg_base;
7488 tep->end.offset += aux->seg_base;
7489 tep->info.offset += aux->seg_base;
7490 }
7491 free (table);
7492
41e92641 7493 /* Third, apply any relocations to the unwind table: */
dda8d76d
NC
7494 for (relsec = filedata->section_headers;
7495 relsec < filedata->section_headers + filedata->file_header.e_shnum;
4d6ed7c8
NC
7496 ++relsec)
7497 {
7498 if (relsec->sh_type != SHT_RELA
dda8d76d
NC
7499 || relsec->sh_info >= filedata->file_header.e_shnum
7500 || filedata->section_headers + relsec->sh_info != sec)
4d6ed7c8
NC
7501 continue;
7502
dda8d76d 7503 if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
4d6ed7c8 7504 & rela, & nrelas))
53774b7e
NC
7505 {
7506 free (aux->table);
7507 aux->table = NULL;
7508 aux->table_len = 0;
7509 return FALSE;
7510 }
4d6ed7c8
NC
7511
7512 for (rp = rela; rp < rela + nrelas; ++rp)
7513 {
dda8d76d 7514 relname = elf_ia64_reloc_type (get_reloc_type (filedata, rp->r_info));
aca88567 7515 sym = aux->symtab + get_reloc_symindex (rp->r_info);
4d6ed7c8 7516
82b1b41b
NC
7517 /* PR 17531: file: 9fa67536. */
7518 if (relname == NULL)
7519 {
dda8d76d
NC
7520 warn (_("Skipping unknown relocation type: %u\n"),
7521 get_reloc_type (filedata, rp->r_info));
82b1b41b
NC
7522 continue;
7523 }
948f632f 7524
0112cd26 7525 if (! const_strneq (relname, "R_IA64_SEGREL"))
4d6ed7c8 7526 {
82b1b41b 7527 warn (_("Skipping unexpected relocation type: %s\n"), relname);
4d6ed7c8
NC
7528 continue;
7529 }
7530
89fac5e3 7531 i = rp->r_offset / (3 * eh_addr_size);
4d6ed7c8 7532
53774b7e
NC
7533 /* PR 17531: file: 5bc8d9bf. */
7534 if (i >= aux->table_len)
7535 {
7536 warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
7537 continue;
7538 }
7539
7540 switch (rp->r_offset / eh_addr_size % 3)
4d6ed7c8
NC
7541 {
7542 case 0:
7543 aux->table[i].start.section = sym->st_shndx;
e466bc6e 7544 aux->table[i].start.offset = rp->r_addend + sym->st_value;
4d6ed7c8
NC
7545 break;
7546 case 1:
7547 aux->table[i].end.section = sym->st_shndx;
e466bc6e 7548 aux->table[i].end.offset = rp->r_addend + sym->st_value;
4d6ed7c8
NC
7549 break;
7550 case 2:
7551 aux->table[i].info.section = sym->st_shndx;
e466bc6e 7552 aux->table[i].info.offset = rp->r_addend + sym->st_value;
4d6ed7c8
NC
7553 break;
7554 default:
7555 break;
7556 }
7557 }
7558
7559 free (rela);
7560 }
7561
53774b7e 7562 return TRUE;
4d6ed7c8
NC
7563}
7564
32ec8896 7565static bfd_boolean
dda8d76d 7566ia64_process_unwind (Filedata * filedata)
4d6ed7c8 7567{
2cf0635d
NC
7568 Elf_Internal_Shdr * sec;
7569 Elf_Internal_Shdr * unwsec = NULL;
7570 Elf_Internal_Shdr * strsec;
89fac5e3 7571 unsigned long i, unwcount = 0, unwstart = 0;
57346661 7572 struct ia64_unw_aux_info aux;
32ec8896 7573 bfd_boolean res = TRUE;
f1467e33 7574
4d6ed7c8
NC
7575 memset (& aux, 0, sizeof (aux));
7576
dda8d76d 7577 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
4d6ed7c8 7578 {
c256ffe7 7579 if (sec->sh_type == SHT_SYMTAB
dda8d76d 7580 && sec->sh_link < filedata->file_header.e_shnum)
4d6ed7c8 7581 {
dda8d76d 7582 aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
4d6ed7c8 7583
dda8d76d 7584 strsec = filedata->section_headers + sec->sh_link;
4082ef84
NC
7585 if (aux.strtab != NULL)
7586 {
7587 error (_("Multiple auxillary string tables encountered\n"));
7588 free (aux.strtab);
32ec8896 7589 res = FALSE;
4082ef84 7590 }
dda8d76d 7591 aux.strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
3f5e193b
NC
7592 1, strsec->sh_size,
7593 _("string table"));
c256ffe7 7594 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
4d6ed7c8
NC
7595 }
7596 else if (sec->sh_type == SHT_IA_64_UNWIND)
579f31ac
JJ
7597 unwcount++;
7598 }
7599
7600 if (!unwcount)
7601 printf (_("\nThere are no unwind sections in this file.\n"));
7602
7603 while (unwcount-- > 0)
7604 {
2cf0635d 7605 char * suffix;
579f31ac
JJ
7606 size_t len, len2;
7607
dda8d76d
NC
7608 for (i = unwstart, sec = filedata->section_headers + unwstart, unwsec = NULL;
7609 i < filedata->file_header.e_shnum; ++i, ++sec)
579f31ac
JJ
7610 if (sec->sh_type == SHT_IA_64_UNWIND)
7611 {
7612 unwsec = sec;
7613 break;
7614 }
4082ef84
NC
7615 /* We have already counted the number of SHT_IA64_UNWIND
7616 sections so the loop above should never fail. */
7617 assert (unwsec != NULL);
579f31ac
JJ
7618
7619 unwstart = i + 1;
7620 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
7621
e4b17d5c
L
7622 if ((unwsec->sh_flags & SHF_GROUP) != 0)
7623 {
7624 /* We need to find which section group it is in. */
4082ef84 7625 struct group_list * g;
e4b17d5c 7626
4082ef84
NC
7627 if (section_headers_groups == NULL
7628 || section_headers_groups [i] == NULL)
dda8d76d 7629 i = filedata->file_header.e_shnum;
4082ef84 7630 else
e4b17d5c 7631 {
4082ef84 7632 g = section_headers_groups [i]->root;
18bd398b 7633
4082ef84
NC
7634 for (; g != NULL; g = g->next)
7635 {
dda8d76d 7636 sec = filedata->section_headers + g->section_index;
e4b17d5c 7637
4082ef84
NC
7638 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
7639 break;
7640 }
7641
7642 if (g == NULL)
dda8d76d 7643 i = filedata->file_header.e_shnum;
4082ef84 7644 }
e4b17d5c 7645 }
18bd398b 7646 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
579f31ac 7647 {
18bd398b 7648 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
579f31ac
JJ
7649 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
7650 suffix = SECTION_NAME (unwsec) + len;
dda8d76d 7651 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum;
579f31ac 7652 ++i, ++sec)
18bd398b
NC
7653 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
7654 && streq (SECTION_NAME (sec) + len2, suffix))
579f31ac
JJ
7655 break;
7656 }
7657 else
7658 {
7659 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
18bd398b 7660 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
579f31ac
JJ
7661 len = sizeof (ELF_STRING_ia64_unwind) - 1;
7662 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
7663 suffix = "";
18bd398b 7664 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
579f31ac 7665 suffix = SECTION_NAME (unwsec) + len;
dda8d76d 7666 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum;
579f31ac 7667 ++i, ++sec)
18bd398b
NC
7668 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
7669 && streq (SECTION_NAME (sec) + len2, suffix))
579f31ac
JJ
7670 break;
7671 }
7672
dda8d76d 7673 if (i == filedata->file_header.e_shnum)
579f31ac
JJ
7674 {
7675 printf (_("\nCould not find unwind info section for "));
7676
dda8d76d 7677 if (filedata->string_table == NULL)
579f31ac
JJ
7678 printf ("%d", unwsec->sh_name);
7679 else
dda8d76d 7680 printf ("'%s'", printable_section_name (filedata, unwsec));
579f31ac
JJ
7681 }
7682 else
4d6ed7c8 7683 {
4d6ed7c8 7684 aux.info_addr = sec->sh_addr;
dda8d76d 7685 aux.info = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1,
4082ef84
NC
7686 sec->sh_size,
7687 _("unwind info"));
59245841 7688 aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
4d6ed7c8 7689
579f31ac 7690 printf (_("\nUnwind section "));
4d6ed7c8 7691
dda8d76d 7692 if (filedata->string_table == NULL)
579f31ac
JJ
7693 printf ("%d", unwsec->sh_name);
7694 else
dda8d76d 7695 printf ("'%s'", printable_section_name (filedata, unwsec));
4d6ed7c8 7696
579f31ac 7697 printf (_(" at offset 0x%lx contains %lu entries:\n"),
e59b4dfb 7698 (unsigned long) unwsec->sh_offset,
89fac5e3 7699 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
4d6ed7c8 7700
dda8d76d 7701 if (slurp_ia64_unwind_table (filedata, & aux, unwsec)
53774b7e 7702 && aux.table_len > 0)
dda8d76d 7703 dump_ia64_unwind (filedata, & aux);
579f31ac
JJ
7704
7705 if (aux.table)
7706 free ((char *) aux.table);
7707 if (aux.info)
7708 free ((char *) aux.info);
7709 aux.table = NULL;
7710 aux.info = NULL;
7711 }
4d6ed7c8 7712 }
4d6ed7c8 7713
4d6ed7c8
NC
7714 if (aux.symtab)
7715 free (aux.symtab);
7716 if (aux.strtab)
7717 free ((char *) aux.strtab);
32ec8896
NC
7718
7719 return res;
4d6ed7c8
NC
7720}
7721
3f5e193b 7722struct hppa_unw_table_entry
32ec8896
NC
7723{
7724 struct absaddr start;
7725 struct absaddr end;
7726 unsigned int Cannot_unwind:1; /* 0 */
7727 unsigned int Millicode:1; /* 1 */
7728 unsigned int Millicode_save_sr0:1; /* 2 */
7729 unsigned int Region_description:2; /* 3..4 */
7730 unsigned int reserved1:1; /* 5 */
7731 unsigned int Entry_SR:1; /* 6 */
7732 unsigned int Entry_FR:4; /* Number saved 7..10 */
7733 unsigned int Entry_GR:5; /* Number saved 11..15 */
7734 unsigned int Args_stored:1; /* 16 */
7735 unsigned int Variable_Frame:1; /* 17 */
7736 unsigned int Separate_Package_Body:1; /* 18 */
7737 unsigned int Frame_Extension_Millicode:1; /* 19 */
7738 unsigned int Stack_Overflow_Check:1; /* 20 */
7739 unsigned int Two_Instruction_SP_Increment:1; /* 21 */
7740 unsigned int Ada_Region:1; /* 22 */
7741 unsigned int cxx_info:1; /* 23 */
7742 unsigned int cxx_try_catch:1; /* 24 */
7743 unsigned int sched_entry_seq:1; /* 25 */
7744 unsigned int reserved2:1; /* 26 */
7745 unsigned int Save_SP:1; /* 27 */
7746 unsigned int Save_RP:1; /* 28 */
7747 unsigned int Save_MRP_in_frame:1; /* 29 */
7748 unsigned int extn_ptr_defined:1; /* 30 */
7749 unsigned int Cleanup_defined:1; /* 31 */
7750
7751 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
7752 unsigned int HP_UX_interrupt_marker:1; /* 1 */
7753 unsigned int Large_frame:1; /* 2 */
7754 unsigned int Pseudo_SP_Set:1; /* 3 */
7755 unsigned int reserved4:1; /* 4 */
7756 unsigned int Total_frame_size:27; /* 5..31 */
7757};
3f5e193b 7758
57346661 7759struct hppa_unw_aux_info
948f632f 7760{
32ec8896
NC
7761 struct hppa_unw_table_entry * table; /* Unwind table. */
7762 unsigned long table_len; /* Length of unwind table. */
7763 bfd_vma seg_base; /* Starting address of segment. */
7764 Elf_Internal_Sym * symtab; /* The symbol table. */
7765 unsigned long nsyms; /* Number of symbols. */
7766 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7767 unsigned long nfuns; /* Number of entries in funtab. */
7768 char * strtab; /* The string table. */
7769 unsigned long strtab_size; /* Size of string table. */
948f632f 7770};
57346661 7771
32ec8896 7772static bfd_boolean
dda8d76d 7773dump_hppa_unwind (Filedata * filedata, struct hppa_unw_aux_info * aux)
57346661 7774{
2cf0635d 7775 struct hppa_unw_table_entry * tp;
948f632f 7776 unsigned long j, nfuns;
32ec8896 7777 bfd_boolean res = TRUE;
948f632f
DA
7778
7779 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7780 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7781 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7782 aux->funtab[nfuns++] = aux->symtab[j];
7783 aux->nfuns = nfuns;
7784 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
57346661 7785
57346661
AM
7786 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7787 {
7788 bfd_vma offset;
2cf0635d 7789 const char * procname;
57346661 7790
dda8d76d 7791 find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
57346661
AM
7792 aux->strtab_size, tp->start, &procname,
7793 &offset);
7794
7795 fputs ("\n<", stdout);
7796
7797 if (procname)
7798 {
7799 fputs (procname, stdout);
7800
7801 if (offset)
7802 printf ("+%lx", (unsigned long) offset);
7803 }
7804
7805 fputs (">: [", stdout);
7806 print_vma (tp->start.offset, PREFIX_HEX);
7807 fputc ('-', stdout);
7808 print_vma (tp->end.offset, PREFIX_HEX);
7809 printf ("]\n\t");
7810
18bd398b
NC
7811#define PF(_m) if (tp->_m) printf (#_m " ");
7812#define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
57346661
AM
7813 PF(Cannot_unwind);
7814 PF(Millicode);
7815 PF(Millicode_save_sr0);
18bd398b 7816 /* PV(Region_description); */
57346661
AM
7817 PF(Entry_SR);
7818 PV(Entry_FR);
7819 PV(Entry_GR);
7820 PF(Args_stored);
7821 PF(Variable_Frame);
7822 PF(Separate_Package_Body);
7823 PF(Frame_Extension_Millicode);
7824 PF(Stack_Overflow_Check);
7825 PF(Two_Instruction_SP_Increment);
7826 PF(Ada_Region);
7827 PF(cxx_info);
7828 PF(cxx_try_catch);
7829 PF(sched_entry_seq);
7830 PF(Save_SP);
7831 PF(Save_RP);
7832 PF(Save_MRP_in_frame);
7833 PF(extn_ptr_defined);
7834 PF(Cleanup_defined);
7835 PF(MPE_XL_interrupt_marker);
7836 PF(HP_UX_interrupt_marker);
7837 PF(Large_frame);
7838 PF(Pseudo_SP_Set);
7839 PV(Total_frame_size);
7840#undef PF
7841#undef PV
7842 }
7843
18bd398b 7844 printf ("\n");
948f632f
DA
7845
7846 free (aux->funtab);
32ec8896
NC
7847
7848 return res;
57346661
AM
7849}
7850
32ec8896 7851static bfd_boolean
dda8d76d
NC
7852slurp_hppa_unwind_table (Filedata * filedata,
7853 struct hppa_unw_aux_info * aux,
7854 Elf_Internal_Shdr * sec)
57346661 7855{
1c0751b2 7856 unsigned long size, unw_ent_size, nentries, nrelas, i;
2cf0635d
NC
7857 Elf_Internal_Phdr * seg;
7858 struct hppa_unw_table_entry * tep;
7859 Elf_Internal_Shdr * relsec;
7860 Elf_Internal_Rela * rela;
7861 Elf_Internal_Rela * rp;
7862 unsigned char * table;
7863 unsigned char * tp;
7864 Elf_Internal_Sym * sym;
7865 const char * relname;
57346661 7866
57346661
AM
7867 /* First, find the starting address of the segment that includes
7868 this section. */
dda8d76d 7869 if (filedata->file_header.e_phnum)
57346661 7870 {
dda8d76d 7871 if (! get_program_headers (filedata))
32ec8896 7872 return FALSE;
57346661 7873
dda8d76d
NC
7874 for (seg = filedata->program_headers;
7875 seg < filedata->program_headers + filedata->file_header.e_phnum;
57346661
AM
7876 ++seg)
7877 {
7878 if (seg->p_type != PT_LOAD)
7879 continue;
7880
7881 if (sec->sh_addr >= seg->p_vaddr
7882 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7883 {
7884 aux->seg_base = seg->p_vaddr;
7885 break;
7886 }
7887 }
7888 }
7889
7890 /* Second, build the unwind table from the contents of the unwind
7891 section. */
7892 size = sec->sh_size;
dda8d76d 7893 table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
3f5e193b 7894 _("unwind table"));
57346661 7895 if (!table)
32ec8896 7896 return FALSE;
57346661 7897
1c0751b2
DA
7898 unw_ent_size = 16;
7899 nentries = size / unw_ent_size;
7900 size = unw_ent_size * nentries;
57346661 7901
3f5e193b
NC
7902 tep = aux->table = (struct hppa_unw_table_entry *)
7903 xcmalloc (nentries, sizeof (aux->table[0]));
57346661 7904
1c0751b2 7905 for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
57346661
AM
7906 {
7907 unsigned int tmp1, tmp2;
7908
7909 tep->start.section = SHN_UNDEF;
7910 tep->end.section = SHN_UNDEF;
7911
1c0751b2
DA
7912 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
7913 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
7914 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
7915 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
7916
7917 tep->start.offset += aux->seg_base;
7918 tep->end.offset += aux->seg_base;
57346661
AM
7919
7920 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
7921 tep->Millicode = (tmp1 >> 30) & 0x1;
7922 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
7923 tep->Region_description = (tmp1 >> 27) & 0x3;
7924 tep->reserved1 = (tmp1 >> 26) & 0x1;
7925 tep->Entry_SR = (tmp1 >> 25) & 0x1;
7926 tep->Entry_FR = (tmp1 >> 21) & 0xf;
7927 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
7928 tep->Args_stored = (tmp1 >> 15) & 0x1;
7929 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
7930 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
7931 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
7932 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
7933 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
7934 tep->Ada_Region = (tmp1 >> 9) & 0x1;
7935 tep->cxx_info = (tmp1 >> 8) & 0x1;
7936 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
7937 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
7938 tep->reserved2 = (tmp1 >> 5) & 0x1;
7939 tep->Save_SP = (tmp1 >> 4) & 0x1;
7940 tep->Save_RP = (tmp1 >> 3) & 0x1;
7941 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
7942 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
7943 tep->Cleanup_defined = tmp1 & 0x1;
7944
7945 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
7946 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
7947 tep->Large_frame = (tmp2 >> 29) & 0x1;
7948 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
7949 tep->reserved4 = (tmp2 >> 27) & 0x1;
7950 tep->Total_frame_size = tmp2 & 0x7ffffff;
57346661
AM
7951 }
7952 free (table);
7953
7954 /* Third, apply any relocations to the unwind table. */
dda8d76d
NC
7955 for (relsec = filedata->section_headers;
7956 relsec < filedata->section_headers + filedata->file_header.e_shnum;
57346661
AM
7957 ++relsec)
7958 {
7959 if (relsec->sh_type != SHT_RELA
dda8d76d
NC
7960 || relsec->sh_info >= filedata->file_header.e_shnum
7961 || filedata->section_headers + relsec->sh_info != sec)
57346661
AM
7962 continue;
7963
dda8d76d 7964 if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
57346661 7965 & rela, & nrelas))
32ec8896 7966 return FALSE;
57346661
AM
7967
7968 for (rp = rela; rp < rela + nrelas; ++rp)
7969 {
dda8d76d 7970 relname = elf_hppa_reloc_type (get_reloc_type (filedata, rp->r_info));
aca88567 7971 sym = aux->symtab + get_reloc_symindex (rp->r_info);
57346661
AM
7972
7973 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
0112cd26 7974 if (! const_strneq (relname, "R_PARISC_SEGREL"))
57346661
AM
7975 {
7976 warn (_("Skipping unexpected relocation type %s\n"), relname);
7977 continue;
7978 }
7979
7980 i = rp->r_offset / unw_ent_size;
7981
89fac5e3 7982 switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
57346661
AM
7983 {
7984 case 0:
7985 aux->table[i].start.section = sym->st_shndx;
1e456d54 7986 aux->table[i].start.offset = sym->st_value + rp->r_addend;
57346661
AM
7987 break;
7988 case 1:
7989 aux->table[i].end.section = sym->st_shndx;
1e456d54 7990 aux->table[i].end.offset = sym->st_value + rp->r_addend;
57346661
AM
7991 break;
7992 default:
7993 break;
7994 }
7995 }
7996
7997 free (rela);
7998 }
7999
1c0751b2 8000 aux->table_len = nentries;
57346661 8001
32ec8896 8002 return TRUE;
57346661
AM
8003}
8004
32ec8896 8005static bfd_boolean
dda8d76d 8006hppa_process_unwind (Filedata * filedata)
57346661 8007{
57346661 8008 struct hppa_unw_aux_info aux;
2cf0635d
NC
8009 Elf_Internal_Shdr * unwsec = NULL;
8010 Elf_Internal_Shdr * strsec;
8011 Elf_Internal_Shdr * sec;
18bd398b 8012 unsigned long i;
32ec8896 8013 bfd_boolean res = TRUE;
57346661 8014
dda8d76d 8015 if (filedata->string_table == NULL)
32ec8896 8016 return FALSE;
1b31d05e
NC
8017
8018 memset (& aux, 0, sizeof (aux));
57346661 8019
dda8d76d 8020 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
57346661 8021 {
c256ffe7 8022 if (sec->sh_type == SHT_SYMTAB
dda8d76d 8023 && sec->sh_link < filedata->file_header.e_shnum)
57346661 8024 {
dda8d76d 8025 aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
57346661 8026
dda8d76d 8027 strsec = filedata->section_headers + sec->sh_link;
4082ef84
NC
8028 if (aux.strtab != NULL)
8029 {
8030 error (_("Multiple auxillary string tables encountered\n"));
8031 free (aux.strtab);
32ec8896 8032 res = FALSE;
4082ef84 8033 }
dda8d76d 8034 aux.strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
3f5e193b
NC
8035 1, strsec->sh_size,
8036 _("string table"));
c256ffe7 8037 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
57346661 8038 }
18bd398b 8039 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
57346661
AM
8040 unwsec = sec;
8041 }
8042
8043 if (!unwsec)
8044 printf (_("\nThere are no unwind sections in this file.\n"));
8045
dda8d76d 8046 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
57346661 8047 {
18bd398b 8048 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
57346661 8049 {
d3a49aa8 8050 unsigned long num_unwind = sec->sh_size / (2 * eh_addr_size + 8);
dda8d76d 8051
d3a49aa8
AM
8052 printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
8053 "contains %lu entry:\n",
8054 "\nUnwind section '%s' at offset 0x%lx "
8055 "contains %lu entries:\n",
8056 num_unwind),
dda8d76d 8057 printable_section_name (filedata, sec),
57346661 8058 (unsigned long) sec->sh_offset,
d3a49aa8 8059 num_unwind);
57346661 8060
dda8d76d 8061 if (! slurp_hppa_unwind_table (filedata, &aux, sec))
32ec8896
NC
8062 res = FALSE;
8063
57346661 8064 if (aux.table_len > 0)
32ec8896 8065 {
dda8d76d 8066 if (! dump_hppa_unwind (filedata, &aux))
32ec8896
NC
8067 res = FALSE;
8068 }
57346661
AM
8069
8070 if (aux.table)
8071 free ((char *) aux.table);
8072 aux.table = NULL;
8073 }
8074 }
8075
8076 if (aux.symtab)
8077 free (aux.symtab);
8078 if (aux.strtab)
8079 free ((char *) aux.strtab);
32ec8896
NC
8080
8081 return res;
57346661
AM
8082}
8083
0b6ae522
DJ
8084struct arm_section
8085{
a734115a
NC
8086 unsigned char * data; /* The unwind data. */
8087 Elf_Internal_Shdr * sec; /* The cached unwind section header. */
8088 Elf_Internal_Rela * rela; /* The cached relocations for this section. */
8089 unsigned long nrelas; /* The number of relocations. */
8090 unsigned int rel_type; /* REL or RELA ? */
8091 Elf_Internal_Rela * next_rela; /* Cyclic pointer to the next reloc to process. */
0b6ae522
DJ
8092};
8093
8094struct arm_unw_aux_info
8095{
dda8d76d 8096 Filedata * filedata; /* The file containing the unwind sections. */
a734115a
NC
8097 Elf_Internal_Sym * symtab; /* The file's symbol table. */
8098 unsigned long nsyms; /* Number of symbols. */
948f632f
DA
8099 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
8100 unsigned long nfuns; /* Number of these symbols. */
a734115a
NC
8101 char * strtab; /* The file's string table. */
8102 unsigned long strtab_size; /* Size of string table. */
0b6ae522
DJ
8103};
8104
8105static const char *
dda8d76d
NC
8106arm_print_vma_and_name (Filedata * filedata,
8107 struct arm_unw_aux_info * aux,
8108 bfd_vma fn,
8109 struct absaddr addr)
0b6ae522
DJ
8110{
8111 const char *procname;
8112 bfd_vma sym_offset;
8113
8114 if (addr.section == SHN_UNDEF)
8115 addr.offset = fn;
8116
dda8d76d 8117 find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
0b6ae522
DJ
8118 aux->strtab_size, addr, &procname,
8119 &sym_offset);
8120
8121 print_vma (fn, PREFIX_HEX);
8122
8123 if (procname)
8124 {
8125 fputs (" <", stdout);
8126 fputs (procname, stdout);
8127
8128 if (sym_offset)
8129 printf ("+0x%lx", (unsigned long) sym_offset);
8130 fputc ('>', stdout);
8131 }
8132
8133 return procname;
8134}
8135
8136static void
8137arm_free_section (struct arm_section *arm_sec)
8138{
8139 if (arm_sec->data != NULL)
8140 free (arm_sec->data);
8141
8142 if (arm_sec->rela != NULL)
8143 free (arm_sec->rela);
8144}
8145
a734115a
NC
8146/* 1) If SEC does not match the one cached in ARM_SEC, then free the current
8147 cached section and install SEC instead.
8148 2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
8149 and return its valued in * WORDP, relocating if necessary.
1b31d05e 8150 3) Update the NEXT_RELA field in ARM_SEC and store the section index and
a734115a 8151 relocation's offset in ADDR.
1b31d05e
NC
8152 4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
8153 into the string table of the symbol associated with the reloc. If no
8154 reloc was applied store -1 there.
8155 5) Return TRUE upon success, FALSE otherwise. */
a734115a
NC
8156
8157static bfd_boolean
dda8d76d
NC
8158get_unwind_section_word (Filedata * filedata,
8159 struct arm_unw_aux_info * aux,
1b31d05e
NC
8160 struct arm_section * arm_sec,
8161 Elf_Internal_Shdr * sec,
8162 bfd_vma word_offset,
8163 unsigned int * wordp,
8164 struct absaddr * addr,
8165 bfd_vma * sym_name)
0b6ae522
DJ
8166{
8167 Elf_Internal_Rela *rp;
8168 Elf_Internal_Sym *sym;
8169 const char * relname;
8170 unsigned int word;
8171 bfd_boolean wrapped;
8172
e0a31db1
NC
8173 if (sec == NULL || arm_sec == NULL)
8174 return FALSE;
8175
0b6ae522
DJ
8176 addr->section = SHN_UNDEF;
8177 addr->offset = 0;
8178
1b31d05e
NC
8179 if (sym_name != NULL)
8180 *sym_name = (bfd_vma) -1;
8181
a734115a 8182 /* If necessary, update the section cache. */
0b6ae522
DJ
8183 if (sec != arm_sec->sec)
8184 {
8185 Elf_Internal_Shdr *relsec;
8186
8187 arm_free_section (arm_sec);
8188
8189 arm_sec->sec = sec;
dda8d76d 8190 arm_sec->data = get_data (NULL, aux->filedata, sec->sh_offset, 1,
0b6ae522 8191 sec->sh_size, _("unwind data"));
0b6ae522
DJ
8192 arm_sec->rela = NULL;
8193 arm_sec->nrelas = 0;
8194
dda8d76d
NC
8195 for (relsec = filedata->section_headers;
8196 relsec < filedata->section_headers + filedata->file_header.e_shnum;
0b6ae522
DJ
8197 ++relsec)
8198 {
dda8d76d
NC
8199 if (relsec->sh_info >= filedata->file_header.e_shnum
8200 || filedata->section_headers + relsec->sh_info != sec
1ae40aa4
NC
8201 /* PR 15745: Check the section type as well. */
8202 || (relsec->sh_type != SHT_REL
8203 && relsec->sh_type != SHT_RELA))
0b6ae522
DJ
8204 continue;
8205
a734115a 8206 arm_sec->rel_type = relsec->sh_type;
0b6ae522
DJ
8207 if (relsec->sh_type == SHT_REL)
8208 {
dda8d76d 8209 if (!slurp_rel_relocs (aux->filedata, relsec->sh_offset,
0b6ae522
DJ
8210 relsec->sh_size,
8211 & arm_sec->rela, & arm_sec->nrelas))
a734115a 8212 return FALSE;
0b6ae522 8213 }
1ae40aa4 8214 else /* relsec->sh_type == SHT_RELA */
0b6ae522 8215 {
dda8d76d 8216 if (!slurp_rela_relocs (aux->filedata, relsec->sh_offset,
0b6ae522
DJ
8217 relsec->sh_size,
8218 & arm_sec->rela, & arm_sec->nrelas))
a734115a 8219 return FALSE;
0b6ae522 8220 }
1ae40aa4 8221 break;
0b6ae522
DJ
8222 }
8223
8224 arm_sec->next_rela = arm_sec->rela;
8225 }
8226
a734115a 8227 /* If there is no unwind data we can do nothing. */
0b6ae522 8228 if (arm_sec->data == NULL)
a734115a 8229 return FALSE;
0b6ae522 8230
e0a31db1 8231 /* If the offset is invalid then fail. */
f32ba729
NC
8232 if (/* PR 21343 *//* PR 18879 */
8233 sec->sh_size < 4
8234 || word_offset > (sec->sh_size - 4)
1a915552 8235 || ((bfd_signed_vma) word_offset) < 0)
e0a31db1
NC
8236 return FALSE;
8237
a734115a 8238 /* Get the word at the required offset. */
0b6ae522
DJ
8239 word = byte_get (arm_sec->data + word_offset, 4);
8240
0eff7165
NC
8241 /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128. */
8242 if (arm_sec->rela == NULL)
8243 {
8244 * wordp = word;
8245 return TRUE;
8246 }
8247
a734115a 8248 /* Look through the relocs to find the one that applies to the provided offset. */
0b6ae522
DJ
8249 wrapped = FALSE;
8250 for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
8251 {
8252 bfd_vma prelval, offset;
8253
8254 if (rp->r_offset > word_offset && !wrapped)
8255 {
8256 rp = arm_sec->rela;
8257 wrapped = TRUE;
8258 }
8259 if (rp->r_offset > word_offset)
8260 break;
8261
8262 if (rp->r_offset & 3)
8263 {
8264 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
8265 (unsigned long) rp->r_offset);
8266 continue;
8267 }
8268
8269 if (rp->r_offset < word_offset)
8270 continue;
8271
74e1a04b
NC
8272 /* PR 17531: file: 027-161405-0.004 */
8273 if (aux->symtab == NULL)
8274 continue;
8275
0b6ae522
DJ
8276 if (arm_sec->rel_type == SHT_REL)
8277 {
8278 offset = word & 0x7fffffff;
8279 if (offset & 0x40000000)
8280 offset |= ~ (bfd_vma) 0x7fffffff;
8281 }
a734115a 8282 else if (arm_sec->rel_type == SHT_RELA)
0b6ae522 8283 offset = rp->r_addend;
a734115a 8284 else
74e1a04b
NC
8285 {
8286 error (_("Unknown section relocation type %d encountered\n"),
8287 arm_sec->rel_type);
8288 break;
8289 }
0b6ae522 8290
071436c6
NC
8291 /* PR 17531 file: 027-1241568-0.004. */
8292 if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
8293 {
8294 error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
8295 (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
8296 break;
8297 }
8298
8299 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
0b6ae522
DJ
8300 offset += sym->st_value;
8301 prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
8302
a734115a 8303 /* Check that we are processing the expected reloc type. */
dda8d76d 8304 if (filedata->file_header.e_machine == EM_ARM)
a734115a
NC
8305 {
8306 relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
071436c6
NC
8307 if (relname == NULL)
8308 {
8309 warn (_("Skipping unknown ARM relocation type: %d\n"),
8310 (int) ELF32_R_TYPE (rp->r_info));
8311 continue;
8312 }
a734115a
NC
8313
8314 if (streq (relname, "R_ARM_NONE"))
8315 continue;
0b4362b0 8316
a734115a
NC
8317 if (! streq (relname, "R_ARM_PREL31"))
8318 {
071436c6 8319 warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
a734115a
NC
8320 continue;
8321 }
8322 }
dda8d76d 8323 else if (filedata->file_header.e_machine == EM_TI_C6000)
a734115a
NC
8324 {
8325 relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
071436c6
NC
8326 if (relname == NULL)
8327 {
8328 warn (_("Skipping unknown C6000 relocation type: %d\n"),
8329 (int) ELF32_R_TYPE (rp->r_info));
8330 continue;
8331 }
0b4362b0 8332
a734115a
NC
8333 if (streq (relname, "R_C6000_NONE"))
8334 continue;
8335
8336 if (! streq (relname, "R_C6000_PREL31"))
8337 {
071436c6 8338 warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
a734115a
NC
8339 continue;
8340 }
8341
8342 prelval >>= 1;
8343 }
8344 else
74e1a04b
NC
8345 {
8346 /* This function currently only supports ARM and TI unwinders. */
8347 warn (_("Only TI and ARM unwinders are currently supported\n"));
8348 break;
8349 }
fa197c1c 8350
0b6ae522
DJ
8351 word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
8352 addr->section = sym->st_shndx;
8353 addr->offset = offset;
74e1a04b 8354
1b31d05e
NC
8355 if (sym_name)
8356 * sym_name = sym->st_name;
0b6ae522
DJ
8357 break;
8358 }
8359
8360 *wordp = word;
8361 arm_sec->next_rela = rp;
8362
a734115a 8363 return TRUE;
0b6ae522
DJ
8364}
8365
a734115a
NC
8366static const char *tic6x_unwind_regnames[16] =
8367{
0b4362b0
RM
8368 "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
8369 "A14", "A13", "A12", "A11", "A10",
a734115a
NC
8370 "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
8371};
fa197c1c 8372
0b6ae522 8373static void
fa197c1c 8374decode_tic6x_unwind_regmask (unsigned int mask)
0b6ae522 8375{
fa197c1c
PB
8376 int i;
8377
8378 for (i = 12; mask; mask >>= 1, i--)
8379 {
8380 if (mask & 1)
8381 {
8382 fputs (tic6x_unwind_regnames[i], stdout);
8383 if (mask > 1)
8384 fputs (", ", stdout);
8385 }
8386 }
8387}
0b6ae522
DJ
8388
8389#define ADVANCE \
8390 if (remaining == 0 && more_words) \
8391 { \
8392 data_offset += 4; \
dda8d76d 8393 if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec, \
1b31d05e 8394 data_offset, & word, & addr, NULL)) \
32ec8896 8395 return FALSE; \
0b6ae522
DJ
8396 remaining = 4; \
8397 more_words--; \
8398 } \
8399
8400#define GET_OP(OP) \
8401 ADVANCE; \
8402 if (remaining) \
8403 { \
8404 remaining--; \
8405 (OP) = word >> 24; \
8406 word <<= 8; \
8407 } \
8408 else \
8409 { \
2b692964 8410 printf (_("[Truncated opcode]\n")); \
32ec8896 8411 return FALSE; \
0b6ae522 8412 } \
cc5914eb 8413 printf ("0x%02x ", OP)
0b6ae522 8414
32ec8896 8415static bfd_boolean
dda8d76d
NC
8416decode_arm_unwind_bytecode (Filedata * filedata,
8417 struct arm_unw_aux_info * aux,
948f632f
DA
8418 unsigned int word,
8419 unsigned int remaining,
8420 unsigned int more_words,
8421 bfd_vma data_offset,
8422 Elf_Internal_Shdr * data_sec,
8423 struct arm_section * data_arm_sec)
fa197c1c
PB
8424{
8425 struct absaddr addr;
32ec8896 8426 bfd_boolean res = TRUE;
0b6ae522
DJ
8427
8428 /* Decode the unwinding instructions. */
8429 while (1)
8430 {
8431 unsigned int op, op2;
8432
8433 ADVANCE;
8434 if (remaining == 0)
8435 break;
8436 remaining--;
8437 op = word >> 24;
8438 word <<= 8;
8439
cc5914eb 8440 printf (" 0x%02x ", op);
0b6ae522
DJ
8441
8442 if ((op & 0xc0) == 0x00)
8443 {
8444 int offset = ((op & 0x3f) << 2) + 4;
61865e30 8445
cc5914eb 8446 printf (" vsp = vsp + %d", offset);
0b6ae522
DJ
8447 }
8448 else if ((op & 0xc0) == 0x40)
8449 {
8450 int offset = ((op & 0x3f) << 2) + 4;
61865e30 8451
cc5914eb 8452 printf (" vsp = vsp - %d", offset);
0b6ae522
DJ
8453 }
8454 else if ((op & 0xf0) == 0x80)
8455 {
8456 GET_OP (op2);
8457 if (op == 0x80 && op2 == 0)
8458 printf (_("Refuse to unwind"));
8459 else
8460 {
8461 unsigned int mask = ((op & 0x0f) << 8) | op2;
32ec8896 8462 bfd_boolean first = TRUE;
0b6ae522 8463 int i;
2b692964 8464
0b6ae522
DJ
8465 printf ("pop {");
8466 for (i = 0; i < 12; i++)
8467 if (mask & (1 << i))
8468 {
8469 if (first)
32ec8896 8470 first = FALSE;
0b6ae522
DJ
8471 else
8472 printf (", ");
8473 printf ("r%d", 4 + i);
8474 }
8475 printf ("}");
8476 }
8477 }
8478 else if ((op & 0xf0) == 0x90)
8479 {
8480 if (op == 0x9d || op == 0x9f)
8481 printf (_(" [Reserved]"));
8482 else
cc5914eb 8483 printf (" vsp = r%d", op & 0x0f);
0b6ae522
DJ
8484 }
8485 else if ((op & 0xf0) == 0xa0)
8486 {
8487 int end = 4 + (op & 0x07);
32ec8896 8488 bfd_boolean first = TRUE;
0b6ae522 8489 int i;
61865e30 8490
0b6ae522
DJ
8491 printf (" pop {");
8492 for (i = 4; i <= end; i++)
8493 {
8494 if (first)
32ec8896 8495 first = FALSE;
0b6ae522
DJ
8496 else
8497 printf (", ");
8498 printf ("r%d", i);
8499 }
8500 if (op & 0x08)
8501 {
1b31d05e 8502 if (!first)
0b6ae522
DJ
8503 printf (", ");
8504 printf ("r14");
8505 }
8506 printf ("}");
8507 }
8508 else if (op == 0xb0)
8509 printf (_(" finish"));
8510 else if (op == 0xb1)
8511 {
8512 GET_OP (op2);
8513 if (op2 == 0 || (op2 & 0xf0) != 0)
8514 printf (_("[Spare]"));
8515 else
8516 {
8517 unsigned int mask = op2 & 0x0f;
32ec8896 8518 bfd_boolean first = TRUE;
0b6ae522 8519 int i;
61865e30 8520
0b6ae522
DJ
8521 printf ("pop {");
8522 for (i = 0; i < 12; i++)
8523 if (mask & (1 << i))
8524 {
8525 if (first)
32ec8896 8526 first = FALSE;
0b6ae522
DJ
8527 else
8528 printf (", ");
8529 printf ("r%d", i);
8530 }
8531 printf ("}");
8532 }
8533 }
8534 else if (op == 0xb2)
8535 {
b115cf96 8536 unsigned char buf[9];
0b6ae522
DJ
8537 unsigned int i, len;
8538 unsigned long offset;
61865e30 8539
b115cf96 8540 for (i = 0; i < sizeof (buf); i++)
0b6ae522
DJ
8541 {
8542 GET_OP (buf[i]);
8543 if ((buf[i] & 0x80) == 0)
8544 break;
8545 }
4082ef84 8546 if (i == sizeof (buf))
32ec8896
NC
8547 {
8548 error (_("corrupt change to vsp"));
8549 res = FALSE;
8550 }
4082ef84
NC
8551 else
8552 {
8553 offset = read_uleb128 (buf, &len, buf + i + 1);
8554 assert (len == i + 1);
8555 offset = offset * 4 + 0x204;
8556 printf ("vsp = vsp + %ld", offset);
8557 }
0b6ae522 8558 }
61865e30 8559 else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
0b6ae522 8560 {
61865e30
NC
8561 unsigned int first, last;
8562
8563 GET_OP (op2);
8564 first = op2 >> 4;
8565 last = op2 & 0x0f;
8566 if (op == 0xc8)
8567 first = first + 16;
8568 printf ("pop {D%d", first);
8569 if (last)
8570 printf ("-D%d", first + last);
8571 printf ("}");
8572 }
8573 else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
8574 {
8575 unsigned int count = op & 0x07;
8576
8577 printf ("pop {D8");
8578 if (count)
8579 printf ("-D%d", 8 + count);
8580 printf ("}");
8581 }
8582 else if (op >= 0xc0 && op <= 0xc5)
8583 {
8584 unsigned int count = op & 0x07;
8585
8586 printf (" pop {wR10");
8587 if (count)
8588 printf ("-wR%d", 10 + count);
8589 printf ("}");
8590 }
8591 else if (op == 0xc6)
8592 {
8593 unsigned int first, last;
8594
8595 GET_OP (op2);
8596 first = op2 >> 4;
8597 last = op2 & 0x0f;
8598 printf ("pop {wR%d", first);
8599 if (last)
8600 printf ("-wR%d", first + last);
8601 printf ("}");
8602 }
8603 else if (op == 0xc7)
8604 {
8605 GET_OP (op2);
8606 if (op2 == 0 || (op2 & 0xf0) != 0)
8607 printf (_("[Spare]"));
0b6ae522
DJ
8608 else
8609 {
61865e30 8610 unsigned int mask = op2 & 0x0f;
32ec8896 8611 bfd_boolean first = TRUE;
61865e30
NC
8612 int i;
8613
8614 printf ("pop {");
8615 for (i = 0; i < 4; i++)
8616 if (mask & (1 << i))
8617 {
8618 if (first)
32ec8896 8619 first = FALSE;
61865e30
NC
8620 else
8621 printf (", ");
8622 printf ("wCGR%d", i);
8623 }
8624 printf ("}");
0b6ae522
DJ
8625 }
8626 }
61865e30 8627 else
32ec8896
NC
8628 {
8629 printf (_(" [unsupported opcode]"));
8630 res = FALSE;
8631 }
8632
0b6ae522
DJ
8633 printf ("\n");
8634 }
32ec8896
NC
8635
8636 return res;
fa197c1c
PB
8637}
8638
32ec8896 8639static bfd_boolean
dda8d76d
NC
8640decode_tic6x_unwind_bytecode (Filedata * filedata,
8641 struct arm_unw_aux_info * aux,
948f632f
DA
8642 unsigned int word,
8643 unsigned int remaining,
8644 unsigned int more_words,
8645 bfd_vma data_offset,
8646 Elf_Internal_Shdr * data_sec,
8647 struct arm_section * data_arm_sec)
fa197c1c
PB
8648{
8649 struct absaddr addr;
8650
8651 /* Decode the unwinding instructions. */
8652 while (1)
8653 {
8654 unsigned int op, op2;
8655
8656 ADVANCE;
8657 if (remaining == 0)
8658 break;
8659 remaining--;
8660 op = word >> 24;
8661 word <<= 8;
8662
9cf03b7e 8663 printf (" 0x%02x ", op);
fa197c1c
PB
8664
8665 if ((op & 0xc0) == 0x00)
8666 {
8667 int offset = ((op & 0x3f) << 3) + 8;
9cf03b7e 8668 printf (" sp = sp + %d", offset);
fa197c1c
PB
8669 }
8670 else if ((op & 0xc0) == 0x80)
8671 {
8672 GET_OP (op2);
8673 if (op == 0x80 && op2 == 0)
8674 printf (_("Refuse to unwind"));
8675 else
8676 {
8677 unsigned int mask = ((op & 0x1f) << 8) | op2;
8678 if (op & 0x20)
8679 printf ("pop compact {");
8680 else
8681 printf ("pop {");
8682
8683 decode_tic6x_unwind_regmask (mask);
8684 printf("}");
8685 }
8686 }
8687 else if ((op & 0xf0) == 0xc0)
8688 {
8689 unsigned int reg;
8690 unsigned int nregs;
8691 unsigned int i;
8692 const char *name;
a734115a
NC
8693 struct
8694 {
32ec8896
NC
8695 unsigned int offset;
8696 unsigned int reg;
fa197c1c
PB
8697 } regpos[16];
8698
8699 /* Scan entire instruction first so that GET_OP output is not
8700 interleaved with disassembly. */
8701 nregs = 0;
8702 for (i = 0; nregs < (op & 0xf); i++)
8703 {
8704 GET_OP (op2);
8705 reg = op2 >> 4;
8706 if (reg != 0xf)
8707 {
8708 regpos[nregs].offset = i * 2;
8709 regpos[nregs].reg = reg;
8710 nregs++;
8711 }
8712
8713 reg = op2 & 0xf;
8714 if (reg != 0xf)
8715 {
8716 regpos[nregs].offset = i * 2 + 1;
8717 regpos[nregs].reg = reg;
8718 nregs++;
8719 }
8720 }
8721
8722 printf (_("pop frame {"));
8723 reg = nregs - 1;
8724 for (i = i * 2; i > 0; i--)
8725 {
8726 if (regpos[reg].offset == i - 1)
8727 {
8728 name = tic6x_unwind_regnames[regpos[reg].reg];
8729 if (reg > 0)
8730 reg--;
8731 }
8732 else
8733 name = _("[pad]");
8734
8735 fputs (name, stdout);
8736 if (i > 1)
8737 printf (", ");
8738 }
8739
8740 printf ("}");
8741 }
8742 else if (op == 0xd0)
8743 printf (" MOV FP, SP");
8744 else if (op == 0xd1)
8745 printf (" __c6xabi_pop_rts");
8746 else if (op == 0xd2)
8747 {
8748 unsigned char buf[9];
8749 unsigned int i, len;
8750 unsigned long offset;
a734115a 8751
fa197c1c
PB
8752 for (i = 0; i < sizeof (buf); i++)
8753 {
8754 GET_OP (buf[i]);
8755 if ((buf[i] & 0x80) == 0)
8756 break;
8757 }
0eff7165
NC
8758 /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2. */
8759 if (i == sizeof (buf))
8760 {
0eff7165 8761 warn (_("Corrupt stack pointer adjustment detected\n"));
32ec8896 8762 return FALSE;
0eff7165 8763 }
948f632f 8764
f6f0e17b 8765 offset = read_uleb128 (buf, &len, buf + i + 1);
fa197c1c
PB
8766 assert (len == i + 1);
8767 offset = offset * 8 + 0x408;
8768 printf (_("sp = sp + %ld"), offset);
8769 }
8770 else if ((op & 0xf0) == 0xe0)
8771 {
8772 if ((op & 0x0f) == 7)
8773 printf (" RETURN");
8774 else
8775 printf (" MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
8776 }
8777 else
8778 {
8779 printf (_(" [unsupported opcode]"));
8780 }
8781 putchar ('\n');
8782 }
32ec8896
NC
8783
8784 return TRUE;
fa197c1c
PB
8785}
8786
8787static bfd_vma
dda8d76d 8788arm_expand_prel31 (Filedata * filedata, bfd_vma word, bfd_vma where)
fa197c1c
PB
8789{
8790 bfd_vma offset;
8791
8792 offset = word & 0x7fffffff;
8793 if (offset & 0x40000000)
8794 offset |= ~ (bfd_vma) 0x7fffffff;
8795
dda8d76d 8796 if (filedata->file_header.e_machine == EM_TI_C6000)
fa197c1c
PB
8797 offset <<= 1;
8798
8799 return offset + where;
8800}
8801
32ec8896 8802static bfd_boolean
dda8d76d
NC
8803decode_arm_unwind (Filedata * filedata,
8804 struct arm_unw_aux_info * aux,
1b31d05e
NC
8805 unsigned int word,
8806 unsigned int remaining,
8807 bfd_vma data_offset,
8808 Elf_Internal_Shdr * data_sec,
8809 struct arm_section * data_arm_sec)
fa197c1c
PB
8810{
8811 int per_index;
8812 unsigned int more_words = 0;
37e14bc3 8813 struct absaddr addr;
1b31d05e 8814 bfd_vma sym_name = (bfd_vma) -1;
97953bab 8815 bfd_boolean res = TRUE;
fa197c1c
PB
8816
8817 if (remaining == 0)
8818 {
1b31d05e
NC
8819 /* Fetch the first word.
8820 Note - when decoding an object file the address extracted
8821 here will always be 0. So we also pass in the sym_name
8822 parameter so that we can find the symbol associated with
8823 the personality routine. */
dda8d76d 8824 if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec, data_offset,
1b31d05e 8825 & word, & addr, & sym_name))
32ec8896 8826 return FALSE;
1b31d05e 8827
fa197c1c
PB
8828 remaining = 4;
8829 }
8830
8831 if ((word & 0x80000000) == 0)
8832 {
8833 /* Expand prel31 for personality routine. */
8834 bfd_vma fn;
8835 const char *procname;
8836
dda8d76d 8837 fn = arm_expand_prel31 (filedata, word, data_sec->sh_addr + data_offset);
fa197c1c 8838 printf (_(" Personality routine: "));
1b31d05e
NC
8839 if (fn == 0
8840 && addr.section == SHN_UNDEF && addr.offset == 0
8841 && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
8842 {
8843 procname = aux->strtab + sym_name;
8844 print_vma (fn, PREFIX_HEX);
8845 if (procname)
8846 {
8847 fputs (" <", stdout);
8848 fputs (procname, stdout);
8849 fputc ('>', stdout);
8850 }
8851 }
8852 else
dda8d76d 8853 procname = arm_print_vma_and_name (filedata, aux, fn, addr);
fa197c1c
PB
8854 fputc ('\n', stdout);
8855
8856 /* The GCC personality routines use the standard compact
8857 encoding, starting with one byte giving the number of
8858 words. */
8859 if (procname != NULL
8860 && (const_strneq (procname, "__gcc_personality_v0")
8861 || const_strneq (procname, "__gxx_personality_v0")
8862 || const_strneq (procname, "__gcj_personality_v0")
8863 || const_strneq (procname, "__gnu_objc_personality_v0")))
8864 {
8865 remaining = 0;
8866 more_words = 1;
8867 ADVANCE;
8868 if (!remaining)
8869 {
8870 printf (_(" [Truncated data]\n"));
32ec8896 8871 return FALSE;
fa197c1c
PB
8872 }
8873 more_words = word >> 24;
8874 word <<= 8;
8875 remaining--;
8876 per_index = -1;
8877 }
8878 else
32ec8896 8879 return TRUE;
fa197c1c
PB
8880 }
8881 else
8882 {
1b31d05e 8883 /* ARM EHABI Section 6.3:
0b4362b0 8884
1b31d05e 8885 An exception-handling table entry for the compact model looks like:
0b4362b0 8886
1b31d05e
NC
8887 31 30-28 27-24 23-0
8888 -- ----- ----- ----
8889 1 0 index Data for personalityRoutine[index] */
8890
dda8d76d 8891 if (filedata->file_header.e_machine == EM_ARM
1b31d05e 8892 && (word & 0x70000000))
32ec8896
NC
8893 {
8894 warn (_("Corrupt ARM compact model table entry: %x \n"), word);
8895 res = FALSE;
8896 }
1b31d05e 8897
fa197c1c 8898 per_index = (word >> 24) & 0x7f;
1b31d05e 8899 printf (_(" Compact model index: %d\n"), per_index);
fa197c1c
PB
8900 if (per_index == 0)
8901 {
8902 more_words = 0;
8903 word <<= 8;
8904 remaining--;
8905 }
8906 else if (per_index < 3)
8907 {
8908 more_words = (word >> 16) & 0xff;
8909 word <<= 16;
8910 remaining -= 2;
8911 }
8912 }
8913
dda8d76d 8914 switch (filedata->file_header.e_machine)
fa197c1c
PB
8915 {
8916 case EM_ARM:
8917 if (per_index < 3)
8918 {
dda8d76d 8919 if (! decode_arm_unwind_bytecode (filedata, aux, word, remaining, more_words,
32ec8896
NC
8920 data_offset, data_sec, data_arm_sec))
8921 res = FALSE;
fa197c1c
PB
8922 }
8923 else
1b31d05e
NC
8924 {
8925 warn (_("Unknown ARM compact model index encountered\n"));
8926 printf (_(" [reserved]\n"));
32ec8896 8927 res = FALSE;
1b31d05e 8928 }
fa197c1c
PB
8929 break;
8930
8931 case EM_TI_C6000:
8932 if (per_index < 3)
8933 {
dda8d76d 8934 if (! decode_tic6x_unwind_bytecode (filedata, aux, word, remaining, more_words,
32ec8896
NC
8935 data_offset, data_sec, data_arm_sec))
8936 res = FALSE;
fa197c1c
PB
8937 }
8938 else if (per_index < 5)
8939 {
8940 if (((word >> 17) & 0x7f) == 0x7f)
8941 printf (_(" Restore stack from frame pointer\n"));
8942 else
8943 printf (_(" Stack increment %d\n"), (word >> 14) & 0x1fc);
8944 printf (_(" Registers restored: "));
8945 if (per_index == 4)
8946 printf (" (compact) ");
8947 decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
8948 putchar ('\n');
8949 printf (_(" Return register: %s\n"),
8950 tic6x_unwind_regnames[word & 0xf]);
8951 }
8952 else
1b31d05e 8953 printf (_(" [reserved (%d)]\n"), per_index);
fa197c1c
PB
8954 break;
8955
8956 default:
74e1a04b 8957 error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
dda8d76d 8958 filedata->file_header.e_machine);
32ec8896 8959 res = FALSE;
fa197c1c 8960 }
0b6ae522
DJ
8961
8962 /* Decode the descriptors. Not implemented. */
32ec8896
NC
8963
8964 return res;
0b6ae522
DJ
8965}
8966
32ec8896 8967static bfd_boolean
dda8d76d
NC
8968dump_arm_unwind (Filedata * filedata,
8969 struct arm_unw_aux_info * aux,
8970 Elf_Internal_Shdr * exidx_sec)
0b6ae522
DJ
8971{
8972 struct arm_section exidx_arm_sec, extab_arm_sec;
8973 unsigned int i, exidx_len;
948f632f 8974 unsigned long j, nfuns;
32ec8896 8975 bfd_boolean res = TRUE;
0b6ae522
DJ
8976
8977 memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
8978 memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
8979 exidx_len = exidx_sec->sh_size / 8;
8980
948f632f
DA
8981 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
8982 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
8983 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
8984 aux->funtab[nfuns++] = aux->symtab[j];
8985 aux->nfuns = nfuns;
8986 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
8987
0b6ae522
DJ
8988 for (i = 0; i < exidx_len; i++)
8989 {
8990 unsigned int exidx_fn, exidx_entry;
8991 struct absaddr fn_addr, entry_addr;
8992 bfd_vma fn;
8993
8994 fputc ('\n', stdout);
8995
dda8d76d 8996 if (! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
1b31d05e 8997 8 * i, & exidx_fn, & fn_addr, NULL)
dda8d76d 8998 || ! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
1b31d05e 8999 8 * i + 4, & exidx_entry, & entry_addr, NULL))
0b6ae522 9000 {
948f632f 9001 free (aux->funtab);
1b31d05e
NC
9002 arm_free_section (& exidx_arm_sec);
9003 arm_free_section (& extab_arm_sec);
32ec8896 9004 return FALSE;
0b6ae522
DJ
9005 }
9006
83c257ca
NC
9007 /* ARM EHABI, Section 5:
9008 An index table entry consists of 2 words.
9009 The first word contains a prel31 offset to the start of a function, with bit 31 clear. */
9010 if (exidx_fn & 0x80000000)
32ec8896
NC
9011 {
9012 warn (_("corrupt index table entry: %x\n"), exidx_fn);
9013 res = FALSE;
9014 }
83c257ca 9015
dda8d76d 9016 fn = arm_expand_prel31 (filedata, exidx_fn, exidx_sec->sh_addr + 8 * i);
0b6ae522 9017
dda8d76d 9018 arm_print_vma_and_name (filedata, aux, fn, fn_addr);
0b6ae522
DJ
9019 fputs (": ", stdout);
9020
9021 if (exidx_entry == 1)
9022 {
9023 print_vma (exidx_entry, PREFIX_HEX);
9024 fputs (" [cantunwind]\n", stdout);
9025 }
9026 else if (exidx_entry & 0x80000000)
9027 {
9028 print_vma (exidx_entry, PREFIX_HEX);
9029 fputc ('\n', stdout);
dda8d76d 9030 decode_arm_unwind (filedata, aux, exidx_entry, 4, 0, NULL, NULL);
0b6ae522
DJ
9031 }
9032 else
9033 {
8f73510c 9034 bfd_vma table, table_offset = 0;
0b6ae522
DJ
9035 Elf_Internal_Shdr *table_sec;
9036
9037 fputs ("@", stdout);
dda8d76d 9038 table = arm_expand_prel31 (filedata, exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
0b6ae522
DJ
9039 print_vma (table, PREFIX_HEX);
9040 printf ("\n");
9041
9042 /* Locate the matching .ARM.extab. */
9043 if (entry_addr.section != SHN_UNDEF
dda8d76d 9044 && entry_addr.section < filedata->file_header.e_shnum)
0b6ae522 9045 {
dda8d76d 9046 table_sec = filedata->section_headers + entry_addr.section;
0b6ae522 9047 table_offset = entry_addr.offset;
1a915552
NC
9048 /* PR 18879 */
9049 if (table_offset > table_sec->sh_size
9050 || ((bfd_signed_vma) table_offset) < 0)
9051 {
9052 warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
9053 (unsigned long) table_offset,
dda8d76d 9054 printable_section_name (filedata, table_sec));
32ec8896 9055 res = FALSE;
1a915552
NC
9056 continue;
9057 }
0b6ae522
DJ
9058 }
9059 else
9060 {
dda8d76d 9061 table_sec = find_section_by_address (filedata, table);
0b6ae522
DJ
9062 if (table_sec != NULL)
9063 table_offset = table - table_sec->sh_addr;
9064 }
32ec8896 9065
0b6ae522
DJ
9066 if (table_sec == NULL)
9067 {
9068 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
9069 (unsigned long) table);
32ec8896 9070 res = FALSE;
0b6ae522
DJ
9071 continue;
9072 }
32ec8896 9073
dda8d76d 9074 if (! decode_arm_unwind (filedata, aux, 0, 0, table_offset, table_sec,
32ec8896
NC
9075 &extab_arm_sec))
9076 res = FALSE;
0b6ae522
DJ
9077 }
9078 }
9079
9080 printf ("\n");
9081
948f632f 9082 free (aux->funtab);
0b6ae522
DJ
9083 arm_free_section (&exidx_arm_sec);
9084 arm_free_section (&extab_arm_sec);
32ec8896
NC
9085
9086 return res;
0b6ae522
DJ
9087}
9088
fa197c1c 9089/* Used for both ARM and C6X unwinding tables. */
1b31d05e 9090
32ec8896 9091static bfd_boolean
dda8d76d 9092arm_process_unwind (Filedata * filedata)
0b6ae522
DJ
9093{
9094 struct arm_unw_aux_info aux;
9095 Elf_Internal_Shdr *unwsec = NULL;
9096 Elf_Internal_Shdr *strsec;
9097 Elf_Internal_Shdr *sec;
9098 unsigned long i;
fa197c1c 9099 unsigned int sec_type;
32ec8896 9100 bfd_boolean res = TRUE;
0b6ae522 9101
dda8d76d 9102 switch (filedata->file_header.e_machine)
fa197c1c
PB
9103 {
9104 case EM_ARM:
9105 sec_type = SHT_ARM_EXIDX;
9106 break;
9107
9108 case EM_TI_C6000:
9109 sec_type = SHT_C6000_UNWIND;
9110 break;
9111
0b4362b0 9112 default:
74e1a04b 9113 error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
dda8d76d 9114 filedata->file_header.e_machine);
32ec8896 9115 return FALSE;
fa197c1c
PB
9116 }
9117
dda8d76d 9118 if (filedata->string_table == NULL)
32ec8896 9119 return FALSE;
1b31d05e
NC
9120
9121 memset (& aux, 0, sizeof (aux));
dda8d76d 9122 aux.filedata = filedata;
0b6ae522 9123
dda8d76d 9124 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
0b6ae522 9125 {
dda8d76d 9126 if (sec->sh_type == SHT_SYMTAB && sec->sh_link < filedata->file_header.e_shnum)
0b6ae522 9127 {
dda8d76d 9128 aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
0b6ae522 9129
dda8d76d 9130 strsec = filedata->section_headers + sec->sh_link;
74e1a04b
NC
9131
9132 /* PR binutils/17531 file: 011-12666-0.004. */
9133 if (aux.strtab != NULL)
9134 {
4082ef84 9135 error (_("Multiple string tables found in file.\n"));
74e1a04b 9136 free (aux.strtab);
32ec8896 9137 res = FALSE;
74e1a04b 9138 }
dda8d76d 9139 aux.strtab = get_data (NULL, filedata, strsec->sh_offset,
0b6ae522
DJ
9140 1, strsec->sh_size, _("string table"));
9141 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
9142 }
fa197c1c 9143 else if (sec->sh_type == sec_type)
0b6ae522
DJ
9144 unwsec = sec;
9145 }
9146
1b31d05e 9147 if (unwsec == NULL)
0b6ae522 9148 printf (_("\nThere are no unwind sections in this file.\n"));
1b31d05e 9149 else
dda8d76d 9150 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
1b31d05e
NC
9151 {
9152 if (sec->sh_type == sec_type)
9153 {
d3a49aa8
AM
9154 unsigned long num_unwind = sec->sh_size / (2 * eh_addr_size);
9155 printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
9156 "contains %lu entry:\n",
9157 "\nUnwind section '%s' at offset 0x%lx "
9158 "contains %lu entries:\n",
9159 num_unwind),
dda8d76d 9160 printable_section_name (filedata, sec),
1b31d05e 9161 (unsigned long) sec->sh_offset,
d3a49aa8 9162 num_unwind);
0b6ae522 9163
dda8d76d 9164 if (! dump_arm_unwind (filedata, &aux, sec))
32ec8896 9165 res = FALSE;
1b31d05e
NC
9166 }
9167 }
0b6ae522
DJ
9168
9169 if (aux.symtab)
9170 free (aux.symtab);
9171 if (aux.strtab)
9172 free ((char *) aux.strtab);
32ec8896
NC
9173
9174 return res;
0b6ae522
DJ
9175}
9176
32ec8896 9177static bfd_boolean
dda8d76d 9178process_unwind (Filedata * filedata)
57346661 9179{
2cf0635d
NC
9180 struct unwind_handler
9181 {
32ec8896 9182 unsigned int machtype;
dda8d76d 9183 bfd_boolean (* handler)(Filedata *);
2cf0635d
NC
9184 } handlers[] =
9185 {
0b6ae522 9186 { EM_ARM, arm_process_unwind },
57346661
AM
9187 { EM_IA_64, ia64_process_unwind },
9188 { EM_PARISC, hppa_process_unwind },
fa197c1c 9189 { EM_TI_C6000, arm_process_unwind },
32ec8896 9190 { 0, NULL }
57346661
AM
9191 };
9192 int i;
9193
9194 if (!do_unwind)
32ec8896 9195 return TRUE;
57346661
AM
9196
9197 for (i = 0; handlers[i].handler != NULL; i++)
dda8d76d
NC
9198 if (filedata->file_header.e_machine == handlers[i].machtype)
9199 return handlers[i].handler (filedata);
57346661 9200
1b31d05e 9201 printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
dda8d76d 9202 get_machine_name (filedata->file_header.e_machine));
32ec8896 9203 return TRUE;
57346661
AM
9204}
9205
252b5132 9206static void
2cf0635d 9207dynamic_section_mips_val (Elf_Internal_Dyn * entry)
252b5132
RH
9208{
9209 switch (entry->d_tag)
9210 {
9211 case DT_MIPS_FLAGS:
9212 if (entry->d_un.d_val == 0)
4b68bca3 9213 printf (_("NONE"));
252b5132
RH
9214 else
9215 {
9216 static const char * opts[] =
9217 {
9218 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
9219 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
9220 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
9221 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
9222 "RLD_ORDER_SAFE"
9223 };
9224 unsigned int cnt;
32ec8896 9225 bfd_boolean first = TRUE;
2b692964 9226
60bca95a 9227 for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
252b5132
RH
9228 if (entry->d_un.d_val & (1 << cnt))
9229 {
9230 printf ("%s%s", first ? "" : " ", opts[cnt]);
32ec8896 9231 first = FALSE;
252b5132 9232 }
252b5132
RH
9233 }
9234 break;
103f02d3 9235
252b5132 9236 case DT_MIPS_IVERSION:
d79b3d50 9237 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
4b68bca3 9238 printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
252b5132 9239 else
76ca31c0
NC
9240 {
9241 char buf[40];
9242 sprintf_vma (buf, entry->d_un.d_ptr);
9243 /* Note: coded this way so that there is a single string for translation. */
9244 printf (_("<corrupt: %s>"), buf);
9245 }
252b5132 9246 break;
103f02d3 9247
252b5132
RH
9248 case DT_MIPS_TIME_STAMP:
9249 {
d5b07ef4 9250 char timebuf[128];
2cf0635d 9251 struct tm * tmp;
91d6fa6a 9252 time_t atime = entry->d_un.d_val;
82b1b41b 9253
91d6fa6a 9254 tmp = gmtime (&atime);
82b1b41b
NC
9255 /* PR 17531: file: 6accc532. */
9256 if (tmp == NULL)
9257 snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
9258 else
9259 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
9260 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9261 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
4b68bca3 9262 printf (_("Time Stamp: %s"), timebuf);
252b5132
RH
9263 }
9264 break;
103f02d3 9265
252b5132
RH
9266 case DT_MIPS_RLD_VERSION:
9267 case DT_MIPS_LOCAL_GOTNO:
9268 case DT_MIPS_CONFLICTNO:
9269 case DT_MIPS_LIBLISTNO:
9270 case DT_MIPS_SYMTABNO:
9271 case DT_MIPS_UNREFEXTNO:
9272 case DT_MIPS_HIPAGENO:
9273 case DT_MIPS_DELTA_CLASS_NO:
9274 case DT_MIPS_DELTA_INSTANCE_NO:
9275 case DT_MIPS_DELTA_RELOC_NO:
9276 case DT_MIPS_DELTA_SYM_NO:
9277 case DT_MIPS_DELTA_CLASSSYM_NO:
9278 case DT_MIPS_COMPACT_SIZE:
c69075ac 9279 print_vma (entry->d_un.d_val, DEC);
252b5132 9280 break;
103f02d3
UD
9281
9282 default:
4b68bca3 9283 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
103f02d3 9284 }
4b68bca3 9285 putchar ('\n');
103f02d3
UD
9286}
9287
103f02d3 9288static void
2cf0635d 9289dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
103f02d3
UD
9290{
9291 switch (entry->d_tag)
9292 {
9293 case DT_HP_DLD_FLAGS:
9294 {
9295 static struct
9296 {
9297 long int bit;
2cf0635d 9298 const char * str;
5e220199
NC
9299 }
9300 flags[] =
9301 {
9302 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
9303 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
9304 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
9305 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
9306 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
9307 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
9308 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
9309 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
9310 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
9311 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
eec8f817
DA
9312 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
9313 { DT_HP_GST, "HP_GST" },
9314 { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
9315 { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
9316 { DT_HP_NODELETE, "HP_NODELETE" },
9317 { DT_HP_GROUP, "HP_GROUP" },
9318 { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
5e220199 9319 };
32ec8896 9320 bfd_boolean first = TRUE;
5e220199 9321 size_t cnt;
f7a99963 9322 bfd_vma val = entry->d_un.d_val;
103f02d3 9323
60bca95a 9324 for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
103f02d3 9325 if (val & flags[cnt].bit)
30800947
NC
9326 {
9327 if (! first)
9328 putchar (' ');
9329 fputs (flags[cnt].str, stdout);
32ec8896 9330 first = FALSE;
30800947
NC
9331 val ^= flags[cnt].bit;
9332 }
76da6bbe 9333
103f02d3 9334 if (val != 0 || first)
f7a99963
NC
9335 {
9336 if (! first)
9337 putchar (' ');
9338 print_vma (val, HEX);
9339 }
103f02d3
UD
9340 }
9341 break;
76da6bbe 9342
252b5132 9343 default:
f7a99963
NC
9344 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9345 break;
252b5132 9346 }
35b1837e 9347 putchar ('\n');
252b5132
RH
9348}
9349
28f997cf
TG
9350#ifdef BFD64
9351
9352/* VMS vs Unix time offset and factor. */
9353
9354#define VMS_EPOCH_OFFSET 35067168000000000LL
9355#define VMS_GRANULARITY_FACTOR 10000000
9356
9357/* Display a VMS time in a human readable format. */
9358
9359static void
9360print_vms_time (bfd_int64_t vmstime)
9361{
9362 struct tm *tm;
9363 time_t unxtime;
9364
9365 unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
9366 tm = gmtime (&unxtime);
9367 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
9368 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
9369 tm->tm_hour, tm->tm_min, tm->tm_sec);
9370}
9371#endif /* BFD64 */
9372
ecc51f48 9373static void
2cf0635d 9374dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
ecc51f48
NC
9375{
9376 switch (entry->d_tag)
9377 {
0de14b54 9378 case DT_IA_64_PLT_RESERVE:
bdf4d63a 9379 /* First 3 slots reserved. */
ecc51f48
NC
9380 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9381 printf (" -- ");
9382 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
bdf4d63a
JJ
9383 break;
9384
28f997cf
TG
9385 case DT_IA_64_VMS_LINKTIME:
9386#ifdef BFD64
9387 print_vms_time (entry->d_un.d_val);
9388#endif
9389 break;
9390
9391 case DT_IA_64_VMS_LNKFLAGS:
9392 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9393 if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
9394 printf (" CALL_DEBUG");
9395 if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
9396 printf (" NOP0BUFS");
9397 if (entry->d_un.d_val & VMS_LF_P0IMAGE)
9398 printf (" P0IMAGE");
9399 if (entry->d_un.d_val & VMS_LF_MKTHREADS)
9400 printf (" MKTHREADS");
9401 if (entry->d_un.d_val & VMS_LF_UPCALLS)
9402 printf (" UPCALLS");
9403 if (entry->d_un.d_val & VMS_LF_IMGSTA)
9404 printf (" IMGSTA");
9405 if (entry->d_un.d_val & VMS_LF_INITIALIZE)
9406 printf (" INITIALIZE");
9407 if (entry->d_un.d_val & VMS_LF_MAIN)
9408 printf (" MAIN");
9409 if (entry->d_un.d_val & VMS_LF_EXE_INIT)
9410 printf (" EXE_INIT");
9411 if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
9412 printf (" TBK_IN_IMG");
9413 if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
9414 printf (" DBG_IN_IMG");
9415 if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
9416 printf (" TBK_IN_DSF");
9417 if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
9418 printf (" DBG_IN_DSF");
9419 if (entry->d_un.d_val & VMS_LF_SIGNATURES)
9420 printf (" SIGNATURES");
9421 if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
9422 printf (" REL_SEG_OFF");
9423 break;
9424
bdf4d63a
JJ
9425 default:
9426 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9427 break;
ecc51f48 9428 }
bdf4d63a 9429 putchar ('\n');
ecc51f48
NC
9430}
9431
32ec8896 9432static bfd_boolean
dda8d76d 9433get_32bit_dynamic_section (Filedata * filedata)
252b5132 9434{
2cf0635d
NC
9435 Elf32_External_Dyn * edyn;
9436 Elf32_External_Dyn * ext;
9437 Elf_Internal_Dyn * entry;
103f02d3 9438
dda8d76d 9439 edyn = (Elf32_External_Dyn *) get_data (NULL, filedata, dynamic_addr, 1,
3f5e193b 9440 dynamic_size, _("dynamic section"));
a6e9f9df 9441 if (!edyn)
32ec8896 9442 return FALSE;
103f02d3 9443
071436c6
NC
9444 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9445 might not have the luxury of section headers. Look for the DT_NULL
9446 terminator to determine the number of entries. */
ba2685cc 9447 for (ext = edyn, dynamic_nent = 0;
53c3012c 9448 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
ba2685cc
AM
9449 ext++)
9450 {
9451 dynamic_nent++;
9452 if (BYTE_GET (ext->d_tag) == DT_NULL)
9453 break;
9454 }
252b5132 9455
3f5e193b
NC
9456 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9457 sizeof (* entry));
b2d38a17 9458 if (dynamic_section == NULL)
252b5132 9459 {
8b73c356
NC
9460 error (_("Out of memory allocating space for %lu dynamic entries\n"),
9461 (unsigned long) dynamic_nent);
9ea033b2 9462 free (edyn);
32ec8896 9463 return FALSE;
9ea033b2 9464 }
252b5132 9465
fb514b26 9466 for (ext = edyn, entry = dynamic_section;
ba2685cc 9467 entry < dynamic_section + dynamic_nent;
fb514b26 9468 ext++, entry++)
9ea033b2 9469 {
fb514b26
AM
9470 entry->d_tag = BYTE_GET (ext->d_tag);
9471 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
252b5132
RH
9472 }
9473
9ea033b2
NC
9474 free (edyn);
9475
32ec8896 9476 return TRUE;
9ea033b2
NC
9477}
9478
32ec8896 9479static bfd_boolean
dda8d76d 9480get_64bit_dynamic_section (Filedata * filedata)
9ea033b2 9481{
2cf0635d
NC
9482 Elf64_External_Dyn * edyn;
9483 Elf64_External_Dyn * ext;
9484 Elf_Internal_Dyn * entry;
103f02d3 9485
071436c6 9486 /* Read in the data. */
dda8d76d 9487 edyn = (Elf64_External_Dyn *) get_data (NULL, filedata, dynamic_addr, 1,
3f5e193b 9488 dynamic_size, _("dynamic section"));
a6e9f9df 9489 if (!edyn)
32ec8896 9490 return FALSE;
103f02d3 9491
071436c6
NC
9492 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9493 might not have the luxury of section headers. Look for the DT_NULL
9494 terminator to determine the number of entries. */
ba2685cc 9495 for (ext = edyn, dynamic_nent = 0;
53c3012c
AM
9496 /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer. */
9497 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
ba2685cc
AM
9498 ext++)
9499 {
9500 dynamic_nent++;
66543521 9501 if (BYTE_GET (ext->d_tag) == DT_NULL)
ba2685cc
AM
9502 break;
9503 }
252b5132 9504
3f5e193b
NC
9505 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9506 sizeof (* entry));
b2d38a17 9507 if (dynamic_section == NULL)
252b5132 9508 {
8b73c356
NC
9509 error (_("Out of memory allocating space for %lu dynamic entries\n"),
9510 (unsigned long) dynamic_nent);
252b5132 9511 free (edyn);
32ec8896 9512 return FALSE;
252b5132
RH
9513 }
9514
071436c6 9515 /* Convert from external to internal formats. */
fb514b26 9516 for (ext = edyn, entry = dynamic_section;
ba2685cc 9517 entry < dynamic_section + dynamic_nent;
fb514b26 9518 ext++, entry++)
252b5132 9519 {
66543521
AM
9520 entry->d_tag = BYTE_GET (ext->d_tag);
9521 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
252b5132
RH
9522 }
9523
9524 free (edyn);
9525
32ec8896 9526 return TRUE;
9ea033b2
NC
9527}
9528
e9e44622
JJ
9529static void
9530print_dynamic_flags (bfd_vma flags)
d1133906 9531{
32ec8896 9532 bfd_boolean first = TRUE;
13ae64f3 9533
d1133906
NC
9534 while (flags)
9535 {
9536 bfd_vma flag;
9537
9538 flag = flags & - flags;
9539 flags &= ~ flag;
9540
e9e44622 9541 if (first)
32ec8896 9542 first = FALSE;
e9e44622
JJ
9543 else
9544 putc (' ', stdout);
13ae64f3 9545
d1133906
NC
9546 switch (flag)
9547 {
e9e44622
JJ
9548 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
9549 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
9550 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
9551 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
9552 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
2b692964 9553 default: fputs (_("unknown"), stdout); break;
d1133906
NC
9554 }
9555 }
e9e44622 9556 puts ("");
d1133906
NC
9557}
9558
b2d38a17
NC
9559/* Parse and display the contents of the dynamic section. */
9560
32ec8896 9561static bfd_boolean
dda8d76d 9562process_dynamic_section (Filedata * filedata)
9ea033b2 9563{
2cf0635d 9564 Elf_Internal_Dyn * entry;
9ea033b2
NC
9565
9566 if (dynamic_size == 0)
9567 {
9568 if (do_dynamic)
b2d38a17 9569 printf (_("\nThere is no dynamic section in this file.\n"));
9ea033b2 9570
32ec8896 9571 return TRUE;
9ea033b2
NC
9572 }
9573
9574 if (is_32bit_elf)
9575 {
dda8d76d 9576 if (! get_32bit_dynamic_section (filedata))
32ec8896
NC
9577 return FALSE;
9578 }
9579 else
9580 {
dda8d76d 9581 if (! get_64bit_dynamic_section (filedata))
32ec8896 9582 return FALSE;
9ea033b2 9583 }
9ea033b2 9584
252b5132
RH
9585 /* Find the appropriate symbol table. */
9586 if (dynamic_symbols == NULL)
9587 {
86dba8ee
AM
9588 for (entry = dynamic_section;
9589 entry < dynamic_section + dynamic_nent;
9590 ++entry)
252b5132 9591 {
c8286bd1 9592 Elf_Internal_Shdr section;
252b5132
RH
9593
9594 if (entry->d_tag != DT_SYMTAB)
9595 continue;
9596
9597 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
9598
9599 /* Since we do not know how big the symbol table is,
9600 we default to reading in the entire file (!) and
9601 processing that. This is overkill, I know, but it
e3c8793a 9602 should work. */
dda8d76d
NC
9603 section.sh_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
9604 if ((bfd_size_type) section.sh_offset > filedata->file_size)
7296a62a
NC
9605 {
9606 /* See PR 21379 for a reproducer. */
9607 error (_("Invalid DT_SYMTAB entry: %lx"), (long) section.sh_offset);
9608 return FALSE;
9609 }
252b5132 9610
fb52b2f4
NC
9611 if (archive_file_offset != 0)
9612 section.sh_size = archive_file_size - section.sh_offset;
9613 else
dda8d76d 9614 section.sh_size = filedata->file_size - section.sh_offset;
252b5132 9615
9ea033b2 9616 if (is_32bit_elf)
9ad5cbcf 9617 section.sh_entsize = sizeof (Elf32_External_Sym);
9ea033b2 9618 else
9ad5cbcf 9619 section.sh_entsize = sizeof (Elf64_External_Sym);
dda8d76d 9620 section.sh_name = filedata->string_table_length;
252b5132 9621
dda8d76d 9622 dynamic_symbols = GET_ELF_SYMBOLS (filedata, &section, & num_dynamic_syms);
19936277 9623 if (num_dynamic_syms < 1)
252b5132
RH
9624 {
9625 error (_("Unable to determine the number of symbols to load\n"));
9626 continue;
9627 }
252b5132
RH
9628 }
9629 }
9630
9631 /* Similarly find a string table. */
9632 if (dynamic_strings == NULL)
9633 {
86dba8ee
AM
9634 for (entry = dynamic_section;
9635 entry < dynamic_section + dynamic_nent;
9636 ++entry)
252b5132
RH
9637 {
9638 unsigned long offset;
b34976b6 9639 long str_tab_len;
252b5132
RH
9640
9641 if (entry->d_tag != DT_STRTAB)
9642 continue;
9643
9644 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
9645
9646 /* Since we do not know how big the string table is,
9647 we default to reading in the entire file (!) and
9648 processing that. This is overkill, I know, but it
e3c8793a 9649 should work. */
252b5132 9650
dda8d76d 9651 offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
fb52b2f4
NC
9652
9653 if (archive_file_offset != 0)
9654 str_tab_len = archive_file_size - offset;
9655 else
dda8d76d 9656 str_tab_len = filedata->file_size;
252b5132
RH
9657
9658 if (str_tab_len < 1)
9659 {
9660 error
9661 (_("Unable to determine the length of the dynamic string table\n"));
9662 continue;
9663 }
9664
dda8d76d 9665 dynamic_strings = (char *) get_data (NULL, filedata, offset, 1,
3f5e193b
NC
9666 str_tab_len,
9667 _("dynamic string table"));
59245841 9668 dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
252b5132
RH
9669 break;
9670 }
9671 }
9672
9673 /* And find the syminfo section if available. */
9674 if (dynamic_syminfo == NULL)
9675 {
3e8bba36 9676 unsigned long syminsz = 0;
252b5132 9677
86dba8ee
AM
9678 for (entry = dynamic_section;
9679 entry < dynamic_section + dynamic_nent;
9680 ++entry)
252b5132
RH
9681 {
9682 if (entry->d_tag == DT_SYMINENT)
9683 {
9684 /* Note: these braces are necessary to avoid a syntax
9685 error from the SunOS4 C compiler. */
049b0c3a
NC
9686 /* PR binutils/17531: A corrupt file can trigger this test.
9687 So do not use an assert, instead generate an error message. */
9688 if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
071436c6 9689 error (_("Bad value (%d) for SYMINENT entry\n"),
049b0c3a 9690 (int) entry->d_un.d_val);
252b5132
RH
9691 }
9692 else if (entry->d_tag == DT_SYMINSZ)
9693 syminsz = entry->d_un.d_val;
9694 else if (entry->d_tag == DT_SYMINFO)
dda8d76d 9695 dynamic_syminfo_offset = offset_from_vma (filedata, entry->d_un.d_val,
d93f0186 9696 syminsz);
252b5132
RH
9697 }
9698
9699 if (dynamic_syminfo_offset != 0 && syminsz != 0)
9700 {
2cf0635d
NC
9701 Elf_External_Syminfo * extsyminfo;
9702 Elf_External_Syminfo * extsym;
9703 Elf_Internal_Syminfo * syminfo;
252b5132
RH
9704
9705 /* There is a syminfo section. Read the data. */
3f5e193b 9706 extsyminfo = (Elf_External_Syminfo *)
dda8d76d 9707 get_data (NULL, filedata, dynamic_syminfo_offset, 1, syminsz,
3f5e193b 9708 _("symbol information"));
a6e9f9df 9709 if (!extsyminfo)
32ec8896 9710 return FALSE;
252b5132 9711
3f5e193b 9712 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
252b5132
RH
9713 if (dynamic_syminfo == NULL)
9714 {
8b73c356
NC
9715 error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9716 (unsigned long) syminsz);
32ec8896 9717 return FALSE;
252b5132
RH
9718 }
9719
9720 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
86dba8ee
AM
9721 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
9722 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
9723 ++syminfo, ++extsym)
252b5132 9724 {
86dba8ee
AM
9725 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
9726 syminfo->si_flags = BYTE_GET (extsym->si_flags);
252b5132
RH
9727 }
9728
9729 free (extsyminfo);
9730 }
9731 }
9732
9733 if (do_dynamic && dynamic_addr)
d3a49aa8
AM
9734 printf (ngettext ("\nDynamic section at offset 0x%lx "
9735 "contains %lu entry:\n",
9736 "\nDynamic section at offset 0x%lx "
9737 "contains %lu entries:\n",
9738 dynamic_nent),
8b73c356 9739 dynamic_addr, (unsigned long) dynamic_nent);
252b5132
RH
9740 if (do_dynamic)
9741 printf (_(" Tag Type Name/Value\n"));
9742
86dba8ee
AM
9743 for (entry = dynamic_section;
9744 entry < dynamic_section + dynamic_nent;
9745 entry++)
252b5132
RH
9746 {
9747 if (do_dynamic)
f7a99963 9748 {
2cf0635d 9749 const char * dtype;
e699b9ff 9750
f7a99963
NC
9751 putchar (' ');
9752 print_vma (entry->d_tag, FULL_HEX);
dda8d76d 9753 dtype = get_dynamic_type (filedata, entry->d_tag);
e699b9ff 9754 printf (" (%s)%*s", dtype,
32ec8896 9755 ((is_32bit_elf ? 27 : 19) - (int) strlen (dtype)), " ");
f7a99963 9756 }
252b5132
RH
9757
9758 switch (entry->d_tag)
9759 {
d1133906
NC
9760 case DT_FLAGS:
9761 if (do_dynamic)
e9e44622 9762 print_dynamic_flags (entry->d_un.d_val);
d1133906 9763 break;
76da6bbe 9764
252b5132
RH
9765 case DT_AUXILIARY:
9766 case DT_FILTER:
019148e4
L
9767 case DT_CONFIG:
9768 case DT_DEPAUDIT:
9769 case DT_AUDIT:
252b5132
RH
9770 if (do_dynamic)
9771 {
019148e4 9772 switch (entry->d_tag)
b34976b6 9773 {
019148e4
L
9774 case DT_AUXILIARY:
9775 printf (_("Auxiliary library"));
9776 break;
9777
9778 case DT_FILTER:
9779 printf (_("Filter library"));
9780 break;
9781
b34976b6 9782 case DT_CONFIG:
019148e4
L
9783 printf (_("Configuration file"));
9784 break;
9785
9786 case DT_DEPAUDIT:
9787 printf (_("Dependency audit library"));
9788 break;
9789
9790 case DT_AUDIT:
9791 printf (_("Audit library"));
9792 break;
9793 }
252b5132 9794
d79b3d50
NC
9795 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9796 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
252b5132 9797 else
f7a99963
NC
9798 {
9799 printf (": ");
9800 print_vma (entry->d_un.d_val, PREFIX_HEX);
9801 putchar ('\n');
9802 }
252b5132
RH
9803 }
9804 break;
9805
dcefbbbd 9806 case DT_FEATURE:
252b5132
RH
9807 if (do_dynamic)
9808 {
9809 printf (_("Flags:"));
86f55779 9810
252b5132
RH
9811 if (entry->d_un.d_val == 0)
9812 printf (_(" None\n"));
9813 else
9814 {
9815 unsigned long int val = entry->d_un.d_val;
86f55779 9816
252b5132
RH
9817 if (val & DTF_1_PARINIT)
9818 {
9819 printf (" PARINIT");
9820 val ^= DTF_1_PARINIT;
9821 }
dcefbbbd
L
9822 if (val & DTF_1_CONFEXP)
9823 {
9824 printf (" CONFEXP");
9825 val ^= DTF_1_CONFEXP;
9826 }
252b5132
RH
9827 if (val != 0)
9828 printf (" %lx", val);
9829 puts ("");
9830 }
9831 }
9832 break;
9833
9834 case DT_POSFLAG_1:
9835 if (do_dynamic)
9836 {
9837 printf (_("Flags:"));
86f55779 9838
252b5132
RH
9839 if (entry->d_un.d_val == 0)
9840 printf (_(" None\n"));
9841 else
9842 {
9843 unsigned long int val = entry->d_un.d_val;
86f55779 9844
252b5132
RH
9845 if (val & DF_P1_LAZYLOAD)
9846 {
9847 printf (" LAZYLOAD");
9848 val ^= DF_P1_LAZYLOAD;
9849 }
9850 if (val & DF_P1_GROUPPERM)
9851 {
9852 printf (" GROUPPERM");
9853 val ^= DF_P1_GROUPPERM;
9854 }
9855 if (val != 0)
9856 printf (" %lx", val);
9857 puts ("");
9858 }
9859 }
9860 break;
9861
9862 case DT_FLAGS_1:
9863 if (do_dynamic)
9864 {
9865 printf (_("Flags:"));
9866 if (entry->d_un.d_val == 0)
9867 printf (_(" None\n"));
9868 else
9869 {
9870 unsigned long int val = entry->d_un.d_val;
86f55779 9871
252b5132
RH
9872 if (val & DF_1_NOW)
9873 {
9874 printf (" NOW");
9875 val ^= DF_1_NOW;
9876 }
9877 if (val & DF_1_GLOBAL)
9878 {
9879 printf (" GLOBAL");
9880 val ^= DF_1_GLOBAL;
9881 }
9882 if (val & DF_1_GROUP)
9883 {
9884 printf (" GROUP");
9885 val ^= DF_1_GROUP;
9886 }
9887 if (val & DF_1_NODELETE)
9888 {
9889 printf (" NODELETE");
9890 val ^= DF_1_NODELETE;
9891 }
9892 if (val & DF_1_LOADFLTR)
9893 {
9894 printf (" LOADFLTR");
9895 val ^= DF_1_LOADFLTR;
9896 }
9897 if (val & DF_1_INITFIRST)
9898 {
9899 printf (" INITFIRST");
9900 val ^= DF_1_INITFIRST;
9901 }
9902 if (val & DF_1_NOOPEN)
9903 {
9904 printf (" NOOPEN");
9905 val ^= DF_1_NOOPEN;
9906 }
9907 if (val & DF_1_ORIGIN)
9908 {
9909 printf (" ORIGIN");
9910 val ^= DF_1_ORIGIN;
9911 }
9912 if (val & DF_1_DIRECT)
9913 {
9914 printf (" DIRECT");
9915 val ^= DF_1_DIRECT;
9916 }
9917 if (val & DF_1_TRANS)
9918 {
9919 printf (" TRANS");
9920 val ^= DF_1_TRANS;
9921 }
9922 if (val & DF_1_INTERPOSE)
9923 {
9924 printf (" INTERPOSE");
9925 val ^= DF_1_INTERPOSE;
9926 }
f7db6139 9927 if (val & DF_1_NODEFLIB)
dcefbbbd 9928 {
f7db6139
L
9929 printf (" NODEFLIB");
9930 val ^= DF_1_NODEFLIB;
dcefbbbd
L
9931 }
9932 if (val & DF_1_NODUMP)
9933 {
9934 printf (" NODUMP");
9935 val ^= DF_1_NODUMP;
9936 }
34b60028 9937 if (val & DF_1_CONFALT)
dcefbbbd 9938 {
34b60028
L
9939 printf (" CONFALT");
9940 val ^= DF_1_CONFALT;
9941 }
9942 if (val & DF_1_ENDFILTEE)
9943 {
9944 printf (" ENDFILTEE");
9945 val ^= DF_1_ENDFILTEE;
9946 }
9947 if (val & DF_1_DISPRELDNE)
9948 {
9949 printf (" DISPRELDNE");
9950 val ^= DF_1_DISPRELDNE;
9951 }
9952 if (val & DF_1_DISPRELPND)
9953 {
9954 printf (" DISPRELPND");
9955 val ^= DF_1_DISPRELPND;
9956 }
9957 if (val & DF_1_NODIRECT)
9958 {
9959 printf (" NODIRECT");
9960 val ^= DF_1_NODIRECT;
9961 }
9962 if (val & DF_1_IGNMULDEF)
9963 {
9964 printf (" IGNMULDEF");
9965 val ^= DF_1_IGNMULDEF;
9966 }
9967 if (val & DF_1_NOKSYMS)
9968 {
9969 printf (" NOKSYMS");
9970 val ^= DF_1_NOKSYMS;
9971 }
9972 if (val & DF_1_NOHDR)
9973 {
9974 printf (" NOHDR");
9975 val ^= DF_1_NOHDR;
9976 }
9977 if (val & DF_1_EDITED)
9978 {
9979 printf (" EDITED");
9980 val ^= DF_1_EDITED;
9981 }
9982 if (val & DF_1_NORELOC)
9983 {
9984 printf (" NORELOC");
9985 val ^= DF_1_NORELOC;
9986 }
9987 if (val & DF_1_SYMINTPOSE)
9988 {
9989 printf (" SYMINTPOSE");
9990 val ^= DF_1_SYMINTPOSE;
9991 }
9992 if (val & DF_1_GLOBAUDIT)
9993 {
9994 printf (" GLOBAUDIT");
9995 val ^= DF_1_GLOBAUDIT;
9996 }
9997 if (val & DF_1_SINGLETON)
9998 {
9999 printf (" SINGLETON");
10000 val ^= DF_1_SINGLETON;
dcefbbbd 10001 }
5c383f02
RO
10002 if (val & DF_1_STUB)
10003 {
10004 printf (" STUB");
10005 val ^= DF_1_STUB;
10006 }
10007 if (val & DF_1_PIE)
10008 {
10009 printf (" PIE");
10010 val ^= DF_1_PIE;
10011 }
252b5132
RH
10012 if (val != 0)
10013 printf (" %lx", val);
10014 puts ("");
10015 }
10016 }
10017 break;
10018
10019 case DT_PLTREL:
566b0d53 10020 dynamic_info[entry->d_tag] = entry->d_un.d_val;
252b5132 10021 if (do_dynamic)
dda8d76d 10022 puts (get_dynamic_type (filedata, entry->d_un.d_val));
252b5132
RH
10023 break;
10024
10025 case DT_NULL :
10026 case DT_NEEDED :
10027 case DT_PLTGOT :
10028 case DT_HASH :
10029 case DT_STRTAB :
10030 case DT_SYMTAB :
10031 case DT_RELA :
10032 case DT_INIT :
10033 case DT_FINI :
10034 case DT_SONAME :
10035 case DT_RPATH :
10036 case DT_SYMBOLIC:
10037 case DT_REL :
10038 case DT_DEBUG :
10039 case DT_TEXTREL :
10040 case DT_JMPREL :
019148e4 10041 case DT_RUNPATH :
252b5132
RH
10042 dynamic_info[entry->d_tag] = entry->d_un.d_val;
10043
10044 if (do_dynamic)
10045 {
2cf0635d 10046 char * name;
252b5132 10047
d79b3d50
NC
10048 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
10049 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
252b5132 10050 else
d79b3d50 10051 name = NULL;
252b5132
RH
10052
10053 if (name)
10054 {
10055 switch (entry->d_tag)
10056 {
10057 case DT_NEEDED:
10058 printf (_("Shared library: [%s]"), name);
10059
18bd398b 10060 if (streq (name, program_interpreter))
f7a99963 10061 printf (_(" program interpreter"));
252b5132
RH
10062 break;
10063
10064 case DT_SONAME:
f7a99963 10065 printf (_("Library soname: [%s]"), name);
252b5132
RH
10066 break;
10067
10068 case DT_RPATH:
f7a99963 10069 printf (_("Library rpath: [%s]"), name);
252b5132
RH
10070 break;
10071
019148e4
L
10072 case DT_RUNPATH:
10073 printf (_("Library runpath: [%s]"), name);
10074 break;
10075
252b5132 10076 default:
f7a99963
NC
10077 print_vma (entry->d_un.d_val, PREFIX_HEX);
10078 break;
252b5132
RH
10079 }
10080 }
10081 else
f7a99963
NC
10082 print_vma (entry->d_un.d_val, PREFIX_HEX);
10083
10084 putchar ('\n');
252b5132
RH
10085 }
10086 break;
10087
10088 case DT_PLTRELSZ:
10089 case DT_RELASZ :
10090 case DT_STRSZ :
10091 case DT_RELSZ :
10092 case DT_RELAENT :
10093 case DT_SYMENT :
10094 case DT_RELENT :
566b0d53 10095 dynamic_info[entry->d_tag] = entry->d_un.d_val;
1a0670f3 10096 /* Fall through. */
252b5132
RH
10097 case DT_PLTPADSZ:
10098 case DT_MOVEENT :
10099 case DT_MOVESZ :
10100 case DT_INIT_ARRAYSZ:
10101 case DT_FINI_ARRAYSZ:
047b2264
JJ
10102 case DT_GNU_CONFLICTSZ:
10103 case DT_GNU_LIBLISTSZ:
252b5132 10104 if (do_dynamic)
f7a99963
NC
10105 {
10106 print_vma (entry->d_un.d_val, UNSIGNED);
2b692964 10107 printf (_(" (bytes)\n"));
f7a99963 10108 }
252b5132
RH
10109 break;
10110
10111 case DT_VERDEFNUM:
10112 case DT_VERNEEDNUM:
10113 case DT_RELACOUNT:
10114 case DT_RELCOUNT:
10115 if (do_dynamic)
f7a99963
NC
10116 {
10117 print_vma (entry->d_un.d_val, UNSIGNED);
10118 putchar ('\n');
10119 }
252b5132
RH
10120 break;
10121
10122 case DT_SYMINSZ:
10123 case DT_SYMINENT:
10124 case DT_SYMINFO:
10125 case DT_USED:
10126 case DT_INIT_ARRAY:
10127 case DT_FINI_ARRAY:
10128 if (do_dynamic)
10129 {
d79b3d50
NC
10130 if (entry->d_tag == DT_USED
10131 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
252b5132 10132 {
2cf0635d 10133 char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
252b5132 10134
b34976b6 10135 if (*name)
252b5132
RH
10136 {
10137 printf (_("Not needed object: [%s]\n"), name);
10138 break;
10139 }
10140 }
103f02d3 10141
f7a99963
NC
10142 print_vma (entry->d_un.d_val, PREFIX_HEX);
10143 putchar ('\n');
252b5132
RH
10144 }
10145 break;
10146
10147 case DT_BIND_NOW:
10148 /* The value of this entry is ignored. */
35b1837e
AM
10149 if (do_dynamic)
10150 putchar ('\n');
252b5132 10151 break;
103f02d3 10152
047b2264
JJ
10153 case DT_GNU_PRELINKED:
10154 if (do_dynamic)
10155 {
2cf0635d 10156 struct tm * tmp;
91d6fa6a 10157 time_t atime = entry->d_un.d_val;
047b2264 10158
91d6fa6a 10159 tmp = gmtime (&atime);
071436c6
NC
10160 /* PR 17533 file: 041-1244816-0.004. */
10161 if (tmp == NULL)
5a2cbcf4
L
10162 printf (_("<corrupt time val: %lx"),
10163 (unsigned long) atime);
071436c6
NC
10164 else
10165 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
10166 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
10167 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
047b2264
JJ
10168
10169 }
10170 break;
10171
fdc90cb4
JJ
10172 case DT_GNU_HASH:
10173 dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
10174 if (do_dynamic)
10175 {
10176 print_vma (entry->d_un.d_val, PREFIX_HEX);
10177 putchar ('\n');
10178 }
10179 break;
10180
252b5132
RH
10181 default:
10182 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
b34976b6 10183 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
252b5132
RH
10184 entry->d_un.d_val;
10185
10186 if (do_dynamic)
10187 {
dda8d76d 10188 switch (filedata->file_header.e_machine)
252b5132
RH
10189 {
10190 case EM_MIPS:
4fe85591 10191 case EM_MIPS_RS3_LE:
b2d38a17 10192 dynamic_section_mips_val (entry);
252b5132 10193 break;
103f02d3 10194 case EM_PARISC:
b2d38a17 10195 dynamic_section_parisc_val (entry);
103f02d3 10196 break;
ecc51f48 10197 case EM_IA_64:
b2d38a17 10198 dynamic_section_ia64_val (entry);
ecc51f48 10199 break;
252b5132 10200 default:
f7a99963
NC
10201 print_vma (entry->d_un.d_val, PREFIX_HEX);
10202 putchar ('\n');
252b5132
RH
10203 }
10204 }
10205 break;
10206 }
10207 }
10208
32ec8896 10209 return TRUE;
252b5132
RH
10210}
10211
10212static char *
d3ba0551 10213get_ver_flags (unsigned int flags)
252b5132 10214{
6d4f21f6 10215 static char buff[128];
252b5132
RH
10216
10217 buff[0] = 0;
10218
10219 if (flags == 0)
10220 return _("none");
10221
10222 if (flags & VER_FLG_BASE)
7bb1ad17 10223 strcat (buff, "BASE");
252b5132
RH
10224
10225 if (flags & VER_FLG_WEAK)
10226 {
10227 if (flags & VER_FLG_BASE)
7bb1ad17 10228 strcat (buff, " | ");
252b5132 10229
7bb1ad17 10230 strcat (buff, "WEAK");
252b5132
RH
10231 }
10232
44ec90b9
RO
10233 if (flags & VER_FLG_INFO)
10234 {
10235 if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
7bb1ad17 10236 strcat (buff, " | ");
44ec90b9 10237
7bb1ad17 10238 strcat (buff, "INFO");
44ec90b9
RO
10239 }
10240
10241 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
7bb1ad17
MR
10242 {
10243 if (flags & (VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
10244 strcat (buff, " | ");
10245
10246 strcat (buff, _("<unknown>"));
10247 }
252b5132
RH
10248
10249 return buff;
10250}
10251
10252/* Display the contents of the version sections. */
98fb390a 10253
32ec8896 10254static bfd_boolean
dda8d76d 10255process_version_sections (Filedata * filedata)
252b5132 10256{
2cf0635d 10257 Elf_Internal_Shdr * section;
b34976b6 10258 unsigned i;
32ec8896 10259 bfd_boolean found = FALSE;
252b5132
RH
10260
10261 if (! do_version)
32ec8896 10262 return TRUE;
252b5132 10263
dda8d76d
NC
10264 for (i = 0, section = filedata->section_headers;
10265 i < filedata->file_header.e_shnum;
b34976b6 10266 i++, section++)
252b5132
RH
10267 {
10268 switch (section->sh_type)
10269 {
10270 case SHT_GNU_verdef:
10271 {
2cf0635d 10272 Elf_External_Verdef * edefs;
452bf675
AM
10273 unsigned long idx;
10274 unsigned long cnt;
2cf0635d 10275 char * endbuf;
252b5132 10276
32ec8896 10277 found = TRUE;
252b5132 10278
d3a49aa8
AM
10279 printf (ngettext ("\nVersion definition section '%s' "
10280 "contains %u entry:\n",
10281 "\nVersion definition section '%s' "
10282 "contains %u entries:\n",
10283 section->sh_info),
dda8d76d 10284 printable_section_name (filedata, section),
74e1a04b 10285 section->sh_info);
252b5132
RH
10286
10287 printf (_(" Addr: 0x"));
10288 printf_vma (section->sh_addr);
233f82cf 10289 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
1b228002 10290 (unsigned long) section->sh_offset, section->sh_link,
dda8d76d 10291 printable_section_name_from_index (filedata, section->sh_link));
252b5132 10292
3f5e193b 10293 edefs = (Elf_External_Verdef *)
dda8d76d 10294 get_data (NULL, filedata, section->sh_offset, 1,section->sh_size,
3f5e193b 10295 _("version definition section"));
a6e9f9df
AM
10296 if (!edefs)
10297 break;
59245841 10298 endbuf = (char *) edefs + section->sh_size;
252b5132 10299
1445030f 10300 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
252b5132 10301 {
2cf0635d
NC
10302 char * vstart;
10303 Elf_External_Verdef * edef;
b34976b6 10304 Elf_Internal_Verdef ent;
2cf0635d 10305 Elf_External_Verdaux * eaux;
b34976b6 10306 Elf_Internal_Verdaux aux;
452bf675 10307 unsigned long isum;
b34976b6 10308 int j;
103f02d3 10309
252b5132 10310 vstart = ((char *) edefs) + idx;
54806181
AM
10311 if (vstart + sizeof (*edef) > endbuf)
10312 break;
252b5132
RH
10313
10314 edef = (Elf_External_Verdef *) vstart;
10315
10316 ent.vd_version = BYTE_GET (edef->vd_version);
10317 ent.vd_flags = BYTE_GET (edef->vd_flags);
10318 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
10319 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
10320 ent.vd_hash = BYTE_GET (edef->vd_hash);
10321 ent.vd_aux = BYTE_GET (edef->vd_aux);
10322 ent.vd_next = BYTE_GET (edef->vd_next);
10323
452bf675 10324 printf (_(" %#06lx: Rev: %d Flags: %s"),
252b5132
RH
10325 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
10326
10327 printf (_(" Index: %d Cnt: %d "),
10328 ent.vd_ndx, ent.vd_cnt);
10329
452bf675 10330 /* Check for overflow. */
1445030f 10331 if (ent.vd_aux > (size_t) (endbuf - vstart))
dd24e3da
NC
10332 break;
10333
252b5132
RH
10334 vstart += ent.vd_aux;
10335
1445030f
AM
10336 if (vstart + sizeof (*eaux) > endbuf)
10337 break;
252b5132
RH
10338 eaux = (Elf_External_Verdaux *) vstart;
10339
10340 aux.vda_name = BYTE_GET (eaux->vda_name);
10341 aux.vda_next = BYTE_GET (eaux->vda_next);
10342
d79b3d50
NC
10343 if (VALID_DYNAMIC_NAME (aux.vda_name))
10344 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
252b5132
RH
10345 else
10346 printf (_("Name index: %ld\n"), aux.vda_name);
10347
10348 isum = idx + ent.vd_aux;
10349
b34976b6 10350 for (j = 1; j < ent.vd_cnt; j++)
252b5132 10351 {
1445030f
AM
10352 if (aux.vda_next < sizeof (*eaux)
10353 && !(j == ent.vd_cnt - 1 && aux.vda_next == 0))
10354 {
10355 warn (_("Invalid vda_next field of %lx\n"),
10356 aux.vda_next);
10357 j = ent.vd_cnt;
10358 break;
10359 }
dd24e3da 10360 /* Check for overflow. */
7e26601c 10361 if (aux.vda_next > (size_t) (endbuf - vstart))
dd24e3da
NC
10362 break;
10363
252b5132
RH
10364 isum += aux.vda_next;
10365 vstart += aux.vda_next;
10366
54806181
AM
10367 if (vstart + sizeof (*eaux) > endbuf)
10368 break;
1445030f 10369 eaux = (Elf_External_Verdaux *) vstart;
252b5132
RH
10370
10371 aux.vda_name = BYTE_GET (eaux->vda_name);
10372 aux.vda_next = BYTE_GET (eaux->vda_next);
10373
d79b3d50 10374 if (VALID_DYNAMIC_NAME (aux.vda_name))
452bf675 10375 printf (_(" %#06lx: Parent %d: %s\n"),
d79b3d50 10376 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
252b5132 10377 else
452bf675 10378 printf (_(" %#06lx: Parent %d, name index: %ld\n"),
252b5132
RH
10379 isum, j, aux.vda_name);
10380 }
dd24e3da 10381
54806181
AM
10382 if (j < ent.vd_cnt)
10383 printf (_(" Version def aux past end of section\n"));
252b5132 10384
c9f02c3e
MR
10385 /* PR 17531:
10386 file: id:000001,src:000172+005151,op:splice,rep:2. */
1445030f
AM
10387 if (ent.vd_next < sizeof (*edef)
10388 && !(cnt == section->sh_info - 1 && ent.vd_next == 0))
10389 {
10390 warn (_("Invalid vd_next field of %lx\n"), ent.vd_next);
10391 cnt = section->sh_info;
10392 break;
10393 }
452bf675 10394 if (ent.vd_next > (size_t) (endbuf - ((char *) edefs + idx)))
5d921cbd
NC
10395 break;
10396
252b5132
RH
10397 idx += ent.vd_next;
10398 }
dd24e3da 10399
54806181
AM
10400 if (cnt < section->sh_info)
10401 printf (_(" Version definition past end of section\n"));
252b5132
RH
10402
10403 free (edefs);
10404 }
10405 break;
103f02d3 10406
252b5132
RH
10407 case SHT_GNU_verneed:
10408 {
2cf0635d 10409 Elf_External_Verneed * eneed;
452bf675
AM
10410 unsigned long idx;
10411 unsigned long cnt;
2cf0635d 10412 char * endbuf;
252b5132 10413
32ec8896 10414 found = TRUE;
252b5132 10415
d3a49aa8
AM
10416 printf (ngettext ("\nVersion needs section '%s' "
10417 "contains %u entry:\n",
10418 "\nVersion needs section '%s' "
10419 "contains %u entries:\n",
10420 section->sh_info),
dda8d76d 10421 printable_section_name (filedata, section), section->sh_info);
252b5132
RH
10422
10423 printf (_(" Addr: 0x"));
10424 printf_vma (section->sh_addr);
72de5009 10425 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
1b228002 10426 (unsigned long) section->sh_offset, section->sh_link,
dda8d76d 10427 printable_section_name_from_index (filedata, section->sh_link));
252b5132 10428
dda8d76d 10429 eneed = (Elf_External_Verneed *) get_data (NULL, filedata,
3f5e193b
NC
10430 section->sh_offset, 1,
10431 section->sh_size,
9cf03b7e 10432 _("Version Needs section"));
a6e9f9df
AM
10433 if (!eneed)
10434 break;
59245841 10435 endbuf = (char *) eneed + section->sh_size;
252b5132
RH
10436
10437 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10438 {
2cf0635d 10439 Elf_External_Verneed * entry;
b34976b6 10440 Elf_Internal_Verneed ent;
452bf675 10441 unsigned long isum;
b34976b6 10442 int j;
2cf0635d 10443 char * vstart;
252b5132
RH
10444
10445 vstart = ((char *) eneed) + idx;
54806181
AM
10446 if (vstart + sizeof (*entry) > endbuf)
10447 break;
252b5132
RH
10448
10449 entry = (Elf_External_Verneed *) vstart;
10450
10451 ent.vn_version = BYTE_GET (entry->vn_version);
10452 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
10453 ent.vn_file = BYTE_GET (entry->vn_file);
10454 ent.vn_aux = BYTE_GET (entry->vn_aux);
10455 ent.vn_next = BYTE_GET (entry->vn_next);
10456
452bf675 10457 printf (_(" %#06lx: Version: %d"), idx, ent.vn_version);
252b5132 10458
d79b3d50
NC
10459 if (VALID_DYNAMIC_NAME (ent.vn_file))
10460 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
252b5132
RH
10461 else
10462 printf (_(" File: %lx"), ent.vn_file);
10463
10464 printf (_(" Cnt: %d\n"), ent.vn_cnt);
10465
dd24e3da 10466 /* Check for overflow. */
7e26601c 10467 if (ent.vn_aux > (size_t) (endbuf - vstart))
dd24e3da 10468 break;
252b5132
RH
10469 vstart += ent.vn_aux;
10470
10471 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
10472 {
2cf0635d 10473 Elf_External_Vernaux * eaux;
b34976b6 10474 Elf_Internal_Vernaux aux;
252b5132 10475
54806181
AM
10476 if (vstart + sizeof (*eaux) > endbuf)
10477 break;
252b5132
RH
10478 eaux = (Elf_External_Vernaux *) vstart;
10479
10480 aux.vna_hash = BYTE_GET (eaux->vna_hash);
10481 aux.vna_flags = BYTE_GET (eaux->vna_flags);
10482 aux.vna_other = BYTE_GET (eaux->vna_other);
10483 aux.vna_name = BYTE_GET (eaux->vna_name);
10484 aux.vna_next = BYTE_GET (eaux->vna_next);
10485
d79b3d50 10486 if (VALID_DYNAMIC_NAME (aux.vna_name))
452bf675 10487 printf (_(" %#06lx: Name: %s"),
d79b3d50 10488 isum, GET_DYNAMIC_NAME (aux.vna_name));
252b5132 10489 else
452bf675 10490 printf (_(" %#06lx: Name index: %lx"),
252b5132
RH
10491 isum, aux.vna_name);
10492
10493 printf (_(" Flags: %s Version: %d\n"),
10494 get_ver_flags (aux.vna_flags), aux.vna_other);
10495
1445030f
AM
10496 if (aux.vna_next < sizeof (*eaux)
10497 && !(j == ent.vn_cnt - 1 && aux.vna_next == 0))
53774b7e
NC
10498 {
10499 warn (_("Invalid vna_next field of %lx\n"),
10500 aux.vna_next);
10501 j = ent.vn_cnt;
10502 break;
10503 }
1445030f
AM
10504 /* Check for overflow. */
10505 if (aux.vna_next > (size_t) (endbuf - vstart))
10506 break;
252b5132
RH
10507 isum += aux.vna_next;
10508 vstart += aux.vna_next;
10509 }
9cf03b7e 10510
54806181 10511 if (j < ent.vn_cnt)
9cf03b7e 10512 warn (_("Missing Version Needs auxillary information\n"));
252b5132 10513
1445030f
AM
10514 if (ent.vn_next < sizeof (*entry)
10515 && !(cnt == section->sh_info - 1 && ent.vn_next == 0))
c24cf8b6 10516 {
452bf675 10517 warn (_("Invalid vn_next field of %lx\n"), ent.vn_next);
c24cf8b6
NC
10518 cnt = section->sh_info;
10519 break;
10520 }
1445030f
AM
10521 if (ent.vn_next > (size_t) (endbuf - ((char *) eneed + idx)))
10522 break;
252b5132
RH
10523 idx += ent.vn_next;
10524 }
9cf03b7e 10525
54806181 10526 if (cnt < section->sh_info)
9cf03b7e 10527 warn (_("Missing Version Needs information\n"));
103f02d3 10528
252b5132
RH
10529 free (eneed);
10530 }
10531 break;
10532
10533 case SHT_GNU_versym:
10534 {
2cf0635d 10535 Elf_Internal_Shdr * link_section;
8b73c356
NC
10536 size_t total;
10537 unsigned int cnt;
2cf0635d
NC
10538 unsigned char * edata;
10539 unsigned short * data;
10540 char * strtab;
10541 Elf_Internal_Sym * symbols;
10542 Elf_Internal_Shdr * string_sec;
ba5cdace 10543 unsigned long num_syms;
d3ba0551 10544 long off;
252b5132 10545
dda8d76d 10546 if (section->sh_link >= filedata->file_header.e_shnum)
c256ffe7
JJ
10547 break;
10548
dda8d76d 10549 link_section = filedata->section_headers + section->sh_link;
08d8fa11 10550 total = section->sh_size / sizeof (Elf_External_Versym);
252b5132 10551
dda8d76d 10552 if (link_section->sh_link >= filedata->file_header.e_shnum)
c256ffe7
JJ
10553 break;
10554
32ec8896 10555 found = TRUE;
252b5132 10556
dda8d76d 10557 symbols = GET_ELF_SYMBOLS (filedata, link_section, & num_syms);
dd24e3da
NC
10558 if (symbols == NULL)
10559 break;
252b5132 10560
dda8d76d 10561 string_sec = filedata->section_headers + link_section->sh_link;
252b5132 10562
dda8d76d 10563 strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
3f5e193b
NC
10564 string_sec->sh_size,
10565 _("version string table"));
a6e9f9df 10566 if (!strtab)
0429c154
MS
10567 {
10568 free (symbols);
10569 break;
10570 }
252b5132 10571
d3a49aa8
AM
10572 printf (ngettext ("\nVersion symbols section '%s' "
10573 "contains %lu entry:\n",
10574 "\nVersion symbols section '%s' "
10575 "contains %lu entries:\n",
10576 total),
dda8d76d 10577 printable_section_name (filedata, section), (unsigned long) total);
252b5132
RH
10578
10579 printf (_(" Addr: "));
10580 printf_vma (section->sh_addr);
72de5009 10581 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
1b228002 10582 (unsigned long) section->sh_offset, section->sh_link,
dda8d76d 10583 printable_section_name (filedata, link_section));
252b5132 10584
dda8d76d 10585 off = offset_from_vma (filedata,
d3ba0551
AM
10586 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10587 total * sizeof (short));
dda8d76d 10588 edata = (unsigned char *) get_data (NULL, filedata, off, total,
3f5e193b
NC
10589 sizeof (short),
10590 _("version symbol data"));
a6e9f9df
AM
10591 if (!edata)
10592 {
10593 free (strtab);
0429c154 10594 free (symbols);
a6e9f9df
AM
10595 break;
10596 }
252b5132 10597
3f5e193b 10598 data = (short unsigned int *) cmalloc (total, sizeof (short));
252b5132
RH
10599
10600 for (cnt = total; cnt --;)
b34976b6
AM
10601 data[cnt] = byte_get (edata + cnt * sizeof (short),
10602 sizeof (short));
252b5132
RH
10603
10604 free (edata);
10605
10606 for (cnt = 0; cnt < total; cnt += 4)
10607 {
10608 int j, nn;
ab273396
AM
10609 char *name;
10610 char *invalid = _("*invalid*");
252b5132
RH
10611
10612 printf (" %03x:", cnt);
10613
10614 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
b34976b6 10615 switch (data[cnt + j])
252b5132
RH
10616 {
10617 case 0:
10618 fputs (_(" 0 (*local*) "), stdout);
10619 break;
10620
10621 case 1:
10622 fputs (_(" 1 (*global*) "), stdout);
10623 break;
10624
10625 default:
c244d050
NC
10626 nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
10627 data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
252b5132 10628
dd24e3da 10629 /* If this index value is greater than the size of the symbols
ba5cdace
NC
10630 array, break to avoid an out-of-bounds read. */
10631 if ((unsigned long)(cnt + j) >= num_syms)
dd24e3da
NC
10632 {
10633 warn (_("invalid index into symbol array\n"));
10634 break;
10635 }
10636
ab273396
AM
10637 name = NULL;
10638 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
252b5132 10639 {
b34976b6
AM
10640 Elf_Internal_Verneed ivn;
10641 unsigned long offset;
252b5132 10642
d93f0186 10643 offset = offset_from_vma
dda8d76d 10644 (filedata, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
d93f0186 10645 sizeof (Elf_External_Verneed));
252b5132 10646
b34976b6 10647 do
252b5132 10648 {
b34976b6
AM
10649 Elf_Internal_Vernaux ivna;
10650 Elf_External_Verneed evn;
10651 Elf_External_Vernaux evna;
10652 unsigned long a_off;
252b5132 10653
dda8d76d 10654 if (get_data (&evn, filedata, offset, sizeof (evn), 1,
59245841
NC
10655 _("version need")) == NULL)
10656 break;
0b4362b0 10657
252b5132
RH
10658 ivn.vn_aux = BYTE_GET (evn.vn_aux);
10659 ivn.vn_next = BYTE_GET (evn.vn_next);
10660
10661 a_off = offset + ivn.vn_aux;
10662
10663 do
10664 {
dda8d76d 10665 if (get_data (&evna, filedata, a_off, sizeof (evna),
59245841
NC
10666 1, _("version need aux (2)")) == NULL)
10667 {
10668 ivna.vna_next = 0;
10669 ivna.vna_other = 0;
10670 }
10671 else
10672 {
10673 ivna.vna_next = BYTE_GET (evna.vna_next);
10674 ivna.vna_other = BYTE_GET (evna.vna_other);
10675 }
252b5132
RH
10676
10677 a_off += ivna.vna_next;
10678 }
b34976b6 10679 while (ivna.vna_other != data[cnt + j]
252b5132
RH
10680 && ivna.vna_next != 0);
10681
b34976b6 10682 if (ivna.vna_other == data[cnt + j])
252b5132
RH
10683 {
10684 ivna.vna_name = BYTE_GET (evna.vna_name);
10685
54806181 10686 if (ivna.vna_name >= string_sec->sh_size)
ab273396 10687 name = invalid;
54806181
AM
10688 else
10689 name = strtab + ivna.vna_name;
252b5132
RH
10690 break;
10691 }
10692
10693 offset += ivn.vn_next;
10694 }
10695 while (ivn.vn_next);
10696 }
00d93f34 10697
ab273396 10698 if (data[cnt + j] != 0x8001
b34976b6 10699 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
252b5132 10700 {
b34976b6
AM
10701 Elf_Internal_Verdef ivd;
10702 Elf_External_Verdef evd;
10703 unsigned long offset;
252b5132 10704
d93f0186 10705 offset = offset_from_vma
dda8d76d 10706 (filedata, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
d93f0186 10707 sizeof evd);
252b5132
RH
10708
10709 do
10710 {
dda8d76d 10711 if (get_data (&evd, filedata, offset, sizeof (evd), 1,
59245841
NC
10712 _("version def")) == NULL)
10713 {
10714 ivd.vd_next = 0;
948f632f 10715 /* PR 17531: file: 046-1082287-0.004. */
3102e897
NC
10716 ivd.vd_ndx = (data[cnt + j] & VERSYM_VERSION) + 1;
10717 break;
59245841
NC
10718 }
10719 else
10720 {
10721 ivd.vd_next = BYTE_GET (evd.vd_next);
10722 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10723 }
252b5132
RH
10724
10725 offset += ivd.vd_next;
10726 }
c244d050 10727 while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
252b5132
RH
10728 && ivd.vd_next != 0);
10729
c244d050 10730 if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
252b5132 10731 {
b34976b6
AM
10732 Elf_External_Verdaux evda;
10733 Elf_Internal_Verdaux ivda;
252b5132
RH
10734
10735 ivd.vd_aux = BYTE_GET (evd.vd_aux);
10736
dda8d76d 10737 if (get_data (&evda, filedata,
59245841
NC
10738 offset - ivd.vd_next + ivd.vd_aux,
10739 sizeof (evda), 1,
10740 _("version def aux")) == NULL)
10741 break;
252b5132
RH
10742
10743 ivda.vda_name = BYTE_GET (evda.vda_name);
10744
54806181 10745 if (ivda.vda_name >= string_sec->sh_size)
ab273396
AM
10746 name = invalid;
10747 else if (name != NULL && name != invalid)
10748 name = _("*both*");
54806181
AM
10749 else
10750 name = strtab + ivda.vda_name;
252b5132
RH
10751 }
10752 }
ab273396
AM
10753 if (name != NULL)
10754 nn += printf ("(%s%-*s",
10755 name,
10756 12 - (int) strlen (name),
10757 ")");
252b5132
RH
10758
10759 if (nn < 18)
10760 printf ("%*c", 18 - nn, ' ');
10761 }
10762
10763 putchar ('\n');
10764 }
10765
10766 free (data);
10767 free (strtab);
10768 free (symbols);
10769 }
10770 break;
103f02d3 10771
252b5132
RH
10772 default:
10773 break;
10774 }
10775 }
10776
10777 if (! found)
10778 printf (_("\nNo version information found in this file.\n"));
10779
32ec8896 10780 return TRUE;
252b5132
RH
10781}
10782
d1133906 10783static const char *
dda8d76d 10784get_symbol_binding (Filedata * filedata, unsigned int binding)
252b5132 10785{
b34976b6 10786 static char buff[32];
252b5132
RH
10787
10788 switch (binding)
10789 {
b34976b6
AM
10790 case STB_LOCAL: return "LOCAL";
10791 case STB_GLOBAL: return "GLOBAL";
10792 case STB_WEAK: return "WEAK";
252b5132
RH
10793 default:
10794 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
e9e44622
JJ
10795 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
10796 binding);
252b5132 10797 else if (binding >= STB_LOOS && binding <= STB_HIOS)
3e7a7d11
NC
10798 {
10799 if (binding == STB_GNU_UNIQUE
dda8d76d 10800 && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
9c55345c 10801 /* GNU is still using the default value 0. */
dda8d76d 10802 || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
3e7a7d11
NC
10803 return "UNIQUE";
10804 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
10805 }
252b5132 10806 else
e9e44622 10807 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
252b5132
RH
10808 return buff;
10809 }
10810}
10811
d1133906 10812static const char *
dda8d76d 10813get_symbol_type (Filedata * filedata, unsigned int type)
252b5132 10814{
b34976b6 10815 static char buff[32];
252b5132
RH
10816
10817 switch (type)
10818 {
b34976b6
AM
10819 case STT_NOTYPE: return "NOTYPE";
10820 case STT_OBJECT: return "OBJECT";
10821 case STT_FUNC: return "FUNC";
10822 case STT_SECTION: return "SECTION";
10823 case STT_FILE: return "FILE";
10824 case STT_COMMON: return "COMMON";
10825 case STT_TLS: return "TLS";
15ab5209
DB
10826 case STT_RELC: return "RELC";
10827 case STT_SRELC: return "SRELC";
252b5132
RH
10828 default:
10829 if (type >= STT_LOPROC && type <= STT_HIPROC)
df75f1af 10830 {
dda8d76d 10831 if (filedata->file_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
3510a7b8 10832 return "THUMB_FUNC";
103f02d3 10833
dda8d76d 10834 if (filedata->file_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
103f02d3
UD
10835 return "REGISTER";
10836
dda8d76d 10837 if (filedata->file_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
103f02d3
UD
10838 return "PARISC_MILLI";
10839
e9e44622 10840 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
df75f1af 10841 }
252b5132 10842 else if (type >= STT_LOOS && type <= STT_HIOS)
103f02d3 10843 {
dda8d76d 10844 if (filedata->file_header.e_machine == EM_PARISC)
103f02d3
UD
10845 {
10846 if (type == STT_HP_OPAQUE)
10847 return "HP_OPAQUE";
10848 if (type == STT_HP_STUB)
10849 return "HP_STUB";
10850 }
10851
d8045f23 10852 if (type == STT_GNU_IFUNC
dda8d76d
NC
10853 && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10854 || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
9c55345c 10855 /* GNU is still using the default value 0. */
dda8d76d 10856 || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
d8045f23
NC
10857 return "IFUNC";
10858
e9e44622 10859 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
103f02d3 10860 }
252b5132 10861 else
e9e44622 10862 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
252b5132
RH
10863 return buff;
10864 }
10865}
10866
d1133906 10867static const char *
d3ba0551 10868get_symbol_visibility (unsigned int visibility)
d1133906
NC
10869{
10870 switch (visibility)
10871 {
b34976b6
AM
10872 case STV_DEFAULT: return "DEFAULT";
10873 case STV_INTERNAL: return "INTERNAL";
10874 case STV_HIDDEN: return "HIDDEN";
d1133906 10875 case STV_PROTECTED: return "PROTECTED";
bee0ee85
NC
10876 default:
10877 error (_("Unrecognized visibility value: %u"), visibility);
10878 return _("<unknown>");
d1133906
NC
10879 }
10880}
10881
fd85a6a1
NC
10882static const char *
10883get_solaris_symbol_visibility (unsigned int visibility)
10884{
10885 switch (visibility)
10886 {
10887 case 4: return "EXPORTED";
10888 case 5: return "SINGLETON";
10889 case 6: return "ELIMINATE";
10890 default: return get_symbol_visibility (visibility);
10891 }
10892}
10893
5e2b0d47
NC
10894static const char *
10895get_mips_symbol_other (unsigned int other)
10896{
10897 switch (other)
10898 {
32ec8896
NC
10899 case STO_OPTIONAL: return "OPTIONAL";
10900 case STO_MIPS_PLT: return "MIPS PLT";
10901 case STO_MIPS_PIC: return "MIPS PIC";
10902 case STO_MICROMIPS: return "MICROMIPS";
10903 case STO_MICROMIPS | STO_MIPS_PIC: return "MICROMIPS, MIPS PIC";
10904 case STO_MIPS16: return "MIPS16";
10905 default: return NULL;
5e2b0d47
NC
10906 }
10907}
10908
28f997cf 10909static const char *
dda8d76d 10910get_ia64_symbol_other (Filedata * filedata, unsigned int other)
28f997cf 10911{
dda8d76d 10912 if (is_ia64_vms (filedata))
28f997cf
TG
10913 {
10914 static char res[32];
10915
10916 res[0] = 0;
10917
10918 /* Function types is for images and .STB files only. */
dda8d76d 10919 switch (filedata->file_header.e_type)
28f997cf
TG
10920 {
10921 case ET_DYN:
10922 case ET_EXEC:
10923 switch (VMS_ST_FUNC_TYPE (other))
10924 {
10925 case VMS_SFT_CODE_ADDR:
10926 strcat (res, " CA");
10927 break;
10928 case VMS_SFT_SYMV_IDX:
10929 strcat (res, " VEC");
10930 break;
10931 case VMS_SFT_FD:
10932 strcat (res, " FD");
10933 break;
10934 case VMS_SFT_RESERVE:
10935 strcat (res, " RSV");
10936 break;
10937 default:
bee0ee85
NC
10938 warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
10939 VMS_ST_FUNC_TYPE (other));
10940 strcat (res, " <unknown>");
10941 break;
28f997cf
TG
10942 }
10943 break;
10944 default:
10945 break;
10946 }
10947 switch (VMS_ST_LINKAGE (other))
10948 {
10949 case VMS_STL_IGNORE:
10950 strcat (res, " IGN");
10951 break;
10952 case VMS_STL_RESERVE:
10953 strcat (res, " RSV");
10954 break;
10955 case VMS_STL_STD:
10956 strcat (res, " STD");
10957 break;
10958 case VMS_STL_LNK:
10959 strcat (res, " LNK");
10960 break;
10961 default:
bee0ee85
NC
10962 warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
10963 VMS_ST_LINKAGE (other));
10964 strcat (res, " <unknown>");
10965 break;
28f997cf
TG
10966 }
10967
10968 if (res[0] != 0)
10969 return res + 1;
10970 else
10971 return res;
10972 }
10973 return NULL;
10974}
10975
6911b7dc
AM
10976static const char *
10977get_ppc64_symbol_other (unsigned int other)
10978{
10979 if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
10980 {
10981 static char buf[32];
10982 snprintf (buf, sizeof buf, _("<localentry>: %d"),
10983 PPC64_LOCAL_ENTRY_OFFSET (other));
10984 return buf;
10985 }
10986 return NULL;
10987}
10988
5e2b0d47 10989static const char *
dda8d76d 10990get_symbol_other (Filedata * filedata, unsigned int other)
5e2b0d47
NC
10991{
10992 const char * result = NULL;
10993 static char buff [32];
10994
10995 if (other == 0)
10996 return "";
10997
dda8d76d 10998 switch (filedata->file_header.e_machine)
5e2b0d47
NC
10999 {
11000 case EM_MIPS:
11001 result = get_mips_symbol_other (other);
28f997cf
TG
11002 break;
11003 case EM_IA_64:
dda8d76d 11004 result = get_ia64_symbol_other (filedata, other);
28f997cf 11005 break;
6911b7dc
AM
11006 case EM_PPC64:
11007 result = get_ppc64_symbol_other (other);
11008 break;
5e2b0d47 11009 default:
fd85a6a1 11010 result = NULL;
5e2b0d47
NC
11011 break;
11012 }
11013
11014 if (result)
11015 return result;
11016
11017 snprintf (buff, sizeof buff, _("<other>: %x"), other);
11018 return buff;
11019}
11020
d1133906 11021static const char *
dda8d76d 11022get_symbol_index_type (Filedata * filedata, unsigned int type)
252b5132 11023{
b34976b6 11024 static char buff[32];
5cf1065c 11025
252b5132
RH
11026 switch (type)
11027 {
b34976b6
AM
11028 case SHN_UNDEF: return "UND";
11029 case SHN_ABS: return "ABS";
11030 case SHN_COMMON: return "COM";
252b5132 11031 default:
9ce701e2 11032 if (type == SHN_IA_64_ANSI_COMMON
dda8d76d
NC
11033 && filedata->file_header.e_machine == EM_IA_64
11034 && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
9ce701e2 11035 return "ANSI_COM";
dda8d76d
NC
11036 else if ((filedata->file_header.e_machine == EM_X86_64
11037 || filedata->file_header.e_machine == EM_L1OM
11038 || filedata->file_header.e_machine == EM_K1OM)
3b22753a
L
11039 && type == SHN_X86_64_LCOMMON)
11040 return "LARGE_COM";
ac145307 11041 else if ((type == SHN_MIPS_SCOMMON
dda8d76d 11042 && filedata->file_header.e_machine == EM_MIPS)
ac145307 11043 || (type == SHN_TIC6X_SCOMMON
dda8d76d 11044 && filedata->file_header.e_machine == EM_TI_C6000))
172553c7
TS
11045 return "SCOM";
11046 else if (type == SHN_MIPS_SUNDEFINED
dda8d76d 11047 && filedata->file_header.e_machine == EM_MIPS)
172553c7 11048 return "SUND";
9ce701e2 11049 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
4fbb74a6 11050 sprintf (buff, "PRC[0x%04x]", type & 0xffff);
252b5132 11051 else if (type >= SHN_LOOS && type <= SHN_HIOS)
4fbb74a6
AM
11052 sprintf (buff, "OS [0x%04x]", type & 0xffff);
11053 else if (type >= SHN_LORESERVE)
11054 sprintf (buff, "RSV[0x%04x]", type & 0xffff);
dda8d76d 11055 else if (type >= filedata->file_header.e_shnum)
e0a31db1 11056 sprintf (buff, _("bad section index[%3d]"), type);
252b5132 11057 else
232e7cb8 11058 sprintf (buff, "%3d", type);
5cf1065c 11059 break;
252b5132 11060 }
5cf1065c
NC
11061
11062 return buff;
252b5132
RH
11063}
11064
66543521 11065static bfd_vma *
dda8d76d 11066get_dynamic_data (Filedata * filedata, bfd_size_type number, unsigned int ent_size)
252b5132 11067{
2cf0635d
NC
11068 unsigned char * e_data;
11069 bfd_vma * i_data;
252b5132 11070
57028622
NC
11071 /* If the size_t type is smaller than the bfd_size_type, eg because
11072 you are building a 32-bit tool on a 64-bit host, then make sure
11073 that when (number) is cast to (size_t) no information is lost. */
11074 if (sizeof (size_t) < sizeof (bfd_size_type)
11075 && (bfd_size_type) ((size_t) number) != number)
11076 {
66cfc0fd
AM
11077 error (_("Size truncation prevents reading %s elements of size %u\n"),
11078 bfd_vmatoa ("u", number), ent_size);
57028622
NC
11079 return NULL;
11080 }
948f632f 11081
3102e897
NC
11082 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
11083 attempting to allocate memory when the read is bound to fail. */
dda8d76d 11084 if (ent_size * number > filedata->file_size)
3102e897 11085 {
66cfc0fd
AM
11086 error (_("Invalid number of dynamic entries: %s\n"),
11087 bfd_vmatoa ("u", number));
3102e897
NC
11088 return NULL;
11089 }
11090
57028622 11091 e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
252b5132
RH
11092 if (e_data == NULL)
11093 {
66cfc0fd
AM
11094 error (_("Out of memory reading %s dynamic entries\n"),
11095 bfd_vmatoa ("u", number));
252b5132
RH
11096 return NULL;
11097 }
11098
dda8d76d 11099 if (fread (e_data, ent_size, (size_t) number, filedata->handle) != number)
252b5132 11100 {
66cfc0fd
AM
11101 error (_("Unable to read in %s bytes of dynamic data\n"),
11102 bfd_vmatoa ("u", number * ent_size));
3102e897 11103 free (e_data);
252b5132
RH
11104 return NULL;
11105 }
11106
57028622 11107 i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
252b5132
RH
11108 if (i_data == NULL)
11109 {
66cfc0fd
AM
11110 error (_("Out of memory allocating space for %s dynamic entries\n"),
11111 bfd_vmatoa ("u", number));
252b5132
RH
11112 free (e_data);
11113 return NULL;
11114 }
11115
11116 while (number--)
66543521 11117 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
252b5132
RH
11118
11119 free (e_data);
11120
11121 return i_data;
11122}
11123
6bd1a22c 11124static void
dda8d76d 11125print_dynamic_symbol (Filedata * filedata, bfd_vma si, unsigned long hn)
6bd1a22c 11126{
2cf0635d 11127 Elf_Internal_Sym * psym;
6bd1a22c
L
11128 int n;
11129
6bd1a22c
L
11130 n = print_vma (si, DEC_5);
11131 if (n < 5)
0b4362b0 11132 fputs (&" "[n], stdout);
6bd1a22c 11133 printf (" %3lu: ", hn);
e0a31db1
NC
11134
11135 if (dynamic_symbols == NULL || si >= num_dynamic_syms)
11136 {
3102e897
NC
11137 printf (_("<No info available for dynamic symbol number %lu>\n"),
11138 (unsigned long) si);
e0a31db1
NC
11139 return;
11140 }
11141
11142 psym = dynamic_symbols + si;
6bd1a22c
L
11143 print_vma (psym->st_value, LONG_HEX);
11144 putchar (' ');
11145 print_vma (psym->st_size, DEC_5);
11146
dda8d76d
NC
11147 printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
11148 printf (" %-6s", get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
fd85a6a1 11149
dda8d76d 11150 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
fd85a6a1
NC
11151 printf (" %-7s", get_solaris_symbol_visibility (psym->st_other));
11152 else
11153 {
11154 unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11155
11156 printf (" %-7s", get_symbol_visibility (vis));
11157 /* Check to see if any other bits in the st_other field are set.
11158 Note - displaying this information disrupts the layout of the
11159 table being generated, but for the moment this case is very
11160 rare. */
11161 if (psym->st_other ^ vis)
dda8d76d 11162 printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
fd85a6a1
NC
11163 }
11164
dda8d76d 11165 printf (" %3.3s ", get_symbol_index_type (filedata, psym->st_shndx));
6bd1a22c
L
11166 if (VALID_DYNAMIC_NAME (psym->st_name))
11167 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
11168 else
2b692964 11169 printf (_(" <corrupt: %14ld>"), psym->st_name);
6bd1a22c
L
11170 putchar ('\n');
11171}
11172
bb4d2ac2 11173static const char *
dda8d76d 11174get_symbol_version_string (Filedata * filedata,
1449284b
NC
11175 bfd_boolean is_dynsym,
11176 const char * strtab,
11177 unsigned long int strtab_size,
11178 unsigned int si,
11179 Elf_Internal_Sym * psym,
11180 enum versioned_symbol_info * sym_info,
11181 unsigned short * vna_other)
bb4d2ac2 11182{
ab273396
AM
11183 unsigned char data[2];
11184 unsigned short vers_data;
11185 unsigned long offset;
bb4d2ac2 11186
ab273396
AM
11187 if (!is_dynsym
11188 || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
11189 return NULL;
bb4d2ac2 11190
dda8d76d 11191 offset = offset_from_vma (filedata, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
ab273396 11192 sizeof data + si * sizeof (vers_data));
bb4d2ac2 11193
dda8d76d 11194 if (get_data (&data, filedata, offset + si * sizeof (vers_data),
ab273396
AM
11195 sizeof (data), 1, _("version data")) == NULL)
11196 return NULL;
11197
11198 vers_data = byte_get (data, 2);
bb4d2ac2 11199
ab273396
AM
11200 if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data <= 1)
11201 return NULL;
bb4d2ac2 11202
ab273396
AM
11203 /* Usually we'd only see verdef for defined symbols, and verneed for
11204 undefined symbols. However, symbols defined by the linker in
11205 .dynbss for variables copied from a shared library in order to
11206 avoid text relocations are defined yet have verneed. We could
11207 use a heuristic to detect the special case, for example, check
11208 for verneed first on symbols defined in SHT_NOBITS sections, but
11209 it is simpler and more reliable to just look for both verdef and
11210 verneed. .dynbss might not be mapped to a SHT_NOBITS section. */
bb4d2ac2 11211
ab273396
AM
11212 if (psym->st_shndx != SHN_UNDEF
11213 && vers_data != 0x8001
11214 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
11215 {
11216 Elf_Internal_Verdef ivd;
11217 Elf_Internal_Verdaux ivda;
11218 Elf_External_Verdaux evda;
11219 unsigned long off;
bb4d2ac2 11220
dda8d76d 11221 off = offset_from_vma (filedata,
ab273396
AM
11222 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
11223 sizeof (Elf_External_Verdef));
11224
11225 do
bb4d2ac2 11226 {
ab273396
AM
11227 Elf_External_Verdef evd;
11228
dda8d76d 11229 if (get_data (&evd, filedata, off, sizeof (evd), 1,
ab273396
AM
11230 _("version def")) == NULL)
11231 {
11232 ivd.vd_ndx = 0;
11233 ivd.vd_aux = 0;
11234 ivd.vd_next = 0;
11235 }
11236 else
bb4d2ac2 11237 {
ab273396
AM
11238 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
11239 ivd.vd_aux = BYTE_GET (evd.vd_aux);
11240 ivd.vd_next = BYTE_GET (evd.vd_next);
11241 }
bb4d2ac2 11242
ab273396
AM
11243 off += ivd.vd_next;
11244 }
11245 while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
bb4d2ac2 11246
ab273396
AM
11247 if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
11248 {
11249 off -= ivd.vd_next;
11250 off += ivd.vd_aux;
bb4d2ac2 11251
dda8d76d 11252 if (get_data (&evda, filedata, off, sizeof (evda), 1,
ab273396
AM
11253 _("version def aux")) != NULL)
11254 {
11255 ivda.vda_name = BYTE_GET (evda.vda_name);
bb4d2ac2 11256
ab273396
AM
11257 if (psym->st_name != ivda.vda_name)
11258 {
11259 *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
11260 ? symbol_hidden : symbol_public);
11261 return (ivda.vda_name < strtab_size
11262 ? strtab + ivda.vda_name : _("<corrupt>"));
11263 }
11264 }
11265 }
11266 }
bb4d2ac2 11267
ab273396
AM
11268 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
11269 {
11270 Elf_External_Verneed evn;
11271 Elf_Internal_Verneed ivn;
11272 Elf_Internal_Vernaux ivna;
bb4d2ac2 11273
dda8d76d 11274 offset = offset_from_vma (filedata,
ab273396
AM
11275 version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
11276 sizeof evn);
11277 do
11278 {
11279 unsigned long vna_off;
bb4d2ac2 11280
dda8d76d 11281 if (get_data (&evn, filedata, offset, sizeof (evn), 1,
ab273396
AM
11282 _("version need")) == NULL)
11283 {
11284 ivna.vna_next = 0;
11285 ivna.vna_other = 0;
11286 ivna.vna_name = 0;
11287 break;
11288 }
bb4d2ac2 11289
ab273396
AM
11290 ivn.vn_aux = BYTE_GET (evn.vn_aux);
11291 ivn.vn_next = BYTE_GET (evn.vn_next);
bb4d2ac2 11292
ab273396 11293 vna_off = offset + ivn.vn_aux;
bb4d2ac2 11294
ab273396
AM
11295 do
11296 {
11297 Elf_External_Vernaux evna;
bb4d2ac2 11298
dda8d76d 11299 if (get_data (&evna, filedata, vna_off, sizeof (evna), 1,
ab273396 11300 _("version need aux (3)")) == NULL)
bb4d2ac2 11301 {
ab273396
AM
11302 ivna.vna_next = 0;
11303 ivna.vna_other = 0;
11304 ivna.vna_name = 0;
bb4d2ac2 11305 }
bb4d2ac2 11306 else
bb4d2ac2 11307 {
ab273396
AM
11308 ivna.vna_other = BYTE_GET (evna.vna_other);
11309 ivna.vna_next = BYTE_GET (evna.vna_next);
11310 ivna.vna_name = BYTE_GET (evna.vna_name);
11311 }
bb4d2ac2 11312
ab273396
AM
11313 vna_off += ivna.vna_next;
11314 }
11315 while (ivna.vna_other != vers_data && ivna.vna_next != 0);
bb4d2ac2 11316
ab273396
AM
11317 if (ivna.vna_other == vers_data)
11318 break;
bb4d2ac2 11319
ab273396
AM
11320 offset += ivn.vn_next;
11321 }
11322 while (ivn.vn_next != 0);
bb4d2ac2 11323
ab273396
AM
11324 if (ivna.vna_other == vers_data)
11325 {
11326 *sym_info = symbol_undefined;
11327 *vna_other = ivna.vna_other;
11328 return (ivna.vna_name < strtab_size
11329 ? strtab + ivna.vna_name : _("<corrupt>"));
bb4d2ac2
L
11330 }
11331 }
ab273396 11332 return NULL;
bb4d2ac2
L
11333}
11334
e3c8793a 11335/* Dump the symbol table. */
32ec8896 11336static bfd_boolean
dda8d76d 11337process_symbol_table (Filedata * filedata)
252b5132 11338{
2cf0635d 11339 Elf_Internal_Shdr * section;
8b73c356
NC
11340 bfd_size_type nbuckets = 0;
11341 bfd_size_type nchains = 0;
2cf0635d
NC
11342 bfd_vma * buckets = NULL;
11343 bfd_vma * chains = NULL;
fdc90cb4 11344 bfd_vma ngnubuckets = 0;
2cf0635d
NC
11345 bfd_vma * gnubuckets = NULL;
11346 bfd_vma * gnuchains = NULL;
6bd1a22c 11347 bfd_vma gnusymidx = 0;
071436c6 11348 bfd_size_type ngnuchains = 0;
252b5132 11349
2c610e4b 11350 if (!do_syms && !do_dyn_syms && !do_histogram)
32ec8896 11351 return TRUE;
252b5132 11352
6bd1a22c
L
11353 if (dynamic_info[DT_HASH]
11354 && (do_histogram
2c610e4b
L
11355 || (do_using_dynamic
11356 && !do_dyn_syms
11357 && dynamic_strings != NULL)))
252b5132 11358 {
66543521
AM
11359 unsigned char nb[8];
11360 unsigned char nc[8];
8b73c356 11361 unsigned int hash_ent_size = 4;
66543521 11362
dda8d76d
NC
11363 if ((filedata->file_header.e_machine == EM_ALPHA
11364 || filedata->file_header.e_machine == EM_S390
11365 || filedata->file_header.e_machine == EM_S390_OLD)
11366 && filedata->file_header.e_ident[EI_CLASS] == ELFCLASS64)
66543521
AM
11367 hash_ent_size = 8;
11368
dda8d76d 11369 if (fseek (filedata->handle,
fb52b2f4 11370 (archive_file_offset
dda8d76d 11371 + offset_from_vma (filedata, dynamic_info[DT_HASH],
fb52b2f4 11372 sizeof nb + sizeof nc)),
d93f0186 11373 SEEK_SET))
252b5132 11374 {
591a748a 11375 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 11376 goto no_hash;
252b5132
RH
11377 }
11378
dda8d76d 11379 if (fread (nb, hash_ent_size, 1, filedata->handle) != 1)
252b5132
RH
11380 {
11381 error (_("Failed to read in number of buckets\n"));
d3a44ec6 11382 goto no_hash;
252b5132
RH
11383 }
11384
dda8d76d 11385 if (fread (nc, hash_ent_size, 1, filedata->handle) != 1)
252b5132
RH
11386 {
11387 error (_("Failed to read in number of chains\n"));
d3a44ec6 11388 goto no_hash;
252b5132
RH
11389 }
11390
66543521
AM
11391 nbuckets = byte_get (nb, hash_ent_size);
11392 nchains = byte_get (nc, hash_ent_size);
252b5132 11393
dda8d76d
NC
11394 buckets = get_dynamic_data (filedata, nbuckets, hash_ent_size);
11395 chains = get_dynamic_data (filedata, nchains, hash_ent_size);
252b5132 11396
d3a44ec6 11397 no_hash:
252b5132 11398 if (buckets == NULL || chains == NULL)
d3a44ec6
JJ
11399 {
11400 if (do_using_dynamic)
32ec8896 11401 return FALSE;
d3a44ec6
JJ
11402 free (buckets);
11403 free (chains);
11404 buckets = NULL;
11405 chains = NULL;
11406 nbuckets = 0;
11407 nchains = 0;
11408 }
252b5132
RH
11409 }
11410
6bd1a22c
L
11411 if (dynamic_info_DT_GNU_HASH
11412 && (do_histogram
2c610e4b
L
11413 || (do_using_dynamic
11414 && !do_dyn_syms
11415 && dynamic_strings != NULL)))
252b5132 11416 {
6bd1a22c
L
11417 unsigned char nb[16];
11418 bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
11419 bfd_vma buckets_vma;
11420
dda8d76d 11421 if (fseek (filedata->handle,
6bd1a22c 11422 (archive_file_offset
dda8d76d 11423 + offset_from_vma (filedata, dynamic_info_DT_GNU_HASH,
6bd1a22c
L
11424 sizeof nb)),
11425 SEEK_SET))
11426 {
11427 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 11428 goto no_gnu_hash;
6bd1a22c 11429 }
252b5132 11430
dda8d76d 11431 if (fread (nb, 16, 1, filedata->handle) != 1)
6bd1a22c
L
11432 {
11433 error (_("Failed to read in number of buckets\n"));
d3a44ec6 11434 goto no_gnu_hash;
6bd1a22c
L
11435 }
11436
11437 ngnubuckets = byte_get (nb, 4);
11438 gnusymidx = byte_get (nb + 4, 4);
11439 bitmaskwords = byte_get (nb + 8, 4);
11440 buckets_vma = dynamic_info_DT_GNU_HASH + 16;
f7a99963 11441 if (is_32bit_elf)
6bd1a22c 11442 buckets_vma += bitmaskwords * 4;
f7a99963 11443 else
6bd1a22c 11444 buckets_vma += bitmaskwords * 8;
252b5132 11445
dda8d76d 11446 if (fseek (filedata->handle,
6bd1a22c 11447 (archive_file_offset
dda8d76d 11448 + offset_from_vma (filedata, buckets_vma, 4)),
6bd1a22c 11449 SEEK_SET))
252b5132 11450 {
6bd1a22c 11451 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 11452 goto no_gnu_hash;
6bd1a22c
L
11453 }
11454
dda8d76d 11455 gnubuckets = get_dynamic_data (filedata, ngnubuckets, 4);
252b5132 11456
6bd1a22c 11457 if (gnubuckets == NULL)
d3a44ec6 11458 goto no_gnu_hash;
6bd1a22c
L
11459
11460 for (i = 0; i < ngnubuckets; i++)
11461 if (gnubuckets[i] != 0)
11462 {
11463 if (gnubuckets[i] < gnusymidx)
32ec8896 11464 return FALSE;
6bd1a22c
L
11465
11466 if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
11467 maxchain = gnubuckets[i];
11468 }
11469
11470 if (maxchain == 0xffffffff)
d3a44ec6 11471 goto no_gnu_hash;
6bd1a22c
L
11472
11473 maxchain -= gnusymidx;
11474
dda8d76d 11475 if (fseek (filedata->handle,
6bd1a22c 11476 (archive_file_offset
dda8d76d 11477 + offset_from_vma (filedata, buckets_vma
6bd1a22c
L
11478 + 4 * (ngnubuckets + maxchain), 4)),
11479 SEEK_SET))
11480 {
11481 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 11482 goto no_gnu_hash;
6bd1a22c
L
11483 }
11484
11485 do
11486 {
dda8d76d 11487 if (fread (nb, 4, 1, filedata->handle) != 1)
252b5132 11488 {
6bd1a22c 11489 error (_("Failed to determine last chain length\n"));
d3a44ec6 11490 goto no_gnu_hash;
6bd1a22c 11491 }
252b5132 11492
6bd1a22c 11493 if (maxchain + 1 == 0)
d3a44ec6 11494 goto no_gnu_hash;
252b5132 11495
6bd1a22c
L
11496 ++maxchain;
11497 }
11498 while ((byte_get (nb, 4) & 1) == 0);
76da6bbe 11499
dda8d76d 11500 if (fseek (filedata->handle,
6bd1a22c 11501 (archive_file_offset
dda8d76d 11502 + offset_from_vma (filedata, buckets_vma + 4 * ngnubuckets, 4)),
6bd1a22c
L
11503 SEEK_SET))
11504 {
11505 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 11506 goto no_gnu_hash;
6bd1a22c
L
11507 }
11508
dda8d76d 11509 gnuchains = get_dynamic_data (filedata, maxchain, 4);
071436c6 11510 ngnuchains = maxchain;
6bd1a22c 11511
d3a44ec6 11512 no_gnu_hash:
6bd1a22c 11513 if (gnuchains == NULL)
d3a44ec6
JJ
11514 {
11515 free (gnubuckets);
d3a44ec6
JJ
11516 gnubuckets = NULL;
11517 ngnubuckets = 0;
f64fddf1 11518 if (do_using_dynamic)
32ec8896 11519 return FALSE;
d3a44ec6 11520 }
6bd1a22c
L
11521 }
11522
11523 if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
11524 && do_syms
11525 && do_using_dynamic
3102e897
NC
11526 && dynamic_strings != NULL
11527 && dynamic_symbols != NULL)
6bd1a22c
L
11528 {
11529 unsigned long hn;
11530
11531 if (dynamic_info[DT_HASH])
11532 {
11533 bfd_vma si;
6bd6a03d 11534 char *visited;
6bd1a22c
L
11535
11536 printf (_("\nSymbol table for image:\n"));
11537 if (is_32bit_elf)
11538 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11539 else
11540 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11541
6bd6a03d
AM
11542 visited = xcmalloc (nchains, 1);
11543 memset (visited, 0, nchains);
6bd1a22c
L
11544 for (hn = 0; hn < nbuckets; hn++)
11545 {
6bd6a03d
AM
11546 for (si = buckets[hn]; si > 0; si = chains[si])
11547 {
dda8d76d 11548 print_dynamic_symbol (filedata, si, hn);
6bd6a03d
AM
11549 if (si >= nchains || visited[si])
11550 {
11551 error (_("histogram chain is corrupt\n"));
11552 break;
11553 }
11554 visited[si] = 1;
11555 }
252b5132 11556 }
6bd6a03d 11557 free (visited);
252b5132 11558 }
6bd1a22c
L
11559
11560 if (dynamic_info_DT_GNU_HASH)
11561 {
11562 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
11563 if (is_32bit_elf)
11564 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11565 else
11566 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11567
11568 for (hn = 0; hn < ngnubuckets; ++hn)
11569 if (gnubuckets[hn] != 0)
11570 {
11571 bfd_vma si = gnubuckets[hn];
11572 bfd_vma off = si - gnusymidx;
11573
11574 do
11575 {
dda8d76d 11576 print_dynamic_symbol (filedata, si, hn);
6bd1a22c
L
11577 si++;
11578 }
071436c6 11579 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
6bd1a22c
L
11580 }
11581 }
252b5132 11582 }
8b73c356 11583 else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
dda8d76d 11584 && filedata->section_headers != NULL)
252b5132 11585 {
b34976b6 11586 unsigned int i;
252b5132 11587
dda8d76d
NC
11588 for (i = 0, section = filedata->section_headers;
11589 i < filedata->file_header.e_shnum;
252b5132
RH
11590 i++, section++)
11591 {
b34976b6 11592 unsigned int si;
2cf0635d 11593 char * strtab = NULL;
c256ffe7 11594 unsigned long int strtab_size = 0;
2cf0635d
NC
11595 Elf_Internal_Sym * symtab;
11596 Elf_Internal_Sym * psym;
ba5cdace 11597 unsigned long num_syms;
252b5132 11598
2c610e4b
L
11599 if ((section->sh_type != SHT_SYMTAB
11600 && section->sh_type != SHT_DYNSYM)
11601 || (!do_syms
11602 && section->sh_type == SHT_SYMTAB))
252b5132
RH
11603 continue;
11604
dd24e3da
NC
11605 if (section->sh_entsize == 0)
11606 {
11607 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
dda8d76d 11608 printable_section_name (filedata, section));
dd24e3da
NC
11609 continue;
11610 }
11611
d3a49aa8
AM
11612 num_syms = section->sh_size / section->sh_entsize;
11613 printf (ngettext ("\nSymbol table '%s' contains %lu entry:\n",
11614 "\nSymbol table '%s' contains %lu entries:\n",
11615 num_syms),
dda8d76d 11616 printable_section_name (filedata, section),
d3a49aa8 11617 num_syms);
dd24e3da 11618
f7a99963 11619 if (is_32bit_elf)
ca47b30c 11620 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
f7a99963 11621 else
ca47b30c 11622 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
252b5132 11623
dda8d76d 11624 symtab = GET_ELF_SYMBOLS (filedata, section, & num_syms);
252b5132
RH
11625 if (symtab == NULL)
11626 continue;
11627
dda8d76d 11628 if (section->sh_link == filedata->file_header.e_shstrndx)
c256ffe7 11629 {
dda8d76d
NC
11630 strtab = filedata->string_table;
11631 strtab_size = filedata->string_table_length;
c256ffe7 11632 }
dda8d76d 11633 else if (section->sh_link < filedata->file_header.e_shnum)
252b5132 11634 {
2cf0635d 11635 Elf_Internal_Shdr * string_sec;
252b5132 11636
dda8d76d 11637 string_sec = filedata->section_headers + section->sh_link;
252b5132 11638
dda8d76d 11639 strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset,
3f5e193b
NC
11640 1, string_sec->sh_size,
11641 _("string table"));
c256ffe7 11642 strtab_size = strtab != NULL ? string_sec->sh_size : 0;
252b5132
RH
11643 }
11644
ba5cdace 11645 for (si = 0, psym = symtab; si < num_syms; si++, psym++)
252b5132 11646 {
bb4d2ac2
L
11647 const char *version_string;
11648 enum versioned_symbol_info sym_info;
11649 unsigned short vna_other;
11650
5e220199 11651 printf ("%6d: ", si);
f7a99963
NC
11652 print_vma (psym->st_value, LONG_HEX);
11653 putchar (' ');
11654 print_vma (psym->st_size, DEC_5);
dda8d76d
NC
11655 printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
11656 printf (" %-6s", get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
11657 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
fd85a6a1
NC
11658 printf (" %-7s", get_solaris_symbol_visibility (psym->st_other));
11659 else
11660 {
11661 unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11662
11663 printf (" %-7s", get_symbol_visibility (vis));
11664 /* Check to see if any other bits in the st_other field are set.
11665 Note - displaying this information disrupts the layout of the
11666 table being generated, but for the moment this case is very rare. */
11667 if (psym->st_other ^ vis)
dda8d76d 11668 printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
fd85a6a1 11669 }
dda8d76d 11670 printf (" %4s ", get_symbol_index_type (filedata, psym->st_shndx));
c256ffe7 11671 print_symbol (25, psym->st_name < strtab_size
2b692964 11672 ? strtab + psym->st_name : _("<corrupt>"));
252b5132 11673
bb4d2ac2 11674 version_string
dda8d76d 11675 = get_symbol_version_string (filedata,
bb4d2ac2
L
11676 section->sh_type == SHT_DYNSYM,
11677 strtab, strtab_size, si,
11678 psym, &sym_info, &vna_other);
11679 if (version_string)
252b5132 11680 {
bb4d2ac2
L
11681 if (sym_info == symbol_undefined)
11682 printf ("@%s (%d)", version_string, vna_other);
11683 else
11684 printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
11685 version_string);
252b5132
RH
11686 }
11687
11688 putchar ('\n');
52c3c391
NC
11689
11690 if (ELF_ST_BIND (psym->st_info) == STB_LOCAL
dd905818
NC
11691 && si >= section->sh_info
11692 /* Irix 5 and 6 MIPS binaries are known to ignore this requirement. */
dda8d76d 11693 && filedata->file_header.e_machine != EM_MIPS
dd905818
NC
11694 /* Solaris binaries have been found to violate this requirement as
11695 well. Not sure if this is a bug or an ABI requirement. */
dda8d76d 11696 && filedata->file_header.e_ident[EI_OSABI] != ELFOSABI_SOLARIS)
52c3c391 11697 warn (_("local symbol %u found at index >= %s's sh_info value of %u\n"),
dda8d76d 11698 si, printable_section_name (filedata, section), section->sh_info);
252b5132
RH
11699 }
11700
11701 free (symtab);
dda8d76d 11702 if (strtab != filedata->string_table)
252b5132
RH
11703 free (strtab);
11704 }
11705 }
11706 else if (do_syms)
11707 printf
11708 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
11709
11710 if (do_histogram && buckets != NULL)
11711 {
2cf0635d
NC
11712 unsigned long * lengths;
11713 unsigned long * counts;
66543521
AM
11714 unsigned long hn;
11715 bfd_vma si;
11716 unsigned long maxlength = 0;
11717 unsigned long nzero_counts = 0;
11718 unsigned long nsyms = 0;
6bd6a03d 11719 char *visited;
252b5132 11720
d3a49aa8
AM
11721 printf (ngettext ("\nHistogram for bucket list length "
11722 "(total of %lu bucket):\n",
11723 "\nHistogram for bucket list length "
11724 "(total of %lu buckets):\n",
11725 (unsigned long) nbuckets),
66543521 11726 (unsigned long) nbuckets);
252b5132 11727
3f5e193b 11728 lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
252b5132
RH
11729 if (lengths == NULL)
11730 {
8b73c356 11731 error (_("Out of memory allocating space for histogram buckets\n"));
32ec8896 11732 return FALSE;
252b5132 11733 }
6bd6a03d
AM
11734 visited = xcmalloc (nchains, 1);
11735 memset (visited, 0, nchains);
8b73c356
NC
11736
11737 printf (_(" Length Number %% of total Coverage\n"));
252b5132
RH
11738 for (hn = 0; hn < nbuckets; ++hn)
11739 {
6bd6a03d 11740 for (si = buckets[hn]; si > 0; si = chains[si])
252b5132 11741 {
b34976b6 11742 ++nsyms;
252b5132 11743 if (maxlength < ++lengths[hn])
b34976b6 11744 ++maxlength;
6bd6a03d
AM
11745 if (si >= nchains || visited[si])
11746 {
11747 error (_("histogram chain is corrupt\n"));
11748 break;
11749 }
11750 visited[si] = 1;
252b5132
RH
11751 }
11752 }
6bd6a03d 11753 free (visited);
252b5132 11754
3f5e193b 11755 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
252b5132
RH
11756 if (counts == NULL)
11757 {
b2e951ec 11758 free (lengths);
8b73c356 11759 error (_("Out of memory allocating space for histogram counts\n"));
32ec8896 11760 return FALSE;
252b5132
RH
11761 }
11762
11763 for (hn = 0; hn < nbuckets; ++hn)
b34976b6 11764 ++counts[lengths[hn]];
252b5132 11765
103f02d3 11766 if (nbuckets > 0)
252b5132 11767 {
66543521
AM
11768 unsigned long i;
11769 printf (" 0 %-10lu (%5.1f%%)\n",
103f02d3 11770 counts[0], (counts[0] * 100.0) / nbuckets);
66543521 11771 for (i = 1; i <= maxlength; ++i)
103f02d3 11772 {
66543521
AM
11773 nzero_counts += counts[i] * i;
11774 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11775 i, counts[i], (counts[i] * 100.0) / nbuckets,
103f02d3
UD
11776 (nzero_counts * 100.0) / nsyms);
11777 }
252b5132
RH
11778 }
11779
11780 free (counts);
11781 free (lengths);
11782 }
11783
11784 if (buckets != NULL)
11785 {
11786 free (buckets);
11787 free (chains);
11788 }
11789
d3a44ec6 11790 if (do_histogram && gnubuckets != NULL)
fdc90cb4 11791 {
2cf0635d
NC
11792 unsigned long * lengths;
11793 unsigned long * counts;
fdc90cb4
JJ
11794 unsigned long hn;
11795 unsigned long maxlength = 0;
11796 unsigned long nzero_counts = 0;
11797 unsigned long nsyms = 0;
fdc90cb4 11798
d3a49aa8
AM
11799 printf (ngettext ("\nHistogram for `.gnu.hash' bucket list length "
11800 "(total of %lu bucket):\n",
11801 "\nHistogram for `.gnu.hash' bucket list length "
11802 "(total of %lu buckets):\n",
11803 (unsigned long) ngnubuckets),
8b73c356
NC
11804 (unsigned long) ngnubuckets);
11805
3f5e193b 11806 lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
fdc90cb4
JJ
11807 if (lengths == NULL)
11808 {
8b73c356 11809 error (_("Out of memory allocating space for gnu histogram buckets\n"));
32ec8896 11810 return FALSE;
fdc90cb4
JJ
11811 }
11812
fdc90cb4
JJ
11813 printf (_(" Length Number %% of total Coverage\n"));
11814
11815 for (hn = 0; hn < ngnubuckets; ++hn)
11816 if (gnubuckets[hn] != 0)
11817 {
11818 bfd_vma off, length = 1;
11819
6bd1a22c 11820 for (off = gnubuckets[hn] - gnusymidx;
071436c6
NC
11821 /* PR 17531 file: 010-77222-0.004. */
11822 off < ngnuchains && (gnuchains[off] & 1) == 0;
11823 ++off)
fdc90cb4
JJ
11824 ++length;
11825 lengths[hn] = length;
11826 if (length > maxlength)
11827 maxlength = length;
11828 nsyms += length;
11829 }
11830
3f5e193b 11831 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
fdc90cb4
JJ
11832 if (counts == NULL)
11833 {
b2e951ec 11834 free (lengths);
8b73c356 11835 error (_("Out of memory allocating space for gnu histogram counts\n"));
32ec8896 11836 return FALSE;
fdc90cb4
JJ
11837 }
11838
11839 for (hn = 0; hn < ngnubuckets; ++hn)
11840 ++counts[lengths[hn]];
11841
11842 if (ngnubuckets > 0)
11843 {
11844 unsigned long j;
11845 printf (" 0 %-10lu (%5.1f%%)\n",
11846 counts[0], (counts[0] * 100.0) / ngnubuckets);
11847 for (j = 1; j <= maxlength; ++j)
11848 {
11849 nzero_counts += counts[j] * j;
11850 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11851 j, counts[j], (counts[j] * 100.0) / ngnubuckets,
11852 (nzero_counts * 100.0) / nsyms);
11853 }
11854 }
11855
11856 free (counts);
11857 free (lengths);
11858 free (gnubuckets);
11859 free (gnuchains);
11860 }
11861
32ec8896 11862 return TRUE;
252b5132
RH
11863}
11864
32ec8896 11865static bfd_boolean
dda8d76d 11866process_syminfo (Filedata * filedata ATTRIBUTE_UNUSED)
252b5132 11867{
b4c96d0d 11868 unsigned int i;
252b5132
RH
11869
11870 if (dynamic_syminfo == NULL
11871 || !do_dynamic)
11872 /* No syminfo, this is ok. */
32ec8896 11873 return TRUE;
252b5132
RH
11874
11875 /* There better should be a dynamic symbol section. */
11876 if (dynamic_symbols == NULL || dynamic_strings == NULL)
32ec8896 11877 return FALSE;
252b5132
RH
11878
11879 if (dynamic_addr)
d3a49aa8
AM
11880 printf (ngettext ("\nDynamic info segment at offset 0x%lx "
11881 "contains %d entry:\n",
11882 "\nDynamic info segment at offset 0x%lx "
11883 "contains %d entries:\n",
11884 dynamic_syminfo_nent),
252b5132
RH
11885 dynamic_syminfo_offset, dynamic_syminfo_nent);
11886
11887 printf (_(" Num: Name BoundTo Flags\n"));
11888 for (i = 0; i < dynamic_syminfo_nent; ++i)
11889 {
11890 unsigned short int flags = dynamic_syminfo[i].si_flags;
11891
31104126 11892 printf ("%4d: ", i);
4082ef84
NC
11893 if (i >= num_dynamic_syms)
11894 printf (_("<corrupt index>"));
11895 else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
d79b3d50
NC
11896 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
11897 else
2b692964 11898 printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
31104126 11899 putchar (' ');
252b5132
RH
11900
11901 switch (dynamic_syminfo[i].si_boundto)
11902 {
11903 case SYMINFO_BT_SELF:
11904 fputs ("SELF ", stdout);
11905 break;
11906 case SYMINFO_BT_PARENT:
11907 fputs ("PARENT ", stdout);
11908 break;
11909 default:
11910 if (dynamic_syminfo[i].si_boundto > 0
d79b3d50
NC
11911 && dynamic_syminfo[i].si_boundto < dynamic_nent
11912 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
31104126 11913 {
d79b3d50 11914 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
31104126
NC
11915 putchar (' ' );
11916 }
252b5132
RH
11917 else
11918 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
11919 break;
11920 }
11921
11922 if (flags & SYMINFO_FLG_DIRECT)
11923 printf (" DIRECT");
11924 if (flags & SYMINFO_FLG_PASSTHRU)
11925 printf (" PASSTHRU");
11926 if (flags & SYMINFO_FLG_COPY)
11927 printf (" COPY");
11928 if (flags & SYMINFO_FLG_LAZYLOAD)
11929 printf (" LAZYLOAD");
11930
11931 puts ("");
11932 }
11933
32ec8896 11934 return TRUE;
252b5132
RH
11935}
11936
b32e566b
NC
11937#define IN_RANGE(START,END,ADDR,OFF) \
11938 (((ADDR) >= (START)) && ((ADDR) + (OFF) < (END)))
11939
cf13d699
NC
11940/* Check to see if the given reloc needs to be handled in a target specific
11941 manner. If so then process the reloc and return TRUE otherwise return
f84ce13b
NC
11942 FALSE.
11943
11944 If called with reloc == NULL, then this is a signal that reloc processing
11945 for the current section has finished, and any saved state should be
11946 discarded. */
09c11c86 11947
cf13d699 11948static bfd_boolean
dda8d76d
NC
11949target_specific_reloc_handling (Filedata * filedata,
11950 Elf_Internal_Rela * reloc,
11951 unsigned char * start,
11952 unsigned char * end,
11953 Elf_Internal_Sym * symtab,
11954 unsigned long num_syms)
252b5132 11955{
f84ce13b
NC
11956 unsigned int reloc_type = 0;
11957 unsigned long sym_index = 0;
11958
11959 if (reloc)
11960 {
dda8d76d 11961 reloc_type = get_reloc_type (filedata, reloc->r_info);
f84ce13b
NC
11962 sym_index = get_reloc_symindex (reloc->r_info);
11963 }
252b5132 11964
dda8d76d 11965 switch (filedata->file_header.e_machine)
252b5132 11966 {
13761a11
NC
11967 case EM_MSP430:
11968 case EM_MSP430_OLD:
11969 {
11970 static Elf_Internal_Sym * saved_sym = NULL;
11971
f84ce13b
NC
11972 if (reloc == NULL)
11973 {
11974 saved_sym = NULL;
11975 return TRUE;
11976 }
11977
13761a11
NC
11978 switch (reloc_type)
11979 {
11980 case 10: /* R_MSP430_SYM_DIFF */
dda8d76d 11981 if (uses_msp430x_relocs (filedata))
13761a11 11982 break;
1a0670f3 11983 /* Fall through. */
13761a11 11984 case 21: /* R_MSP430X_SYM_DIFF */
f84ce13b
NC
11985 /* PR 21139. */
11986 if (sym_index >= num_syms)
11987 error (_("MSP430 SYM_DIFF reloc contains invalid symbol index %lu\n"),
11988 sym_index);
11989 else
11990 saved_sym = symtab + sym_index;
13761a11
NC
11991 return TRUE;
11992
11993 case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
11994 case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
11995 goto handle_sym_diff;
0b4362b0 11996
13761a11
NC
11997 case 5: /* R_MSP430_16_BYTE */
11998 case 9: /* R_MSP430_8 */
dda8d76d 11999 if (uses_msp430x_relocs (filedata))
13761a11
NC
12000 break;
12001 goto handle_sym_diff;
12002
12003 case 2: /* R_MSP430_ABS16 */
12004 case 15: /* R_MSP430X_ABS16 */
dda8d76d 12005 if (! uses_msp430x_relocs (filedata))
13761a11
NC
12006 break;
12007 goto handle_sym_diff;
0b4362b0 12008
13761a11
NC
12009 handle_sym_diff:
12010 if (saved_sym != NULL)
12011 {
03f7786e 12012 int reloc_size = reloc_type == 1 ? 4 : 2;
13761a11
NC
12013 bfd_vma value;
12014
f84ce13b
NC
12015 if (sym_index >= num_syms)
12016 error (_("MSP430 reloc contains invalid symbol index %lu\n"),
12017 sym_index);
03f7786e 12018 else
f84ce13b
NC
12019 {
12020 value = reloc->r_addend + (symtab[sym_index].st_value
12021 - saved_sym->st_value);
12022
b32e566b 12023 if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
f84ce13b 12024 byte_put (start + reloc->r_offset, value, reloc_size);
b32e566b
NC
12025 else
12026 /* PR 21137 */
12027 error (_("MSP430 sym diff reloc contains invalid offset: 0x%lx\n"),
12028 (long) reloc->r_offset);
f84ce13b 12029 }
13761a11
NC
12030
12031 saved_sym = NULL;
12032 return TRUE;
12033 }
12034 break;
12035
12036 default:
12037 if (saved_sym != NULL)
071436c6 12038 error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
13761a11
NC
12039 break;
12040 }
12041 break;
12042 }
12043
cf13d699
NC
12044 case EM_MN10300:
12045 case EM_CYGNUS_MN10300:
12046 {
12047 static Elf_Internal_Sym * saved_sym = NULL;
252b5132 12048
f84ce13b
NC
12049 if (reloc == NULL)
12050 {
12051 saved_sym = NULL;
12052 return TRUE;
12053 }
12054
cf13d699
NC
12055 switch (reloc_type)
12056 {
12057 case 34: /* R_MN10300_ALIGN */
12058 return TRUE;
12059 case 33: /* R_MN10300_SYM_DIFF */
f84ce13b
NC
12060 if (sym_index >= num_syms)
12061 error (_("MN10300_SYM_DIFF reloc contains invalid symbol index %lu\n"),
12062 sym_index);
12063 else
12064 saved_sym = symtab + sym_index;
cf13d699 12065 return TRUE;
f84ce13b 12066
cf13d699
NC
12067 case 1: /* R_MN10300_32 */
12068 case 2: /* R_MN10300_16 */
12069 if (saved_sym != NULL)
12070 {
03f7786e 12071 int reloc_size = reloc_type == 1 ? 4 : 2;
cf13d699 12072 bfd_vma value;
252b5132 12073
f84ce13b
NC
12074 if (sym_index >= num_syms)
12075 error (_("MN10300 reloc contains invalid symbol index %lu\n"),
12076 sym_index);
03f7786e 12077 else
f84ce13b
NC
12078 {
12079 value = reloc->r_addend + (symtab[sym_index].st_value
12080 - saved_sym->st_value);
12081
b32e566b 12082 if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
f84ce13b 12083 byte_put (start + reloc->r_offset, value, reloc_size);
b32e566b
NC
12084 else
12085 error (_("MN10300 sym diff reloc contains invalid offset: 0x%lx\n"),
12086 (long) reloc->r_offset);
f84ce13b 12087 }
252b5132 12088
cf13d699
NC
12089 saved_sym = NULL;
12090 return TRUE;
12091 }
12092 break;
12093 default:
12094 if (saved_sym != NULL)
071436c6 12095 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
cf13d699
NC
12096 break;
12097 }
12098 break;
12099 }
6ff71e76
NC
12100
12101 case EM_RL78:
12102 {
12103 static bfd_vma saved_sym1 = 0;
12104 static bfd_vma saved_sym2 = 0;
12105 static bfd_vma value;
12106
f84ce13b
NC
12107 if (reloc == NULL)
12108 {
12109 saved_sym1 = saved_sym2 = 0;
12110 return TRUE;
12111 }
12112
6ff71e76
NC
12113 switch (reloc_type)
12114 {
12115 case 0x80: /* R_RL78_SYM. */
12116 saved_sym1 = saved_sym2;
f84ce13b
NC
12117 if (sym_index >= num_syms)
12118 error (_("RL78_SYM reloc contains invalid symbol index %lu\n"),
12119 sym_index);
12120 else
12121 {
12122 saved_sym2 = symtab[sym_index].st_value;
12123 saved_sym2 += reloc->r_addend;
12124 }
6ff71e76
NC
12125 return TRUE;
12126
12127 case 0x83: /* R_RL78_OPsub. */
12128 value = saved_sym1 - saved_sym2;
12129 saved_sym2 = saved_sym1 = 0;
12130 return TRUE;
12131 break;
12132
12133 case 0x41: /* R_RL78_ABS32. */
b32e566b 12134 if (IN_RANGE (start, end, start + reloc->r_offset, 4))
03f7786e 12135 byte_put (start + reloc->r_offset, value, 4);
b32e566b
NC
12136 else
12137 error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12138 (long) reloc->r_offset);
6ff71e76
NC
12139 value = 0;
12140 return TRUE;
12141
12142 case 0x43: /* R_RL78_ABS16. */
b32e566b 12143 if (IN_RANGE (start, end, start + reloc->r_offset, 2))
03f7786e 12144 byte_put (start + reloc->r_offset, value, 2);
b32e566b
NC
12145 else
12146 error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12147 (long) reloc->r_offset);
6ff71e76
NC
12148 value = 0;
12149 return TRUE;
12150
12151 default:
12152 break;
12153 }
12154 break;
12155 }
252b5132
RH
12156 }
12157
cf13d699 12158 return FALSE;
252b5132
RH
12159}
12160
aca88567
NC
12161/* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
12162 DWARF debug sections. This is a target specific test. Note - we do not
12163 go through the whole including-target-headers-multiple-times route, (as
12164 we have already done with <elf/h8.h>) because this would become very
12165 messy and even then this function would have to contain target specific
12166 information (the names of the relocs instead of their numeric values).
12167 FIXME: This is not the correct way to solve this problem. The proper way
12168 is to have target specific reloc sizing and typing functions created by
12169 the reloc-macros.h header, in the same way that it already creates the
12170 reloc naming functions. */
12171
12172static bfd_boolean
dda8d76d 12173is_32bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
aca88567 12174{
d347c9df 12175 /* Please keep this table alpha-sorted for ease of visual lookup. */
dda8d76d 12176 switch (filedata->file_header.e_machine)
aca88567 12177 {
41e92641 12178 case EM_386:
22abe556 12179 case EM_IAMCU:
41e92641 12180 return reloc_type == 1; /* R_386_32. */
aca88567
NC
12181 case EM_68K:
12182 return reloc_type == 1; /* R_68K_32. */
12183 case EM_860:
12184 return reloc_type == 1; /* R_860_32. */
137b6b5f
AM
12185 case EM_960:
12186 return reloc_type == 2; /* R_960_32. */
a06ea964 12187 case EM_AARCH64:
9282b95a
JW
12188 return (reloc_type == 258
12189 || reloc_type == 1); /* R_AARCH64_ABS32 || R_AARCH64_P32_ABS32 */
d347c9df
PS
12190 case EM_ADAPTEVA_EPIPHANY:
12191 return reloc_type == 3;
aca88567 12192 case EM_ALPHA:
137b6b5f 12193 return reloc_type == 1; /* R_ALPHA_REFLONG. */
41e92641
NC
12194 case EM_ARC:
12195 return reloc_type == 1; /* R_ARC_32. */
886a2506
NC
12196 case EM_ARC_COMPACT:
12197 case EM_ARC_COMPACT2:
12198 return reloc_type == 4; /* R_ARC_32. */
41e92641
NC
12199 case EM_ARM:
12200 return reloc_type == 2; /* R_ARM_ABS32 */
cb8f3167 12201 case EM_AVR_OLD:
aca88567
NC
12202 case EM_AVR:
12203 return reloc_type == 1;
12204 case EM_BLACKFIN:
12205 return reloc_type == 0x12; /* R_byte4_data. */
12206 case EM_CRIS:
12207 return reloc_type == 3; /* R_CRIS_32. */
12208 case EM_CR16:
12209 return reloc_type == 3; /* R_CR16_NUM32. */
12210 case EM_CRX:
12211 return reloc_type == 15; /* R_CRX_NUM32. */
12212 case EM_CYGNUS_FRV:
12213 return reloc_type == 1;
41e92641
NC
12214 case EM_CYGNUS_D10V:
12215 case EM_D10V:
12216 return reloc_type == 6; /* R_D10V_32. */
aca88567
NC
12217 case EM_CYGNUS_D30V:
12218 case EM_D30V:
12219 return reloc_type == 12; /* R_D30V_32_NORMAL. */
41e92641
NC
12220 case EM_DLX:
12221 return reloc_type == 3; /* R_DLX_RELOC_32. */
aca88567
NC
12222 case EM_CYGNUS_FR30:
12223 case EM_FR30:
12224 return reloc_type == 3; /* R_FR30_32. */
3f8107ab
AM
12225 case EM_FT32:
12226 return reloc_type == 1; /* R_FT32_32. */
aca88567
NC
12227 case EM_H8S:
12228 case EM_H8_300:
12229 case EM_H8_300H:
12230 return reloc_type == 1; /* R_H8_DIR32. */
3730236a 12231 case EM_IA_64:
262cdac7
AM
12232 return (reloc_type == 0x64 /* R_IA64_SECREL32MSB. */
12233 || reloc_type == 0x65 /* R_IA64_SECREL32LSB. */
12234 || reloc_type == 0x24 /* R_IA64_DIR32MSB. */
12235 || reloc_type == 0x25 /* R_IA64_DIR32LSB. */);
aca88567
NC
12236 case EM_IP2K_OLD:
12237 case EM_IP2K:
12238 return reloc_type == 2; /* R_IP2K_32. */
12239 case EM_IQ2000:
12240 return reloc_type == 2; /* R_IQ2000_32. */
84e94c90
NC
12241 case EM_LATTICEMICO32:
12242 return reloc_type == 3; /* R_LM32_32. */
ff7eeb89 12243 case EM_M32C_OLD:
aca88567
NC
12244 case EM_M32C:
12245 return reloc_type == 3; /* R_M32C_32. */
12246 case EM_M32R:
12247 return reloc_type == 34; /* R_M32R_32_RELA. */
adec12c1
AM
12248 case EM_68HC11:
12249 case EM_68HC12:
12250 return reloc_type == 6; /* R_M68HC11_32. */
aca88567
NC
12251 case EM_MCORE:
12252 return reloc_type == 1; /* R_MCORE_ADDR32. */
12253 case EM_CYGNUS_MEP:
12254 return reloc_type == 4; /* R_MEP_32. */
a3c62988
NC
12255 case EM_METAG:
12256 return reloc_type == 2; /* R_METAG_ADDR32. */
137b6b5f
AM
12257 case EM_MICROBLAZE:
12258 return reloc_type == 1; /* R_MICROBLAZE_32. */
aca88567
NC
12259 case EM_MIPS:
12260 return reloc_type == 2; /* R_MIPS_32. */
12261 case EM_MMIX:
12262 return reloc_type == 4; /* R_MMIX_32. */
12263 case EM_CYGNUS_MN10200:
12264 case EM_MN10200:
12265 return reloc_type == 1; /* R_MN10200_32. */
12266 case EM_CYGNUS_MN10300:
12267 case EM_MN10300:
12268 return reloc_type == 1; /* R_MN10300_32. */
5506d11a
AM
12269 case EM_MOXIE:
12270 return reloc_type == 1; /* R_MOXIE_32. */
aca88567
NC
12271 case EM_MSP430_OLD:
12272 case EM_MSP430:
13761a11 12273 return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32. */
aca88567
NC
12274 case EM_MT:
12275 return reloc_type == 2; /* R_MT_32. */
35c08157
KLC
12276 case EM_NDS32:
12277 return reloc_type == 20; /* R_NDS32_RELA. */
3e0873ac 12278 case EM_ALTERA_NIOS2:
36591ba1 12279 return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32. */
3e0873ac
NC
12280 case EM_NIOS32:
12281 return reloc_type == 1; /* R_NIOS_32. */
73589c9d
CS
12282 case EM_OR1K:
12283 return reloc_type == 1; /* R_OR1K_32. */
aca88567 12284 case EM_PARISC:
5fda8eca
NC
12285 return (reloc_type == 1 /* R_PARISC_DIR32. */
12286 || reloc_type == 41); /* R_PARISC_SECREL32. */
aca88567
NC
12287 case EM_PJ:
12288 case EM_PJ_OLD:
12289 return reloc_type == 1; /* R_PJ_DATA_DIR32. */
12290 case EM_PPC64:
12291 return reloc_type == 1; /* R_PPC64_ADDR32. */
12292 case EM_PPC:
12293 return reloc_type == 1; /* R_PPC_ADDR32. */
2b100bb5
DD
12294 case EM_TI_PRU:
12295 return reloc_type == 11; /* R_PRU_BFD_RELOC_32. */
e23eba97
NC
12296 case EM_RISCV:
12297 return reloc_type == 1; /* R_RISCV_32. */
99c513f6
DD
12298 case EM_RL78:
12299 return reloc_type == 1; /* R_RL78_DIR32. */
c7927a3c
NC
12300 case EM_RX:
12301 return reloc_type == 1; /* R_RX_DIR32. */
aca88567
NC
12302 case EM_S370:
12303 return reloc_type == 1; /* R_I370_ADDR31. */
12304 case EM_S390_OLD:
12305 case EM_S390:
12306 return reloc_type == 4; /* R_S390_32. */
41e92641
NC
12307 case EM_SCORE:
12308 return reloc_type == 8; /* R_SCORE_ABS32. */
aca88567
NC
12309 case EM_SH:
12310 return reloc_type == 1; /* R_SH_DIR32. */
12311 case EM_SPARC32PLUS:
12312 case EM_SPARCV9:
12313 case EM_SPARC:
12314 return reloc_type == 3 /* R_SPARC_32. */
12315 || reloc_type == 23; /* R_SPARC_UA32. */
a7dd7d05
AM
12316 case EM_SPU:
12317 return reloc_type == 6; /* R_SPU_ADDR32 */
40b36596
JM
12318 case EM_TI_C6000:
12319 return reloc_type == 1; /* R_C6000_ABS32. */
aa137e4d
NC
12320 case EM_TILEGX:
12321 return reloc_type == 2; /* R_TILEGX_32. */
12322 case EM_TILEPRO:
12323 return reloc_type == 1; /* R_TILEPRO_32. */
aca88567
NC
12324 case EM_CYGNUS_V850:
12325 case EM_V850:
12326 return reloc_type == 6; /* R_V850_ABS32. */
708e2187
NC
12327 case EM_V800:
12328 return reloc_type == 0x33; /* R_V810_WORD. */
aca88567
NC
12329 case EM_VAX:
12330 return reloc_type == 1; /* R_VAX_32. */
619ed720
EB
12331 case EM_VISIUM:
12332 return reloc_type == 3; /* R_VISIUM_32. */
f96bd6c2
PC
12333 case EM_WEBASSEMBLY:
12334 return reloc_type == 1; /* R_WASM32_32. */
aca88567 12335 case EM_X86_64:
8a9036a4 12336 case EM_L1OM:
7a9068fe 12337 case EM_K1OM:
aca88567 12338 return reloc_type == 10; /* R_X86_64_32. */
c29aca4a
NC
12339 case EM_XC16X:
12340 case EM_C166:
12341 return reloc_type == 3; /* R_XC16C_ABS_32. */
f6c1a2d5
NC
12342 case EM_XGATE:
12343 return reloc_type == 4; /* R_XGATE_32. */
aca88567
NC
12344 case EM_XSTORMY16:
12345 return reloc_type == 1; /* R_XSTROMY16_32. */
12346 case EM_XTENSA_OLD:
12347 case EM_XTENSA:
12348 return reloc_type == 1; /* R_XTENSA_32. */
aca88567 12349 default:
bee0ee85
NC
12350 {
12351 static unsigned int prev_warn = 0;
12352
12353 /* Avoid repeating the same warning multiple times. */
dda8d76d 12354 if (prev_warn != filedata->file_header.e_machine)
bee0ee85 12355 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
dda8d76d
NC
12356 filedata->file_header.e_machine);
12357 prev_warn = filedata->file_header.e_machine;
bee0ee85
NC
12358 return FALSE;
12359 }
aca88567
NC
12360 }
12361}
12362
12363/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12364 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
12365
12366static bfd_boolean
dda8d76d 12367is_32bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
aca88567 12368{
dda8d76d 12369 switch (filedata->file_header.e_machine)
d347c9df 12370 /* Please keep this table alpha-sorted for ease of visual lookup. */
aca88567 12371 {
41e92641 12372 case EM_386:
22abe556 12373 case EM_IAMCU:
3e0873ac 12374 return reloc_type == 2; /* R_386_PC32. */
aca88567 12375 case EM_68K:
3e0873ac 12376 return reloc_type == 4; /* R_68K_PC32. */
a06ea964
NC
12377 case EM_AARCH64:
12378 return reloc_type == 261; /* R_AARCH64_PREL32 */
cfb8c092
NC
12379 case EM_ADAPTEVA_EPIPHANY:
12380 return reloc_type == 6;
aca88567
NC
12381 case EM_ALPHA:
12382 return reloc_type == 10; /* R_ALPHA_SREL32. */
726c18e1
CZ
12383 case EM_ARC_COMPACT:
12384 case EM_ARC_COMPACT2:
12385 return reloc_type == 49; /* R_ARC_32_PCREL. */
41e92641 12386 case EM_ARM:
3e0873ac 12387 return reloc_type == 3; /* R_ARM_REL32 */
d347c9df
PS
12388 case EM_AVR_OLD:
12389 case EM_AVR:
12390 return reloc_type == 36; /* R_AVR_32_PCREL. */
137b6b5f
AM
12391 case EM_MICROBLAZE:
12392 return reloc_type == 2; /* R_MICROBLAZE_32_PCREL. */
73589c9d
CS
12393 case EM_OR1K:
12394 return reloc_type == 9; /* R_OR1K_32_PCREL. */
aca88567 12395 case EM_PARISC:
85acf597 12396 return reloc_type == 9; /* R_PARISC_PCREL32. */
aca88567
NC
12397 case EM_PPC:
12398 return reloc_type == 26; /* R_PPC_REL32. */
12399 case EM_PPC64:
3e0873ac 12400 return reloc_type == 26; /* R_PPC64_REL32. */
aca88567
NC
12401 case EM_S390_OLD:
12402 case EM_S390:
3e0873ac 12403 return reloc_type == 5; /* R_390_PC32. */
aca88567 12404 case EM_SH:
3e0873ac 12405 return reloc_type == 2; /* R_SH_REL32. */
aca88567
NC
12406 case EM_SPARC32PLUS:
12407 case EM_SPARCV9:
12408 case EM_SPARC:
3e0873ac 12409 return reloc_type == 6; /* R_SPARC_DISP32. */
a7dd7d05
AM
12410 case EM_SPU:
12411 return reloc_type == 13; /* R_SPU_REL32. */
aa137e4d
NC
12412 case EM_TILEGX:
12413 return reloc_type == 6; /* R_TILEGX_32_PCREL. */
12414 case EM_TILEPRO:
12415 return reloc_type == 4; /* R_TILEPRO_32_PCREL. */
619ed720
EB
12416 case EM_VISIUM:
12417 return reloc_type == 6; /* R_VISIUM_32_PCREL */
aca88567 12418 case EM_X86_64:
8a9036a4 12419 case EM_L1OM:
7a9068fe 12420 case EM_K1OM:
3e0873ac 12421 return reloc_type == 2; /* R_X86_64_PC32. */
2fcb9706
BW
12422 case EM_XTENSA_OLD:
12423 case EM_XTENSA:
12424 return reloc_type == 14; /* R_XTENSA_32_PCREL. */
aca88567
NC
12425 default:
12426 /* Do not abort or issue an error message here. Not all targets use
12427 pc-relative 32-bit relocs in their DWARF debug information and we
12428 have already tested for target coverage in is_32bit_abs_reloc. A
cf13d699
NC
12429 more helpful warning message will be generated by apply_relocations
12430 anyway, so just return. */
aca88567
NC
12431 return FALSE;
12432 }
12433}
12434
12435/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12436 a 64-bit absolute RELA relocation used in DWARF debug sections. */
12437
12438static bfd_boolean
dda8d76d 12439is_64bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
aca88567 12440{
dda8d76d 12441 switch (filedata->file_header.e_machine)
aca88567 12442 {
a06ea964
NC
12443 case EM_AARCH64:
12444 return reloc_type == 257; /* R_AARCH64_ABS64. */
aca88567
NC
12445 case EM_ALPHA:
12446 return reloc_type == 2; /* R_ALPHA_REFQUAD. */
3730236a 12447 case EM_IA_64:
262cdac7
AM
12448 return (reloc_type == 0x26 /* R_IA64_DIR64MSB. */
12449 || reloc_type == 0x27 /* R_IA64_DIR64LSB. */);
3e0873ac
NC
12450 case EM_PARISC:
12451 return reloc_type == 80; /* R_PARISC_DIR64. */
aca88567
NC
12452 case EM_PPC64:
12453 return reloc_type == 38; /* R_PPC64_ADDR64. */
e23eba97
NC
12454 case EM_RISCV:
12455 return reloc_type == 2; /* R_RISCV_64. */
aca88567
NC
12456 case EM_SPARC32PLUS:
12457 case EM_SPARCV9:
12458 case EM_SPARC:
714da62f
NC
12459 return reloc_type == 32 /* R_SPARC_64. */
12460 || reloc_type == 54; /* R_SPARC_UA64. */
aca88567 12461 case EM_X86_64:
8a9036a4 12462 case EM_L1OM:
7a9068fe 12463 case EM_K1OM:
aca88567 12464 return reloc_type == 1; /* R_X86_64_64. */
e819ade1
AS
12465 case EM_S390_OLD:
12466 case EM_S390:
aa137e4d
NC
12467 return reloc_type == 22; /* R_S390_64. */
12468 case EM_TILEGX:
12469 return reloc_type == 1; /* R_TILEGX_64. */
85a82265 12470 case EM_MIPS:
aa137e4d 12471 return reloc_type == 18; /* R_MIPS_64. */
aca88567
NC
12472 default:
12473 return FALSE;
12474 }
12475}
12476
85acf597
RH
12477/* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
12478 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
12479
12480static bfd_boolean
dda8d76d 12481is_64bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
85acf597 12482{
dda8d76d 12483 switch (filedata->file_header.e_machine)
85acf597 12484 {
a06ea964
NC
12485 case EM_AARCH64:
12486 return reloc_type == 260; /* R_AARCH64_PREL64. */
85acf597 12487 case EM_ALPHA:
aa137e4d 12488 return reloc_type == 11; /* R_ALPHA_SREL64. */
85acf597 12489 case EM_IA_64:
262cdac7
AM
12490 return (reloc_type == 0x4e /* R_IA64_PCREL64MSB. */
12491 || reloc_type == 0x4f /* R_IA64_PCREL64LSB. */);
85acf597 12492 case EM_PARISC:
aa137e4d 12493 return reloc_type == 72; /* R_PARISC_PCREL64. */
85acf597 12494 case EM_PPC64:
aa137e4d 12495 return reloc_type == 44; /* R_PPC64_REL64. */
85acf597
RH
12496 case EM_SPARC32PLUS:
12497 case EM_SPARCV9:
12498 case EM_SPARC:
aa137e4d 12499 return reloc_type == 46; /* R_SPARC_DISP64. */
85acf597 12500 case EM_X86_64:
8a9036a4 12501 case EM_L1OM:
7a9068fe 12502 case EM_K1OM:
aa137e4d 12503 return reloc_type == 24; /* R_X86_64_PC64. */
85acf597
RH
12504 case EM_S390_OLD:
12505 case EM_S390:
aa137e4d
NC
12506 return reloc_type == 23; /* R_S390_PC64. */
12507 case EM_TILEGX:
12508 return reloc_type == 5; /* R_TILEGX_64_PCREL. */
85acf597
RH
12509 default:
12510 return FALSE;
12511 }
12512}
12513
4dc3c23d
AM
12514/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12515 a 24-bit absolute RELA relocation used in DWARF debug sections. */
12516
12517static bfd_boolean
dda8d76d 12518is_24bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
4dc3c23d 12519{
dda8d76d 12520 switch (filedata->file_header.e_machine)
4dc3c23d
AM
12521 {
12522 case EM_CYGNUS_MN10200:
12523 case EM_MN10200:
12524 return reloc_type == 4; /* R_MN10200_24. */
3ee6e4fb
NC
12525 case EM_FT32:
12526 return reloc_type == 5; /* R_FT32_20. */
4dc3c23d
AM
12527 default:
12528 return FALSE;
12529 }
12530}
12531
aca88567
NC
12532/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12533 a 16-bit absolute RELA relocation used in DWARF debug sections. */
12534
12535static bfd_boolean
dda8d76d 12536is_16bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
4b78141a 12537{
d347c9df 12538 /* Please keep this table alpha-sorted for ease of visual lookup. */
dda8d76d 12539 switch (filedata->file_header.e_machine)
4b78141a 12540 {
886a2506
NC
12541 case EM_ARC:
12542 case EM_ARC_COMPACT:
12543 case EM_ARC_COMPACT2:
12544 return reloc_type == 2; /* R_ARC_16. */
d347c9df
PS
12545 case EM_ADAPTEVA_EPIPHANY:
12546 return reloc_type == 5;
aca88567
NC
12547 case EM_AVR_OLD:
12548 case EM_AVR:
12549 return reloc_type == 4; /* R_AVR_16. */
41e92641
NC
12550 case EM_CYGNUS_D10V:
12551 case EM_D10V:
12552 return reloc_type == 3; /* R_D10V_16. */
81b42bca
JB
12553 case EM_FT32:
12554 return reloc_type == 2; /* R_FT32_16. */
4b78141a
NC
12555 case EM_H8S:
12556 case EM_H8_300:
12557 case EM_H8_300H:
aca88567
NC
12558 return reloc_type == R_H8_DIR16;
12559 case EM_IP2K_OLD:
12560 case EM_IP2K:
12561 return reloc_type == 1; /* R_IP2K_16. */
ff7eeb89 12562 case EM_M32C_OLD:
f4236fe4
DD
12563 case EM_M32C:
12564 return reloc_type == 1; /* R_M32C_16 */
d347c9df
PS
12565 case EM_CYGNUS_MN10200:
12566 case EM_MN10200:
12567 return reloc_type == 2; /* R_MN10200_16. */
12568 case EM_CYGNUS_MN10300:
12569 case EM_MN10300:
12570 return reloc_type == 2; /* R_MN10300_16. */
aca88567 12571 case EM_MSP430:
dda8d76d 12572 if (uses_msp430x_relocs (filedata))
13761a11 12573 return reloc_type == 2; /* R_MSP430_ABS16. */
1a0670f3 12574 /* Fall through. */
78c8d46c 12575 case EM_MSP430_OLD:
aca88567 12576 return reloc_type == 5; /* R_MSP430_16_BYTE. */
35c08157
KLC
12577 case EM_NDS32:
12578 return reloc_type == 19; /* R_NDS32_RELA. */
3e0873ac 12579 case EM_ALTERA_NIOS2:
36591ba1 12580 return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16. */
3e0873ac
NC
12581 case EM_NIOS32:
12582 return reloc_type == 9; /* R_NIOS_16. */
73589c9d
CS
12583 case EM_OR1K:
12584 return reloc_type == 2; /* R_OR1K_16. */
2b100bb5
DD
12585 case EM_TI_PRU:
12586 return reloc_type == 8; /* R_PRU_BFD_RELOC_16. */
40b36596
JM
12587 case EM_TI_C6000:
12588 return reloc_type == 2; /* R_C6000_ABS16. */
d347c9df
PS
12589 case EM_VISIUM:
12590 return reloc_type == 2; /* R_VISIUM_16. */
c29aca4a
NC
12591 case EM_XC16X:
12592 case EM_C166:
12593 return reloc_type == 2; /* R_XC16C_ABS_16. */
f6c1a2d5
NC
12594 case EM_XGATE:
12595 return reloc_type == 3; /* R_XGATE_16. */
4b78141a 12596 default:
aca88567 12597 return FALSE;
4b78141a
NC
12598 }
12599}
12600
03336641
JW
12601/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12602 a 32-bit inplace add RELA relocation used in DWARF debug sections. */
12603
12604static bfd_boolean
12605is_32bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12606{
12607 /* Please keep this table alpha-sorted for ease of visual lookup. */
12608 switch (filedata->file_header.e_machine)
12609 {
12610 case EM_RISCV:
12611 return reloc_type == 35; /* R_RISCV_ADD32. */
12612 default:
12613 return FALSE;
12614 }
12615}
12616
12617/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12618 a 32-bit inplace sub RELA relocation used in DWARF debug sections. */
12619
12620static bfd_boolean
12621is_32bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12622{
12623 /* Please keep this table alpha-sorted for ease of visual lookup. */
12624 switch (filedata->file_header.e_machine)
12625 {
12626 case EM_RISCV:
12627 return reloc_type == 39; /* R_RISCV_SUB32. */
12628 default:
12629 return FALSE;
12630 }
12631}
12632
12633/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12634 a 64-bit inplace add RELA relocation used in DWARF debug sections. */
12635
12636static bfd_boolean
12637is_64bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12638{
12639 /* Please keep this table alpha-sorted for ease of visual lookup. */
12640 switch (filedata->file_header.e_machine)
12641 {
12642 case EM_RISCV:
12643 return reloc_type == 36; /* R_RISCV_ADD64. */
12644 default:
12645 return FALSE;
12646 }
12647}
12648
12649/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12650 a 64-bit inplace sub RELA relocation used in DWARF debug sections. */
12651
12652static bfd_boolean
12653is_64bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12654{
12655 /* Please keep this table alpha-sorted for ease of visual lookup. */
12656 switch (filedata->file_header.e_machine)
12657 {
12658 case EM_RISCV:
12659 return reloc_type == 40; /* R_RISCV_SUB64. */
12660 default:
12661 return FALSE;
12662 }
12663}
12664
12665/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12666 a 16-bit inplace add RELA relocation used in DWARF debug sections. */
12667
12668static bfd_boolean
12669is_16bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12670{
12671 /* Please keep this table alpha-sorted for ease of visual lookup. */
12672 switch (filedata->file_header.e_machine)
12673 {
12674 case EM_RISCV:
12675 return reloc_type == 34; /* R_RISCV_ADD16. */
12676 default:
12677 return FALSE;
12678 }
12679}
12680
12681/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12682 a 16-bit inplace sub RELA relocation used in DWARF debug sections. */
12683
12684static bfd_boolean
12685is_16bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12686{
12687 /* Please keep this table alpha-sorted for ease of visual lookup. */
12688 switch (filedata->file_header.e_machine)
12689 {
12690 case EM_RISCV:
12691 return reloc_type == 38; /* R_RISCV_SUB16. */
12692 default:
12693 return FALSE;
12694 }
12695}
12696
12697/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12698 a 8-bit inplace add RELA relocation used in DWARF debug sections. */
12699
12700static bfd_boolean
12701is_8bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12702{
12703 /* Please keep this table alpha-sorted for ease of visual lookup. */
12704 switch (filedata->file_header.e_machine)
12705 {
12706 case EM_RISCV:
12707 return reloc_type == 33; /* R_RISCV_ADD8. */
12708 default:
12709 return FALSE;
12710 }
12711}
12712
12713/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12714 a 8-bit inplace sub RELA relocation used in DWARF debug sections. */
12715
12716static bfd_boolean
12717is_8bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12718{
12719 /* Please keep this table alpha-sorted for ease of visual lookup. */
12720 switch (filedata->file_header.e_machine)
12721 {
12722 case EM_RISCV:
12723 return reloc_type == 37; /* R_RISCV_SUB8. */
12724 default:
12725 return FALSE;
12726 }
12727}
12728
2a7b2e88
JK
12729/* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
12730 relocation entries (possibly formerly used for SHT_GROUP sections). */
12731
12732static bfd_boolean
dda8d76d 12733is_none_reloc (Filedata * filedata, unsigned int reloc_type)
2a7b2e88 12734{
dda8d76d 12735 switch (filedata->file_header.e_machine)
2a7b2e88 12736 {
cb8f3167 12737 case EM_386: /* R_386_NONE. */
d347c9df 12738 case EM_68K: /* R_68K_NONE. */
cfb8c092 12739 case EM_ADAPTEVA_EPIPHANY:
d347c9df
PS
12740 case EM_ALPHA: /* R_ALPHA_NONE. */
12741 case EM_ALTERA_NIOS2: /* R_NIOS2_NONE. */
886a2506 12742 case EM_ARC: /* R_ARC_NONE. */
886a2506 12743 case EM_ARC_COMPACT2: /* R_ARC_NONE. */
d347c9df 12744 case EM_ARC_COMPACT: /* R_ARC_NONE. */
cb8f3167 12745 case EM_ARM: /* R_ARM_NONE. */
d347c9df 12746 case EM_C166: /* R_XC16X_NONE. */
cb8f3167 12747 case EM_CRIS: /* R_CRIS_NONE. */
d347c9df
PS
12748 case EM_FT32: /* R_FT32_NONE. */
12749 case EM_IA_64: /* R_IA64_NONE. */
7a9068fe 12750 case EM_K1OM: /* R_X86_64_NONE. */
d347c9df
PS
12751 case EM_L1OM: /* R_X86_64_NONE. */
12752 case EM_M32R: /* R_M32R_NONE. */
12753 case EM_MIPS: /* R_MIPS_NONE. */
cb8f3167 12754 case EM_MN10300: /* R_MN10300_NONE. */
5506d11a 12755 case EM_MOXIE: /* R_MOXIE_NONE. */
d347c9df
PS
12756 case EM_NIOS32: /* R_NIOS_NONE. */
12757 case EM_OR1K: /* R_OR1K_NONE. */
12758 case EM_PARISC: /* R_PARISC_NONE. */
12759 case EM_PPC64: /* R_PPC64_NONE. */
12760 case EM_PPC: /* R_PPC_NONE. */
e23eba97 12761 case EM_RISCV: /* R_RISCV_NONE. */
d347c9df
PS
12762 case EM_S390: /* R_390_NONE. */
12763 case EM_S390_OLD:
12764 case EM_SH: /* R_SH_NONE. */
12765 case EM_SPARC32PLUS:
12766 case EM_SPARC: /* R_SPARC_NONE. */
12767 case EM_SPARCV9:
aa137e4d
NC
12768 case EM_TILEGX: /* R_TILEGX_NONE. */
12769 case EM_TILEPRO: /* R_TILEPRO_NONE. */
d347c9df
PS
12770 case EM_TI_C6000:/* R_C6000_NONE. */
12771 case EM_X86_64: /* R_X86_64_NONE. */
c29aca4a 12772 case EM_XC16X:
f96bd6c2 12773 case EM_WEBASSEMBLY: /* R_WASM32_NONE. */
cb8f3167 12774 return reloc_type == 0;
d347c9df 12775
a06ea964
NC
12776 case EM_AARCH64:
12777 return reloc_type == 0 || reloc_type == 256;
d347c9df
PS
12778 case EM_AVR_OLD:
12779 case EM_AVR:
12780 return (reloc_type == 0 /* R_AVR_NONE. */
12781 || reloc_type == 30 /* R_AVR_DIFF8. */
12782 || reloc_type == 31 /* R_AVR_DIFF16. */
12783 || reloc_type == 32 /* R_AVR_DIFF32. */);
12784 case EM_METAG:
12785 return reloc_type == 3; /* R_METAG_NONE. */
35c08157
KLC
12786 case EM_NDS32:
12787 return (reloc_type == 0 /* R_XTENSA_NONE. */
12788 || reloc_type == 204 /* R_NDS32_DIFF8. */
12789 || reloc_type == 205 /* R_NDS32_DIFF16. */
12790 || reloc_type == 206 /* R_NDS32_DIFF32. */
12791 || reloc_type == 207 /* R_NDS32_ULEB128. */);
2b100bb5
DD
12792 case EM_TI_PRU:
12793 return (reloc_type == 0 /* R_PRU_NONE. */
12794 || reloc_type == 65 /* R_PRU_DIFF8. */
12795 || reloc_type == 66 /* R_PRU_DIFF16. */
12796 || reloc_type == 67 /* R_PRU_DIFF32. */);
58332dda
JK
12797 case EM_XTENSA_OLD:
12798 case EM_XTENSA:
4dc3c23d
AM
12799 return (reloc_type == 0 /* R_XTENSA_NONE. */
12800 || reloc_type == 17 /* R_XTENSA_DIFF8. */
12801 || reloc_type == 18 /* R_XTENSA_DIFF16. */
12802 || reloc_type == 19 /* R_XTENSA_DIFF32. */);
2a7b2e88
JK
12803 }
12804 return FALSE;
12805}
12806
d1c4b12b
NC
12807/* Returns TRUE if there is a relocation against
12808 section NAME at OFFSET bytes. */
12809
12810bfd_boolean
12811reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
12812{
12813 Elf_Internal_Rela * relocs;
12814 Elf_Internal_Rela * rp;
12815
12816 if (dsec == NULL || dsec->reloc_info == NULL)
12817 return FALSE;
12818
12819 relocs = (Elf_Internal_Rela *) dsec->reloc_info;
12820
12821 for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
12822 if (rp->r_offset == offset)
12823 return TRUE;
12824
12825 return FALSE;
12826}
12827
cf13d699 12828/* Apply relocations to a section.
32ec8896
NC
12829 Returns TRUE upon success, FALSE otherwise.
12830 If RELOCS_RETURN is non-NULL then it is set to point to the loaded relocs.
12831 It is then the caller's responsibility to free them. NUM_RELOCS_RETURN
12832 will be set to the number of relocs loaded.
12833
cf13d699 12834 Note: So far support has been added only for those relocations
32ec8896
NC
12835 which can be found in debug sections. FIXME: Add support for
12836 more relocations ? */
1b315056 12837
32ec8896 12838static bfd_boolean
dda8d76d 12839apply_relocations (Filedata * filedata,
d1c4b12b
NC
12840 const Elf_Internal_Shdr * section,
12841 unsigned char * start,
12842 bfd_size_type size,
1449284b 12843 void ** relocs_return,
d1c4b12b 12844 unsigned long * num_relocs_return)
1b315056 12845{
cf13d699 12846 Elf_Internal_Shdr * relsec;
0d2a7a93 12847 unsigned char * end = start + size;
32ec8896 12848 bfd_boolean res = TRUE;
cb8f3167 12849
d1c4b12b
NC
12850 if (relocs_return != NULL)
12851 {
12852 * (Elf_Internal_Rela **) relocs_return = NULL;
12853 * num_relocs_return = 0;
12854 }
12855
dda8d76d 12856 if (filedata->file_header.e_type != ET_REL)
32ec8896
NC
12857 /* No relocs to apply. */
12858 return TRUE;
1b315056 12859
cf13d699 12860 /* Find the reloc section associated with the section. */
dda8d76d
NC
12861 for (relsec = filedata->section_headers;
12862 relsec < filedata->section_headers + filedata->file_header.e_shnum;
5b18a4bc 12863 ++relsec)
252b5132 12864 {
41e92641
NC
12865 bfd_boolean is_rela;
12866 unsigned long num_relocs;
2cf0635d
NC
12867 Elf_Internal_Rela * relocs;
12868 Elf_Internal_Rela * rp;
12869 Elf_Internal_Shdr * symsec;
12870 Elf_Internal_Sym * symtab;
ba5cdace 12871 unsigned long num_syms;
2cf0635d 12872 Elf_Internal_Sym * sym;
252b5132 12873
41e92641 12874 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
dda8d76d
NC
12875 || relsec->sh_info >= filedata->file_header.e_shnum
12876 || filedata->section_headers + relsec->sh_info != section
c256ffe7 12877 || relsec->sh_size == 0
dda8d76d 12878 || relsec->sh_link >= filedata->file_header.e_shnum)
5b18a4bc 12879 continue;
428409d5 12880
41e92641
NC
12881 is_rela = relsec->sh_type == SHT_RELA;
12882
12883 if (is_rela)
12884 {
dda8d76d 12885 if (!slurp_rela_relocs (filedata, relsec->sh_offset,
3f5e193b 12886 relsec->sh_size, & relocs, & num_relocs))
32ec8896 12887 return FALSE;
41e92641
NC
12888 }
12889 else
12890 {
dda8d76d 12891 if (!slurp_rel_relocs (filedata, relsec->sh_offset,
3f5e193b 12892 relsec->sh_size, & relocs, & num_relocs))
32ec8896 12893 return FALSE;
41e92641
NC
12894 }
12895
12896 /* SH uses RELA but uses in place value instead of the addend field. */
dda8d76d 12897 if (filedata->file_header.e_machine == EM_SH)
41e92641 12898 is_rela = FALSE;
428409d5 12899
dda8d76d 12900 symsec = filedata->section_headers + relsec->sh_link;
1449284b
NC
12901 if (symsec->sh_type != SHT_SYMTAB
12902 && symsec->sh_type != SHT_DYNSYM)
32ec8896 12903 return FALSE;
dda8d76d 12904 symtab = GET_ELF_SYMBOLS (filedata, symsec, & num_syms);
103f02d3 12905
41e92641 12906 for (rp = relocs; rp < relocs + num_relocs; ++rp)
252b5132 12907 {
41e92641
NC
12908 bfd_vma addend;
12909 unsigned int reloc_type;
12910 unsigned int reloc_size;
03336641
JW
12911 bfd_boolean reloc_inplace = FALSE;
12912 bfd_boolean reloc_subtract = FALSE;
91d6fa6a 12913 unsigned char * rloc;
ba5cdace 12914 unsigned long sym_index;
4b78141a 12915
dda8d76d 12916 reloc_type = get_reloc_type (filedata, rp->r_info);
41e92641 12917
dda8d76d 12918 if (target_specific_reloc_handling (filedata, rp, start, end, symtab, num_syms))
2a7b2e88 12919 continue;
dda8d76d 12920 else if (is_none_reloc (filedata, reloc_type))
98fb390a 12921 continue;
dda8d76d
NC
12922 else if (is_32bit_abs_reloc (filedata, reloc_type)
12923 || is_32bit_pcrel_reloc (filedata, reloc_type))
aca88567 12924 reloc_size = 4;
dda8d76d
NC
12925 else if (is_64bit_abs_reloc (filedata, reloc_type)
12926 || is_64bit_pcrel_reloc (filedata, reloc_type))
aca88567 12927 reloc_size = 8;
dda8d76d 12928 else if (is_24bit_abs_reloc (filedata, reloc_type))
4dc3c23d 12929 reloc_size = 3;
dda8d76d 12930 else if (is_16bit_abs_reloc (filedata, reloc_type))
aca88567 12931 reloc_size = 2;
03336641
JW
12932 else if ((reloc_subtract = is_32bit_inplace_sub_reloc (filedata,
12933 reloc_type))
12934 || is_32bit_inplace_add_reloc (filedata, reloc_type))
12935 {
12936 reloc_size = 4;
12937 reloc_inplace = TRUE;
12938 }
12939 else if ((reloc_subtract = is_64bit_inplace_sub_reloc (filedata,
12940 reloc_type))
12941 || is_64bit_inplace_add_reloc (filedata, reloc_type))
12942 {
12943 reloc_size = 8;
12944 reloc_inplace = TRUE;
12945 }
12946 else if ((reloc_subtract = is_16bit_inplace_sub_reloc (filedata,
12947 reloc_type))
12948 || is_16bit_inplace_add_reloc (filedata, reloc_type))
12949 {
12950 reloc_size = 2;
12951 reloc_inplace = TRUE;
12952 }
12953 else if ((reloc_subtract = is_8bit_inplace_sub_reloc (filedata,
12954 reloc_type))
12955 || is_8bit_inplace_add_reloc (filedata, reloc_type))
12956 {
12957 reloc_size = 1;
12958 reloc_inplace = TRUE;
12959 }
aca88567 12960 else
4b78141a 12961 {
bee0ee85 12962 static unsigned int prev_reloc = 0;
dda8d76d 12963
bee0ee85
NC
12964 if (reloc_type != prev_reloc)
12965 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
dda8d76d 12966 reloc_type, printable_section_name (filedata, section));
bee0ee85 12967 prev_reloc = reloc_type;
32ec8896 12968 res = FALSE;
4b78141a
NC
12969 continue;
12970 }
103f02d3 12971
91d6fa6a 12972 rloc = start + rp->r_offset;
c8da6823 12973 if ((rloc + reloc_size) > end || (rloc < start))
700dd8b7
L
12974 {
12975 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
12976 (unsigned long) rp->r_offset,
dda8d76d 12977 printable_section_name (filedata, section));
32ec8896 12978 res = FALSE;
700dd8b7
L
12979 continue;
12980 }
103f02d3 12981
ba5cdace
NC
12982 sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
12983 if (sym_index >= num_syms)
12984 {
12985 warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
dda8d76d 12986 sym_index, printable_section_name (filedata, section));
32ec8896 12987 res = FALSE;
ba5cdace
NC
12988 continue;
12989 }
12990 sym = symtab + sym_index;
41e92641
NC
12991
12992 /* If the reloc has a symbol associated with it,
55f25fc3
L
12993 make sure that it is of an appropriate type.
12994
12995 Relocations against symbols without type can happen.
12996 Gcc -feliminate-dwarf2-dups may generate symbols
12997 without type for debug info.
12998
12999 Icc generates relocations against function symbols
13000 instead of local labels.
13001
13002 Relocations against object symbols can happen, eg when
13003 referencing a global array. For an example of this see
13004 the _clz.o binary in libgcc.a. */
aca88567 13005 if (sym != symtab
b8871f35 13006 && ELF_ST_TYPE (sym->st_info) != STT_COMMON
55f25fc3 13007 && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
5b18a4bc 13008 {
d3a49aa8 13009 warn (_("skipping unexpected symbol type %s in section %s relocation %ld\n"),
dda8d76d
NC
13010 get_symbol_type (filedata, ELF_ST_TYPE (sym->st_info)),
13011 printable_section_name (filedata, relsec),
d3a49aa8 13012 (long int)(rp - relocs));
32ec8896 13013 res = FALSE;
aca88567 13014 continue;
5b18a4bc 13015 }
252b5132 13016
4dc3c23d
AM
13017 addend = 0;
13018 if (is_rela)
13019 addend += rp->r_addend;
c47320c3
AM
13020 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
13021 partial_inplace. */
4dc3c23d 13022 if (!is_rela
dda8d76d 13023 || (filedata->file_header.e_machine == EM_XTENSA
4dc3c23d 13024 && reloc_type == 1)
dda8d76d
NC
13025 || ((filedata->file_header.e_machine == EM_PJ
13026 || filedata->file_header.e_machine == EM_PJ_OLD)
c47320c3 13027 && reloc_type == 1)
dda8d76d
NC
13028 || ((filedata->file_header.e_machine == EM_D30V
13029 || filedata->file_header.e_machine == EM_CYGNUS_D30V)
03336641
JW
13030 && reloc_type == 12)
13031 || reloc_inplace)
91d6fa6a 13032 addend += byte_get (rloc, reloc_size);
cb8f3167 13033
dda8d76d
NC
13034 if (is_32bit_pcrel_reloc (filedata, reloc_type)
13035 || is_64bit_pcrel_reloc (filedata, reloc_type))
85acf597
RH
13036 {
13037 /* On HPPA, all pc-relative relocations are biased by 8. */
dda8d76d 13038 if (filedata->file_header.e_machine == EM_PARISC)
85acf597 13039 addend -= 8;
91d6fa6a 13040 byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
85acf597
RH
13041 reloc_size);
13042 }
03336641
JW
13043 else if (reloc_subtract)
13044 byte_put (rloc, addend - sym->st_value, reloc_size);
41e92641 13045 else
91d6fa6a 13046 byte_put (rloc, addend + sym->st_value, reloc_size);
5b18a4bc 13047 }
252b5132 13048
5b18a4bc 13049 free (symtab);
f84ce13b
NC
13050 /* Let the target specific reloc processing code know that
13051 we have finished with these relocs. */
dda8d76d 13052 target_specific_reloc_handling (filedata, NULL, NULL, NULL, NULL, 0);
d1c4b12b
NC
13053
13054 if (relocs_return)
13055 {
13056 * (Elf_Internal_Rela **) relocs_return = relocs;
13057 * num_relocs_return = num_relocs;
13058 }
13059 else
13060 free (relocs);
13061
5b18a4bc
NC
13062 break;
13063 }
32ec8896
NC
13064
13065 return res;
5b18a4bc 13066}
103f02d3 13067
cf13d699 13068#ifdef SUPPORT_DISASSEMBLY
32ec8896 13069static bfd_boolean
dda8d76d 13070disassemble_section (Elf_Internal_Shdr * section, Filedata * filedata)
cf13d699 13071{
dda8d76d 13072 printf (_("\nAssembly dump of section %s\n"), printable_section_name (filedata, section));
cf13d699 13073
74e1a04b 13074 /* FIXME: XXX -- to be done --- XXX */
cf13d699 13075
32ec8896 13076 return TRUE;
cf13d699
NC
13077}
13078#endif
13079
13080/* Reads in the contents of SECTION from FILE, returning a pointer
13081 to a malloc'ed buffer or NULL if something went wrong. */
13082
13083static char *
dda8d76d 13084get_section_contents (Elf_Internal_Shdr * section, Filedata * filedata)
cf13d699 13085{
dda8d76d 13086 bfd_size_type num_bytes = section->sh_size;
cf13d699
NC
13087
13088 if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
13089 {
c6b78c96 13090 printf (_("Section '%s' has no data to dump.\n"),
dda8d76d 13091 printable_section_name (filedata, section));
cf13d699
NC
13092 return NULL;
13093 }
13094
dda8d76d 13095 return (char *) get_data (NULL, filedata, section->sh_offset, 1, num_bytes,
3f5e193b 13096 _("section contents"));
cf13d699
NC
13097}
13098
0e602686
NC
13099/* Uncompresses a section that was compressed using zlib, in place. */
13100
13101static bfd_boolean
dda8d76d
NC
13102uncompress_section_contents (unsigned char ** buffer,
13103 dwarf_size_type uncompressed_size,
13104 dwarf_size_type * size)
0e602686
NC
13105{
13106 dwarf_size_type compressed_size = *size;
13107 unsigned char * compressed_buffer = *buffer;
13108 unsigned char * uncompressed_buffer;
13109 z_stream strm;
13110 int rc;
13111
13112 /* It is possible the section consists of several compressed
13113 buffers concatenated together, so we uncompress in a loop. */
13114 /* PR 18313: The state field in the z_stream structure is supposed
13115 to be invisible to the user (ie us), but some compilers will
13116 still complain about it being used without initialisation. So
13117 we first zero the entire z_stream structure and then set the fields
13118 that we need. */
13119 memset (& strm, 0, sizeof strm);
13120 strm.avail_in = compressed_size;
13121 strm.next_in = (Bytef *) compressed_buffer;
13122 strm.avail_out = uncompressed_size;
13123 uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
13124
13125 rc = inflateInit (& strm);
13126 while (strm.avail_in > 0)
13127 {
13128 if (rc != Z_OK)
13129 goto fail;
13130 strm.next_out = ((Bytef *) uncompressed_buffer
13131 + (uncompressed_size - strm.avail_out));
13132 rc = inflate (&strm, Z_FINISH);
13133 if (rc != Z_STREAM_END)
13134 goto fail;
13135 rc = inflateReset (& strm);
13136 }
13137 rc = inflateEnd (& strm);
13138 if (rc != Z_OK
13139 || strm.avail_out != 0)
13140 goto fail;
13141
13142 *buffer = uncompressed_buffer;
13143 *size = uncompressed_size;
13144 return TRUE;
13145
13146 fail:
13147 free (uncompressed_buffer);
13148 /* Indicate decompression failure. */
13149 *buffer = NULL;
13150 return FALSE;
13151}
dd24e3da 13152
32ec8896 13153static bfd_boolean
dda8d76d 13154dump_section_as_strings (Elf_Internal_Shdr * section, Filedata * filedata)
cf13d699 13155{
0e602686
NC
13156 Elf_Internal_Shdr * relsec;
13157 bfd_size_type num_bytes;
fd8008d8
L
13158 unsigned char * data;
13159 unsigned char * end;
13160 unsigned char * real_start;
13161 unsigned char * start;
0e602686 13162 bfd_boolean some_strings_shown;
cf13d699 13163
dda8d76d 13164 real_start = start = (unsigned char *) get_section_contents (section, filedata);
cf13d699 13165 if (start == NULL)
c6b78c96
NC
13166 /* PR 21820: Do not fail if the section was empty. */
13167 return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
13168
0e602686 13169 num_bytes = section->sh_size;
cf13d699 13170
dda8d76d 13171 printf (_("\nString dump of section '%s':\n"), printable_section_name (filedata, section));
cf13d699 13172
0e602686
NC
13173 if (decompress_dumps)
13174 {
13175 dwarf_size_type new_size = num_bytes;
13176 dwarf_size_type uncompressed_size = 0;
13177
13178 if ((section->sh_flags & SHF_COMPRESSED) != 0)
13179 {
13180 Elf_Internal_Chdr chdr;
13181 unsigned int compression_header_size
ebdf1ebf
NC
13182 = get_compression_header (& chdr, (unsigned char *) start,
13183 num_bytes);
0e602686 13184
813dabb9 13185 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
0e602686 13186 {
813dabb9 13187 warn (_("section '%s' has unsupported compress type: %d\n"),
dda8d76d 13188 printable_section_name (filedata, section), chdr.ch_type);
32ec8896 13189 return FALSE;
813dabb9
L
13190 }
13191 else if (chdr.ch_addralign != section->sh_addralign)
13192 {
13193 warn (_("compressed section '%s' is corrupted\n"),
dda8d76d 13194 printable_section_name (filedata, section));
32ec8896 13195 return FALSE;
0e602686 13196 }
813dabb9
L
13197 uncompressed_size = chdr.ch_size;
13198 start += compression_header_size;
13199 new_size -= compression_header_size;
0e602686
NC
13200 }
13201 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
13202 {
13203 /* Read the zlib header. In this case, it should be "ZLIB"
13204 followed by the uncompressed section size, 8 bytes in
13205 big-endian order. */
13206 uncompressed_size = start[4]; uncompressed_size <<= 8;
13207 uncompressed_size += start[5]; uncompressed_size <<= 8;
13208 uncompressed_size += start[6]; uncompressed_size <<= 8;
13209 uncompressed_size += start[7]; uncompressed_size <<= 8;
13210 uncompressed_size += start[8]; uncompressed_size <<= 8;
13211 uncompressed_size += start[9]; uncompressed_size <<= 8;
13212 uncompressed_size += start[10]; uncompressed_size <<= 8;
13213 uncompressed_size += start[11];
13214 start += 12;
13215 new_size -= 12;
13216 }
13217
1835f746
NC
13218 if (uncompressed_size)
13219 {
13220 if (uncompress_section_contents (& start,
13221 uncompressed_size, & new_size))
13222 num_bytes = new_size;
13223 else
13224 {
13225 error (_("Unable to decompress section %s\n"),
dda8d76d 13226 printable_section_name (filedata, section));
32ec8896 13227 return FALSE;
1835f746
NC
13228 }
13229 }
bc303e5d
NC
13230 else
13231 start = real_start;
0e602686 13232 }
fd8008d8 13233
cf13d699
NC
13234 /* If the section being dumped has relocations against it the user might
13235 be expecting these relocations to have been applied. Check for this
13236 case and issue a warning message in order to avoid confusion.
13237 FIXME: Maybe we ought to have an option that dumps a section with
13238 relocs applied ? */
dda8d76d
NC
13239 for (relsec = filedata->section_headers;
13240 relsec < filedata->section_headers + filedata->file_header.e_shnum;
cf13d699
NC
13241 ++relsec)
13242 {
13243 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
dda8d76d
NC
13244 || relsec->sh_info >= filedata->file_header.e_shnum
13245 || filedata->section_headers + relsec->sh_info != section
cf13d699 13246 || relsec->sh_size == 0
dda8d76d 13247 || relsec->sh_link >= filedata->file_header.e_shnum)
cf13d699
NC
13248 continue;
13249
13250 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
13251 break;
13252 }
13253
cf13d699
NC
13254 data = start;
13255 end = start + num_bytes;
13256 some_strings_shown = FALSE;
13257
13258 while (data < end)
13259 {
13260 while (!ISPRINT (* data))
13261 if (++ data >= end)
13262 break;
13263
13264 if (data < end)
13265 {
071436c6
NC
13266 size_t maxlen = end - data;
13267
cf13d699 13268#ifndef __MSVCRT__
c975cc98
NC
13269 /* PR 11128: Use two separate invocations in order to work
13270 around bugs in the Solaris 8 implementation of printf. */
13271 printf (" [%6tx] ", data - start);
cf13d699 13272#else
071436c6 13273 printf (" [%6Ix] ", (size_t) (data - start));
cf13d699 13274#endif
4082ef84
NC
13275 if (maxlen > 0)
13276 {
fd8008d8 13277 print_symbol ((int) maxlen, (const char *) data);
4082ef84 13278 putchar ('\n');
fd8008d8 13279 data += strnlen ((const char *) data, maxlen);
4082ef84
NC
13280 }
13281 else
13282 {
13283 printf (_("<corrupt>\n"));
13284 data = end;
13285 }
cf13d699
NC
13286 some_strings_shown = TRUE;
13287 }
13288 }
13289
13290 if (! some_strings_shown)
13291 printf (_(" No strings found in this section."));
13292
0e602686 13293 free (real_start);
cf13d699
NC
13294
13295 putchar ('\n');
32ec8896 13296 return TRUE;
cf13d699
NC
13297}
13298
32ec8896 13299static bfd_boolean
dda8d76d
NC
13300dump_section_as_bytes (Elf_Internal_Shdr * section,
13301 Filedata * filedata,
13302 bfd_boolean relocate)
cf13d699
NC
13303{
13304 Elf_Internal_Shdr * relsec;
0e602686
NC
13305 bfd_size_type bytes;
13306 bfd_size_type section_size;
13307 bfd_vma addr;
13308 unsigned char * data;
13309 unsigned char * real_start;
13310 unsigned char * start;
13311
dda8d76d 13312 real_start = start = (unsigned char *) get_section_contents (section, filedata);
cf13d699 13313 if (start == NULL)
c6b78c96
NC
13314 /* PR 21820: Do not fail if the section was empty. */
13315 return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
32ec8896 13316
0e602686 13317 section_size = section->sh_size;
cf13d699 13318
dda8d76d 13319 printf (_("\nHex dump of section '%s':\n"), printable_section_name (filedata, section));
cf13d699 13320
0e602686
NC
13321 if (decompress_dumps)
13322 {
13323 dwarf_size_type new_size = section_size;
13324 dwarf_size_type uncompressed_size = 0;
13325
13326 if ((section->sh_flags & SHF_COMPRESSED) != 0)
13327 {
13328 Elf_Internal_Chdr chdr;
13329 unsigned int compression_header_size
ebdf1ebf 13330 = get_compression_header (& chdr, start, section_size);
0e602686 13331
813dabb9 13332 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
0e602686 13333 {
813dabb9 13334 warn (_("section '%s' has unsupported compress type: %d\n"),
dda8d76d 13335 printable_section_name (filedata, section), chdr.ch_type);
32ec8896 13336 return FALSE;
0e602686 13337 }
813dabb9
L
13338 else if (chdr.ch_addralign != section->sh_addralign)
13339 {
13340 warn (_("compressed section '%s' is corrupted\n"),
dda8d76d 13341 printable_section_name (filedata, section));
32ec8896 13342 return FALSE;
813dabb9
L
13343 }
13344 uncompressed_size = chdr.ch_size;
13345 start += compression_header_size;
13346 new_size -= compression_header_size;
0e602686
NC
13347 }
13348 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
13349 {
13350 /* Read the zlib header. In this case, it should be "ZLIB"
13351 followed by the uncompressed section size, 8 bytes in
13352 big-endian order. */
13353 uncompressed_size = start[4]; uncompressed_size <<= 8;
13354 uncompressed_size += start[5]; uncompressed_size <<= 8;
13355 uncompressed_size += start[6]; uncompressed_size <<= 8;
13356 uncompressed_size += start[7]; uncompressed_size <<= 8;
13357 uncompressed_size += start[8]; uncompressed_size <<= 8;
13358 uncompressed_size += start[9]; uncompressed_size <<= 8;
13359 uncompressed_size += start[10]; uncompressed_size <<= 8;
13360 uncompressed_size += start[11];
13361 start += 12;
13362 new_size -= 12;
13363 }
13364
f055032e
NC
13365 if (uncompressed_size)
13366 {
13367 if (uncompress_section_contents (& start, uncompressed_size,
13368 & new_size))
bc303e5d
NC
13369 {
13370 section_size = new_size;
13371 }
f055032e
NC
13372 else
13373 {
13374 error (_("Unable to decompress section %s\n"),
dda8d76d 13375 printable_section_name (filedata, section));
bc303e5d 13376 /* FIXME: Print the section anyway ? */
32ec8896 13377 return FALSE;
f055032e
NC
13378 }
13379 }
bc303e5d
NC
13380 else
13381 start = real_start;
0e602686 13382 }
14ae95f2 13383
cf13d699
NC
13384 if (relocate)
13385 {
dda8d76d 13386 if (! apply_relocations (filedata, section, start, section_size, NULL, NULL))
32ec8896 13387 return FALSE;
cf13d699
NC
13388 }
13389 else
13390 {
13391 /* If the section being dumped has relocations against it the user might
13392 be expecting these relocations to have been applied. Check for this
13393 case and issue a warning message in order to avoid confusion.
13394 FIXME: Maybe we ought to have an option that dumps a section with
13395 relocs applied ? */
dda8d76d
NC
13396 for (relsec = filedata->section_headers;
13397 relsec < filedata->section_headers + filedata->file_header.e_shnum;
cf13d699
NC
13398 ++relsec)
13399 {
13400 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
dda8d76d
NC
13401 || relsec->sh_info >= filedata->file_header.e_shnum
13402 || filedata->section_headers + relsec->sh_info != section
cf13d699 13403 || relsec->sh_size == 0
dda8d76d 13404 || relsec->sh_link >= filedata->file_header.e_shnum)
cf13d699
NC
13405 continue;
13406
13407 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
13408 break;
13409 }
13410 }
13411
13412 addr = section->sh_addr;
0e602686 13413 bytes = section_size;
cf13d699
NC
13414 data = start;
13415
13416 while (bytes)
13417 {
13418 int j;
13419 int k;
13420 int lbytes;
13421
13422 lbytes = (bytes > 16 ? 16 : bytes);
13423
13424 printf (" 0x%8.8lx ", (unsigned long) addr);
13425
13426 for (j = 0; j < 16; j++)
13427 {
13428 if (j < lbytes)
13429 printf ("%2.2x", data[j]);
13430 else
13431 printf (" ");
13432
13433 if ((j & 3) == 3)
13434 printf (" ");
13435 }
13436
13437 for (j = 0; j < lbytes; j++)
13438 {
13439 k = data[j];
13440 if (k >= ' ' && k < 0x7f)
13441 printf ("%c", k);
13442 else
13443 printf (".");
13444 }
13445
13446 putchar ('\n');
13447
13448 data += lbytes;
13449 addr += lbytes;
13450 bytes -= lbytes;
13451 }
13452
0e602686 13453 free (real_start);
cf13d699
NC
13454
13455 putchar ('\n');
32ec8896 13456 return TRUE;
cf13d699
NC
13457}
13458
32ec8896 13459static bfd_boolean
dda8d76d
NC
13460load_specific_debug_section (enum dwarf_section_display_enum debug,
13461 const Elf_Internal_Shdr * sec,
13462 void * data)
1007acb3 13463{
2cf0635d 13464 struct dwarf_section * section = &debug_displays [debug].section;
19e6b90e 13465 char buf [64];
dda8d76d
NC
13466 Filedata * filedata = (Filedata *) data;
13467
19e6b90e 13468 if (section->start != NULL)
dda8d76d
NC
13469 {
13470 /* If it is already loaded, do nothing. */
13471 if (streq (section->filename, filedata->file_name))
13472 return TRUE;
13473 free (section->start);
13474 }
1007acb3 13475
19e6b90e
L
13476 snprintf (buf, sizeof (buf), _("%s section data"), section->name);
13477 section->address = sec->sh_addr;
06614111 13478 section->user_data = NULL;
dda8d76d
NC
13479 section->filename = filedata->file_name;
13480 section->start = (unsigned char *) get_data (NULL, filedata,
3f5e193b
NC
13481 sec->sh_offset, 1,
13482 sec->sh_size, buf);
59245841
NC
13483 if (section->start == NULL)
13484 section->size = 0;
13485 else
13486 {
77115a4a
L
13487 unsigned char *start = section->start;
13488 dwarf_size_type size = sec->sh_size;
dab394de 13489 dwarf_size_type uncompressed_size = 0;
77115a4a
L
13490
13491 if ((sec->sh_flags & SHF_COMPRESSED) != 0)
13492 {
13493 Elf_Internal_Chdr chdr;
d8024a91
NC
13494 unsigned int compression_header_size;
13495
f53be977
L
13496 if (size < (is_32bit_elf
13497 ? sizeof (Elf32_External_Chdr)
13498 : sizeof (Elf64_External_Chdr)))
d8024a91
NC
13499 {
13500 warn (_("compressed section %s is too small to contain a compression header"),
13501 section->name);
32ec8896 13502 return FALSE;
d8024a91
NC
13503 }
13504
ebdf1ebf 13505 compression_header_size = get_compression_header (&chdr, start, size);
d8024a91 13506
813dabb9
L
13507 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13508 {
13509 warn (_("section '%s' has unsupported compress type: %d\n"),
13510 section->name, chdr.ch_type);
32ec8896 13511 return FALSE;
813dabb9
L
13512 }
13513 else if (chdr.ch_addralign != sec->sh_addralign)
13514 {
13515 warn (_("compressed section '%s' is corrupted\n"),
13516 section->name);
32ec8896 13517 return FALSE;
813dabb9 13518 }
dab394de 13519 uncompressed_size = chdr.ch_size;
77115a4a
L
13520 start += compression_header_size;
13521 size -= compression_header_size;
13522 }
dab394de
L
13523 else if (size > 12 && streq ((char *) start, "ZLIB"))
13524 {
13525 /* Read the zlib header. In this case, it should be "ZLIB"
13526 followed by the uncompressed section size, 8 bytes in
13527 big-endian order. */
13528 uncompressed_size = start[4]; uncompressed_size <<= 8;
13529 uncompressed_size += start[5]; uncompressed_size <<= 8;
13530 uncompressed_size += start[6]; uncompressed_size <<= 8;
13531 uncompressed_size += start[7]; uncompressed_size <<= 8;
13532 uncompressed_size += start[8]; uncompressed_size <<= 8;
13533 uncompressed_size += start[9]; uncompressed_size <<= 8;
13534 uncompressed_size += start[10]; uncompressed_size <<= 8;
13535 uncompressed_size += start[11];
13536 start += 12;
13537 size -= 12;
13538 }
13539
1835f746 13540 if (uncompressed_size)
77115a4a 13541 {
1835f746
NC
13542 if (uncompress_section_contents (&start, uncompressed_size,
13543 &size))
13544 {
13545 /* Free the compressed buffer, update the section buffer
13546 and the section size if uncompress is successful. */
13547 free (section->start);
13548 section->start = start;
13549 }
13550 else
13551 {
13552 error (_("Unable to decompress section %s\n"),
dda8d76d 13553 printable_section_name (filedata, sec));
32ec8896 13554 return FALSE;
1835f746 13555 }
77115a4a 13556 }
bc303e5d 13557
77115a4a 13558 section->size = size;
59245841 13559 }
4a114e3e 13560
1b315056 13561 if (section->start == NULL)
32ec8896 13562 return FALSE;
1b315056 13563
19e6b90e 13564 if (debug_displays [debug].relocate)
32ec8896 13565 {
dda8d76d 13566 if (! apply_relocations (filedata, sec, section->start, section->size,
32ec8896
NC
13567 & section->reloc_info, & section->num_relocs))
13568 return FALSE;
13569 }
d1c4b12b
NC
13570 else
13571 {
13572 section->reloc_info = NULL;
13573 section->num_relocs = 0;
13574 }
1007acb3 13575
32ec8896 13576 return TRUE;
1007acb3
L
13577}
13578
657d0d47
CC
13579/* If this is not NULL, load_debug_section will only look for sections
13580 within the list of sections given here. */
32ec8896 13581static unsigned int * section_subset = NULL;
657d0d47 13582
32ec8896 13583bfd_boolean
dda8d76d 13584load_debug_section (enum dwarf_section_display_enum debug, void * data)
d966045b 13585{
2cf0635d
NC
13586 struct dwarf_section * section = &debug_displays [debug].section;
13587 Elf_Internal_Shdr * sec;
dda8d76d
NC
13588 Filedata * filedata = (Filedata *) data;
13589
f425ec66
NC
13590 /* Without section headers we cannot find any sections. */
13591 if (filedata->section_headers == NULL)
13592 return FALSE;
13593
9c1ce108
AM
13594 if (filedata->string_table == NULL
13595 && filedata->file_header.e_shstrndx != SHN_UNDEF
13596 && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
dda8d76d
NC
13597 {
13598 Elf_Internal_Shdr * strs;
13599
13600 /* Read in the string table, so that we have section names to scan. */
13601 strs = filedata->section_headers + filedata->file_header.e_shstrndx;
13602
4dff97b2 13603 if (strs != NULL && strs->sh_size != 0)
dda8d76d 13604 {
9c1ce108
AM
13605 filedata->string_table
13606 = (char *) get_data (NULL, filedata, strs->sh_offset,
13607 1, strs->sh_size, _("string table"));
dda8d76d 13608
9c1ce108
AM
13609 filedata->string_table_length
13610 = filedata->string_table != NULL ? strs->sh_size : 0;
dda8d76d
NC
13611 }
13612 }
d966045b
DJ
13613
13614 /* Locate the debug section. */
dda8d76d 13615 sec = find_section_in_set (filedata, section->uncompressed_name, section_subset);
d966045b
DJ
13616 if (sec != NULL)
13617 section->name = section->uncompressed_name;
13618 else
13619 {
dda8d76d 13620 sec = find_section_in_set (filedata, section->compressed_name, section_subset);
d966045b
DJ
13621 if (sec != NULL)
13622 section->name = section->compressed_name;
13623 }
13624 if (sec == NULL)
32ec8896 13625 return FALSE;
d966045b 13626
657d0d47
CC
13627 /* If we're loading from a subset of sections, and we've loaded
13628 a section matching this name before, it's likely that it's a
13629 different one. */
13630 if (section_subset != NULL)
13631 free_debug_section (debug);
13632
dda8d76d 13633 return load_specific_debug_section (debug, sec, data);
d966045b
DJ
13634}
13635
19e6b90e
L
13636void
13637free_debug_section (enum dwarf_section_display_enum debug)
1007acb3 13638{
2cf0635d 13639 struct dwarf_section * section = &debug_displays [debug].section;
1007acb3 13640
19e6b90e
L
13641 if (section->start == NULL)
13642 return;
1007acb3 13643
19e6b90e
L
13644 free ((char *) section->start);
13645 section->start = NULL;
13646 section->address = 0;
13647 section->size = 0;
1007acb3
L
13648}
13649
32ec8896 13650static bfd_boolean
dda8d76d 13651display_debug_section (int shndx, Elf_Internal_Shdr * section, Filedata * filedata)
1007acb3 13652{
2cf0635d 13653 char * name = SECTION_NAME (section);
dda8d76d 13654 const char * print_name = printable_section_name (filedata, section);
19e6b90e 13655 bfd_size_type length;
32ec8896 13656 bfd_boolean result = TRUE;
3f5e193b 13657 int i;
1007acb3 13658
19e6b90e
L
13659 length = section->sh_size;
13660 if (length == 0)
1007acb3 13661 {
74e1a04b 13662 printf (_("\nSection '%s' has no debugging data.\n"), print_name);
32ec8896 13663 return TRUE;
1007acb3 13664 }
5dff79d8
NC
13665 if (section->sh_type == SHT_NOBITS)
13666 {
13667 /* There is no point in dumping the contents of a debugging section
13668 which has the NOBITS type - the bits in the file will be random.
13669 This can happen when a file containing a .eh_frame section is
13670 stripped with the --only-keep-debug command line option. */
74e1a04b
NC
13671 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
13672 print_name);
32ec8896 13673 return FALSE;
5dff79d8 13674 }
1007acb3 13675
0112cd26 13676 if (const_strneq (name, ".gnu.linkonce.wi."))
19e6b90e 13677 name = ".debug_info";
1007acb3 13678
19e6b90e
L
13679 /* See if we know how to display the contents of this section. */
13680 for (i = 0; i < max; i++)
d85bf2ba
NC
13681 {
13682 enum dwarf_section_display_enum id = (enum dwarf_section_display_enum) i;
13683 struct dwarf_section_display * display = debug_displays + i;
13684 struct dwarf_section * sec = & display->section;
d966045b 13685
d85bf2ba
NC
13686 if (streq (sec->uncompressed_name, name)
13687 || (id == line && const_strneq (name, ".debug_line."))
13688 || streq (sec->compressed_name, name))
13689 {
13690 bfd_boolean secondary = (section != find_section (filedata, name));
1007acb3 13691
d85bf2ba
NC
13692 if (secondary)
13693 free_debug_section (id);
dda8d76d 13694
d85bf2ba
NC
13695 if (i == line && const_strneq (name, ".debug_line."))
13696 sec->name = name;
13697 else if (streq (sec->uncompressed_name, name))
13698 sec->name = sec->uncompressed_name;
13699 else
13700 sec->name = sec->compressed_name;
657d0d47 13701
d85bf2ba
NC
13702 if (load_specific_debug_section (id, section, filedata))
13703 {
13704 /* If this debug section is part of a CU/TU set in a .dwp file,
13705 restrict load_debug_section to the sections in that set. */
13706 section_subset = find_cu_tu_set (filedata, shndx);
1007acb3 13707
d85bf2ba 13708 result &= display->display (sec, filedata);
657d0d47 13709
d85bf2ba 13710 section_subset = NULL;
1007acb3 13711
d85bf2ba
NC
13712 if (secondary || (id != info && id != abbrev))
13713 free_debug_section (id);
13714 }
13715 break;
13716 }
13717 }
1007acb3 13718
19e6b90e 13719 if (i == max)
1007acb3 13720 {
74e1a04b 13721 printf (_("Unrecognized debug section: %s\n"), print_name);
32ec8896 13722 result = FALSE;
1007acb3
L
13723 }
13724
19e6b90e 13725 return result;
5b18a4bc 13726}
103f02d3 13727
aef1f6d0
DJ
13728/* Set DUMP_SECTS for all sections where dumps were requested
13729 based on section name. */
13730
13731static void
dda8d76d 13732initialise_dumps_byname (Filedata * filedata)
aef1f6d0 13733{
2cf0635d 13734 struct dump_list_entry * cur;
aef1f6d0
DJ
13735
13736 for (cur = dump_sects_byname; cur; cur = cur->next)
13737 {
13738 unsigned int i;
32ec8896 13739 bfd_boolean any = FALSE;
aef1f6d0 13740
dda8d76d
NC
13741 for (i = 0; i < filedata->file_header.e_shnum; i++)
13742 if (streq (SECTION_NAME (filedata->section_headers + i), cur->name))
aef1f6d0 13743 {
dda8d76d 13744 request_dump_bynumber (filedata, i, cur->type);
32ec8896 13745 any = TRUE;
aef1f6d0
DJ
13746 }
13747
13748 if (!any)
13749 warn (_("Section '%s' was not dumped because it does not exist!\n"),
13750 cur->name);
13751 }
13752}
13753
32ec8896 13754static bfd_boolean
dda8d76d 13755process_section_contents (Filedata * filedata)
5b18a4bc 13756{
2cf0635d 13757 Elf_Internal_Shdr * section;
19e6b90e 13758 unsigned int i;
32ec8896 13759 bfd_boolean res = TRUE;
103f02d3 13760
19e6b90e 13761 if (! do_dump)
32ec8896 13762 return TRUE;
103f02d3 13763
dda8d76d 13764 initialise_dumps_byname (filedata);
aef1f6d0 13765
dda8d76d
NC
13766 for (i = 0, section = filedata->section_headers;
13767 i < filedata->file_header.e_shnum && i < filedata->num_dump_sects;
19e6b90e
L
13768 i++, section++)
13769 {
dda8d76d
NC
13770 dump_type dump = filedata->dump_sects[i];
13771
19e6b90e 13772#ifdef SUPPORT_DISASSEMBLY
dda8d76d
NC
13773 if (dump & DISASS_DUMP)
13774 {
13775 if (! disassemble_section (section, filedata))
13776 res = FALSE;
13777 }
19e6b90e 13778#endif
dda8d76d 13779 if (dump & HEX_DUMP)
32ec8896 13780 {
dda8d76d 13781 if (! dump_section_as_bytes (section, filedata, FALSE))
32ec8896
NC
13782 res = FALSE;
13783 }
103f02d3 13784
dda8d76d 13785 if (dump & RELOC_DUMP)
32ec8896 13786 {
dda8d76d 13787 if (! dump_section_as_bytes (section, filedata, TRUE))
32ec8896
NC
13788 res = FALSE;
13789 }
09c11c86 13790
dda8d76d 13791 if (dump & STRING_DUMP)
32ec8896 13792 {
dda8d76d 13793 if (! dump_section_as_strings (section, filedata))
32ec8896
NC
13794 res = FALSE;
13795 }
cf13d699 13796
dda8d76d 13797 if (dump & DEBUG_DUMP)
32ec8896 13798 {
dda8d76d 13799 if (! display_debug_section (i, section, filedata))
32ec8896
NC
13800 res = FALSE;
13801 }
5b18a4bc 13802 }
103f02d3 13803
19e6b90e
L
13804 /* Check to see if the user requested a
13805 dump of a section that does not exist. */
dda8d76d 13806 while (i < filedata->num_dump_sects)
0ee3043f 13807 {
dda8d76d 13808 if (filedata->dump_sects[i])
32ec8896
NC
13809 {
13810 warn (_("Section %d was not dumped because it does not exist!\n"), i);
13811 res = FALSE;
13812 }
0ee3043f
NC
13813 i++;
13814 }
32ec8896
NC
13815
13816 return res;
5b18a4bc 13817}
103f02d3 13818
5b18a4bc 13819static void
19e6b90e 13820process_mips_fpe_exception (int mask)
5b18a4bc 13821{
19e6b90e
L
13822 if (mask)
13823 {
32ec8896
NC
13824 bfd_boolean first = TRUE;
13825
19e6b90e 13826 if (mask & OEX_FPU_INEX)
32ec8896 13827 fputs ("INEX", stdout), first = FALSE;
19e6b90e 13828 if (mask & OEX_FPU_UFLO)
32ec8896 13829 printf ("%sUFLO", first ? "" : "|"), first = FALSE;
19e6b90e 13830 if (mask & OEX_FPU_OFLO)
32ec8896 13831 printf ("%sOFLO", first ? "" : "|"), first = FALSE;
19e6b90e 13832 if (mask & OEX_FPU_DIV0)
32ec8896 13833 printf ("%sDIV0", first ? "" : "|"), first = FALSE;
19e6b90e
L
13834 if (mask & OEX_FPU_INVAL)
13835 printf ("%sINVAL", first ? "" : "|");
13836 }
5b18a4bc 13837 else
19e6b90e 13838 fputs ("0", stdout);
5b18a4bc 13839}
103f02d3 13840
f6f0e17b
NC
13841/* Display's the value of TAG at location P. If TAG is
13842 greater than 0 it is assumed to be an unknown tag, and
13843 a message is printed to this effect. Otherwise it is
13844 assumed that a message has already been printed.
13845
13846 If the bottom bit of TAG is set it assumed to have a
13847 string value, otherwise it is assumed to have an integer
13848 value.
13849
13850 Returns an updated P pointing to the first unread byte
13851 beyond the end of TAG's value.
13852
13853 Reads at or beyond END will not be made. */
13854
13855static unsigned char *
60abdbed 13856display_tag_value (signed int tag,
f6f0e17b
NC
13857 unsigned char * p,
13858 const unsigned char * const end)
13859{
13860 unsigned long val;
13861
13862 if (tag > 0)
13863 printf (" Tag_unknown_%d: ", tag);
13864
13865 if (p >= end)
13866 {
4082ef84 13867 warn (_("<corrupt tag>\n"));
f6f0e17b
NC
13868 }
13869 else if (tag & 1)
13870 {
071436c6
NC
13871 /* PR 17531 file: 027-19978-0.004. */
13872 size_t maxlen = (end - p) - 1;
13873
13874 putchar ('"');
4082ef84
NC
13875 if (maxlen > 0)
13876 {
13877 print_symbol ((int) maxlen, (const char *) p);
13878 p += strnlen ((char *) p, maxlen) + 1;
13879 }
13880 else
13881 {
13882 printf (_("<corrupt string tag>"));
13883 p = (unsigned char *) end;
13884 }
071436c6 13885 printf ("\"\n");
f6f0e17b
NC
13886 }
13887 else
13888 {
13889 unsigned int len;
13890
13891 val = read_uleb128 (p, &len, end);
13892 p += len;
13893 printf ("%ld (0x%lx)\n", val, val);
13894 }
13895
4082ef84 13896 assert (p <= end);
f6f0e17b
NC
13897 return p;
13898}
13899
53a346d8
CZ
13900/* ARC ABI attributes section. */
13901
13902static unsigned char *
13903display_arc_attribute (unsigned char * p,
13904 const unsigned char * const end)
13905{
13906 unsigned int tag;
13907 unsigned int len;
13908 unsigned int val;
13909
13910 tag = read_uleb128 (p, &len, end);
13911 p += len;
13912
13913 switch (tag)
13914 {
13915 case Tag_ARC_PCS_config:
13916 val = read_uleb128 (p, &len, end);
13917 p += len;
13918 printf (" Tag_ARC_PCS_config: ");
13919 switch (val)
13920 {
13921 case 0:
13922 printf (_("Absent/Non standard\n"));
13923 break;
13924 case 1:
13925 printf (_("Bare metal/mwdt\n"));
13926 break;
13927 case 2:
13928 printf (_("Bare metal/newlib\n"));
13929 break;
13930 case 3:
13931 printf (_("Linux/uclibc\n"));
13932 break;
13933 case 4:
13934 printf (_("Linux/glibc\n"));
13935 break;
13936 default:
13937 printf (_("Unknown\n"));
13938 break;
13939 }
13940 break;
13941
13942 case Tag_ARC_CPU_base:
13943 val = read_uleb128 (p, &len, end);
13944 p += len;
13945 printf (" Tag_ARC_CPU_base: ");
13946 switch (val)
13947 {
13948 default:
13949 case TAG_CPU_NONE:
13950 printf (_("Absent\n"));
13951 break;
13952 case TAG_CPU_ARC6xx:
13953 printf ("ARC6xx\n");
13954 break;
13955 case TAG_CPU_ARC7xx:
13956 printf ("ARC7xx\n");
13957 break;
13958 case TAG_CPU_ARCEM:
13959 printf ("ARCEM\n");
13960 break;
13961 case TAG_CPU_ARCHS:
13962 printf ("ARCHS\n");
13963 break;
13964 }
13965 break;
13966
13967 case Tag_ARC_CPU_variation:
13968 val = read_uleb128 (p, &len, end);
13969 p += len;
13970 printf (" Tag_ARC_CPU_variation: ");
13971 switch (val)
13972 {
13973 default:
13974 if (val > 0 && val < 16)
53a346d8 13975 printf ("Core%d\n", val);
d8cbc93b
JL
13976 else
13977 printf ("Unknown\n");
13978 break;
13979
53a346d8
CZ
13980 case 0:
13981 printf (_("Absent\n"));
13982 break;
13983 }
13984 break;
13985
13986 case Tag_ARC_CPU_name:
13987 printf (" Tag_ARC_CPU_name: ");
13988 p = display_tag_value (-1, p, end);
13989 break;
13990
13991 case Tag_ARC_ABI_rf16:
13992 val = read_uleb128 (p, &len, end);
13993 p += len;
13994 printf (" Tag_ARC_ABI_rf16: %s\n", val ? _("yes") : _("no"));
13995 break;
13996
13997 case Tag_ARC_ABI_osver:
13998 val = read_uleb128 (p, &len, end);
13999 p += len;
14000 printf (" Tag_ARC_ABI_osver: v%d\n", val);
14001 break;
14002
14003 case Tag_ARC_ABI_pic:
14004 case Tag_ARC_ABI_sda:
14005 val = read_uleb128 (p, &len, end);
14006 p += len;
14007 printf (tag == Tag_ARC_ABI_sda ? " Tag_ARC_ABI_sda: "
14008 : " Tag_ARC_ABI_pic: ");
14009 switch (val)
14010 {
14011 case 0:
14012 printf (_("Absent\n"));
14013 break;
14014 case 1:
14015 printf ("MWDT\n");
14016 break;
14017 case 2:
14018 printf ("GNU\n");
14019 break;
14020 default:
14021 printf (_("Unknown\n"));
14022 break;
14023 }
14024 break;
14025
14026 case Tag_ARC_ABI_tls:
14027 val = read_uleb128 (p, &len, end);
14028 p += len;
14029 printf (" Tag_ARC_ABI_tls: %s\n", val ? "r25": "none");
14030 break;
14031
14032 case Tag_ARC_ABI_enumsize:
14033 val = read_uleb128 (p, &len, end);
14034 p += len;
14035 printf (" Tag_ARC_ABI_enumsize: %s\n", val ? _("default") :
14036 _("smallest"));
14037 break;
14038
14039 case Tag_ARC_ABI_exceptions:
14040 val = read_uleb128 (p, &len, end);
14041 p += len;
14042 printf (" Tag_ARC_ABI_exceptions: %s\n", val ? _("OPTFP")
14043 : _("default"));
14044 break;
14045
14046 case Tag_ARC_ABI_double_size:
14047 val = read_uleb128 (p, &len, end);
14048 p += len;
14049 printf (" Tag_ARC_ABI_double_size: %d\n", val);
14050 break;
14051
14052 case Tag_ARC_ISA_config:
14053 printf (" Tag_ARC_ISA_config: ");
14054 p = display_tag_value (-1, p, end);
14055 break;
14056
14057 case Tag_ARC_ISA_apex:
14058 printf (" Tag_ARC_ISA_apex: ");
14059 p = display_tag_value (-1, p, end);
14060 break;
14061
14062 case Tag_ARC_ISA_mpy_option:
14063 val = read_uleb128 (p, &len, end);
14064 p += len;
14065 printf (" Tag_ARC_ISA_mpy_option: %d\n", val);
14066 break;
14067
14068 default:
14069 return display_tag_value (tag & 1, p, end);
14070 }
14071
14072 return p;
14073}
14074
11c1ff18
PB
14075/* ARM EABI attributes section. */
14076typedef struct
14077{
70e99720 14078 unsigned int tag;
2cf0635d 14079 const char * name;
11c1ff18 14080 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
70e99720 14081 unsigned int type;
2cf0635d 14082 const char ** table;
11c1ff18
PB
14083} arm_attr_public_tag;
14084
2cf0635d 14085static const char * arm_attr_tag_CPU_arch[] =
11c1ff18 14086 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
ced40572 14087 "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "v8-R", "v8-M.baseline",
ff8646ee 14088 "v8-M.mainline"};
2cf0635d
NC
14089static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
14090static const char * arm_attr_tag_THUMB_ISA_use[] =
4ed7ed8d 14091 {"No", "Thumb-1", "Thumb-2", "Yes"};
75375b3e 14092static const char * arm_attr_tag_FP_arch[] =
bca38921 14093 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
a715796b 14094 "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
2cf0635d 14095static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
dd24e3da 14096static const char * arm_attr_tag_Advanced_SIMD_arch[] =
9411fd44
MW
14097 {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
14098 "NEON for ARMv8.1"};
2cf0635d 14099static const char * arm_attr_tag_PCS_config[] =
11c1ff18
PB
14100 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
14101 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
2cf0635d 14102static const char * arm_attr_tag_ABI_PCS_R9_use[] =
11c1ff18 14103 {"V6", "SB", "TLS", "Unused"};
2cf0635d 14104static const char * arm_attr_tag_ABI_PCS_RW_data[] =
11c1ff18 14105 {"Absolute", "PC-relative", "SB-relative", "None"};
2cf0635d 14106static const char * arm_attr_tag_ABI_PCS_RO_data[] =
11c1ff18 14107 {"Absolute", "PC-relative", "None"};
2cf0635d 14108static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
11c1ff18 14109 {"None", "direct", "GOT-indirect"};
2cf0635d 14110static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
11c1ff18 14111 {"None", "??? 1", "2", "??? 3", "4"};
2cf0635d
NC
14112static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
14113static const char * arm_attr_tag_ABI_FP_denormal[] =
f5f53991 14114 {"Unused", "Needed", "Sign only"};
2cf0635d
NC
14115static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
14116static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
14117static const char * arm_attr_tag_ABI_FP_number_model[] =
11c1ff18 14118 {"Unused", "Finite", "RTABI", "IEEE 754"};
2cf0635d 14119static const char * arm_attr_tag_ABI_enum_size[] =
11c1ff18 14120 {"Unused", "small", "int", "forced to int"};
2cf0635d 14121static const char * arm_attr_tag_ABI_HardFP_use[] =
99654aaf 14122 {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
2cf0635d 14123static const char * arm_attr_tag_ABI_VFP_args[] =
5c294fee 14124 {"AAPCS", "VFP registers", "custom", "compatible"};
2cf0635d 14125static const char * arm_attr_tag_ABI_WMMX_args[] =
11c1ff18 14126 {"AAPCS", "WMMX registers", "custom"};
2cf0635d 14127static const char * arm_attr_tag_ABI_optimization_goals[] =
11c1ff18
PB
14128 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14129 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
2cf0635d 14130static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
11c1ff18
PB
14131 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14132 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
2cf0635d 14133static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
75375b3e 14134static const char * arm_attr_tag_FP_HP_extension[] =
8e79c3df 14135 {"Not Allowed", "Allowed"};
2cf0635d 14136static const char * arm_attr_tag_ABI_FP_16bit_format[] =
8e79c3df 14137 {"None", "IEEE 754", "Alternative Format"};
15afaa63
TP
14138static const char * arm_attr_tag_DSP_extension[] =
14139 {"Follow architecture", "Allowed"};
dd24e3da 14140static const char * arm_attr_tag_MPextension_use[] =
cd21e546
MGD
14141 {"Not Allowed", "Allowed"};
14142static const char * arm_attr_tag_DIV_use[] =
dd24e3da 14143 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
cd21e546 14144 "Allowed in v7-A with integer division extension"};
2cf0635d
NC
14145static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
14146static const char * arm_attr_tag_Virtualization_use[] =
dd24e3da 14147 {"Not Allowed", "TrustZone", "Virtualization Extensions",
cd21e546 14148 "TrustZone and Virtualization Extensions"};
dd24e3da 14149static const char * arm_attr_tag_MPextension_use_legacy[] =
f5f53991 14150 {"Not Allowed", "Allowed"};
11c1ff18
PB
14151
14152#define LOOKUP(id, name) \
14153 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
d70c5fc7 14154static arm_attr_public_tag arm_attr_public_tags[] =
11c1ff18
PB
14155{
14156 {4, "CPU_raw_name", 1, NULL},
14157 {5, "CPU_name", 1, NULL},
14158 LOOKUP(6, CPU_arch),
14159 {7, "CPU_arch_profile", 0, NULL},
14160 LOOKUP(8, ARM_ISA_use),
14161 LOOKUP(9, THUMB_ISA_use),
75375b3e 14162 LOOKUP(10, FP_arch),
11c1ff18 14163 LOOKUP(11, WMMX_arch),
f5f53991
AS
14164 LOOKUP(12, Advanced_SIMD_arch),
14165 LOOKUP(13, PCS_config),
11c1ff18
PB
14166 LOOKUP(14, ABI_PCS_R9_use),
14167 LOOKUP(15, ABI_PCS_RW_data),
f5f53991 14168 LOOKUP(16, ABI_PCS_RO_data),
11c1ff18
PB
14169 LOOKUP(17, ABI_PCS_GOT_use),
14170 LOOKUP(18, ABI_PCS_wchar_t),
14171 LOOKUP(19, ABI_FP_rounding),
14172 LOOKUP(20, ABI_FP_denormal),
14173 LOOKUP(21, ABI_FP_exceptions),
14174 LOOKUP(22, ABI_FP_user_exceptions),
14175 LOOKUP(23, ABI_FP_number_model),
75375b3e
MGD
14176 {24, "ABI_align_needed", 0, NULL},
14177 {25, "ABI_align_preserved", 0, NULL},
11c1ff18
PB
14178 LOOKUP(26, ABI_enum_size),
14179 LOOKUP(27, ABI_HardFP_use),
14180 LOOKUP(28, ABI_VFP_args),
14181 LOOKUP(29, ABI_WMMX_args),
14182 LOOKUP(30, ABI_optimization_goals),
14183 LOOKUP(31, ABI_FP_optimization_goals),
8e79c3df 14184 {32, "compatibility", 0, NULL},
f5f53991 14185 LOOKUP(34, CPU_unaligned_access),
75375b3e 14186 LOOKUP(36, FP_HP_extension),
8e79c3df 14187 LOOKUP(38, ABI_FP_16bit_format),
cd21e546
MGD
14188 LOOKUP(42, MPextension_use),
14189 LOOKUP(44, DIV_use),
15afaa63 14190 LOOKUP(46, DSP_extension),
f5f53991
AS
14191 {64, "nodefaults", 0, NULL},
14192 {65, "also_compatible_with", 0, NULL},
14193 LOOKUP(66, T2EE_use),
14194 {67, "conformance", 1, NULL},
14195 LOOKUP(68, Virtualization_use),
cd21e546 14196 LOOKUP(70, MPextension_use_legacy)
11c1ff18
PB
14197};
14198#undef LOOKUP
14199
11c1ff18 14200static unsigned char *
f6f0e17b
NC
14201display_arm_attribute (unsigned char * p,
14202 const unsigned char * const end)
11c1ff18 14203{
70e99720 14204 unsigned int tag;
11c1ff18 14205 unsigned int len;
70e99720 14206 unsigned int val;
2cf0635d 14207 arm_attr_public_tag * attr;
11c1ff18 14208 unsigned i;
70e99720 14209 unsigned int type;
11c1ff18 14210
f6f0e17b 14211 tag = read_uleb128 (p, &len, end);
11c1ff18
PB
14212 p += len;
14213 attr = NULL;
2cf0635d 14214 for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
11c1ff18
PB
14215 {
14216 if (arm_attr_public_tags[i].tag == tag)
14217 {
14218 attr = &arm_attr_public_tags[i];
14219 break;
14220 }
14221 }
14222
14223 if (attr)
14224 {
14225 printf (" Tag_%s: ", attr->name);
14226 switch (attr->type)
14227 {
14228 case 0:
14229 switch (tag)
14230 {
14231 case 7: /* Tag_CPU_arch_profile. */
f6f0e17b 14232 val = read_uleb128 (p, &len, end);
11c1ff18
PB
14233 p += len;
14234 switch (val)
14235 {
2b692964
NC
14236 case 0: printf (_("None\n")); break;
14237 case 'A': printf (_("Application\n")); break;
14238 case 'R': printf (_("Realtime\n")); break;
14239 case 'M': printf (_("Microcontroller\n")); break;
14240 case 'S': printf (_("Application or Realtime\n")); break;
11c1ff18
PB
14241 default: printf ("??? (%d)\n", val); break;
14242 }
14243 break;
14244
75375b3e 14245 case 24: /* Tag_align_needed. */
f6f0e17b 14246 val = read_uleb128 (p, &len, end);
75375b3e
MGD
14247 p += len;
14248 switch (val)
14249 {
2b692964
NC
14250 case 0: printf (_("None\n")); break;
14251 case 1: printf (_("8-byte\n")); break;
14252 case 2: printf (_("4-byte\n")); break;
75375b3e
MGD
14253 case 3: printf ("??? 3\n"); break;
14254 default:
14255 if (val <= 12)
dd24e3da 14256 printf (_("8-byte and up to %d-byte extended\n"),
75375b3e
MGD
14257 1 << val);
14258 else
14259 printf ("??? (%d)\n", val);
14260 break;
14261 }
14262 break;
14263
14264 case 25: /* Tag_align_preserved. */
f6f0e17b 14265 val = read_uleb128 (p, &len, end);
75375b3e
MGD
14266 p += len;
14267 switch (val)
14268 {
2b692964
NC
14269 case 0: printf (_("None\n")); break;
14270 case 1: printf (_("8-byte, except leaf SP\n")); break;
14271 case 2: printf (_("8-byte\n")); break;
75375b3e
MGD
14272 case 3: printf ("??? 3\n"); break;
14273 default:
14274 if (val <= 12)
dd24e3da 14275 printf (_("8-byte and up to %d-byte extended\n"),
75375b3e
MGD
14276 1 << val);
14277 else
14278 printf ("??? (%d)\n", val);
14279 break;
14280 }
14281 break;
14282
11c1ff18 14283 case 32: /* Tag_compatibility. */
071436c6 14284 {
071436c6
NC
14285 val = read_uleb128 (p, &len, end);
14286 p += len;
071436c6 14287 printf (_("flag = %d, vendor = "), val);
4082ef84
NC
14288 if (p < end - 1)
14289 {
14290 size_t maxlen = (end - p) - 1;
14291
14292 print_symbol ((int) maxlen, (const char *) p);
14293 p += strnlen ((char *) p, maxlen) + 1;
14294 }
14295 else
14296 {
14297 printf (_("<corrupt>"));
14298 p = (unsigned char *) end;
14299 }
071436c6 14300 putchar ('\n');
071436c6 14301 }
11c1ff18
PB
14302 break;
14303
f5f53991 14304 case 64: /* Tag_nodefaults. */
541a3cbd
NC
14305 /* PR 17531: file: 001-505008-0.01. */
14306 if (p < end)
14307 p++;
2b692964 14308 printf (_("True\n"));
f5f53991
AS
14309 break;
14310
14311 case 65: /* Tag_also_compatible_with. */
f6f0e17b 14312 val = read_uleb128 (p, &len, end);
f5f53991
AS
14313 p += len;
14314 if (val == 6 /* Tag_CPU_arch. */)
14315 {
f6f0e17b 14316 val = read_uleb128 (p, &len, end);
f5f53991 14317 p += len;
071436c6 14318 if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
f5f53991
AS
14319 printf ("??? (%d)\n", val);
14320 else
14321 printf ("%s\n", arm_attr_tag_CPU_arch[val]);
14322 }
14323 else
14324 printf ("???\n");
071436c6
NC
14325 while (p < end && *(p++) != '\0' /* NUL terminator. */)
14326 ;
f5f53991
AS
14327 break;
14328
11c1ff18 14329 default:
bee0ee85
NC
14330 printf (_("<unknown: %d>\n"), tag);
14331 break;
11c1ff18
PB
14332 }
14333 return p;
14334
14335 case 1:
f6f0e17b 14336 return display_tag_value (-1, p, end);
11c1ff18 14337 case 2:
f6f0e17b 14338 return display_tag_value (0, p, end);
11c1ff18
PB
14339
14340 default:
14341 assert (attr->type & 0x80);
f6f0e17b 14342 val = read_uleb128 (p, &len, end);
11c1ff18
PB
14343 p += len;
14344 type = attr->type & 0x7f;
14345 if (val >= type)
14346 printf ("??? (%d)\n", val);
14347 else
14348 printf ("%s\n", attr->table[val]);
14349 return p;
14350 }
14351 }
11c1ff18 14352
f6f0e17b 14353 return display_tag_value (tag, p, end);
11c1ff18
PB
14354}
14355
104d59d1 14356static unsigned char *
60bca95a 14357display_gnu_attribute (unsigned char * p,
60abdbed 14358 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const),
f6f0e17b 14359 const unsigned char * const end)
104d59d1
JM
14360{
14361 int tag;
14362 unsigned int len;
60abdbed 14363 unsigned int val;
104d59d1 14364
f6f0e17b 14365 tag = read_uleb128 (p, &len, end);
104d59d1
JM
14366 p += len;
14367
14368 /* Tag_compatibility is the only generic GNU attribute defined at
14369 present. */
14370 if (tag == 32)
14371 {
f6f0e17b 14372 val = read_uleb128 (p, &len, end);
104d59d1 14373 p += len;
071436c6
NC
14374
14375 printf (_("flag = %d, vendor = "), val);
f6f0e17b
NC
14376 if (p == end)
14377 {
071436c6 14378 printf (_("<corrupt>\n"));
f6f0e17b
NC
14379 warn (_("corrupt vendor attribute\n"));
14380 }
14381 else
14382 {
4082ef84
NC
14383 if (p < end - 1)
14384 {
14385 size_t maxlen = (end - p) - 1;
071436c6 14386
4082ef84
NC
14387 print_symbol ((int) maxlen, (const char *) p);
14388 p += strnlen ((char *) p, maxlen) + 1;
14389 }
14390 else
14391 {
14392 printf (_("<corrupt>"));
14393 p = (unsigned char *) end;
14394 }
071436c6 14395 putchar ('\n');
f6f0e17b 14396 }
104d59d1
JM
14397 return p;
14398 }
14399
14400 if ((tag & 2) == 0 && display_proc_gnu_attribute)
f6f0e17b 14401 return display_proc_gnu_attribute (p, tag, end);
104d59d1 14402
f6f0e17b 14403 return display_tag_value (tag, p, end);
104d59d1
JM
14404}
14405
34c8bcba 14406static unsigned char *
f6f0e17b 14407display_power_gnu_attribute (unsigned char * p,
60abdbed 14408 unsigned int tag,
f6f0e17b 14409 const unsigned char * const end)
34c8bcba 14410{
34c8bcba 14411 unsigned int len;
005d79fd 14412 unsigned int val;
34c8bcba
JM
14413
14414 if (tag == Tag_GNU_Power_ABI_FP)
14415 {
f6f0e17b 14416 val = read_uleb128 (p, &len, end);
34c8bcba
JM
14417 p += len;
14418 printf (" Tag_GNU_Power_ABI_FP: ");
005d79fd
AM
14419 if (len == 0)
14420 {
14421 printf (_("<corrupt>\n"));
14422 return p;
14423 }
60bca95a 14424
005d79fd
AM
14425 if (val > 15)
14426 printf ("(%#x), ", val);
14427
14428 switch (val & 3)
34c8bcba
JM
14429 {
14430 case 0:
005d79fd 14431 printf (_("unspecified hard/soft float, "));
34c8bcba
JM
14432 break;
14433 case 1:
005d79fd 14434 printf (_("hard float, "));
34c8bcba
JM
14435 break;
14436 case 2:
005d79fd 14437 printf (_("soft float, "));
34c8bcba 14438 break;
3c7b9897 14439 case 3:
005d79fd 14440 printf (_("single-precision hard float, "));
3c7b9897 14441 break;
005d79fd
AM
14442 }
14443
14444 switch (val & 0xC)
14445 {
14446 case 0:
14447 printf (_("unspecified long double\n"));
14448 break;
14449 case 4:
14450 printf (_("128-bit IBM long double\n"));
14451 break;
14452 case 8:
14453 printf (_("64-bit long double\n"));
14454 break;
14455 case 12:
14456 printf (_("128-bit IEEE long double\n"));
34c8bcba
JM
14457 break;
14458 }
14459 return p;
005d79fd 14460 }
34c8bcba 14461
c6e65352
DJ
14462 if (tag == Tag_GNU_Power_ABI_Vector)
14463 {
f6f0e17b 14464 val = read_uleb128 (p, &len, end);
c6e65352
DJ
14465 p += len;
14466 printf (" Tag_GNU_Power_ABI_Vector: ");
005d79fd
AM
14467 if (len == 0)
14468 {
14469 printf (_("<corrupt>\n"));
14470 return p;
14471 }
14472
14473 if (val > 3)
14474 printf ("(%#x), ", val);
14475
14476 switch (val & 3)
c6e65352
DJ
14477 {
14478 case 0:
005d79fd 14479 printf (_("unspecified\n"));
c6e65352
DJ
14480 break;
14481 case 1:
005d79fd 14482 printf (_("generic\n"));
c6e65352
DJ
14483 break;
14484 case 2:
14485 printf ("AltiVec\n");
14486 break;
14487 case 3:
14488 printf ("SPE\n");
14489 break;
c6e65352
DJ
14490 }
14491 return p;
005d79fd 14492 }
c6e65352 14493
f82e0623
NF
14494 if (tag == Tag_GNU_Power_ABI_Struct_Return)
14495 {
005d79fd
AM
14496 val = read_uleb128 (p, &len, end);
14497 p += len;
14498 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
14499 if (len == 0)
f6f0e17b 14500 {
005d79fd 14501 printf (_("<corrupt>\n"));
f6f0e17b
NC
14502 return p;
14503 }
0b4362b0 14504
005d79fd
AM
14505 if (val > 2)
14506 printf ("(%#x), ", val);
14507
14508 switch (val & 3)
14509 {
14510 case 0:
14511 printf (_("unspecified\n"));
14512 break;
14513 case 1:
14514 printf ("r3/r4\n");
14515 break;
14516 case 2:
14517 printf (_("memory\n"));
14518 break;
14519 case 3:
14520 printf ("???\n");
14521 break;
14522 }
f82e0623
NF
14523 return p;
14524 }
14525
f6f0e17b 14526 return display_tag_value (tag & 1, p, end);
34c8bcba
JM
14527}
14528
643f7afb
AK
14529static unsigned char *
14530display_s390_gnu_attribute (unsigned char * p,
60abdbed 14531 unsigned int tag,
643f7afb
AK
14532 const unsigned char * const end)
14533{
14534 unsigned int len;
14535 int val;
14536
14537 if (tag == Tag_GNU_S390_ABI_Vector)
14538 {
14539 val = read_uleb128 (p, &len, end);
14540 p += len;
14541 printf (" Tag_GNU_S390_ABI_Vector: ");
14542
14543 switch (val)
14544 {
14545 case 0:
14546 printf (_("any\n"));
14547 break;
14548 case 1:
14549 printf (_("software\n"));
14550 break;
14551 case 2:
14552 printf (_("hardware\n"));
14553 break;
14554 default:
14555 printf ("??? (%d)\n", val);
14556 break;
14557 }
14558 return p;
14559 }
14560
14561 return display_tag_value (tag & 1, p, end);
14562}
14563
9e8c70f9 14564static void
60abdbed 14565display_sparc_hwcaps (unsigned int mask)
9e8c70f9
DM
14566{
14567 if (mask)
14568 {
32ec8896 14569 bfd_boolean first = TRUE;
071436c6 14570
9e8c70f9 14571 if (mask & ELF_SPARC_HWCAP_MUL32)
32ec8896 14572 fputs ("mul32", stdout), first = FALSE;
9e8c70f9 14573 if (mask & ELF_SPARC_HWCAP_DIV32)
32ec8896 14574 printf ("%sdiv32", first ? "" : "|"), first = FALSE;
9e8c70f9 14575 if (mask & ELF_SPARC_HWCAP_FSMULD)
32ec8896 14576 printf ("%sfsmuld", first ? "" : "|"), first = FALSE;
9e8c70f9 14577 if (mask & ELF_SPARC_HWCAP_V8PLUS)
32ec8896 14578 printf ("%sv8plus", first ? "" : "|"), first = FALSE;
9e8c70f9 14579 if (mask & ELF_SPARC_HWCAP_POPC)
32ec8896 14580 printf ("%spopc", first ? "" : "|"), first = FALSE;
9e8c70f9 14581 if (mask & ELF_SPARC_HWCAP_VIS)
32ec8896 14582 printf ("%svis", first ? "" : "|"), first = FALSE;
9e8c70f9 14583 if (mask & ELF_SPARC_HWCAP_VIS2)
32ec8896 14584 printf ("%svis2", first ? "" : "|"), first = FALSE;
9e8c70f9 14585 if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
32ec8896 14586 printf ("%sASIBlkInit", first ? "" : "|"), first = FALSE;
9e8c70f9 14587 if (mask & ELF_SPARC_HWCAP_FMAF)
32ec8896 14588 printf ("%sfmaf", first ? "" : "|"), first = FALSE;
9e8c70f9 14589 if (mask & ELF_SPARC_HWCAP_VIS3)
32ec8896 14590 printf ("%svis3", first ? "" : "|"), first = FALSE;
9e8c70f9 14591 if (mask & ELF_SPARC_HWCAP_HPC)
32ec8896 14592 printf ("%shpc", first ? "" : "|"), first = FALSE;
9e8c70f9 14593 if (mask & ELF_SPARC_HWCAP_RANDOM)
32ec8896 14594 printf ("%srandom", first ? "" : "|"), first = FALSE;
9e8c70f9 14595 if (mask & ELF_SPARC_HWCAP_TRANS)
32ec8896 14596 printf ("%strans", first ? "" : "|"), first = FALSE;
9e8c70f9 14597 if (mask & ELF_SPARC_HWCAP_FJFMAU)
32ec8896 14598 printf ("%sfjfmau", first ? "" : "|"), first = FALSE;
9e8c70f9 14599 if (mask & ELF_SPARC_HWCAP_IMA)
32ec8896 14600 printf ("%sima", first ? "" : "|"), first = FALSE;
9e8c70f9 14601 if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
32ec8896 14602 printf ("%scspare", first ? "" : "|"), first = FALSE;
9e8c70f9
DM
14603 }
14604 else
071436c6
NC
14605 fputc ('0', stdout);
14606 fputc ('\n', stdout);
9e8c70f9
DM
14607}
14608
3d68f91c 14609static void
60abdbed 14610display_sparc_hwcaps2 (unsigned int mask)
3d68f91c
JM
14611{
14612 if (mask)
14613 {
32ec8896 14614 bfd_boolean first = TRUE;
071436c6 14615
3d68f91c 14616 if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
32ec8896 14617 fputs ("fjathplus", stdout), first = FALSE;
3d68f91c 14618 if (mask & ELF_SPARC_HWCAP2_VIS3B)
32ec8896 14619 printf ("%svis3b", first ? "" : "|"), first = FALSE;
3d68f91c 14620 if (mask & ELF_SPARC_HWCAP2_ADP)
32ec8896 14621 printf ("%sadp", first ? "" : "|"), first = FALSE;
3d68f91c 14622 if (mask & ELF_SPARC_HWCAP2_SPARC5)
32ec8896 14623 printf ("%ssparc5", first ? "" : "|"), first = FALSE;
3d68f91c 14624 if (mask & ELF_SPARC_HWCAP2_MWAIT)
32ec8896 14625 printf ("%smwait", first ? "" : "|"), first = FALSE;
3d68f91c 14626 if (mask & ELF_SPARC_HWCAP2_XMPMUL)
32ec8896 14627 printf ("%sxmpmul", first ? "" : "|"), first = FALSE;
3d68f91c 14628 if (mask & ELF_SPARC_HWCAP2_XMONT)
32ec8896 14629 printf ("%sxmont2", first ? "" : "|"), first = FALSE;
3d68f91c 14630 if (mask & ELF_SPARC_HWCAP2_NSEC)
32ec8896 14631 printf ("%snsec", first ? "" : "|"), first = FALSE;
3d68f91c 14632 if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
32ec8896 14633 printf ("%sfjathhpc", first ? "" : "|"), first = FALSE;
3d68f91c 14634 if (mask & ELF_SPARC_HWCAP2_FJDES)
32ec8896 14635 printf ("%sfjdes", first ? "" : "|"), first = FALSE;
3d68f91c 14636 if (mask & ELF_SPARC_HWCAP2_FJAES)
32ec8896 14637 printf ("%sfjaes", first ? "" : "|"), first = FALSE;
3d68f91c
JM
14638 }
14639 else
071436c6
NC
14640 fputc ('0', stdout);
14641 fputc ('\n', stdout);
3d68f91c
JM
14642}
14643
9e8c70f9 14644static unsigned char *
f6f0e17b 14645display_sparc_gnu_attribute (unsigned char * p,
60abdbed 14646 unsigned int tag,
f6f0e17b 14647 const unsigned char * const end)
9e8c70f9 14648{
3d68f91c
JM
14649 unsigned int len;
14650 int val;
14651
9e8c70f9
DM
14652 if (tag == Tag_GNU_Sparc_HWCAPS)
14653 {
f6f0e17b 14654 val = read_uleb128 (p, &len, end);
9e8c70f9
DM
14655 p += len;
14656 printf (" Tag_GNU_Sparc_HWCAPS: ");
9e8c70f9
DM
14657 display_sparc_hwcaps (val);
14658 return p;
3d68f91c
JM
14659 }
14660 if (tag == Tag_GNU_Sparc_HWCAPS2)
14661 {
14662 val = read_uleb128 (p, &len, end);
14663 p += len;
14664 printf (" Tag_GNU_Sparc_HWCAPS2: ");
14665 display_sparc_hwcaps2 (val);
14666 return p;
14667 }
9e8c70f9 14668
f6f0e17b 14669 return display_tag_value (tag, p, end);
9e8c70f9
DM
14670}
14671
351cdf24 14672static void
32ec8896 14673print_mips_fp_abi_value (unsigned int val)
351cdf24
MF
14674{
14675 switch (val)
14676 {
14677 case Val_GNU_MIPS_ABI_FP_ANY:
14678 printf (_("Hard or soft float\n"));
14679 break;
14680 case Val_GNU_MIPS_ABI_FP_DOUBLE:
14681 printf (_("Hard float (double precision)\n"));
14682 break;
14683 case Val_GNU_MIPS_ABI_FP_SINGLE:
14684 printf (_("Hard float (single precision)\n"));
14685 break;
14686 case Val_GNU_MIPS_ABI_FP_SOFT:
14687 printf (_("Soft float\n"));
14688 break;
14689 case Val_GNU_MIPS_ABI_FP_OLD_64:
14690 printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
14691 break;
14692 case Val_GNU_MIPS_ABI_FP_XX:
14693 printf (_("Hard float (32-bit CPU, Any FPU)\n"));
14694 break;
14695 case Val_GNU_MIPS_ABI_FP_64:
14696 printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
14697 break;
14698 case Val_GNU_MIPS_ABI_FP_64A:
14699 printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
14700 break;
3350cc01
CM
14701 case Val_GNU_MIPS_ABI_FP_NAN2008:
14702 printf (_("NaN 2008 compatibility\n"));
14703 break;
351cdf24
MF
14704 default:
14705 printf ("??? (%d)\n", val);
14706 break;
14707 }
14708}
14709
2cf19d5c 14710static unsigned char *
f6f0e17b 14711display_mips_gnu_attribute (unsigned char * p,
60abdbed 14712 unsigned int tag,
f6f0e17b 14713 const unsigned char * const end)
2cf19d5c 14714{
2cf19d5c
JM
14715 if (tag == Tag_GNU_MIPS_ABI_FP)
14716 {
f6f0e17b 14717 unsigned int len;
32ec8896 14718 unsigned int val;
f6f0e17b
NC
14719
14720 val = read_uleb128 (p, &len, end);
2cf19d5c
JM
14721 p += len;
14722 printf (" Tag_GNU_MIPS_ABI_FP: ");
60bca95a 14723
351cdf24
MF
14724 print_mips_fp_abi_value (val);
14725
2cf19d5c
JM
14726 return p;
14727 }
14728
a9f58168
CF
14729 if (tag == Tag_GNU_MIPS_ABI_MSA)
14730 {
14731 unsigned int len;
32ec8896 14732 unsigned int val;
a9f58168
CF
14733
14734 val = read_uleb128 (p, &len, end);
14735 p += len;
14736 printf (" Tag_GNU_MIPS_ABI_MSA: ");
14737
14738 switch (val)
14739 {
14740 case Val_GNU_MIPS_ABI_MSA_ANY:
14741 printf (_("Any MSA or not\n"));
14742 break;
14743 case Val_GNU_MIPS_ABI_MSA_128:
14744 printf (_("128-bit MSA\n"));
14745 break;
14746 default:
14747 printf ("??? (%d)\n", val);
14748 break;
14749 }
14750 return p;
14751 }
14752
f6f0e17b 14753 return display_tag_value (tag & 1, p, end);
2cf19d5c
JM
14754}
14755
59e6276b 14756static unsigned char *
f6f0e17b
NC
14757display_tic6x_attribute (unsigned char * p,
14758 const unsigned char * const end)
59e6276b 14759{
60abdbed 14760 unsigned int tag;
59e6276b
JM
14761 unsigned int len;
14762 int val;
14763
f6f0e17b 14764 tag = read_uleb128 (p, &len, end);
59e6276b
JM
14765 p += len;
14766
14767 switch (tag)
14768 {
75fa6dc1 14769 case Tag_ISA:
f6f0e17b 14770 val = read_uleb128 (p, &len, end);
59e6276b 14771 p += len;
75fa6dc1 14772 printf (" Tag_ISA: ");
59e6276b
JM
14773
14774 switch (val)
14775 {
75fa6dc1 14776 case C6XABI_Tag_ISA_none:
59e6276b
JM
14777 printf (_("None\n"));
14778 break;
75fa6dc1 14779 case C6XABI_Tag_ISA_C62X:
59e6276b
JM
14780 printf ("C62x\n");
14781 break;
75fa6dc1 14782 case C6XABI_Tag_ISA_C67X:
59e6276b
JM
14783 printf ("C67x\n");
14784 break;
75fa6dc1 14785 case C6XABI_Tag_ISA_C67XP:
59e6276b
JM
14786 printf ("C67x+\n");
14787 break;
75fa6dc1 14788 case C6XABI_Tag_ISA_C64X:
59e6276b
JM
14789 printf ("C64x\n");
14790 break;
75fa6dc1 14791 case C6XABI_Tag_ISA_C64XP:
59e6276b
JM
14792 printf ("C64x+\n");
14793 break;
75fa6dc1 14794 case C6XABI_Tag_ISA_C674X:
59e6276b
JM
14795 printf ("C674x\n");
14796 break;
14797 default:
14798 printf ("??? (%d)\n", val);
14799 break;
14800 }
14801 return p;
14802
87779176 14803 case Tag_ABI_wchar_t:
f6f0e17b 14804 val = read_uleb128 (p, &len, end);
87779176
JM
14805 p += len;
14806 printf (" Tag_ABI_wchar_t: ");
14807 switch (val)
14808 {
14809 case 0:
14810 printf (_("Not used\n"));
14811 break;
14812 case 1:
14813 printf (_("2 bytes\n"));
14814 break;
14815 case 2:
14816 printf (_("4 bytes\n"));
14817 break;
14818 default:
14819 printf ("??? (%d)\n", val);
14820 break;
14821 }
14822 return p;
14823
14824 case Tag_ABI_stack_align_needed:
f6f0e17b 14825 val = read_uleb128 (p, &len, end);
87779176
JM
14826 p += len;
14827 printf (" Tag_ABI_stack_align_needed: ");
14828 switch (val)
14829 {
14830 case 0:
14831 printf (_("8-byte\n"));
14832 break;
14833 case 1:
14834 printf (_("16-byte\n"));
14835 break;
14836 default:
14837 printf ("??? (%d)\n", val);
14838 break;
14839 }
14840 return p;
14841
14842 case Tag_ABI_stack_align_preserved:
f6f0e17b 14843 val = read_uleb128 (p, &len, end);
87779176
JM
14844 p += len;
14845 printf (" Tag_ABI_stack_align_preserved: ");
14846 switch (val)
14847 {
14848 case 0:
14849 printf (_("8-byte\n"));
14850 break;
14851 case 1:
14852 printf (_("16-byte\n"));
14853 break;
14854 default:
14855 printf ("??? (%d)\n", val);
14856 break;
14857 }
14858 return p;
14859
b5593623 14860 case Tag_ABI_DSBT:
f6f0e17b 14861 val = read_uleb128 (p, &len, end);
b5593623
JM
14862 p += len;
14863 printf (" Tag_ABI_DSBT: ");
14864 switch (val)
14865 {
14866 case 0:
14867 printf (_("DSBT addressing not used\n"));
14868 break;
14869 case 1:
14870 printf (_("DSBT addressing used\n"));
14871 break;
14872 default:
14873 printf ("??? (%d)\n", val);
14874 break;
14875 }
14876 return p;
14877
87779176 14878 case Tag_ABI_PID:
f6f0e17b 14879 val = read_uleb128 (p, &len, end);
87779176
JM
14880 p += len;
14881 printf (" Tag_ABI_PID: ");
14882 switch (val)
14883 {
14884 case 0:
14885 printf (_("Data addressing position-dependent\n"));
14886 break;
14887 case 1:
14888 printf (_("Data addressing position-independent, GOT near DP\n"));
14889 break;
14890 case 2:
14891 printf (_("Data addressing position-independent, GOT far from DP\n"));
14892 break;
14893 default:
14894 printf ("??? (%d)\n", val);
14895 break;
14896 }
14897 return p;
14898
14899 case Tag_ABI_PIC:
f6f0e17b 14900 val = read_uleb128 (p, &len, end);
87779176
JM
14901 p += len;
14902 printf (" Tag_ABI_PIC: ");
14903 switch (val)
14904 {
14905 case 0:
14906 printf (_("Code addressing position-dependent\n"));
14907 break;
14908 case 1:
14909 printf (_("Code addressing position-independent\n"));
14910 break;
14911 default:
14912 printf ("??? (%d)\n", val);
14913 break;
14914 }
14915 return p;
14916
14917 case Tag_ABI_array_object_alignment:
f6f0e17b 14918 val = read_uleb128 (p, &len, end);
87779176
JM
14919 p += len;
14920 printf (" Tag_ABI_array_object_alignment: ");
14921 switch (val)
14922 {
14923 case 0:
14924 printf (_("8-byte\n"));
14925 break;
14926 case 1:
14927 printf (_("4-byte\n"));
14928 break;
14929 case 2:
14930 printf (_("16-byte\n"));
14931 break;
14932 default:
14933 printf ("??? (%d)\n", val);
14934 break;
14935 }
14936 return p;
14937
14938 case Tag_ABI_array_object_align_expected:
f6f0e17b 14939 val = read_uleb128 (p, &len, end);
87779176
JM
14940 p += len;
14941 printf (" Tag_ABI_array_object_align_expected: ");
14942 switch (val)
14943 {
14944 case 0:
14945 printf (_("8-byte\n"));
14946 break;
14947 case 1:
14948 printf (_("4-byte\n"));
14949 break;
14950 case 2:
14951 printf (_("16-byte\n"));
14952 break;
14953 default:
14954 printf ("??? (%d)\n", val);
14955 break;
14956 }
14957 return p;
14958
3cbd1c06 14959 case Tag_ABI_compatibility:
071436c6 14960 {
071436c6
NC
14961 val = read_uleb128 (p, &len, end);
14962 p += len;
14963 printf (" Tag_ABI_compatibility: ");
071436c6 14964 printf (_("flag = %d, vendor = "), val);
4082ef84
NC
14965 if (p < end - 1)
14966 {
14967 size_t maxlen = (end - p) - 1;
14968
14969 print_symbol ((int) maxlen, (const char *) p);
14970 p += strnlen ((char *) p, maxlen) + 1;
14971 }
14972 else
14973 {
14974 printf (_("<corrupt>"));
14975 p = (unsigned char *) end;
14976 }
071436c6 14977 putchar ('\n');
071436c6
NC
14978 return p;
14979 }
87779176
JM
14980
14981 case Tag_ABI_conformance:
071436c6 14982 {
4082ef84
NC
14983 printf (" Tag_ABI_conformance: \"");
14984 if (p < end - 1)
14985 {
14986 size_t maxlen = (end - p) - 1;
071436c6 14987
4082ef84
NC
14988 print_symbol ((int) maxlen, (const char *) p);
14989 p += strnlen ((char *) p, maxlen) + 1;
14990 }
14991 else
14992 {
14993 printf (_("<corrupt>"));
14994 p = (unsigned char *) end;
14995 }
071436c6 14996 printf ("\"\n");
071436c6
NC
14997 return p;
14998 }
59e6276b
JM
14999 }
15000
f6f0e17b
NC
15001 return display_tag_value (tag, p, end);
15002}
59e6276b 15003
f6f0e17b 15004static void
60abdbed 15005display_raw_attribute (unsigned char * p, unsigned char const * const end)
f6f0e17b
NC
15006{
15007 unsigned long addr = 0;
15008 size_t bytes = end - p;
15009
e0a31db1 15010 assert (end > p);
f6f0e17b 15011 while (bytes)
87779176 15012 {
f6f0e17b
NC
15013 int j;
15014 int k;
15015 int lbytes = (bytes > 16 ? 16 : bytes);
15016
15017 printf (" 0x%8.8lx ", addr);
15018
15019 for (j = 0; j < 16; j++)
15020 {
15021 if (j < lbytes)
15022 printf ("%2.2x", p[j]);
15023 else
15024 printf (" ");
15025
15026 if ((j & 3) == 3)
15027 printf (" ");
15028 }
15029
15030 for (j = 0; j < lbytes; j++)
15031 {
15032 k = p[j];
15033 if (k >= ' ' && k < 0x7f)
15034 printf ("%c", k);
15035 else
15036 printf (".");
15037 }
15038
15039 putchar ('\n');
15040
15041 p += lbytes;
15042 bytes -= lbytes;
15043 addr += lbytes;
87779176 15044 }
59e6276b 15045
f6f0e17b 15046 putchar ('\n');
59e6276b
JM
15047}
15048
13761a11
NC
15049static unsigned char *
15050display_msp430x_attribute (unsigned char * p,
15051 const unsigned char * const end)
15052{
15053 unsigned int len;
60abdbed
NC
15054 unsigned int val;
15055 unsigned int tag;
13761a11
NC
15056
15057 tag = read_uleb128 (p, & len, end);
15058 p += len;
0b4362b0 15059
13761a11
NC
15060 switch (tag)
15061 {
15062 case OFBA_MSPABI_Tag_ISA:
15063 val = read_uleb128 (p, &len, end);
15064 p += len;
15065 printf (" Tag_ISA: ");
15066 switch (val)
15067 {
15068 case 0: printf (_("None\n")); break;
15069 case 1: printf (_("MSP430\n")); break;
15070 case 2: printf (_("MSP430X\n")); break;
15071 default: printf ("??? (%d)\n", val); break;
15072 }
15073 break;
15074
15075 case OFBA_MSPABI_Tag_Code_Model:
15076 val = read_uleb128 (p, &len, end);
15077 p += len;
15078 printf (" Tag_Code_Model: ");
15079 switch (val)
15080 {
15081 case 0: printf (_("None\n")); break;
15082 case 1: printf (_("Small\n")); break;
15083 case 2: printf (_("Large\n")); break;
15084 default: printf ("??? (%d)\n", val); break;
15085 }
15086 break;
15087
15088 case OFBA_MSPABI_Tag_Data_Model:
15089 val = read_uleb128 (p, &len, end);
15090 p += len;
15091 printf (" Tag_Data_Model: ");
15092 switch (val)
15093 {
15094 case 0: printf (_("None\n")); break;
15095 case 1: printf (_("Small\n")); break;
15096 case 2: printf (_("Large\n")); break;
15097 case 3: printf (_("Restricted Large\n")); break;
15098 default: printf ("??? (%d)\n", val); break;
15099 }
15100 break;
15101
15102 default:
15103 printf (_(" <unknown tag %d>: "), tag);
15104
15105 if (tag & 1)
15106 {
071436c6 15107 putchar ('"');
4082ef84
NC
15108 if (p < end - 1)
15109 {
15110 size_t maxlen = (end - p) - 1;
15111
15112 print_symbol ((int) maxlen, (const char *) p);
15113 p += strnlen ((char *) p, maxlen) + 1;
15114 }
15115 else
15116 {
15117 printf (_("<corrupt>"));
15118 p = (unsigned char *) end;
15119 }
071436c6 15120 printf ("\"\n");
13761a11
NC
15121 }
15122 else
15123 {
15124 val = read_uleb128 (p, &len, end);
15125 p += len;
15126 printf ("%d (0x%x)\n", val, val);
15127 }
15128 break;
15129 }
15130
4082ef84 15131 assert (p <= end);
13761a11
NC
15132 return p;
15133}
15134
32ec8896 15135static bfd_boolean
dda8d76d 15136process_attributes (Filedata * filedata,
60bca95a 15137 const char * public_name,
104d59d1 15138 unsigned int proc_type,
f6f0e17b 15139 unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
60abdbed 15140 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const))
11c1ff18 15141{
2cf0635d 15142 Elf_Internal_Shdr * sect;
11c1ff18 15143 unsigned i;
32ec8896 15144 bfd_boolean res = TRUE;
11c1ff18
PB
15145
15146 /* Find the section header so that we get the size. */
dda8d76d
NC
15147 for (i = 0, sect = filedata->section_headers;
15148 i < filedata->file_header.e_shnum;
11c1ff18
PB
15149 i++, sect++)
15150 {
071436c6
NC
15151 unsigned char * contents;
15152 unsigned char * p;
15153
104d59d1 15154 if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
11c1ff18
PB
15155 continue;
15156
dda8d76d 15157 contents = (unsigned char *) get_data (NULL, filedata, sect->sh_offset, 1,
3f5e193b 15158 sect->sh_size, _("attributes"));
60bca95a 15159 if (contents == NULL)
32ec8896
NC
15160 {
15161 res = FALSE;
15162 continue;
15163 }
60bca95a 15164
11c1ff18 15165 p = contents;
60abdbed
NC
15166 /* The first character is the version of the attributes.
15167 Currently only version 1, (aka 'A') is recognised here. */
15168 if (*p != 'A')
32ec8896
NC
15169 {
15170 printf (_("Unknown attributes version '%c'(%d) - expecting 'A'\n"), *p, *p);
15171 res = FALSE;
15172 }
60abdbed 15173 else
11c1ff18 15174 {
071436c6
NC
15175 bfd_vma section_len;
15176
15177 section_len = sect->sh_size - 1;
11c1ff18 15178 p++;
60bca95a 15179
071436c6 15180 while (section_len > 0)
11c1ff18 15181 {
071436c6 15182 bfd_vma attr_len;
e9847026 15183 unsigned int namelen;
11c1ff18 15184 bfd_boolean public_section;
104d59d1 15185 bfd_boolean gnu_section;
11c1ff18 15186
071436c6 15187 if (section_len <= 4)
e0a31db1
NC
15188 {
15189 error (_("Tag section ends prematurely\n"));
32ec8896 15190 res = FALSE;
e0a31db1
NC
15191 break;
15192 }
071436c6 15193 attr_len = byte_get (p, 4);
11c1ff18 15194 p += 4;
60bca95a 15195
071436c6 15196 if (attr_len > section_len)
11c1ff18 15197 {
071436c6
NC
15198 error (_("Bad attribute length (%u > %u)\n"),
15199 (unsigned) attr_len, (unsigned) section_len);
15200 attr_len = section_len;
32ec8896 15201 res = FALSE;
11c1ff18 15202 }
74e1a04b 15203 /* PR 17531: file: 001-101425-0.004 */
071436c6 15204 else if (attr_len < 5)
74e1a04b 15205 {
071436c6 15206 error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
32ec8896 15207 res = FALSE;
74e1a04b
NC
15208 break;
15209 }
e9847026 15210
071436c6
NC
15211 section_len -= attr_len;
15212 attr_len -= 4;
15213
15214 namelen = strnlen ((char *) p, attr_len) + 1;
15215 if (namelen == 0 || namelen >= attr_len)
e9847026
NC
15216 {
15217 error (_("Corrupt attribute section name\n"));
32ec8896 15218 res = FALSE;
e9847026
NC
15219 break;
15220 }
15221
071436c6
NC
15222 printf (_("Attribute Section: "));
15223 print_symbol (INT_MAX, (const char *) p);
15224 putchar ('\n');
60bca95a
NC
15225
15226 if (public_name && streq ((char *) p, public_name))
11c1ff18
PB
15227 public_section = TRUE;
15228 else
15229 public_section = FALSE;
60bca95a
NC
15230
15231 if (streq ((char *) p, "gnu"))
104d59d1
JM
15232 gnu_section = TRUE;
15233 else
15234 gnu_section = FALSE;
60bca95a 15235
11c1ff18 15236 p += namelen;
071436c6 15237 attr_len -= namelen;
e0a31db1 15238
071436c6 15239 while (attr_len > 0 && p < contents + sect->sh_size)
11c1ff18 15240 {
e0a31db1 15241 int tag;
11c1ff18
PB
15242 int val;
15243 bfd_vma size;
071436c6 15244 unsigned char * end;
60bca95a 15245
e0a31db1 15246 /* PR binutils/17531: Safe handling of corrupt files. */
071436c6 15247 if (attr_len < 6)
e0a31db1
NC
15248 {
15249 error (_("Unused bytes at end of section\n"));
32ec8896 15250 res = FALSE;
e0a31db1
NC
15251 section_len = 0;
15252 break;
15253 }
15254
15255 tag = *(p++);
11c1ff18 15256 size = byte_get (p, 4);
071436c6 15257 if (size > attr_len)
11c1ff18 15258 {
e9847026 15259 error (_("Bad subsection length (%u > %u)\n"),
071436c6 15260 (unsigned) size, (unsigned) attr_len);
32ec8896 15261 res = FALSE;
071436c6 15262 size = attr_len;
11c1ff18 15263 }
e0a31db1
NC
15264 /* PR binutils/17531: Safe handling of corrupt files. */
15265 if (size < 6)
15266 {
15267 error (_("Bad subsection length (%u < 6)\n"),
15268 (unsigned) size);
32ec8896 15269 res = FALSE;
e0a31db1
NC
15270 section_len = 0;
15271 break;
15272 }
60bca95a 15273
071436c6 15274 attr_len -= size;
11c1ff18 15275 end = p + size - 1;
071436c6 15276 assert (end <= contents + sect->sh_size);
11c1ff18 15277 p += 4;
60bca95a 15278
11c1ff18
PB
15279 switch (tag)
15280 {
15281 case 1:
2b692964 15282 printf (_("File Attributes\n"));
11c1ff18
PB
15283 break;
15284 case 2:
2b692964 15285 printf (_("Section Attributes:"));
11c1ff18
PB
15286 goto do_numlist;
15287 case 3:
2b692964 15288 printf (_("Symbol Attributes:"));
1a0670f3 15289 /* Fall through. */
11c1ff18
PB
15290 do_numlist:
15291 for (;;)
15292 {
91d6fa6a 15293 unsigned int j;
60bca95a 15294
f6f0e17b 15295 val = read_uleb128 (p, &j, end);
91d6fa6a 15296 p += j;
11c1ff18
PB
15297 if (val == 0)
15298 break;
15299 printf (" %d", val);
15300 }
15301 printf ("\n");
15302 break;
15303 default:
2b692964 15304 printf (_("Unknown tag: %d\n"), tag);
11c1ff18
PB
15305 public_section = FALSE;
15306 break;
15307 }
60bca95a 15308
071436c6 15309 if (public_section && display_pub_attribute != NULL)
11c1ff18
PB
15310 {
15311 while (p < end)
f6f0e17b 15312 p = display_pub_attribute (p, end);
60abdbed 15313 assert (p == end);
104d59d1 15314 }
071436c6 15315 else if (gnu_section && display_proc_gnu_attribute != NULL)
104d59d1
JM
15316 {
15317 while (p < end)
15318 p = display_gnu_attribute (p,
f6f0e17b
NC
15319 display_proc_gnu_attribute,
15320 end);
60abdbed 15321 assert (p == end);
11c1ff18 15322 }
071436c6 15323 else if (p < end)
11c1ff18 15324 {
071436c6 15325 printf (_(" Unknown attribute:\n"));
f6f0e17b 15326 display_raw_attribute (p, end);
11c1ff18
PB
15327 p = end;
15328 }
071436c6
NC
15329 else
15330 attr_len = 0;
11c1ff18
PB
15331 }
15332 }
15333 }
d70c5fc7 15334
60bca95a 15335 free (contents);
11c1ff18 15336 }
32ec8896
NC
15337
15338 return res;
11c1ff18
PB
15339}
15340
ccb4c951
RS
15341/* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
15342 Print the Address, Access and Initial fields of an entry at VMA ADDR
82b1b41b
NC
15343 and return the VMA of the next entry, or -1 if there was a problem.
15344 Does not read from DATA_END or beyond. */
ccb4c951
RS
15345
15346static bfd_vma
82b1b41b
NC
15347print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
15348 unsigned char * data_end)
ccb4c951
RS
15349{
15350 printf (" ");
15351 print_vma (addr, LONG_HEX);
15352 printf (" ");
15353 if (addr < pltgot + 0xfff0)
15354 printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
15355 else
15356 printf ("%10s", "");
15357 printf (" ");
15358 if (data == NULL)
2b692964 15359 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
ccb4c951
RS
15360 else
15361 {
15362 bfd_vma entry;
82b1b41b 15363 unsigned char * from = data + addr - pltgot;
ccb4c951 15364
82b1b41b
NC
15365 if (from + (is_32bit_elf ? 4 : 8) > data_end)
15366 {
15367 warn (_("MIPS GOT entry extends beyond the end of available data\n"));
15368 printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
15369 return (bfd_vma) -1;
15370 }
15371 else
15372 {
15373 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
15374 print_vma (entry, LONG_HEX);
15375 }
ccb4c951
RS
15376 }
15377 return addr + (is_32bit_elf ? 4 : 8);
15378}
15379
861fb55a
DJ
15380/* DATA points to the contents of a MIPS PLT GOT that starts at VMA
15381 PLTGOT. Print the Address and Initial fields of an entry at VMA
15382 ADDR and return the VMA of the next entry. */
15383
15384static bfd_vma
2cf0635d 15385print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
861fb55a
DJ
15386{
15387 printf (" ");
15388 print_vma (addr, LONG_HEX);
15389 printf (" ");
15390 if (data == NULL)
2b692964 15391 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
861fb55a
DJ
15392 else
15393 {
15394 bfd_vma entry;
15395
15396 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
15397 print_vma (entry, LONG_HEX);
15398 }
15399 return addr + (is_32bit_elf ? 4 : 8);
15400}
15401
351cdf24
MF
15402static void
15403print_mips_ases (unsigned int mask)
15404{
15405 if (mask & AFL_ASE_DSP)
15406 fputs ("\n\tDSP ASE", stdout);
15407 if (mask & AFL_ASE_DSPR2)
15408 fputs ("\n\tDSP R2 ASE", stdout);
8f4f9071
MF
15409 if (mask & AFL_ASE_DSPR3)
15410 fputs ("\n\tDSP R3 ASE", stdout);
351cdf24
MF
15411 if (mask & AFL_ASE_EVA)
15412 fputs ("\n\tEnhanced VA Scheme", stdout);
15413 if (mask & AFL_ASE_MCU)
15414 fputs ("\n\tMCU (MicroController) ASE", stdout);
15415 if (mask & AFL_ASE_MDMX)
15416 fputs ("\n\tMDMX ASE", stdout);
15417 if (mask & AFL_ASE_MIPS3D)
15418 fputs ("\n\tMIPS-3D ASE", stdout);
15419 if (mask & AFL_ASE_MT)
15420 fputs ("\n\tMT ASE", stdout);
15421 if (mask & AFL_ASE_SMARTMIPS)
15422 fputs ("\n\tSmartMIPS ASE", stdout);
15423 if (mask & AFL_ASE_VIRT)
15424 fputs ("\n\tVZ ASE", stdout);
15425 if (mask & AFL_ASE_MSA)
15426 fputs ("\n\tMSA ASE", stdout);
15427 if (mask & AFL_ASE_MIPS16)
15428 fputs ("\n\tMIPS16 ASE", stdout);
15429 if (mask & AFL_ASE_MICROMIPS)
15430 fputs ("\n\tMICROMIPS ASE", stdout);
15431 if (mask & AFL_ASE_XPA)
15432 fputs ("\n\tXPA ASE", stdout);
25499ac7
MR
15433 if (mask & AFL_ASE_MIPS16E2)
15434 fputs ("\n\tMIPS16e2 ASE", stdout);
351cdf24
MF
15435 if (mask == 0)
15436 fprintf (stdout, "\n\t%s", _("None"));
00ac7aa0
MF
15437 else if ((mask & ~AFL_ASE_MASK) != 0)
15438 fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
351cdf24
MF
15439}
15440
15441static void
15442print_mips_isa_ext (unsigned int isa_ext)
15443{
15444 switch (isa_ext)
15445 {
15446 case 0:
15447 fputs (_("None"), stdout);
15448 break;
15449 case AFL_EXT_XLR:
15450 fputs ("RMI XLR", stdout);
15451 break;
2c629856
N
15452 case AFL_EXT_OCTEON3:
15453 fputs ("Cavium Networks Octeon3", stdout);
15454 break;
351cdf24
MF
15455 case AFL_EXT_OCTEON2:
15456 fputs ("Cavium Networks Octeon2", stdout);
15457 break;
15458 case AFL_EXT_OCTEONP:
15459 fputs ("Cavium Networks OcteonP", stdout);
15460 break;
15461 case AFL_EXT_LOONGSON_3A:
15462 fputs ("Loongson 3A", stdout);
15463 break;
15464 case AFL_EXT_OCTEON:
15465 fputs ("Cavium Networks Octeon", stdout);
15466 break;
15467 case AFL_EXT_5900:
15468 fputs ("Toshiba R5900", stdout);
15469 break;
15470 case AFL_EXT_4650:
15471 fputs ("MIPS R4650", stdout);
15472 break;
15473 case AFL_EXT_4010:
15474 fputs ("LSI R4010", stdout);
15475 break;
15476 case AFL_EXT_4100:
15477 fputs ("NEC VR4100", stdout);
15478 break;
15479 case AFL_EXT_3900:
15480 fputs ("Toshiba R3900", stdout);
15481 break;
15482 case AFL_EXT_10000:
15483 fputs ("MIPS R10000", stdout);
15484 break;
15485 case AFL_EXT_SB1:
15486 fputs ("Broadcom SB-1", stdout);
15487 break;
15488 case AFL_EXT_4111:
15489 fputs ("NEC VR4111/VR4181", stdout);
15490 break;
15491 case AFL_EXT_4120:
15492 fputs ("NEC VR4120", stdout);
15493 break;
15494 case AFL_EXT_5400:
15495 fputs ("NEC VR5400", stdout);
15496 break;
15497 case AFL_EXT_5500:
15498 fputs ("NEC VR5500", stdout);
15499 break;
15500 case AFL_EXT_LOONGSON_2E:
15501 fputs ("ST Microelectronics Loongson 2E", stdout);
15502 break;
15503 case AFL_EXT_LOONGSON_2F:
15504 fputs ("ST Microelectronics Loongson 2F", stdout);
15505 break;
38bf472a
MR
15506 case AFL_EXT_INTERAPTIV_MR2:
15507 fputs ("Imagination interAptiv MR2", stdout);
15508 break;
351cdf24 15509 default:
00ac7aa0 15510 fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
351cdf24
MF
15511 }
15512}
15513
32ec8896 15514static signed int
351cdf24
MF
15515get_mips_reg_size (int reg_size)
15516{
15517 return (reg_size == AFL_REG_NONE) ? 0
15518 : (reg_size == AFL_REG_32) ? 32
15519 : (reg_size == AFL_REG_64) ? 64
15520 : (reg_size == AFL_REG_128) ? 128
15521 : -1;
15522}
15523
32ec8896 15524static bfd_boolean
dda8d76d 15525process_mips_specific (Filedata * filedata)
5b18a4bc 15526{
2cf0635d 15527 Elf_Internal_Dyn * entry;
351cdf24 15528 Elf_Internal_Shdr *sect = NULL;
19e6b90e
L
15529 size_t liblist_offset = 0;
15530 size_t liblistno = 0;
15531 size_t conflictsno = 0;
15532 size_t options_offset = 0;
15533 size_t conflicts_offset = 0;
861fb55a
DJ
15534 size_t pltrelsz = 0;
15535 size_t pltrel = 0;
ccb4c951 15536 bfd_vma pltgot = 0;
861fb55a
DJ
15537 bfd_vma mips_pltgot = 0;
15538 bfd_vma jmprel = 0;
ccb4c951
RS
15539 bfd_vma local_gotno = 0;
15540 bfd_vma gotsym = 0;
15541 bfd_vma symtabno = 0;
32ec8896 15542 bfd_boolean res = TRUE;
103f02d3 15543
dda8d76d 15544 if (! process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
32ec8896
NC
15545 display_mips_gnu_attribute))
15546 res = FALSE;
2cf19d5c 15547
dda8d76d 15548 sect = find_section (filedata, ".MIPS.abiflags");
351cdf24
MF
15549
15550 if (sect != NULL)
15551 {
15552 Elf_External_ABIFlags_v0 *abiflags_ext;
15553 Elf_Internal_ABIFlags_v0 abiflags_in;
15554
15555 if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
32ec8896
NC
15556 {
15557 error (_("Corrupt MIPS ABI Flags section.\n"));
15558 res = FALSE;
15559 }
351cdf24
MF
15560 else
15561 {
dda8d76d 15562 abiflags_ext = get_data (NULL, filedata, sect->sh_offset, 1,
351cdf24
MF
15563 sect->sh_size, _("MIPS ABI Flags section"));
15564 if (abiflags_ext)
15565 {
15566 abiflags_in.version = BYTE_GET (abiflags_ext->version);
15567 abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
15568 abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
15569 abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
15570 abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
15571 abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
15572 abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
15573 abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
15574 abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
15575 abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
15576 abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
15577
15578 printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
15579 printf ("\nISA: MIPS%d", abiflags_in.isa_level);
15580 if (abiflags_in.isa_rev > 1)
15581 printf ("r%d", abiflags_in.isa_rev);
15582 printf ("\nGPR size: %d",
15583 get_mips_reg_size (abiflags_in.gpr_size));
15584 printf ("\nCPR1 size: %d",
15585 get_mips_reg_size (abiflags_in.cpr1_size));
15586 printf ("\nCPR2 size: %d",
15587 get_mips_reg_size (abiflags_in.cpr2_size));
15588 fputs ("\nFP ABI: ", stdout);
15589 print_mips_fp_abi_value (abiflags_in.fp_abi);
15590 fputs ("ISA Extension: ", stdout);
15591 print_mips_isa_ext (abiflags_in.isa_ext);
15592 fputs ("\nASEs:", stdout);
15593 print_mips_ases (abiflags_in.ases);
15594 printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
15595 printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
15596 fputc ('\n', stdout);
15597 free (abiflags_ext);
15598 }
15599 }
15600 }
15601
19e6b90e
L
15602 /* We have a lot of special sections. Thanks SGI! */
15603 if (dynamic_section == NULL)
bbdd9a68
MR
15604 {
15605 /* No dynamic information available. See if there is static GOT. */
dda8d76d 15606 sect = find_section (filedata, ".got");
bbdd9a68
MR
15607 if (sect != NULL)
15608 {
15609 unsigned char *data_end;
15610 unsigned char *data;
15611 bfd_vma ent, end;
15612 int addr_size;
15613
15614 pltgot = sect->sh_addr;
15615
15616 ent = pltgot;
15617 addr_size = (is_32bit_elf ? 4 : 8);
15618 end = pltgot + sect->sh_size;
15619
dda8d76d 15620 data = (unsigned char *) get_data (NULL, filedata, sect->sh_offset,
bbdd9a68
MR
15621 end - pltgot, 1,
15622 _("Global Offset Table data"));
15623 /* PR 12855: Null data is handled gracefully throughout. */
15624 data_end = data + (end - pltgot);
15625
15626 printf (_("\nStatic GOT:\n"));
15627 printf (_(" Canonical gp value: "));
15628 print_vma (ent + 0x7ff0, LONG_HEX);
15629 printf ("\n\n");
15630
15631 /* In a dynamic binary GOT[0] is reserved for the dynamic
15632 loader to store the lazy resolver pointer, however in
15633 a static binary it may well have been omitted and GOT
15634 reduced to a table of addresses.
15635 PR 21344: Check for the entry being fully available
15636 before fetching it. */
15637 if (data
15638 && data + ent - pltgot + addr_size <= data_end
15639 && byte_get (data + ent - pltgot, addr_size) == 0)
15640 {
15641 printf (_(" Reserved entries:\n"));
15642 printf (_(" %*s %10s %*s\n"),
15643 addr_size * 2, _("Address"), _("Access"),
15644 addr_size * 2, _("Value"));
15645 ent = print_mips_got_entry (data, pltgot, ent, data_end);
15646 printf ("\n");
15647 if (ent == (bfd_vma) -1)
15648 goto sgot_print_fail;
15649
15650 /* Check for the MSB of GOT[1] being set, identifying a
15651 GNU object. This entry will be used by some runtime
15652 loaders, to store the module pointer. Otherwise this
15653 is an ordinary local entry.
15654 PR 21344: Check for the entry being fully available
15655 before fetching it. */
15656 if (data
15657 && data + ent - pltgot + addr_size <= data_end
15658 && (byte_get (data + ent - pltgot, addr_size)
15659 >> (addr_size * 8 - 1)) != 0)
15660 {
15661 ent = print_mips_got_entry (data, pltgot, ent, data_end);
15662 printf ("\n");
15663 if (ent == (bfd_vma) -1)
15664 goto sgot_print_fail;
15665 }
15666 printf ("\n");
15667 }
15668
f17e9d8a 15669 if (data != NULL && ent < end)
bbdd9a68
MR
15670 {
15671 printf (_(" Local entries:\n"));
15672 printf (" %*s %10s %*s\n",
15673 addr_size * 2, _("Address"), _("Access"),
15674 addr_size * 2, _("Value"));
15675 while (ent < end)
15676 {
15677 ent = print_mips_got_entry (data, pltgot, ent, data_end);
15678 printf ("\n");
15679 if (ent == (bfd_vma) -1)
15680 goto sgot_print_fail;
15681 }
15682 printf ("\n");
15683 }
15684
15685 sgot_print_fail:
15686 if (data)
15687 free (data);
15688 }
15689 return res;
15690 }
252b5132 15691
071436c6
NC
15692 for (entry = dynamic_section;
15693 /* PR 17531 file: 012-50589-0.004. */
15694 entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
15695 ++entry)
252b5132
RH
15696 switch (entry->d_tag)
15697 {
15698 case DT_MIPS_LIBLIST:
d93f0186 15699 liblist_offset
dda8d76d 15700 = offset_from_vma (filedata, entry->d_un.d_val,
d93f0186 15701 liblistno * sizeof (Elf32_External_Lib));
252b5132
RH
15702 break;
15703 case DT_MIPS_LIBLISTNO:
15704 liblistno = entry->d_un.d_val;
15705 break;
15706 case DT_MIPS_OPTIONS:
dda8d76d 15707 options_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
252b5132
RH
15708 break;
15709 case DT_MIPS_CONFLICT:
d93f0186 15710 conflicts_offset
dda8d76d 15711 = offset_from_vma (filedata, entry->d_un.d_val,
d93f0186 15712 conflictsno * sizeof (Elf32_External_Conflict));
252b5132
RH
15713 break;
15714 case DT_MIPS_CONFLICTNO:
15715 conflictsno = entry->d_un.d_val;
15716 break;
ccb4c951 15717 case DT_PLTGOT:
861fb55a
DJ
15718 pltgot = entry->d_un.d_ptr;
15719 break;
ccb4c951
RS
15720 case DT_MIPS_LOCAL_GOTNO:
15721 local_gotno = entry->d_un.d_val;
15722 break;
15723 case DT_MIPS_GOTSYM:
15724 gotsym = entry->d_un.d_val;
15725 break;
15726 case DT_MIPS_SYMTABNO:
15727 symtabno = entry->d_un.d_val;
15728 break;
861fb55a
DJ
15729 case DT_MIPS_PLTGOT:
15730 mips_pltgot = entry->d_un.d_ptr;
15731 break;
15732 case DT_PLTREL:
15733 pltrel = entry->d_un.d_val;
15734 break;
15735 case DT_PLTRELSZ:
15736 pltrelsz = entry->d_un.d_val;
15737 break;
15738 case DT_JMPREL:
15739 jmprel = entry->d_un.d_ptr;
15740 break;
252b5132
RH
15741 default:
15742 break;
15743 }
15744
15745 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
15746 {
2cf0635d 15747 Elf32_External_Lib * elib;
252b5132
RH
15748 size_t cnt;
15749
dda8d76d 15750 elib = (Elf32_External_Lib *) get_data (NULL, filedata, liblist_offset,
3f5e193b
NC
15751 liblistno,
15752 sizeof (Elf32_External_Lib),
9cf03b7e 15753 _("liblist section data"));
a6e9f9df 15754 if (elib)
252b5132 15755 {
d3a49aa8
AM
15756 printf (ngettext ("\nSection '.liblist' contains %lu entry:\n",
15757 "\nSection '.liblist' contains %lu entries:\n",
15758 (unsigned long) liblistno),
a6e9f9df 15759 (unsigned long) liblistno);
2b692964 15760 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
a6e9f9df
AM
15761 stdout);
15762
15763 for (cnt = 0; cnt < liblistno; ++cnt)
252b5132 15764 {
a6e9f9df 15765 Elf32_Lib liblist;
91d6fa6a 15766 time_t atime;
d5b07ef4 15767 char timebuf[128];
2cf0635d 15768 struct tm * tmp;
a6e9f9df
AM
15769
15770 liblist.l_name = BYTE_GET (elib[cnt].l_name);
91d6fa6a 15771 atime = BYTE_GET (elib[cnt].l_time_stamp);
a6e9f9df
AM
15772 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
15773 liblist.l_version = BYTE_GET (elib[cnt].l_version);
15774 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
15775
91d6fa6a 15776 tmp = gmtime (&atime);
e9e44622
JJ
15777 snprintf (timebuf, sizeof (timebuf),
15778 "%04u-%02u-%02uT%02u:%02u:%02u",
15779 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
15780 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
a6e9f9df 15781
31104126 15782 printf ("%3lu: ", (unsigned long) cnt);
d79b3d50
NC
15783 if (VALID_DYNAMIC_NAME (liblist.l_name))
15784 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
15785 else
2b692964 15786 printf (_("<corrupt: %9ld>"), liblist.l_name);
31104126
NC
15787 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
15788 liblist.l_version);
a6e9f9df
AM
15789
15790 if (liblist.l_flags == 0)
2b692964 15791 puts (_(" NONE"));
a6e9f9df
AM
15792 else
15793 {
15794 static const struct
252b5132 15795 {
2cf0635d 15796 const char * name;
a6e9f9df 15797 int bit;
252b5132 15798 }
a6e9f9df
AM
15799 l_flags_vals[] =
15800 {
15801 { " EXACT_MATCH", LL_EXACT_MATCH },
15802 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
15803 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
15804 { " EXPORTS", LL_EXPORTS },
15805 { " DELAY_LOAD", LL_DELAY_LOAD },
15806 { " DELTA", LL_DELTA }
15807 };
15808 int flags = liblist.l_flags;
15809 size_t fcnt;
15810
60bca95a 15811 for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
a6e9f9df
AM
15812 if ((flags & l_flags_vals[fcnt].bit) != 0)
15813 {
15814 fputs (l_flags_vals[fcnt].name, stdout);
15815 flags ^= l_flags_vals[fcnt].bit;
15816 }
15817 if (flags != 0)
15818 printf (" %#x", (unsigned int) flags);
252b5132 15819
a6e9f9df
AM
15820 puts ("");
15821 }
252b5132 15822 }
252b5132 15823
a6e9f9df
AM
15824 free (elib);
15825 }
32ec8896
NC
15826 else
15827 res = FALSE;
252b5132
RH
15828 }
15829
15830 if (options_offset != 0)
15831 {
2cf0635d 15832 Elf_External_Options * eopt;
2cf0635d
NC
15833 Elf_Internal_Options * iopt;
15834 Elf_Internal_Options * option;
252b5132
RH
15835 size_t offset;
15836 int cnt;
dda8d76d 15837 sect = filedata->section_headers;
252b5132
RH
15838
15839 /* Find the section header so that we get the size. */
dda8d76d 15840 sect = find_section_by_type (filedata, SHT_MIPS_OPTIONS);
948f632f 15841 /* PR 17533 file: 012-277276-0.004. */
071436c6
NC
15842 if (sect == NULL)
15843 {
15844 error (_("No MIPS_OPTIONS header found\n"));
32ec8896 15845 return FALSE;
071436c6 15846 }
252b5132 15847
dda8d76d 15848 eopt = (Elf_External_Options *) get_data (NULL, filedata, options_offset, 1,
3f5e193b 15849 sect->sh_size, _("options"));
a6e9f9df 15850 if (eopt)
252b5132 15851 {
3f5e193b
NC
15852 iopt = (Elf_Internal_Options *)
15853 cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
a6e9f9df
AM
15854 if (iopt == NULL)
15855 {
fb324ee9 15856 error (_("Out of memory allocating space for MIPS options\n"));
32ec8896 15857 return FALSE;
a6e9f9df 15858 }
76da6bbe 15859
a6e9f9df
AM
15860 offset = cnt = 0;
15861 option = iopt;
252b5132 15862
82b1b41b 15863 while (offset <= sect->sh_size - sizeof (* eopt))
a6e9f9df 15864 {
2cf0635d 15865 Elf_External_Options * eoption;
252b5132 15866
a6e9f9df 15867 eoption = (Elf_External_Options *) ((char *) eopt + offset);
252b5132 15868
a6e9f9df
AM
15869 option->kind = BYTE_GET (eoption->kind);
15870 option->size = BYTE_GET (eoption->size);
15871 option->section = BYTE_GET (eoption->section);
15872 option->info = BYTE_GET (eoption->info);
76da6bbe 15873
82b1b41b
NC
15874 /* PR 17531: file: ffa0fa3b. */
15875 if (option->size < sizeof (* eopt)
15876 || offset + option->size > sect->sh_size)
15877 {
55325047 15878 error (_("Invalid size (%u) for MIPS option\n"), option->size);
32ec8896 15879 return FALSE;
82b1b41b 15880 }
a6e9f9df 15881 offset += option->size;
14ae95f2 15882
a6e9f9df
AM
15883 ++option;
15884 ++cnt;
15885 }
252b5132 15886
d3a49aa8
AM
15887 printf (ngettext ("\nSection '%s' contains %d entry:\n",
15888 "\nSection '%s' contains %d entries:\n",
15889 cnt),
dda8d76d 15890 printable_section_name (filedata, sect), cnt);
76da6bbe 15891
a6e9f9df 15892 option = iopt;
82b1b41b 15893 offset = 0;
252b5132 15894
a6e9f9df 15895 while (cnt-- > 0)
252b5132 15896 {
a6e9f9df
AM
15897 size_t len;
15898
15899 switch (option->kind)
252b5132 15900 {
a6e9f9df
AM
15901 case ODK_NULL:
15902 /* This shouldn't happen. */
15903 printf (" NULL %d %lx", option->section, option->info);
15904 break;
15905 case ODK_REGINFO:
15906 printf (" REGINFO ");
dda8d76d 15907 if (filedata->file_header.e_machine == EM_MIPS)
a6e9f9df
AM
15908 {
15909 /* 32bit form. */
2cf0635d 15910 Elf32_External_RegInfo * ereg;
b34976b6 15911 Elf32_RegInfo reginfo;
a6e9f9df
AM
15912
15913 ereg = (Elf32_External_RegInfo *) (option + 1);
15914 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
15915 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
15916 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
15917 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
15918 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
15919 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
15920
15921 printf ("GPR %08lx GP 0x%lx\n",
15922 reginfo.ri_gprmask,
15923 (unsigned long) reginfo.ri_gp_value);
15924 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
15925 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
15926 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
15927 }
15928 else
15929 {
15930 /* 64 bit form. */
2cf0635d 15931 Elf64_External_RegInfo * ereg;
a6e9f9df
AM
15932 Elf64_Internal_RegInfo reginfo;
15933
15934 ereg = (Elf64_External_RegInfo *) (option + 1);
15935 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
15936 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
15937 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
15938 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
15939 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
66543521 15940 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
a6e9f9df
AM
15941
15942 printf ("GPR %08lx GP 0x",
15943 reginfo.ri_gprmask);
15944 printf_vma (reginfo.ri_gp_value);
15945 printf ("\n");
15946
15947 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
15948 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
15949 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
15950 }
15951 ++option;
15952 continue;
15953 case ODK_EXCEPTIONS:
15954 fputs (" EXCEPTIONS fpe_min(", stdout);
15955 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
15956 fputs (") fpe_max(", stdout);
15957 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
15958 fputs (")", stdout);
15959
15960 if (option->info & OEX_PAGE0)
15961 fputs (" PAGE0", stdout);
15962 if (option->info & OEX_SMM)
15963 fputs (" SMM", stdout);
15964 if (option->info & OEX_FPDBUG)
15965 fputs (" FPDBUG", stdout);
15966 if (option->info & OEX_DISMISS)
15967 fputs (" DISMISS", stdout);
15968 break;
15969 case ODK_PAD:
15970 fputs (" PAD ", stdout);
15971 if (option->info & OPAD_PREFIX)
15972 fputs (" PREFIX", stdout);
15973 if (option->info & OPAD_POSTFIX)
15974 fputs (" POSTFIX", stdout);
15975 if (option->info & OPAD_SYMBOL)
15976 fputs (" SYMBOL", stdout);
15977 break;
15978 case ODK_HWPATCH:
15979 fputs (" HWPATCH ", stdout);
15980 if (option->info & OHW_R4KEOP)
15981 fputs (" R4KEOP", stdout);
15982 if (option->info & OHW_R8KPFETCH)
15983 fputs (" R8KPFETCH", stdout);
15984 if (option->info & OHW_R5KEOP)
15985 fputs (" R5KEOP", stdout);
15986 if (option->info & OHW_R5KCVTL)
15987 fputs (" R5KCVTL", stdout);
15988 break;
15989 case ODK_FILL:
15990 fputs (" FILL ", stdout);
15991 /* XXX Print content of info word? */
15992 break;
15993 case ODK_TAGS:
15994 fputs (" TAGS ", stdout);
15995 /* XXX Print content of info word? */
15996 break;
15997 case ODK_HWAND:
15998 fputs (" HWAND ", stdout);
15999 if (option->info & OHWA0_R4KEOP_CHECKED)
16000 fputs (" R4KEOP_CHECKED", stdout);
16001 if (option->info & OHWA0_R4KEOP_CLEAN)
16002 fputs (" R4KEOP_CLEAN", stdout);
16003 break;
16004 case ODK_HWOR:
16005 fputs (" HWOR ", stdout);
16006 if (option->info & OHWA0_R4KEOP_CHECKED)
16007 fputs (" R4KEOP_CHECKED", stdout);
16008 if (option->info & OHWA0_R4KEOP_CLEAN)
16009 fputs (" R4KEOP_CLEAN", stdout);
16010 break;
16011 case ODK_GP_GROUP:
16012 printf (" GP_GROUP %#06lx self-contained %#06lx",
16013 option->info & OGP_GROUP,
16014 (option->info & OGP_SELF) >> 16);
16015 break;
16016 case ODK_IDENT:
16017 printf (" IDENT %#06lx self-contained %#06lx",
16018 option->info & OGP_GROUP,
16019 (option->info & OGP_SELF) >> 16);
16020 break;
16021 default:
16022 /* This shouldn't happen. */
16023 printf (" %3d ??? %d %lx",
16024 option->kind, option->section, option->info);
16025 break;
252b5132 16026 }
a6e9f9df 16027
2cf0635d 16028 len = sizeof (* eopt);
a6e9f9df 16029 while (len < option->size)
82b1b41b 16030 {
7e27a9d5 16031 unsigned char datum = * ((unsigned char *) eopt + offset + len);
a6e9f9df 16032
82b1b41b
NC
16033 if (ISPRINT (datum))
16034 printf ("%c", datum);
16035 else
16036 printf ("\\%03o", datum);
16037 len ++;
16038 }
a6e9f9df 16039 fputs ("\n", stdout);
82b1b41b
NC
16040
16041 offset += option->size;
252b5132 16042 ++option;
252b5132
RH
16043 }
16044
a6e9f9df 16045 free (eopt);
252b5132 16046 }
32ec8896
NC
16047 else
16048 res = FALSE;
252b5132
RH
16049 }
16050
16051 if (conflicts_offset != 0 && conflictsno != 0)
16052 {
2cf0635d 16053 Elf32_Conflict * iconf;
252b5132
RH
16054 size_t cnt;
16055
16056 if (dynamic_symbols == NULL)
16057 {
591a748a 16058 error (_("conflict list found without a dynamic symbol table\n"));
32ec8896 16059 return FALSE;
252b5132
RH
16060 }
16061
7296a62a
NC
16062 /* PR 21345 - print a slightly more helpful error message
16063 if we are sure that the cmalloc will fail. */
dda8d76d 16064 if (conflictsno * sizeof (* iconf) > filedata->file_size)
7296a62a
NC
16065 {
16066 error (_("Overlarge number of conflicts detected: %lx\n"),
16067 (long) conflictsno);
16068 return FALSE;
16069 }
16070
3f5e193b 16071 iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
252b5132
RH
16072 if (iconf == NULL)
16073 {
8b73c356 16074 error (_("Out of memory allocating space for dynamic conflicts\n"));
32ec8896 16075 return FALSE;
252b5132
RH
16076 }
16077
9ea033b2 16078 if (is_32bit_elf)
252b5132 16079 {
2cf0635d 16080 Elf32_External_Conflict * econf32;
a6e9f9df 16081
3f5e193b 16082 econf32 = (Elf32_External_Conflict *)
dda8d76d 16083 get_data (NULL, filedata, conflicts_offset, conflictsno,
3f5e193b 16084 sizeof (* econf32), _("conflict"));
a6e9f9df 16085 if (!econf32)
32ec8896 16086 return FALSE;
252b5132
RH
16087
16088 for (cnt = 0; cnt < conflictsno; ++cnt)
16089 iconf[cnt] = BYTE_GET (econf32[cnt]);
a6e9f9df
AM
16090
16091 free (econf32);
252b5132
RH
16092 }
16093 else
16094 {
2cf0635d 16095 Elf64_External_Conflict * econf64;
a6e9f9df 16096
3f5e193b 16097 econf64 = (Elf64_External_Conflict *)
dda8d76d 16098 get_data (NULL, filedata, conflicts_offset, conflictsno,
3f5e193b 16099 sizeof (* econf64), _("conflict"));
a6e9f9df 16100 if (!econf64)
32ec8896 16101 return FALSE;
252b5132
RH
16102
16103 for (cnt = 0; cnt < conflictsno; ++cnt)
16104 iconf[cnt] = BYTE_GET (econf64[cnt]);
a6e9f9df
AM
16105
16106 free (econf64);
252b5132
RH
16107 }
16108
d3a49aa8
AM
16109 printf (ngettext ("\nSection '.conflict' contains %lu entry:\n",
16110 "\nSection '.conflict' contains %lu entries:\n",
16111 (unsigned long) conflictsno),
c7e7ca54 16112 (unsigned long) conflictsno);
252b5132
RH
16113 puts (_(" Num: Index Value Name"));
16114
16115 for (cnt = 0; cnt < conflictsno; ++cnt)
16116 {
b34976b6 16117 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
e0a31db1
NC
16118
16119 if (iconf[cnt] >= num_dynamic_syms)
16120 printf (_("<corrupt symbol index>"));
d79b3d50 16121 else
e0a31db1
NC
16122 {
16123 Elf_Internal_Sym * psym;
16124
16125 psym = & dynamic_symbols[iconf[cnt]];
16126 print_vma (psym->st_value, FULL_HEX);
16127 putchar (' ');
16128 if (VALID_DYNAMIC_NAME (psym->st_name))
16129 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
16130 else
16131 printf (_("<corrupt: %14ld>"), psym->st_name);
16132 }
31104126 16133 putchar ('\n');
252b5132
RH
16134 }
16135
252b5132
RH
16136 free (iconf);
16137 }
16138
ccb4c951
RS
16139 if (pltgot != 0 && local_gotno != 0)
16140 {
91d6fa6a 16141 bfd_vma ent, local_end, global_end;
bbeee7ea 16142 size_t i, offset;
2cf0635d 16143 unsigned char * data;
82b1b41b 16144 unsigned char * data_end;
bbeee7ea 16145 int addr_size;
ccb4c951 16146
91d6fa6a 16147 ent = pltgot;
ccb4c951
RS
16148 addr_size = (is_32bit_elf ? 4 : 8);
16149 local_end = pltgot + local_gotno * addr_size;
ccb4c951 16150
74e1a04b
NC
16151 /* PR binutils/17533 file: 012-111227-0.004 */
16152 if (symtabno < gotsym)
16153 {
16154 error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
82b1b41b 16155 (unsigned long) gotsym, (unsigned long) symtabno);
32ec8896 16156 return FALSE;
74e1a04b 16157 }
82b1b41b 16158
74e1a04b 16159 global_end = local_end + (symtabno - gotsym) * addr_size;
82b1b41b
NC
16160 /* PR 17531: file: 54c91a34. */
16161 if (global_end < local_end)
16162 {
16163 error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
32ec8896 16164 return FALSE;
82b1b41b 16165 }
948f632f 16166
dda8d76d
NC
16167 offset = offset_from_vma (filedata, pltgot, global_end - pltgot);
16168 data = (unsigned char *) get_data (NULL, filedata, offset,
9cf03b7e
NC
16169 global_end - pltgot, 1,
16170 _("Global Offset Table data"));
919383ac 16171 /* PR 12855: Null data is handled gracefully throughout. */
82b1b41b 16172 data_end = data + (global_end - pltgot);
59245841 16173
ccb4c951
RS
16174 printf (_("\nPrimary GOT:\n"));
16175 printf (_(" Canonical gp value: "));
16176 print_vma (pltgot + 0x7ff0, LONG_HEX);
16177 printf ("\n\n");
16178
16179 printf (_(" Reserved entries:\n"));
16180 printf (_(" %*s %10s %*s Purpose\n"),
2b692964
NC
16181 addr_size * 2, _("Address"), _("Access"),
16182 addr_size * 2, _("Initial"));
82b1b41b 16183 ent = print_mips_got_entry (data, pltgot, ent, data_end);
2b692964 16184 printf (_(" Lazy resolver\n"));
82b1b41b
NC
16185 if (ent == (bfd_vma) -1)
16186 goto got_print_fail;
75ec1fdb 16187
c4ab9505
MR
16188 /* Check for the MSB of GOT[1] being set, denoting a GNU object.
16189 This entry will be used by some runtime loaders, to store the
16190 module pointer. Otherwise this is an ordinary local entry.
16191 PR 21344: Check for the entry being fully available before
16192 fetching it. */
16193 if (data
16194 && data + ent - pltgot + addr_size <= data_end
16195 && (byte_get (data + ent - pltgot, addr_size)
16196 >> (addr_size * 8 - 1)) != 0)
16197 {
16198 ent = print_mips_got_entry (data, pltgot, ent, data_end);
16199 printf (_(" Module pointer (GNU extension)\n"));
16200 if (ent == (bfd_vma) -1)
16201 goto got_print_fail;
ccb4c951
RS
16202 }
16203 printf ("\n");
16204
f17e9d8a 16205 if (data != NULL && ent < local_end)
ccb4c951
RS
16206 {
16207 printf (_(" Local entries:\n"));
cc5914eb 16208 printf (" %*s %10s %*s\n",
2b692964
NC
16209 addr_size * 2, _("Address"), _("Access"),
16210 addr_size * 2, _("Initial"));
91d6fa6a 16211 while (ent < local_end)
ccb4c951 16212 {
82b1b41b 16213 ent = print_mips_got_entry (data, pltgot, ent, data_end);
ccb4c951 16214 printf ("\n");
82b1b41b
NC
16215 if (ent == (bfd_vma) -1)
16216 goto got_print_fail;
ccb4c951
RS
16217 }
16218 printf ("\n");
16219 }
16220
f17e9d8a 16221 if (data != NULL && gotsym < symtabno)
ccb4c951
RS
16222 {
16223 int sym_width;
16224
16225 printf (_(" Global entries:\n"));
cc5914eb 16226 printf (" %*s %10s %*s %*s %-7s %3s %s\n",
9cf03b7e
NC
16227 addr_size * 2, _("Address"),
16228 _("Access"),
2b692964 16229 addr_size * 2, _("Initial"),
9cf03b7e
NC
16230 addr_size * 2, _("Sym.Val."),
16231 _("Type"),
16232 /* Note for translators: "Ndx" = abbreviated form of "Index". */
16233 _("Ndx"), _("Name"));
0b4362b0 16234
ccb4c951 16235 sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
e0a31db1 16236
ccb4c951
RS
16237 for (i = gotsym; i < symtabno; i++)
16238 {
82b1b41b 16239 ent = print_mips_got_entry (data, pltgot, ent, data_end);
ccb4c951 16240 printf (" ");
e0a31db1
NC
16241
16242 if (dynamic_symbols == NULL)
16243 printf (_("<no dynamic symbols>"));
16244 else if (i < num_dynamic_syms)
16245 {
16246 Elf_Internal_Sym * psym = dynamic_symbols + i;
16247
16248 print_vma (psym->st_value, LONG_HEX);
16249 printf (" %-7s %3s ",
dda8d76d
NC
16250 get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
16251 get_symbol_index_type (filedata, psym->st_shndx));
e0a31db1
NC
16252
16253 if (VALID_DYNAMIC_NAME (psym->st_name))
16254 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
16255 else
16256 printf (_("<corrupt: %14ld>"), psym->st_name);
16257 }
ccb4c951 16258 else
7fc5ac57
JBG
16259 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
16260 (unsigned long) i);
e0a31db1 16261
ccb4c951 16262 printf ("\n");
82b1b41b
NC
16263 if (ent == (bfd_vma) -1)
16264 break;
ccb4c951
RS
16265 }
16266 printf ("\n");
16267 }
16268
82b1b41b 16269 got_print_fail:
ccb4c951
RS
16270 if (data)
16271 free (data);
16272 }
16273
861fb55a
DJ
16274 if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
16275 {
91d6fa6a 16276 bfd_vma ent, end;
861fb55a
DJ
16277 size_t offset, rel_offset;
16278 unsigned long count, i;
2cf0635d 16279 unsigned char * data;
861fb55a 16280 int addr_size, sym_width;
2cf0635d 16281 Elf_Internal_Rela * rels;
861fb55a 16282
dda8d76d 16283 rel_offset = offset_from_vma (filedata, jmprel, pltrelsz);
861fb55a
DJ
16284 if (pltrel == DT_RELA)
16285 {
dda8d76d 16286 if (!slurp_rela_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
32ec8896 16287 return FALSE;
861fb55a
DJ
16288 }
16289 else
16290 {
dda8d76d 16291 if (!slurp_rel_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
32ec8896 16292 return FALSE;
861fb55a
DJ
16293 }
16294
91d6fa6a 16295 ent = mips_pltgot;
861fb55a
DJ
16296 addr_size = (is_32bit_elf ? 4 : 8);
16297 end = mips_pltgot + (2 + count) * addr_size;
16298
dda8d76d
NC
16299 offset = offset_from_vma (filedata, mips_pltgot, end - mips_pltgot);
16300 data = (unsigned char *) get_data (NULL, filedata, offset, end - mips_pltgot,
9cf03b7e 16301 1, _("Procedure Linkage Table data"));
59245841 16302 if (data == NULL)
32ec8896 16303 return FALSE;
59245841 16304
9cf03b7e 16305 printf ("\nPLT GOT:\n\n");
861fb55a
DJ
16306 printf (_(" Reserved entries:\n"));
16307 printf (_(" %*s %*s Purpose\n"),
2b692964 16308 addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
91d6fa6a 16309 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
2b692964 16310 printf (_(" PLT lazy resolver\n"));
91d6fa6a 16311 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
2b692964 16312 printf (_(" Module pointer\n"));
861fb55a
DJ
16313 printf ("\n");
16314
16315 printf (_(" Entries:\n"));
cc5914eb 16316 printf (" %*s %*s %*s %-7s %3s %s\n",
2b692964
NC
16317 addr_size * 2, _("Address"),
16318 addr_size * 2, _("Initial"),
16319 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
861fb55a
DJ
16320 sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
16321 for (i = 0; i < count; i++)
16322 {
df97ab2a 16323 unsigned long idx = get_reloc_symindex (rels[i].r_info);
861fb55a 16324
91d6fa6a 16325 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
861fb55a 16326 printf (" ");
e0a31db1 16327
df97ab2a
MF
16328 if (idx >= num_dynamic_syms)
16329 printf (_("<corrupt symbol index: %lu>"), idx);
861fb55a 16330 else
e0a31db1 16331 {
df97ab2a 16332 Elf_Internal_Sym * psym = dynamic_symbols + idx;
e0a31db1
NC
16333
16334 print_vma (psym->st_value, LONG_HEX);
16335 printf (" %-7s %3s ",
dda8d76d
NC
16336 get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
16337 get_symbol_index_type (filedata, psym->st_shndx));
e0a31db1
NC
16338 if (VALID_DYNAMIC_NAME (psym->st_name))
16339 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
16340 else
16341 printf (_("<corrupt: %14ld>"), psym->st_name);
16342 }
861fb55a
DJ
16343 printf ("\n");
16344 }
16345 printf ("\n");
16346
16347 if (data)
16348 free (data);
16349 free (rels);
16350 }
16351
32ec8896 16352 return res;
252b5132
RH
16353}
16354
32ec8896 16355static bfd_boolean
dda8d76d 16356process_nds32_specific (Filedata * filedata)
35c08157
KLC
16357{
16358 Elf_Internal_Shdr *sect = NULL;
16359
dda8d76d 16360 sect = find_section (filedata, ".nds32_e_flags");
35c08157
KLC
16361 if (sect != NULL)
16362 {
16363 unsigned int *flag;
16364
16365 printf ("\nNDS32 elf flags section:\n");
dda8d76d 16366 flag = get_data (NULL, filedata, sect->sh_offset, 1,
35c08157
KLC
16367 sect->sh_size, _("NDS32 elf flags section"));
16368
32ec8896
NC
16369 if (! flag)
16370 return FALSE;
16371
35c08157
KLC
16372 switch ((*flag) & 0x3)
16373 {
16374 case 0:
16375 printf ("(VEC_SIZE):\tNo entry.\n");
16376 break;
16377 case 1:
16378 printf ("(VEC_SIZE):\t4 bytes\n");
16379 break;
16380 case 2:
16381 printf ("(VEC_SIZE):\t16 bytes\n");
16382 break;
16383 case 3:
16384 printf ("(VEC_SIZE):\treserved\n");
16385 break;
16386 }
16387 }
16388
16389 return TRUE;
16390}
16391
32ec8896 16392static bfd_boolean
dda8d76d 16393process_gnu_liblist (Filedata * filedata)
047b2264 16394{
2cf0635d
NC
16395 Elf_Internal_Shdr * section;
16396 Elf_Internal_Shdr * string_sec;
16397 Elf32_External_Lib * elib;
16398 char * strtab;
c256ffe7 16399 size_t strtab_size;
047b2264 16400 size_t cnt;
d3a49aa8 16401 unsigned long num_liblist;
047b2264 16402 unsigned i;
32ec8896 16403 bfd_boolean res = TRUE;
047b2264
JJ
16404
16405 if (! do_arch)
32ec8896 16406 return TRUE;
047b2264 16407
dda8d76d
NC
16408 for (i = 0, section = filedata->section_headers;
16409 i < filedata->file_header.e_shnum;
b34976b6 16410 i++, section++)
047b2264
JJ
16411 {
16412 switch (section->sh_type)
16413 {
16414 case SHT_GNU_LIBLIST:
dda8d76d 16415 if (section->sh_link >= filedata->file_header.e_shnum)
c256ffe7
JJ
16416 break;
16417
3f5e193b 16418 elib = (Elf32_External_Lib *)
dda8d76d 16419 get_data (NULL, filedata, section->sh_offset, 1, section->sh_size,
9cf03b7e 16420 _("liblist section data"));
047b2264
JJ
16421
16422 if (elib == NULL)
32ec8896
NC
16423 {
16424 res = FALSE;
16425 break;
16426 }
047b2264 16427
dda8d76d
NC
16428 string_sec = filedata->section_headers + section->sh_link;
16429 strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
3f5e193b
NC
16430 string_sec->sh_size,
16431 _("liblist string table"));
047b2264
JJ
16432 if (strtab == NULL
16433 || section->sh_entsize != sizeof (Elf32_External_Lib))
16434 {
16435 free (elib);
2842702f 16436 free (strtab);
32ec8896 16437 res = FALSE;
047b2264
JJ
16438 break;
16439 }
59245841 16440 strtab_size = string_sec->sh_size;
047b2264 16441
d3a49aa8
AM
16442 num_liblist = section->sh_size / sizeof (Elf32_External_Lib);
16443 printf (ngettext ("\nLibrary list section '%s' contains %lu entries:\n",
16444 "\nLibrary list section '%s' contains %lu entries:\n",
16445 num_liblist),
dda8d76d 16446 printable_section_name (filedata, section),
d3a49aa8 16447 num_liblist);
047b2264 16448
2b692964 16449 puts (_(" Library Time Stamp Checksum Version Flags"));
047b2264
JJ
16450
16451 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
16452 ++cnt)
16453 {
16454 Elf32_Lib liblist;
91d6fa6a 16455 time_t atime;
d5b07ef4 16456 char timebuf[128];
2cf0635d 16457 struct tm * tmp;
047b2264
JJ
16458
16459 liblist.l_name = BYTE_GET (elib[cnt].l_name);
91d6fa6a 16460 atime = BYTE_GET (elib[cnt].l_time_stamp);
047b2264
JJ
16461 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
16462 liblist.l_version = BYTE_GET (elib[cnt].l_version);
16463 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
16464
91d6fa6a 16465 tmp = gmtime (&atime);
e9e44622
JJ
16466 snprintf (timebuf, sizeof (timebuf),
16467 "%04u-%02u-%02uT%02u:%02u:%02u",
16468 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
16469 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
047b2264
JJ
16470
16471 printf ("%3lu: ", (unsigned long) cnt);
16472 if (do_wide)
c256ffe7 16473 printf ("%-20s", liblist.l_name < strtab_size
2b692964 16474 ? strtab + liblist.l_name : _("<corrupt>"));
047b2264 16475 else
c256ffe7 16476 printf ("%-20.20s", liblist.l_name < strtab_size
2b692964 16477 ? strtab + liblist.l_name : _("<corrupt>"));
047b2264
JJ
16478 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
16479 liblist.l_version, liblist.l_flags);
16480 }
16481
16482 free (elib);
2842702f 16483 free (strtab);
047b2264
JJ
16484 }
16485 }
16486
32ec8896 16487 return res;
047b2264
JJ
16488}
16489
9437c45b 16490static const char *
dda8d76d 16491get_note_type (Filedata * filedata, unsigned e_type)
779fe533
NC
16492{
16493 static char buff[64];
103f02d3 16494
dda8d76d 16495 if (filedata->file_header.e_type == ET_CORE)
1ec5cd37
NC
16496 switch (e_type)
16497 {
57346661 16498 case NT_AUXV:
1ec5cd37 16499 return _("NT_AUXV (auxiliary vector)");
57346661 16500 case NT_PRSTATUS:
1ec5cd37 16501 return _("NT_PRSTATUS (prstatus structure)");
57346661 16502 case NT_FPREGSET:
1ec5cd37 16503 return _("NT_FPREGSET (floating point registers)");
57346661 16504 case NT_PRPSINFO:
1ec5cd37 16505 return _("NT_PRPSINFO (prpsinfo structure)");
57346661 16506 case NT_TASKSTRUCT:
1ec5cd37 16507 return _("NT_TASKSTRUCT (task structure)");
57346661 16508 case NT_PRXFPREG:
1ec5cd37 16509 return _("NT_PRXFPREG (user_xfpregs structure)");
e1e95dec
AM
16510 case NT_PPC_VMX:
16511 return _("NT_PPC_VMX (ppc Altivec registers)");
89eeb0bc
LM
16512 case NT_PPC_VSX:
16513 return _("NT_PPC_VSX (ppc VSX registers)");
66c3b5f8
GR
16514 case NT_PPC_TAR:
16515 return _("NT_PPC_TAR (ppc TAR register)");
16516 case NT_PPC_PPR:
16517 return _("NT_PPC_PPR (ppc PPR register)");
16518 case NT_PPC_DSCR:
16519 return _("NT_PPC_DSCR (ppc DSCR register)");
16520 case NT_PPC_EBB:
16521 return _("NT_PPC_EBB (ppc EBB registers)");
16522 case NT_PPC_PMU:
16523 return _("NT_PPC_PMU (ppc PMU registers)");
16524 case NT_PPC_TM_CGPR:
16525 return _("NT_PPC_TM_CGPR (ppc checkpointed GPR registers)");
16526 case NT_PPC_TM_CFPR:
16527 return _("NT_PPC_TM_CFPR (ppc checkpointed floating point registers)");
16528 case NT_PPC_TM_CVMX:
16529 return _("NT_PPC_TM_CVMX (ppc checkpointed Altivec registers)");
16530 case NT_PPC_TM_CVSX:
16531 return _("NT_PPC_TM_VSX (ppc checkpointed VSX registers)");
16532 case NT_PPC_TM_SPR:
16533 return _("NT_PPC_TM_SPR (ppc TM special purpose registers)");
16534 case NT_PPC_TM_CTAR:
16535 return _("NT_PPC_TM_CTAR (ppc checkpointed TAR register)");
16536 case NT_PPC_TM_CPPR:
16537 return _("NT_PPC_TM_CPPR (ppc checkpointed PPR register)");
16538 case NT_PPC_TM_CDSCR:
16539 return _("NT_PPC_TM_CDSCR (ppc checkpointed DSCR register)");
ff826ef3
TT
16540 case NT_386_TLS:
16541 return _("NT_386_TLS (x86 TLS information)");
16542 case NT_386_IOPERM:
16543 return _("NT_386_IOPERM (x86 I/O permissions)");
4339cae0
L
16544 case NT_X86_XSTATE:
16545 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
0675e188
UW
16546 case NT_S390_HIGH_GPRS:
16547 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
d7eeb400
MS
16548 case NT_S390_TIMER:
16549 return _("NT_S390_TIMER (s390 timer register)");
16550 case NT_S390_TODCMP:
16551 return _("NT_S390_TODCMP (s390 TOD comparator register)");
16552 case NT_S390_TODPREG:
16553 return _("NT_S390_TODPREG (s390 TOD programmable register)");
16554 case NT_S390_CTRS:
16555 return _("NT_S390_CTRS (s390 control registers)");
16556 case NT_S390_PREFIX:
16557 return _("NT_S390_PREFIX (s390 prefix register)");
a367d729
AK
16558 case NT_S390_LAST_BREAK:
16559 return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
16560 case NT_S390_SYSTEM_CALL:
16561 return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
abb3f6cc
NC
16562 case NT_S390_TDB:
16563 return _("NT_S390_TDB (s390 transaction diagnostic block)");
4ef9f41a
AA
16564 case NT_S390_VXRS_LOW:
16565 return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
16566 case NT_S390_VXRS_HIGH:
16567 return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
88ab90e8
AA
16568 case NT_S390_GS_CB:
16569 return _("NT_S390_GS_CB (s390 guarded-storage registers)");
16570 case NT_S390_GS_BC:
16571 return _("NT_S390_GS_BC (s390 guarded-storage broadcast control)");
faa9a424
UW
16572 case NT_ARM_VFP:
16573 return _("NT_ARM_VFP (arm VFP registers)");
652451f8
YZ
16574 case NT_ARM_TLS:
16575 return _("NT_ARM_TLS (AArch TLS registers)");
16576 case NT_ARM_HW_BREAK:
16577 return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
16578 case NT_ARM_HW_WATCH:
16579 return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
57346661 16580 case NT_PSTATUS:
1ec5cd37 16581 return _("NT_PSTATUS (pstatus structure)");
57346661 16582 case NT_FPREGS:
1ec5cd37 16583 return _("NT_FPREGS (floating point registers)");
57346661 16584 case NT_PSINFO:
1ec5cd37 16585 return _("NT_PSINFO (psinfo structure)");
57346661 16586 case NT_LWPSTATUS:
1ec5cd37 16587 return _("NT_LWPSTATUS (lwpstatus_t structure)");
57346661 16588 case NT_LWPSINFO:
1ec5cd37 16589 return _("NT_LWPSINFO (lwpsinfo_t structure)");
57346661 16590 case NT_WIN32PSTATUS:
1ec5cd37 16591 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
9ece1fa9
TT
16592 case NT_SIGINFO:
16593 return _("NT_SIGINFO (siginfo_t data)");
16594 case NT_FILE:
16595 return _("NT_FILE (mapped files)");
1ec5cd37
NC
16596 default:
16597 break;
16598 }
16599 else
16600 switch (e_type)
16601 {
16602 case NT_VERSION:
16603 return _("NT_VERSION (version)");
16604 case NT_ARCH:
16605 return _("NT_ARCH (architecture)");
9ef920e9 16606 case NT_GNU_BUILD_ATTRIBUTE_OPEN:
6f156d7a 16607 return _("OPEN");
9ef920e9 16608 case NT_GNU_BUILD_ATTRIBUTE_FUNC:
6f156d7a 16609 return _("func");
1ec5cd37
NC
16610 default:
16611 break;
16612 }
16613
e9e44622 16614 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
1ec5cd37 16615 return buff;
779fe533
NC
16616}
16617
32ec8896 16618static bfd_boolean
9ece1fa9
TT
16619print_core_note (Elf_Internal_Note *pnote)
16620{
16621 unsigned int addr_size = is_32bit_elf ? 4 : 8;
16622 bfd_vma count, page_size;
16623 unsigned char *descdata, *filenames, *descend;
16624
16625 if (pnote->type != NT_FILE)
04ac15ab
AS
16626 {
16627 if (do_wide)
16628 printf ("\n");
16629 return TRUE;
16630 }
9ece1fa9
TT
16631
16632#ifndef BFD64
16633 if (!is_32bit_elf)
16634 {
16635 printf (_(" Cannot decode 64-bit note in 32-bit build\n"));
16636 /* Still "successful". */
32ec8896 16637 return TRUE;
9ece1fa9
TT
16638 }
16639#endif
16640
16641 if (pnote->descsz < 2 * addr_size)
16642 {
32ec8896
NC
16643 error (_(" Malformed note - too short for header\n"));
16644 return FALSE;
9ece1fa9
TT
16645 }
16646
16647 descdata = (unsigned char *) pnote->descdata;
16648 descend = descdata + pnote->descsz;
16649
16650 if (descdata[pnote->descsz - 1] != '\0')
16651 {
32ec8896
NC
16652 error (_(" Malformed note - does not end with \\0\n"));
16653 return FALSE;
9ece1fa9
TT
16654 }
16655
16656 count = byte_get (descdata, addr_size);
16657 descdata += addr_size;
16658
16659 page_size = byte_get (descdata, addr_size);
16660 descdata += addr_size;
16661
5396a86e
AM
16662 if (count > ((bfd_vma) -1 - 2 * addr_size) / (3 * addr_size)
16663 || pnote->descsz < 2 * addr_size + count * 3 * addr_size)
9ece1fa9 16664 {
32ec8896
NC
16665 error (_(" Malformed note - too short for supplied file count\n"));
16666 return FALSE;
9ece1fa9
TT
16667 }
16668
16669 printf (_(" Page size: "));
16670 print_vma (page_size, DEC);
16671 printf ("\n");
16672
16673 printf (_(" %*s%*s%*s\n"),
16674 (int) (2 + 2 * addr_size), _("Start"),
16675 (int) (4 + 2 * addr_size), _("End"),
16676 (int) (4 + 2 * addr_size), _("Page Offset"));
16677 filenames = descdata + count * 3 * addr_size;
595712bb 16678 while (count-- > 0)
9ece1fa9
TT
16679 {
16680 bfd_vma start, end, file_ofs;
16681
16682 if (filenames == descend)
16683 {
32ec8896
NC
16684 error (_(" Malformed note - filenames end too early\n"));
16685 return FALSE;
9ece1fa9
TT
16686 }
16687
16688 start = byte_get (descdata, addr_size);
16689 descdata += addr_size;
16690 end = byte_get (descdata, addr_size);
16691 descdata += addr_size;
16692 file_ofs = byte_get (descdata, addr_size);
16693 descdata += addr_size;
16694
16695 printf (" ");
16696 print_vma (start, FULL_HEX);
16697 printf (" ");
16698 print_vma (end, FULL_HEX);
16699 printf (" ");
16700 print_vma (file_ofs, FULL_HEX);
16701 printf ("\n %s\n", filenames);
16702
16703 filenames += 1 + strlen ((char *) filenames);
16704 }
16705
32ec8896 16706 return TRUE;
9ece1fa9
TT
16707}
16708
1118d252
RM
16709static const char *
16710get_gnu_elf_note_type (unsigned e_type)
16711{
1449284b 16712 /* NB/ Keep this switch statement in sync with print_gnu_note (). */
1118d252
RM
16713 switch (e_type)
16714 {
16715 case NT_GNU_ABI_TAG:
16716 return _("NT_GNU_ABI_TAG (ABI version tag)");
16717 case NT_GNU_HWCAP:
16718 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
16719 case NT_GNU_BUILD_ID:
16720 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
0297aed6
DM
16721 case NT_GNU_GOLD_VERSION:
16722 return _("NT_GNU_GOLD_VERSION (gold version)");
9ef920e9
NC
16723 case NT_GNU_PROPERTY_TYPE_0:
16724 return _("NT_GNU_PROPERTY_TYPE_0");
16725 case NT_GNU_BUILD_ATTRIBUTE_OPEN:
16726 return _("NT_GNU_BUILD_ATTRIBUTE_OPEN");
16727 case NT_GNU_BUILD_ATTRIBUTE_FUNC:
16728 return _("NT_GNU_BUILD_ATTRIBUTE_FUNC");
1118d252 16729 default:
1449284b
NC
16730 {
16731 static char buff[64];
1118d252 16732
1449284b
NC
16733 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
16734 return buff;
16735 }
16736 }
1118d252
RM
16737}
16738
9ef920e9 16739static void
1fc87489 16740decode_x86_isa (unsigned int bitmask)
9ef920e9
NC
16741{
16742 while (bitmask)
16743 {
1fc87489 16744 unsigned int bit = bitmask & (- bitmask);
9ef920e9
NC
16745
16746 bitmask &= ~ bit;
16747 switch (bit)
16748 {
16749 case GNU_PROPERTY_X86_ISA_1_486: printf ("i486"); break;
16750 case GNU_PROPERTY_X86_ISA_1_586: printf ("586"); break;
16751 case GNU_PROPERTY_X86_ISA_1_686: printf ("686"); break;
16752 case GNU_PROPERTY_X86_ISA_1_SSE: printf ("SSE"); break;
16753 case GNU_PROPERTY_X86_ISA_1_SSE2: printf ("SSE2"); break;
16754 case GNU_PROPERTY_X86_ISA_1_SSE3: printf ("SSE3"); break;
16755 case GNU_PROPERTY_X86_ISA_1_SSSE3: printf ("SSSE3"); break;
16756 case GNU_PROPERTY_X86_ISA_1_SSE4_1: printf ("SSE4_1"); break;
16757 case GNU_PROPERTY_X86_ISA_1_SSE4_2: printf ("SSE4_2"); break;
16758 case GNU_PROPERTY_X86_ISA_1_AVX: printf ("AVX"); break;
16759 case GNU_PROPERTY_X86_ISA_1_AVX2: printf ("AVX2"); break;
16760 case GNU_PROPERTY_X86_ISA_1_AVX512F: printf ("AVX512F"); break;
16761 case GNU_PROPERTY_X86_ISA_1_AVX512CD: printf ("AVX512CD"); break;
16762 case GNU_PROPERTY_X86_ISA_1_AVX512ER: printf ("AVX512ER"); break;
16763 case GNU_PROPERTY_X86_ISA_1_AVX512PF: printf ("AVX512PF"); break;
16764 case GNU_PROPERTY_X86_ISA_1_AVX512VL: printf ("AVX512VL"); break;
16765 case GNU_PROPERTY_X86_ISA_1_AVX512DQ: printf ("AVX512DQ"); break;
16766 case GNU_PROPERTY_X86_ISA_1_AVX512BW: printf ("AVX512BW"); break;
1fc87489 16767 default: printf (_("<unknown: %x>"), bit); break;
9ef920e9
NC
16768 }
16769 if (bitmask)
16770 printf (", ");
16771 }
16772}
16773
ee2fdd6f
L
16774static void
16775decode_x86_feature (unsigned int type, unsigned int bitmask)
16776{
16777 while (bitmask)
16778 {
16779 unsigned int bit = bitmask & (- bitmask);
16780
16781 bitmask &= ~ bit;
16782 switch (bit)
16783 {
16784 case GNU_PROPERTY_X86_FEATURE_1_IBT:
16785 switch (type)
16786 {
16787 case GNU_PROPERTY_X86_FEATURE_1_AND:
16788 printf ("IBT");
16789 break;
16790 default:
16791 /* This should never happen. */
16792 abort ();
16793 }
16794 break;
48580982
L
16795 case GNU_PROPERTY_X86_FEATURE_1_SHSTK:
16796 switch (type)
16797 {
16798 case GNU_PROPERTY_X86_FEATURE_1_AND:
16799 printf ("SHSTK");
16800 break;
16801 default:
16802 /* This should never happen. */
16803 abort ();
16804 }
16805 break;
ee2fdd6f
L
16806 default:
16807 printf (_("<unknown: %x>"), bit);
16808 break;
16809 }
16810 if (bitmask)
16811 printf (", ");
16812 }
16813}
16814
9ef920e9 16815static void
dda8d76d 16816print_gnu_property_note (Filedata * filedata, Elf_Internal_Note * pnote)
9ef920e9
NC
16817{
16818 unsigned char * ptr = (unsigned char *) pnote->descdata;
16819 unsigned char * ptr_end = ptr + pnote->descsz;
16820 unsigned int size = is_32bit_elf ? 4 : 8;
16821
16822 printf (_(" Properties: "));
16823
1fc87489 16824 if (pnote->descsz < 8 || (pnote->descsz % size) != 0)
9ef920e9
NC
16825 {
16826 printf (_("<corrupt GNU_PROPERTY_TYPE, size = %#lx>\n"), pnote->descsz);
16827 return;
16828 }
16829
6ab2c4ed 16830 while (ptr < ptr_end)
9ef920e9 16831 {
1fc87489 16832 unsigned int j;
6ab2c4ed
MC
16833 unsigned int type;
16834 unsigned int datasz;
16835
16836 if ((size_t) (ptr_end - ptr) < 8)
16837 {
16838 printf (_("<corrupt descsz: %#lx>\n"), pnote->descsz);
16839 break;
16840 }
16841
16842 type = byte_get (ptr, 4);
16843 datasz = byte_get (ptr + 4, 4);
9ef920e9 16844
1fc87489 16845 ptr += 8;
9ef920e9 16846
6ab2c4ed 16847 if (datasz > (size_t) (ptr_end - ptr))
9ef920e9 16848 {
1fc87489
L
16849 printf (_("<corrupt type (%#x) datasz: %#x>\n"),
16850 type, datasz);
9ef920e9 16851 break;
1fc87489 16852 }
9ef920e9 16853
1fc87489
L
16854 if (type >= GNU_PROPERTY_LOPROC && type <= GNU_PROPERTY_HIPROC)
16855 {
dda8d76d
NC
16856 if (filedata->file_header.e_machine == EM_X86_64
16857 || filedata->file_header.e_machine == EM_IAMCU
16858 || filedata->file_header.e_machine == EM_386)
1fc87489
L
16859 {
16860 switch (type)
16861 {
16862 case GNU_PROPERTY_X86_ISA_1_USED:
16863 printf ("x86 ISA used: ");
16864 if (datasz != 4)
16865 printf (_("<corrupt length: %#x> "), datasz);
16866 else
16867 decode_x86_isa (byte_get (ptr, 4));
16868 goto next;
9ef920e9 16869
1fc87489
L
16870 case GNU_PROPERTY_X86_ISA_1_NEEDED:
16871 printf ("x86 ISA needed: ");
16872 if (datasz != 4)
16873 printf (_("<corrupt length: %#x> "), datasz);
16874 else
16875 decode_x86_isa (byte_get (ptr, 4));
16876 goto next;
9ef920e9 16877
ee2fdd6f
L
16878 case GNU_PROPERTY_X86_FEATURE_1_AND:
16879 printf ("x86 feature: ");
16880 if (datasz != 4)
16881 printf (_("<corrupt length: %#x> "), datasz);
16882 else
16883 decode_x86_feature (type, byte_get (ptr, 4));
16884 goto next;
16885
1fc87489
L
16886 default:
16887 break;
16888 }
16889 }
16890 }
16891 else
16892 {
16893 switch (type)
9ef920e9 16894 {
1fc87489
L
16895 case GNU_PROPERTY_STACK_SIZE:
16896 printf (_("stack size: "));
16897 if (datasz != size)
16898 printf (_("<corrupt length: %#x> "), datasz);
16899 else
16900 printf ("%#lx", (unsigned long) byte_get (ptr, size));
16901 goto next;
16902
16903 case GNU_PROPERTY_NO_COPY_ON_PROTECTED:
16904 printf ("no copy on protected ");
16905 if (datasz)
16906 printf (_("<corrupt length: %#x> "), datasz);
16907 goto next;
16908
16909 default:
9ef920e9
NC
16910 break;
16911 }
9ef920e9
NC
16912 }
16913
1fc87489
L
16914 if (type < GNU_PROPERTY_LOPROC)
16915 printf (_("<unknown type %#x data: "), type);
16916 else if (type < GNU_PROPERTY_LOUSER)
16917 printf (_("<procesor-specific type %#x data: "), type);
16918 else
16919 printf (_("<application-specific type %#x data: "), type);
16920 for (j = 0; j < datasz; ++j)
16921 printf ("%02x ", ptr[j] & 0xff);
16922 printf (">");
16923
16924next:
9ef920e9 16925 ptr += ((datasz + (size - 1)) & ~ (size - 1));
1fc87489
L
16926 if (ptr == ptr_end)
16927 break;
1fc87489 16928
6ab2c4ed
MC
16929 if (do_wide)
16930 printf (", ");
16931 else
16932 printf ("\n\t");
9ef920e9
NC
16933 }
16934
16935 printf ("\n");
16936}
16937
32ec8896 16938static bfd_boolean
dda8d76d 16939print_gnu_note (Filedata * filedata, Elf_Internal_Note *pnote)
664f90a3 16940{
1449284b 16941 /* NB/ Keep this switch statement in sync with get_gnu_elf_note_type (). */
664f90a3
TT
16942 switch (pnote->type)
16943 {
16944 case NT_GNU_BUILD_ID:
16945 {
16946 unsigned long i;
16947
16948 printf (_(" Build ID: "));
16949 for (i = 0; i < pnote->descsz; ++i)
16950 printf ("%02x", pnote->descdata[i] & 0xff);
9cf03b7e 16951 printf ("\n");
664f90a3
TT
16952 }
16953 break;
16954
16955 case NT_GNU_ABI_TAG:
16956 {
16957 unsigned long os, major, minor, subminor;
16958 const char *osname;
16959
3102e897
NC
16960 /* PR 17531: file: 030-599401-0.004. */
16961 if (pnote->descsz < 16)
16962 {
16963 printf (_(" <corrupt GNU_ABI_TAG>\n"));
16964 break;
16965 }
16966
664f90a3
TT
16967 os = byte_get ((unsigned char *) pnote->descdata, 4);
16968 major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
16969 minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
16970 subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
16971
16972 switch (os)
16973 {
16974 case GNU_ABI_TAG_LINUX:
16975 osname = "Linux";
16976 break;
16977 case GNU_ABI_TAG_HURD:
16978 osname = "Hurd";
16979 break;
16980 case GNU_ABI_TAG_SOLARIS:
16981 osname = "Solaris";
16982 break;
16983 case GNU_ABI_TAG_FREEBSD:
16984 osname = "FreeBSD";
16985 break;
16986 case GNU_ABI_TAG_NETBSD:
16987 osname = "NetBSD";
16988 break;
14ae95f2
RM
16989 case GNU_ABI_TAG_SYLLABLE:
16990 osname = "Syllable";
16991 break;
16992 case GNU_ABI_TAG_NACL:
16993 osname = "NaCl";
16994 break;
664f90a3
TT
16995 default:
16996 osname = "Unknown";
16997 break;
16998 }
16999
17000 printf (_(" OS: %s, ABI: %ld.%ld.%ld\n"), osname,
17001 major, minor, subminor);
17002 }
17003 break;
926c5385
CC
17004
17005 case NT_GNU_GOLD_VERSION:
17006 {
17007 unsigned long i;
17008
17009 printf (_(" Version: "));
17010 for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
17011 printf ("%c", pnote->descdata[i]);
17012 printf ("\n");
17013 }
17014 break;
1449284b
NC
17015
17016 case NT_GNU_HWCAP:
17017 {
17018 unsigned long num_entries, mask;
17019
17020 /* Hardware capabilities information. Word 0 is the number of entries.
17021 Word 1 is a bitmask of enabled entries. The rest of the descriptor
17022 is a series of entries, where each entry is a single byte followed
17023 by a nul terminated string. The byte gives the bit number to test
17024 if enabled in the bitmask. */
17025 printf (_(" Hardware Capabilities: "));
17026 if (pnote->descsz < 8)
17027 {
32ec8896
NC
17028 error (_("<corrupt GNU_HWCAP>\n"));
17029 return FALSE;
1449284b
NC
17030 }
17031 num_entries = byte_get ((unsigned char *) pnote->descdata, 4);
17032 mask = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17033 printf (_("num entries: %ld, enabled mask: %lx\n"), num_entries, mask);
17034 /* FIXME: Add code to display the entries... */
17035 }
17036 break;
17037
9ef920e9 17038 case NT_GNU_PROPERTY_TYPE_0:
dda8d76d 17039 print_gnu_property_note (filedata, pnote);
9ef920e9
NC
17040 break;
17041
1449284b
NC
17042 default:
17043 /* Handle unrecognised types. An error message should have already been
17044 created by get_gnu_elf_note_type(), so all that we need to do is to
17045 display the data. */
17046 {
17047 unsigned long i;
17048
17049 printf (_(" Description data: "));
17050 for (i = 0; i < pnote->descsz; ++i)
17051 printf ("%02x ", pnote->descdata[i] & 0xff);
17052 printf ("\n");
17053 }
17054 break;
664f90a3
TT
17055 }
17056
32ec8896 17057 return TRUE;
664f90a3
TT
17058}
17059
685080f2
NC
17060static const char *
17061get_v850_elf_note_type (enum v850_notes n_type)
17062{
17063 static char buff[64];
17064
17065 switch (n_type)
17066 {
17067 case V850_NOTE_ALIGNMENT: return _("Alignment of 8-byte objects");
17068 case V850_NOTE_DATA_SIZE: return _("Sizeof double and long double");
17069 case V850_NOTE_FPU_INFO: return _("Type of FPU support needed");
17070 case V850_NOTE_SIMD_INFO: return _("Use of SIMD instructions");
17071 case V850_NOTE_CACHE_INFO: return _("Use of cache");
17072 case V850_NOTE_MMU_INFO: return _("Use of MMU");
17073 default:
17074 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
17075 return buff;
17076 }
17077}
17078
32ec8896 17079static bfd_boolean
685080f2
NC
17080print_v850_note (Elf_Internal_Note * pnote)
17081{
17082 unsigned int val;
17083
17084 if (pnote->descsz != 4)
32ec8896
NC
17085 return FALSE;
17086
685080f2
NC
17087 val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
17088
17089 if (val == 0)
17090 {
17091 printf (_("not set\n"));
32ec8896 17092 return TRUE;
685080f2
NC
17093 }
17094
17095 switch (pnote->type)
17096 {
17097 case V850_NOTE_ALIGNMENT:
17098 switch (val)
17099 {
32ec8896
NC
17100 case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return TRUE;
17101 case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return TRUE;
685080f2
NC
17102 }
17103 break;
14ae95f2 17104
685080f2
NC
17105 case V850_NOTE_DATA_SIZE:
17106 switch (val)
17107 {
32ec8896
NC
17108 case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return TRUE;
17109 case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return TRUE;
685080f2
NC
17110 }
17111 break;
14ae95f2 17112
685080f2
NC
17113 case V850_NOTE_FPU_INFO:
17114 switch (val)
17115 {
32ec8896
NC
17116 case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return TRUE;
17117 case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return TRUE;
685080f2
NC
17118 }
17119 break;
14ae95f2 17120
685080f2
NC
17121 case V850_NOTE_MMU_INFO:
17122 case V850_NOTE_CACHE_INFO:
17123 case V850_NOTE_SIMD_INFO:
17124 if (val == EF_RH850_SIMD)
17125 {
17126 printf (_("yes\n"));
32ec8896 17127 return TRUE;
685080f2
NC
17128 }
17129 break;
17130
17131 default:
17132 /* An 'unknown note type' message will already have been displayed. */
17133 break;
17134 }
17135
17136 printf (_("unknown value: %x\n"), val);
32ec8896 17137 return FALSE;
685080f2
NC
17138}
17139
32ec8896 17140static bfd_boolean
c6056a74
SF
17141process_netbsd_elf_note (Elf_Internal_Note * pnote)
17142{
17143 unsigned int version;
17144
17145 switch (pnote->type)
17146 {
17147 case NT_NETBSD_IDENT:
17148 version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
17149 if ((version / 10000) % 100)
17150 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
17151 version, version / 100000000, (version / 1000000) % 100,
17152 (version / 10000) % 100 > 26 ? "Z" : "",
15f205b1 17153 'A' + (version / 10000) % 26);
c6056a74
SF
17154 else
17155 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
17156 version, version / 100000000, (version / 1000000) % 100,
15f205b1 17157 (version / 100) % 100);
32ec8896 17158 return TRUE;
c6056a74
SF
17159
17160 case NT_NETBSD_MARCH:
17161 printf (" NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
17162 pnote->descdata);
32ec8896 17163 return TRUE;
c6056a74
SF
17164
17165 default:
32ec8896
NC
17166 printf (" NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
17167 pnote->type);
17168 return FALSE;
c6056a74 17169 }
c6056a74
SF
17170}
17171
f4ddf30f 17172static const char *
dda8d76d 17173get_freebsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
f4ddf30f 17174{
f4ddf30f
JB
17175 switch (e_type)
17176 {
17177 case NT_FREEBSD_THRMISC:
17178 return _("NT_THRMISC (thrmisc structure)");
17179 case NT_FREEBSD_PROCSTAT_PROC:
17180 return _("NT_PROCSTAT_PROC (proc data)");
17181 case NT_FREEBSD_PROCSTAT_FILES:
17182 return _("NT_PROCSTAT_FILES (files data)");
17183 case NT_FREEBSD_PROCSTAT_VMMAP:
17184 return _("NT_PROCSTAT_VMMAP (vmmap data)");
17185 case NT_FREEBSD_PROCSTAT_GROUPS:
17186 return _("NT_PROCSTAT_GROUPS (groups data)");
17187 case NT_FREEBSD_PROCSTAT_UMASK:
17188 return _("NT_PROCSTAT_UMASK (umask data)");
17189 case NT_FREEBSD_PROCSTAT_RLIMIT:
17190 return _("NT_PROCSTAT_RLIMIT (rlimit data)");
17191 case NT_FREEBSD_PROCSTAT_OSREL:
17192 return _("NT_PROCSTAT_OSREL (osreldate data)");
17193 case NT_FREEBSD_PROCSTAT_PSSTRINGS:
17194 return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
17195 case NT_FREEBSD_PROCSTAT_AUXV:
17196 return _("NT_PROCSTAT_AUXV (auxv data)");
0b9305ed
JB
17197 case NT_FREEBSD_PTLWPINFO:
17198 return _("NT_PTLWPINFO (ptrace_lwpinfo structure)");
f4ddf30f 17199 }
dda8d76d 17200 return get_note_type (filedata, e_type);
f4ddf30f
JB
17201}
17202
9437c45b 17203static const char *
dda8d76d 17204get_netbsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
9437c45b
JT
17205{
17206 static char buff[64];
17207
b4db1224 17208 if (e_type == NT_NETBSDCORE_PROCINFO)
dda8d76d 17209 return _("NetBSD procinfo structure");
9437c45b
JT
17210
17211 /* As of Jan 2002 there are no other machine-independent notes
17212 defined for NetBSD core files. If the note type is less
17213 than the start of the machine-dependent note types, we don't
17214 understand it. */
17215
b4db1224 17216 if (e_type < NT_NETBSDCORE_FIRSTMACH)
9437c45b 17217 {
e9e44622 17218 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
9437c45b
JT
17219 return buff;
17220 }
17221
dda8d76d 17222 switch (filedata->file_header.e_machine)
9437c45b
JT
17223 {
17224 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
17225 and PT_GETFPREGS == mach+2. */
17226
17227 case EM_OLD_ALPHA:
17228 case EM_ALPHA:
17229 case EM_SPARC:
17230 case EM_SPARC32PLUS:
17231 case EM_SPARCV9:
17232 switch (e_type)
17233 {
2b692964 17234 case NT_NETBSDCORE_FIRSTMACH + 0:
b4db1224 17235 return _("PT_GETREGS (reg structure)");
2b692964 17236 case NT_NETBSDCORE_FIRSTMACH + 2:
b4db1224 17237 return _("PT_GETFPREGS (fpreg structure)");
9437c45b
JT
17238 default:
17239 break;
17240 }
17241 break;
17242
17243 /* On all other arch's, PT_GETREGS == mach+1 and
17244 PT_GETFPREGS == mach+3. */
17245 default:
17246 switch (e_type)
17247 {
2b692964 17248 case NT_NETBSDCORE_FIRSTMACH + 1:
b4db1224 17249 return _("PT_GETREGS (reg structure)");
2b692964 17250 case NT_NETBSDCORE_FIRSTMACH + 3:
b4db1224 17251 return _("PT_GETFPREGS (fpreg structure)");
9437c45b
JT
17252 default:
17253 break;
17254 }
17255 }
17256
9cf03b7e 17257 snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
e9e44622 17258 e_type - NT_NETBSDCORE_FIRSTMACH);
9437c45b
JT
17259 return buff;
17260}
17261
70616151
TT
17262static const char *
17263get_stapsdt_note_type (unsigned e_type)
17264{
17265 static char buff[64];
17266
17267 switch (e_type)
17268 {
17269 case NT_STAPSDT:
17270 return _("NT_STAPSDT (SystemTap probe descriptors)");
17271
17272 default:
17273 break;
17274 }
17275
17276 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17277 return buff;
17278}
17279
32ec8896 17280static bfd_boolean
c6a9fc58
TT
17281print_stapsdt_note (Elf_Internal_Note *pnote)
17282{
17283 int addr_size = is_32bit_elf ? 4 : 8;
17284 char *data = pnote->descdata;
17285 char *data_end = pnote->descdata + pnote->descsz;
17286 bfd_vma pc, base_addr, semaphore;
17287 char *provider, *probe, *arg_fmt;
17288
17289 pc = byte_get ((unsigned char *) data, addr_size);
17290 data += addr_size;
17291 base_addr = byte_get ((unsigned char *) data, addr_size);
17292 data += addr_size;
17293 semaphore = byte_get ((unsigned char *) data, addr_size);
17294 data += addr_size;
17295
17296 provider = data;
17297 data += strlen (data) + 1;
17298 probe = data;
17299 data += strlen (data) + 1;
17300 arg_fmt = data;
17301 data += strlen (data) + 1;
17302
17303 printf (_(" Provider: %s\n"), provider);
17304 printf (_(" Name: %s\n"), probe);
17305 printf (_(" Location: "));
17306 print_vma (pc, FULL_HEX);
17307 printf (_(", Base: "));
17308 print_vma (base_addr, FULL_HEX);
17309 printf (_(", Semaphore: "));
17310 print_vma (semaphore, FULL_HEX);
9cf03b7e 17311 printf ("\n");
c6a9fc58
TT
17312 printf (_(" Arguments: %s\n"), arg_fmt);
17313
17314 return data == data_end;
17315}
17316
00e98fc7
TG
17317static const char *
17318get_ia64_vms_note_type (unsigned e_type)
17319{
17320 static char buff[64];
17321
17322 switch (e_type)
17323 {
17324 case NT_VMS_MHD:
17325 return _("NT_VMS_MHD (module header)");
17326 case NT_VMS_LNM:
17327 return _("NT_VMS_LNM (language name)");
17328 case NT_VMS_SRC:
17329 return _("NT_VMS_SRC (source files)");
17330 case NT_VMS_TITLE:
9cf03b7e 17331 return "NT_VMS_TITLE";
00e98fc7
TG
17332 case NT_VMS_EIDC:
17333 return _("NT_VMS_EIDC (consistency check)");
17334 case NT_VMS_FPMODE:
17335 return _("NT_VMS_FPMODE (FP mode)");
17336 case NT_VMS_LINKTIME:
9cf03b7e 17337 return "NT_VMS_LINKTIME";
00e98fc7
TG
17338 case NT_VMS_IMGNAM:
17339 return _("NT_VMS_IMGNAM (image name)");
17340 case NT_VMS_IMGID:
17341 return _("NT_VMS_IMGID (image id)");
17342 case NT_VMS_LINKID:
17343 return _("NT_VMS_LINKID (link id)");
17344 case NT_VMS_IMGBID:
17345 return _("NT_VMS_IMGBID (build id)");
17346 case NT_VMS_GSTNAM:
17347 return _("NT_VMS_GSTNAM (sym table name)");
17348 case NT_VMS_ORIG_DYN:
9cf03b7e 17349 return "NT_VMS_ORIG_DYN";
00e98fc7 17350 case NT_VMS_PATCHTIME:
9cf03b7e 17351 return "NT_VMS_PATCHTIME";
00e98fc7
TG
17352 default:
17353 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17354 return buff;
17355 }
17356}
17357
32ec8896 17358static bfd_boolean
00e98fc7
TG
17359print_ia64_vms_note (Elf_Internal_Note * pnote)
17360{
17361 switch (pnote->type)
17362 {
17363 case NT_VMS_MHD:
17364 if (pnote->descsz > 36)
17365 {
17366 size_t l = strlen (pnote->descdata + 34);
17367 printf (_(" Creation date : %.17s\n"), pnote->descdata);
17368 printf (_(" Last patch date: %.17s\n"), pnote->descdata + 17);
17369 printf (_(" Module name : %s\n"), pnote->descdata + 34);
17370 printf (_(" Module version : %s\n"), pnote->descdata + 34 + l + 1);
17371 }
17372 else
17373 printf (_(" Invalid size\n"));
17374 break;
17375 case NT_VMS_LNM:
17376 printf (_(" Language: %s\n"), pnote->descdata);
17377 break;
17378#ifdef BFD64
17379 case NT_VMS_FPMODE:
9cf03b7e 17380 printf (_(" Floating Point mode: "));
4a5cb34f 17381 printf ("0x%016" BFD_VMA_FMT "x\n",
948f632f 17382 (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
00e98fc7
TG
17383 break;
17384 case NT_VMS_LINKTIME:
17385 printf (_(" Link time: "));
17386 print_vms_time
17387 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
17388 printf ("\n");
17389 break;
17390 case NT_VMS_PATCHTIME:
17391 printf (_(" Patch time: "));
17392 print_vms_time
17393 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
17394 printf ("\n");
17395 break;
17396 case NT_VMS_ORIG_DYN:
17397 printf (_(" Major id: %u, minor id: %u\n"),
17398 (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
17399 (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
9cf03b7e 17400 printf (_(" Last modified : "));
00e98fc7
TG
17401 print_vms_time
17402 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
9cf03b7e 17403 printf (_("\n Link flags : "));
4a5cb34f 17404 printf ("0x%016" BFD_VMA_FMT "x\n",
948f632f 17405 (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
00e98fc7 17406 printf (_(" Header flags: 0x%08x\n"),
948f632f 17407 (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
00e98fc7
TG
17408 printf (_(" Image id : %s\n"), pnote->descdata + 32);
17409 break;
17410#endif
17411 case NT_VMS_IMGNAM:
17412 printf (_(" Image name: %s\n"), pnote->descdata);
17413 break;
17414 case NT_VMS_GSTNAM:
17415 printf (_(" Global symbol table name: %s\n"), pnote->descdata);
17416 break;
17417 case NT_VMS_IMGID:
17418 printf (_(" Image id: %s\n"), pnote->descdata);
17419 break;
17420 case NT_VMS_LINKID:
17421 printf (_(" Linker id: %s\n"), pnote->descdata);
17422 break;
17423 default:
32ec8896 17424 return FALSE;
00e98fc7 17425 }
32ec8896 17426 return TRUE;
00e98fc7
TG
17427}
17428
6f156d7a
NC
17429/* Find the symbol associated with a build attribute that is attached
17430 to address OFFSET. If PNAME is non-NULL then store the name of
17431 the symbol (if found) in the provided pointer, Returns NULL if a
17432 symbol could not be found. */
c799a79d 17433
6f156d7a
NC
17434static Elf_Internal_Sym *
17435get_symbol_for_build_attribute (Filedata * filedata,
17436 unsigned long offset,
17437 bfd_boolean is_open_attr,
17438 const char ** pname)
9ef920e9 17439{
dda8d76d 17440 static Filedata * saved_filedata = NULL;
c799a79d
NC
17441 static char * strtab;
17442 static unsigned long strtablen;
17443 static Elf_Internal_Sym * symtab;
17444 static unsigned long nsyms;
7296a62a
NC
17445 Elf_Internal_Sym * saved_sym = NULL;
17446 Elf_Internal_Sym * sym;
9ef920e9 17447
dda8d76d
NC
17448 if (filedata->section_headers != NULL
17449 && (saved_filedata == NULL || filedata != saved_filedata))
9ef920e9 17450 {
c799a79d 17451 Elf_Internal_Shdr * symsec;
9ef920e9 17452
c799a79d 17453 /* Load the symbol and string sections. */
dda8d76d
NC
17454 for (symsec = filedata->section_headers;
17455 symsec < filedata->section_headers + filedata->file_header.e_shnum;
c799a79d 17456 symsec ++)
9ef920e9 17457 {
c799a79d 17458 if (symsec->sh_type == SHT_SYMTAB)
9ef920e9 17459 {
dda8d76d 17460 symtab = GET_ELF_SYMBOLS (filedata, symsec, & nsyms);
9ef920e9 17461
dda8d76d 17462 if (symsec->sh_link < filedata->file_header.e_shnum)
c799a79d 17463 {
dda8d76d 17464 Elf_Internal_Shdr * strtab_sec = filedata->section_headers + symsec->sh_link;
c799a79d 17465
dda8d76d 17466 strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
c799a79d
NC
17467 1, strtab_sec->sh_size,
17468 _("string table"));
17469 strtablen = strtab != NULL ? strtab_sec->sh_size : 0;
17470 }
9ef920e9
NC
17471 }
17472 }
dda8d76d 17473 saved_filedata = filedata;
9ef920e9
NC
17474 }
17475
c799a79d 17476 if (symtab == NULL || strtab == NULL)
6f156d7a 17477 return NULL;
9ef920e9 17478
c799a79d
NC
17479 /* Find a symbol whose value matches offset. */
17480 for (sym = symtab; sym < symtab + nsyms; sym ++)
17481 if (sym->st_value == offset)
17482 {
17483 if (sym->st_name >= strtablen)
17484 /* Huh ? This should not happen. */
17485 continue;
9ef920e9 17486
c799a79d
NC
17487 if (strtab[sym->st_name] == 0)
17488 continue;
9ef920e9 17489
c799a79d
NC
17490 if (is_open_attr)
17491 {
17492 /* For OPEN attributes we prefer GLOBAL over LOCAL symbols
17493 and FILE or OBJECT symbols over NOTYPE symbols. We skip
17494 FUNC symbols entirely. */
17495 switch (ELF_ST_TYPE (sym->st_info))
17496 {
c799a79d 17497 case STT_OBJECT:
6f156d7a 17498 case STT_FILE:
c799a79d 17499 saved_sym = sym;
6f156d7a
NC
17500 if (sym->st_size)
17501 {
17502 /* If the symbol has a size associated
17503 with it then we can stop searching. */
17504 sym = symtab + nsyms;
17505 }
c799a79d 17506 continue;
9ef920e9 17507
c799a79d
NC
17508 case STT_FUNC:
17509 /* Ignore function symbols. */
17510 continue;
17511
17512 default:
17513 break;
17514 }
17515
17516 switch (ELF_ST_BIND (sym->st_info))
9ef920e9 17517 {
c799a79d
NC
17518 case STB_GLOBAL:
17519 if (saved_sym == NULL
17520 || ELF_ST_TYPE (saved_sym->st_info) != STT_OBJECT)
17521 saved_sym = sym;
17522 break;
c871dade 17523
c799a79d
NC
17524 case STB_LOCAL:
17525 if (saved_sym == NULL)
17526 saved_sym = sym;
17527 break;
17528
17529 default:
9ef920e9
NC
17530 break;
17531 }
17532 }
c799a79d
NC
17533 else
17534 {
17535 if (ELF_ST_TYPE (sym->st_info) != STT_FUNC)
17536 continue;
17537
17538 saved_sym = sym;
17539 break;
17540 }
17541 }
17542
6f156d7a
NC
17543 if (saved_sym && pname)
17544 * pname = strtab + saved_sym->st_name;
17545
17546 return saved_sym;
c799a79d
NC
17547}
17548
17549static bfd_boolean
dda8d76d
NC
17550print_gnu_build_attribute_description (Elf_Internal_Note * pnote,
17551 Filedata * filedata)
c799a79d 17552{
6f156d7a
NC
17553 static unsigned long global_offset = 0;
17554 static unsigned long global_end = 0;
17555 static unsigned long func_offset = 0;
17556 static unsigned long func_end = 0;
c871dade 17557
6f156d7a
NC
17558 Elf_Internal_Sym * sym;
17559 const char * name;
17560 unsigned long start;
17561 unsigned long end;
17562 bfd_boolean is_open_attr = pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN;
17563
17564 switch (pnote->descsz)
c799a79d 17565 {
6f156d7a
NC
17566 case 0:
17567 /* A zero-length description means that the range of
17568 the previous note of the same type should be used. */
c799a79d 17569 if (is_open_attr)
c871dade 17570 {
6f156d7a
NC
17571 if (global_end > global_offset)
17572 printf (_(" Applies to region from %#lx to %#lx\n"),
17573 global_offset, global_end);
17574 else
17575 printf (_(" Applies to region from %#lx\n"), global_offset);
c799a79d
NC
17576 }
17577 else
17578 {
6f156d7a
NC
17579 if (func_end > func_offset)
17580 printf (_(" Applies to region from %#lx to %#lx\n"), func_offset, func_end);
17581 else
17582 printf (_(" Applies to region from %#lx\n"), func_offset);
c871dade 17583 }
6f156d7a 17584 return TRUE;
9ef920e9 17585
6f156d7a
NC
17586 case 4:
17587 start = byte_get ((unsigned char *) pnote->descdata, 4);
17588 end = 0;
17589 break;
17590
17591 case 8:
17592 if (is_32bit_elf)
17593 {
17594 /* FIXME: We should check that version 3+ notes are being used here... */
17595 start = byte_get ((unsigned char *) pnote->descdata, 4);
17596 end = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17597 }
17598 else
17599 {
17600 start = byte_get ((unsigned char *) pnote->descdata, 8);
17601 end = 0;
17602 }
17603 break;
17604
17605 case 16:
17606 start = byte_get ((unsigned char *) pnote->descdata, 8);
17607 end = byte_get ((unsigned char *) pnote->descdata + 8, 8);
17608 break;
17609
17610 default:
c799a79d
NC
17611 error (_(" <invalid description size: %lx>\n"), pnote->descsz);
17612 printf (_(" <invalid descsz>"));
17613 return FALSE;
17614 }
17615
6f156d7a
NC
17616 name = NULL;
17617 sym = get_symbol_for_build_attribute (filedata, start, is_open_attr, & name);
17618
17619 if (end == 0 && sym != NULL && sym->st_size > 0)
17620 end = start + sym->st_size;
c799a79d
NC
17621
17622 if (is_open_attr)
17623 {
6f156d7a
NC
17624 /* FIXME: Need to properly allow for section alignment. 16 is just the alignment used on x86_64. */
17625 if (global_end > 0 && start > BFD_ALIGN (global_end, 16))
17626 warn (_("Gap in build notes detected from %#lx to %#lx\n"),
17627 global_end + 1, start - 1);
17628
17629 printf (_(" Applies to region from %#lx"), start);
17630 global_offset = start;
17631
17632 if (end)
17633 {
17634 printf (_(" to %#lx"), end);
17635 global_end = end;
17636 }
c799a79d
NC
17637 }
17638 else
17639 {
6f156d7a
NC
17640 printf (_(" Applies to region from %#lx"), start);
17641 func_offset = start;
17642
17643 if (end)
17644 {
17645 printf (_(" to %#lx"), end);
17646 func_end = end;
17647 }
c799a79d
NC
17648 }
17649
6f156d7a
NC
17650 if (sym && name)
17651 printf (_(" (%s)"), name);
17652
17653 printf ("\n");
17654 return TRUE;
9ef920e9
NC
17655}
17656
17657static bfd_boolean
17658print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
17659{
1d15e434
NC
17660 static const char string_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_STRING, 0 };
17661 static const char number_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC, 0 };
17662 static const char bool_expected [3] = { GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE, GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE, 0 };
9ef920e9
NC
17663 char name_type;
17664 char name_attribute;
1d15e434 17665 const char * expected_types;
9ef920e9
NC
17666 const char * name = pnote->namedata;
17667 const char * text;
88305e1b 17668 signed int left;
9ef920e9
NC
17669
17670 if (name == NULL || pnote->namesz < 2)
17671 {
17672 error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
7296a62a 17673 print_symbol (-20, _(" <corrupt name>"));
9ef920e9
NC
17674 return FALSE;
17675 }
17676
6f156d7a
NC
17677 if (do_wide)
17678 left = 28;
17679 else
17680 left = 20;
88305e1b
NC
17681
17682 /* Version 2 of the spec adds a "GA" prefix to the name field. */
17683 if (name[0] == 'G' && name[1] == 'A')
17684 {
6f156d7a
NC
17685 if (pnote->namesz < 4)
17686 {
17687 error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
17688 print_symbol (-20, _(" <corrupt name>"));
17689 return FALSE;
17690 }
17691
88305e1b
NC
17692 printf ("GA");
17693 name += 2;
17694 left -= 2;
17695 }
17696
9ef920e9
NC
17697 switch ((name_type = * name))
17698 {
17699 case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
17700 case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
17701 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
17702 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
17703 printf ("%c", * name);
88305e1b 17704 left --;
9ef920e9
NC
17705 break;
17706 default:
17707 error (_("unrecognised attribute type in name field: %d\n"), name_type);
17708 print_symbol (-20, _("<unknown name type>"));
17709 return FALSE;
17710 }
17711
9ef920e9
NC
17712 ++ name;
17713 text = NULL;
17714
17715 switch ((name_attribute = * name))
17716 {
17717 case GNU_BUILD_ATTRIBUTE_VERSION:
17718 text = _("<version>");
1d15e434 17719 expected_types = string_expected;
9ef920e9
NC
17720 ++ name;
17721 break;
17722 case GNU_BUILD_ATTRIBUTE_STACK_PROT:
17723 text = _("<stack prot>");
75d7d298 17724 expected_types = "!+*";
9ef920e9
NC
17725 ++ name;
17726 break;
17727 case GNU_BUILD_ATTRIBUTE_RELRO:
17728 text = _("<relro>");
1d15e434 17729 expected_types = bool_expected;
9ef920e9
NC
17730 ++ name;
17731 break;
17732 case GNU_BUILD_ATTRIBUTE_STACK_SIZE:
17733 text = _("<stack size>");
1d15e434 17734 expected_types = number_expected;
9ef920e9
NC
17735 ++ name;
17736 break;
17737 case GNU_BUILD_ATTRIBUTE_TOOL:
17738 text = _("<tool>");
1d15e434 17739 expected_types = string_expected;
9ef920e9
NC
17740 ++ name;
17741 break;
17742 case GNU_BUILD_ATTRIBUTE_ABI:
17743 text = _("<ABI>");
17744 expected_types = "$*";
17745 ++ name;
17746 break;
17747 case GNU_BUILD_ATTRIBUTE_PIC:
17748 text = _("<PIC>");
1d15e434 17749 expected_types = number_expected;
9ef920e9
NC
17750 ++ name;
17751 break;
a8be5506
NC
17752 case GNU_BUILD_ATTRIBUTE_SHORT_ENUM:
17753 text = _("<short enum>");
1d15e434 17754 expected_types = bool_expected;
a8be5506
NC
17755 ++ name;
17756 break;
9ef920e9
NC
17757 default:
17758 if (ISPRINT (* name))
17759 {
17760 int len = strnlen (name, pnote->namesz - (name - pnote->namedata)) + 1;
17761
17762 if (len > left && ! do_wide)
17763 len = left;
75d7d298 17764 printf ("%.*s:", len, name);
9ef920e9 17765 left -= len;
0dd6ae21 17766 name += len;
9ef920e9
NC
17767 }
17768 else
17769 {
3e6b6445 17770 static char tmpbuf [128];
88305e1b 17771
3e6b6445
NC
17772 error (_("unrecognised byte in name field: %d\n"), * name);
17773 sprintf (tmpbuf, _("<unknown:_%d>"), * name);
17774 text = tmpbuf;
17775 name ++;
9ef920e9
NC
17776 }
17777 expected_types = "*$!+";
17778 break;
17779 }
17780
17781 if (text)
88305e1b 17782 left -= printf ("%s", text);
9ef920e9
NC
17783
17784 if (strchr (expected_types, name_type) == NULL)
75d7d298 17785 warn (_("attribute does not have an expected type (%c)\n"), name_type);
9ef920e9
NC
17786
17787 if ((unsigned long)(name - pnote->namedata) > pnote->namesz)
17788 {
17789 error (_("corrupt name field: namesz: %lu but parsing gets to %ld\n"),
17790 (unsigned long) pnote->namesz,
17791 (long) (name - pnote->namedata));
17792 return FALSE;
17793 }
17794
17795 if (left < 1 && ! do_wide)
17796 return TRUE;
17797
17798 switch (name_type)
17799 {
17800 case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
17801 {
b06b2c92 17802 unsigned int bytes;
ddef72cd
NC
17803 unsigned long long val = 0;
17804 unsigned int shift = 0;
17805 char * decoded = NULL;
17806
b06b2c92
NC
17807 bytes = pnote->namesz - (name - pnote->namedata);
17808 if (bytes > 0)
17809 /* The -1 is because the name field is always 0 terminated, and we
17810 want to be able to ensure that the shift in the while loop below
17811 will not overflow. */
17812 -- bytes;
17813
ddef72cd
NC
17814 if (bytes > sizeof (val))
17815 {
3e6b6445
NC
17816 error (_("corrupt numeric name field: too many bytes in the value: %x\n"),
17817 bytes);
17818 bytes = sizeof (val);
ddef72cd 17819 }
3e6b6445
NC
17820 /* We do not bother to warn if bytes == 0 as this can
17821 happen with some early versions of the gcc plugin. */
9ef920e9
NC
17822
17823 while (bytes --)
17824 {
79a964dc
NC
17825 unsigned long byte = (* name ++) & 0xff;
17826
17827 val |= byte << shift;
9ef920e9
NC
17828 shift += 8;
17829 }
17830
75d7d298 17831 switch (name_attribute)
9ef920e9 17832 {
75d7d298 17833 case GNU_BUILD_ATTRIBUTE_PIC:
9ef920e9
NC
17834 switch (val)
17835 {
75d7d298
NC
17836 case 0: decoded = "static"; break;
17837 case 1: decoded = "pic"; break;
17838 case 2: decoded = "PIC"; break;
17839 case 3: decoded = "pie"; break;
17840 case 4: decoded = "PIE"; break;
17841 default: break;
9ef920e9 17842 }
75d7d298
NC
17843 break;
17844 case GNU_BUILD_ATTRIBUTE_STACK_PROT:
17845 switch (val)
9ef920e9 17846 {
75d7d298
NC
17847 /* Based upon the SPCT_FLAG_xxx enum values in gcc/cfgexpand.c. */
17848 case 0: decoded = "off"; break;
17849 case 1: decoded = "on"; break;
17850 case 2: decoded = "all"; break;
17851 case 3: decoded = "strong"; break;
17852 case 4: decoded = "explicit"; break;
17853 default: break;
9ef920e9 17854 }
75d7d298
NC
17855 break;
17856 default:
17857 break;
9ef920e9
NC
17858 }
17859
75d7d298 17860 if (decoded != NULL)
3e6b6445
NC
17861 {
17862 print_symbol (-left, decoded);
17863 left = 0;
17864 }
17865 else if (val == 0)
17866 {
17867 printf ("0x0");
17868 left -= 3;
17869 }
9ef920e9 17870 else
75d7d298
NC
17871 {
17872 if (do_wide)
ddef72cd 17873 left -= printf ("0x%llx", val);
75d7d298 17874 else
ddef72cd 17875 left -= printf ("0x%-.*llx", left, val);
75d7d298 17876 }
9ef920e9
NC
17877 }
17878 break;
17879 case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
17880 left -= print_symbol (- left, name);
17881 break;
17882 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
17883 left -= print_symbol (- left, "true");
17884 break;
17885 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
17886 left -= print_symbol (- left, "false");
17887 break;
17888 }
17889
17890 if (do_wide && left > 0)
17891 printf ("%-*s", left, " ");
17892
17893 return TRUE;
17894}
17895
6d118b09
NC
17896/* Note that by the ELF standard, the name field is already null byte
17897 terminated, and namesz includes the terminating null byte.
17898 I.E. the value of namesz for the name "FSF" is 4.
17899
e3c8793a 17900 If the value of namesz is zero, there is no name present. */
9ef920e9 17901
32ec8896 17902static bfd_boolean
9ef920e9 17903process_note (Elf_Internal_Note * pnote,
dda8d76d 17904 Filedata * filedata)
779fe533 17905{
2cf0635d
NC
17906 const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
17907 const char * nt;
9437c45b
JT
17908
17909 if (pnote->namesz == 0)
1ec5cd37
NC
17910 /* If there is no note name, then use the default set of
17911 note type strings. */
dda8d76d 17912 nt = get_note_type (filedata, pnote->type);
1ec5cd37 17913
1118d252
RM
17914 else if (const_strneq (pnote->namedata, "GNU"))
17915 /* GNU-specific object file notes. */
17916 nt = get_gnu_elf_note_type (pnote->type);
f4ddf30f
JB
17917
17918 else if (const_strneq (pnote->namedata, "FreeBSD"))
17919 /* FreeBSD-specific core file notes. */
dda8d76d 17920 nt = get_freebsd_elfcore_note_type (filedata, pnote->type);
1118d252 17921
0112cd26 17922 else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
1ec5cd37 17923 /* NetBSD-specific core file notes. */
dda8d76d 17924 nt = get_netbsd_elfcore_note_type (filedata, pnote->type);
1ec5cd37 17925
c6056a74
SF
17926 else if (const_strneq (pnote->namedata, "NetBSD"))
17927 /* NetBSD-specific core file notes. */
17928 return process_netbsd_elf_note (pnote);
17929
b15fa79e
AM
17930 else if (strneq (pnote->namedata, "SPU/", 4))
17931 {
17932 /* SPU-specific core file notes. */
17933 nt = pnote->namedata + 4;
17934 name = "SPU";
17935 }
17936
00e98fc7
TG
17937 else if (const_strneq (pnote->namedata, "IPF/VMS"))
17938 /* VMS/ia64-specific file notes. */
17939 nt = get_ia64_vms_note_type (pnote->type);
17940
70616151
TT
17941 else if (const_strneq (pnote->namedata, "stapsdt"))
17942 nt = get_stapsdt_note_type (pnote->type);
17943
9437c45b 17944 else
1ec5cd37
NC
17945 /* Don't recognize this note name; just use the default set of
17946 note type strings. */
dda8d76d 17947 nt = get_note_type (filedata, pnote->type);
9437c45b 17948
1449284b 17949 printf (" ");
9ef920e9 17950
483767a3
AM
17951 if (((const_strneq (pnote->namedata, "GA")
17952 && strchr ("*$!+", pnote->namedata[2]) != NULL)
17953 || strchr ("*$!+", pnote->namedata[0]) != NULL)
17954 && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
17955 || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
9ef920e9
NC
17956 print_gnu_build_attribute_name (pnote);
17957 else
17958 print_symbol (-20, name);
17959
17960 if (do_wide)
17961 printf (" 0x%08lx\t%s\t", pnote->descsz, nt);
17962 else
17963 printf (" 0x%08lx\t%s\n", pnote->descsz, nt);
00e98fc7
TG
17964
17965 if (const_strneq (pnote->namedata, "IPF/VMS"))
17966 return print_ia64_vms_note (pnote);
664f90a3 17967 else if (const_strneq (pnote->namedata, "GNU"))
dda8d76d 17968 return print_gnu_note (filedata, pnote);
c6a9fc58
TT
17969 else if (const_strneq (pnote->namedata, "stapsdt"))
17970 return print_stapsdt_note (pnote);
9ece1fa9
TT
17971 else if (const_strneq (pnote->namedata, "CORE"))
17972 return print_core_note (pnote);
483767a3
AM
17973 else if (((const_strneq (pnote->namedata, "GA")
17974 && strchr ("*$!+", pnote->namedata[2]) != NULL)
17975 || strchr ("*$!+", pnote->namedata[0]) != NULL)
17976 && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
17977 || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
dda8d76d 17978 return print_gnu_build_attribute_description (pnote, filedata);
779fe533 17979
9ef920e9 17980 if (pnote->descsz)
1449284b
NC
17981 {
17982 unsigned long i;
17983
17984 printf (_(" description data: "));
17985 for (i = 0; i < pnote->descsz; i++)
17986 printf ("%02x ", pnote->descdata[i]);
04ac15ab
AS
17987 if (!do_wide)
17988 printf ("\n");
1449284b
NC
17989 }
17990
9ef920e9
NC
17991 if (do_wide)
17992 printf ("\n");
17993
32ec8896 17994 return TRUE;
1449284b 17995}
6d118b09 17996
32ec8896 17997static bfd_boolean
dda8d76d
NC
17998process_notes_at (Filedata * filedata,
17999 Elf_Internal_Shdr * section,
18000 bfd_vma offset,
82ed9683
L
18001 bfd_vma length,
18002 bfd_vma align)
779fe533 18003{
2cf0635d
NC
18004 Elf_External_Note * pnotes;
18005 Elf_External_Note * external;
4dff97b2
NC
18006 char * end;
18007 bfd_boolean res = TRUE;
103f02d3 18008
779fe533 18009 if (length <= 0)
32ec8896 18010 return FALSE;
103f02d3 18011
1449284b
NC
18012 if (section)
18013 {
dda8d76d 18014 pnotes = (Elf_External_Note *) get_section_contents (section, filedata);
1449284b 18015 if (pnotes)
32ec8896 18016 {
dda8d76d 18017 if (! apply_relocations (filedata, section, (unsigned char *) pnotes, length, NULL, NULL))
32ec8896
NC
18018 return FALSE;
18019 }
1449284b
NC
18020 }
18021 else
82ed9683 18022 pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
1449284b 18023 _("notes"));
4dff97b2 18024
dd24e3da 18025 if (pnotes == NULL)
32ec8896 18026 return FALSE;
779fe533 18027
103f02d3 18028 external = pnotes;
103f02d3 18029
1449284b 18030 if (section)
dda8d76d 18031 printf (_("\nDisplaying notes found in: %s\n"), printable_section_name (filedata, section));
1449284b
NC
18032 else
18033 printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
18034 (unsigned long) offset, (unsigned long) length);
18035
82ed9683
L
18036 /* NB: Some note sections may have alignment value of 0 or 1. gABI
18037 specifies that notes should be aligned to 4 bytes in 32-bit
18038 objects and to 8 bytes in 64-bit objects. As a Linux extension,
18039 we also support 4 byte alignment in 64-bit objects. If section
18040 alignment is less than 4, we treate alignment as 4 bytes. */
18041 if (align < 4)
18042 align = 4;
18043 else if (align != 4 && align != 8)
18044 {
18045 warn (_("Corrupt note: alignment %ld, expecting 4 or 8\n"),
18046 (long) align);
18047 return FALSE;
18048 }
18049
2aee03ae 18050 printf (_(" %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
103f02d3 18051
c8071705
NC
18052 end = (char *) pnotes + length;
18053 while ((char *) external < end)
779fe533 18054 {
b34976b6 18055 Elf_Internal_Note inote;
15b42fb0 18056 size_t min_notesz;
4dff97b2 18057 char * next;
2cf0635d 18058 char * temp = NULL;
c8071705 18059 size_t data_remaining = end - (char *) external;
6d118b09 18060
dda8d76d 18061 if (!is_ia64_vms (filedata))
15b42fb0 18062 {
9dd3a467
NC
18063 /* PR binutils/15191
18064 Make sure that there is enough data to read. */
15b42fb0
AM
18065 min_notesz = offsetof (Elf_External_Note, name);
18066 if (data_remaining < min_notesz)
9dd3a467 18067 {
d3a49aa8
AM
18068 warn (ngettext ("Corrupt note: only %ld byte remains, "
18069 "not enough for a full note\n",
18070 "Corrupt note: only %ld bytes remain, "
18071 "not enough for a full note\n",
18072 data_remaining),
18073 (long) data_remaining);
9dd3a467
NC
18074 break;
18075 }
5396a86e
AM
18076 data_remaining -= min_notesz;
18077
15b42fb0
AM
18078 inote.type = BYTE_GET (external->type);
18079 inote.namesz = BYTE_GET (external->namesz);
18080 inote.namedata = external->name;
18081 inote.descsz = BYTE_GET (external->descsz);
276da9b3 18082 inote.descdata = ((char *) external
4dff97b2 18083 + ELF_NOTE_DESC_OFFSET (inote.namesz, align));
15b42fb0 18084 inote.descpos = offset + (inote.descdata - (char *) pnotes);
276da9b3 18085 next = ((char *) external
4dff97b2 18086 + ELF_NOTE_NEXT_OFFSET (inote.namesz, inote.descsz, align));
15b42fb0 18087 }
00e98fc7 18088 else
15b42fb0
AM
18089 {
18090 Elf64_External_VMS_Note *vms_external;
00e98fc7 18091
9dd3a467
NC
18092 /* PR binutils/15191
18093 Make sure that there is enough data to read. */
15b42fb0
AM
18094 min_notesz = offsetof (Elf64_External_VMS_Note, name);
18095 if (data_remaining < min_notesz)
9dd3a467 18096 {
d3a49aa8
AM
18097 warn (ngettext ("Corrupt note: only %ld byte remains, "
18098 "not enough for a full note\n",
18099 "Corrupt note: only %ld bytes remain, "
18100 "not enough for a full note\n",
18101 data_remaining),
18102 (long) data_remaining);
9dd3a467
NC
18103 break;
18104 }
5396a86e 18105 data_remaining -= min_notesz;
3e55a963 18106
15b42fb0
AM
18107 vms_external = (Elf64_External_VMS_Note *) external;
18108 inote.type = BYTE_GET (vms_external->type);
18109 inote.namesz = BYTE_GET (vms_external->namesz);
18110 inote.namedata = vms_external->name;
18111 inote.descsz = BYTE_GET (vms_external->descsz);
18112 inote.descdata = inote.namedata + align_power (inote.namesz, 3);
18113 inote.descpos = offset + (inote.descdata - (char *) pnotes);
18114 next = inote.descdata + align_power (inote.descsz, 3);
18115 }
18116
5396a86e
AM
18117 /* PR 17531: file: 3443835e. */
18118 /* PR 17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4. */
18119 if ((size_t) (inote.descdata - inote.namedata) < inote.namesz
18120 || (size_t) (inote.descdata - inote.namedata) > data_remaining
18121 || (size_t) (next - inote.descdata) < inote.descsz
18122 || ((size_t) (next - inote.descdata)
18123 > data_remaining - (size_t) (inote.descdata - inote.namedata)))
3e55a963 18124 {
15b42fb0 18125 warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
0af1713e 18126 (unsigned long) ((char *) external - (char *) pnotes));
4dff97b2
NC
18127 warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx, alignment: %u\n"),
18128 inote.type, inote.namesz, inote.descsz, (int) align);
3e55a963
NC
18129 break;
18130 }
18131
15b42fb0 18132 external = (Elf_External_Note *) next;
dd24e3da 18133
6d118b09
NC
18134 /* Verify that name is null terminated. It appears that at least
18135 one version of Linux (RedHat 6.0) generates corefiles that don't
18136 comply with the ELF spec by failing to include the null byte in
18137 namesz. */
8b971f9f 18138 if (inote.namedata[inote.namesz - 1] != '\0')
6d118b09 18139 {
5396a86e 18140 if ((size_t) (inote.descdata - inote.namedata) == inote.namesz)
6d118b09 18141 {
5396a86e
AM
18142 temp = (char *) malloc (inote.namesz + 1);
18143 if (temp == NULL)
18144 {
18145 error (_("Out of memory allocating space for inote name\n"));
18146 res = FALSE;
18147 break;
18148 }
76da6bbe 18149
5396a86e
AM
18150 memcpy (temp, inote.namedata, inote.namesz);
18151 inote.namedata = temp;
18152 }
18153 inote.namedata[inote.namesz] = 0;
6d118b09
NC
18154 }
18155
dda8d76d 18156 if (! process_note (& inote, filedata))
6b4bf3bc 18157 res = FALSE;
103f02d3 18158
6d118b09
NC
18159 if (temp != NULL)
18160 {
18161 free (temp);
18162 temp = NULL;
18163 }
779fe533
NC
18164 }
18165
18166 free (pnotes);
103f02d3 18167
779fe533
NC
18168 return res;
18169}
18170
32ec8896 18171static bfd_boolean
dda8d76d 18172process_corefile_note_segments (Filedata * filedata)
779fe533 18173{
2cf0635d 18174 Elf_Internal_Phdr * segment;
b34976b6 18175 unsigned int i;
32ec8896 18176 bfd_boolean res = TRUE;
103f02d3 18177
dda8d76d 18178 if (! get_program_headers (filedata))
6b4bf3bc 18179 return TRUE;
103f02d3 18180
dda8d76d
NC
18181 for (i = 0, segment = filedata->program_headers;
18182 i < filedata->file_header.e_phnum;
b34976b6 18183 i++, segment++)
779fe533
NC
18184 {
18185 if (segment->p_type == PT_NOTE)
dda8d76d 18186 if (! process_notes_at (filedata, NULL,
32ec8896 18187 (bfd_vma) segment->p_offset,
82ed9683
L
18188 (bfd_vma) segment->p_filesz,
18189 (bfd_vma) segment->p_align))
32ec8896 18190 res = FALSE;
779fe533 18191 }
103f02d3 18192
779fe533
NC
18193 return res;
18194}
18195
32ec8896 18196static bfd_boolean
dda8d76d 18197process_v850_notes (Filedata * filedata, bfd_vma offset, bfd_vma length)
685080f2
NC
18198{
18199 Elf_External_Note * pnotes;
18200 Elf_External_Note * external;
c8071705 18201 char * end;
32ec8896 18202 bfd_boolean res = TRUE;
685080f2
NC
18203
18204 if (length <= 0)
32ec8896 18205 return FALSE;
685080f2 18206
dda8d76d 18207 pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
685080f2
NC
18208 _("v850 notes"));
18209 if (pnotes == NULL)
32ec8896 18210 return FALSE;
685080f2
NC
18211
18212 external = pnotes;
c8071705 18213 end = (char*) pnotes + length;
685080f2
NC
18214
18215 printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
18216 (unsigned long) offset, (unsigned long) length);
18217
c8071705 18218 while ((char *) external + sizeof (Elf_External_Note) < end)
685080f2
NC
18219 {
18220 Elf_External_Note * next;
18221 Elf_Internal_Note inote;
18222
18223 inote.type = BYTE_GET (external->type);
18224 inote.namesz = BYTE_GET (external->namesz);
18225 inote.namedata = external->name;
18226 inote.descsz = BYTE_GET (external->descsz);
18227 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
18228 inote.descpos = offset + (inote.descdata - (char *) pnotes);
18229
c8071705
NC
18230 if (inote.descdata < (char *) pnotes || inote.descdata >= end)
18231 {
18232 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
18233 inote.descdata = inote.namedata;
18234 inote.namesz = 0;
18235 }
18236
685080f2
NC
18237 next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
18238
c8071705 18239 if ( ((char *) next > end)
685080f2
NC
18240 || ((char *) next < (char *) pnotes))
18241 {
18242 warn (_("corrupt descsz found in note at offset 0x%lx\n"),
18243 (unsigned long) ((char *) external - (char *) pnotes));
18244 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
18245 inote.type, inote.namesz, inote.descsz);
18246 break;
18247 }
18248
18249 external = next;
18250
18251 /* Prevent out-of-bounds indexing. */
c8071705 18252 if ( inote.namedata + inote.namesz > end
685080f2
NC
18253 || inote.namedata + inote.namesz < inote.namedata)
18254 {
18255 warn (_("corrupt namesz found in note at offset 0x%lx\n"),
18256 (unsigned long) ((char *) external - (char *) pnotes));
18257 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
18258 inote.type, inote.namesz, inote.descsz);
18259 break;
18260 }
18261
18262 printf (" %s: ", get_v850_elf_note_type (inote.type));
18263
18264 if (! print_v850_note (& inote))
18265 {
32ec8896 18266 res = FALSE;
685080f2
NC
18267 printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
18268 inote.namesz, inote.descsz);
18269 }
18270 }
18271
18272 free (pnotes);
18273
18274 return res;
18275}
18276
32ec8896 18277static bfd_boolean
dda8d76d 18278process_note_sections (Filedata * filedata)
1ec5cd37 18279{
2cf0635d 18280 Elf_Internal_Shdr * section;
1ec5cd37 18281 unsigned long i;
32ec8896
NC
18282 unsigned int n = 0;
18283 bfd_boolean res = TRUE;
1ec5cd37 18284
dda8d76d
NC
18285 for (i = 0, section = filedata->section_headers;
18286 i < filedata->file_header.e_shnum && section != NULL;
1ec5cd37 18287 i++, section++)
685080f2
NC
18288 {
18289 if (section->sh_type == SHT_NOTE)
18290 {
dda8d76d 18291 if (! process_notes_at (filedata, section,
32ec8896 18292 (bfd_vma) section->sh_offset,
82ed9683
L
18293 (bfd_vma) section->sh_size,
18294 (bfd_vma) section->sh_addralign))
32ec8896 18295 res = FALSE;
685080f2
NC
18296 n++;
18297 }
18298
dda8d76d
NC
18299 if (( filedata->file_header.e_machine == EM_V800
18300 || filedata->file_header.e_machine == EM_V850
18301 || filedata->file_header.e_machine == EM_CYGNUS_V850)
685080f2
NC
18302 && section->sh_type == SHT_RENESAS_INFO)
18303 {
dda8d76d 18304 if (! process_v850_notes (filedata,
32ec8896
NC
18305 (bfd_vma) section->sh_offset,
18306 (bfd_vma) section->sh_size))
18307 res = FALSE;
685080f2
NC
18308 n++;
18309 }
18310 }
df565f32
NC
18311
18312 if (n == 0)
18313 /* Try processing NOTE segments instead. */
dda8d76d 18314 return process_corefile_note_segments (filedata);
1ec5cd37
NC
18315
18316 return res;
18317}
18318
32ec8896 18319static bfd_boolean
dda8d76d 18320process_notes (Filedata * filedata)
779fe533
NC
18321{
18322 /* If we have not been asked to display the notes then do nothing. */
18323 if (! do_notes)
32ec8896 18324 return TRUE;
103f02d3 18325
dda8d76d
NC
18326 if (filedata->file_header.e_type != ET_CORE)
18327 return process_note_sections (filedata);
103f02d3 18328
779fe533 18329 /* No program headers means no NOTE segment. */
dda8d76d
NC
18330 if (filedata->file_header.e_phnum > 0)
18331 return process_corefile_note_segments (filedata);
779fe533 18332
1ec5cd37 18333 printf (_("No note segments present in the core file.\n"));
32ec8896 18334 return TRUE;
779fe533
NC
18335}
18336
60abdbed
NC
18337static unsigned char *
18338display_public_gnu_attributes (unsigned char * start,
18339 const unsigned char * const end)
18340{
18341 printf (_(" Unknown GNU attribute: %s\n"), start);
18342
18343 start += strnlen ((char *) start, end - start);
18344 display_raw_attribute (start, end);
18345
18346 return (unsigned char *) end;
18347}
18348
18349static unsigned char *
18350display_generic_attribute (unsigned char * start,
18351 unsigned int tag,
18352 const unsigned char * const end)
18353{
18354 if (tag == 0)
18355 return (unsigned char *) end;
18356
18357 return display_tag_value (tag, start, end);
18358}
18359
32ec8896 18360static bfd_boolean
dda8d76d 18361process_arch_specific (Filedata * filedata)
252b5132 18362{
a952a375 18363 if (! do_arch)
32ec8896 18364 return TRUE;
a952a375 18365
dda8d76d 18366 switch (filedata->file_header.e_machine)
252b5132 18367 {
53a346d8
CZ
18368 case EM_ARC:
18369 case EM_ARC_COMPACT:
18370 case EM_ARC_COMPACT2:
dda8d76d 18371 return process_attributes (filedata, "ARC", SHT_ARC_ATTRIBUTES,
53a346d8
CZ
18372 display_arc_attribute,
18373 display_generic_attribute);
11c1ff18 18374 case EM_ARM:
dda8d76d 18375 return process_attributes (filedata, "aeabi", SHT_ARM_ATTRIBUTES,
60abdbed
NC
18376 display_arm_attribute,
18377 display_generic_attribute);
18378
252b5132 18379 case EM_MIPS:
4fe85591 18380 case EM_MIPS_RS3_LE:
dda8d76d 18381 return process_mips_specific (filedata);
60abdbed
NC
18382
18383 case EM_MSP430:
dda8d76d
NC
18384 return process_attributes (filedata, "mspabi", SHT_MSP430_ATTRIBUTES,
18385 display_msp430x_attribute,
18386 display_generic_attribute);
60abdbed 18387
35c08157 18388 case EM_NDS32:
dda8d76d 18389 return process_nds32_specific (filedata);
60abdbed 18390
34c8bcba 18391 case EM_PPC:
b82317dd 18392 case EM_PPC64:
dda8d76d 18393 return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
60abdbed
NC
18394 display_power_gnu_attribute);
18395
643f7afb
AK
18396 case EM_S390:
18397 case EM_S390_OLD:
dda8d76d 18398 return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
60abdbed
NC
18399 display_s390_gnu_attribute);
18400
9e8c70f9
DM
18401 case EM_SPARC:
18402 case EM_SPARC32PLUS:
18403 case EM_SPARCV9:
dda8d76d 18404 return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
60abdbed
NC
18405 display_sparc_gnu_attribute);
18406
59e6276b 18407 case EM_TI_C6000:
dda8d76d 18408 return process_attributes (filedata, "c6xabi", SHT_C6000_ATTRIBUTES,
60abdbed
NC
18409 display_tic6x_attribute,
18410 display_generic_attribute);
18411
252b5132 18412 default:
dda8d76d 18413 return process_attributes (filedata, "gnu", SHT_GNU_ATTRIBUTES,
60abdbed
NC
18414 display_public_gnu_attributes,
18415 display_generic_attribute);
252b5132 18416 }
252b5132
RH
18417}
18418
32ec8896 18419static bfd_boolean
dda8d76d 18420get_file_header (Filedata * filedata)
252b5132 18421{
9ea033b2 18422 /* Read in the identity array. */
dda8d76d 18423 if (fread (filedata->file_header.e_ident, EI_NIDENT, 1, filedata->handle) != 1)
32ec8896 18424 return FALSE;
252b5132 18425
9ea033b2 18426 /* Determine how to read the rest of the header. */
dda8d76d 18427 switch (filedata->file_header.e_ident[EI_DATA])
9ea033b2 18428 {
1a0670f3
AM
18429 default:
18430 case ELFDATANONE:
adab8cdc
AO
18431 case ELFDATA2LSB:
18432 byte_get = byte_get_little_endian;
18433 byte_put = byte_put_little_endian;
18434 break;
18435 case ELFDATA2MSB:
18436 byte_get = byte_get_big_endian;
18437 byte_put = byte_put_big_endian;
18438 break;
9ea033b2
NC
18439 }
18440
18441 /* For now we only support 32 bit and 64 bit ELF files. */
dda8d76d 18442 is_32bit_elf = (filedata->file_header.e_ident[EI_CLASS] != ELFCLASS64);
9ea033b2
NC
18443
18444 /* Read in the rest of the header. */
18445 if (is_32bit_elf)
18446 {
18447 Elf32_External_Ehdr ehdr32;
252b5132 18448
dda8d76d 18449 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, filedata->handle) != 1)
32ec8896 18450 return FALSE;
103f02d3 18451
dda8d76d
NC
18452 filedata->file_header.e_type = BYTE_GET (ehdr32.e_type);
18453 filedata->file_header.e_machine = BYTE_GET (ehdr32.e_machine);
18454 filedata->file_header.e_version = BYTE_GET (ehdr32.e_version);
18455 filedata->file_header.e_entry = BYTE_GET (ehdr32.e_entry);
18456 filedata->file_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
18457 filedata->file_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
18458 filedata->file_header.e_flags = BYTE_GET (ehdr32.e_flags);
18459 filedata->file_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
18460 filedata->file_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
18461 filedata->file_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
18462 filedata->file_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
18463 filedata->file_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
18464 filedata->file_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
9ea033b2 18465 }
252b5132 18466 else
9ea033b2
NC
18467 {
18468 Elf64_External_Ehdr ehdr64;
a952a375
NC
18469
18470 /* If we have been compiled with sizeof (bfd_vma) == 4, then
18471 we will not be able to cope with the 64bit data found in
18472 64 ELF files. Detect this now and abort before we start
50c2245b 18473 overwriting things. */
a952a375
NC
18474 if (sizeof (bfd_vma) < 8)
18475 {
e3c8793a
NC
18476 error (_("This instance of readelf has been built without support for a\n\
1847764 bit data type and so it cannot read 64 bit ELF files.\n"));
32ec8896 18478 return FALSE;
a952a375 18479 }
103f02d3 18480
dda8d76d 18481 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, filedata->handle) != 1)
32ec8896 18482 return FALSE;
103f02d3 18483
dda8d76d
NC
18484 filedata->file_header.e_type = BYTE_GET (ehdr64.e_type);
18485 filedata->file_header.e_machine = BYTE_GET (ehdr64.e_machine);
18486 filedata->file_header.e_version = BYTE_GET (ehdr64.e_version);
18487 filedata->file_header.e_entry = BYTE_GET (ehdr64.e_entry);
18488 filedata->file_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
18489 filedata->file_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
18490 filedata->file_header.e_flags = BYTE_GET (ehdr64.e_flags);
18491 filedata->file_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
18492 filedata->file_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
18493 filedata->file_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
18494 filedata->file_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
18495 filedata->file_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
18496 filedata->file_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
9ea033b2 18497 }
252b5132 18498
dda8d76d 18499 if (filedata->file_header.e_shoff)
7ece0d85
JJ
18500 {
18501 /* There may be some extensions in the first section header. Don't
18502 bomb if we can't read it. */
18503 if (is_32bit_elf)
dda8d76d 18504 get_32bit_section_headers (filedata, TRUE);
7ece0d85 18505 else
dda8d76d 18506 get_64bit_section_headers (filedata, TRUE);
7ece0d85 18507 }
560f3c1c 18508
32ec8896 18509 return TRUE;
252b5132
RH
18510}
18511
dda8d76d
NC
18512static void
18513close_file (Filedata * filedata)
18514{
18515 if (filedata)
18516 {
18517 if (filedata->handle)
18518 fclose (filedata->handle);
18519 free (filedata);
18520 }
18521}
18522
18523void
18524close_debug_file (void * data)
18525{
18526 close_file ((Filedata *) data);
18527}
18528
18529static Filedata *
18530open_file (const char * pathname)
18531{
18532 struct stat statbuf;
18533 Filedata * filedata = NULL;
18534
18535 if (stat (pathname, & statbuf) < 0
18536 || ! S_ISREG (statbuf.st_mode))
18537 goto fail;
18538
18539 filedata = calloc (1, sizeof * filedata);
18540 if (filedata == NULL)
18541 goto fail;
18542
18543 filedata->handle = fopen (pathname, "rb");
18544 if (filedata->handle == NULL)
18545 goto fail;
18546
18547 filedata->file_size = (bfd_size_type) statbuf.st_size;
18548 filedata->file_name = pathname;
18549
18550 if (! get_file_header (filedata))
18551 goto fail;
18552
18553 if (filedata->file_header.e_shoff)
18554 {
18555 bfd_boolean res;
18556
18557 /* Read the section headers again, this time for real. */
18558 if (is_32bit_elf)
18559 res = get_32bit_section_headers (filedata, FALSE);
18560 else
18561 res = get_64bit_section_headers (filedata, FALSE);
18562
18563 if (!res)
18564 goto fail;
18565 }
18566
18567 return filedata;
18568
18569 fail:
18570 if (filedata)
18571 {
18572 if (filedata->handle)
18573 fclose (filedata->handle);
18574 free (filedata);
18575 }
18576 return NULL;
18577}
18578
18579void *
18580open_debug_file (const char * pathname)
18581{
18582 return open_file (pathname);
18583}
18584
fb52b2f4
NC
18585/* Process one ELF object file according to the command line options.
18586 This file may actually be stored in an archive. The file is
32ec8896
NC
18587 positioned at the start of the ELF object. Returns TRUE if no
18588 problems were encountered, FALSE otherwise. */
fb52b2f4 18589
32ec8896 18590static bfd_boolean
dda8d76d 18591process_object (Filedata * filedata)
252b5132 18592{
dda8d76d 18593 Filedata * separates;
252b5132 18594 unsigned int i;
32ec8896 18595 bfd_boolean res = TRUE;
252b5132 18596
dda8d76d 18597 if (! get_file_header (filedata))
252b5132 18598 {
dda8d76d 18599 error (_("%s: Failed to read file header\n"), filedata->file_name);
32ec8896 18600 return FALSE;
252b5132
RH
18601 }
18602
18603 /* Initialise per file variables. */
60bca95a 18604 for (i = ARRAY_SIZE (version_info); i--;)
252b5132
RH
18605 version_info[i] = 0;
18606
60bca95a 18607 for (i = ARRAY_SIZE (dynamic_info); i--;)
252b5132 18608 dynamic_info[i] = 0;
5115b233 18609 dynamic_info_DT_GNU_HASH = 0;
252b5132
RH
18610
18611 /* Process the file. */
18612 if (show_name)
dda8d76d 18613 printf (_("\nFile: %s\n"), filedata->file_name);
252b5132 18614
18bd398b
NC
18615 /* Initialise the dump_sects array from the cmdline_dump_sects array.
18616 Note we do this even if cmdline_dump_sects is empty because we
18617 must make sure that the dump_sets array is zeroed out before each
18618 object file is processed. */
dda8d76d
NC
18619 if (filedata->num_dump_sects > cmdline.num_dump_sects)
18620 memset (filedata->dump_sects, 0, filedata->num_dump_sects * sizeof (* filedata->dump_sects));
18bd398b 18621
dda8d76d 18622 if (cmdline.num_dump_sects > 0)
18bd398b 18623 {
dda8d76d 18624 if (filedata->num_dump_sects == 0)
18bd398b 18625 /* A sneaky way of allocating the dump_sects array. */
dda8d76d 18626 request_dump_bynumber (filedata, cmdline.num_dump_sects, 0);
18bd398b 18627
dda8d76d
NC
18628 assert (filedata->num_dump_sects >= cmdline.num_dump_sects);
18629 memcpy (filedata->dump_sects, cmdline.dump_sects,
18630 cmdline.num_dump_sects * sizeof (* filedata->dump_sects));
18bd398b 18631 }
d70c5fc7 18632
dda8d76d 18633 if (! process_file_header (filedata))
32ec8896 18634 return FALSE;
252b5132 18635
dda8d76d 18636 if (! process_section_headers (filedata))
2f62977e 18637 {
32ec8896
NC
18638 /* Without loaded section headers we cannot process lots of things. */
18639 do_unwind = do_version = do_dump = do_arch = FALSE;
252b5132 18640
2f62977e 18641 if (! do_using_dynamic)
32ec8896 18642 do_syms = do_dyn_syms = do_reloc = FALSE;
2f62977e 18643 }
252b5132 18644
dda8d76d 18645 if (! process_section_groups (filedata))
32ec8896
NC
18646 /* Without loaded section groups we cannot process unwind. */
18647 do_unwind = FALSE;
d1f5c6e3 18648
dda8d76d
NC
18649 if (process_program_headers (filedata))
18650 process_dynamic_section (filedata);
32ec8896
NC
18651 else
18652 res = FALSE;
252b5132 18653
dda8d76d 18654 if (! process_relocs (filedata))
32ec8896 18655 res = FALSE;
252b5132 18656
dda8d76d 18657 if (! process_unwind (filedata))
32ec8896 18658 res = FALSE;
4d6ed7c8 18659
dda8d76d 18660 if (! process_symbol_table (filedata))
32ec8896 18661 res = FALSE;
252b5132 18662
dda8d76d 18663 if (! process_syminfo (filedata))
32ec8896 18664 res = FALSE;
252b5132 18665
dda8d76d 18666 if (! process_version_sections (filedata))
32ec8896 18667 res = FALSE;
252b5132 18668
82ed9683
L
18669 if (filedata->file_header.e_shstrndx != SHN_UNDEF)
18670 separates = load_separate_debug_file (filedata, filedata->file_name);
18671 else
18672 separates = NULL;
dda8d76d
NC
18673
18674 if (! process_section_contents (filedata))
32ec8896 18675 res = FALSE;
f5842774 18676
dda8d76d
NC
18677 if (separates)
18678 {
18679 if (! process_section_headers (separates))
18680 res = FALSE;
18681 else if (! process_section_contents (separates))
18682 res = FALSE;
18683 }
18684
18685 if (! process_notes (filedata))
32ec8896 18686 res = FALSE;
103f02d3 18687
dda8d76d 18688 if (! process_gnu_liblist (filedata))
32ec8896 18689 res = FALSE;
047b2264 18690
dda8d76d 18691 if (! process_arch_specific (filedata))
32ec8896 18692 res = FALSE;
252b5132 18693
dda8d76d
NC
18694 free (filedata->program_headers);
18695 filedata->program_headers = NULL;
d93f0186 18696
dda8d76d
NC
18697 free (filedata->section_headers);
18698 filedata->section_headers = NULL;
252b5132 18699
dda8d76d
NC
18700 free (filedata->string_table);
18701 filedata->string_table = NULL;
18702 filedata->string_table_length = 0;
252b5132
RH
18703
18704 if (dynamic_strings)
18705 {
18706 free (dynamic_strings);
18707 dynamic_strings = NULL;
d79b3d50 18708 dynamic_strings_length = 0;
252b5132
RH
18709 }
18710
18711 if (dynamic_symbols)
18712 {
18713 free (dynamic_symbols);
18714 dynamic_symbols = NULL;
19936277 18715 num_dynamic_syms = 0;
252b5132
RH
18716 }
18717
18718 if (dynamic_syminfo)
18719 {
18720 free (dynamic_syminfo);
18721 dynamic_syminfo = NULL;
18722 }
ff78d6d6 18723
293c573e
MR
18724 if (dynamic_section)
18725 {
18726 free (dynamic_section);
18727 dynamic_section = NULL;
18728 }
18729
e4b17d5c
L
18730 if (section_headers_groups)
18731 {
18732 free (section_headers_groups);
18733 section_headers_groups = NULL;
18734 }
18735
18736 if (section_groups)
18737 {
2cf0635d
NC
18738 struct group_list * g;
18739 struct group_list * next;
e4b17d5c
L
18740
18741 for (i = 0; i < group_count; i++)
18742 {
18743 for (g = section_groups [i].root; g != NULL; g = next)
18744 {
18745 next = g->next;
18746 free (g);
18747 }
18748 }
18749
18750 free (section_groups);
18751 section_groups = NULL;
18752 }
18753
19e6b90e 18754 free_debug_memory ();
18bd398b 18755
32ec8896 18756 return res;
252b5132
RH
18757}
18758
2cf0635d 18759/* Process an ELF archive.
32ec8896
NC
18760 On entry the file is positioned just after the ARMAG string.
18761 Returns TRUE upon success, FALSE otherwise. */
2cf0635d 18762
32ec8896 18763static bfd_boolean
dda8d76d 18764process_archive (Filedata * filedata, bfd_boolean is_thin_archive)
2cf0635d
NC
18765{
18766 struct archive_info arch;
18767 struct archive_info nested_arch;
18768 size_t got;
32ec8896 18769 bfd_boolean ret = TRUE;
2cf0635d 18770
32ec8896 18771 show_name = TRUE;
2cf0635d
NC
18772
18773 /* The ARCH structure is used to hold information about this archive. */
18774 arch.file_name = NULL;
18775 arch.file = NULL;
18776 arch.index_array = NULL;
18777 arch.sym_table = NULL;
18778 arch.longnames = NULL;
18779
18780 /* The NESTED_ARCH structure is used as a single-item cache of information
18781 about a nested archive (when members of a thin archive reside within
18782 another regular archive file). */
18783 nested_arch.file_name = NULL;
18784 nested_arch.file = NULL;
18785 nested_arch.index_array = NULL;
18786 nested_arch.sym_table = NULL;
18787 nested_arch.longnames = NULL;
18788
dda8d76d
NC
18789 if (setup_archive (&arch, filedata->file_name, filedata->handle,
18790 is_thin_archive, do_archive_index) != 0)
2cf0635d 18791 {
32ec8896 18792 ret = FALSE;
2cf0635d 18793 goto out;
4145f1d5 18794 }
fb52b2f4 18795
4145f1d5
NC
18796 if (do_archive_index)
18797 {
2cf0635d 18798 if (arch.sym_table == NULL)
dda8d76d 18799 error (_("%s: unable to dump the index as none was found\n"), filedata->file_name);
4145f1d5
NC
18800 else
18801 {
591f7597 18802 unsigned long i, l;
4145f1d5
NC
18803 unsigned long current_pos;
18804
591f7597 18805 printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
dda8d76d
NC
18806 filedata->file_name, (unsigned long) arch.index_num, arch.sym_size);
18807
18808 current_pos = ftell (filedata->handle);
4145f1d5 18809
2cf0635d 18810 for (i = l = 0; i < arch.index_num; i++)
4145f1d5 18811 {
2cf0635d
NC
18812 if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
18813 {
18814 char * member_name;
4145f1d5 18815
2cf0635d
NC
18816 member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
18817
18818 if (member_name != NULL)
18819 {
18820 char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
18821
18822 if (qualified_name != NULL)
18823 {
c2a7d3f5
NC
18824 printf (_("Contents of binary %s at offset "), qualified_name);
18825 (void) print_vma (arch.index_array[i], PREFIX_HEX);
18826 putchar ('\n');
2cf0635d
NC
18827 free (qualified_name);
18828 }
4145f1d5
NC
18829 }
18830 }
2cf0635d
NC
18831
18832 if (l >= arch.sym_size)
4145f1d5
NC
18833 {
18834 error (_("%s: end of the symbol table reached before the end of the index\n"),
dda8d76d 18835 filedata->file_name);
32ec8896 18836 ret = FALSE;
cb8f3167 18837 break;
4145f1d5 18838 }
591f7597
NC
18839 /* PR 17531: file: 0b6630b2. */
18840 printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
18841 l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
4145f1d5
NC
18842 }
18843
c2a7d3f5
NC
18844 if (arch.uses_64bit_indicies)
18845 l = (l + 7) & ~ 7;
18846 else
18847 l += l & 1;
18848
2cf0635d 18849 if (l < arch.sym_size)
32ec8896 18850 {
d3a49aa8
AM
18851 error (ngettext ("%s: %ld byte remains in the symbol table, "
18852 "but without corresponding entries in "
18853 "the index table\n",
18854 "%s: %ld bytes remain in the symbol table, "
18855 "but without corresponding entries in "
18856 "the index table\n",
18857 arch.sym_size - l),
dda8d76d 18858 filedata->file_name, arch.sym_size - l);
32ec8896
NC
18859 ret = FALSE;
18860 }
4145f1d5 18861
dda8d76d 18862 if (fseek (filedata->handle, current_pos, SEEK_SET) != 0)
4145f1d5 18863 {
dda8d76d
NC
18864 error (_("%s: failed to seek back to start of object files in the archive\n"),
18865 filedata->file_name);
32ec8896 18866 ret = FALSE;
2cf0635d 18867 goto out;
4145f1d5 18868 }
fb52b2f4 18869 }
4145f1d5
NC
18870
18871 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
18872 && !do_segments && !do_header && !do_dump && !do_version
18873 && !do_histogram && !do_debugging && !do_arch && !do_notes
2c610e4b 18874 && !do_section_groups && !do_dyn_syms)
2cf0635d 18875 {
32ec8896 18876 ret = TRUE; /* Archive index only. */
2cf0635d
NC
18877 goto out;
18878 }
fb52b2f4
NC
18879 }
18880
fb52b2f4
NC
18881 while (1)
18882 {
2cf0635d
NC
18883 char * name;
18884 size_t namelen;
18885 char * qualified_name;
18886
18887 /* Read the next archive header. */
dda8d76d 18888 if (fseek (filedata->handle, arch.next_arhdr_offset, SEEK_SET) != 0)
2cf0635d 18889 {
dda8d76d 18890 error (_("%s: failed to seek to next archive header\n"), filedata->file_name);
32ec8896 18891 return FALSE;
2cf0635d 18892 }
dda8d76d 18893 got = fread (&arch.arhdr, 1, sizeof arch.arhdr, filedata->handle);
2cf0635d
NC
18894 if (got != sizeof arch.arhdr)
18895 {
18896 if (got == 0)
18897 break;
dda8d76d 18898 error (_("%s: failed to read archive header\n"), filedata->file_name);
32ec8896 18899 ret = FALSE;
2cf0635d
NC
18900 break;
18901 }
18902 if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
18903 {
18904 error (_("%s: did not find a valid archive header\n"), arch.file_name);
32ec8896 18905 ret = FALSE;
2cf0635d
NC
18906 break;
18907 }
18908
18909 arch.next_arhdr_offset += sizeof arch.arhdr;
18910
18911 archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
18912 if (archive_file_size & 01)
18913 ++archive_file_size;
18914
18915 name = get_archive_member_name (&arch, &nested_arch);
18916 if (name == NULL)
fb52b2f4 18917 {
dda8d76d 18918 error (_("%s: bad archive file name\n"), filedata->file_name);
32ec8896 18919 ret = FALSE;
d989285c 18920 break;
fb52b2f4 18921 }
2cf0635d 18922 namelen = strlen (name);
fb52b2f4 18923
2cf0635d
NC
18924 qualified_name = make_qualified_name (&arch, &nested_arch, name);
18925 if (qualified_name == NULL)
fb52b2f4 18926 {
dda8d76d 18927 error (_("%s: bad archive file name\n"), filedata->file_name);
32ec8896 18928 ret = FALSE;
d989285c 18929 break;
fb52b2f4
NC
18930 }
18931
2cf0635d
NC
18932 if (is_thin_archive && arch.nested_member_origin == 0)
18933 {
18934 /* This is a proxy for an external member of a thin archive. */
dda8d76d
NC
18935 Filedata * member_filedata;
18936 char * member_file_name = adjust_relative_path
18937 (filedata->file_name, name, namelen);
32ec8896 18938
2cf0635d
NC
18939 if (member_file_name == NULL)
18940 {
32ec8896 18941 ret = FALSE;
2cf0635d
NC
18942 break;
18943 }
18944
dda8d76d
NC
18945 member_filedata = open_file (member_file_name);
18946 if (member_filedata == NULL)
2cf0635d
NC
18947 {
18948 error (_("Input file '%s' is not readable.\n"), member_file_name);
18949 free (member_file_name);
32ec8896 18950 ret = FALSE;
2cf0635d
NC
18951 break;
18952 }
18953
18954 archive_file_offset = arch.nested_member_origin;
dda8d76d 18955 member_filedata->file_name = qualified_name;
2cf0635d 18956
dda8d76d 18957 if (! process_object (member_filedata))
32ec8896 18958 ret = FALSE;
2cf0635d 18959
dda8d76d 18960 close_file (member_filedata);
2cf0635d
NC
18961 free (member_file_name);
18962 }
18963 else if (is_thin_archive)
18964 {
eb02c04d
PK
18965 Filedata thin_filedata;
18966
18967 memset (&thin_filedata, 0, sizeof (thin_filedata));
dda8d76d 18968
a043396b
NC
18969 /* PR 15140: Allow for corrupt thin archives. */
18970 if (nested_arch.file == NULL)
18971 {
18972 error (_("%s: contains corrupt thin archive: %s\n"),
dda8d76d 18973 filedata->file_name, name);
32ec8896 18974 ret = FALSE;
a043396b
NC
18975 break;
18976 }
18977
2cf0635d
NC
18978 /* This is a proxy for a member of a nested archive. */
18979 archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
18980
18981 /* The nested archive file will have been opened and setup by
18982 get_archive_member_name. */
18983 if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
18984 {
18985 error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
32ec8896 18986 ret = FALSE;
2cf0635d
NC
18987 break;
18988 }
18989
dda8d76d
NC
18990 thin_filedata.handle = nested_arch.file;
18991 thin_filedata.file_name = qualified_name;
18992
18993 if (! process_object (& thin_filedata))
32ec8896 18994 ret = FALSE;
2cf0635d
NC
18995 }
18996 else
18997 {
18998 archive_file_offset = arch.next_arhdr_offset;
18999 arch.next_arhdr_offset += archive_file_size;
fb52b2f4 19000
6a6196fc 19001 filedata->file_name = qualified_name;
dda8d76d 19002 if (! process_object (filedata))
32ec8896 19003 ret = FALSE;
2cf0635d 19004 }
fb52b2f4 19005
dda8d76d 19006 if (filedata->dump_sects != NULL)
2b52916e 19007 {
dda8d76d
NC
19008 free (filedata->dump_sects);
19009 filedata->dump_sects = NULL;
19010 filedata->num_dump_sects = 0;
2b52916e
L
19011 }
19012
2cf0635d 19013 free (qualified_name);
fb52b2f4
NC
19014 }
19015
4145f1d5 19016 out:
2cf0635d
NC
19017 if (nested_arch.file != NULL)
19018 fclose (nested_arch.file);
19019 release_archive (&nested_arch);
19020 release_archive (&arch);
fb52b2f4 19021
d989285c 19022 return ret;
fb52b2f4
NC
19023}
19024
32ec8896 19025static bfd_boolean
2cf0635d 19026process_file (char * file_name)
fb52b2f4 19027{
dda8d76d 19028 Filedata * filedata = NULL;
fb52b2f4
NC
19029 struct stat statbuf;
19030 char armag[SARMAG];
32ec8896 19031 bfd_boolean ret = TRUE;
fb52b2f4
NC
19032
19033 if (stat (file_name, &statbuf) < 0)
19034 {
f24ddbdd
NC
19035 if (errno == ENOENT)
19036 error (_("'%s': No such file\n"), file_name);
19037 else
19038 error (_("Could not locate '%s'. System error message: %s\n"),
19039 file_name, strerror (errno));
32ec8896 19040 return FALSE;
f24ddbdd
NC
19041 }
19042
19043 if (! S_ISREG (statbuf.st_mode))
19044 {
19045 error (_("'%s' is not an ordinary file\n"), file_name);
32ec8896 19046 return FALSE;
fb52b2f4
NC
19047 }
19048
dda8d76d
NC
19049 filedata = calloc (1, sizeof * filedata);
19050 if (filedata == NULL)
19051 {
19052 error (_("Out of memory allocating file data structure\n"));
19053 return FALSE;
19054 }
19055
19056 filedata->file_name = file_name;
19057 filedata->handle = fopen (file_name, "rb");
19058 if (filedata->handle == NULL)
fb52b2f4 19059 {
f24ddbdd 19060 error (_("Input file '%s' is not readable.\n"), file_name);
dda8d76d 19061 free (filedata);
32ec8896 19062 return FALSE;
fb52b2f4
NC
19063 }
19064
dda8d76d 19065 if (fread (armag, SARMAG, 1, filedata->handle) != 1)
fb52b2f4 19066 {
4145f1d5 19067 error (_("%s: Failed to read file's magic number\n"), file_name);
dda8d76d
NC
19068 fclose (filedata->handle);
19069 free (filedata);
32ec8896 19070 return FALSE;
fb52b2f4
NC
19071 }
19072
dda8d76d 19073 filedata->file_size = (bfd_size_type) statbuf.st_size;
f54498b4 19074
fb52b2f4 19075 if (memcmp (armag, ARMAG, SARMAG) == 0)
32ec8896 19076 {
dda8d76d 19077 if (! process_archive (filedata, FALSE))
32ec8896
NC
19078 ret = FALSE;
19079 }
2cf0635d 19080 else if (memcmp (armag, ARMAGT, SARMAG) == 0)
32ec8896 19081 {
dda8d76d 19082 if ( ! process_archive (filedata, TRUE))
32ec8896
NC
19083 ret = FALSE;
19084 }
fb52b2f4
NC
19085 else
19086 {
4145f1d5
NC
19087 if (do_archive_index)
19088 error (_("File %s is not an archive so its index cannot be displayed.\n"),
19089 file_name);
19090
dda8d76d 19091 rewind (filedata->handle);
fb52b2f4 19092 archive_file_size = archive_file_offset = 0;
32ec8896 19093
dda8d76d 19094 if (! process_object (filedata))
32ec8896 19095 ret = FALSE;
fb52b2f4
NC
19096 }
19097
dda8d76d
NC
19098 fclose (filedata->handle);
19099 free (filedata);
32ec8896 19100
fb52b2f4
NC
19101 return ret;
19102}
19103
252b5132
RH
19104#ifdef SUPPORT_DISASSEMBLY
19105/* Needed by the i386 disassembler. For extra credit, someone could
9ea033b2 19106 fix this so that we insert symbolic addresses here, esp for GOT/PLT
e3c8793a 19107 symbols. */
252b5132
RH
19108
19109void
2cf0635d 19110print_address (unsigned int addr, FILE * outfile)
252b5132
RH
19111{
19112 fprintf (outfile,"0x%8.8x", addr);
19113}
19114
e3c8793a 19115/* Needed by the i386 disassembler. */
dda8d76d 19116
252b5132
RH
19117void
19118db_task_printsym (unsigned int addr)
19119{
19120 print_address (addr, stderr);
19121}
19122#endif
19123
19124int
2cf0635d 19125main (int argc, char ** argv)
252b5132 19126{
ff78d6d6
L
19127 int err;
19128
252b5132
RH
19129#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
19130 setlocale (LC_MESSAGES, "");
3882b010
L
19131#endif
19132#if defined (HAVE_SETLOCALE)
19133 setlocale (LC_CTYPE, "");
252b5132
RH
19134#endif
19135 bindtextdomain (PACKAGE, LOCALEDIR);
19136 textdomain (PACKAGE);
19137
869b9d07
MM
19138 expandargv (&argc, &argv);
19139
dda8d76d
NC
19140 cmdline.file_name = "<cmdline>";
19141 parse_args (& cmdline, argc, argv);
59f14fc0 19142
18bd398b 19143 if (optind < (argc - 1))
32ec8896 19144 show_name = TRUE;
5656ba2c
L
19145 else if (optind >= argc)
19146 {
19147 warn (_("Nothing to do.\n"));
19148 usage (stderr);
19149 }
18bd398b 19150
32ec8896 19151 err = FALSE;
252b5132 19152 while (optind < argc)
32ec8896
NC
19153 if (! process_file (argv[optind++]))
19154 err = TRUE;
252b5132 19155
dda8d76d
NC
19156 if (cmdline.dump_sects != NULL)
19157 free (cmdline.dump_sects);
252b5132 19158
32ec8896 19159 return err ? EXIT_FAILURE : EXIT_SUCCESS;
252b5132 19160}