Fix PR ld/20545 - relaxation bugs in avr backend
[deliverable/binutils-gdb.git] / binutils / readelf.c
CommitLineData
252b5132 1/* readelf.c -- display contents of an ELF format file
6f2750fe 2 Copyright (C) 1998-2016 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"
99c513f6 139#include "elf/rl78.h"
c7927a3c 140#include "elf/rx.h"
a85d7ed0 141#include "elf/s390.h"
1c0d3aa6 142#include "elf/score.h"
3b16e843
NC
143#include "elf/sh.h"
144#include "elf/sparc.h"
e9f53129 145#include "elf/spu.h"
40b36596 146#include "elf/tic6x.h"
aa137e4d
NC
147#include "elf/tilegx.h"
148#include "elf/tilepro.h"
3b16e843 149#include "elf/v850.h"
179d3252 150#include "elf/vax.h"
619ed720 151#include "elf/visium.h"
3b16e843 152#include "elf/x86-64.h"
c29aca4a 153#include "elf/xc16x.h"
f6c1a2d5 154#include "elf/xgate.h"
93fbbb04 155#include "elf/xstormy16.h"
88da6820 156#include "elf/xtensa.h"
252b5132 157
252b5132 158#include "getopt.h"
566b0d53 159#include "libiberty.h"
09c11c86 160#include "safe-ctype.h"
2cf0635d 161#include "filenames.h"
252b5132 162
15b42fb0
AM
163#ifndef offsetof
164#define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
165#endif
166
6a40cf0c
NC
167typedef struct elf_section_list
168{
169 Elf_Internal_Shdr * hdr;
170 struct elf_section_list * next;
171} elf_section_list;
172
2cf0635d 173char * program_name = "readelf";
c9c1d674 174static unsigned long archive_file_offset;
85b1c36d 175static unsigned long archive_file_size;
f54498b4 176static bfd_size_type current_file_size;
85b1c36d
BE
177static unsigned long dynamic_addr;
178static bfd_size_type dynamic_size;
8b73c356 179static size_t dynamic_nent;
2cf0635d 180static char * dynamic_strings;
85b1c36d 181static unsigned long dynamic_strings_length;
2cf0635d 182static char * string_table;
85b1c36d
BE
183static unsigned long string_table_length;
184static unsigned long num_dynamic_syms;
2cf0635d
NC
185static Elf_Internal_Sym * dynamic_symbols;
186static Elf_Internal_Syminfo * dynamic_syminfo;
85b1c36d
BE
187static unsigned long dynamic_syminfo_offset;
188static unsigned int dynamic_syminfo_nent;
f8eae8b2 189static char program_interpreter[PATH_MAX];
bb8a0291 190static bfd_vma dynamic_info[DT_ENCODING];
fdc90cb4 191static bfd_vma dynamic_info_DT_GNU_HASH;
85b1c36d
BE
192static bfd_vma version_info[16];
193static Elf_Internal_Ehdr elf_header;
2cf0635d
NC
194static Elf_Internal_Shdr * section_headers;
195static Elf_Internal_Phdr * program_headers;
196static Elf_Internal_Dyn * dynamic_section;
6a40cf0c 197static elf_section_list * symtab_shndx_list;
85b1c36d
BE
198static int show_name;
199static int do_dynamic;
200static int do_syms;
2c610e4b 201static int do_dyn_syms;
85b1c36d
BE
202static int do_reloc;
203static int do_sections;
204static int do_section_groups;
5477e8a0 205static int do_section_details;
85b1c36d
BE
206static int do_segments;
207static int do_unwind;
208static int do_using_dynamic;
209static int do_header;
210static int do_dump;
211static int do_version;
85b1c36d
BE
212static int do_histogram;
213static int do_debugging;
85b1c36d
BE
214static int do_arch;
215static int do_notes;
4145f1d5 216static int do_archive_index;
85b1c36d 217static int is_32bit_elf;
0e602686 218static int decompress_dumps;
252b5132 219
e4b17d5c
L
220struct group_list
221{
2cf0635d 222 struct group_list * next;
e4b17d5c
L
223 unsigned int section_index;
224};
225
226struct group
227{
2cf0635d 228 struct group_list * root;
e4b17d5c
L
229 unsigned int group_index;
230};
231
85b1c36d 232static size_t group_count;
2cf0635d
NC
233static struct group * section_groups;
234static struct group ** section_headers_groups;
e4b17d5c 235
09c11c86
NC
236
237/* Flag bits indicating particular types of dump. */
238#define HEX_DUMP (1 << 0) /* The -x command line switch. */
239#define DISASS_DUMP (1 << 1) /* The -i command line switch. */
240#define DEBUG_DUMP (1 << 2) /* The -w command line switch. */
241#define STRING_DUMP (1 << 3) /* The -p command line switch. */
cf13d699 242#define RELOC_DUMP (1 << 4) /* The -R command line switch. */
09c11c86
NC
243
244typedef unsigned char dump_type;
245
246/* A linked list of the section names for which dumps were requested. */
aef1f6d0
DJ
247struct dump_list_entry
248{
2cf0635d 249 char * name;
09c11c86 250 dump_type type;
2cf0635d 251 struct dump_list_entry * next;
aef1f6d0 252};
2cf0635d 253static struct dump_list_entry * dump_sects_byname;
aef1f6d0 254
09c11c86
NC
255/* A dynamic array of flags indicating for which sections a dump
256 has been requested via command line switches. */
257static dump_type * cmdline_dump_sects = NULL;
258static unsigned int num_cmdline_dump_sects = 0;
18bd398b
NC
259
260/* A dynamic array of flags indicating for which sections a dump of
261 some kind has been requested. It is reset on a per-object file
aef1f6d0
DJ
262 basis and then initialised from the cmdline_dump_sects array,
263 the results of interpreting the -w switch, and the
264 dump_sects_byname list. */
09c11c86
NC
265static dump_type * dump_sects = NULL;
266static unsigned int num_dump_sects = 0;
252b5132 267
252b5132 268
c256ffe7 269/* How to print a vma value. */
843dd992
NC
270typedef enum print_mode
271{
272 HEX,
273 DEC,
274 DEC_5,
275 UNSIGNED,
276 PREFIX_HEX,
277 FULL_HEX,
278 LONG_HEX
279}
280print_mode;
281
bb4d2ac2
L
282/* Versioned symbol info. */
283enum versioned_symbol_info
284{
285 symbol_undefined,
286 symbol_hidden,
287 symbol_public
288};
289
290static const char *get_symbol_version_string
291 (FILE *file, int is_dynsym, const char *strtab,
292 unsigned long int strtab_size, unsigned int si,
293 Elf_Internal_Sym *psym, enum versioned_symbol_info *sym_info,
294 unsigned short *vna_other);
295
9c19a809
NC
296#define UNKNOWN -1
297
2b692964
NC
298#define SECTION_NAME(X) \
299 ((X) == NULL ? _("<none>") \
300 : string_table == NULL ? _("<no-name>") \
301 : ((X)->sh_name >= string_table_length ? _("<corrupt>") \
0b49d371 302 : string_table + (X)->sh_name))
252b5132 303
ee42cf8c 304#define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
252b5132 305
ba5cdace
NC
306#define GET_ELF_SYMBOLS(file, section, sym_count) \
307 (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count) \
308 : get_64bit_elf_symbols (file, section, sym_count))
9ea033b2 309
d79b3d50
NC
310#define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
311/* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
312 already been called and verified that the string exists. */
313#define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
18bd398b 314
61865e30
NC
315#define REMOVE_ARCH_BITS(ADDR) \
316 do \
317 { \
318 if (elf_header.e_machine == EM_ARM) \
319 (ADDR) &= ~1; \
320 } \
321 while (0)
d79b3d50 322\f
c9c1d674
EG
323/* Retrieve NMEMB structures, each SIZE bytes long from FILE starting at OFFSET +
324 the offset of the current archive member, if we are examining an archive.
59245841
NC
325 Put the retrieved data into VAR, if it is not NULL. Otherwise allocate a buffer
326 using malloc and fill that. In either case return the pointer to the start of
327 the retrieved data or NULL if something went wrong. If something does go wrong
c9c1d674
EG
328 and REASON is not NULL then emit an error message using REASON as part of the
329 context. */
59245841 330
c256ffe7 331static void *
57028622
NC
332get_data (void * var, FILE * file, unsigned long offset, bfd_size_type size,
333 bfd_size_type nmemb, const char * reason)
a6e9f9df 334{
2cf0635d 335 void * mvar;
57028622 336 bfd_size_type amt = size * nmemb;
a6e9f9df 337
c256ffe7 338 if (size == 0 || nmemb == 0)
a6e9f9df
AM
339 return NULL;
340
57028622
NC
341 /* If the size_t type is smaller than the bfd_size_type, eg because
342 you are building a 32-bit tool on a 64-bit host, then make sure
343 that when the sizes are cast to (size_t) no information is lost. */
344 if (sizeof (size_t) < sizeof (bfd_size_type)
345 && ( (bfd_size_type) ((size_t) size) != size
346 || (bfd_size_type) ((size_t) nmemb) != nmemb))
347 {
348 if (reason)
ed754a13
AM
349 error (_("Size truncation prevents reading 0x%" BFD_VMA_FMT "x"
350 " elements of size 0x%" BFD_VMA_FMT "x for %s\n"),
351 nmemb, size, reason);
57028622
NC
352 return NULL;
353 }
354
355 /* Check for size overflow. */
356 if (amt < nmemb)
357 {
358 if (reason)
ed754a13
AM
359 error (_("Size overflow prevents reading 0x%" BFD_VMA_FMT "x"
360 " elements of size 0x%" BFD_VMA_FMT "x for %s\n"),
361 nmemb, size, reason);
57028622
NC
362 return NULL;
363 }
364
c9c1d674
EG
365 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
366 attempting to allocate memory when the read is bound to fail. */
367 if (amt > current_file_size
368 || offset + archive_file_offset + amt > current_file_size)
a6e9f9df 369 {
049b0c3a 370 if (reason)
ed754a13
AM
371 error (_("Reading 0x%" BFD_VMA_FMT "x"
372 " bytes extends past end of file for %s\n"),
373 amt, reason);
a6e9f9df
AM
374 return NULL;
375 }
376
c9c1d674 377 if (fseek (file, archive_file_offset + offset, SEEK_SET))
071436c6
NC
378 {
379 if (reason)
c9c1d674 380 error (_("Unable to seek to 0x%lx for %s\n"),
ed754a13 381 archive_file_offset + offset, reason);
071436c6
NC
382 return NULL;
383 }
384
a6e9f9df
AM
385 mvar = var;
386 if (mvar == NULL)
387 {
c256ffe7 388 /* Check for overflow. */
57028622 389 if (nmemb < (~(bfd_size_type) 0 - 1) / size)
c256ffe7 390 /* + 1 so that we can '\0' terminate invalid string table sections. */
57028622 391 mvar = malloc ((size_t) amt + 1);
a6e9f9df
AM
392
393 if (mvar == NULL)
394 {
049b0c3a 395 if (reason)
ed754a13
AM
396 error (_("Out of memory allocating 0x%" BFD_VMA_FMT "x"
397 " bytes for %s\n"),
398 amt, reason);
a6e9f9df
AM
399 return NULL;
400 }
c256ffe7 401
c9c1d674 402 ((char *) mvar)[amt] = '\0';
a6e9f9df
AM
403 }
404
57028622 405 if (fread (mvar, (size_t) size, (size_t) nmemb, file) != nmemb)
a6e9f9df 406 {
049b0c3a 407 if (reason)
ed754a13
AM
408 error (_("Unable to read in 0x%" BFD_VMA_FMT "x bytes of %s\n"),
409 amt, reason);
a6e9f9df
AM
410 if (mvar != var)
411 free (mvar);
412 return NULL;
413 }
414
415 return mvar;
416}
417
14a91970 418/* Print a VMA value. */
cb8f3167 419
66543521 420static int
14a91970 421print_vma (bfd_vma vma, print_mode mode)
66543521 422{
66543521
AM
423 int nc = 0;
424
14a91970 425 switch (mode)
66543521 426 {
14a91970
AM
427 case FULL_HEX:
428 nc = printf ("0x");
429 /* Drop through. */
66543521 430
14a91970 431 case LONG_HEX:
f7a99963 432#ifdef BFD64
14a91970 433 if (is_32bit_elf)
437c2fb7 434 return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
f7a99963 435#endif
14a91970
AM
436 printf_vma (vma);
437 return nc + 16;
b19aac67 438
14a91970
AM
439 case DEC_5:
440 if (vma <= 99999)
441 return printf ("%5" BFD_VMA_FMT "d", vma);
442 /* Drop through. */
66543521 443
14a91970
AM
444 case PREFIX_HEX:
445 nc = printf ("0x");
446 /* Drop through. */
66543521 447
14a91970
AM
448 case HEX:
449 return nc + printf ("%" BFD_VMA_FMT "x", vma);
b19aac67 450
14a91970
AM
451 case DEC:
452 return printf ("%" BFD_VMA_FMT "d", vma);
b19aac67 453
14a91970
AM
454 case UNSIGNED:
455 return printf ("%" BFD_VMA_FMT "u", vma);
f7a99963 456 }
66543521 457 return 0;
f7a99963
NC
458}
459
7bfd842d 460/* Display a symbol on stdout. Handles the display of control characters and
3bfcb652 461 multibye characters (assuming the host environment supports them).
31104126 462
7bfd842d
NC
463 Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
464
465 If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
466 padding as necessary.
171191ba
NC
467
468 Returns the number of emitted characters. */
469
470static unsigned int
7a88bc9c 471print_symbol (int width, const char *symbol)
31104126 472{
171191ba 473 bfd_boolean extra_padding = FALSE;
7bfd842d 474 int num_printed = 0;
3bfcb652 475#ifdef HAVE_MBSTATE_T
7bfd842d 476 mbstate_t state;
3bfcb652 477#endif
7bfd842d 478 int width_remaining;
961c521f 479
7bfd842d 480 if (width < 0)
961c521f 481 {
961c521f
NC
482 /* Keep the width positive. This also helps. */
483 width = - width;
171191ba 484 extra_padding = TRUE;
0b4362b0 485 }
74e1a04b 486 assert (width != 0);
961c521f 487
7bfd842d
NC
488 if (do_wide)
489 /* Set the remaining width to a very large value.
490 This simplifies the code below. */
491 width_remaining = INT_MAX;
492 else
493 width_remaining = width;
cb8f3167 494
3bfcb652 495#ifdef HAVE_MBSTATE_T
7bfd842d
NC
496 /* Initialise the multibyte conversion state. */
497 memset (& state, 0, sizeof (state));
3bfcb652 498#endif
961c521f 499
7bfd842d
NC
500 while (width_remaining)
501 {
502 size_t n;
7bfd842d 503 const char c = *symbol++;
961c521f 504
7bfd842d 505 if (c == 0)
961c521f
NC
506 break;
507
7bfd842d
NC
508 /* Do not print control characters directly as they can affect terminal
509 settings. Such characters usually appear in the names generated
510 by the assembler for local labels. */
511 if (ISCNTRL (c))
961c521f 512 {
7bfd842d 513 if (width_remaining < 2)
961c521f
NC
514 break;
515
7bfd842d
NC
516 printf ("^%c", c + 0x40);
517 width_remaining -= 2;
171191ba 518 num_printed += 2;
961c521f 519 }
7bfd842d
NC
520 else if (ISPRINT (c))
521 {
522 putchar (c);
523 width_remaining --;
524 num_printed ++;
525 }
961c521f
NC
526 else
527 {
3bfcb652
NC
528#ifdef HAVE_MBSTATE_T
529 wchar_t w;
530#endif
7bfd842d
NC
531 /* Let printf do the hard work of displaying multibyte characters. */
532 printf ("%.1s", symbol - 1);
533 width_remaining --;
534 num_printed ++;
535
3bfcb652 536#ifdef HAVE_MBSTATE_T
7bfd842d
NC
537 /* Try to find out how many bytes made up the character that was
538 just printed. Advance the symbol pointer past the bytes that
539 were displayed. */
540 n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
3bfcb652
NC
541#else
542 n = 1;
543#endif
7bfd842d
NC
544 if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
545 symbol += (n - 1);
961c521f 546 }
961c521f 547 }
171191ba 548
7bfd842d 549 if (extra_padding && num_printed < width)
171191ba
NC
550 {
551 /* Fill in the remaining spaces. */
7bfd842d
NC
552 printf ("%-*s", width - num_printed, " ");
553 num_printed = width;
171191ba
NC
554 }
555
556 return num_printed;
31104126
NC
557}
558
74e1a04b
NC
559/* Returns a pointer to a static buffer containing a printable version of
560 the given section's name. Like print_symbol, except that it does not try
561 to print multibyte characters, it just interprets them as hex values. */
562
563static const char *
0d2a7a93 564printable_section_name (const Elf_Internal_Shdr * sec)
74e1a04b
NC
565{
566#define MAX_PRINT_SEC_NAME_LEN 128
567 static char sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
568 const char * name = SECTION_NAME (sec);
569 char * buf = sec_name_buf;
570 char c;
571 unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
572
573 while ((c = * name ++) != 0)
574 {
575 if (ISCNTRL (c))
576 {
577 if (remaining < 2)
578 break;
948f632f 579
74e1a04b
NC
580 * buf ++ = '^';
581 * buf ++ = c + 0x40;
582 remaining -= 2;
583 }
584 else if (ISPRINT (c))
585 {
586 * buf ++ = c;
587 remaining -= 1;
588 }
589 else
590 {
591 static char hex[17] = "0123456789ABCDEF";
592
593 if (remaining < 4)
594 break;
595 * buf ++ = '<';
596 * buf ++ = hex[(c & 0xf0) >> 4];
597 * buf ++ = hex[c & 0x0f];
598 * buf ++ = '>';
599 remaining -= 4;
600 }
601
602 if (remaining == 0)
603 break;
604 }
605
606 * buf = 0;
607 return sec_name_buf;
608}
609
610static const char *
611printable_section_name_from_index (unsigned long ndx)
612{
613 if (ndx >= elf_header.e_shnum)
614 return _("<corrupt>");
615
616 return printable_section_name (section_headers + ndx);
617}
618
89fac5e3
RS
619/* Return a pointer to section NAME, or NULL if no such section exists. */
620
621static Elf_Internal_Shdr *
2cf0635d 622find_section (const char * name)
89fac5e3
RS
623{
624 unsigned int i;
625
626 for (i = 0; i < elf_header.e_shnum; i++)
627 if (streq (SECTION_NAME (section_headers + i), name))
628 return section_headers + i;
629
630 return NULL;
631}
632
0b6ae522
DJ
633/* Return a pointer to a section containing ADDR, or NULL if no such
634 section exists. */
635
636static Elf_Internal_Shdr *
637find_section_by_address (bfd_vma addr)
638{
639 unsigned int i;
640
641 for (i = 0; i < elf_header.e_shnum; i++)
642 {
643 Elf_Internal_Shdr *sec = section_headers + i;
644 if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
645 return sec;
646 }
647
648 return NULL;
649}
650
071436c6
NC
651static Elf_Internal_Shdr *
652find_section_by_type (unsigned int type)
653{
654 unsigned int i;
655
656 for (i = 0; i < elf_header.e_shnum; i++)
657 {
658 Elf_Internal_Shdr *sec = section_headers + i;
659 if (sec->sh_type == type)
660 return sec;
661 }
662
663 return NULL;
664}
665
657d0d47
CC
666/* Return a pointer to section NAME, or NULL if no such section exists,
667 restricted to the list of sections given in SET. */
668
669static Elf_Internal_Shdr *
670find_section_in_set (const char * name, unsigned int * set)
671{
672 unsigned int i;
673
674 if (set != NULL)
675 {
676 while ((i = *set++) > 0)
677 if (streq (SECTION_NAME (section_headers + i), name))
678 return section_headers + i;
679 }
680
681 return find_section (name);
682}
683
0b6ae522
DJ
684/* Read an unsigned LEB128 encoded value from p. Set *PLEN to the number of
685 bytes read. */
686
f6f0e17b
NC
687static inline unsigned long
688read_uleb128 (unsigned char *data,
689 unsigned int *length_return,
690 const unsigned char * const end)
0b6ae522 691{
f6f0e17b 692 return read_leb128 (data, length_return, FALSE, end);
0b6ae522
DJ
693}
694
28f997cf
TG
695/* Return true if the current file is for IA-64 machine and OpenVMS ABI.
696 This OS has so many departures from the ELF standard that we test it at
697 many places. */
698
699static inline int
700is_ia64_vms (void)
701{
702 return elf_header.e_machine == EM_IA_64
703 && elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
704}
705
bcedfee6 706/* Guess the relocation size commonly used by the specific machines. */
252b5132 707
252b5132 708static int
2dc4cec1 709guess_is_rela (unsigned int e_machine)
252b5132 710{
9c19a809 711 switch (e_machine)
252b5132
RH
712 {
713 /* Targets that use REL relocations. */
252b5132 714 case EM_386:
22abe556 715 case EM_IAMCU:
63fcb9e9 716 case EM_960:
e9f53129 717 case EM_ARM:
2b0337b0 718 case EM_D10V:
252b5132 719 case EM_CYGNUS_D10V:
e9f53129 720 case EM_DLX:
252b5132 721 case EM_MIPS:
4fe85591 722 case EM_MIPS_RS3_LE:
e9f53129 723 case EM_CYGNUS_M32R:
1c0d3aa6 724 case EM_SCORE:
f6c1a2d5 725 case EM_XGATE:
9c19a809 726 return FALSE;
103f02d3 727
252b5132
RH
728 /* Targets that use RELA relocations. */
729 case EM_68K:
e9f53129 730 case EM_860:
a06ea964 731 case EM_AARCH64:
cfb8c092 732 case EM_ADAPTEVA_EPIPHANY:
e9f53129
AM
733 case EM_ALPHA:
734 case EM_ALTERA_NIOS2:
886a2506
NC
735 case EM_ARC:
736 case EM_ARC_COMPACT:
737 case EM_ARC_COMPACT2:
e9f53129
AM
738 case EM_AVR:
739 case EM_AVR_OLD:
740 case EM_BLACKFIN:
60bca95a 741 case EM_CR16:
e9f53129
AM
742 case EM_CRIS:
743 case EM_CRX:
2b0337b0 744 case EM_D30V:
252b5132 745 case EM_CYGNUS_D30V:
2b0337b0 746 case EM_FR30:
3f8107ab 747 case EM_FT32:
252b5132 748 case EM_CYGNUS_FR30:
5c70f934 749 case EM_CYGNUS_FRV:
e9f53129
AM
750 case EM_H8S:
751 case EM_H8_300:
752 case EM_H8_300H:
800eeca4 753 case EM_IA_64:
1e4cf259
NC
754 case EM_IP2K:
755 case EM_IP2K_OLD:
3b36097d 756 case EM_IQ2000:
84e94c90 757 case EM_LATTICEMICO32:
ff7eeb89 758 case EM_M32C_OLD:
49f58d10 759 case EM_M32C:
e9f53129
AM
760 case EM_M32R:
761 case EM_MCORE:
15ab5209 762 case EM_CYGNUS_MEP:
a3c62988 763 case EM_METAG:
e9f53129
AM
764 case EM_MMIX:
765 case EM_MN10200:
766 case EM_CYGNUS_MN10200:
767 case EM_MN10300:
768 case EM_CYGNUS_MN10300:
5506d11a 769 case EM_MOXIE:
e9f53129
AM
770 case EM_MSP430:
771 case EM_MSP430_OLD:
d031aafb 772 case EM_MT:
35c08157 773 case EM_NDS32:
64fd6348 774 case EM_NIOS32:
73589c9d 775 case EM_OR1K:
e9f53129
AM
776 case EM_PPC64:
777 case EM_PPC:
99c513f6 778 case EM_RL78:
c7927a3c 779 case EM_RX:
e9f53129
AM
780 case EM_S390:
781 case EM_S390_OLD:
782 case EM_SH:
783 case EM_SPARC:
784 case EM_SPARC32PLUS:
785 case EM_SPARCV9:
786 case EM_SPU:
40b36596 787 case EM_TI_C6000:
aa137e4d
NC
788 case EM_TILEGX:
789 case EM_TILEPRO:
708e2187 790 case EM_V800:
e9f53129
AM
791 case EM_V850:
792 case EM_CYGNUS_V850:
793 case EM_VAX:
619ed720 794 case EM_VISIUM:
e9f53129 795 case EM_X86_64:
8a9036a4 796 case EM_L1OM:
7a9068fe 797 case EM_K1OM:
e9f53129
AM
798 case EM_XSTORMY16:
799 case EM_XTENSA:
800 case EM_XTENSA_OLD:
7ba29e2a
NC
801 case EM_MICROBLAZE:
802 case EM_MICROBLAZE_OLD:
9c19a809 803 return TRUE;
103f02d3 804
e9f53129
AM
805 case EM_68HC05:
806 case EM_68HC08:
807 case EM_68HC11:
808 case EM_68HC16:
809 case EM_FX66:
810 case EM_ME16:
d1133906 811 case EM_MMA:
d1133906
NC
812 case EM_NCPU:
813 case EM_NDR1:
e9f53129 814 case EM_PCP:
d1133906 815 case EM_ST100:
e9f53129 816 case EM_ST19:
d1133906 817 case EM_ST7:
e9f53129
AM
818 case EM_ST9PLUS:
819 case EM_STARCORE:
d1133906 820 case EM_SVX:
e9f53129 821 case EM_TINYJ:
9c19a809
NC
822 default:
823 warn (_("Don't know about relocations on this machine architecture\n"));
824 return FALSE;
825 }
826}
252b5132 827
9c19a809 828static int
2cf0635d 829slurp_rela_relocs (FILE * file,
d3ba0551
AM
830 unsigned long rel_offset,
831 unsigned long rel_size,
2cf0635d
NC
832 Elf_Internal_Rela ** relasp,
833 unsigned long * nrelasp)
9c19a809 834{
2cf0635d 835 Elf_Internal_Rela * relas;
8b73c356 836 size_t nrelas;
4d6ed7c8 837 unsigned int i;
252b5132 838
4d6ed7c8
NC
839 if (is_32bit_elf)
840 {
2cf0635d 841 Elf32_External_Rela * erelas;
103f02d3 842
3f5e193b 843 erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset, 1,
9cf03b7e 844 rel_size, _("32-bit relocation data"));
a6e9f9df
AM
845 if (!erelas)
846 return 0;
252b5132 847
4d6ed7c8 848 nrelas = rel_size / sizeof (Elf32_External_Rela);
103f02d3 849
3f5e193b
NC
850 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
851 sizeof (Elf_Internal_Rela));
103f02d3 852
4d6ed7c8
NC
853 if (relas == NULL)
854 {
c256ffe7 855 free (erelas);
591a748a 856 error (_("out of memory parsing relocs\n"));
4d6ed7c8
NC
857 return 0;
858 }
103f02d3 859
4d6ed7c8
NC
860 for (i = 0; i < nrelas; i++)
861 {
862 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
863 relas[i].r_info = BYTE_GET (erelas[i].r_info);
598aaa76 864 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
4d6ed7c8 865 }
103f02d3 866
4d6ed7c8
NC
867 free (erelas);
868 }
869 else
870 {
2cf0635d 871 Elf64_External_Rela * erelas;
103f02d3 872
3f5e193b 873 erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset, 1,
9cf03b7e 874 rel_size, _("64-bit relocation data"));
a6e9f9df
AM
875 if (!erelas)
876 return 0;
4d6ed7c8
NC
877
878 nrelas = rel_size / sizeof (Elf64_External_Rela);
103f02d3 879
3f5e193b
NC
880 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
881 sizeof (Elf_Internal_Rela));
103f02d3 882
4d6ed7c8
NC
883 if (relas == NULL)
884 {
c256ffe7 885 free (erelas);
591a748a 886 error (_("out of memory parsing relocs\n"));
4d6ed7c8 887 return 0;
9c19a809 888 }
4d6ed7c8
NC
889
890 for (i = 0; i < nrelas; i++)
9c19a809 891 {
66543521
AM
892 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
893 relas[i].r_info = BYTE_GET (erelas[i].r_info);
598aaa76 894 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
861fb55a
DJ
895
896 /* The #ifdef BFD64 below is to prevent a compile time
897 warning. We know that if we do not have a 64 bit data
898 type that we will never execute this code anyway. */
899#ifdef BFD64
900 if (elf_header.e_machine == EM_MIPS
901 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
902 {
903 /* In little-endian objects, r_info isn't really a
904 64-bit little-endian value: it has a 32-bit
905 little-endian symbol index followed by four
906 individual byte fields. Reorder INFO
907 accordingly. */
91d6fa6a
NC
908 bfd_vma inf = relas[i].r_info;
909 inf = (((inf & 0xffffffff) << 32)
910 | ((inf >> 56) & 0xff)
911 | ((inf >> 40) & 0xff00)
912 | ((inf >> 24) & 0xff0000)
913 | ((inf >> 8) & 0xff000000));
914 relas[i].r_info = inf;
861fb55a
DJ
915 }
916#endif /* BFD64 */
4d6ed7c8 917 }
103f02d3 918
4d6ed7c8
NC
919 free (erelas);
920 }
921 *relasp = relas;
922 *nrelasp = nrelas;
923 return 1;
924}
103f02d3 925
4d6ed7c8 926static int
2cf0635d 927slurp_rel_relocs (FILE * file,
d3ba0551
AM
928 unsigned long rel_offset,
929 unsigned long rel_size,
2cf0635d
NC
930 Elf_Internal_Rela ** relsp,
931 unsigned long * nrelsp)
4d6ed7c8 932{
2cf0635d 933 Elf_Internal_Rela * rels;
8b73c356 934 size_t nrels;
4d6ed7c8 935 unsigned int i;
103f02d3 936
4d6ed7c8
NC
937 if (is_32bit_elf)
938 {
2cf0635d 939 Elf32_External_Rel * erels;
103f02d3 940
3f5e193b 941 erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset, 1,
9cf03b7e 942 rel_size, _("32-bit relocation data"));
a6e9f9df
AM
943 if (!erels)
944 return 0;
103f02d3 945
4d6ed7c8 946 nrels = rel_size / sizeof (Elf32_External_Rel);
103f02d3 947
3f5e193b 948 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
103f02d3 949
4d6ed7c8
NC
950 if (rels == NULL)
951 {
c256ffe7 952 free (erels);
591a748a 953 error (_("out of memory parsing relocs\n"));
4d6ed7c8
NC
954 return 0;
955 }
956
957 for (i = 0; i < nrels; i++)
958 {
959 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
960 rels[i].r_info = BYTE_GET (erels[i].r_info);
c8286bd1 961 rels[i].r_addend = 0;
9ea033b2 962 }
4d6ed7c8
NC
963
964 free (erels);
9c19a809
NC
965 }
966 else
967 {
2cf0635d 968 Elf64_External_Rel * erels;
9ea033b2 969
3f5e193b 970 erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset, 1,
9cf03b7e 971 rel_size, _("64-bit relocation data"));
a6e9f9df
AM
972 if (!erels)
973 return 0;
103f02d3 974
4d6ed7c8 975 nrels = rel_size / sizeof (Elf64_External_Rel);
103f02d3 976
3f5e193b 977 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
103f02d3 978
4d6ed7c8 979 if (rels == NULL)
9c19a809 980 {
c256ffe7 981 free (erels);
591a748a 982 error (_("out of memory parsing relocs\n"));
4d6ed7c8
NC
983 return 0;
984 }
103f02d3 985
4d6ed7c8
NC
986 for (i = 0; i < nrels; i++)
987 {
66543521
AM
988 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
989 rels[i].r_info = BYTE_GET (erels[i].r_info);
c8286bd1 990 rels[i].r_addend = 0;
861fb55a
DJ
991
992 /* The #ifdef BFD64 below is to prevent a compile time
993 warning. We know that if we do not have a 64 bit data
994 type that we will never execute this code anyway. */
995#ifdef BFD64
996 if (elf_header.e_machine == EM_MIPS
997 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
998 {
999 /* In little-endian objects, r_info isn't really a
1000 64-bit little-endian value: it has a 32-bit
1001 little-endian symbol index followed by four
1002 individual byte fields. Reorder INFO
1003 accordingly. */
91d6fa6a
NC
1004 bfd_vma inf = rels[i].r_info;
1005 inf = (((inf & 0xffffffff) << 32)
1006 | ((inf >> 56) & 0xff)
1007 | ((inf >> 40) & 0xff00)
1008 | ((inf >> 24) & 0xff0000)
1009 | ((inf >> 8) & 0xff000000));
1010 rels[i].r_info = inf;
861fb55a
DJ
1011 }
1012#endif /* BFD64 */
4d6ed7c8 1013 }
103f02d3 1014
4d6ed7c8
NC
1015 free (erels);
1016 }
1017 *relsp = rels;
1018 *nrelsp = nrels;
1019 return 1;
1020}
103f02d3 1021
aca88567
NC
1022/* Returns the reloc type extracted from the reloc info field. */
1023
1024static unsigned int
1025get_reloc_type (bfd_vma reloc_info)
1026{
1027 if (is_32bit_elf)
1028 return ELF32_R_TYPE (reloc_info);
1029
1030 switch (elf_header.e_machine)
1031 {
1032 case EM_MIPS:
1033 /* Note: We assume that reloc_info has already been adjusted for us. */
1034 return ELF64_MIPS_R_TYPE (reloc_info);
1035
1036 case EM_SPARCV9:
1037 return ELF64_R_TYPE_ID (reloc_info);
1038
1039 default:
1040 return ELF64_R_TYPE (reloc_info);
1041 }
1042}
1043
1044/* Return the symbol index extracted from the reloc info field. */
1045
1046static bfd_vma
1047get_reloc_symindex (bfd_vma reloc_info)
1048{
1049 return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
1050}
1051
13761a11
NC
1052static inline bfd_boolean
1053uses_msp430x_relocs (void)
1054{
1055 return
1056 elf_header.e_machine == EM_MSP430 /* Paranoia. */
1057 /* GCC uses osabi == ELFOSBI_STANDALONE. */
1058 && (((elf_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
1059 /* TI compiler uses ELFOSABI_NONE. */
1060 || (elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
1061}
1062
d3ba0551
AM
1063/* Display the contents of the relocation data found at the specified
1064 offset. */
ee42cf8c 1065
41e92641 1066static void
2cf0635d 1067dump_relocations (FILE * file,
d3ba0551
AM
1068 unsigned long rel_offset,
1069 unsigned long rel_size,
2cf0635d 1070 Elf_Internal_Sym * symtab,
d3ba0551 1071 unsigned long nsyms,
2cf0635d 1072 char * strtab,
d79b3d50 1073 unsigned long strtablen,
bb4d2ac2
L
1074 int is_rela,
1075 int is_dynsym)
4d6ed7c8 1076{
b34976b6 1077 unsigned int i;
2cf0635d 1078 Elf_Internal_Rela * rels;
103f02d3 1079
4d6ed7c8
NC
1080 if (is_rela == UNKNOWN)
1081 is_rela = guess_is_rela (elf_header.e_machine);
103f02d3 1082
4d6ed7c8
NC
1083 if (is_rela)
1084 {
c8286bd1 1085 if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
41e92641 1086 return;
4d6ed7c8
NC
1087 }
1088 else
1089 {
1090 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
41e92641 1091 return;
252b5132
RH
1092 }
1093
410f7a12
L
1094 if (is_32bit_elf)
1095 {
1096 if (is_rela)
2c71103e
NC
1097 {
1098 if (do_wide)
1099 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
1100 else
1101 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
1102 }
410f7a12 1103 else
2c71103e
NC
1104 {
1105 if (do_wide)
1106 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
1107 else
1108 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
1109 }
410f7a12 1110 }
252b5132 1111 else
410f7a12
L
1112 {
1113 if (is_rela)
2c71103e
NC
1114 {
1115 if (do_wide)
8beeaeb7 1116 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
2c71103e
NC
1117 else
1118 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
1119 }
410f7a12 1120 else
2c71103e
NC
1121 {
1122 if (do_wide)
8beeaeb7 1123 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
2c71103e
NC
1124 else
1125 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
1126 }
410f7a12 1127 }
252b5132
RH
1128
1129 for (i = 0; i < rel_size; i++)
1130 {
2cf0635d 1131 const char * rtype;
b34976b6 1132 bfd_vma offset;
91d6fa6a 1133 bfd_vma inf;
b34976b6
AM
1134 bfd_vma symtab_index;
1135 bfd_vma type;
103f02d3 1136
b34976b6 1137 offset = rels[i].r_offset;
91d6fa6a 1138 inf = rels[i].r_info;
103f02d3 1139
91d6fa6a
NC
1140 type = get_reloc_type (inf);
1141 symtab_index = get_reloc_symindex (inf);
252b5132 1142
410f7a12
L
1143 if (is_32bit_elf)
1144 {
39dbeff8
AM
1145 printf ("%8.8lx %8.8lx ",
1146 (unsigned long) offset & 0xffffffff,
91d6fa6a 1147 (unsigned long) inf & 0xffffffff);
410f7a12
L
1148 }
1149 else
1150 {
39dbeff8
AM
1151#if BFD_HOST_64BIT_LONG
1152 printf (do_wide
1153 ? "%16.16lx %16.16lx "
1154 : "%12.12lx %12.12lx ",
91d6fa6a 1155 offset, inf);
39dbeff8 1156#elif BFD_HOST_64BIT_LONG_LONG
6e3d6dc1 1157#ifndef __MSVCRT__
39dbeff8
AM
1158 printf (do_wide
1159 ? "%16.16llx %16.16llx "
1160 : "%12.12llx %12.12llx ",
91d6fa6a 1161 offset, inf);
6e3d6dc1
NC
1162#else
1163 printf (do_wide
1164 ? "%16.16I64x %16.16I64x "
1165 : "%12.12I64x %12.12I64x ",
91d6fa6a 1166 offset, inf);
6e3d6dc1 1167#endif
39dbeff8 1168#else
2c71103e
NC
1169 printf (do_wide
1170 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1171 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
410f7a12
L
1172 _bfd_int64_high (offset),
1173 _bfd_int64_low (offset),
91d6fa6a
NC
1174 _bfd_int64_high (inf),
1175 _bfd_int64_low (inf));
9ea033b2 1176#endif
410f7a12 1177 }
103f02d3 1178
252b5132
RH
1179 switch (elf_header.e_machine)
1180 {
1181 default:
1182 rtype = NULL;
1183 break;
1184
a06ea964
NC
1185 case EM_AARCH64:
1186 rtype = elf_aarch64_reloc_type (type);
1187 break;
1188
2b0337b0 1189 case EM_M32R:
252b5132 1190 case EM_CYGNUS_M32R:
9ea033b2 1191 rtype = elf_m32r_reloc_type (type);
252b5132
RH
1192 break;
1193
1194 case EM_386:
22abe556 1195 case EM_IAMCU:
9ea033b2 1196 rtype = elf_i386_reloc_type (type);
252b5132
RH
1197 break;
1198
ba2685cc
AM
1199 case EM_68HC11:
1200 case EM_68HC12:
1201 rtype = elf_m68hc11_reloc_type (type);
1202 break;
75751cd9 1203
252b5132 1204 case EM_68K:
9ea033b2 1205 rtype = elf_m68k_reloc_type (type);
252b5132
RH
1206 break;
1207
63fcb9e9 1208 case EM_960:
9ea033b2 1209 rtype = elf_i960_reloc_type (type);
63fcb9e9
ILT
1210 break;
1211
adde6300 1212 case EM_AVR:
2b0337b0 1213 case EM_AVR_OLD:
adde6300
AM
1214 rtype = elf_avr_reloc_type (type);
1215 break;
1216
9ea033b2
NC
1217 case EM_OLD_SPARCV9:
1218 case EM_SPARC32PLUS:
1219 case EM_SPARCV9:
252b5132 1220 case EM_SPARC:
9ea033b2 1221 rtype = elf_sparc_reloc_type (type);
252b5132
RH
1222 break;
1223
e9f53129
AM
1224 case EM_SPU:
1225 rtype = elf_spu_reloc_type (type);
1226 break;
1227
708e2187
NC
1228 case EM_V800:
1229 rtype = v800_reloc_type (type);
1230 break;
2b0337b0 1231 case EM_V850:
252b5132 1232 case EM_CYGNUS_V850:
9ea033b2 1233 rtype = v850_reloc_type (type);
252b5132
RH
1234 break;
1235
2b0337b0 1236 case EM_D10V:
252b5132 1237 case EM_CYGNUS_D10V:
9ea033b2 1238 rtype = elf_d10v_reloc_type (type);
252b5132
RH
1239 break;
1240
2b0337b0 1241 case EM_D30V:
252b5132 1242 case EM_CYGNUS_D30V:
9ea033b2 1243 rtype = elf_d30v_reloc_type (type);
252b5132
RH
1244 break;
1245
d172d4ba
NC
1246 case EM_DLX:
1247 rtype = elf_dlx_reloc_type (type);
1248 break;
1249
252b5132 1250 case EM_SH:
9ea033b2 1251 rtype = elf_sh_reloc_type (type);
252b5132
RH
1252 break;
1253
2b0337b0 1254 case EM_MN10300:
252b5132 1255 case EM_CYGNUS_MN10300:
9ea033b2 1256 rtype = elf_mn10300_reloc_type (type);
252b5132
RH
1257 break;
1258
2b0337b0 1259 case EM_MN10200:
252b5132 1260 case EM_CYGNUS_MN10200:
9ea033b2 1261 rtype = elf_mn10200_reloc_type (type);
252b5132
RH
1262 break;
1263
2b0337b0 1264 case EM_FR30:
252b5132 1265 case EM_CYGNUS_FR30:
9ea033b2 1266 rtype = elf_fr30_reloc_type (type);
252b5132
RH
1267 break;
1268
ba2685cc
AM
1269 case EM_CYGNUS_FRV:
1270 rtype = elf_frv_reloc_type (type);
1271 break;
5c70f934 1272
3f8107ab
AM
1273 case EM_FT32:
1274 rtype = elf_ft32_reloc_type (type);
1275 break;
1276
252b5132 1277 case EM_MCORE:
9ea033b2 1278 rtype = elf_mcore_reloc_type (type);
252b5132
RH
1279 break;
1280
3c3bdf30
NC
1281 case EM_MMIX:
1282 rtype = elf_mmix_reloc_type (type);
1283 break;
1284
5506d11a
AM
1285 case EM_MOXIE:
1286 rtype = elf_moxie_reloc_type (type);
1287 break;
1288
2469cfa2 1289 case EM_MSP430:
13761a11
NC
1290 if (uses_msp430x_relocs ())
1291 {
1292 rtype = elf_msp430x_reloc_type (type);
1293 break;
1294 }
2469cfa2
NC
1295 case EM_MSP430_OLD:
1296 rtype = elf_msp430_reloc_type (type);
1297 break;
1298
35c08157
KLC
1299 case EM_NDS32:
1300 rtype = elf_nds32_reloc_type (type);
1301 break;
1302
252b5132 1303 case EM_PPC:
9ea033b2 1304 rtype = elf_ppc_reloc_type (type);
252b5132
RH
1305 break;
1306
c833c019
AM
1307 case EM_PPC64:
1308 rtype = elf_ppc64_reloc_type (type);
1309 break;
1310
252b5132 1311 case EM_MIPS:
4fe85591 1312 case EM_MIPS_RS3_LE:
9ea033b2 1313 rtype = elf_mips_reloc_type (type);
252b5132
RH
1314 break;
1315
1316 case EM_ALPHA:
9ea033b2 1317 rtype = elf_alpha_reloc_type (type);
252b5132
RH
1318 break;
1319
1320 case EM_ARM:
9ea033b2 1321 rtype = elf_arm_reloc_type (type);
252b5132
RH
1322 break;
1323
584da044 1324 case EM_ARC:
886a2506
NC
1325 case EM_ARC_COMPACT:
1326 case EM_ARC_COMPACT2:
9ea033b2 1327 rtype = elf_arc_reloc_type (type);
252b5132
RH
1328 break;
1329
1330 case EM_PARISC:
69e617ca 1331 rtype = elf_hppa_reloc_type (type);
252b5132 1332 break;
7d466069 1333
b8720f9d
JL
1334 case EM_H8_300:
1335 case EM_H8_300H:
1336 case EM_H8S:
1337 rtype = elf_h8_reloc_type (type);
1338 break;
1339
73589c9d
CS
1340 case EM_OR1K:
1341 rtype = elf_or1k_reloc_type (type);
3b16e843
NC
1342 break;
1343
7d466069 1344 case EM_PJ:
2b0337b0 1345 case EM_PJ_OLD:
7d466069
ILT
1346 rtype = elf_pj_reloc_type (type);
1347 break;
800eeca4
JW
1348 case EM_IA_64:
1349 rtype = elf_ia64_reloc_type (type);
1350 break;
1b61cf92
HPN
1351
1352 case EM_CRIS:
1353 rtype = elf_cris_reloc_type (type);
1354 break;
535c37ff
JE
1355
1356 case EM_860:
1357 rtype = elf_i860_reloc_type (type);
1358 break;
bcedfee6
NC
1359
1360 case EM_X86_64:
8a9036a4 1361 case EM_L1OM:
7a9068fe 1362 case EM_K1OM:
bcedfee6
NC
1363 rtype = elf_x86_64_reloc_type (type);
1364 break;
a85d7ed0 1365
35b1837e
AM
1366 case EM_S370:
1367 rtype = i370_reloc_type (type);
1368 break;
1369
53c7db4b
KH
1370 case EM_S390_OLD:
1371 case EM_S390:
1372 rtype = elf_s390_reloc_type (type);
1373 break;
93fbbb04 1374
1c0d3aa6
NC
1375 case EM_SCORE:
1376 rtype = elf_score_reloc_type (type);
1377 break;
1378
93fbbb04
GK
1379 case EM_XSTORMY16:
1380 rtype = elf_xstormy16_reloc_type (type);
1381 break;
179d3252 1382
1fe1f39c
NC
1383 case EM_CRX:
1384 rtype = elf_crx_reloc_type (type);
1385 break;
1386
179d3252
JT
1387 case EM_VAX:
1388 rtype = elf_vax_reloc_type (type);
1389 break;
1e4cf259 1390
619ed720
EB
1391 case EM_VISIUM:
1392 rtype = elf_visium_reloc_type (type);
1393 break;
1394
cfb8c092
NC
1395 case EM_ADAPTEVA_EPIPHANY:
1396 rtype = elf_epiphany_reloc_type (type);
1397 break;
1398
1e4cf259
NC
1399 case EM_IP2K:
1400 case EM_IP2K_OLD:
1401 rtype = elf_ip2k_reloc_type (type);
1402 break;
3b36097d
SC
1403
1404 case EM_IQ2000:
1405 rtype = elf_iq2000_reloc_type (type);
1406 break;
88da6820
NC
1407
1408 case EM_XTENSA_OLD:
1409 case EM_XTENSA:
1410 rtype = elf_xtensa_reloc_type (type);
1411 break;
a34e3ecb 1412
84e94c90
NC
1413 case EM_LATTICEMICO32:
1414 rtype = elf_lm32_reloc_type (type);
1415 break;
1416
ff7eeb89 1417 case EM_M32C_OLD:
49f58d10
JB
1418 case EM_M32C:
1419 rtype = elf_m32c_reloc_type (type);
1420 break;
1421
d031aafb
NS
1422 case EM_MT:
1423 rtype = elf_mt_reloc_type (type);
a34e3ecb 1424 break;
1d65ded4
CM
1425
1426 case EM_BLACKFIN:
1427 rtype = elf_bfin_reloc_type (type);
1428 break;
15ab5209
DB
1429
1430 case EM_CYGNUS_MEP:
1431 rtype = elf_mep_reloc_type (type);
1432 break;
60bca95a
NC
1433
1434 case EM_CR16:
1435 rtype = elf_cr16_reloc_type (type);
1436 break;
dd24e3da 1437
7ba29e2a
NC
1438 case EM_MICROBLAZE:
1439 case EM_MICROBLAZE_OLD:
1440 rtype = elf_microblaze_reloc_type (type);
1441 break;
c7927a3c 1442
99c513f6
DD
1443 case EM_RL78:
1444 rtype = elf_rl78_reloc_type (type);
1445 break;
1446
c7927a3c
NC
1447 case EM_RX:
1448 rtype = elf_rx_reloc_type (type);
1449 break;
c29aca4a 1450
a3c62988
NC
1451 case EM_METAG:
1452 rtype = elf_metag_reloc_type (type);
1453 break;
1454
c29aca4a
NC
1455 case EM_XC16X:
1456 case EM_C166:
1457 rtype = elf_xc16x_reloc_type (type);
1458 break;
40b36596
JM
1459
1460 case EM_TI_C6000:
1461 rtype = elf_tic6x_reloc_type (type);
1462 break;
aa137e4d
NC
1463
1464 case EM_TILEGX:
1465 rtype = elf_tilegx_reloc_type (type);
1466 break;
1467
1468 case EM_TILEPRO:
1469 rtype = elf_tilepro_reloc_type (type);
1470 break;
f6c1a2d5
NC
1471
1472 case EM_XGATE:
1473 rtype = elf_xgate_reloc_type (type);
1474 break;
36591ba1
SL
1475
1476 case EM_ALTERA_NIOS2:
1477 rtype = elf_nios2_reloc_type (type);
1478 break;
252b5132
RH
1479 }
1480
1481 if (rtype == NULL)
39dbeff8 1482 printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
252b5132 1483 else
8beeaeb7 1484 printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
252b5132 1485
7ace3541 1486 if (elf_header.e_machine == EM_ALPHA
157c2599 1487 && rtype != NULL
7ace3541
RH
1488 && streq (rtype, "R_ALPHA_LITUSE")
1489 && is_rela)
1490 {
1491 switch (rels[i].r_addend)
1492 {
1493 case LITUSE_ALPHA_ADDR: rtype = "ADDR"; break;
1494 case LITUSE_ALPHA_BASE: rtype = "BASE"; break;
1495 case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1496 case LITUSE_ALPHA_JSR: rtype = "JSR"; break;
1497 case LITUSE_ALPHA_TLSGD: rtype = "TLSGD"; break;
1498 case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1499 case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1500 default: rtype = NULL;
1501 }
1502 if (rtype)
1503 printf (" (%s)", rtype);
1504 else
1505 {
1506 putchar (' ');
1507 printf (_("<unknown addend: %lx>"),
1508 (unsigned long) rels[i].r_addend);
1509 }
1510 }
1511 else if (symtab_index)
252b5132 1512 {
af3fc3bc 1513 if (symtab == NULL || symtab_index >= nsyms)
2b692964 1514 printf (_(" bad symbol index: %08lx"), (unsigned long) symtab_index);
af3fc3bc 1515 else
19936277 1516 {
2cf0635d 1517 Elf_Internal_Sym * psym;
bb4d2ac2
L
1518 const char * version_string;
1519 enum versioned_symbol_info sym_info;
1520 unsigned short vna_other;
19936277 1521
af3fc3bc 1522 psym = symtab + symtab_index;
103f02d3 1523
bb4d2ac2
L
1524 version_string
1525 = get_symbol_version_string (file, is_dynsym,
1526 strtab, strtablen,
1527 symtab_index,
1528 psym,
1529 &sym_info,
1530 &vna_other);
1531
af3fc3bc 1532 printf (" ");
171191ba 1533
d8045f23
NC
1534 if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1535 {
1536 const char * name;
1537 unsigned int len;
1538 unsigned int width = is_32bit_elf ? 8 : 14;
1539
1540 /* Relocations against GNU_IFUNC symbols do not use the value
1541 of the symbol as the address to relocate against. Instead
1542 they invoke the function named by the symbol and use its
1543 result as the address for relocation.
1544
1545 To indicate this to the user, do not display the value of
1546 the symbol in the "Symbols's Value" field. Instead show
1547 its name followed by () as a hint that the symbol is
1548 invoked. */
1549
1550 if (strtab == NULL
1551 || psym->st_name == 0
1552 || psym->st_name >= strtablen)
1553 name = "??";
1554 else
1555 name = strtab + psym->st_name;
1556
1557 len = print_symbol (width, name);
bb4d2ac2
L
1558 if (version_string)
1559 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1560 version_string);
d8045f23
NC
1561 printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1562 }
1563 else
1564 {
1565 print_vma (psym->st_value, LONG_HEX);
171191ba 1566
d8045f23
NC
1567 printf (is_32bit_elf ? " " : " ");
1568 }
103f02d3 1569
af3fc3bc 1570 if (psym->st_name == 0)
f1ef08cb 1571 {
2cf0635d 1572 const char * sec_name = "<null>";
f1ef08cb
AM
1573 char name_buf[40];
1574
1575 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1576 {
4fbb74a6 1577 if (psym->st_shndx < elf_header.e_shnum)
74e1a04b 1578 sec_name = SECTION_NAME (section_headers + psym->st_shndx);
f1ef08cb
AM
1579 else if (psym->st_shndx == SHN_ABS)
1580 sec_name = "ABS";
1581 else if (psym->st_shndx == SHN_COMMON)
1582 sec_name = "COMMON";
ac145307
BS
1583 else if ((elf_header.e_machine == EM_MIPS
1584 && psym->st_shndx == SHN_MIPS_SCOMMON)
1585 || (elf_header.e_machine == EM_TI_C6000
1586 && psym->st_shndx == SHN_TIC6X_SCOMMON))
172553c7
TS
1587 sec_name = "SCOMMON";
1588 else if (elf_header.e_machine == EM_MIPS
1589 && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1590 sec_name = "SUNDEF";
8a9036a4 1591 else if ((elf_header.e_machine == EM_X86_64
7a9068fe
L
1592 || elf_header.e_machine == EM_L1OM
1593 || elf_header.e_machine == EM_K1OM)
3b22753a
L
1594 && psym->st_shndx == SHN_X86_64_LCOMMON)
1595 sec_name = "LARGE_COMMON";
9ce701e2
L
1596 else if (elf_header.e_machine == EM_IA_64
1597 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1598 && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1599 sec_name = "ANSI_COM";
28f997cf 1600 else if (is_ia64_vms ()
148b93f2
NC
1601 && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1602 sec_name = "VMS_SYMVEC";
f1ef08cb
AM
1603 else
1604 {
1605 sprintf (name_buf, "<section 0x%x>",
1606 (unsigned int) psym->st_shndx);
1607 sec_name = name_buf;
1608 }
1609 }
1610 print_symbol (22, sec_name);
1611 }
af3fc3bc 1612 else if (strtab == NULL)
d79b3d50 1613 printf (_("<string table index: %3ld>"), psym->st_name);
c256ffe7 1614 else if (psym->st_name >= strtablen)
d79b3d50 1615 printf (_("<corrupt string table index: %3ld>"), psym->st_name);
af3fc3bc 1616 else
bb4d2ac2
L
1617 {
1618 print_symbol (22, strtab + psym->st_name);
1619 if (version_string)
1620 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1621 version_string);
1622 }
103f02d3 1623
af3fc3bc 1624 if (is_rela)
171191ba 1625 {
7360e63f 1626 bfd_vma off = rels[i].r_addend;
171191ba 1627
7360e63f 1628 if ((bfd_signed_vma) off < 0)
598aaa76 1629 printf (" - %" BFD_VMA_FMT "x", - off);
171191ba 1630 else
598aaa76 1631 printf (" + %" BFD_VMA_FMT "x", off);
171191ba 1632 }
19936277 1633 }
252b5132 1634 }
1b228002 1635 else if (is_rela)
f7a99963 1636 {
7360e63f 1637 bfd_vma off = rels[i].r_addend;
e04d7088
L
1638
1639 printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
7360e63f 1640 if ((bfd_signed_vma) off < 0)
e04d7088
L
1641 printf ("-%" BFD_VMA_FMT "x", - off);
1642 else
1643 printf ("%" BFD_VMA_FMT "x", off);
f7a99963 1644 }
252b5132 1645
157c2599
NC
1646 if (elf_header.e_machine == EM_SPARCV9
1647 && rtype != NULL
1648 && streq (rtype, "R_SPARC_OLO10"))
91d6fa6a 1649 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
351b4b40 1650
252b5132 1651 putchar ('\n');
2c71103e 1652
aca88567 1653#ifdef BFD64
53c7db4b 1654 if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
2c71103e 1655 {
91d6fa6a
NC
1656 bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1657 bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
2cf0635d
NC
1658 const char * rtype2 = elf_mips_reloc_type (type2);
1659 const char * rtype3 = elf_mips_reloc_type (type3);
aca88567 1660
2c71103e
NC
1661 printf (" Type2: ");
1662
1663 if (rtype2 == NULL)
39dbeff8
AM
1664 printf (_("unrecognized: %-7lx"),
1665 (unsigned long) type2 & 0xffffffff);
2c71103e
NC
1666 else
1667 printf ("%-17.17s", rtype2);
1668
18bd398b 1669 printf ("\n Type3: ");
2c71103e
NC
1670
1671 if (rtype3 == NULL)
39dbeff8
AM
1672 printf (_("unrecognized: %-7lx"),
1673 (unsigned long) type3 & 0xffffffff);
2c71103e
NC
1674 else
1675 printf ("%-17.17s", rtype3);
1676
53c7db4b 1677 putchar ('\n');
2c71103e 1678 }
aca88567 1679#endif /* BFD64 */
252b5132
RH
1680 }
1681
c8286bd1 1682 free (rels);
252b5132
RH
1683}
1684
1685static const char *
d3ba0551 1686get_mips_dynamic_type (unsigned long type)
252b5132
RH
1687{
1688 switch (type)
1689 {
1690 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1691 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1692 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1693 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1694 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1695 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1696 case DT_MIPS_MSYM: return "MIPS_MSYM";
1697 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1698 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1699 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1700 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1701 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1702 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1703 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1704 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1705 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1706 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
a5499fa4 1707 case DT_MIPS_RLD_MAP_REL: return "MIPS_RLD_MAP_REL";
252b5132
RH
1708 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1709 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1710 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1711 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1712 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1713 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1714 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1715 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1716 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1717 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1718 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1719 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1720 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1721 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1722 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1723 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1724 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1725 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1726 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1727 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1728 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1729 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1730 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1731 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1732 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1733 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
861fb55a
DJ
1734 case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1735 case DT_MIPS_RWPLT: return "MIPS_RWPLT";
252b5132
RH
1736 default:
1737 return NULL;
1738 }
1739}
1740
9a097730 1741static const char *
d3ba0551 1742get_sparc64_dynamic_type (unsigned long type)
9a097730
RH
1743{
1744 switch (type)
1745 {
1746 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1747 default:
1748 return NULL;
1749 }
103f02d3
UD
1750}
1751
7490d522
AM
1752static const char *
1753get_ppc_dynamic_type (unsigned long type)
1754{
1755 switch (type)
1756 {
a7f2871e 1757 case DT_PPC_GOT: return "PPC_GOT";
e8910a83 1758 case DT_PPC_OPT: return "PPC_OPT";
7490d522
AM
1759 default:
1760 return NULL;
1761 }
1762}
1763
f1cb7e17 1764static const char *
d3ba0551 1765get_ppc64_dynamic_type (unsigned long type)
f1cb7e17
AM
1766{
1767 switch (type)
1768 {
a7f2871e
AM
1769 case DT_PPC64_GLINK: return "PPC64_GLINK";
1770 case DT_PPC64_OPD: return "PPC64_OPD";
1771 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
e8910a83 1772 case DT_PPC64_OPT: return "PPC64_OPT";
f1cb7e17
AM
1773 default:
1774 return NULL;
1775 }
1776}
1777
103f02d3 1778static const char *
d3ba0551 1779get_parisc_dynamic_type (unsigned long type)
103f02d3
UD
1780{
1781 switch (type)
1782 {
1783 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1784 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1785 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1786 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1787 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1788 case DT_HP_PREINIT: return "HP_PREINIT";
1789 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1790 case DT_HP_NEEDED: return "HP_NEEDED";
1791 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1792 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1793 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1794 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1795 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
eec8f817
DA
1796 case DT_HP_EPLTREL: return "HP_GST_EPLTREL";
1797 case DT_HP_EPLTRELSZ: return "HP_GST_EPLTRELSZ";
1798 case DT_HP_FILTERED: return "HP_FILTERED";
1799 case DT_HP_FILTER_TLS: return "HP_FILTER_TLS";
1800 case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1801 case DT_HP_LAZYLOAD: return "HP_LAZYLOAD";
1802 case DT_HP_BIND_NOW_COUNT: return "HP_BIND_NOW_COUNT";
1803 case DT_PLT: return "PLT";
1804 case DT_PLT_SIZE: return "PLT_SIZE";
1805 case DT_DLT: return "DLT";
1806 case DT_DLT_SIZE: return "DLT_SIZE";
103f02d3
UD
1807 default:
1808 return NULL;
1809 }
1810}
9a097730 1811
ecc51f48 1812static const char *
d3ba0551 1813get_ia64_dynamic_type (unsigned long type)
ecc51f48
NC
1814{
1815 switch (type)
1816 {
148b93f2
NC
1817 case DT_IA_64_PLT_RESERVE: return "IA_64_PLT_RESERVE";
1818 case DT_IA_64_VMS_SUBTYPE: return "VMS_SUBTYPE";
1819 case DT_IA_64_VMS_IMGIOCNT: return "VMS_IMGIOCNT";
1820 case DT_IA_64_VMS_LNKFLAGS: return "VMS_LNKFLAGS";
1821 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1822 case DT_IA_64_VMS_IDENT: return "VMS_IDENT";
1823 case DT_IA_64_VMS_NEEDED_IDENT: return "VMS_NEEDED_IDENT";
1824 case DT_IA_64_VMS_IMG_RELA_CNT: return "VMS_IMG_RELA_CNT";
1825 case DT_IA_64_VMS_SEG_RELA_CNT: return "VMS_SEG_RELA_CNT";
1826 case DT_IA_64_VMS_FIXUP_RELA_CNT: return "VMS_FIXUP_RELA_CNT";
1827 case DT_IA_64_VMS_FIXUP_NEEDED: return "VMS_FIXUP_NEEDED";
1828 case DT_IA_64_VMS_SYMVEC_CNT: return "VMS_SYMVEC_CNT";
1829 case DT_IA_64_VMS_XLATED: return "VMS_XLATED";
1830 case DT_IA_64_VMS_STACKSIZE: return "VMS_STACKSIZE";
1831 case DT_IA_64_VMS_UNWINDSZ: return "VMS_UNWINDSZ";
1832 case DT_IA_64_VMS_UNWIND_CODSEG: return "VMS_UNWIND_CODSEG";
1833 case DT_IA_64_VMS_UNWIND_INFOSEG: return "VMS_UNWIND_INFOSEG";
1834 case DT_IA_64_VMS_LINKTIME: return "VMS_LINKTIME";
1835 case DT_IA_64_VMS_SEG_NO: return "VMS_SEG_NO";
1836 case DT_IA_64_VMS_SYMVEC_OFFSET: return "VMS_SYMVEC_OFFSET";
1837 case DT_IA_64_VMS_SYMVEC_SEG: return "VMS_SYMVEC_SEG";
1838 case DT_IA_64_VMS_UNWIND_OFFSET: return "VMS_UNWIND_OFFSET";
1839 case DT_IA_64_VMS_UNWIND_SEG: return "VMS_UNWIND_SEG";
1840 case DT_IA_64_VMS_STRTAB_OFFSET: return "VMS_STRTAB_OFFSET";
1841 case DT_IA_64_VMS_SYSVER_OFFSET: return "VMS_SYSVER_OFFSET";
1842 case DT_IA_64_VMS_IMG_RELA_OFF: return "VMS_IMG_RELA_OFF";
1843 case DT_IA_64_VMS_SEG_RELA_OFF: return "VMS_SEG_RELA_OFF";
1844 case DT_IA_64_VMS_FIXUP_RELA_OFF: return "VMS_FIXUP_RELA_OFF";
1845 case DT_IA_64_VMS_PLTGOT_OFFSET: return "VMS_PLTGOT_OFFSET";
1846 case DT_IA_64_VMS_PLTGOT_SEG: return "VMS_PLTGOT_SEG";
1847 case DT_IA_64_VMS_FPMODE: return "VMS_FPMODE";
ecc51f48
NC
1848 default:
1849 return NULL;
1850 }
1851}
1852
fd85a6a1
NC
1853static const char *
1854get_solaris_section_type (unsigned long type)
1855{
1856 switch (type)
1857 {
1858 case 0x6fffffee: return "SUNW_ancillary";
1859 case 0x6fffffef: return "SUNW_capchain";
1860 case 0x6ffffff0: return "SUNW_capinfo";
1861 case 0x6ffffff1: return "SUNW_symsort";
1862 case 0x6ffffff2: return "SUNW_tlssort";
1863 case 0x6ffffff3: return "SUNW_LDYNSYM";
1864 case 0x6ffffff4: return "SUNW_dof";
1865 case 0x6ffffff5: return "SUNW_cap";
1866 case 0x6ffffff6: return "SUNW_SIGNATURE";
1867 case 0x6ffffff7: return "SUNW_ANNOTATE";
1868 case 0x6ffffff8: return "SUNW_DEBUGSTR";
1869 case 0x6ffffff9: return "SUNW_DEBUG";
1870 case 0x6ffffffa: return "SUNW_move";
1871 case 0x6ffffffb: return "SUNW_COMDAT";
1872 case 0x6ffffffc: return "SUNW_syminfo";
1873 case 0x6ffffffd: return "SUNW_verdef";
1874 case 0x6ffffffe: return "SUNW_verneed";
1875 case 0x6fffffff: return "SUNW_versym";
1876 case 0x70000000: return "SPARC_GOTDATA";
1877 default: return NULL;
1878 }
1879}
1880
fabcb361
RH
1881static const char *
1882get_alpha_dynamic_type (unsigned long type)
1883{
1884 switch (type)
1885 {
1886 case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1887 default:
1888 return NULL;
1889 }
1890}
1891
1c0d3aa6
NC
1892static const char *
1893get_score_dynamic_type (unsigned long type)
1894{
1895 switch (type)
1896 {
1897 case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1898 case DT_SCORE_LOCAL_GOTNO: return "SCORE_LOCAL_GOTNO";
1899 case DT_SCORE_SYMTABNO: return "SCORE_SYMTABNO";
1900 case DT_SCORE_GOTSYM: return "SCORE_GOTSYM";
1901 case DT_SCORE_UNREFEXTNO: return "SCORE_UNREFEXTNO";
1902 case DT_SCORE_HIPAGENO: return "SCORE_HIPAGENO";
1903 default:
1904 return NULL;
1905 }
1906}
1907
40b36596
JM
1908static const char *
1909get_tic6x_dynamic_type (unsigned long type)
1910{
1911 switch (type)
1912 {
1913 case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1914 case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1915 case DT_C6000_DSBT_BASE: return "C6000_DSBT_BASE";
1916 case DT_C6000_DSBT_SIZE: return "C6000_DSBT_SIZE";
1917 case DT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
1918 case DT_C6000_DSBT_INDEX: return "C6000_DSBT_INDEX";
1919 default:
1920 return NULL;
1921 }
1922}
1c0d3aa6 1923
36591ba1
SL
1924static const char *
1925get_nios2_dynamic_type (unsigned long type)
1926{
1927 switch (type)
1928 {
1929 case DT_NIOS2_GP: return "NIOS2_GP";
1930 default:
1931 return NULL;
1932 }
1933}
1934
fd85a6a1
NC
1935static const char *
1936get_solaris_dynamic_type (unsigned long type)
1937{
1938 switch (type)
1939 {
1940 case 0x6000000d: return "SUNW_AUXILIARY";
1941 case 0x6000000e: return "SUNW_RTLDINF";
1942 case 0x6000000f: return "SUNW_FILTER";
1943 case 0x60000010: return "SUNW_CAP";
1944 case 0x60000011: return "SUNW_SYMTAB";
1945 case 0x60000012: return "SUNW_SYMSZ";
1946 case 0x60000013: return "SUNW_SORTENT";
1947 case 0x60000014: return "SUNW_SYMSORT";
1948 case 0x60000015: return "SUNW_SYMSORTSZ";
1949 case 0x60000016: return "SUNW_TLSSORT";
1950 case 0x60000017: return "SUNW_TLSSORTSZ";
1951 case 0x60000018: return "SUNW_CAPINFO";
1952 case 0x60000019: return "SUNW_STRPAD";
1953 case 0x6000001a: return "SUNW_CAPCHAIN";
1954 case 0x6000001b: return "SUNW_LDMACH";
1955 case 0x6000001d: return "SUNW_CAPCHAINENT";
1956 case 0x6000001f: return "SUNW_CAPCHAINSZ";
1957 case 0x60000021: return "SUNW_PARENT";
1958 case 0x60000023: return "SUNW_ASLR";
1959 case 0x60000025: return "SUNW_RELAX";
1960 case 0x60000029: return "SUNW_NXHEAP";
1961 case 0x6000002b: return "SUNW_NXSTACK";
1962
1963 case 0x70000001: return "SPARC_REGISTER";
1964 case 0x7ffffffd: return "AUXILIARY";
1965 case 0x7ffffffe: return "USED";
1966 case 0x7fffffff: return "FILTER";
1967
1968 default: return NULL;
1969 }
1970}
1971
252b5132 1972static const char *
d3ba0551 1973get_dynamic_type (unsigned long type)
252b5132 1974{
e9e44622 1975 static char buff[64];
252b5132
RH
1976
1977 switch (type)
1978 {
1979 case DT_NULL: return "NULL";
1980 case DT_NEEDED: return "NEEDED";
1981 case DT_PLTRELSZ: return "PLTRELSZ";
1982 case DT_PLTGOT: return "PLTGOT";
1983 case DT_HASH: return "HASH";
1984 case DT_STRTAB: return "STRTAB";
1985 case DT_SYMTAB: return "SYMTAB";
1986 case DT_RELA: return "RELA";
1987 case DT_RELASZ: return "RELASZ";
1988 case DT_RELAENT: return "RELAENT";
1989 case DT_STRSZ: return "STRSZ";
1990 case DT_SYMENT: return "SYMENT";
1991 case DT_INIT: return "INIT";
1992 case DT_FINI: return "FINI";
1993 case DT_SONAME: return "SONAME";
1994 case DT_RPATH: return "RPATH";
1995 case DT_SYMBOLIC: return "SYMBOLIC";
1996 case DT_REL: return "REL";
1997 case DT_RELSZ: return "RELSZ";
1998 case DT_RELENT: return "RELENT";
1999 case DT_PLTREL: return "PLTREL";
2000 case DT_DEBUG: return "DEBUG";
2001 case DT_TEXTREL: return "TEXTREL";
2002 case DT_JMPREL: return "JMPREL";
2003 case DT_BIND_NOW: return "BIND_NOW";
2004 case DT_INIT_ARRAY: return "INIT_ARRAY";
2005 case DT_FINI_ARRAY: return "FINI_ARRAY";
2006 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
2007 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
d1133906
NC
2008 case DT_RUNPATH: return "RUNPATH";
2009 case DT_FLAGS: return "FLAGS";
2d0e6f43 2010
d1133906
NC
2011 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2012 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
103f02d3 2013
05107a46 2014 case DT_CHECKSUM: return "CHECKSUM";
252b5132
RH
2015 case DT_PLTPADSZ: return "PLTPADSZ";
2016 case DT_MOVEENT: return "MOVEENT";
2017 case DT_MOVESZ: return "MOVESZ";
dcefbbbd 2018 case DT_FEATURE: return "FEATURE";
252b5132
RH
2019 case DT_POSFLAG_1: return "POSFLAG_1";
2020 case DT_SYMINSZ: return "SYMINSZ";
2021 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
103f02d3 2022
252b5132 2023 case DT_ADDRRNGLO: return "ADDRRNGLO";
dcefbbbd
L
2024 case DT_CONFIG: return "CONFIG";
2025 case DT_DEPAUDIT: return "DEPAUDIT";
2026 case DT_AUDIT: return "AUDIT";
2027 case DT_PLTPAD: return "PLTPAD";
2028 case DT_MOVETAB: return "MOVETAB";
252b5132 2029 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
103f02d3 2030
252b5132 2031 case DT_VERSYM: return "VERSYM";
103f02d3 2032
67a4f2b7
AO
2033 case DT_TLSDESC_GOT: return "TLSDESC_GOT";
2034 case DT_TLSDESC_PLT: return "TLSDESC_PLT";
252b5132
RH
2035 case DT_RELACOUNT: return "RELACOUNT";
2036 case DT_RELCOUNT: return "RELCOUNT";
2037 case DT_FLAGS_1: return "FLAGS_1";
2038 case DT_VERDEF: return "VERDEF";
2039 case DT_VERDEFNUM: return "VERDEFNUM";
2040 case DT_VERNEED: return "VERNEED";
2041 case DT_VERNEEDNUM: return "VERNEEDNUM";
103f02d3 2042
019148e4 2043 case DT_AUXILIARY: return "AUXILIARY";
252b5132
RH
2044 case DT_USED: return "USED";
2045 case DT_FILTER: return "FILTER";
103f02d3 2046
047b2264
JJ
2047 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
2048 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
2049 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
2050 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
2051 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
fdc90cb4 2052 case DT_GNU_HASH: return "GNU_HASH";
047b2264 2053
252b5132
RH
2054 default:
2055 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
2056 {
2cf0635d 2057 const char * result;
103f02d3 2058
252b5132
RH
2059 switch (elf_header.e_machine)
2060 {
2061 case EM_MIPS:
4fe85591 2062 case EM_MIPS_RS3_LE:
252b5132
RH
2063 result = get_mips_dynamic_type (type);
2064 break;
9a097730
RH
2065 case EM_SPARCV9:
2066 result = get_sparc64_dynamic_type (type);
2067 break;
7490d522
AM
2068 case EM_PPC:
2069 result = get_ppc_dynamic_type (type);
2070 break;
f1cb7e17
AM
2071 case EM_PPC64:
2072 result = get_ppc64_dynamic_type (type);
2073 break;
ecc51f48
NC
2074 case EM_IA_64:
2075 result = get_ia64_dynamic_type (type);
2076 break;
fabcb361
RH
2077 case EM_ALPHA:
2078 result = get_alpha_dynamic_type (type);
2079 break;
1c0d3aa6
NC
2080 case EM_SCORE:
2081 result = get_score_dynamic_type (type);
2082 break;
40b36596
JM
2083 case EM_TI_C6000:
2084 result = get_tic6x_dynamic_type (type);
2085 break;
36591ba1
SL
2086 case EM_ALTERA_NIOS2:
2087 result = get_nios2_dynamic_type (type);
2088 break;
252b5132 2089 default:
fd85a6a1
NC
2090 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2091 result = get_solaris_dynamic_type (type);
2092 else
2093 result = NULL;
252b5132
RH
2094 break;
2095 }
2096
2097 if (result != NULL)
2098 return result;
2099
e9e44622 2100 snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
252b5132 2101 }
eec8f817
DA
2102 else if (((type >= DT_LOOS) && (type <= DT_HIOS))
2103 || (elf_header.e_machine == EM_PARISC
2104 && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
103f02d3 2105 {
2cf0635d 2106 const char * result;
103f02d3
UD
2107
2108 switch (elf_header.e_machine)
2109 {
2110 case EM_PARISC:
2111 result = get_parisc_dynamic_type (type);
2112 break;
148b93f2
NC
2113 case EM_IA_64:
2114 result = get_ia64_dynamic_type (type);
2115 break;
103f02d3 2116 default:
fd85a6a1
NC
2117 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2118 result = get_solaris_dynamic_type (type);
2119 else
2120 result = NULL;
103f02d3
UD
2121 break;
2122 }
2123
2124 if (result != NULL)
2125 return result;
2126
e9e44622
JJ
2127 snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2128 type);
103f02d3 2129 }
252b5132 2130 else
e9e44622 2131 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
103f02d3 2132
252b5132
RH
2133 return buff;
2134 }
2135}
2136
2137static char *
d3ba0551 2138get_file_type (unsigned e_type)
252b5132 2139{
b34976b6 2140 static char buff[32];
252b5132
RH
2141
2142 switch (e_type)
2143 {
2144 case ET_NONE: return _("NONE (None)");
2145 case ET_REL: return _("REL (Relocatable file)");
ba2685cc
AM
2146 case ET_EXEC: return _("EXEC (Executable file)");
2147 case ET_DYN: return _("DYN (Shared object file)");
2148 case ET_CORE: return _("CORE (Core file)");
252b5132
RH
2149
2150 default:
2151 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
e9e44622 2152 snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
252b5132 2153 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
e9e44622 2154 snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
252b5132 2155 else
e9e44622 2156 snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
252b5132
RH
2157 return buff;
2158 }
2159}
2160
2161static char *
d3ba0551 2162get_machine_name (unsigned e_machine)
252b5132 2163{
b34976b6 2164 static char buff[64]; /* XXX */
252b5132
RH
2165
2166 switch (e_machine)
2167 {
c45021f2 2168 case EM_NONE: return _("None");
a06ea964 2169 case EM_AARCH64: return "AArch64";
c45021f2
NC
2170 case EM_M32: return "WE32100";
2171 case EM_SPARC: return "Sparc";
e9f53129 2172 case EM_SPU: return "SPU";
c45021f2
NC
2173 case EM_386: return "Intel 80386";
2174 case EM_68K: return "MC68000";
2175 case EM_88K: return "MC88000";
22abe556 2176 case EM_IAMCU: return "Intel MCU";
c45021f2
NC
2177 case EM_860: return "Intel 80860";
2178 case EM_MIPS: return "MIPS R3000";
2179 case EM_S370: return "IBM System/370";
7036c0e1 2180 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
252b5132 2181 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
c45021f2 2182 case EM_PARISC: return "HPPA";
252b5132 2183 case EM_PPC_OLD: return "Power PC (old)";
7036c0e1 2184 case EM_SPARC32PLUS: return "Sparc v8+" ;
c45021f2
NC
2185 case EM_960: return "Intel 90860";
2186 case EM_PPC: return "PowerPC";
285d1771 2187 case EM_PPC64: return "PowerPC64";
c45021f2 2188 case EM_FR20: return "Fujitsu FR20";
3f8107ab 2189 case EM_FT32: return "FTDI FT32";
c45021f2 2190 case EM_RH32: return "TRW RH32";
b34976b6 2191 case EM_MCORE: return "MCORE";
7036c0e1
AJ
2192 case EM_ARM: return "ARM";
2193 case EM_OLD_ALPHA: return "Digital Alpha (old)";
ef230218 2194 case EM_SH: return "Renesas / SuperH SH";
c45021f2
NC
2195 case EM_SPARCV9: return "Sparc v9";
2196 case EM_TRICORE: return "Siemens Tricore";
584da044 2197 case EM_ARC: return "ARC";
886a2506
NC
2198 case EM_ARC_COMPACT: return "ARCompact";
2199 case EM_ARC_COMPACT2: return "ARCv2";
c2dcd04e
NC
2200 case EM_H8_300: return "Renesas H8/300";
2201 case EM_H8_300H: return "Renesas H8/300H";
2202 case EM_H8S: return "Renesas H8S";
2203 case EM_H8_500: return "Renesas H8/500";
30800947 2204 case EM_IA_64: return "Intel IA-64";
252b5132
RH
2205 case EM_MIPS_X: return "Stanford MIPS-X";
2206 case EM_COLDFIRE: return "Motorola Coldfire";
c45021f2 2207 case EM_ALPHA: return "Alpha";
2b0337b0
AO
2208 case EM_CYGNUS_D10V:
2209 case EM_D10V: return "d10v";
2210 case EM_CYGNUS_D30V:
b34976b6 2211 case EM_D30V: return "d30v";
2b0337b0 2212 case EM_CYGNUS_M32R:
26597c86 2213 case EM_M32R: return "Renesas M32R (formerly Mitsubishi M32r)";
2b0337b0 2214 case EM_CYGNUS_V850:
708e2187 2215 case EM_V800: return "Renesas V850 (using RH850 ABI)";
f6c1a2d5 2216 case EM_V850: return "Renesas V850";
2b0337b0
AO
2217 case EM_CYGNUS_MN10300:
2218 case EM_MN10300: return "mn10300";
2219 case EM_CYGNUS_MN10200:
2220 case EM_MN10200: return "mn10200";
5506d11a 2221 case EM_MOXIE: return "Moxie";
2b0337b0
AO
2222 case EM_CYGNUS_FR30:
2223 case EM_FR30: return "Fujitsu FR30";
b34976b6 2224 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
2b0337b0 2225 case EM_PJ_OLD:
b34976b6 2226 case EM_PJ: return "picoJava";
7036c0e1
AJ
2227 case EM_MMA: return "Fujitsu Multimedia Accelerator";
2228 case EM_PCP: return "Siemens PCP";
2229 case EM_NCPU: return "Sony nCPU embedded RISC processor";
2230 case EM_NDR1: return "Denso NDR1 microprocesspr";
2231 case EM_STARCORE: return "Motorola Star*Core processor";
2232 case EM_ME16: return "Toyota ME16 processor";
2233 case EM_ST100: return "STMicroelectronics ST100 processor";
2234 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
11636f9e
JM
2235 case EM_PDSP: return "Sony DSP processor";
2236 case EM_PDP10: return "Digital Equipment Corp. PDP-10";
2237 case EM_PDP11: return "Digital Equipment Corp. PDP-11";
7036c0e1
AJ
2238 case EM_FX66: return "Siemens FX66 microcontroller";
2239 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2240 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
2241 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
6927f982 2242 case EM_68HC12: return "Motorola MC68HC12 Microcontroller";
7036c0e1
AJ
2243 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
2244 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
2245 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
2246 case EM_SVX: return "Silicon Graphics SVx";
2247 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
2248 case EM_VAX: return "Digital VAX";
619ed720 2249 case EM_VISIUM: return "CDS VISIUMcore processor";
2b0337b0 2250 case EM_AVR_OLD:
b34976b6 2251 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
1b61cf92 2252 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
c45021f2
NC
2253 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
2254 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
2255 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
b34976b6 2256 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
c45021f2 2257 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
3b36097d 2258 case EM_PRISM: return "Vitesse Prism";
bcedfee6 2259 case EM_X86_64: return "Advanced Micro Devices X86-64";
8a9036a4 2260 case EM_L1OM: return "Intel L1OM";
7a9068fe 2261 case EM_K1OM: return "Intel K1OM";
b7498e0e 2262 case EM_S390_OLD:
b34976b6 2263 case EM_S390: return "IBM S/390";
1c0d3aa6 2264 case EM_SCORE: return "SUNPLUS S+Core";
61865e30 2265 case EM_XSTORMY16: return "Sanyo XStormy16 CPU core";
73589c9d 2266 case EM_OR1K: return "OpenRISC 1000";
1fe1f39c 2267 case EM_CRX: return "National Semiconductor CRX microprocessor";
cfb8c092 2268 case EM_ADAPTEVA_EPIPHANY: return "Adapteva EPIPHANY";
d172d4ba 2269 case EM_DLX: return "OpenDLX";
1e4cf259 2270 case EM_IP2K_OLD:
b34976b6 2271 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
3b36097d 2272 case EM_IQ2000: return "Vitesse IQ2000";
88da6820
NC
2273 case EM_XTENSA_OLD:
2274 case EM_XTENSA: return "Tensilica Xtensa Processor";
11636f9e
JM
2275 case EM_VIDEOCORE: return "Alphamosaic VideoCore processor";
2276 case EM_TMM_GPP: return "Thompson Multimedia General Purpose Processor";
2277 case EM_NS32K: return "National Semiconductor 32000 series";
2278 case EM_TPC: return "Tenor Network TPC processor";
2279 case EM_ST200: return "STMicroelectronics ST200 microcontroller";
2280 case EM_MAX: return "MAX Processor";
2281 case EM_CR: return "National Semiconductor CompactRISC";
2282 case EM_F2MC16: return "Fujitsu F2MC16";
2283 case EM_MSP430: return "Texas Instruments msp430 microcontroller";
84e94c90 2284 case EM_LATTICEMICO32: return "Lattice Mico32";
ff7eeb89 2285 case EM_M32C_OLD:
49f58d10 2286 case EM_M32C: return "Renesas M32c";
d031aafb 2287 case EM_MT: return "Morpho Techologies MT processor";
7bbe5bc5 2288 case EM_BLACKFIN: return "Analog Devices Blackfin";
11636f9e
JM
2289 case EM_SE_C33: return "S1C33 Family of Seiko Epson processors";
2290 case EM_SEP: return "Sharp embedded microprocessor";
2291 case EM_ARCA: return "Arca RISC microprocessor";
2292 case EM_UNICORE: return "Unicore";
2293 case EM_EXCESS: return "eXcess 16/32/64-bit configurable embedded CPU";
2294 case EM_DXP: return "Icera Semiconductor Inc. Deep Execution Processor";
64fd6348
NC
2295 case EM_NIOS32: return "Altera Nios";
2296 case EM_ALTERA_NIOS2: return "Altera Nios II";
c29aca4a 2297 case EM_C166:
d70c5fc7 2298 case EM_XC16X: return "Infineon Technologies xc16x";
11636f9e
JM
2299 case EM_M16C: return "Renesas M16C series microprocessors";
2300 case EM_DSPIC30F: return "Microchip Technology dsPIC30F Digital Signal Controller";
2301 case EM_CE: return "Freescale Communication Engine RISC core";
2302 case EM_TSK3000: return "Altium TSK3000 core";
2303 case EM_RS08: return "Freescale RS08 embedded processor";
2304 case EM_ECOG2: return "Cyan Technology eCOG2 microprocessor";
2305 case EM_DSP24: return "New Japan Radio (NJR) 24-bit DSP Processor";
2306 case EM_VIDEOCORE3: return "Broadcom VideoCore III processor";
2307 case EM_SE_C17: return "Seiko Epson C17 family";
2308 case EM_TI_C6000: return "Texas Instruments TMS320C6000 DSP family";
2309 case EM_TI_C2000: return "Texas Instruments TMS320C2000 DSP family";
2310 case EM_TI_C5500: return "Texas Instruments TMS320C55x DSP family";
2311 case EM_MMDSP_PLUS: return "STMicroelectronics 64bit VLIW Data Signal Processor";
2312 case EM_CYPRESS_M8C: return "Cypress M8C microprocessor";
2313 case EM_R32C: return "Renesas R32C series microprocessors";
2314 case EM_TRIMEDIA: return "NXP Semiconductors TriMedia architecture family";
2315 case EM_QDSP6: return "QUALCOMM DSP6 Processor";
2316 case EM_8051: return "Intel 8051 and variants";
2317 case EM_STXP7X: return "STMicroelectronics STxP7x family";
2318 case EM_NDS32: return "Andes Technology compact code size embedded RISC processor family";
2319 case EM_ECOG1X: return "Cyan Technology eCOG1X family";
2320 case EM_MAXQ30: return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2321 case EM_XIMO16: return "New Japan Radio (NJR) 16-bit DSP Processor";
2322 case EM_MANIK: return "M2000 Reconfigurable RISC Microprocessor";
2323 case EM_CRAYNV2: return "Cray Inc. NV2 vector architecture";
15ab5209 2324 case EM_CYGNUS_MEP: return "Toshiba MeP Media Engine";
cb8f3167 2325 case EM_CR16:
f6c1a2d5 2326 case EM_MICROBLAZE:
7ba29e2a 2327 case EM_MICROBLAZE_OLD: return "Xilinx MicroBlaze";
99c513f6 2328 case EM_RL78: return "Renesas RL78";
c7927a3c 2329 case EM_RX: return "Renesas RX";
a3c62988 2330 case EM_METAG: return "Imagination Technologies Meta processor architecture";
11636f9e
JM
2331 case EM_MCST_ELBRUS: return "MCST Elbrus general purpose hardware architecture";
2332 case EM_ECOG16: return "Cyan Technology eCOG16 family";
2333 case EM_ETPU: return "Freescale Extended Time Processing Unit";
2334 case EM_SLE9X: return "Infineon Technologies SLE9X core";
2335 case EM_AVR32: return "Atmel Corporation 32-bit microprocessor family";
2336 case EM_STM8: return "STMicroeletronics STM8 8-bit microcontroller";
2337 case EM_TILE64: return "Tilera TILE64 multicore architecture family";
2338 case EM_TILEPRO: return "Tilera TILEPro multicore architecture family";
aa137e4d 2339 case EM_TILEGX: return "Tilera TILE-Gx multicore architecture family";
11636f9e 2340 case EM_CUDA: return "NVIDIA CUDA architecture";
f6c1a2d5 2341 case EM_XGATE: return "Motorola XGATE embedded processor";
252b5132 2342 default:
35d9dd2f 2343 snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
252b5132
RH
2344 return buff;
2345 }
2346}
2347
a9522a21
AB
2348static void
2349decode_ARC_machine_flags (unsigned e_flags, unsigned e_machine, char buf[])
2350{
2351 /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2. Some
2352 other compilers don't a specific architecture type in the e_flags, and
2353 instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
2354 architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
2355 architectures.
2356
2357 Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
2358 but also sets a specific architecture type in the e_flags field.
2359
2360 However, when decoding the flags we don't worry if we see an
2361 unexpected pairing, for example EM_ARC_COMPACT machine type, with
2362 ARCEM architecture type. */
2363
2364 switch (e_flags & EF_ARC_MACH_MSK)
2365 {
2366 /* We only expect these to occur for EM_ARC_COMPACT2. */
2367 case EF_ARC_CPU_ARCV2EM:
2368 strcat (buf, ", ARC EM");
2369 break;
2370 case EF_ARC_CPU_ARCV2HS:
2371 strcat (buf, ", ARC HS");
2372 break;
2373
2374 /* We only expect these to occur for EM_ARC_COMPACT. */
2375 case E_ARC_MACH_ARC600:
2376 strcat (buf, ", ARC600");
2377 break;
2378 case E_ARC_MACH_ARC601:
2379 strcat (buf, ", ARC601");
2380 break;
2381 case E_ARC_MACH_ARC700:
2382 strcat (buf, ", ARC700");
2383 break;
2384
2385 /* The only times we should end up here are (a) A corrupt ELF, (b) A
2386 new ELF with new architecture being read by an old version of
2387 readelf, or (c) An ELF built with non-GNU compiler that does not
2388 set the architecture in the e_flags. */
2389 default:
2390 if (e_machine == EM_ARC_COMPACT)
2391 strcat (buf, ", Unknown ARCompact");
2392 else
2393 strcat (buf, ", Unknown ARC");
2394 break;
2395 }
2396
2397 switch (e_flags & EF_ARC_OSABI_MSK)
2398 {
2399 case E_ARC_OSABI_ORIG:
2400 strcat (buf, ", (ABI:legacy)");
2401 break;
2402 case E_ARC_OSABI_V2:
2403 strcat (buf, ", (ABI:v2)");
2404 break;
2405 /* Only upstream 3.9+ kernels will support ARCv2 ISA. */
2406 case E_ARC_OSABI_V3:
2407 strcat (buf, ", v3 no-legacy-syscalls ABI");
2408 break;
2409 default:
2410 strcat (buf, ", unrecognised ARC OSABI flag");
2411 break;
2412 }
2413}
2414
f3485b74 2415static void
d3ba0551 2416decode_ARM_machine_flags (unsigned e_flags, char buf[])
f3485b74
NC
2417{
2418 unsigned eabi;
2419 int unknown = 0;
2420
2421 eabi = EF_ARM_EABI_VERSION (e_flags);
2422 e_flags &= ~ EF_ARM_EABIMASK;
2423
2424 /* Handle "generic" ARM flags. */
2425 if (e_flags & EF_ARM_RELEXEC)
2426 {
2427 strcat (buf, ", relocatable executable");
2428 e_flags &= ~ EF_ARM_RELEXEC;
2429 }
76da6bbe 2430
f3485b74
NC
2431 /* Now handle EABI specific flags. */
2432 switch (eabi)
2433 {
2434 default:
2c71103e 2435 strcat (buf, ", <unrecognized EABI>");
f3485b74
NC
2436 if (e_flags)
2437 unknown = 1;
2438 break;
2439
2440 case EF_ARM_EABI_VER1:
a5bcd848 2441 strcat (buf, ", Version1 EABI");
f3485b74
NC
2442 while (e_flags)
2443 {
2444 unsigned flag;
76da6bbe 2445
f3485b74
NC
2446 /* Process flags one bit at a time. */
2447 flag = e_flags & - e_flags;
2448 e_flags &= ~ flag;
76da6bbe 2449
f3485b74
NC
2450 switch (flag)
2451 {
a5bcd848 2452 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
f3485b74
NC
2453 strcat (buf, ", sorted symbol tables");
2454 break;
76da6bbe 2455
f3485b74
NC
2456 default:
2457 unknown = 1;
2458 break;
2459 }
2460 }
2461 break;
76da6bbe 2462
a5bcd848
PB
2463 case EF_ARM_EABI_VER2:
2464 strcat (buf, ", Version2 EABI");
2465 while (e_flags)
2466 {
2467 unsigned flag;
2468
2469 /* Process flags one bit at a time. */
2470 flag = e_flags & - e_flags;
2471 e_flags &= ~ flag;
2472
2473 switch (flag)
2474 {
2475 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2476 strcat (buf, ", sorted symbol tables");
2477 break;
2478
2479 case EF_ARM_DYNSYMSUSESEGIDX:
2480 strcat (buf, ", dynamic symbols use segment index");
2481 break;
2482
2483 case EF_ARM_MAPSYMSFIRST:
2484 strcat (buf, ", mapping symbols precede others");
2485 break;
2486
2487 default:
2488 unknown = 1;
2489 break;
2490 }
2491 }
2492 break;
2493
d507cf36
PB
2494 case EF_ARM_EABI_VER3:
2495 strcat (buf, ", Version3 EABI");
8cb51566
PB
2496 break;
2497
2498 case EF_ARM_EABI_VER4:
2499 strcat (buf, ", Version4 EABI");
3bfcb652
NC
2500 while (e_flags)
2501 {
2502 unsigned flag;
2503
2504 /* Process flags one bit at a time. */
2505 flag = e_flags & - e_flags;
2506 e_flags &= ~ flag;
2507
2508 switch (flag)
2509 {
2510 case EF_ARM_BE8:
2511 strcat (buf, ", BE8");
2512 break;
2513
2514 case EF_ARM_LE8:
2515 strcat (buf, ", LE8");
2516 break;
2517
2518 default:
2519 unknown = 1;
2520 break;
2521 }
2522 break;
2523 }
2524 break;
3a4a14e9
PB
2525
2526 case EF_ARM_EABI_VER5:
2527 strcat (buf, ", Version5 EABI");
d507cf36
PB
2528 while (e_flags)
2529 {
2530 unsigned flag;
2531
2532 /* Process flags one bit at a time. */
2533 flag = e_flags & - e_flags;
2534 e_flags &= ~ flag;
2535
2536 switch (flag)
2537 {
2538 case EF_ARM_BE8:
2539 strcat (buf, ", BE8");
2540 break;
2541
2542 case EF_ARM_LE8:
2543 strcat (buf, ", LE8");
2544 break;
2545
3bfcb652
NC
2546 case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT. */
2547 strcat (buf, ", soft-float ABI");
2548 break;
2549
2550 case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT. */
2551 strcat (buf, ", hard-float ABI");
2552 break;
2553
d507cf36
PB
2554 default:
2555 unknown = 1;
2556 break;
2557 }
2558 }
2559 break;
2560
f3485b74 2561 case EF_ARM_EABI_UNKNOWN:
a5bcd848 2562 strcat (buf, ", GNU EABI");
f3485b74
NC
2563 while (e_flags)
2564 {
2565 unsigned flag;
76da6bbe 2566
f3485b74
NC
2567 /* Process flags one bit at a time. */
2568 flag = e_flags & - e_flags;
2569 e_flags &= ~ flag;
76da6bbe 2570
f3485b74
NC
2571 switch (flag)
2572 {
a5bcd848 2573 case EF_ARM_INTERWORK:
f3485b74
NC
2574 strcat (buf, ", interworking enabled");
2575 break;
76da6bbe 2576
a5bcd848 2577 case EF_ARM_APCS_26:
f3485b74
NC
2578 strcat (buf, ", uses APCS/26");
2579 break;
76da6bbe 2580
a5bcd848 2581 case EF_ARM_APCS_FLOAT:
f3485b74
NC
2582 strcat (buf, ", uses APCS/float");
2583 break;
76da6bbe 2584
a5bcd848 2585 case EF_ARM_PIC:
f3485b74
NC
2586 strcat (buf, ", position independent");
2587 break;
76da6bbe 2588
a5bcd848 2589 case EF_ARM_ALIGN8:
f3485b74
NC
2590 strcat (buf, ", 8 bit structure alignment");
2591 break;
76da6bbe 2592
a5bcd848 2593 case EF_ARM_NEW_ABI:
f3485b74
NC
2594 strcat (buf, ", uses new ABI");
2595 break;
76da6bbe 2596
a5bcd848 2597 case EF_ARM_OLD_ABI:
f3485b74
NC
2598 strcat (buf, ", uses old ABI");
2599 break;
76da6bbe 2600
a5bcd848 2601 case EF_ARM_SOFT_FLOAT:
f3485b74
NC
2602 strcat (buf, ", software FP");
2603 break;
76da6bbe 2604
90e01f86
ILT
2605 case EF_ARM_VFP_FLOAT:
2606 strcat (buf, ", VFP");
2607 break;
2608
fde78edd
NC
2609 case EF_ARM_MAVERICK_FLOAT:
2610 strcat (buf, ", Maverick FP");
2611 break;
2612
f3485b74
NC
2613 default:
2614 unknown = 1;
2615 break;
2616 }
2617 }
2618 }
f3485b74
NC
2619
2620 if (unknown)
2b692964 2621 strcat (buf,_(", <unknown>"));
f3485b74
NC
2622}
2623
343433df
AB
2624static void
2625decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2626{
2627 --size; /* Leave space for null terminator. */
2628
2629 switch (e_flags & EF_AVR_MACH)
2630 {
2631 case E_AVR_MACH_AVR1:
2632 strncat (buf, ", avr:1", size);
2633 break;
2634 case E_AVR_MACH_AVR2:
2635 strncat (buf, ", avr:2", size);
2636 break;
2637 case E_AVR_MACH_AVR25:
2638 strncat (buf, ", avr:25", size);
2639 break;
2640 case E_AVR_MACH_AVR3:
2641 strncat (buf, ", avr:3", size);
2642 break;
2643 case E_AVR_MACH_AVR31:
2644 strncat (buf, ", avr:31", size);
2645 break;
2646 case E_AVR_MACH_AVR35:
2647 strncat (buf, ", avr:35", size);
2648 break;
2649 case E_AVR_MACH_AVR4:
2650 strncat (buf, ", avr:4", size);
2651 break;
2652 case E_AVR_MACH_AVR5:
2653 strncat (buf, ", avr:5", size);
2654 break;
2655 case E_AVR_MACH_AVR51:
2656 strncat (buf, ", avr:51", size);
2657 break;
2658 case E_AVR_MACH_AVR6:
2659 strncat (buf, ", avr:6", size);
2660 break;
2661 case E_AVR_MACH_AVRTINY:
2662 strncat (buf, ", avr:100", size);
2663 break;
2664 case E_AVR_MACH_XMEGA1:
2665 strncat (buf, ", avr:101", size);
2666 break;
2667 case E_AVR_MACH_XMEGA2:
2668 strncat (buf, ", avr:102", size);
2669 break;
2670 case E_AVR_MACH_XMEGA3:
2671 strncat (buf, ", avr:103", size);
2672 break;
2673 case E_AVR_MACH_XMEGA4:
2674 strncat (buf, ", avr:104", size);
2675 break;
2676 case E_AVR_MACH_XMEGA5:
2677 strncat (buf, ", avr:105", size);
2678 break;
2679 case E_AVR_MACH_XMEGA6:
2680 strncat (buf, ", avr:106", size);
2681 break;
2682 case E_AVR_MACH_XMEGA7:
2683 strncat (buf, ", avr:107", size);
2684 break;
2685 default:
2686 strncat (buf, ", avr:<unknown>", size);
2687 break;
2688 }
2689
2690 size -= strlen (buf);
2691 if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2692 strncat (buf, ", link-relax", size);
2693}
2694
35c08157
KLC
2695static void
2696decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2697{
2698 unsigned abi;
2699 unsigned arch;
2700 unsigned config;
2701 unsigned version;
2702 int has_fpu = 0;
2703 int r = 0;
2704
2705 static const char *ABI_STRINGS[] =
2706 {
2707 "ABI v0", /* use r5 as return register; only used in N1213HC */
2708 "ABI v1", /* use r0 as return register */
2709 "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2710 "ABI v2fp", /* for FPU */
40c7a7cb
KLC
2711 "AABI",
2712 "ABI2 FP+"
35c08157
KLC
2713 };
2714 static const char *VER_STRINGS[] =
2715 {
2716 "Andes ELF V1.3 or older",
2717 "Andes ELF V1.3.1",
2718 "Andes ELF V1.4"
2719 };
2720 static const char *ARCH_STRINGS[] =
2721 {
2722 "",
2723 "Andes Star v1.0",
2724 "Andes Star v2.0",
2725 "Andes Star v3.0",
2726 "Andes Star v3.0m"
2727 };
2728
2729 abi = EF_NDS_ABI & e_flags;
2730 arch = EF_NDS_ARCH & e_flags;
2731 config = EF_NDS_INST & e_flags;
2732 version = EF_NDS32_ELF_VERSION & e_flags;
2733
2734 memset (buf, 0, size);
2735
2736 switch (abi)
2737 {
2738 case E_NDS_ABI_V0:
2739 case E_NDS_ABI_V1:
2740 case E_NDS_ABI_V2:
2741 case E_NDS_ABI_V2FP:
2742 case E_NDS_ABI_AABI:
40c7a7cb 2743 case E_NDS_ABI_V2FP_PLUS:
35c08157
KLC
2744 /* In case there are holes in the array. */
2745 r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2746 break;
2747
2748 default:
2749 r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2750 break;
2751 }
2752
2753 switch (version)
2754 {
2755 case E_NDS32_ELF_VER_1_2:
2756 case E_NDS32_ELF_VER_1_3:
2757 case E_NDS32_ELF_VER_1_4:
2758 r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2759 break;
2760
2761 default:
2762 r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2763 break;
2764 }
2765
2766 if (E_NDS_ABI_V0 == abi)
2767 {
2768 /* OLD ABI; only used in N1213HC, has performance extension 1. */
2769 r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2770 if (arch == E_NDS_ARCH_STAR_V1_0)
2771 r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2772 return;
2773 }
2774
2775 switch (arch)
2776 {
2777 case E_NDS_ARCH_STAR_V1_0:
2778 case E_NDS_ARCH_STAR_V2_0:
2779 case E_NDS_ARCH_STAR_V3_0:
2780 case E_NDS_ARCH_STAR_V3_M:
2781 r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2782 break;
2783
2784 default:
2785 r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2786 /* ARCH version determines how the e_flags are interpreted.
2787 If it is unknown, we cannot proceed. */
2788 return;
2789 }
2790
2791 /* Newer ABI; Now handle architecture specific flags. */
2792 if (arch == E_NDS_ARCH_STAR_V1_0)
2793 {
2794 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2795 r += snprintf (buf + r, size -r, ", MFUSR_PC");
2796
2797 if (!(config & E_NDS32_HAS_NO_MAC_INST))
2798 r += snprintf (buf + r, size -r, ", MAC");
2799
2800 if (config & E_NDS32_HAS_DIV_INST)
2801 r += snprintf (buf + r, size -r, ", DIV");
2802
2803 if (config & E_NDS32_HAS_16BIT_INST)
2804 r += snprintf (buf + r, size -r, ", 16b");
2805 }
2806 else
2807 {
2808 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2809 {
2810 if (version <= E_NDS32_ELF_VER_1_3)
2811 r += snprintf (buf + r, size -r, ", [B8]");
2812 else
2813 r += snprintf (buf + r, size -r, ", EX9");
2814 }
2815
2816 if (config & E_NDS32_HAS_MAC_DX_INST)
2817 r += snprintf (buf + r, size -r, ", MAC_DX");
2818
2819 if (config & E_NDS32_HAS_DIV_DX_INST)
2820 r += snprintf (buf + r, size -r, ", DIV_DX");
2821
2822 if (config & E_NDS32_HAS_16BIT_INST)
2823 {
2824 if (version <= E_NDS32_ELF_VER_1_3)
2825 r += snprintf (buf + r, size -r, ", 16b");
2826 else
2827 r += snprintf (buf + r, size -r, ", IFC");
2828 }
2829 }
2830
2831 if (config & E_NDS32_HAS_EXT_INST)
2832 r += snprintf (buf + r, size -r, ", PERF1");
2833
2834 if (config & E_NDS32_HAS_EXT2_INST)
2835 r += snprintf (buf + r, size -r, ", PERF2");
2836
2837 if (config & E_NDS32_HAS_FPU_INST)
2838 {
2839 has_fpu = 1;
2840 r += snprintf (buf + r, size -r, ", FPU_SP");
2841 }
2842
2843 if (config & E_NDS32_HAS_FPU_DP_INST)
2844 {
2845 has_fpu = 1;
2846 r += snprintf (buf + r, size -r, ", FPU_DP");
2847 }
2848
2849 if (config & E_NDS32_HAS_FPU_MAC_INST)
2850 {
2851 has_fpu = 1;
2852 r += snprintf (buf + r, size -r, ", FPU_MAC");
2853 }
2854
2855 if (has_fpu)
2856 {
2857 switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
2858 {
2859 case E_NDS32_FPU_REG_8SP_4DP:
2860 r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
2861 break;
2862 case E_NDS32_FPU_REG_16SP_8DP:
2863 r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
2864 break;
2865 case E_NDS32_FPU_REG_32SP_16DP:
2866 r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
2867 break;
2868 case E_NDS32_FPU_REG_32SP_32DP:
2869 r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
2870 break;
2871 }
2872 }
2873
2874 if (config & E_NDS32_HAS_AUDIO_INST)
2875 r += snprintf (buf + r, size -r, ", AUDIO");
2876
2877 if (config & E_NDS32_HAS_STRING_INST)
2878 r += snprintf (buf + r, size -r, ", STR");
2879
2880 if (config & E_NDS32_HAS_REDUCED_REGS)
2881 r += snprintf (buf + r, size -r, ", 16REG");
2882
2883 if (config & E_NDS32_HAS_VIDEO_INST)
2884 {
2885 if (version <= E_NDS32_ELF_VER_1_3)
2886 r += snprintf (buf + r, size -r, ", VIDEO");
2887 else
2888 r += snprintf (buf + r, size -r, ", SATURATION");
2889 }
2890
2891 if (config & E_NDS32_HAS_ENCRIPT_INST)
2892 r += snprintf (buf + r, size -r, ", ENCRP");
2893
2894 if (config & E_NDS32_HAS_L2C_INST)
2895 r += snprintf (buf + r, size -r, ", L2C");
2896}
2897
252b5132 2898static char *
d3ba0551 2899get_machine_flags (unsigned e_flags, unsigned e_machine)
252b5132 2900{
b34976b6 2901 static char buf[1024];
252b5132
RH
2902
2903 buf[0] = '\0';
76da6bbe 2904
252b5132
RH
2905 if (e_flags)
2906 {
2907 switch (e_machine)
2908 {
2909 default:
2910 break;
2911
886a2506 2912 case EM_ARC_COMPACT2:
886a2506 2913 case EM_ARC_COMPACT:
a9522a21
AB
2914 decode_ARC_machine_flags (e_flags, e_machine, buf);
2915 break;
886a2506 2916
f3485b74
NC
2917 case EM_ARM:
2918 decode_ARM_machine_flags (e_flags, buf);
2919 break;
76da6bbe 2920
343433df
AB
2921 case EM_AVR:
2922 decode_AVR_machine_flags (e_flags, buf, sizeof buf);
2923 break;
2924
781303ce
MF
2925 case EM_BLACKFIN:
2926 if (e_flags & EF_BFIN_PIC)
2927 strcat (buf, ", PIC");
2928
2929 if (e_flags & EF_BFIN_FDPIC)
2930 strcat (buf, ", FDPIC");
2931
2932 if (e_flags & EF_BFIN_CODE_IN_L1)
2933 strcat (buf, ", code in L1");
2934
2935 if (e_flags & EF_BFIN_DATA_IN_L1)
2936 strcat (buf, ", data in L1");
2937
2938 break;
2939
ec2dfb42
AO
2940 case EM_CYGNUS_FRV:
2941 switch (e_flags & EF_FRV_CPU_MASK)
2942 {
2943 case EF_FRV_CPU_GENERIC:
2944 break;
2945
2946 default:
2947 strcat (buf, ", fr???");
2948 break;
57346661 2949
ec2dfb42
AO
2950 case EF_FRV_CPU_FR300:
2951 strcat (buf, ", fr300");
2952 break;
2953
2954 case EF_FRV_CPU_FR400:
2955 strcat (buf, ", fr400");
2956 break;
2957 case EF_FRV_CPU_FR405:
2958 strcat (buf, ", fr405");
2959 break;
2960
2961 case EF_FRV_CPU_FR450:
2962 strcat (buf, ", fr450");
2963 break;
2964
2965 case EF_FRV_CPU_FR500:
2966 strcat (buf, ", fr500");
2967 break;
2968 case EF_FRV_CPU_FR550:
2969 strcat (buf, ", fr550");
2970 break;
2971
2972 case EF_FRV_CPU_SIMPLE:
2973 strcat (buf, ", simple");
2974 break;
2975 case EF_FRV_CPU_TOMCAT:
2976 strcat (buf, ", tomcat");
2977 break;
2978 }
1c877e87 2979 break;
ec2dfb42 2980
53c7db4b 2981 case EM_68K:
425c6cb0 2982 if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
76f57f3a 2983 strcat (buf, ", m68000");
425c6cb0 2984 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
3bdcfdf4
KH
2985 strcat (buf, ", cpu32");
2986 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
2987 strcat (buf, ", fido_a");
425c6cb0 2988 else
266abb8f 2989 {
2cf0635d
NC
2990 char const * isa = _("unknown");
2991 char const * mac = _("unknown mac");
2992 char const * additional = NULL;
0112cd26 2993
c694fd50 2994 switch (e_flags & EF_M68K_CF_ISA_MASK)
266abb8f 2995 {
c694fd50 2996 case EF_M68K_CF_ISA_A_NODIV:
0b2e31dc
NS
2997 isa = "A";
2998 additional = ", nodiv";
2999 break;
c694fd50 3000 case EF_M68K_CF_ISA_A:
266abb8f
NS
3001 isa = "A";
3002 break;
c694fd50 3003 case EF_M68K_CF_ISA_A_PLUS:
266abb8f
NS
3004 isa = "A+";
3005 break;
c694fd50 3006 case EF_M68K_CF_ISA_B_NOUSP:
0b2e31dc
NS
3007 isa = "B";
3008 additional = ", nousp";
3009 break;
c694fd50 3010 case EF_M68K_CF_ISA_B:
266abb8f
NS
3011 isa = "B";
3012 break;
f608cd77
NS
3013 case EF_M68K_CF_ISA_C:
3014 isa = "C";
3015 break;
3016 case EF_M68K_CF_ISA_C_NODIV:
3017 isa = "C";
3018 additional = ", nodiv";
3019 break;
266abb8f
NS
3020 }
3021 strcat (buf, ", cf, isa ");
3022 strcat (buf, isa);
0b2e31dc
NS
3023 if (additional)
3024 strcat (buf, additional);
c694fd50 3025 if (e_flags & EF_M68K_CF_FLOAT)
0b2e31dc 3026 strcat (buf, ", float");
c694fd50 3027 switch (e_flags & EF_M68K_CF_MAC_MASK)
266abb8f
NS
3028 {
3029 case 0:
3030 mac = NULL;
3031 break;
c694fd50 3032 case EF_M68K_CF_MAC:
266abb8f
NS
3033 mac = "mac";
3034 break;
c694fd50 3035 case EF_M68K_CF_EMAC:
266abb8f
NS
3036 mac = "emac";
3037 break;
f608cd77
NS
3038 case EF_M68K_CF_EMAC_B:
3039 mac = "emac_b";
3040 break;
266abb8f
NS
3041 }
3042 if (mac)
3043 {
3044 strcat (buf, ", ");
3045 strcat (buf, mac);
3046 }
266abb8f 3047 }
53c7db4b 3048 break;
33c63f9d 3049
153a2776
NC
3050 case EM_CYGNUS_MEP:
3051 switch (e_flags & EF_MEP_CPU_MASK)
3052 {
3053 case EF_MEP_CPU_MEP: strcat (buf, ", generic MeP"); break;
3054 case EF_MEP_CPU_C2: strcat (buf, ", MeP C2"); break;
3055 case EF_MEP_CPU_C3: strcat (buf, ", MeP C3"); break;
3056 case EF_MEP_CPU_C4: strcat (buf, ", MeP C4"); break;
3057 case EF_MEP_CPU_C5: strcat (buf, ", MeP C5"); break;
3058 case EF_MEP_CPU_H1: strcat (buf, ", MeP H1"); break;
3059 default: strcat (buf, _(", <unknown MeP cpu type>")); break;
3060 }
3061
3062 switch (e_flags & EF_MEP_COP_MASK)
3063 {
3064 case EF_MEP_COP_NONE: break;
3065 case EF_MEP_COP_AVC: strcat (buf, ", AVC coprocessor"); break;
3066 case EF_MEP_COP_AVC2: strcat (buf, ", AVC2 coprocessor"); break;
3067 case EF_MEP_COP_FMAX: strcat (buf, ", FMAX coprocessor"); break;
3068 case EF_MEP_COP_IVC2: strcat (buf, ", IVC2 coprocessor"); break;
3069 default: strcat (buf, _("<unknown MeP copro type>")); break;
3070 }
3071
3072 if (e_flags & EF_MEP_LIBRARY)
3073 strcat (buf, ", Built for Library");
3074
3075 if (e_flags & EF_MEP_INDEX_MASK)
3076 sprintf (buf + strlen (buf), ", Configuration Index: %#x",
3077 e_flags & EF_MEP_INDEX_MASK);
3078
3079 if (e_flags & ~ EF_MEP_ALL_FLAGS)
3080 sprintf (buf + strlen (buf), _(", unknown flags bits: %#x"),
3081 e_flags & ~ EF_MEP_ALL_FLAGS);
3082 break;
3083
252b5132
RH
3084 case EM_PPC:
3085 if (e_flags & EF_PPC_EMB)
3086 strcat (buf, ", emb");
3087
3088 if (e_flags & EF_PPC_RELOCATABLE)
2b692964 3089 strcat (buf, _(", relocatable"));
252b5132
RH
3090
3091 if (e_flags & EF_PPC_RELOCATABLE_LIB)
2b692964 3092 strcat (buf, _(", relocatable-lib"));
252b5132
RH
3093 break;
3094
ee67d69a
AM
3095 case EM_PPC64:
3096 if (e_flags & EF_PPC64_ABI)
3097 {
3098 char abi[] = ", abiv0";
3099
3100 abi[6] += e_flags & EF_PPC64_ABI;
3101 strcat (buf, abi);
3102 }
3103 break;
3104
708e2187
NC
3105 case EM_V800:
3106 if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
3107 strcat (buf, ", RH850 ABI");
0b4362b0 3108
708e2187
NC
3109 if (e_flags & EF_V800_850E3)
3110 strcat (buf, ", V3 architecture");
3111
3112 if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
3113 strcat (buf, ", FPU not used");
3114
3115 if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
3116 strcat (buf, ", regmode: COMMON");
3117
3118 if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
3119 strcat (buf, ", r4 not used");
3120
3121 if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
3122 strcat (buf, ", r30 not used");
3123
3124 if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
3125 strcat (buf, ", r5 not used");
3126
3127 if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
3128 strcat (buf, ", r2 not used");
3129
3130 for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
3131 {
3132 switch (e_flags & - e_flags)
3133 {
3134 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
3135 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
708e2187
NC
3136 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
3137 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
708e2187
NC
3138 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
3139 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
3140 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
3141 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
3142 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
3143 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
3144 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
3145 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
3146 default: break;
3147 }
3148 }
3149 break;
3150
2b0337b0 3151 case EM_V850:
252b5132
RH
3152 case EM_CYGNUS_V850:
3153 switch (e_flags & EF_V850_ARCH)
3154 {
78c8d46c
NC
3155 case E_V850E3V5_ARCH:
3156 strcat (buf, ", v850e3v5");
3157 break;
1cd986c5
NC
3158 case E_V850E2V3_ARCH:
3159 strcat (buf, ", v850e2v3");
3160 break;
3161 case E_V850E2_ARCH:
3162 strcat (buf, ", v850e2");
3163 break;
3164 case E_V850E1_ARCH:
3165 strcat (buf, ", v850e1");
8ad30312 3166 break;
252b5132
RH
3167 case E_V850E_ARCH:
3168 strcat (buf, ", v850e");
3169 break;
252b5132
RH
3170 case E_V850_ARCH:
3171 strcat (buf, ", v850");
3172 break;
3173 default:
2b692964 3174 strcat (buf, _(", unknown v850 architecture variant"));
252b5132
RH
3175 break;
3176 }
3177 break;
3178
2b0337b0 3179 case EM_M32R:
252b5132
RH
3180 case EM_CYGNUS_M32R:
3181 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3182 strcat (buf, ", m32r");
252b5132
RH
3183 break;
3184
3185 case EM_MIPS:
4fe85591 3186 case EM_MIPS_RS3_LE:
252b5132
RH
3187 if (e_flags & EF_MIPS_NOREORDER)
3188 strcat (buf, ", noreorder");
3189
3190 if (e_flags & EF_MIPS_PIC)
3191 strcat (buf, ", pic");
3192
3193 if (e_flags & EF_MIPS_CPIC)
3194 strcat (buf, ", cpic");
3195
d1bdd336
TS
3196 if (e_flags & EF_MIPS_UCODE)
3197 strcat (buf, ", ugen_reserved");
3198
252b5132
RH
3199 if (e_flags & EF_MIPS_ABI2)
3200 strcat (buf, ", abi2");
3201
43521d43
TS
3202 if (e_flags & EF_MIPS_OPTIONS_FIRST)
3203 strcat (buf, ", odk first");
3204
a5d22d2a
TS
3205 if (e_flags & EF_MIPS_32BITMODE)
3206 strcat (buf, ", 32bitmode");
3207
ba92f887
MR
3208 if (e_flags & EF_MIPS_NAN2008)
3209 strcat (buf, ", nan2008");
3210
fef1b0b3
SE
3211 if (e_flags & EF_MIPS_FP64)
3212 strcat (buf, ", fp64");
3213
156c2f8b
NC
3214 switch ((e_flags & EF_MIPS_MACH))
3215 {
3216 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3217 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3218 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
156c2f8b 3219 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
810dfa6e
L
3220 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3221 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3222 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3223 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
c6c98b38 3224 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
ebcb91b7 3225 case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
350cc38d
MS
3226 case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3227 case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
fd503541 3228 case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
05c6f050 3229 case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
67c2a3e8 3230 case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
d32e5c54 3231 case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
52b6b6b9 3232 case E_MIPS_MACH_XLR: strcat (buf, ", xlr"); break;
43521d43
TS
3233 case 0:
3234 /* We simply ignore the field in this case to avoid confusion:
3235 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3236 extension. */
3237 break;
2b692964 3238 default: strcat (buf, _(", unknown CPU")); break;
156c2f8b 3239 }
43521d43
TS
3240
3241 switch ((e_flags & EF_MIPS_ABI))
3242 {
3243 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3244 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3245 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3246 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3247 case 0:
3248 /* We simply ignore the field in this case to avoid confusion:
3249 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3250 This means it is likely to be an o32 file, but not for
3251 sure. */
3252 break;
2b692964 3253 default: strcat (buf, _(", unknown ABI")); break;
43521d43
TS
3254 }
3255
3256 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3257 strcat (buf, ", mdmx");
3258
3259 if (e_flags & EF_MIPS_ARCH_ASE_M16)
3260 strcat (buf, ", mips16");
3261
df58fc94
RS
3262 if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3263 strcat (buf, ", micromips");
3264
43521d43
TS
3265 switch ((e_flags & EF_MIPS_ARCH))
3266 {
3267 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3268 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3269 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3270 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3271 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3272 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
cb44e358 3273 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
7361da2c 3274 case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
43521d43 3275 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
5f74bc13 3276 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
7361da2c 3277 case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
2b692964 3278 default: strcat (buf, _(", unknown ISA")); break;
43521d43 3279 }
252b5132 3280 break;
351b4b40 3281
35c08157
KLC
3282 case EM_NDS32:
3283 decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3284 break;
3285
ccde1100
AO
3286 case EM_SH:
3287 switch ((e_flags & EF_SH_MACH_MASK))
3288 {
3289 case EF_SH1: strcat (buf, ", sh1"); break;
3290 case EF_SH2: strcat (buf, ", sh2"); break;
3291 case EF_SH3: strcat (buf, ", sh3"); break;
3292 case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3293 case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3294 case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3295 case EF_SH3E: strcat (buf, ", sh3e"); break;
3296 case EF_SH4: strcat (buf, ", sh4"); break;
3297 case EF_SH5: strcat (buf, ", sh5"); break;
3298 case EF_SH2E: strcat (buf, ", sh2e"); break;
3299 case EF_SH4A: strcat (buf, ", sh4a"); break;
1d70c7fb 3300 case EF_SH2A: strcat (buf, ", sh2a"); break;
ccde1100
AO
3301 case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3302 case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
1d70c7fb 3303 case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
0b92ab21
NH
3304 case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3305 case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3306 case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3307 case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3308 case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3309 case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
2b692964 3310 default: strcat (buf, _(", unknown ISA")); break;
ccde1100
AO
3311 }
3312
cec6a5b8
MR
3313 if (e_flags & EF_SH_PIC)
3314 strcat (buf, ", pic");
3315
3316 if (e_flags & EF_SH_FDPIC)
3317 strcat (buf, ", fdpic");
ccde1100 3318 break;
948f632f 3319
73589c9d
CS
3320 case EM_OR1K:
3321 if (e_flags & EF_OR1K_NODELAY)
3322 strcat (buf, ", no delay");
3323 break;
57346661 3324
351b4b40
RH
3325 case EM_SPARCV9:
3326 if (e_flags & EF_SPARC_32PLUS)
3327 strcat (buf, ", v8+");
3328
3329 if (e_flags & EF_SPARC_SUN_US1)
d07faca2
RH
3330 strcat (buf, ", ultrasparcI");
3331
3332 if (e_flags & EF_SPARC_SUN_US3)
3333 strcat (buf, ", ultrasparcIII");
351b4b40
RH
3334
3335 if (e_flags & EF_SPARC_HAL_R1)
3336 strcat (buf, ", halr1");
3337
3338 if (e_flags & EF_SPARC_LEDATA)
3339 strcat (buf, ", ledata");
3340
3341 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3342 strcat (buf, ", tso");
3343
3344 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3345 strcat (buf, ", pso");
3346
3347 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3348 strcat (buf, ", rmo");
3349 break;
7d466069 3350
103f02d3
UD
3351 case EM_PARISC:
3352 switch (e_flags & EF_PARISC_ARCH)
3353 {
3354 case EFA_PARISC_1_0:
3355 strcpy (buf, ", PA-RISC 1.0");
3356 break;
3357 case EFA_PARISC_1_1:
3358 strcpy (buf, ", PA-RISC 1.1");
3359 break;
3360 case EFA_PARISC_2_0:
3361 strcpy (buf, ", PA-RISC 2.0");
3362 break;
3363 default:
3364 break;
3365 }
3366 if (e_flags & EF_PARISC_TRAPNIL)
3367 strcat (buf, ", trapnil");
3368 if (e_flags & EF_PARISC_EXT)
3369 strcat (buf, ", ext");
3370 if (e_flags & EF_PARISC_LSB)
3371 strcat (buf, ", lsb");
3372 if (e_flags & EF_PARISC_WIDE)
3373 strcat (buf, ", wide");
3374 if (e_flags & EF_PARISC_NO_KABP)
3375 strcat (buf, ", no kabp");
3376 if (e_flags & EF_PARISC_LAZYSWAP)
3377 strcat (buf, ", lazyswap");
30800947 3378 break;
76da6bbe 3379
7d466069 3380 case EM_PJ:
2b0337b0 3381 case EM_PJ_OLD:
7d466069
ILT
3382 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3383 strcat (buf, ", new calling convention");
3384
3385 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3386 strcat (buf, ", gnu calling convention");
3387 break;
4d6ed7c8
NC
3388
3389 case EM_IA_64:
3390 if ((e_flags & EF_IA_64_ABI64))
3391 strcat (buf, ", 64-bit");
3392 else
3393 strcat (buf, ", 32-bit");
3394 if ((e_flags & EF_IA_64_REDUCEDFP))
3395 strcat (buf, ", reduced fp model");
3396 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3397 strcat (buf, ", no function descriptors, constant gp");
3398 else if ((e_flags & EF_IA_64_CONS_GP))
3399 strcat (buf, ", constant gp");
3400 if ((e_flags & EF_IA_64_ABSOLUTE))
3401 strcat (buf, ", absolute");
28f997cf
TG
3402 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3403 {
3404 if ((e_flags & EF_IA_64_VMS_LINKAGES))
3405 strcat (buf, ", vms_linkages");
3406 switch ((e_flags & EF_IA_64_VMS_COMCOD))
3407 {
3408 case EF_IA_64_VMS_COMCOD_SUCCESS:
3409 break;
3410 case EF_IA_64_VMS_COMCOD_WARNING:
3411 strcat (buf, ", warning");
3412 break;
3413 case EF_IA_64_VMS_COMCOD_ERROR:
3414 strcat (buf, ", error");
3415 break;
3416 case EF_IA_64_VMS_COMCOD_ABORT:
3417 strcat (buf, ", abort");
3418 break;
3419 default:
bee0ee85
NC
3420 warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3421 e_flags & EF_IA_64_VMS_COMCOD);
3422 strcat (buf, ", <unknown>");
28f997cf
TG
3423 }
3424 }
4d6ed7c8 3425 break;
179d3252
JT
3426
3427 case EM_VAX:
3428 if ((e_flags & EF_VAX_NONPIC))
3429 strcat (buf, ", non-PIC");
3430 if ((e_flags & EF_VAX_DFLOAT))
3431 strcat (buf, ", D-Float");
3432 if ((e_flags & EF_VAX_GFLOAT))
3433 strcat (buf, ", G-Float");
3434 break;
c7927a3c 3435
619ed720
EB
3436 case EM_VISIUM:
3437 if (e_flags & EF_VISIUM_ARCH_MCM)
3438 strcat (buf, ", mcm");
3439 else if (e_flags & EF_VISIUM_ARCH_MCM24)
3440 strcat (buf, ", mcm24");
3441 if (e_flags & EF_VISIUM_ARCH_GR6)
3442 strcat (buf, ", gr6");
3443 break;
3444
4046d87a 3445 case EM_RL78:
1740ba0c
NC
3446 switch (e_flags & E_FLAG_RL78_CPU_MASK)
3447 {
3448 case E_FLAG_RL78_ANY_CPU: break;
3449 case E_FLAG_RL78_G10: strcat (buf, ", G10"); break;
3450 case E_FLAG_RL78_G13: strcat (buf, ", G13"); break;
3451 case E_FLAG_RL78_G14: strcat (buf, ", G14"); break;
3452 }
856ea05c
KP
3453 if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3454 strcat (buf, ", 64-bit doubles");
4046d87a 3455 break;
0b4362b0 3456
c7927a3c
NC
3457 case EM_RX:
3458 if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3459 strcat (buf, ", 64-bit doubles");
3460 if (e_flags & E_FLAG_RX_DSP)
dd24e3da 3461 strcat (buf, ", dsp");
d4cb0ea0 3462 if (e_flags & E_FLAG_RX_PID)
0b4362b0 3463 strcat (buf, ", pid");
708e2187
NC
3464 if (e_flags & E_FLAG_RX_ABI)
3465 strcat (buf, ", RX ABI");
3525236c
NC
3466 if (e_flags & E_FLAG_RX_SINSNS_SET)
3467 strcat (buf, e_flags & E_FLAG_RX_SINSNS_YES
3468 ? ", uses String instructions" : ", bans String instructions");
a117b0a5
YS
3469 if (e_flags & E_FLAG_RX_V2)
3470 strcat (buf, ", V2");
d4cb0ea0 3471 break;
55786da2
AK
3472
3473 case EM_S390:
3474 if (e_flags & EF_S390_HIGH_GPRS)
3475 strcat (buf, ", highgprs");
d4cb0ea0 3476 break;
40b36596
JM
3477
3478 case EM_TI_C6000:
3479 if ((e_flags & EF_C6000_REL))
3480 strcat (buf, ", relocatable module");
d4cb0ea0 3481 break;
13761a11
NC
3482
3483 case EM_MSP430:
3484 strcat (buf, _(": architecture variant: "));
3485 switch (e_flags & EF_MSP430_MACH)
3486 {
3487 case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3488 case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3489 case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3490 case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3491 case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3492 case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3493 case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3494 case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3495 case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3496 case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3497 case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3498 case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3499 case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3500 case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3501 case E_MSP430_MACH_MSP430X : strcat (buf, "MSP430X"); break;
3502 default:
3503 strcat (buf, _(": unknown")); break;
3504 }
3505
3506 if (e_flags & ~ EF_MSP430_MACH)
3507 strcat (buf, _(": unknown extra flag bits also present"));
252b5132
RH
3508 }
3509 }
3510
3511 return buf;
3512}
3513
252b5132 3514static const char *
d3ba0551
AM
3515get_osabi_name (unsigned int osabi)
3516{
3517 static char buff[32];
3518
3519 switch (osabi)
3520 {
3521 case ELFOSABI_NONE: return "UNIX - System V";
3522 case ELFOSABI_HPUX: return "UNIX - HP-UX";
3523 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
9c55345c 3524 case ELFOSABI_GNU: return "UNIX - GNU";
d3ba0551
AM
3525 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
3526 case ELFOSABI_AIX: return "UNIX - AIX";
3527 case ELFOSABI_IRIX: return "UNIX - IRIX";
3528 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
3529 case ELFOSABI_TRU64: return "UNIX - TRU64";
3530 case ELFOSABI_MODESTO: return "Novell - Modesto";
3531 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
3532 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
3533 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
3b26c801 3534 case ELFOSABI_AROS: return "AROS";
11636f9e 3535 case ELFOSABI_FENIXOS: return "FenixOS";
d3ba0551 3536 default:
40b36596
JM
3537 if (osabi >= 64)
3538 switch (elf_header.e_machine)
3539 {
3540 case EM_ARM:
3541 switch (osabi)
3542 {
3543 case ELFOSABI_ARM: return "ARM";
3544 default:
3545 break;
3546 }
3547 break;
3548
3549 case EM_MSP430:
3550 case EM_MSP430_OLD:
619ed720 3551 case EM_VISIUM:
40b36596
JM
3552 switch (osabi)
3553 {
3554 case ELFOSABI_STANDALONE: return _("Standalone App");
3555 default:
3556 break;
3557 }
3558 break;
3559
3560 case EM_TI_C6000:
3561 switch (osabi)
3562 {
3563 case ELFOSABI_C6000_ELFABI: return _("Bare-metal C6000");
3564 case ELFOSABI_C6000_LINUX: return "Linux C6000";
3565 default:
3566 break;
3567 }
3568 break;
3569
3570 default:
3571 break;
3572 }
e9e44622 3573 snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
d3ba0551
AM
3574 return buff;
3575 }
3576}
3577
a06ea964
NC
3578static const char *
3579get_aarch64_segment_type (unsigned long type)
3580{
3581 switch (type)
3582 {
3583 case PT_AARCH64_ARCHEXT:
3584 return "AARCH64_ARCHEXT";
3585 default:
3586 break;
3587 }
3588
3589 return NULL;
3590}
3591
b294bdf8
MM
3592static const char *
3593get_arm_segment_type (unsigned long type)
3594{
3595 switch (type)
3596 {
3597 case PT_ARM_EXIDX:
3598 return "EXIDX";
3599 default:
3600 break;
3601 }
3602
3603 return NULL;
3604}
3605
d3ba0551
AM
3606static const char *
3607get_mips_segment_type (unsigned long type)
252b5132
RH
3608{
3609 switch (type)
3610 {
3611 case PT_MIPS_REGINFO:
3612 return "REGINFO";
3613 case PT_MIPS_RTPROC:
3614 return "RTPROC";
3615 case PT_MIPS_OPTIONS:
3616 return "OPTIONS";
351cdf24
MF
3617 case PT_MIPS_ABIFLAGS:
3618 return "ABIFLAGS";
252b5132
RH
3619 default:
3620 break;
3621 }
3622
3623 return NULL;
3624}
3625
103f02d3 3626static const char *
d3ba0551 3627get_parisc_segment_type (unsigned long type)
103f02d3
UD
3628{
3629 switch (type)
3630 {
3631 case PT_HP_TLS: return "HP_TLS";
3632 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
3633 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
3634 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
3635 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
3636 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
3637 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
3638 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
3639 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
3640 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
3641 case PT_HP_PARALLEL: return "HP_PARALLEL";
3642 case PT_HP_FASTBIND: return "HP_FASTBIND";
eec8f817
DA
3643 case PT_HP_OPT_ANNOT: return "HP_OPT_ANNOT";
3644 case PT_HP_HSL_ANNOT: return "HP_HSL_ANNOT";
3645 case PT_HP_STACK: return "HP_STACK";
3646 case PT_HP_CORE_UTSNAME: return "HP_CORE_UTSNAME";
103f02d3
UD
3647 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
3648 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
61472819 3649 case PT_PARISC_WEAKORDER: return "PARISC_WEAKORDER";
103f02d3
UD
3650 default:
3651 break;
3652 }
3653
3654 return NULL;
3655}
3656
4d6ed7c8 3657static const char *
d3ba0551 3658get_ia64_segment_type (unsigned long type)
4d6ed7c8
NC
3659{
3660 switch (type)
3661 {
3662 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
3663 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
00428cca
AM
3664 case PT_HP_TLS: return "HP_TLS";
3665 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
3666 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
3667 case PT_IA_64_HP_STACK: return "HP_STACK";
4d6ed7c8
NC
3668 default:
3669 break;
3670 }
3671
3672 return NULL;
3673}
3674
40b36596
JM
3675static const char *
3676get_tic6x_segment_type (unsigned long type)
3677{
3678 switch (type)
3679 {
3680 case PT_C6000_PHATTR: return "C6000_PHATTR";
3681 default:
3682 break;
3683 }
3684
3685 return NULL;
3686}
3687
5522f910
NC
3688static const char *
3689get_solaris_segment_type (unsigned long type)
3690{
3691 switch (type)
3692 {
3693 case 0x6464e550: return "PT_SUNW_UNWIND";
3694 case 0x6474e550: return "PT_SUNW_EH_FRAME";
3695 case 0x6ffffff7: return "PT_LOSUNW";
3696 case 0x6ffffffa: return "PT_SUNWBSS";
3697 case 0x6ffffffb: return "PT_SUNWSTACK";
3698 case 0x6ffffffc: return "PT_SUNWDTRACE";
3699 case 0x6ffffffd: return "PT_SUNWCAP";
3700 case 0x6fffffff: return "PT_HISUNW";
3701 default: return NULL;
3702 }
3703}
3704
252b5132 3705static const char *
d3ba0551 3706get_segment_type (unsigned long p_type)
252b5132 3707{
b34976b6 3708 static char buff[32];
252b5132
RH
3709
3710 switch (p_type)
3711 {
b34976b6
AM
3712 case PT_NULL: return "NULL";
3713 case PT_LOAD: return "LOAD";
252b5132 3714 case PT_DYNAMIC: return "DYNAMIC";
b34976b6
AM
3715 case PT_INTERP: return "INTERP";
3716 case PT_NOTE: return "NOTE";
3717 case PT_SHLIB: return "SHLIB";
3718 case PT_PHDR: return "PHDR";
13ae64f3 3719 case PT_TLS: return "TLS";
252b5132 3720
65765700
JJ
3721 case PT_GNU_EH_FRAME:
3722 return "GNU_EH_FRAME";
2b05f1b7 3723 case PT_GNU_STACK: return "GNU_STACK";
8c37241b 3724 case PT_GNU_RELRO: return "GNU_RELRO";
65765700 3725
252b5132
RH
3726 default:
3727 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3728 {
2cf0635d 3729 const char * result;
103f02d3 3730
252b5132
RH
3731 switch (elf_header.e_machine)
3732 {
a06ea964
NC
3733 case EM_AARCH64:
3734 result = get_aarch64_segment_type (p_type);
3735 break;
b294bdf8
MM
3736 case EM_ARM:
3737 result = get_arm_segment_type (p_type);
3738 break;
252b5132 3739 case EM_MIPS:
4fe85591 3740 case EM_MIPS_RS3_LE:
252b5132
RH
3741 result = get_mips_segment_type (p_type);
3742 break;
103f02d3
UD
3743 case EM_PARISC:
3744 result = get_parisc_segment_type (p_type);
3745 break;
4d6ed7c8
NC
3746 case EM_IA_64:
3747 result = get_ia64_segment_type (p_type);
3748 break;
40b36596
JM
3749 case EM_TI_C6000:
3750 result = get_tic6x_segment_type (p_type);
3751 break;
252b5132
RH
3752 default:
3753 result = NULL;
3754 break;
3755 }
103f02d3 3756
252b5132
RH
3757 if (result != NULL)
3758 return result;
103f02d3 3759
252b5132
RH
3760 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
3761 }
3762 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
103f02d3 3763 {
2cf0635d 3764 const char * result;
103f02d3
UD
3765
3766 switch (elf_header.e_machine)
3767 {
3768 case EM_PARISC:
3769 result = get_parisc_segment_type (p_type);
3770 break;
00428cca
AM
3771 case EM_IA_64:
3772 result = get_ia64_segment_type (p_type);
3773 break;
103f02d3 3774 default:
5522f910
NC
3775 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
3776 result = get_solaris_segment_type (p_type);
3777 else
3778 result = NULL;
103f02d3
UD
3779 break;
3780 }
3781
3782 if (result != NULL)
3783 return result;
3784
3785 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
3786 }
252b5132 3787 else
e9e44622 3788 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
252b5132
RH
3789
3790 return buff;
3791 }
3792}
3793
3794static const char *
d3ba0551 3795get_mips_section_type_name (unsigned int sh_type)
252b5132
RH
3796{
3797 switch (sh_type)
3798 {
b34976b6
AM
3799 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
3800 case SHT_MIPS_MSYM: return "MIPS_MSYM";
3801 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
3802 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
3803 case SHT_MIPS_UCODE: return "MIPS_UCODE";
3804 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
3805 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
3806 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
3807 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
3808 case SHT_MIPS_RELD: return "MIPS_RELD";
3809 case SHT_MIPS_IFACE: return "MIPS_IFACE";
3810 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
3811 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
3812 case SHT_MIPS_SHDR: return "MIPS_SHDR";
3813 case SHT_MIPS_FDESC: return "MIPS_FDESC";
3814 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
3815 case SHT_MIPS_DENSE: return "MIPS_DENSE";
3816 case SHT_MIPS_PDESC: return "MIPS_PDESC";
3817 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
3818 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
3819 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
3820 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
3821 case SHT_MIPS_LINE: return "MIPS_LINE";
3822 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
3823 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
3824 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
3825 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
3826 case SHT_MIPS_DWARF: return "MIPS_DWARF";
3827 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
3828 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
3829 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
3830 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
3831 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
3832 case SHT_MIPS_XLATE: return "MIPS_XLATE";
3833 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
3834 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
3835 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
3836 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
252b5132 3837 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
351cdf24 3838 case SHT_MIPS_ABIFLAGS: return "MIPS_ABIFLAGS";
252b5132
RH
3839 default:
3840 break;
3841 }
3842 return NULL;
3843}
3844
103f02d3 3845static const char *
d3ba0551 3846get_parisc_section_type_name (unsigned int sh_type)
103f02d3
UD
3847{
3848 switch (sh_type)
3849 {
3850 case SHT_PARISC_EXT: return "PARISC_EXT";
3851 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
3852 case SHT_PARISC_DOC: return "PARISC_DOC";
eec8f817
DA
3853 case SHT_PARISC_ANNOT: return "PARISC_ANNOT";
3854 case SHT_PARISC_SYMEXTN: return "PARISC_SYMEXTN";
3855 case SHT_PARISC_STUBS: return "PARISC_STUBS";
61472819 3856 case SHT_PARISC_DLKM: return "PARISC_DLKM";
103f02d3
UD
3857 default:
3858 break;
3859 }
3860 return NULL;
3861}
3862
4d6ed7c8 3863static const char *
d3ba0551 3864get_ia64_section_type_name (unsigned int sh_type)
4d6ed7c8 3865{
18bd398b 3866 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
ecc51f48
NC
3867 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
3868 return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
0de14b54 3869
4d6ed7c8
NC
3870 switch (sh_type)
3871 {
148b93f2
NC
3872 case SHT_IA_64_EXT: return "IA_64_EXT";
3873 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
3874 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
3875 case SHT_IA_64_VMS_TRACE: return "VMS_TRACE";
3876 case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
3877 case SHT_IA_64_VMS_DEBUG: return "VMS_DEBUG";
3878 case SHT_IA_64_VMS_DEBUG_STR: return "VMS_DEBUG_STR";
3879 case SHT_IA_64_VMS_LINKAGES: return "VMS_LINKAGES";
3880 case SHT_IA_64_VMS_SYMBOL_VECTOR: return "VMS_SYMBOL_VECTOR";
3881 case SHT_IA_64_VMS_FIXUP: return "VMS_FIXUP";
4d6ed7c8
NC
3882 default:
3883 break;
3884 }
3885 return NULL;
3886}
3887
d2b2c203
DJ
3888static const char *
3889get_x86_64_section_type_name (unsigned int sh_type)
3890{
3891 switch (sh_type)
3892 {
3893 case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
3894 default:
3895 break;
3896 }
3897 return NULL;
3898}
3899
a06ea964
NC
3900static const char *
3901get_aarch64_section_type_name (unsigned int sh_type)
3902{
3903 switch (sh_type)
3904 {
3905 case SHT_AARCH64_ATTRIBUTES:
3906 return "AARCH64_ATTRIBUTES";
3907 default:
3908 break;
3909 }
3910 return NULL;
3911}
3912
40a18ebd
NC
3913static const char *
3914get_arm_section_type_name (unsigned int sh_type)
3915{
3916 switch (sh_type)
3917 {
7f6fed87
NC
3918 case SHT_ARM_EXIDX: return "ARM_EXIDX";
3919 case SHT_ARM_PREEMPTMAP: return "ARM_PREEMPTMAP";
3920 case SHT_ARM_ATTRIBUTES: return "ARM_ATTRIBUTES";
3921 case SHT_ARM_DEBUGOVERLAY: return "ARM_DEBUGOVERLAY";
3922 case SHT_ARM_OVERLAYSECTION: return "ARM_OVERLAYSECTION";
40a18ebd
NC
3923 default:
3924 break;
3925 }
3926 return NULL;
3927}
3928
40b36596
JM
3929static const char *
3930get_tic6x_section_type_name (unsigned int sh_type)
3931{
3932 switch (sh_type)
3933 {
3934 case SHT_C6000_UNWIND:
3935 return "C6000_UNWIND";
3936 case SHT_C6000_PREEMPTMAP:
3937 return "C6000_PREEMPTMAP";
3938 case SHT_C6000_ATTRIBUTES:
3939 return "C6000_ATTRIBUTES";
3940 case SHT_TI_ICODE:
3941 return "TI_ICODE";
3942 case SHT_TI_XREF:
3943 return "TI_XREF";
3944 case SHT_TI_HANDLER:
3945 return "TI_HANDLER";
3946 case SHT_TI_INITINFO:
3947 return "TI_INITINFO";
3948 case SHT_TI_PHATTRS:
3949 return "TI_PHATTRS";
3950 default:
3951 break;
3952 }
3953 return NULL;
3954}
3955
13761a11
NC
3956static const char *
3957get_msp430x_section_type_name (unsigned int sh_type)
3958{
3959 switch (sh_type)
3960 {
3961 case SHT_MSP430_SEC_FLAGS: return "MSP430_SEC_FLAGS";
3962 case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
3963 case SHT_MSP430_ATTRIBUTES: return "MSP430_ATTRIBUTES";
3964 default: return NULL;
3965 }
3966}
3967
685080f2
NC
3968static const char *
3969get_v850_section_type_name (unsigned int sh_type)
3970{
3971 switch (sh_type)
3972 {
3973 case SHT_V850_SCOMMON: return "V850 Small Common";
3974 case SHT_V850_TCOMMON: return "V850 Tiny Common";
3975 case SHT_V850_ZCOMMON: return "V850 Zero Common";
3976 case SHT_RENESAS_IOP: return "RENESAS IOP";
3977 case SHT_RENESAS_INFO: return "RENESAS INFO";
3978 default: return NULL;
3979 }
3980}
3981
252b5132 3982static const char *
d3ba0551 3983get_section_type_name (unsigned int sh_type)
252b5132 3984{
b34976b6 3985 static char buff[32];
9fb71ee4 3986 const char * result;
252b5132
RH
3987
3988 switch (sh_type)
3989 {
3990 case SHT_NULL: return "NULL";
3991 case SHT_PROGBITS: return "PROGBITS";
3992 case SHT_SYMTAB: return "SYMTAB";
3993 case SHT_STRTAB: return "STRTAB";
3994 case SHT_RELA: return "RELA";
3995 case SHT_HASH: return "HASH";
3996 case SHT_DYNAMIC: return "DYNAMIC";
3997 case SHT_NOTE: return "NOTE";
3998 case SHT_NOBITS: return "NOBITS";
3999 case SHT_REL: return "REL";
4000 case SHT_SHLIB: return "SHLIB";
4001 case SHT_DYNSYM: return "DYNSYM";
d1133906
NC
4002 case SHT_INIT_ARRAY: return "INIT_ARRAY";
4003 case SHT_FINI_ARRAY: return "FINI_ARRAY";
4004 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
fdc90cb4 4005 case SHT_GNU_HASH: return "GNU_HASH";
93ebe586
NC
4006 case SHT_GROUP: return "GROUP";
4007 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
252b5132
RH
4008 case SHT_GNU_verdef: return "VERDEF";
4009 case SHT_GNU_verneed: return "VERNEED";
4010 case SHT_GNU_versym: return "VERSYM";
b34976b6
AM
4011 case 0x6ffffff0: return "VERSYM";
4012 case 0x6ffffffc: return "VERDEF";
252b5132
RH
4013 case 0x7ffffffd: return "AUXILIARY";
4014 case 0x7fffffff: return "FILTER";
047b2264 4015 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
252b5132
RH
4016
4017 default:
4018 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
4019 {
252b5132
RH
4020 switch (elf_header.e_machine)
4021 {
4022 case EM_MIPS:
4fe85591 4023 case EM_MIPS_RS3_LE:
252b5132
RH
4024 result = get_mips_section_type_name (sh_type);
4025 break;
103f02d3
UD
4026 case EM_PARISC:
4027 result = get_parisc_section_type_name (sh_type);
4028 break;
4d6ed7c8
NC
4029 case EM_IA_64:
4030 result = get_ia64_section_type_name (sh_type);
4031 break;
d2b2c203 4032 case EM_X86_64:
8a9036a4 4033 case EM_L1OM:
7a9068fe 4034 case EM_K1OM:
d2b2c203
DJ
4035 result = get_x86_64_section_type_name (sh_type);
4036 break;
a06ea964
NC
4037 case EM_AARCH64:
4038 result = get_aarch64_section_type_name (sh_type);
4039 break;
40a18ebd
NC
4040 case EM_ARM:
4041 result = get_arm_section_type_name (sh_type);
4042 break;
40b36596
JM
4043 case EM_TI_C6000:
4044 result = get_tic6x_section_type_name (sh_type);
4045 break;
13761a11
NC
4046 case EM_MSP430:
4047 result = get_msp430x_section_type_name (sh_type);
4048 break;
685080f2
NC
4049 case EM_V800:
4050 case EM_V850:
4051 case EM_CYGNUS_V850:
4052 result = get_v850_section_type_name (sh_type);
4053 break;
252b5132
RH
4054 default:
4055 result = NULL;
4056 break;
4057 }
4058
4059 if (result != NULL)
4060 return result;
4061
9fb71ee4 4062 sprintf (buff, "LOPROC+%#x", sh_type - SHT_LOPROC);
252b5132
RH
4063 }
4064 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
148b93f2 4065 {
148b93f2
NC
4066 switch (elf_header.e_machine)
4067 {
4068 case EM_IA_64:
4069 result = get_ia64_section_type_name (sh_type);
4070 break;
4071 default:
fd85a6a1
NC
4072 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
4073 result = get_solaris_section_type (sh_type);
4074 else
4075 result = NULL;
148b93f2
NC
4076 break;
4077 }
4078
4079 if (result != NULL)
4080 return result;
4081
9fb71ee4 4082 sprintf (buff, "LOOS+%#x", sh_type - SHT_LOOS);
148b93f2 4083 }
252b5132 4084 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
685080f2
NC
4085 {
4086 switch (elf_header.e_machine)
4087 {
4088 case EM_V800:
4089 case EM_V850:
4090 case EM_CYGNUS_V850:
9fb71ee4 4091 result = get_v850_section_type_name (sh_type);
a9fb83be 4092 break;
685080f2 4093 default:
9fb71ee4 4094 result = NULL;
685080f2
NC
4095 break;
4096 }
4097
9fb71ee4
NC
4098 if (result != NULL)
4099 return result;
4100
4101 sprintf (buff, "LOUSER+%#x", sh_type - SHT_LOUSER);
685080f2 4102 }
252b5132 4103 else
a7dbfd1c
NC
4104 /* This message is probably going to be displayed in a 15
4105 character wide field, so put the hex value first. */
4106 snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
103f02d3 4107
252b5132
RH
4108 return buff;
4109 }
4110}
4111
2979dc34 4112#define OPTION_DEBUG_DUMP 512
2c610e4b 4113#define OPTION_DYN_SYMS 513
fd2f0033
TT
4114#define OPTION_DWARF_DEPTH 514
4115#define OPTION_DWARF_START 515
4723351a 4116#define OPTION_DWARF_CHECK 516
2979dc34 4117
85b1c36d 4118static struct option options[] =
252b5132 4119{
b34976b6 4120 {"all", no_argument, 0, 'a'},
252b5132
RH
4121 {"file-header", no_argument, 0, 'h'},
4122 {"program-headers", no_argument, 0, 'l'},
b34976b6
AM
4123 {"headers", no_argument, 0, 'e'},
4124 {"histogram", no_argument, 0, 'I'},
4125 {"segments", no_argument, 0, 'l'},
4126 {"sections", no_argument, 0, 'S'},
252b5132 4127 {"section-headers", no_argument, 0, 'S'},
f5842774 4128 {"section-groups", no_argument, 0, 'g'},
5477e8a0 4129 {"section-details", no_argument, 0, 't'},
595cf52e 4130 {"full-section-name",no_argument, 0, 'N'},
b34976b6
AM
4131 {"symbols", no_argument, 0, 's'},
4132 {"syms", no_argument, 0, 's'},
2c610e4b 4133 {"dyn-syms", no_argument, 0, OPTION_DYN_SYMS},
b34976b6
AM
4134 {"relocs", no_argument, 0, 'r'},
4135 {"notes", no_argument, 0, 'n'},
4136 {"dynamic", no_argument, 0, 'd'},
a952a375 4137 {"arch-specific", no_argument, 0, 'A'},
252b5132
RH
4138 {"version-info", no_argument, 0, 'V'},
4139 {"use-dynamic", no_argument, 0, 'D'},
09c11c86 4140 {"unwind", no_argument, 0, 'u'},
4145f1d5 4141 {"archive-index", no_argument, 0, 'c'},
b34976b6 4142 {"hex-dump", required_argument, 0, 'x'},
cf13d699 4143 {"relocated-dump", required_argument, 0, 'R'},
09c11c86 4144 {"string-dump", required_argument, 0, 'p'},
0e602686 4145 {"decompress", no_argument, 0, 'z'},
252b5132
RH
4146#ifdef SUPPORT_DISASSEMBLY
4147 {"instruction-dump", required_argument, 0, 'i'},
4148#endif
cf13d699 4149 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
252b5132 4150
fd2f0033
TT
4151 {"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH},
4152 {"dwarf-start", required_argument, 0, OPTION_DWARF_START},
4723351a 4153 {"dwarf-check", no_argument, 0, OPTION_DWARF_CHECK},
fd2f0033 4154
b34976b6
AM
4155 {"version", no_argument, 0, 'v'},
4156 {"wide", no_argument, 0, 'W'},
4157 {"help", no_argument, 0, 'H'},
4158 {0, no_argument, 0, 0}
252b5132
RH
4159};
4160
4161static void
2cf0635d 4162usage (FILE * stream)
252b5132 4163{
92f01d61
JM
4164 fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
4165 fprintf (stream, _(" Display information about the contents of ELF format files\n"));
4166 fprintf (stream, _(" Options are:\n\
8b53311e
NC
4167 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4168 -h --file-header Display the ELF file header\n\
4169 -l --program-headers Display the program headers\n\
4170 --segments An alias for --program-headers\n\
4171 -S --section-headers Display the sections' header\n\
4172 --sections An alias for --section-headers\n\
f5842774 4173 -g --section-groups Display the section groups\n\
5477e8a0 4174 -t --section-details Display the section details\n\
8b53311e
NC
4175 -e --headers Equivalent to: -h -l -S\n\
4176 -s --syms Display the symbol table\n\
3f08eb35 4177 --symbols An alias for --syms\n\
2c610e4b 4178 --dyn-syms Display the dynamic symbol table\n\
8b53311e
NC
4179 -n --notes Display the core notes (if present)\n\
4180 -r --relocs Display the relocations (if present)\n\
4181 -u --unwind Display the unwind info (if present)\n\
b2d38a17 4182 -d --dynamic Display the dynamic section (if present)\n\
8b53311e 4183 -V --version-info Display the version sections (if present)\n\
1b31d05e 4184 -A --arch-specific Display architecture specific information (if any)\n\
4145f1d5 4185 -c --archive-index Display the symbol/file index in an archive\n\
8b53311e 4186 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
09c11c86
NC
4187 -x --hex-dump=<number|name>\n\
4188 Dump the contents of section <number|name> as bytes\n\
4189 -p --string-dump=<number|name>\n\
4190 Dump the contents of section <number|name> as strings\n\
cf13d699
NC
4191 -R --relocated-dump=<number|name>\n\
4192 Dump the contents of section <number|name> as relocated bytes\n\
0e602686 4193 -z --decompress Decompress section before dumping it\n\
f9f0e732 4194 -w[lLiaprmfFsoRt] or\n\
1ed06042 4195 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
6f875884 4196 =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
657d0d47
CC
4197 =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4198 =addr,=cu_index]\n\
8b53311e 4199 Display the contents of DWARF2 debug sections\n"));
fd2f0033
TT
4200 fprintf (stream, _("\
4201 --dwarf-depth=N Do not display DIEs at depth N or greater\n\
4202 --dwarf-start=N Display DIEs starting with N, at the same depth\n\
4203 or deeper\n"));
252b5132 4204#ifdef SUPPORT_DISASSEMBLY
92f01d61 4205 fprintf (stream, _("\
09c11c86
NC
4206 -i --instruction-dump=<number|name>\n\
4207 Disassemble the contents of section <number|name>\n"));
252b5132 4208#endif
92f01d61 4209 fprintf (stream, _("\
8b53311e
NC
4210 -I --histogram Display histogram of bucket list lengths\n\
4211 -W --wide Allow output width to exceed 80 characters\n\
07012eee 4212 @<file> Read options from <file>\n\
8b53311e
NC
4213 -H --help Display this information\n\
4214 -v --version Display the version number of readelf\n"));
1118d252 4215
92f01d61
JM
4216 if (REPORT_BUGS_TO[0] && stream == stdout)
4217 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
252b5132 4218
92f01d61 4219 exit (stream == stdout ? 0 : 1);
252b5132
RH
4220}
4221
18bd398b
NC
4222/* Record the fact that the user wants the contents of section number
4223 SECTION to be displayed using the method(s) encoded as flags bits
4224 in TYPE. Note, TYPE can be zero if we are creating the array for
4225 the first time. */
4226
252b5132 4227static void
09c11c86 4228request_dump_bynumber (unsigned int section, dump_type type)
252b5132
RH
4229{
4230 if (section >= num_dump_sects)
4231 {
2cf0635d 4232 dump_type * new_dump_sects;
252b5132 4233
3f5e193b
NC
4234 new_dump_sects = (dump_type *) calloc (section + 1,
4235 sizeof (* dump_sects));
252b5132
RH
4236
4237 if (new_dump_sects == NULL)
591a748a 4238 error (_("Out of memory allocating dump request table.\n"));
252b5132
RH
4239 else
4240 {
4241 /* Copy current flag settings. */
09c11c86 4242 memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
252b5132
RH
4243
4244 free (dump_sects);
4245
4246 dump_sects = new_dump_sects;
4247 num_dump_sects = section + 1;
4248 }
4249 }
4250
4251 if (dump_sects)
b34976b6 4252 dump_sects[section] |= type;
252b5132
RH
4253
4254 return;
4255}
4256
aef1f6d0
DJ
4257/* Request a dump by section name. */
4258
4259static void
2cf0635d 4260request_dump_byname (const char * section, dump_type type)
aef1f6d0 4261{
2cf0635d 4262 struct dump_list_entry * new_request;
aef1f6d0 4263
3f5e193b
NC
4264 new_request = (struct dump_list_entry *)
4265 malloc (sizeof (struct dump_list_entry));
aef1f6d0 4266 if (!new_request)
591a748a 4267 error (_("Out of memory allocating dump request table.\n"));
aef1f6d0
DJ
4268
4269 new_request->name = strdup (section);
4270 if (!new_request->name)
591a748a 4271 error (_("Out of memory allocating dump request table.\n"));
aef1f6d0
DJ
4272
4273 new_request->type = type;
4274
4275 new_request->next = dump_sects_byname;
4276 dump_sects_byname = new_request;
4277}
4278
cf13d699
NC
4279static inline void
4280request_dump (dump_type type)
4281{
4282 int section;
4283 char * cp;
4284
4285 do_dump++;
4286 section = strtoul (optarg, & cp, 0);
4287
4288 if (! *cp && section >= 0)
4289 request_dump_bynumber (section, type);
4290 else
4291 request_dump_byname (optarg, type);
4292}
4293
4294
252b5132 4295static void
2cf0635d 4296parse_args (int argc, char ** argv)
252b5132
RH
4297{
4298 int c;
4299
4300 if (argc < 2)
92f01d61 4301 usage (stderr);
252b5132
RH
4302
4303 while ((c = getopt_long
0e602686 4304 (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
252b5132 4305 {
252b5132
RH
4306 switch (c)
4307 {
4308 case 0:
4309 /* Long options. */
4310 break;
4311 case 'H':
92f01d61 4312 usage (stdout);
252b5132
RH
4313 break;
4314
4315 case 'a':
b34976b6
AM
4316 do_syms++;
4317 do_reloc++;
4318 do_unwind++;
4319 do_dynamic++;
4320 do_header++;
4321 do_sections++;
f5842774 4322 do_section_groups++;
b34976b6
AM
4323 do_segments++;
4324 do_version++;
4325 do_histogram++;
4326 do_arch++;
4327 do_notes++;
252b5132 4328 break;
f5842774
L
4329 case 'g':
4330 do_section_groups++;
4331 break;
5477e8a0 4332 case 't':
595cf52e 4333 case 'N':
5477e8a0
L
4334 do_sections++;
4335 do_section_details++;
595cf52e 4336 break;
252b5132 4337 case 'e':
b34976b6
AM
4338 do_header++;
4339 do_sections++;
4340 do_segments++;
252b5132 4341 break;
a952a375 4342 case 'A':
b34976b6 4343 do_arch++;
a952a375 4344 break;
252b5132 4345 case 'D':
b34976b6 4346 do_using_dynamic++;
252b5132
RH
4347 break;
4348 case 'r':
b34976b6 4349 do_reloc++;
252b5132 4350 break;
4d6ed7c8 4351 case 'u':
b34976b6 4352 do_unwind++;
4d6ed7c8 4353 break;
252b5132 4354 case 'h':
b34976b6 4355 do_header++;
252b5132
RH
4356 break;
4357 case 'l':
b34976b6 4358 do_segments++;
252b5132
RH
4359 break;
4360 case 's':
b34976b6 4361 do_syms++;
252b5132
RH
4362 break;
4363 case 'S':
b34976b6 4364 do_sections++;
252b5132
RH
4365 break;
4366 case 'd':
b34976b6 4367 do_dynamic++;
252b5132 4368 break;
a952a375 4369 case 'I':
b34976b6 4370 do_histogram++;
a952a375 4371 break;
779fe533 4372 case 'n':
b34976b6 4373 do_notes++;
779fe533 4374 break;
4145f1d5
NC
4375 case 'c':
4376 do_archive_index++;
4377 break;
252b5132 4378 case 'x':
cf13d699 4379 request_dump (HEX_DUMP);
aef1f6d0 4380 break;
09c11c86 4381 case 'p':
cf13d699
NC
4382 request_dump (STRING_DUMP);
4383 break;
4384 case 'R':
4385 request_dump (RELOC_DUMP);
09c11c86 4386 break;
0e602686
NC
4387 case 'z':
4388 decompress_dumps++;
4389 break;
252b5132 4390 case 'w':
b34976b6 4391 do_dump++;
252b5132 4392 if (optarg == 0)
613ff48b
CC
4393 {
4394 do_debugging = 1;
4395 dwarf_select_sections_all ();
4396 }
252b5132
RH
4397 else
4398 {
4399 do_debugging = 0;
4cb93e3b 4400 dwarf_select_sections_by_letters (optarg);
252b5132
RH
4401 }
4402 break;
2979dc34 4403 case OPTION_DEBUG_DUMP:
b34976b6 4404 do_dump++;
2979dc34
JJ
4405 if (optarg == 0)
4406 do_debugging = 1;
4407 else
4408 {
2979dc34 4409 do_debugging = 0;
4cb93e3b 4410 dwarf_select_sections_by_names (optarg);
2979dc34
JJ
4411 }
4412 break;
fd2f0033
TT
4413 case OPTION_DWARF_DEPTH:
4414 {
4415 char *cp;
4416
4417 dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4418 }
4419 break;
4420 case OPTION_DWARF_START:
4421 {
4422 char *cp;
4423
4424 dwarf_start_die = strtoul (optarg, & cp, 0);
4425 }
4426 break;
4723351a
CC
4427 case OPTION_DWARF_CHECK:
4428 dwarf_check = 1;
4429 break;
2c610e4b
L
4430 case OPTION_DYN_SYMS:
4431 do_dyn_syms++;
4432 break;
252b5132
RH
4433#ifdef SUPPORT_DISASSEMBLY
4434 case 'i':
cf13d699
NC
4435 request_dump (DISASS_DUMP);
4436 break;
252b5132
RH
4437#endif
4438 case 'v':
4439 print_version (program_name);
4440 break;
4441 case 'V':
b34976b6 4442 do_version++;
252b5132 4443 break;
d974e256 4444 case 'W':
b34976b6 4445 do_wide++;
d974e256 4446 break;
252b5132 4447 default:
252b5132
RH
4448 /* xgettext:c-format */
4449 error (_("Invalid option '-%c'\n"), c);
4450 /* Drop through. */
4451 case '?':
92f01d61 4452 usage (stderr);
252b5132
RH
4453 }
4454 }
4455
4d6ed7c8 4456 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
252b5132 4457 && !do_segments && !do_header && !do_dump && !do_version
f5842774 4458 && !do_histogram && !do_debugging && !do_arch && !do_notes
2c610e4b
L
4459 && !do_section_groups && !do_archive_index
4460 && !do_dyn_syms)
92f01d61 4461 usage (stderr);
252b5132
RH
4462}
4463
4464static const char *
d3ba0551 4465get_elf_class (unsigned int elf_class)
252b5132 4466{
b34976b6 4467 static char buff[32];
103f02d3 4468
252b5132
RH
4469 switch (elf_class)
4470 {
4471 case ELFCLASSNONE: return _("none");
e3c8793a
NC
4472 case ELFCLASS32: return "ELF32";
4473 case ELFCLASS64: return "ELF64";
ab5e7794 4474 default:
e9e44622 4475 snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
ab5e7794 4476 return buff;
252b5132
RH
4477 }
4478}
4479
4480static const char *
d3ba0551 4481get_data_encoding (unsigned int encoding)
252b5132 4482{
b34976b6 4483 static char buff[32];
103f02d3 4484
252b5132
RH
4485 switch (encoding)
4486 {
4487 case ELFDATANONE: return _("none");
33c63f9d
CM
4488 case ELFDATA2LSB: return _("2's complement, little endian");
4489 case ELFDATA2MSB: return _("2's complement, big endian");
103f02d3 4490 default:
e9e44622 4491 snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
ab5e7794 4492 return buff;
252b5132
RH
4493 }
4494}
4495
252b5132 4496/* Decode the data held in 'elf_header'. */
ee42cf8c 4497
252b5132 4498static int
d3ba0551 4499process_file_header (void)
252b5132 4500{
b34976b6
AM
4501 if ( elf_header.e_ident[EI_MAG0] != ELFMAG0
4502 || elf_header.e_ident[EI_MAG1] != ELFMAG1
4503 || elf_header.e_ident[EI_MAG2] != ELFMAG2
4504 || elf_header.e_ident[EI_MAG3] != ELFMAG3)
252b5132
RH
4505 {
4506 error
4507 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4508 return 0;
4509 }
4510
2dc4cec1
L
4511 init_dwarf_regnames (elf_header.e_machine);
4512
252b5132
RH
4513 if (do_header)
4514 {
4515 int i;
4516
4517 printf (_("ELF Header:\n"));
4518 printf (_(" Magic: "));
b34976b6
AM
4519 for (i = 0; i < EI_NIDENT; i++)
4520 printf ("%2.2x ", elf_header.e_ident[i]);
252b5132
RH
4521 printf ("\n");
4522 printf (_(" Class: %s\n"),
b34976b6 4523 get_elf_class (elf_header.e_ident[EI_CLASS]));
252b5132 4524 printf (_(" Data: %s\n"),
b34976b6 4525 get_data_encoding (elf_header.e_ident[EI_DATA]));
252b5132 4526 printf (_(" Version: %d %s\n"),
b34976b6
AM
4527 elf_header.e_ident[EI_VERSION],
4528 (elf_header.e_ident[EI_VERSION] == EV_CURRENT
789be9f7 4529 ? "(current)"
b34976b6 4530 : (elf_header.e_ident[EI_VERSION] != EV_NONE
2b692964 4531 ? _("<unknown: %lx>")
789be9f7 4532 : "")));
252b5132 4533 printf (_(" OS/ABI: %s\n"),
b34976b6 4534 get_osabi_name (elf_header.e_ident[EI_OSABI]));
252b5132 4535 printf (_(" ABI Version: %d\n"),
b34976b6 4536 elf_header.e_ident[EI_ABIVERSION]);
252b5132
RH
4537 printf (_(" Type: %s\n"),
4538 get_file_type (elf_header.e_type));
4539 printf (_(" Machine: %s\n"),
4540 get_machine_name (elf_header.e_machine));
4541 printf (_(" Version: 0x%lx\n"),
4542 (unsigned long) elf_header.e_version);
76da6bbe 4543
f7a99963
NC
4544 printf (_(" Entry point address: "));
4545 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4546 printf (_("\n Start of program headers: "));
4547 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4548 printf (_(" (bytes into file)\n Start of section headers: "));
4549 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
4550 printf (_(" (bytes into file)\n"));
76da6bbe 4551
252b5132
RH
4552 printf (_(" Flags: 0x%lx%s\n"),
4553 (unsigned long) elf_header.e_flags,
4554 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
4555 printf (_(" Size of this header: %ld (bytes)\n"),
4556 (long) elf_header.e_ehsize);
4557 printf (_(" Size of program headers: %ld (bytes)\n"),
4558 (long) elf_header.e_phentsize);
2046a35d 4559 printf (_(" Number of program headers: %ld"),
252b5132 4560 (long) elf_header.e_phnum);
2046a35d
AM
4561 if (section_headers != NULL
4562 && elf_header.e_phnum == PN_XNUM
4563 && section_headers[0].sh_info != 0)
cc5914eb 4564 printf (" (%ld)", (long) section_headers[0].sh_info);
2046a35d 4565 putc ('\n', stdout);
252b5132
RH
4566 printf (_(" Size of section headers: %ld (bytes)\n"),
4567 (long) elf_header.e_shentsize);
560f3c1c 4568 printf (_(" Number of section headers: %ld"),
252b5132 4569 (long) elf_header.e_shnum);
4fbb74a6 4570 if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
560f3c1c
AM
4571 printf (" (%ld)", (long) section_headers[0].sh_size);
4572 putc ('\n', stdout);
4573 printf (_(" Section header string table index: %ld"),
252b5132 4574 (long) elf_header.e_shstrndx);
4fbb74a6
AM
4575 if (section_headers != NULL
4576 && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
72de5009 4577 printf (" (%u)", section_headers[0].sh_link);
15ba6505
AM
4578 else if (elf_header.e_shstrndx != SHN_UNDEF
4579 && elf_header.e_shstrndx >= elf_header.e_shnum)
2b692964 4580 printf (_(" <corrupt: out of range>"));
560f3c1c
AM
4581 putc ('\n', stdout);
4582 }
4583
4584 if (section_headers != NULL)
4585 {
2046a35d
AM
4586 if (elf_header.e_phnum == PN_XNUM
4587 && section_headers[0].sh_info != 0)
4588 elf_header.e_phnum = section_headers[0].sh_info;
4fbb74a6 4589 if (elf_header.e_shnum == SHN_UNDEF)
560f3c1c 4590 elf_header.e_shnum = section_headers[0].sh_size;
4fbb74a6 4591 if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
560f3c1c 4592 elf_header.e_shstrndx = section_headers[0].sh_link;
4fbb74a6 4593 else if (elf_header.e_shstrndx >= elf_header.e_shnum)
0b49d371 4594 elf_header.e_shstrndx = SHN_UNDEF;
560f3c1c
AM
4595 free (section_headers);
4596 section_headers = NULL;
252b5132 4597 }
103f02d3 4598
9ea033b2
NC
4599 return 1;
4600}
4601
e0a31db1 4602static bfd_boolean
91d6fa6a 4603get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
9ea033b2 4604{
2cf0635d
NC
4605 Elf32_External_Phdr * phdrs;
4606 Elf32_External_Phdr * external;
4607 Elf_Internal_Phdr * internal;
b34976b6 4608 unsigned int i;
e0a31db1
NC
4609 unsigned int size = elf_header.e_phentsize;
4610 unsigned int num = elf_header.e_phnum;
4611
4612 /* PR binutils/17531: Cope with unexpected section header sizes. */
4613 if (size == 0 || num == 0)
4614 return FALSE;
4615 if (size < sizeof * phdrs)
4616 {
4617 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4618 return FALSE;
4619 }
4620 if (size > sizeof * phdrs)
4621 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
103f02d3 4622
3f5e193b 4623 phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
e0a31db1
NC
4624 size, num, _("program headers"));
4625 if (phdrs == NULL)
4626 return FALSE;
9ea033b2 4627
91d6fa6a 4628 for (i = 0, internal = pheaders, external = phdrs;
9ea033b2 4629 i < elf_header.e_phnum;
b34976b6 4630 i++, internal++, external++)
252b5132 4631 {
9ea033b2
NC
4632 internal->p_type = BYTE_GET (external->p_type);
4633 internal->p_offset = BYTE_GET (external->p_offset);
4634 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4635 internal->p_paddr = BYTE_GET (external->p_paddr);
4636 internal->p_filesz = BYTE_GET (external->p_filesz);
4637 internal->p_memsz = BYTE_GET (external->p_memsz);
4638 internal->p_flags = BYTE_GET (external->p_flags);
4639 internal->p_align = BYTE_GET (external->p_align);
252b5132
RH
4640 }
4641
9ea033b2 4642 free (phdrs);
e0a31db1 4643 return TRUE;
252b5132
RH
4644}
4645
e0a31db1 4646static bfd_boolean
91d6fa6a 4647get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
9ea033b2 4648{
2cf0635d
NC
4649 Elf64_External_Phdr * phdrs;
4650 Elf64_External_Phdr * external;
4651 Elf_Internal_Phdr * internal;
b34976b6 4652 unsigned int i;
e0a31db1
NC
4653 unsigned int size = elf_header.e_phentsize;
4654 unsigned int num = elf_header.e_phnum;
4655
4656 /* PR binutils/17531: Cope with unexpected section header sizes. */
4657 if (size == 0 || num == 0)
4658 return FALSE;
4659 if (size < sizeof * phdrs)
4660 {
4661 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4662 return FALSE;
4663 }
4664 if (size > sizeof * phdrs)
4665 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
103f02d3 4666
3f5e193b 4667 phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
e0a31db1 4668 size, num, _("program headers"));
a6e9f9df 4669 if (!phdrs)
e0a31db1 4670 return FALSE;
9ea033b2 4671
91d6fa6a 4672 for (i = 0, internal = pheaders, external = phdrs;
9ea033b2 4673 i < elf_header.e_phnum;
b34976b6 4674 i++, internal++, external++)
9ea033b2
NC
4675 {
4676 internal->p_type = BYTE_GET (external->p_type);
4677 internal->p_flags = BYTE_GET (external->p_flags);
66543521
AM
4678 internal->p_offset = BYTE_GET (external->p_offset);
4679 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4680 internal->p_paddr = BYTE_GET (external->p_paddr);
4681 internal->p_filesz = BYTE_GET (external->p_filesz);
4682 internal->p_memsz = BYTE_GET (external->p_memsz);
4683 internal->p_align = BYTE_GET (external->p_align);
9ea033b2
NC
4684 }
4685
4686 free (phdrs);
e0a31db1 4687 return TRUE;
9ea033b2 4688}
252b5132 4689
d93f0186
NC
4690/* Returns 1 if the program headers were read into `program_headers'. */
4691
4692static int
2cf0635d 4693get_program_headers (FILE * file)
d93f0186 4694{
2cf0635d 4695 Elf_Internal_Phdr * phdrs;
d93f0186
NC
4696
4697 /* Check cache of prior read. */
4698 if (program_headers != NULL)
4699 return 1;
4700
3f5e193b
NC
4701 phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
4702 sizeof (Elf_Internal_Phdr));
d93f0186
NC
4703
4704 if (phdrs == NULL)
4705 {
8b73c356
NC
4706 error (_("Out of memory reading %u program headers\n"),
4707 elf_header.e_phnum);
d93f0186
NC
4708 return 0;
4709 }
4710
4711 if (is_32bit_elf
4712 ? get_32bit_program_headers (file, phdrs)
4713 : get_64bit_program_headers (file, phdrs))
4714 {
4715 program_headers = phdrs;
4716 return 1;
4717 }
4718
4719 free (phdrs);
4720 return 0;
4721}
4722
2f62977e
NC
4723/* Returns 1 if the program headers were loaded. */
4724
252b5132 4725static int
2cf0635d 4726process_program_headers (FILE * file)
252b5132 4727{
2cf0635d 4728 Elf_Internal_Phdr * segment;
b34976b6 4729 unsigned int i;
252b5132
RH
4730
4731 if (elf_header.e_phnum == 0)
4732 {
82f2dbf7
NC
4733 /* PR binutils/12467. */
4734 if (elf_header.e_phoff != 0)
4735 warn (_("possibly corrupt ELF header - it has a non-zero program"
9035ed51 4736 " header offset, but no program headers\n"));
82f2dbf7 4737 else if (do_segments)
252b5132 4738 printf (_("\nThere are no program headers in this file.\n"));
2f62977e 4739 return 0;
252b5132
RH
4740 }
4741
4742 if (do_segments && !do_header)
4743 {
f7a99963
NC
4744 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
4745 printf (_("Entry point "));
4746 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4747 printf (_("\nThere are %d program headers, starting at offset "),
4748 elf_header.e_phnum);
4749 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4750 printf ("\n");
252b5132
RH
4751 }
4752
d93f0186 4753 if (! get_program_headers (file))
252b5132 4754 return 0;
103f02d3 4755
252b5132
RH
4756 if (do_segments)
4757 {
3a1a2036
NC
4758 if (elf_header.e_phnum > 1)
4759 printf (_("\nProgram Headers:\n"));
4760 else
4761 printf (_("\nProgram Headers:\n"));
76da6bbe 4762
f7a99963
NC
4763 if (is_32bit_elf)
4764 printf
4765 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
d974e256
JJ
4766 else if (do_wide)
4767 printf
4768 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
f7a99963
NC
4769 else
4770 {
4771 printf
4772 (_(" Type Offset VirtAddr PhysAddr\n"));
4773 printf
4774 (_(" FileSiz MemSiz Flags Align\n"));
4775 }
252b5132
RH
4776 }
4777
252b5132 4778 dynamic_addr = 0;
1b228002 4779 dynamic_size = 0;
252b5132
RH
4780
4781 for (i = 0, segment = program_headers;
4782 i < elf_header.e_phnum;
b34976b6 4783 i++, segment++)
252b5132
RH
4784 {
4785 if (do_segments)
4786 {
103f02d3 4787 printf (" %-14.14s ", get_segment_type (segment->p_type));
f7a99963
NC
4788
4789 if (is_32bit_elf)
4790 {
4791 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4792 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
4793 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
4794 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
4795 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
4796 printf ("%c%c%c ",
4797 (segment->p_flags & PF_R ? 'R' : ' '),
4798 (segment->p_flags & PF_W ? 'W' : ' '),
4799 (segment->p_flags & PF_X ? 'E' : ' '));
4800 printf ("%#lx", (unsigned long) segment->p_align);
4801 }
d974e256
JJ
4802 else if (do_wide)
4803 {
4804 if ((unsigned long) segment->p_offset == segment->p_offset)
4805 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4806 else
4807 {
4808 print_vma (segment->p_offset, FULL_HEX);
4809 putchar (' ');
4810 }
4811
4812 print_vma (segment->p_vaddr, FULL_HEX);
4813 putchar (' ');
4814 print_vma (segment->p_paddr, FULL_HEX);
4815 putchar (' ');
4816
4817 if ((unsigned long) segment->p_filesz == segment->p_filesz)
4818 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
4819 else
4820 {
4821 print_vma (segment->p_filesz, FULL_HEX);
4822 putchar (' ');
4823 }
4824
4825 if ((unsigned long) segment->p_memsz == segment->p_memsz)
4826 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
4827 else
4828 {
f48e6c45 4829 print_vma (segment->p_memsz, FULL_HEX);
d974e256
JJ
4830 }
4831
4832 printf (" %c%c%c ",
4833 (segment->p_flags & PF_R ? 'R' : ' '),
4834 (segment->p_flags & PF_W ? 'W' : ' '),
4835 (segment->p_flags & PF_X ? 'E' : ' '));
4836
4837 if ((unsigned long) segment->p_align == segment->p_align)
4838 printf ("%#lx", (unsigned long) segment->p_align);
4839 else
4840 {
4841 print_vma (segment->p_align, PREFIX_HEX);
4842 }
4843 }
f7a99963
NC
4844 else
4845 {
4846 print_vma (segment->p_offset, FULL_HEX);
4847 putchar (' ');
4848 print_vma (segment->p_vaddr, FULL_HEX);
4849 putchar (' ');
4850 print_vma (segment->p_paddr, FULL_HEX);
4851 printf ("\n ");
4852 print_vma (segment->p_filesz, FULL_HEX);
4853 putchar (' ');
4854 print_vma (segment->p_memsz, FULL_HEX);
4855 printf (" %c%c%c ",
4856 (segment->p_flags & PF_R ? 'R' : ' '),
4857 (segment->p_flags & PF_W ? 'W' : ' '),
4858 (segment->p_flags & PF_X ? 'E' : ' '));
4859 print_vma (segment->p_align, HEX);
4860 }
252b5132
RH
4861 }
4862
f54498b4
NC
4863 if (do_segments)
4864 putc ('\n', stdout);
4865
252b5132
RH
4866 switch (segment->p_type)
4867 {
252b5132
RH
4868 case PT_DYNAMIC:
4869 if (dynamic_addr)
4870 error (_("more than one dynamic segment\n"));
4871
20737c13
AM
4872 /* By default, assume that the .dynamic section is the first
4873 section in the DYNAMIC segment. */
4874 dynamic_addr = segment->p_offset;
4875 dynamic_size = segment->p_filesz;
f54498b4
NC
4876 /* PR binutils/17512: Avoid corrupt dynamic section info in the segment. */
4877 if (dynamic_addr + dynamic_size >= current_file_size)
4878 {
4879 error (_("the dynamic segment offset + size exceeds the size of the file\n"));
4880 dynamic_addr = dynamic_size = 0;
4881 }
20737c13 4882
b2d38a17
NC
4883 /* Try to locate the .dynamic section. If there is
4884 a section header table, we can easily locate it. */
4885 if (section_headers != NULL)
4886 {
2cf0635d 4887 Elf_Internal_Shdr * sec;
b2d38a17 4888
89fac5e3
RS
4889 sec = find_section (".dynamic");
4890 if (sec == NULL || sec->sh_size == 0)
b2d38a17 4891 {
28f997cf
TG
4892 /* A corresponding .dynamic section is expected, but on
4893 IA-64/OpenVMS it is OK for it to be missing. */
4894 if (!is_ia64_vms ())
4895 error (_("no .dynamic section in the dynamic segment\n"));
b2d38a17
NC
4896 break;
4897 }
4898
42bb2e33 4899 if (sec->sh_type == SHT_NOBITS)
20737c13
AM
4900 {
4901 dynamic_size = 0;
4902 break;
4903 }
42bb2e33 4904
b2d38a17
NC
4905 dynamic_addr = sec->sh_offset;
4906 dynamic_size = sec->sh_size;
4907
4908 if (dynamic_addr < segment->p_offset
4909 || dynamic_addr > segment->p_offset + segment->p_filesz)
20737c13
AM
4910 warn (_("the .dynamic section is not contained"
4911 " within the dynamic segment\n"));
b2d38a17 4912 else if (dynamic_addr > segment->p_offset)
20737c13
AM
4913 warn (_("the .dynamic section is not the first section"
4914 " in the dynamic segment.\n"));
b2d38a17 4915 }
252b5132
RH
4916 break;
4917
4918 case PT_INTERP:
fb52b2f4
NC
4919 if (fseek (file, archive_file_offset + (long) segment->p_offset,
4920 SEEK_SET))
252b5132
RH
4921 error (_("Unable to find program interpreter name\n"));
4922 else
4923 {
f8eae8b2 4924 char fmt [32];
9495b2e6 4925 int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
f8eae8b2
L
4926
4927 if (ret >= (int) sizeof (fmt) || ret < 0)
591a748a 4928 error (_("Internal error: failed to create format string to display program interpreter\n"));
f8eae8b2 4929
252b5132 4930 program_interpreter[0] = 0;
7bd7b3ef
AM
4931 if (fscanf (file, fmt, program_interpreter) <= 0)
4932 error (_("Unable to read program interpreter name\n"));
252b5132
RH
4933
4934 if (do_segments)
f54498b4 4935 printf (_(" [Requesting program interpreter: %s]\n"),
252b5132
RH
4936 program_interpreter);
4937 }
4938 break;
4939 }
252b5132
RH
4940 }
4941
c256ffe7 4942 if (do_segments && section_headers != NULL && string_table != NULL)
252b5132
RH
4943 {
4944 printf (_("\n Section to Segment mapping:\n"));
4945 printf (_(" Segment Sections...\n"));
4946
252b5132
RH
4947 for (i = 0; i < elf_header.e_phnum; i++)
4948 {
9ad5cbcf 4949 unsigned int j;
2cf0635d 4950 Elf_Internal_Shdr * section;
252b5132
RH
4951
4952 segment = program_headers + i;
b391a3e3 4953 section = section_headers + 1;
252b5132
RH
4954
4955 printf (" %2.2d ", i);
4956
b34976b6 4957 for (j = 1; j < elf_header.e_shnum; j++, section++)
252b5132 4958 {
f4638467
AM
4959 if (!ELF_TBSS_SPECIAL (section, segment)
4960 && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
74e1a04b 4961 printf ("%s ", printable_section_name (section));
252b5132
RH
4962 }
4963
4964 putc ('\n',stdout);
4965 }
4966 }
4967
252b5132
RH
4968 return 1;
4969}
4970
4971
d93f0186
NC
4972/* Find the file offset corresponding to VMA by using the program headers. */
4973
4974static long
2cf0635d 4975offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
d93f0186 4976{
2cf0635d 4977 Elf_Internal_Phdr * seg;
d93f0186
NC
4978
4979 if (! get_program_headers (file))
4980 {
4981 warn (_("Cannot interpret virtual addresses without program headers.\n"));
4982 return (long) vma;
4983 }
4984
4985 for (seg = program_headers;
4986 seg < program_headers + elf_header.e_phnum;
4987 ++seg)
4988 {
4989 if (seg->p_type != PT_LOAD)
4990 continue;
4991
4992 if (vma >= (seg->p_vaddr & -seg->p_align)
4993 && vma + size <= seg->p_vaddr + seg->p_filesz)
4994 return vma - seg->p_vaddr + seg->p_offset;
4995 }
4996
4997 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
0af1713e 4998 (unsigned long) vma);
d93f0186
NC
4999 return (long) vma;
5000}
5001
5002
049b0c3a
NC
5003/* Allocate memory and load the sections headers into the global pointer
5004 SECTION_HEADERS. If PROBE is true, this is just a probe and we do not
5005 generate any error messages if the load fails. */
5006
5007static bfd_boolean
5008get_32bit_section_headers (FILE * file, bfd_boolean probe)
252b5132 5009{
2cf0635d
NC
5010 Elf32_External_Shdr * shdrs;
5011 Elf_Internal_Shdr * internal;
b34976b6 5012 unsigned int i;
049b0c3a
NC
5013 unsigned int size = elf_header.e_shentsize;
5014 unsigned int num = probe ? 1 : elf_header.e_shnum;
5015
5016 /* PR binutils/17531: Cope with unexpected section header sizes. */
5017 if (size == 0 || num == 0)
5018 return FALSE;
5019 if (size < sizeof * shdrs)
5020 {
5021 if (! probe)
5022 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5023 return FALSE;
5024 }
5025 if (!probe && size > sizeof * shdrs)
5026 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
252b5132 5027
3f5e193b 5028 shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
049b0c3a
NC
5029 size, num,
5030 probe ? NULL : _("section headers"));
5031 if (shdrs == NULL)
5032 return FALSE;
252b5132 5033
049b0c3a
NC
5034 if (section_headers != NULL)
5035 free (section_headers);
3f5e193b
NC
5036 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
5037 sizeof (Elf_Internal_Shdr));
252b5132
RH
5038 if (section_headers == NULL)
5039 {
049b0c3a 5040 if (!probe)
8b73c356 5041 error (_("Out of memory reading %u section headers\n"), num);
049b0c3a 5042 return FALSE;
252b5132
RH
5043 }
5044
5045 for (i = 0, internal = section_headers;
560f3c1c 5046 i < num;
b34976b6 5047 i++, internal++)
252b5132
RH
5048 {
5049 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5050 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
5051 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5052 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5053 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5054 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5055 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5056 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5057 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5058 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
315350be
NC
5059 if (!probe && internal->sh_link > num)
5060 warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5061 if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5062 warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
252b5132
RH
5063 }
5064
5065 free (shdrs);
049b0c3a 5066 return TRUE;
252b5132
RH
5067}
5068
049b0c3a
NC
5069static bfd_boolean
5070get_64bit_section_headers (FILE * file, bfd_boolean probe)
9ea033b2 5071{
2cf0635d
NC
5072 Elf64_External_Shdr * shdrs;
5073 Elf_Internal_Shdr * internal;
b34976b6 5074 unsigned int i;
049b0c3a
NC
5075 unsigned int size = elf_header.e_shentsize;
5076 unsigned int num = probe ? 1 : elf_header.e_shnum;
5077
5078 /* PR binutils/17531: Cope with unexpected section header sizes. */
5079 if (size == 0 || num == 0)
5080 return FALSE;
5081 if (size < sizeof * shdrs)
5082 {
5083 if (! probe)
5084 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5085 return FALSE;
5086 }
5087 if (! probe && size > sizeof * shdrs)
5088 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
9ea033b2 5089
3f5e193b 5090 shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
049b0c3a
NC
5091 size, num,
5092 probe ? NULL : _("section headers"));
5093 if (shdrs == NULL)
5094 return FALSE;
9ea033b2 5095
049b0c3a
NC
5096 if (section_headers != NULL)
5097 free (section_headers);
3f5e193b
NC
5098 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
5099 sizeof (Elf_Internal_Shdr));
9ea033b2
NC
5100 if (section_headers == NULL)
5101 {
049b0c3a 5102 if (! probe)
8b73c356 5103 error (_("Out of memory reading %u section headers\n"), num);
049b0c3a 5104 return FALSE;
9ea033b2
NC
5105 }
5106
5107 for (i = 0, internal = section_headers;
560f3c1c 5108 i < num;
b34976b6 5109 i++, internal++)
9ea033b2
NC
5110 {
5111 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5112 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
66543521
AM
5113 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5114 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5115 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5116 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
9ea033b2
NC
5117 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5118 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5119 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5120 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
315350be
NC
5121 if (!probe && internal->sh_link > num)
5122 warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5123 if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5124 warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
9ea033b2
NC
5125 }
5126
5127 free (shdrs);
049b0c3a 5128 return TRUE;
9ea033b2
NC
5129}
5130
252b5132 5131static Elf_Internal_Sym *
ba5cdace
NC
5132get_32bit_elf_symbols (FILE * file,
5133 Elf_Internal_Shdr * section,
5134 unsigned long * num_syms_return)
252b5132 5135{
ba5cdace 5136 unsigned long number = 0;
dd24e3da 5137 Elf32_External_Sym * esyms = NULL;
ba5cdace 5138 Elf_External_Sym_Shndx * shndx = NULL;
dd24e3da 5139 Elf_Internal_Sym * isyms = NULL;
2cf0635d 5140 Elf_Internal_Sym * psym;
b34976b6 5141 unsigned int j;
252b5132 5142
c9c1d674
EG
5143 if (section->sh_size == 0)
5144 {
5145 if (num_syms_return != NULL)
5146 * num_syms_return = 0;
5147 return NULL;
5148 }
5149
dd24e3da 5150 /* Run some sanity checks first. */
c9c1d674 5151 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
dd24e3da 5152 {
c9c1d674
EG
5153 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5154 printable_section_name (section), (unsigned long) section->sh_entsize);
ba5cdace 5155 goto exit_point;
dd24e3da
NC
5156 }
5157
f54498b4
NC
5158 if (section->sh_size > current_file_size)
5159 {
5160 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
74e1a04b 5161 printable_section_name (section), (unsigned long) section->sh_size);
f54498b4
NC
5162 goto exit_point;
5163 }
5164
dd24e3da
NC
5165 number = section->sh_size / section->sh_entsize;
5166
5167 if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
5168 {
c9c1d674 5169 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
8066deb1
AM
5170 (unsigned long) section->sh_size,
5171 printable_section_name (section),
5172 (unsigned long) section->sh_entsize);
ba5cdace 5173 goto exit_point;
dd24e3da
NC
5174 }
5175
3f5e193b
NC
5176 esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5177 section->sh_size, _("symbols"));
dd24e3da 5178 if (esyms == NULL)
ba5cdace 5179 goto exit_point;
252b5132 5180
6a40cf0c
NC
5181 {
5182 elf_section_list * entry;
5183
5184 shndx = NULL;
5185 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5186 if (entry->hdr->sh_link == (unsigned long) (section - section_headers))
c9c1d674 5187 {
6a40cf0c
NC
5188 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5189 entry->hdr->sh_offset,
5190 1, entry->hdr->sh_size,
5191 _("symbol table section indicies"));
5192 if (shndx == NULL)
5193 goto exit_point;
5194 /* PR17531: file: heap-buffer-overflow */
5195 else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5196 {
5197 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5198 printable_section_name (entry->hdr),
5199 (unsigned long) entry->hdr->sh_size,
5200 (unsigned long) section->sh_size);
5201 goto exit_point;
5202 }
c9c1d674 5203 }
6a40cf0c 5204 }
9ad5cbcf 5205
3f5e193b 5206 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
252b5132
RH
5207
5208 if (isyms == NULL)
5209 {
8b73c356
NC
5210 error (_("Out of memory reading %lu symbols\n"),
5211 (unsigned long) number);
dd24e3da 5212 goto exit_point;
252b5132
RH
5213 }
5214
dd24e3da 5215 for (j = 0, psym = isyms; j < number; j++, psym++)
252b5132
RH
5216 {
5217 psym->st_name = BYTE_GET (esyms[j].st_name);
5218 psym->st_value = BYTE_GET (esyms[j].st_value);
5219 psym->st_size = BYTE_GET (esyms[j].st_size);
5220 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4fbb74a6 5221 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
9ad5cbcf
AM
5222 psym->st_shndx
5223 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4fbb74a6
AM
5224 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5225 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
252b5132
RH
5226 psym->st_info = BYTE_GET (esyms[j].st_info);
5227 psym->st_other = BYTE_GET (esyms[j].st_other);
5228 }
5229
dd24e3da 5230 exit_point:
ba5cdace 5231 if (shndx != NULL)
9ad5cbcf 5232 free (shndx);
ba5cdace 5233 if (esyms != NULL)
dd24e3da 5234 free (esyms);
252b5132 5235
ba5cdace
NC
5236 if (num_syms_return != NULL)
5237 * num_syms_return = isyms == NULL ? 0 : number;
5238
252b5132
RH
5239 return isyms;
5240}
5241
9ea033b2 5242static Elf_Internal_Sym *
ba5cdace
NC
5243get_64bit_elf_symbols (FILE * file,
5244 Elf_Internal_Shdr * section,
5245 unsigned long * num_syms_return)
9ea033b2 5246{
ba5cdace
NC
5247 unsigned long number = 0;
5248 Elf64_External_Sym * esyms = NULL;
5249 Elf_External_Sym_Shndx * shndx = NULL;
5250 Elf_Internal_Sym * isyms = NULL;
2cf0635d 5251 Elf_Internal_Sym * psym;
b34976b6 5252 unsigned int j;
9ea033b2 5253
c9c1d674
EG
5254 if (section->sh_size == 0)
5255 {
5256 if (num_syms_return != NULL)
5257 * num_syms_return = 0;
5258 return NULL;
5259 }
5260
dd24e3da 5261 /* Run some sanity checks first. */
c9c1d674 5262 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
dd24e3da 5263 {
c9c1d674 5264 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
8066deb1
AM
5265 printable_section_name (section),
5266 (unsigned long) section->sh_entsize);
ba5cdace 5267 goto exit_point;
dd24e3da
NC
5268 }
5269
f54498b4
NC
5270 if (section->sh_size > current_file_size)
5271 {
5272 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
8066deb1
AM
5273 printable_section_name (section),
5274 (unsigned long) section->sh_size);
f54498b4
NC
5275 goto exit_point;
5276 }
5277
dd24e3da
NC
5278 number = section->sh_size / section->sh_entsize;
5279
5280 if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5281 {
c9c1d674 5282 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
8066deb1
AM
5283 (unsigned long) section->sh_size,
5284 printable_section_name (section),
5285 (unsigned long) section->sh_entsize);
ba5cdace 5286 goto exit_point;
dd24e3da
NC
5287 }
5288
3f5e193b
NC
5289 esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5290 section->sh_size, _("symbols"));
a6e9f9df 5291 if (!esyms)
ba5cdace 5292 goto exit_point;
9ea033b2 5293
6a40cf0c
NC
5294 {
5295 elf_section_list * entry;
5296
5297 shndx = NULL;
5298 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5299 if (entry->hdr->sh_link == (unsigned long) (section - section_headers))
c9c1d674 5300 {
6a40cf0c
NC
5301 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5302 entry->hdr->sh_offset,
5303 1, entry->hdr->sh_size,
5304 _("symbol table section indicies"));
5305 if (shndx == NULL)
5306 goto exit_point;
5307 /* PR17531: file: heap-buffer-overflow */
5308 else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5309 {
5310 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5311 printable_section_name (entry->hdr),
5312 (unsigned long) entry->hdr->sh_size,
5313 (unsigned long) section->sh_size);
5314 goto exit_point;
5315 }
c9c1d674 5316 }
6a40cf0c 5317 }
9ad5cbcf 5318
3f5e193b 5319 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
9ea033b2
NC
5320
5321 if (isyms == NULL)
5322 {
8b73c356
NC
5323 error (_("Out of memory reading %lu symbols\n"),
5324 (unsigned long) number);
ba5cdace 5325 goto exit_point;
9ea033b2
NC
5326 }
5327
ba5cdace 5328 for (j = 0, psym = isyms; j < number; j++, psym++)
9ea033b2
NC
5329 {
5330 psym->st_name = BYTE_GET (esyms[j].st_name);
5331 psym->st_info = BYTE_GET (esyms[j].st_info);
5332 psym->st_other = BYTE_GET (esyms[j].st_other);
5333 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
ba5cdace 5334
4fbb74a6 5335 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
9ad5cbcf
AM
5336 psym->st_shndx
5337 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4fbb74a6
AM
5338 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5339 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
ba5cdace 5340
66543521
AM
5341 psym->st_value = BYTE_GET (esyms[j].st_value);
5342 psym->st_size = BYTE_GET (esyms[j].st_size);
9ea033b2
NC
5343 }
5344
ba5cdace
NC
5345 exit_point:
5346 if (shndx != NULL)
9ad5cbcf 5347 free (shndx);
ba5cdace
NC
5348 if (esyms != NULL)
5349 free (esyms);
5350
5351 if (num_syms_return != NULL)
5352 * num_syms_return = isyms == NULL ? 0 : number;
9ea033b2
NC
5353
5354 return isyms;
5355}
5356
d1133906 5357static const char *
d3ba0551 5358get_elf_section_flags (bfd_vma sh_flags)
d1133906 5359{
5477e8a0 5360 static char buff[1024];
2cf0635d 5361 char * p = buff;
8d5ff12c 5362 int field_size = is_32bit_elf ? 8 : 16;
91d6fa6a
NC
5363 int sindex;
5364 int size = sizeof (buff) - (field_size + 4 + 1);
8d5ff12c
L
5365 bfd_vma os_flags = 0;
5366 bfd_vma proc_flags = 0;
5367 bfd_vma unknown_flags = 0;
148b93f2 5368 static const struct
5477e8a0 5369 {
2cf0635d 5370 const char * str;
5477e8a0
L
5371 int len;
5372 }
5373 flags [] =
5374 {
cfcac11d
NC
5375 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
5376 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
5377 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
5378 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
5379 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
5380 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
5381 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5382 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5383 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
5384 /* 9 */ { STRING_COMMA_LEN ("TLS") },
5385 /* IA-64 specific. */
5386 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5387 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5388 /* IA-64 OpenVMS specific. */
5389 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5390 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5391 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5392 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5393 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5394 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
18ae9cc1 5395 /* Generic. */
cfcac11d 5396 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
18ae9cc1 5397 /* SPARC specific. */
77115a4a 5398 /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
ac4c9b04
MG
5399 /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5400 /* ARM specific. */
5401 /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
f0728ee3 5402 /* 22 */ { STRING_COMMA_LEN ("ARM_PURECODE") },
ac4c9b04 5403 /* 23 */ { STRING_COMMA_LEN ("COMDEF") }
5477e8a0
L
5404 };
5405
5406 if (do_section_details)
5407 {
8d5ff12c
L
5408 sprintf (buff, "[%*.*lx]: ",
5409 field_size, field_size, (unsigned long) sh_flags);
5410 p += field_size + 4;
5477e8a0 5411 }
76da6bbe 5412
d1133906
NC
5413 while (sh_flags)
5414 {
5415 bfd_vma flag;
5416
5417 flag = sh_flags & - sh_flags;
5418 sh_flags &= ~ flag;
76da6bbe 5419
5477e8a0 5420 if (do_section_details)
d1133906 5421 {
5477e8a0
L
5422 switch (flag)
5423 {
91d6fa6a
NC
5424 case SHF_WRITE: sindex = 0; break;
5425 case SHF_ALLOC: sindex = 1; break;
5426 case SHF_EXECINSTR: sindex = 2; break;
5427 case SHF_MERGE: sindex = 3; break;
5428 case SHF_STRINGS: sindex = 4; break;
5429 case SHF_INFO_LINK: sindex = 5; break;
5430 case SHF_LINK_ORDER: sindex = 6; break;
5431 case SHF_OS_NONCONFORMING: sindex = 7; break;
5432 case SHF_GROUP: sindex = 8; break;
5433 case SHF_TLS: sindex = 9; break;
18ae9cc1 5434 case SHF_EXCLUDE: sindex = 18; break;
77115a4a 5435 case SHF_COMPRESSED: sindex = 20; break;
76da6bbe 5436
5477e8a0 5437 default:
91d6fa6a 5438 sindex = -1;
cfcac11d 5439 switch (elf_header.e_machine)
148b93f2 5440 {
cfcac11d 5441 case EM_IA_64:
148b93f2 5442 if (flag == SHF_IA_64_SHORT)
91d6fa6a 5443 sindex = 10;
148b93f2 5444 else if (flag == SHF_IA_64_NORECOV)
91d6fa6a 5445 sindex = 11;
148b93f2
NC
5446#ifdef BFD64
5447 else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5448 switch (flag)
5449 {
91d6fa6a
NC
5450 case SHF_IA_64_VMS_GLOBAL: sindex = 12; break;
5451 case SHF_IA_64_VMS_OVERLAID: sindex = 13; break;
5452 case SHF_IA_64_VMS_SHARED: sindex = 14; break;
5453 case SHF_IA_64_VMS_VECTOR: sindex = 15; break;
5454 case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5455 case SHF_IA_64_VMS_PROTECTED: sindex = 17; break;
148b93f2
NC
5456 default: break;
5457 }
5458#endif
cfcac11d
NC
5459 break;
5460
caa83f8b 5461 case EM_386:
22abe556 5462 case EM_IAMCU:
caa83f8b 5463 case EM_X86_64:
7f502d6c 5464 case EM_L1OM:
7a9068fe 5465 case EM_K1OM:
cfcac11d
NC
5466 case EM_OLD_SPARCV9:
5467 case EM_SPARC32PLUS:
5468 case EM_SPARCV9:
5469 case EM_SPARC:
18ae9cc1 5470 if (flag == SHF_ORDERED)
91d6fa6a 5471 sindex = 19;
cfcac11d 5472 break;
ac4c9b04
MG
5473
5474 case EM_ARM:
5475 switch (flag)
5476 {
5477 case SHF_ENTRYSECT: sindex = 21; break;
f0728ee3 5478 case SHF_ARM_PURECODE: sindex = 22; break;
ac4c9b04
MG
5479 case SHF_COMDEF: sindex = 23; break;
5480 default: break;
5481 }
5482 break;
5483
cfcac11d
NC
5484 default:
5485 break;
148b93f2 5486 }
5477e8a0
L
5487 }
5488
91d6fa6a 5489 if (sindex != -1)
5477e8a0 5490 {
8d5ff12c
L
5491 if (p != buff + field_size + 4)
5492 {
5493 if (size < (10 + 2))
bee0ee85
NC
5494 {
5495 warn (_("Internal error: not enough buffer room for section flag info"));
5496 return _("<unknown>");
5497 }
8d5ff12c
L
5498 size -= 2;
5499 *p++ = ',';
5500 *p++ = ' ';
5501 }
5502
91d6fa6a
NC
5503 size -= flags [sindex].len;
5504 p = stpcpy (p, flags [sindex].str);
5477e8a0 5505 }
3b22753a 5506 else if (flag & SHF_MASKOS)
8d5ff12c 5507 os_flags |= flag;
d1133906 5508 else if (flag & SHF_MASKPROC)
8d5ff12c 5509 proc_flags |= flag;
d1133906 5510 else
8d5ff12c 5511 unknown_flags |= flag;
5477e8a0
L
5512 }
5513 else
5514 {
5515 switch (flag)
5516 {
5517 case SHF_WRITE: *p = 'W'; break;
5518 case SHF_ALLOC: *p = 'A'; break;
5519 case SHF_EXECINSTR: *p = 'X'; break;
5520 case SHF_MERGE: *p = 'M'; break;
5521 case SHF_STRINGS: *p = 'S'; break;
5522 case SHF_INFO_LINK: *p = 'I'; break;
5523 case SHF_LINK_ORDER: *p = 'L'; break;
5524 case SHF_OS_NONCONFORMING: *p = 'O'; break;
5525 case SHF_GROUP: *p = 'G'; break;
5526 case SHF_TLS: *p = 'T'; break;
18ae9cc1 5527 case SHF_EXCLUDE: *p = 'E'; break;
77115a4a 5528 case SHF_COMPRESSED: *p = 'C'; break;
5477e8a0
L
5529
5530 default:
8a9036a4 5531 if ((elf_header.e_machine == EM_X86_64
7a9068fe
L
5532 || elf_header.e_machine == EM_L1OM
5533 || elf_header.e_machine == EM_K1OM)
5477e8a0
L
5534 && flag == SHF_X86_64_LARGE)
5535 *p = 'l';
91f68a68 5536 else if (elf_header.e_machine == EM_ARM
f0728ee3 5537 && flag == SHF_ARM_PURECODE)
91f68a68 5538 *p = 'y';
5477e8a0
L
5539 else if (flag & SHF_MASKOS)
5540 {
5541 *p = 'o';
5542 sh_flags &= ~ SHF_MASKOS;
5543 }
5544 else if (flag & SHF_MASKPROC)
5545 {
5546 *p = 'p';
5547 sh_flags &= ~ SHF_MASKPROC;
5548 }
5549 else
5550 *p = 'x';
5551 break;
5552 }
5553 p++;
d1133906
NC
5554 }
5555 }
76da6bbe 5556
8d5ff12c
L
5557 if (do_section_details)
5558 {
5559 if (os_flags)
5560 {
5561 size -= 5 + field_size;
5562 if (p != buff + field_size + 4)
5563 {
5564 if (size < (2 + 1))
bee0ee85
NC
5565 {
5566 warn (_("Internal error: not enough buffer room for section flag info"));
5567 return _("<unknown>");
5568 }
8d5ff12c
L
5569 size -= 2;
5570 *p++ = ',';
5571 *p++ = ' ';
5572 }
5573 sprintf (p, "OS (%*.*lx)", field_size, field_size,
5574 (unsigned long) os_flags);
5575 p += 5 + field_size;
5576 }
5577 if (proc_flags)
5578 {
5579 size -= 7 + field_size;
5580 if (p != buff + field_size + 4)
5581 {
5582 if (size < (2 + 1))
bee0ee85
NC
5583 {
5584 warn (_("Internal error: not enough buffer room for section flag info"));
5585 return _("<unknown>");
5586 }
8d5ff12c
L
5587 size -= 2;
5588 *p++ = ',';
5589 *p++ = ' ';
5590 }
5591 sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5592 (unsigned long) proc_flags);
5593 p += 7 + field_size;
5594 }
5595 if (unknown_flags)
5596 {
5597 size -= 10 + field_size;
5598 if (p != buff + field_size + 4)
5599 {
5600 if (size < (2 + 1))
bee0ee85
NC
5601 {
5602 warn (_("Internal error: not enough buffer room for section flag info"));
5603 return _("<unknown>");
5604 }
8d5ff12c
L
5605 size -= 2;
5606 *p++ = ',';
5607 *p++ = ' ';
5608 }
2b692964 5609 sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
8d5ff12c
L
5610 (unsigned long) unknown_flags);
5611 p += 10 + field_size;
5612 }
5613 }
5614
e9e44622 5615 *p = '\0';
d1133906
NC
5616 return buff;
5617}
5618
77115a4a
L
5619static unsigned int
5620get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf)
5621{
5622 if (is_32bit_elf)
5623 {
5624 Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
d8024a91 5625
77115a4a
L
5626 chdr->ch_type = BYTE_GET (echdr->ch_type);
5627 chdr->ch_size = BYTE_GET (echdr->ch_size);
5628 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5629 return sizeof (*echdr);
5630 }
5631 else
5632 {
5633 Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) buf;
d8024a91 5634
77115a4a
L
5635 chdr->ch_type = BYTE_GET (echdr->ch_type);
5636 chdr->ch_size = BYTE_GET (echdr->ch_size);
5637 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5638 return sizeof (*echdr);
5639 }
5640}
5641
252b5132 5642static int
2cf0635d 5643process_section_headers (FILE * file)
252b5132 5644{
2cf0635d 5645 Elf_Internal_Shdr * section;
b34976b6 5646 unsigned int i;
252b5132
RH
5647
5648 section_headers = NULL;
5649
5650 if (elf_header.e_shnum == 0)
5651 {
82f2dbf7
NC
5652 /* PR binutils/12467. */
5653 if (elf_header.e_shoff != 0)
5654 warn (_("possibly corrupt ELF file header - it has a non-zero"
5655 " section header offset, but no section headers\n"));
5656 else if (do_sections)
252b5132
RH
5657 printf (_("\nThere are no sections in this file.\n"));
5658
5659 return 1;
5660 }
5661
5662 if (do_sections && !do_header)
9ea033b2 5663 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
252b5132
RH
5664 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
5665
9ea033b2
NC
5666 if (is_32bit_elf)
5667 {
049b0c3a 5668 if (! get_32bit_section_headers (file, FALSE))
9ea033b2
NC
5669 return 0;
5670 }
049b0c3a 5671 else if (! get_64bit_section_headers (file, FALSE))
252b5132
RH
5672 return 0;
5673
5674 /* Read in the string table, so that we have names to display. */
0b49d371 5675 if (elf_header.e_shstrndx != SHN_UNDEF
4fbb74a6 5676 && elf_header.e_shstrndx < elf_header.e_shnum)
252b5132 5677 {
4fbb74a6 5678 section = section_headers + elf_header.e_shstrndx;
d40ac9bd 5679
c256ffe7
JJ
5680 if (section->sh_size != 0)
5681 {
3f5e193b
NC
5682 string_table = (char *) get_data (NULL, file, section->sh_offset,
5683 1, section->sh_size,
5684 _("string table"));
0de14b54 5685
c256ffe7
JJ
5686 string_table_length = string_table != NULL ? section->sh_size : 0;
5687 }
252b5132
RH
5688 }
5689
5690 /* Scan the sections for the dynamic symbol table
e3c8793a 5691 and dynamic string table and debug sections. */
252b5132
RH
5692 dynamic_symbols = NULL;
5693 dynamic_strings = NULL;
5694 dynamic_syminfo = NULL;
6a40cf0c 5695 symtab_shndx_list = NULL;
103f02d3 5696
89fac5e3
RS
5697 eh_addr_size = is_32bit_elf ? 4 : 8;
5698 switch (elf_header.e_machine)
5699 {
5700 case EM_MIPS:
5701 case EM_MIPS_RS3_LE:
5702 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
5703 FDE addresses. However, the ABI also has a semi-official ILP32
5704 variant for which the normal FDE address size rules apply.
5705
5706 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
5707 section, where XX is the size of longs in bits. Unfortunately,
5708 earlier compilers provided no way of distinguishing ILP32 objects
5709 from LP64 objects, so if there's any doubt, we should assume that
5710 the official LP64 form is being used. */
5711 if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
5712 && find_section (".gcc_compiled_long32") == NULL)
5713 eh_addr_size = 8;
5714 break;
0f56a26a
DD
5715
5716 case EM_H8_300:
5717 case EM_H8_300H:
5718 switch (elf_header.e_flags & EF_H8_MACH)
5719 {
5720 case E_H8_MACH_H8300:
5721 case E_H8_MACH_H8300HN:
5722 case E_H8_MACH_H8300SN:
5723 case E_H8_MACH_H8300SXN:
5724 eh_addr_size = 2;
5725 break;
5726 case E_H8_MACH_H8300H:
5727 case E_H8_MACH_H8300S:
5728 case E_H8_MACH_H8300SX:
5729 eh_addr_size = 4;
5730 break;
5731 }
f4236fe4
DD
5732 break;
5733
ff7eeb89 5734 case EM_M32C_OLD:
f4236fe4
DD
5735 case EM_M32C:
5736 switch (elf_header.e_flags & EF_M32C_CPU_MASK)
5737 {
5738 case EF_M32C_CPU_M16C:
5739 eh_addr_size = 2;
5740 break;
5741 }
5742 break;
89fac5e3
RS
5743 }
5744
76ca31c0
NC
5745#define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
5746 do \
5747 { \
5748 bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64; \
5749 if (section->sh_entsize != expected_entsize) \
9dd3a467 5750 { \
76ca31c0
NC
5751 char buf[40]; \
5752 sprintf_vma (buf, section->sh_entsize); \
5753 /* Note: coded this way so that there is a single string for \
5754 translation. */ \
5755 error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
5756 error (_("(Using the expected size of %u for the rest of this dump)\n"), \
5757 (unsigned) expected_entsize); \
9dd3a467 5758 section->sh_entsize = expected_entsize; \
76ca31c0
NC
5759 } \
5760 } \
08d8fa11 5761 while (0)
9dd3a467
NC
5762
5763#define CHECK_ENTSIZE(section, i, type) \
08d8fa11
JJ
5764 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
5765 sizeof (Elf64_External_##type))
5766
252b5132
RH
5767 for (i = 0, section = section_headers;
5768 i < elf_header.e_shnum;
b34976b6 5769 i++, section++)
252b5132 5770 {
2cf0635d 5771 char * name = SECTION_NAME (section);
252b5132
RH
5772
5773 if (section->sh_type == SHT_DYNSYM)
5774 {
5775 if (dynamic_symbols != NULL)
5776 {
5777 error (_("File contains multiple dynamic symbol tables\n"));
5778 continue;
5779 }
5780
08d8fa11 5781 CHECK_ENTSIZE (section, i, Sym);
ba5cdace 5782 dynamic_symbols = GET_ELF_SYMBOLS (file, section, & num_dynamic_syms);
252b5132
RH
5783 }
5784 else if (section->sh_type == SHT_STRTAB
18bd398b 5785 && streq (name, ".dynstr"))
252b5132
RH
5786 {
5787 if (dynamic_strings != NULL)
5788 {
5789 error (_("File contains multiple dynamic string tables\n"));
5790 continue;
5791 }
5792
3f5e193b
NC
5793 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
5794 1, section->sh_size,
5795 _("dynamic strings"));
59245841 5796 dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
252b5132 5797 }
9ad5cbcf
AM
5798 else if (section->sh_type == SHT_SYMTAB_SHNDX)
5799 {
6a40cf0c
NC
5800 elf_section_list * entry = xmalloc (sizeof * entry);
5801 entry->hdr = section;
5802 entry->next = symtab_shndx_list;
5803 symtab_shndx_list = entry;
9ad5cbcf 5804 }
08d8fa11
JJ
5805 else if (section->sh_type == SHT_SYMTAB)
5806 CHECK_ENTSIZE (section, i, Sym);
5807 else if (section->sh_type == SHT_GROUP)
5808 CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
5809 else if (section->sh_type == SHT_REL)
5810 CHECK_ENTSIZE (section, i, Rel);
5811 else if (section->sh_type == SHT_RELA)
5812 CHECK_ENTSIZE (section, i, Rela);
252b5132 5813 else if ((do_debugging || do_debug_info || do_debug_abbrevs
f9f0e732 5814 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
cb8f3167 5815 || do_debug_aranges || do_debug_frames || do_debug_macinfo
657d0d47
CC
5816 || do_debug_str || do_debug_loc || do_debug_ranges
5817 || do_debug_addr || do_debug_cu_index)
1b315056
CS
5818 && (const_strneq (name, ".debug_")
5819 || const_strneq (name, ".zdebug_")))
252b5132 5820 {
1b315056
CS
5821 if (name[1] == 'z')
5822 name += sizeof (".zdebug_") - 1;
5823 else
5824 name += sizeof (".debug_") - 1;
252b5132
RH
5825
5826 if (do_debugging
4723351a
CC
5827 || (do_debug_info && const_strneq (name, "info"))
5828 || (do_debug_info && const_strneq (name, "types"))
5829 || (do_debug_abbrevs && const_strneq (name, "abbrev"))
b40bf0a2
NC
5830 || (do_debug_lines && strcmp (name, "line") == 0)
5831 || (do_debug_lines && const_strneq (name, "line."))
4723351a
CC
5832 || (do_debug_pubnames && const_strneq (name, "pubnames"))
5833 || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
459d52c8
DE
5834 || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
5835 || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
4723351a
CC
5836 || (do_debug_aranges && const_strneq (name, "aranges"))
5837 || (do_debug_ranges && const_strneq (name, "ranges"))
5838 || (do_debug_frames && const_strneq (name, "frame"))
5839 || (do_debug_macinfo && const_strneq (name, "macinfo"))
5840 || (do_debug_macinfo && const_strneq (name, "macro"))
5841 || (do_debug_str && const_strneq (name, "str"))
5842 || (do_debug_loc && const_strneq (name, "loc"))
657d0d47
CC
5843 || (do_debug_addr && const_strneq (name, "addr"))
5844 || (do_debug_cu_index && const_strneq (name, "cu_index"))
5845 || (do_debug_cu_index && const_strneq (name, "tu_index"))
252b5132 5846 )
09c11c86 5847 request_dump_bynumber (i, DEBUG_DUMP);
252b5132 5848 }
a262ae96 5849 /* Linkonce section to be combined with .debug_info at link time. */
09fd7e38 5850 else if ((do_debugging || do_debug_info)
0112cd26 5851 && const_strneq (name, ".gnu.linkonce.wi."))
09c11c86 5852 request_dump_bynumber (i, DEBUG_DUMP);
18bd398b 5853 else if (do_debug_frames && streq (name, ".eh_frame"))
09c11c86 5854 request_dump_bynumber (i, DEBUG_DUMP);
5bbdf3d5
DE
5855 else if (do_gdb_index && streq (name, ".gdb_index"))
5856 request_dump_bynumber (i, DEBUG_DUMP);
6f875884
TG
5857 /* Trace sections for Itanium VMS. */
5858 else if ((do_debugging || do_trace_info || do_trace_abbrevs
5859 || do_trace_aranges)
5860 && const_strneq (name, ".trace_"))
5861 {
5862 name += sizeof (".trace_") - 1;
5863
5864 if (do_debugging
5865 || (do_trace_info && streq (name, "info"))
5866 || (do_trace_abbrevs && streq (name, "abbrev"))
5867 || (do_trace_aranges && streq (name, "aranges"))
5868 )
5869 request_dump_bynumber (i, DEBUG_DUMP);
5870 }
252b5132
RH
5871 }
5872
5873 if (! do_sections)
5874 return 1;
5875
3a1a2036
NC
5876 if (elf_header.e_shnum > 1)
5877 printf (_("\nSection Headers:\n"));
5878 else
5879 printf (_("\nSection Header:\n"));
76da6bbe 5880
f7a99963 5881 if (is_32bit_elf)
595cf52e 5882 {
5477e8a0 5883 if (do_section_details)
595cf52e
L
5884 {
5885 printf (_(" [Nr] Name\n"));
5477e8a0 5886 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
595cf52e
L
5887 }
5888 else
5889 printf
5890 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
5891 }
d974e256 5892 else if (do_wide)
595cf52e 5893 {
5477e8a0 5894 if (do_section_details)
595cf52e
L
5895 {
5896 printf (_(" [Nr] Name\n"));
5477e8a0 5897 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
595cf52e
L
5898 }
5899 else
5900 printf
5901 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
5902 }
f7a99963
NC
5903 else
5904 {
5477e8a0 5905 if (do_section_details)
595cf52e
L
5906 {
5907 printf (_(" [Nr] Name\n"));
5477e8a0
L
5908 printf (_(" Type Address Offset Link\n"));
5909 printf (_(" Size EntSize Info Align\n"));
595cf52e
L
5910 }
5911 else
5912 {
5913 printf (_(" [Nr] Name Type Address Offset\n"));
5914 printf (_(" Size EntSize Flags Link Info Align\n"));
5915 }
f7a99963 5916 }
252b5132 5917
5477e8a0
L
5918 if (do_section_details)
5919 printf (_(" Flags\n"));
5920
252b5132
RH
5921 for (i = 0, section = section_headers;
5922 i < elf_header.e_shnum;
b34976b6 5923 i++, section++)
252b5132 5924 {
dd905818
NC
5925 /* Run some sanity checks on the section header. */
5926
5927 /* Check the sh_link field. */
5928 switch (section->sh_type)
5929 {
5930 case SHT_SYMTAB_SHNDX:
5931 case SHT_GROUP:
5932 case SHT_HASH:
5933 case SHT_GNU_HASH:
5934 case SHT_GNU_versym:
5935 case SHT_REL:
5936 case SHT_RELA:
5937 if (section->sh_link < 1
5938 || section->sh_link > elf_header.e_shnum
5939 || (section_headers[section->sh_link].sh_type != SHT_SYMTAB
5940 && section_headers[section->sh_link].sh_type != SHT_DYNSYM))
5941 warn (_("[%2u]: Link field (%u) should index a symtab section.\n"),
5942 i, section->sh_link);
5943 break;
5944
5945 case SHT_DYNAMIC:
5946 case SHT_SYMTAB:
5947 case SHT_DYNSYM:
5948 case SHT_GNU_verneed:
5949 case SHT_GNU_verdef:
5950 case SHT_GNU_LIBLIST:
5951 if (section->sh_link < 1
5952 || section->sh_link > elf_header.e_shnum
5953 || section_headers[section->sh_link].sh_type != SHT_STRTAB)
5954 warn (_("[%2u]: Link field (%u) should index a string section.\n"),
5955 i, section->sh_link);
5956 break;
5957
5958 case SHT_INIT_ARRAY:
5959 case SHT_FINI_ARRAY:
5960 case SHT_PREINIT_ARRAY:
5961 if (section->sh_type < SHT_LOOS && section->sh_link != 0)
5962 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
5963 i, section->sh_link);
5964 break;
5965
5966 default:
5967 /* FIXME: Add support for target specific section types. */
5968#if 0 /* Currently we do not check other section types as there are too
5969 many special cases. Stab sections for example have a type
5970 of SHT_PROGBITS but an sh_link field that links to the .stabstr
5971 section. */
5972 if (section->sh_type < SHT_LOOS && section->sh_link != 0)
5973 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
5974 i, section->sh_link);
5975#endif
5976 break;
5977 }
5978
5979 /* Check the sh_info field. */
5980 switch (section->sh_type)
5981 {
5982 case SHT_REL:
5983 case SHT_RELA:
5984 if (section->sh_info < 1
5985 || section->sh_info > elf_header.e_shnum
5986 || (section_headers[section->sh_info].sh_type != SHT_PROGBITS
5987 && section_headers[section->sh_info].sh_type != SHT_NOBITS
5988 && section_headers[section->sh_info].sh_type != SHT_NOTE
5989 && section_headers[section->sh_info].sh_type != SHT_INIT_ARRAY
5990 /* FIXME: Are other section types valid ? */
5991 && section_headers[section->sh_info].sh_type < SHT_LOOS))
5992 {
5993 if (section->sh_info == 0
5994 && (streq (SECTION_NAME (section), ".rel.dyn")
5995 || streq (SECTION_NAME (section), ".rela.dyn")))
5996 /* The .rel.dyn and .rela.dyn sections have an sh_info field
5997 of zero. No idea why. I would have expected the index
5998 of the .plt section. */
5999 ;
6000 else
6001 warn (_("[%2u]: Info field (%u) should index a relocatable section.\n"),
6002 i, section->sh_info);
6003 }
6004 break;
6005
6006 case SHT_DYNAMIC:
6007 case SHT_HASH:
6008 case SHT_SYMTAB_SHNDX:
6009 case SHT_INIT_ARRAY:
6010 case SHT_FINI_ARRAY:
6011 case SHT_PREINIT_ARRAY:
6012 if (section->sh_info != 0)
6013 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6014 i, section->sh_info);
6015 break;
6016
6017 case SHT_GROUP:
6018 case SHT_SYMTAB:
6019 case SHT_DYNSYM:
6020 /* A symbol index - we assume that it is valid. */
6021 break;
6022
6023 default:
6024 /* FIXME: Add support for target specific section types. */
6025 if (section->sh_type == SHT_NOBITS)
6026 /* NOBITS section headers with non-zero sh_info fields can be
6027 created when a binary is stripped of everything but its debug
6028 information. The stripped sections have their headers preserved but their types set to SHT_NOBITS. so do not check this type of section. */
6029 ;
6030 else if (section->sh_flags & SHF_INFO_LINK)
6031 {
6032 if (section->sh_info < 1 || section->sh_info > elf_header.e_shnum)
6033 warn (_("[%2u]: Expected link to another section in info field"), i);
6034 }
6035 else if (section->sh_type < SHT_LOOS && section->sh_info != 0)
6036 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6037 i, section->sh_info);
6038 break;
6039 }
6040
7bfd842d 6041 printf (" [%2u] ", i);
5477e8a0 6042 if (do_section_details)
74e1a04b 6043 printf ("%s\n ", printable_section_name (section));
595cf52e 6044 else
74e1a04b 6045 print_symbol (-17, SECTION_NAME (section));
0b4362b0 6046
ea52a088
NC
6047 printf (do_wide ? " %-15s " : " %-15.15s ",
6048 get_section_type_name (section->sh_type));
0b4362b0 6049
f7a99963
NC
6050 if (is_32bit_elf)
6051 {
cfcac11d
NC
6052 const char * link_too_big = NULL;
6053
f7a99963 6054 print_vma (section->sh_addr, LONG_HEX);
76da6bbe 6055
f7a99963
NC
6056 printf ( " %6.6lx %6.6lx %2.2lx",
6057 (unsigned long) section->sh_offset,
6058 (unsigned long) section->sh_size,
6059 (unsigned long) section->sh_entsize);
d1133906 6060
5477e8a0
L
6061 if (do_section_details)
6062 fputs (" ", stdout);
6063 else
6064 printf (" %3s ", get_elf_section_flags (section->sh_flags));
76da6bbe 6065
cfcac11d
NC
6066 if (section->sh_link >= elf_header.e_shnum)
6067 {
6068 link_too_big = "";
6069 /* The sh_link value is out of range. Normally this indicates
caa83f8b 6070 an error but it can have special values in Solaris binaries. */
cfcac11d
NC
6071 switch (elf_header.e_machine)
6072 {
caa83f8b 6073 case EM_386:
22abe556 6074 case EM_IAMCU:
caa83f8b 6075 case EM_X86_64:
7f502d6c 6076 case EM_L1OM:
7a9068fe 6077 case EM_K1OM:
cfcac11d
NC
6078 case EM_OLD_SPARCV9:
6079 case EM_SPARC32PLUS:
6080 case EM_SPARCV9:
6081 case EM_SPARC:
6082 if (section->sh_link == (SHN_BEFORE & 0xffff))
6083 link_too_big = "BEFORE";
6084 else if (section->sh_link == (SHN_AFTER & 0xffff))
6085 link_too_big = "AFTER";
6086 break;
6087 default:
6088 break;
6089 }
6090 }
6091
6092 if (do_section_details)
6093 {
6094 if (link_too_big != NULL && * link_too_big)
6095 printf ("<%s> ", link_too_big);
6096 else
6097 printf ("%2u ", section->sh_link);
6098 printf ("%3u %2lu\n", section->sh_info,
6099 (unsigned long) section->sh_addralign);
6100 }
6101 else
6102 printf ("%2u %3u %2lu\n",
6103 section->sh_link,
6104 section->sh_info,
6105 (unsigned long) section->sh_addralign);
6106
6107 if (link_too_big && ! * link_too_big)
6108 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
6109 i, section->sh_link);
f7a99963 6110 }
d974e256
JJ
6111 else if (do_wide)
6112 {
6113 print_vma (section->sh_addr, LONG_HEX);
6114
6115 if ((long) section->sh_offset == section->sh_offset)
6116 printf (" %6.6lx", (unsigned long) section->sh_offset);
6117 else
6118 {
6119 putchar (' ');
6120 print_vma (section->sh_offset, LONG_HEX);
6121 }
6122
6123 if ((unsigned long) section->sh_size == section->sh_size)
6124 printf (" %6.6lx", (unsigned long) section->sh_size);
6125 else
6126 {
6127 putchar (' ');
6128 print_vma (section->sh_size, LONG_HEX);
6129 }
6130
6131 if ((unsigned long) section->sh_entsize == section->sh_entsize)
6132 printf (" %2.2lx", (unsigned long) section->sh_entsize);
6133 else
6134 {
6135 putchar (' ');
6136 print_vma (section->sh_entsize, LONG_HEX);
6137 }
6138
5477e8a0
L
6139 if (do_section_details)
6140 fputs (" ", stdout);
6141 else
6142 printf (" %3s ", get_elf_section_flags (section->sh_flags));
d974e256 6143
72de5009 6144 printf ("%2u %3u ", section->sh_link, section->sh_info);
d974e256
JJ
6145
6146 if ((unsigned long) section->sh_addralign == section->sh_addralign)
72de5009 6147 printf ("%2lu\n", (unsigned long) section->sh_addralign);
d974e256
JJ
6148 else
6149 {
6150 print_vma (section->sh_addralign, DEC);
6151 putchar ('\n');
6152 }
6153 }
5477e8a0 6154 else if (do_section_details)
595cf52e 6155 {
5477e8a0 6156 printf (" %-15.15s ",
595cf52e 6157 get_section_type_name (section->sh_type));
595cf52e
L
6158 print_vma (section->sh_addr, LONG_HEX);
6159 if ((long) section->sh_offset == section->sh_offset)
5477e8a0 6160 printf (" %16.16lx", (unsigned long) section->sh_offset);
595cf52e
L
6161 else
6162 {
6163 printf (" ");
6164 print_vma (section->sh_offset, LONG_HEX);
6165 }
72de5009 6166 printf (" %u\n ", section->sh_link);
595cf52e 6167 print_vma (section->sh_size, LONG_HEX);
5477e8a0 6168 putchar (' ');
595cf52e
L
6169 print_vma (section->sh_entsize, LONG_HEX);
6170
72de5009
AM
6171 printf (" %-16u %lu\n",
6172 section->sh_info,
595cf52e
L
6173 (unsigned long) section->sh_addralign);
6174 }
f7a99963
NC
6175 else
6176 {
6177 putchar (' ');
6178 print_vma (section->sh_addr, LONG_HEX);
53c7db4b
KH
6179 if ((long) section->sh_offset == section->sh_offset)
6180 printf (" %8.8lx", (unsigned long) section->sh_offset);
6181 else
6182 {
6183 printf (" ");
6184 print_vma (section->sh_offset, LONG_HEX);
6185 }
f7a99963
NC
6186 printf ("\n ");
6187 print_vma (section->sh_size, LONG_HEX);
6188 printf (" ");
6189 print_vma (section->sh_entsize, LONG_HEX);
76da6bbe 6190
d1133906 6191 printf (" %3s ", get_elf_section_flags (section->sh_flags));
76da6bbe 6192
72de5009
AM
6193 printf (" %2u %3u %lu\n",
6194 section->sh_link,
6195 section->sh_info,
f7a99963
NC
6196 (unsigned long) section->sh_addralign);
6197 }
5477e8a0
L
6198
6199 if (do_section_details)
77115a4a
L
6200 {
6201 printf (" %s\n", get_elf_section_flags (section->sh_flags));
6202 if ((section->sh_flags & SHF_COMPRESSED) != 0)
6203 {
6204 /* Minimum section size is 12 bytes for 32-bit compression
6205 header + 12 bytes for compressed data header. */
6206 unsigned char buf[24];
d8024a91 6207
77115a4a
L
6208 assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
6209 if (get_data (&buf, (FILE *) file, section->sh_offset, 1,
6210 sizeof (buf), _("compression header")))
6211 {
6212 Elf_Internal_Chdr chdr;
d8024a91
NC
6213
6214 (void) get_compression_header (&chdr, buf);
6215
77115a4a
L
6216 if (chdr.ch_type == ELFCOMPRESS_ZLIB)
6217 printf (" ZLIB, ");
6218 else
6219 printf (_(" [<unknown>: 0x%x], "),
6220 chdr.ch_type);
6221 print_vma (chdr.ch_size, LONG_HEX);
6222 printf (", %lu\n", (unsigned long) chdr.ch_addralign);
6223 }
6224 }
6225 }
252b5132
RH
6226 }
6227
5477e8a0 6228 if (!do_section_details)
3dbcc61d 6229 {
9fb71ee4
NC
6230 /* The ordering of the letters shown here matches the ordering of the
6231 corresponding SHF_xxx values, and hence the order in which these
6232 letters will be displayed to the user. */
6233 printf (_("Key to Flags:\n\
6234 W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6235 L (link order), O (extra OS processing required), G (group), T (TLS),\n\
fd85a6a1 6236 C (compressed), x (unknown), o (OS specific), E (exclude),\n "));
3dbcc61d 6237 if (elf_header.e_machine == EM_X86_64
7a9068fe
L
6238 || elf_header.e_machine == EM_L1OM
6239 || elf_header.e_machine == EM_K1OM)
9fb71ee4 6240 printf (_("l (large), "));
91f68a68 6241 else if (elf_header.e_machine == EM_ARM)
f0728ee3 6242 printf (_("y (purecode), "));
9fb71ee4 6243 printf ("p (processor specific)\n");
0b4362b0 6244 }
d1133906 6245
252b5132
RH
6246 return 1;
6247}
6248
f5842774
L
6249static const char *
6250get_group_flags (unsigned int flags)
6251{
6252 static char buff[32];
6253 switch (flags)
6254 {
220453ec
AM
6255 case 0:
6256 return "";
6257
f5842774 6258 case GRP_COMDAT:
220453ec 6259 return "COMDAT ";
f5842774
L
6260
6261 default:
220453ec 6262 snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x] "), flags);
f5842774
L
6263 break;
6264 }
6265 return buff;
6266}
6267
6268static int
2cf0635d 6269process_section_groups (FILE * file)
f5842774 6270{
2cf0635d 6271 Elf_Internal_Shdr * section;
f5842774 6272 unsigned int i;
2cf0635d
NC
6273 struct group * group;
6274 Elf_Internal_Shdr * symtab_sec;
6275 Elf_Internal_Shdr * strtab_sec;
6276 Elf_Internal_Sym * symtab;
ba5cdace 6277 unsigned long num_syms;
2cf0635d 6278 char * strtab;
c256ffe7 6279 size_t strtab_size;
d1f5c6e3
L
6280
6281 /* Don't process section groups unless needed. */
6282 if (!do_unwind && !do_section_groups)
6283 return 1;
f5842774
L
6284
6285 if (elf_header.e_shnum == 0)
6286 {
6287 if (do_section_groups)
82f2dbf7 6288 printf (_("\nThere are no sections to group in this file.\n"));
f5842774
L
6289
6290 return 1;
6291 }
6292
6293 if (section_headers == NULL)
6294 {
6295 error (_("Section headers are not available!\n"));
fa1908fd
NC
6296 /* PR 13622: This can happen with a corrupt ELF header. */
6297 return 0;
f5842774
L
6298 }
6299
3f5e193b
NC
6300 section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
6301 sizeof (struct group *));
e4b17d5c
L
6302
6303 if (section_headers_groups == NULL)
6304 {
8b73c356
NC
6305 error (_("Out of memory reading %u section group headers\n"),
6306 elf_header.e_shnum);
e4b17d5c
L
6307 return 0;
6308 }
6309
f5842774 6310 /* Scan the sections for the group section. */
d1f5c6e3 6311 group_count = 0;
f5842774
L
6312 for (i = 0, section = section_headers;
6313 i < elf_header.e_shnum;
6314 i++, section++)
e4b17d5c
L
6315 if (section->sh_type == SHT_GROUP)
6316 group_count++;
6317
d1f5c6e3
L
6318 if (group_count == 0)
6319 {
6320 if (do_section_groups)
6321 printf (_("\nThere are no section groups in this file.\n"));
6322
6323 return 1;
6324 }
6325
3f5e193b 6326 section_groups = (struct group *) calloc (group_count, sizeof (struct group));
e4b17d5c
L
6327
6328 if (section_groups == NULL)
6329 {
8b73c356
NC
6330 error (_("Out of memory reading %lu groups\n"),
6331 (unsigned long) group_count);
e4b17d5c
L
6332 return 0;
6333 }
6334
d1f5c6e3
L
6335 symtab_sec = NULL;
6336 strtab_sec = NULL;
6337 symtab = NULL;
ba5cdace 6338 num_syms = 0;
d1f5c6e3 6339 strtab = NULL;
c256ffe7 6340 strtab_size = 0;
e4b17d5c
L
6341 for (i = 0, section = section_headers, group = section_groups;
6342 i < elf_header.e_shnum;
6343 i++, section++)
f5842774
L
6344 {
6345 if (section->sh_type == SHT_GROUP)
6346 {
74e1a04b
NC
6347 const char * name = printable_section_name (section);
6348 const char * group_name;
2cf0635d
NC
6349 unsigned char * start;
6350 unsigned char * indices;
f5842774 6351 unsigned int entry, j, size;
2cf0635d
NC
6352 Elf_Internal_Shdr * sec;
6353 Elf_Internal_Sym * sym;
f5842774
L
6354
6355 /* Get the symbol table. */
4fbb74a6
AM
6356 if (section->sh_link >= elf_header.e_shnum
6357 || ((sec = section_headers + section->sh_link)->sh_type
c256ffe7 6358 != SHT_SYMTAB))
f5842774
L
6359 {
6360 error (_("Bad sh_link in group section `%s'\n"), name);
6361 continue;
6362 }
d1f5c6e3
L
6363
6364 if (symtab_sec != sec)
6365 {
6366 symtab_sec = sec;
6367 if (symtab)
6368 free (symtab);
ba5cdace 6369 symtab = GET_ELF_SYMBOLS (file, symtab_sec, & num_syms);
d1f5c6e3 6370 }
f5842774 6371
dd24e3da
NC
6372 if (symtab == NULL)
6373 {
6374 error (_("Corrupt header in group section `%s'\n"), name);
6375 continue;
6376 }
6377
ba5cdace
NC
6378 if (section->sh_info >= num_syms)
6379 {
6380 error (_("Bad sh_info in group section `%s'\n"), name);
6381 continue;
6382 }
6383
f5842774
L
6384 sym = symtab + section->sh_info;
6385
6386 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6387 {
4fbb74a6
AM
6388 if (sym->st_shndx == 0
6389 || sym->st_shndx >= elf_header.e_shnum)
f5842774
L
6390 {
6391 error (_("Bad sh_info in group section `%s'\n"), name);
6392 continue;
6393 }
ba2685cc 6394
4fbb74a6 6395 group_name = SECTION_NAME (section_headers + sym->st_shndx);
c256ffe7
JJ
6396 strtab_sec = NULL;
6397 if (strtab)
6398 free (strtab);
f5842774 6399 strtab = NULL;
c256ffe7 6400 strtab_size = 0;
f5842774
L
6401 }
6402 else
6403 {
6404 /* Get the string table. */
4fbb74a6 6405 if (symtab_sec->sh_link >= elf_header.e_shnum)
c256ffe7
JJ
6406 {
6407 strtab_sec = NULL;
6408 if (strtab)
6409 free (strtab);
6410 strtab = NULL;
6411 strtab_size = 0;
6412 }
6413 else if (strtab_sec
4fbb74a6 6414 != (sec = section_headers + symtab_sec->sh_link))
d1f5c6e3
L
6415 {
6416 strtab_sec = sec;
6417 if (strtab)
6418 free (strtab);
071436c6 6419
3f5e193b 6420 strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
071436c6
NC
6421 1, strtab_sec->sh_size,
6422 _("string table"));
c256ffe7 6423 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
d1f5c6e3 6424 }
c256ffe7 6425 group_name = sym->st_name < strtab_size
2b692964 6426 ? strtab + sym->st_name : _("<corrupt>");
f5842774
L
6427 }
6428
c9c1d674
EG
6429 /* PR 17531: file: loop. */
6430 if (section->sh_entsize > section->sh_size)
6431 {
6432 error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6433 printable_section_name (section),
8066deb1
AM
6434 (unsigned long) section->sh_entsize,
6435 (unsigned long) section->sh_size);
c9c1d674
EG
6436 break;
6437 }
6438
3f5e193b
NC
6439 start = (unsigned char *) get_data (NULL, file, section->sh_offset,
6440 1, section->sh_size,
6441 _("section data"));
59245841
NC
6442 if (start == NULL)
6443 continue;
f5842774
L
6444
6445 indices = start;
6446 size = (section->sh_size / section->sh_entsize) - 1;
6447 entry = byte_get (indices, 4);
6448 indices += 4;
e4b17d5c
L
6449
6450 if (do_section_groups)
6451 {
2b692964 6452 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
391cb864 6453 get_group_flags (entry), i, name, group_name, size);
ba2685cc 6454
e4b17d5c
L
6455 printf (_(" [Index] Name\n"));
6456 }
6457
6458 group->group_index = i;
6459
f5842774
L
6460 for (j = 0; j < size; j++)
6461 {
2cf0635d 6462 struct group_list * g;
e4b17d5c 6463
f5842774
L
6464 entry = byte_get (indices, 4);
6465 indices += 4;
6466
4fbb74a6 6467 if (entry >= elf_header.e_shnum)
391cb864 6468 {
57028622
NC
6469 static unsigned num_group_errors = 0;
6470
6471 if (num_group_errors ++ < 10)
6472 {
6473 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6474 entry, i, elf_header.e_shnum - 1);
6475 if (num_group_errors == 10)
6476 warn (_("Futher error messages about overlarge group section indicies suppressed\n"));
6477 }
391cb864
L
6478 continue;
6479 }
391cb864 6480
4fbb74a6 6481 if (section_headers_groups [entry] != NULL)
e4b17d5c 6482 {
d1f5c6e3
L
6483 if (entry)
6484 {
57028622
NC
6485 static unsigned num_errs = 0;
6486
6487 if (num_errs ++ < 10)
6488 {
6489 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6490 entry, i,
6491 section_headers_groups [entry]->group_index);
6492 if (num_errs == 10)
6493 warn (_("Further error messages about already contained group sections suppressed\n"));
6494 }
d1f5c6e3
L
6495 continue;
6496 }
6497 else
6498 {
6499 /* Intel C/C++ compiler may put section 0 in a
6500 section group. We just warn it the first time
6501 and ignore it afterwards. */
6502 static int warned = 0;
6503 if (!warned)
6504 {
6505 error (_("section 0 in group section [%5u]\n"),
4fbb74a6 6506 section_headers_groups [entry]->group_index);
d1f5c6e3
L
6507 warned++;
6508 }
6509 }
e4b17d5c
L
6510 }
6511
4fbb74a6 6512 section_headers_groups [entry] = group;
e4b17d5c
L
6513
6514 if (do_section_groups)
6515 {
4fbb74a6 6516 sec = section_headers + entry;
74e1a04b 6517 printf (" [%5u] %s\n", entry, printable_section_name (sec));
ba2685cc
AM
6518 }
6519
3f5e193b 6520 g = (struct group_list *) xmalloc (sizeof (struct group_list));
e4b17d5c
L
6521 g->section_index = entry;
6522 g->next = group->root;
6523 group->root = g;
f5842774
L
6524 }
6525
f5842774
L
6526 if (start)
6527 free (start);
e4b17d5c
L
6528
6529 group++;
f5842774
L
6530 }
6531 }
6532
d1f5c6e3
L
6533 if (symtab)
6534 free (symtab);
6535 if (strtab)
6536 free (strtab);
f5842774
L
6537 return 1;
6538}
6539
28f997cf
TG
6540/* Data used to display dynamic fixups. */
6541
6542struct ia64_vms_dynfixup
6543{
6544 bfd_vma needed_ident; /* Library ident number. */
6545 bfd_vma needed; /* Index in the dstrtab of the library name. */
6546 bfd_vma fixup_needed; /* Index of the library. */
6547 bfd_vma fixup_rela_cnt; /* Number of fixups. */
6548 bfd_vma fixup_rela_off; /* Fixups offset in the dynamic segment. */
6549};
6550
6551/* Data used to display dynamic relocations. */
6552
6553struct ia64_vms_dynimgrela
6554{
6555 bfd_vma img_rela_cnt; /* Number of relocations. */
6556 bfd_vma img_rela_off; /* Reloc offset in the dynamic segment. */
6557};
6558
6559/* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6560 library). */
6561
6562static void
6563dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
6564 const char *strtab, unsigned int strtab_sz)
6565{
6566 Elf64_External_VMS_IMAGE_FIXUP *imfs;
6567 long i;
6568 const char *lib_name;
6569
6570 imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
6571 1, fixup->fixup_rela_cnt * sizeof (*imfs),
6572 _("dynamic section image fixups"));
6573 if (!imfs)
6574 return;
6575
6576 if (fixup->needed < strtab_sz)
6577 lib_name = strtab + fixup->needed;
6578 else
6579 {
6580 warn ("corrupt library name index of 0x%lx found in dynamic entry",
7f01b0c6 6581 (unsigned long) fixup->needed);
28f997cf
TG
6582 lib_name = "???";
6583 }
6584 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
6585 (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
6586 printf
6587 (_("Seg Offset Type SymVec DataType\n"));
6588
6589 for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
6590 {
6591 unsigned int type;
6592 const char *rtype;
6593
6594 printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
6595 printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
6596 type = BYTE_GET (imfs [i].type);
6597 rtype = elf_ia64_reloc_type (type);
6598 if (rtype == NULL)
6599 printf (" 0x%08x ", type);
6600 else
6601 printf (" %-32s ", rtype);
6602 printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
6603 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
6604 }
6605
6606 free (imfs);
6607}
6608
6609/* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
6610
6611static void
6612dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
6613{
6614 Elf64_External_VMS_IMAGE_RELA *imrs;
6615 long i;
6616
6617 imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
6618 1, imgrela->img_rela_cnt * sizeof (*imrs),
9cf03b7e 6619 _("dynamic section image relocations"));
28f997cf
TG
6620 if (!imrs)
6621 return;
6622
6623 printf (_("\nImage relocs\n"));
6624 printf
6625 (_("Seg Offset Type Addend Seg Sym Off\n"));
6626
6627 for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
6628 {
6629 unsigned int type;
6630 const char *rtype;
6631
6632 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
6633 printf ("%08" BFD_VMA_FMT "x ",
6634 (bfd_vma) BYTE_GET (imrs [i].rela_offset));
6635 type = BYTE_GET (imrs [i].type);
6636 rtype = elf_ia64_reloc_type (type);
6637 if (rtype == NULL)
6638 printf ("0x%08x ", type);
6639 else
6640 printf ("%-31s ", rtype);
6641 print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
6642 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
6643 printf ("%08" BFD_VMA_FMT "x\n",
6644 (bfd_vma) BYTE_GET (imrs [i].sym_offset));
6645 }
6646
6647 free (imrs);
6648}
6649
6650/* Display IA-64 OpenVMS dynamic relocations and fixups. */
6651
6652static int
6653process_ia64_vms_dynamic_relocs (FILE *file)
6654{
6655 struct ia64_vms_dynfixup fixup;
6656 struct ia64_vms_dynimgrela imgrela;
6657 Elf_Internal_Dyn *entry;
6658 int res = 0;
6659 bfd_vma strtab_off = 0;
6660 bfd_vma strtab_sz = 0;
6661 char *strtab = NULL;
6662
6663 memset (&fixup, 0, sizeof (fixup));
6664 memset (&imgrela, 0, sizeof (imgrela));
6665
6666 /* Note: the order of the entries is specified by the OpenVMS specs. */
6667 for (entry = dynamic_section;
6668 entry < dynamic_section + dynamic_nent;
6669 entry++)
6670 {
6671 switch (entry->d_tag)
6672 {
6673 case DT_IA_64_VMS_STRTAB_OFFSET:
6674 strtab_off = entry->d_un.d_val;
6675 break;
6676 case DT_STRSZ:
6677 strtab_sz = entry->d_un.d_val;
6678 if (strtab == NULL)
6679 strtab = get_data (NULL, file, dynamic_addr + strtab_off,
6680 1, strtab_sz, _("dynamic string section"));
6681 break;
6682
6683 case DT_IA_64_VMS_NEEDED_IDENT:
6684 fixup.needed_ident = entry->d_un.d_val;
6685 break;
6686 case DT_NEEDED:
6687 fixup.needed = entry->d_un.d_val;
6688 break;
6689 case DT_IA_64_VMS_FIXUP_NEEDED:
6690 fixup.fixup_needed = entry->d_un.d_val;
6691 break;
6692 case DT_IA_64_VMS_FIXUP_RELA_CNT:
6693 fixup.fixup_rela_cnt = entry->d_un.d_val;
6694 break;
6695 case DT_IA_64_VMS_FIXUP_RELA_OFF:
6696 fixup.fixup_rela_off = entry->d_un.d_val;
6697 res++;
6698 dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
6699 break;
6700
6701 case DT_IA_64_VMS_IMG_RELA_CNT:
6702 imgrela.img_rela_cnt = entry->d_un.d_val;
6703 break;
6704 case DT_IA_64_VMS_IMG_RELA_OFF:
6705 imgrela.img_rela_off = entry->d_un.d_val;
6706 res++;
6707 dump_ia64_vms_dynamic_relocs (file, &imgrela);
6708 break;
6709
6710 default:
6711 break;
6712 }
6713 }
6714
6715 if (strtab != NULL)
6716 free (strtab);
6717
6718 return res;
6719}
6720
85b1c36d 6721static struct
566b0d53 6722{
2cf0635d 6723 const char * name;
566b0d53
L
6724 int reloc;
6725 int size;
6726 int rela;
6727} dynamic_relocations [] =
6728{
6729 { "REL", DT_REL, DT_RELSZ, FALSE },
6730 { "RELA", DT_RELA, DT_RELASZ, TRUE },
6731 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
6732};
6733
252b5132 6734/* Process the reloc section. */
18bd398b 6735
252b5132 6736static int
2cf0635d 6737process_relocs (FILE * file)
252b5132 6738{
b34976b6
AM
6739 unsigned long rel_size;
6740 unsigned long rel_offset;
252b5132
RH
6741
6742
6743 if (!do_reloc)
6744 return 1;
6745
6746 if (do_using_dynamic)
6747 {
566b0d53 6748 int is_rela;
2cf0635d 6749 const char * name;
566b0d53
L
6750 int has_dynamic_reloc;
6751 unsigned int i;
0de14b54 6752
566b0d53 6753 has_dynamic_reloc = 0;
252b5132 6754
566b0d53 6755 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
252b5132 6756 {
566b0d53
L
6757 is_rela = dynamic_relocations [i].rela;
6758 name = dynamic_relocations [i].name;
6759 rel_size = dynamic_info [dynamic_relocations [i].size];
6760 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
103f02d3 6761
566b0d53
L
6762 has_dynamic_reloc |= rel_size;
6763
6764 if (is_rela == UNKNOWN)
aa903cfb 6765 {
566b0d53
L
6766 if (dynamic_relocations [i].reloc == DT_JMPREL)
6767 switch (dynamic_info[DT_PLTREL])
6768 {
6769 case DT_REL:
6770 is_rela = FALSE;
6771 break;
6772 case DT_RELA:
6773 is_rela = TRUE;
6774 break;
6775 }
aa903cfb 6776 }
252b5132 6777
566b0d53
L
6778 if (rel_size)
6779 {
6780 printf
6781 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
6782 name, rel_offset, rel_size);
252b5132 6783
d93f0186
NC
6784 dump_relocations (file,
6785 offset_from_vma (file, rel_offset, rel_size),
6786 rel_size,
566b0d53 6787 dynamic_symbols, num_dynamic_syms,
bb4d2ac2
L
6788 dynamic_strings, dynamic_strings_length,
6789 is_rela, 1);
566b0d53 6790 }
252b5132 6791 }
566b0d53 6792
28f997cf
TG
6793 if (is_ia64_vms ())
6794 has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
6795
566b0d53 6796 if (! has_dynamic_reloc)
252b5132
RH
6797 printf (_("\nThere are no dynamic relocations in this file.\n"));
6798 }
6799 else
6800 {
2cf0635d 6801 Elf_Internal_Shdr * section;
b34976b6
AM
6802 unsigned long i;
6803 int found = 0;
252b5132
RH
6804
6805 for (i = 0, section = section_headers;
6806 i < elf_header.e_shnum;
b34976b6 6807 i++, section++)
252b5132
RH
6808 {
6809 if ( section->sh_type != SHT_RELA
6810 && section->sh_type != SHT_REL)
6811 continue;
6812
6813 rel_offset = section->sh_offset;
6814 rel_size = section->sh_size;
6815
6816 if (rel_size)
6817 {
2cf0635d 6818 Elf_Internal_Shdr * strsec;
b34976b6 6819 int is_rela;
103f02d3 6820
252b5132
RH
6821 printf (_("\nRelocation section "));
6822
6823 if (string_table == NULL)
19936277 6824 printf ("%d", section->sh_name);
252b5132 6825 else
74e1a04b 6826 printf ("'%s'", printable_section_name (section));
252b5132
RH
6827
6828 printf (_(" at offset 0x%lx contains %lu entries:\n"),
6829 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
6830
d79b3d50
NC
6831 is_rela = section->sh_type == SHT_RELA;
6832
4fbb74a6
AM
6833 if (section->sh_link != 0
6834 && section->sh_link < elf_header.e_shnum)
af3fc3bc 6835 {
2cf0635d
NC
6836 Elf_Internal_Shdr * symsec;
6837 Elf_Internal_Sym * symtab;
d79b3d50 6838 unsigned long nsyms;
c256ffe7 6839 unsigned long strtablen = 0;
2cf0635d 6840 char * strtab = NULL;
57346661 6841
4fbb74a6 6842 symsec = section_headers + section->sh_link;
08d8fa11
JJ
6843 if (symsec->sh_type != SHT_SYMTAB
6844 && symsec->sh_type != SHT_DYNSYM)
6845 continue;
6846
ba5cdace 6847 symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms);
252b5132 6848
af3fc3bc
AM
6849 if (symtab == NULL)
6850 continue;
252b5132 6851
4fbb74a6
AM
6852 if (symsec->sh_link != 0
6853 && symsec->sh_link < elf_header.e_shnum)
c256ffe7 6854 {
4fbb74a6 6855 strsec = section_headers + symsec->sh_link;
103f02d3 6856
3f5e193b 6857 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
071436c6
NC
6858 1, strsec->sh_size,
6859 _("string table"));
c256ffe7
JJ
6860 strtablen = strtab == NULL ? 0 : strsec->sh_size;
6861 }
252b5132 6862
d79b3d50 6863 dump_relocations (file, rel_offset, rel_size,
bb4d2ac2
L
6864 symtab, nsyms, strtab, strtablen,
6865 is_rela,
6866 symsec->sh_type == SHT_DYNSYM);
d79b3d50
NC
6867 if (strtab)
6868 free (strtab);
6869 free (symtab);
6870 }
6871 else
6872 dump_relocations (file, rel_offset, rel_size,
bb4d2ac2 6873 NULL, 0, NULL, 0, is_rela, 0);
252b5132
RH
6874
6875 found = 1;
6876 }
6877 }
6878
6879 if (! found)
6880 printf (_("\nThere are no relocations in this file.\n"));
6881 }
6882
6883 return 1;
6884}
6885
4d6ed7c8
NC
6886/* An absolute address consists of a section and an offset. If the
6887 section is NULL, the offset itself is the address, otherwise, the
6888 address equals to LOAD_ADDRESS(section) + offset. */
6889
6890struct absaddr
948f632f
DA
6891{
6892 unsigned short section;
6893 bfd_vma offset;
6894};
4d6ed7c8 6895
1949de15
L
6896#define ABSADDR(a) \
6897 ((a).section \
6898 ? section_headers [(a).section].sh_addr + (a).offset \
6899 : (a).offset)
6900
948f632f
DA
6901/* Find the nearest symbol at or below ADDR. Returns the symbol
6902 name, if found, and the offset from the symbol to ADDR. */
4d6ed7c8 6903
4d6ed7c8 6904static void
2cf0635d 6905find_symbol_for_address (Elf_Internal_Sym * symtab,
948f632f
DA
6906 unsigned long nsyms,
6907 const char * strtab,
6908 unsigned long strtab_size,
6909 struct absaddr addr,
6910 const char ** symname,
6911 bfd_vma * offset)
4d6ed7c8 6912{
d3ba0551 6913 bfd_vma dist = 0x100000;
2cf0635d 6914 Elf_Internal_Sym * sym;
948f632f
DA
6915 Elf_Internal_Sym * beg;
6916 Elf_Internal_Sym * end;
2cf0635d 6917 Elf_Internal_Sym * best = NULL;
4d6ed7c8 6918
0b6ae522 6919 REMOVE_ARCH_BITS (addr.offset);
948f632f
DA
6920 beg = symtab;
6921 end = symtab + nsyms;
0b6ae522 6922
948f632f 6923 while (beg < end)
4d6ed7c8 6924 {
948f632f
DA
6925 bfd_vma value;
6926
6927 sym = beg + (end - beg) / 2;
0b6ae522 6928
948f632f 6929 value = sym->st_value;
0b6ae522
DJ
6930 REMOVE_ARCH_BITS (value);
6931
948f632f 6932 if (sym->st_name != 0
4d6ed7c8 6933 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
0b6ae522
DJ
6934 && addr.offset >= value
6935 && addr.offset - value < dist)
4d6ed7c8
NC
6936 {
6937 best = sym;
0b6ae522 6938 dist = addr.offset - value;
4d6ed7c8
NC
6939 if (!dist)
6940 break;
6941 }
948f632f
DA
6942
6943 if (addr.offset < value)
6944 end = sym;
6945 else
6946 beg = sym + 1;
4d6ed7c8 6947 }
1b31d05e 6948
4d6ed7c8
NC
6949 if (best)
6950 {
57346661 6951 *symname = (best->st_name >= strtab_size
2b692964 6952 ? _("<corrupt>") : strtab + best->st_name);
4d6ed7c8
NC
6953 *offset = dist;
6954 return;
6955 }
1b31d05e 6956
4d6ed7c8
NC
6957 *symname = NULL;
6958 *offset = addr.offset;
6959}
6960
948f632f
DA
6961static int
6962symcmp (const void *p, const void *q)
6963{
6964 Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
6965 Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
6966
6967 return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
6968}
6969
6970/* Process the unwind section. */
6971
6972#include "unwind-ia64.h"
6973
6974struct ia64_unw_table_entry
6975{
6976 struct absaddr start;
6977 struct absaddr end;
6978 struct absaddr info;
6979};
6980
6981struct ia64_unw_aux_info
6982{
6983 struct ia64_unw_table_entry *table; /* Unwind table. */
6984 unsigned long table_len; /* Length of unwind table. */
6985 unsigned char * info; /* Unwind info. */
6986 unsigned long info_size; /* Size of unwind info. */
6987 bfd_vma info_addr; /* Starting address of unwind info. */
6988 bfd_vma seg_base; /* Starting address of segment. */
6989 Elf_Internal_Sym * symtab; /* The symbol table. */
6990 unsigned long nsyms; /* Number of symbols. */
6991 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
6992 unsigned long nfuns; /* Number of entries in funtab. */
6993 char * strtab; /* The string table. */
6994 unsigned long strtab_size; /* Size of string table. */
6995};
6996
4d6ed7c8 6997static void
2cf0635d 6998dump_ia64_unwind (struct ia64_unw_aux_info * aux)
4d6ed7c8 6999{
2cf0635d 7000 struct ia64_unw_table_entry * tp;
948f632f 7001 unsigned long j, nfuns;
4d6ed7c8 7002 int in_body;
7036c0e1 7003
948f632f
DA
7004 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7005 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7006 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7007 aux->funtab[nfuns++] = aux->symtab[j];
7008 aux->nfuns = nfuns;
7009 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7010
4d6ed7c8
NC
7011 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7012 {
7013 bfd_vma stamp;
7014 bfd_vma offset;
2cf0635d
NC
7015 const unsigned char * dp;
7016 const unsigned char * head;
53774b7e 7017 const unsigned char * end;
2cf0635d 7018 const char * procname;
4d6ed7c8 7019
948f632f 7020 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
57346661 7021 aux->strtab_size, tp->start, &procname, &offset);
4d6ed7c8
NC
7022
7023 fputs ("\n<", stdout);
7024
7025 if (procname)
7026 {
7027 fputs (procname, stdout);
7028
7029 if (offset)
7030 printf ("+%lx", (unsigned long) offset);
7031 }
7032
7033 fputs (">: [", stdout);
7034 print_vma (tp->start.offset, PREFIX_HEX);
7035 fputc ('-', stdout);
7036 print_vma (tp->end.offset, PREFIX_HEX);
86f55779 7037 printf ("], info at +0x%lx\n",
4d6ed7c8
NC
7038 (unsigned long) (tp->info.offset - aux->seg_base));
7039
53774b7e
NC
7040 /* PR 17531: file: 86232b32. */
7041 if (aux->info == NULL)
7042 continue;
7043
7044 /* PR 17531: file: 0997b4d1. */
7045 if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
7046 {
7047 warn (_("Invalid offset %lx in table entry %ld\n"),
7048 (long) tp->info.offset, (long) (tp - aux->table));
7049 continue;
7050 }
7051
1949de15 7052 head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
a4a00738 7053 stamp = byte_get ((unsigned char *) head, sizeof (stamp));
4d6ed7c8 7054
86f55779 7055 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4d6ed7c8
NC
7056 (unsigned) UNW_VER (stamp),
7057 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
7058 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
7059 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
89fac5e3 7060 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
4d6ed7c8
NC
7061
7062 if (UNW_VER (stamp) != 1)
7063 {
2b692964 7064 printf (_("\tUnknown version.\n"));
4d6ed7c8
NC
7065 continue;
7066 }
7067
7068 in_body = 0;
53774b7e
NC
7069 end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
7070 /* PR 17531: file: 16ceda89. */
7071 if (end > aux->info + aux->info_size)
7072 end = aux->info + aux->info_size;
7073 for (dp = head + 8; dp < end;)
b4477bc8 7074 dp = unw_decode (dp, in_body, & in_body, end);
4d6ed7c8 7075 }
948f632f
DA
7076
7077 free (aux->funtab);
4d6ed7c8
NC
7078}
7079
53774b7e 7080static bfd_boolean
2cf0635d
NC
7081slurp_ia64_unwind_table (FILE * file,
7082 struct ia64_unw_aux_info * aux,
7083 Elf_Internal_Shdr * sec)
4d6ed7c8 7084{
89fac5e3 7085 unsigned long size, nrelas, i;
2cf0635d
NC
7086 Elf_Internal_Phdr * seg;
7087 struct ia64_unw_table_entry * tep;
7088 Elf_Internal_Shdr * relsec;
7089 Elf_Internal_Rela * rela;
7090 Elf_Internal_Rela * rp;
7091 unsigned char * table;
7092 unsigned char * tp;
7093 Elf_Internal_Sym * sym;
7094 const char * relname;
4d6ed7c8 7095
53774b7e
NC
7096 aux->table_len = 0;
7097
4d6ed7c8
NC
7098 /* First, find the starting address of the segment that includes
7099 this section: */
7100
7101 if (elf_header.e_phnum)
7102 {
d93f0186 7103 if (! get_program_headers (file))
53774b7e 7104 return FALSE;
4d6ed7c8 7105
d93f0186
NC
7106 for (seg = program_headers;
7107 seg < program_headers + elf_header.e_phnum;
7108 ++seg)
4d6ed7c8
NC
7109 {
7110 if (seg->p_type != PT_LOAD)
7111 continue;
7112
7113 if (sec->sh_addr >= seg->p_vaddr
7114 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7115 {
7116 aux->seg_base = seg->p_vaddr;
7117 break;
7118 }
7119 }
4d6ed7c8
NC
7120 }
7121
7122 /* Second, build the unwind table from the contents of the unwind section: */
7123 size = sec->sh_size;
3f5e193b
NC
7124 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7125 _("unwind table"));
a6e9f9df 7126 if (!table)
53774b7e 7127 return FALSE;
4d6ed7c8 7128
53774b7e 7129 aux->table_len = size / (3 * eh_addr_size);
3f5e193b 7130 aux->table = (struct ia64_unw_table_entry *)
53774b7e 7131 xcmalloc (aux->table_len, sizeof (aux->table[0]));
89fac5e3 7132 tep = aux->table;
53774b7e
NC
7133
7134 for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
4d6ed7c8
NC
7135 {
7136 tep->start.section = SHN_UNDEF;
7137 tep->end.section = SHN_UNDEF;
7138 tep->info.section = SHN_UNDEF;
c6a0c689
AM
7139 tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7140 tep->end.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7141 tep->info.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
4d6ed7c8
NC
7142 tep->start.offset += aux->seg_base;
7143 tep->end.offset += aux->seg_base;
7144 tep->info.offset += aux->seg_base;
7145 }
7146 free (table);
7147
41e92641 7148 /* Third, apply any relocations to the unwind table: */
4d6ed7c8
NC
7149 for (relsec = section_headers;
7150 relsec < section_headers + elf_header.e_shnum;
7151 ++relsec)
7152 {
7153 if (relsec->sh_type != SHT_RELA
4fbb74a6
AM
7154 || relsec->sh_info >= elf_header.e_shnum
7155 || section_headers + relsec->sh_info != sec)
4d6ed7c8
NC
7156 continue;
7157
7158 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7159 & rela, & nrelas))
53774b7e
NC
7160 {
7161 free (aux->table);
7162 aux->table = NULL;
7163 aux->table_len = 0;
7164 return FALSE;
7165 }
4d6ed7c8
NC
7166
7167 for (rp = rela; rp < rela + nrelas; ++rp)
7168 {
aca88567
NC
7169 relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
7170 sym = aux->symtab + get_reloc_symindex (rp->r_info);
4d6ed7c8 7171
82b1b41b
NC
7172 /* PR 17531: file: 9fa67536. */
7173 if (relname == NULL)
7174 {
7175 warn (_("Skipping unknown relocation type: %u\n"), get_reloc_type (rp->r_info));
7176 continue;
7177 }
948f632f 7178
0112cd26 7179 if (! const_strneq (relname, "R_IA64_SEGREL"))
4d6ed7c8 7180 {
82b1b41b 7181 warn (_("Skipping unexpected relocation type: %s\n"), relname);
4d6ed7c8
NC
7182 continue;
7183 }
7184
89fac5e3 7185 i = rp->r_offset / (3 * eh_addr_size);
4d6ed7c8 7186
53774b7e
NC
7187 /* PR 17531: file: 5bc8d9bf. */
7188 if (i >= aux->table_len)
7189 {
7190 warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
7191 continue;
7192 }
7193
7194 switch (rp->r_offset / eh_addr_size % 3)
4d6ed7c8
NC
7195 {
7196 case 0:
7197 aux->table[i].start.section = sym->st_shndx;
e466bc6e 7198 aux->table[i].start.offset = rp->r_addend + sym->st_value;
4d6ed7c8
NC
7199 break;
7200 case 1:
7201 aux->table[i].end.section = sym->st_shndx;
e466bc6e 7202 aux->table[i].end.offset = rp->r_addend + sym->st_value;
4d6ed7c8
NC
7203 break;
7204 case 2:
7205 aux->table[i].info.section = sym->st_shndx;
e466bc6e 7206 aux->table[i].info.offset = rp->r_addend + sym->st_value;
4d6ed7c8
NC
7207 break;
7208 default:
7209 break;
7210 }
7211 }
7212
7213 free (rela);
7214 }
7215
53774b7e 7216 return TRUE;
4d6ed7c8
NC
7217}
7218
1b31d05e 7219static void
2cf0635d 7220ia64_process_unwind (FILE * file)
4d6ed7c8 7221{
2cf0635d
NC
7222 Elf_Internal_Shdr * sec;
7223 Elf_Internal_Shdr * unwsec = NULL;
7224 Elf_Internal_Shdr * strsec;
89fac5e3 7225 unsigned long i, unwcount = 0, unwstart = 0;
57346661 7226 struct ia64_unw_aux_info aux;
f1467e33 7227
4d6ed7c8
NC
7228 memset (& aux, 0, sizeof (aux));
7229
4d6ed7c8
NC
7230 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7231 {
c256ffe7 7232 if (sec->sh_type == SHT_SYMTAB
4fbb74a6 7233 && sec->sh_link < elf_header.e_shnum)
4d6ed7c8 7234 {
ba5cdace 7235 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
4d6ed7c8 7236
4fbb74a6 7237 strsec = section_headers + sec->sh_link;
4082ef84
NC
7238 if (aux.strtab != NULL)
7239 {
7240 error (_("Multiple auxillary string tables encountered\n"));
7241 free (aux.strtab);
7242 }
3f5e193b
NC
7243 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7244 1, strsec->sh_size,
7245 _("string table"));
c256ffe7 7246 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
4d6ed7c8
NC
7247 }
7248 else if (sec->sh_type == SHT_IA_64_UNWIND)
579f31ac
JJ
7249 unwcount++;
7250 }
7251
7252 if (!unwcount)
7253 printf (_("\nThere are no unwind sections in this file.\n"));
7254
7255 while (unwcount-- > 0)
7256 {
2cf0635d 7257 char * suffix;
579f31ac
JJ
7258 size_t len, len2;
7259
4082ef84 7260 for (i = unwstart, sec = section_headers + unwstart, unwsec = NULL;
579f31ac
JJ
7261 i < elf_header.e_shnum; ++i, ++sec)
7262 if (sec->sh_type == SHT_IA_64_UNWIND)
7263 {
7264 unwsec = sec;
7265 break;
7266 }
4082ef84
NC
7267 /* We have already counted the number of SHT_IA64_UNWIND
7268 sections so the loop above should never fail. */
7269 assert (unwsec != NULL);
579f31ac
JJ
7270
7271 unwstart = i + 1;
7272 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
7273
e4b17d5c
L
7274 if ((unwsec->sh_flags & SHF_GROUP) != 0)
7275 {
7276 /* We need to find which section group it is in. */
4082ef84 7277 struct group_list * g;
e4b17d5c 7278
4082ef84
NC
7279 if (section_headers_groups == NULL
7280 || section_headers_groups [i] == NULL)
7281 i = elf_header.e_shnum;
7282 else
e4b17d5c 7283 {
4082ef84 7284 g = section_headers_groups [i]->root;
18bd398b 7285
4082ef84
NC
7286 for (; g != NULL; g = g->next)
7287 {
7288 sec = section_headers + g->section_index;
e4b17d5c 7289
4082ef84
NC
7290 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
7291 break;
7292 }
7293
7294 if (g == NULL)
7295 i = elf_header.e_shnum;
7296 }
e4b17d5c 7297 }
18bd398b 7298 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
579f31ac 7299 {
18bd398b 7300 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
579f31ac
JJ
7301 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
7302 suffix = SECTION_NAME (unwsec) + len;
7303 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7304 ++i, ++sec)
18bd398b
NC
7305 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
7306 && streq (SECTION_NAME (sec) + len2, suffix))
579f31ac
JJ
7307 break;
7308 }
7309 else
7310 {
7311 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
18bd398b 7312 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
579f31ac
JJ
7313 len = sizeof (ELF_STRING_ia64_unwind) - 1;
7314 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
7315 suffix = "";
18bd398b 7316 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
579f31ac
JJ
7317 suffix = SECTION_NAME (unwsec) + len;
7318 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7319 ++i, ++sec)
18bd398b
NC
7320 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
7321 && streq (SECTION_NAME (sec) + len2, suffix))
579f31ac
JJ
7322 break;
7323 }
7324
7325 if (i == elf_header.e_shnum)
7326 {
7327 printf (_("\nCould not find unwind info section for "));
7328
7329 if (string_table == NULL)
7330 printf ("%d", unwsec->sh_name);
7331 else
74e1a04b 7332 printf ("'%s'", printable_section_name (unwsec));
579f31ac
JJ
7333 }
7334 else
4d6ed7c8 7335 {
4d6ed7c8 7336 aux.info_addr = sec->sh_addr;
3f5e193b 7337 aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
4082ef84
NC
7338 sec->sh_size,
7339 _("unwind info"));
59245841 7340 aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
4d6ed7c8 7341
579f31ac 7342 printf (_("\nUnwind section "));
4d6ed7c8 7343
579f31ac
JJ
7344 if (string_table == NULL)
7345 printf ("%d", unwsec->sh_name);
7346 else
74e1a04b 7347 printf ("'%s'", printable_section_name (unwsec));
4d6ed7c8 7348
579f31ac 7349 printf (_(" at offset 0x%lx contains %lu entries:\n"),
e59b4dfb 7350 (unsigned long) unwsec->sh_offset,
89fac5e3 7351 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
4d6ed7c8 7352
53774b7e
NC
7353 if (slurp_ia64_unwind_table (file, & aux, unwsec)
7354 && aux.table_len > 0)
579f31ac
JJ
7355 dump_ia64_unwind (& aux);
7356
7357 if (aux.table)
7358 free ((char *) aux.table);
7359 if (aux.info)
7360 free ((char *) aux.info);
7361 aux.table = NULL;
7362 aux.info = NULL;
7363 }
4d6ed7c8 7364 }
4d6ed7c8 7365
4d6ed7c8
NC
7366 if (aux.symtab)
7367 free (aux.symtab);
7368 if (aux.strtab)
7369 free ((char *) aux.strtab);
4d6ed7c8
NC
7370}
7371
3f5e193b
NC
7372struct hppa_unw_table_entry
7373 {
7374 struct absaddr start;
7375 struct absaddr end;
948f632f 7376 unsigned int Cannot_unwind:1; /* 0 */
3f5e193b
NC
7377 unsigned int Millicode:1; /* 1 */
7378 unsigned int Millicode_save_sr0:1; /* 2 */
7379 unsigned int Region_description:2; /* 3..4 */
7380 unsigned int reserved1:1; /* 5 */
7381 unsigned int Entry_SR:1; /* 6 */
7382 unsigned int Entry_FR:4; /* number saved */ /* 7..10 */
7383 unsigned int Entry_GR:5; /* number saved */ /* 11..15 */
7384 unsigned int Args_stored:1; /* 16 */
948f632f
DA
7385 unsigned int Variable_Frame:1; /* 17 */
7386 unsigned int Separate_Package_Body:1; /* 18 */
3f5e193b 7387 unsigned int Frame_Extension_Millicode:1; /* 19 */
948f632f
DA
7388 unsigned int Stack_Overflow_Check:1; /* 20 */
7389 unsigned int Two_Instruction_SP_Increment:1;/* 21 */
3f5e193b
NC
7390 unsigned int Ada_Region:1; /* 22 */
7391 unsigned int cxx_info:1; /* 23 */
948f632f
DA
7392 unsigned int cxx_try_catch:1; /* 24 */
7393 unsigned int sched_entry_seq:1; /* 25 */
3f5e193b 7394 unsigned int reserved2:1; /* 26 */
948f632f
DA
7395 unsigned int Save_SP:1; /* 27 */
7396 unsigned int Save_RP:1; /* 28 */
3f5e193b
NC
7397 unsigned int Save_MRP_in_frame:1; /* 29 */
7398 unsigned int extn_ptr_defined:1; /* 30 */
948f632f 7399 unsigned int Cleanup_defined:1; /* 31 */
3f5e193b 7400
948f632f
DA
7401 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
7402 unsigned int HP_UX_interrupt_marker:1; /* 1 */
3f5e193b 7403 unsigned int Large_frame:1; /* 2 */
948f632f 7404 unsigned int Pseudo_SP_Set:1; /* 3 */
3f5e193b
NC
7405 unsigned int reserved4:1; /* 4 */
7406 unsigned int Total_frame_size:27; /* 5..31 */
7407 };
7408
57346661 7409struct hppa_unw_aux_info
948f632f
DA
7410{
7411 struct hppa_unw_table_entry * table; /* Unwind table. */
7412 unsigned long table_len; /* Length of unwind table. */
7413 bfd_vma seg_base; /* Starting address of segment. */
7414 Elf_Internal_Sym * symtab; /* The symbol table. */
7415 unsigned long nsyms; /* Number of symbols. */
7416 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7417 unsigned long nfuns; /* Number of entries in funtab. */
7418 char * strtab; /* The string table. */
7419 unsigned long strtab_size; /* Size of string table. */
7420};
57346661
AM
7421
7422static void
2cf0635d 7423dump_hppa_unwind (struct hppa_unw_aux_info * aux)
57346661 7424{
2cf0635d 7425 struct hppa_unw_table_entry * tp;
948f632f
DA
7426 unsigned long j, nfuns;
7427
7428 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7429 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7430 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7431 aux->funtab[nfuns++] = aux->symtab[j];
7432 aux->nfuns = nfuns;
7433 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
57346661 7434
57346661
AM
7435 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7436 {
7437 bfd_vma offset;
2cf0635d 7438 const char * procname;
57346661 7439
948f632f 7440 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
57346661
AM
7441 aux->strtab_size, tp->start, &procname,
7442 &offset);
7443
7444 fputs ("\n<", stdout);
7445
7446 if (procname)
7447 {
7448 fputs (procname, stdout);
7449
7450 if (offset)
7451 printf ("+%lx", (unsigned long) offset);
7452 }
7453
7454 fputs (">: [", stdout);
7455 print_vma (tp->start.offset, PREFIX_HEX);
7456 fputc ('-', stdout);
7457 print_vma (tp->end.offset, PREFIX_HEX);
7458 printf ("]\n\t");
7459
18bd398b
NC
7460#define PF(_m) if (tp->_m) printf (#_m " ");
7461#define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
57346661
AM
7462 PF(Cannot_unwind);
7463 PF(Millicode);
7464 PF(Millicode_save_sr0);
18bd398b 7465 /* PV(Region_description); */
57346661
AM
7466 PF(Entry_SR);
7467 PV(Entry_FR);
7468 PV(Entry_GR);
7469 PF(Args_stored);
7470 PF(Variable_Frame);
7471 PF(Separate_Package_Body);
7472 PF(Frame_Extension_Millicode);
7473 PF(Stack_Overflow_Check);
7474 PF(Two_Instruction_SP_Increment);
7475 PF(Ada_Region);
7476 PF(cxx_info);
7477 PF(cxx_try_catch);
7478 PF(sched_entry_seq);
7479 PF(Save_SP);
7480 PF(Save_RP);
7481 PF(Save_MRP_in_frame);
7482 PF(extn_ptr_defined);
7483 PF(Cleanup_defined);
7484 PF(MPE_XL_interrupt_marker);
7485 PF(HP_UX_interrupt_marker);
7486 PF(Large_frame);
7487 PF(Pseudo_SP_Set);
7488 PV(Total_frame_size);
7489#undef PF
7490#undef PV
7491 }
7492
18bd398b 7493 printf ("\n");
948f632f
DA
7494
7495 free (aux->funtab);
57346661
AM
7496}
7497
7498static int
2cf0635d
NC
7499slurp_hppa_unwind_table (FILE * file,
7500 struct hppa_unw_aux_info * aux,
7501 Elf_Internal_Shdr * sec)
57346661 7502{
1c0751b2 7503 unsigned long size, unw_ent_size, nentries, nrelas, i;
2cf0635d
NC
7504 Elf_Internal_Phdr * seg;
7505 struct hppa_unw_table_entry * tep;
7506 Elf_Internal_Shdr * relsec;
7507 Elf_Internal_Rela * rela;
7508 Elf_Internal_Rela * rp;
7509 unsigned char * table;
7510 unsigned char * tp;
7511 Elf_Internal_Sym * sym;
7512 const char * relname;
57346661 7513
57346661
AM
7514 /* First, find the starting address of the segment that includes
7515 this section. */
7516
7517 if (elf_header.e_phnum)
7518 {
7519 if (! get_program_headers (file))
7520 return 0;
7521
7522 for (seg = program_headers;
7523 seg < program_headers + elf_header.e_phnum;
7524 ++seg)
7525 {
7526 if (seg->p_type != PT_LOAD)
7527 continue;
7528
7529 if (sec->sh_addr >= seg->p_vaddr
7530 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7531 {
7532 aux->seg_base = seg->p_vaddr;
7533 break;
7534 }
7535 }
7536 }
7537
7538 /* Second, build the unwind table from the contents of the unwind
7539 section. */
7540 size = sec->sh_size;
3f5e193b
NC
7541 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7542 _("unwind table"));
57346661
AM
7543 if (!table)
7544 return 0;
7545
1c0751b2
DA
7546 unw_ent_size = 16;
7547 nentries = size / unw_ent_size;
7548 size = unw_ent_size * nentries;
57346661 7549
3f5e193b
NC
7550 tep = aux->table = (struct hppa_unw_table_entry *)
7551 xcmalloc (nentries, sizeof (aux->table[0]));
57346661 7552
1c0751b2 7553 for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
57346661
AM
7554 {
7555 unsigned int tmp1, tmp2;
7556
7557 tep->start.section = SHN_UNDEF;
7558 tep->end.section = SHN_UNDEF;
7559
1c0751b2
DA
7560 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
7561 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
7562 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
7563 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
7564
7565 tep->start.offset += aux->seg_base;
7566 tep->end.offset += aux->seg_base;
57346661
AM
7567
7568 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
7569 tep->Millicode = (tmp1 >> 30) & 0x1;
7570 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
7571 tep->Region_description = (tmp1 >> 27) & 0x3;
7572 tep->reserved1 = (tmp1 >> 26) & 0x1;
7573 tep->Entry_SR = (tmp1 >> 25) & 0x1;
7574 tep->Entry_FR = (tmp1 >> 21) & 0xf;
7575 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
7576 tep->Args_stored = (tmp1 >> 15) & 0x1;
7577 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
7578 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
7579 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
7580 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
7581 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
7582 tep->Ada_Region = (tmp1 >> 9) & 0x1;
7583 tep->cxx_info = (tmp1 >> 8) & 0x1;
7584 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
7585 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
7586 tep->reserved2 = (tmp1 >> 5) & 0x1;
7587 tep->Save_SP = (tmp1 >> 4) & 0x1;
7588 tep->Save_RP = (tmp1 >> 3) & 0x1;
7589 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
7590 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
7591 tep->Cleanup_defined = tmp1 & 0x1;
7592
7593 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
7594 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
7595 tep->Large_frame = (tmp2 >> 29) & 0x1;
7596 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
7597 tep->reserved4 = (tmp2 >> 27) & 0x1;
7598 tep->Total_frame_size = tmp2 & 0x7ffffff;
57346661
AM
7599 }
7600 free (table);
7601
7602 /* Third, apply any relocations to the unwind table. */
57346661
AM
7603 for (relsec = section_headers;
7604 relsec < section_headers + elf_header.e_shnum;
7605 ++relsec)
7606 {
7607 if (relsec->sh_type != SHT_RELA
4fbb74a6
AM
7608 || relsec->sh_info >= elf_header.e_shnum
7609 || section_headers + relsec->sh_info != sec)
57346661
AM
7610 continue;
7611
7612 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7613 & rela, & nrelas))
7614 return 0;
7615
7616 for (rp = rela; rp < rela + nrelas; ++rp)
7617 {
aca88567
NC
7618 relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
7619 sym = aux->symtab + get_reloc_symindex (rp->r_info);
57346661
AM
7620
7621 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
0112cd26 7622 if (! const_strneq (relname, "R_PARISC_SEGREL"))
57346661
AM
7623 {
7624 warn (_("Skipping unexpected relocation type %s\n"), relname);
7625 continue;
7626 }
7627
7628 i = rp->r_offset / unw_ent_size;
7629
89fac5e3 7630 switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
57346661
AM
7631 {
7632 case 0:
7633 aux->table[i].start.section = sym->st_shndx;
1e456d54 7634 aux->table[i].start.offset = sym->st_value + rp->r_addend;
57346661
AM
7635 break;
7636 case 1:
7637 aux->table[i].end.section = sym->st_shndx;
1e456d54 7638 aux->table[i].end.offset = sym->st_value + rp->r_addend;
57346661
AM
7639 break;
7640 default:
7641 break;
7642 }
7643 }
7644
7645 free (rela);
7646 }
7647
1c0751b2 7648 aux->table_len = nentries;
57346661
AM
7649
7650 return 1;
7651}
7652
1b31d05e 7653static void
2cf0635d 7654hppa_process_unwind (FILE * file)
57346661 7655{
57346661 7656 struct hppa_unw_aux_info aux;
2cf0635d
NC
7657 Elf_Internal_Shdr * unwsec = NULL;
7658 Elf_Internal_Shdr * strsec;
7659 Elf_Internal_Shdr * sec;
18bd398b 7660 unsigned long i;
57346661 7661
c256ffe7 7662 if (string_table == NULL)
1b31d05e
NC
7663 return;
7664
7665 memset (& aux, 0, sizeof (aux));
57346661
AM
7666
7667 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7668 {
c256ffe7 7669 if (sec->sh_type == SHT_SYMTAB
4fbb74a6 7670 && sec->sh_link < elf_header.e_shnum)
57346661 7671 {
ba5cdace 7672 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
57346661 7673
4fbb74a6 7674 strsec = section_headers + sec->sh_link;
4082ef84
NC
7675 if (aux.strtab != NULL)
7676 {
7677 error (_("Multiple auxillary string tables encountered\n"));
7678 free (aux.strtab);
7679 }
3f5e193b
NC
7680 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7681 1, strsec->sh_size,
7682 _("string table"));
c256ffe7 7683 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
57346661 7684 }
18bd398b 7685 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
57346661
AM
7686 unwsec = sec;
7687 }
7688
7689 if (!unwsec)
7690 printf (_("\nThere are no unwind sections in this file.\n"));
7691
7692 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7693 {
18bd398b 7694 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
57346661 7695 {
74e1a04b
NC
7696 printf (_("\nUnwind section '%s' at offset 0x%lx contains %lu entries:\n"),
7697 printable_section_name (sec),
57346661 7698 (unsigned long) sec->sh_offset,
89fac5e3 7699 (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
57346661
AM
7700
7701 slurp_hppa_unwind_table (file, &aux, sec);
7702 if (aux.table_len > 0)
7703 dump_hppa_unwind (&aux);
7704
7705 if (aux.table)
7706 free ((char *) aux.table);
7707 aux.table = NULL;
7708 }
7709 }
7710
7711 if (aux.symtab)
7712 free (aux.symtab);
7713 if (aux.strtab)
7714 free ((char *) aux.strtab);
57346661
AM
7715}
7716
0b6ae522
DJ
7717struct arm_section
7718{
a734115a
NC
7719 unsigned char * data; /* The unwind data. */
7720 Elf_Internal_Shdr * sec; /* The cached unwind section header. */
7721 Elf_Internal_Rela * rela; /* The cached relocations for this section. */
7722 unsigned long nrelas; /* The number of relocations. */
7723 unsigned int rel_type; /* REL or RELA ? */
7724 Elf_Internal_Rela * next_rela; /* Cyclic pointer to the next reloc to process. */
0b6ae522
DJ
7725};
7726
7727struct arm_unw_aux_info
7728{
a734115a
NC
7729 FILE * file; /* The file containing the unwind sections. */
7730 Elf_Internal_Sym * symtab; /* The file's symbol table. */
7731 unsigned long nsyms; /* Number of symbols. */
948f632f
DA
7732 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7733 unsigned long nfuns; /* Number of these symbols. */
a734115a
NC
7734 char * strtab; /* The file's string table. */
7735 unsigned long strtab_size; /* Size of string table. */
0b6ae522
DJ
7736};
7737
7738static const char *
7739arm_print_vma_and_name (struct arm_unw_aux_info *aux,
7740 bfd_vma fn, struct absaddr addr)
7741{
7742 const char *procname;
7743 bfd_vma sym_offset;
7744
7745 if (addr.section == SHN_UNDEF)
7746 addr.offset = fn;
7747
948f632f 7748 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
0b6ae522
DJ
7749 aux->strtab_size, addr, &procname,
7750 &sym_offset);
7751
7752 print_vma (fn, PREFIX_HEX);
7753
7754 if (procname)
7755 {
7756 fputs (" <", stdout);
7757 fputs (procname, stdout);
7758
7759 if (sym_offset)
7760 printf ("+0x%lx", (unsigned long) sym_offset);
7761 fputc ('>', stdout);
7762 }
7763
7764 return procname;
7765}
7766
7767static void
7768arm_free_section (struct arm_section *arm_sec)
7769{
7770 if (arm_sec->data != NULL)
7771 free (arm_sec->data);
7772
7773 if (arm_sec->rela != NULL)
7774 free (arm_sec->rela);
7775}
7776
a734115a
NC
7777/* 1) If SEC does not match the one cached in ARM_SEC, then free the current
7778 cached section and install SEC instead.
7779 2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
7780 and return its valued in * WORDP, relocating if necessary.
1b31d05e 7781 3) Update the NEXT_RELA field in ARM_SEC and store the section index and
a734115a 7782 relocation's offset in ADDR.
1b31d05e
NC
7783 4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
7784 into the string table of the symbol associated with the reloc. If no
7785 reloc was applied store -1 there.
7786 5) Return TRUE upon success, FALSE otherwise. */
a734115a
NC
7787
7788static bfd_boolean
1b31d05e
NC
7789get_unwind_section_word (struct arm_unw_aux_info * aux,
7790 struct arm_section * arm_sec,
7791 Elf_Internal_Shdr * sec,
7792 bfd_vma word_offset,
7793 unsigned int * wordp,
7794 struct absaddr * addr,
7795 bfd_vma * sym_name)
0b6ae522
DJ
7796{
7797 Elf_Internal_Rela *rp;
7798 Elf_Internal_Sym *sym;
7799 const char * relname;
7800 unsigned int word;
7801 bfd_boolean wrapped;
7802
e0a31db1
NC
7803 if (sec == NULL || arm_sec == NULL)
7804 return FALSE;
7805
0b6ae522
DJ
7806 addr->section = SHN_UNDEF;
7807 addr->offset = 0;
7808
1b31d05e
NC
7809 if (sym_name != NULL)
7810 *sym_name = (bfd_vma) -1;
7811
a734115a 7812 /* If necessary, update the section cache. */
0b6ae522
DJ
7813 if (sec != arm_sec->sec)
7814 {
7815 Elf_Internal_Shdr *relsec;
7816
7817 arm_free_section (arm_sec);
7818
7819 arm_sec->sec = sec;
7820 arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
7821 sec->sh_size, _("unwind data"));
0b6ae522
DJ
7822 arm_sec->rela = NULL;
7823 arm_sec->nrelas = 0;
7824
7825 for (relsec = section_headers;
7826 relsec < section_headers + elf_header.e_shnum;
7827 ++relsec)
7828 {
7829 if (relsec->sh_info >= elf_header.e_shnum
1ae40aa4
NC
7830 || section_headers + relsec->sh_info != sec
7831 /* PR 15745: Check the section type as well. */
7832 || (relsec->sh_type != SHT_REL
7833 && relsec->sh_type != SHT_RELA))
0b6ae522
DJ
7834 continue;
7835
a734115a 7836 arm_sec->rel_type = relsec->sh_type;
0b6ae522
DJ
7837 if (relsec->sh_type == SHT_REL)
7838 {
7839 if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
7840 relsec->sh_size,
7841 & arm_sec->rela, & arm_sec->nrelas))
a734115a 7842 return FALSE;
0b6ae522 7843 }
1ae40aa4 7844 else /* relsec->sh_type == SHT_RELA */
0b6ae522
DJ
7845 {
7846 if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
7847 relsec->sh_size,
7848 & arm_sec->rela, & arm_sec->nrelas))
a734115a 7849 return FALSE;
0b6ae522 7850 }
1ae40aa4 7851 break;
0b6ae522
DJ
7852 }
7853
7854 arm_sec->next_rela = arm_sec->rela;
7855 }
7856
a734115a 7857 /* If there is no unwind data we can do nothing. */
0b6ae522 7858 if (arm_sec->data == NULL)
a734115a 7859 return FALSE;
0b6ae522 7860
e0a31db1 7861 /* If the offset is invalid then fail. */
1a915552
NC
7862 if (word_offset > (sec->sh_size - 4)
7863 /* PR 18879 */
7864 || (sec->sh_size < 5 && word_offset >= sec->sh_size)
7865 || ((bfd_signed_vma) word_offset) < 0)
e0a31db1
NC
7866 return FALSE;
7867
a734115a 7868 /* Get the word at the required offset. */
0b6ae522
DJ
7869 word = byte_get (arm_sec->data + word_offset, 4);
7870
0eff7165
NC
7871 /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128. */
7872 if (arm_sec->rela == NULL)
7873 {
7874 * wordp = word;
7875 return TRUE;
7876 }
7877
a734115a 7878 /* Look through the relocs to find the one that applies to the provided offset. */
0b6ae522
DJ
7879 wrapped = FALSE;
7880 for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
7881 {
7882 bfd_vma prelval, offset;
7883
7884 if (rp->r_offset > word_offset && !wrapped)
7885 {
7886 rp = arm_sec->rela;
7887 wrapped = TRUE;
7888 }
7889 if (rp->r_offset > word_offset)
7890 break;
7891
7892 if (rp->r_offset & 3)
7893 {
7894 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
7895 (unsigned long) rp->r_offset);
7896 continue;
7897 }
7898
7899 if (rp->r_offset < word_offset)
7900 continue;
7901
74e1a04b
NC
7902 /* PR 17531: file: 027-161405-0.004 */
7903 if (aux->symtab == NULL)
7904 continue;
7905
0b6ae522
DJ
7906 if (arm_sec->rel_type == SHT_REL)
7907 {
7908 offset = word & 0x7fffffff;
7909 if (offset & 0x40000000)
7910 offset |= ~ (bfd_vma) 0x7fffffff;
7911 }
a734115a 7912 else if (arm_sec->rel_type == SHT_RELA)
0b6ae522 7913 offset = rp->r_addend;
a734115a 7914 else
74e1a04b
NC
7915 {
7916 error (_("Unknown section relocation type %d encountered\n"),
7917 arm_sec->rel_type);
7918 break;
7919 }
0b6ae522 7920
071436c6
NC
7921 /* PR 17531 file: 027-1241568-0.004. */
7922 if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
7923 {
7924 error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
7925 (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
7926 break;
7927 }
7928
7929 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
0b6ae522
DJ
7930 offset += sym->st_value;
7931 prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
7932
a734115a
NC
7933 /* Check that we are processing the expected reloc type. */
7934 if (elf_header.e_machine == EM_ARM)
7935 {
7936 relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
071436c6
NC
7937 if (relname == NULL)
7938 {
7939 warn (_("Skipping unknown ARM relocation type: %d\n"),
7940 (int) ELF32_R_TYPE (rp->r_info));
7941 continue;
7942 }
a734115a
NC
7943
7944 if (streq (relname, "R_ARM_NONE"))
7945 continue;
0b4362b0 7946
a734115a
NC
7947 if (! streq (relname, "R_ARM_PREL31"))
7948 {
071436c6 7949 warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
a734115a
NC
7950 continue;
7951 }
7952 }
7953 else if (elf_header.e_machine == EM_TI_C6000)
7954 {
7955 relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
071436c6
NC
7956 if (relname == NULL)
7957 {
7958 warn (_("Skipping unknown C6000 relocation type: %d\n"),
7959 (int) ELF32_R_TYPE (rp->r_info));
7960 continue;
7961 }
0b4362b0 7962
a734115a
NC
7963 if (streq (relname, "R_C6000_NONE"))
7964 continue;
7965
7966 if (! streq (relname, "R_C6000_PREL31"))
7967 {
071436c6 7968 warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
a734115a
NC
7969 continue;
7970 }
7971
7972 prelval >>= 1;
7973 }
7974 else
74e1a04b
NC
7975 {
7976 /* This function currently only supports ARM and TI unwinders. */
7977 warn (_("Only TI and ARM unwinders are currently supported\n"));
7978 break;
7979 }
fa197c1c 7980
0b6ae522
DJ
7981 word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
7982 addr->section = sym->st_shndx;
7983 addr->offset = offset;
74e1a04b 7984
1b31d05e
NC
7985 if (sym_name)
7986 * sym_name = sym->st_name;
0b6ae522
DJ
7987 break;
7988 }
7989
7990 *wordp = word;
7991 arm_sec->next_rela = rp;
7992
a734115a 7993 return TRUE;
0b6ae522
DJ
7994}
7995
a734115a
NC
7996static const char *tic6x_unwind_regnames[16] =
7997{
0b4362b0
RM
7998 "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
7999 "A14", "A13", "A12", "A11", "A10",
a734115a
NC
8000 "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
8001};
fa197c1c 8002
0b6ae522 8003static void
fa197c1c 8004decode_tic6x_unwind_regmask (unsigned int mask)
0b6ae522 8005{
fa197c1c
PB
8006 int i;
8007
8008 for (i = 12; mask; mask >>= 1, i--)
8009 {
8010 if (mask & 1)
8011 {
8012 fputs (tic6x_unwind_regnames[i], stdout);
8013 if (mask > 1)
8014 fputs (", ", stdout);
8015 }
8016 }
8017}
0b6ae522
DJ
8018
8019#define ADVANCE \
8020 if (remaining == 0 && more_words) \
8021 { \
8022 data_offset += 4; \
1b31d05e
NC
8023 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, \
8024 data_offset, & word, & addr, NULL)) \
0b6ae522
DJ
8025 return; \
8026 remaining = 4; \
8027 more_words--; \
8028 } \
8029
8030#define GET_OP(OP) \
8031 ADVANCE; \
8032 if (remaining) \
8033 { \
8034 remaining--; \
8035 (OP) = word >> 24; \
8036 word <<= 8; \
8037 } \
8038 else \
8039 { \
2b692964 8040 printf (_("[Truncated opcode]\n")); \
0b6ae522
DJ
8041 return; \
8042 } \
cc5914eb 8043 printf ("0x%02x ", OP)
0b6ae522 8044
fa197c1c 8045static void
948f632f
DA
8046decode_arm_unwind_bytecode (struct arm_unw_aux_info * aux,
8047 unsigned int word,
8048 unsigned int remaining,
8049 unsigned int more_words,
8050 bfd_vma data_offset,
8051 Elf_Internal_Shdr * data_sec,
8052 struct arm_section * data_arm_sec)
fa197c1c
PB
8053{
8054 struct absaddr addr;
0b6ae522
DJ
8055
8056 /* Decode the unwinding instructions. */
8057 while (1)
8058 {
8059 unsigned int op, op2;
8060
8061 ADVANCE;
8062 if (remaining == 0)
8063 break;
8064 remaining--;
8065 op = word >> 24;
8066 word <<= 8;
8067
cc5914eb 8068 printf (" 0x%02x ", op);
0b6ae522
DJ
8069
8070 if ((op & 0xc0) == 0x00)
8071 {
8072 int offset = ((op & 0x3f) << 2) + 4;
61865e30 8073
cc5914eb 8074 printf (" vsp = vsp + %d", offset);
0b6ae522
DJ
8075 }
8076 else if ((op & 0xc0) == 0x40)
8077 {
8078 int offset = ((op & 0x3f) << 2) + 4;
61865e30 8079
cc5914eb 8080 printf (" vsp = vsp - %d", offset);
0b6ae522
DJ
8081 }
8082 else if ((op & 0xf0) == 0x80)
8083 {
8084 GET_OP (op2);
8085 if (op == 0x80 && op2 == 0)
8086 printf (_("Refuse to unwind"));
8087 else
8088 {
8089 unsigned int mask = ((op & 0x0f) << 8) | op2;
8090 int first = 1;
8091 int i;
2b692964 8092
0b6ae522
DJ
8093 printf ("pop {");
8094 for (i = 0; i < 12; i++)
8095 if (mask & (1 << i))
8096 {
8097 if (first)
8098 first = 0;
8099 else
8100 printf (", ");
8101 printf ("r%d", 4 + i);
8102 }
8103 printf ("}");
8104 }
8105 }
8106 else if ((op & 0xf0) == 0x90)
8107 {
8108 if (op == 0x9d || op == 0x9f)
8109 printf (_(" [Reserved]"));
8110 else
cc5914eb 8111 printf (" vsp = r%d", op & 0x0f);
0b6ae522
DJ
8112 }
8113 else if ((op & 0xf0) == 0xa0)
8114 {
8115 int end = 4 + (op & 0x07);
8116 int first = 1;
8117 int i;
61865e30 8118
0b6ae522
DJ
8119 printf (" pop {");
8120 for (i = 4; i <= end; i++)
8121 {
8122 if (first)
8123 first = 0;
8124 else
8125 printf (", ");
8126 printf ("r%d", i);
8127 }
8128 if (op & 0x08)
8129 {
1b31d05e 8130 if (!first)
0b6ae522
DJ
8131 printf (", ");
8132 printf ("r14");
8133 }
8134 printf ("}");
8135 }
8136 else if (op == 0xb0)
8137 printf (_(" finish"));
8138 else if (op == 0xb1)
8139 {
8140 GET_OP (op2);
8141 if (op2 == 0 || (op2 & 0xf0) != 0)
8142 printf (_("[Spare]"));
8143 else
8144 {
8145 unsigned int mask = op2 & 0x0f;
8146 int first = 1;
8147 int i;
61865e30 8148
0b6ae522
DJ
8149 printf ("pop {");
8150 for (i = 0; i < 12; i++)
8151 if (mask & (1 << i))
8152 {
8153 if (first)
8154 first = 0;
8155 else
8156 printf (", ");
8157 printf ("r%d", i);
8158 }
8159 printf ("}");
8160 }
8161 }
8162 else if (op == 0xb2)
8163 {
b115cf96 8164 unsigned char buf[9];
0b6ae522
DJ
8165 unsigned int i, len;
8166 unsigned long offset;
61865e30 8167
b115cf96 8168 for (i = 0; i < sizeof (buf); i++)
0b6ae522
DJ
8169 {
8170 GET_OP (buf[i]);
8171 if ((buf[i] & 0x80) == 0)
8172 break;
8173 }
4082ef84
NC
8174 if (i == sizeof (buf))
8175 printf (_("corrupt change to vsp"));
8176 else
8177 {
8178 offset = read_uleb128 (buf, &len, buf + i + 1);
8179 assert (len == i + 1);
8180 offset = offset * 4 + 0x204;
8181 printf ("vsp = vsp + %ld", offset);
8182 }
0b6ae522 8183 }
61865e30 8184 else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
0b6ae522 8185 {
61865e30
NC
8186 unsigned int first, last;
8187
8188 GET_OP (op2);
8189 first = op2 >> 4;
8190 last = op2 & 0x0f;
8191 if (op == 0xc8)
8192 first = first + 16;
8193 printf ("pop {D%d", first);
8194 if (last)
8195 printf ("-D%d", first + last);
8196 printf ("}");
8197 }
8198 else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
8199 {
8200 unsigned int count = op & 0x07;
8201
8202 printf ("pop {D8");
8203 if (count)
8204 printf ("-D%d", 8 + count);
8205 printf ("}");
8206 }
8207 else if (op >= 0xc0 && op <= 0xc5)
8208 {
8209 unsigned int count = op & 0x07;
8210
8211 printf (" pop {wR10");
8212 if (count)
8213 printf ("-wR%d", 10 + count);
8214 printf ("}");
8215 }
8216 else if (op == 0xc6)
8217 {
8218 unsigned int first, last;
8219
8220 GET_OP (op2);
8221 first = op2 >> 4;
8222 last = op2 & 0x0f;
8223 printf ("pop {wR%d", first);
8224 if (last)
8225 printf ("-wR%d", first + last);
8226 printf ("}");
8227 }
8228 else if (op == 0xc7)
8229 {
8230 GET_OP (op2);
8231 if (op2 == 0 || (op2 & 0xf0) != 0)
8232 printf (_("[Spare]"));
0b6ae522
DJ
8233 else
8234 {
61865e30
NC
8235 unsigned int mask = op2 & 0x0f;
8236 int first = 1;
8237 int i;
8238
8239 printf ("pop {");
8240 for (i = 0; i < 4; i++)
8241 if (mask & (1 << i))
8242 {
8243 if (first)
8244 first = 0;
8245 else
8246 printf (", ");
8247 printf ("wCGR%d", i);
8248 }
8249 printf ("}");
0b6ae522
DJ
8250 }
8251 }
61865e30
NC
8252 else
8253 printf (_(" [unsupported opcode]"));
0b6ae522
DJ
8254 printf ("\n");
8255 }
fa197c1c
PB
8256}
8257
8258static void
948f632f
DA
8259decode_tic6x_unwind_bytecode (struct arm_unw_aux_info * aux,
8260 unsigned int word,
8261 unsigned int remaining,
8262 unsigned int more_words,
8263 bfd_vma data_offset,
8264 Elf_Internal_Shdr * data_sec,
8265 struct arm_section * data_arm_sec)
fa197c1c
PB
8266{
8267 struct absaddr addr;
8268
8269 /* Decode the unwinding instructions. */
8270 while (1)
8271 {
8272 unsigned int op, op2;
8273
8274 ADVANCE;
8275 if (remaining == 0)
8276 break;
8277 remaining--;
8278 op = word >> 24;
8279 word <<= 8;
8280
9cf03b7e 8281 printf (" 0x%02x ", op);
fa197c1c
PB
8282
8283 if ((op & 0xc0) == 0x00)
8284 {
8285 int offset = ((op & 0x3f) << 3) + 8;
9cf03b7e 8286 printf (" sp = sp + %d", offset);
fa197c1c
PB
8287 }
8288 else if ((op & 0xc0) == 0x80)
8289 {
8290 GET_OP (op2);
8291 if (op == 0x80 && op2 == 0)
8292 printf (_("Refuse to unwind"));
8293 else
8294 {
8295 unsigned int mask = ((op & 0x1f) << 8) | op2;
8296 if (op & 0x20)
8297 printf ("pop compact {");
8298 else
8299 printf ("pop {");
8300
8301 decode_tic6x_unwind_regmask (mask);
8302 printf("}");
8303 }
8304 }
8305 else if ((op & 0xf0) == 0xc0)
8306 {
8307 unsigned int reg;
8308 unsigned int nregs;
8309 unsigned int i;
8310 const char *name;
a734115a
NC
8311 struct
8312 {
fa197c1c
PB
8313 unsigned int offset;
8314 unsigned int reg;
8315 } regpos[16];
8316
8317 /* Scan entire instruction first so that GET_OP output is not
8318 interleaved with disassembly. */
8319 nregs = 0;
8320 for (i = 0; nregs < (op & 0xf); i++)
8321 {
8322 GET_OP (op2);
8323 reg = op2 >> 4;
8324 if (reg != 0xf)
8325 {
8326 regpos[nregs].offset = i * 2;
8327 regpos[nregs].reg = reg;
8328 nregs++;
8329 }
8330
8331 reg = op2 & 0xf;
8332 if (reg != 0xf)
8333 {
8334 regpos[nregs].offset = i * 2 + 1;
8335 regpos[nregs].reg = reg;
8336 nregs++;
8337 }
8338 }
8339
8340 printf (_("pop frame {"));
8341 reg = nregs - 1;
8342 for (i = i * 2; i > 0; i--)
8343 {
8344 if (regpos[reg].offset == i - 1)
8345 {
8346 name = tic6x_unwind_regnames[regpos[reg].reg];
8347 if (reg > 0)
8348 reg--;
8349 }
8350 else
8351 name = _("[pad]");
8352
8353 fputs (name, stdout);
8354 if (i > 1)
8355 printf (", ");
8356 }
8357
8358 printf ("}");
8359 }
8360 else if (op == 0xd0)
8361 printf (" MOV FP, SP");
8362 else if (op == 0xd1)
8363 printf (" __c6xabi_pop_rts");
8364 else if (op == 0xd2)
8365 {
8366 unsigned char buf[9];
8367 unsigned int i, len;
8368 unsigned long offset;
a734115a 8369
fa197c1c
PB
8370 for (i = 0; i < sizeof (buf); i++)
8371 {
8372 GET_OP (buf[i]);
8373 if ((buf[i] & 0x80) == 0)
8374 break;
8375 }
0eff7165
NC
8376 /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2. */
8377 if (i == sizeof (buf))
8378 {
8379 printf ("<corrupt sp adjust>\n");
8380 warn (_("Corrupt stack pointer adjustment detected\n"));
8381 return;
8382 }
948f632f 8383
f6f0e17b 8384 offset = read_uleb128 (buf, &len, buf + i + 1);
fa197c1c
PB
8385 assert (len == i + 1);
8386 offset = offset * 8 + 0x408;
8387 printf (_("sp = sp + %ld"), offset);
8388 }
8389 else if ((op & 0xf0) == 0xe0)
8390 {
8391 if ((op & 0x0f) == 7)
8392 printf (" RETURN");
8393 else
8394 printf (" MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
8395 }
8396 else
8397 {
8398 printf (_(" [unsupported opcode]"));
8399 }
8400 putchar ('\n');
8401 }
8402}
8403
8404static bfd_vma
a734115a 8405arm_expand_prel31 (bfd_vma word, bfd_vma where)
fa197c1c
PB
8406{
8407 bfd_vma offset;
8408
8409 offset = word & 0x7fffffff;
8410 if (offset & 0x40000000)
8411 offset |= ~ (bfd_vma) 0x7fffffff;
8412
8413 if (elf_header.e_machine == EM_TI_C6000)
8414 offset <<= 1;
8415
8416 return offset + where;
8417}
8418
8419static void
1b31d05e
NC
8420decode_arm_unwind (struct arm_unw_aux_info * aux,
8421 unsigned int word,
8422 unsigned int remaining,
8423 bfd_vma data_offset,
8424 Elf_Internal_Shdr * data_sec,
8425 struct arm_section * data_arm_sec)
fa197c1c
PB
8426{
8427 int per_index;
8428 unsigned int more_words = 0;
37e14bc3 8429 struct absaddr addr;
1b31d05e 8430 bfd_vma sym_name = (bfd_vma) -1;
fa197c1c
PB
8431
8432 if (remaining == 0)
8433 {
1b31d05e
NC
8434 /* Fetch the first word.
8435 Note - when decoding an object file the address extracted
8436 here will always be 0. So we also pass in the sym_name
8437 parameter so that we can find the symbol associated with
8438 the personality routine. */
8439 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, data_offset,
8440 & word, & addr, & sym_name))
fa197c1c 8441 return;
1b31d05e 8442
fa197c1c
PB
8443 remaining = 4;
8444 }
8445
8446 if ((word & 0x80000000) == 0)
8447 {
8448 /* Expand prel31 for personality routine. */
8449 bfd_vma fn;
8450 const char *procname;
8451
a734115a 8452 fn = arm_expand_prel31 (word, data_sec->sh_addr + data_offset);
fa197c1c 8453 printf (_(" Personality routine: "));
1b31d05e
NC
8454 if (fn == 0
8455 && addr.section == SHN_UNDEF && addr.offset == 0
8456 && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
8457 {
8458 procname = aux->strtab + sym_name;
8459 print_vma (fn, PREFIX_HEX);
8460 if (procname)
8461 {
8462 fputs (" <", stdout);
8463 fputs (procname, stdout);
8464 fputc ('>', stdout);
8465 }
8466 }
8467 else
8468 procname = arm_print_vma_and_name (aux, fn, addr);
fa197c1c
PB
8469 fputc ('\n', stdout);
8470
8471 /* The GCC personality routines use the standard compact
8472 encoding, starting with one byte giving the number of
8473 words. */
8474 if (procname != NULL
8475 && (const_strneq (procname, "__gcc_personality_v0")
8476 || const_strneq (procname, "__gxx_personality_v0")
8477 || const_strneq (procname, "__gcj_personality_v0")
8478 || const_strneq (procname, "__gnu_objc_personality_v0")))
8479 {
8480 remaining = 0;
8481 more_words = 1;
8482 ADVANCE;
8483 if (!remaining)
8484 {
8485 printf (_(" [Truncated data]\n"));
8486 return;
8487 }
8488 more_words = word >> 24;
8489 word <<= 8;
8490 remaining--;
8491 per_index = -1;
8492 }
8493 else
8494 return;
8495 }
8496 else
8497 {
1b31d05e 8498 /* ARM EHABI Section 6.3:
0b4362b0 8499
1b31d05e 8500 An exception-handling table entry for the compact model looks like:
0b4362b0 8501
1b31d05e
NC
8502 31 30-28 27-24 23-0
8503 -- ----- ----- ----
8504 1 0 index Data for personalityRoutine[index] */
8505
8506 if (elf_header.e_machine == EM_ARM
8507 && (word & 0x70000000))
83c257ca 8508 warn (_("Corrupt ARM compact model table entry: %x \n"), word);
1b31d05e 8509
fa197c1c 8510 per_index = (word >> 24) & 0x7f;
1b31d05e 8511 printf (_(" Compact model index: %d\n"), per_index);
fa197c1c
PB
8512 if (per_index == 0)
8513 {
8514 more_words = 0;
8515 word <<= 8;
8516 remaining--;
8517 }
8518 else if (per_index < 3)
8519 {
8520 more_words = (word >> 16) & 0xff;
8521 word <<= 16;
8522 remaining -= 2;
8523 }
8524 }
8525
8526 switch (elf_header.e_machine)
8527 {
8528 case EM_ARM:
8529 if (per_index < 3)
8530 {
8531 decode_arm_unwind_bytecode (aux, word, remaining, more_words,
8532 data_offset, data_sec, data_arm_sec);
8533 }
8534 else
1b31d05e
NC
8535 {
8536 warn (_("Unknown ARM compact model index encountered\n"));
8537 printf (_(" [reserved]\n"));
8538 }
fa197c1c
PB
8539 break;
8540
8541 case EM_TI_C6000:
8542 if (per_index < 3)
8543 {
8544 decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
1b31d05e 8545 data_offset, data_sec, data_arm_sec);
fa197c1c
PB
8546 }
8547 else if (per_index < 5)
8548 {
8549 if (((word >> 17) & 0x7f) == 0x7f)
8550 printf (_(" Restore stack from frame pointer\n"));
8551 else
8552 printf (_(" Stack increment %d\n"), (word >> 14) & 0x1fc);
8553 printf (_(" Registers restored: "));
8554 if (per_index == 4)
8555 printf (" (compact) ");
8556 decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
8557 putchar ('\n');
8558 printf (_(" Return register: %s\n"),
8559 tic6x_unwind_regnames[word & 0xf]);
8560 }
8561 else
1b31d05e 8562 printf (_(" [reserved (%d)]\n"), per_index);
fa197c1c
PB
8563 break;
8564
8565 default:
74e1a04b 8566 error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
1b31d05e 8567 elf_header.e_machine);
fa197c1c 8568 }
0b6ae522
DJ
8569
8570 /* Decode the descriptors. Not implemented. */
8571}
8572
8573static void
8574dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
8575{
8576 struct arm_section exidx_arm_sec, extab_arm_sec;
8577 unsigned int i, exidx_len;
948f632f 8578 unsigned long j, nfuns;
0b6ae522
DJ
8579
8580 memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
8581 memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
8582 exidx_len = exidx_sec->sh_size / 8;
8583
948f632f
DA
8584 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
8585 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
8586 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
8587 aux->funtab[nfuns++] = aux->symtab[j];
8588 aux->nfuns = nfuns;
8589 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
8590
0b6ae522
DJ
8591 for (i = 0; i < exidx_len; i++)
8592 {
8593 unsigned int exidx_fn, exidx_entry;
8594 struct absaddr fn_addr, entry_addr;
8595 bfd_vma fn;
8596
8597 fputc ('\n', stdout);
8598
1b31d05e
NC
8599 if (! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8600 8 * i, & exidx_fn, & fn_addr, NULL)
8601 || ! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8602 8 * i + 4, & exidx_entry, & entry_addr, NULL))
0b6ae522 8603 {
948f632f 8604 free (aux->funtab);
1b31d05e
NC
8605 arm_free_section (& exidx_arm_sec);
8606 arm_free_section (& extab_arm_sec);
0b6ae522
DJ
8607 return;
8608 }
8609
83c257ca
NC
8610 /* ARM EHABI, Section 5:
8611 An index table entry consists of 2 words.
8612 The first word contains a prel31 offset to the start of a function, with bit 31 clear. */
8613 if (exidx_fn & 0x80000000)
8614 warn (_("corrupt index table entry: %x\n"), exidx_fn);
8615
a734115a 8616 fn = arm_expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
0b6ae522 8617
a734115a 8618 arm_print_vma_and_name (aux, fn, fn_addr);
0b6ae522
DJ
8619 fputs (": ", stdout);
8620
8621 if (exidx_entry == 1)
8622 {
8623 print_vma (exidx_entry, PREFIX_HEX);
8624 fputs (" [cantunwind]\n", stdout);
8625 }
8626 else if (exidx_entry & 0x80000000)
8627 {
8628 print_vma (exidx_entry, PREFIX_HEX);
8629 fputc ('\n', stdout);
8630 decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
8631 }
8632 else
8633 {
8f73510c 8634 bfd_vma table, table_offset = 0;
0b6ae522
DJ
8635 Elf_Internal_Shdr *table_sec;
8636
8637 fputs ("@", stdout);
a734115a 8638 table = arm_expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
0b6ae522
DJ
8639 print_vma (table, PREFIX_HEX);
8640 printf ("\n");
8641
8642 /* Locate the matching .ARM.extab. */
8643 if (entry_addr.section != SHN_UNDEF
8644 && entry_addr.section < elf_header.e_shnum)
8645 {
8646 table_sec = section_headers + entry_addr.section;
8647 table_offset = entry_addr.offset;
1a915552
NC
8648 /* PR 18879 */
8649 if (table_offset > table_sec->sh_size
8650 || ((bfd_signed_vma) table_offset) < 0)
8651 {
8652 warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
8653 (unsigned long) table_offset,
8654 printable_section_name (table_sec));
8655 continue;
8656 }
0b6ae522
DJ
8657 }
8658 else
8659 {
8660 table_sec = find_section_by_address (table);
8661 if (table_sec != NULL)
8662 table_offset = table - table_sec->sh_addr;
8663 }
8664 if (table_sec == NULL)
8665 {
8666 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
8667 (unsigned long) table);
8668 continue;
8669 }
8670 decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
8671 &extab_arm_sec);
8672 }
8673 }
8674
8675 printf ("\n");
8676
948f632f 8677 free (aux->funtab);
0b6ae522
DJ
8678 arm_free_section (&exidx_arm_sec);
8679 arm_free_section (&extab_arm_sec);
8680}
8681
fa197c1c 8682/* Used for both ARM and C6X unwinding tables. */
1b31d05e
NC
8683
8684static void
0b6ae522
DJ
8685arm_process_unwind (FILE *file)
8686{
8687 struct arm_unw_aux_info aux;
8688 Elf_Internal_Shdr *unwsec = NULL;
8689 Elf_Internal_Shdr *strsec;
8690 Elf_Internal_Shdr *sec;
8691 unsigned long i;
fa197c1c 8692 unsigned int sec_type;
0b6ae522 8693
fa197c1c
PB
8694 switch (elf_header.e_machine)
8695 {
8696 case EM_ARM:
8697 sec_type = SHT_ARM_EXIDX;
8698 break;
8699
8700 case EM_TI_C6000:
8701 sec_type = SHT_C6000_UNWIND;
8702 break;
8703
0b4362b0 8704 default:
74e1a04b 8705 error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
1b31d05e
NC
8706 elf_header.e_machine);
8707 return;
fa197c1c
PB
8708 }
8709
0b6ae522 8710 if (string_table == NULL)
1b31d05e
NC
8711 return;
8712
8713 memset (& aux, 0, sizeof (aux));
8714 aux.file = file;
0b6ae522
DJ
8715
8716 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8717 {
8718 if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
8719 {
ba5cdace 8720 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
0b6ae522
DJ
8721
8722 strsec = section_headers + sec->sh_link;
74e1a04b
NC
8723
8724 /* PR binutils/17531 file: 011-12666-0.004. */
8725 if (aux.strtab != NULL)
8726 {
4082ef84 8727 error (_("Multiple string tables found in file.\n"));
74e1a04b
NC
8728 free (aux.strtab);
8729 }
0b6ae522
DJ
8730 aux.strtab = get_data (NULL, file, strsec->sh_offset,
8731 1, strsec->sh_size, _("string table"));
8732 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8733 }
fa197c1c 8734 else if (sec->sh_type == sec_type)
0b6ae522
DJ
8735 unwsec = sec;
8736 }
8737
1b31d05e 8738 if (unwsec == NULL)
0b6ae522 8739 printf (_("\nThere are no unwind sections in this file.\n"));
1b31d05e
NC
8740 else
8741 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8742 {
8743 if (sec->sh_type == sec_type)
8744 {
8745 printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
74e1a04b 8746 printable_section_name (sec),
1b31d05e
NC
8747 (unsigned long) sec->sh_offset,
8748 (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
0b6ae522 8749
1b31d05e
NC
8750 dump_arm_unwind (&aux, sec);
8751 }
8752 }
0b6ae522
DJ
8753
8754 if (aux.symtab)
8755 free (aux.symtab);
8756 if (aux.strtab)
8757 free ((char *) aux.strtab);
0b6ae522
DJ
8758}
8759
1b31d05e 8760static void
2cf0635d 8761process_unwind (FILE * file)
57346661 8762{
2cf0635d
NC
8763 struct unwind_handler
8764 {
57346661 8765 int machtype;
1b31d05e 8766 void (* handler)(FILE *);
2cf0635d
NC
8767 } handlers[] =
8768 {
0b6ae522 8769 { EM_ARM, arm_process_unwind },
57346661
AM
8770 { EM_IA_64, ia64_process_unwind },
8771 { EM_PARISC, hppa_process_unwind },
fa197c1c 8772 { EM_TI_C6000, arm_process_unwind },
57346661
AM
8773 { 0, 0 }
8774 };
8775 int i;
8776
8777 if (!do_unwind)
1b31d05e 8778 return;
57346661
AM
8779
8780 for (i = 0; handlers[i].handler != NULL; i++)
8781 if (elf_header.e_machine == handlers[i].machtype)
9f758fdc
NC
8782 {
8783 handlers[i].handler (file);
8784 return;
8785 }
57346661 8786
1b31d05e
NC
8787 printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
8788 get_machine_name (elf_header.e_machine));
57346661
AM
8789}
8790
252b5132 8791static void
2cf0635d 8792dynamic_section_mips_val (Elf_Internal_Dyn * entry)
252b5132
RH
8793{
8794 switch (entry->d_tag)
8795 {
8796 case DT_MIPS_FLAGS:
8797 if (entry->d_un.d_val == 0)
4b68bca3 8798 printf (_("NONE"));
252b5132
RH
8799 else
8800 {
8801 static const char * opts[] =
8802 {
8803 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
8804 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
8805 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
8806 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
8807 "RLD_ORDER_SAFE"
8808 };
8809 unsigned int cnt;
8810 int first = 1;
2b692964 8811
60bca95a 8812 for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
252b5132
RH
8813 if (entry->d_un.d_val & (1 << cnt))
8814 {
8815 printf ("%s%s", first ? "" : " ", opts[cnt]);
8816 first = 0;
8817 }
252b5132
RH
8818 }
8819 break;
103f02d3 8820
252b5132 8821 case DT_MIPS_IVERSION:
d79b3d50 8822 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
4b68bca3 8823 printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
252b5132 8824 else
76ca31c0
NC
8825 {
8826 char buf[40];
8827 sprintf_vma (buf, entry->d_un.d_ptr);
8828 /* Note: coded this way so that there is a single string for translation. */
8829 printf (_("<corrupt: %s>"), buf);
8830 }
252b5132 8831 break;
103f02d3 8832
252b5132
RH
8833 case DT_MIPS_TIME_STAMP:
8834 {
d5b07ef4 8835 char timebuf[128];
2cf0635d 8836 struct tm * tmp;
91d6fa6a 8837 time_t atime = entry->d_un.d_val;
82b1b41b 8838
91d6fa6a 8839 tmp = gmtime (&atime);
82b1b41b
NC
8840 /* PR 17531: file: 6accc532. */
8841 if (tmp == NULL)
8842 snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
8843 else
8844 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
8845 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8846 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
4b68bca3 8847 printf (_("Time Stamp: %s"), timebuf);
252b5132
RH
8848 }
8849 break;
103f02d3 8850
252b5132
RH
8851 case DT_MIPS_RLD_VERSION:
8852 case DT_MIPS_LOCAL_GOTNO:
8853 case DT_MIPS_CONFLICTNO:
8854 case DT_MIPS_LIBLISTNO:
8855 case DT_MIPS_SYMTABNO:
8856 case DT_MIPS_UNREFEXTNO:
8857 case DT_MIPS_HIPAGENO:
8858 case DT_MIPS_DELTA_CLASS_NO:
8859 case DT_MIPS_DELTA_INSTANCE_NO:
8860 case DT_MIPS_DELTA_RELOC_NO:
8861 case DT_MIPS_DELTA_SYM_NO:
8862 case DT_MIPS_DELTA_CLASSSYM_NO:
8863 case DT_MIPS_COMPACT_SIZE:
c69075ac 8864 print_vma (entry->d_un.d_val, DEC);
252b5132 8865 break;
103f02d3
UD
8866
8867 default:
4b68bca3 8868 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
103f02d3 8869 }
4b68bca3 8870 putchar ('\n');
103f02d3
UD
8871}
8872
103f02d3 8873static void
2cf0635d 8874dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
103f02d3
UD
8875{
8876 switch (entry->d_tag)
8877 {
8878 case DT_HP_DLD_FLAGS:
8879 {
8880 static struct
8881 {
8882 long int bit;
2cf0635d 8883 const char * str;
5e220199
NC
8884 }
8885 flags[] =
8886 {
8887 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
8888 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
8889 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
8890 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
8891 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
8892 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
8893 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
8894 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
8895 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
8896 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
eec8f817
DA
8897 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
8898 { DT_HP_GST, "HP_GST" },
8899 { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
8900 { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
8901 { DT_HP_NODELETE, "HP_NODELETE" },
8902 { DT_HP_GROUP, "HP_GROUP" },
8903 { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
5e220199 8904 };
103f02d3 8905 int first = 1;
5e220199 8906 size_t cnt;
f7a99963 8907 bfd_vma val = entry->d_un.d_val;
103f02d3 8908
60bca95a 8909 for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
103f02d3 8910 if (val & flags[cnt].bit)
30800947
NC
8911 {
8912 if (! first)
8913 putchar (' ');
8914 fputs (flags[cnt].str, stdout);
8915 first = 0;
8916 val ^= flags[cnt].bit;
8917 }
76da6bbe 8918
103f02d3 8919 if (val != 0 || first)
f7a99963
NC
8920 {
8921 if (! first)
8922 putchar (' ');
8923 print_vma (val, HEX);
8924 }
103f02d3
UD
8925 }
8926 break;
76da6bbe 8927
252b5132 8928 default:
f7a99963
NC
8929 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8930 break;
252b5132 8931 }
35b1837e 8932 putchar ('\n');
252b5132
RH
8933}
8934
28f997cf
TG
8935#ifdef BFD64
8936
8937/* VMS vs Unix time offset and factor. */
8938
8939#define VMS_EPOCH_OFFSET 35067168000000000LL
8940#define VMS_GRANULARITY_FACTOR 10000000
8941
8942/* Display a VMS time in a human readable format. */
8943
8944static void
8945print_vms_time (bfd_int64_t vmstime)
8946{
8947 struct tm *tm;
8948 time_t unxtime;
8949
8950 unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
8951 tm = gmtime (&unxtime);
8952 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
8953 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
8954 tm->tm_hour, tm->tm_min, tm->tm_sec);
8955}
8956#endif /* BFD64 */
8957
ecc51f48 8958static void
2cf0635d 8959dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
ecc51f48
NC
8960{
8961 switch (entry->d_tag)
8962 {
0de14b54 8963 case DT_IA_64_PLT_RESERVE:
bdf4d63a 8964 /* First 3 slots reserved. */
ecc51f48
NC
8965 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8966 printf (" -- ");
8967 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
bdf4d63a
JJ
8968 break;
8969
28f997cf
TG
8970 case DT_IA_64_VMS_LINKTIME:
8971#ifdef BFD64
8972 print_vms_time (entry->d_un.d_val);
8973#endif
8974 break;
8975
8976 case DT_IA_64_VMS_LNKFLAGS:
8977 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8978 if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
8979 printf (" CALL_DEBUG");
8980 if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
8981 printf (" NOP0BUFS");
8982 if (entry->d_un.d_val & VMS_LF_P0IMAGE)
8983 printf (" P0IMAGE");
8984 if (entry->d_un.d_val & VMS_LF_MKTHREADS)
8985 printf (" MKTHREADS");
8986 if (entry->d_un.d_val & VMS_LF_UPCALLS)
8987 printf (" UPCALLS");
8988 if (entry->d_un.d_val & VMS_LF_IMGSTA)
8989 printf (" IMGSTA");
8990 if (entry->d_un.d_val & VMS_LF_INITIALIZE)
8991 printf (" INITIALIZE");
8992 if (entry->d_un.d_val & VMS_LF_MAIN)
8993 printf (" MAIN");
8994 if (entry->d_un.d_val & VMS_LF_EXE_INIT)
8995 printf (" EXE_INIT");
8996 if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
8997 printf (" TBK_IN_IMG");
8998 if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
8999 printf (" DBG_IN_IMG");
9000 if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
9001 printf (" TBK_IN_DSF");
9002 if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
9003 printf (" DBG_IN_DSF");
9004 if (entry->d_un.d_val & VMS_LF_SIGNATURES)
9005 printf (" SIGNATURES");
9006 if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
9007 printf (" REL_SEG_OFF");
9008 break;
9009
bdf4d63a
JJ
9010 default:
9011 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9012 break;
ecc51f48 9013 }
bdf4d63a 9014 putchar ('\n');
ecc51f48
NC
9015}
9016
252b5132 9017static int
2cf0635d 9018get_32bit_dynamic_section (FILE * file)
252b5132 9019{
2cf0635d
NC
9020 Elf32_External_Dyn * edyn;
9021 Elf32_External_Dyn * ext;
9022 Elf_Internal_Dyn * entry;
103f02d3 9023
3f5e193b
NC
9024 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
9025 dynamic_size, _("dynamic section"));
a6e9f9df
AM
9026 if (!edyn)
9027 return 0;
103f02d3 9028
071436c6
NC
9029 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9030 might not have the luxury of section headers. Look for the DT_NULL
9031 terminator to determine the number of entries. */
ba2685cc 9032 for (ext = edyn, dynamic_nent = 0;
53c3012c 9033 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
ba2685cc
AM
9034 ext++)
9035 {
9036 dynamic_nent++;
9037 if (BYTE_GET (ext->d_tag) == DT_NULL)
9038 break;
9039 }
252b5132 9040
3f5e193b
NC
9041 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9042 sizeof (* entry));
b2d38a17 9043 if (dynamic_section == NULL)
252b5132 9044 {
8b73c356
NC
9045 error (_("Out of memory allocating space for %lu dynamic entries\n"),
9046 (unsigned long) dynamic_nent);
9ea033b2
NC
9047 free (edyn);
9048 return 0;
9049 }
252b5132 9050
fb514b26 9051 for (ext = edyn, entry = dynamic_section;
ba2685cc 9052 entry < dynamic_section + dynamic_nent;
fb514b26 9053 ext++, entry++)
9ea033b2 9054 {
fb514b26
AM
9055 entry->d_tag = BYTE_GET (ext->d_tag);
9056 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
252b5132
RH
9057 }
9058
9ea033b2
NC
9059 free (edyn);
9060
9061 return 1;
9062}
9063
9064static int
2cf0635d 9065get_64bit_dynamic_section (FILE * file)
9ea033b2 9066{
2cf0635d
NC
9067 Elf64_External_Dyn * edyn;
9068 Elf64_External_Dyn * ext;
9069 Elf_Internal_Dyn * entry;
103f02d3 9070
071436c6 9071 /* Read in the data. */
3f5e193b
NC
9072 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
9073 dynamic_size, _("dynamic section"));
a6e9f9df
AM
9074 if (!edyn)
9075 return 0;
103f02d3 9076
071436c6
NC
9077 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9078 might not have the luxury of section headers. Look for the DT_NULL
9079 terminator to determine the number of entries. */
ba2685cc 9080 for (ext = edyn, dynamic_nent = 0;
53c3012c
AM
9081 /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer. */
9082 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
ba2685cc
AM
9083 ext++)
9084 {
9085 dynamic_nent++;
66543521 9086 if (BYTE_GET (ext->d_tag) == DT_NULL)
ba2685cc
AM
9087 break;
9088 }
252b5132 9089
3f5e193b
NC
9090 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9091 sizeof (* entry));
b2d38a17 9092 if (dynamic_section == NULL)
252b5132 9093 {
8b73c356
NC
9094 error (_("Out of memory allocating space for %lu dynamic entries\n"),
9095 (unsigned long) dynamic_nent);
252b5132
RH
9096 free (edyn);
9097 return 0;
9098 }
9099
071436c6 9100 /* Convert from external to internal formats. */
fb514b26 9101 for (ext = edyn, entry = dynamic_section;
ba2685cc 9102 entry < dynamic_section + dynamic_nent;
fb514b26 9103 ext++, entry++)
252b5132 9104 {
66543521
AM
9105 entry->d_tag = BYTE_GET (ext->d_tag);
9106 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
252b5132
RH
9107 }
9108
9109 free (edyn);
9110
9ea033b2
NC
9111 return 1;
9112}
9113
e9e44622
JJ
9114static void
9115print_dynamic_flags (bfd_vma flags)
d1133906 9116{
e9e44622 9117 int first = 1;
13ae64f3 9118
d1133906
NC
9119 while (flags)
9120 {
9121 bfd_vma flag;
9122
9123 flag = flags & - flags;
9124 flags &= ~ flag;
9125
e9e44622
JJ
9126 if (first)
9127 first = 0;
9128 else
9129 putc (' ', stdout);
13ae64f3 9130
d1133906
NC
9131 switch (flag)
9132 {
e9e44622
JJ
9133 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
9134 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
9135 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
9136 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
9137 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
2b692964 9138 default: fputs (_("unknown"), stdout); break;
d1133906
NC
9139 }
9140 }
e9e44622 9141 puts ("");
d1133906
NC
9142}
9143
b2d38a17
NC
9144/* Parse and display the contents of the dynamic section. */
9145
9ea033b2 9146static int
2cf0635d 9147process_dynamic_section (FILE * file)
9ea033b2 9148{
2cf0635d 9149 Elf_Internal_Dyn * entry;
9ea033b2
NC
9150
9151 if (dynamic_size == 0)
9152 {
9153 if (do_dynamic)
b2d38a17 9154 printf (_("\nThere is no dynamic section in this file.\n"));
9ea033b2
NC
9155
9156 return 1;
9157 }
9158
9159 if (is_32bit_elf)
9160 {
b2d38a17 9161 if (! get_32bit_dynamic_section (file))
9ea033b2
NC
9162 return 0;
9163 }
b2d38a17 9164 else if (! get_64bit_dynamic_section (file))
9ea033b2
NC
9165 return 0;
9166
252b5132
RH
9167 /* Find the appropriate symbol table. */
9168 if (dynamic_symbols == NULL)
9169 {
86dba8ee
AM
9170 for (entry = dynamic_section;
9171 entry < dynamic_section + dynamic_nent;
9172 ++entry)
252b5132 9173 {
c8286bd1 9174 Elf_Internal_Shdr section;
252b5132
RH
9175
9176 if (entry->d_tag != DT_SYMTAB)
9177 continue;
9178
9179 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
9180
9181 /* Since we do not know how big the symbol table is,
9182 we default to reading in the entire file (!) and
9183 processing that. This is overkill, I know, but it
e3c8793a 9184 should work. */
d93f0186 9185 section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
252b5132 9186
fb52b2f4
NC
9187 if (archive_file_offset != 0)
9188 section.sh_size = archive_file_size - section.sh_offset;
9189 else
9190 {
9191 if (fseek (file, 0, SEEK_END))
591a748a 9192 error (_("Unable to seek to end of file!\n"));
fb52b2f4
NC
9193
9194 section.sh_size = ftell (file) - section.sh_offset;
9195 }
252b5132 9196
9ea033b2 9197 if (is_32bit_elf)
9ad5cbcf 9198 section.sh_entsize = sizeof (Elf32_External_Sym);
9ea033b2 9199 else
9ad5cbcf 9200 section.sh_entsize = sizeof (Elf64_External_Sym);
071436c6 9201 section.sh_name = string_table_length;
252b5132 9202
ba5cdace 9203 dynamic_symbols = GET_ELF_SYMBOLS (file, &section, & num_dynamic_syms);
19936277 9204 if (num_dynamic_syms < 1)
252b5132
RH
9205 {
9206 error (_("Unable to determine the number of symbols to load\n"));
9207 continue;
9208 }
252b5132
RH
9209 }
9210 }
9211
9212 /* Similarly find a string table. */
9213 if (dynamic_strings == NULL)
9214 {
86dba8ee
AM
9215 for (entry = dynamic_section;
9216 entry < dynamic_section + dynamic_nent;
9217 ++entry)
252b5132
RH
9218 {
9219 unsigned long offset;
b34976b6 9220 long str_tab_len;
252b5132
RH
9221
9222 if (entry->d_tag != DT_STRTAB)
9223 continue;
9224
9225 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
9226
9227 /* Since we do not know how big the string table is,
9228 we default to reading in the entire file (!) and
9229 processing that. This is overkill, I know, but it
e3c8793a 9230 should work. */
252b5132 9231
d93f0186 9232 offset = offset_from_vma (file, entry->d_un.d_val, 0);
fb52b2f4
NC
9233
9234 if (archive_file_offset != 0)
9235 str_tab_len = archive_file_size - offset;
9236 else
9237 {
9238 if (fseek (file, 0, SEEK_END))
9239 error (_("Unable to seek to end of file\n"));
9240 str_tab_len = ftell (file) - offset;
9241 }
252b5132
RH
9242
9243 if (str_tab_len < 1)
9244 {
9245 error
9246 (_("Unable to determine the length of the dynamic string table\n"));
9247 continue;
9248 }
9249
3f5e193b
NC
9250 dynamic_strings = (char *) get_data (NULL, file, offset, 1,
9251 str_tab_len,
9252 _("dynamic string table"));
59245841 9253 dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
252b5132
RH
9254 break;
9255 }
9256 }
9257
9258 /* And find the syminfo section if available. */
9259 if (dynamic_syminfo == NULL)
9260 {
3e8bba36 9261 unsigned long syminsz = 0;
252b5132 9262
86dba8ee
AM
9263 for (entry = dynamic_section;
9264 entry < dynamic_section + dynamic_nent;
9265 ++entry)
252b5132
RH
9266 {
9267 if (entry->d_tag == DT_SYMINENT)
9268 {
9269 /* Note: these braces are necessary to avoid a syntax
9270 error from the SunOS4 C compiler. */
049b0c3a
NC
9271 /* PR binutils/17531: A corrupt file can trigger this test.
9272 So do not use an assert, instead generate an error message. */
9273 if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
071436c6 9274 error (_("Bad value (%d) for SYMINENT entry\n"),
049b0c3a 9275 (int) entry->d_un.d_val);
252b5132
RH
9276 }
9277 else if (entry->d_tag == DT_SYMINSZ)
9278 syminsz = entry->d_un.d_val;
9279 else if (entry->d_tag == DT_SYMINFO)
d93f0186
NC
9280 dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
9281 syminsz);
252b5132
RH
9282 }
9283
9284 if (dynamic_syminfo_offset != 0 && syminsz != 0)
9285 {
2cf0635d
NC
9286 Elf_External_Syminfo * extsyminfo;
9287 Elf_External_Syminfo * extsym;
9288 Elf_Internal_Syminfo * syminfo;
252b5132
RH
9289
9290 /* There is a syminfo section. Read the data. */
3f5e193b
NC
9291 extsyminfo = (Elf_External_Syminfo *)
9292 get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
9293 _("symbol information"));
a6e9f9df
AM
9294 if (!extsyminfo)
9295 return 0;
252b5132 9296
3f5e193b 9297 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
252b5132
RH
9298 if (dynamic_syminfo == NULL)
9299 {
8b73c356
NC
9300 error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9301 (unsigned long) syminsz);
252b5132
RH
9302 return 0;
9303 }
9304
9305 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
86dba8ee
AM
9306 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
9307 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
9308 ++syminfo, ++extsym)
252b5132 9309 {
86dba8ee
AM
9310 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
9311 syminfo->si_flags = BYTE_GET (extsym->si_flags);
252b5132
RH
9312 }
9313
9314 free (extsyminfo);
9315 }
9316 }
9317
9318 if (do_dynamic && dynamic_addr)
8b73c356
NC
9319 printf (_("\nDynamic section at offset 0x%lx contains %lu entries:\n"),
9320 dynamic_addr, (unsigned long) dynamic_nent);
252b5132
RH
9321 if (do_dynamic)
9322 printf (_(" Tag Type Name/Value\n"));
9323
86dba8ee
AM
9324 for (entry = dynamic_section;
9325 entry < dynamic_section + dynamic_nent;
9326 entry++)
252b5132
RH
9327 {
9328 if (do_dynamic)
f7a99963 9329 {
2cf0635d 9330 const char * dtype;
e699b9ff 9331
f7a99963
NC
9332 putchar (' ');
9333 print_vma (entry->d_tag, FULL_HEX);
e699b9ff
ILT
9334 dtype = get_dynamic_type (entry->d_tag);
9335 printf (" (%s)%*s", dtype,
9336 ((is_32bit_elf ? 27 : 19)
9337 - (int) strlen (dtype)),
f7a99963
NC
9338 " ");
9339 }
252b5132
RH
9340
9341 switch (entry->d_tag)
9342 {
d1133906
NC
9343 case DT_FLAGS:
9344 if (do_dynamic)
e9e44622 9345 print_dynamic_flags (entry->d_un.d_val);
d1133906 9346 break;
76da6bbe 9347
252b5132
RH
9348 case DT_AUXILIARY:
9349 case DT_FILTER:
019148e4
L
9350 case DT_CONFIG:
9351 case DT_DEPAUDIT:
9352 case DT_AUDIT:
252b5132
RH
9353 if (do_dynamic)
9354 {
019148e4 9355 switch (entry->d_tag)
b34976b6 9356 {
019148e4
L
9357 case DT_AUXILIARY:
9358 printf (_("Auxiliary library"));
9359 break;
9360
9361 case DT_FILTER:
9362 printf (_("Filter library"));
9363 break;
9364
b34976b6 9365 case DT_CONFIG:
019148e4
L
9366 printf (_("Configuration file"));
9367 break;
9368
9369 case DT_DEPAUDIT:
9370 printf (_("Dependency audit library"));
9371 break;
9372
9373 case DT_AUDIT:
9374 printf (_("Audit library"));
9375 break;
9376 }
252b5132 9377
d79b3d50
NC
9378 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9379 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
252b5132 9380 else
f7a99963
NC
9381 {
9382 printf (": ");
9383 print_vma (entry->d_un.d_val, PREFIX_HEX);
9384 putchar ('\n');
9385 }
252b5132
RH
9386 }
9387 break;
9388
dcefbbbd 9389 case DT_FEATURE:
252b5132
RH
9390 if (do_dynamic)
9391 {
9392 printf (_("Flags:"));
86f55779 9393
252b5132
RH
9394 if (entry->d_un.d_val == 0)
9395 printf (_(" None\n"));
9396 else
9397 {
9398 unsigned long int val = entry->d_un.d_val;
86f55779 9399
252b5132
RH
9400 if (val & DTF_1_PARINIT)
9401 {
9402 printf (" PARINIT");
9403 val ^= DTF_1_PARINIT;
9404 }
dcefbbbd
L
9405 if (val & DTF_1_CONFEXP)
9406 {
9407 printf (" CONFEXP");
9408 val ^= DTF_1_CONFEXP;
9409 }
252b5132
RH
9410 if (val != 0)
9411 printf (" %lx", val);
9412 puts ("");
9413 }
9414 }
9415 break;
9416
9417 case DT_POSFLAG_1:
9418 if (do_dynamic)
9419 {
9420 printf (_("Flags:"));
86f55779 9421
252b5132
RH
9422 if (entry->d_un.d_val == 0)
9423 printf (_(" None\n"));
9424 else
9425 {
9426 unsigned long int val = entry->d_un.d_val;
86f55779 9427
252b5132
RH
9428 if (val & DF_P1_LAZYLOAD)
9429 {
9430 printf (" LAZYLOAD");
9431 val ^= DF_P1_LAZYLOAD;
9432 }
9433 if (val & DF_P1_GROUPPERM)
9434 {
9435 printf (" GROUPPERM");
9436 val ^= DF_P1_GROUPPERM;
9437 }
9438 if (val != 0)
9439 printf (" %lx", val);
9440 puts ("");
9441 }
9442 }
9443 break;
9444
9445 case DT_FLAGS_1:
9446 if (do_dynamic)
9447 {
9448 printf (_("Flags:"));
9449 if (entry->d_un.d_val == 0)
9450 printf (_(" None\n"));
9451 else
9452 {
9453 unsigned long int val = entry->d_un.d_val;
86f55779 9454
252b5132
RH
9455 if (val & DF_1_NOW)
9456 {
9457 printf (" NOW");
9458 val ^= DF_1_NOW;
9459 }
9460 if (val & DF_1_GLOBAL)
9461 {
9462 printf (" GLOBAL");
9463 val ^= DF_1_GLOBAL;
9464 }
9465 if (val & DF_1_GROUP)
9466 {
9467 printf (" GROUP");
9468 val ^= DF_1_GROUP;
9469 }
9470 if (val & DF_1_NODELETE)
9471 {
9472 printf (" NODELETE");
9473 val ^= DF_1_NODELETE;
9474 }
9475 if (val & DF_1_LOADFLTR)
9476 {
9477 printf (" LOADFLTR");
9478 val ^= DF_1_LOADFLTR;
9479 }
9480 if (val & DF_1_INITFIRST)
9481 {
9482 printf (" INITFIRST");
9483 val ^= DF_1_INITFIRST;
9484 }
9485 if (val & DF_1_NOOPEN)
9486 {
9487 printf (" NOOPEN");
9488 val ^= DF_1_NOOPEN;
9489 }
9490 if (val & DF_1_ORIGIN)
9491 {
9492 printf (" ORIGIN");
9493 val ^= DF_1_ORIGIN;
9494 }
9495 if (val & DF_1_DIRECT)
9496 {
9497 printf (" DIRECT");
9498 val ^= DF_1_DIRECT;
9499 }
9500 if (val & DF_1_TRANS)
9501 {
9502 printf (" TRANS");
9503 val ^= DF_1_TRANS;
9504 }
9505 if (val & DF_1_INTERPOSE)
9506 {
9507 printf (" INTERPOSE");
9508 val ^= DF_1_INTERPOSE;
9509 }
f7db6139 9510 if (val & DF_1_NODEFLIB)
dcefbbbd 9511 {
f7db6139
L
9512 printf (" NODEFLIB");
9513 val ^= DF_1_NODEFLIB;
dcefbbbd
L
9514 }
9515 if (val & DF_1_NODUMP)
9516 {
9517 printf (" NODUMP");
9518 val ^= DF_1_NODUMP;
9519 }
34b60028 9520 if (val & DF_1_CONFALT)
dcefbbbd 9521 {
34b60028
L
9522 printf (" CONFALT");
9523 val ^= DF_1_CONFALT;
9524 }
9525 if (val & DF_1_ENDFILTEE)
9526 {
9527 printf (" ENDFILTEE");
9528 val ^= DF_1_ENDFILTEE;
9529 }
9530 if (val & DF_1_DISPRELDNE)
9531 {
9532 printf (" DISPRELDNE");
9533 val ^= DF_1_DISPRELDNE;
9534 }
9535 if (val & DF_1_DISPRELPND)
9536 {
9537 printf (" DISPRELPND");
9538 val ^= DF_1_DISPRELPND;
9539 }
9540 if (val & DF_1_NODIRECT)
9541 {
9542 printf (" NODIRECT");
9543 val ^= DF_1_NODIRECT;
9544 }
9545 if (val & DF_1_IGNMULDEF)
9546 {
9547 printf (" IGNMULDEF");
9548 val ^= DF_1_IGNMULDEF;
9549 }
9550 if (val & DF_1_NOKSYMS)
9551 {
9552 printf (" NOKSYMS");
9553 val ^= DF_1_NOKSYMS;
9554 }
9555 if (val & DF_1_NOHDR)
9556 {
9557 printf (" NOHDR");
9558 val ^= DF_1_NOHDR;
9559 }
9560 if (val & DF_1_EDITED)
9561 {
9562 printf (" EDITED");
9563 val ^= DF_1_EDITED;
9564 }
9565 if (val & DF_1_NORELOC)
9566 {
9567 printf (" NORELOC");
9568 val ^= DF_1_NORELOC;
9569 }
9570 if (val & DF_1_SYMINTPOSE)
9571 {
9572 printf (" SYMINTPOSE");
9573 val ^= DF_1_SYMINTPOSE;
9574 }
9575 if (val & DF_1_GLOBAUDIT)
9576 {
9577 printf (" GLOBAUDIT");
9578 val ^= DF_1_GLOBAUDIT;
9579 }
9580 if (val & DF_1_SINGLETON)
9581 {
9582 printf (" SINGLETON");
9583 val ^= DF_1_SINGLETON;
dcefbbbd 9584 }
5c383f02
RO
9585 if (val & DF_1_STUB)
9586 {
9587 printf (" STUB");
9588 val ^= DF_1_STUB;
9589 }
9590 if (val & DF_1_PIE)
9591 {
9592 printf (" PIE");
9593 val ^= DF_1_PIE;
9594 }
252b5132
RH
9595 if (val != 0)
9596 printf (" %lx", val);
9597 puts ("");
9598 }
9599 }
9600 break;
9601
9602 case DT_PLTREL:
566b0d53 9603 dynamic_info[entry->d_tag] = entry->d_un.d_val;
252b5132
RH
9604 if (do_dynamic)
9605 puts (get_dynamic_type (entry->d_un.d_val));
9606 break;
9607
9608 case DT_NULL :
9609 case DT_NEEDED :
9610 case DT_PLTGOT :
9611 case DT_HASH :
9612 case DT_STRTAB :
9613 case DT_SYMTAB :
9614 case DT_RELA :
9615 case DT_INIT :
9616 case DT_FINI :
9617 case DT_SONAME :
9618 case DT_RPATH :
9619 case DT_SYMBOLIC:
9620 case DT_REL :
9621 case DT_DEBUG :
9622 case DT_TEXTREL :
9623 case DT_JMPREL :
019148e4 9624 case DT_RUNPATH :
252b5132
RH
9625 dynamic_info[entry->d_tag] = entry->d_un.d_val;
9626
9627 if (do_dynamic)
9628 {
2cf0635d 9629 char * name;
252b5132 9630
d79b3d50
NC
9631 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9632 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
252b5132 9633 else
d79b3d50 9634 name = NULL;
252b5132
RH
9635
9636 if (name)
9637 {
9638 switch (entry->d_tag)
9639 {
9640 case DT_NEEDED:
9641 printf (_("Shared library: [%s]"), name);
9642
18bd398b 9643 if (streq (name, program_interpreter))
f7a99963 9644 printf (_(" program interpreter"));
252b5132
RH
9645 break;
9646
9647 case DT_SONAME:
f7a99963 9648 printf (_("Library soname: [%s]"), name);
252b5132
RH
9649 break;
9650
9651 case DT_RPATH:
f7a99963 9652 printf (_("Library rpath: [%s]"), name);
252b5132
RH
9653 break;
9654
019148e4
L
9655 case DT_RUNPATH:
9656 printf (_("Library runpath: [%s]"), name);
9657 break;
9658
252b5132 9659 default:
f7a99963
NC
9660 print_vma (entry->d_un.d_val, PREFIX_HEX);
9661 break;
252b5132
RH
9662 }
9663 }
9664 else
f7a99963
NC
9665 print_vma (entry->d_un.d_val, PREFIX_HEX);
9666
9667 putchar ('\n');
252b5132
RH
9668 }
9669 break;
9670
9671 case DT_PLTRELSZ:
9672 case DT_RELASZ :
9673 case DT_STRSZ :
9674 case DT_RELSZ :
9675 case DT_RELAENT :
9676 case DT_SYMENT :
9677 case DT_RELENT :
566b0d53 9678 dynamic_info[entry->d_tag] = entry->d_un.d_val;
252b5132
RH
9679 case DT_PLTPADSZ:
9680 case DT_MOVEENT :
9681 case DT_MOVESZ :
9682 case DT_INIT_ARRAYSZ:
9683 case DT_FINI_ARRAYSZ:
047b2264
JJ
9684 case DT_GNU_CONFLICTSZ:
9685 case DT_GNU_LIBLISTSZ:
252b5132 9686 if (do_dynamic)
f7a99963
NC
9687 {
9688 print_vma (entry->d_un.d_val, UNSIGNED);
2b692964 9689 printf (_(" (bytes)\n"));
f7a99963 9690 }
252b5132
RH
9691 break;
9692
9693 case DT_VERDEFNUM:
9694 case DT_VERNEEDNUM:
9695 case DT_RELACOUNT:
9696 case DT_RELCOUNT:
9697 if (do_dynamic)
f7a99963
NC
9698 {
9699 print_vma (entry->d_un.d_val, UNSIGNED);
9700 putchar ('\n');
9701 }
252b5132
RH
9702 break;
9703
9704 case DT_SYMINSZ:
9705 case DT_SYMINENT:
9706 case DT_SYMINFO:
9707 case DT_USED:
9708 case DT_INIT_ARRAY:
9709 case DT_FINI_ARRAY:
9710 if (do_dynamic)
9711 {
d79b3d50
NC
9712 if (entry->d_tag == DT_USED
9713 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
252b5132 9714 {
2cf0635d 9715 char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
252b5132 9716
b34976b6 9717 if (*name)
252b5132
RH
9718 {
9719 printf (_("Not needed object: [%s]\n"), name);
9720 break;
9721 }
9722 }
103f02d3 9723
f7a99963
NC
9724 print_vma (entry->d_un.d_val, PREFIX_HEX);
9725 putchar ('\n');
252b5132
RH
9726 }
9727 break;
9728
9729 case DT_BIND_NOW:
9730 /* The value of this entry is ignored. */
35b1837e
AM
9731 if (do_dynamic)
9732 putchar ('\n');
252b5132 9733 break;
103f02d3 9734
047b2264
JJ
9735 case DT_GNU_PRELINKED:
9736 if (do_dynamic)
9737 {
2cf0635d 9738 struct tm * tmp;
91d6fa6a 9739 time_t atime = entry->d_un.d_val;
047b2264 9740
91d6fa6a 9741 tmp = gmtime (&atime);
071436c6
NC
9742 /* PR 17533 file: 041-1244816-0.004. */
9743 if (tmp == NULL)
5a2cbcf4
L
9744 printf (_("<corrupt time val: %lx"),
9745 (unsigned long) atime);
071436c6
NC
9746 else
9747 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
9748 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9749 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
047b2264
JJ
9750
9751 }
9752 break;
9753
fdc90cb4
JJ
9754 case DT_GNU_HASH:
9755 dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
9756 if (do_dynamic)
9757 {
9758 print_vma (entry->d_un.d_val, PREFIX_HEX);
9759 putchar ('\n');
9760 }
9761 break;
9762
252b5132
RH
9763 default:
9764 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
b34976b6 9765 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
252b5132
RH
9766 entry->d_un.d_val;
9767
9768 if (do_dynamic)
9769 {
9770 switch (elf_header.e_machine)
9771 {
9772 case EM_MIPS:
4fe85591 9773 case EM_MIPS_RS3_LE:
b2d38a17 9774 dynamic_section_mips_val (entry);
252b5132 9775 break;
103f02d3 9776 case EM_PARISC:
b2d38a17 9777 dynamic_section_parisc_val (entry);
103f02d3 9778 break;
ecc51f48 9779 case EM_IA_64:
b2d38a17 9780 dynamic_section_ia64_val (entry);
ecc51f48 9781 break;
252b5132 9782 default:
f7a99963
NC
9783 print_vma (entry->d_un.d_val, PREFIX_HEX);
9784 putchar ('\n');
252b5132
RH
9785 }
9786 }
9787 break;
9788 }
9789 }
9790
9791 return 1;
9792}
9793
9794static char *
d3ba0551 9795get_ver_flags (unsigned int flags)
252b5132 9796{
b34976b6 9797 static char buff[32];
252b5132
RH
9798
9799 buff[0] = 0;
9800
9801 if (flags == 0)
9802 return _("none");
9803
9804 if (flags & VER_FLG_BASE)
9805 strcat (buff, "BASE ");
9806
9807 if (flags & VER_FLG_WEAK)
9808 {
9809 if (flags & VER_FLG_BASE)
9810 strcat (buff, "| ");
9811
9812 strcat (buff, "WEAK ");
9813 }
9814
44ec90b9
RO
9815 if (flags & VER_FLG_INFO)
9816 {
9817 if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
9818 strcat (buff, "| ");
9819
9820 strcat (buff, "INFO ");
9821 }
9822
9823 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
2b692964 9824 strcat (buff, _("| <unknown>"));
252b5132
RH
9825
9826 return buff;
9827}
9828
9829/* Display the contents of the version sections. */
98fb390a 9830
252b5132 9831static int
2cf0635d 9832process_version_sections (FILE * file)
252b5132 9833{
2cf0635d 9834 Elf_Internal_Shdr * section;
b34976b6
AM
9835 unsigned i;
9836 int found = 0;
252b5132
RH
9837
9838 if (! do_version)
9839 return 1;
9840
9841 for (i = 0, section = section_headers;
9842 i < elf_header.e_shnum;
b34976b6 9843 i++, section++)
252b5132
RH
9844 {
9845 switch (section->sh_type)
9846 {
9847 case SHT_GNU_verdef:
9848 {
2cf0635d 9849 Elf_External_Verdef * edefs;
b34976b6
AM
9850 unsigned int idx;
9851 unsigned int cnt;
2cf0635d 9852 char * endbuf;
252b5132
RH
9853
9854 found = 1;
9855
74e1a04b
NC
9856 printf (_("\nVersion definition section '%s' contains %u entries:\n"),
9857 printable_section_name (section),
9858 section->sh_info);
252b5132
RH
9859
9860 printf (_(" Addr: 0x"));
9861 printf_vma (section->sh_addr);
74e1a04b 9862 printf (_(" Offset: %#08lx Link: %u (%s)"),
1b228002 9863 (unsigned long) section->sh_offset, section->sh_link,
74e1a04b 9864 printable_section_name_from_index (section->sh_link));
252b5132 9865
3f5e193b
NC
9866 edefs = (Elf_External_Verdef *)
9867 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
9868 _("version definition section"));
a6e9f9df
AM
9869 if (!edefs)
9870 break;
59245841 9871 endbuf = (char *) edefs + section->sh_size;
252b5132 9872
b34976b6 9873 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
252b5132 9874 {
2cf0635d
NC
9875 char * vstart;
9876 Elf_External_Verdef * edef;
b34976b6 9877 Elf_Internal_Verdef ent;
2cf0635d 9878 Elf_External_Verdaux * eaux;
b34976b6
AM
9879 Elf_Internal_Verdaux aux;
9880 int j;
9881 int isum;
103f02d3 9882
7e26601c
NC
9883 /* Check for very large indicies. */
9884 if (idx > (size_t) (endbuf - (char *) edefs))
dd24e3da
NC
9885 break;
9886
252b5132 9887 vstart = ((char *) edefs) + idx;
54806181
AM
9888 if (vstart + sizeof (*edef) > endbuf)
9889 break;
252b5132
RH
9890
9891 edef = (Elf_External_Verdef *) vstart;
9892
9893 ent.vd_version = BYTE_GET (edef->vd_version);
9894 ent.vd_flags = BYTE_GET (edef->vd_flags);
9895 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
9896 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
9897 ent.vd_hash = BYTE_GET (edef->vd_hash);
9898 ent.vd_aux = BYTE_GET (edef->vd_aux);
9899 ent.vd_next = BYTE_GET (edef->vd_next);
9900
9901 printf (_(" %#06x: Rev: %d Flags: %s"),
9902 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
9903
9904 printf (_(" Index: %d Cnt: %d "),
9905 ent.vd_ndx, ent.vd_cnt);
9906
dd24e3da 9907 /* Check for overflow. */
7e26601c 9908 if (ent.vd_aux > (size_t) (endbuf - vstart))
dd24e3da
NC
9909 break;
9910
252b5132
RH
9911 vstart += ent.vd_aux;
9912
9913 eaux = (Elf_External_Verdaux *) vstart;
9914
9915 aux.vda_name = BYTE_GET (eaux->vda_name);
9916 aux.vda_next = BYTE_GET (eaux->vda_next);
9917
d79b3d50
NC
9918 if (VALID_DYNAMIC_NAME (aux.vda_name))
9919 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
252b5132
RH
9920 else
9921 printf (_("Name index: %ld\n"), aux.vda_name);
9922
9923 isum = idx + ent.vd_aux;
9924
b34976b6 9925 for (j = 1; j < ent.vd_cnt; j++)
252b5132 9926 {
dd24e3da 9927 /* Check for overflow. */
7e26601c 9928 if (aux.vda_next > (size_t) (endbuf - vstart))
dd24e3da
NC
9929 break;
9930
252b5132
RH
9931 isum += aux.vda_next;
9932 vstart += aux.vda_next;
9933
9934 eaux = (Elf_External_Verdaux *) vstart;
54806181
AM
9935 if (vstart + sizeof (*eaux) > endbuf)
9936 break;
252b5132
RH
9937
9938 aux.vda_name = BYTE_GET (eaux->vda_name);
9939 aux.vda_next = BYTE_GET (eaux->vda_next);
9940
d79b3d50 9941 if (VALID_DYNAMIC_NAME (aux.vda_name))
252b5132 9942 printf (_(" %#06x: Parent %d: %s\n"),
d79b3d50 9943 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
252b5132
RH
9944 else
9945 printf (_(" %#06x: Parent %d, name index: %ld\n"),
9946 isum, j, aux.vda_name);
9947 }
dd24e3da 9948
54806181
AM
9949 if (j < ent.vd_cnt)
9950 printf (_(" Version def aux past end of section\n"));
252b5132 9951
5d921cbd
NC
9952 /* PR 17531: file: id:000001,src:000172+005151,op:splice,rep:2. */
9953 if (idx + ent.vd_next <= idx)
9954 break;
9955
252b5132
RH
9956 idx += ent.vd_next;
9957 }
dd24e3da 9958
54806181
AM
9959 if (cnt < section->sh_info)
9960 printf (_(" Version definition past end of section\n"));
252b5132
RH
9961
9962 free (edefs);
9963 }
9964 break;
103f02d3 9965
252b5132
RH
9966 case SHT_GNU_verneed:
9967 {
2cf0635d 9968 Elf_External_Verneed * eneed;
b34976b6
AM
9969 unsigned int idx;
9970 unsigned int cnt;
2cf0635d 9971 char * endbuf;
252b5132
RH
9972
9973 found = 1;
9974
72de5009 9975 printf (_("\nVersion needs section '%s' contains %u entries:\n"),
74e1a04b 9976 printable_section_name (section), section->sh_info);
252b5132
RH
9977
9978 printf (_(" Addr: 0x"));
9979 printf_vma (section->sh_addr);
72de5009 9980 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
1b228002 9981 (unsigned long) section->sh_offset, section->sh_link,
74e1a04b 9982 printable_section_name_from_index (section->sh_link));
252b5132 9983
3f5e193b
NC
9984 eneed = (Elf_External_Verneed *) get_data (NULL, file,
9985 section->sh_offset, 1,
9986 section->sh_size,
9cf03b7e 9987 _("Version Needs section"));
a6e9f9df
AM
9988 if (!eneed)
9989 break;
59245841 9990 endbuf = (char *) eneed + section->sh_size;
252b5132
RH
9991
9992 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9993 {
2cf0635d 9994 Elf_External_Verneed * entry;
b34976b6
AM
9995 Elf_Internal_Verneed ent;
9996 int j;
9997 int isum;
2cf0635d 9998 char * vstart;
252b5132 9999
7e26601c 10000 if (idx > (size_t) (endbuf - (char *) eneed))
dd24e3da
NC
10001 break;
10002
252b5132 10003 vstart = ((char *) eneed) + idx;
54806181
AM
10004 if (vstart + sizeof (*entry) > endbuf)
10005 break;
252b5132
RH
10006
10007 entry = (Elf_External_Verneed *) vstart;
10008
10009 ent.vn_version = BYTE_GET (entry->vn_version);
10010 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
10011 ent.vn_file = BYTE_GET (entry->vn_file);
10012 ent.vn_aux = BYTE_GET (entry->vn_aux);
10013 ent.vn_next = BYTE_GET (entry->vn_next);
10014
10015 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
10016
d79b3d50
NC
10017 if (VALID_DYNAMIC_NAME (ent.vn_file))
10018 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
252b5132
RH
10019 else
10020 printf (_(" File: %lx"), ent.vn_file);
10021
10022 printf (_(" Cnt: %d\n"), ent.vn_cnt);
10023
dd24e3da 10024 /* Check for overflow. */
7e26601c 10025 if (ent.vn_aux > (size_t) (endbuf - vstart))
dd24e3da 10026 break;
252b5132
RH
10027 vstart += ent.vn_aux;
10028
10029 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
10030 {
2cf0635d 10031 Elf_External_Vernaux * eaux;
b34976b6 10032 Elf_Internal_Vernaux aux;
252b5132 10033
54806181
AM
10034 if (vstart + sizeof (*eaux) > endbuf)
10035 break;
252b5132
RH
10036 eaux = (Elf_External_Vernaux *) vstart;
10037
10038 aux.vna_hash = BYTE_GET (eaux->vna_hash);
10039 aux.vna_flags = BYTE_GET (eaux->vna_flags);
10040 aux.vna_other = BYTE_GET (eaux->vna_other);
10041 aux.vna_name = BYTE_GET (eaux->vna_name);
10042 aux.vna_next = BYTE_GET (eaux->vna_next);
10043
d79b3d50 10044 if (VALID_DYNAMIC_NAME (aux.vna_name))
ecc2063b 10045 printf (_(" %#06x: Name: %s"),
d79b3d50 10046 isum, GET_DYNAMIC_NAME (aux.vna_name));
252b5132 10047 else
ecc2063b 10048 printf (_(" %#06x: Name index: %lx"),
252b5132
RH
10049 isum, aux.vna_name);
10050
10051 printf (_(" Flags: %s Version: %d\n"),
10052 get_ver_flags (aux.vna_flags), aux.vna_other);
10053
dd24e3da 10054 /* Check for overflow. */
53774b7e
NC
10055 if (aux.vna_next > (size_t) (endbuf - vstart)
10056 || (aux.vna_next == 0 && j < ent.vn_cnt - 1))
10057 {
10058 warn (_("Invalid vna_next field of %lx\n"),
10059 aux.vna_next);
10060 j = ent.vn_cnt;
10061 break;
10062 }
252b5132
RH
10063 isum += aux.vna_next;
10064 vstart += aux.vna_next;
10065 }
9cf03b7e 10066
54806181 10067 if (j < ent.vn_cnt)
9cf03b7e 10068 warn (_("Missing Version Needs auxillary information\n"));
252b5132 10069
bcf83b2a 10070 if (ent.vn_next == 0 && cnt < section->sh_info - 1)
c24cf8b6
NC
10071 {
10072 warn (_("Corrupt Version Needs structure - offset to next structure is zero with entries still left to be processed\n"));
10073 cnt = section->sh_info;
10074 break;
10075 }
252b5132
RH
10076 idx += ent.vn_next;
10077 }
9cf03b7e 10078
54806181 10079 if (cnt < section->sh_info)
9cf03b7e 10080 warn (_("Missing Version Needs information\n"));
103f02d3 10081
252b5132
RH
10082 free (eneed);
10083 }
10084 break;
10085
10086 case SHT_GNU_versym:
10087 {
2cf0635d 10088 Elf_Internal_Shdr * link_section;
8b73c356
NC
10089 size_t total;
10090 unsigned int cnt;
2cf0635d
NC
10091 unsigned char * edata;
10092 unsigned short * data;
10093 char * strtab;
10094 Elf_Internal_Sym * symbols;
10095 Elf_Internal_Shdr * string_sec;
ba5cdace 10096 unsigned long num_syms;
d3ba0551 10097 long off;
252b5132 10098
4fbb74a6 10099 if (section->sh_link >= elf_header.e_shnum)
c256ffe7
JJ
10100 break;
10101
4fbb74a6 10102 link_section = section_headers + section->sh_link;
08d8fa11 10103 total = section->sh_size / sizeof (Elf_External_Versym);
252b5132 10104
4fbb74a6 10105 if (link_section->sh_link >= elf_header.e_shnum)
c256ffe7
JJ
10106 break;
10107
252b5132
RH
10108 found = 1;
10109
ba5cdace 10110 symbols = GET_ELF_SYMBOLS (file, link_section, & num_syms);
dd24e3da
NC
10111 if (symbols == NULL)
10112 break;
252b5132 10113
4fbb74a6 10114 string_sec = section_headers + link_section->sh_link;
252b5132 10115
3f5e193b
NC
10116 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
10117 string_sec->sh_size,
10118 _("version string table"));
a6e9f9df 10119 if (!strtab)
0429c154
MS
10120 {
10121 free (symbols);
10122 break;
10123 }
252b5132 10124
8b73c356
NC
10125 printf (_("\nVersion symbols section '%s' contains %lu entries:\n"),
10126 printable_section_name (section), (unsigned long) total);
252b5132
RH
10127
10128 printf (_(" Addr: "));
10129 printf_vma (section->sh_addr);
72de5009 10130 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
1b228002 10131 (unsigned long) section->sh_offset, section->sh_link,
74e1a04b 10132 printable_section_name (link_section));
252b5132 10133
d3ba0551
AM
10134 off = offset_from_vma (file,
10135 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10136 total * sizeof (short));
3f5e193b
NC
10137 edata = (unsigned char *) get_data (NULL, file, off, total,
10138 sizeof (short),
10139 _("version symbol data"));
a6e9f9df
AM
10140 if (!edata)
10141 {
10142 free (strtab);
0429c154 10143 free (symbols);
a6e9f9df
AM
10144 break;
10145 }
252b5132 10146
3f5e193b 10147 data = (short unsigned int *) cmalloc (total, sizeof (short));
252b5132
RH
10148
10149 for (cnt = total; cnt --;)
b34976b6
AM
10150 data[cnt] = byte_get (edata + cnt * sizeof (short),
10151 sizeof (short));
252b5132
RH
10152
10153 free (edata);
10154
10155 for (cnt = 0; cnt < total; cnt += 4)
10156 {
10157 int j, nn;
ab273396
AM
10158 char *name;
10159 char *invalid = _("*invalid*");
252b5132
RH
10160
10161 printf (" %03x:", cnt);
10162
10163 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
b34976b6 10164 switch (data[cnt + j])
252b5132
RH
10165 {
10166 case 0:
10167 fputs (_(" 0 (*local*) "), stdout);
10168 break;
10169
10170 case 1:
10171 fputs (_(" 1 (*global*) "), stdout);
10172 break;
10173
10174 default:
c244d050
NC
10175 nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
10176 data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
252b5132 10177
dd24e3da 10178 /* If this index value is greater than the size of the symbols
ba5cdace
NC
10179 array, break to avoid an out-of-bounds read. */
10180 if ((unsigned long)(cnt + j) >= num_syms)
dd24e3da
NC
10181 {
10182 warn (_("invalid index into symbol array\n"));
10183 break;
10184 }
10185
ab273396
AM
10186 name = NULL;
10187 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
252b5132 10188 {
b34976b6
AM
10189 Elf_Internal_Verneed ivn;
10190 unsigned long offset;
252b5132 10191
d93f0186
NC
10192 offset = offset_from_vma
10193 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10194 sizeof (Elf_External_Verneed));
252b5132 10195
b34976b6 10196 do
252b5132 10197 {
b34976b6
AM
10198 Elf_Internal_Vernaux ivna;
10199 Elf_External_Verneed evn;
10200 Elf_External_Vernaux evna;
10201 unsigned long a_off;
252b5132 10202
59245841
NC
10203 if (get_data (&evn, file, offset, sizeof (evn), 1,
10204 _("version need")) == NULL)
10205 break;
0b4362b0 10206
252b5132
RH
10207 ivn.vn_aux = BYTE_GET (evn.vn_aux);
10208 ivn.vn_next = BYTE_GET (evn.vn_next);
10209
10210 a_off = offset + ivn.vn_aux;
10211
10212 do
10213 {
59245841
NC
10214 if (get_data (&evna, file, a_off, sizeof (evna),
10215 1, _("version need aux (2)")) == NULL)
10216 {
10217 ivna.vna_next = 0;
10218 ivna.vna_other = 0;
10219 }
10220 else
10221 {
10222 ivna.vna_next = BYTE_GET (evna.vna_next);
10223 ivna.vna_other = BYTE_GET (evna.vna_other);
10224 }
252b5132
RH
10225
10226 a_off += ivna.vna_next;
10227 }
b34976b6 10228 while (ivna.vna_other != data[cnt + j]
252b5132
RH
10229 && ivna.vna_next != 0);
10230
b34976b6 10231 if (ivna.vna_other == data[cnt + j])
252b5132
RH
10232 {
10233 ivna.vna_name = BYTE_GET (evna.vna_name);
10234
54806181 10235 if (ivna.vna_name >= string_sec->sh_size)
ab273396 10236 name = invalid;
54806181
AM
10237 else
10238 name = strtab + ivna.vna_name;
252b5132
RH
10239 break;
10240 }
10241
10242 offset += ivn.vn_next;
10243 }
10244 while (ivn.vn_next);
10245 }
00d93f34 10246
ab273396 10247 if (data[cnt + j] != 0x8001
b34976b6 10248 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
252b5132 10249 {
b34976b6
AM
10250 Elf_Internal_Verdef ivd;
10251 Elf_External_Verdef evd;
10252 unsigned long offset;
252b5132 10253
d93f0186
NC
10254 offset = offset_from_vma
10255 (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10256 sizeof evd);
252b5132
RH
10257
10258 do
10259 {
59245841
NC
10260 if (get_data (&evd, file, offset, sizeof (evd), 1,
10261 _("version def")) == NULL)
10262 {
10263 ivd.vd_next = 0;
948f632f 10264 /* PR 17531: file: 046-1082287-0.004. */
3102e897
NC
10265 ivd.vd_ndx = (data[cnt + j] & VERSYM_VERSION) + 1;
10266 break;
59245841
NC
10267 }
10268 else
10269 {
10270 ivd.vd_next = BYTE_GET (evd.vd_next);
10271 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10272 }
252b5132
RH
10273
10274 offset += ivd.vd_next;
10275 }
c244d050 10276 while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
252b5132
RH
10277 && ivd.vd_next != 0);
10278
c244d050 10279 if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
252b5132 10280 {
b34976b6
AM
10281 Elf_External_Verdaux evda;
10282 Elf_Internal_Verdaux ivda;
252b5132
RH
10283
10284 ivd.vd_aux = BYTE_GET (evd.vd_aux);
10285
59245841
NC
10286 if (get_data (&evda, file,
10287 offset - ivd.vd_next + ivd.vd_aux,
10288 sizeof (evda), 1,
10289 _("version def aux")) == NULL)
10290 break;
252b5132
RH
10291
10292 ivda.vda_name = BYTE_GET (evda.vda_name);
10293
54806181 10294 if (ivda.vda_name >= string_sec->sh_size)
ab273396
AM
10295 name = invalid;
10296 else if (name != NULL && name != invalid)
10297 name = _("*both*");
54806181
AM
10298 else
10299 name = strtab + ivda.vda_name;
252b5132
RH
10300 }
10301 }
ab273396
AM
10302 if (name != NULL)
10303 nn += printf ("(%s%-*s",
10304 name,
10305 12 - (int) strlen (name),
10306 ")");
252b5132
RH
10307
10308 if (nn < 18)
10309 printf ("%*c", 18 - nn, ' ');
10310 }
10311
10312 putchar ('\n');
10313 }
10314
10315 free (data);
10316 free (strtab);
10317 free (symbols);
10318 }
10319 break;
103f02d3 10320
252b5132
RH
10321 default:
10322 break;
10323 }
10324 }
10325
10326 if (! found)
10327 printf (_("\nNo version information found in this file.\n"));
10328
10329 return 1;
10330}
10331
d1133906 10332static const char *
d3ba0551 10333get_symbol_binding (unsigned int binding)
252b5132 10334{
b34976b6 10335 static char buff[32];
252b5132
RH
10336
10337 switch (binding)
10338 {
b34976b6
AM
10339 case STB_LOCAL: return "LOCAL";
10340 case STB_GLOBAL: return "GLOBAL";
10341 case STB_WEAK: return "WEAK";
252b5132
RH
10342 default:
10343 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
e9e44622
JJ
10344 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
10345 binding);
252b5132 10346 else if (binding >= STB_LOOS && binding <= STB_HIOS)
3e7a7d11
NC
10347 {
10348 if (binding == STB_GNU_UNIQUE
9c55345c
TS
10349 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10350 /* GNU is still using the default value 0. */
3e7a7d11
NC
10351 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10352 return "UNIQUE";
10353 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
10354 }
252b5132 10355 else
e9e44622 10356 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
252b5132
RH
10357 return buff;
10358 }
10359}
10360
d1133906 10361static const char *
d3ba0551 10362get_symbol_type (unsigned int type)
252b5132 10363{
b34976b6 10364 static char buff[32];
252b5132
RH
10365
10366 switch (type)
10367 {
b34976b6
AM
10368 case STT_NOTYPE: return "NOTYPE";
10369 case STT_OBJECT: return "OBJECT";
10370 case STT_FUNC: return "FUNC";
10371 case STT_SECTION: return "SECTION";
10372 case STT_FILE: return "FILE";
10373 case STT_COMMON: return "COMMON";
10374 case STT_TLS: return "TLS";
15ab5209
DB
10375 case STT_RELC: return "RELC";
10376 case STT_SRELC: return "SRELC";
252b5132
RH
10377 default:
10378 if (type >= STT_LOPROC && type <= STT_HIPROC)
df75f1af 10379 {
3510a7b8
NC
10380 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
10381 return "THUMB_FUNC";
103f02d3 10382
351b4b40 10383 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
103f02d3
UD
10384 return "REGISTER";
10385
10386 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
10387 return "PARISC_MILLI";
10388
e9e44622 10389 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
df75f1af 10390 }
252b5132 10391 else if (type >= STT_LOOS && type <= STT_HIOS)
103f02d3
UD
10392 {
10393 if (elf_header.e_machine == EM_PARISC)
10394 {
10395 if (type == STT_HP_OPAQUE)
10396 return "HP_OPAQUE";
10397 if (type == STT_HP_STUB)
10398 return "HP_STUB";
10399 }
10400
d8045f23 10401 if (type == STT_GNU_IFUNC
9c55345c 10402 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
83c257ca 10403 || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
9c55345c 10404 /* GNU is still using the default value 0. */
d8045f23
NC
10405 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10406 return "IFUNC";
10407
e9e44622 10408 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
103f02d3 10409 }
252b5132 10410 else
e9e44622 10411 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
252b5132
RH
10412 return buff;
10413 }
10414}
10415
d1133906 10416static const char *
d3ba0551 10417get_symbol_visibility (unsigned int visibility)
d1133906
NC
10418{
10419 switch (visibility)
10420 {
b34976b6
AM
10421 case STV_DEFAULT: return "DEFAULT";
10422 case STV_INTERNAL: return "INTERNAL";
10423 case STV_HIDDEN: return "HIDDEN";
d1133906 10424 case STV_PROTECTED: return "PROTECTED";
bee0ee85
NC
10425 default:
10426 error (_("Unrecognized visibility value: %u"), visibility);
10427 return _("<unknown>");
d1133906
NC
10428 }
10429}
10430
fd85a6a1
NC
10431static const char *
10432get_solaris_symbol_visibility (unsigned int visibility)
10433{
10434 switch (visibility)
10435 {
10436 case 4: return "EXPORTED";
10437 case 5: return "SINGLETON";
10438 case 6: return "ELIMINATE";
10439 default: return get_symbol_visibility (visibility);
10440 }
10441}
10442
5e2b0d47
NC
10443static const char *
10444get_mips_symbol_other (unsigned int other)
10445{
10446 switch (other)
10447 {
df58fc94
RS
10448 case STO_OPTIONAL:
10449 return "OPTIONAL";
10450 case STO_MIPS_PLT:
10451 return "MIPS PLT";
10452 case STO_MIPS_PIC:
10453 return "MIPS PIC";
10454 case STO_MICROMIPS:
10455 return "MICROMIPS";
10456 case STO_MICROMIPS | STO_MIPS_PIC:
10457 return "MICROMIPS, MIPS PIC";
10458 case STO_MIPS16:
10459 return "MIPS16";
10460 default:
10461 return NULL;
5e2b0d47
NC
10462 }
10463}
10464
28f997cf
TG
10465static const char *
10466get_ia64_symbol_other (unsigned int other)
10467{
10468 if (is_ia64_vms ())
10469 {
10470 static char res[32];
10471
10472 res[0] = 0;
10473
10474 /* Function types is for images and .STB files only. */
10475 switch (elf_header.e_type)
10476 {
10477 case ET_DYN:
10478 case ET_EXEC:
10479 switch (VMS_ST_FUNC_TYPE (other))
10480 {
10481 case VMS_SFT_CODE_ADDR:
10482 strcat (res, " CA");
10483 break;
10484 case VMS_SFT_SYMV_IDX:
10485 strcat (res, " VEC");
10486 break;
10487 case VMS_SFT_FD:
10488 strcat (res, " FD");
10489 break;
10490 case VMS_SFT_RESERVE:
10491 strcat (res, " RSV");
10492 break;
10493 default:
bee0ee85
NC
10494 warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
10495 VMS_ST_FUNC_TYPE (other));
10496 strcat (res, " <unknown>");
10497 break;
28f997cf
TG
10498 }
10499 break;
10500 default:
10501 break;
10502 }
10503 switch (VMS_ST_LINKAGE (other))
10504 {
10505 case VMS_STL_IGNORE:
10506 strcat (res, " IGN");
10507 break;
10508 case VMS_STL_RESERVE:
10509 strcat (res, " RSV");
10510 break;
10511 case VMS_STL_STD:
10512 strcat (res, " STD");
10513 break;
10514 case VMS_STL_LNK:
10515 strcat (res, " LNK");
10516 break;
10517 default:
bee0ee85
NC
10518 warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
10519 VMS_ST_LINKAGE (other));
10520 strcat (res, " <unknown>");
10521 break;
28f997cf
TG
10522 }
10523
10524 if (res[0] != 0)
10525 return res + 1;
10526 else
10527 return res;
10528 }
10529 return NULL;
10530}
10531
6911b7dc
AM
10532static const char *
10533get_ppc64_symbol_other (unsigned int other)
10534{
10535 if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
10536 {
10537 static char buf[32];
10538 snprintf (buf, sizeof buf, _("<localentry>: %d"),
10539 PPC64_LOCAL_ENTRY_OFFSET (other));
10540 return buf;
10541 }
10542 return NULL;
10543}
10544
5e2b0d47
NC
10545static const char *
10546get_symbol_other (unsigned int other)
10547{
10548 const char * result = NULL;
10549 static char buff [32];
10550
10551 if (other == 0)
10552 return "";
10553
10554 switch (elf_header.e_machine)
10555 {
10556 case EM_MIPS:
10557 result = get_mips_symbol_other (other);
28f997cf
TG
10558 break;
10559 case EM_IA_64:
10560 result = get_ia64_symbol_other (other);
10561 break;
6911b7dc
AM
10562 case EM_PPC64:
10563 result = get_ppc64_symbol_other (other);
10564 break;
5e2b0d47 10565 default:
fd85a6a1 10566 result = NULL;
5e2b0d47
NC
10567 break;
10568 }
10569
10570 if (result)
10571 return result;
10572
10573 snprintf (buff, sizeof buff, _("<other>: %x"), other);
10574 return buff;
10575}
10576
d1133906 10577static const char *
d3ba0551 10578get_symbol_index_type (unsigned int type)
252b5132 10579{
b34976b6 10580 static char buff[32];
5cf1065c 10581
252b5132
RH
10582 switch (type)
10583 {
b34976b6
AM
10584 case SHN_UNDEF: return "UND";
10585 case SHN_ABS: return "ABS";
10586 case SHN_COMMON: return "COM";
252b5132 10587 default:
9ce701e2
L
10588 if (type == SHN_IA_64_ANSI_COMMON
10589 && elf_header.e_machine == EM_IA_64
10590 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
10591 return "ANSI_COM";
8a9036a4 10592 else if ((elf_header.e_machine == EM_X86_64
7a9068fe
L
10593 || elf_header.e_machine == EM_L1OM
10594 || elf_header.e_machine == EM_K1OM)
3b22753a
L
10595 && type == SHN_X86_64_LCOMMON)
10596 return "LARGE_COM";
ac145307
BS
10597 else if ((type == SHN_MIPS_SCOMMON
10598 && elf_header.e_machine == EM_MIPS)
10599 || (type == SHN_TIC6X_SCOMMON
10600 && elf_header.e_machine == EM_TI_C6000))
172553c7
TS
10601 return "SCOM";
10602 else if (type == SHN_MIPS_SUNDEFINED
10603 && elf_header.e_machine == EM_MIPS)
10604 return "SUND";
9ce701e2 10605 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
4fbb74a6 10606 sprintf (buff, "PRC[0x%04x]", type & 0xffff);
252b5132 10607 else if (type >= SHN_LOOS && type <= SHN_HIOS)
4fbb74a6
AM
10608 sprintf (buff, "OS [0x%04x]", type & 0xffff);
10609 else if (type >= SHN_LORESERVE)
10610 sprintf (buff, "RSV[0x%04x]", type & 0xffff);
c6d8cab4 10611 else if (type >= elf_header.e_shnum)
e0a31db1 10612 sprintf (buff, _("bad section index[%3d]"), type);
252b5132 10613 else
232e7cb8 10614 sprintf (buff, "%3d", type);
5cf1065c 10615 break;
252b5132 10616 }
5cf1065c
NC
10617
10618 return buff;
252b5132
RH
10619}
10620
66543521 10621static bfd_vma *
57028622 10622get_dynamic_data (FILE * file, bfd_size_type number, unsigned int ent_size)
252b5132 10623{
2cf0635d
NC
10624 unsigned char * e_data;
10625 bfd_vma * i_data;
252b5132 10626
57028622
NC
10627 /* If the size_t type is smaller than the bfd_size_type, eg because
10628 you are building a 32-bit tool on a 64-bit host, then make sure
10629 that when (number) is cast to (size_t) no information is lost. */
10630 if (sizeof (size_t) < sizeof (bfd_size_type)
10631 && (bfd_size_type) ((size_t) number) != number)
10632 {
ed754a13
AM
10633 error (_("Size truncation prevents reading %" BFD_VMA_FMT "u"
10634 " elements of size %u\n"),
10635 number, ent_size);
57028622
NC
10636 return NULL;
10637 }
948f632f 10638
3102e897
NC
10639 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
10640 attempting to allocate memory when the read is bound to fail. */
10641 if (ent_size * number > current_file_size)
10642 {
ed754a13
AM
10643 error (_("Invalid number of dynamic entries: %" BFD_VMA_FMT "u\n"),
10644 number);
3102e897
NC
10645 return NULL;
10646 }
10647
57028622 10648 e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
252b5132
RH
10649 if (e_data == NULL)
10650 {
ed754a13
AM
10651 error (_("Out of memory reading %" BFD_VMA_FMT "u dynamic entries\n"),
10652 number);
252b5132
RH
10653 return NULL;
10654 }
10655
57028622 10656 if (fread (e_data, ent_size, (size_t) number, file) != number)
252b5132 10657 {
ed754a13
AM
10658 error (_("Unable to read in %" BFD_VMA_FMT "u bytes of dynamic data\n"),
10659 number * ent_size);
3102e897 10660 free (e_data);
252b5132
RH
10661 return NULL;
10662 }
10663
57028622 10664 i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
252b5132
RH
10665 if (i_data == NULL)
10666 {
ed754a13
AM
10667 error (_("Out of memory allocating space for %" BFD_VMA_FMT "u"
10668 " dynamic entries\n"),
10669 number);
252b5132
RH
10670 free (e_data);
10671 return NULL;
10672 }
10673
10674 while (number--)
66543521 10675 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
252b5132
RH
10676
10677 free (e_data);
10678
10679 return i_data;
10680}
10681
6bd1a22c
L
10682static void
10683print_dynamic_symbol (bfd_vma si, unsigned long hn)
10684{
2cf0635d 10685 Elf_Internal_Sym * psym;
6bd1a22c
L
10686 int n;
10687
6bd1a22c
L
10688 n = print_vma (si, DEC_5);
10689 if (n < 5)
0b4362b0 10690 fputs (&" "[n], stdout);
6bd1a22c 10691 printf (" %3lu: ", hn);
e0a31db1
NC
10692
10693 if (dynamic_symbols == NULL || si >= num_dynamic_syms)
10694 {
3102e897
NC
10695 printf (_("<No info available for dynamic symbol number %lu>\n"),
10696 (unsigned long) si);
e0a31db1
NC
10697 return;
10698 }
10699
10700 psym = dynamic_symbols + si;
6bd1a22c
L
10701 print_vma (psym->st_value, LONG_HEX);
10702 putchar (' ');
10703 print_vma (psym->st_size, DEC_5);
10704
f4be36b3
AM
10705 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10706 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
fd85a6a1
NC
10707
10708 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
10709 printf (" %-7s", get_solaris_symbol_visibility (psym->st_other));
10710 else
10711 {
10712 unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
10713
10714 printf (" %-7s", get_symbol_visibility (vis));
10715 /* Check to see if any other bits in the st_other field are set.
10716 Note - displaying this information disrupts the layout of the
10717 table being generated, but for the moment this case is very
10718 rare. */
10719 if (psym->st_other ^ vis)
10720 printf (" [%s] ", get_symbol_other (psym->st_other ^ vis));
10721 }
10722
6bd1a22c
L
10723 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
10724 if (VALID_DYNAMIC_NAME (psym->st_name))
10725 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
10726 else
2b692964 10727 printf (_(" <corrupt: %14ld>"), psym->st_name);
6bd1a22c
L
10728 putchar ('\n');
10729}
10730
bb4d2ac2
L
10731static const char *
10732get_symbol_version_string (FILE *file, int is_dynsym,
10733 const char *strtab,
10734 unsigned long int strtab_size,
10735 unsigned int si, Elf_Internal_Sym *psym,
10736 enum versioned_symbol_info *sym_info,
10737 unsigned short *vna_other)
10738{
ab273396
AM
10739 unsigned char data[2];
10740 unsigned short vers_data;
10741 unsigned long offset;
bb4d2ac2 10742
ab273396
AM
10743 if (!is_dynsym
10744 || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
10745 return NULL;
bb4d2ac2 10746
ab273396
AM
10747 offset = offset_from_vma (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10748 sizeof data + si * sizeof (vers_data));
bb4d2ac2 10749
ab273396
AM
10750 if (get_data (&data, file, offset + si * sizeof (vers_data),
10751 sizeof (data), 1, _("version data")) == NULL)
10752 return NULL;
10753
10754 vers_data = byte_get (data, 2);
bb4d2ac2 10755
ab273396
AM
10756 if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data <= 1)
10757 return NULL;
bb4d2ac2 10758
ab273396
AM
10759 /* Usually we'd only see verdef for defined symbols, and verneed for
10760 undefined symbols. However, symbols defined by the linker in
10761 .dynbss for variables copied from a shared library in order to
10762 avoid text relocations are defined yet have verneed. We could
10763 use a heuristic to detect the special case, for example, check
10764 for verneed first on symbols defined in SHT_NOBITS sections, but
10765 it is simpler and more reliable to just look for both verdef and
10766 verneed. .dynbss might not be mapped to a SHT_NOBITS section. */
bb4d2ac2 10767
ab273396
AM
10768 if (psym->st_shndx != SHN_UNDEF
10769 && vers_data != 0x8001
10770 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10771 {
10772 Elf_Internal_Verdef ivd;
10773 Elf_Internal_Verdaux ivda;
10774 Elf_External_Verdaux evda;
10775 unsigned long off;
bb4d2ac2 10776
ab273396
AM
10777 off = offset_from_vma (file,
10778 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10779 sizeof (Elf_External_Verdef));
10780
10781 do
bb4d2ac2 10782 {
ab273396
AM
10783 Elf_External_Verdef evd;
10784
10785 if (get_data (&evd, file, off, sizeof (evd), 1,
10786 _("version def")) == NULL)
10787 {
10788 ivd.vd_ndx = 0;
10789 ivd.vd_aux = 0;
10790 ivd.vd_next = 0;
10791 }
10792 else
bb4d2ac2 10793 {
ab273396
AM
10794 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10795 ivd.vd_aux = BYTE_GET (evd.vd_aux);
10796 ivd.vd_next = BYTE_GET (evd.vd_next);
10797 }
bb4d2ac2 10798
ab273396
AM
10799 off += ivd.vd_next;
10800 }
10801 while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
bb4d2ac2 10802
ab273396
AM
10803 if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
10804 {
10805 off -= ivd.vd_next;
10806 off += ivd.vd_aux;
bb4d2ac2 10807
ab273396
AM
10808 if (get_data (&evda, file, off, sizeof (evda), 1,
10809 _("version def aux")) != NULL)
10810 {
10811 ivda.vda_name = BYTE_GET (evda.vda_name);
bb4d2ac2 10812
ab273396
AM
10813 if (psym->st_name != ivda.vda_name)
10814 {
10815 *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
10816 ? symbol_hidden : symbol_public);
10817 return (ivda.vda_name < strtab_size
10818 ? strtab + ivda.vda_name : _("<corrupt>"));
10819 }
10820 }
10821 }
10822 }
bb4d2ac2 10823
ab273396
AM
10824 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10825 {
10826 Elf_External_Verneed evn;
10827 Elf_Internal_Verneed ivn;
10828 Elf_Internal_Vernaux ivna;
bb4d2ac2 10829
ab273396
AM
10830 offset = offset_from_vma (file,
10831 version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10832 sizeof evn);
10833 do
10834 {
10835 unsigned long vna_off;
bb4d2ac2 10836
ab273396
AM
10837 if (get_data (&evn, file, offset, sizeof (evn), 1,
10838 _("version need")) == NULL)
10839 {
10840 ivna.vna_next = 0;
10841 ivna.vna_other = 0;
10842 ivna.vna_name = 0;
10843 break;
10844 }
bb4d2ac2 10845
ab273396
AM
10846 ivn.vn_aux = BYTE_GET (evn.vn_aux);
10847 ivn.vn_next = BYTE_GET (evn.vn_next);
bb4d2ac2 10848
ab273396 10849 vna_off = offset + ivn.vn_aux;
bb4d2ac2 10850
ab273396
AM
10851 do
10852 {
10853 Elf_External_Vernaux evna;
bb4d2ac2 10854
ab273396
AM
10855 if (get_data (&evna, file, vna_off, sizeof (evna), 1,
10856 _("version need aux (3)")) == NULL)
bb4d2ac2 10857 {
ab273396
AM
10858 ivna.vna_next = 0;
10859 ivna.vna_other = 0;
10860 ivna.vna_name = 0;
bb4d2ac2 10861 }
bb4d2ac2 10862 else
bb4d2ac2 10863 {
ab273396
AM
10864 ivna.vna_other = BYTE_GET (evna.vna_other);
10865 ivna.vna_next = BYTE_GET (evna.vna_next);
10866 ivna.vna_name = BYTE_GET (evna.vna_name);
10867 }
bb4d2ac2 10868
ab273396
AM
10869 vna_off += ivna.vna_next;
10870 }
10871 while (ivna.vna_other != vers_data && ivna.vna_next != 0);
bb4d2ac2 10872
ab273396
AM
10873 if (ivna.vna_other == vers_data)
10874 break;
bb4d2ac2 10875
ab273396
AM
10876 offset += ivn.vn_next;
10877 }
10878 while (ivn.vn_next != 0);
bb4d2ac2 10879
ab273396
AM
10880 if (ivna.vna_other == vers_data)
10881 {
10882 *sym_info = symbol_undefined;
10883 *vna_other = ivna.vna_other;
10884 return (ivna.vna_name < strtab_size
10885 ? strtab + ivna.vna_name : _("<corrupt>"));
bb4d2ac2
L
10886 }
10887 }
ab273396 10888 return NULL;
bb4d2ac2
L
10889}
10890
e3c8793a 10891/* Dump the symbol table. */
252b5132 10892static int
2cf0635d 10893process_symbol_table (FILE * file)
252b5132 10894{
2cf0635d 10895 Elf_Internal_Shdr * section;
8b73c356
NC
10896 bfd_size_type nbuckets = 0;
10897 bfd_size_type nchains = 0;
2cf0635d
NC
10898 bfd_vma * buckets = NULL;
10899 bfd_vma * chains = NULL;
fdc90cb4 10900 bfd_vma ngnubuckets = 0;
2cf0635d
NC
10901 bfd_vma * gnubuckets = NULL;
10902 bfd_vma * gnuchains = NULL;
6bd1a22c 10903 bfd_vma gnusymidx = 0;
071436c6 10904 bfd_size_type ngnuchains = 0;
252b5132 10905
2c610e4b 10906 if (!do_syms && !do_dyn_syms && !do_histogram)
252b5132
RH
10907 return 1;
10908
6bd1a22c
L
10909 if (dynamic_info[DT_HASH]
10910 && (do_histogram
2c610e4b
L
10911 || (do_using_dynamic
10912 && !do_dyn_syms
10913 && dynamic_strings != NULL)))
252b5132 10914 {
66543521
AM
10915 unsigned char nb[8];
10916 unsigned char nc[8];
8b73c356 10917 unsigned int hash_ent_size = 4;
66543521
AM
10918
10919 if ((elf_header.e_machine == EM_ALPHA
10920 || elf_header.e_machine == EM_S390
10921 || elf_header.e_machine == EM_S390_OLD)
10922 && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
10923 hash_ent_size = 8;
10924
fb52b2f4
NC
10925 if (fseek (file,
10926 (archive_file_offset
10927 + offset_from_vma (file, dynamic_info[DT_HASH],
10928 sizeof nb + sizeof nc)),
d93f0186 10929 SEEK_SET))
252b5132 10930 {
591a748a 10931 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 10932 goto no_hash;
252b5132
RH
10933 }
10934
66543521 10935 if (fread (nb, hash_ent_size, 1, file) != 1)
252b5132
RH
10936 {
10937 error (_("Failed to read in number of buckets\n"));
d3a44ec6 10938 goto no_hash;
252b5132
RH
10939 }
10940
66543521 10941 if (fread (nc, hash_ent_size, 1, file) != 1)
252b5132
RH
10942 {
10943 error (_("Failed to read in number of chains\n"));
d3a44ec6 10944 goto no_hash;
252b5132
RH
10945 }
10946
66543521
AM
10947 nbuckets = byte_get (nb, hash_ent_size);
10948 nchains = byte_get (nc, hash_ent_size);
252b5132 10949
66543521
AM
10950 buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
10951 chains = get_dynamic_data (file, nchains, hash_ent_size);
252b5132 10952
d3a44ec6 10953 no_hash:
252b5132 10954 if (buckets == NULL || chains == NULL)
d3a44ec6
JJ
10955 {
10956 if (do_using_dynamic)
10957 return 0;
10958 free (buckets);
10959 free (chains);
10960 buckets = NULL;
10961 chains = NULL;
10962 nbuckets = 0;
10963 nchains = 0;
10964 }
252b5132
RH
10965 }
10966
6bd1a22c
L
10967 if (dynamic_info_DT_GNU_HASH
10968 && (do_histogram
2c610e4b
L
10969 || (do_using_dynamic
10970 && !do_dyn_syms
10971 && dynamic_strings != NULL)))
252b5132 10972 {
6bd1a22c
L
10973 unsigned char nb[16];
10974 bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
10975 bfd_vma buckets_vma;
10976
10977 if (fseek (file,
10978 (archive_file_offset
10979 + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
10980 sizeof nb)),
10981 SEEK_SET))
10982 {
10983 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 10984 goto no_gnu_hash;
6bd1a22c 10985 }
252b5132 10986
6bd1a22c
L
10987 if (fread (nb, 16, 1, file) != 1)
10988 {
10989 error (_("Failed to read in number of buckets\n"));
d3a44ec6 10990 goto no_gnu_hash;
6bd1a22c
L
10991 }
10992
10993 ngnubuckets = byte_get (nb, 4);
10994 gnusymidx = byte_get (nb + 4, 4);
10995 bitmaskwords = byte_get (nb + 8, 4);
10996 buckets_vma = dynamic_info_DT_GNU_HASH + 16;
f7a99963 10997 if (is_32bit_elf)
6bd1a22c 10998 buckets_vma += bitmaskwords * 4;
f7a99963 10999 else
6bd1a22c 11000 buckets_vma += bitmaskwords * 8;
252b5132 11001
6bd1a22c
L
11002 if (fseek (file,
11003 (archive_file_offset
11004 + offset_from_vma (file, buckets_vma, 4)),
11005 SEEK_SET))
252b5132 11006 {
6bd1a22c 11007 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 11008 goto no_gnu_hash;
6bd1a22c
L
11009 }
11010
11011 gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
252b5132 11012
6bd1a22c 11013 if (gnubuckets == NULL)
d3a44ec6 11014 goto no_gnu_hash;
6bd1a22c
L
11015
11016 for (i = 0; i < ngnubuckets; i++)
11017 if (gnubuckets[i] != 0)
11018 {
11019 if (gnubuckets[i] < gnusymidx)
11020 return 0;
11021
11022 if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
11023 maxchain = gnubuckets[i];
11024 }
11025
11026 if (maxchain == 0xffffffff)
d3a44ec6 11027 goto no_gnu_hash;
6bd1a22c
L
11028
11029 maxchain -= gnusymidx;
11030
11031 if (fseek (file,
11032 (archive_file_offset
11033 + offset_from_vma (file, buckets_vma
11034 + 4 * (ngnubuckets + maxchain), 4)),
11035 SEEK_SET))
11036 {
11037 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 11038 goto no_gnu_hash;
6bd1a22c
L
11039 }
11040
11041 do
11042 {
11043 if (fread (nb, 4, 1, file) != 1)
252b5132 11044 {
6bd1a22c 11045 error (_("Failed to determine last chain length\n"));
d3a44ec6 11046 goto no_gnu_hash;
6bd1a22c 11047 }
252b5132 11048
6bd1a22c 11049 if (maxchain + 1 == 0)
d3a44ec6 11050 goto no_gnu_hash;
252b5132 11051
6bd1a22c
L
11052 ++maxchain;
11053 }
11054 while ((byte_get (nb, 4) & 1) == 0);
76da6bbe 11055
6bd1a22c
L
11056 if (fseek (file,
11057 (archive_file_offset
11058 + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
11059 SEEK_SET))
11060 {
11061 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 11062 goto no_gnu_hash;
6bd1a22c
L
11063 }
11064
11065 gnuchains = get_dynamic_data (file, maxchain, 4);
071436c6 11066 ngnuchains = maxchain;
6bd1a22c 11067
d3a44ec6 11068 no_gnu_hash:
6bd1a22c 11069 if (gnuchains == NULL)
d3a44ec6
JJ
11070 {
11071 free (gnubuckets);
d3a44ec6
JJ
11072 gnubuckets = NULL;
11073 ngnubuckets = 0;
f64fddf1
NC
11074 if (do_using_dynamic)
11075 return 0;
d3a44ec6 11076 }
6bd1a22c
L
11077 }
11078
11079 if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
11080 && do_syms
11081 && do_using_dynamic
3102e897
NC
11082 && dynamic_strings != NULL
11083 && dynamic_symbols != NULL)
6bd1a22c
L
11084 {
11085 unsigned long hn;
11086
11087 if (dynamic_info[DT_HASH])
11088 {
11089 bfd_vma si;
11090
11091 printf (_("\nSymbol table for image:\n"));
11092 if (is_32bit_elf)
11093 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11094 else
11095 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11096
11097 for (hn = 0; hn < nbuckets; hn++)
11098 {
11099 if (! buckets[hn])
11100 continue;
11101
11102 for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
11103 print_dynamic_symbol (si, hn);
252b5132
RH
11104 }
11105 }
6bd1a22c
L
11106
11107 if (dynamic_info_DT_GNU_HASH)
11108 {
11109 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
11110 if (is_32bit_elf)
11111 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11112 else
11113 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11114
11115 for (hn = 0; hn < ngnubuckets; ++hn)
11116 if (gnubuckets[hn] != 0)
11117 {
11118 bfd_vma si = gnubuckets[hn];
11119 bfd_vma off = si - gnusymidx;
11120
11121 do
11122 {
11123 print_dynamic_symbol (si, hn);
11124 si++;
11125 }
071436c6 11126 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
6bd1a22c
L
11127 }
11128 }
252b5132 11129 }
8b73c356
NC
11130 else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
11131 && section_headers != NULL)
252b5132 11132 {
b34976b6 11133 unsigned int i;
252b5132
RH
11134
11135 for (i = 0, section = section_headers;
11136 i < elf_header.e_shnum;
11137 i++, section++)
11138 {
b34976b6 11139 unsigned int si;
2cf0635d 11140 char * strtab = NULL;
c256ffe7 11141 unsigned long int strtab_size = 0;
2cf0635d
NC
11142 Elf_Internal_Sym * symtab;
11143 Elf_Internal_Sym * psym;
ba5cdace 11144 unsigned long num_syms;
252b5132 11145
2c610e4b
L
11146 if ((section->sh_type != SHT_SYMTAB
11147 && section->sh_type != SHT_DYNSYM)
11148 || (!do_syms
11149 && section->sh_type == SHT_SYMTAB))
252b5132
RH
11150 continue;
11151
dd24e3da
NC
11152 if (section->sh_entsize == 0)
11153 {
11154 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
74e1a04b 11155 printable_section_name (section));
dd24e3da
NC
11156 continue;
11157 }
11158
252b5132 11159 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
74e1a04b 11160 printable_section_name (section),
252b5132 11161 (unsigned long) (section->sh_size / section->sh_entsize));
dd24e3da 11162
f7a99963 11163 if (is_32bit_elf)
ca47b30c 11164 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
f7a99963 11165 else
ca47b30c 11166 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
252b5132 11167
ba5cdace 11168 symtab = GET_ELF_SYMBOLS (file, section, & num_syms);
252b5132
RH
11169 if (symtab == NULL)
11170 continue;
11171
11172 if (section->sh_link == elf_header.e_shstrndx)
c256ffe7
JJ
11173 {
11174 strtab = string_table;
11175 strtab_size = string_table_length;
11176 }
4fbb74a6 11177 else if (section->sh_link < elf_header.e_shnum)
252b5132 11178 {
2cf0635d 11179 Elf_Internal_Shdr * string_sec;
252b5132 11180
4fbb74a6 11181 string_sec = section_headers + section->sh_link;
252b5132 11182
3f5e193b
NC
11183 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
11184 1, string_sec->sh_size,
11185 _("string table"));
c256ffe7 11186 strtab_size = strtab != NULL ? string_sec->sh_size : 0;
252b5132
RH
11187 }
11188
ba5cdace 11189 for (si = 0, psym = symtab; si < num_syms; si++, psym++)
252b5132 11190 {
bb4d2ac2
L
11191 const char *version_string;
11192 enum versioned_symbol_info sym_info;
11193 unsigned short vna_other;
11194
5e220199 11195 printf ("%6d: ", si);
f7a99963
NC
11196 print_vma (psym->st_value, LONG_HEX);
11197 putchar (' ');
11198 print_vma (psym->st_size, DEC_5);
d1133906
NC
11199 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
11200 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
fd85a6a1
NC
11201 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11202 printf (" %-7s", get_solaris_symbol_visibility (psym->st_other));
11203 else
11204 {
11205 unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11206
11207 printf (" %-7s", get_symbol_visibility (vis));
11208 /* Check to see if any other bits in the st_other field are set.
11209 Note - displaying this information disrupts the layout of the
11210 table being generated, but for the moment this case is very rare. */
11211 if (psym->st_other ^ vis)
11212 printf (" [%s] ", get_symbol_other (psym->st_other ^ vis));
11213 }
31104126 11214 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
c256ffe7 11215 print_symbol (25, psym->st_name < strtab_size
2b692964 11216 ? strtab + psym->st_name : _("<corrupt>"));
252b5132 11217
bb4d2ac2
L
11218 version_string
11219 = get_symbol_version_string (file,
11220 section->sh_type == SHT_DYNSYM,
11221 strtab, strtab_size, si,
11222 psym, &sym_info, &vna_other);
11223 if (version_string)
252b5132 11224 {
bb4d2ac2
L
11225 if (sym_info == symbol_undefined)
11226 printf ("@%s (%d)", version_string, vna_other);
11227 else
11228 printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
11229 version_string);
252b5132
RH
11230 }
11231
11232 putchar ('\n');
52c3c391
NC
11233
11234 if (ELF_ST_BIND (psym->st_info) == STB_LOCAL
dd905818
NC
11235 && si >= section->sh_info
11236 /* Irix 5 and 6 MIPS binaries are known to ignore this requirement. */
11237 && elf_header.e_machine != EM_MIPS
11238 /* Solaris binaries have been found to violate this requirement as
11239 well. Not sure if this is a bug or an ABI requirement. */
11240 && elf_header.e_ident[EI_OSABI] != ELFOSABI_SOLARIS)
52c3c391
NC
11241 warn (_("local symbol %u found at index >= %s's sh_info value of %u\n"),
11242 si, printable_section_name (section), section->sh_info);
252b5132
RH
11243 }
11244
11245 free (symtab);
11246 if (strtab != string_table)
11247 free (strtab);
11248 }
11249 }
11250 else if (do_syms)
11251 printf
11252 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
11253
11254 if (do_histogram && buckets != NULL)
11255 {
2cf0635d
NC
11256 unsigned long * lengths;
11257 unsigned long * counts;
66543521
AM
11258 unsigned long hn;
11259 bfd_vma si;
11260 unsigned long maxlength = 0;
11261 unsigned long nzero_counts = 0;
11262 unsigned long nsyms = 0;
94d15024 11263 unsigned long chained;
252b5132 11264
66543521
AM
11265 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
11266 (unsigned long) nbuckets);
252b5132 11267
3f5e193b 11268 lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
252b5132
RH
11269 if (lengths == NULL)
11270 {
8b73c356 11271 error (_("Out of memory allocating space for histogram buckets\n"));
252b5132
RH
11272 return 0;
11273 }
8b73c356
NC
11274
11275 printf (_(" Length Number %% of total Coverage\n"));
252b5132
RH
11276 for (hn = 0; hn < nbuckets; ++hn)
11277 {
94d15024
MF
11278 for (si = buckets[hn], chained = 0;
11279 si > 0 && si < nchains && si < nbuckets && chained <= nchains;
11280 si = chains[si], ++chained)
252b5132 11281 {
b34976b6 11282 ++nsyms;
252b5132 11283 if (maxlength < ++lengths[hn])
b34976b6 11284 ++maxlength;
252b5132 11285 }
94d15024
MF
11286
11287 /* PR binutils/17531: A corrupt binary could contain broken
11288 histogram data. Do not go into an infinite loop trying
11289 to process it. */
11290 if (chained > nchains)
11291 {
11292 error (_("histogram chain is corrupt\n"));
11293 break;
11294 }
252b5132
RH
11295 }
11296
3f5e193b 11297 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
252b5132
RH
11298 if (counts == NULL)
11299 {
b2e951ec 11300 free (lengths);
8b73c356 11301 error (_("Out of memory allocating space for histogram counts\n"));
252b5132
RH
11302 return 0;
11303 }
11304
11305 for (hn = 0; hn < nbuckets; ++hn)
b34976b6 11306 ++counts[lengths[hn]];
252b5132 11307
103f02d3 11308 if (nbuckets > 0)
252b5132 11309 {
66543521
AM
11310 unsigned long i;
11311 printf (" 0 %-10lu (%5.1f%%)\n",
103f02d3 11312 counts[0], (counts[0] * 100.0) / nbuckets);
66543521 11313 for (i = 1; i <= maxlength; ++i)
103f02d3 11314 {
66543521
AM
11315 nzero_counts += counts[i] * i;
11316 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11317 i, counts[i], (counts[i] * 100.0) / nbuckets,
103f02d3
UD
11318 (nzero_counts * 100.0) / nsyms);
11319 }
252b5132
RH
11320 }
11321
11322 free (counts);
11323 free (lengths);
11324 }
11325
11326 if (buckets != NULL)
11327 {
11328 free (buckets);
11329 free (chains);
11330 }
11331
d3a44ec6 11332 if (do_histogram && gnubuckets != NULL)
fdc90cb4 11333 {
2cf0635d
NC
11334 unsigned long * lengths;
11335 unsigned long * counts;
fdc90cb4
JJ
11336 unsigned long hn;
11337 unsigned long maxlength = 0;
11338 unsigned long nzero_counts = 0;
11339 unsigned long nsyms = 0;
fdc90cb4 11340
8b73c356
NC
11341 printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
11342 (unsigned long) ngnubuckets);
11343
3f5e193b 11344 lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
fdc90cb4
JJ
11345 if (lengths == NULL)
11346 {
8b73c356 11347 error (_("Out of memory allocating space for gnu histogram buckets\n"));
fdc90cb4
JJ
11348 return 0;
11349 }
11350
fdc90cb4
JJ
11351 printf (_(" Length Number %% of total Coverage\n"));
11352
11353 for (hn = 0; hn < ngnubuckets; ++hn)
11354 if (gnubuckets[hn] != 0)
11355 {
11356 bfd_vma off, length = 1;
11357
6bd1a22c 11358 for (off = gnubuckets[hn] - gnusymidx;
071436c6
NC
11359 /* PR 17531 file: 010-77222-0.004. */
11360 off < ngnuchains && (gnuchains[off] & 1) == 0;
11361 ++off)
fdc90cb4
JJ
11362 ++length;
11363 lengths[hn] = length;
11364 if (length > maxlength)
11365 maxlength = length;
11366 nsyms += length;
11367 }
11368
3f5e193b 11369 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
fdc90cb4
JJ
11370 if (counts == NULL)
11371 {
b2e951ec 11372 free (lengths);
8b73c356 11373 error (_("Out of memory allocating space for gnu histogram counts\n"));
fdc90cb4
JJ
11374 return 0;
11375 }
11376
11377 for (hn = 0; hn < ngnubuckets; ++hn)
11378 ++counts[lengths[hn]];
11379
11380 if (ngnubuckets > 0)
11381 {
11382 unsigned long j;
11383 printf (" 0 %-10lu (%5.1f%%)\n",
11384 counts[0], (counts[0] * 100.0) / ngnubuckets);
11385 for (j = 1; j <= maxlength; ++j)
11386 {
11387 nzero_counts += counts[j] * j;
11388 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11389 j, counts[j], (counts[j] * 100.0) / ngnubuckets,
11390 (nzero_counts * 100.0) / nsyms);
11391 }
11392 }
11393
11394 free (counts);
11395 free (lengths);
11396 free (gnubuckets);
11397 free (gnuchains);
11398 }
11399
252b5132
RH
11400 return 1;
11401}
11402
11403static int
2cf0635d 11404process_syminfo (FILE * file ATTRIBUTE_UNUSED)
252b5132 11405{
b4c96d0d 11406 unsigned int i;
252b5132
RH
11407
11408 if (dynamic_syminfo == NULL
11409 || !do_dynamic)
11410 /* No syminfo, this is ok. */
11411 return 1;
11412
11413 /* There better should be a dynamic symbol section. */
11414 if (dynamic_symbols == NULL || dynamic_strings == NULL)
11415 return 0;
11416
11417 if (dynamic_addr)
11418 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
11419 dynamic_syminfo_offset, dynamic_syminfo_nent);
11420
11421 printf (_(" Num: Name BoundTo Flags\n"));
11422 for (i = 0; i < dynamic_syminfo_nent; ++i)
11423 {
11424 unsigned short int flags = dynamic_syminfo[i].si_flags;
11425
31104126 11426 printf ("%4d: ", i);
4082ef84
NC
11427 if (i >= num_dynamic_syms)
11428 printf (_("<corrupt index>"));
11429 else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
d79b3d50
NC
11430 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
11431 else
2b692964 11432 printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
31104126 11433 putchar (' ');
252b5132
RH
11434
11435 switch (dynamic_syminfo[i].si_boundto)
11436 {
11437 case SYMINFO_BT_SELF:
11438 fputs ("SELF ", stdout);
11439 break;
11440 case SYMINFO_BT_PARENT:
11441 fputs ("PARENT ", stdout);
11442 break;
11443 default:
11444 if (dynamic_syminfo[i].si_boundto > 0
d79b3d50
NC
11445 && dynamic_syminfo[i].si_boundto < dynamic_nent
11446 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
31104126 11447 {
d79b3d50 11448 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
31104126
NC
11449 putchar (' ' );
11450 }
252b5132
RH
11451 else
11452 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
11453 break;
11454 }
11455
11456 if (flags & SYMINFO_FLG_DIRECT)
11457 printf (" DIRECT");
11458 if (flags & SYMINFO_FLG_PASSTHRU)
11459 printf (" PASSTHRU");
11460 if (flags & SYMINFO_FLG_COPY)
11461 printf (" COPY");
11462 if (flags & SYMINFO_FLG_LAZYLOAD)
11463 printf (" LAZYLOAD");
11464
11465 puts ("");
11466 }
11467
11468 return 1;
11469}
11470
cf13d699
NC
11471/* Check to see if the given reloc needs to be handled in a target specific
11472 manner. If so then process the reloc and return TRUE otherwise return
11473 FALSE. */
09c11c86 11474
cf13d699
NC
11475static bfd_boolean
11476target_specific_reloc_handling (Elf_Internal_Rela * reloc,
11477 unsigned char * start,
11478 Elf_Internal_Sym * symtab)
252b5132 11479{
cf13d699 11480 unsigned int reloc_type = get_reloc_type (reloc->r_info);
252b5132 11481
cf13d699 11482 switch (elf_header.e_machine)
252b5132 11483 {
13761a11
NC
11484 case EM_MSP430:
11485 case EM_MSP430_OLD:
11486 {
11487 static Elf_Internal_Sym * saved_sym = NULL;
11488
11489 switch (reloc_type)
11490 {
11491 case 10: /* R_MSP430_SYM_DIFF */
11492 if (uses_msp430x_relocs ())
11493 break;
11494 case 21: /* R_MSP430X_SYM_DIFF */
11495 saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11496 return TRUE;
11497
11498 case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
11499 case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
11500 goto handle_sym_diff;
0b4362b0 11501
13761a11
NC
11502 case 5: /* R_MSP430_16_BYTE */
11503 case 9: /* R_MSP430_8 */
11504 if (uses_msp430x_relocs ())
11505 break;
11506 goto handle_sym_diff;
11507
11508 case 2: /* R_MSP430_ABS16 */
11509 case 15: /* R_MSP430X_ABS16 */
11510 if (! uses_msp430x_relocs ())
11511 break;
11512 goto handle_sym_diff;
0b4362b0 11513
13761a11
NC
11514 handle_sym_diff:
11515 if (saved_sym != NULL)
11516 {
11517 bfd_vma value;
11518
11519 value = reloc->r_addend
11520 + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11521 - saved_sym->st_value);
11522
11523 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
11524
11525 saved_sym = NULL;
11526 return TRUE;
11527 }
11528 break;
11529
11530 default:
11531 if (saved_sym != NULL)
071436c6 11532 error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
13761a11
NC
11533 break;
11534 }
11535 break;
11536 }
11537
cf13d699
NC
11538 case EM_MN10300:
11539 case EM_CYGNUS_MN10300:
11540 {
11541 static Elf_Internal_Sym * saved_sym = NULL;
252b5132 11542
cf13d699
NC
11543 switch (reloc_type)
11544 {
11545 case 34: /* R_MN10300_ALIGN */
11546 return TRUE;
11547 case 33: /* R_MN10300_SYM_DIFF */
11548 saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11549 return TRUE;
11550 case 1: /* R_MN10300_32 */
11551 case 2: /* R_MN10300_16 */
11552 if (saved_sym != NULL)
11553 {
11554 bfd_vma value;
252b5132 11555
cf13d699
NC
11556 value = reloc->r_addend
11557 + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11558 - saved_sym->st_value);
252b5132 11559
cf13d699 11560 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
252b5132 11561
cf13d699
NC
11562 saved_sym = NULL;
11563 return TRUE;
11564 }
11565 break;
11566 default:
11567 if (saved_sym != NULL)
071436c6 11568 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
cf13d699
NC
11569 break;
11570 }
11571 break;
11572 }
6ff71e76
NC
11573
11574 case EM_RL78:
11575 {
11576 static bfd_vma saved_sym1 = 0;
11577 static bfd_vma saved_sym2 = 0;
11578 static bfd_vma value;
11579
11580 switch (reloc_type)
11581 {
11582 case 0x80: /* R_RL78_SYM. */
11583 saved_sym1 = saved_sym2;
11584 saved_sym2 = symtab[get_reloc_symindex (reloc->r_info)].st_value;
11585 saved_sym2 += reloc->r_addend;
11586 return TRUE;
11587
11588 case 0x83: /* R_RL78_OPsub. */
11589 value = saved_sym1 - saved_sym2;
11590 saved_sym2 = saved_sym1 = 0;
11591 return TRUE;
11592 break;
11593
11594 case 0x41: /* R_RL78_ABS32. */
11595 byte_put (start + reloc->r_offset, value, 4);
11596 value = 0;
11597 return TRUE;
11598
11599 case 0x43: /* R_RL78_ABS16. */
11600 byte_put (start + reloc->r_offset, value, 2);
11601 value = 0;
11602 return TRUE;
11603
11604 default:
11605 break;
11606 }
11607 break;
11608 }
252b5132
RH
11609 }
11610
cf13d699 11611 return FALSE;
252b5132
RH
11612}
11613
aca88567
NC
11614/* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
11615 DWARF debug sections. This is a target specific test. Note - we do not
11616 go through the whole including-target-headers-multiple-times route, (as
11617 we have already done with <elf/h8.h>) because this would become very
11618 messy and even then this function would have to contain target specific
11619 information (the names of the relocs instead of their numeric values).
11620 FIXME: This is not the correct way to solve this problem. The proper way
11621 is to have target specific reloc sizing and typing functions created by
11622 the reloc-macros.h header, in the same way that it already creates the
11623 reloc naming functions. */
11624
11625static bfd_boolean
11626is_32bit_abs_reloc (unsigned int reloc_type)
11627{
d347c9df 11628 /* Please keep this table alpha-sorted for ease of visual lookup. */
aca88567
NC
11629 switch (elf_header.e_machine)
11630 {
41e92641 11631 case EM_386:
22abe556 11632 case EM_IAMCU:
41e92641 11633 return reloc_type == 1; /* R_386_32. */
aca88567
NC
11634 case EM_68K:
11635 return reloc_type == 1; /* R_68K_32. */
11636 case EM_860:
11637 return reloc_type == 1; /* R_860_32. */
137b6b5f
AM
11638 case EM_960:
11639 return reloc_type == 2; /* R_960_32. */
a06ea964
NC
11640 case EM_AARCH64:
11641 return reloc_type == 258; /* R_AARCH64_ABS32 */
d347c9df
PS
11642 case EM_ADAPTEVA_EPIPHANY:
11643 return reloc_type == 3;
aca88567 11644 case EM_ALPHA:
137b6b5f 11645 return reloc_type == 1; /* R_ALPHA_REFLONG. */
41e92641
NC
11646 case EM_ARC:
11647 return reloc_type == 1; /* R_ARC_32. */
886a2506
NC
11648 case EM_ARC_COMPACT:
11649 case EM_ARC_COMPACT2:
11650 return reloc_type == 4; /* R_ARC_32. */
41e92641
NC
11651 case EM_ARM:
11652 return reloc_type == 2; /* R_ARM_ABS32 */
cb8f3167 11653 case EM_AVR_OLD:
aca88567
NC
11654 case EM_AVR:
11655 return reloc_type == 1;
11656 case EM_BLACKFIN:
11657 return reloc_type == 0x12; /* R_byte4_data. */
11658 case EM_CRIS:
11659 return reloc_type == 3; /* R_CRIS_32. */
11660 case EM_CR16:
11661 return reloc_type == 3; /* R_CR16_NUM32. */
11662 case EM_CRX:
11663 return reloc_type == 15; /* R_CRX_NUM32. */
11664 case EM_CYGNUS_FRV:
11665 return reloc_type == 1;
41e92641
NC
11666 case EM_CYGNUS_D10V:
11667 case EM_D10V:
11668 return reloc_type == 6; /* R_D10V_32. */
aca88567
NC
11669 case EM_CYGNUS_D30V:
11670 case EM_D30V:
11671 return reloc_type == 12; /* R_D30V_32_NORMAL. */
41e92641
NC
11672 case EM_DLX:
11673 return reloc_type == 3; /* R_DLX_RELOC_32. */
aca88567
NC
11674 case EM_CYGNUS_FR30:
11675 case EM_FR30:
11676 return reloc_type == 3; /* R_FR30_32. */
3f8107ab
AM
11677 case EM_FT32:
11678 return reloc_type == 1; /* R_FT32_32. */
aca88567
NC
11679 case EM_H8S:
11680 case EM_H8_300:
11681 case EM_H8_300H:
11682 return reloc_type == 1; /* R_H8_DIR32. */
3730236a 11683 case EM_IA_64:
d1c4b12b
NC
11684 return reloc_type == 0x65 /* R_IA64_SECREL32LSB. */
11685 || reloc_type == 0x25; /* R_IA64_DIR32LSB. */
aca88567
NC
11686 case EM_IP2K_OLD:
11687 case EM_IP2K:
11688 return reloc_type == 2; /* R_IP2K_32. */
11689 case EM_IQ2000:
11690 return reloc_type == 2; /* R_IQ2000_32. */
84e94c90
NC
11691 case EM_LATTICEMICO32:
11692 return reloc_type == 3; /* R_LM32_32. */
ff7eeb89 11693 case EM_M32C_OLD:
aca88567
NC
11694 case EM_M32C:
11695 return reloc_type == 3; /* R_M32C_32. */
11696 case EM_M32R:
11697 return reloc_type == 34; /* R_M32R_32_RELA. */
adec12c1
AM
11698 case EM_68HC11:
11699 case EM_68HC12:
11700 return reloc_type == 6; /* R_M68HC11_32. */
aca88567
NC
11701 case EM_MCORE:
11702 return reloc_type == 1; /* R_MCORE_ADDR32. */
11703 case EM_CYGNUS_MEP:
11704 return reloc_type == 4; /* R_MEP_32. */
a3c62988
NC
11705 case EM_METAG:
11706 return reloc_type == 2; /* R_METAG_ADDR32. */
137b6b5f
AM
11707 case EM_MICROBLAZE:
11708 return reloc_type == 1; /* R_MICROBLAZE_32. */
aca88567
NC
11709 case EM_MIPS:
11710 return reloc_type == 2; /* R_MIPS_32. */
11711 case EM_MMIX:
11712 return reloc_type == 4; /* R_MMIX_32. */
11713 case EM_CYGNUS_MN10200:
11714 case EM_MN10200:
11715 return reloc_type == 1; /* R_MN10200_32. */
11716 case EM_CYGNUS_MN10300:
11717 case EM_MN10300:
11718 return reloc_type == 1; /* R_MN10300_32. */
5506d11a
AM
11719 case EM_MOXIE:
11720 return reloc_type == 1; /* R_MOXIE_32. */
aca88567
NC
11721 case EM_MSP430_OLD:
11722 case EM_MSP430:
13761a11 11723 return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32. */
aca88567
NC
11724 case EM_MT:
11725 return reloc_type == 2; /* R_MT_32. */
35c08157
KLC
11726 case EM_NDS32:
11727 return reloc_type == 20; /* R_NDS32_RELA. */
3e0873ac 11728 case EM_ALTERA_NIOS2:
36591ba1 11729 return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32. */
3e0873ac
NC
11730 case EM_NIOS32:
11731 return reloc_type == 1; /* R_NIOS_32. */
73589c9d
CS
11732 case EM_OR1K:
11733 return reloc_type == 1; /* R_OR1K_32. */
aca88567 11734 case EM_PARISC:
5fda8eca
NC
11735 return (reloc_type == 1 /* R_PARISC_DIR32. */
11736 || reloc_type == 41); /* R_PARISC_SECREL32. */
aca88567
NC
11737 case EM_PJ:
11738 case EM_PJ_OLD:
11739 return reloc_type == 1; /* R_PJ_DATA_DIR32. */
11740 case EM_PPC64:
11741 return reloc_type == 1; /* R_PPC64_ADDR32. */
11742 case EM_PPC:
11743 return reloc_type == 1; /* R_PPC_ADDR32. */
99c513f6
DD
11744 case EM_RL78:
11745 return reloc_type == 1; /* R_RL78_DIR32. */
c7927a3c
NC
11746 case EM_RX:
11747 return reloc_type == 1; /* R_RX_DIR32. */
aca88567
NC
11748 case EM_S370:
11749 return reloc_type == 1; /* R_I370_ADDR31. */
11750 case EM_S390_OLD:
11751 case EM_S390:
11752 return reloc_type == 4; /* R_S390_32. */
41e92641
NC
11753 case EM_SCORE:
11754 return reloc_type == 8; /* R_SCORE_ABS32. */
aca88567
NC
11755 case EM_SH:
11756 return reloc_type == 1; /* R_SH_DIR32. */
11757 case EM_SPARC32PLUS:
11758 case EM_SPARCV9:
11759 case EM_SPARC:
11760 return reloc_type == 3 /* R_SPARC_32. */
11761 || reloc_type == 23; /* R_SPARC_UA32. */
a7dd7d05
AM
11762 case EM_SPU:
11763 return reloc_type == 6; /* R_SPU_ADDR32 */
40b36596
JM
11764 case EM_TI_C6000:
11765 return reloc_type == 1; /* R_C6000_ABS32. */
aa137e4d
NC
11766 case EM_TILEGX:
11767 return reloc_type == 2; /* R_TILEGX_32. */
11768 case EM_TILEPRO:
11769 return reloc_type == 1; /* R_TILEPRO_32. */
aca88567
NC
11770 case EM_CYGNUS_V850:
11771 case EM_V850:
11772 return reloc_type == 6; /* R_V850_ABS32. */
708e2187
NC
11773 case EM_V800:
11774 return reloc_type == 0x33; /* R_V810_WORD. */
aca88567
NC
11775 case EM_VAX:
11776 return reloc_type == 1; /* R_VAX_32. */
619ed720
EB
11777 case EM_VISIUM:
11778 return reloc_type == 3; /* R_VISIUM_32. */
aca88567 11779 case EM_X86_64:
8a9036a4 11780 case EM_L1OM:
7a9068fe 11781 case EM_K1OM:
aca88567 11782 return reloc_type == 10; /* R_X86_64_32. */
c29aca4a
NC
11783 case EM_XC16X:
11784 case EM_C166:
11785 return reloc_type == 3; /* R_XC16C_ABS_32. */
f6c1a2d5
NC
11786 case EM_XGATE:
11787 return reloc_type == 4; /* R_XGATE_32. */
aca88567
NC
11788 case EM_XSTORMY16:
11789 return reloc_type == 1; /* R_XSTROMY16_32. */
11790 case EM_XTENSA_OLD:
11791 case EM_XTENSA:
11792 return reloc_type == 1; /* R_XTENSA_32. */
aca88567 11793 default:
bee0ee85
NC
11794 {
11795 static unsigned int prev_warn = 0;
11796
11797 /* Avoid repeating the same warning multiple times. */
11798 if (prev_warn != elf_header.e_machine)
11799 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
11800 elf_header.e_machine);
11801 prev_warn = elf_header.e_machine;
11802 return FALSE;
11803 }
aca88567
NC
11804 }
11805}
11806
11807/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11808 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
11809
11810static bfd_boolean
11811is_32bit_pcrel_reloc (unsigned int reloc_type)
11812{
11813 switch (elf_header.e_machine)
d347c9df 11814 /* Please keep this table alpha-sorted for ease of visual lookup. */
aca88567 11815 {
41e92641 11816 case EM_386:
22abe556 11817 case EM_IAMCU:
3e0873ac 11818 return reloc_type == 2; /* R_386_PC32. */
aca88567 11819 case EM_68K:
3e0873ac 11820 return reloc_type == 4; /* R_68K_PC32. */
a06ea964
NC
11821 case EM_AARCH64:
11822 return reloc_type == 261; /* R_AARCH64_PREL32 */
cfb8c092
NC
11823 case EM_ADAPTEVA_EPIPHANY:
11824 return reloc_type == 6;
aca88567
NC
11825 case EM_ALPHA:
11826 return reloc_type == 10; /* R_ALPHA_SREL32. */
726c18e1
CZ
11827 case EM_ARC_COMPACT:
11828 case EM_ARC_COMPACT2:
11829 return reloc_type == 49; /* R_ARC_32_PCREL. */
41e92641 11830 case EM_ARM:
3e0873ac 11831 return reloc_type == 3; /* R_ARM_REL32 */
d347c9df
PS
11832 case EM_AVR_OLD:
11833 case EM_AVR:
11834 return reloc_type == 36; /* R_AVR_32_PCREL. */
137b6b5f
AM
11835 case EM_MICROBLAZE:
11836 return reloc_type == 2; /* R_MICROBLAZE_32_PCREL. */
73589c9d
CS
11837 case EM_OR1K:
11838 return reloc_type == 9; /* R_OR1K_32_PCREL. */
aca88567 11839 case EM_PARISC:
85acf597 11840 return reloc_type == 9; /* R_PARISC_PCREL32. */
aca88567
NC
11841 case EM_PPC:
11842 return reloc_type == 26; /* R_PPC_REL32. */
11843 case EM_PPC64:
3e0873ac 11844 return reloc_type == 26; /* R_PPC64_REL32. */
aca88567
NC
11845 case EM_S390_OLD:
11846 case EM_S390:
3e0873ac 11847 return reloc_type == 5; /* R_390_PC32. */
aca88567 11848 case EM_SH:
3e0873ac 11849 return reloc_type == 2; /* R_SH_REL32. */
aca88567
NC
11850 case EM_SPARC32PLUS:
11851 case EM_SPARCV9:
11852 case EM_SPARC:
3e0873ac 11853 return reloc_type == 6; /* R_SPARC_DISP32. */
a7dd7d05
AM
11854 case EM_SPU:
11855 return reloc_type == 13; /* R_SPU_REL32. */
aa137e4d
NC
11856 case EM_TILEGX:
11857 return reloc_type == 6; /* R_TILEGX_32_PCREL. */
11858 case EM_TILEPRO:
11859 return reloc_type == 4; /* R_TILEPRO_32_PCREL. */
619ed720
EB
11860 case EM_VISIUM:
11861 return reloc_type == 6; /* R_VISIUM_32_PCREL */
aca88567 11862 case EM_X86_64:
8a9036a4 11863 case EM_L1OM:
7a9068fe 11864 case EM_K1OM:
3e0873ac 11865 return reloc_type == 2; /* R_X86_64_PC32. */
2fcb9706
BW
11866 case EM_XTENSA_OLD:
11867 case EM_XTENSA:
11868 return reloc_type == 14; /* R_XTENSA_32_PCREL. */
aca88567
NC
11869 default:
11870 /* Do not abort or issue an error message here. Not all targets use
11871 pc-relative 32-bit relocs in their DWARF debug information and we
11872 have already tested for target coverage in is_32bit_abs_reloc. A
cf13d699
NC
11873 more helpful warning message will be generated by apply_relocations
11874 anyway, so just return. */
aca88567
NC
11875 return FALSE;
11876 }
11877}
11878
11879/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11880 a 64-bit absolute RELA relocation used in DWARF debug sections. */
11881
11882static bfd_boolean
11883is_64bit_abs_reloc (unsigned int reloc_type)
11884{
11885 switch (elf_header.e_machine)
11886 {
a06ea964
NC
11887 case EM_AARCH64:
11888 return reloc_type == 257; /* R_AARCH64_ABS64. */
aca88567
NC
11889 case EM_ALPHA:
11890 return reloc_type == 2; /* R_ALPHA_REFQUAD. */
3730236a
NC
11891 case EM_IA_64:
11892 return reloc_type == 0x27; /* R_IA64_DIR64LSB. */
3e0873ac
NC
11893 case EM_PARISC:
11894 return reloc_type == 80; /* R_PARISC_DIR64. */
aca88567
NC
11895 case EM_PPC64:
11896 return reloc_type == 38; /* R_PPC64_ADDR64. */
11897 case EM_SPARC32PLUS:
11898 case EM_SPARCV9:
11899 case EM_SPARC:
11900 return reloc_type == 54; /* R_SPARC_UA64. */
11901 case EM_X86_64:
8a9036a4 11902 case EM_L1OM:
7a9068fe 11903 case EM_K1OM:
aca88567 11904 return reloc_type == 1; /* R_X86_64_64. */
e819ade1
AS
11905 case EM_S390_OLD:
11906 case EM_S390:
aa137e4d
NC
11907 return reloc_type == 22; /* R_S390_64. */
11908 case EM_TILEGX:
11909 return reloc_type == 1; /* R_TILEGX_64. */
85a82265 11910 case EM_MIPS:
aa137e4d 11911 return reloc_type == 18; /* R_MIPS_64. */
aca88567
NC
11912 default:
11913 return FALSE;
11914 }
11915}
11916
85acf597
RH
11917/* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
11918 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
11919
11920static bfd_boolean
11921is_64bit_pcrel_reloc (unsigned int reloc_type)
11922{
11923 switch (elf_header.e_machine)
11924 {
a06ea964
NC
11925 case EM_AARCH64:
11926 return reloc_type == 260; /* R_AARCH64_PREL64. */
85acf597 11927 case EM_ALPHA:
aa137e4d 11928 return reloc_type == 11; /* R_ALPHA_SREL64. */
85acf597 11929 case EM_IA_64:
aa137e4d 11930 return reloc_type == 0x4f; /* R_IA64_PCREL64LSB. */
85acf597 11931 case EM_PARISC:
aa137e4d 11932 return reloc_type == 72; /* R_PARISC_PCREL64. */
85acf597 11933 case EM_PPC64:
aa137e4d 11934 return reloc_type == 44; /* R_PPC64_REL64. */
85acf597
RH
11935 case EM_SPARC32PLUS:
11936 case EM_SPARCV9:
11937 case EM_SPARC:
aa137e4d 11938 return reloc_type == 46; /* R_SPARC_DISP64. */
85acf597 11939 case EM_X86_64:
8a9036a4 11940 case EM_L1OM:
7a9068fe 11941 case EM_K1OM:
aa137e4d 11942 return reloc_type == 24; /* R_X86_64_PC64. */
85acf597
RH
11943 case EM_S390_OLD:
11944 case EM_S390:
aa137e4d
NC
11945 return reloc_type == 23; /* R_S390_PC64. */
11946 case EM_TILEGX:
11947 return reloc_type == 5; /* R_TILEGX_64_PCREL. */
85acf597
RH
11948 default:
11949 return FALSE;
11950 }
11951}
11952
4dc3c23d
AM
11953/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11954 a 24-bit absolute RELA relocation used in DWARF debug sections. */
11955
11956static bfd_boolean
11957is_24bit_abs_reloc (unsigned int reloc_type)
11958{
11959 switch (elf_header.e_machine)
11960 {
11961 case EM_CYGNUS_MN10200:
11962 case EM_MN10200:
11963 return reloc_type == 4; /* R_MN10200_24. */
3ee6e4fb
NC
11964 case EM_FT32:
11965 return reloc_type == 5; /* R_FT32_20. */
4dc3c23d
AM
11966 default:
11967 return FALSE;
11968 }
11969}
11970
aca88567
NC
11971/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11972 a 16-bit absolute RELA relocation used in DWARF debug sections. */
11973
11974static bfd_boolean
11975is_16bit_abs_reloc (unsigned int reloc_type)
4b78141a 11976{
d347c9df 11977 /* Please keep this table alpha-sorted for ease of visual lookup. */
4b78141a
NC
11978 switch (elf_header.e_machine)
11979 {
886a2506
NC
11980 case EM_ARC:
11981 case EM_ARC_COMPACT:
11982 case EM_ARC_COMPACT2:
11983 return reloc_type == 2; /* R_ARC_16. */
d347c9df
PS
11984 case EM_ADAPTEVA_EPIPHANY:
11985 return reloc_type == 5;
aca88567
NC
11986 case EM_AVR_OLD:
11987 case EM_AVR:
11988 return reloc_type == 4; /* R_AVR_16. */
41e92641
NC
11989 case EM_CYGNUS_D10V:
11990 case EM_D10V:
11991 return reloc_type == 3; /* R_D10V_16. */
4b78141a
NC
11992 case EM_H8S:
11993 case EM_H8_300:
11994 case EM_H8_300H:
aca88567
NC
11995 return reloc_type == R_H8_DIR16;
11996 case EM_IP2K_OLD:
11997 case EM_IP2K:
11998 return reloc_type == 1; /* R_IP2K_16. */
ff7eeb89 11999 case EM_M32C_OLD:
f4236fe4
DD
12000 case EM_M32C:
12001 return reloc_type == 1; /* R_M32C_16 */
d347c9df
PS
12002 case EM_CYGNUS_MN10200:
12003 case EM_MN10200:
12004 return reloc_type == 2; /* R_MN10200_16. */
12005 case EM_CYGNUS_MN10300:
12006 case EM_MN10300:
12007 return reloc_type == 2; /* R_MN10300_16. */
aca88567 12008 case EM_MSP430:
13761a11
NC
12009 if (uses_msp430x_relocs ())
12010 return reloc_type == 2; /* R_MSP430_ABS16. */
78c8d46c 12011 case EM_MSP430_OLD:
aca88567 12012 return reloc_type == 5; /* R_MSP430_16_BYTE. */
35c08157
KLC
12013 case EM_NDS32:
12014 return reloc_type == 19; /* R_NDS32_RELA. */
3e0873ac 12015 case EM_ALTERA_NIOS2:
36591ba1 12016 return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16. */
3e0873ac
NC
12017 case EM_NIOS32:
12018 return reloc_type == 9; /* R_NIOS_16. */
73589c9d
CS
12019 case EM_OR1K:
12020 return reloc_type == 2; /* R_OR1K_16. */
40b36596
JM
12021 case EM_TI_C6000:
12022 return reloc_type == 2; /* R_C6000_ABS16. */
d347c9df
PS
12023 case EM_VISIUM:
12024 return reloc_type == 2; /* R_VISIUM_16. */
c29aca4a
NC
12025 case EM_XC16X:
12026 case EM_C166:
12027 return reloc_type == 2; /* R_XC16C_ABS_16. */
f6c1a2d5
NC
12028 case EM_XGATE:
12029 return reloc_type == 3; /* R_XGATE_16. */
4b78141a 12030 default:
aca88567 12031 return FALSE;
4b78141a
NC
12032 }
12033}
12034
2a7b2e88
JK
12035/* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
12036 relocation entries (possibly formerly used for SHT_GROUP sections). */
12037
12038static bfd_boolean
12039is_none_reloc (unsigned int reloc_type)
12040{
12041 switch (elf_header.e_machine)
12042 {
cb8f3167 12043 case EM_386: /* R_386_NONE. */
d347c9df 12044 case EM_68K: /* R_68K_NONE. */
cfb8c092 12045 case EM_ADAPTEVA_EPIPHANY:
d347c9df
PS
12046 case EM_ALPHA: /* R_ALPHA_NONE. */
12047 case EM_ALTERA_NIOS2: /* R_NIOS2_NONE. */
886a2506 12048 case EM_ARC: /* R_ARC_NONE. */
886a2506 12049 case EM_ARC_COMPACT2: /* R_ARC_NONE. */
d347c9df 12050 case EM_ARC_COMPACT: /* R_ARC_NONE. */
cb8f3167 12051 case EM_ARM: /* R_ARM_NONE. */
d347c9df 12052 case EM_C166: /* R_XC16X_NONE. */
cb8f3167 12053 case EM_CRIS: /* R_CRIS_NONE. */
d347c9df
PS
12054 case EM_FT32: /* R_FT32_NONE. */
12055 case EM_IA_64: /* R_IA64_NONE. */
7a9068fe 12056 case EM_K1OM: /* R_X86_64_NONE. */
d347c9df
PS
12057 case EM_L1OM: /* R_X86_64_NONE. */
12058 case EM_M32R: /* R_M32R_NONE. */
12059 case EM_MIPS: /* R_MIPS_NONE. */
cb8f3167 12060 case EM_MN10300: /* R_MN10300_NONE. */
5506d11a 12061 case EM_MOXIE: /* R_MOXIE_NONE. */
d347c9df
PS
12062 case EM_NIOS32: /* R_NIOS_NONE. */
12063 case EM_OR1K: /* R_OR1K_NONE. */
12064 case EM_PARISC: /* R_PARISC_NONE. */
12065 case EM_PPC64: /* R_PPC64_NONE. */
12066 case EM_PPC: /* R_PPC_NONE. */
12067 case EM_S390: /* R_390_NONE. */
12068 case EM_S390_OLD:
12069 case EM_SH: /* R_SH_NONE. */
12070 case EM_SPARC32PLUS:
12071 case EM_SPARC: /* R_SPARC_NONE. */
12072 case EM_SPARCV9:
aa137e4d
NC
12073 case EM_TILEGX: /* R_TILEGX_NONE. */
12074 case EM_TILEPRO: /* R_TILEPRO_NONE. */
d347c9df
PS
12075 case EM_TI_C6000:/* R_C6000_NONE. */
12076 case EM_X86_64: /* R_X86_64_NONE. */
c29aca4a 12077 case EM_XC16X:
cb8f3167 12078 return reloc_type == 0;
d347c9df 12079
a06ea964
NC
12080 case EM_AARCH64:
12081 return reloc_type == 0 || reloc_type == 256;
d347c9df
PS
12082 case EM_AVR_OLD:
12083 case EM_AVR:
12084 return (reloc_type == 0 /* R_AVR_NONE. */
12085 || reloc_type == 30 /* R_AVR_DIFF8. */
12086 || reloc_type == 31 /* R_AVR_DIFF16. */
12087 || reloc_type == 32 /* R_AVR_DIFF32. */);
12088 case EM_METAG:
12089 return reloc_type == 3; /* R_METAG_NONE. */
35c08157
KLC
12090 case EM_NDS32:
12091 return (reloc_type == 0 /* R_XTENSA_NONE. */
12092 || reloc_type == 204 /* R_NDS32_DIFF8. */
12093 || reloc_type == 205 /* R_NDS32_DIFF16. */
12094 || reloc_type == 206 /* R_NDS32_DIFF32. */
12095 || reloc_type == 207 /* R_NDS32_ULEB128. */);
58332dda
JK
12096 case EM_XTENSA_OLD:
12097 case EM_XTENSA:
4dc3c23d
AM
12098 return (reloc_type == 0 /* R_XTENSA_NONE. */
12099 || reloc_type == 17 /* R_XTENSA_DIFF8. */
12100 || reloc_type == 18 /* R_XTENSA_DIFF16. */
12101 || reloc_type == 19 /* R_XTENSA_DIFF32. */);
2a7b2e88
JK
12102 }
12103 return FALSE;
12104}
12105
d1c4b12b
NC
12106/* Returns TRUE if there is a relocation against
12107 section NAME at OFFSET bytes. */
12108
12109bfd_boolean
12110reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
12111{
12112 Elf_Internal_Rela * relocs;
12113 Elf_Internal_Rela * rp;
12114
12115 if (dsec == NULL || dsec->reloc_info == NULL)
12116 return FALSE;
12117
12118 relocs = (Elf_Internal_Rela *) dsec->reloc_info;
12119
12120 for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
12121 if (rp->r_offset == offset)
12122 return TRUE;
12123
12124 return FALSE;
12125}
12126
cf13d699
NC
12127/* Apply relocations to a section.
12128 Note: So far support has been added only for those relocations
12129 which can be found in debug sections.
d1c4b12b
NC
12130 If RELOCS_RETURN is non-NULL then returns in it a pointer to the
12131 loaded relocs. It is then the caller's responsibility to free them.
cf13d699 12132 FIXME: Add support for more relocations ? */
1b315056 12133
cf13d699 12134static void
d1c4b12b
NC
12135apply_relocations (void * file,
12136 const Elf_Internal_Shdr * section,
12137 unsigned char * start,
12138 bfd_size_type size,
12139 void ** relocs_return,
12140 unsigned long * num_relocs_return)
1b315056 12141{
cf13d699 12142 Elf_Internal_Shdr * relsec;
0d2a7a93 12143 unsigned char * end = start + size;
cb8f3167 12144
d1c4b12b
NC
12145 if (relocs_return != NULL)
12146 {
12147 * (Elf_Internal_Rela **) relocs_return = NULL;
12148 * num_relocs_return = 0;
12149 }
12150
cf13d699
NC
12151 if (elf_header.e_type != ET_REL)
12152 return;
1b315056 12153
cf13d699 12154 /* Find the reloc section associated with the section. */
5b18a4bc
NC
12155 for (relsec = section_headers;
12156 relsec < section_headers + elf_header.e_shnum;
12157 ++relsec)
252b5132 12158 {
41e92641
NC
12159 bfd_boolean is_rela;
12160 unsigned long num_relocs;
2cf0635d
NC
12161 Elf_Internal_Rela * relocs;
12162 Elf_Internal_Rela * rp;
12163 Elf_Internal_Shdr * symsec;
12164 Elf_Internal_Sym * symtab;
ba5cdace 12165 unsigned long num_syms;
2cf0635d 12166 Elf_Internal_Sym * sym;
252b5132 12167
41e92641 12168 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
4fbb74a6
AM
12169 || relsec->sh_info >= elf_header.e_shnum
12170 || section_headers + relsec->sh_info != section
c256ffe7 12171 || relsec->sh_size == 0
4fbb74a6 12172 || relsec->sh_link >= elf_header.e_shnum)
5b18a4bc 12173 continue;
428409d5 12174
41e92641
NC
12175 is_rela = relsec->sh_type == SHT_RELA;
12176
12177 if (is_rela)
12178 {
3f5e193b
NC
12179 if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
12180 relsec->sh_size, & relocs, & num_relocs))
41e92641
NC
12181 return;
12182 }
12183 else
12184 {
3f5e193b
NC
12185 if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
12186 relsec->sh_size, & relocs, & num_relocs))
41e92641
NC
12187 return;
12188 }
12189
12190 /* SH uses RELA but uses in place value instead of the addend field. */
12191 if (elf_header.e_machine == EM_SH)
12192 is_rela = FALSE;
428409d5 12193
4fbb74a6 12194 symsec = section_headers + relsec->sh_link;
ba5cdace 12195 symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec, & num_syms);
103f02d3 12196
41e92641 12197 for (rp = relocs; rp < relocs + num_relocs; ++rp)
252b5132 12198 {
41e92641
NC
12199 bfd_vma addend;
12200 unsigned int reloc_type;
12201 unsigned int reloc_size;
91d6fa6a 12202 unsigned char * rloc;
ba5cdace 12203 unsigned long sym_index;
4b78141a 12204
aca88567 12205 reloc_type = get_reloc_type (rp->r_info);
41e92641 12206
98fb390a 12207 if (target_specific_reloc_handling (rp, start, symtab))
2a7b2e88 12208 continue;
98fb390a
NC
12209 else if (is_none_reloc (reloc_type))
12210 continue;
12211 else if (is_32bit_abs_reloc (reloc_type)
12212 || is_32bit_pcrel_reloc (reloc_type))
aca88567 12213 reloc_size = 4;
85acf597
RH
12214 else if (is_64bit_abs_reloc (reloc_type)
12215 || is_64bit_pcrel_reloc (reloc_type))
aca88567 12216 reloc_size = 8;
4dc3c23d
AM
12217 else if (is_24bit_abs_reloc (reloc_type))
12218 reloc_size = 3;
aca88567
NC
12219 else if (is_16bit_abs_reloc (reloc_type))
12220 reloc_size = 2;
12221 else
4b78141a 12222 {
bee0ee85
NC
12223 static unsigned int prev_reloc = 0;
12224 if (reloc_type != prev_reloc)
12225 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
12226 reloc_type, printable_section_name (section));
12227 prev_reloc = reloc_type;
4b78141a
NC
12228 continue;
12229 }
103f02d3 12230
91d6fa6a 12231 rloc = start + rp->r_offset;
c8da6823 12232 if ((rloc + reloc_size) > end || (rloc < start))
700dd8b7
L
12233 {
12234 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
12235 (unsigned long) rp->r_offset,
74e1a04b 12236 printable_section_name (section));
700dd8b7
L
12237 continue;
12238 }
103f02d3 12239
ba5cdace
NC
12240 sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
12241 if (sym_index >= num_syms)
12242 {
12243 warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
74e1a04b 12244 sym_index, printable_section_name (section));
ba5cdace
NC
12245 continue;
12246 }
12247 sym = symtab + sym_index;
41e92641
NC
12248
12249 /* If the reloc has a symbol associated with it,
55f25fc3
L
12250 make sure that it is of an appropriate type.
12251
12252 Relocations against symbols without type can happen.
12253 Gcc -feliminate-dwarf2-dups may generate symbols
12254 without type for debug info.
12255
12256 Icc generates relocations against function symbols
12257 instead of local labels.
12258
12259 Relocations against object symbols can happen, eg when
12260 referencing a global array. For an example of this see
12261 the _clz.o binary in libgcc.a. */
aca88567 12262 if (sym != symtab
b8871f35 12263 && ELF_ST_TYPE (sym->st_info) != STT_COMMON
55f25fc3 12264 && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
5b18a4bc 12265 {
41e92641 12266 warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
aca88567 12267 get_symbol_type (ELF_ST_TYPE (sym->st_info)),
99dcb0b9 12268 (long int)(rp - relocs),
74e1a04b 12269 printable_section_name (relsec));
aca88567 12270 continue;
5b18a4bc 12271 }
252b5132 12272
4dc3c23d
AM
12273 addend = 0;
12274 if (is_rela)
12275 addend += rp->r_addend;
c47320c3
AM
12276 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
12277 partial_inplace. */
4dc3c23d
AM
12278 if (!is_rela
12279 || (elf_header.e_machine == EM_XTENSA
12280 && reloc_type == 1)
12281 || ((elf_header.e_machine == EM_PJ
12282 || elf_header.e_machine == EM_PJ_OLD)
c47320c3
AM
12283 && reloc_type == 1)
12284 || ((elf_header.e_machine == EM_D30V
12285 || elf_header.e_machine == EM_CYGNUS_D30V)
12286 && reloc_type == 12))
91d6fa6a 12287 addend += byte_get (rloc, reloc_size);
cb8f3167 12288
85acf597
RH
12289 if (is_32bit_pcrel_reloc (reloc_type)
12290 || is_64bit_pcrel_reloc (reloc_type))
12291 {
12292 /* On HPPA, all pc-relative relocations are biased by 8. */
12293 if (elf_header.e_machine == EM_PARISC)
12294 addend -= 8;
91d6fa6a 12295 byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
85acf597
RH
12296 reloc_size);
12297 }
41e92641 12298 else
91d6fa6a 12299 byte_put (rloc, addend + sym->st_value, reloc_size);
5b18a4bc 12300 }
252b5132 12301
5b18a4bc 12302 free (symtab);
d1c4b12b
NC
12303
12304 if (relocs_return)
12305 {
12306 * (Elf_Internal_Rela **) relocs_return = relocs;
12307 * num_relocs_return = num_relocs;
12308 }
12309 else
12310 free (relocs);
12311
5b18a4bc
NC
12312 break;
12313 }
5b18a4bc 12314}
103f02d3 12315
cf13d699
NC
12316#ifdef SUPPORT_DISASSEMBLY
12317static int
12318disassemble_section (Elf_Internal_Shdr * section, FILE * file)
12319{
74e1a04b 12320 printf (_("\nAssembly dump of section %s\n"), printable_section_name (section));
cf13d699 12321
74e1a04b 12322 /* FIXME: XXX -- to be done --- XXX */
cf13d699
NC
12323
12324 return 1;
12325}
12326#endif
12327
12328/* Reads in the contents of SECTION from FILE, returning a pointer
12329 to a malloc'ed buffer or NULL if something went wrong. */
12330
12331static char *
12332get_section_contents (Elf_Internal_Shdr * section, FILE * file)
12333{
12334 bfd_size_type num_bytes;
12335
12336 num_bytes = section->sh_size;
12337
12338 if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
12339 {
12340 printf (_("\nSection '%s' has no data to dump.\n"),
74e1a04b 12341 printable_section_name (section));
cf13d699
NC
12342 return NULL;
12343 }
12344
3f5e193b
NC
12345 return (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
12346 _("section contents"));
cf13d699
NC
12347}
12348
0e602686
NC
12349/* Uncompresses a section that was compressed using zlib, in place. */
12350
12351static bfd_boolean
12352uncompress_section_contents (unsigned char **buffer,
12353 dwarf_size_type uncompressed_size,
12354 dwarf_size_type *size)
12355{
12356 dwarf_size_type compressed_size = *size;
12357 unsigned char * compressed_buffer = *buffer;
12358 unsigned char * uncompressed_buffer;
12359 z_stream strm;
12360 int rc;
12361
12362 /* It is possible the section consists of several compressed
12363 buffers concatenated together, so we uncompress in a loop. */
12364 /* PR 18313: The state field in the z_stream structure is supposed
12365 to be invisible to the user (ie us), but some compilers will
12366 still complain about it being used without initialisation. So
12367 we first zero the entire z_stream structure and then set the fields
12368 that we need. */
12369 memset (& strm, 0, sizeof strm);
12370 strm.avail_in = compressed_size;
12371 strm.next_in = (Bytef *) compressed_buffer;
12372 strm.avail_out = uncompressed_size;
12373 uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
12374
12375 rc = inflateInit (& strm);
12376 while (strm.avail_in > 0)
12377 {
12378 if (rc != Z_OK)
12379 goto fail;
12380 strm.next_out = ((Bytef *) uncompressed_buffer
12381 + (uncompressed_size - strm.avail_out));
12382 rc = inflate (&strm, Z_FINISH);
12383 if (rc != Z_STREAM_END)
12384 goto fail;
12385 rc = inflateReset (& strm);
12386 }
12387 rc = inflateEnd (& strm);
12388 if (rc != Z_OK
12389 || strm.avail_out != 0)
12390 goto fail;
12391
12392 *buffer = uncompressed_buffer;
12393 *size = uncompressed_size;
12394 return TRUE;
12395
12396 fail:
12397 free (uncompressed_buffer);
12398 /* Indicate decompression failure. */
12399 *buffer = NULL;
12400 return FALSE;
12401}
dd24e3da 12402
cf13d699
NC
12403static void
12404dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
12405{
0e602686
NC
12406 Elf_Internal_Shdr * relsec;
12407 bfd_size_type num_bytes;
fd8008d8
L
12408 unsigned char * data;
12409 unsigned char * end;
12410 unsigned char * real_start;
12411 unsigned char * start;
0e602686 12412 bfd_boolean some_strings_shown;
cf13d699 12413
fd8008d8
L
12414 real_start = start = (unsigned char *) get_section_contents (section,
12415 file);
cf13d699
NC
12416 if (start == NULL)
12417 return;
0e602686 12418 num_bytes = section->sh_size;
cf13d699 12419
74e1a04b 12420 printf (_("\nString dump of section '%s':\n"), printable_section_name (section));
cf13d699 12421
0e602686
NC
12422 if (decompress_dumps)
12423 {
12424 dwarf_size_type new_size = num_bytes;
12425 dwarf_size_type uncompressed_size = 0;
12426
12427 if ((section->sh_flags & SHF_COMPRESSED) != 0)
12428 {
12429 Elf_Internal_Chdr chdr;
12430 unsigned int compression_header_size
12431 = get_compression_header (& chdr, (unsigned char *) start);
12432
813dabb9 12433 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
0e602686 12434 {
813dabb9
L
12435 warn (_("section '%s' has unsupported compress type: %d\n"),
12436 printable_section_name (section), chdr.ch_type);
12437 return;
12438 }
12439 else if (chdr.ch_addralign != section->sh_addralign)
12440 {
12441 warn (_("compressed section '%s' is corrupted\n"),
12442 printable_section_name (section));
12443 return;
0e602686 12444 }
813dabb9
L
12445 uncompressed_size = chdr.ch_size;
12446 start += compression_header_size;
12447 new_size -= compression_header_size;
0e602686
NC
12448 }
12449 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12450 {
12451 /* Read the zlib header. In this case, it should be "ZLIB"
12452 followed by the uncompressed section size, 8 bytes in
12453 big-endian order. */
12454 uncompressed_size = start[4]; uncompressed_size <<= 8;
12455 uncompressed_size += start[5]; uncompressed_size <<= 8;
12456 uncompressed_size += start[6]; uncompressed_size <<= 8;
12457 uncompressed_size += start[7]; uncompressed_size <<= 8;
12458 uncompressed_size += start[8]; uncompressed_size <<= 8;
12459 uncompressed_size += start[9]; uncompressed_size <<= 8;
12460 uncompressed_size += start[10]; uncompressed_size <<= 8;
12461 uncompressed_size += start[11];
12462 start += 12;
12463 new_size -= 12;
12464 }
12465
12466 if (uncompressed_size
fd8008d8 12467 && uncompress_section_contents (& start,
0e602686
NC
12468 uncompressed_size, & new_size))
12469 num_bytes = new_size;
12470 }
fd8008d8 12471
cf13d699
NC
12472 /* If the section being dumped has relocations against it the user might
12473 be expecting these relocations to have been applied. Check for this
12474 case and issue a warning message in order to avoid confusion.
12475 FIXME: Maybe we ought to have an option that dumps a section with
12476 relocs applied ? */
12477 for (relsec = section_headers;
12478 relsec < section_headers + elf_header.e_shnum;
12479 ++relsec)
12480 {
12481 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12482 || relsec->sh_info >= elf_header.e_shnum
12483 || section_headers + relsec->sh_info != section
12484 || relsec->sh_size == 0
12485 || relsec->sh_link >= elf_header.e_shnum)
12486 continue;
12487
12488 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12489 break;
12490 }
12491
cf13d699
NC
12492 data = start;
12493 end = start + num_bytes;
12494 some_strings_shown = FALSE;
12495
12496 while (data < end)
12497 {
12498 while (!ISPRINT (* data))
12499 if (++ data >= end)
12500 break;
12501
12502 if (data < end)
12503 {
071436c6
NC
12504 size_t maxlen = end - data;
12505
cf13d699 12506#ifndef __MSVCRT__
c975cc98
NC
12507 /* PR 11128: Use two separate invocations in order to work
12508 around bugs in the Solaris 8 implementation of printf. */
12509 printf (" [%6tx] ", data - start);
cf13d699 12510#else
071436c6 12511 printf (" [%6Ix] ", (size_t) (data - start));
cf13d699 12512#endif
4082ef84
NC
12513 if (maxlen > 0)
12514 {
fd8008d8 12515 print_symbol ((int) maxlen, (const char *) data);
4082ef84 12516 putchar ('\n');
fd8008d8 12517 data += strnlen ((const char *) data, maxlen);
4082ef84
NC
12518 }
12519 else
12520 {
12521 printf (_("<corrupt>\n"));
12522 data = end;
12523 }
cf13d699
NC
12524 some_strings_shown = TRUE;
12525 }
12526 }
12527
12528 if (! some_strings_shown)
12529 printf (_(" No strings found in this section."));
12530
0e602686 12531 free (real_start);
cf13d699
NC
12532
12533 putchar ('\n');
12534}
12535
12536static void
12537dump_section_as_bytes (Elf_Internal_Shdr * section,
12538 FILE * file,
12539 bfd_boolean relocate)
12540{
12541 Elf_Internal_Shdr * relsec;
0e602686
NC
12542 bfd_size_type bytes;
12543 bfd_size_type section_size;
12544 bfd_vma addr;
12545 unsigned char * data;
12546 unsigned char * real_start;
12547 unsigned char * start;
12548
12549 real_start = start = (unsigned char *) get_section_contents (section, file);
cf13d699
NC
12550 if (start == NULL)
12551 return;
0e602686 12552 section_size = section->sh_size;
cf13d699 12553
74e1a04b 12554 printf (_("\nHex dump of section '%s':\n"), printable_section_name (section));
cf13d699 12555
0e602686
NC
12556 if (decompress_dumps)
12557 {
12558 dwarf_size_type new_size = section_size;
12559 dwarf_size_type uncompressed_size = 0;
12560
12561 if ((section->sh_flags & SHF_COMPRESSED) != 0)
12562 {
12563 Elf_Internal_Chdr chdr;
12564 unsigned int compression_header_size
12565 = get_compression_header (& chdr, start);
12566
813dabb9 12567 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
0e602686 12568 {
813dabb9
L
12569 warn (_("section '%s' has unsupported compress type: %d\n"),
12570 printable_section_name (section), chdr.ch_type);
12571 return;
0e602686 12572 }
813dabb9
L
12573 else if (chdr.ch_addralign != section->sh_addralign)
12574 {
12575 warn (_("compressed section '%s' is corrupted\n"),
12576 printable_section_name (section));
12577 return;
12578 }
12579 uncompressed_size = chdr.ch_size;
12580 start += compression_header_size;
12581 new_size -= compression_header_size;
0e602686
NC
12582 }
12583 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12584 {
12585 /* Read the zlib header. In this case, it should be "ZLIB"
12586 followed by the uncompressed section size, 8 bytes in
12587 big-endian order. */
12588 uncompressed_size = start[4]; uncompressed_size <<= 8;
12589 uncompressed_size += start[5]; uncompressed_size <<= 8;
12590 uncompressed_size += start[6]; uncompressed_size <<= 8;
12591 uncompressed_size += start[7]; uncompressed_size <<= 8;
12592 uncompressed_size += start[8]; uncompressed_size <<= 8;
12593 uncompressed_size += start[9]; uncompressed_size <<= 8;
12594 uncompressed_size += start[10]; uncompressed_size <<= 8;
12595 uncompressed_size += start[11];
12596 start += 12;
12597 new_size -= 12;
12598 }
12599
12600 if (uncompressed_size
12601 && uncompress_section_contents (& start, uncompressed_size,
12602 & new_size))
12603 section_size = new_size;
12604 }
14ae95f2 12605
cf13d699
NC
12606 if (relocate)
12607 {
0e602686 12608 apply_relocations (file, section, start, section_size, NULL, NULL);
cf13d699
NC
12609 }
12610 else
12611 {
12612 /* If the section being dumped has relocations against it the user might
12613 be expecting these relocations to have been applied. Check for this
12614 case and issue a warning message in order to avoid confusion.
12615 FIXME: Maybe we ought to have an option that dumps a section with
12616 relocs applied ? */
12617 for (relsec = section_headers;
12618 relsec < section_headers + elf_header.e_shnum;
12619 ++relsec)
12620 {
12621 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12622 || relsec->sh_info >= elf_header.e_shnum
12623 || section_headers + relsec->sh_info != section
12624 || relsec->sh_size == 0
12625 || relsec->sh_link >= elf_header.e_shnum)
12626 continue;
12627
12628 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12629 break;
12630 }
12631 }
12632
12633 addr = section->sh_addr;
0e602686 12634 bytes = section_size;
cf13d699
NC
12635 data = start;
12636
12637 while (bytes)
12638 {
12639 int j;
12640 int k;
12641 int lbytes;
12642
12643 lbytes = (bytes > 16 ? 16 : bytes);
12644
12645 printf (" 0x%8.8lx ", (unsigned long) addr);
12646
12647 for (j = 0; j < 16; j++)
12648 {
12649 if (j < lbytes)
12650 printf ("%2.2x", data[j]);
12651 else
12652 printf (" ");
12653
12654 if ((j & 3) == 3)
12655 printf (" ");
12656 }
12657
12658 for (j = 0; j < lbytes; j++)
12659 {
12660 k = data[j];
12661 if (k >= ' ' && k < 0x7f)
12662 printf ("%c", k);
12663 else
12664 printf (".");
12665 }
12666
12667 putchar ('\n');
12668
12669 data += lbytes;
12670 addr += lbytes;
12671 bytes -= lbytes;
12672 }
12673
0e602686 12674 free (real_start);
cf13d699
NC
12675
12676 putchar ('\n');
12677}
12678
d966045b
DJ
12679static int
12680load_specific_debug_section (enum dwarf_section_display_enum debug,
0d2a7a93 12681 const Elf_Internal_Shdr * sec, void * file)
1007acb3 12682{
2cf0635d 12683 struct dwarf_section * section = &debug_displays [debug].section;
19e6b90e 12684 char buf [64];
1007acb3 12685
19e6b90e
L
12686 /* If it is already loaded, do nothing. */
12687 if (section->start != NULL)
12688 return 1;
1007acb3 12689
19e6b90e
L
12690 snprintf (buf, sizeof (buf), _("%s section data"), section->name);
12691 section->address = sec->sh_addr;
06614111 12692 section->user_data = NULL;
3f5e193b
NC
12693 section->start = (unsigned char *) get_data (NULL, (FILE *) file,
12694 sec->sh_offset, 1,
12695 sec->sh_size, buf);
59245841
NC
12696 if (section->start == NULL)
12697 section->size = 0;
12698 else
12699 {
77115a4a
L
12700 unsigned char *start = section->start;
12701 dwarf_size_type size = sec->sh_size;
dab394de 12702 dwarf_size_type uncompressed_size = 0;
77115a4a
L
12703
12704 if ((sec->sh_flags & SHF_COMPRESSED) != 0)
12705 {
12706 Elf_Internal_Chdr chdr;
d8024a91
NC
12707 unsigned int compression_header_size;
12708
f53be977
L
12709 if (size < (is_32bit_elf
12710 ? sizeof (Elf32_External_Chdr)
12711 : sizeof (Elf64_External_Chdr)))
d8024a91
NC
12712 {
12713 warn (_("compressed section %s is too small to contain a compression header"),
12714 section->name);
12715 return 0;
12716 }
12717
12718 compression_header_size = get_compression_header (&chdr, start);
12719
813dabb9
L
12720 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12721 {
12722 warn (_("section '%s' has unsupported compress type: %d\n"),
12723 section->name, chdr.ch_type);
12724 return 0;
12725 }
12726 else if (chdr.ch_addralign != sec->sh_addralign)
12727 {
12728 warn (_("compressed section '%s' is corrupted\n"),
12729 section->name);
12730 return 0;
12731 }
dab394de 12732 uncompressed_size = chdr.ch_size;
77115a4a
L
12733 start += compression_header_size;
12734 size -= compression_header_size;
12735 }
dab394de
L
12736 else if (size > 12 && streq ((char *) start, "ZLIB"))
12737 {
12738 /* Read the zlib header. In this case, it should be "ZLIB"
12739 followed by the uncompressed section size, 8 bytes in
12740 big-endian order. */
12741 uncompressed_size = start[4]; uncompressed_size <<= 8;
12742 uncompressed_size += start[5]; uncompressed_size <<= 8;
12743 uncompressed_size += start[6]; uncompressed_size <<= 8;
12744 uncompressed_size += start[7]; uncompressed_size <<= 8;
12745 uncompressed_size += start[8]; uncompressed_size <<= 8;
12746 uncompressed_size += start[9]; uncompressed_size <<= 8;
12747 uncompressed_size += start[10]; uncompressed_size <<= 8;
12748 uncompressed_size += start[11];
12749 start += 12;
12750 size -= 12;
12751 }
12752
12753 if (uncompressed_size
12754 && uncompress_section_contents (&start, uncompressed_size,
12755 &size))
77115a4a
L
12756 {
12757 /* Free the compressed buffer, update the section buffer
12758 and the section size if uncompress is successful. */
12759 free (section->start);
12760 section->start = start;
77115a4a
L
12761 }
12762 section->size = size;
59245841 12763 }
4a114e3e 12764
1b315056
CS
12765 if (section->start == NULL)
12766 return 0;
12767
19e6b90e 12768 if (debug_displays [debug].relocate)
d1c4b12b
NC
12769 apply_relocations ((FILE *) file, sec, section->start, section->size,
12770 & section->reloc_info, & section->num_relocs);
12771 else
12772 {
12773 section->reloc_info = NULL;
12774 section->num_relocs = 0;
12775 }
1007acb3 12776
1b315056 12777 return 1;
1007acb3
L
12778}
12779
657d0d47
CC
12780/* If this is not NULL, load_debug_section will only look for sections
12781 within the list of sections given here. */
12782unsigned int *section_subset = NULL;
12783
d966045b 12784int
2cf0635d 12785load_debug_section (enum dwarf_section_display_enum debug, void * file)
d966045b 12786{
2cf0635d
NC
12787 struct dwarf_section * section = &debug_displays [debug].section;
12788 Elf_Internal_Shdr * sec;
d966045b
DJ
12789
12790 /* Locate the debug section. */
657d0d47 12791 sec = find_section_in_set (section->uncompressed_name, section_subset);
d966045b
DJ
12792 if (sec != NULL)
12793 section->name = section->uncompressed_name;
12794 else
12795 {
657d0d47 12796 sec = find_section_in_set (section->compressed_name, section_subset);
d966045b
DJ
12797 if (sec != NULL)
12798 section->name = section->compressed_name;
12799 }
12800 if (sec == NULL)
12801 return 0;
12802
657d0d47
CC
12803 /* If we're loading from a subset of sections, and we've loaded
12804 a section matching this name before, it's likely that it's a
12805 different one. */
12806 if (section_subset != NULL)
12807 free_debug_section (debug);
12808
3f5e193b 12809 return load_specific_debug_section (debug, sec, (FILE *) file);
d966045b
DJ
12810}
12811
19e6b90e
L
12812void
12813free_debug_section (enum dwarf_section_display_enum debug)
1007acb3 12814{
2cf0635d 12815 struct dwarf_section * section = &debug_displays [debug].section;
1007acb3 12816
19e6b90e
L
12817 if (section->start == NULL)
12818 return;
1007acb3 12819
19e6b90e
L
12820 free ((char *) section->start);
12821 section->start = NULL;
12822 section->address = 0;
12823 section->size = 0;
1007acb3
L
12824}
12825
1007acb3 12826static int
657d0d47 12827display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
1007acb3 12828{
2cf0635d 12829 char * name = SECTION_NAME (section);
74e1a04b 12830 const char * print_name = printable_section_name (section);
19e6b90e
L
12831 bfd_size_type length;
12832 int result = 1;
3f5e193b 12833 int i;
1007acb3 12834
19e6b90e
L
12835 length = section->sh_size;
12836 if (length == 0)
1007acb3 12837 {
74e1a04b 12838 printf (_("\nSection '%s' has no debugging data.\n"), print_name);
19e6b90e 12839 return 0;
1007acb3 12840 }
5dff79d8
NC
12841 if (section->sh_type == SHT_NOBITS)
12842 {
12843 /* There is no point in dumping the contents of a debugging section
12844 which has the NOBITS type - the bits in the file will be random.
12845 This can happen when a file containing a .eh_frame section is
12846 stripped with the --only-keep-debug command line option. */
74e1a04b
NC
12847 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
12848 print_name);
5dff79d8
NC
12849 return 0;
12850 }
1007acb3 12851
0112cd26 12852 if (const_strneq (name, ".gnu.linkonce.wi."))
19e6b90e 12853 name = ".debug_info";
1007acb3 12854
19e6b90e
L
12855 /* See if we know how to display the contents of this section. */
12856 for (i = 0; i < max; i++)
1b315056 12857 if (streq (debug_displays[i].section.uncompressed_name, name)
b40bf0a2 12858 || (i == line && const_strneq (name, ".debug_line."))
1b315056 12859 || streq (debug_displays[i].section.compressed_name, name))
19e6b90e 12860 {
2cf0635d 12861 struct dwarf_section * sec = &debug_displays [i].section;
d966045b
DJ
12862 int secondary = (section != find_section (name));
12863
12864 if (secondary)
3f5e193b 12865 free_debug_section ((enum dwarf_section_display_enum) i);
1007acb3 12866
b40bf0a2
NC
12867 if (i == line && const_strneq (name, ".debug_line."))
12868 sec->name = name;
12869 else if (streq (sec->uncompressed_name, name))
d966045b
DJ
12870 sec->name = sec->uncompressed_name;
12871 else
12872 sec->name = sec->compressed_name;
3f5e193b
NC
12873 if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
12874 section, file))
19e6b90e 12875 {
657d0d47
CC
12876 /* If this debug section is part of a CU/TU set in a .dwp file,
12877 restrict load_debug_section to the sections in that set. */
12878 section_subset = find_cu_tu_set (file, shndx);
12879
19e6b90e 12880 result &= debug_displays[i].display (sec, file);
1007acb3 12881
657d0d47
CC
12882 section_subset = NULL;
12883
d966045b 12884 if (secondary || (i != info && i != abbrev))
3f5e193b 12885 free_debug_section ((enum dwarf_section_display_enum) i);
19e6b90e 12886 }
1007acb3 12887
19e6b90e
L
12888 break;
12889 }
1007acb3 12890
19e6b90e 12891 if (i == max)
1007acb3 12892 {
74e1a04b 12893 printf (_("Unrecognized debug section: %s\n"), print_name);
19e6b90e 12894 result = 0;
1007acb3
L
12895 }
12896
19e6b90e 12897 return result;
5b18a4bc 12898}
103f02d3 12899
aef1f6d0
DJ
12900/* Set DUMP_SECTS for all sections where dumps were requested
12901 based on section name. */
12902
12903static void
12904initialise_dumps_byname (void)
12905{
2cf0635d 12906 struct dump_list_entry * cur;
aef1f6d0
DJ
12907
12908 for (cur = dump_sects_byname; cur; cur = cur->next)
12909 {
12910 unsigned int i;
12911 int any;
12912
12913 for (i = 0, any = 0; i < elf_header.e_shnum; i++)
12914 if (streq (SECTION_NAME (section_headers + i), cur->name))
12915 {
09c11c86 12916 request_dump_bynumber (i, cur->type);
aef1f6d0
DJ
12917 any = 1;
12918 }
12919
12920 if (!any)
12921 warn (_("Section '%s' was not dumped because it does not exist!\n"),
12922 cur->name);
12923 }
12924}
12925
5b18a4bc 12926static void
2cf0635d 12927process_section_contents (FILE * file)
5b18a4bc 12928{
2cf0635d 12929 Elf_Internal_Shdr * section;
19e6b90e 12930 unsigned int i;
103f02d3 12931
19e6b90e
L
12932 if (! do_dump)
12933 return;
103f02d3 12934
aef1f6d0
DJ
12935 initialise_dumps_byname ();
12936
19e6b90e
L
12937 for (i = 0, section = section_headers;
12938 i < elf_header.e_shnum && i < num_dump_sects;
12939 i++, section++)
12940 {
12941#ifdef SUPPORT_DISASSEMBLY
12942 if (dump_sects[i] & DISASS_DUMP)
12943 disassemble_section (section, file);
12944#endif
12945 if (dump_sects[i] & HEX_DUMP)
cf13d699 12946 dump_section_as_bytes (section, file, FALSE);
103f02d3 12947
cf13d699
NC
12948 if (dump_sects[i] & RELOC_DUMP)
12949 dump_section_as_bytes (section, file, TRUE);
09c11c86
NC
12950
12951 if (dump_sects[i] & STRING_DUMP)
12952 dump_section_as_strings (section, file);
cf13d699
NC
12953
12954 if (dump_sects[i] & DEBUG_DUMP)
657d0d47 12955 display_debug_section (i, section, file);
5b18a4bc 12956 }
103f02d3 12957
19e6b90e
L
12958 /* Check to see if the user requested a
12959 dump of a section that does not exist. */
12960 while (i++ < num_dump_sects)
12961 if (dump_sects[i])
12962 warn (_("Section %d was not dumped because it does not exist!\n"), i);
5b18a4bc 12963}
103f02d3 12964
5b18a4bc 12965static void
19e6b90e 12966process_mips_fpe_exception (int mask)
5b18a4bc 12967{
19e6b90e
L
12968 if (mask)
12969 {
12970 int first = 1;
12971 if (mask & OEX_FPU_INEX)
12972 fputs ("INEX", stdout), first = 0;
12973 if (mask & OEX_FPU_UFLO)
12974 printf ("%sUFLO", first ? "" : "|"), first = 0;
12975 if (mask & OEX_FPU_OFLO)
12976 printf ("%sOFLO", first ? "" : "|"), first = 0;
12977 if (mask & OEX_FPU_DIV0)
12978 printf ("%sDIV0", first ? "" : "|"), first = 0;
12979 if (mask & OEX_FPU_INVAL)
12980 printf ("%sINVAL", first ? "" : "|");
12981 }
5b18a4bc 12982 else
19e6b90e 12983 fputs ("0", stdout);
5b18a4bc 12984}
103f02d3 12985
f6f0e17b
NC
12986/* Display's the value of TAG at location P. If TAG is
12987 greater than 0 it is assumed to be an unknown tag, and
12988 a message is printed to this effect. Otherwise it is
12989 assumed that a message has already been printed.
12990
12991 If the bottom bit of TAG is set it assumed to have a
12992 string value, otherwise it is assumed to have an integer
12993 value.
12994
12995 Returns an updated P pointing to the first unread byte
12996 beyond the end of TAG's value.
12997
12998 Reads at or beyond END will not be made. */
12999
13000static unsigned char *
13001display_tag_value (int tag,
13002 unsigned char * p,
13003 const unsigned char * const end)
13004{
13005 unsigned long val;
13006
13007 if (tag > 0)
13008 printf (" Tag_unknown_%d: ", tag);
13009
13010 if (p >= end)
13011 {
4082ef84 13012 warn (_("<corrupt tag>\n"));
f6f0e17b
NC
13013 }
13014 else if (tag & 1)
13015 {
071436c6
NC
13016 /* PR 17531 file: 027-19978-0.004. */
13017 size_t maxlen = (end - p) - 1;
13018
13019 putchar ('"');
4082ef84
NC
13020 if (maxlen > 0)
13021 {
13022 print_symbol ((int) maxlen, (const char *) p);
13023 p += strnlen ((char *) p, maxlen) + 1;
13024 }
13025 else
13026 {
13027 printf (_("<corrupt string tag>"));
13028 p = (unsigned char *) end;
13029 }
071436c6 13030 printf ("\"\n");
f6f0e17b
NC
13031 }
13032 else
13033 {
13034 unsigned int len;
13035
13036 val = read_uleb128 (p, &len, end);
13037 p += len;
13038 printf ("%ld (0x%lx)\n", val, val);
13039 }
13040
4082ef84 13041 assert (p <= end);
f6f0e17b
NC
13042 return p;
13043}
13044
11c1ff18
PB
13045/* ARM EABI attributes section. */
13046typedef struct
13047{
70e99720 13048 unsigned int tag;
2cf0635d 13049 const char * name;
11c1ff18 13050 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
70e99720 13051 unsigned int type;
2cf0635d 13052 const char ** table;
11c1ff18
PB
13053} arm_attr_public_tag;
13054
2cf0635d 13055static const char * arm_attr_tag_CPU_arch[] =
11c1ff18 13056 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
ff8646ee
TP
13057 "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "", "v8-M.baseline",
13058 "v8-M.mainline"};
2cf0635d
NC
13059static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
13060static const char * arm_attr_tag_THUMB_ISA_use[] =
4ed7ed8d 13061 {"No", "Thumb-1", "Thumb-2", "Yes"};
75375b3e 13062static const char * arm_attr_tag_FP_arch[] =
bca38921 13063 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
a715796b 13064 "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
2cf0635d 13065static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
dd24e3da 13066static const char * arm_attr_tag_Advanced_SIMD_arch[] =
9411fd44
MW
13067 {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
13068 "NEON for ARMv8.1"};
2cf0635d 13069static const char * arm_attr_tag_PCS_config[] =
11c1ff18
PB
13070 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
13071 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
2cf0635d 13072static const char * arm_attr_tag_ABI_PCS_R9_use[] =
11c1ff18 13073 {"V6", "SB", "TLS", "Unused"};
2cf0635d 13074static const char * arm_attr_tag_ABI_PCS_RW_data[] =
11c1ff18 13075 {"Absolute", "PC-relative", "SB-relative", "None"};
2cf0635d 13076static const char * arm_attr_tag_ABI_PCS_RO_data[] =
11c1ff18 13077 {"Absolute", "PC-relative", "None"};
2cf0635d 13078static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
11c1ff18 13079 {"None", "direct", "GOT-indirect"};
2cf0635d 13080static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
11c1ff18 13081 {"None", "??? 1", "2", "??? 3", "4"};
2cf0635d
NC
13082static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
13083static const char * arm_attr_tag_ABI_FP_denormal[] =
f5f53991 13084 {"Unused", "Needed", "Sign only"};
2cf0635d
NC
13085static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
13086static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
13087static const char * arm_attr_tag_ABI_FP_number_model[] =
11c1ff18 13088 {"Unused", "Finite", "RTABI", "IEEE 754"};
2cf0635d 13089static const char * arm_attr_tag_ABI_enum_size[] =
11c1ff18 13090 {"Unused", "small", "int", "forced to int"};
2cf0635d 13091static const char * arm_attr_tag_ABI_HardFP_use[] =
99654aaf 13092 {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
2cf0635d 13093static const char * arm_attr_tag_ABI_VFP_args[] =
5c294fee 13094 {"AAPCS", "VFP registers", "custom", "compatible"};
2cf0635d 13095static const char * arm_attr_tag_ABI_WMMX_args[] =
11c1ff18 13096 {"AAPCS", "WMMX registers", "custom"};
2cf0635d 13097static const char * arm_attr_tag_ABI_optimization_goals[] =
11c1ff18
PB
13098 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
13099 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
2cf0635d 13100static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
11c1ff18
PB
13101 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
13102 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
2cf0635d 13103static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
75375b3e 13104static const char * arm_attr_tag_FP_HP_extension[] =
8e79c3df 13105 {"Not Allowed", "Allowed"};
2cf0635d 13106static const char * arm_attr_tag_ABI_FP_16bit_format[] =
8e79c3df 13107 {"None", "IEEE 754", "Alternative Format"};
15afaa63
TP
13108static const char * arm_attr_tag_DSP_extension[] =
13109 {"Follow architecture", "Allowed"};
dd24e3da 13110static const char * arm_attr_tag_MPextension_use[] =
cd21e546
MGD
13111 {"Not Allowed", "Allowed"};
13112static const char * arm_attr_tag_DIV_use[] =
dd24e3da 13113 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
cd21e546 13114 "Allowed in v7-A with integer division extension"};
2cf0635d
NC
13115static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
13116static const char * arm_attr_tag_Virtualization_use[] =
dd24e3da 13117 {"Not Allowed", "TrustZone", "Virtualization Extensions",
cd21e546 13118 "TrustZone and Virtualization Extensions"};
dd24e3da 13119static const char * arm_attr_tag_MPextension_use_legacy[] =
f5f53991 13120 {"Not Allowed", "Allowed"};
11c1ff18
PB
13121
13122#define LOOKUP(id, name) \
13123 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
d70c5fc7 13124static arm_attr_public_tag arm_attr_public_tags[] =
11c1ff18
PB
13125{
13126 {4, "CPU_raw_name", 1, NULL},
13127 {5, "CPU_name", 1, NULL},
13128 LOOKUP(6, CPU_arch),
13129 {7, "CPU_arch_profile", 0, NULL},
13130 LOOKUP(8, ARM_ISA_use),
13131 LOOKUP(9, THUMB_ISA_use),
75375b3e 13132 LOOKUP(10, FP_arch),
11c1ff18 13133 LOOKUP(11, WMMX_arch),
f5f53991
AS
13134 LOOKUP(12, Advanced_SIMD_arch),
13135 LOOKUP(13, PCS_config),
11c1ff18
PB
13136 LOOKUP(14, ABI_PCS_R9_use),
13137 LOOKUP(15, ABI_PCS_RW_data),
f5f53991 13138 LOOKUP(16, ABI_PCS_RO_data),
11c1ff18
PB
13139 LOOKUP(17, ABI_PCS_GOT_use),
13140 LOOKUP(18, ABI_PCS_wchar_t),
13141 LOOKUP(19, ABI_FP_rounding),
13142 LOOKUP(20, ABI_FP_denormal),
13143 LOOKUP(21, ABI_FP_exceptions),
13144 LOOKUP(22, ABI_FP_user_exceptions),
13145 LOOKUP(23, ABI_FP_number_model),
75375b3e
MGD
13146 {24, "ABI_align_needed", 0, NULL},
13147 {25, "ABI_align_preserved", 0, NULL},
11c1ff18
PB
13148 LOOKUP(26, ABI_enum_size),
13149 LOOKUP(27, ABI_HardFP_use),
13150 LOOKUP(28, ABI_VFP_args),
13151 LOOKUP(29, ABI_WMMX_args),
13152 LOOKUP(30, ABI_optimization_goals),
13153 LOOKUP(31, ABI_FP_optimization_goals),
8e79c3df 13154 {32, "compatibility", 0, NULL},
f5f53991 13155 LOOKUP(34, CPU_unaligned_access),
75375b3e 13156 LOOKUP(36, FP_HP_extension),
8e79c3df 13157 LOOKUP(38, ABI_FP_16bit_format),
cd21e546
MGD
13158 LOOKUP(42, MPextension_use),
13159 LOOKUP(44, DIV_use),
15afaa63 13160 LOOKUP(46, DSP_extension),
f5f53991
AS
13161 {64, "nodefaults", 0, NULL},
13162 {65, "also_compatible_with", 0, NULL},
13163 LOOKUP(66, T2EE_use),
13164 {67, "conformance", 1, NULL},
13165 LOOKUP(68, Virtualization_use),
cd21e546 13166 LOOKUP(70, MPextension_use_legacy)
11c1ff18
PB
13167};
13168#undef LOOKUP
13169
11c1ff18 13170static unsigned char *
f6f0e17b
NC
13171display_arm_attribute (unsigned char * p,
13172 const unsigned char * const end)
11c1ff18 13173{
70e99720 13174 unsigned int tag;
11c1ff18 13175 unsigned int len;
70e99720 13176 unsigned int val;
2cf0635d 13177 arm_attr_public_tag * attr;
11c1ff18 13178 unsigned i;
70e99720 13179 unsigned int type;
11c1ff18 13180
f6f0e17b 13181 tag = read_uleb128 (p, &len, end);
11c1ff18
PB
13182 p += len;
13183 attr = NULL;
2cf0635d 13184 for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
11c1ff18
PB
13185 {
13186 if (arm_attr_public_tags[i].tag == tag)
13187 {
13188 attr = &arm_attr_public_tags[i];
13189 break;
13190 }
13191 }
13192
13193 if (attr)
13194 {
13195 printf (" Tag_%s: ", attr->name);
13196 switch (attr->type)
13197 {
13198 case 0:
13199 switch (tag)
13200 {
13201 case 7: /* Tag_CPU_arch_profile. */
f6f0e17b 13202 val = read_uleb128 (p, &len, end);
11c1ff18
PB
13203 p += len;
13204 switch (val)
13205 {
2b692964
NC
13206 case 0: printf (_("None\n")); break;
13207 case 'A': printf (_("Application\n")); break;
13208 case 'R': printf (_("Realtime\n")); break;
13209 case 'M': printf (_("Microcontroller\n")); break;
13210 case 'S': printf (_("Application or Realtime\n")); break;
11c1ff18
PB
13211 default: printf ("??? (%d)\n", val); break;
13212 }
13213 break;
13214
75375b3e 13215 case 24: /* Tag_align_needed. */
f6f0e17b 13216 val = read_uleb128 (p, &len, end);
75375b3e
MGD
13217 p += len;
13218 switch (val)
13219 {
2b692964
NC
13220 case 0: printf (_("None\n")); break;
13221 case 1: printf (_("8-byte\n")); break;
13222 case 2: printf (_("4-byte\n")); break;
75375b3e
MGD
13223 case 3: printf ("??? 3\n"); break;
13224 default:
13225 if (val <= 12)
dd24e3da 13226 printf (_("8-byte and up to %d-byte extended\n"),
75375b3e
MGD
13227 1 << val);
13228 else
13229 printf ("??? (%d)\n", val);
13230 break;
13231 }
13232 break;
13233
13234 case 25: /* Tag_align_preserved. */
f6f0e17b 13235 val = read_uleb128 (p, &len, end);
75375b3e
MGD
13236 p += len;
13237 switch (val)
13238 {
2b692964
NC
13239 case 0: printf (_("None\n")); break;
13240 case 1: printf (_("8-byte, except leaf SP\n")); break;
13241 case 2: printf (_("8-byte\n")); break;
75375b3e
MGD
13242 case 3: printf ("??? 3\n"); break;
13243 default:
13244 if (val <= 12)
dd24e3da 13245 printf (_("8-byte and up to %d-byte extended\n"),
75375b3e
MGD
13246 1 << val);
13247 else
13248 printf ("??? (%d)\n", val);
13249 break;
13250 }
13251 break;
13252
11c1ff18 13253 case 32: /* Tag_compatibility. */
071436c6 13254 {
071436c6
NC
13255 val = read_uleb128 (p, &len, end);
13256 p += len;
071436c6 13257 printf (_("flag = %d, vendor = "), val);
4082ef84
NC
13258 if (p < end - 1)
13259 {
13260 size_t maxlen = (end - p) - 1;
13261
13262 print_symbol ((int) maxlen, (const char *) p);
13263 p += strnlen ((char *) p, maxlen) + 1;
13264 }
13265 else
13266 {
13267 printf (_("<corrupt>"));
13268 p = (unsigned char *) end;
13269 }
071436c6 13270 putchar ('\n');
071436c6 13271 }
11c1ff18
PB
13272 break;
13273
f5f53991 13274 case 64: /* Tag_nodefaults. */
541a3cbd
NC
13275 /* PR 17531: file: 001-505008-0.01. */
13276 if (p < end)
13277 p++;
2b692964 13278 printf (_("True\n"));
f5f53991
AS
13279 break;
13280
13281 case 65: /* Tag_also_compatible_with. */
f6f0e17b 13282 val = read_uleb128 (p, &len, end);
f5f53991
AS
13283 p += len;
13284 if (val == 6 /* Tag_CPU_arch. */)
13285 {
f6f0e17b 13286 val = read_uleb128 (p, &len, end);
f5f53991 13287 p += len;
071436c6 13288 if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
f5f53991
AS
13289 printf ("??? (%d)\n", val);
13290 else
13291 printf ("%s\n", arm_attr_tag_CPU_arch[val]);
13292 }
13293 else
13294 printf ("???\n");
071436c6
NC
13295 while (p < end && *(p++) != '\0' /* NUL terminator. */)
13296 ;
f5f53991
AS
13297 break;
13298
11c1ff18 13299 default:
bee0ee85
NC
13300 printf (_("<unknown: %d>\n"), tag);
13301 break;
11c1ff18
PB
13302 }
13303 return p;
13304
13305 case 1:
f6f0e17b 13306 return display_tag_value (-1, p, end);
11c1ff18 13307 case 2:
f6f0e17b 13308 return display_tag_value (0, p, end);
11c1ff18
PB
13309
13310 default:
13311 assert (attr->type & 0x80);
f6f0e17b 13312 val = read_uleb128 (p, &len, end);
11c1ff18
PB
13313 p += len;
13314 type = attr->type & 0x7f;
13315 if (val >= type)
13316 printf ("??? (%d)\n", val);
13317 else
13318 printf ("%s\n", attr->table[val]);
13319 return p;
13320 }
13321 }
11c1ff18 13322
f6f0e17b 13323 return display_tag_value (tag, p, end);
11c1ff18
PB
13324}
13325
104d59d1 13326static unsigned char *
60bca95a 13327display_gnu_attribute (unsigned char * p,
f6f0e17b
NC
13328 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const),
13329 const unsigned char * const end)
104d59d1
JM
13330{
13331 int tag;
13332 unsigned int len;
13333 int val;
104d59d1 13334
f6f0e17b 13335 tag = read_uleb128 (p, &len, end);
104d59d1
JM
13336 p += len;
13337
13338 /* Tag_compatibility is the only generic GNU attribute defined at
13339 present. */
13340 if (tag == 32)
13341 {
f6f0e17b 13342 val = read_uleb128 (p, &len, end);
104d59d1 13343 p += len;
071436c6
NC
13344
13345 printf (_("flag = %d, vendor = "), val);
f6f0e17b
NC
13346 if (p == end)
13347 {
071436c6 13348 printf (_("<corrupt>\n"));
f6f0e17b
NC
13349 warn (_("corrupt vendor attribute\n"));
13350 }
13351 else
13352 {
4082ef84
NC
13353 if (p < end - 1)
13354 {
13355 size_t maxlen = (end - p) - 1;
071436c6 13356
4082ef84
NC
13357 print_symbol ((int) maxlen, (const char *) p);
13358 p += strnlen ((char *) p, maxlen) + 1;
13359 }
13360 else
13361 {
13362 printf (_("<corrupt>"));
13363 p = (unsigned char *) end;
13364 }
071436c6 13365 putchar ('\n');
f6f0e17b 13366 }
104d59d1
JM
13367 return p;
13368 }
13369
13370 if ((tag & 2) == 0 && display_proc_gnu_attribute)
f6f0e17b 13371 return display_proc_gnu_attribute (p, tag, end);
104d59d1 13372
f6f0e17b 13373 return display_tag_value (tag, p, end);
104d59d1
JM
13374}
13375
34c8bcba 13376static unsigned char *
f6f0e17b
NC
13377display_power_gnu_attribute (unsigned char * p,
13378 int tag,
13379 const unsigned char * const end)
34c8bcba 13380{
34c8bcba
JM
13381 unsigned int len;
13382 int val;
13383
13384 if (tag == Tag_GNU_Power_ABI_FP)
13385 {
f6f0e17b 13386 val = read_uleb128 (p, &len, end);
34c8bcba
JM
13387 p += len;
13388 printf (" Tag_GNU_Power_ABI_FP: ");
60bca95a 13389
34c8bcba
JM
13390 switch (val)
13391 {
13392 case 0:
2b692964 13393 printf (_("Hard or soft float\n"));
34c8bcba
JM
13394 break;
13395 case 1:
2b692964 13396 printf (_("Hard float\n"));
34c8bcba
JM
13397 break;
13398 case 2:
2b692964 13399 printf (_("Soft float\n"));
34c8bcba 13400 break;
3c7b9897 13401 case 3:
2b692964 13402 printf (_("Single-precision hard float\n"));
3c7b9897 13403 break;
34c8bcba
JM
13404 default:
13405 printf ("??? (%d)\n", val);
13406 break;
13407 }
13408 return p;
13409 }
13410
c6e65352
DJ
13411 if (tag == Tag_GNU_Power_ABI_Vector)
13412 {
f6f0e17b 13413 val = read_uleb128 (p, &len, end);
c6e65352
DJ
13414 p += len;
13415 printf (" Tag_GNU_Power_ABI_Vector: ");
13416 switch (val)
13417 {
13418 case 0:
2b692964 13419 printf (_("Any\n"));
c6e65352
DJ
13420 break;
13421 case 1:
2b692964 13422 printf (_("Generic\n"));
c6e65352
DJ
13423 break;
13424 case 2:
13425 printf ("AltiVec\n");
13426 break;
13427 case 3:
13428 printf ("SPE\n");
13429 break;
13430 default:
13431 printf ("??? (%d)\n", val);
13432 break;
13433 }
13434 return p;
13435 }
13436
f82e0623
NF
13437 if (tag == Tag_GNU_Power_ABI_Struct_Return)
13438 {
f6f0e17b
NC
13439 if (p == end)
13440 {
071436c6 13441 warn (_("corrupt Tag_GNU_Power_ABI_Struct_Return\n"));
f6f0e17b
NC
13442 return p;
13443 }
0b4362b0 13444
f6f0e17b 13445 val = read_uleb128 (p, &len, end);
f82e0623
NF
13446 p += len;
13447 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
13448 switch (val)
13449 {
13450 case 0:
2b692964 13451 printf (_("Any\n"));
f82e0623
NF
13452 break;
13453 case 1:
13454 printf ("r3/r4\n");
13455 break;
13456 case 2:
2b692964 13457 printf (_("Memory\n"));
f82e0623
NF
13458 break;
13459 default:
13460 printf ("??? (%d)\n", val);
13461 break;
13462 }
13463 return p;
13464 }
13465
f6f0e17b 13466 return display_tag_value (tag & 1, p, end);
34c8bcba
JM
13467}
13468
643f7afb
AK
13469static unsigned char *
13470display_s390_gnu_attribute (unsigned char * p,
13471 int tag,
13472 const unsigned char * const end)
13473{
13474 unsigned int len;
13475 int val;
13476
13477 if (tag == Tag_GNU_S390_ABI_Vector)
13478 {
13479 val = read_uleb128 (p, &len, end);
13480 p += len;
13481 printf (" Tag_GNU_S390_ABI_Vector: ");
13482
13483 switch (val)
13484 {
13485 case 0:
13486 printf (_("any\n"));
13487 break;
13488 case 1:
13489 printf (_("software\n"));
13490 break;
13491 case 2:
13492 printf (_("hardware\n"));
13493 break;
13494 default:
13495 printf ("??? (%d)\n", val);
13496 break;
13497 }
13498 return p;
13499 }
13500
13501 return display_tag_value (tag & 1, p, end);
13502}
13503
9e8c70f9
DM
13504static void
13505display_sparc_hwcaps (int mask)
13506{
13507 if (mask)
13508 {
13509 int first = 1;
071436c6 13510
9e8c70f9
DM
13511 if (mask & ELF_SPARC_HWCAP_MUL32)
13512 fputs ("mul32", stdout), first = 0;
13513 if (mask & ELF_SPARC_HWCAP_DIV32)
13514 printf ("%sdiv32", first ? "" : "|"), first = 0;
13515 if (mask & ELF_SPARC_HWCAP_FSMULD)
13516 printf ("%sfsmuld", first ? "" : "|"), first = 0;
13517 if (mask & ELF_SPARC_HWCAP_V8PLUS)
13518 printf ("%sv8plus", first ? "" : "|"), first = 0;
13519 if (mask & ELF_SPARC_HWCAP_POPC)
13520 printf ("%spopc", first ? "" : "|"), first = 0;
13521 if (mask & ELF_SPARC_HWCAP_VIS)
13522 printf ("%svis", first ? "" : "|"), first = 0;
13523 if (mask & ELF_SPARC_HWCAP_VIS2)
13524 printf ("%svis2", first ? "" : "|"), first = 0;
13525 if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
13526 printf ("%sASIBlkInit", first ? "" : "|"), first = 0;
13527 if (mask & ELF_SPARC_HWCAP_FMAF)
13528 printf ("%sfmaf", first ? "" : "|"), first = 0;
13529 if (mask & ELF_SPARC_HWCAP_VIS3)
13530 printf ("%svis3", first ? "" : "|"), first = 0;
13531 if (mask & ELF_SPARC_HWCAP_HPC)
13532 printf ("%shpc", first ? "" : "|"), first = 0;
13533 if (mask & ELF_SPARC_HWCAP_RANDOM)
13534 printf ("%srandom", first ? "" : "|"), first = 0;
13535 if (mask & ELF_SPARC_HWCAP_TRANS)
13536 printf ("%strans", first ? "" : "|"), first = 0;
13537 if (mask & ELF_SPARC_HWCAP_FJFMAU)
13538 printf ("%sfjfmau", first ? "" : "|"), first = 0;
13539 if (mask & ELF_SPARC_HWCAP_IMA)
13540 printf ("%sima", first ? "" : "|"), first = 0;
13541 if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
13542 printf ("%scspare", first ? "" : "|"), first = 0;
13543 }
13544 else
071436c6
NC
13545 fputc ('0', stdout);
13546 fputc ('\n', stdout);
9e8c70f9
DM
13547}
13548
3d68f91c
JM
13549static void
13550display_sparc_hwcaps2 (int mask)
13551{
13552 if (mask)
13553 {
13554 int first = 1;
071436c6 13555
3d68f91c
JM
13556 if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
13557 fputs ("fjathplus", stdout), first = 0;
13558 if (mask & ELF_SPARC_HWCAP2_VIS3B)
13559 printf ("%svis3b", first ? "" : "|"), first = 0;
13560 if (mask & ELF_SPARC_HWCAP2_ADP)
13561 printf ("%sadp", first ? "" : "|"), first = 0;
13562 if (mask & ELF_SPARC_HWCAP2_SPARC5)
13563 printf ("%ssparc5", first ? "" : "|"), first = 0;
13564 if (mask & ELF_SPARC_HWCAP2_MWAIT)
13565 printf ("%smwait", first ? "" : "|"), first = 0;
13566 if (mask & ELF_SPARC_HWCAP2_XMPMUL)
13567 printf ("%sxmpmul", first ? "" : "|"), first = 0;
13568 if (mask & ELF_SPARC_HWCAP2_XMONT)
13569 printf ("%sxmont2", first ? "" : "|"), first = 0;
13570 if (mask & ELF_SPARC_HWCAP2_NSEC)
13571 printf ("%snsec", first ? "" : "|"), first = 0;
13572 if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
13573 printf ("%sfjathhpc", first ? "" : "|"), first = 0;
13574 if (mask & ELF_SPARC_HWCAP2_FJDES)
13575 printf ("%sfjdes", first ? "" : "|"), first = 0;
13576 if (mask & ELF_SPARC_HWCAP2_FJAES)
13577 printf ("%sfjaes", first ? "" : "|"), first = 0;
13578 }
13579 else
071436c6
NC
13580 fputc ('0', stdout);
13581 fputc ('\n', stdout);
3d68f91c
JM
13582}
13583
9e8c70f9 13584static unsigned char *
f6f0e17b
NC
13585display_sparc_gnu_attribute (unsigned char * p,
13586 int tag,
13587 const unsigned char * const end)
9e8c70f9 13588{
3d68f91c
JM
13589 unsigned int len;
13590 int val;
13591
9e8c70f9
DM
13592 if (tag == Tag_GNU_Sparc_HWCAPS)
13593 {
f6f0e17b 13594 val = read_uleb128 (p, &len, end);
9e8c70f9
DM
13595 p += len;
13596 printf (" Tag_GNU_Sparc_HWCAPS: ");
9e8c70f9
DM
13597 display_sparc_hwcaps (val);
13598 return p;
3d68f91c
JM
13599 }
13600 if (tag == Tag_GNU_Sparc_HWCAPS2)
13601 {
13602 val = read_uleb128 (p, &len, end);
13603 p += len;
13604 printf (" Tag_GNU_Sparc_HWCAPS2: ");
13605 display_sparc_hwcaps2 (val);
13606 return p;
13607 }
9e8c70f9 13608
f6f0e17b 13609 return display_tag_value (tag, p, end);
9e8c70f9
DM
13610}
13611
351cdf24
MF
13612static void
13613print_mips_fp_abi_value (int val)
13614{
13615 switch (val)
13616 {
13617 case Val_GNU_MIPS_ABI_FP_ANY:
13618 printf (_("Hard or soft float\n"));
13619 break;
13620 case Val_GNU_MIPS_ABI_FP_DOUBLE:
13621 printf (_("Hard float (double precision)\n"));
13622 break;
13623 case Val_GNU_MIPS_ABI_FP_SINGLE:
13624 printf (_("Hard float (single precision)\n"));
13625 break;
13626 case Val_GNU_MIPS_ABI_FP_SOFT:
13627 printf (_("Soft float\n"));
13628 break;
13629 case Val_GNU_MIPS_ABI_FP_OLD_64:
13630 printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
13631 break;
13632 case Val_GNU_MIPS_ABI_FP_XX:
13633 printf (_("Hard float (32-bit CPU, Any FPU)\n"));
13634 break;
13635 case Val_GNU_MIPS_ABI_FP_64:
13636 printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
13637 break;
13638 case Val_GNU_MIPS_ABI_FP_64A:
13639 printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
13640 break;
3350cc01
CM
13641 case Val_GNU_MIPS_ABI_FP_NAN2008:
13642 printf (_("NaN 2008 compatibility\n"));
13643 break;
351cdf24
MF
13644 default:
13645 printf ("??? (%d)\n", val);
13646 break;
13647 }
13648}
13649
2cf19d5c 13650static unsigned char *
f6f0e17b
NC
13651display_mips_gnu_attribute (unsigned char * p,
13652 int tag,
13653 const unsigned char * const end)
2cf19d5c 13654{
2cf19d5c
JM
13655 if (tag == Tag_GNU_MIPS_ABI_FP)
13656 {
f6f0e17b
NC
13657 unsigned int len;
13658 int val;
13659
13660 val = read_uleb128 (p, &len, end);
2cf19d5c
JM
13661 p += len;
13662 printf (" Tag_GNU_MIPS_ABI_FP: ");
60bca95a 13663
351cdf24
MF
13664 print_mips_fp_abi_value (val);
13665
2cf19d5c
JM
13666 return p;
13667 }
13668
a9f58168
CF
13669 if (tag == Tag_GNU_MIPS_ABI_MSA)
13670 {
13671 unsigned int len;
13672 int val;
13673
13674 val = read_uleb128 (p, &len, end);
13675 p += len;
13676 printf (" Tag_GNU_MIPS_ABI_MSA: ");
13677
13678 switch (val)
13679 {
13680 case Val_GNU_MIPS_ABI_MSA_ANY:
13681 printf (_("Any MSA or not\n"));
13682 break;
13683 case Val_GNU_MIPS_ABI_MSA_128:
13684 printf (_("128-bit MSA\n"));
13685 break;
13686 default:
13687 printf ("??? (%d)\n", val);
13688 break;
13689 }
13690 return p;
13691 }
13692
f6f0e17b 13693 return display_tag_value (tag & 1, p, end);
2cf19d5c
JM
13694}
13695
59e6276b 13696static unsigned char *
f6f0e17b
NC
13697display_tic6x_attribute (unsigned char * p,
13698 const unsigned char * const end)
59e6276b
JM
13699{
13700 int tag;
13701 unsigned int len;
13702 int val;
13703
f6f0e17b 13704 tag = read_uleb128 (p, &len, end);
59e6276b
JM
13705 p += len;
13706
13707 switch (tag)
13708 {
75fa6dc1 13709 case Tag_ISA:
f6f0e17b 13710 val = read_uleb128 (p, &len, end);
59e6276b 13711 p += len;
75fa6dc1 13712 printf (" Tag_ISA: ");
59e6276b
JM
13713
13714 switch (val)
13715 {
75fa6dc1 13716 case C6XABI_Tag_ISA_none:
59e6276b
JM
13717 printf (_("None\n"));
13718 break;
75fa6dc1 13719 case C6XABI_Tag_ISA_C62X:
59e6276b
JM
13720 printf ("C62x\n");
13721 break;
75fa6dc1 13722 case C6XABI_Tag_ISA_C67X:
59e6276b
JM
13723 printf ("C67x\n");
13724 break;
75fa6dc1 13725 case C6XABI_Tag_ISA_C67XP:
59e6276b
JM
13726 printf ("C67x+\n");
13727 break;
75fa6dc1 13728 case C6XABI_Tag_ISA_C64X:
59e6276b
JM
13729 printf ("C64x\n");
13730 break;
75fa6dc1 13731 case C6XABI_Tag_ISA_C64XP:
59e6276b
JM
13732 printf ("C64x+\n");
13733 break;
75fa6dc1 13734 case C6XABI_Tag_ISA_C674X:
59e6276b
JM
13735 printf ("C674x\n");
13736 break;
13737 default:
13738 printf ("??? (%d)\n", val);
13739 break;
13740 }
13741 return p;
13742
87779176 13743 case Tag_ABI_wchar_t:
f6f0e17b 13744 val = read_uleb128 (p, &len, end);
87779176
JM
13745 p += len;
13746 printf (" Tag_ABI_wchar_t: ");
13747 switch (val)
13748 {
13749 case 0:
13750 printf (_("Not used\n"));
13751 break;
13752 case 1:
13753 printf (_("2 bytes\n"));
13754 break;
13755 case 2:
13756 printf (_("4 bytes\n"));
13757 break;
13758 default:
13759 printf ("??? (%d)\n", val);
13760 break;
13761 }
13762 return p;
13763
13764 case Tag_ABI_stack_align_needed:
f6f0e17b 13765 val = read_uleb128 (p, &len, end);
87779176
JM
13766 p += len;
13767 printf (" Tag_ABI_stack_align_needed: ");
13768 switch (val)
13769 {
13770 case 0:
13771 printf (_("8-byte\n"));
13772 break;
13773 case 1:
13774 printf (_("16-byte\n"));
13775 break;
13776 default:
13777 printf ("??? (%d)\n", val);
13778 break;
13779 }
13780 return p;
13781
13782 case Tag_ABI_stack_align_preserved:
f6f0e17b 13783 val = read_uleb128 (p, &len, end);
87779176
JM
13784 p += len;
13785 printf (" Tag_ABI_stack_align_preserved: ");
13786 switch (val)
13787 {
13788 case 0:
13789 printf (_("8-byte\n"));
13790 break;
13791 case 1:
13792 printf (_("16-byte\n"));
13793 break;
13794 default:
13795 printf ("??? (%d)\n", val);
13796 break;
13797 }
13798 return p;
13799
b5593623 13800 case Tag_ABI_DSBT:
f6f0e17b 13801 val = read_uleb128 (p, &len, end);
b5593623
JM
13802 p += len;
13803 printf (" Tag_ABI_DSBT: ");
13804 switch (val)
13805 {
13806 case 0:
13807 printf (_("DSBT addressing not used\n"));
13808 break;
13809 case 1:
13810 printf (_("DSBT addressing used\n"));
13811 break;
13812 default:
13813 printf ("??? (%d)\n", val);
13814 break;
13815 }
13816 return p;
13817
87779176 13818 case Tag_ABI_PID:
f6f0e17b 13819 val = read_uleb128 (p, &len, end);
87779176
JM
13820 p += len;
13821 printf (" Tag_ABI_PID: ");
13822 switch (val)
13823 {
13824 case 0:
13825 printf (_("Data addressing position-dependent\n"));
13826 break;
13827 case 1:
13828 printf (_("Data addressing position-independent, GOT near DP\n"));
13829 break;
13830 case 2:
13831 printf (_("Data addressing position-independent, GOT far from DP\n"));
13832 break;
13833 default:
13834 printf ("??? (%d)\n", val);
13835 break;
13836 }
13837 return p;
13838
13839 case Tag_ABI_PIC:
f6f0e17b 13840 val = read_uleb128 (p, &len, end);
87779176
JM
13841 p += len;
13842 printf (" Tag_ABI_PIC: ");
13843 switch (val)
13844 {
13845 case 0:
13846 printf (_("Code addressing position-dependent\n"));
13847 break;
13848 case 1:
13849 printf (_("Code addressing position-independent\n"));
13850 break;
13851 default:
13852 printf ("??? (%d)\n", val);
13853 break;
13854 }
13855 return p;
13856
13857 case Tag_ABI_array_object_alignment:
f6f0e17b 13858 val = read_uleb128 (p, &len, end);
87779176
JM
13859 p += len;
13860 printf (" Tag_ABI_array_object_alignment: ");
13861 switch (val)
13862 {
13863 case 0:
13864 printf (_("8-byte\n"));
13865 break;
13866 case 1:
13867 printf (_("4-byte\n"));
13868 break;
13869 case 2:
13870 printf (_("16-byte\n"));
13871 break;
13872 default:
13873 printf ("??? (%d)\n", val);
13874 break;
13875 }
13876 return p;
13877
13878 case Tag_ABI_array_object_align_expected:
f6f0e17b 13879 val = read_uleb128 (p, &len, end);
87779176
JM
13880 p += len;
13881 printf (" Tag_ABI_array_object_align_expected: ");
13882 switch (val)
13883 {
13884 case 0:
13885 printf (_("8-byte\n"));
13886 break;
13887 case 1:
13888 printf (_("4-byte\n"));
13889 break;
13890 case 2:
13891 printf (_("16-byte\n"));
13892 break;
13893 default:
13894 printf ("??? (%d)\n", val);
13895 break;
13896 }
13897 return p;
13898
3cbd1c06 13899 case Tag_ABI_compatibility:
071436c6 13900 {
071436c6
NC
13901 val = read_uleb128 (p, &len, end);
13902 p += len;
13903 printf (" Tag_ABI_compatibility: ");
071436c6 13904 printf (_("flag = %d, vendor = "), val);
4082ef84
NC
13905 if (p < end - 1)
13906 {
13907 size_t maxlen = (end - p) - 1;
13908
13909 print_symbol ((int) maxlen, (const char *) p);
13910 p += strnlen ((char *) p, maxlen) + 1;
13911 }
13912 else
13913 {
13914 printf (_("<corrupt>"));
13915 p = (unsigned char *) end;
13916 }
071436c6 13917 putchar ('\n');
071436c6
NC
13918 return p;
13919 }
87779176
JM
13920
13921 case Tag_ABI_conformance:
071436c6 13922 {
4082ef84
NC
13923 printf (" Tag_ABI_conformance: \"");
13924 if (p < end - 1)
13925 {
13926 size_t maxlen = (end - p) - 1;
071436c6 13927
4082ef84
NC
13928 print_symbol ((int) maxlen, (const char *) p);
13929 p += strnlen ((char *) p, maxlen) + 1;
13930 }
13931 else
13932 {
13933 printf (_("<corrupt>"));
13934 p = (unsigned char *) end;
13935 }
071436c6 13936 printf ("\"\n");
071436c6
NC
13937 return p;
13938 }
59e6276b
JM
13939 }
13940
f6f0e17b
NC
13941 return display_tag_value (tag, p, end);
13942}
59e6276b 13943
f6f0e17b
NC
13944static void
13945display_raw_attribute (unsigned char * p, unsigned char * end)
13946{
13947 unsigned long addr = 0;
13948 size_t bytes = end - p;
13949
e0a31db1 13950 assert (end > p);
f6f0e17b 13951 while (bytes)
87779176 13952 {
f6f0e17b
NC
13953 int j;
13954 int k;
13955 int lbytes = (bytes > 16 ? 16 : bytes);
13956
13957 printf (" 0x%8.8lx ", addr);
13958
13959 for (j = 0; j < 16; j++)
13960 {
13961 if (j < lbytes)
13962 printf ("%2.2x", p[j]);
13963 else
13964 printf (" ");
13965
13966 if ((j & 3) == 3)
13967 printf (" ");
13968 }
13969
13970 for (j = 0; j < lbytes; j++)
13971 {
13972 k = p[j];
13973 if (k >= ' ' && k < 0x7f)
13974 printf ("%c", k);
13975 else
13976 printf (".");
13977 }
13978
13979 putchar ('\n');
13980
13981 p += lbytes;
13982 bytes -= lbytes;
13983 addr += lbytes;
87779176 13984 }
59e6276b 13985
f6f0e17b 13986 putchar ('\n');
59e6276b
JM
13987}
13988
13761a11
NC
13989static unsigned char *
13990display_msp430x_attribute (unsigned char * p,
13991 const unsigned char * const end)
13992{
13993 unsigned int len;
13994 int val;
13995 int tag;
13996
13997 tag = read_uleb128 (p, & len, end);
13998 p += len;
0b4362b0 13999
13761a11
NC
14000 switch (tag)
14001 {
14002 case OFBA_MSPABI_Tag_ISA:
14003 val = read_uleb128 (p, &len, end);
14004 p += len;
14005 printf (" Tag_ISA: ");
14006 switch (val)
14007 {
14008 case 0: printf (_("None\n")); break;
14009 case 1: printf (_("MSP430\n")); break;
14010 case 2: printf (_("MSP430X\n")); break;
14011 default: printf ("??? (%d)\n", val); break;
14012 }
14013 break;
14014
14015 case OFBA_MSPABI_Tag_Code_Model:
14016 val = read_uleb128 (p, &len, end);
14017 p += len;
14018 printf (" Tag_Code_Model: ");
14019 switch (val)
14020 {
14021 case 0: printf (_("None\n")); break;
14022 case 1: printf (_("Small\n")); break;
14023 case 2: printf (_("Large\n")); break;
14024 default: printf ("??? (%d)\n", val); break;
14025 }
14026 break;
14027
14028 case OFBA_MSPABI_Tag_Data_Model:
14029 val = read_uleb128 (p, &len, end);
14030 p += len;
14031 printf (" Tag_Data_Model: ");
14032 switch (val)
14033 {
14034 case 0: printf (_("None\n")); break;
14035 case 1: printf (_("Small\n")); break;
14036 case 2: printf (_("Large\n")); break;
14037 case 3: printf (_("Restricted Large\n")); break;
14038 default: printf ("??? (%d)\n", val); break;
14039 }
14040 break;
14041
14042 default:
14043 printf (_(" <unknown tag %d>: "), tag);
14044
14045 if (tag & 1)
14046 {
071436c6 14047 putchar ('"');
4082ef84
NC
14048 if (p < end - 1)
14049 {
14050 size_t maxlen = (end - p) - 1;
14051
14052 print_symbol ((int) maxlen, (const char *) p);
14053 p += strnlen ((char *) p, maxlen) + 1;
14054 }
14055 else
14056 {
14057 printf (_("<corrupt>"));
14058 p = (unsigned char *) end;
14059 }
071436c6 14060 printf ("\"\n");
13761a11
NC
14061 }
14062 else
14063 {
14064 val = read_uleb128 (p, &len, end);
14065 p += len;
14066 printf ("%d (0x%x)\n", val, val);
14067 }
14068 break;
14069 }
14070
4082ef84 14071 assert (p <= end);
13761a11
NC
14072 return p;
14073}
14074
11c1ff18 14075static int
60bca95a
NC
14076process_attributes (FILE * file,
14077 const char * public_name,
104d59d1 14078 unsigned int proc_type,
f6f0e17b
NC
14079 unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
14080 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const))
11c1ff18 14081{
2cf0635d 14082 Elf_Internal_Shdr * sect;
11c1ff18
PB
14083 unsigned i;
14084
14085 /* Find the section header so that we get the size. */
14086 for (i = 0, sect = section_headers;
14087 i < elf_header.e_shnum;
14088 i++, sect++)
14089 {
071436c6
NC
14090 unsigned char * contents;
14091 unsigned char * p;
14092
104d59d1 14093 if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
11c1ff18
PB
14094 continue;
14095
3f5e193b
NC
14096 contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
14097 sect->sh_size, _("attributes"));
60bca95a 14098 if (contents == NULL)
11c1ff18 14099 continue;
60bca95a 14100
11c1ff18
PB
14101 p = contents;
14102 if (*p == 'A')
14103 {
071436c6
NC
14104 bfd_vma section_len;
14105
14106 section_len = sect->sh_size - 1;
11c1ff18 14107 p++;
60bca95a 14108
071436c6 14109 while (section_len > 0)
11c1ff18 14110 {
071436c6 14111 bfd_vma attr_len;
e9847026 14112 unsigned int namelen;
11c1ff18 14113 bfd_boolean public_section;
104d59d1 14114 bfd_boolean gnu_section;
11c1ff18 14115
071436c6 14116 if (section_len <= 4)
e0a31db1
NC
14117 {
14118 error (_("Tag section ends prematurely\n"));
14119 break;
14120 }
071436c6 14121 attr_len = byte_get (p, 4);
11c1ff18 14122 p += 4;
60bca95a 14123
071436c6 14124 if (attr_len > section_len)
11c1ff18 14125 {
071436c6
NC
14126 error (_("Bad attribute length (%u > %u)\n"),
14127 (unsigned) attr_len, (unsigned) section_len);
14128 attr_len = section_len;
11c1ff18 14129 }
74e1a04b 14130 /* PR 17531: file: 001-101425-0.004 */
071436c6 14131 else if (attr_len < 5)
74e1a04b 14132 {
071436c6 14133 error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
74e1a04b
NC
14134 break;
14135 }
e9847026 14136
071436c6
NC
14137 section_len -= attr_len;
14138 attr_len -= 4;
14139
14140 namelen = strnlen ((char *) p, attr_len) + 1;
14141 if (namelen == 0 || namelen >= attr_len)
e9847026
NC
14142 {
14143 error (_("Corrupt attribute section name\n"));
14144 break;
14145 }
14146
071436c6
NC
14147 printf (_("Attribute Section: "));
14148 print_symbol (INT_MAX, (const char *) p);
14149 putchar ('\n');
60bca95a
NC
14150
14151 if (public_name && streq ((char *) p, public_name))
11c1ff18
PB
14152 public_section = TRUE;
14153 else
14154 public_section = FALSE;
60bca95a
NC
14155
14156 if (streq ((char *) p, "gnu"))
104d59d1
JM
14157 gnu_section = TRUE;
14158 else
14159 gnu_section = FALSE;
60bca95a 14160
11c1ff18 14161 p += namelen;
071436c6 14162 attr_len -= namelen;
e0a31db1 14163
071436c6 14164 while (attr_len > 0 && p < contents + sect->sh_size)
11c1ff18 14165 {
e0a31db1 14166 int tag;
11c1ff18
PB
14167 int val;
14168 bfd_vma size;
071436c6 14169 unsigned char * end;
60bca95a 14170
e0a31db1 14171 /* PR binutils/17531: Safe handling of corrupt files. */
071436c6 14172 if (attr_len < 6)
e0a31db1
NC
14173 {
14174 error (_("Unused bytes at end of section\n"));
14175 section_len = 0;
14176 break;
14177 }
14178
14179 tag = *(p++);
11c1ff18 14180 size = byte_get (p, 4);
071436c6 14181 if (size > attr_len)
11c1ff18 14182 {
e9847026 14183 error (_("Bad subsection length (%u > %u)\n"),
071436c6
NC
14184 (unsigned) size, (unsigned) attr_len);
14185 size = attr_len;
11c1ff18 14186 }
e0a31db1
NC
14187 /* PR binutils/17531: Safe handling of corrupt files. */
14188 if (size < 6)
14189 {
14190 error (_("Bad subsection length (%u < 6)\n"),
14191 (unsigned) size);
14192 section_len = 0;
14193 break;
14194 }
60bca95a 14195
071436c6 14196 attr_len -= size;
11c1ff18 14197 end = p + size - 1;
071436c6 14198 assert (end <= contents + sect->sh_size);
11c1ff18 14199 p += 4;
60bca95a 14200
11c1ff18
PB
14201 switch (tag)
14202 {
14203 case 1:
2b692964 14204 printf (_("File Attributes\n"));
11c1ff18
PB
14205 break;
14206 case 2:
2b692964 14207 printf (_("Section Attributes:"));
11c1ff18
PB
14208 goto do_numlist;
14209 case 3:
2b692964 14210 printf (_("Symbol Attributes:"));
11c1ff18
PB
14211 do_numlist:
14212 for (;;)
14213 {
91d6fa6a 14214 unsigned int j;
60bca95a 14215
f6f0e17b 14216 val = read_uleb128 (p, &j, end);
91d6fa6a 14217 p += j;
11c1ff18
PB
14218 if (val == 0)
14219 break;
14220 printf (" %d", val);
14221 }
14222 printf ("\n");
14223 break;
14224 default:
2b692964 14225 printf (_("Unknown tag: %d\n"), tag);
11c1ff18
PB
14226 public_section = FALSE;
14227 break;
14228 }
60bca95a 14229
071436c6 14230 if (public_section && display_pub_attribute != NULL)
11c1ff18
PB
14231 {
14232 while (p < end)
f6f0e17b 14233 p = display_pub_attribute (p, end);
071436c6 14234 assert (p <= end);
104d59d1 14235 }
071436c6 14236 else if (gnu_section && display_proc_gnu_attribute != NULL)
104d59d1
JM
14237 {
14238 while (p < end)
14239 p = display_gnu_attribute (p,
f6f0e17b
NC
14240 display_proc_gnu_attribute,
14241 end);
071436c6 14242 assert (p <= end);
11c1ff18 14243 }
071436c6 14244 else if (p < end)
11c1ff18 14245 {
071436c6 14246 printf (_(" Unknown attribute:\n"));
f6f0e17b 14247 display_raw_attribute (p, end);
11c1ff18
PB
14248 p = end;
14249 }
071436c6
NC
14250 else
14251 attr_len = 0;
11c1ff18
PB
14252 }
14253 }
14254 }
14255 else
e9847026 14256 printf (_("Unknown format '%c' (%d)\n"), *p, *p);
d70c5fc7 14257
60bca95a 14258 free (contents);
11c1ff18
PB
14259 }
14260 return 1;
14261}
14262
104d59d1 14263static int
2cf0635d 14264process_arm_specific (FILE * file)
104d59d1
JM
14265{
14266 return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
14267 display_arm_attribute, NULL);
14268}
14269
34c8bcba 14270static int
2cf0635d 14271process_power_specific (FILE * file)
34c8bcba
JM
14272{
14273 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14274 display_power_gnu_attribute);
14275}
14276
643f7afb
AK
14277static int
14278process_s390_specific (FILE * file)
14279{
14280 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14281 display_s390_gnu_attribute);
14282}
14283
9e8c70f9
DM
14284static int
14285process_sparc_specific (FILE * file)
14286{
14287 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14288 display_sparc_gnu_attribute);
14289}
14290
59e6276b
JM
14291static int
14292process_tic6x_specific (FILE * file)
14293{
14294 return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
14295 display_tic6x_attribute, NULL);
14296}
14297
13761a11
NC
14298static int
14299process_msp430x_specific (FILE * file)
14300{
14301 return process_attributes (file, "mspabi", SHT_MSP430_ATTRIBUTES,
14302 display_msp430x_attribute, NULL);
14303}
14304
ccb4c951
RS
14305/* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
14306 Print the Address, Access and Initial fields of an entry at VMA ADDR
82b1b41b
NC
14307 and return the VMA of the next entry, or -1 if there was a problem.
14308 Does not read from DATA_END or beyond. */
ccb4c951
RS
14309
14310static bfd_vma
82b1b41b
NC
14311print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
14312 unsigned char * data_end)
ccb4c951
RS
14313{
14314 printf (" ");
14315 print_vma (addr, LONG_HEX);
14316 printf (" ");
14317 if (addr < pltgot + 0xfff0)
14318 printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
14319 else
14320 printf ("%10s", "");
14321 printf (" ");
14322 if (data == NULL)
2b692964 14323 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
ccb4c951
RS
14324 else
14325 {
14326 bfd_vma entry;
82b1b41b 14327 unsigned char * from = data + addr - pltgot;
ccb4c951 14328
82b1b41b
NC
14329 if (from + (is_32bit_elf ? 4 : 8) > data_end)
14330 {
14331 warn (_("MIPS GOT entry extends beyond the end of available data\n"));
14332 printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
14333 return (bfd_vma) -1;
14334 }
14335 else
14336 {
14337 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14338 print_vma (entry, LONG_HEX);
14339 }
ccb4c951
RS
14340 }
14341 return addr + (is_32bit_elf ? 4 : 8);
14342}
14343
861fb55a
DJ
14344/* DATA points to the contents of a MIPS PLT GOT that starts at VMA
14345 PLTGOT. Print the Address and Initial fields of an entry at VMA
14346 ADDR and return the VMA of the next entry. */
14347
14348static bfd_vma
2cf0635d 14349print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
861fb55a
DJ
14350{
14351 printf (" ");
14352 print_vma (addr, LONG_HEX);
14353 printf (" ");
14354 if (data == NULL)
2b692964 14355 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
861fb55a
DJ
14356 else
14357 {
14358 bfd_vma entry;
14359
14360 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14361 print_vma (entry, LONG_HEX);
14362 }
14363 return addr + (is_32bit_elf ? 4 : 8);
14364}
14365
351cdf24
MF
14366static void
14367print_mips_ases (unsigned int mask)
14368{
14369 if (mask & AFL_ASE_DSP)
14370 fputs ("\n\tDSP ASE", stdout);
14371 if (mask & AFL_ASE_DSPR2)
14372 fputs ("\n\tDSP R2 ASE", stdout);
8f4f9071
MF
14373 if (mask & AFL_ASE_DSPR3)
14374 fputs ("\n\tDSP R3 ASE", stdout);
351cdf24
MF
14375 if (mask & AFL_ASE_EVA)
14376 fputs ("\n\tEnhanced VA Scheme", stdout);
14377 if (mask & AFL_ASE_MCU)
14378 fputs ("\n\tMCU (MicroController) ASE", stdout);
14379 if (mask & AFL_ASE_MDMX)
14380 fputs ("\n\tMDMX ASE", stdout);
14381 if (mask & AFL_ASE_MIPS3D)
14382 fputs ("\n\tMIPS-3D ASE", stdout);
14383 if (mask & AFL_ASE_MT)
14384 fputs ("\n\tMT ASE", stdout);
14385 if (mask & AFL_ASE_SMARTMIPS)
14386 fputs ("\n\tSmartMIPS ASE", stdout);
14387 if (mask & AFL_ASE_VIRT)
14388 fputs ("\n\tVZ ASE", stdout);
14389 if (mask & AFL_ASE_MSA)
14390 fputs ("\n\tMSA ASE", stdout);
14391 if (mask & AFL_ASE_MIPS16)
14392 fputs ("\n\tMIPS16 ASE", stdout);
14393 if (mask & AFL_ASE_MICROMIPS)
14394 fputs ("\n\tMICROMIPS ASE", stdout);
14395 if (mask & AFL_ASE_XPA)
14396 fputs ("\n\tXPA ASE", stdout);
14397 if (mask == 0)
14398 fprintf (stdout, "\n\t%s", _("None"));
00ac7aa0
MF
14399 else if ((mask & ~AFL_ASE_MASK) != 0)
14400 fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
351cdf24
MF
14401}
14402
14403static void
14404print_mips_isa_ext (unsigned int isa_ext)
14405{
14406 switch (isa_ext)
14407 {
14408 case 0:
14409 fputs (_("None"), stdout);
14410 break;
14411 case AFL_EXT_XLR:
14412 fputs ("RMI XLR", stdout);
14413 break;
2c629856
N
14414 case AFL_EXT_OCTEON3:
14415 fputs ("Cavium Networks Octeon3", stdout);
14416 break;
351cdf24
MF
14417 case AFL_EXT_OCTEON2:
14418 fputs ("Cavium Networks Octeon2", stdout);
14419 break;
14420 case AFL_EXT_OCTEONP:
14421 fputs ("Cavium Networks OcteonP", stdout);
14422 break;
14423 case AFL_EXT_LOONGSON_3A:
14424 fputs ("Loongson 3A", stdout);
14425 break;
14426 case AFL_EXT_OCTEON:
14427 fputs ("Cavium Networks Octeon", stdout);
14428 break;
14429 case AFL_EXT_5900:
14430 fputs ("Toshiba R5900", stdout);
14431 break;
14432 case AFL_EXT_4650:
14433 fputs ("MIPS R4650", stdout);
14434 break;
14435 case AFL_EXT_4010:
14436 fputs ("LSI R4010", stdout);
14437 break;
14438 case AFL_EXT_4100:
14439 fputs ("NEC VR4100", stdout);
14440 break;
14441 case AFL_EXT_3900:
14442 fputs ("Toshiba R3900", stdout);
14443 break;
14444 case AFL_EXT_10000:
14445 fputs ("MIPS R10000", stdout);
14446 break;
14447 case AFL_EXT_SB1:
14448 fputs ("Broadcom SB-1", stdout);
14449 break;
14450 case AFL_EXT_4111:
14451 fputs ("NEC VR4111/VR4181", stdout);
14452 break;
14453 case AFL_EXT_4120:
14454 fputs ("NEC VR4120", stdout);
14455 break;
14456 case AFL_EXT_5400:
14457 fputs ("NEC VR5400", stdout);
14458 break;
14459 case AFL_EXT_5500:
14460 fputs ("NEC VR5500", stdout);
14461 break;
14462 case AFL_EXT_LOONGSON_2E:
14463 fputs ("ST Microelectronics Loongson 2E", stdout);
14464 break;
14465 case AFL_EXT_LOONGSON_2F:
14466 fputs ("ST Microelectronics Loongson 2F", stdout);
14467 break;
14468 default:
00ac7aa0 14469 fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
351cdf24
MF
14470 }
14471}
14472
14473static int
14474get_mips_reg_size (int reg_size)
14475{
14476 return (reg_size == AFL_REG_NONE) ? 0
14477 : (reg_size == AFL_REG_32) ? 32
14478 : (reg_size == AFL_REG_64) ? 64
14479 : (reg_size == AFL_REG_128) ? 128
14480 : -1;
14481}
14482
19e6b90e 14483static int
2cf0635d 14484process_mips_specific (FILE * file)
5b18a4bc 14485{
2cf0635d 14486 Elf_Internal_Dyn * entry;
351cdf24 14487 Elf_Internal_Shdr *sect = NULL;
19e6b90e
L
14488 size_t liblist_offset = 0;
14489 size_t liblistno = 0;
14490 size_t conflictsno = 0;
14491 size_t options_offset = 0;
14492 size_t conflicts_offset = 0;
861fb55a
DJ
14493 size_t pltrelsz = 0;
14494 size_t pltrel = 0;
ccb4c951 14495 bfd_vma pltgot = 0;
861fb55a
DJ
14496 bfd_vma mips_pltgot = 0;
14497 bfd_vma jmprel = 0;
ccb4c951
RS
14498 bfd_vma local_gotno = 0;
14499 bfd_vma gotsym = 0;
14500 bfd_vma symtabno = 0;
103f02d3 14501
2cf19d5c
JM
14502 process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14503 display_mips_gnu_attribute);
14504
351cdf24
MF
14505 sect = find_section (".MIPS.abiflags");
14506
14507 if (sect != NULL)
14508 {
14509 Elf_External_ABIFlags_v0 *abiflags_ext;
14510 Elf_Internal_ABIFlags_v0 abiflags_in;
14511
14512 if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
14513 fputs ("\nCorrupt ABI Flags section.\n", stdout);
14514 else
14515 {
14516 abiflags_ext = get_data (NULL, file, sect->sh_offset, 1,
14517 sect->sh_size, _("MIPS ABI Flags section"));
14518 if (abiflags_ext)
14519 {
14520 abiflags_in.version = BYTE_GET (abiflags_ext->version);
14521 abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
14522 abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
14523 abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
14524 abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
14525 abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
14526 abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
14527 abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
14528 abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
14529 abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
14530 abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
14531
14532 printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
14533 printf ("\nISA: MIPS%d", abiflags_in.isa_level);
14534 if (abiflags_in.isa_rev > 1)
14535 printf ("r%d", abiflags_in.isa_rev);
14536 printf ("\nGPR size: %d",
14537 get_mips_reg_size (abiflags_in.gpr_size));
14538 printf ("\nCPR1 size: %d",
14539 get_mips_reg_size (abiflags_in.cpr1_size));
14540 printf ("\nCPR2 size: %d",
14541 get_mips_reg_size (abiflags_in.cpr2_size));
14542 fputs ("\nFP ABI: ", stdout);
14543 print_mips_fp_abi_value (abiflags_in.fp_abi);
14544 fputs ("ISA Extension: ", stdout);
14545 print_mips_isa_ext (abiflags_in.isa_ext);
14546 fputs ("\nASEs:", stdout);
14547 print_mips_ases (abiflags_in.ases);
14548 printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
14549 printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
14550 fputc ('\n', stdout);
14551 free (abiflags_ext);
14552 }
14553 }
14554 }
14555
19e6b90e
L
14556 /* We have a lot of special sections. Thanks SGI! */
14557 if (dynamic_section == NULL)
14558 /* No information available. */
14559 return 0;
252b5132 14560
071436c6
NC
14561 for (entry = dynamic_section;
14562 /* PR 17531 file: 012-50589-0.004. */
14563 entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
14564 ++entry)
252b5132
RH
14565 switch (entry->d_tag)
14566 {
14567 case DT_MIPS_LIBLIST:
d93f0186
NC
14568 liblist_offset
14569 = offset_from_vma (file, entry->d_un.d_val,
14570 liblistno * sizeof (Elf32_External_Lib));
252b5132
RH
14571 break;
14572 case DT_MIPS_LIBLISTNO:
14573 liblistno = entry->d_un.d_val;
14574 break;
14575 case DT_MIPS_OPTIONS:
d93f0186 14576 options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
252b5132
RH
14577 break;
14578 case DT_MIPS_CONFLICT:
d93f0186
NC
14579 conflicts_offset
14580 = offset_from_vma (file, entry->d_un.d_val,
14581 conflictsno * sizeof (Elf32_External_Conflict));
252b5132
RH
14582 break;
14583 case DT_MIPS_CONFLICTNO:
14584 conflictsno = entry->d_un.d_val;
14585 break;
ccb4c951 14586 case DT_PLTGOT:
861fb55a
DJ
14587 pltgot = entry->d_un.d_ptr;
14588 break;
ccb4c951
RS
14589 case DT_MIPS_LOCAL_GOTNO:
14590 local_gotno = entry->d_un.d_val;
14591 break;
14592 case DT_MIPS_GOTSYM:
14593 gotsym = entry->d_un.d_val;
14594 break;
14595 case DT_MIPS_SYMTABNO:
14596 symtabno = entry->d_un.d_val;
14597 break;
861fb55a
DJ
14598 case DT_MIPS_PLTGOT:
14599 mips_pltgot = entry->d_un.d_ptr;
14600 break;
14601 case DT_PLTREL:
14602 pltrel = entry->d_un.d_val;
14603 break;
14604 case DT_PLTRELSZ:
14605 pltrelsz = entry->d_un.d_val;
14606 break;
14607 case DT_JMPREL:
14608 jmprel = entry->d_un.d_ptr;
14609 break;
252b5132
RH
14610 default:
14611 break;
14612 }
14613
14614 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
14615 {
2cf0635d 14616 Elf32_External_Lib * elib;
252b5132
RH
14617 size_t cnt;
14618
3f5e193b
NC
14619 elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
14620 liblistno,
14621 sizeof (Elf32_External_Lib),
9cf03b7e 14622 _("liblist section data"));
a6e9f9df 14623 if (elib)
252b5132 14624 {
2b692964 14625 printf (_("\nSection '.liblist' contains %lu entries:\n"),
a6e9f9df 14626 (unsigned long) liblistno);
2b692964 14627 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
a6e9f9df
AM
14628 stdout);
14629
14630 for (cnt = 0; cnt < liblistno; ++cnt)
252b5132 14631 {
a6e9f9df 14632 Elf32_Lib liblist;
91d6fa6a 14633 time_t atime;
d5b07ef4 14634 char timebuf[128];
2cf0635d 14635 struct tm * tmp;
a6e9f9df
AM
14636
14637 liblist.l_name = BYTE_GET (elib[cnt].l_name);
91d6fa6a 14638 atime = BYTE_GET (elib[cnt].l_time_stamp);
a6e9f9df
AM
14639 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
14640 liblist.l_version = BYTE_GET (elib[cnt].l_version);
14641 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
14642
91d6fa6a 14643 tmp = gmtime (&atime);
e9e44622
JJ
14644 snprintf (timebuf, sizeof (timebuf),
14645 "%04u-%02u-%02uT%02u:%02u:%02u",
14646 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
14647 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
a6e9f9df 14648
31104126 14649 printf ("%3lu: ", (unsigned long) cnt);
d79b3d50
NC
14650 if (VALID_DYNAMIC_NAME (liblist.l_name))
14651 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
14652 else
2b692964 14653 printf (_("<corrupt: %9ld>"), liblist.l_name);
31104126
NC
14654 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
14655 liblist.l_version);
a6e9f9df
AM
14656
14657 if (liblist.l_flags == 0)
2b692964 14658 puts (_(" NONE"));
a6e9f9df
AM
14659 else
14660 {
14661 static const struct
252b5132 14662 {
2cf0635d 14663 const char * name;
a6e9f9df 14664 int bit;
252b5132 14665 }
a6e9f9df
AM
14666 l_flags_vals[] =
14667 {
14668 { " EXACT_MATCH", LL_EXACT_MATCH },
14669 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
14670 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
14671 { " EXPORTS", LL_EXPORTS },
14672 { " DELAY_LOAD", LL_DELAY_LOAD },
14673 { " DELTA", LL_DELTA }
14674 };
14675 int flags = liblist.l_flags;
14676 size_t fcnt;
14677
60bca95a 14678 for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
a6e9f9df
AM
14679 if ((flags & l_flags_vals[fcnt].bit) != 0)
14680 {
14681 fputs (l_flags_vals[fcnt].name, stdout);
14682 flags ^= l_flags_vals[fcnt].bit;
14683 }
14684 if (flags != 0)
14685 printf (" %#x", (unsigned int) flags);
252b5132 14686
a6e9f9df
AM
14687 puts ("");
14688 }
252b5132 14689 }
252b5132 14690
a6e9f9df
AM
14691 free (elib);
14692 }
252b5132
RH
14693 }
14694
14695 if (options_offset != 0)
14696 {
2cf0635d 14697 Elf_External_Options * eopt;
2cf0635d
NC
14698 Elf_Internal_Options * iopt;
14699 Elf_Internal_Options * option;
252b5132
RH
14700 size_t offset;
14701 int cnt;
351cdf24 14702 sect = section_headers;
252b5132
RH
14703
14704 /* Find the section header so that we get the size. */
071436c6 14705 sect = find_section_by_type (SHT_MIPS_OPTIONS);
948f632f 14706 /* PR 17533 file: 012-277276-0.004. */
071436c6
NC
14707 if (sect == NULL)
14708 {
14709 error (_("No MIPS_OPTIONS header found\n"));
14710 return 0;
14711 }
252b5132 14712
3f5e193b
NC
14713 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
14714 sect->sh_size, _("options"));
a6e9f9df 14715 if (eopt)
252b5132 14716 {
3f5e193b
NC
14717 iopt = (Elf_Internal_Options *)
14718 cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
a6e9f9df
AM
14719 if (iopt == NULL)
14720 {
8b73c356 14721 error (_("Out of memory allocatinf space for MIPS options\n"));
a6e9f9df
AM
14722 return 0;
14723 }
76da6bbe 14724
a6e9f9df
AM
14725 offset = cnt = 0;
14726 option = iopt;
252b5132 14727
82b1b41b 14728 while (offset <= sect->sh_size - sizeof (* eopt))
a6e9f9df 14729 {
2cf0635d 14730 Elf_External_Options * eoption;
252b5132 14731
a6e9f9df 14732 eoption = (Elf_External_Options *) ((char *) eopt + offset);
252b5132 14733
a6e9f9df
AM
14734 option->kind = BYTE_GET (eoption->kind);
14735 option->size = BYTE_GET (eoption->size);
14736 option->section = BYTE_GET (eoption->section);
14737 option->info = BYTE_GET (eoption->info);
76da6bbe 14738
82b1b41b
NC
14739 /* PR 17531: file: ffa0fa3b. */
14740 if (option->size < sizeof (* eopt)
14741 || offset + option->size > sect->sh_size)
14742 {
55325047
NC
14743 error (_("Invalid size (%u) for MIPS option\n"), option->size);
14744 return 0;
82b1b41b 14745 }
a6e9f9df 14746 offset += option->size;
14ae95f2 14747
a6e9f9df
AM
14748 ++option;
14749 ++cnt;
14750 }
252b5132 14751
a6e9f9df 14752 printf (_("\nSection '%s' contains %d entries:\n"),
74e1a04b 14753 printable_section_name (sect), cnt);
76da6bbe 14754
a6e9f9df 14755 option = iopt;
82b1b41b 14756 offset = 0;
252b5132 14757
a6e9f9df 14758 while (cnt-- > 0)
252b5132 14759 {
a6e9f9df
AM
14760 size_t len;
14761
14762 switch (option->kind)
252b5132 14763 {
a6e9f9df
AM
14764 case ODK_NULL:
14765 /* This shouldn't happen. */
14766 printf (" NULL %d %lx", option->section, option->info);
14767 break;
14768 case ODK_REGINFO:
14769 printf (" REGINFO ");
14770 if (elf_header.e_machine == EM_MIPS)
14771 {
14772 /* 32bit form. */
2cf0635d 14773 Elf32_External_RegInfo * ereg;
b34976b6 14774 Elf32_RegInfo reginfo;
a6e9f9df
AM
14775
14776 ereg = (Elf32_External_RegInfo *) (option + 1);
14777 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
14778 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
14779 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
14780 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
14781 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
14782 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
14783
14784 printf ("GPR %08lx GP 0x%lx\n",
14785 reginfo.ri_gprmask,
14786 (unsigned long) reginfo.ri_gp_value);
14787 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
14788 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
14789 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
14790 }
14791 else
14792 {
14793 /* 64 bit form. */
2cf0635d 14794 Elf64_External_RegInfo * ereg;
a6e9f9df
AM
14795 Elf64_Internal_RegInfo reginfo;
14796
14797 ereg = (Elf64_External_RegInfo *) (option + 1);
14798 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
14799 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
14800 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
14801 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
14802 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
66543521 14803 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
a6e9f9df
AM
14804
14805 printf ("GPR %08lx GP 0x",
14806 reginfo.ri_gprmask);
14807 printf_vma (reginfo.ri_gp_value);
14808 printf ("\n");
14809
14810 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
14811 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
14812 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
14813 }
14814 ++option;
14815 continue;
14816 case ODK_EXCEPTIONS:
14817 fputs (" EXCEPTIONS fpe_min(", stdout);
14818 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
14819 fputs (") fpe_max(", stdout);
14820 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
14821 fputs (")", stdout);
14822
14823 if (option->info & OEX_PAGE0)
14824 fputs (" PAGE0", stdout);
14825 if (option->info & OEX_SMM)
14826 fputs (" SMM", stdout);
14827 if (option->info & OEX_FPDBUG)
14828 fputs (" FPDBUG", stdout);
14829 if (option->info & OEX_DISMISS)
14830 fputs (" DISMISS", stdout);
14831 break;
14832 case ODK_PAD:
14833 fputs (" PAD ", stdout);
14834 if (option->info & OPAD_PREFIX)
14835 fputs (" PREFIX", stdout);
14836 if (option->info & OPAD_POSTFIX)
14837 fputs (" POSTFIX", stdout);
14838 if (option->info & OPAD_SYMBOL)
14839 fputs (" SYMBOL", stdout);
14840 break;
14841 case ODK_HWPATCH:
14842 fputs (" HWPATCH ", stdout);
14843 if (option->info & OHW_R4KEOP)
14844 fputs (" R4KEOP", stdout);
14845 if (option->info & OHW_R8KPFETCH)
14846 fputs (" R8KPFETCH", stdout);
14847 if (option->info & OHW_R5KEOP)
14848 fputs (" R5KEOP", stdout);
14849 if (option->info & OHW_R5KCVTL)
14850 fputs (" R5KCVTL", stdout);
14851 break;
14852 case ODK_FILL:
14853 fputs (" FILL ", stdout);
14854 /* XXX Print content of info word? */
14855 break;
14856 case ODK_TAGS:
14857 fputs (" TAGS ", stdout);
14858 /* XXX Print content of info word? */
14859 break;
14860 case ODK_HWAND:
14861 fputs (" HWAND ", stdout);
14862 if (option->info & OHWA0_R4KEOP_CHECKED)
14863 fputs (" R4KEOP_CHECKED", stdout);
14864 if (option->info & OHWA0_R4KEOP_CLEAN)
14865 fputs (" R4KEOP_CLEAN", stdout);
14866 break;
14867 case ODK_HWOR:
14868 fputs (" HWOR ", stdout);
14869 if (option->info & OHWA0_R4KEOP_CHECKED)
14870 fputs (" R4KEOP_CHECKED", stdout);
14871 if (option->info & OHWA0_R4KEOP_CLEAN)
14872 fputs (" R4KEOP_CLEAN", stdout);
14873 break;
14874 case ODK_GP_GROUP:
14875 printf (" GP_GROUP %#06lx self-contained %#06lx",
14876 option->info & OGP_GROUP,
14877 (option->info & OGP_SELF) >> 16);
14878 break;
14879 case ODK_IDENT:
14880 printf (" IDENT %#06lx self-contained %#06lx",
14881 option->info & OGP_GROUP,
14882 (option->info & OGP_SELF) >> 16);
14883 break;
14884 default:
14885 /* This shouldn't happen. */
14886 printf (" %3d ??? %d %lx",
14887 option->kind, option->section, option->info);
14888 break;
252b5132 14889 }
a6e9f9df 14890
2cf0635d 14891 len = sizeof (* eopt);
a6e9f9df 14892 while (len < option->size)
82b1b41b 14893 {
7e27a9d5 14894 unsigned char datum = * ((unsigned char *) eopt + offset + len);
a6e9f9df 14895
82b1b41b
NC
14896 if (ISPRINT (datum))
14897 printf ("%c", datum);
14898 else
14899 printf ("\\%03o", datum);
14900 len ++;
14901 }
a6e9f9df 14902 fputs ("\n", stdout);
82b1b41b
NC
14903
14904 offset += option->size;
252b5132 14905 ++option;
252b5132
RH
14906 }
14907
a6e9f9df 14908 free (eopt);
252b5132 14909 }
252b5132
RH
14910 }
14911
14912 if (conflicts_offset != 0 && conflictsno != 0)
14913 {
2cf0635d 14914 Elf32_Conflict * iconf;
252b5132
RH
14915 size_t cnt;
14916
14917 if (dynamic_symbols == NULL)
14918 {
591a748a 14919 error (_("conflict list found without a dynamic symbol table\n"));
252b5132
RH
14920 return 0;
14921 }
14922
3f5e193b 14923 iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
252b5132
RH
14924 if (iconf == NULL)
14925 {
8b73c356 14926 error (_("Out of memory allocating space for dynamic conflicts\n"));
252b5132
RH
14927 return 0;
14928 }
14929
9ea033b2 14930 if (is_32bit_elf)
252b5132 14931 {
2cf0635d 14932 Elf32_External_Conflict * econf32;
a6e9f9df 14933
3f5e193b
NC
14934 econf32 = (Elf32_External_Conflict *)
14935 get_data (NULL, file, conflicts_offset, conflictsno,
14936 sizeof (* econf32), _("conflict"));
a6e9f9df
AM
14937 if (!econf32)
14938 return 0;
252b5132
RH
14939
14940 for (cnt = 0; cnt < conflictsno; ++cnt)
14941 iconf[cnt] = BYTE_GET (econf32[cnt]);
a6e9f9df
AM
14942
14943 free (econf32);
252b5132
RH
14944 }
14945 else
14946 {
2cf0635d 14947 Elf64_External_Conflict * econf64;
a6e9f9df 14948
3f5e193b
NC
14949 econf64 = (Elf64_External_Conflict *)
14950 get_data (NULL, file, conflicts_offset, conflictsno,
14951 sizeof (* econf64), _("conflict"));
a6e9f9df
AM
14952 if (!econf64)
14953 return 0;
252b5132
RH
14954
14955 for (cnt = 0; cnt < conflictsno; ++cnt)
14956 iconf[cnt] = BYTE_GET (econf64[cnt]);
a6e9f9df
AM
14957
14958 free (econf64);
252b5132
RH
14959 }
14960
c7e7ca54
NC
14961 printf (_("\nSection '.conflict' contains %lu entries:\n"),
14962 (unsigned long) conflictsno);
252b5132
RH
14963 puts (_(" Num: Index Value Name"));
14964
14965 for (cnt = 0; cnt < conflictsno; ++cnt)
14966 {
b34976b6 14967 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
e0a31db1
NC
14968
14969 if (iconf[cnt] >= num_dynamic_syms)
14970 printf (_("<corrupt symbol index>"));
d79b3d50 14971 else
e0a31db1
NC
14972 {
14973 Elf_Internal_Sym * psym;
14974
14975 psym = & dynamic_symbols[iconf[cnt]];
14976 print_vma (psym->st_value, FULL_HEX);
14977 putchar (' ');
14978 if (VALID_DYNAMIC_NAME (psym->st_name))
14979 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
14980 else
14981 printf (_("<corrupt: %14ld>"), psym->st_name);
14982 }
31104126 14983 putchar ('\n');
252b5132
RH
14984 }
14985
252b5132
RH
14986 free (iconf);
14987 }
14988
ccb4c951
RS
14989 if (pltgot != 0 && local_gotno != 0)
14990 {
91d6fa6a 14991 bfd_vma ent, local_end, global_end;
bbeee7ea 14992 size_t i, offset;
2cf0635d 14993 unsigned char * data;
82b1b41b 14994 unsigned char * data_end;
bbeee7ea 14995 int addr_size;
ccb4c951 14996
91d6fa6a 14997 ent = pltgot;
ccb4c951
RS
14998 addr_size = (is_32bit_elf ? 4 : 8);
14999 local_end = pltgot + local_gotno * addr_size;
ccb4c951 15000
74e1a04b
NC
15001 /* PR binutils/17533 file: 012-111227-0.004 */
15002 if (symtabno < gotsym)
15003 {
15004 error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
82b1b41b 15005 (unsigned long) gotsym, (unsigned long) symtabno);
74e1a04b
NC
15006 return 0;
15007 }
82b1b41b 15008
74e1a04b 15009 global_end = local_end + (symtabno - gotsym) * addr_size;
82b1b41b
NC
15010 /* PR 17531: file: 54c91a34. */
15011 if (global_end < local_end)
15012 {
15013 error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
15014 return 0;
15015 }
948f632f 15016
ccb4c951 15017 offset = offset_from_vma (file, pltgot, global_end - pltgot);
3f5e193b 15018 data = (unsigned char *) get_data (NULL, file, offset,
9cf03b7e
NC
15019 global_end - pltgot, 1,
15020 _("Global Offset Table data"));
59245841
NC
15021 if (data == NULL)
15022 return 0;
82b1b41b 15023 data_end = data + (global_end - pltgot);
59245841 15024
ccb4c951
RS
15025 printf (_("\nPrimary GOT:\n"));
15026 printf (_(" Canonical gp value: "));
15027 print_vma (pltgot + 0x7ff0, LONG_HEX);
15028 printf ("\n\n");
15029
15030 printf (_(" Reserved entries:\n"));
15031 printf (_(" %*s %10s %*s Purpose\n"),
2b692964
NC
15032 addr_size * 2, _("Address"), _("Access"),
15033 addr_size * 2, _("Initial"));
82b1b41b 15034 ent = print_mips_got_entry (data, pltgot, ent, data_end);
2b692964 15035 printf (_(" Lazy resolver\n"));
82b1b41b
NC
15036 if (ent == (bfd_vma) -1)
15037 goto got_print_fail;
ccb4c951 15038 if (data
91d6fa6a 15039 && (byte_get (data + ent - pltgot, addr_size)
ccb4c951
RS
15040 >> (addr_size * 8 - 1)) != 0)
15041 {
82b1b41b 15042 ent = print_mips_got_entry (data, pltgot, ent, data_end);
2b692964 15043 printf (_(" Module pointer (GNU extension)\n"));
82b1b41b
NC
15044 if (ent == (bfd_vma) -1)
15045 goto got_print_fail;
ccb4c951
RS
15046 }
15047 printf ("\n");
15048
91d6fa6a 15049 if (ent < local_end)
ccb4c951
RS
15050 {
15051 printf (_(" Local entries:\n"));
cc5914eb 15052 printf (" %*s %10s %*s\n",
2b692964
NC
15053 addr_size * 2, _("Address"), _("Access"),
15054 addr_size * 2, _("Initial"));
91d6fa6a 15055 while (ent < local_end)
ccb4c951 15056 {
82b1b41b 15057 ent = print_mips_got_entry (data, pltgot, ent, data_end);
ccb4c951 15058 printf ("\n");
82b1b41b
NC
15059 if (ent == (bfd_vma) -1)
15060 goto got_print_fail;
ccb4c951
RS
15061 }
15062 printf ("\n");
15063 }
15064
15065 if (gotsym < symtabno)
15066 {
15067 int sym_width;
15068
15069 printf (_(" Global entries:\n"));
cc5914eb 15070 printf (" %*s %10s %*s %*s %-7s %3s %s\n",
9cf03b7e
NC
15071 addr_size * 2, _("Address"),
15072 _("Access"),
2b692964 15073 addr_size * 2, _("Initial"),
9cf03b7e
NC
15074 addr_size * 2, _("Sym.Val."),
15075 _("Type"),
15076 /* Note for translators: "Ndx" = abbreviated form of "Index". */
15077 _("Ndx"), _("Name"));
0b4362b0 15078
ccb4c951 15079 sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
e0a31db1 15080
ccb4c951
RS
15081 for (i = gotsym; i < symtabno; i++)
15082 {
82b1b41b 15083 ent = print_mips_got_entry (data, pltgot, ent, data_end);
ccb4c951 15084 printf (" ");
e0a31db1
NC
15085
15086 if (dynamic_symbols == NULL)
15087 printf (_("<no dynamic symbols>"));
15088 else if (i < num_dynamic_syms)
15089 {
15090 Elf_Internal_Sym * psym = dynamic_symbols + i;
15091
15092 print_vma (psym->st_value, LONG_HEX);
15093 printf (" %-7s %3s ",
15094 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
15095 get_symbol_index_type (psym->st_shndx));
15096
15097 if (VALID_DYNAMIC_NAME (psym->st_name))
15098 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
15099 else
15100 printf (_("<corrupt: %14ld>"), psym->st_name);
15101 }
ccb4c951 15102 else
7fc5ac57
JBG
15103 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
15104 (unsigned long) i);
e0a31db1 15105
ccb4c951 15106 printf ("\n");
82b1b41b
NC
15107 if (ent == (bfd_vma) -1)
15108 break;
ccb4c951
RS
15109 }
15110 printf ("\n");
15111 }
15112
82b1b41b 15113 got_print_fail:
ccb4c951
RS
15114 if (data)
15115 free (data);
15116 }
15117
861fb55a
DJ
15118 if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
15119 {
91d6fa6a 15120 bfd_vma ent, end;
861fb55a
DJ
15121 size_t offset, rel_offset;
15122 unsigned long count, i;
2cf0635d 15123 unsigned char * data;
861fb55a 15124 int addr_size, sym_width;
2cf0635d 15125 Elf_Internal_Rela * rels;
861fb55a
DJ
15126
15127 rel_offset = offset_from_vma (file, jmprel, pltrelsz);
15128 if (pltrel == DT_RELA)
15129 {
15130 if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
15131 return 0;
15132 }
15133 else
15134 {
15135 if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
15136 return 0;
15137 }
15138
91d6fa6a 15139 ent = mips_pltgot;
861fb55a
DJ
15140 addr_size = (is_32bit_elf ? 4 : 8);
15141 end = mips_pltgot + (2 + count) * addr_size;
15142
15143 offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
3f5e193b 15144 data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
9cf03b7e 15145 1, _("Procedure Linkage Table data"));
59245841
NC
15146 if (data == NULL)
15147 return 0;
15148
9cf03b7e 15149 printf ("\nPLT GOT:\n\n");
861fb55a
DJ
15150 printf (_(" Reserved entries:\n"));
15151 printf (_(" %*s %*s Purpose\n"),
2b692964 15152 addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
91d6fa6a 15153 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
2b692964 15154 printf (_(" PLT lazy resolver\n"));
91d6fa6a 15155 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
2b692964 15156 printf (_(" Module pointer\n"));
861fb55a
DJ
15157 printf ("\n");
15158
15159 printf (_(" Entries:\n"));
cc5914eb 15160 printf (" %*s %*s %*s %-7s %3s %s\n",
2b692964
NC
15161 addr_size * 2, _("Address"),
15162 addr_size * 2, _("Initial"),
15163 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
861fb55a
DJ
15164 sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
15165 for (i = 0; i < count; i++)
15166 {
df97ab2a 15167 unsigned long idx = get_reloc_symindex (rels[i].r_info);
861fb55a 15168
91d6fa6a 15169 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
861fb55a 15170 printf (" ");
e0a31db1 15171
df97ab2a
MF
15172 if (idx >= num_dynamic_syms)
15173 printf (_("<corrupt symbol index: %lu>"), idx);
861fb55a 15174 else
e0a31db1 15175 {
df97ab2a 15176 Elf_Internal_Sym * psym = dynamic_symbols + idx;
e0a31db1
NC
15177
15178 print_vma (psym->st_value, LONG_HEX);
15179 printf (" %-7s %3s ",
15180 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
15181 get_symbol_index_type (psym->st_shndx));
15182 if (VALID_DYNAMIC_NAME (psym->st_name))
15183 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
15184 else
15185 printf (_("<corrupt: %14ld>"), psym->st_name);
15186 }
861fb55a
DJ
15187 printf ("\n");
15188 }
15189 printf ("\n");
15190
15191 if (data)
15192 free (data);
15193 free (rels);
15194 }
15195
252b5132
RH
15196 return 1;
15197}
15198
35c08157
KLC
15199static int
15200process_nds32_specific (FILE * file)
15201{
15202 Elf_Internal_Shdr *sect = NULL;
15203
15204 sect = find_section (".nds32_e_flags");
15205 if (sect != NULL)
15206 {
15207 unsigned int *flag;
15208
15209 printf ("\nNDS32 elf flags section:\n");
15210 flag = get_data (NULL, file, sect->sh_offset, 1,
15211 sect->sh_size, _("NDS32 elf flags section"));
15212
15213 switch ((*flag) & 0x3)
15214 {
15215 case 0:
15216 printf ("(VEC_SIZE):\tNo entry.\n");
15217 break;
15218 case 1:
15219 printf ("(VEC_SIZE):\t4 bytes\n");
15220 break;
15221 case 2:
15222 printf ("(VEC_SIZE):\t16 bytes\n");
15223 break;
15224 case 3:
15225 printf ("(VEC_SIZE):\treserved\n");
15226 break;
15227 }
15228 }
15229
15230 return TRUE;
15231}
15232
047b2264 15233static int
2cf0635d 15234process_gnu_liblist (FILE * file)
047b2264 15235{
2cf0635d
NC
15236 Elf_Internal_Shdr * section;
15237 Elf_Internal_Shdr * string_sec;
15238 Elf32_External_Lib * elib;
15239 char * strtab;
c256ffe7 15240 size_t strtab_size;
047b2264
JJ
15241 size_t cnt;
15242 unsigned i;
15243
15244 if (! do_arch)
15245 return 0;
15246
15247 for (i = 0, section = section_headers;
15248 i < elf_header.e_shnum;
b34976b6 15249 i++, section++)
047b2264
JJ
15250 {
15251 switch (section->sh_type)
15252 {
15253 case SHT_GNU_LIBLIST:
4fbb74a6 15254 if (section->sh_link >= elf_header.e_shnum)
c256ffe7
JJ
15255 break;
15256
3f5e193b
NC
15257 elib = (Elf32_External_Lib *)
15258 get_data (NULL, file, section->sh_offset, 1, section->sh_size,
9cf03b7e 15259 _("liblist section data"));
047b2264
JJ
15260
15261 if (elib == NULL)
15262 break;
4fbb74a6 15263 string_sec = section_headers + section->sh_link;
047b2264 15264
3f5e193b
NC
15265 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
15266 string_sec->sh_size,
15267 _("liblist string table"));
047b2264
JJ
15268 if (strtab == NULL
15269 || section->sh_entsize != sizeof (Elf32_External_Lib))
15270 {
15271 free (elib);
2842702f 15272 free (strtab);
047b2264
JJ
15273 break;
15274 }
59245841 15275 strtab_size = string_sec->sh_size;
047b2264
JJ
15276
15277 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
74e1a04b 15278 printable_section_name (section),
0af1713e 15279 (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
047b2264 15280
2b692964 15281 puts (_(" Library Time Stamp Checksum Version Flags"));
047b2264
JJ
15282
15283 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
15284 ++cnt)
15285 {
15286 Elf32_Lib liblist;
91d6fa6a 15287 time_t atime;
d5b07ef4 15288 char timebuf[128];
2cf0635d 15289 struct tm * tmp;
047b2264
JJ
15290
15291 liblist.l_name = BYTE_GET (elib[cnt].l_name);
91d6fa6a 15292 atime = BYTE_GET (elib[cnt].l_time_stamp);
047b2264
JJ
15293 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
15294 liblist.l_version = BYTE_GET (elib[cnt].l_version);
15295 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
15296
91d6fa6a 15297 tmp = gmtime (&atime);
e9e44622
JJ
15298 snprintf (timebuf, sizeof (timebuf),
15299 "%04u-%02u-%02uT%02u:%02u:%02u",
15300 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
15301 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
047b2264
JJ
15302
15303 printf ("%3lu: ", (unsigned long) cnt);
15304 if (do_wide)
c256ffe7 15305 printf ("%-20s", liblist.l_name < strtab_size
2b692964 15306 ? strtab + liblist.l_name : _("<corrupt>"));
047b2264 15307 else
c256ffe7 15308 printf ("%-20.20s", liblist.l_name < strtab_size
2b692964 15309 ? strtab + liblist.l_name : _("<corrupt>"));
047b2264
JJ
15310 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
15311 liblist.l_version, liblist.l_flags);
15312 }
15313
15314 free (elib);
2842702f 15315 free (strtab);
047b2264
JJ
15316 }
15317 }
15318
15319 return 1;
15320}
15321
9437c45b 15322static const char *
d3ba0551 15323get_note_type (unsigned e_type)
779fe533
NC
15324{
15325 static char buff[64];
103f02d3 15326
1ec5cd37
NC
15327 if (elf_header.e_type == ET_CORE)
15328 switch (e_type)
15329 {
57346661 15330 case NT_AUXV:
1ec5cd37 15331 return _("NT_AUXV (auxiliary vector)");
57346661 15332 case NT_PRSTATUS:
1ec5cd37 15333 return _("NT_PRSTATUS (prstatus structure)");
57346661 15334 case NT_FPREGSET:
1ec5cd37 15335 return _("NT_FPREGSET (floating point registers)");
57346661 15336 case NT_PRPSINFO:
1ec5cd37 15337 return _("NT_PRPSINFO (prpsinfo structure)");
57346661 15338 case NT_TASKSTRUCT:
1ec5cd37 15339 return _("NT_TASKSTRUCT (task structure)");
57346661 15340 case NT_PRXFPREG:
1ec5cd37 15341 return _("NT_PRXFPREG (user_xfpregs structure)");
e1e95dec
AM
15342 case NT_PPC_VMX:
15343 return _("NT_PPC_VMX (ppc Altivec registers)");
89eeb0bc
LM
15344 case NT_PPC_VSX:
15345 return _("NT_PPC_VSX (ppc VSX registers)");
ff826ef3
TT
15346 case NT_386_TLS:
15347 return _("NT_386_TLS (x86 TLS information)");
15348 case NT_386_IOPERM:
15349 return _("NT_386_IOPERM (x86 I/O permissions)");
4339cae0
L
15350 case NT_X86_XSTATE:
15351 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
0675e188
UW
15352 case NT_S390_HIGH_GPRS:
15353 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
d7eeb400
MS
15354 case NT_S390_TIMER:
15355 return _("NT_S390_TIMER (s390 timer register)");
15356 case NT_S390_TODCMP:
15357 return _("NT_S390_TODCMP (s390 TOD comparator register)");
15358 case NT_S390_TODPREG:
15359 return _("NT_S390_TODPREG (s390 TOD programmable register)");
15360 case NT_S390_CTRS:
15361 return _("NT_S390_CTRS (s390 control registers)");
15362 case NT_S390_PREFIX:
15363 return _("NT_S390_PREFIX (s390 prefix register)");
a367d729
AK
15364 case NT_S390_LAST_BREAK:
15365 return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
15366 case NT_S390_SYSTEM_CALL:
15367 return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
abb3f6cc
NC
15368 case NT_S390_TDB:
15369 return _("NT_S390_TDB (s390 transaction diagnostic block)");
4ef9f41a
AA
15370 case NT_S390_VXRS_LOW:
15371 return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
15372 case NT_S390_VXRS_HIGH:
15373 return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
faa9a424
UW
15374 case NT_ARM_VFP:
15375 return _("NT_ARM_VFP (arm VFP registers)");
652451f8
YZ
15376 case NT_ARM_TLS:
15377 return _("NT_ARM_TLS (AArch TLS registers)");
15378 case NT_ARM_HW_BREAK:
15379 return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
15380 case NT_ARM_HW_WATCH:
15381 return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
57346661 15382 case NT_PSTATUS:
1ec5cd37 15383 return _("NT_PSTATUS (pstatus structure)");
57346661 15384 case NT_FPREGS:
1ec5cd37 15385 return _("NT_FPREGS (floating point registers)");
57346661 15386 case NT_PSINFO:
1ec5cd37 15387 return _("NT_PSINFO (psinfo structure)");
57346661 15388 case NT_LWPSTATUS:
1ec5cd37 15389 return _("NT_LWPSTATUS (lwpstatus_t structure)");
57346661 15390 case NT_LWPSINFO:
1ec5cd37 15391 return _("NT_LWPSINFO (lwpsinfo_t structure)");
57346661 15392 case NT_WIN32PSTATUS:
1ec5cd37 15393 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
9ece1fa9
TT
15394 case NT_SIGINFO:
15395 return _("NT_SIGINFO (siginfo_t data)");
15396 case NT_FILE:
15397 return _("NT_FILE (mapped files)");
1ec5cd37
NC
15398 default:
15399 break;
15400 }
15401 else
15402 switch (e_type)
15403 {
15404 case NT_VERSION:
15405 return _("NT_VERSION (version)");
15406 case NT_ARCH:
15407 return _("NT_ARCH (architecture)");
15408 default:
15409 break;
15410 }
15411
e9e44622 15412 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
1ec5cd37 15413 return buff;
779fe533
NC
15414}
15415
9ece1fa9
TT
15416static int
15417print_core_note (Elf_Internal_Note *pnote)
15418{
15419 unsigned int addr_size = is_32bit_elf ? 4 : 8;
15420 bfd_vma count, page_size;
15421 unsigned char *descdata, *filenames, *descend;
15422
15423 if (pnote->type != NT_FILE)
15424 return 1;
15425
15426#ifndef BFD64
15427 if (!is_32bit_elf)
15428 {
15429 printf (_(" Cannot decode 64-bit note in 32-bit build\n"));
15430 /* Still "successful". */
15431 return 1;
15432 }
15433#endif
15434
15435 if (pnote->descsz < 2 * addr_size)
15436 {
15437 printf (_(" Malformed note - too short for header\n"));
15438 return 0;
15439 }
15440
15441 descdata = (unsigned char *) pnote->descdata;
15442 descend = descdata + pnote->descsz;
15443
15444 if (descdata[pnote->descsz - 1] != '\0')
15445 {
15446 printf (_(" Malformed note - does not end with \\0\n"));
15447 return 0;
15448 }
15449
15450 count = byte_get (descdata, addr_size);
15451 descdata += addr_size;
15452
15453 page_size = byte_get (descdata, addr_size);
15454 descdata += addr_size;
15455
15456 if (pnote->descsz < 2 * addr_size + count * 3 * addr_size)
15457 {
15458 printf (_(" Malformed note - too short for supplied file count\n"));
15459 return 0;
15460 }
15461
15462 printf (_(" Page size: "));
15463 print_vma (page_size, DEC);
15464 printf ("\n");
15465
15466 printf (_(" %*s%*s%*s\n"),
15467 (int) (2 + 2 * addr_size), _("Start"),
15468 (int) (4 + 2 * addr_size), _("End"),
15469 (int) (4 + 2 * addr_size), _("Page Offset"));
15470 filenames = descdata + count * 3 * addr_size;
595712bb 15471 while (count-- > 0)
9ece1fa9
TT
15472 {
15473 bfd_vma start, end, file_ofs;
15474
15475 if (filenames == descend)
15476 {
15477 printf (_(" Malformed note - filenames end too early\n"));
15478 return 0;
15479 }
15480
15481 start = byte_get (descdata, addr_size);
15482 descdata += addr_size;
15483 end = byte_get (descdata, addr_size);
15484 descdata += addr_size;
15485 file_ofs = byte_get (descdata, addr_size);
15486 descdata += addr_size;
15487
15488 printf (" ");
15489 print_vma (start, FULL_HEX);
15490 printf (" ");
15491 print_vma (end, FULL_HEX);
15492 printf (" ");
15493 print_vma (file_ofs, FULL_HEX);
15494 printf ("\n %s\n", filenames);
15495
15496 filenames += 1 + strlen ((char *) filenames);
15497 }
15498
15499 return 1;
15500}
15501
1118d252
RM
15502static const char *
15503get_gnu_elf_note_type (unsigned e_type)
15504{
15505 static char buff[64];
15506
15507 switch (e_type)
15508 {
15509 case NT_GNU_ABI_TAG:
15510 return _("NT_GNU_ABI_TAG (ABI version tag)");
15511 case NT_GNU_HWCAP:
15512 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
15513 case NT_GNU_BUILD_ID:
15514 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
0297aed6
DM
15515 case NT_GNU_GOLD_VERSION:
15516 return _("NT_GNU_GOLD_VERSION (gold version)");
1118d252
RM
15517 default:
15518 break;
15519 }
15520
15521 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15522 return buff;
15523}
15524
664f90a3
TT
15525static int
15526print_gnu_note (Elf_Internal_Note *pnote)
15527{
15528 switch (pnote->type)
15529 {
15530 case NT_GNU_BUILD_ID:
15531 {
15532 unsigned long i;
15533
15534 printf (_(" Build ID: "));
15535 for (i = 0; i < pnote->descsz; ++i)
15536 printf ("%02x", pnote->descdata[i] & 0xff);
9cf03b7e 15537 printf ("\n");
664f90a3
TT
15538 }
15539 break;
15540
15541 case NT_GNU_ABI_TAG:
15542 {
15543 unsigned long os, major, minor, subminor;
15544 const char *osname;
15545
3102e897
NC
15546 /* PR 17531: file: 030-599401-0.004. */
15547 if (pnote->descsz < 16)
15548 {
15549 printf (_(" <corrupt GNU_ABI_TAG>\n"));
15550 break;
15551 }
15552
664f90a3
TT
15553 os = byte_get ((unsigned char *) pnote->descdata, 4);
15554 major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
15555 minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
15556 subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
15557
15558 switch (os)
15559 {
15560 case GNU_ABI_TAG_LINUX:
15561 osname = "Linux";
15562 break;
15563 case GNU_ABI_TAG_HURD:
15564 osname = "Hurd";
15565 break;
15566 case GNU_ABI_TAG_SOLARIS:
15567 osname = "Solaris";
15568 break;
15569 case GNU_ABI_TAG_FREEBSD:
15570 osname = "FreeBSD";
15571 break;
15572 case GNU_ABI_TAG_NETBSD:
15573 osname = "NetBSD";
15574 break;
14ae95f2
RM
15575 case GNU_ABI_TAG_SYLLABLE:
15576 osname = "Syllable";
15577 break;
15578 case GNU_ABI_TAG_NACL:
15579 osname = "NaCl";
15580 break;
664f90a3
TT
15581 default:
15582 osname = "Unknown";
15583 break;
15584 }
15585
15586 printf (_(" OS: %s, ABI: %ld.%ld.%ld\n"), osname,
15587 major, minor, subminor);
15588 }
15589 break;
926c5385
CC
15590
15591 case NT_GNU_GOLD_VERSION:
15592 {
15593 unsigned long i;
15594
15595 printf (_(" Version: "));
15596 for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
15597 printf ("%c", pnote->descdata[i]);
15598 printf ("\n");
15599 }
15600 break;
664f90a3
TT
15601 }
15602
15603 return 1;
15604}
15605
685080f2
NC
15606static const char *
15607get_v850_elf_note_type (enum v850_notes n_type)
15608{
15609 static char buff[64];
15610
15611 switch (n_type)
15612 {
15613 case V850_NOTE_ALIGNMENT: return _("Alignment of 8-byte objects");
15614 case V850_NOTE_DATA_SIZE: return _("Sizeof double and long double");
15615 case V850_NOTE_FPU_INFO: return _("Type of FPU support needed");
15616 case V850_NOTE_SIMD_INFO: return _("Use of SIMD instructions");
15617 case V850_NOTE_CACHE_INFO: return _("Use of cache");
15618 case V850_NOTE_MMU_INFO: return _("Use of MMU");
15619 default:
15620 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
15621 return buff;
15622 }
15623}
15624
15625static int
15626print_v850_note (Elf_Internal_Note * pnote)
15627{
15628 unsigned int val;
15629
15630 if (pnote->descsz != 4)
15631 return 0;
15632 val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
15633
15634 if (val == 0)
15635 {
15636 printf (_("not set\n"));
15637 return 1;
15638 }
15639
15640 switch (pnote->type)
15641 {
15642 case V850_NOTE_ALIGNMENT:
15643 switch (val)
15644 {
15645 case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return 1;
15646 case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return 1;
15647 }
15648 break;
14ae95f2 15649
685080f2
NC
15650 case V850_NOTE_DATA_SIZE:
15651 switch (val)
15652 {
15653 case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return 1;
15654 case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return 1;
15655 }
15656 break;
14ae95f2 15657
685080f2
NC
15658 case V850_NOTE_FPU_INFO:
15659 switch (val)
15660 {
15661 case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return 1;
15662 case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return 1;
15663 }
15664 break;
14ae95f2 15665
685080f2
NC
15666 case V850_NOTE_MMU_INFO:
15667 case V850_NOTE_CACHE_INFO:
15668 case V850_NOTE_SIMD_INFO:
15669 if (val == EF_RH850_SIMD)
15670 {
15671 printf (_("yes\n"));
15672 return 1;
15673 }
15674 break;
15675
15676 default:
15677 /* An 'unknown note type' message will already have been displayed. */
15678 break;
15679 }
15680
15681 printf (_("unknown value: %x\n"), val);
15682 return 0;
15683}
15684
c6056a74
SF
15685static int
15686process_netbsd_elf_note (Elf_Internal_Note * pnote)
15687{
15688 unsigned int version;
15689
15690 switch (pnote->type)
15691 {
15692 case NT_NETBSD_IDENT:
15693 version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
15694 if ((version / 10000) % 100)
15695 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
15696 version, version / 100000000, (version / 1000000) % 100,
15697 (version / 10000) % 100 > 26 ? "Z" : "",
15698 'A' + (version / 10000) % 26);
15699 else
15700 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
15701 version, version / 100000000, (version / 1000000) % 100,
15702 (version / 100) % 100);
15703 return 1;
15704
15705 case NT_NETBSD_MARCH:
15706 printf (" NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
15707 pnote->descdata);
15708 return 1;
15709
15710 default:
15711 break;
15712 }
15713
15714 printf (" NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
15715 pnote->type);
15716 return 1;
15717}
15718
f4ddf30f
JB
15719static const char *
15720get_freebsd_elfcore_note_type (unsigned e_type)
15721{
f4ddf30f
JB
15722 switch (e_type)
15723 {
15724 case NT_FREEBSD_THRMISC:
15725 return _("NT_THRMISC (thrmisc structure)");
15726 case NT_FREEBSD_PROCSTAT_PROC:
15727 return _("NT_PROCSTAT_PROC (proc data)");
15728 case NT_FREEBSD_PROCSTAT_FILES:
15729 return _("NT_PROCSTAT_FILES (files data)");
15730 case NT_FREEBSD_PROCSTAT_VMMAP:
15731 return _("NT_PROCSTAT_VMMAP (vmmap data)");
15732 case NT_FREEBSD_PROCSTAT_GROUPS:
15733 return _("NT_PROCSTAT_GROUPS (groups data)");
15734 case NT_FREEBSD_PROCSTAT_UMASK:
15735 return _("NT_PROCSTAT_UMASK (umask data)");
15736 case NT_FREEBSD_PROCSTAT_RLIMIT:
15737 return _("NT_PROCSTAT_RLIMIT (rlimit data)");
15738 case NT_FREEBSD_PROCSTAT_OSREL:
15739 return _("NT_PROCSTAT_OSREL (osreldate data)");
15740 case NT_FREEBSD_PROCSTAT_PSSTRINGS:
15741 return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
15742 case NT_FREEBSD_PROCSTAT_AUXV:
15743 return _("NT_PROCSTAT_AUXV (auxv data)");
15744 }
15745 return get_note_type (e_type);
15746}
15747
9437c45b 15748static const char *
d3ba0551 15749get_netbsd_elfcore_note_type (unsigned e_type)
9437c45b
JT
15750{
15751 static char buff[64];
15752
b4db1224 15753 if (e_type == NT_NETBSDCORE_PROCINFO)
9437c45b
JT
15754 {
15755 /* NetBSD core "procinfo" structure. */
15756 return _("NetBSD procinfo structure");
15757 }
15758
15759 /* As of Jan 2002 there are no other machine-independent notes
15760 defined for NetBSD core files. If the note type is less
15761 than the start of the machine-dependent note types, we don't
15762 understand it. */
15763
b4db1224 15764 if (e_type < NT_NETBSDCORE_FIRSTMACH)
9437c45b 15765 {
e9e44622 15766 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
9437c45b
JT
15767 return buff;
15768 }
15769
15770 switch (elf_header.e_machine)
15771 {
15772 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
15773 and PT_GETFPREGS == mach+2. */
15774
15775 case EM_OLD_ALPHA:
15776 case EM_ALPHA:
15777 case EM_SPARC:
15778 case EM_SPARC32PLUS:
15779 case EM_SPARCV9:
15780 switch (e_type)
15781 {
2b692964 15782 case NT_NETBSDCORE_FIRSTMACH + 0:
b4db1224 15783 return _("PT_GETREGS (reg structure)");
2b692964 15784 case NT_NETBSDCORE_FIRSTMACH + 2:
b4db1224 15785 return _("PT_GETFPREGS (fpreg structure)");
9437c45b
JT
15786 default:
15787 break;
15788 }
15789 break;
15790
15791 /* On all other arch's, PT_GETREGS == mach+1 and
15792 PT_GETFPREGS == mach+3. */
15793 default:
15794 switch (e_type)
15795 {
2b692964 15796 case NT_NETBSDCORE_FIRSTMACH + 1:
b4db1224 15797 return _("PT_GETREGS (reg structure)");
2b692964 15798 case NT_NETBSDCORE_FIRSTMACH + 3:
b4db1224 15799 return _("PT_GETFPREGS (fpreg structure)");
9437c45b
JT
15800 default:
15801 break;
15802 }
15803 }
15804
9cf03b7e 15805 snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
e9e44622 15806 e_type - NT_NETBSDCORE_FIRSTMACH);
9437c45b
JT
15807 return buff;
15808}
15809
70616151
TT
15810static const char *
15811get_stapsdt_note_type (unsigned e_type)
15812{
15813 static char buff[64];
15814
15815 switch (e_type)
15816 {
15817 case NT_STAPSDT:
15818 return _("NT_STAPSDT (SystemTap probe descriptors)");
15819
15820 default:
15821 break;
15822 }
15823
15824 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15825 return buff;
15826}
15827
c6a9fc58
TT
15828static int
15829print_stapsdt_note (Elf_Internal_Note *pnote)
15830{
15831 int addr_size = is_32bit_elf ? 4 : 8;
15832 char *data = pnote->descdata;
15833 char *data_end = pnote->descdata + pnote->descsz;
15834 bfd_vma pc, base_addr, semaphore;
15835 char *provider, *probe, *arg_fmt;
15836
15837 pc = byte_get ((unsigned char *) data, addr_size);
15838 data += addr_size;
15839 base_addr = byte_get ((unsigned char *) data, addr_size);
15840 data += addr_size;
15841 semaphore = byte_get ((unsigned char *) data, addr_size);
15842 data += addr_size;
15843
15844 provider = data;
15845 data += strlen (data) + 1;
15846 probe = data;
15847 data += strlen (data) + 1;
15848 arg_fmt = data;
15849 data += strlen (data) + 1;
15850
15851 printf (_(" Provider: %s\n"), provider);
15852 printf (_(" Name: %s\n"), probe);
15853 printf (_(" Location: "));
15854 print_vma (pc, FULL_HEX);
15855 printf (_(", Base: "));
15856 print_vma (base_addr, FULL_HEX);
15857 printf (_(", Semaphore: "));
15858 print_vma (semaphore, FULL_HEX);
9cf03b7e 15859 printf ("\n");
c6a9fc58
TT
15860 printf (_(" Arguments: %s\n"), arg_fmt);
15861
15862 return data == data_end;
15863}
15864
00e98fc7
TG
15865static const char *
15866get_ia64_vms_note_type (unsigned e_type)
15867{
15868 static char buff[64];
15869
15870 switch (e_type)
15871 {
15872 case NT_VMS_MHD:
15873 return _("NT_VMS_MHD (module header)");
15874 case NT_VMS_LNM:
15875 return _("NT_VMS_LNM (language name)");
15876 case NT_VMS_SRC:
15877 return _("NT_VMS_SRC (source files)");
15878 case NT_VMS_TITLE:
9cf03b7e 15879 return "NT_VMS_TITLE";
00e98fc7
TG
15880 case NT_VMS_EIDC:
15881 return _("NT_VMS_EIDC (consistency check)");
15882 case NT_VMS_FPMODE:
15883 return _("NT_VMS_FPMODE (FP mode)");
15884 case NT_VMS_LINKTIME:
9cf03b7e 15885 return "NT_VMS_LINKTIME";
00e98fc7
TG
15886 case NT_VMS_IMGNAM:
15887 return _("NT_VMS_IMGNAM (image name)");
15888 case NT_VMS_IMGID:
15889 return _("NT_VMS_IMGID (image id)");
15890 case NT_VMS_LINKID:
15891 return _("NT_VMS_LINKID (link id)");
15892 case NT_VMS_IMGBID:
15893 return _("NT_VMS_IMGBID (build id)");
15894 case NT_VMS_GSTNAM:
15895 return _("NT_VMS_GSTNAM (sym table name)");
15896 case NT_VMS_ORIG_DYN:
9cf03b7e 15897 return "NT_VMS_ORIG_DYN";
00e98fc7 15898 case NT_VMS_PATCHTIME:
9cf03b7e 15899 return "NT_VMS_PATCHTIME";
00e98fc7
TG
15900 default:
15901 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15902 return buff;
15903 }
15904}
15905
15906static int
15907print_ia64_vms_note (Elf_Internal_Note * pnote)
15908{
15909 switch (pnote->type)
15910 {
15911 case NT_VMS_MHD:
15912 if (pnote->descsz > 36)
15913 {
15914 size_t l = strlen (pnote->descdata + 34);
15915 printf (_(" Creation date : %.17s\n"), pnote->descdata);
15916 printf (_(" Last patch date: %.17s\n"), pnote->descdata + 17);
15917 printf (_(" Module name : %s\n"), pnote->descdata + 34);
15918 printf (_(" Module version : %s\n"), pnote->descdata + 34 + l + 1);
15919 }
15920 else
15921 printf (_(" Invalid size\n"));
15922 break;
15923 case NT_VMS_LNM:
15924 printf (_(" Language: %s\n"), pnote->descdata);
15925 break;
15926#ifdef BFD64
15927 case NT_VMS_FPMODE:
9cf03b7e 15928 printf (_(" Floating Point mode: "));
4a5cb34f 15929 printf ("0x%016" BFD_VMA_FMT "x\n",
948f632f 15930 (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
00e98fc7
TG
15931 break;
15932 case NT_VMS_LINKTIME:
15933 printf (_(" Link time: "));
15934 print_vms_time
15935 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
15936 printf ("\n");
15937 break;
15938 case NT_VMS_PATCHTIME:
15939 printf (_(" Patch time: "));
15940 print_vms_time
15941 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
15942 printf ("\n");
15943 break;
15944 case NT_VMS_ORIG_DYN:
15945 printf (_(" Major id: %u, minor id: %u\n"),
15946 (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
15947 (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
9cf03b7e 15948 printf (_(" Last modified : "));
00e98fc7
TG
15949 print_vms_time
15950 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
9cf03b7e 15951 printf (_("\n Link flags : "));
4a5cb34f 15952 printf ("0x%016" BFD_VMA_FMT "x\n",
948f632f 15953 (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
00e98fc7 15954 printf (_(" Header flags: 0x%08x\n"),
948f632f 15955 (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
00e98fc7
TG
15956 printf (_(" Image id : %s\n"), pnote->descdata + 32);
15957 break;
15958#endif
15959 case NT_VMS_IMGNAM:
15960 printf (_(" Image name: %s\n"), pnote->descdata);
15961 break;
15962 case NT_VMS_GSTNAM:
15963 printf (_(" Global symbol table name: %s\n"), pnote->descdata);
15964 break;
15965 case NT_VMS_IMGID:
15966 printf (_(" Image id: %s\n"), pnote->descdata);
15967 break;
15968 case NT_VMS_LINKID:
15969 printf (_(" Linker id: %s\n"), pnote->descdata);
15970 break;
15971 default:
15972 break;
15973 }
15974 return 1;
15975}
15976
6d118b09
NC
15977/* Note that by the ELF standard, the name field is already null byte
15978 terminated, and namesz includes the terminating null byte.
15979 I.E. the value of namesz for the name "FSF" is 4.
15980
e3c8793a 15981 If the value of namesz is zero, there is no name present. */
779fe533 15982static int
2cf0635d 15983process_note (Elf_Internal_Note * pnote)
779fe533 15984{
2cf0635d
NC
15985 const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
15986 const char * nt;
9437c45b
JT
15987
15988 if (pnote->namesz == 0)
1ec5cd37
NC
15989 /* If there is no note name, then use the default set of
15990 note type strings. */
15991 nt = get_note_type (pnote->type);
15992
1118d252
RM
15993 else if (const_strneq (pnote->namedata, "GNU"))
15994 /* GNU-specific object file notes. */
15995 nt = get_gnu_elf_note_type (pnote->type);
f4ddf30f
JB
15996
15997 else if (const_strneq (pnote->namedata, "FreeBSD"))
15998 /* FreeBSD-specific core file notes. */
15999 nt = get_freebsd_elfcore_note_type (pnote->type);
1118d252 16000
0112cd26 16001 else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
1ec5cd37
NC
16002 /* NetBSD-specific core file notes. */
16003 nt = get_netbsd_elfcore_note_type (pnote->type);
16004
c6056a74
SF
16005 else if (const_strneq (pnote->namedata, "NetBSD"))
16006 /* NetBSD-specific core file notes. */
16007 return process_netbsd_elf_note (pnote);
16008
b15fa79e
AM
16009 else if (strneq (pnote->namedata, "SPU/", 4))
16010 {
16011 /* SPU-specific core file notes. */
16012 nt = pnote->namedata + 4;
16013 name = "SPU";
16014 }
16015
00e98fc7
TG
16016 else if (const_strneq (pnote->namedata, "IPF/VMS"))
16017 /* VMS/ia64-specific file notes. */
16018 nt = get_ia64_vms_note_type (pnote->type);
16019
70616151
TT
16020 else if (const_strneq (pnote->namedata, "stapsdt"))
16021 nt = get_stapsdt_note_type (pnote->type);
16022
9437c45b 16023 else
1ec5cd37
NC
16024 /* Don't recognize this note name; just use the default set of
16025 note type strings. */
00e98fc7 16026 nt = get_note_type (pnote->type);
9437c45b 16027
2aee03ae 16028 printf (" %-20s 0x%08lx\t%s\n", name, pnote->descsz, nt);
00e98fc7
TG
16029
16030 if (const_strneq (pnote->namedata, "IPF/VMS"))
16031 return print_ia64_vms_note (pnote);
664f90a3
TT
16032 else if (const_strneq (pnote->namedata, "GNU"))
16033 return print_gnu_note (pnote);
c6a9fc58
TT
16034 else if (const_strneq (pnote->namedata, "stapsdt"))
16035 return print_stapsdt_note (pnote);
9ece1fa9
TT
16036 else if (const_strneq (pnote->namedata, "CORE"))
16037 return print_core_note (pnote);
00e98fc7
TG
16038 else
16039 return 1;
779fe533
NC
16040}
16041
6d118b09 16042
779fe533 16043static int
2cf0635d 16044process_corefile_note_segment (FILE * file, bfd_vma offset, bfd_vma length)
779fe533 16045{
2cf0635d
NC
16046 Elf_External_Note * pnotes;
16047 Elf_External_Note * external;
c8071705 16048 char * end;
b34976b6 16049 int res = 1;
103f02d3 16050
779fe533
NC
16051 if (length <= 0)
16052 return 0;
103f02d3 16053
3f5e193b 16054 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
15b42fb0 16055 _("notes"));
dd24e3da 16056 if (pnotes == NULL)
a6e9f9df 16057 return 0;
779fe533 16058
103f02d3 16059 external = pnotes;
103f02d3 16060
9dd3a467 16061 printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
f3485b74 16062 (unsigned long) offset, (unsigned long) length);
2aee03ae 16063 printf (_(" %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
103f02d3 16064
c8071705
NC
16065 end = (char *) pnotes + length;
16066 while ((char *) external < end)
779fe533 16067 {
b34976b6 16068 Elf_Internal_Note inote;
15b42fb0
AM
16069 size_t min_notesz;
16070 char *next;
2cf0635d 16071 char * temp = NULL;
c8071705 16072 size_t data_remaining = end - (char *) external;
6d118b09 16073
00e98fc7 16074 if (!is_ia64_vms ())
15b42fb0 16075 {
9dd3a467
NC
16076 /* PR binutils/15191
16077 Make sure that there is enough data to read. */
15b42fb0
AM
16078 min_notesz = offsetof (Elf_External_Note, name);
16079 if (data_remaining < min_notesz)
9dd3a467
NC
16080 {
16081 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
16082 (int) data_remaining);
16083 break;
16084 }
15b42fb0
AM
16085 inote.type = BYTE_GET (external->type);
16086 inote.namesz = BYTE_GET (external->namesz);
16087 inote.namedata = external->name;
16088 inote.descsz = BYTE_GET (external->descsz);
16089 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
834f871c 16090 /* PR 17531: file: 3443835e. */
c8071705 16091 if (inote.descdata < (char *) pnotes || inote.descdata > end)
834f871c
NC
16092 {
16093 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
16094 inote.descdata = inote.namedata;
16095 inote.namesz = 0;
16096 }
14ae95f2 16097
15b42fb0
AM
16098 inote.descpos = offset + (inote.descdata - (char *) pnotes);
16099 next = inote.descdata + align_power (inote.descsz, 2);
16100 }
00e98fc7 16101 else
15b42fb0
AM
16102 {
16103 Elf64_External_VMS_Note *vms_external;
00e98fc7 16104
9dd3a467
NC
16105 /* PR binutils/15191
16106 Make sure that there is enough data to read. */
15b42fb0
AM
16107 min_notesz = offsetof (Elf64_External_VMS_Note, name);
16108 if (data_remaining < min_notesz)
9dd3a467
NC
16109 {
16110 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
16111 (int) data_remaining);
16112 break;
16113 }
3e55a963 16114
15b42fb0
AM
16115 vms_external = (Elf64_External_VMS_Note *) external;
16116 inote.type = BYTE_GET (vms_external->type);
16117 inote.namesz = BYTE_GET (vms_external->namesz);
16118 inote.namedata = vms_external->name;
16119 inote.descsz = BYTE_GET (vms_external->descsz);
16120 inote.descdata = inote.namedata + align_power (inote.namesz, 3);
16121 inote.descpos = offset + (inote.descdata - (char *) pnotes);
16122 next = inote.descdata + align_power (inote.descsz, 3);
16123 }
16124
16125 if (inote.descdata < (char *) external + min_notesz
16126 || next < (char *) external + min_notesz
5d921cbd
NC
16127 /* PR binutils/17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4. */
16128 || inote.namedata + inote.namesz < inote.namedata
16129 || inote.descdata + inote.descsz < inote.descdata
15b42fb0 16130 || data_remaining < (size_t)(next - (char *) external))
3e55a963 16131 {
15b42fb0 16132 warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
0af1713e 16133 (unsigned long) ((char *) external - (char *) pnotes));
9dd3a467 16134 warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
3e55a963
NC
16135 inote.type, inote.namesz, inote.descsz);
16136 break;
16137 }
16138
15b42fb0 16139 external = (Elf_External_Note *) next;
dd24e3da 16140
6d118b09
NC
16141 /* Verify that name is null terminated. It appears that at least
16142 one version of Linux (RedHat 6.0) generates corefiles that don't
16143 comply with the ELF spec by failing to include the null byte in
16144 namesz. */
8b971f9f 16145 if (inote.namedata[inote.namesz - 1] != '\0')
6d118b09 16146 {
3f5e193b 16147 temp = (char *) malloc (inote.namesz + 1);
6d118b09
NC
16148 if (temp == NULL)
16149 {
8b73c356 16150 error (_("Out of memory allocating space for inote name\n"));
6d118b09
NC
16151 res = 0;
16152 break;
16153 }
76da6bbe 16154
6d118b09
NC
16155 strncpy (temp, inote.namedata, inote.namesz);
16156 temp[inote.namesz] = 0;
76da6bbe 16157
6d118b09
NC
16158 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
16159 inote.namedata = temp;
16160 }
16161
16162 res &= process_note (& inote);
103f02d3 16163
6d118b09
NC
16164 if (temp != NULL)
16165 {
16166 free (temp);
16167 temp = NULL;
16168 }
779fe533
NC
16169 }
16170
16171 free (pnotes);
103f02d3 16172
779fe533
NC
16173 return res;
16174}
16175
16176static int
2cf0635d 16177process_corefile_note_segments (FILE * file)
779fe533 16178{
2cf0635d 16179 Elf_Internal_Phdr * segment;
b34976b6
AM
16180 unsigned int i;
16181 int res = 1;
103f02d3 16182
d93f0186 16183 if (! get_program_headers (file))
779fe533 16184 return 0;
103f02d3 16185
779fe533
NC
16186 for (i = 0, segment = program_headers;
16187 i < elf_header.e_phnum;
b34976b6 16188 i++, segment++)
779fe533
NC
16189 {
16190 if (segment->p_type == PT_NOTE)
103f02d3 16191 res &= process_corefile_note_segment (file,
30800947
NC
16192 (bfd_vma) segment->p_offset,
16193 (bfd_vma) segment->p_filesz);
779fe533 16194 }
103f02d3 16195
779fe533
NC
16196 return res;
16197}
16198
685080f2
NC
16199static int
16200process_v850_notes (FILE * file, bfd_vma offset, bfd_vma length)
16201{
16202 Elf_External_Note * pnotes;
16203 Elf_External_Note * external;
c8071705 16204 char * end;
685080f2
NC
16205 int res = 1;
16206
16207 if (length <= 0)
16208 return 0;
16209
16210 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
16211 _("v850 notes"));
16212 if (pnotes == NULL)
16213 return 0;
16214
16215 external = pnotes;
c8071705 16216 end = (char*) pnotes + length;
685080f2
NC
16217
16218 printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
16219 (unsigned long) offset, (unsigned long) length);
16220
c8071705 16221 while ((char *) external + sizeof (Elf_External_Note) < end)
685080f2
NC
16222 {
16223 Elf_External_Note * next;
16224 Elf_Internal_Note inote;
16225
16226 inote.type = BYTE_GET (external->type);
16227 inote.namesz = BYTE_GET (external->namesz);
16228 inote.namedata = external->name;
16229 inote.descsz = BYTE_GET (external->descsz);
16230 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
16231 inote.descpos = offset + (inote.descdata - (char *) pnotes);
16232
c8071705
NC
16233 if (inote.descdata < (char *) pnotes || inote.descdata >= end)
16234 {
16235 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
16236 inote.descdata = inote.namedata;
16237 inote.namesz = 0;
16238 }
16239
685080f2
NC
16240 next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
16241
c8071705 16242 if ( ((char *) next > end)
685080f2
NC
16243 || ((char *) next < (char *) pnotes))
16244 {
16245 warn (_("corrupt descsz found in note at offset 0x%lx\n"),
16246 (unsigned long) ((char *) external - (char *) pnotes));
16247 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
16248 inote.type, inote.namesz, inote.descsz);
16249 break;
16250 }
16251
16252 external = next;
16253
16254 /* Prevent out-of-bounds indexing. */
c8071705 16255 if ( inote.namedata + inote.namesz > end
685080f2
NC
16256 || inote.namedata + inote.namesz < inote.namedata)
16257 {
16258 warn (_("corrupt namesz found in note at offset 0x%lx\n"),
16259 (unsigned long) ((char *) external - (char *) pnotes));
16260 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
16261 inote.type, inote.namesz, inote.descsz);
16262 break;
16263 }
16264
16265 printf (" %s: ", get_v850_elf_note_type (inote.type));
16266
16267 if (! print_v850_note (& inote))
16268 {
16269 res = 0;
16270 printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
16271 inote.namesz, inote.descsz);
16272 }
16273 }
16274
16275 free (pnotes);
16276
16277 return res;
16278}
16279
779fe533 16280static int
2cf0635d 16281process_note_sections (FILE * file)
1ec5cd37 16282{
2cf0635d 16283 Elf_Internal_Shdr * section;
1ec5cd37 16284 unsigned long i;
df565f32 16285 int n = 0;
1ec5cd37
NC
16286 int res = 1;
16287
16288 for (i = 0, section = section_headers;
fa1908fd 16289 i < elf_header.e_shnum && section != NULL;
1ec5cd37 16290 i++, section++)
685080f2
NC
16291 {
16292 if (section->sh_type == SHT_NOTE)
16293 {
16294 res &= process_corefile_note_segment (file,
16295 (bfd_vma) section->sh_offset,
16296 (bfd_vma) section->sh_size);
16297 n++;
16298 }
16299
16300 if (( elf_header.e_machine == EM_V800
16301 || elf_header.e_machine == EM_V850
16302 || elf_header.e_machine == EM_CYGNUS_V850)
16303 && section->sh_type == SHT_RENESAS_INFO)
16304 {
16305 res &= process_v850_notes (file,
16306 (bfd_vma) section->sh_offset,
16307 (bfd_vma) section->sh_size);
16308 n++;
16309 }
16310 }
df565f32
NC
16311
16312 if (n == 0)
16313 /* Try processing NOTE segments instead. */
16314 return process_corefile_note_segments (file);
1ec5cd37
NC
16315
16316 return res;
16317}
16318
16319static int
2cf0635d 16320process_notes (FILE * file)
779fe533
NC
16321{
16322 /* If we have not been asked to display the notes then do nothing. */
16323 if (! do_notes)
16324 return 1;
103f02d3 16325
779fe533 16326 if (elf_header.e_type != ET_CORE)
1ec5cd37 16327 return process_note_sections (file);
103f02d3 16328
779fe533 16329 /* No program headers means no NOTE segment. */
1ec5cd37
NC
16330 if (elf_header.e_phnum > 0)
16331 return process_corefile_note_segments (file);
779fe533 16332
1ec5cd37
NC
16333 printf (_("No note segments present in the core file.\n"));
16334 return 1;
779fe533
NC
16335}
16336
252b5132 16337static int
2cf0635d 16338process_arch_specific (FILE * file)
252b5132 16339{
a952a375
NC
16340 if (! do_arch)
16341 return 1;
16342
252b5132
RH
16343 switch (elf_header.e_machine)
16344 {
11c1ff18
PB
16345 case EM_ARM:
16346 return process_arm_specific (file);
252b5132 16347 case EM_MIPS:
4fe85591 16348 case EM_MIPS_RS3_LE:
252b5132
RH
16349 return process_mips_specific (file);
16350 break;
35c08157
KLC
16351 case EM_NDS32:
16352 return process_nds32_specific (file);
16353 break;
34c8bcba
JM
16354 case EM_PPC:
16355 return process_power_specific (file);
16356 break;
643f7afb
AK
16357 case EM_S390:
16358 case EM_S390_OLD:
16359 return process_s390_specific (file);
16360 break;
9e8c70f9
DM
16361 case EM_SPARC:
16362 case EM_SPARC32PLUS:
16363 case EM_SPARCV9:
16364 return process_sparc_specific (file);
16365 break;
59e6276b
JM
16366 case EM_TI_C6000:
16367 return process_tic6x_specific (file);
16368 break;
13761a11
NC
16369 case EM_MSP430:
16370 return process_msp430x_specific (file);
252b5132
RH
16371 default:
16372 break;
16373 }
16374 return 1;
16375}
16376
16377static int
2cf0635d 16378get_file_header (FILE * file)
252b5132 16379{
9ea033b2
NC
16380 /* Read in the identity array. */
16381 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
252b5132
RH
16382 return 0;
16383
9ea033b2 16384 /* Determine how to read the rest of the header. */
b34976b6 16385 switch (elf_header.e_ident[EI_DATA])
9ea033b2
NC
16386 {
16387 default: /* fall through */
16388 case ELFDATANONE: /* fall through */
adab8cdc
AO
16389 case ELFDATA2LSB:
16390 byte_get = byte_get_little_endian;
16391 byte_put = byte_put_little_endian;
16392 break;
16393 case ELFDATA2MSB:
16394 byte_get = byte_get_big_endian;
16395 byte_put = byte_put_big_endian;
16396 break;
9ea033b2
NC
16397 }
16398
16399 /* For now we only support 32 bit and 64 bit ELF files. */
b34976b6 16400 is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
9ea033b2
NC
16401
16402 /* Read in the rest of the header. */
16403 if (is_32bit_elf)
16404 {
16405 Elf32_External_Ehdr ehdr32;
252b5132 16406
9ea033b2
NC
16407 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
16408 return 0;
103f02d3 16409
9ea033b2
NC
16410 elf_header.e_type = BYTE_GET (ehdr32.e_type);
16411 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
16412 elf_header.e_version = BYTE_GET (ehdr32.e_version);
16413 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
16414 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
16415 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
16416 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
16417 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
16418 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
16419 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
16420 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
16421 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
16422 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
16423 }
252b5132 16424 else
9ea033b2
NC
16425 {
16426 Elf64_External_Ehdr ehdr64;
a952a375
NC
16427
16428 /* If we have been compiled with sizeof (bfd_vma) == 4, then
16429 we will not be able to cope with the 64bit data found in
16430 64 ELF files. Detect this now and abort before we start
50c2245b 16431 overwriting things. */
a952a375
NC
16432 if (sizeof (bfd_vma) < 8)
16433 {
e3c8793a
NC
16434 error (_("This instance of readelf has been built without support for a\n\
1643564 bit data type and so it cannot read 64 bit ELF files.\n"));
a952a375
NC
16436 return 0;
16437 }
103f02d3 16438
9ea033b2
NC
16439 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
16440 return 0;
103f02d3 16441
9ea033b2
NC
16442 elf_header.e_type = BYTE_GET (ehdr64.e_type);
16443 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
16444 elf_header.e_version = BYTE_GET (ehdr64.e_version);
66543521
AM
16445 elf_header.e_entry = BYTE_GET (ehdr64.e_entry);
16446 elf_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
16447 elf_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
9ea033b2
NC
16448 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
16449 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
16450 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
16451 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
16452 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
16453 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
16454 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
16455 }
252b5132 16456
7ece0d85
JJ
16457 if (elf_header.e_shoff)
16458 {
16459 /* There may be some extensions in the first section header. Don't
16460 bomb if we can't read it. */
16461 if (is_32bit_elf)
049b0c3a 16462 get_32bit_section_headers (file, TRUE);
7ece0d85 16463 else
049b0c3a 16464 get_64bit_section_headers (file, TRUE);
7ece0d85 16465 }
560f3c1c 16466
252b5132
RH
16467 return 1;
16468}
16469
fb52b2f4
NC
16470/* Process one ELF object file according to the command line options.
16471 This file may actually be stored in an archive. The file is
16472 positioned at the start of the ELF object. */
16473
ff78d6d6 16474static int
2cf0635d 16475process_object (char * file_name, FILE * file)
252b5132 16476{
252b5132
RH
16477 unsigned int i;
16478
252b5132
RH
16479 if (! get_file_header (file))
16480 {
16481 error (_("%s: Failed to read file header\n"), file_name);
ff78d6d6 16482 return 1;
252b5132
RH
16483 }
16484
16485 /* Initialise per file variables. */
60bca95a 16486 for (i = ARRAY_SIZE (version_info); i--;)
252b5132
RH
16487 version_info[i] = 0;
16488
60bca95a 16489 for (i = ARRAY_SIZE (dynamic_info); i--;)
252b5132 16490 dynamic_info[i] = 0;
5115b233 16491 dynamic_info_DT_GNU_HASH = 0;
252b5132
RH
16492
16493 /* Process the file. */
16494 if (show_name)
16495 printf (_("\nFile: %s\n"), file_name);
16496
18bd398b
NC
16497 /* Initialise the dump_sects array from the cmdline_dump_sects array.
16498 Note we do this even if cmdline_dump_sects is empty because we
16499 must make sure that the dump_sets array is zeroed out before each
16500 object file is processed. */
16501 if (num_dump_sects > num_cmdline_dump_sects)
09c11c86 16502 memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
18bd398b
NC
16503
16504 if (num_cmdline_dump_sects > 0)
16505 {
16506 if (num_dump_sects == 0)
16507 /* A sneaky way of allocating the dump_sects array. */
09c11c86 16508 request_dump_bynumber (num_cmdline_dump_sects, 0);
18bd398b
NC
16509
16510 assert (num_dump_sects >= num_cmdline_dump_sects);
09c11c86
NC
16511 memcpy (dump_sects, cmdline_dump_sects,
16512 num_cmdline_dump_sects * sizeof (* dump_sects));
18bd398b 16513 }
d70c5fc7 16514
252b5132 16515 if (! process_file_header ())
fb52b2f4 16516 return 1;
252b5132 16517
d1f5c6e3 16518 if (! process_section_headers (file))
2f62977e 16519 {
d1f5c6e3
L
16520 /* Without loaded section headers we cannot process lots of
16521 things. */
2f62977e 16522 do_unwind = do_version = do_dump = do_arch = 0;
252b5132 16523
2f62977e 16524 if (! do_using_dynamic)
2c610e4b 16525 do_syms = do_dyn_syms = do_reloc = 0;
2f62977e 16526 }
252b5132 16527
d1f5c6e3
L
16528 if (! process_section_groups (file))
16529 {
16530 /* Without loaded section groups we cannot process unwind. */
16531 do_unwind = 0;
16532 }
16533
2f62977e 16534 if (process_program_headers (file))
b2d38a17 16535 process_dynamic_section (file);
252b5132
RH
16536
16537 process_relocs (file);
16538
4d6ed7c8
NC
16539 process_unwind (file);
16540
252b5132
RH
16541 process_symbol_table (file);
16542
16543 process_syminfo (file);
16544
16545 process_version_sections (file);
16546
16547 process_section_contents (file);
f5842774 16548
1ec5cd37 16549 process_notes (file);
103f02d3 16550
047b2264
JJ
16551 process_gnu_liblist (file);
16552
252b5132
RH
16553 process_arch_specific (file);
16554
d93f0186
NC
16555 if (program_headers)
16556 {
16557 free (program_headers);
16558 program_headers = NULL;
16559 }
16560
252b5132
RH
16561 if (section_headers)
16562 {
16563 free (section_headers);
16564 section_headers = NULL;
16565 }
16566
16567 if (string_table)
16568 {
16569 free (string_table);
16570 string_table = NULL;
d40ac9bd 16571 string_table_length = 0;
252b5132
RH
16572 }
16573
16574 if (dynamic_strings)
16575 {
16576 free (dynamic_strings);
16577 dynamic_strings = NULL;
d79b3d50 16578 dynamic_strings_length = 0;
252b5132
RH
16579 }
16580
16581 if (dynamic_symbols)
16582 {
16583 free (dynamic_symbols);
16584 dynamic_symbols = NULL;
19936277 16585 num_dynamic_syms = 0;
252b5132
RH
16586 }
16587
16588 if (dynamic_syminfo)
16589 {
16590 free (dynamic_syminfo);
16591 dynamic_syminfo = NULL;
16592 }
ff78d6d6 16593
293c573e
MR
16594 if (dynamic_section)
16595 {
16596 free (dynamic_section);
16597 dynamic_section = NULL;
16598 }
16599
e4b17d5c
L
16600 if (section_headers_groups)
16601 {
16602 free (section_headers_groups);
16603 section_headers_groups = NULL;
16604 }
16605
16606 if (section_groups)
16607 {
2cf0635d
NC
16608 struct group_list * g;
16609 struct group_list * next;
e4b17d5c
L
16610
16611 for (i = 0; i < group_count; i++)
16612 {
16613 for (g = section_groups [i].root; g != NULL; g = next)
16614 {
16615 next = g->next;
16616 free (g);
16617 }
16618 }
16619
16620 free (section_groups);
16621 section_groups = NULL;
16622 }
16623
19e6b90e 16624 free_debug_memory ();
18bd398b 16625
ff78d6d6 16626 return 0;
252b5132
RH
16627}
16628
2cf0635d
NC
16629/* Process an ELF archive.
16630 On entry the file is positioned just after the ARMAG string. */
16631
16632static int
16633process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
16634{
16635 struct archive_info arch;
16636 struct archive_info nested_arch;
16637 size_t got;
2cf0635d
NC
16638 int ret;
16639
16640 show_name = 1;
16641
16642 /* The ARCH structure is used to hold information about this archive. */
16643 arch.file_name = NULL;
16644 arch.file = NULL;
16645 arch.index_array = NULL;
16646 arch.sym_table = NULL;
16647 arch.longnames = NULL;
16648
16649 /* The NESTED_ARCH structure is used as a single-item cache of information
16650 about a nested archive (when members of a thin archive reside within
16651 another regular archive file). */
16652 nested_arch.file_name = NULL;
16653 nested_arch.file = NULL;
16654 nested_arch.index_array = NULL;
16655 nested_arch.sym_table = NULL;
16656 nested_arch.longnames = NULL;
16657
16658 if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
16659 {
16660 ret = 1;
16661 goto out;
4145f1d5 16662 }
fb52b2f4 16663
4145f1d5
NC
16664 if (do_archive_index)
16665 {
2cf0635d 16666 if (arch.sym_table == NULL)
4145f1d5
NC
16667 error (_("%s: unable to dump the index as none was found\n"), file_name);
16668 else
16669 {
591f7597 16670 unsigned long i, l;
4145f1d5
NC
16671 unsigned long current_pos;
16672
591f7597
NC
16673 printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
16674 file_name, (unsigned long) arch.index_num, arch.sym_size);
4145f1d5
NC
16675 current_pos = ftell (file);
16676
2cf0635d 16677 for (i = l = 0; i < arch.index_num; i++)
4145f1d5 16678 {
2cf0635d
NC
16679 if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
16680 {
16681 char * member_name;
4145f1d5 16682
2cf0635d
NC
16683 member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
16684
16685 if (member_name != NULL)
16686 {
16687 char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
16688
16689 if (qualified_name != NULL)
16690 {
c2a7d3f5
NC
16691 printf (_("Contents of binary %s at offset "), qualified_name);
16692 (void) print_vma (arch.index_array[i], PREFIX_HEX);
16693 putchar ('\n');
2cf0635d
NC
16694 free (qualified_name);
16695 }
4145f1d5
NC
16696 }
16697 }
2cf0635d
NC
16698
16699 if (l >= arch.sym_size)
4145f1d5
NC
16700 {
16701 error (_("%s: end of the symbol table reached before the end of the index\n"),
16702 file_name);
cb8f3167 16703 break;
4145f1d5 16704 }
591f7597
NC
16705 /* PR 17531: file: 0b6630b2. */
16706 printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
16707 l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
4145f1d5
NC
16708 }
16709
c2a7d3f5
NC
16710 if (arch.uses_64bit_indicies)
16711 l = (l + 7) & ~ 7;
16712 else
16713 l += l & 1;
16714
2cf0635d 16715 if (l < arch.sym_size)
c2a7d3f5
NC
16716 error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
16717 file_name, arch.sym_size - l);
4145f1d5 16718
4145f1d5
NC
16719 if (fseek (file, current_pos, SEEK_SET) != 0)
16720 {
16721 error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
2cf0635d
NC
16722 ret = 1;
16723 goto out;
4145f1d5 16724 }
fb52b2f4 16725 }
4145f1d5
NC
16726
16727 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
16728 && !do_segments && !do_header && !do_dump && !do_version
16729 && !do_histogram && !do_debugging && !do_arch && !do_notes
2c610e4b 16730 && !do_section_groups && !do_dyn_syms)
2cf0635d
NC
16731 {
16732 ret = 0; /* Archive index only. */
16733 goto out;
16734 }
fb52b2f4
NC
16735 }
16736
d989285c 16737 ret = 0;
fb52b2f4
NC
16738
16739 while (1)
16740 {
2cf0635d
NC
16741 char * name;
16742 size_t namelen;
16743 char * qualified_name;
16744
16745 /* Read the next archive header. */
16746 if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
16747 {
16748 error (_("%s: failed to seek to next archive header\n"), file_name);
16749 return 1;
16750 }
16751 got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
16752 if (got != sizeof arch.arhdr)
16753 {
16754 if (got == 0)
16755 break;
16756 error (_("%s: failed to read archive header\n"), file_name);
16757 ret = 1;
16758 break;
16759 }
16760 if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
16761 {
16762 error (_("%s: did not find a valid archive header\n"), arch.file_name);
16763 ret = 1;
16764 break;
16765 }
16766
16767 arch.next_arhdr_offset += sizeof arch.arhdr;
16768
16769 archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
16770 if (archive_file_size & 01)
16771 ++archive_file_size;
16772
16773 name = get_archive_member_name (&arch, &nested_arch);
16774 if (name == NULL)
fb52b2f4 16775 {
0fd3a477 16776 error (_("%s: bad archive file name\n"), file_name);
d989285c
ILT
16777 ret = 1;
16778 break;
fb52b2f4 16779 }
2cf0635d 16780 namelen = strlen (name);
fb52b2f4 16781
2cf0635d
NC
16782 qualified_name = make_qualified_name (&arch, &nested_arch, name);
16783 if (qualified_name == NULL)
fb52b2f4 16784 {
2cf0635d 16785 error (_("%s: bad archive file name\n"), file_name);
d989285c
ILT
16786 ret = 1;
16787 break;
fb52b2f4
NC
16788 }
16789
2cf0635d
NC
16790 if (is_thin_archive && arch.nested_member_origin == 0)
16791 {
16792 /* This is a proxy for an external member of a thin archive. */
16793 FILE * member_file;
16794 char * member_file_name = adjust_relative_path (file_name, name, namelen);
16795 if (member_file_name == NULL)
16796 {
16797 ret = 1;
16798 break;
16799 }
16800
16801 member_file = fopen (member_file_name, "rb");
16802 if (member_file == NULL)
16803 {
16804 error (_("Input file '%s' is not readable.\n"), member_file_name);
16805 free (member_file_name);
16806 ret = 1;
16807 break;
16808 }
16809
16810 archive_file_offset = arch.nested_member_origin;
16811
16812 ret |= process_object (qualified_name, member_file);
16813
16814 fclose (member_file);
16815 free (member_file_name);
16816 }
16817 else if (is_thin_archive)
16818 {
a043396b
NC
16819 /* PR 15140: Allow for corrupt thin archives. */
16820 if (nested_arch.file == NULL)
16821 {
16822 error (_("%s: contains corrupt thin archive: %s\n"),
16823 file_name, name);
16824 ret = 1;
16825 break;
16826 }
16827
2cf0635d
NC
16828 /* This is a proxy for a member of a nested archive. */
16829 archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
16830
16831 /* The nested archive file will have been opened and setup by
16832 get_archive_member_name. */
16833 if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
16834 {
16835 error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
16836 ret = 1;
16837 break;
16838 }
16839
16840 ret |= process_object (qualified_name, nested_arch.file);
16841 }
16842 else
16843 {
16844 archive_file_offset = arch.next_arhdr_offset;
16845 arch.next_arhdr_offset += archive_file_size;
fb52b2f4 16846
2cf0635d
NC
16847 ret |= process_object (qualified_name, file);
16848 }
fb52b2f4 16849
2b52916e
L
16850 if (dump_sects != NULL)
16851 {
16852 free (dump_sects);
16853 dump_sects = NULL;
16854 num_dump_sects = 0;
16855 }
16856
2cf0635d 16857 free (qualified_name);
fb52b2f4
NC
16858 }
16859
4145f1d5 16860 out:
2cf0635d
NC
16861 if (nested_arch.file != NULL)
16862 fclose (nested_arch.file);
16863 release_archive (&nested_arch);
16864 release_archive (&arch);
fb52b2f4 16865
d989285c 16866 return ret;
fb52b2f4
NC
16867}
16868
16869static int
2cf0635d 16870process_file (char * file_name)
fb52b2f4 16871{
2cf0635d 16872 FILE * file;
fb52b2f4
NC
16873 struct stat statbuf;
16874 char armag[SARMAG];
16875 int ret;
16876
16877 if (stat (file_name, &statbuf) < 0)
16878 {
f24ddbdd
NC
16879 if (errno == ENOENT)
16880 error (_("'%s': No such file\n"), file_name);
16881 else
16882 error (_("Could not locate '%s'. System error message: %s\n"),
16883 file_name, strerror (errno));
16884 return 1;
16885 }
16886
16887 if (! S_ISREG (statbuf.st_mode))
16888 {
16889 error (_("'%s' is not an ordinary file\n"), file_name);
fb52b2f4
NC
16890 return 1;
16891 }
16892
16893 file = fopen (file_name, "rb");
16894 if (file == NULL)
16895 {
f24ddbdd 16896 error (_("Input file '%s' is not readable.\n"), file_name);
fb52b2f4
NC
16897 return 1;
16898 }
16899
16900 if (fread (armag, SARMAG, 1, file) != 1)
16901 {
4145f1d5 16902 error (_("%s: Failed to read file's magic number\n"), file_name);
fb52b2f4
NC
16903 fclose (file);
16904 return 1;
16905 }
16906
f54498b4
NC
16907 current_file_size = (bfd_size_type) statbuf.st_size;
16908
fb52b2f4 16909 if (memcmp (armag, ARMAG, SARMAG) == 0)
2cf0635d
NC
16910 ret = process_archive (file_name, file, FALSE);
16911 else if (memcmp (armag, ARMAGT, SARMAG) == 0)
16912 ret = process_archive (file_name, file, TRUE);
fb52b2f4
NC
16913 else
16914 {
4145f1d5
NC
16915 if (do_archive_index)
16916 error (_("File %s is not an archive so its index cannot be displayed.\n"),
16917 file_name);
16918
fb52b2f4
NC
16919 rewind (file);
16920 archive_file_size = archive_file_offset = 0;
16921 ret = process_object (file_name, file);
16922 }
16923
16924 fclose (file);
16925
f54498b4 16926 current_file_size = 0;
fb52b2f4
NC
16927 return ret;
16928}
16929
252b5132
RH
16930#ifdef SUPPORT_DISASSEMBLY
16931/* Needed by the i386 disassembler. For extra credit, someone could
9ea033b2 16932 fix this so that we insert symbolic addresses here, esp for GOT/PLT
e3c8793a 16933 symbols. */
252b5132
RH
16934
16935void
2cf0635d 16936print_address (unsigned int addr, FILE * outfile)
252b5132
RH
16937{
16938 fprintf (outfile,"0x%8.8x", addr);
16939}
16940
e3c8793a 16941/* Needed by the i386 disassembler. */
252b5132
RH
16942void
16943db_task_printsym (unsigned int addr)
16944{
16945 print_address (addr, stderr);
16946}
16947#endif
16948
16949int
2cf0635d 16950main (int argc, char ** argv)
252b5132 16951{
ff78d6d6
L
16952 int err;
16953
252b5132
RH
16954#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
16955 setlocale (LC_MESSAGES, "");
3882b010
L
16956#endif
16957#if defined (HAVE_SETLOCALE)
16958 setlocale (LC_CTYPE, "");
252b5132
RH
16959#endif
16960 bindtextdomain (PACKAGE, LOCALEDIR);
16961 textdomain (PACKAGE);
16962
869b9d07
MM
16963 expandargv (&argc, &argv);
16964
252b5132
RH
16965 parse_args (argc, argv);
16966
18bd398b 16967 if (num_dump_sects > 0)
59f14fc0 16968 {
18bd398b 16969 /* Make a copy of the dump_sects array. */
3f5e193b
NC
16970 cmdline_dump_sects = (dump_type *)
16971 malloc (num_dump_sects * sizeof (* dump_sects));
59f14fc0 16972 if (cmdline_dump_sects == NULL)
591a748a 16973 error (_("Out of memory allocating dump request table.\n"));
59f14fc0
AS
16974 else
16975 {
09c11c86
NC
16976 memcpy (cmdline_dump_sects, dump_sects,
16977 num_dump_sects * sizeof (* dump_sects));
59f14fc0
AS
16978 num_cmdline_dump_sects = num_dump_sects;
16979 }
16980 }
16981
18bd398b
NC
16982 if (optind < (argc - 1))
16983 show_name = 1;
5656ba2c
L
16984 else if (optind >= argc)
16985 {
16986 warn (_("Nothing to do.\n"));
16987 usage (stderr);
16988 }
18bd398b 16989
ff78d6d6 16990 err = 0;
252b5132 16991 while (optind < argc)
18bd398b 16992 err |= process_file (argv[optind++]);
252b5132
RH
16993
16994 if (dump_sects != NULL)
16995 free (dump_sects);
59f14fc0
AS
16996 if (cmdline_dump_sects != NULL)
16997 free (cmdline_dump_sects);
252b5132 16998
ff78d6d6 16999 return err;
252b5132 17000}
This page took 2.910751 seconds and 4 git commands to generate.