]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - binutils/readelf.c
PowerPC64, Don't copy weak symbol dyn_relocs to weakdef.
[thirdparty/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 {
7bfd842d 5925 printf (" [%2u] ", i);
5477e8a0 5926 if (do_section_details)
74e1a04b 5927 printf ("%s\n ", printable_section_name (section));
595cf52e 5928 else
74e1a04b 5929 print_symbol (-17, SECTION_NAME (section));
0b4362b0 5930
ea52a088
NC
5931 printf (do_wide ? " %-15s " : " %-15.15s ",
5932 get_section_type_name (section->sh_type));
0b4362b0 5933
f7a99963
NC
5934 if (is_32bit_elf)
5935 {
cfcac11d
NC
5936 const char * link_too_big = NULL;
5937
f7a99963 5938 print_vma (section->sh_addr, LONG_HEX);
76da6bbe 5939
f7a99963
NC
5940 printf ( " %6.6lx %6.6lx %2.2lx",
5941 (unsigned long) section->sh_offset,
5942 (unsigned long) section->sh_size,
5943 (unsigned long) section->sh_entsize);
d1133906 5944
5477e8a0
L
5945 if (do_section_details)
5946 fputs (" ", stdout);
5947 else
5948 printf (" %3s ", get_elf_section_flags (section->sh_flags));
76da6bbe 5949
cfcac11d
NC
5950 if (section->sh_link >= elf_header.e_shnum)
5951 {
5952 link_too_big = "";
5953 /* The sh_link value is out of range. Normally this indicates
caa83f8b 5954 an error but it can have special values in Solaris binaries. */
cfcac11d
NC
5955 switch (elf_header.e_machine)
5956 {
caa83f8b 5957 case EM_386:
22abe556 5958 case EM_IAMCU:
caa83f8b 5959 case EM_X86_64:
7f502d6c 5960 case EM_L1OM:
7a9068fe 5961 case EM_K1OM:
cfcac11d
NC
5962 case EM_OLD_SPARCV9:
5963 case EM_SPARC32PLUS:
5964 case EM_SPARCV9:
5965 case EM_SPARC:
5966 if (section->sh_link == (SHN_BEFORE & 0xffff))
5967 link_too_big = "BEFORE";
5968 else if (section->sh_link == (SHN_AFTER & 0xffff))
5969 link_too_big = "AFTER";
5970 break;
5971 default:
5972 break;
5973 }
5974 }
5975
5976 if (do_section_details)
5977 {
5978 if (link_too_big != NULL && * link_too_big)
5979 printf ("<%s> ", link_too_big);
5980 else
5981 printf ("%2u ", section->sh_link);
5982 printf ("%3u %2lu\n", section->sh_info,
5983 (unsigned long) section->sh_addralign);
5984 }
5985 else
5986 printf ("%2u %3u %2lu\n",
5987 section->sh_link,
5988 section->sh_info,
5989 (unsigned long) section->sh_addralign);
5990
5991 if (link_too_big && ! * link_too_big)
5992 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
5993 i, section->sh_link);
f7a99963 5994 }
d974e256
JJ
5995 else if (do_wide)
5996 {
5997 print_vma (section->sh_addr, LONG_HEX);
5998
5999 if ((long) section->sh_offset == section->sh_offset)
6000 printf (" %6.6lx", (unsigned long) section->sh_offset);
6001 else
6002 {
6003 putchar (' ');
6004 print_vma (section->sh_offset, LONG_HEX);
6005 }
6006
6007 if ((unsigned long) section->sh_size == section->sh_size)
6008 printf (" %6.6lx", (unsigned long) section->sh_size);
6009 else
6010 {
6011 putchar (' ');
6012 print_vma (section->sh_size, LONG_HEX);
6013 }
6014
6015 if ((unsigned long) section->sh_entsize == section->sh_entsize)
6016 printf (" %2.2lx", (unsigned long) section->sh_entsize);
6017 else
6018 {
6019 putchar (' ');
6020 print_vma (section->sh_entsize, LONG_HEX);
6021 }
6022
5477e8a0
L
6023 if (do_section_details)
6024 fputs (" ", stdout);
6025 else
6026 printf (" %3s ", get_elf_section_flags (section->sh_flags));
d974e256 6027
72de5009 6028 printf ("%2u %3u ", section->sh_link, section->sh_info);
d974e256
JJ
6029
6030 if ((unsigned long) section->sh_addralign == section->sh_addralign)
72de5009 6031 printf ("%2lu\n", (unsigned long) section->sh_addralign);
d974e256
JJ
6032 else
6033 {
6034 print_vma (section->sh_addralign, DEC);
6035 putchar ('\n');
6036 }
6037 }
5477e8a0 6038 else if (do_section_details)
595cf52e 6039 {
5477e8a0 6040 printf (" %-15.15s ",
595cf52e 6041 get_section_type_name (section->sh_type));
595cf52e
L
6042 print_vma (section->sh_addr, LONG_HEX);
6043 if ((long) section->sh_offset == section->sh_offset)
5477e8a0 6044 printf (" %16.16lx", (unsigned long) section->sh_offset);
595cf52e
L
6045 else
6046 {
6047 printf (" ");
6048 print_vma (section->sh_offset, LONG_HEX);
6049 }
72de5009 6050 printf (" %u\n ", section->sh_link);
595cf52e 6051 print_vma (section->sh_size, LONG_HEX);
5477e8a0 6052 putchar (' ');
595cf52e
L
6053 print_vma (section->sh_entsize, LONG_HEX);
6054
72de5009
AM
6055 printf (" %-16u %lu\n",
6056 section->sh_info,
595cf52e
L
6057 (unsigned long) section->sh_addralign);
6058 }
f7a99963
NC
6059 else
6060 {
6061 putchar (' ');
6062 print_vma (section->sh_addr, LONG_HEX);
53c7db4b
KH
6063 if ((long) section->sh_offset == section->sh_offset)
6064 printf (" %8.8lx", (unsigned long) section->sh_offset);
6065 else
6066 {
6067 printf (" ");
6068 print_vma (section->sh_offset, LONG_HEX);
6069 }
f7a99963
NC
6070 printf ("\n ");
6071 print_vma (section->sh_size, LONG_HEX);
6072 printf (" ");
6073 print_vma (section->sh_entsize, LONG_HEX);
76da6bbe 6074
d1133906 6075 printf (" %3s ", get_elf_section_flags (section->sh_flags));
76da6bbe 6076
72de5009
AM
6077 printf (" %2u %3u %lu\n",
6078 section->sh_link,
6079 section->sh_info,
f7a99963
NC
6080 (unsigned long) section->sh_addralign);
6081 }
5477e8a0
L
6082
6083 if (do_section_details)
77115a4a
L
6084 {
6085 printf (" %s\n", get_elf_section_flags (section->sh_flags));
6086 if ((section->sh_flags & SHF_COMPRESSED) != 0)
6087 {
6088 /* Minimum section size is 12 bytes for 32-bit compression
6089 header + 12 bytes for compressed data header. */
6090 unsigned char buf[24];
d8024a91 6091
77115a4a
L
6092 assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
6093 if (get_data (&buf, (FILE *) file, section->sh_offset, 1,
6094 sizeof (buf), _("compression header")))
6095 {
6096 Elf_Internal_Chdr chdr;
d8024a91
NC
6097
6098 (void) get_compression_header (&chdr, buf);
6099
77115a4a
L
6100 if (chdr.ch_type == ELFCOMPRESS_ZLIB)
6101 printf (" ZLIB, ");
6102 else
6103 printf (_(" [<unknown>: 0x%x], "),
6104 chdr.ch_type);
6105 print_vma (chdr.ch_size, LONG_HEX);
6106 printf (", %lu\n", (unsigned long) chdr.ch_addralign);
6107 }
6108 }
6109 }
252b5132
RH
6110 }
6111
5477e8a0 6112 if (!do_section_details)
3dbcc61d 6113 {
9fb71ee4
NC
6114 /* The ordering of the letters shown here matches the ordering of the
6115 corresponding SHF_xxx values, and hence the order in which these
6116 letters will be displayed to the user. */
6117 printf (_("Key to Flags:\n\
6118 W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6119 L (link order), O (extra OS processing required), G (group), T (TLS),\n\
fd85a6a1 6120 C (compressed), x (unknown), o (OS specific), E (exclude),\n "));
3dbcc61d 6121 if (elf_header.e_machine == EM_X86_64
7a9068fe
L
6122 || elf_header.e_machine == EM_L1OM
6123 || elf_header.e_machine == EM_K1OM)
9fb71ee4 6124 printf (_("l (large), "));
91f68a68 6125 else if (elf_header.e_machine == EM_ARM)
f0728ee3 6126 printf (_("y (purecode), "));
9fb71ee4 6127 printf ("p (processor specific)\n");
0b4362b0 6128 }
d1133906 6129
252b5132
RH
6130 return 1;
6131}
6132
f5842774
L
6133static const char *
6134get_group_flags (unsigned int flags)
6135{
6136 static char buff[32];
6137 switch (flags)
6138 {
220453ec
AM
6139 case 0:
6140 return "";
6141
f5842774 6142 case GRP_COMDAT:
220453ec 6143 return "COMDAT ";
f5842774
L
6144
6145 default:
220453ec 6146 snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x] "), flags);
f5842774
L
6147 break;
6148 }
6149 return buff;
6150}
6151
6152static int
2cf0635d 6153process_section_groups (FILE * file)
f5842774 6154{
2cf0635d 6155 Elf_Internal_Shdr * section;
f5842774 6156 unsigned int i;
2cf0635d
NC
6157 struct group * group;
6158 Elf_Internal_Shdr * symtab_sec;
6159 Elf_Internal_Shdr * strtab_sec;
6160 Elf_Internal_Sym * symtab;
ba5cdace 6161 unsigned long num_syms;
2cf0635d 6162 char * strtab;
c256ffe7 6163 size_t strtab_size;
d1f5c6e3
L
6164
6165 /* Don't process section groups unless needed. */
6166 if (!do_unwind && !do_section_groups)
6167 return 1;
f5842774
L
6168
6169 if (elf_header.e_shnum == 0)
6170 {
6171 if (do_section_groups)
82f2dbf7 6172 printf (_("\nThere are no sections to group in this file.\n"));
f5842774
L
6173
6174 return 1;
6175 }
6176
6177 if (section_headers == NULL)
6178 {
6179 error (_("Section headers are not available!\n"));
fa1908fd
NC
6180 /* PR 13622: This can happen with a corrupt ELF header. */
6181 return 0;
f5842774
L
6182 }
6183
3f5e193b
NC
6184 section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
6185 sizeof (struct group *));
e4b17d5c
L
6186
6187 if (section_headers_groups == NULL)
6188 {
8b73c356
NC
6189 error (_("Out of memory reading %u section group headers\n"),
6190 elf_header.e_shnum);
e4b17d5c
L
6191 return 0;
6192 }
6193
f5842774 6194 /* Scan the sections for the group section. */
d1f5c6e3 6195 group_count = 0;
f5842774
L
6196 for (i = 0, section = section_headers;
6197 i < elf_header.e_shnum;
6198 i++, section++)
e4b17d5c
L
6199 if (section->sh_type == SHT_GROUP)
6200 group_count++;
6201
d1f5c6e3
L
6202 if (group_count == 0)
6203 {
6204 if (do_section_groups)
6205 printf (_("\nThere are no section groups in this file.\n"));
6206
6207 return 1;
6208 }
6209
3f5e193b 6210 section_groups = (struct group *) calloc (group_count, sizeof (struct group));
e4b17d5c
L
6211
6212 if (section_groups == NULL)
6213 {
8b73c356
NC
6214 error (_("Out of memory reading %lu groups\n"),
6215 (unsigned long) group_count);
e4b17d5c
L
6216 return 0;
6217 }
6218
d1f5c6e3
L
6219 symtab_sec = NULL;
6220 strtab_sec = NULL;
6221 symtab = NULL;
ba5cdace 6222 num_syms = 0;
d1f5c6e3 6223 strtab = NULL;
c256ffe7 6224 strtab_size = 0;
e4b17d5c
L
6225 for (i = 0, section = section_headers, group = section_groups;
6226 i < elf_header.e_shnum;
6227 i++, section++)
f5842774
L
6228 {
6229 if (section->sh_type == SHT_GROUP)
6230 {
74e1a04b
NC
6231 const char * name = printable_section_name (section);
6232 const char * group_name;
2cf0635d
NC
6233 unsigned char * start;
6234 unsigned char * indices;
f5842774 6235 unsigned int entry, j, size;
2cf0635d
NC
6236 Elf_Internal_Shdr * sec;
6237 Elf_Internal_Sym * sym;
f5842774
L
6238
6239 /* Get the symbol table. */
4fbb74a6
AM
6240 if (section->sh_link >= elf_header.e_shnum
6241 || ((sec = section_headers + section->sh_link)->sh_type
c256ffe7 6242 != SHT_SYMTAB))
f5842774
L
6243 {
6244 error (_("Bad sh_link in group section `%s'\n"), name);
6245 continue;
6246 }
d1f5c6e3
L
6247
6248 if (symtab_sec != sec)
6249 {
6250 symtab_sec = sec;
6251 if (symtab)
6252 free (symtab);
ba5cdace 6253 symtab = GET_ELF_SYMBOLS (file, symtab_sec, & num_syms);
d1f5c6e3 6254 }
f5842774 6255
dd24e3da
NC
6256 if (symtab == NULL)
6257 {
6258 error (_("Corrupt header in group section `%s'\n"), name);
6259 continue;
6260 }
6261
ba5cdace
NC
6262 if (section->sh_info >= num_syms)
6263 {
6264 error (_("Bad sh_info in group section `%s'\n"), name);
6265 continue;
6266 }
6267
f5842774
L
6268 sym = symtab + section->sh_info;
6269
6270 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6271 {
4fbb74a6
AM
6272 if (sym->st_shndx == 0
6273 || sym->st_shndx >= elf_header.e_shnum)
f5842774
L
6274 {
6275 error (_("Bad sh_info in group section `%s'\n"), name);
6276 continue;
6277 }
ba2685cc 6278
4fbb74a6 6279 group_name = SECTION_NAME (section_headers + sym->st_shndx);
c256ffe7
JJ
6280 strtab_sec = NULL;
6281 if (strtab)
6282 free (strtab);
f5842774 6283 strtab = NULL;
c256ffe7 6284 strtab_size = 0;
f5842774
L
6285 }
6286 else
6287 {
6288 /* Get the string table. */
4fbb74a6 6289 if (symtab_sec->sh_link >= elf_header.e_shnum)
c256ffe7
JJ
6290 {
6291 strtab_sec = NULL;
6292 if (strtab)
6293 free (strtab);
6294 strtab = NULL;
6295 strtab_size = 0;
6296 }
6297 else if (strtab_sec
4fbb74a6 6298 != (sec = section_headers + symtab_sec->sh_link))
d1f5c6e3
L
6299 {
6300 strtab_sec = sec;
6301 if (strtab)
6302 free (strtab);
071436c6 6303
3f5e193b 6304 strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
071436c6
NC
6305 1, strtab_sec->sh_size,
6306 _("string table"));
c256ffe7 6307 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
d1f5c6e3 6308 }
c256ffe7 6309 group_name = sym->st_name < strtab_size
2b692964 6310 ? strtab + sym->st_name : _("<corrupt>");
f5842774
L
6311 }
6312
c9c1d674
EG
6313 /* PR 17531: file: loop. */
6314 if (section->sh_entsize > section->sh_size)
6315 {
6316 error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6317 printable_section_name (section),
8066deb1
AM
6318 (unsigned long) section->sh_entsize,
6319 (unsigned long) section->sh_size);
c9c1d674
EG
6320 break;
6321 }
6322
3f5e193b
NC
6323 start = (unsigned char *) get_data (NULL, file, section->sh_offset,
6324 1, section->sh_size,
6325 _("section data"));
59245841
NC
6326 if (start == NULL)
6327 continue;
f5842774
L
6328
6329 indices = start;
6330 size = (section->sh_size / section->sh_entsize) - 1;
6331 entry = byte_get (indices, 4);
6332 indices += 4;
e4b17d5c
L
6333
6334 if (do_section_groups)
6335 {
2b692964 6336 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
391cb864 6337 get_group_flags (entry), i, name, group_name, size);
ba2685cc 6338
e4b17d5c
L
6339 printf (_(" [Index] Name\n"));
6340 }
6341
6342 group->group_index = i;
6343
f5842774
L
6344 for (j = 0; j < size; j++)
6345 {
2cf0635d 6346 struct group_list * g;
e4b17d5c 6347
f5842774
L
6348 entry = byte_get (indices, 4);
6349 indices += 4;
6350
4fbb74a6 6351 if (entry >= elf_header.e_shnum)
391cb864 6352 {
57028622
NC
6353 static unsigned num_group_errors = 0;
6354
6355 if (num_group_errors ++ < 10)
6356 {
6357 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6358 entry, i, elf_header.e_shnum - 1);
6359 if (num_group_errors == 10)
6360 warn (_("Futher error messages about overlarge group section indicies suppressed\n"));
6361 }
391cb864
L
6362 continue;
6363 }
391cb864 6364
4fbb74a6 6365 if (section_headers_groups [entry] != NULL)
e4b17d5c 6366 {
d1f5c6e3
L
6367 if (entry)
6368 {
57028622
NC
6369 static unsigned num_errs = 0;
6370
6371 if (num_errs ++ < 10)
6372 {
6373 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6374 entry, i,
6375 section_headers_groups [entry]->group_index);
6376 if (num_errs == 10)
6377 warn (_("Further error messages about already contained group sections suppressed\n"));
6378 }
d1f5c6e3
L
6379 continue;
6380 }
6381 else
6382 {
6383 /* Intel C/C++ compiler may put section 0 in a
6384 section group. We just warn it the first time
6385 and ignore it afterwards. */
6386 static int warned = 0;
6387 if (!warned)
6388 {
6389 error (_("section 0 in group section [%5u]\n"),
4fbb74a6 6390 section_headers_groups [entry]->group_index);
d1f5c6e3
L
6391 warned++;
6392 }
6393 }
e4b17d5c
L
6394 }
6395
4fbb74a6 6396 section_headers_groups [entry] = group;
e4b17d5c
L
6397
6398 if (do_section_groups)
6399 {
4fbb74a6 6400 sec = section_headers + entry;
74e1a04b 6401 printf (" [%5u] %s\n", entry, printable_section_name (sec));
ba2685cc
AM
6402 }
6403
3f5e193b 6404 g = (struct group_list *) xmalloc (sizeof (struct group_list));
e4b17d5c
L
6405 g->section_index = entry;
6406 g->next = group->root;
6407 group->root = g;
f5842774
L
6408 }
6409
f5842774
L
6410 if (start)
6411 free (start);
e4b17d5c
L
6412
6413 group++;
f5842774
L
6414 }
6415 }
6416
d1f5c6e3
L
6417 if (symtab)
6418 free (symtab);
6419 if (strtab)
6420 free (strtab);
f5842774
L
6421 return 1;
6422}
6423
28f997cf
TG
6424/* Data used to display dynamic fixups. */
6425
6426struct ia64_vms_dynfixup
6427{
6428 bfd_vma needed_ident; /* Library ident number. */
6429 bfd_vma needed; /* Index in the dstrtab of the library name. */
6430 bfd_vma fixup_needed; /* Index of the library. */
6431 bfd_vma fixup_rela_cnt; /* Number of fixups. */
6432 bfd_vma fixup_rela_off; /* Fixups offset in the dynamic segment. */
6433};
6434
6435/* Data used to display dynamic relocations. */
6436
6437struct ia64_vms_dynimgrela
6438{
6439 bfd_vma img_rela_cnt; /* Number of relocations. */
6440 bfd_vma img_rela_off; /* Reloc offset in the dynamic segment. */
6441};
6442
6443/* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6444 library). */
6445
6446static void
6447dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
6448 const char *strtab, unsigned int strtab_sz)
6449{
6450 Elf64_External_VMS_IMAGE_FIXUP *imfs;
6451 long i;
6452 const char *lib_name;
6453
6454 imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
6455 1, fixup->fixup_rela_cnt * sizeof (*imfs),
6456 _("dynamic section image fixups"));
6457 if (!imfs)
6458 return;
6459
6460 if (fixup->needed < strtab_sz)
6461 lib_name = strtab + fixup->needed;
6462 else
6463 {
6464 warn ("corrupt library name index of 0x%lx found in dynamic entry",
7f01b0c6 6465 (unsigned long) fixup->needed);
28f997cf
TG
6466 lib_name = "???";
6467 }
6468 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
6469 (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
6470 printf
6471 (_("Seg Offset Type SymVec DataType\n"));
6472
6473 for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
6474 {
6475 unsigned int type;
6476 const char *rtype;
6477
6478 printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
6479 printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
6480 type = BYTE_GET (imfs [i].type);
6481 rtype = elf_ia64_reloc_type (type);
6482 if (rtype == NULL)
6483 printf (" 0x%08x ", type);
6484 else
6485 printf (" %-32s ", rtype);
6486 printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
6487 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
6488 }
6489
6490 free (imfs);
6491}
6492
6493/* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
6494
6495static void
6496dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
6497{
6498 Elf64_External_VMS_IMAGE_RELA *imrs;
6499 long i;
6500
6501 imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
6502 1, imgrela->img_rela_cnt * sizeof (*imrs),
9cf03b7e 6503 _("dynamic section image relocations"));
28f997cf
TG
6504 if (!imrs)
6505 return;
6506
6507 printf (_("\nImage relocs\n"));
6508 printf
6509 (_("Seg Offset Type Addend Seg Sym Off\n"));
6510
6511 for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
6512 {
6513 unsigned int type;
6514 const char *rtype;
6515
6516 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
6517 printf ("%08" BFD_VMA_FMT "x ",
6518 (bfd_vma) BYTE_GET (imrs [i].rela_offset));
6519 type = BYTE_GET (imrs [i].type);
6520 rtype = elf_ia64_reloc_type (type);
6521 if (rtype == NULL)
6522 printf ("0x%08x ", type);
6523 else
6524 printf ("%-31s ", rtype);
6525 print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
6526 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
6527 printf ("%08" BFD_VMA_FMT "x\n",
6528 (bfd_vma) BYTE_GET (imrs [i].sym_offset));
6529 }
6530
6531 free (imrs);
6532}
6533
6534/* Display IA-64 OpenVMS dynamic relocations and fixups. */
6535
6536static int
6537process_ia64_vms_dynamic_relocs (FILE *file)
6538{
6539 struct ia64_vms_dynfixup fixup;
6540 struct ia64_vms_dynimgrela imgrela;
6541 Elf_Internal_Dyn *entry;
6542 int res = 0;
6543 bfd_vma strtab_off = 0;
6544 bfd_vma strtab_sz = 0;
6545 char *strtab = NULL;
6546
6547 memset (&fixup, 0, sizeof (fixup));
6548 memset (&imgrela, 0, sizeof (imgrela));
6549
6550 /* Note: the order of the entries is specified by the OpenVMS specs. */
6551 for (entry = dynamic_section;
6552 entry < dynamic_section + dynamic_nent;
6553 entry++)
6554 {
6555 switch (entry->d_tag)
6556 {
6557 case DT_IA_64_VMS_STRTAB_OFFSET:
6558 strtab_off = entry->d_un.d_val;
6559 break;
6560 case DT_STRSZ:
6561 strtab_sz = entry->d_un.d_val;
6562 if (strtab == NULL)
6563 strtab = get_data (NULL, file, dynamic_addr + strtab_off,
6564 1, strtab_sz, _("dynamic string section"));
6565 break;
6566
6567 case DT_IA_64_VMS_NEEDED_IDENT:
6568 fixup.needed_ident = entry->d_un.d_val;
6569 break;
6570 case DT_NEEDED:
6571 fixup.needed = entry->d_un.d_val;
6572 break;
6573 case DT_IA_64_VMS_FIXUP_NEEDED:
6574 fixup.fixup_needed = entry->d_un.d_val;
6575 break;
6576 case DT_IA_64_VMS_FIXUP_RELA_CNT:
6577 fixup.fixup_rela_cnt = entry->d_un.d_val;
6578 break;
6579 case DT_IA_64_VMS_FIXUP_RELA_OFF:
6580 fixup.fixup_rela_off = entry->d_un.d_val;
6581 res++;
6582 dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
6583 break;
6584
6585 case DT_IA_64_VMS_IMG_RELA_CNT:
6586 imgrela.img_rela_cnt = entry->d_un.d_val;
6587 break;
6588 case DT_IA_64_VMS_IMG_RELA_OFF:
6589 imgrela.img_rela_off = entry->d_un.d_val;
6590 res++;
6591 dump_ia64_vms_dynamic_relocs (file, &imgrela);
6592 break;
6593
6594 default:
6595 break;
6596 }
6597 }
6598
6599 if (strtab != NULL)
6600 free (strtab);
6601
6602 return res;
6603}
6604
85b1c36d 6605static struct
566b0d53 6606{
2cf0635d 6607 const char * name;
566b0d53
L
6608 int reloc;
6609 int size;
6610 int rela;
6611} dynamic_relocations [] =
6612{
6613 { "REL", DT_REL, DT_RELSZ, FALSE },
6614 { "RELA", DT_RELA, DT_RELASZ, TRUE },
6615 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
6616};
6617
252b5132 6618/* Process the reloc section. */
18bd398b 6619
252b5132 6620static int
2cf0635d 6621process_relocs (FILE * file)
252b5132 6622{
b34976b6
AM
6623 unsigned long rel_size;
6624 unsigned long rel_offset;
252b5132
RH
6625
6626
6627 if (!do_reloc)
6628 return 1;
6629
6630 if (do_using_dynamic)
6631 {
566b0d53 6632 int is_rela;
2cf0635d 6633 const char * name;
566b0d53
L
6634 int has_dynamic_reloc;
6635 unsigned int i;
0de14b54 6636
566b0d53 6637 has_dynamic_reloc = 0;
252b5132 6638
566b0d53 6639 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
252b5132 6640 {
566b0d53
L
6641 is_rela = dynamic_relocations [i].rela;
6642 name = dynamic_relocations [i].name;
6643 rel_size = dynamic_info [dynamic_relocations [i].size];
6644 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
103f02d3 6645
566b0d53
L
6646 has_dynamic_reloc |= rel_size;
6647
6648 if (is_rela == UNKNOWN)
aa903cfb 6649 {
566b0d53
L
6650 if (dynamic_relocations [i].reloc == DT_JMPREL)
6651 switch (dynamic_info[DT_PLTREL])
6652 {
6653 case DT_REL:
6654 is_rela = FALSE;
6655 break;
6656 case DT_RELA:
6657 is_rela = TRUE;
6658 break;
6659 }
aa903cfb 6660 }
252b5132 6661
566b0d53
L
6662 if (rel_size)
6663 {
6664 printf
6665 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
6666 name, rel_offset, rel_size);
252b5132 6667
d93f0186
NC
6668 dump_relocations (file,
6669 offset_from_vma (file, rel_offset, rel_size),
6670 rel_size,
566b0d53 6671 dynamic_symbols, num_dynamic_syms,
bb4d2ac2
L
6672 dynamic_strings, dynamic_strings_length,
6673 is_rela, 1);
566b0d53 6674 }
252b5132 6675 }
566b0d53 6676
28f997cf
TG
6677 if (is_ia64_vms ())
6678 has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
6679
566b0d53 6680 if (! has_dynamic_reloc)
252b5132
RH
6681 printf (_("\nThere are no dynamic relocations in this file.\n"));
6682 }
6683 else
6684 {
2cf0635d 6685 Elf_Internal_Shdr * section;
b34976b6
AM
6686 unsigned long i;
6687 int found = 0;
252b5132
RH
6688
6689 for (i = 0, section = section_headers;
6690 i < elf_header.e_shnum;
b34976b6 6691 i++, section++)
252b5132
RH
6692 {
6693 if ( section->sh_type != SHT_RELA
6694 && section->sh_type != SHT_REL)
6695 continue;
6696
6697 rel_offset = section->sh_offset;
6698 rel_size = section->sh_size;
6699
6700 if (rel_size)
6701 {
2cf0635d 6702 Elf_Internal_Shdr * strsec;
b34976b6 6703 int is_rela;
103f02d3 6704
252b5132
RH
6705 printf (_("\nRelocation section "));
6706
6707 if (string_table == NULL)
19936277 6708 printf ("%d", section->sh_name);
252b5132 6709 else
74e1a04b 6710 printf ("'%s'", printable_section_name (section));
252b5132
RH
6711
6712 printf (_(" at offset 0x%lx contains %lu entries:\n"),
6713 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
6714
d79b3d50
NC
6715 is_rela = section->sh_type == SHT_RELA;
6716
4fbb74a6
AM
6717 if (section->sh_link != 0
6718 && section->sh_link < elf_header.e_shnum)
af3fc3bc 6719 {
2cf0635d
NC
6720 Elf_Internal_Shdr * symsec;
6721 Elf_Internal_Sym * symtab;
d79b3d50 6722 unsigned long nsyms;
c256ffe7 6723 unsigned long strtablen = 0;
2cf0635d 6724 char * strtab = NULL;
57346661 6725
4fbb74a6 6726 symsec = section_headers + section->sh_link;
08d8fa11
JJ
6727 if (symsec->sh_type != SHT_SYMTAB
6728 && symsec->sh_type != SHT_DYNSYM)
6729 continue;
6730
ba5cdace 6731 symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms);
252b5132 6732
af3fc3bc
AM
6733 if (symtab == NULL)
6734 continue;
252b5132 6735
4fbb74a6
AM
6736 if (symsec->sh_link != 0
6737 && symsec->sh_link < elf_header.e_shnum)
c256ffe7 6738 {
4fbb74a6 6739 strsec = section_headers + symsec->sh_link;
103f02d3 6740
3f5e193b 6741 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
071436c6
NC
6742 1, strsec->sh_size,
6743 _("string table"));
c256ffe7
JJ
6744 strtablen = strtab == NULL ? 0 : strsec->sh_size;
6745 }
252b5132 6746
d79b3d50 6747 dump_relocations (file, rel_offset, rel_size,
bb4d2ac2
L
6748 symtab, nsyms, strtab, strtablen,
6749 is_rela,
6750 symsec->sh_type == SHT_DYNSYM);
d79b3d50
NC
6751 if (strtab)
6752 free (strtab);
6753 free (symtab);
6754 }
6755 else
6756 dump_relocations (file, rel_offset, rel_size,
bb4d2ac2 6757 NULL, 0, NULL, 0, is_rela, 0);
252b5132
RH
6758
6759 found = 1;
6760 }
6761 }
6762
6763 if (! found)
6764 printf (_("\nThere are no relocations in this file.\n"));
6765 }
6766
6767 return 1;
6768}
6769
4d6ed7c8
NC
6770/* An absolute address consists of a section and an offset. If the
6771 section is NULL, the offset itself is the address, otherwise, the
6772 address equals to LOAD_ADDRESS(section) + offset. */
6773
6774struct absaddr
948f632f
DA
6775{
6776 unsigned short section;
6777 bfd_vma offset;
6778};
4d6ed7c8 6779
1949de15
L
6780#define ABSADDR(a) \
6781 ((a).section \
6782 ? section_headers [(a).section].sh_addr + (a).offset \
6783 : (a).offset)
6784
948f632f
DA
6785/* Find the nearest symbol at or below ADDR. Returns the symbol
6786 name, if found, and the offset from the symbol to ADDR. */
4d6ed7c8 6787
4d6ed7c8 6788static void
2cf0635d 6789find_symbol_for_address (Elf_Internal_Sym * symtab,
948f632f
DA
6790 unsigned long nsyms,
6791 const char * strtab,
6792 unsigned long strtab_size,
6793 struct absaddr addr,
6794 const char ** symname,
6795 bfd_vma * offset)
4d6ed7c8 6796{
d3ba0551 6797 bfd_vma dist = 0x100000;
2cf0635d 6798 Elf_Internal_Sym * sym;
948f632f
DA
6799 Elf_Internal_Sym * beg;
6800 Elf_Internal_Sym * end;
2cf0635d 6801 Elf_Internal_Sym * best = NULL;
4d6ed7c8 6802
0b6ae522 6803 REMOVE_ARCH_BITS (addr.offset);
948f632f
DA
6804 beg = symtab;
6805 end = symtab + nsyms;
0b6ae522 6806
948f632f 6807 while (beg < end)
4d6ed7c8 6808 {
948f632f
DA
6809 bfd_vma value;
6810
6811 sym = beg + (end - beg) / 2;
0b6ae522 6812
948f632f 6813 value = sym->st_value;
0b6ae522
DJ
6814 REMOVE_ARCH_BITS (value);
6815
948f632f 6816 if (sym->st_name != 0
4d6ed7c8 6817 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
0b6ae522
DJ
6818 && addr.offset >= value
6819 && addr.offset - value < dist)
4d6ed7c8
NC
6820 {
6821 best = sym;
0b6ae522 6822 dist = addr.offset - value;
4d6ed7c8
NC
6823 if (!dist)
6824 break;
6825 }
948f632f
DA
6826
6827 if (addr.offset < value)
6828 end = sym;
6829 else
6830 beg = sym + 1;
4d6ed7c8 6831 }
1b31d05e 6832
4d6ed7c8
NC
6833 if (best)
6834 {
57346661 6835 *symname = (best->st_name >= strtab_size
2b692964 6836 ? _("<corrupt>") : strtab + best->st_name);
4d6ed7c8
NC
6837 *offset = dist;
6838 return;
6839 }
1b31d05e 6840
4d6ed7c8
NC
6841 *symname = NULL;
6842 *offset = addr.offset;
6843}
6844
948f632f
DA
6845static int
6846symcmp (const void *p, const void *q)
6847{
6848 Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
6849 Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
6850
6851 return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
6852}
6853
6854/* Process the unwind section. */
6855
6856#include "unwind-ia64.h"
6857
6858struct ia64_unw_table_entry
6859{
6860 struct absaddr start;
6861 struct absaddr end;
6862 struct absaddr info;
6863};
6864
6865struct ia64_unw_aux_info
6866{
6867 struct ia64_unw_table_entry *table; /* Unwind table. */
6868 unsigned long table_len; /* Length of unwind table. */
6869 unsigned char * info; /* Unwind info. */
6870 unsigned long info_size; /* Size of unwind info. */
6871 bfd_vma info_addr; /* Starting address of unwind info. */
6872 bfd_vma seg_base; /* Starting address of segment. */
6873 Elf_Internal_Sym * symtab; /* The symbol table. */
6874 unsigned long nsyms; /* Number of symbols. */
6875 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
6876 unsigned long nfuns; /* Number of entries in funtab. */
6877 char * strtab; /* The string table. */
6878 unsigned long strtab_size; /* Size of string table. */
6879};
6880
4d6ed7c8 6881static void
2cf0635d 6882dump_ia64_unwind (struct ia64_unw_aux_info * aux)
4d6ed7c8 6883{
2cf0635d 6884 struct ia64_unw_table_entry * tp;
948f632f 6885 unsigned long j, nfuns;
4d6ed7c8 6886 int in_body;
7036c0e1 6887
948f632f
DA
6888 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
6889 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
6890 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
6891 aux->funtab[nfuns++] = aux->symtab[j];
6892 aux->nfuns = nfuns;
6893 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
6894
4d6ed7c8
NC
6895 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
6896 {
6897 bfd_vma stamp;
6898 bfd_vma offset;
2cf0635d
NC
6899 const unsigned char * dp;
6900 const unsigned char * head;
53774b7e 6901 const unsigned char * end;
2cf0635d 6902 const char * procname;
4d6ed7c8 6903
948f632f 6904 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
57346661 6905 aux->strtab_size, tp->start, &procname, &offset);
4d6ed7c8
NC
6906
6907 fputs ("\n<", stdout);
6908
6909 if (procname)
6910 {
6911 fputs (procname, stdout);
6912
6913 if (offset)
6914 printf ("+%lx", (unsigned long) offset);
6915 }
6916
6917 fputs (">: [", stdout);
6918 print_vma (tp->start.offset, PREFIX_HEX);
6919 fputc ('-', stdout);
6920 print_vma (tp->end.offset, PREFIX_HEX);
86f55779 6921 printf ("], info at +0x%lx\n",
4d6ed7c8
NC
6922 (unsigned long) (tp->info.offset - aux->seg_base));
6923
53774b7e
NC
6924 /* PR 17531: file: 86232b32. */
6925 if (aux->info == NULL)
6926 continue;
6927
6928 /* PR 17531: file: 0997b4d1. */
6929 if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
6930 {
6931 warn (_("Invalid offset %lx in table entry %ld\n"),
6932 (long) tp->info.offset, (long) (tp - aux->table));
6933 continue;
6934 }
6935
1949de15 6936 head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
a4a00738 6937 stamp = byte_get ((unsigned char *) head, sizeof (stamp));
4d6ed7c8 6938
86f55779 6939 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4d6ed7c8
NC
6940 (unsigned) UNW_VER (stamp),
6941 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
6942 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
6943 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
89fac5e3 6944 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
4d6ed7c8
NC
6945
6946 if (UNW_VER (stamp) != 1)
6947 {
2b692964 6948 printf (_("\tUnknown version.\n"));
4d6ed7c8
NC
6949 continue;
6950 }
6951
6952 in_body = 0;
53774b7e
NC
6953 end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
6954 /* PR 17531: file: 16ceda89. */
6955 if (end > aux->info + aux->info_size)
6956 end = aux->info + aux->info_size;
6957 for (dp = head + 8; dp < end;)
b4477bc8 6958 dp = unw_decode (dp, in_body, & in_body, end);
4d6ed7c8 6959 }
948f632f
DA
6960
6961 free (aux->funtab);
4d6ed7c8
NC
6962}
6963
53774b7e 6964static bfd_boolean
2cf0635d
NC
6965slurp_ia64_unwind_table (FILE * file,
6966 struct ia64_unw_aux_info * aux,
6967 Elf_Internal_Shdr * sec)
4d6ed7c8 6968{
89fac5e3 6969 unsigned long size, nrelas, i;
2cf0635d
NC
6970 Elf_Internal_Phdr * seg;
6971 struct ia64_unw_table_entry * tep;
6972 Elf_Internal_Shdr * relsec;
6973 Elf_Internal_Rela * rela;
6974 Elf_Internal_Rela * rp;
6975 unsigned char * table;
6976 unsigned char * tp;
6977 Elf_Internal_Sym * sym;
6978 const char * relname;
4d6ed7c8 6979
53774b7e
NC
6980 aux->table_len = 0;
6981
4d6ed7c8
NC
6982 /* First, find the starting address of the segment that includes
6983 this section: */
6984
6985 if (elf_header.e_phnum)
6986 {
d93f0186 6987 if (! get_program_headers (file))
53774b7e 6988 return FALSE;
4d6ed7c8 6989
d93f0186
NC
6990 for (seg = program_headers;
6991 seg < program_headers + elf_header.e_phnum;
6992 ++seg)
4d6ed7c8
NC
6993 {
6994 if (seg->p_type != PT_LOAD)
6995 continue;
6996
6997 if (sec->sh_addr >= seg->p_vaddr
6998 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
6999 {
7000 aux->seg_base = seg->p_vaddr;
7001 break;
7002 }
7003 }
4d6ed7c8
NC
7004 }
7005
7006 /* Second, build the unwind table from the contents of the unwind section: */
7007 size = sec->sh_size;
3f5e193b
NC
7008 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7009 _("unwind table"));
a6e9f9df 7010 if (!table)
53774b7e 7011 return FALSE;
4d6ed7c8 7012
53774b7e 7013 aux->table_len = size / (3 * eh_addr_size);
3f5e193b 7014 aux->table = (struct ia64_unw_table_entry *)
53774b7e 7015 xcmalloc (aux->table_len, sizeof (aux->table[0]));
89fac5e3 7016 tep = aux->table;
53774b7e
NC
7017
7018 for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
4d6ed7c8
NC
7019 {
7020 tep->start.section = SHN_UNDEF;
7021 tep->end.section = SHN_UNDEF;
7022 tep->info.section = SHN_UNDEF;
c6a0c689
AM
7023 tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7024 tep->end.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7025 tep->info.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
4d6ed7c8
NC
7026 tep->start.offset += aux->seg_base;
7027 tep->end.offset += aux->seg_base;
7028 tep->info.offset += aux->seg_base;
7029 }
7030 free (table);
7031
41e92641 7032 /* Third, apply any relocations to the unwind table: */
4d6ed7c8
NC
7033 for (relsec = section_headers;
7034 relsec < section_headers + elf_header.e_shnum;
7035 ++relsec)
7036 {
7037 if (relsec->sh_type != SHT_RELA
4fbb74a6
AM
7038 || relsec->sh_info >= elf_header.e_shnum
7039 || section_headers + relsec->sh_info != sec)
4d6ed7c8
NC
7040 continue;
7041
7042 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7043 & rela, & nrelas))
53774b7e
NC
7044 {
7045 free (aux->table);
7046 aux->table = NULL;
7047 aux->table_len = 0;
7048 return FALSE;
7049 }
4d6ed7c8
NC
7050
7051 for (rp = rela; rp < rela + nrelas; ++rp)
7052 {
aca88567
NC
7053 relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
7054 sym = aux->symtab + get_reloc_symindex (rp->r_info);
4d6ed7c8 7055
82b1b41b
NC
7056 /* PR 17531: file: 9fa67536. */
7057 if (relname == NULL)
7058 {
7059 warn (_("Skipping unknown relocation type: %u\n"), get_reloc_type (rp->r_info));
7060 continue;
7061 }
948f632f 7062
0112cd26 7063 if (! const_strneq (relname, "R_IA64_SEGREL"))
4d6ed7c8 7064 {
82b1b41b 7065 warn (_("Skipping unexpected relocation type: %s\n"), relname);
4d6ed7c8
NC
7066 continue;
7067 }
7068
89fac5e3 7069 i = rp->r_offset / (3 * eh_addr_size);
4d6ed7c8 7070
53774b7e
NC
7071 /* PR 17531: file: 5bc8d9bf. */
7072 if (i >= aux->table_len)
7073 {
7074 warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
7075 continue;
7076 }
7077
7078 switch (rp->r_offset / eh_addr_size % 3)
4d6ed7c8
NC
7079 {
7080 case 0:
7081 aux->table[i].start.section = sym->st_shndx;
e466bc6e 7082 aux->table[i].start.offset = rp->r_addend + sym->st_value;
4d6ed7c8
NC
7083 break;
7084 case 1:
7085 aux->table[i].end.section = sym->st_shndx;
e466bc6e 7086 aux->table[i].end.offset = rp->r_addend + sym->st_value;
4d6ed7c8
NC
7087 break;
7088 case 2:
7089 aux->table[i].info.section = sym->st_shndx;
e466bc6e 7090 aux->table[i].info.offset = rp->r_addend + sym->st_value;
4d6ed7c8
NC
7091 break;
7092 default:
7093 break;
7094 }
7095 }
7096
7097 free (rela);
7098 }
7099
53774b7e 7100 return TRUE;
4d6ed7c8
NC
7101}
7102
1b31d05e 7103static void
2cf0635d 7104ia64_process_unwind (FILE * file)
4d6ed7c8 7105{
2cf0635d
NC
7106 Elf_Internal_Shdr * sec;
7107 Elf_Internal_Shdr * unwsec = NULL;
7108 Elf_Internal_Shdr * strsec;
89fac5e3 7109 unsigned long i, unwcount = 0, unwstart = 0;
57346661 7110 struct ia64_unw_aux_info aux;
f1467e33 7111
4d6ed7c8
NC
7112 memset (& aux, 0, sizeof (aux));
7113
4d6ed7c8
NC
7114 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7115 {
c256ffe7 7116 if (sec->sh_type == SHT_SYMTAB
4fbb74a6 7117 && sec->sh_link < elf_header.e_shnum)
4d6ed7c8 7118 {
ba5cdace 7119 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
4d6ed7c8 7120
4fbb74a6 7121 strsec = section_headers + sec->sh_link;
4082ef84
NC
7122 if (aux.strtab != NULL)
7123 {
7124 error (_("Multiple auxillary string tables encountered\n"));
7125 free (aux.strtab);
7126 }
3f5e193b
NC
7127 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7128 1, strsec->sh_size,
7129 _("string table"));
c256ffe7 7130 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
4d6ed7c8
NC
7131 }
7132 else if (sec->sh_type == SHT_IA_64_UNWIND)
579f31ac
JJ
7133 unwcount++;
7134 }
7135
7136 if (!unwcount)
7137 printf (_("\nThere are no unwind sections in this file.\n"));
7138
7139 while (unwcount-- > 0)
7140 {
2cf0635d 7141 char * suffix;
579f31ac
JJ
7142 size_t len, len2;
7143
4082ef84 7144 for (i = unwstart, sec = section_headers + unwstart, unwsec = NULL;
579f31ac
JJ
7145 i < elf_header.e_shnum; ++i, ++sec)
7146 if (sec->sh_type == SHT_IA_64_UNWIND)
7147 {
7148 unwsec = sec;
7149 break;
7150 }
4082ef84
NC
7151 /* We have already counted the number of SHT_IA64_UNWIND
7152 sections so the loop above should never fail. */
7153 assert (unwsec != NULL);
579f31ac
JJ
7154
7155 unwstart = i + 1;
7156 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
7157
e4b17d5c
L
7158 if ((unwsec->sh_flags & SHF_GROUP) != 0)
7159 {
7160 /* We need to find which section group it is in. */
4082ef84 7161 struct group_list * g;
e4b17d5c 7162
4082ef84
NC
7163 if (section_headers_groups == NULL
7164 || section_headers_groups [i] == NULL)
7165 i = elf_header.e_shnum;
7166 else
e4b17d5c 7167 {
4082ef84 7168 g = section_headers_groups [i]->root;
18bd398b 7169
4082ef84
NC
7170 for (; g != NULL; g = g->next)
7171 {
7172 sec = section_headers + g->section_index;
e4b17d5c 7173
4082ef84
NC
7174 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
7175 break;
7176 }
7177
7178 if (g == NULL)
7179 i = elf_header.e_shnum;
7180 }
e4b17d5c 7181 }
18bd398b 7182 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
579f31ac 7183 {
18bd398b 7184 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
579f31ac
JJ
7185 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
7186 suffix = SECTION_NAME (unwsec) + len;
7187 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7188 ++i, ++sec)
18bd398b
NC
7189 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
7190 && streq (SECTION_NAME (sec) + len2, suffix))
579f31ac
JJ
7191 break;
7192 }
7193 else
7194 {
7195 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
18bd398b 7196 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
579f31ac
JJ
7197 len = sizeof (ELF_STRING_ia64_unwind) - 1;
7198 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
7199 suffix = "";
18bd398b 7200 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
579f31ac
JJ
7201 suffix = SECTION_NAME (unwsec) + len;
7202 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7203 ++i, ++sec)
18bd398b
NC
7204 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
7205 && streq (SECTION_NAME (sec) + len2, suffix))
579f31ac
JJ
7206 break;
7207 }
7208
7209 if (i == elf_header.e_shnum)
7210 {
7211 printf (_("\nCould not find unwind info section for "));
7212
7213 if (string_table == NULL)
7214 printf ("%d", unwsec->sh_name);
7215 else
74e1a04b 7216 printf ("'%s'", printable_section_name (unwsec));
579f31ac
JJ
7217 }
7218 else
4d6ed7c8 7219 {
4d6ed7c8 7220 aux.info_addr = sec->sh_addr;
3f5e193b 7221 aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
4082ef84
NC
7222 sec->sh_size,
7223 _("unwind info"));
59245841 7224 aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
4d6ed7c8 7225
579f31ac 7226 printf (_("\nUnwind section "));
4d6ed7c8 7227
579f31ac
JJ
7228 if (string_table == NULL)
7229 printf ("%d", unwsec->sh_name);
7230 else
74e1a04b 7231 printf ("'%s'", printable_section_name (unwsec));
4d6ed7c8 7232
579f31ac 7233 printf (_(" at offset 0x%lx contains %lu entries:\n"),
e59b4dfb 7234 (unsigned long) unwsec->sh_offset,
89fac5e3 7235 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
4d6ed7c8 7236
53774b7e
NC
7237 if (slurp_ia64_unwind_table (file, & aux, unwsec)
7238 && aux.table_len > 0)
579f31ac
JJ
7239 dump_ia64_unwind (& aux);
7240
7241 if (aux.table)
7242 free ((char *) aux.table);
7243 if (aux.info)
7244 free ((char *) aux.info);
7245 aux.table = NULL;
7246 aux.info = NULL;
7247 }
4d6ed7c8 7248 }
4d6ed7c8 7249
4d6ed7c8
NC
7250 if (aux.symtab)
7251 free (aux.symtab);
7252 if (aux.strtab)
7253 free ((char *) aux.strtab);
4d6ed7c8
NC
7254}
7255
3f5e193b
NC
7256struct hppa_unw_table_entry
7257 {
7258 struct absaddr start;
7259 struct absaddr end;
948f632f 7260 unsigned int Cannot_unwind:1; /* 0 */
3f5e193b
NC
7261 unsigned int Millicode:1; /* 1 */
7262 unsigned int Millicode_save_sr0:1; /* 2 */
7263 unsigned int Region_description:2; /* 3..4 */
7264 unsigned int reserved1:1; /* 5 */
7265 unsigned int Entry_SR:1; /* 6 */
7266 unsigned int Entry_FR:4; /* number saved */ /* 7..10 */
7267 unsigned int Entry_GR:5; /* number saved */ /* 11..15 */
7268 unsigned int Args_stored:1; /* 16 */
948f632f
DA
7269 unsigned int Variable_Frame:1; /* 17 */
7270 unsigned int Separate_Package_Body:1; /* 18 */
3f5e193b 7271 unsigned int Frame_Extension_Millicode:1; /* 19 */
948f632f
DA
7272 unsigned int Stack_Overflow_Check:1; /* 20 */
7273 unsigned int Two_Instruction_SP_Increment:1;/* 21 */
3f5e193b
NC
7274 unsigned int Ada_Region:1; /* 22 */
7275 unsigned int cxx_info:1; /* 23 */
948f632f
DA
7276 unsigned int cxx_try_catch:1; /* 24 */
7277 unsigned int sched_entry_seq:1; /* 25 */
3f5e193b 7278 unsigned int reserved2:1; /* 26 */
948f632f
DA
7279 unsigned int Save_SP:1; /* 27 */
7280 unsigned int Save_RP:1; /* 28 */
3f5e193b
NC
7281 unsigned int Save_MRP_in_frame:1; /* 29 */
7282 unsigned int extn_ptr_defined:1; /* 30 */
948f632f 7283 unsigned int Cleanup_defined:1; /* 31 */
3f5e193b 7284
948f632f
DA
7285 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
7286 unsigned int HP_UX_interrupt_marker:1; /* 1 */
3f5e193b 7287 unsigned int Large_frame:1; /* 2 */
948f632f 7288 unsigned int Pseudo_SP_Set:1; /* 3 */
3f5e193b
NC
7289 unsigned int reserved4:1; /* 4 */
7290 unsigned int Total_frame_size:27; /* 5..31 */
7291 };
7292
57346661 7293struct hppa_unw_aux_info
948f632f
DA
7294{
7295 struct hppa_unw_table_entry * table; /* Unwind table. */
7296 unsigned long table_len; /* Length of unwind table. */
7297 bfd_vma seg_base; /* Starting address of segment. */
7298 Elf_Internal_Sym * symtab; /* The symbol table. */
7299 unsigned long nsyms; /* Number of symbols. */
7300 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7301 unsigned long nfuns; /* Number of entries in funtab. */
7302 char * strtab; /* The string table. */
7303 unsigned long strtab_size; /* Size of string table. */
7304};
57346661
AM
7305
7306static void
2cf0635d 7307dump_hppa_unwind (struct hppa_unw_aux_info * aux)
57346661 7308{
2cf0635d 7309 struct hppa_unw_table_entry * tp;
948f632f
DA
7310 unsigned long j, nfuns;
7311
7312 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7313 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7314 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7315 aux->funtab[nfuns++] = aux->symtab[j];
7316 aux->nfuns = nfuns;
7317 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
57346661 7318
57346661
AM
7319 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7320 {
7321 bfd_vma offset;
2cf0635d 7322 const char * procname;
57346661 7323
948f632f 7324 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
57346661
AM
7325 aux->strtab_size, tp->start, &procname,
7326 &offset);
7327
7328 fputs ("\n<", stdout);
7329
7330 if (procname)
7331 {
7332 fputs (procname, stdout);
7333
7334 if (offset)
7335 printf ("+%lx", (unsigned long) offset);
7336 }
7337
7338 fputs (">: [", stdout);
7339 print_vma (tp->start.offset, PREFIX_HEX);
7340 fputc ('-', stdout);
7341 print_vma (tp->end.offset, PREFIX_HEX);
7342 printf ("]\n\t");
7343
18bd398b
NC
7344#define PF(_m) if (tp->_m) printf (#_m " ");
7345#define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
57346661
AM
7346 PF(Cannot_unwind);
7347 PF(Millicode);
7348 PF(Millicode_save_sr0);
18bd398b 7349 /* PV(Region_description); */
57346661
AM
7350 PF(Entry_SR);
7351 PV(Entry_FR);
7352 PV(Entry_GR);
7353 PF(Args_stored);
7354 PF(Variable_Frame);
7355 PF(Separate_Package_Body);
7356 PF(Frame_Extension_Millicode);
7357 PF(Stack_Overflow_Check);
7358 PF(Two_Instruction_SP_Increment);
7359 PF(Ada_Region);
7360 PF(cxx_info);
7361 PF(cxx_try_catch);
7362 PF(sched_entry_seq);
7363 PF(Save_SP);
7364 PF(Save_RP);
7365 PF(Save_MRP_in_frame);
7366 PF(extn_ptr_defined);
7367 PF(Cleanup_defined);
7368 PF(MPE_XL_interrupt_marker);
7369 PF(HP_UX_interrupt_marker);
7370 PF(Large_frame);
7371 PF(Pseudo_SP_Set);
7372 PV(Total_frame_size);
7373#undef PF
7374#undef PV
7375 }
7376
18bd398b 7377 printf ("\n");
948f632f
DA
7378
7379 free (aux->funtab);
57346661
AM
7380}
7381
7382static int
2cf0635d
NC
7383slurp_hppa_unwind_table (FILE * file,
7384 struct hppa_unw_aux_info * aux,
7385 Elf_Internal_Shdr * sec)
57346661 7386{
1c0751b2 7387 unsigned long size, unw_ent_size, nentries, nrelas, i;
2cf0635d
NC
7388 Elf_Internal_Phdr * seg;
7389 struct hppa_unw_table_entry * tep;
7390 Elf_Internal_Shdr * relsec;
7391 Elf_Internal_Rela * rela;
7392 Elf_Internal_Rela * rp;
7393 unsigned char * table;
7394 unsigned char * tp;
7395 Elf_Internal_Sym * sym;
7396 const char * relname;
57346661 7397
57346661
AM
7398 /* First, find the starting address of the segment that includes
7399 this section. */
7400
7401 if (elf_header.e_phnum)
7402 {
7403 if (! get_program_headers (file))
7404 return 0;
7405
7406 for (seg = program_headers;
7407 seg < program_headers + elf_header.e_phnum;
7408 ++seg)
7409 {
7410 if (seg->p_type != PT_LOAD)
7411 continue;
7412
7413 if (sec->sh_addr >= seg->p_vaddr
7414 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7415 {
7416 aux->seg_base = seg->p_vaddr;
7417 break;
7418 }
7419 }
7420 }
7421
7422 /* Second, build the unwind table from the contents of the unwind
7423 section. */
7424 size = sec->sh_size;
3f5e193b
NC
7425 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7426 _("unwind table"));
57346661
AM
7427 if (!table)
7428 return 0;
7429
1c0751b2
DA
7430 unw_ent_size = 16;
7431 nentries = size / unw_ent_size;
7432 size = unw_ent_size * nentries;
57346661 7433
3f5e193b
NC
7434 tep = aux->table = (struct hppa_unw_table_entry *)
7435 xcmalloc (nentries, sizeof (aux->table[0]));
57346661 7436
1c0751b2 7437 for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
57346661
AM
7438 {
7439 unsigned int tmp1, tmp2;
7440
7441 tep->start.section = SHN_UNDEF;
7442 tep->end.section = SHN_UNDEF;
7443
1c0751b2
DA
7444 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
7445 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
7446 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
7447 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
7448
7449 tep->start.offset += aux->seg_base;
7450 tep->end.offset += aux->seg_base;
57346661
AM
7451
7452 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
7453 tep->Millicode = (tmp1 >> 30) & 0x1;
7454 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
7455 tep->Region_description = (tmp1 >> 27) & 0x3;
7456 tep->reserved1 = (tmp1 >> 26) & 0x1;
7457 tep->Entry_SR = (tmp1 >> 25) & 0x1;
7458 tep->Entry_FR = (tmp1 >> 21) & 0xf;
7459 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
7460 tep->Args_stored = (tmp1 >> 15) & 0x1;
7461 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
7462 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
7463 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
7464 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
7465 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
7466 tep->Ada_Region = (tmp1 >> 9) & 0x1;
7467 tep->cxx_info = (tmp1 >> 8) & 0x1;
7468 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
7469 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
7470 tep->reserved2 = (tmp1 >> 5) & 0x1;
7471 tep->Save_SP = (tmp1 >> 4) & 0x1;
7472 tep->Save_RP = (tmp1 >> 3) & 0x1;
7473 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
7474 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
7475 tep->Cleanup_defined = tmp1 & 0x1;
7476
7477 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
7478 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
7479 tep->Large_frame = (tmp2 >> 29) & 0x1;
7480 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
7481 tep->reserved4 = (tmp2 >> 27) & 0x1;
7482 tep->Total_frame_size = tmp2 & 0x7ffffff;
57346661
AM
7483 }
7484 free (table);
7485
7486 /* Third, apply any relocations to the unwind table. */
57346661
AM
7487 for (relsec = section_headers;
7488 relsec < section_headers + elf_header.e_shnum;
7489 ++relsec)
7490 {
7491 if (relsec->sh_type != SHT_RELA
4fbb74a6
AM
7492 || relsec->sh_info >= elf_header.e_shnum
7493 || section_headers + relsec->sh_info != sec)
57346661
AM
7494 continue;
7495
7496 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7497 & rela, & nrelas))
7498 return 0;
7499
7500 for (rp = rela; rp < rela + nrelas; ++rp)
7501 {
aca88567
NC
7502 relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
7503 sym = aux->symtab + get_reloc_symindex (rp->r_info);
57346661
AM
7504
7505 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
0112cd26 7506 if (! const_strneq (relname, "R_PARISC_SEGREL"))
57346661
AM
7507 {
7508 warn (_("Skipping unexpected relocation type %s\n"), relname);
7509 continue;
7510 }
7511
7512 i = rp->r_offset / unw_ent_size;
7513
89fac5e3 7514 switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
57346661
AM
7515 {
7516 case 0:
7517 aux->table[i].start.section = sym->st_shndx;
1e456d54 7518 aux->table[i].start.offset = sym->st_value + rp->r_addend;
57346661
AM
7519 break;
7520 case 1:
7521 aux->table[i].end.section = sym->st_shndx;
1e456d54 7522 aux->table[i].end.offset = sym->st_value + rp->r_addend;
57346661
AM
7523 break;
7524 default:
7525 break;
7526 }
7527 }
7528
7529 free (rela);
7530 }
7531
1c0751b2 7532 aux->table_len = nentries;
57346661
AM
7533
7534 return 1;
7535}
7536
1b31d05e 7537static void
2cf0635d 7538hppa_process_unwind (FILE * file)
57346661 7539{
57346661 7540 struct hppa_unw_aux_info aux;
2cf0635d
NC
7541 Elf_Internal_Shdr * unwsec = NULL;
7542 Elf_Internal_Shdr * strsec;
7543 Elf_Internal_Shdr * sec;
18bd398b 7544 unsigned long i;
57346661 7545
c256ffe7 7546 if (string_table == NULL)
1b31d05e
NC
7547 return;
7548
7549 memset (& aux, 0, sizeof (aux));
57346661
AM
7550
7551 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7552 {
c256ffe7 7553 if (sec->sh_type == SHT_SYMTAB
4fbb74a6 7554 && sec->sh_link < elf_header.e_shnum)
57346661 7555 {
ba5cdace 7556 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
57346661 7557
4fbb74a6 7558 strsec = section_headers + sec->sh_link;
4082ef84
NC
7559 if (aux.strtab != NULL)
7560 {
7561 error (_("Multiple auxillary string tables encountered\n"));
7562 free (aux.strtab);
7563 }
3f5e193b
NC
7564 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7565 1, strsec->sh_size,
7566 _("string table"));
c256ffe7 7567 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
57346661 7568 }
18bd398b 7569 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
57346661
AM
7570 unwsec = sec;
7571 }
7572
7573 if (!unwsec)
7574 printf (_("\nThere are no unwind sections in this file.\n"));
7575
7576 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7577 {
18bd398b 7578 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
57346661 7579 {
74e1a04b
NC
7580 printf (_("\nUnwind section '%s' at offset 0x%lx contains %lu entries:\n"),
7581 printable_section_name (sec),
57346661 7582 (unsigned long) sec->sh_offset,
89fac5e3 7583 (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
57346661
AM
7584
7585 slurp_hppa_unwind_table (file, &aux, sec);
7586 if (aux.table_len > 0)
7587 dump_hppa_unwind (&aux);
7588
7589 if (aux.table)
7590 free ((char *) aux.table);
7591 aux.table = NULL;
7592 }
7593 }
7594
7595 if (aux.symtab)
7596 free (aux.symtab);
7597 if (aux.strtab)
7598 free ((char *) aux.strtab);
57346661
AM
7599}
7600
0b6ae522
DJ
7601struct arm_section
7602{
a734115a
NC
7603 unsigned char * data; /* The unwind data. */
7604 Elf_Internal_Shdr * sec; /* The cached unwind section header. */
7605 Elf_Internal_Rela * rela; /* The cached relocations for this section. */
7606 unsigned long nrelas; /* The number of relocations. */
7607 unsigned int rel_type; /* REL or RELA ? */
7608 Elf_Internal_Rela * next_rela; /* Cyclic pointer to the next reloc to process. */
0b6ae522
DJ
7609};
7610
7611struct arm_unw_aux_info
7612{
a734115a
NC
7613 FILE * file; /* The file containing the unwind sections. */
7614 Elf_Internal_Sym * symtab; /* The file's symbol table. */
7615 unsigned long nsyms; /* Number of symbols. */
948f632f
DA
7616 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7617 unsigned long nfuns; /* Number of these symbols. */
a734115a
NC
7618 char * strtab; /* The file's string table. */
7619 unsigned long strtab_size; /* Size of string table. */
0b6ae522
DJ
7620};
7621
7622static const char *
7623arm_print_vma_and_name (struct arm_unw_aux_info *aux,
7624 bfd_vma fn, struct absaddr addr)
7625{
7626 const char *procname;
7627 bfd_vma sym_offset;
7628
7629 if (addr.section == SHN_UNDEF)
7630 addr.offset = fn;
7631
948f632f 7632 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
0b6ae522
DJ
7633 aux->strtab_size, addr, &procname,
7634 &sym_offset);
7635
7636 print_vma (fn, PREFIX_HEX);
7637
7638 if (procname)
7639 {
7640 fputs (" <", stdout);
7641 fputs (procname, stdout);
7642
7643 if (sym_offset)
7644 printf ("+0x%lx", (unsigned long) sym_offset);
7645 fputc ('>', stdout);
7646 }
7647
7648 return procname;
7649}
7650
7651static void
7652arm_free_section (struct arm_section *arm_sec)
7653{
7654 if (arm_sec->data != NULL)
7655 free (arm_sec->data);
7656
7657 if (arm_sec->rela != NULL)
7658 free (arm_sec->rela);
7659}
7660
a734115a
NC
7661/* 1) If SEC does not match the one cached in ARM_SEC, then free the current
7662 cached section and install SEC instead.
7663 2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
7664 and return its valued in * WORDP, relocating if necessary.
1b31d05e 7665 3) Update the NEXT_RELA field in ARM_SEC and store the section index and
a734115a 7666 relocation's offset in ADDR.
1b31d05e
NC
7667 4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
7668 into the string table of the symbol associated with the reloc. If no
7669 reloc was applied store -1 there.
7670 5) Return TRUE upon success, FALSE otherwise. */
a734115a
NC
7671
7672static bfd_boolean
1b31d05e
NC
7673get_unwind_section_word (struct arm_unw_aux_info * aux,
7674 struct arm_section * arm_sec,
7675 Elf_Internal_Shdr * sec,
7676 bfd_vma word_offset,
7677 unsigned int * wordp,
7678 struct absaddr * addr,
7679 bfd_vma * sym_name)
0b6ae522
DJ
7680{
7681 Elf_Internal_Rela *rp;
7682 Elf_Internal_Sym *sym;
7683 const char * relname;
7684 unsigned int word;
7685 bfd_boolean wrapped;
7686
e0a31db1
NC
7687 if (sec == NULL || arm_sec == NULL)
7688 return FALSE;
7689
0b6ae522
DJ
7690 addr->section = SHN_UNDEF;
7691 addr->offset = 0;
7692
1b31d05e
NC
7693 if (sym_name != NULL)
7694 *sym_name = (bfd_vma) -1;
7695
a734115a 7696 /* If necessary, update the section cache. */
0b6ae522
DJ
7697 if (sec != arm_sec->sec)
7698 {
7699 Elf_Internal_Shdr *relsec;
7700
7701 arm_free_section (arm_sec);
7702
7703 arm_sec->sec = sec;
7704 arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
7705 sec->sh_size, _("unwind data"));
0b6ae522
DJ
7706 arm_sec->rela = NULL;
7707 arm_sec->nrelas = 0;
7708
7709 for (relsec = section_headers;
7710 relsec < section_headers + elf_header.e_shnum;
7711 ++relsec)
7712 {
7713 if (relsec->sh_info >= elf_header.e_shnum
1ae40aa4
NC
7714 || section_headers + relsec->sh_info != sec
7715 /* PR 15745: Check the section type as well. */
7716 || (relsec->sh_type != SHT_REL
7717 && relsec->sh_type != SHT_RELA))
0b6ae522
DJ
7718 continue;
7719
a734115a 7720 arm_sec->rel_type = relsec->sh_type;
0b6ae522
DJ
7721 if (relsec->sh_type == SHT_REL)
7722 {
7723 if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
7724 relsec->sh_size,
7725 & arm_sec->rela, & arm_sec->nrelas))
a734115a 7726 return FALSE;
0b6ae522 7727 }
1ae40aa4 7728 else /* relsec->sh_type == SHT_RELA */
0b6ae522
DJ
7729 {
7730 if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
7731 relsec->sh_size,
7732 & arm_sec->rela, & arm_sec->nrelas))
a734115a 7733 return FALSE;
0b6ae522 7734 }
1ae40aa4 7735 break;
0b6ae522
DJ
7736 }
7737
7738 arm_sec->next_rela = arm_sec->rela;
7739 }
7740
a734115a 7741 /* If there is no unwind data we can do nothing. */
0b6ae522 7742 if (arm_sec->data == NULL)
a734115a 7743 return FALSE;
0b6ae522 7744
e0a31db1 7745 /* If the offset is invalid then fail. */
1a915552
NC
7746 if (word_offset > (sec->sh_size - 4)
7747 /* PR 18879 */
7748 || (sec->sh_size < 5 && word_offset >= sec->sh_size)
7749 || ((bfd_signed_vma) word_offset) < 0)
e0a31db1
NC
7750 return FALSE;
7751
a734115a 7752 /* Get the word at the required offset. */
0b6ae522
DJ
7753 word = byte_get (arm_sec->data + word_offset, 4);
7754
0eff7165
NC
7755 /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128. */
7756 if (arm_sec->rela == NULL)
7757 {
7758 * wordp = word;
7759 return TRUE;
7760 }
7761
a734115a 7762 /* Look through the relocs to find the one that applies to the provided offset. */
0b6ae522
DJ
7763 wrapped = FALSE;
7764 for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
7765 {
7766 bfd_vma prelval, offset;
7767
7768 if (rp->r_offset > word_offset && !wrapped)
7769 {
7770 rp = arm_sec->rela;
7771 wrapped = TRUE;
7772 }
7773 if (rp->r_offset > word_offset)
7774 break;
7775
7776 if (rp->r_offset & 3)
7777 {
7778 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
7779 (unsigned long) rp->r_offset);
7780 continue;
7781 }
7782
7783 if (rp->r_offset < word_offset)
7784 continue;
7785
74e1a04b
NC
7786 /* PR 17531: file: 027-161405-0.004 */
7787 if (aux->symtab == NULL)
7788 continue;
7789
0b6ae522
DJ
7790 if (arm_sec->rel_type == SHT_REL)
7791 {
7792 offset = word & 0x7fffffff;
7793 if (offset & 0x40000000)
7794 offset |= ~ (bfd_vma) 0x7fffffff;
7795 }
a734115a 7796 else if (arm_sec->rel_type == SHT_RELA)
0b6ae522 7797 offset = rp->r_addend;
a734115a 7798 else
74e1a04b
NC
7799 {
7800 error (_("Unknown section relocation type %d encountered\n"),
7801 arm_sec->rel_type);
7802 break;
7803 }
0b6ae522 7804
071436c6
NC
7805 /* PR 17531 file: 027-1241568-0.004. */
7806 if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
7807 {
7808 error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
7809 (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
7810 break;
7811 }
7812
7813 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
0b6ae522
DJ
7814 offset += sym->st_value;
7815 prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
7816
a734115a
NC
7817 /* Check that we are processing the expected reloc type. */
7818 if (elf_header.e_machine == EM_ARM)
7819 {
7820 relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
071436c6
NC
7821 if (relname == NULL)
7822 {
7823 warn (_("Skipping unknown ARM relocation type: %d\n"),
7824 (int) ELF32_R_TYPE (rp->r_info));
7825 continue;
7826 }
a734115a
NC
7827
7828 if (streq (relname, "R_ARM_NONE"))
7829 continue;
0b4362b0 7830
a734115a
NC
7831 if (! streq (relname, "R_ARM_PREL31"))
7832 {
071436c6 7833 warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
a734115a
NC
7834 continue;
7835 }
7836 }
7837 else if (elf_header.e_machine == EM_TI_C6000)
7838 {
7839 relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
071436c6
NC
7840 if (relname == NULL)
7841 {
7842 warn (_("Skipping unknown C6000 relocation type: %d\n"),
7843 (int) ELF32_R_TYPE (rp->r_info));
7844 continue;
7845 }
0b4362b0 7846
a734115a
NC
7847 if (streq (relname, "R_C6000_NONE"))
7848 continue;
7849
7850 if (! streq (relname, "R_C6000_PREL31"))
7851 {
071436c6 7852 warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
a734115a
NC
7853 continue;
7854 }
7855
7856 prelval >>= 1;
7857 }
7858 else
74e1a04b
NC
7859 {
7860 /* This function currently only supports ARM and TI unwinders. */
7861 warn (_("Only TI and ARM unwinders are currently supported\n"));
7862 break;
7863 }
fa197c1c 7864
0b6ae522
DJ
7865 word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
7866 addr->section = sym->st_shndx;
7867 addr->offset = offset;
74e1a04b 7868
1b31d05e
NC
7869 if (sym_name)
7870 * sym_name = sym->st_name;
0b6ae522
DJ
7871 break;
7872 }
7873
7874 *wordp = word;
7875 arm_sec->next_rela = rp;
7876
a734115a 7877 return TRUE;
0b6ae522
DJ
7878}
7879
a734115a
NC
7880static const char *tic6x_unwind_regnames[16] =
7881{
0b4362b0
RM
7882 "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
7883 "A14", "A13", "A12", "A11", "A10",
a734115a
NC
7884 "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
7885};
fa197c1c 7886
0b6ae522 7887static void
fa197c1c 7888decode_tic6x_unwind_regmask (unsigned int mask)
0b6ae522 7889{
fa197c1c
PB
7890 int i;
7891
7892 for (i = 12; mask; mask >>= 1, i--)
7893 {
7894 if (mask & 1)
7895 {
7896 fputs (tic6x_unwind_regnames[i], stdout);
7897 if (mask > 1)
7898 fputs (", ", stdout);
7899 }
7900 }
7901}
0b6ae522
DJ
7902
7903#define ADVANCE \
7904 if (remaining == 0 && more_words) \
7905 { \
7906 data_offset += 4; \
1b31d05e
NC
7907 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, \
7908 data_offset, & word, & addr, NULL)) \
0b6ae522
DJ
7909 return; \
7910 remaining = 4; \
7911 more_words--; \
7912 } \
7913
7914#define GET_OP(OP) \
7915 ADVANCE; \
7916 if (remaining) \
7917 { \
7918 remaining--; \
7919 (OP) = word >> 24; \
7920 word <<= 8; \
7921 } \
7922 else \
7923 { \
2b692964 7924 printf (_("[Truncated opcode]\n")); \
0b6ae522
DJ
7925 return; \
7926 } \
cc5914eb 7927 printf ("0x%02x ", OP)
0b6ae522 7928
fa197c1c 7929static void
948f632f
DA
7930decode_arm_unwind_bytecode (struct arm_unw_aux_info * aux,
7931 unsigned int word,
7932 unsigned int remaining,
7933 unsigned int more_words,
7934 bfd_vma data_offset,
7935 Elf_Internal_Shdr * data_sec,
7936 struct arm_section * data_arm_sec)
fa197c1c
PB
7937{
7938 struct absaddr addr;
0b6ae522
DJ
7939
7940 /* Decode the unwinding instructions. */
7941 while (1)
7942 {
7943 unsigned int op, op2;
7944
7945 ADVANCE;
7946 if (remaining == 0)
7947 break;
7948 remaining--;
7949 op = word >> 24;
7950 word <<= 8;
7951
cc5914eb 7952 printf (" 0x%02x ", op);
0b6ae522
DJ
7953
7954 if ((op & 0xc0) == 0x00)
7955 {
7956 int offset = ((op & 0x3f) << 2) + 4;
61865e30 7957
cc5914eb 7958 printf (" vsp = vsp + %d", offset);
0b6ae522
DJ
7959 }
7960 else if ((op & 0xc0) == 0x40)
7961 {
7962 int offset = ((op & 0x3f) << 2) + 4;
61865e30 7963
cc5914eb 7964 printf (" vsp = vsp - %d", offset);
0b6ae522
DJ
7965 }
7966 else if ((op & 0xf0) == 0x80)
7967 {
7968 GET_OP (op2);
7969 if (op == 0x80 && op2 == 0)
7970 printf (_("Refuse to unwind"));
7971 else
7972 {
7973 unsigned int mask = ((op & 0x0f) << 8) | op2;
7974 int first = 1;
7975 int i;
2b692964 7976
0b6ae522
DJ
7977 printf ("pop {");
7978 for (i = 0; i < 12; i++)
7979 if (mask & (1 << i))
7980 {
7981 if (first)
7982 first = 0;
7983 else
7984 printf (", ");
7985 printf ("r%d", 4 + i);
7986 }
7987 printf ("}");
7988 }
7989 }
7990 else if ((op & 0xf0) == 0x90)
7991 {
7992 if (op == 0x9d || op == 0x9f)
7993 printf (_(" [Reserved]"));
7994 else
cc5914eb 7995 printf (" vsp = r%d", op & 0x0f);
0b6ae522
DJ
7996 }
7997 else if ((op & 0xf0) == 0xa0)
7998 {
7999 int end = 4 + (op & 0x07);
8000 int first = 1;
8001 int i;
61865e30 8002
0b6ae522
DJ
8003 printf (" pop {");
8004 for (i = 4; i <= end; i++)
8005 {
8006 if (first)
8007 first = 0;
8008 else
8009 printf (", ");
8010 printf ("r%d", i);
8011 }
8012 if (op & 0x08)
8013 {
1b31d05e 8014 if (!first)
0b6ae522
DJ
8015 printf (", ");
8016 printf ("r14");
8017 }
8018 printf ("}");
8019 }
8020 else if (op == 0xb0)
8021 printf (_(" finish"));
8022 else if (op == 0xb1)
8023 {
8024 GET_OP (op2);
8025 if (op2 == 0 || (op2 & 0xf0) != 0)
8026 printf (_("[Spare]"));
8027 else
8028 {
8029 unsigned int mask = op2 & 0x0f;
8030 int first = 1;
8031 int i;
61865e30 8032
0b6ae522
DJ
8033 printf ("pop {");
8034 for (i = 0; i < 12; i++)
8035 if (mask & (1 << i))
8036 {
8037 if (first)
8038 first = 0;
8039 else
8040 printf (", ");
8041 printf ("r%d", i);
8042 }
8043 printf ("}");
8044 }
8045 }
8046 else if (op == 0xb2)
8047 {
b115cf96 8048 unsigned char buf[9];
0b6ae522
DJ
8049 unsigned int i, len;
8050 unsigned long offset;
61865e30 8051
b115cf96 8052 for (i = 0; i < sizeof (buf); i++)
0b6ae522
DJ
8053 {
8054 GET_OP (buf[i]);
8055 if ((buf[i] & 0x80) == 0)
8056 break;
8057 }
4082ef84
NC
8058 if (i == sizeof (buf))
8059 printf (_("corrupt change to vsp"));
8060 else
8061 {
8062 offset = read_uleb128 (buf, &len, buf + i + 1);
8063 assert (len == i + 1);
8064 offset = offset * 4 + 0x204;
8065 printf ("vsp = vsp + %ld", offset);
8066 }
0b6ae522 8067 }
61865e30 8068 else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
0b6ae522 8069 {
61865e30
NC
8070 unsigned int first, last;
8071
8072 GET_OP (op2);
8073 first = op2 >> 4;
8074 last = op2 & 0x0f;
8075 if (op == 0xc8)
8076 first = first + 16;
8077 printf ("pop {D%d", first);
8078 if (last)
8079 printf ("-D%d", first + last);
8080 printf ("}");
8081 }
8082 else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
8083 {
8084 unsigned int count = op & 0x07;
8085
8086 printf ("pop {D8");
8087 if (count)
8088 printf ("-D%d", 8 + count);
8089 printf ("}");
8090 }
8091 else if (op >= 0xc0 && op <= 0xc5)
8092 {
8093 unsigned int count = op & 0x07;
8094
8095 printf (" pop {wR10");
8096 if (count)
8097 printf ("-wR%d", 10 + count);
8098 printf ("}");
8099 }
8100 else if (op == 0xc6)
8101 {
8102 unsigned int first, last;
8103
8104 GET_OP (op2);
8105 first = op2 >> 4;
8106 last = op2 & 0x0f;
8107 printf ("pop {wR%d", first);
8108 if (last)
8109 printf ("-wR%d", first + last);
8110 printf ("}");
8111 }
8112 else if (op == 0xc7)
8113 {
8114 GET_OP (op2);
8115 if (op2 == 0 || (op2 & 0xf0) != 0)
8116 printf (_("[Spare]"));
0b6ae522
DJ
8117 else
8118 {
61865e30
NC
8119 unsigned int mask = op2 & 0x0f;
8120 int first = 1;
8121 int i;
8122
8123 printf ("pop {");
8124 for (i = 0; i < 4; i++)
8125 if (mask & (1 << i))
8126 {
8127 if (first)
8128 first = 0;
8129 else
8130 printf (", ");
8131 printf ("wCGR%d", i);
8132 }
8133 printf ("}");
0b6ae522
DJ
8134 }
8135 }
61865e30
NC
8136 else
8137 printf (_(" [unsupported opcode]"));
0b6ae522
DJ
8138 printf ("\n");
8139 }
fa197c1c
PB
8140}
8141
8142static void
948f632f
DA
8143decode_tic6x_unwind_bytecode (struct arm_unw_aux_info * aux,
8144 unsigned int word,
8145 unsigned int remaining,
8146 unsigned int more_words,
8147 bfd_vma data_offset,
8148 Elf_Internal_Shdr * data_sec,
8149 struct arm_section * data_arm_sec)
fa197c1c
PB
8150{
8151 struct absaddr addr;
8152
8153 /* Decode the unwinding instructions. */
8154 while (1)
8155 {
8156 unsigned int op, op2;
8157
8158 ADVANCE;
8159 if (remaining == 0)
8160 break;
8161 remaining--;
8162 op = word >> 24;
8163 word <<= 8;
8164
9cf03b7e 8165 printf (" 0x%02x ", op);
fa197c1c
PB
8166
8167 if ((op & 0xc0) == 0x00)
8168 {
8169 int offset = ((op & 0x3f) << 3) + 8;
9cf03b7e 8170 printf (" sp = sp + %d", offset);
fa197c1c
PB
8171 }
8172 else if ((op & 0xc0) == 0x80)
8173 {
8174 GET_OP (op2);
8175 if (op == 0x80 && op2 == 0)
8176 printf (_("Refuse to unwind"));
8177 else
8178 {
8179 unsigned int mask = ((op & 0x1f) << 8) | op2;
8180 if (op & 0x20)
8181 printf ("pop compact {");
8182 else
8183 printf ("pop {");
8184
8185 decode_tic6x_unwind_regmask (mask);
8186 printf("}");
8187 }
8188 }
8189 else if ((op & 0xf0) == 0xc0)
8190 {
8191 unsigned int reg;
8192 unsigned int nregs;
8193 unsigned int i;
8194 const char *name;
a734115a
NC
8195 struct
8196 {
fa197c1c
PB
8197 unsigned int offset;
8198 unsigned int reg;
8199 } regpos[16];
8200
8201 /* Scan entire instruction first so that GET_OP output is not
8202 interleaved with disassembly. */
8203 nregs = 0;
8204 for (i = 0; nregs < (op & 0xf); i++)
8205 {
8206 GET_OP (op2);
8207 reg = op2 >> 4;
8208 if (reg != 0xf)
8209 {
8210 regpos[nregs].offset = i * 2;
8211 regpos[nregs].reg = reg;
8212 nregs++;
8213 }
8214
8215 reg = op2 & 0xf;
8216 if (reg != 0xf)
8217 {
8218 regpos[nregs].offset = i * 2 + 1;
8219 regpos[nregs].reg = reg;
8220 nregs++;
8221 }
8222 }
8223
8224 printf (_("pop frame {"));
8225 reg = nregs - 1;
8226 for (i = i * 2; i > 0; i--)
8227 {
8228 if (regpos[reg].offset == i - 1)
8229 {
8230 name = tic6x_unwind_regnames[regpos[reg].reg];
8231 if (reg > 0)
8232 reg--;
8233 }
8234 else
8235 name = _("[pad]");
8236
8237 fputs (name, stdout);
8238 if (i > 1)
8239 printf (", ");
8240 }
8241
8242 printf ("}");
8243 }
8244 else if (op == 0xd0)
8245 printf (" MOV FP, SP");
8246 else if (op == 0xd1)
8247 printf (" __c6xabi_pop_rts");
8248 else if (op == 0xd2)
8249 {
8250 unsigned char buf[9];
8251 unsigned int i, len;
8252 unsigned long offset;
a734115a 8253
fa197c1c
PB
8254 for (i = 0; i < sizeof (buf); i++)
8255 {
8256 GET_OP (buf[i]);
8257 if ((buf[i] & 0x80) == 0)
8258 break;
8259 }
0eff7165
NC
8260 /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2. */
8261 if (i == sizeof (buf))
8262 {
8263 printf ("<corrupt sp adjust>\n");
8264 warn (_("Corrupt stack pointer adjustment detected\n"));
8265 return;
8266 }
948f632f 8267
f6f0e17b 8268 offset = read_uleb128 (buf, &len, buf + i + 1);
fa197c1c
PB
8269 assert (len == i + 1);
8270 offset = offset * 8 + 0x408;
8271 printf (_("sp = sp + %ld"), offset);
8272 }
8273 else if ((op & 0xf0) == 0xe0)
8274 {
8275 if ((op & 0x0f) == 7)
8276 printf (" RETURN");
8277 else
8278 printf (" MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
8279 }
8280 else
8281 {
8282 printf (_(" [unsupported opcode]"));
8283 }
8284 putchar ('\n');
8285 }
8286}
8287
8288static bfd_vma
a734115a 8289arm_expand_prel31 (bfd_vma word, bfd_vma where)
fa197c1c
PB
8290{
8291 bfd_vma offset;
8292
8293 offset = word & 0x7fffffff;
8294 if (offset & 0x40000000)
8295 offset |= ~ (bfd_vma) 0x7fffffff;
8296
8297 if (elf_header.e_machine == EM_TI_C6000)
8298 offset <<= 1;
8299
8300 return offset + where;
8301}
8302
8303static void
1b31d05e
NC
8304decode_arm_unwind (struct arm_unw_aux_info * aux,
8305 unsigned int word,
8306 unsigned int remaining,
8307 bfd_vma data_offset,
8308 Elf_Internal_Shdr * data_sec,
8309 struct arm_section * data_arm_sec)
fa197c1c
PB
8310{
8311 int per_index;
8312 unsigned int more_words = 0;
37e14bc3 8313 struct absaddr addr;
1b31d05e 8314 bfd_vma sym_name = (bfd_vma) -1;
fa197c1c
PB
8315
8316 if (remaining == 0)
8317 {
1b31d05e
NC
8318 /* Fetch the first word.
8319 Note - when decoding an object file the address extracted
8320 here will always be 0. So we also pass in the sym_name
8321 parameter so that we can find the symbol associated with
8322 the personality routine. */
8323 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, data_offset,
8324 & word, & addr, & sym_name))
fa197c1c 8325 return;
1b31d05e 8326
fa197c1c
PB
8327 remaining = 4;
8328 }
8329
8330 if ((word & 0x80000000) == 0)
8331 {
8332 /* Expand prel31 for personality routine. */
8333 bfd_vma fn;
8334 const char *procname;
8335
a734115a 8336 fn = arm_expand_prel31 (word, data_sec->sh_addr + data_offset);
fa197c1c 8337 printf (_(" Personality routine: "));
1b31d05e
NC
8338 if (fn == 0
8339 && addr.section == SHN_UNDEF && addr.offset == 0
8340 && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
8341 {
8342 procname = aux->strtab + sym_name;
8343 print_vma (fn, PREFIX_HEX);
8344 if (procname)
8345 {
8346 fputs (" <", stdout);
8347 fputs (procname, stdout);
8348 fputc ('>', stdout);
8349 }
8350 }
8351 else
8352 procname = arm_print_vma_and_name (aux, fn, addr);
fa197c1c
PB
8353 fputc ('\n', stdout);
8354
8355 /* The GCC personality routines use the standard compact
8356 encoding, starting with one byte giving the number of
8357 words. */
8358 if (procname != NULL
8359 && (const_strneq (procname, "__gcc_personality_v0")
8360 || const_strneq (procname, "__gxx_personality_v0")
8361 || const_strneq (procname, "__gcj_personality_v0")
8362 || const_strneq (procname, "__gnu_objc_personality_v0")))
8363 {
8364 remaining = 0;
8365 more_words = 1;
8366 ADVANCE;
8367 if (!remaining)
8368 {
8369 printf (_(" [Truncated data]\n"));
8370 return;
8371 }
8372 more_words = word >> 24;
8373 word <<= 8;
8374 remaining--;
8375 per_index = -1;
8376 }
8377 else
8378 return;
8379 }
8380 else
8381 {
1b31d05e 8382 /* ARM EHABI Section 6.3:
0b4362b0 8383
1b31d05e 8384 An exception-handling table entry for the compact model looks like:
0b4362b0 8385
1b31d05e
NC
8386 31 30-28 27-24 23-0
8387 -- ----- ----- ----
8388 1 0 index Data for personalityRoutine[index] */
8389
8390 if (elf_header.e_machine == EM_ARM
8391 && (word & 0x70000000))
83c257ca 8392 warn (_("Corrupt ARM compact model table entry: %x \n"), word);
1b31d05e 8393
fa197c1c 8394 per_index = (word >> 24) & 0x7f;
1b31d05e 8395 printf (_(" Compact model index: %d\n"), per_index);
fa197c1c
PB
8396 if (per_index == 0)
8397 {
8398 more_words = 0;
8399 word <<= 8;
8400 remaining--;
8401 }
8402 else if (per_index < 3)
8403 {
8404 more_words = (word >> 16) & 0xff;
8405 word <<= 16;
8406 remaining -= 2;
8407 }
8408 }
8409
8410 switch (elf_header.e_machine)
8411 {
8412 case EM_ARM:
8413 if (per_index < 3)
8414 {
8415 decode_arm_unwind_bytecode (aux, word, remaining, more_words,
8416 data_offset, data_sec, data_arm_sec);
8417 }
8418 else
1b31d05e
NC
8419 {
8420 warn (_("Unknown ARM compact model index encountered\n"));
8421 printf (_(" [reserved]\n"));
8422 }
fa197c1c
PB
8423 break;
8424
8425 case EM_TI_C6000:
8426 if (per_index < 3)
8427 {
8428 decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
1b31d05e 8429 data_offset, data_sec, data_arm_sec);
fa197c1c
PB
8430 }
8431 else if (per_index < 5)
8432 {
8433 if (((word >> 17) & 0x7f) == 0x7f)
8434 printf (_(" Restore stack from frame pointer\n"));
8435 else
8436 printf (_(" Stack increment %d\n"), (word >> 14) & 0x1fc);
8437 printf (_(" Registers restored: "));
8438 if (per_index == 4)
8439 printf (" (compact) ");
8440 decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
8441 putchar ('\n');
8442 printf (_(" Return register: %s\n"),
8443 tic6x_unwind_regnames[word & 0xf]);
8444 }
8445 else
1b31d05e 8446 printf (_(" [reserved (%d)]\n"), per_index);
fa197c1c
PB
8447 break;
8448
8449 default:
74e1a04b 8450 error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
1b31d05e 8451 elf_header.e_machine);
fa197c1c 8452 }
0b6ae522
DJ
8453
8454 /* Decode the descriptors. Not implemented. */
8455}
8456
8457static void
8458dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
8459{
8460 struct arm_section exidx_arm_sec, extab_arm_sec;
8461 unsigned int i, exidx_len;
948f632f 8462 unsigned long j, nfuns;
0b6ae522
DJ
8463
8464 memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
8465 memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
8466 exidx_len = exidx_sec->sh_size / 8;
8467
948f632f
DA
8468 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
8469 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
8470 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
8471 aux->funtab[nfuns++] = aux->symtab[j];
8472 aux->nfuns = nfuns;
8473 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
8474
0b6ae522
DJ
8475 for (i = 0; i < exidx_len; i++)
8476 {
8477 unsigned int exidx_fn, exidx_entry;
8478 struct absaddr fn_addr, entry_addr;
8479 bfd_vma fn;
8480
8481 fputc ('\n', stdout);
8482
1b31d05e
NC
8483 if (! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8484 8 * i, & exidx_fn, & fn_addr, NULL)
8485 || ! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8486 8 * i + 4, & exidx_entry, & entry_addr, NULL))
0b6ae522 8487 {
948f632f 8488 free (aux->funtab);
1b31d05e
NC
8489 arm_free_section (& exidx_arm_sec);
8490 arm_free_section (& extab_arm_sec);
0b6ae522
DJ
8491 return;
8492 }
8493
83c257ca
NC
8494 /* ARM EHABI, Section 5:
8495 An index table entry consists of 2 words.
8496 The first word contains a prel31 offset to the start of a function, with bit 31 clear. */
8497 if (exidx_fn & 0x80000000)
8498 warn (_("corrupt index table entry: %x\n"), exidx_fn);
8499
a734115a 8500 fn = arm_expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
0b6ae522 8501
a734115a 8502 arm_print_vma_and_name (aux, fn, fn_addr);
0b6ae522
DJ
8503 fputs (": ", stdout);
8504
8505 if (exidx_entry == 1)
8506 {
8507 print_vma (exidx_entry, PREFIX_HEX);
8508 fputs (" [cantunwind]\n", stdout);
8509 }
8510 else if (exidx_entry & 0x80000000)
8511 {
8512 print_vma (exidx_entry, PREFIX_HEX);
8513 fputc ('\n', stdout);
8514 decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
8515 }
8516 else
8517 {
8f73510c 8518 bfd_vma table, table_offset = 0;
0b6ae522
DJ
8519 Elf_Internal_Shdr *table_sec;
8520
8521 fputs ("@", stdout);
a734115a 8522 table = arm_expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
0b6ae522
DJ
8523 print_vma (table, PREFIX_HEX);
8524 printf ("\n");
8525
8526 /* Locate the matching .ARM.extab. */
8527 if (entry_addr.section != SHN_UNDEF
8528 && entry_addr.section < elf_header.e_shnum)
8529 {
8530 table_sec = section_headers + entry_addr.section;
8531 table_offset = entry_addr.offset;
1a915552
NC
8532 /* PR 18879 */
8533 if (table_offset > table_sec->sh_size
8534 || ((bfd_signed_vma) table_offset) < 0)
8535 {
8536 warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
8537 (unsigned long) table_offset,
8538 printable_section_name (table_sec));
8539 continue;
8540 }
0b6ae522
DJ
8541 }
8542 else
8543 {
8544 table_sec = find_section_by_address (table);
8545 if (table_sec != NULL)
8546 table_offset = table - table_sec->sh_addr;
8547 }
8548 if (table_sec == NULL)
8549 {
8550 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
8551 (unsigned long) table);
8552 continue;
8553 }
8554 decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
8555 &extab_arm_sec);
8556 }
8557 }
8558
8559 printf ("\n");
8560
948f632f 8561 free (aux->funtab);
0b6ae522
DJ
8562 arm_free_section (&exidx_arm_sec);
8563 arm_free_section (&extab_arm_sec);
8564}
8565
fa197c1c 8566/* Used for both ARM and C6X unwinding tables. */
1b31d05e
NC
8567
8568static void
0b6ae522
DJ
8569arm_process_unwind (FILE *file)
8570{
8571 struct arm_unw_aux_info aux;
8572 Elf_Internal_Shdr *unwsec = NULL;
8573 Elf_Internal_Shdr *strsec;
8574 Elf_Internal_Shdr *sec;
8575 unsigned long i;
fa197c1c 8576 unsigned int sec_type;
0b6ae522 8577
fa197c1c
PB
8578 switch (elf_header.e_machine)
8579 {
8580 case EM_ARM:
8581 sec_type = SHT_ARM_EXIDX;
8582 break;
8583
8584 case EM_TI_C6000:
8585 sec_type = SHT_C6000_UNWIND;
8586 break;
8587
0b4362b0 8588 default:
74e1a04b 8589 error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
1b31d05e
NC
8590 elf_header.e_machine);
8591 return;
fa197c1c
PB
8592 }
8593
0b6ae522 8594 if (string_table == NULL)
1b31d05e
NC
8595 return;
8596
8597 memset (& aux, 0, sizeof (aux));
8598 aux.file = file;
0b6ae522
DJ
8599
8600 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8601 {
8602 if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
8603 {
ba5cdace 8604 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
0b6ae522
DJ
8605
8606 strsec = section_headers + sec->sh_link;
74e1a04b
NC
8607
8608 /* PR binutils/17531 file: 011-12666-0.004. */
8609 if (aux.strtab != NULL)
8610 {
4082ef84 8611 error (_("Multiple string tables found in file.\n"));
74e1a04b
NC
8612 free (aux.strtab);
8613 }
0b6ae522
DJ
8614 aux.strtab = get_data (NULL, file, strsec->sh_offset,
8615 1, strsec->sh_size, _("string table"));
8616 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8617 }
fa197c1c 8618 else if (sec->sh_type == sec_type)
0b6ae522
DJ
8619 unwsec = sec;
8620 }
8621
1b31d05e 8622 if (unwsec == NULL)
0b6ae522 8623 printf (_("\nThere are no unwind sections in this file.\n"));
1b31d05e
NC
8624 else
8625 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8626 {
8627 if (sec->sh_type == sec_type)
8628 {
8629 printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
74e1a04b 8630 printable_section_name (sec),
1b31d05e
NC
8631 (unsigned long) sec->sh_offset,
8632 (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
0b6ae522 8633
1b31d05e
NC
8634 dump_arm_unwind (&aux, sec);
8635 }
8636 }
0b6ae522
DJ
8637
8638 if (aux.symtab)
8639 free (aux.symtab);
8640 if (aux.strtab)
8641 free ((char *) aux.strtab);
0b6ae522
DJ
8642}
8643
1b31d05e 8644static void
2cf0635d 8645process_unwind (FILE * file)
57346661 8646{
2cf0635d
NC
8647 struct unwind_handler
8648 {
57346661 8649 int machtype;
1b31d05e 8650 void (* handler)(FILE *);
2cf0635d
NC
8651 } handlers[] =
8652 {
0b6ae522 8653 { EM_ARM, arm_process_unwind },
57346661
AM
8654 { EM_IA_64, ia64_process_unwind },
8655 { EM_PARISC, hppa_process_unwind },
fa197c1c 8656 { EM_TI_C6000, arm_process_unwind },
57346661
AM
8657 { 0, 0 }
8658 };
8659 int i;
8660
8661 if (!do_unwind)
1b31d05e 8662 return;
57346661
AM
8663
8664 for (i = 0; handlers[i].handler != NULL; i++)
8665 if (elf_header.e_machine == handlers[i].machtype)
9f758fdc
NC
8666 {
8667 handlers[i].handler (file);
8668 return;
8669 }
57346661 8670
1b31d05e
NC
8671 printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
8672 get_machine_name (elf_header.e_machine));
57346661
AM
8673}
8674
252b5132 8675static void
2cf0635d 8676dynamic_section_mips_val (Elf_Internal_Dyn * entry)
252b5132
RH
8677{
8678 switch (entry->d_tag)
8679 {
8680 case DT_MIPS_FLAGS:
8681 if (entry->d_un.d_val == 0)
4b68bca3 8682 printf (_("NONE"));
252b5132
RH
8683 else
8684 {
8685 static const char * opts[] =
8686 {
8687 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
8688 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
8689 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
8690 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
8691 "RLD_ORDER_SAFE"
8692 };
8693 unsigned int cnt;
8694 int first = 1;
2b692964 8695
60bca95a 8696 for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
252b5132
RH
8697 if (entry->d_un.d_val & (1 << cnt))
8698 {
8699 printf ("%s%s", first ? "" : " ", opts[cnt]);
8700 first = 0;
8701 }
252b5132
RH
8702 }
8703 break;
103f02d3 8704
252b5132 8705 case DT_MIPS_IVERSION:
d79b3d50 8706 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
4b68bca3 8707 printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
252b5132 8708 else
76ca31c0
NC
8709 {
8710 char buf[40];
8711 sprintf_vma (buf, entry->d_un.d_ptr);
8712 /* Note: coded this way so that there is a single string for translation. */
8713 printf (_("<corrupt: %s>"), buf);
8714 }
252b5132 8715 break;
103f02d3 8716
252b5132
RH
8717 case DT_MIPS_TIME_STAMP:
8718 {
d5b07ef4 8719 char timebuf[128];
2cf0635d 8720 struct tm * tmp;
91d6fa6a 8721 time_t atime = entry->d_un.d_val;
82b1b41b 8722
91d6fa6a 8723 tmp = gmtime (&atime);
82b1b41b
NC
8724 /* PR 17531: file: 6accc532. */
8725 if (tmp == NULL)
8726 snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
8727 else
8728 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
8729 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8730 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
4b68bca3 8731 printf (_("Time Stamp: %s"), timebuf);
252b5132
RH
8732 }
8733 break;
103f02d3 8734
252b5132
RH
8735 case DT_MIPS_RLD_VERSION:
8736 case DT_MIPS_LOCAL_GOTNO:
8737 case DT_MIPS_CONFLICTNO:
8738 case DT_MIPS_LIBLISTNO:
8739 case DT_MIPS_SYMTABNO:
8740 case DT_MIPS_UNREFEXTNO:
8741 case DT_MIPS_HIPAGENO:
8742 case DT_MIPS_DELTA_CLASS_NO:
8743 case DT_MIPS_DELTA_INSTANCE_NO:
8744 case DT_MIPS_DELTA_RELOC_NO:
8745 case DT_MIPS_DELTA_SYM_NO:
8746 case DT_MIPS_DELTA_CLASSSYM_NO:
8747 case DT_MIPS_COMPACT_SIZE:
c69075ac 8748 print_vma (entry->d_un.d_val, DEC);
252b5132 8749 break;
103f02d3
UD
8750
8751 default:
4b68bca3 8752 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
103f02d3 8753 }
4b68bca3 8754 putchar ('\n');
103f02d3
UD
8755}
8756
103f02d3 8757static void
2cf0635d 8758dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
103f02d3
UD
8759{
8760 switch (entry->d_tag)
8761 {
8762 case DT_HP_DLD_FLAGS:
8763 {
8764 static struct
8765 {
8766 long int bit;
2cf0635d 8767 const char * str;
5e220199
NC
8768 }
8769 flags[] =
8770 {
8771 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
8772 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
8773 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
8774 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
8775 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
8776 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
8777 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
8778 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
8779 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
8780 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
eec8f817
DA
8781 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
8782 { DT_HP_GST, "HP_GST" },
8783 { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
8784 { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
8785 { DT_HP_NODELETE, "HP_NODELETE" },
8786 { DT_HP_GROUP, "HP_GROUP" },
8787 { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
5e220199 8788 };
103f02d3 8789 int first = 1;
5e220199 8790 size_t cnt;
f7a99963 8791 bfd_vma val = entry->d_un.d_val;
103f02d3 8792
60bca95a 8793 for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
103f02d3 8794 if (val & flags[cnt].bit)
30800947
NC
8795 {
8796 if (! first)
8797 putchar (' ');
8798 fputs (flags[cnt].str, stdout);
8799 first = 0;
8800 val ^= flags[cnt].bit;
8801 }
76da6bbe 8802
103f02d3 8803 if (val != 0 || first)
f7a99963
NC
8804 {
8805 if (! first)
8806 putchar (' ');
8807 print_vma (val, HEX);
8808 }
103f02d3
UD
8809 }
8810 break;
76da6bbe 8811
252b5132 8812 default:
f7a99963
NC
8813 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8814 break;
252b5132 8815 }
35b1837e 8816 putchar ('\n');
252b5132
RH
8817}
8818
28f997cf
TG
8819#ifdef BFD64
8820
8821/* VMS vs Unix time offset and factor. */
8822
8823#define VMS_EPOCH_OFFSET 35067168000000000LL
8824#define VMS_GRANULARITY_FACTOR 10000000
8825
8826/* Display a VMS time in a human readable format. */
8827
8828static void
8829print_vms_time (bfd_int64_t vmstime)
8830{
8831 struct tm *tm;
8832 time_t unxtime;
8833
8834 unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
8835 tm = gmtime (&unxtime);
8836 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
8837 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
8838 tm->tm_hour, tm->tm_min, tm->tm_sec);
8839}
8840#endif /* BFD64 */
8841
ecc51f48 8842static void
2cf0635d 8843dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
ecc51f48
NC
8844{
8845 switch (entry->d_tag)
8846 {
0de14b54 8847 case DT_IA_64_PLT_RESERVE:
bdf4d63a 8848 /* First 3 slots reserved. */
ecc51f48
NC
8849 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8850 printf (" -- ");
8851 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
bdf4d63a
JJ
8852 break;
8853
28f997cf
TG
8854 case DT_IA_64_VMS_LINKTIME:
8855#ifdef BFD64
8856 print_vms_time (entry->d_un.d_val);
8857#endif
8858 break;
8859
8860 case DT_IA_64_VMS_LNKFLAGS:
8861 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8862 if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
8863 printf (" CALL_DEBUG");
8864 if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
8865 printf (" NOP0BUFS");
8866 if (entry->d_un.d_val & VMS_LF_P0IMAGE)
8867 printf (" P0IMAGE");
8868 if (entry->d_un.d_val & VMS_LF_MKTHREADS)
8869 printf (" MKTHREADS");
8870 if (entry->d_un.d_val & VMS_LF_UPCALLS)
8871 printf (" UPCALLS");
8872 if (entry->d_un.d_val & VMS_LF_IMGSTA)
8873 printf (" IMGSTA");
8874 if (entry->d_un.d_val & VMS_LF_INITIALIZE)
8875 printf (" INITIALIZE");
8876 if (entry->d_un.d_val & VMS_LF_MAIN)
8877 printf (" MAIN");
8878 if (entry->d_un.d_val & VMS_LF_EXE_INIT)
8879 printf (" EXE_INIT");
8880 if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
8881 printf (" TBK_IN_IMG");
8882 if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
8883 printf (" DBG_IN_IMG");
8884 if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
8885 printf (" TBK_IN_DSF");
8886 if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
8887 printf (" DBG_IN_DSF");
8888 if (entry->d_un.d_val & VMS_LF_SIGNATURES)
8889 printf (" SIGNATURES");
8890 if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
8891 printf (" REL_SEG_OFF");
8892 break;
8893
bdf4d63a
JJ
8894 default:
8895 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8896 break;
ecc51f48 8897 }
bdf4d63a 8898 putchar ('\n');
ecc51f48
NC
8899}
8900
252b5132 8901static int
2cf0635d 8902get_32bit_dynamic_section (FILE * file)
252b5132 8903{
2cf0635d
NC
8904 Elf32_External_Dyn * edyn;
8905 Elf32_External_Dyn * ext;
8906 Elf_Internal_Dyn * entry;
103f02d3 8907
3f5e193b
NC
8908 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8909 dynamic_size, _("dynamic section"));
a6e9f9df
AM
8910 if (!edyn)
8911 return 0;
103f02d3 8912
071436c6
NC
8913 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8914 might not have the luxury of section headers. Look for the DT_NULL
8915 terminator to determine the number of entries. */
ba2685cc 8916 for (ext = edyn, dynamic_nent = 0;
53c3012c 8917 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
ba2685cc
AM
8918 ext++)
8919 {
8920 dynamic_nent++;
8921 if (BYTE_GET (ext->d_tag) == DT_NULL)
8922 break;
8923 }
252b5132 8924
3f5e193b
NC
8925 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8926 sizeof (* entry));
b2d38a17 8927 if (dynamic_section == NULL)
252b5132 8928 {
8b73c356
NC
8929 error (_("Out of memory allocating space for %lu dynamic entries\n"),
8930 (unsigned long) dynamic_nent);
9ea033b2
NC
8931 free (edyn);
8932 return 0;
8933 }
252b5132 8934
fb514b26 8935 for (ext = edyn, entry = dynamic_section;
ba2685cc 8936 entry < dynamic_section + dynamic_nent;
fb514b26 8937 ext++, entry++)
9ea033b2 8938 {
fb514b26
AM
8939 entry->d_tag = BYTE_GET (ext->d_tag);
8940 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
252b5132
RH
8941 }
8942
9ea033b2
NC
8943 free (edyn);
8944
8945 return 1;
8946}
8947
8948static int
2cf0635d 8949get_64bit_dynamic_section (FILE * file)
9ea033b2 8950{
2cf0635d
NC
8951 Elf64_External_Dyn * edyn;
8952 Elf64_External_Dyn * ext;
8953 Elf_Internal_Dyn * entry;
103f02d3 8954
071436c6 8955 /* Read in the data. */
3f5e193b
NC
8956 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8957 dynamic_size, _("dynamic section"));
a6e9f9df
AM
8958 if (!edyn)
8959 return 0;
103f02d3 8960
071436c6
NC
8961 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8962 might not have the luxury of section headers. Look for the DT_NULL
8963 terminator to determine the number of entries. */
ba2685cc 8964 for (ext = edyn, dynamic_nent = 0;
53c3012c
AM
8965 /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer. */
8966 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
ba2685cc
AM
8967 ext++)
8968 {
8969 dynamic_nent++;
66543521 8970 if (BYTE_GET (ext->d_tag) == DT_NULL)
ba2685cc
AM
8971 break;
8972 }
252b5132 8973
3f5e193b
NC
8974 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8975 sizeof (* entry));
b2d38a17 8976 if (dynamic_section == NULL)
252b5132 8977 {
8b73c356
NC
8978 error (_("Out of memory allocating space for %lu dynamic entries\n"),
8979 (unsigned long) dynamic_nent);
252b5132
RH
8980 free (edyn);
8981 return 0;
8982 }
8983
071436c6 8984 /* Convert from external to internal formats. */
fb514b26 8985 for (ext = edyn, entry = dynamic_section;
ba2685cc 8986 entry < dynamic_section + dynamic_nent;
fb514b26 8987 ext++, entry++)
252b5132 8988 {
66543521
AM
8989 entry->d_tag = BYTE_GET (ext->d_tag);
8990 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
252b5132
RH
8991 }
8992
8993 free (edyn);
8994
9ea033b2
NC
8995 return 1;
8996}
8997
e9e44622
JJ
8998static void
8999print_dynamic_flags (bfd_vma flags)
d1133906 9000{
e9e44622 9001 int first = 1;
13ae64f3 9002
d1133906
NC
9003 while (flags)
9004 {
9005 bfd_vma flag;
9006
9007 flag = flags & - flags;
9008 flags &= ~ flag;
9009
e9e44622
JJ
9010 if (first)
9011 first = 0;
9012 else
9013 putc (' ', stdout);
13ae64f3 9014
d1133906
NC
9015 switch (flag)
9016 {
e9e44622
JJ
9017 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
9018 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
9019 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
9020 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
9021 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
2b692964 9022 default: fputs (_("unknown"), stdout); break;
d1133906
NC
9023 }
9024 }
e9e44622 9025 puts ("");
d1133906
NC
9026}
9027
b2d38a17
NC
9028/* Parse and display the contents of the dynamic section. */
9029
9ea033b2 9030static int
2cf0635d 9031process_dynamic_section (FILE * file)
9ea033b2 9032{
2cf0635d 9033 Elf_Internal_Dyn * entry;
9ea033b2
NC
9034
9035 if (dynamic_size == 0)
9036 {
9037 if (do_dynamic)
b2d38a17 9038 printf (_("\nThere is no dynamic section in this file.\n"));
9ea033b2
NC
9039
9040 return 1;
9041 }
9042
9043 if (is_32bit_elf)
9044 {
b2d38a17 9045 if (! get_32bit_dynamic_section (file))
9ea033b2
NC
9046 return 0;
9047 }
b2d38a17 9048 else if (! get_64bit_dynamic_section (file))
9ea033b2
NC
9049 return 0;
9050
252b5132
RH
9051 /* Find the appropriate symbol table. */
9052 if (dynamic_symbols == NULL)
9053 {
86dba8ee
AM
9054 for (entry = dynamic_section;
9055 entry < dynamic_section + dynamic_nent;
9056 ++entry)
252b5132 9057 {
c8286bd1 9058 Elf_Internal_Shdr section;
252b5132
RH
9059
9060 if (entry->d_tag != DT_SYMTAB)
9061 continue;
9062
9063 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
9064
9065 /* Since we do not know how big the symbol table is,
9066 we default to reading in the entire file (!) and
9067 processing that. This is overkill, I know, but it
e3c8793a 9068 should work. */
d93f0186 9069 section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
252b5132 9070
fb52b2f4
NC
9071 if (archive_file_offset != 0)
9072 section.sh_size = archive_file_size - section.sh_offset;
9073 else
9074 {
9075 if (fseek (file, 0, SEEK_END))
591a748a 9076 error (_("Unable to seek to end of file!\n"));
fb52b2f4
NC
9077
9078 section.sh_size = ftell (file) - section.sh_offset;
9079 }
252b5132 9080
9ea033b2 9081 if (is_32bit_elf)
9ad5cbcf 9082 section.sh_entsize = sizeof (Elf32_External_Sym);
9ea033b2 9083 else
9ad5cbcf 9084 section.sh_entsize = sizeof (Elf64_External_Sym);
071436c6 9085 section.sh_name = string_table_length;
252b5132 9086
ba5cdace 9087 dynamic_symbols = GET_ELF_SYMBOLS (file, &section, & num_dynamic_syms);
19936277 9088 if (num_dynamic_syms < 1)
252b5132
RH
9089 {
9090 error (_("Unable to determine the number of symbols to load\n"));
9091 continue;
9092 }
252b5132
RH
9093 }
9094 }
9095
9096 /* Similarly find a string table. */
9097 if (dynamic_strings == NULL)
9098 {
86dba8ee
AM
9099 for (entry = dynamic_section;
9100 entry < dynamic_section + dynamic_nent;
9101 ++entry)
252b5132
RH
9102 {
9103 unsigned long offset;
b34976b6 9104 long str_tab_len;
252b5132
RH
9105
9106 if (entry->d_tag != DT_STRTAB)
9107 continue;
9108
9109 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
9110
9111 /* Since we do not know how big the string table is,
9112 we default to reading in the entire file (!) and
9113 processing that. This is overkill, I know, but it
e3c8793a 9114 should work. */
252b5132 9115
d93f0186 9116 offset = offset_from_vma (file, entry->d_un.d_val, 0);
fb52b2f4
NC
9117
9118 if (archive_file_offset != 0)
9119 str_tab_len = archive_file_size - offset;
9120 else
9121 {
9122 if (fseek (file, 0, SEEK_END))
9123 error (_("Unable to seek to end of file\n"));
9124 str_tab_len = ftell (file) - offset;
9125 }
252b5132
RH
9126
9127 if (str_tab_len < 1)
9128 {
9129 error
9130 (_("Unable to determine the length of the dynamic string table\n"));
9131 continue;
9132 }
9133
3f5e193b
NC
9134 dynamic_strings = (char *) get_data (NULL, file, offset, 1,
9135 str_tab_len,
9136 _("dynamic string table"));
59245841 9137 dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
252b5132
RH
9138 break;
9139 }
9140 }
9141
9142 /* And find the syminfo section if available. */
9143 if (dynamic_syminfo == NULL)
9144 {
3e8bba36 9145 unsigned long syminsz = 0;
252b5132 9146
86dba8ee
AM
9147 for (entry = dynamic_section;
9148 entry < dynamic_section + dynamic_nent;
9149 ++entry)
252b5132
RH
9150 {
9151 if (entry->d_tag == DT_SYMINENT)
9152 {
9153 /* Note: these braces are necessary to avoid a syntax
9154 error from the SunOS4 C compiler. */
049b0c3a
NC
9155 /* PR binutils/17531: A corrupt file can trigger this test.
9156 So do not use an assert, instead generate an error message. */
9157 if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
071436c6 9158 error (_("Bad value (%d) for SYMINENT entry\n"),
049b0c3a 9159 (int) entry->d_un.d_val);
252b5132
RH
9160 }
9161 else if (entry->d_tag == DT_SYMINSZ)
9162 syminsz = entry->d_un.d_val;
9163 else if (entry->d_tag == DT_SYMINFO)
d93f0186
NC
9164 dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
9165 syminsz);
252b5132
RH
9166 }
9167
9168 if (dynamic_syminfo_offset != 0 && syminsz != 0)
9169 {
2cf0635d
NC
9170 Elf_External_Syminfo * extsyminfo;
9171 Elf_External_Syminfo * extsym;
9172 Elf_Internal_Syminfo * syminfo;
252b5132
RH
9173
9174 /* There is a syminfo section. Read the data. */
3f5e193b
NC
9175 extsyminfo = (Elf_External_Syminfo *)
9176 get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
9177 _("symbol information"));
a6e9f9df
AM
9178 if (!extsyminfo)
9179 return 0;
252b5132 9180
3f5e193b 9181 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
252b5132
RH
9182 if (dynamic_syminfo == NULL)
9183 {
8b73c356
NC
9184 error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9185 (unsigned long) syminsz);
252b5132
RH
9186 return 0;
9187 }
9188
9189 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
86dba8ee
AM
9190 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
9191 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
9192 ++syminfo, ++extsym)
252b5132 9193 {
86dba8ee
AM
9194 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
9195 syminfo->si_flags = BYTE_GET (extsym->si_flags);
252b5132
RH
9196 }
9197
9198 free (extsyminfo);
9199 }
9200 }
9201
9202 if (do_dynamic && dynamic_addr)
8b73c356
NC
9203 printf (_("\nDynamic section at offset 0x%lx contains %lu entries:\n"),
9204 dynamic_addr, (unsigned long) dynamic_nent);
252b5132
RH
9205 if (do_dynamic)
9206 printf (_(" Tag Type Name/Value\n"));
9207
86dba8ee
AM
9208 for (entry = dynamic_section;
9209 entry < dynamic_section + dynamic_nent;
9210 entry++)
252b5132
RH
9211 {
9212 if (do_dynamic)
f7a99963 9213 {
2cf0635d 9214 const char * dtype;
e699b9ff 9215
f7a99963
NC
9216 putchar (' ');
9217 print_vma (entry->d_tag, FULL_HEX);
e699b9ff
ILT
9218 dtype = get_dynamic_type (entry->d_tag);
9219 printf (" (%s)%*s", dtype,
9220 ((is_32bit_elf ? 27 : 19)
9221 - (int) strlen (dtype)),
f7a99963
NC
9222 " ");
9223 }
252b5132
RH
9224
9225 switch (entry->d_tag)
9226 {
d1133906
NC
9227 case DT_FLAGS:
9228 if (do_dynamic)
e9e44622 9229 print_dynamic_flags (entry->d_un.d_val);
d1133906 9230 break;
76da6bbe 9231
252b5132
RH
9232 case DT_AUXILIARY:
9233 case DT_FILTER:
019148e4
L
9234 case DT_CONFIG:
9235 case DT_DEPAUDIT:
9236 case DT_AUDIT:
252b5132
RH
9237 if (do_dynamic)
9238 {
019148e4 9239 switch (entry->d_tag)
b34976b6 9240 {
019148e4
L
9241 case DT_AUXILIARY:
9242 printf (_("Auxiliary library"));
9243 break;
9244
9245 case DT_FILTER:
9246 printf (_("Filter library"));
9247 break;
9248
b34976b6 9249 case DT_CONFIG:
019148e4
L
9250 printf (_("Configuration file"));
9251 break;
9252
9253 case DT_DEPAUDIT:
9254 printf (_("Dependency audit library"));
9255 break;
9256
9257 case DT_AUDIT:
9258 printf (_("Audit library"));
9259 break;
9260 }
252b5132 9261
d79b3d50
NC
9262 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9263 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
252b5132 9264 else
f7a99963
NC
9265 {
9266 printf (": ");
9267 print_vma (entry->d_un.d_val, PREFIX_HEX);
9268 putchar ('\n');
9269 }
252b5132
RH
9270 }
9271 break;
9272
dcefbbbd 9273 case DT_FEATURE:
252b5132
RH
9274 if (do_dynamic)
9275 {
9276 printf (_("Flags:"));
86f55779 9277
252b5132
RH
9278 if (entry->d_un.d_val == 0)
9279 printf (_(" None\n"));
9280 else
9281 {
9282 unsigned long int val = entry->d_un.d_val;
86f55779 9283
252b5132
RH
9284 if (val & DTF_1_PARINIT)
9285 {
9286 printf (" PARINIT");
9287 val ^= DTF_1_PARINIT;
9288 }
dcefbbbd
L
9289 if (val & DTF_1_CONFEXP)
9290 {
9291 printf (" CONFEXP");
9292 val ^= DTF_1_CONFEXP;
9293 }
252b5132
RH
9294 if (val != 0)
9295 printf (" %lx", val);
9296 puts ("");
9297 }
9298 }
9299 break;
9300
9301 case DT_POSFLAG_1:
9302 if (do_dynamic)
9303 {
9304 printf (_("Flags:"));
86f55779 9305
252b5132
RH
9306 if (entry->d_un.d_val == 0)
9307 printf (_(" None\n"));
9308 else
9309 {
9310 unsigned long int val = entry->d_un.d_val;
86f55779 9311
252b5132
RH
9312 if (val & DF_P1_LAZYLOAD)
9313 {
9314 printf (" LAZYLOAD");
9315 val ^= DF_P1_LAZYLOAD;
9316 }
9317 if (val & DF_P1_GROUPPERM)
9318 {
9319 printf (" GROUPPERM");
9320 val ^= DF_P1_GROUPPERM;
9321 }
9322 if (val != 0)
9323 printf (" %lx", val);
9324 puts ("");
9325 }
9326 }
9327 break;
9328
9329 case DT_FLAGS_1:
9330 if (do_dynamic)
9331 {
9332 printf (_("Flags:"));
9333 if (entry->d_un.d_val == 0)
9334 printf (_(" None\n"));
9335 else
9336 {
9337 unsigned long int val = entry->d_un.d_val;
86f55779 9338
252b5132
RH
9339 if (val & DF_1_NOW)
9340 {
9341 printf (" NOW");
9342 val ^= DF_1_NOW;
9343 }
9344 if (val & DF_1_GLOBAL)
9345 {
9346 printf (" GLOBAL");
9347 val ^= DF_1_GLOBAL;
9348 }
9349 if (val & DF_1_GROUP)
9350 {
9351 printf (" GROUP");
9352 val ^= DF_1_GROUP;
9353 }
9354 if (val & DF_1_NODELETE)
9355 {
9356 printf (" NODELETE");
9357 val ^= DF_1_NODELETE;
9358 }
9359 if (val & DF_1_LOADFLTR)
9360 {
9361 printf (" LOADFLTR");
9362 val ^= DF_1_LOADFLTR;
9363 }
9364 if (val & DF_1_INITFIRST)
9365 {
9366 printf (" INITFIRST");
9367 val ^= DF_1_INITFIRST;
9368 }
9369 if (val & DF_1_NOOPEN)
9370 {
9371 printf (" NOOPEN");
9372 val ^= DF_1_NOOPEN;
9373 }
9374 if (val & DF_1_ORIGIN)
9375 {
9376 printf (" ORIGIN");
9377 val ^= DF_1_ORIGIN;
9378 }
9379 if (val & DF_1_DIRECT)
9380 {
9381 printf (" DIRECT");
9382 val ^= DF_1_DIRECT;
9383 }
9384 if (val & DF_1_TRANS)
9385 {
9386 printf (" TRANS");
9387 val ^= DF_1_TRANS;
9388 }
9389 if (val & DF_1_INTERPOSE)
9390 {
9391 printf (" INTERPOSE");
9392 val ^= DF_1_INTERPOSE;
9393 }
f7db6139 9394 if (val & DF_1_NODEFLIB)
dcefbbbd 9395 {
f7db6139
L
9396 printf (" NODEFLIB");
9397 val ^= DF_1_NODEFLIB;
dcefbbbd
L
9398 }
9399 if (val & DF_1_NODUMP)
9400 {
9401 printf (" NODUMP");
9402 val ^= DF_1_NODUMP;
9403 }
34b60028 9404 if (val & DF_1_CONFALT)
dcefbbbd 9405 {
34b60028
L
9406 printf (" CONFALT");
9407 val ^= DF_1_CONFALT;
9408 }
9409 if (val & DF_1_ENDFILTEE)
9410 {
9411 printf (" ENDFILTEE");
9412 val ^= DF_1_ENDFILTEE;
9413 }
9414 if (val & DF_1_DISPRELDNE)
9415 {
9416 printf (" DISPRELDNE");
9417 val ^= DF_1_DISPRELDNE;
9418 }
9419 if (val & DF_1_DISPRELPND)
9420 {
9421 printf (" DISPRELPND");
9422 val ^= DF_1_DISPRELPND;
9423 }
9424 if (val & DF_1_NODIRECT)
9425 {
9426 printf (" NODIRECT");
9427 val ^= DF_1_NODIRECT;
9428 }
9429 if (val & DF_1_IGNMULDEF)
9430 {
9431 printf (" IGNMULDEF");
9432 val ^= DF_1_IGNMULDEF;
9433 }
9434 if (val & DF_1_NOKSYMS)
9435 {
9436 printf (" NOKSYMS");
9437 val ^= DF_1_NOKSYMS;
9438 }
9439 if (val & DF_1_NOHDR)
9440 {
9441 printf (" NOHDR");
9442 val ^= DF_1_NOHDR;
9443 }
9444 if (val & DF_1_EDITED)
9445 {
9446 printf (" EDITED");
9447 val ^= DF_1_EDITED;
9448 }
9449 if (val & DF_1_NORELOC)
9450 {
9451 printf (" NORELOC");
9452 val ^= DF_1_NORELOC;
9453 }
9454 if (val & DF_1_SYMINTPOSE)
9455 {
9456 printf (" SYMINTPOSE");
9457 val ^= DF_1_SYMINTPOSE;
9458 }
9459 if (val & DF_1_GLOBAUDIT)
9460 {
9461 printf (" GLOBAUDIT");
9462 val ^= DF_1_GLOBAUDIT;
9463 }
9464 if (val & DF_1_SINGLETON)
9465 {
9466 printf (" SINGLETON");
9467 val ^= DF_1_SINGLETON;
dcefbbbd 9468 }
5c383f02
RO
9469 if (val & DF_1_STUB)
9470 {
9471 printf (" STUB");
9472 val ^= DF_1_STUB;
9473 }
9474 if (val & DF_1_PIE)
9475 {
9476 printf (" PIE");
9477 val ^= DF_1_PIE;
9478 }
252b5132
RH
9479 if (val != 0)
9480 printf (" %lx", val);
9481 puts ("");
9482 }
9483 }
9484 break;
9485
9486 case DT_PLTREL:
566b0d53 9487 dynamic_info[entry->d_tag] = entry->d_un.d_val;
252b5132
RH
9488 if (do_dynamic)
9489 puts (get_dynamic_type (entry->d_un.d_val));
9490 break;
9491
9492 case DT_NULL :
9493 case DT_NEEDED :
9494 case DT_PLTGOT :
9495 case DT_HASH :
9496 case DT_STRTAB :
9497 case DT_SYMTAB :
9498 case DT_RELA :
9499 case DT_INIT :
9500 case DT_FINI :
9501 case DT_SONAME :
9502 case DT_RPATH :
9503 case DT_SYMBOLIC:
9504 case DT_REL :
9505 case DT_DEBUG :
9506 case DT_TEXTREL :
9507 case DT_JMPREL :
019148e4 9508 case DT_RUNPATH :
252b5132
RH
9509 dynamic_info[entry->d_tag] = entry->d_un.d_val;
9510
9511 if (do_dynamic)
9512 {
2cf0635d 9513 char * name;
252b5132 9514
d79b3d50
NC
9515 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9516 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
252b5132 9517 else
d79b3d50 9518 name = NULL;
252b5132
RH
9519
9520 if (name)
9521 {
9522 switch (entry->d_tag)
9523 {
9524 case DT_NEEDED:
9525 printf (_("Shared library: [%s]"), name);
9526
18bd398b 9527 if (streq (name, program_interpreter))
f7a99963 9528 printf (_(" program interpreter"));
252b5132
RH
9529 break;
9530
9531 case DT_SONAME:
f7a99963 9532 printf (_("Library soname: [%s]"), name);
252b5132
RH
9533 break;
9534
9535 case DT_RPATH:
f7a99963 9536 printf (_("Library rpath: [%s]"), name);
252b5132
RH
9537 break;
9538
019148e4
L
9539 case DT_RUNPATH:
9540 printf (_("Library runpath: [%s]"), name);
9541 break;
9542
252b5132 9543 default:
f7a99963
NC
9544 print_vma (entry->d_un.d_val, PREFIX_HEX);
9545 break;
252b5132
RH
9546 }
9547 }
9548 else
f7a99963
NC
9549 print_vma (entry->d_un.d_val, PREFIX_HEX);
9550
9551 putchar ('\n');
252b5132
RH
9552 }
9553 break;
9554
9555 case DT_PLTRELSZ:
9556 case DT_RELASZ :
9557 case DT_STRSZ :
9558 case DT_RELSZ :
9559 case DT_RELAENT :
9560 case DT_SYMENT :
9561 case DT_RELENT :
566b0d53 9562 dynamic_info[entry->d_tag] = entry->d_un.d_val;
252b5132
RH
9563 case DT_PLTPADSZ:
9564 case DT_MOVEENT :
9565 case DT_MOVESZ :
9566 case DT_INIT_ARRAYSZ:
9567 case DT_FINI_ARRAYSZ:
047b2264
JJ
9568 case DT_GNU_CONFLICTSZ:
9569 case DT_GNU_LIBLISTSZ:
252b5132 9570 if (do_dynamic)
f7a99963
NC
9571 {
9572 print_vma (entry->d_un.d_val, UNSIGNED);
2b692964 9573 printf (_(" (bytes)\n"));
f7a99963 9574 }
252b5132
RH
9575 break;
9576
9577 case DT_VERDEFNUM:
9578 case DT_VERNEEDNUM:
9579 case DT_RELACOUNT:
9580 case DT_RELCOUNT:
9581 if (do_dynamic)
f7a99963
NC
9582 {
9583 print_vma (entry->d_un.d_val, UNSIGNED);
9584 putchar ('\n');
9585 }
252b5132
RH
9586 break;
9587
9588 case DT_SYMINSZ:
9589 case DT_SYMINENT:
9590 case DT_SYMINFO:
9591 case DT_USED:
9592 case DT_INIT_ARRAY:
9593 case DT_FINI_ARRAY:
9594 if (do_dynamic)
9595 {
d79b3d50
NC
9596 if (entry->d_tag == DT_USED
9597 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
252b5132 9598 {
2cf0635d 9599 char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
252b5132 9600
b34976b6 9601 if (*name)
252b5132
RH
9602 {
9603 printf (_("Not needed object: [%s]\n"), name);
9604 break;
9605 }
9606 }
103f02d3 9607
f7a99963
NC
9608 print_vma (entry->d_un.d_val, PREFIX_HEX);
9609 putchar ('\n');
252b5132
RH
9610 }
9611 break;
9612
9613 case DT_BIND_NOW:
9614 /* The value of this entry is ignored. */
35b1837e
AM
9615 if (do_dynamic)
9616 putchar ('\n');
252b5132 9617 break;
103f02d3 9618
047b2264
JJ
9619 case DT_GNU_PRELINKED:
9620 if (do_dynamic)
9621 {
2cf0635d 9622 struct tm * tmp;
91d6fa6a 9623 time_t atime = entry->d_un.d_val;
047b2264 9624
91d6fa6a 9625 tmp = gmtime (&atime);
071436c6
NC
9626 /* PR 17533 file: 041-1244816-0.004. */
9627 if (tmp == NULL)
5a2cbcf4
L
9628 printf (_("<corrupt time val: %lx"),
9629 (unsigned long) atime);
071436c6
NC
9630 else
9631 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
9632 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9633 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
047b2264
JJ
9634
9635 }
9636 break;
9637
fdc90cb4
JJ
9638 case DT_GNU_HASH:
9639 dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
9640 if (do_dynamic)
9641 {
9642 print_vma (entry->d_un.d_val, PREFIX_HEX);
9643 putchar ('\n');
9644 }
9645 break;
9646
252b5132
RH
9647 default:
9648 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
b34976b6 9649 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
252b5132
RH
9650 entry->d_un.d_val;
9651
9652 if (do_dynamic)
9653 {
9654 switch (elf_header.e_machine)
9655 {
9656 case EM_MIPS:
4fe85591 9657 case EM_MIPS_RS3_LE:
b2d38a17 9658 dynamic_section_mips_val (entry);
252b5132 9659 break;
103f02d3 9660 case EM_PARISC:
b2d38a17 9661 dynamic_section_parisc_val (entry);
103f02d3 9662 break;
ecc51f48 9663 case EM_IA_64:
b2d38a17 9664 dynamic_section_ia64_val (entry);
ecc51f48 9665 break;
252b5132 9666 default:
f7a99963
NC
9667 print_vma (entry->d_un.d_val, PREFIX_HEX);
9668 putchar ('\n');
252b5132
RH
9669 }
9670 }
9671 break;
9672 }
9673 }
9674
9675 return 1;
9676}
9677
9678static char *
d3ba0551 9679get_ver_flags (unsigned int flags)
252b5132 9680{
b34976b6 9681 static char buff[32];
252b5132
RH
9682
9683 buff[0] = 0;
9684
9685 if (flags == 0)
9686 return _("none");
9687
9688 if (flags & VER_FLG_BASE)
9689 strcat (buff, "BASE ");
9690
9691 if (flags & VER_FLG_WEAK)
9692 {
9693 if (flags & VER_FLG_BASE)
9694 strcat (buff, "| ");
9695
9696 strcat (buff, "WEAK ");
9697 }
9698
44ec90b9
RO
9699 if (flags & VER_FLG_INFO)
9700 {
9701 if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
9702 strcat (buff, "| ");
9703
9704 strcat (buff, "INFO ");
9705 }
9706
9707 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
2b692964 9708 strcat (buff, _("| <unknown>"));
252b5132
RH
9709
9710 return buff;
9711}
9712
9713/* Display the contents of the version sections. */
98fb390a 9714
252b5132 9715static int
2cf0635d 9716process_version_sections (FILE * file)
252b5132 9717{
2cf0635d 9718 Elf_Internal_Shdr * section;
b34976b6
AM
9719 unsigned i;
9720 int found = 0;
252b5132
RH
9721
9722 if (! do_version)
9723 return 1;
9724
9725 for (i = 0, section = section_headers;
9726 i < elf_header.e_shnum;
b34976b6 9727 i++, section++)
252b5132
RH
9728 {
9729 switch (section->sh_type)
9730 {
9731 case SHT_GNU_verdef:
9732 {
2cf0635d 9733 Elf_External_Verdef * edefs;
b34976b6
AM
9734 unsigned int idx;
9735 unsigned int cnt;
2cf0635d 9736 char * endbuf;
252b5132
RH
9737
9738 found = 1;
9739
74e1a04b
NC
9740 printf (_("\nVersion definition section '%s' contains %u entries:\n"),
9741 printable_section_name (section),
9742 section->sh_info);
252b5132
RH
9743
9744 printf (_(" Addr: 0x"));
9745 printf_vma (section->sh_addr);
74e1a04b 9746 printf (_(" Offset: %#08lx Link: %u (%s)"),
1b228002 9747 (unsigned long) section->sh_offset, section->sh_link,
74e1a04b 9748 printable_section_name_from_index (section->sh_link));
252b5132 9749
3f5e193b
NC
9750 edefs = (Elf_External_Verdef *)
9751 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
9752 _("version definition section"));
a6e9f9df
AM
9753 if (!edefs)
9754 break;
59245841 9755 endbuf = (char *) edefs + section->sh_size;
252b5132 9756
b34976b6 9757 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
252b5132 9758 {
2cf0635d
NC
9759 char * vstart;
9760 Elf_External_Verdef * edef;
b34976b6 9761 Elf_Internal_Verdef ent;
2cf0635d 9762 Elf_External_Verdaux * eaux;
b34976b6
AM
9763 Elf_Internal_Verdaux aux;
9764 int j;
9765 int isum;
103f02d3 9766
7e26601c
NC
9767 /* Check for very large indicies. */
9768 if (idx > (size_t) (endbuf - (char *) edefs))
dd24e3da
NC
9769 break;
9770
252b5132 9771 vstart = ((char *) edefs) + idx;
54806181
AM
9772 if (vstart + sizeof (*edef) > endbuf)
9773 break;
252b5132
RH
9774
9775 edef = (Elf_External_Verdef *) vstart;
9776
9777 ent.vd_version = BYTE_GET (edef->vd_version);
9778 ent.vd_flags = BYTE_GET (edef->vd_flags);
9779 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
9780 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
9781 ent.vd_hash = BYTE_GET (edef->vd_hash);
9782 ent.vd_aux = BYTE_GET (edef->vd_aux);
9783 ent.vd_next = BYTE_GET (edef->vd_next);
9784
9785 printf (_(" %#06x: Rev: %d Flags: %s"),
9786 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
9787
9788 printf (_(" Index: %d Cnt: %d "),
9789 ent.vd_ndx, ent.vd_cnt);
9790
dd24e3da 9791 /* Check for overflow. */
7e26601c 9792 if (ent.vd_aux > (size_t) (endbuf - vstart))
dd24e3da
NC
9793 break;
9794
252b5132
RH
9795 vstart += ent.vd_aux;
9796
9797 eaux = (Elf_External_Verdaux *) vstart;
9798
9799 aux.vda_name = BYTE_GET (eaux->vda_name);
9800 aux.vda_next = BYTE_GET (eaux->vda_next);
9801
d79b3d50
NC
9802 if (VALID_DYNAMIC_NAME (aux.vda_name))
9803 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
252b5132
RH
9804 else
9805 printf (_("Name index: %ld\n"), aux.vda_name);
9806
9807 isum = idx + ent.vd_aux;
9808
b34976b6 9809 for (j = 1; j < ent.vd_cnt; j++)
252b5132 9810 {
dd24e3da 9811 /* Check for overflow. */
7e26601c 9812 if (aux.vda_next > (size_t) (endbuf - vstart))
dd24e3da
NC
9813 break;
9814
252b5132
RH
9815 isum += aux.vda_next;
9816 vstart += aux.vda_next;
9817
9818 eaux = (Elf_External_Verdaux *) vstart;
54806181
AM
9819 if (vstart + sizeof (*eaux) > endbuf)
9820 break;
252b5132
RH
9821
9822 aux.vda_name = BYTE_GET (eaux->vda_name);
9823 aux.vda_next = BYTE_GET (eaux->vda_next);
9824
d79b3d50 9825 if (VALID_DYNAMIC_NAME (aux.vda_name))
252b5132 9826 printf (_(" %#06x: Parent %d: %s\n"),
d79b3d50 9827 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
252b5132
RH
9828 else
9829 printf (_(" %#06x: Parent %d, name index: %ld\n"),
9830 isum, j, aux.vda_name);
9831 }
dd24e3da 9832
54806181
AM
9833 if (j < ent.vd_cnt)
9834 printf (_(" Version def aux past end of section\n"));
252b5132 9835
5d921cbd
NC
9836 /* PR 17531: file: id:000001,src:000172+005151,op:splice,rep:2. */
9837 if (idx + ent.vd_next <= idx)
9838 break;
9839
252b5132
RH
9840 idx += ent.vd_next;
9841 }
dd24e3da 9842
54806181
AM
9843 if (cnt < section->sh_info)
9844 printf (_(" Version definition past end of section\n"));
252b5132
RH
9845
9846 free (edefs);
9847 }
9848 break;
103f02d3 9849
252b5132
RH
9850 case SHT_GNU_verneed:
9851 {
2cf0635d 9852 Elf_External_Verneed * eneed;
b34976b6
AM
9853 unsigned int idx;
9854 unsigned int cnt;
2cf0635d 9855 char * endbuf;
252b5132
RH
9856
9857 found = 1;
9858
72de5009 9859 printf (_("\nVersion needs section '%s' contains %u entries:\n"),
74e1a04b 9860 printable_section_name (section), section->sh_info);
252b5132
RH
9861
9862 printf (_(" Addr: 0x"));
9863 printf_vma (section->sh_addr);
72de5009 9864 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
1b228002 9865 (unsigned long) section->sh_offset, section->sh_link,
74e1a04b 9866 printable_section_name_from_index (section->sh_link));
252b5132 9867
3f5e193b
NC
9868 eneed = (Elf_External_Verneed *) get_data (NULL, file,
9869 section->sh_offset, 1,
9870 section->sh_size,
9cf03b7e 9871 _("Version Needs section"));
a6e9f9df
AM
9872 if (!eneed)
9873 break;
59245841 9874 endbuf = (char *) eneed + section->sh_size;
252b5132
RH
9875
9876 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9877 {
2cf0635d 9878 Elf_External_Verneed * entry;
b34976b6
AM
9879 Elf_Internal_Verneed ent;
9880 int j;
9881 int isum;
2cf0635d 9882 char * vstart;
252b5132 9883
7e26601c 9884 if (idx > (size_t) (endbuf - (char *) eneed))
dd24e3da
NC
9885 break;
9886
252b5132 9887 vstart = ((char *) eneed) + idx;
54806181
AM
9888 if (vstart + sizeof (*entry) > endbuf)
9889 break;
252b5132
RH
9890
9891 entry = (Elf_External_Verneed *) vstart;
9892
9893 ent.vn_version = BYTE_GET (entry->vn_version);
9894 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
9895 ent.vn_file = BYTE_GET (entry->vn_file);
9896 ent.vn_aux = BYTE_GET (entry->vn_aux);
9897 ent.vn_next = BYTE_GET (entry->vn_next);
9898
9899 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
9900
d79b3d50
NC
9901 if (VALID_DYNAMIC_NAME (ent.vn_file))
9902 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
252b5132
RH
9903 else
9904 printf (_(" File: %lx"), ent.vn_file);
9905
9906 printf (_(" Cnt: %d\n"), ent.vn_cnt);
9907
dd24e3da 9908 /* Check for overflow. */
7e26601c 9909 if (ent.vn_aux > (size_t) (endbuf - vstart))
dd24e3da 9910 break;
252b5132
RH
9911 vstart += ent.vn_aux;
9912
9913 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
9914 {
2cf0635d 9915 Elf_External_Vernaux * eaux;
b34976b6 9916 Elf_Internal_Vernaux aux;
252b5132 9917
54806181
AM
9918 if (vstart + sizeof (*eaux) > endbuf)
9919 break;
252b5132
RH
9920 eaux = (Elf_External_Vernaux *) vstart;
9921
9922 aux.vna_hash = BYTE_GET (eaux->vna_hash);
9923 aux.vna_flags = BYTE_GET (eaux->vna_flags);
9924 aux.vna_other = BYTE_GET (eaux->vna_other);
9925 aux.vna_name = BYTE_GET (eaux->vna_name);
9926 aux.vna_next = BYTE_GET (eaux->vna_next);
9927
d79b3d50 9928 if (VALID_DYNAMIC_NAME (aux.vna_name))
ecc2063b 9929 printf (_(" %#06x: Name: %s"),
d79b3d50 9930 isum, GET_DYNAMIC_NAME (aux.vna_name));
252b5132 9931 else
ecc2063b 9932 printf (_(" %#06x: Name index: %lx"),
252b5132
RH
9933 isum, aux.vna_name);
9934
9935 printf (_(" Flags: %s Version: %d\n"),
9936 get_ver_flags (aux.vna_flags), aux.vna_other);
9937
dd24e3da 9938 /* Check for overflow. */
53774b7e
NC
9939 if (aux.vna_next > (size_t) (endbuf - vstart)
9940 || (aux.vna_next == 0 && j < ent.vn_cnt - 1))
9941 {
9942 warn (_("Invalid vna_next field of %lx\n"),
9943 aux.vna_next);
9944 j = ent.vn_cnt;
9945 break;
9946 }
252b5132
RH
9947 isum += aux.vna_next;
9948 vstart += aux.vna_next;
9949 }
9cf03b7e 9950
54806181 9951 if (j < ent.vn_cnt)
9cf03b7e 9952 warn (_("Missing Version Needs auxillary information\n"));
252b5132 9953
bcf83b2a 9954 if (ent.vn_next == 0 && cnt < section->sh_info - 1)
c24cf8b6
NC
9955 {
9956 warn (_("Corrupt Version Needs structure - offset to next structure is zero with entries still left to be processed\n"));
9957 cnt = section->sh_info;
9958 break;
9959 }
252b5132
RH
9960 idx += ent.vn_next;
9961 }
9cf03b7e 9962
54806181 9963 if (cnt < section->sh_info)
9cf03b7e 9964 warn (_("Missing Version Needs information\n"));
103f02d3 9965
252b5132
RH
9966 free (eneed);
9967 }
9968 break;
9969
9970 case SHT_GNU_versym:
9971 {
2cf0635d 9972 Elf_Internal_Shdr * link_section;
8b73c356
NC
9973 size_t total;
9974 unsigned int cnt;
2cf0635d
NC
9975 unsigned char * edata;
9976 unsigned short * data;
9977 char * strtab;
9978 Elf_Internal_Sym * symbols;
9979 Elf_Internal_Shdr * string_sec;
ba5cdace 9980 unsigned long num_syms;
d3ba0551 9981 long off;
252b5132 9982
4fbb74a6 9983 if (section->sh_link >= elf_header.e_shnum)
c256ffe7
JJ
9984 break;
9985
4fbb74a6 9986 link_section = section_headers + section->sh_link;
08d8fa11 9987 total = section->sh_size / sizeof (Elf_External_Versym);
252b5132 9988
4fbb74a6 9989 if (link_section->sh_link >= elf_header.e_shnum)
c256ffe7
JJ
9990 break;
9991
252b5132
RH
9992 found = 1;
9993
ba5cdace 9994 symbols = GET_ELF_SYMBOLS (file, link_section, & num_syms);
dd24e3da
NC
9995 if (symbols == NULL)
9996 break;
252b5132 9997
4fbb74a6 9998 string_sec = section_headers + link_section->sh_link;
252b5132 9999
3f5e193b
NC
10000 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
10001 string_sec->sh_size,
10002 _("version string table"));
a6e9f9df 10003 if (!strtab)
0429c154
MS
10004 {
10005 free (symbols);
10006 break;
10007 }
252b5132 10008
8b73c356
NC
10009 printf (_("\nVersion symbols section '%s' contains %lu entries:\n"),
10010 printable_section_name (section), (unsigned long) total);
252b5132
RH
10011
10012 printf (_(" Addr: "));
10013 printf_vma (section->sh_addr);
72de5009 10014 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
1b228002 10015 (unsigned long) section->sh_offset, section->sh_link,
74e1a04b 10016 printable_section_name (link_section));
252b5132 10017
d3ba0551
AM
10018 off = offset_from_vma (file,
10019 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10020 total * sizeof (short));
3f5e193b
NC
10021 edata = (unsigned char *) get_data (NULL, file, off, total,
10022 sizeof (short),
10023 _("version symbol data"));
a6e9f9df
AM
10024 if (!edata)
10025 {
10026 free (strtab);
0429c154 10027 free (symbols);
a6e9f9df
AM
10028 break;
10029 }
252b5132 10030
3f5e193b 10031 data = (short unsigned int *) cmalloc (total, sizeof (short));
252b5132
RH
10032
10033 for (cnt = total; cnt --;)
b34976b6
AM
10034 data[cnt] = byte_get (edata + cnt * sizeof (short),
10035 sizeof (short));
252b5132
RH
10036
10037 free (edata);
10038
10039 for (cnt = 0; cnt < total; cnt += 4)
10040 {
10041 int j, nn;
ab273396
AM
10042 char *name;
10043 char *invalid = _("*invalid*");
252b5132
RH
10044
10045 printf (" %03x:", cnt);
10046
10047 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
b34976b6 10048 switch (data[cnt + j])
252b5132
RH
10049 {
10050 case 0:
10051 fputs (_(" 0 (*local*) "), stdout);
10052 break;
10053
10054 case 1:
10055 fputs (_(" 1 (*global*) "), stdout);
10056 break;
10057
10058 default:
c244d050
NC
10059 nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
10060 data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
252b5132 10061
dd24e3da 10062 /* If this index value is greater than the size of the symbols
ba5cdace
NC
10063 array, break to avoid an out-of-bounds read. */
10064 if ((unsigned long)(cnt + j) >= num_syms)
dd24e3da
NC
10065 {
10066 warn (_("invalid index into symbol array\n"));
10067 break;
10068 }
10069
ab273396
AM
10070 name = NULL;
10071 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
252b5132 10072 {
b34976b6
AM
10073 Elf_Internal_Verneed ivn;
10074 unsigned long offset;
252b5132 10075
d93f0186
NC
10076 offset = offset_from_vma
10077 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10078 sizeof (Elf_External_Verneed));
252b5132 10079
b34976b6 10080 do
252b5132 10081 {
b34976b6
AM
10082 Elf_Internal_Vernaux ivna;
10083 Elf_External_Verneed evn;
10084 Elf_External_Vernaux evna;
10085 unsigned long a_off;
252b5132 10086
59245841
NC
10087 if (get_data (&evn, file, offset, sizeof (evn), 1,
10088 _("version need")) == NULL)
10089 break;
0b4362b0 10090
252b5132
RH
10091 ivn.vn_aux = BYTE_GET (evn.vn_aux);
10092 ivn.vn_next = BYTE_GET (evn.vn_next);
10093
10094 a_off = offset + ivn.vn_aux;
10095
10096 do
10097 {
59245841
NC
10098 if (get_data (&evna, file, a_off, sizeof (evna),
10099 1, _("version need aux (2)")) == NULL)
10100 {
10101 ivna.vna_next = 0;
10102 ivna.vna_other = 0;
10103 }
10104 else
10105 {
10106 ivna.vna_next = BYTE_GET (evna.vna_next);
10107 ivna.vna_other = BYTE_GET (evna.vna_other);
10108 }
252b5132
RH
10109
10110 a_off += ivna.vna_next;
10111 }
b34976b6 10112 while (ivna.vna_other != data[cnt + j]
252b5132
RH
10113 && ivna.vna_next != 0);
10114
b34976b6 10115 if (ivna.vna_other == data[cnt + j])
252b5132
RH
10116 {
10117 ivna.vna_name = BYTE_GET (evna.vna_name);
10118
54806181 10119 if (ivna.vna_name >= string_sec->sh_size)
ab273396 10120 name = invalid;
54806181
AM
10121 else
10122 name = strtab + ivna.vna_name;
252b5132
RH
10123 break;
10124 }
10125
10126 offset += ivn.vn_next;
10127 }
10128 while (ivn.vn_next);
10129 }
00d93f34 10130
ab273396 10131 if (data[cnt + j] != 0x8001
b34976b6 10132 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
252b5132 10133 {
b34976b6
AM
10134 Elf_Internal_Verdef ivd;
10135 Elf_External_Verdef evd;
10136 unsigned long offset;
252b5132 10137
d93f0186
NC
10138 offset = offset_from_vma
10139 (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10140 sizeof evd);
252b5132
RH
10141
10142 do
10143 {
59245841
NC
10144 if (get_data (&evd, file, offset, sizeof (evd), 1,
10145 _("version def")) == NULL)
10146 {
10147 ivd.vd_next = 0;
948f632f 10148 /* PR 17531: file: 046-1082287-0.004. */
3102e897
NC
10149 ivd.vd_ndx = (data[cnt + j] & VERSYM_VERSION) + 1;
10150 break;
59245841
NC
10151 }
10152 else
10153 {
10154 ivd.vd_next = BYTE_GET (evd.vd_next);
10155 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10156 }
252b5132
RH
10157
10158 offset += ivd.vd_next;
10159 }
c244d050 10160 while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
252b5132
RH
10161 && ivd.vd_next != 0);
10162
c244d050 10163 if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
252b5132 10164 {
b34976b6
AM
10165 Elf_External_Verdaux evda;
10166 Elf_Internal_Verdaux ivda;
252b5132
RH
10167
10168 ivd.vd_aux = BYTE_GET (evd.vd_aux);
10169
59245841
NC
10170 if (get_data (&evda, file,
10171 offset - ivd.vd_next + ivd.vd_aux,
10172 sizeof (evda), 1,
10173 _("version def aux")) == NULL)
10174 break;
252b5132
RH
10175
10176 ivda.vda_name = BYTE_GET (evda.vda_name);
10177
54806181 10178 if (ivda.vda_name >= string_sec->sh_size)
ab273396
AM
10179 name = invalid;
10180 else if (name != NULL && name != invalid)
10181 name = _("*both*");
54806181
AM
10182 else
10183 name = strtab + ivda.vda_name;
252b5132
RH
10184 }
10185 }
ab273396
AM
10186 if (name != NULL)
10187 nn += printf ("(%s%-*s",
10188 name,
10189 12 - (int) strlen (name),
10190 ")");
252b5132
RH
10191
10192 if (nn < 18)
10193 printf ("%*c", 18 - nn, ' ');
10194 }
10195
10196 putchar ('\n');
10197 }
10198
10199 free (data);
10200 free (strtab);
10201 free (symbols);
10202 }
10203 break;
103f02d3 10204
252b5132
RH
10205 default:
10206 break;
10207 }
10208 }
10209
10210 if (! found)
10211 printf (_("\nNo version information found in this file.\n"));
10212
10213 return 1;
10214}
10215
d1133906 10216static const char *
d3ba0551 10217get_symbol_binding (unsigned int binding)
252b5132 10218{
b34976b6 10219 static char buff[32];
252b5132
RH
10220
10221 switch (binding)
10222 {
b34976b6
AM
10223 case STB_LOCAL: return "LOCAL";
10224 case STB_GLOBAL: return "GLOBAL";
10225 case STB_WEAK: return "WEAK";
252b5132
RH
10226 default:
10227 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
e9e44622
JJ
10228 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
10229 binding);
252b5132 10230 else if (binding >= STB_LOOS && binding <= STB_HIOS)
3e7a7d11
NC
10231 {
10232 if (binding == STB_GNU_UNIQUE
9c55345c
TS
10233 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10234 /* GNU is still using the default value 0. */
3e7a7d11
NC
10235 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10236 return "UNIQUE";
10237 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
10238 }
252b5132 10239 else
e9e44622 10240 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
252b5132
RH
10241 return buff;
10242 }
10243}
10244
d1133906 10245static const char *
d3ba0551 10246get_symbol_type (unsigned int type)
252b5132 10247{
b34976b6 10248 static char buff[32];
252b5132
RH
10249
10250 switch (type)
10251 {
b34976b6
AM
10252 case STT_NOTYPE: return "NOTYPE";
10253 case STT_OBJECT: return "OBJECT";
10254 case STT_FUNC: return "FUNC";
10255 case STT_SECTION: return "SECTION";
10256 case STT_FILE: return "FILE";
10257 case STT_COMMON: return "COMMON";
10258 case STT_TLS: return "TLS";
15ab5209
DB
10259 case STT_RELC: return "RELC";
10260 case STT_SRELC: return "SRELC";
252b5132
RH
10261 default:
10262 if (type >= STT_LOPROC && type <= STT_HIPROC)
df75f1af 10263 {
3510a7b8
NC
10264 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
10265 return "THUMB_FUNC";
103f02d3 10266
351b4b40 10267 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
103f02d3
UD
10268 return "REGISTER";
10269
10270 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
10271 return "PARISC_MILLI";
10272
e9e44622 10273 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
df75f1af 10274 }
252b5132 10275 else if (type >= STT_LOOS && type <= STT_HIOS)
103f02d3
UD
10276 {
10277 if (elf_header.e_machine == EM_PARISC)
10278 {
10279 if (type == STT_HP_OPAQUE)
10280 return "HP_OPAQUE";
10281 if (type == STT_HP_STUB)
10282 return "HP_STUB";
10283 }
10284
d8045f23 10285 if (type == STT_GNU_IFUNC
9c55345c 10286 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
83c257ca 10287 || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
9c55345c 10288 /* GNU is still using the default value 0. */
d8045f23
NC
10289 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10290 return "IFUNC";
10291
e9e44622 10292 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
103f02d3 10293 }
252b5132 10294 else
e9e44622 10295 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
252b5132
RH
10296 return buff;
10297 }
10298}
10299
d1133906 10300static const char *
d3ba0551 10301get_symbol_visibility (unsigned int visibility)
d1133906
NC
10302{
10303 switch (visibility)
10304 {
b34976b6
AM
10305 case STV_DEFAULT: return "DEFAULT";
10306 case STV_INTERNAL: return "INTERNAL";
10307 case STV_HIDDEN: return "HIDDEN";
d1133906 10308 case STV_PROTECTED: return "PROTECTED";
bee0ee85
NC
10309 default:
10310 error (_("Unrecognized visibility value: %u"), visibility);
10311 return _("<unknown>");
d1133906
NC
10312 }
10313}
10314
fd85a6a1
NC
10315static const char *
10316get_solaris_symbol_visibility (unsigned int visibility)
10317{
10318 switch (visibility)
10319 {
10320 case 4: return "EXPORTED";
10321 case 5: return "SINGLETON";
10322 case 6: return "ELIMINATE";
10323 default: return get_symbol_visibility (visibility);
10324 }
10325}
10326
5e2b0d47
NC
10327static const char *
10328get_mips_symbol_other (unsigned int other)
10329{
10330 switch (other)
10331 {
df58fc94
RS
10332 case STO_OPTIONAL:
10333 return "OPTIONAL";
10334 case STO_MIPS_PLT:
10335 return "MIPS PLT";
10336 case STO_MIPS_PIC:
10337 return "MIPS PIC";
10338 case STO_MICROMIPS:
10339 return "MICROMIPS";
10340 case STO_MICROMIPS | STO_MIPS_PIC:
10341 return "MICROMIPS, MIPS PIC";
10342 case STO_MIPS16:
10343 return "MIPS16";
10344 default:
10345 return NULL;
5e2b0d47
NC
10346 }
10347}
10348
28f997cf
TG
10349static const char *
10350get_ia64_symbol_other (unsigned int other)
10351{
10352 if (is_ia64_vms ())
10353 {
10354 static char res[32];
10355
10356 res[0] = 0;
10357
10358 /* Function types is for images and .STB files only. */
10359 switch (elf_header.e_type)
10360 {
10361 case ET_DYN:
10362 case ET_EXEC:
10363 switch (VMS_ST_FUNC_TYPE (other))
10364 {
10365 case VMS_SFT_CODE_ADDR:
10366 strcat (res, " CA");
10367 break;
10368 case VMS_SFT_SYMV_IDX:
10369 strcat (res, " VEC");
10370 break;
10371 case VMS_SFT_FD:
10372 strcat (res, " FD");
10373 break;
10374 case VMS_SFT_RESERVE:
10375 strcat (res, " RSV");
10376 break;
10377 default:
bee0ee85
NC
10378 warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
10379 VMS_ST_FUNC_TYPE (other));
10380 strcat (res, " <unknown>");
10381 break;
28f997cf
TG
10382 }
10383 break;
10384 default:
10385 break;
10386 }
10387 switch (VMS_ST_LINKAGE (other))
10388 {
10389 case VMS_STL_IGNORE:
10390 strcat (res, " IGN");
10391 break;
10392 case VMS_STL_RESERVE:
10393 strcat (res, " RSV");
10394 break;
10395 case VMS_STL_STD:
10396 strcat (res, " STD");
10397 break;
10398 case VMS_STL_LNK:
10399 strcat (res, " LNK");
10400 break;
10401 default:
bee0ee85
NC
10402 warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
10403 VMS_ST_LINKAGE (other));
10404 strcat (res, " <unknown>");
10405 break;
28f997cf
TG
10406 }
10407
10408 if (res[0] != 0)
10409 return res + 1;
10410 else
10411 return res;
10412 }
10413 return NULL;
10414}
10415
6911b7dc
AM
10416static const char *
10417get_ppc64_symbol_other (unsigned int other)
10418{
10419 if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
10420 {
10421 static char buf[32];
10422 snprintf (buf, sizeof buf, _("<localentry>: %d"),
10423 PPC64_LOCAL_ENTRY_OFFSET (other));
10424 return buf;
10425 }
10426 return NULL;
10427}
10428
5e2b0d47
NC
10429static const char *
10430get_symbol_other (unsigned int other)
10431{
10432 const char * result = NULL;
10433 static char buff [32];
10434
10435 if (other == 0)
10436 return "";
10437
10438 switch (elf_header.e_machine)
10439 {
10440 case EM_MIPS:
10441 result = get_mips_symbol_other (other);
28f997cf
TG
10442 break;
10443 case EM_IA_64:
10444 result = get_ia64_symbol_other (other);
10445 break;
6911b7dc
AM
10446 case EM_PPC64:
10447 result = get_ppc64_symbol_other (other);
10448 break;
5e2b0d47 10449 default:
fd85a6a1 10450 result = NULL;
5e2b0d47
NC
10451 break;
10452 }
10453
10454 if (result)
10455 return result;
10456
10457 snprintf (buff, sizeof buff, _("<other>: %x"), other);
10458 return buff;
10459}
10460
d1133906 10461static const char *
d3ba0551 10462get_symbol_index_type (unsigned int type)
252b5132 10463{
b34976b6 10464 static char buff[32];
5cf1065c 10465
252b5132
RH
10466 switch (type)
10467 {
b34976b6
AM
10468 case SHN_UNDEF: return "UND";
10469 case SHN_ABS: return "ABS";
10470 case SHN_COMMON: return "COM";
252b5132 10471 default:
9ce701e2
L
10472 if (type == SHN_IA_64_ANSI_COMMON
10473 && elf_header.e_machine == EM_IA_64
10474 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
10475 return "ANSI_COM";
8a9036a4 10476 else if ((elf_header.e_machine == EM_X86_64
7a9068fe
L
10477 || elf_header.e_machine == EM_L1OM
10478 || elf_header.e_machine == EM_K1OM)
3b22753a
L
10479 && type == SHN_X86_64_LCOMMON)
10480 return "LARGE_COM";
ac145307
BS
10481 else if ((type == SHN_MIPS_SCOMMON
10482 && elf_header.e_machine == EM_MIPS)
10483 || (type == SHN_TIC6X_SCOMMON
10484 && elf_header.e_machine == EM_TI_C6000))
172553c7
TS
10485 return "SCOM";
10486 else if (type == SHN_MIPS_SUNDEFINED
10487 && elf_header.e_machine == EM_MIPS)
10488 return "SUND";
9ce701e2 10489 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
4fbb74a6 10490 sprintf (buff, "PRC[0x%04x]", type & 0xffff);
252b5132 10491 else if (type >= SHN_LOOS && type <= SHN_HIOS)
4fbb74a6
AM
10492 sprintf (buff, "OS [0x%04x]", type & 0xffff);
10493 else if (type >= SHN_LORESERVE)
10494 sprintf (buff, "RSV[0x%04x]", type & 0xffff);
c6d8cab4 10495 else if (type >= elf_header.e_shnum)
e0a31db1 10496 sprintf (buff, _("bad section index[%3d]"), type);
252b5132 10497 else
232e7cb8 10498 sprintf (buff, "%3d", type);
5cf1065c 10499 break;
252b5132 10500 }
5cf1065c
NC
10501
10502 return buff;
252b5132
RH
10503}
10504
66543521 10505static bfd_vma *
57028622 10506get_dynamic_data (FILE * file, bfd_size_type number, unsigned int ent_size)
252b5132 10507{
2cf0635d
NC
10508 unsigned char * e_data;
10509 bfd_vma * i_data;
252b5132 10510
57028622
NC
10511 /* If the size_t type is smaller than the bfd_size_type, eg because
10512 you are building a 32-bit tool on a 64-bit host, then make sure
10513 that when (number) is cast to (size_t) no information is lost. */
10514 if (sizeof (size_t) < sizeof (bfd_size_type)
10515 && (bfd_size_type) ((size_t) number) != number)
10516 {
ed754a13
AM
10517 error (_("Size truncation prevents reading %" BFD_VMA_FMT "u"
10518 " elements of size %u\n"),
10519 number, ent_size);
57028622
NC
10520 return NULL;
10521 }
948f632f 10522
3102e897
NC
10523 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
10524 attempting to allocate memory when the read is bound to fail. */
10525 if (ent_size * number > current_file_size)
10526 {
ed754a13
AM
10527 error (_("Invalid number of dynamic entries: %" BFD_VMA_FMT "u\n"),
10528 number);
3102e897
NC
10529 return NULL;
10530 }
10531
57028622 10532 e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
252b5132
RH
10533 if (e_data == NULL)
10534 {
ed754a13
AM
10535 error (_("Out of memory reading %" BFD_VMA_FMT "u dynamic entries\n"),
10536 number);
252b5132
RH
10537 return NULL;
10538 }
10539
57028622 10540 if (fread (e_data, ent_size, (size_t) number, file) != number)
252b5132 10541 {
ed754a13
AM
10542 error (_("Unable to read in %" BFD_VMA_FMT "u bytes of dynamic data\n"),
10543 number * ent_size);
3102e897 10544 free (e_data);
252b5132
RH
10545 return NULL;
10546 }
10547
57028622 10548 i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
252b5132
RH
10549 if (i_data == NULL)
10550 {
ed754a13
AM
10551 error (_("Out of memory allocating space for %" BFD_VMA_FMT "u"
10552 " dynamic entries\n"),
10553 number);
252b5132
RH
10554 free (e_data);
10555 return NULL;
10556 }
10557
10558 while (number--)
66543521 10559 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
252b5132
RH
10560
10561 free (e_data);
10562
10563 return i_data;
10564}
10565
6bd1a22c
L
10566static void
10567print_dynamic_symbol (bfd_vma si, unsigned long hn)
10568{
2cf0635d 10569 Elf_Internal_Sym * psym;
6bd1a22c
L
10570 int n;
10571
6bd1a22c
L
10572 n = print_vma (si, DEC_5);
10573 if (n < 5)
0b4362b0 10574 fputs (&" "[n], stdout);
6bd1a22c 10575 printf (" %3lu: ", hn);
e0a31db1
NC
10576
10577 if (dynamic_symbols == NULL || si >= num_dynamic_syms)
10578 {
3102e897
NC
10579 printf (_("<No info available for dynamic symbol number %lu>\n"),
10580 (unsigned long) si);
e0a31db1
NC
10581 return;
10582 }
10583
10584 psym = dynamic_symbols + si;
6bd1a22c
L
10585 print_vma (psym->st_value, LONG_HEX);
10586 putchar (' ');
10587 print_vma (psym->st_size, DEC_5);
10588
f4be36b3
AM
10589 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10590 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
fd85a6a1
NC
10591
10592 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
10593 printf (" %-7s", get_solaris_symbol_visibility (psym->st_other));
10594 else
10595 {
10596 unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
10597
10598 printf (" %-7s", get_symbol_visibility (vis));
10599 /* Check to see if any other bits in the st_other field are set.
10600 Note - displaying this information disrupts the layout of the
10601 table being generated, but for the moment this case is very
10602 rare. */
10603 if (psym->st_other ^ vis)
10604 printf (" [%s] ", get_symbol_other (psym->st_other ^ vis));
10605 }
10606
6bd1a22c
L
10607 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
10608 if (VALID_DYNAMIC_NAME (psym->st_name))
10609 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
10610 else
2b692964 10611 printf (_(" <corrupt: %14ld>"), psym->st_name);
6bd1a22c
L
10612 putchar ('\n');
10613}
10614
bb4d2ac2
L
10615static const char *
10616get_symbol_version_string (FILE *file, int is_dynsym,
10617 const char *strtab,
10618 unsigned long int strtab_size,
10619 unsigned int si, Elf_Internal_Sym *psym,
10620 enum versioned_symbol_info *sym_info,
10621 unsigned short *vna_other)
10622{
ab273396
AM
10623 unsigned char data[2];
10624 unsigned short vers_data;
10625 unsigned long offset;
bb4d2ac2 10626
ab273396
AM
10627 if (!is_dynsym
10628 || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
10629 return NULL;
bb4d2ac2 10630
ab273396
AM
10631 offset = offset_from_vma (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10632 sizeof data + si * sizeof (vers_data));
bb4d2ac2 10633
ab273396
AM
10634 if (get_data (&data, file, offset + si * sizeof (vers_data),
10635 sizeof (data), 1, _("version data")) == NULL)
10636 return NULL;
10637
10638 vers_data = byte_get (data, 2);
bb4d2ac2 10639
ab273396
AM
10640 if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data <= 1)
10641 return NULL;
bb4d2ac2 10642
ab273396
AM
10643 /* Usually we'd only see verdef for defined symbols, and verneed for
10644 undefined symbols. However, symbols defined by the linker in
10645 .dynbss for variables copied from a shared library in order to
10646 avoid text relocations are defined yet have verneed. We could
10647 use a heuristic to detect the special case, for example, check
10648 for verneed first on symbols defined in SHT_NOBITS sections, but
10649 it is simpler and more reliable to just look for both verdef and
10650 verneed. .dynbss might not be mapped to a SHT_NOBITS section. */
bb4d2ac2 10651
ab273396
AM
10652 if (psym->st_shndx != SHN_UNDEF
10653 && vers_data != 0x8001
10654 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10655 {
10656 Elf_Internal_Verdef ivd;
10657 Elf_Internal_Verdaux ivda;
10658 Elf_External_Verdaux evda;
10659 unsigned long off;
bb4d2ac2 10660
ab273396
AM
10661 off = offset_from_vma (file,
10662 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10663 sizeof (Elf_External_Verdef));
10664
10665 do
bb4d2ac2 10666 {
ab273396
AM
10667 Elf_External_Verdef evd;
10668
10669 if (get_data (&evd, file, off, sizeof (evd), 1,
10670 _("version def")) == NULL)
10671 {
10672 ivd.vd_ndx = 0;
10673 ivd.vd_aux = 0;
10674 ivd.vd_next = 0;
10675 }
10676 else
bb4d2ac2 10677 {
ab273396
AM
10678 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10679 ivd.vd_aux = BYTE_GET (evd.vd_aux);
10680 ivd.vd_next = BYTE_GET (evd.vd_next);
10681 }
bb4d2ac2 10682
ab273396
AM
10683 off += ivd.vd_next;
10684 }
10685 while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
bb4d2ac2 10686
ab273396
AM
10687 if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
10688 {
10689 off -= ivd.vd_next;
10690 off += ivd.vd_aux;
bb4d2ac2 10691
ab273396
AM
10692 if (get_data (&evda, file, off, sizeof (evda), 1,
10693 _("version def aux")) != NULL)
10694 {
10695 ivda.vda_name = BYTE_GET (evda.vda_name);
bb4d2ac2 10696
ab273396
AM
10697 if (psym->st_name != ivda.vda_name)
10698 {
10699 *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
10700 ? symbol_hidden : symbol_public);
10701 return (ivda.vda_name < strtab_size
10702 ? strtab + ivda.vda_name : _("<corrupt>"));
10703 }
10704 }
10705 }
10706 }
bb4d2ac2 10707
ab273396
AM
10708 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10709 {
10710 Elf_External_Verneed evn;
10711 Elf_Internal_Verneed ivn;
10712 Elf_Internal_Vernaux ivna;
bb4d2ac2 10713
ab273396
AM
10714 offset = offset_from_vma (file,
10715 version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10716 sizeof evn);
10717 do
10718 {
10719 unsigned long vna_off;
bb4d2ac2 10720
ab273396
AM
10721 if (get_data (&evn, file, offset, sizeof (evn), 1,
10722 _("version need")) == NULL)
10723 {
10724 ivna.vna_next = 0;
10725 ivna.vna_other = 0;
10726 ivna.vna_name = 0;
10727 break;
10728 }
bb4d2ac2 10729
ab273396
AM
10730 ivn.vn_aux = BYTE_GET (evn.vn_aux);
10731 ivn.vn_next = BYTE_GET (evn.vn_next);
bb4d2ac2 10732
ab273396 10733 vna_off = offset + ivn.vn_aux;
bb4d2ac2 10734
ab273396
AM
10735 do
10736 {
10737 Elf_External_Vernaux evna;
bb4d2ac2 10738
ab273396
AM
10739 if (get_data (&evna, file, vna_off, sizeof (evna), 1,
10740 _("version need aux (3)")) == NULL)
bb4d2ac2 10741 {
ab273396
AM
10742 ivna.vna_next = 0;
10743 ivna.vna_other = 0;
10744 ivna.vna_name = 0;
bb4d2ac2 10745 }
bb4d2ac2 10746 else
bb4d2ac2 10747 {
ab273396
AM
10748 ivna.vna_other = BYTE_GET (evna.vna_other);
10749 ivna.vna_next = BYTE_GET (evna.vna_next);
10750 ivna.vna_name = BYTE_GET (evna.vna_name);
10751 }
bb4d2ac2 10752
ab273396
AM
10753 vna_off += ivna.vna_next;
10754 }
10755 while (ivna.vna_other != vers_data && ivna.vna_next != 0);
bb4d2ac2 10756
ab273396
AM
10757 if (ivna.vna_other == vers_data)
10758 break;
bb4d2ac2 10759
ab273396
AM
10760 offset += ivn.vn_next;
10761 }
10762 while (ivn.vn_next != 0);
bb4d2ac2 10763
ab273396
AM
10764 if (ivna.vna_other == vers_data)
10765 {
10766 *sym_info = symbol_undefined;
10767 *vna_other = ivna.vna_other;
10768 return (ivna.vna_name < strtab_size
10769 ? strtab + ivna.vna_name : _("<corrupt>"));
bb4d2ac2
L
10770 }
10771 }
ab273396 10772 return NULL;
bb4d2ac2
L
10773}
10774
e3c8793a 10775/* Dump the symbol table. */
252b5132 10776static int
2cf0635d 10777process_symbol_table (FILE * file)
252b5132 10778{
2cf0635d 10779 Elf_Internal_Shdr * section;
8b73c356
NC
10780 bfd_size_type nbuckets = 0;
10781 bfd_size_type nchains = 0;
2cf0635d
NC
10782 bfd_vma * buckets = NULL;
10783 bfd_vma * chains = NULL;
fdc90cb4 10784 bfd_vma ngnubuckets = 0;
2cf0635d
NC
10785 bfd_vma * gnubuckets = NULL;
10786 bfd_vma * gnuchains = NULL;
6bd1a22c 10787 bfd_vma gnusymidx = 0;
071436c6 10788 bfd_size_type ngnuchains = 0;
252b5132 10789
2c610e4b 10790 if (!do_syms && !do_dyn_syms && !do_histogram)
252b5132
RH
10791 return 1;
10792
6bd1a22c
L
10793 if (dynamic_info[DT_HASH]
10794 && (do_histogram
2c610e4b
L
10795 || (do_using_dynamic
10796 && !do_dyn_syms
10797 && dynamic_strings != NULL)))
252b5132 10798 {
66543521
AM
10799 unsigned char nb[8];
10800 unsigned char nc[8];
8b73c356 10801 unsigned int hash_ent_size = 4;
66543521
AM
10802
10803 if ((elf_header.e_machine == EM_ALPHA
10804 || elf_header.e_machine == EM_S390
10805 || elf_header.e_machine == EM_S390_OLD)
10806 && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
10807 hash_ent_size = 8;
10808
fb52b2f4
NC
10809 if (fseek (file,
10810 (archive_file_offset
10811 + offset_from_vma (file, dynamic_info[DT_HASH],
10812 sizeof nb + sizeof nc)),
d93f0186 10813 SEEK_SET))
252b5132 10814 {
591a748a 10815 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 10816 goto no_hash;
252b5132
RH
10817 }
10818
66543521 10819 if (fread (nb, hash_ent_size, 1, file) != 1)
252b5132
RH
10820 {
10821 error (_("Failed to read in number of buckets\n"));
d3a44ec6 10822 goto no_hash;
252b5132
RH
10823 }
10824
66543521 10825 if (fread (nc, hash_ent_size, 1, file) != 1)
252b5132
RH
10826 {
10827 error (_("Failed to read in number of chains\n"));
d3a44ec6 10828 goto no_hash;
252b5132
RH
10829 }
10830
66543521
AM
10831 nbuckets = byte_get (nb, hash_ent_size);
10832 nchains = byte_get (nc, hash_ent_size);
252b5132 10833
66543521
AM
10834 buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
10835 chains = get_dynamic_data (file, nchains, hash_ent_size);
252b5132 10836
d3a44ec6 10837 no_hash:
252b5132 10838 if (buckets == NULL || chains == NULL)
d3a44ec6
JJ
10839 {
10840 if (do_using_dynamic)
10841 return 0;
10842 free (buckets);
10843 free (chains);
10844 buckets = NULL;
10845 chains = NULL;
10846 nbuckets = 0;
10847 nchains = 0;
10848 }
252b5132
RH
10849 }
10850
6bd1a22c
L
10851 if (dynamic_info_DT_GNU_HASH
10852 && (do_histogram
2c610e4b
L
10853 || (do_using_dynamic
10854 && !do_dyn_syms
10855 && dynamic_strings != NULL)))
252b5132 10856 {
6bd1a22c
L
10857 unsigned char nb[16];
10858 bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
10859 bfd_vma buckets_vma;
10860
10861 if (fseek (file,
10862 (archive_file_offset
10863 + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
10864 sizeof nb)),
10865 SEEK_SET))
10866 {
10867 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 10868 goto no_gnu_hash;
6bd1a22c 10869 }
252b5132 10870
6bd1a22c
L
10871 if (fread (nb, 16, 1, file) != 1)
10872 {
10873 error (_("Failed to read in number of buckets\n"));
d3a44ec6 10874 goto no_gnu_hash;
6bd1a22c
L
10875 }
10876
10877 ngnubuckets = byte_get (nb, 4);
10878 gnusymidx = byte_get (nb + 4, 4);
10879 bitmaskwords = byte_get (nb + 8, 4);
10880 buckets_vma = dynamic_info_DT_GNU_HASH + 16;
f7a99963 10881 if (is_32bit_elf)
6bd1a22c 10882 buckets_vma += bitmaskwords * 4;
f7a99963 10883 else
6bd1a22c 10884 buckets_vma += bitmaskwords * 8;
252b5132 10885
6bd1a22c
L
10886 if (fseek (file,
10887 (archive_file_offset
10888 + offset_from_vma (file, buckets_vma, 4)),
10889 SEEK_SET))
252b5132 10890 {
6bd1a22c 10891 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 10892 goto no_gnu_hash;
6bd1a22c
L
10893 }
10894
10895 gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
252b5132 10896
6bd1a22c 10897 if (gnubuckets == NULL)
d3a44ec6 10898 goto no_gnu_hash;
6bd1a22c
L
10899
10900 for (i = 0; i < ngnubuckets; i++)
10901 if (gnubuckets[i] != 0)
10902 {
10903 if (gnubuckets[i] < gnusymidx)
10904 return 0;
10905
10906 if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
10907 maxchain = gnubuckets[i];
10908 }
10909
10910 if (maxchain == 0xffffffff)
d3a44ec6 10911 goto no_gnu_hash;
6bd1a22c
L
10912
10913 maxchain -= gnusymidx;
10914
10915 if (fseek (file,
10916 (archive_file_offset
10917 + offset_from_vma (file, buckets_vma
10918 + 4 * (ngnubuckets + maxchain), 4)),
10919 SEEK_SET))
10920 {
10921 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 10922 goto no_gnu_hash;
6bd1a22c
L
10923 }
10924
10925 do
10926 {
10927 if (fread (nb, 4, 1, file) != 1)
252b5132 10928 {
6bd1a22c 10929 error (_("Failed to determine last chain length\n"));
d3a44ec6 10930 goto no_gnu_hash;
6bd1a22c 10931 }
252b5132 10932
6bd1a22c 10933 if (maxchain + 1 == 0)
d3a44ec6 10934 goto no_gnu_hash;
252b5132 10935
6bd1a22c
L
10936 ++maxchain;
10937 }
10938 while ((byte_get (nb, 4) & 1) == 0);
76da6bbe 10939
6bd1a22c
L
10940 if (fseek (file,
10941 (archive_file_offset
10942 + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
10943 SEEK_SET))
10944 {
10945 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 10946 goto no_gnu_hash;
6bd1a22c
L
10947 }
10948
10949 gnuchains = get_dynamic_data (file, maxchain, 4);
071436c6 10950 ngnuchains = maxchain;
6bd1a22c 10951
d3a44ec6 10952 no_gnu_hash:
6bd1a22c 10953 if (gnuchains == NULL)
d3a44ec6
JJ
10954 {
10955 free (gnubuckets);
d3a44ec6
JJ
10956 gnubuckets = NULL;
10957 ngnubuckets = 0;
f64fddf1
NC
10958 if (do_using_dynamic)
10959 return 0;
d3a44ec6 10960 }
6bd1a22c
L
10961 }
10962
10963 if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
10964 && do_syms
10965 && do_using_dynamic
3102e897
NC
10966 && dynamic_strings != NULL
10967 && dynamic_symbols != NULL)
6bd1a22c
L
10968 {
10969 unsigned long hn;
10970
10971 if (dynamic_info[DT_HASH])
10972 {
10973 bfd_vma si;
10974
10975 printf (_("\nSymbol table for image:\n"));
10976 if (is_32bit_elf)
10977 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10978 else
10979 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10980
10981 for (hn = 0; hn < nbuckets; hn++)
10982 {
10983 if (! buckets[hn])
10984 continue;
10985
10986 for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
10987 print_dynamic_symbol (si, hn);
252b5132
RH
10988 }
10989 }
6bd1a22c
L
10990
10991 if (dynamic_info_DT_GNU_HASH)
10992 {
10993 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
10994 if (is_32bit_elf)
10995 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10996 else
10997 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10998
10999 for (hn = 0; hn < ngnubuckets; ++hn)
11000 if (gnubuckets[hn] != 0)
11001 {
11002 bfd_vma si = gnubuckets[hn];
11003 bfd_vma off = si - gnusymidx;
11004
11005 do
11006 {
11007 print_dynamic_symbol (si, hn);
11008 si++;
11009 }
071436c6 11010 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
6bd1a22c
L
11011 }
11012 }
252b5132 11013 }
8b73c356
NC
11014 else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
11015 && section_headers != NULL)
252b5132 11016 {
b34976b6 11017 unsigned int i;
252b5132
RH
11018
11019 for (i = 0, section = section_headers;
11020 i < elf_header.e_shnum;
11021 i++, section++)
11022 {
b34976b6 11023 unsigned int si;
2cf0635d 11024 char * strtab = NULL;
c256ffe7 11025 unsigned long int strtab_size = 0;
2cf0635d
NC
11026 Elf_Internal_Sym * symtab;
11027 Elf_Internal_Sym * psym;
ba5cdace 11028 unsigned long num_syms;
252b5132 11029
2c610e4b
L
11030 if ((section->sh_type != SHT_SYMTAB
11031 && section->sh_type != SHT_DYNSYM)
11032 || (!do_syms
11033 && section->sh_type == SHT_SYMTAB))
252b5132
RH
11034 continue;
11035
dd24e3da
NC
11036 if (section->sh_entsize == 0)
11037 {
11038 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
74e1a04b 11039 printable_section_name (section));
dd24e3da
NC
11040 continue;
11041 }
11042
252b5132 11043 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
74e1a04b 11044 printable_section_name (section),
252b5132 11045 (unsigned long) (section->sh_size / section->sh_entsize));
dd24e3da 11046
f7a99963 11047 if (is_32bit_elf)
ca47b30c 11048 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
f7a99963 11049 else
ca47b30c 11050 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
252b5132 11051
ba5cdace 11052 symtab = GET_ELF_SYMBOLS (file, section, & num_syms);
252b5132
RH
11053 if (symtab == NULL)
11054 continue;
11055
11056 if (section->sh_link == elf_header.e_shstrndx)
c256ffe7
JJ
11057 {
11058 strtab = string_table;
11059 strtab_size = string_table_length;
11060 }
4fbb74a6 11061 else if (section->sh_link < elf_header.e_shnum)
252b5132 11062 {
2cf0635d 11063 Elf_Internal_Shdr * string_sec;
252b5132 11064
4fbb74a6 11065 string_sec = section_headers + section->sh_link;
252b5132 11066
3f5e193b
NC
11067 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
11068 1, string_sec->sh_size,
11069 _("string table"));
c256ffe7 11070 strtab_size = strtab != NULL ? string_sec->sh_size : 0;
252b5132
RH
11071 }
11072
ba5cdace 11073 for (si = 0, psym = symtab; si < num_syms; si++, psym++)
252b5132 11074 {
bb4d2ac2
L
11075 const char *version_string;
11076 enum versioned_symbol_info sym_info;
11077 unsigned short vna_other;
11078
5e220199 11079 printf ("%6d: ", si);
f7a99963
NC
11080 print_vma (psym->st_value, LONG_HEX);
11081 putchar (' ');
11082 print_vma (psym->st_size, DEC_5);
d1133906
NC
11083 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
11084 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
fd85a6a1
NC
11085 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11086 printf (" %-7s", get_solaris_symbol_visibility (psym->st_other));
11087 else
11088 {
11089 unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11090
11091 printf (" %-7s", get_symbol_visibility (vis));
11092 /* Check to see if any other bits in the st_other field are set.
11093 Note - displaying this information disrupts the layout of the
11094 table being generated, but for the moment this case is very rare. */
11095 if (psym->st_other ^ vis)
11096 printf (" [%s] ", get_symbol_other (psym->st_other ^ vis));
11097 }
31104126 11098 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
c256ffe7 11099 print_symbol (25, psym->st_name < strtab_size
2b692964 11100 ? strtab + psym->st_name : _("<corrupt>"));
252b5132 11101
bb4d2ac2
L
11102 version_string
11103 = get_symbol_version_string (file,
11104 section->sh_type == SHT_DYNSYM,
11105 strtab, strtab_size, si,
11106 psym, &sym_info, &vna_other);
11107 if (version_string)
252b5132 11108 {
bb4d2ac2
L
11109 if (sym_info == symbol_undefined)
11110 printf ("@%s (%d)", version_string, vna_other);
11111 else
11112 printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
11113 version_string);
252b5132
RH
11114 }
11115
11116 putchar ('\n');
52c3c391
NC
11117
11118 if (ELF_ST_BIND (psym->st_info) == STB_LOCAL
11119 && si >= section->sh_info)
11120 warn (_("local symbol %u found at index >= %s's sh_info value of %u\n"),
11121 si, printable_section_name (section), section->sh_info);
252b5132
RH
11122 }
11123
11124 free (symtab);
11125 if (strtab != string_table)
11126 free (strtab);
11127 }
11128 }
11129 else if (do_syms)
11130 printf
11131 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
11132
11133 if (do_histogram && buckets != NULL)
11134 {
2cf0635d
NC
11135 unsigned long * lengths;
11136 unsigned long * counts;
66543521
AM
11137 unsigned long hn;
11138 bfd_vma si;
11139 unsigned long maxlength = 0;
11140 unsigned long nzero_counts = 0;
11141 unsigned long nsyms = 0;
94d15024 11142 unsigned long chained;
252b5132 11143
66543521
AM
11144 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
11145 (unsigned long) nbuckets);
252b5132 11146
3f5e193b 11147 lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
252b5132
RH
11148 if (lengths == NULL)
11149 {
8b73c356 11150 error (_("Out of memory allocating space for histogram buckets\n"));
252b5132
RH
11151 return 0;
11152 }
8b73c356
NC
11153
11154 printf (_(" Length Number %% of total Coverage\n"));
252b5132
RH
11155 for (hn = 0; hn < nbuckets; ++hn)
11156 {
94d15024
MF
11157 for (si = buckets[hn], chained = 0;
11158 si > 0 && si < nchains && si < nbuckets && chained <= nchains;
11159 si = chains[si], ++chained)
252b5132 11160 {
b34976b6 11161 ++nsyms;
252b5132 11162 if (maxlength < ++lengths[hn])
b34976b6 11163 ++maxlength;
252b5132 11164 }
94d15024
MF
11165
11166 /* PR binutils/17531: A corrupt binary could contain broken
11167 histogram data. Do not go into an infinite loop trying
11168 to process it. */
11169 if (chained > nchains)
11170 {
11171 error (_("histogram chain is corrupt\n"));
11172 break;
11173 }
252b5132
RH
11174 }
11175
3f5e193b 11176 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
252b5132
RH
11177 if (counts == NULL)
11178 {
b2e951ec 11179 free (lengths);
8b73c356 11180 error (_("Out of memory allocating space for histogram counts\n"));
252b5132
RH
11181 return 0;
11182 }
11183
11184 for (hn = 0; hn < nbuckets; ++hn)
b34976b6 11185 ++counts[lengths[hn]];
252b5132 11186
103f02d3 11187 if (nbuckets > 0)
252b5132 11188 {
66543521
AM
11189 unsigned long i;
11190 printf (" 0 %-10lu (%5.1f%%)\n",
103f02d3 11191 counts[0], (counts[0] * 100.0) / nbuckets);
66543521 11192 for (i = 1; i <= maxlength; ++i)
103f02d3 11193 {
66543521
AM
11194 nzero_counts += counts[i] * i;
11195 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11196 i, counts[i], (counts[i] * 100.0) / nbuckets,
103f02d3
UD
11197 (nzero_counts * 100.0) / nsyms);
11198 }
252b5132
RH
11199 }
11200
11201 free (counts);
11202 free (lengths);
11203 }
11204
11205 if (buckets != NULL)
11206 {
11207 free (buckets);
11208 free (chains);
11209 }
11210
d3a44ec6 11211 if (do_histogram && gnubuckets != NULL)
fdc90cb4 11212 {
2cf0635d
NC
11213 unsigned long * lengths;
11214 unsigned long * counts;
fdc90cb4
JJ
11215 unsigned long hn;
11216 unsigned long maxlength = 0;
11217 unsigned long nzero_counts = 0;
11218 unsigned long nsyms = 0;
fdc90cb4 11219
8b73c356
NC
11220 printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
11221 (unsigned long) ngnubuckets);
11222
3f5e193b 11223 lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
fdc90cb4
JJ
11224 if (lengths == NULL)
11225 {
8b73c356 11226 error (_("Out of memory allocating space for gnu histogram buckets\n"));
fdc90cb4
JJ
11227 return 0;
11228 }
11229
fdc90cb4
JJ
11230 printf (_(" Length Number %% of total Coverage\n"));
11231
11232 for (hn = 0; hn < ngnubuckets; ++hn)
11233 if (gnubuckets[hn] != 0)
11234 {
11235 bfd_vma off, length = 1;
11236
6bd1a22c 11237 for (off = gnubuckets[hn] - gnusymidx;
071436c6
NC
11238 /* PR 17531 file: 010-77222-0.004. */
11239 off < ngnuchains && (gnuchains[off] & 1) == 0;
11240 ++off)
fdc90cb4
JJ
11241 ++length;
11242 lengths[hn] = length;
11243 if (length > maxlength)
11244 maxlength = length;
11245 nsyms += length;
11246 }
11247
3f5e193b 11248 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
fdc90cb4
JJ
11249 if (counts == NULL)
11250 {
b2e951ec 11251 free (lengths);
8b73c356 11252 error (_("Out of memory allocating space for gnu histogram counts\n"));
fdc90cb4
JJ
11253 return 0;
11254 }
11255
11256 for (hn = 0; hn < ngnubuckets; ++hn)
11257 ++counts[lengths[hn]];
11258
11259 if (ngnubuckets > 0)
11260 {
11261 unsigned long j;
11262 printf (" 0 %-10lu (%5.1f%%)\n",
11263 counts[0], (counts[0] * 100.0) / ngnubuckets);
11264 for (j = 1; j <= maxlength; ++j)
11265 {
11266 nzero_counts += counts[j] * j;
11267 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11268 j, counts[j], (counts[j] * 100.0) / ngnubuckets,
11269 (nzero_counts * 100.0) / nsyms);
11270 }
11271 }
11272
11273 free (counts);
11274 free (lengths);
11275 free (gnubuckets);
11276 free (gnuchains);
11277 }
11278
252b5132
RH
11279 return 1;
11280}
11281
11282static int
2cf0635d 11283process_syminfo (FILE * file ATTRIBUTE_UNUSED)
252b5132 11284{
b4c96d0d 11285 unsigned int i;
252b5132
RH
11286
11287 if (dynamic_syminfo == NULL
11288 || !do_dynamic)
11289 /* No syminfo, this is ok. */
11290 return 1;
11291
11292 /* There better should be a dynamic symbol section. */
11293 if (dynamic_symbols == NULL || dynamic_strings == NULL)
11294 return 0;
11295
11296 if (dynamic_addr)
11297 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
11298 dynamic_syminfo_offset, dynamic_syminfo_nent);
11299
11300 printf (_(" Num: Name BoundTo Flags\n"));
11301 for (i = 0; i < dynamic_syminfo_nent; ++i)
11302 {
11303 unsigned short int flags = dynamic_syminfo[i].si_flags;
11304
31104126 11305 printf ("%4d: ", i);
4082ef84
NC
11306 if (i >= num_dynamic_syms)
11307 printf (_("<corrupt index>"));
11308 else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
d79b3d50
NC
11309 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
11310 else
2b692964 11311 printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
31104126 11312 putchar (' ');
252b5132
RH
11313
11314 switch (dynamic_syminfo[i].si_boundto)
11315 {
11316 case SYMINFO_BT_SELF:
11317 fputs ("SELF ", stdout);
11318 break;
11319 case SYMINFO_BT_PARENT:
11320 fputs ("PARENT ", stdout);
11321 break;
11322 default:
11323 if (dynamic_syminfo[i].si_boundto > 0
d79b3d50
NC
11324 && dynamic_syminfo[i].si_boundto < dynamic_nent
11325 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
31104126 11326 {
d79b3d50 11327 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
31104126
NC
11328 putchar (' ' );
11329 }
252b5132
RH
11330 else
11331 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
11332 break;
11333 }
11334
11335 if (flags & SYMINFO_FLG_DIRECT)
11336 printf (" DIRECT");
11337 if (flags & SYMINFO_FLG_PASSTHRU)
11338 printf (" PASSTHRU");
11339 if (flags & SYMINFO_FLG_COPY)
11340 printf (" COPY");
11341 if (flags & SYMINFO_FLG_LAZYLOAD)
11342 printf (" LAZYLOAD");
11343
11344 puts ("");
11345 }
11346
11347 return 1;
11348}
11349
cf13d699
NC
11350/* Check to see if the given reloc needs to be handled in a target specific
11351 manner. If so then process the reloc and return TRUE otherwise return
11352 FALSE. */
09c11c86 11353
cf13d699
NC
11354static bfd_boolean
11355target_specific_reloc_handling (Elf_Internal_Rela * reloc,
11356 unsigned char * start,
11357 Elf_Internal_Sym * symtab)
252b5132 11358{
cf13d699 11359 unsigned int reloc_type = get_reloc_type (reloc->r_info);
252b5132 11360
cf13d699 11361 switch (elf_header.e_machine)
252b5132 11362 {
13761a11
NC
11363 case EM_MSP430:
11364 case EM_MSP430_OLD:
11365 {
11366 static Elf_Internal_Sym * saved_sym = NULL;
11367
11368 switch (reloc_type)
11369 {
11370 case 10: /* R_MSP430_SYM_DIFF */
11371 if (uses_msp430x_relocs ())
11372 break;
11373 case 21: /* R_MSP430X_SYM_DIFF */
11374 saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11375 return TRUE;
11376
11377 case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
11378 case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
11379 goto handle_sym_diff;
0b4362b0 11380
13761a11
NC
11381 case 5: /* R_MSP430_16_BYTE */
11382 case 9: /* R_MSP430_8 */
11383 if (uses_msp430x_relocs ())
11384 break;
11385 goto handle_sym_diff;
11386
11387 case 2: /* R_MSP430_ABS16 */
11388 case 15: /* R_MSP430X_ABS16 */
11389 if (! uses_msp430x_relocs ())
11390 break;
11391 goto handle_sym_diff;
0b4362b0 11392
13761a11
NC
11393 handle_sym_diff:
11394 if (saved_sym != NULL)
11395 {
11396 bfd_vma value;
11397
11398 value = reloc->r_addend
11399 + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11400 - saved_sym->st_value);
11401
11402 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
11403
11404 saved_sym = NULL;
11405 return TRUE;
11406 }
11407 break;
11408
11409 default:
11410 if (saved_sym != NULL)
071436c6 11411 error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
13761a11
NC
11412 break;
11413 }
11414 break;
11415 }
11416
cf13d699
NC
11417 case EM_MN10300:
11418 case EM_CYGNUS_MN10300:
11419 {
11420 static Elf_Internal_Sym * saved_sym = NULL;
252b5132 11421
cf13d699
NC
11422 switch (reloc_type)
11423 {
11424 case 34: /* R_MN10300_ALIGN */
11425 return TRUE;
11426 case 33: /* R_MN10300_SYM_DIFF */
11427 saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11428 return TRUE;
11429 case 1: /* R_MN10300_32 */
11430 case 2: /* R_MN10300_16 */
11431 if (saved_sym != NULL)
11432 {
11433 bfd_vma value;
252b5132 11434
cf13d699
NC
11435 value = reloc->r_addend
11436 + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11437 - saved_sym->st_value);
252b5132 11438
cf13d699 11439 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
252b5132 11440
cf13d699
NC
11441 saved_sym = NULL;
11442 return TRUE;
11443 }
11444 break;
11445 default:
11446 if (saved_sym != NULL)
071436c6 11447 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
cf13d699
NC
11448 break;
11449 }
11450 break;
11451 }
6ff71e76
NC
11452
11453 case EM_RL78:
11454 {
11455 static bfd_vma saved_sym1 = 0;
11456 static bfd_vma saved_sym2 = 0;
11457 static bfd_vma value;
11458
11459 switch (reloc_type)
11460 {
11461 case 0x80: /* R_RL78_SYM. */
11462 saved_sym1 = saved_sym2;
11463 saved_sym2 = symtab[get_reloc_symindex (reloc->r_info)].st_value;
11464 saved_sym2 += reloc->r_addend;
11465 return TRUE;
11466
11467 case 0x83: /* R_RL78_OPsub. */
11468 value = saved_sym1 - saved_sym2;
11469 saved_sym2 = saved_sym1 = 0;
11470 return TRUE;
11471 break;
11472
11473 case 0x41: /* R_RL78_ABS32. */
11474 byte_put (start + reloc->r_offset, value, 4);
11475 value = 0;
11476 return TRUE;
11477
11478 case 0x43: /* R_RL78_ABS16. */
11479 byte_put (start + reloc->r_offset, value, 2);
11480 value = 0;
11481 return TRUE;
11482
11483 default:
11484 break;
11485 }
11486 break;
11487 }
252b5132
RH
11488 }
11489
cf13d699 11490 return FALSE;
252b5132
RH
11491}
11492
aca88567
NC
11493/* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
11494 DWARF debug sections. This is a target specific test. Note - we do not
11495 go through the whole including-target-headers-multiple-times route, (as
11496 we have already done with <elf/h8.h>) because this would become very
11497 messy and even then this function would have to contain target specific
11498 information (the names of the relocs instead of their numeric values).
11499 FIXME: This is not the correct way to solve this problem. The proper way
11500 is to have target specific reloc sizing and typing functions created by
11501 the reloc-macros.h header, in the same way that it already creates the
11502 reloc naming functions. */
11503
11504static bfd_boolean
11505is_32bit_abs_reloc (unsigned int reloc_type)
11506{
d347c9df 11507 /* Please keep this table alpha-sorted for ease of visual lookup. */
aca88567
NC
11508 switch (elf_header.e_machine)
11509 {
41e92641 11510 case EM_386:
22abe556 11511 case EM_IAMCU:
41e92641 11512 return reloc_type == 1; /* R_386_32. */
aca88567
NC
11513 case EM_68K:
11514 return reloc_type == 1; /* R_68K_32. */
11515 case EM_860:
11516 return reloc_type == 1; /* R_860_32. */
137b6b5f
AM
11517 case EM_960:
11518 return reloc_type == 2; /* R_960_32. */
a06ea964
NC
11519 case EM_AARCH64:
11520 return reloc_type == 258; /* R_AARCH64_ABS32 */
d347c9df
PS
11521 case EM_ADAPTEVA_EPIPHANY:
11522 return reloc_type == 3;
aca88567 11523 case EM_ALPHA:
137b6b5f 11524 return reloc_type == 1; /* R_ALPHA_REFLONG. */
41e92641
NC
11525 case EM_ARC:
11526 return reloc_type == 1; /* R_ARC_32. */
886a2506
NC
11527 case EM_ARC_COMPACT:
11528 case EM_ARC_COMPACT2:
11529 return reloc_type == 4; /* R_ARC_32. */
41e92641
NC
11530 case EM_ARM:
11531 return reloc_type == 2; /* R_ARM_ABS32 */
cb8f3167 11532 case EM_AVR_OLD:
aca88567
NC
11533 case EM_AVR:
11534 return reloc_type == 1;
11535 case EM_BLACKFIN:
11536 return reloc_type == 0x12; /* R_byte4_data. */
11537 case EM_CRIS:
11538 return reloc_type == 3; /* R_CRIS_32. */
11539 case EM_CR16:
11540 return reloc_type == 3; /* R_CR16_NUM32. */
11541 case EM_CRX:
11542 return reloc_type == 15; /* R_CRX_NUM32. */
11543 case EM_CYGNUS_FRV:
11544 return reloc_type == 1;
41e92641
NC
11545 case EM_CYGNUS_D10V:
11546 case EM_D10V:
11547 return reloc_type == 6; /* R_D10V_32. */
aca88567
NC
11548 case EM_CYGNUS_D30V:
11549 case EM_D30V:
11550 return reloc_type == 12; /* R_D30V_32_NORMAL. */
41e92641
NC
11551 case EM_DLX:
11552 return reloc_type == 3; /* R_DLX_RELOC_32. */
aca88567
NC
11553 case EM_CYGNUS_FR30:
11554 case EM_FR30:
11555 return reloc_type == 3; /* R_FR30_32. */
3f8107ab
AM
11556 case EM_FT32:
11557 return reloc_type == 1; /* R_FT32_32. */
aca88567
NC
11558 case EM_H8S:
11559 case EM_H8_300:
11560 case EM_H8_300H:
11561 return reloc_type == 1; /* R_H8_DIR32. */
3730236a 11562 case EM_IA_64:
d1c4b12b
NC
11563 return reloc_type == 0x65 /* R_IA64_SECREL32LSB. */
11564 || reloc_type == 0x25; /* R_IA64_DIR32LSB. */
aca88567
NC
11565 case EM_IP2K_OLD:
11566 case EM_IP2K:
11567 return reloc_type == 2; /* R_IP2K_32. */
11568 case EM_IQ2000:
11569 return reloc_type == 2; /* R_IQ2000_32. */
84e94c90
NC
11570 case EM_LATTICEMICO32:
11571 return reloc_type == 3; /* R_LM32_32. */
ff7eeb89 11572 case EM_M32C_OLD:
aca88567
NC
11573 case EM_M32C:
11574 return reloc_type == 3; /* R_M32C_32. */
11575 case EM_M32R:
11576 return reloc_type == 34; /* R_M32R_32_RELA. */
adec12c1
AM
11577 case EM_68HC11:
11578 case EM_68HC12:
11579 return reloc_type == 6; /* R_M68HC11_32. */
aca88567
NC
11580 case EM_MCORE:
11581 return reloc_type == 1; /* R_MCORE_ADDR32. */
11582 case EM_CYGNUS_MEP:
11583 return reloc_type == 4; /* R_MEP_32. */
a3c62988
NC
11584 case EM_METAG:
11585 return reloc_type == 2; /* R_METAG_ADDR32. */
137b6b5f
AM
11586 case EM_MICROBLAZE:
11587 return reloc_type == 1; /* R_MICROBLAZE_32. */
aca88567
NC
11588 case EM_MIPS:
11589 return reloc_type == 2; /* R_MIPS_32. */
11590 case EM_MMIX:
11591 return reloc_type == 4; /* R_MMIX_32. */
11592 case EM_CYGNUS_MN10200:
11593 case EM_MN10200:
11594 return reloc_type == 1; /* R_MN10200_32. */
11595 case EM_CYGNUS_MN10300:
11596 case EM_MN10300:
11597 return reloc_type == 1; /* R_MN10300_32. */
5506d11a
AM
11598 case EM_MOXIE:
11599 return reloc_type == 1; /* R_MOXIE_32. */
aca88567
NC
11600 case EM_MSP430_OLD:
11601 case EM_MSP430:
13761a11 11602 return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32. */
aca88567
NC
11603 case EM_MT:
11604 return reloc_type == 2; /* R_MT_32. */
35c08157
KLC
11605 case EM_NDS32:
11606 return reloc_type == 20; /* R_NDS32_RELA. */
3e0873ac 11607 case EM_ALTERA_NIOS2:
36591ba1 11608 return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32. */
3e0873ac
NC
11609 case EM_NIOS32:
11610 return reloc_type == 1; /* R_NIOS_32. */
73589c9d
CS
11611 case EM_OR1K:
11612 return reloc_type == 1; /* R_OR1K_32. */
aca88567 11613 case EM_PARISC:
5fda8eca
NC
11614 return (reloc_type == 1 /* R_PARISC_DIR32. */
11615 || reloc_type == 41); /* R_PARISC_SECREL32. */
aca88567
NC
11616 case EM_PJ:
11617 case EM_PJ_OLD:
11618 return reloc_type == 1; /* R_PJ_DATA_DIR32. */
11619 case EM_PPC64:
11620 return reloc_type == 1; /* R_PPC64_ADDR32. */
11621 case EM_PPC:
11622 return reloc_type == 1; /* R_PPC_ADDR32. */
99c513f6
DD
11623 case EM_RL78:
11624 return reloc_type == 1; /* R_RL78_DIR32. */
c7927a3c
NC
11625 case EM_RX:
11626 return reloc_type == 1; /* R_RX_DIR32. */
aca88567
NC
11627 case EM_S370:
11628 return reloc_type == 1; /* R_I370_ADDR31. */
11629 case EM_S390_OLD:
11630 case EM_S390:
11631 return reloc_type == 4; /* R_S390_32. */
41e92641
NC
11632 case EM_SCORE:
11633 return reloc_type == 8; /* R_SCORE_ABS32. */
aca88567
NC
11634 case EM_SH:
11635 return reloc_type == 1; /* R_SH_DIR32. */
11636 case EM_SPARC32PLUS:
11637 case EM_SPARCV9:
11638 case EM_SPARC:
11639 return reloc_type == 3 /* R_SPARC_32. */
11640 || reloc_type == 23; /* R_SPARC_UA32. */
a7dd7d05
AM
11641 case EM_SPU:
11642 return reloc_type == 6; /* R_SPU_ADDR32 */
40b36596
JM
11643 case EM_TI_C6000:
11644 return reloc_type == 1; /* R_C6000_ABS32. */
aa137e4d
NC
11645 case EM_TILEGX:
11646 return reloc_type == 2; /* R_TILEGX_32. */
11647 case EM_TILEPRO:
11648 return reloc_type == 1; /* R_TILEPRO_32. */
aca88567
NC
11649 case EM_CYGNUS_V850:
11650 case EM_V850:
11651 return reloc_type == 6; /* R_V850_ABS32. */
708e2187
NC
11652 case EM_V800:
11653 return reloc_type == 0x33; /* R_V810_WORD. */
aca88567
NC
11654 case EM_VAX:
11655 return reloc_type == 1; /* R_VAX_32. */
619ed720
EB
11656 case EM_VISIUM:
11657 return reloc_type == 3; /* R_VISIUM_32. */
aca88567 11658 case EM_X86_64:
8a9036a4 11659 case EM_L1OM:
7a9068fe 11660 case EM_K1OM:
aca88567 11661 return reloc_type == 10; /* R_X86_64_32. */
c29aca4a
NC
11662 case EM_XC16X:
11663 case EM_C166:
11664 return reloc_type == 3; /* R_XC16C_ABS_32. */
f6c1a2d5
NC
11665 case EM_XGATE:
11666 return reloc_type == 4; /* R_XGATE_32. */
aca88567
NC
11667 case EM_XSTORMY16:
11668 return reloc_type == 1; /* R_XSTROMY16_32. */
11669 case EM_XTENSA_OLD:
11670 case EM_XTENSA:
11671 return reloc_type == 1; /* R_XTENSA_32. */
aca88567 11672 default:
bee0ee85
NC
11673 {
11674 static unsigned int prev_warn = 0;
11675
11676 /* Avoid repeating the same warning multiple times. */
11677 if (prev_warn != elf_header.e_machine)
11678 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
11679 elf_header.e_machine);
11680 prev_warn = elf_header.e_machine;
11681 return FALSE;
11682 }
aca88567
NC
11683 }
11684}
11685
11686/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11687 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
11688
11689static bfd_boolean
11690is_32bit_pcrel_reloc (unsigned int reloc_type)
11691{
11692 switch (elf_header.e_machine)
d347c9df 11693 /* Please keep this table alpha-sorted for ease of visual lookup. */
aca88567 11694 {
41e92641 11695 case EM_386:
22abe556 11696 case EM_IAMCU:
3e0873ac 11697 return reloc_type == 2; /* R_386_PC32. */
aca88567 11698 case EM_68K:
3e0873ac 11699 return reloc_type == 4; /* R_68K_PC32. */
a06ea964
NC
11700 case EM_AARCH64:
11701 return reloc_type == 261; /* R_AARCH64_PREL32 */
cfb8c092
NC
11702 case EM_ADAPTEVA_EPIPHANY:
11703 return reloc_type == 6;
aca88567
NC
11704 case EM_ALPHA:
11705 return reloc_type == 10; /* R_ALPHA_SREL32. */
726c18e1
CZ
11706 case EM_ARC_COMPACT:
11707 case EM_ARC_COMPACT2:
11708 return reloc_type == 49; /* R_ARC_32_PCREL. */
41e92641 11709 case EM_ARM:
3e0873ac 11710 return reloc_type == 3; /* R_ARM_REL32 */
d347c9df
PS
11711 case EM_AVR_OLD:
11712 case EM_AVR:
11713 return reloc_type == 36; /* R_AVR_32_PCREL. */
137b6b5f
AM
11714 case EM_MICROBLAZE:
11715 return reloc_type == 2; /* R_MICROBLAZE_32_PCREL. */
73589c9d
CS
11716 case EM_OR1K:
11717 return reloc_type == 9; /* R_OR1K_32_PCREL. */
aca88567 11718 case EM_PARISC:
85acf597 11719 return reloc_type == 9; /* R_PARISC_PCREL32. */
aca88567
NC
11720 case EM_PPC:
11721 return reloc_type == 26; /* R_PPC_REL32. */
11722 case EM_PPC64:
3e0873ac 11723 return reloc_type == 26; /* R_PPC64_REL32. */
aca88567
NC
11724 case EM_S390_OLD:
11725 case EM_S390:
3e0873ac 11726 return reloc_type == 5; /* R_390_PC32. */
aca88567 11727 case EM_SH:
3e0873ac 11728 return reloc_type == 2; /* R_SH_REL32. */
aca88567
NC
11729 case EM_SPARC32PLUS:
11730 case EM_SPARCV9:
11731 case EM_SPARC:
3e0873ac 11732 return reloc_type == 6; /* R_SPARC_DISP32. */
a7dd7d05
AM
11733 case EM_SPU:
11734 return reloc_type == 13; /* R_SPU_REL32. */
aa137e4d
NC
11735 case EM_TILEGX:
11736 return reloc_type == 6; /* R_TILEGX_32_PCREL. */
11737 case EM_TILEPRO:
11738 return reloc_type == 4; /* R_TILEPRO_32_PCREL. */
619ed720
EB
11739 case EM_VISIUM:
11740 return reloc_type == 6; /* R_VISIUM_32_PCREL */
aca88567 11741 case EM_X86_64:
8a9036a4 11742 case EM_L1OM:
7a9068fe 11743 case EM_K1OM:
3e0873ac 11744 return reloc_type == 2; /* R_X86_64_PC32. */
2fcb9706
BW
11745 case EM_XTENSA_OLD:
11746 case EM_XTENSA:
11747 return reloc_type == 14; /* R_XTENSA_32_PCREL. */
aca88567
NC
11748 default:
11749 /* Do not abort or issue an error message here. Not all targets use
11750 pc-relative 32-bit relocs in their DWARF debug information and we
11751 have already tested for target coverage in is_32bit_abs_reloc. A
cf13d699
NC
11752 more helpful warning message will be generated by apply_relocations
11753 anyway, so just return. */
aca88567
NC
11754 return FALSE;
11755 }
11756}
11757
11758/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11759 a 64-bit absolute RELA relocation used in DWARF debug sections. */
11760
11761static bfd_boolean
11762is_64bit_abs_reloc (unsigned int reloc_type)
11763{
11764 switch (elf_header.e_machine)
11765 {
a06ea964
NC
11766 case EM_AARCH64:
11767 return reloc_type == 257; /* R_AARCH64_ABS64. */
aca88567
NC
11768 case EM_ALPHA:
11769 return reloc_type == 2; /* R_ALPHA_REFQUAD. */
3730236a
NC
11770 case EM_IA_64:
11771 return reloc_type == 0x27; /* R_IA64_DIR64LSB. */
3e0873ac
NC
11772 case EM_PARISC:
11773 return reloc_type == 80; /* R_PARISC_DIR64. */
aca88567
NC
11774 case EM_PPC64:
11775 return reloc_type == 38; /* R_PPC64_ADDR64. */
11776 case EM_SPARC32PLUS:
11777 case EM_SPARCV9:
11778 case EM_SPARC:
11779 return reloc_type == 54; /* R_SPARC_UA64. */
11780 case EM_X86_64:
8a9036a4 11781 case EM_L1OM:
7a9068fe 11782 case EM_K1OM:
aca88567 11783 return reloc_type == 1; /* R_X86_64_64. */
e819ade1
AS
11784 case EM_S390_OLD:
11785 case EM_S390:
aa137e4d
NC
11786 return reloc_type == 22; /* R_S390_64. */
11787 case EM_TILEGX:
11788 return reloc_type == 1; /* R_TILEGX_64. */
85a82265 11789 case EM_MIPS:
aa137e4d 11790 return reloc_type == 18; /* R_MIPS_64. */
aca88567
NC
11791 default:
11792 return FALSE;
11793 }
11794}
11795
85acf597
RH
11796/* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
11797 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
11798
11799static bfd_boolean
11800is_64bit_pcrel_reloc (unsigned int reloc_type)
11801{
11802 switch (elf_header.e_machine)
11803 {
a06ea964
NC
11804 case EM_AARCH64:
11805 return reloc_type == 260; /* R_AARCH64_PREL64. */
85acf597 11806 case EM_ALPHA:
aa137e4d 11807 return reloc_type == 11; /* R_ALPHA_SREL64. */
85acf597 11808 case EM_IA_64:
aa137e4d 11809 return reloc_type == 0x4f; /* R_IA64_PCREL64LSB. */
85acf597 11810 case EM_PARISC:
aa137e4d 11811 return reloc_type == 72; /* R_PARISC_PCREL64. */
85acf597 11812 case EM_PPC64:
aa137e4d 11813 return reloc_type == 44; /* R_PPC64_REL64. */
85acf597
RH
11814 case EM_SPARC32PLUS:
11815 case EM_SPARCV9:
11816 case EM_SPARC:
aa137e4d 11817 return reloc_type == 46; /* R_SPARC_DISP64. */
85acf597 11818 case EM_X86_64:
8a9036a4 11819 case EM_L1OM:
7a9068fe 11820 case EM_K1OM:
aa137e4d 11821 return reloc_type == 24; /* R_X86_64_PC64. */
85acf597
RH
11822 case EM_S390_OLD:
11823 case EM_S390:
aa137e4d
NC
11824 return reloc_type == 23; /* R_S390_PC64. */
11825 case EM_TILEGX:
11826 return reloc_type == 5; /* R_TILEGX_64_PCREL. */
85acf597
RH
11827 default:
11828 return FALSE;
11829 }
11830}
11831
4dc3c23d
AM
11832/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11833 a 24-bit absolute RELA relocation used in DWARF debug sections. */
11834
11835static bfd_boolean
11836is_24bit_abs_reloc (unsigned int reloc_type)
11837{
11838 switch (elf_header.e_machine)
11839 {
11840 case EM_CYGNUS_MN10200:
11841 case EM_MN10200:
11842 return reloc_type == 4; /* R_MN10200_24. */
3ee6e4fb
NC
11843 case EM_FT32:
11844 return reloc_type == 5; /* R_FT32_20. */
4dc3c23d
AM
11845 default:
11846 return FALSE;
11847 }
11848}
11849
aca88567
NC
11850/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11851 a 16-bit absolute RELA relocation used in DWARF debug sections. */
11852
11853static bfd_boolean
11854is_16bit_abs_reloc (unsigned int reloc_type)
4b78141a 11855{
d347c9df 11856 /* Please keep this table alpha-sorted for ease of visual lookup. */
4b78141a
NC
11857 switch (elf_header.e_machine)
11858 {
886a2506
NC
11859 case EM_ARC:
11860 case EM_ARC_COMPACT:
11861 case EM_ARC_COMPACT2:
11862 return reloc_type == 2; /* R_ARC_16. */
d347c9df
PS
11863 case EM_ADAPTEVA_EPIPHANY:
11864 return reloc_type == 5;
aca88567
NC
11865 case EM_AVR_OLD:
11866 case EM_AVR:
11867 return reloc_type == 4; /* R_AVR_16. */
41e92641
NC
11868 case EM_CYGNUS_D10V:
11869 case EM_D10V:
11870 return reloc_type == 3; /* R_D10V_16. */
4b78141a
NC
11871 case EM_H8S:
11872 case EM_H8_300:
11873 case EM_H8_300H:
aca88567
NC
11874 return reloc_type == R_H8_DIR16;
11875 case EM_IP2K_OLD:
11876 case EM_IP2K:
11877 return reloc_type == 1; /* R_IP2K_16. */
ff7eeb89 11878 case EM_M32C_OLD:
f4236fe4
DD
11879 case EM_M32C:
11880 return reloc_type == 1; /* R_M32C_16 */
d347c9df
PS
11881 case EM_CYGNUS_MN10200:
11882 case EM_MN10200:
11883 return reloc_type == 2; /* R_MN10200_16. */
11884 case EM_CYGNUS_MN10300:
11885 case EM_MN10300:
11886 return reloc_type == 2; /* R_MN10300_16. */
aca88567 11887 case EM_MSP430:
13761a11
NC
11888 if (uses_msp430x_relocs ())
11889 return reloc_type == 2; /* R_MSP430_ABS16. */
78c8d46c 11890 case EM_MSP430_OLD:
aca88567 11891 return reloc_type == 5; /* R_MSP430_16_BYTE. */
35c08157
KLC
11892 case EM_NDS32:
11893 return reloc_type == 19; /* R_NDS32_RELA. */
3e0873ac 11894 case EM_ALTERA_NIOS2:
36591ba1 11895 return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16. */
3e0873ac
NC
11896 case EM_NIOS32:
11897 return reloc_type == 9; /* R_NIOS_16. */
73589c9d
CS
11898 case EM_OR1K:
11899 return reloc_type == 2; /* R_OR1K_16. */
40b36596
JM
11900 case EM_TI_C6000:
11901 return reloc_type == 2; /* R_C6000_ABS16. */
d347c9df
PS
11902 case EM_VISIUM:
11903 return reloc_type == 2; /* R_VISIUM_16. */
c29aca4a
NC
11904 case EM_XC16X:
11905 case EM_C166:
11906 return reloc_type == 2; /* R_XC16C_ABS_16. */
f6c1a2d5
NC
11907 case EM_XGATE:
11908 return reloc_type == 3; /* R_XGATE_16. */
4b78141a 11909 default:
aca88567 11910 return FALSE;
4b78141a
NC
11911 }
11912}
11913
2a7b2e88
JK
11914/* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
11915 relocation entries (possibly formerly used for SHT_GROUP sections). */
11916
11917static bfd_boolean
11918is_none_reloc (unsigned int reloc_type)
11919{
11920 switch (elf_header.e_machine)
11921 {
cb8f3167 11922 case EM_386: /* R_386_NONE. */
d347c9df 11923 case EM_68K: /* R_68K_NONE. */
cfb8c092 11924 case EM_ADAPTEVA_EPIPHANY:
d347c9df
PS
11925 case EM_ALPHA: /* R_ALPHA_NONE. */
11926 case EM_ALTERA_NIOS2: /* R_NIOS2_NONE. */
886a2506 11927 case EM_ARC: /* R_ARC_NONE. */
886a2506 11928 case EM_ARC_COMPACT2: /* R_ARC_NONE. */
d347c9df 11929 case EM_ARC_COMPACT: /* R_ARC_NONE. */
cb8f3167 11930 case EM_ARM: /* R_ARM_NONE. */
d347c9df 11931 case EM_C166: /* R_XC16X_NONE. */
cb8f3167 11932 case EM_CRIS: /* R_CRIS_NONE. */
d347c9df
PS
11933 case EM_FT32: /* R_FT32_NONE. */
11934 case EM_IA_64: /* R_IA64_NONE. */
7a9068fe 11935 case EM_K1OM: /* R_X86_64_NONE. */
d347c9df
PS
11936 case EM_L1OM: /* R_X86_64_NONE. */
11937 case EM_M32R: /* R_M32R_NONE. */
11938 case EM_MIPS: /* R_MIPS_NONE. */
cb8f3167 11939 case EM_MN10300: /* R_MN10300_NONE. */
5506d11a 11940 case EM_MOXIE: /* R_MOXIE_NONE. */
d347c9df
PS
11941 case EM_NIOS32: /* R_NIOS_NONE. */
11942 case EM_OR1K: /* R_OR1K_NONE. */
11943 case EM_PARISC: /* R_PARISC_NONE. */
11944 case EM_PPC64: /* R_PPC64_NONE. */
11945 case EM_PPC: /* R_PPC_NONE. */
11946 case EM_S390: /* R_390_NONE. */
11947 case EM_S390_OLD:
11948 case EM_SH: /* R_SH_NONE. */
11949 case EM_SPARC32PLUS:
11950 case EM_SPARC: /* R_SPARC_NONE. */
11951 case EM_SPARCV9:
aa137e4d
NC
11952 case EM_TILEGX: /* R_TILEGX_NONE. */
11953 case EM_TILEPRO: /* R_TILEPRO_NONE. */
d347c9df
PS
11954 case EM_TI_C6000:/* R_C6000_NONE. */
11955 case EM_X86_64: /* R_X86_64_NONE. */
c29aca4a 11956 case EM_XC16X:
cb8f3167 11957 return reloc_type == 0;
d347c9df 11958
a06ea964
NC
11959 case EM_AARCH64:
11960 return reloc_type == 0 || reloc_type == 256;
d347c9df
PS
11961 case EM_AVR_OLD:
11962 case EM_AVR:
11963 return (reloc_type == 0 /* R_AVR_NONE. */
11964 || reloc_type == 30 /* R_AVR_DIFF8. */
11965 || reloc_type == 31 /* R_AVR_DIFF16. */
11966 || reloc_type == 32 /* R_AVR_DIFF32. */);
11967 case EM_METAG:
11968 return reloc_type == 3; /* R_METAG_NONE. */
35c08157
KLC
11969 case EM_NDS32:
11970 return (reloc_type == 0 /* R_XTENSA_NONE. */
11971 || reloc_type == 204 /* R_NDS32_DIFF8. */
11972 || reloc_type == 205 /* R_NDS32_DIFF16. */
11973 || reloc_type == 206 /* R_NDS32_DIFF32. */
11974 || reloc_type == 207 /* R_NDS32_ULEB128. */);
58332dda
JK
11975 case EM_XTENSA_OLD:
11976 case EM_XTENSA:
4dc3c23d
AM
11977 return (reloc_type == 0 /* R_XTENSA_NONE. */
11978 || reloc_type == 17 /* R_XTENSA_DIFF8. */
11979 || reloc_type == 18 /* R_XTENSA_DIFF16. */
11980 || reloc_type == 19 /* R_XTENSA_DIFF32. */);
2a7b2e88
JK
11981 }
11982 return FALSE;
11983}
11984
d1c4b12b
NC
11985/* Returns TRUE if there is a relocation against
11986 section NAME at OFFSET bytes. */
11987
11988bfd_boolean
11989reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
11990{
11991 Elf_Internal_Rela * relocs;
11992 Elf_Internal_Rela * rp;
11993
11994 if (dsec == NULL || dsec->reloc_info == NULL)
11995 return FALSE;
11996
11997 relocs = (Elf_Internal_Rela *) dsec->reloc_info;
11998
11999 for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
12000 if (rp->r_offset == offset)
12001 return TRUE;
12002
12003 return FALSE;
12004}
12005
cf13d699
NC
12006/* Apply relocations to a section.
12007 Note: So far support has been added only for those relocations
12008 which can be found in debug sections.
d1c4b12b
NC
12009 If RELOCS_RETURN is non-NULL then returns in it a pointer to the
12010 loaded relocs. It is then the caller's responsibility to free them.
cf13d699 12011 FIXME: Add support for more relocations ? */
1b315056 12012
cf13d699 12013static void
d1c4b12b
NC
12014apply_relocations (void * file,
12015 const Elf_Internal_Shdr * section,
12016 unsigned char * start,
12017 bfd_size_type size,
12018 void ** relocs_return,
12019 unsigned long * num_relocs_return)
1b315056 12020{
cf13d699 12021 Elf_Internal_Shdr * relsec;
0d2a7a93 12022 unsigned char * end = start + size;
cb8f3167 12023
d1c4b12b
NC
12024 if (relocs_return != NULL)
12025 {
12026 * (Elf_Internal_Rela **) relocs_return = NULL;
12027 * num_relocs_return = 0;
12028 }
12029
cf13d699
NC
12030 if (elf_header.e_type != ET_REL)
12031 return;
1b315056 12032
cf13d699 12033 /* Find the reloc section associated with the section. */
5b18a4bc
NC
12034 for (relsec = section_headers;
12035 relsec < section_headers + elf_header.e_shnum;
12036 ++relsec)
252b5132 12037 {
41e92641
NC
12038 bfd_boolean is_rela;
12039 unsigned long num_relocs;
2cf0635d
NC
12040 Elf_Internal_Rela * relocs;
12041 Elf_Internal_Rela * rp;
12042 Elf_Internal_Shdr * symsec;
12043 Elf_Internal_Sym * symtab;
ba5cdace 12044 unsigned long num_syms;
2cf0635d 12045 Elf_Internal_Sym * sym;
252b5132 12046
41e92641 12047 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
4fbb74a6
AM
12048 || relsec->sh_info >= elf_header.e_shnum
12049 || section_headers + relsec->sh_info != section
c256ffe7 12050 || relsec->sh_size == 0
4fbb74a6 12051 || relsec->sh_link >= elf_header.e_shnum)
5b18a4bc 12052 continue;
428409d5 12053
41e92641
NC
12054 is_rela = relsec->sh_type == SHT_RELA;
12055
12056 if (is_rela)
12057 {
3f5e193b
NC
12058 if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
12059 relsec->sh_size, & relocs, & num_relocs))
41e92641
NC
12060 return;
12061 }
12062 else
12063 {
3f5e193b
NC
12064 if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
12065 relsec->sh_size, & relocs, & num_relocs))
41e92641
NC
12066 return;
12067 }
12068
12069 /* SH uses RELA but uses in place value instead of the addend field. */
12070 if (elf_header.e_machine == EM_SH)
12071 is_rela = FALSE;
428409d5 12072
4fbb74a6 12073 symsec = section_headers + relsec->sh_link;
ba5cdace 12074 symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec, & num_syms);
103f02d3 12075
41e92641 12076 for (rp = relocs; rp < relocs + num_relocs; ++rp)
252b5132 12077 {
41e92641
NC
12078 bfd_vma addend;
12079 unsigned int reloc_type;
12080 unsigned int reloc_size;
91d6fa6a 12081 unsigned char * rloc;
ba5cdace 12082 unsigned long sym_index;
4b78141a 12083
aca88567 12084 reloc_type = get_reloc_type (rp->r_info);
41e92641 12085
98fb390a 12086 if (target_specific_reloc_handling (rp, start, symtab))
2a7b2e88 12087 continue;
98fb390a
NC
12088 else if (is_none_reloc (reloc_type))
12089 continue;
12090 else if (is_32bit_abs_reloc (reloc_type)
12091 || is_32bit_pcrel_reloc (reloc_type))
aca88567 12092 reloc_size = 4;
85acf597
RH
12093 else if (is_64bit_abs_reloc (reloc_type)
12094 || is_64bit_pcrel_reloc (reloc_type))
aca88567 12095 reloc_size = 8;
4dc3c23d
AM
12096 else if (is_24bit_abs_reloc (reloc_type))
12097 reloc_size = 3;
aca88567
NC
12098 else if (is_16bit_abs_reloc (reloc_type))
12099 reloc_size = 2;
12100 else
4b78141a 12101 {
bee0ee85
NC
12102 static unsigned int prev_reloc = 0;
12103 if (reloc_type != prev_reloc)
12104 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
12105 reloc_type, printable_section_name (section));
12106 prev_reloc = reloc_type;
4b78141a
NC
12107 continue;
12108 }
103f02d3 12109
91d6fa6a 12110 rloc = start + rp->r_offset;
c8da6823 12111 if ((rloc + reloc_size) > end || (rloc < start))
700dd8b7
L
12112 {
12113 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
12114 (unsigned long) rp->r_offset,
74e1a04b 12115 printable_section_name (section));
700dd8b7
L
12116 continue;
12117 }
103f02d3 12118
ba5cdace
NC
12119 sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
12120 if (sym_index >= num_syms)
12121 {
12122 warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
74e1a04b 12123 sym_index, printable_section_name (section));
ba5cdace
NC
12124 continue;
12125 }
12126 sym = symtab + sym_index;
41e92641
NC
12127
12128 /* If the reloc has a symbol associated with it,
55f25fc3
L
12129 make sure that it is of an appropriate type.
12130
12131 Relocations against symbols without type can happen.
12132 Gcc -feliminate-dwarf2-dups may generate symbols
12133 without type for debug info.
12134
12135 Icc generates relocations against function symbols
12136 instead of local labels.
12137
12138 Relocations against object symbols can happen, eg when
12139 referencing a global array. For an example of this see
12140 the _clz.o binary in libgcc.a. */
aca88567 12141 if (sym != symtab
b8871f35 12142 && ELF_ST_TYPE (sym->st_info) != STT_COMMON
55f25fc3 12143 && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
5b18a4bc 12144 {
41e92641 12145 warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
aca88567 12146 get_symbol_type (ELF_ST_TYPE (sym->st_info)),
99dcb0b9 12147 (long int)(rp - relocs),
74e1a04b 12148 printable_section_name (relsec));
aca88567 12149 continue;
5b18a4bc 12150 }
252b5132 12151
4dc3c23d
AM
12152 addend = 0;
12153 if (is_rela)
12154 addend += rp->r_addend;
c47320c3
AM
12155 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
12156 partial_inplace. */
4dc3c23d
AM
12157 if (!is_rela
12158 || (elf_header.e_machine == EM_XTENSA
12159 && reloc_type == 1)
12160 || ((elf_header.e_machine == EM_PJ
12161 || elf_header.e_machine == EM_PJ_OLD)
c47320c3
AM
12162 && reloc_type == 1)
12163 || ((elf_header.e_machine == EM_D30V
12164 || elf_header.e_machine == EM_CYGNUS_D30V)
12165 && reloc_type == 12))
91d6fa6a 12166 addend += byte_get (rloc, reloc_size);
cb8f3167 12167
85acf597
RH
12168 if (is_32bit_pcrel_reloc (reloc_type)
12169 || is_64bit_pcrel_reloc (reloc_type))
12170 {
12171 /* On HPPA, all pc-relative relocations are biased by 8. */
12172 if (elf_header.e_machine == EM_PARISC)
12173 addend -= 8;
91d6fa6a 12174 byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
85acf597
RH
12175 reloc_size);
12176 }
41e92641 12177 else
91d6fa6a 12178 byte_put (rloc, addend + sym->st_value, reloc_size);
5b18a4bc 12179 }
252b5132 12180
5b18a4bc 12181 free (symtab);
d1c4b12b
NC
12182
12183 if (relocs_return)
12184 {
12185 * (Elf_Internal_Rela **) relocs_return = relocs;
12186 * num_relocs_return = num_relocs;
12187 }
12188 else
12189 free (relocs);
12190
5b18a4bc
NC
12191 break;
12192 }
5b18a4bc 12193}
103f02d3 12194
cf13d699
NC
12195#ifdef SUPPORT_DISASSEMBLY
12196static int
12197disassemble_section (Elf_Internal_Shdr * section, FILE * file)
12198{
74e1a04b 12199 printf (_("\nAssembly dump of section %s\n"), printable_section_name (section));
cf13d699 12200
74e1a04b 12201 /* FIXME: XXX -- to be done --- XXX */
cf13d699
NC
12202
12203 return 1;
12204}
12205#endif
12206
12207/* Reads in the contents of SECTION from FILE, returning a pointer
12208 to a malloc'ed buffer or NULL if something went wrong. */
12209
12210static char *
12211get_section_contents (Elf_Internal_Shdr * section, FILE * file)
12212{
12213 bfd_size_type num_bytes;
12214
12215 num_bytes = section->sh_size;
12216
12217 if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
12218 {
12219 printf (_("\nSection '%s' has no data to dump.\n"),
74e1a04b 12220 printable_section_name (section));
cf13d699
NC
12221 return NULL;
12222 }
12223
3f5e193b
NC
12224 return (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
12225 _("section contents"));
cf13d699
NC
12226}
12227
0e602686
NC
12228/* Uncompresses a section that was compressed using zlib, in place. */
12229
12230static bfd_boolean
12231uncompress_section_contents (unsigned char **buffer,
12232 dwarf_size_type uncompressed_size,
12233 dwarf_size_type *size)
12234{
12235 dwarf_size_type compressed_size = *size;
12236 unsigned char * compressed_buffer = *buffer;
12237 unsigned char * uncompressed_buffer;
12238 z_stream strm;
12239 int rc;
12240
12241 /* It is possible the section consists of several compressed
12242 buffers concatenated together, so we uncompress in a loop. */
12243 /* PR 18313: The state field in the z_stream structure is supposed
12244 to be invisible to the user (ie us), but some compilers will
12245 still complain about it being used without initialisation. So
12246 we first zero the entire z_stream structure and then set the fields
12247 that we need. */
12248 memset (& strm, 0, sizeof strm);
12249 strm.avail_in = compressed_size;
12250 strm.next_in = (Bytef *) compressed_buffer;
12251 strm.avail_out = uncompressed_size;
12252 uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
12253
12254 rc = inflateInit (& strm);
12255 while (strm.avail_in > 0)
12256 {
12257 if (rc != Z_OK)
12258 goto fail;
12259 strm.next_out = ((Bytef *) uncompressed_buffer
12260 + (uncompressed_size - strm.avail_out));
12261 rc = inflate (&strm, Z_FINISH);
12262 if (rc != Z_STREAM_END)
12263 goto fail;
12264 rc = inflateReset (& strm);
12265 }
12266 rc = inflateEnd (& strm);
12267 if (rc != Z_OK
12268 || strm.avail_out != 0)
12269 goto fail;
12270
12271 *buffer = uncompressed_buffer;
12272 *size = uncompressed_size;
12273 return TRUE;
12274
12275 fail:
12276 free (uncompressed_buffer);
12277 /* Indicate decompression failure. */
12278 *buffer = NULL;
12279 return FALSE;
12280}
dd24e3da 12281
cf13d699
NC
12282static void
12283dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
12284{
0e602686
NC
12285 Elf_Internal_Shdr * relsec;
12286 bfd_size_type num_bytes;
fd8008d8
L
12287 unsigned char * data;
12288 unsigned char * end;
12289 unsigned char * real_start;
12290 unsigned char * start;
0e602686 12291 bfd_boolean some_strings_shown;
cf13d699 12292
fd8008d8
L
12293 real_start = start = (unsigned char *) get_section_contents (section,
12294 file);
cf13d699
NC
12295 if (start == NULL)
12296 return;
0e602686 12297 num_bytes = section->sh_size;
cf13d699 12298
74e1a04b 12299 printf (_("\nString dump of section '%s':\n"), printable_section_name (section));
cf13d699 12300
0e602686
NC
12301 if (decompress_dumps)
12302 {
12303 dwarf_size_type new_size = num_bytes;
12304 dwarf_size_type uncompressed_size = 0;
12305
12306 if ((section->sh_flags & SHF_COMPRESSED) != 0)
12307 {
12308 Elf_Internal_Chdr chdr;
12309 unsigned int compression_header_size
12310 = get_compression_header (& chdr, (unsigned char *) start);
12311
813dabb9 12312 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
0e602686 12313 {
813dabb9
L
12314 warn (_("section '%s' has unsupported compress type: %d\n"),
12315 printable_section_name (section), chdr.ch_type);
12316 return;
12317 }
12318 else if (chdr.ch_addralign != section->sh_addralign)
12319 {
12320 warn (_("compressed section '%s' is corrupted\n"),
12321 printable_section_name (section));
12322 return;
0e602686 12323 }
813dabb9
L
12324 uncompressed_size = chdr.ch_size;
12325 start += compression_header_size;
12326 new_size -= compression_header_size;
0e602686
NC
12327 }
12328 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12329 {
12330 /* Read the zlib header. In this case, it should be "ZLIB"
12331 followed by the uncompressed section size, 8 bytes in
12332 big-endian order. */
12333 uncompressed_size = start[4]; uncompressed_size <<= 8;
12334 uncompressed_size += start[5]; uncompressed_size <<= 8;
12335 uncompressed_size += start[6]; uncompressed_size <<= 8;
12336 uncompressed_size += start[7]; uncompressed_size <<= 8;
12337 uncompressed_size += start[8]; uncompressed_size <<= 8;
12338 uncompressed_size += start[9]; uncompressed_size <<= 8;
12339 uncompressed_size += start[10]; uncompressed_size <<= 8;
12340 uncompressed_size += start[11];
12341 start += 12;
12342 new_size -= 12;
12343 }
12344
12345 if (uncompressed_size
fd8008d8 12346 && uncompress_section_contents (& start,
0e602686
NC
12347 uncompressed_size, & new_size))
12348 num_bytes = new_size;
12349 }
fd8008d8 12350
cf13d699
NC
12351 /* If the section being dumped has relocations against it the user might
12352 be expecting these relocations to have been applied. Check for this
12353 case and issue a warning message in order to avoid confusion.
12354 FIXME: Maybe we ought to have an option that dumps a section with
12355 relocs applied ? */
12356 for (relsec = section_headers;
12357 relsec < section_headers + elf_header.e_shnum;
12358 ++relsec)
12359 {
12360 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12361 || relsec->sh_info >= elf_header.e_shnum
12362 || section_headers + relsec->sh_info != section
12363 || relsec->sh_size == 0
12364 || relsec->sh_link >= elf_header.e_shnum)
12365 continue;
12366
12367 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12368 break;
12369 }
12370
cf13d699
NC
12371 data = start;
12372 end = start + num_bytes;
12373 some_strings_shown = FALSE;
12374
12375 while (data < end)
12376 {
12377 while (!ISPRINT (* data))
12378 if (++ data >= end)
12379 break;
12380
12381 if (data < end)
12382 {
071436c6
NC
12383 size_t maxlen = end - data;
12384
cf13d699 12385#ifndef __MSVCRT__
c975cc98
NC
12386 /* PR 11128: Use two separate invocations in order to work
12387 around bugs in the Solaris 8 implementation of printf. */
12388 printf (" [%6tx] ", data - start);
cf13d699 12389#else
071436c6 12390 printf (" [%6Ix] ", (size_t) (data - start));
cf13d699 12391#endif
4082ef84
NC
12392 if (maxlen > 0)
12393 {
fd8008d8 12394 print_symbol ((int) maxlen, (const char *) data);
4082ef84 12395 putchar ('\n');
fd8008d8 12396 data += strnlen ((const char *) data, maxlen);
4082ef84
NC
12397 }
12398 else
12399 {
12400 printf (_("<corrupt>\n"));
12401 data = end;
12402 }
cf13d699
NC
12403 some_strings_shown = TRUE;
12404 }
12405 }
12406
12407 if (! some_strings_shown)
12408 printf (_(" No strings found in this section."));
12409
0e602686 12410 free (real_start);
cf13d699
NC
12411
12412 putchar ('\n');
12413}
12414
12415static void
12416dump_section_as_bytes (Elf_Internal_Shdr * section,
12417 FILE * file,
12418 bfd_boolean relocate)
12419{
12420 Elf_Internal_Shdr * relsec;
0e602686
NC
12421 bfd_size_type bytes;
12422 bfd_size_type section_size;
12423 bfd_vma addr;
12424 unsigned char * data;
12425 unsigned char * real_start;
12426 unsigned char * start;
12427
12428 real_start = start = (unsigned char *) get_section_contents (section, file);
cf13d699
NC
12429 if (start == NULL)
12430 return;
0e602686 12431 section_size = section->sh_size;
cf13d699 12432
74e1a04b 12433 printf (_("\nHex dump of section '%s':\n"), printable_section_name (section));
cf13d699 12434
0e602686
NC
12435 if (decompress_dumps)
12436 {
12437 dwarf_size_type new_size = section_size;
12438 dwarf_size_type uncompressed_size = 0;
12439
12440 if ((section->sh_flags & SHF_COMPRESSED) != 0)
12441 {
12442 Elf_Internal_Chdr chdr;
12443 unsigned int compression_header_size
12444 = get_compression_header (& chdr, start);
12445
813dabb9 12446 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
0e602686 12447 {
813dabb9
L
12448 warn (_("section '%s' has unsupported compress type: %d\n"),
12449 printable_section_name (section), chdr.ch_type);
12450 return;
0e602686 12451 }
813dabb9
L
12452 else if (chdr.ch_addralign != section->sh_addralign)
12453 {
12454 warn (_("compressed section '%s' is corrupted\n"),
12455 printable_section_name (section));
12456 return;
12457 }
12458 uncompressed_size = chdr.ch_size;
12459 start += compression_header_size;
12460 new_size -= compression_header_size;
0e602686
NC
12461 }
12462 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12463 {
12464 /* Read the zlib header. In this case, it should be "ZLIB"
12465 followed by the uncompressed section size, 8 bytes in
12466 big-endian order. */
12467 uncompressed_size = start[4]; uncompressed_size <<= 8;
12468 uncompressed_size += start[5]; uncompressed_size <<= 8;
12469 uncompressed_size += start[6]; uncompressed_size <<= 8;
12470 uncompressed_size += start[7]; uncompressed_size <<= 8;
12471 uncompressed_size += start[8]; uncompressed_size <<= 8;
12472 uncompressed_size += start[9]; uncompressed_size <<= 8;
12473 uncompressed_size += start[10]; uncompressed_size <<= 8;
12474 uncompressed_size += start[11];
12475 start += 12;
12476 new_size -= 12;
12477 }
12478
12479 if (uncompressed_size
12480 && uncompress_section_contents (& start, uncompressed_size,
12481 & new_size))
12482 section_size = new_size;
12483 }
14ae95f2 12484
cf13d699
NC
12485 if (relocate)
12486 {
0e602686 12487 apply_relocations (file, section, start, section_size, NULL, NULL);
cf13d699
NC
12488 }
12489 else
12490 {
12491 /* If the section being dumped has relocations against it the user might
12492 be expecting these relocations to have been applied. Check for this
12493 case and issue a warning message in order to avoid confusion.
12494 FIXME: Maybe we ought to have an option that dumps a section with
12495 relocs applied ? */
12496 for (relsec = section_headers;
12497 relsec < section_headers + elf_header.e_shnum;
12498 ++relsec)
12499 {
12500 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12501 || relsec->sh_info >= elf_header.e_shnum
12502 || section_headers + relsec->sh_info != section
12503 || relsec->sh_size == 0
12504 || relsec->sh_link >= elf_header.e_shnum)
12505 continue;
12506
12507 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12508 break;
12509 }
12510 }
12511
12512 addr = section->sh_addr;
0e602686 12513 bytes = section_size;
cf13d699
NC
12514 data = start;
12515
12516 while (bytes)
12517 {
12518 int j;
12519 int k;
12520 int lbytes;
12521
12522 lbytes = (bytes > 16 ? 16 : bytes);
12523
12524 printf (" 0x%8.8lx ", (unsigned long) addr);
12525
12526 for (j = 0; j < 16; j++)
12527 {
12528 if (j < lbytes)
12529 printf ("%2.2x", data[j]);
12530 else
12531 printf (" ");
12532
12533 if ((j & 3) == 3)
12534 printf (" ");
12535 }
12536
12537 for (j = 0; j < lbytes; j++)
12538 {
12539 k = data[j];
12540 if (k >= ' ' && k < 0x7f)
12541 printf ("%c", k);
12542 else
12543 printf (".");
12544 }
12545
12546 putchar ('\n');
12547
12548 data += lbytes;
12549 addr += lbytes;
12550 bytes -= lbytes;
12551 }
12552
0e602686 12553 free (real_start);
cf13d699
NC
12554
12555 putchar ('\n');
12556}
12557
d966045b
DJ
12558static int
12559load_specific_debug_section (enum dwarf_section_display_enum debug,
0d2a7a93 12560 const Elf_Internal_Shdr * sec, void * file)
1007acb3 12561{
2cf0635d 12562 struct dwarf_section * section = &debug_displays [debug].section;
19e6b90e 12563 char buf [64];
1007acb3 12564
19e6b90e
L
12565 /* If it is already loaded, do nothing. */
12566 if (section->start != NULL)
12567 return 1;
1007acb3 12568
19e6b90e
L
12569 snprintf (buf, sizeof (buf), _("%s section data"), section->name);
12570 section->address = sec->sh_addr;
06614111 12571 section->user_data = NULL;
3f5e193b
NC
12572 section->start = (unsigned char *) get_data (NULL, (FILE *) file,
12573 sec->sh_offset, 1,
12574 sec->sh_size, buf);
59245841
NC
12575 if (section->start == NULL)
12576 section->size = 0;
12577 else
12578 {
77115a4a
L
12579 unsigned char *start = section->start;
12580 dwarf_size_type size = sec->sh_size;
dab394de 12581 dwarf_size_type uncompressed_size = 0;
77115a4a
L
12582
12583 if ((sec->sh_flags & SHF_COMPRESSED) != 0)
12584 {
12585 Elf_Internal_Chdr chdr;
d8024a91
NC
12586 unsigned int compression_header_size;
12587
12588 if (size < sizeof chdr)
12589 {
12590 warn (_("compressed section %s is too small to contain a compression header"),
12591 section->name);
12592 return 0;
12593 }
12594
12595 compression_header_size = get_compression_header (&chdr, start);
12596
813dabb9
L
12597 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12598 {
12599 warn (_("section '%s' has unsupported compress type: %d\n"),
12600 section->name, chdr.ch_type);
12601 return 0;
12602 }
12603 else if (chdr.ch_addralign != sec->sh_addralign)
12604 {
12605 warn (_("compressed section '%s' is corrupted\n"),
12606 section->name);
12607 return 0;
12608 }
dab394de 12609 uncompressed_size = chdr.ch_size;
77115a4a
L
12610 start += compression_header_size;
12611 size -= compression_header_size;
12612 }
dab394de
L
12613 else if (size > 12 && streq ((char *) start, "ZLIB"))
12614 {
12615 /* Read the zlib header. In this case, it should be "ZLIB"
12616 followed by the uncompressed section size, 8 bytes in
12617 big-endian order. */
12618 uncompressed_size = start[4]; uncompressed_size <<= 8;
12619 uncompressed_size += start[5]; uncompressed_size <<= 8;
12620 uncompressed_size += start[6]; uncompressed_size <<= 8;
12621 uncompressed_size += start[7]; uncompressed_size <<= 8;
12622 uncompressed_size += start[8]; uncompressed_size <<= 8;
12623 uncompressed_size += start[9]; uncompressed_size <<= 8;
12624 uncompressed_size += start[10]; uncompressed_size <<= 8;
12625 uncompressed_size += start[11];
12626 start += 12;
12627 size -= 12;
12628 }
12629
12630 if (uncompressed_size
12631 && uncompress_section_contents (&start, uncompressed_size,
12632 &size))
77115a4a
L
12633 {
12634 /* Free the compressed buffer, update the section buffer
12635 and the section size if uncompress is successful. */
12636 free (section->start);
12637 section->start = start;
77115a4a
L
12638 }
12639 section->size = size;
59245841 12640 }
4a114e3e 12641
1b315056
CS
12642 if (section->start == NULL)
12643 return 0;
12644
19e6b90e 12645 if (debug_displays [debug].relocate)
d1c4b12b
NC
12646 apply_relocations ((FILE *) file, sec, section->start, section->size,
12647 & section->reloc_info, & section->num_relocs);
12648 else
12649 {
12650 section->reloc_info = NULL;
12651 section->num_relocs = 0;
12652 }
1007acb3 12653
1b315056 12654 return 1;
1007acb3
L
12655}
12656
657d0d47
CC
12657/* If this is not NULL, load_debug_section will only look for sections
12658 within the list of sections given here. */
12659unsigned int *section_subset = NULL;
12660
d966045b 12661int
2cf0635d 12662load_debug_section (enum dwarf_section_display_enum debug, void * file)
d966045b 12663{
2cf0635d
NC
12664 struct dwarf_section * section = &debug_displays [debug].section;
12665 Elf_Internal_Shdr * sec;
d966045b
DJ
12666
12667 /* Locate the debug section. */
657d0d47 12668 sec = find_section_in_set (section->uncompressed_name, section_subset);
d966045b
DJ
12669 if (sec != NULL)
12670 section->name = section->uncompressed_name;
12671 else
12672 {
657d0d47 12673 sec = find_section_in_set (section->compressed_name, section_subset);
d966045b
DJ
12674 if (sec != NULL)
12675 section->name = section->compressed_name;
12676 }
12677 if (sec == NULL)
12678 return 0;
12679
657d0d47
CC
12680 /* If we're loading from a subset of sections, and we've loaded
12681 a section matching this name before, it's likely that it's a
12682 different one. */
12683 if (section_subset != NULL)
12684 free_debug_section (debug);
12685
3f5e193b 12686 return load_specific_debug_section (debug, sec, (FILE *) file);
d966045b
DJ
12687}
12688
19e6b90e
L
12689void
12690free_debug_section (enum dwarf_section_display_enum debug)
1007acb3 12691{
2cf0635d 12692 struct dwarf_section * section = &debug_displays [debug].section;
1007acb3 12693
19e6b90e
L
12694 if (section->start == NULL)
12695 return;
1007acb3 12696
19e6b90e
L
12697 free ((char *) section->start);
12698 section->start = NULL;
12699 section->address = 0;
12700 section->size = 0;
1007acb3
L
12701}
12702
1007acb3 12703static int
657d0d47 12704display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
1007acb3 12705{
2cf0635d 12706 char * name = SECTION_NAME (section);
74e1a04b 12707 const char * print_name = printable_section_name (section);
19e6b90e
L
12708 bfd_size_type length;
12709 int result = 1;
3f5e193b 12710 int i;
1007acb3 12711
19e6b90e
L
12712 length = section->sh_size;
12713 if (length == 0)
1007acb3 12714 {
74e1a04b 12715 printf (_("\nSection '%s' has no debugging data.\n"), print_name);
19e6b90e 12716 return 0;
1007acb3 12717 }
5dff79d8
NC
12718 if (section->sh_type == SHT_NOBITS)
12719 {
12720 /* There is no point in dumping the contents of a debugging section
12721 which has the NOBITS type - the bits in the file will be random.
12722 This can happen when a file containing a .eh_frame section is
12723 stripped with the --only-keep-debug command line option. */
74e1a04b
NC
12724 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
12725 print_name);
5dff79d8
NC
12726 return 0;
12727 }
1007acb3 12728
0112cd26 12729 if (const_strneq (name, ".gnu.linkonce.wi."))
19e6b90e 12730 name = ".debug_info";
1007acb3 12731
19e6b90e
L
12732 /* See if we know how to display the contents of this section. */
12733 for (i = 0; i < max; i++)
1b315056 12734 if (streq (debug_displays[i].section.uncompressed_name, name)
b40bf0a2 12735 || (i == line && const_strneq (name, ".debug_line."))
1b315056 12736 || streq (debug_displays[i].section.compressed_name, name))
19e6b90e 12737 {
2cf0635d 12738 struct dwarf_section * sec = &debug_displays [i].section;
d966045b
DJ
12739 int secondary = (section != find_section (name));
12740
12741 if (secondary)
3f5e193b 12742 free_debug_section ((enum dwarf_section_display_enum) i);
1007acb3 12743
b40bf0a2
NC
12744 if (i == line && const_strneq (name, ".debug_line."))
12745 sec->name = name;
12746 else if (streq (sec->uncompressed_name, name))
d966045b
DJ
12747 sec->name = sec->uncompressed_name;
12748 else
12749 sec->name = sec->compressed_name;
3f5e193b
NC
12750 if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
12751 section, file))
19e6b90e 12752 {
657d0d47
CC
12753 /* If this debug section is part of a CU/TU set in a .dwp file,
12754 restrict load_debug_section to the sections in that set. */
12755 section_subset = find_cu_tu_set (file, shndx);
12756
19e6b90e 12757 result &= debug_displays[i].display (sec, file);
1007acb3 12758
657d0d47
CC
12759 section_subset = NULL;
12760
d966045b 12761 if (secondary || (i != info && i != abbrev))
3f5e193b 12762 free_debug_section ((enum dwarf_section_display_enum) i);
19e6b90e 12763 }
1007acb3 12764
19e6b90e
L
12765 break;
12766 }
1007acb3 12767
19e6b90e 12768 if (i == max)
1007acb3 12769 {
74e1a04b 12770 printf (_("Unrecognized debug section: %s\n"), print_name);
19e6b90e 12771 result = 0;
1007acb3
L
12772 }
12773
19e6b90e 12774 return result;
5b18a4bc 12775}
103f02d3 12776
aef1f6d0
DJ
12777/* Set DUMP_SECTS for all sections where dumps were requested
12778 based on section name. */
12779
12780static void
12781initialise_dumps_byname (void)
12782{
2cf0635d 12783 struct dump_list_entry * cur;
aef1f6d0
DJ
12784
12785 for (cur = dump_sects_byname; cur; cur = cur->next)
12786 {
12787 unsigned int i;
12788 int any;
12789
12790 for (i = 0, any = 0; i < elf_header.e_shnum; i++)
12791 if (streq (SECTION_NAME (section_headers + i), cur->name))
12792 {
09c11c86 12793 request_dump_bynumber (i, cur->type);
aef1f6d0
DJ
12794 any = 1;
12795 }
12796
12797 if (!any)
12798 warn (_("Section '%s' was not dumped because it does not exist!\n"),
12799 cur->name);
12800 }
12801}
12802
5b18a4bc 12803static void
2cf0635d 12804process_section_contents (FILE * file)
5b18a4bc 12805{
2cf0635d 12806 Elf_Internal_Shdr * section;
19e6b90e 12807 unsigned int i;
103f02d3 12808
19e6b90e
L
12809 if (! do_dump)
12810 return;
103f02d3 12811
aef1f6d0
DJ
12812 initialise_dumps_byname ();
12813
19e6b90e
L
12814 for (i = 0, section = section_headers;
12815 i < elf_header.e_shnum && i < num_dump_sects;
12816 i++, section++)
12817 {
12818#ifdef SUPPORT_DISASSEMBLY
12819 if (dump_sects[i] & DISASS_DUMP)
12820 disassemble_section (section, file);
12821#endif
12822 if (dump_sects[i] & HEX_DUMP)
cf13d699 12823 dump_section_as_bytes (section, file, FALSE);
103f02d3 12824
cf13d699
NC
12825 if (dump_sects[i] & RELOC_DUMP)
12826 dump_section_as_bytes (section, file, TRUE);
09c11c86
NC
12827
12828 if (dump_sects[i] & STRING_DUMP)
12829 dump_section_as_strings (section, file);
cf13d699
NC
12830
12831 if (dump_sects[i] & DEBUG_DUMP)
657d0d47 12832 display_debug_section (i, section, file);
5b18a4bc 12833 }
103f02d3 12834
19e6b90e
L
12835 /* Check to see if the user requested a
12836 dump of a section that does not exist. */
12837 while (i++ < num_dump_sects)
12838 if (dump_sects[i])
12839 warn (_("Section %d was not dumped because it does not exist!\n"), i);
5b18a4bc 12840}
103f02d3 12841
5b18a4bc 12842static void
19e6b90e 12843process_mips_fpe_exception (int mask)
5b18a4bc 12844{
19e6b90e
L
12845 if (mask)
12846 {
12847 int first = 1;
12848 if (mask & OEX_FPU_INEX)
12849 fputs ("INEX", stdout), first = 0;
12850 if (mask & OEX_FPU_UFLO)
12851 printf ("%sUFLO", first ? "" : "|"), first = 0;
12852 if (mask & OEX_FPU_OFLO)
12853 printf ("%sOFLO", first ? "" : "|"), first = 0;
12854 if (mask & OEX_FPU_DIV0)
12855 printf ("%sDIV0", first ? "" : "|"), first = 0;
12856 if (mask & OEX_FPU_INVAL)
12857 printf ("%sINVAL", first ? "" : "|");
12858 }
5b18a4bc 12859 else
19e6b90e 12860 fputs ("0", stdout);
5b18a4bc 12861}
103f02d3 12862
f6f0e17b
NC
12863/* Display's the value of TAG at location P. If TAG is
12864 greater than 0 it is assumed to be an unknown tag, and
12865 a message is printed to this effect. Otherwise it is
12866 assumed that a message has already been printed.
12867
12868 If the bottom bit of TAG is set it assumed to have a
12869 string value, otherwise it is assumed to have an integer
12870 value.
12871
12872 Returns an updated P pointing to the first unread byte
12873 beyond the end of TAG's value.
12874
12875 Reads at or beyond END will not be made. */
12876
12877static unsigned char *
12878display_tag_value (int tag,
12879 unsigned char * p,
12880 const unsigned char * const end)
12881{
12882 unsigned long val;
12883
12884 if (tag > 0)
12885 printf (" Tag_unknown_%d: ", tag);
12886
12887 if (p >= end)
12888 {
4082ef84 12889 warn (_("<corrupt tag>\n"));
f6f0e17b
NC
12890 }
12891 else if (tag & 1)
12892 {
071436c6
NC
12893 /* PR 17531 file: 027-19978-0.004. */
12894 size_t maxlen = (end - p) - 1;
12895
12896 putchar ('"');
4082ef84
NC
12897 if (maxlen > 0)
12898 {
12899 print_symbol ((int) maxlen, (const char *) p);
12900 p += strnlen ((char *) p, maxlen) + 1;
12901 }
12902 else
12903 {
12904 printf (_("<corrupt string tag>"));
12905 p = (unsigned char *) end;
12906 }
071436c6 12907 printf ("\"\n");
f6f0e17b
NC
12908 }
12909 else
12910 {
12911 unsigned int len;
12912
12913 val = read_uleb128 (p, &len, end);
12914 p += len;
12915 printf ("%ld (0x%lx)\n", val, val);
12916 }
12917
4082ef84 12918 assert (p <= end);
f6f0e17b
NC
12919 return p;
12920}
12921
11c1ff18
PB
12922/* ARM EABI attributes section. */
12923typedef struct
12924{
70e99720 12925 unsigned int tag;
2cf0635d 12926 const char * name;
11c1ff18 12927 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
70e99720 12928 unsigned int type;
2cf0635d 12929 const char ** table;
11c1ff18
PB
12930} arm_attr_public_tag;
12931
2cf0635d 12932static const char * arm_attr_tag_CPU_arch[] =
11c1ff18 12933 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
ff8646ee
TP
12934 "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "", "v8-M.baseline",
12935 "v8-M.mainline"};
2cf0635d
NC
12936static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
12937static const char * arm_attr_tag_THUMB_ISA_use[] =
4ed7ed8d 12938 {"No", "Thumb-1", "Thumb-2", "Yes"};
75375b3e 12939static const char * arm_attr_tag_FP_arch[] =
bca38921 12940 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
a715796b 12941 "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
2cf0635d 12942static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
dd24e3da 12943static const char * arm_attr_tag_Advanced_SIMD_arch[] =
9411fd44
MW
12944 {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
12945 "NEON for ARMv8.1"};
2cf0635d 12946static const char * arm_attr_tag_PCS_config[] =
11c1ff18
PB
12947 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
12948 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
2cf0635d 12949static const char * arm_attr_tag_ABI_PCS_R9_use[] =
11c1ff18 12950 {"V6", "SB", "TLS", "Unused"};
2cf0635d 12951static const char * arm_attr_tag_ABI_PCS_RW_data[] =
11c1ff18 12952 {"Absolute", "PC-relative", "SB-relative", "None"};
2cf0635d 12953static const char * arm_attr_tag_ABI_PCS_RO_data[] =
11c1ff18 12954 {"Absolute", "PC-relative", "None"};
2cf0635d 12955static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
11c1ff18 12956 {"None", "direct", "GOT-indirect"};
2cf0635d 12957static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
11c1ff18 12958 {"None", "??? 1", "2", "??? 3", "4"};
2cf0635d
NC
12959static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
12960static const char * arm_attr_tag_ABI_FP_denormal[] =
f5f53991 12961 {"Unused", "Needed", "Sign only"};
2cf0635d
NC
12962static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
12963static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
12964static const char * arm_attr_tag_ABI_FP_number_model[] =
11c1ff18 12965 {"Unused", "Finite", "RTABI", "IEEE 754"};
2cf0635d 12966static const char * arm_attr_tag_ABI_enum_size[] =
11c1ff18 12967 {"Unused", "small", "int", "forced to int"};
2cf0635d 12968static const char * arm_attr_tag_ABI_HardFP_use[] =
99654aaf 12969 {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
2cf0635d 12970static const char * arm_attr_tag_ABI_VFP_args[] =
5c294fee 12971 {"AAPCS", "VFP registers", "custom", "compatible"};
2cf0635d 12972static const char * arm_attr_tag_ABI_WMMX_args[] =
11c1ff18 12973 {"AAPCS", "WMMX registers", "custom"};
2cf0635d 12974static const char * arm_attr_tag_ABI_optimization_goals[] =
11c1ff18
PB
12975 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
12976 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
2cf0635d 12977static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
11c1ff18
PB
12978 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
12979 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
2cf0635d 12980static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
75375b3e 12981static const char * arm_attr_tag_FP_HP_extension[] =
8e79c3df 12982 {"Not Allowed", "Allowed"};
2cf0635d 12983static const char * arm_attr_tag_ABI_FP_16bit_format[] =
8e79c3df 12984 {"None", "IEEE 754", "Alternative Format"};
15afaa63
TP
12985static const char * arm_attr_tag_DSP_extension[] =
12986 {"Follow architecture", "Allowed"};
dd24e3da 12987static const char * arm_attr_tag_MPextension_use[] =
cd21e546
MGD
12988 {"Not Allowed", "Allowed"};
12989static const char * arm_attr_tag_DIV_use[] =
dd24e3da 12990 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
cd21e546 12991 "Allowed in v7-A with integer division extension"};
2cf0635d
NC
12992static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
12993static const char * arm_attr_tag_Virtualization_use[] =
dd24e3da 12994 {"Not Allowed", "TrustZone", "Virtualization Extensions",
cd21e546 12995 "TrustZone and Virtualization Extensions"};
dd24e3da 12996static const char * arm_attr_tag_MPextension_use_legacy[] =
f5f53991 12997 {"Not Allowed", "Allowed"};
11c1ff18
PB
12998
12999#define LOOKUP(id, name) \
13000 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
d70c5fc7 13001static arm_attr_public_tag arm_attr_public_tags[] =
11c1ff18
PB
13002{
13003 {4, "CPU_raw_name", 1, NULL},
13004 {5, "CPU_name", 1, NULL},
13005 LOOKUP(6, CPU_arch),
13006 {7, "CPU_arch_profile", 0, NULL},
13007 LOOKUP(8, ARM_ISA_use),
13008 LOOKUP(9, THUMB_ISA_use),
75375b3e 13009 LOOKUP(10, FP_arch),
11c1ff18 13010 LOOKUP(11, WMMX_arch),
f5f53991
AS
13011 LOOKUP(12, Advanced_SIMD_arch),
13012 LOOKUP(13, PCS_config),
11c1ff18
PB
13013 LOOKUP(14, ABI_PCS_R9_use),
13014 LOOKUP(15, ABI_PCS_RW_data),
f5f53991 13015 LOOKUP(16, ABI_PCS_RO_data),
11c1ff18
PB
13016 LOOKUP(17, ABI_PCS_GOT_use),
13017 LOOKUP(18, ABI_PCS_wchar_t),
13018 LOOKUP(19, ABI_FP_rounding),
13019 LOOKUP(20, ABI_FP_denormal),
13020 LOOKUP(21, ABI_FP_exceptions),
13021 LOOKUP(22, ABI_FP_user_exceptions),
13022 LOOKUP(23, ABI_FP_number_model),
75375b3e
MGD
13023 {24, "ABI_align_needed", 0, NULL},
13024 {25, "ABI_align_preserved", 0, NULL},
11c1ff18
PB
13025 LOOKUP(26, ABI_enum_size),
13026 LOOKUP(27, ABI_HardFP_use),
13027 LOOKUP(28, ABI_VFP_args),
13028 LOOKUP(29, ABI_WMMX_args),
13029 LOOKUP(30, ABI_optimization_goals),
13030 LOOKUP(31, ABI_FP_optimization_goals),
8e79c3df 13031 {32, "compatibility", 0, NULL},
f5f53991 13032 LOOKUP(34, CPU_unaligned_access),
75375b3e 13033 LOOKUP(36, FP_HP_extension),
8e79c3df 13034 LOOKUP(38, ABI_FP_16bit_format),
cd21e546
MGD
13035 LOOKUP(42, MPextension_use),
13036 LOOKUP(44, DIV_use),
15afaa63 13037 LOOKUP(46, DSP_extension),
f5f53991
AS
13038 {64, "nodefaults", 0, NULL},
13039 {65, "also_compatible_with", 0, NULL},
13040 LOOKUP(66, T2EE_use),
13041 {67, "conformance", 1, NULL},
13042 LOOKUP(68, Virtualization_use),
cd21e546 13043 LOOKUP(70, MPextension_use_legacy)
11c1ff18
PB
13044};
13045#undef LOOKUP
13046
11c1ff18 13047static unsigned char *
f6f0e17b
NC
13048display_arm_attribute (unsigned char * p,
13049 const unsigned char * const end)
11c1ff18 13050{
70e99720 13051 unsigned int tag;
11c1ff18 13052 unsigned int len;
70e99720 13053 unsigned int val;
2cf0635d 13054 arm_attr_public_tag * attr;
11c1ff18 13055 unsigned i;
70e99720 13056 unsigned int type;
11c1ff18 13057
f6f0e17b 13058 tag = read_uleb128 (p, &len, end);
11c1ff18
PB
13059 p += len;
13060 attr = NULL;
2cf0635d 13061 for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
11c1ff18
PB
13062 {
13063 if (arm_attr_public_tags[i].tag == tag)
13064 {
13065 attr = &arm_attr_public_tags[i];
13066 break;
13067 }
13068 }
13069
13070 if (attr)
13071 {
13072 printf (" Tag_%s: ", attr->name);
13073 switch (attr->type)
13074 {
13075 case 0:
13076 switch (tag)
13077 {
13078 case 7: /* Tag_CPU_arch_profile. */
f6f0e17b 13079 val = read_uleb128 (p, &len, end);
11c1ff18
PB
13080 p += len;
13081 switch (val)
13082 {
2b692964
NC
13083 case 0: printf (_("None\n")); break;
13084 case 'A': printf (_("Application\n")); break;
13085 case 'R': printf (_("Realtime\n")); break;
13086 case 'M': printf (_("Microcontroller\n")); break;
13087 case 'S': printf (_("Application or Realtime\n")); break;
11c1ff18
PB
13088 default: printf ("??? (%d)\n", val); break;
13089 }
13090 break;
13091
75375b3e 13092 case 24: /* Tag_align_needed. */
f6f0e17b 13093 val = read_uleb128 (p, &len, end);
75375b3e
MGD
13094 p += len;
13095 switch (val)
13096 {
2b692964
NC
13097 case 0: printf (_("None\n")); break;
13098 case 1: printf (_("8-byte\n")); break;
13099 case 2: printf (_("4-byte\n")); break;
75375b3e
MGD
13100 case 3: printf ("??? 3\n"); break;
13101 default:
13102 if (val <= 12)
dd24e3da 13103 printf (_("8-byte and up to %d-byte extended\n"),
75375b3e
MGD
13104 1 << val);
13105 else
13106 printf ("??? (%d)\n", val);
13107 break;
13108 }
13109 break;
13110
13111 case 25: /* Tag_align_preserved. */
f6f0e17b 13112 val = read_uleb128 (p, &len, end);
75375b3e
MGD
13113 p += len;
13114 switch (val)
13115 {
2b692964
NC
13116 case 0: printf (_("None\n")); break;
13117 case 1: printf (_("8-byte, except leaf SP\n")); break;
13118 case 2: printf (_("8-byte\n")); break;
75375b3e
MGD
13119 case 3: printf ("??? 3\n"); break;
13120 default:
13121 if (val <= 12)
dd24e3da 13122 printf (_("8-byte and up to %d-byte extended\n"),
75375b3e
MGD
13123 1 << val);
13124 else
13125 printf ("??? (%d)\n", val);
13126 break;
13127 }
13128 break;
13129
11c1ff18 13130 case 32: /* Tag_compatibility. */
071436c6 13131 {
071436c6
NC
13132 val = read_uleb128 (p, &len, end);
13133 p += len;
071436c6 13134 printf (_("flag = %d, vendor = "), val);
4082ef84
NC
13135 if (p < end - 1)
13136 {
13137 size_t maxlen = (end - p) - 1;
13138
13139 print_symbol ((int) maxlen, (const char *) p);
13140 p += strnlen ((char *) p, maxlen) + 1;
13141 }
13142 else
13143 {
13144 printf (_("<corrupt>"));
13145 p = (unsigned char *) end;
13146 }
071436c6 13147 putchar ('\n');
071436c6 13148 }
11c1ff18
PB
13149 break;
13150
f5f53991 13151 case 64: /* Tag_nodefaults. */
541a3cbd
NC
13152 /* PR 17531: file: 001-505008-0.01. */
13153 if (p < end)
13154 p++;
2b692964 13155 printf (_("True\n"));
f5f53991
AS
13156 break;
13157
13158 case 65: /* Tag_also_compatible_with. */
f6f0e17b 13159 val = read_uleb128 (p, &len, end);
f5f53991
AS
13160 p += len;
13161 if (val == 6 /* Tag_CPU_arch. */)
13162 {
f6f0e17b 13163 val = read_uleb128 (p, &len, end);
f5f53991 13164 p += len;
071436c6 13165 if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
f5f53991
AS
13166 printf ("??? (%d)\n", val);
13167 else
13168 printf ("%s\n", arm_attr_tag_CPU_arch[val]);
13169 }
13170 else
13171 printf ("???\n");
071436c6
NC
13172 while (p < end && *(p++) != '\0' /* NUL terminator. */)
13173 ;
f5f53991
AS
13174 break;
13175
11c1ff18 13176 default:
bee0ee85
NC
13177 printf (_("<unknown: %d>\n"), tag);
13178 break;
11c1ff18
PB
13179 }
13180 return p;
13181
13182 case 1:
f6f0e17b 13183 return display_tag_value (-1, p, end);
11c1ff18 13184 case 2:
f6f0e17b 13185 return display_tag_value (0, p, end);
11c1ff18
PB
13186
13187 default:
13188 assert (attr->type & 0x80);
f6f0e17b 13189 val = read_uleb128 (p, &len, end);
11c1ff18
PB
13190 p += len;
13191 type = attr->type & 0x7f;
13192 if (val >= type)
13193 printf ("??? (%d)\n", val);
13194 else
13195 printf ("%s\n", attr->table[val]);
13196 return p;
13197 }
13198 }
11c1ff18 13199
f6f0e17b 13200 return display_tag_value (tag, p, end);
11c1ff18
PB
13201}
13202
104d59d1 13203static unsigned char *
60bca95a 13204display_gnu_attribute (unsigned char * p,
f6f0e17b
NC
13205 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const),
13206 const unsigned char * const end)
104d59d1
JM
13207{
13208 int tag;
13209 unsigned int len;
13210 int val;
104d59d1 13211
f6f0e17b 13212 tag = read_uleb128 (p, &len, end);
104d59d1
JM
13213 p += len;
13214
13215 /* Tag_compatibility is the only generic GNU attribute defined at
13216 present. */
13217 if (tag == 32)
13218 {
f6f0e17b 13219 val = read_uleb128 (p, &len, end);
104d59d1 13220 p += len;
071436c6
NC
13221
13222 printf (_("flag = %d, vendor = "), val);
f6f0e17b
NC
13223 if (p == end)
13224 {
071436c6 13225 printf (_("<corrupt>\n"));
f6f0e17b
NC
13226 warn (_("corrupt vendor attribute\n"));
13227 }
13228 else
13229 {
4082ef84
NC
13230 if (p < end - 1)
13231 {
13232 size_t maxlen = (end - p) - 1;
071436c6 13233
4082ef84
NC
13234 print_symbol ((int) maxlen, (const char *) p);
13235 p += strnlen ((char *) p, maxlen) + 1;
13236 }
13237 else
13238 {
13239 printf (_("<corrupt>"));
13240 p = (unsigned char *) end;
13241 }
071436c6 13242 putchar ('\n');
f6f0e17b 13243 }
104d59d1
JM
13244 return p;
13245 }
13246
13247 if ((tag & 2) == 0 && display_proc_gnu_attribute)
f6f0e17b 13248 return display_proc_gnu_attribute (p, tag, end);
104d59d1 13249
f6f0e17b 13250 return display_tag_value (tag, p, end);
104d59d1
JM
13251}
13252
34c8bcba 13253static unsigned char *
f6f0e17b
NC
13254display_power_gnu_attribute (unsigned char * p,
13255 int tag,
13256 const unsigned char * const end)
34c8bcba 13257{
34c8bcba
JM
13258 unsigned int len;
13259 int val;
13260
13261 if (tag == Tag_GNU_Power_ABI_FP)
13262 {
f6f0e17b 13263 val = read_uleb128 (p, &len, end);
34c8bcba
JM
13264 p += len;
13265 printf (" Tag_GNU_Power_ABI_FP: ");
60bca95a 13266
34c8bcba
JM
13267 switch (val)
13268 {
13269 case 0:
2b692964 13270 printf (_("Hard or soft float\n"));
34c8bcba
JM
13271 break;
13272 case 1:
2b692964 13273 printf (_("Hard float\n"));
34c8bcba
JM
13274 break;
13275 case 2:
2b692964 13276 printf (_("Soft float\n"));
34c8bcba 13277 break;
3c7b9897 13278 case 3:
2b692964 13279 printf (_("Single-precision hard float\n"));
3c7b9897 13280 break;
34c8bcba
JM
13281 default:
13282 printf ("??? (%d)\n", val);
13283 break;
13284 }
13285 return p;
13286 }
13287
c6e65352
DJ
13288 if (tag == Tag_GNU_Power_ABI_Vector)
13289 {
f6f0e17b 13290 val = read_uleb128 (p, &len, end);
c6e65352
DJ
13291 p += len;
13292 printf (" Tag_GNU_Power_ABI_Vector: ");
13293 switch (val)
13294 {
13295 case 0:
2b692964 13296 printf (_("Any\n"));
c6e65352
DJ
13297 break;
13298 case 1:
2b692964 13299 printf (_("Generic\n"));
c6e65352
DJ
13300 break;
13301 case 2:
13302 printf ("AltiVec\n");
13303 break;
13304 case 3:
13305 printf ("SPE\n");
13306 break;
13307 default:
13308 printf ("??? (%d)\n", val);
13309 break;
13310 }
13311 return p;
13312 }
13313
f82e0623
NF
13314 if (tag == Tag_GNU_Power_ABI_Struct_Return)
13315 {
f6f0e17b
NC
13316 if (p == end)
13317 {
071436c6 13318 warn (_("corrupt Tag_GNU_Power_ABI_Struct_Return\n"));
f6f0e17b
NC
13319 return p;
13320 }
0b4362b0 13321
f6f0e17b 13322 val = read_uleb128 (p, &len, end);
f82e0623
NF
13323 p += len;
13324 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
13325 switch (val)
13326 {
13327 case 0:
2b692964 13328 printf (_("Any\n"));
f82e0623
NF
13329 break;
13330 case 1:
13331 printf ("r3/r4\n");
13332 break;
13333 case 2:
2b692964 13334 printf (_("Memory\n"));
f82e0623
NF
13335 break;
13336 default:
13337 printf ("??? (%d)\n", val);
13338 break;
13339 }
13340 return p;
13341 }
13342
f6f0e17b 13343 return display_tag_value (tag & 1, p, end);
34c8bcba
JM
13344}
13345
643f7afb
AK
13346static unsigned char *
13347display_s390_gnu_attribute (unsigned char * p,
13348 int tag,
13349 const unsigned char * const end)
13350{
13351 unsigned int len;
13352 int val;
13353
13354 if (tag == Tag_GNU_S390_ABI_Vector)
13355 {
13356 val = read_uleb128 (p, &len, end);
13357 p += len;
13358 printf (" Tag_GNU_S390_ABI_Vector: ");
13359
13360 switch (val)
13361 {
13362 case 0:
13363 printf (_("any\n"));
13364 break;
13365 case 1:
13366 printf (_("software\n"));
13367 break;
13368 case 2:
13369 printf (_("hardware\n"));
13370 break;
13371 default:
13372 printf ("??? (%d)\n", val);
13373 break;
13374 }
13375 return p;
13376 }
13377
13378 return display_tag_value (tag & 1, p, end);
13379}
13380
9e8c70f9
DM
13381static void
13382display_sparc_hwcaps (int mask)
13383{
13384 if (mask)
13385 {
13386 int first = 1;
071436c6 13387
9e8c70f9
DM
13388 if (mask & ELF_SPARC_HWCAP_MUL32)
13389 fputs ("mul32", stdout), first = 0;
13390 if (mask & ELF_SPARC_HWCAP_DIV32)
13391 printf ("%sdiv32", first ? "" : "|"), first = 0;
13392 if (mask & ELF_SPARC_HWCAP_FSMULD)
13393 printf ("%sfsmuld", first ? "" : "|"), first = 0;
13394 if (mask & ELF_SPARC_HWCAP_V8PLUS)
13395 printf ("%sv8plus", first ? "" : "|"), first = 0;
13396 if (mask & ELF_SPARC_HWCAP_POPC)
13397 printf ("%spopc", first ? "" : "|"), first = 0;
13398 if (mask & ELF_SPARC_HWCAP_VIS)
13399 printf ("%svis", first ? "" : "|"), first = 0;
13400 if (mask & ELF_SPARC_HWCAP_VIS2)
13401 printf ("%svis2", first ? "" : "|"), first = 0;
13402 if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
13403 printf ("%sASIBlkInit", first ? "" : "|"), first = 0;
13404 if (mask & ELF_SPARC_HWCAP_FMAF)
13405 printf ("%sfmaf", first ? "" : "|"), first = 0;
13406 if (mask & ELF_SPARC_HWCAP_VIS3)
13407 printf ("%svis3", first ? "" : "|"), first = 0;
13408 if (mask & ELF_SPARC_HWCAP_HPC)
13409 printf ("%shpc", first ? "" : "|"), first = 0;
13410 if (mask & ELF_SPARC_HWCAP_RANDOM)
13411 printf ("%srandom", first ? "" : "|"), first = 0;
13412 if (mask & ELF_SPARC_HWCAP_TRANS)
13413 printf ("%strans", first ? "" : "|"), first = 0;
13414 if (mask & ELF_SPARC_HWCAP_FJFMAU)
13415 printf ("%sfjfmau", first ? "" : "|"), first = 0;
13416 if (mask & ELF_SPARC_HWCAP_IMA)
13417 printf ("%sima", first ? "" : "|"), first = 0;
13418 if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
13419 printf ("%scspare", first ? "" : "|"), first = 0;
13420 }
13421 else
071436c6
NC
13422 fputc ('0', stdout);
13423 fputc ('\n', stdout);
9e8c70f9
DM
13424}
13425
3d68f91c
JM
13426static void
13427display_sparc_hwcaps2 (int mask)
13428{
13429 if (mask)
13430 {
13431 int first = 1;
071436c6 13432
3d68f91c
JM
13433 if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
13434 fputs ("fjathplus", stdout), first = 0;
13435 if (mask & ELF_SPARC_HWCAP2_VIS3B)
13436 printf ("%svis3b", first ? "" : "|"), first = 0;
13437 if (mask & ELF_SPARC_HWCAP2_ADP)
13438 printf ("%sadp", first ? "" : "|"), first = 0;
13439 if (mask & ELF_SPARC_HWCAP2_SPARC5)
13440 printf ("%ssparc5", first ? "" : "|"), first = 0;
13441 if (mask & ELF_SPARC_HWCAP2_MWAIT)
13442 printf ("%smwait", first ? "" : "|"), first = 0;
13443 if (mask & ELF_SPARC_HWCAP2_XMPMUL)
13444 printf ("%sxmpmul", first ? "" : "|"), first = 0;
13445 if (mask & ELF_SPARC_HWCAP2_XMONT)
13446 printf ("%sxmont2", first ? "" : "|"), first = 0;
13447 if (mask & ELF_SPARC_HWCAP2_NSEC)
13448 printf ("%snsec", first ? "" : "|"), first = 0;
13449 if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
13450 printf ("%sfjathhpc", first ? "" : "|"), first = 0;
13451 if (mask & ELF_SPARC_HWCAP2_FJDES)
13452 printf ("%sfjdes", first ? "" : "|"), first = 0;
13453 if (mask & ELF_SPARC_HWCAP2_FJAES)
13454 printf ("%sfjaes", first ? "" : "|"), first = 0;
13455 }
13456 else
071436c6
NC
13457 fputc ('0', stdout);
13458 fputc ('\n', stdout);
3d68f91c
JM
13459}
13460
9e8c70f9 13461static unsigned char *
f6f0e17b
NC
13462display_sparc_gnu_attribute (unsigned char * p,
13463 int tag,
13464 const unsigned char * const end)
9e8c70f9 13465{
3d68f91c
JM
13466 unsigned int len;
13467 int val;
13468
9e8c70f9
DM
13469 if (tag == Tag_GNU_Sparc_HWCAPS)
13470 {
f6f0e17b 13471 val = read_uleb128 (p, &len, end);
9e8c70f9
DM
13472 p += len;
13473 printf (" Tag_GNU_Sparc_HWCAPS: ");
9e8c70f9
DM
13474 display_sparc_hwcaps (val);
13475 return p;
3d68f91c
JM
13476 }
13477 if (tag == Tag_GNU_Sparc_HWCAPS2)
13478 {
13479 val = read_uleb128 (p, &len, end);
13480 p += len;
13481 printf (" Tag_GNU_Sparc_HWCAPS2: ");
13482 display_sparc_hwcaps2 (val);
13483 return p;
13484 }
9e8c70f9 13485
f6f0e17b 13486 return display_tag_value (tag, p, end);
9e8c70f9
DM
13487}
13488
351cdf24
MF
13489static void
13490print_mips_fp_abi_value (int val)
13491{
13492 switch (val)
13493 {
13494 case Val_GNU_MIPS_ABI_FP_ANY:
13495 printf (_("Hard or soft float\n"));
13496 break;
13497 case Val_GNU_MIPS_ABI_FP_DOUBLE:
13498 printf (_("Hard float (double precision)\n"));
13499 break;
13500 case Val_GNU_MIPS_ABI_FP_SINGLE:
13501 printf (_("Hard float (single precision)\n"));
13502 break;
13503 case Val_GNU_MIPS_ABI_FP_SOFT:
13504 printf (_("Soft float\n"));
13505 break;
13506 case Val_GNU_MIPS_ABI_FP_OLD_64:
13507 printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
13508 break;
13509 case Val_GNU_MIPS_ABI_FP_XX:
13510 printf (_("Hard float (32-bit CPU, Any FPU)\n"));
13511 break;
13512 case Val_GNU_MIPS_ABI_FP_64:
13513 printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
13514 break;
13515 case Val_GNU_MIPS_ABI_FP_64A:
13516 printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
13517 break;
3350cc01
CM
13518 case Val_GNU_MIPS_ABI_FP_NAN2008:
13519 printf (_("NaN 2008 compatibility\n"));
13520 break;
351cdf24
MF
13521 default:
13522 printf ("??? (%d)\n", val);
13523 break;
13524 }
13525}
13526
2cf19d5c 13527static unsigned char *
f6f0e17b
NC
13528display_mips_gnu_attribute (unsigned char * p,
13529 int tag,
13530 const unsigned char * const end)
2cf19d5c 13531{
2cf19d5c
JM
13532 if (tag == Tag_GNU_MIPS_ABI_FP)
13533 {
f6f0e17b
NC
13534 unsigned int len;
13535 int val;
13536
13537 val = read_uleb128 (p, &len, end);
2cf19d5c
JM
13538 p += len;
13539 printf (" Tag_GNU_MIPS_ABI_FP: ");
60bca95a 13540
351cdf24
MF
13541 print_mips_fp_abi_value (val);
13542
2cf19d5c
JM
13543 return p;
13544 }
13545
a9f58168
CF
13546 if (tag == Tag_GNU_MIPS_ABI_MSA)
13547 {
13548 unsigned int len;
13549 int val;
13550
13551 val = read_uleb128 (p, &len, end);
13552 p += len;
13553 printf (" Tag_GNU_MIPS_ABI_MSA: ");
13554
13555 switch (val)
13556 {
13557 case Val_GNU_MIPS_ABI_MSA_ANY:
13558 printf (_("Any MSA or not\n"));
13559 break;
13560 case Val_GNU_MIPS_ABI_MSA_128:
13561 printf (_("128-bit MSA\n"));
13562 break;
13563 default:
13564 printf ("??? (%d)\n", val);
13565 break;
13566 }
13567 return p;
13568 }
13569
f6f0e17b 13570 return display_tag_value (tag & 1, p, end);
2cf19d5c
JM
13571}
13572
59e6276b 13573static unsigned char *
f6f0e17b
NC
13574display_tic6x_attribute (unsigned char * p,
13575 const unsigned char * const end)
59e6276b
JM
13576{
13577 int tag;
13578 unsigned int len;
13579 int val;
13580
f6f0e17b 13581 tag = read_uleb128 (p, &len, end);
59e6276b
JM
13582 p += len;
13583
13584 switch (tag)
13585 {
75fa6dc1 13586 case Tag_ISA:
f6f0e17b 13587 val = read_uleb128 (p, &len, end);
59e6276b 13588 p += len;
75fa6dc1 13589 printf (" Tag_ISA: ");
59e6276b
JM
13590
13591 switch (val)
13592 {
75fa6dc1 13593 case C6XABI_Tag_ISA_none:
59e6276b
JM
13594 printf (_("None\n"));
13595 break;
75fa6dc1 13596 case C6XABI_Tag_ISA_C62X:
59e6276b
JM
13597 printf ("C62x\n");
13598 break;
75fa6dc1 13599 case C6XABI_Tag_ISA_C67X:
59e6276b
JM
13600 printf ("C67x\n");
13601 break;
75fa6dc1 13602 case C6XABI_Tag_ISA_C67XP:
59e6276b
JM
13603 printf ("C67x+\n");
13604 break;
75fa6dc1 13605 case C6XABI_Tag_ISA_C64X:
59e6276b
JM
13606 printf ("C64x\n");
13607 break;
75fa6dc1 13608 case C6XABI_Tag_ISA_C64XP:
59e6276b
JM
13609 printf ("C64x+\n");
13610 break;
75fa6dc1 13611 case C6XABI_Tag_ISA_C674X:
59e6276b
JM
13612 printf ("C674x\n");
13613 break;
13614 default:
13615 printf ("??? (%d)\n", val);
13616 break;
13617 }
13618 return p;
13619
87779176 13620 case Tag_ABI_wchar_t:
f6f0e17b 13621 val = read_uleb128 (p, &len, end);
87779176
JM
13622 p += len;
13623 printf (" Tag_ABI_wchar_t: ");
13624 switch (val)
13625 {
13626 case 0:
13627 printf (_("Not used\n"));
13628 break;
13629 case 1:
13630 printf (_("2 bytes\n"));
13631 break;
13632 case 2:
13633 printf (_("4 bytes\n"));
13634 break;
13635 default:
13636 printf ("??? (%d)\n", val);
13637 break;
13638 }
13639 return p;
13640
13641 case Tag_ABI_stack_align_needed:
f6f0e17b 13642 val = read_uleb128 (p, &len, end);
87779176
JM
13643 p += len;
13644 printf (" Tag_ABI_stack_align_needed: ");
13645 switch (val)
13646 {
13647 case 0:
13648 printf (_("8-byte\n"));
13649 break;
13650 case 1:
13651 printf (_("16-byte\n"));
13652 break;
13653 default:
13654 printf ("??? (%d)\n", val);
13655 break;
13656 }
13657 return p;
13658
13659 case Tag_ABI_stack_align_preserved:
f6f0e17b 13660 val = read_uleb128 (p, &len, end);
87779176
JM
13661 p += len;
13662 printf (" Tag_ABI_stack_align_preserved: ");
13663 switch (val)
13664 {
13665 case 0:
13666 printf (_("8-byte\n"));
13667 break;
13668 case 1:
13669 printf (_("16-byte\n"));
13670 break;
13671 default:
13672 printf ("??? (%d)\n", val);
13673 break;
13674 }
13675 return p;
13676
b5593623 13677 case Tag_ABI_DSBT:
f6f0e17b 13678 val = read_uleb128 (p, &len, end);
b5593623
JM
13679 p += len;
13680 printf (" Tag_ABI_DSBT: ");
13681 switch (val)
13682 {
13683 case 0:
13684 printf (_("DSBT addressing not used\n"));
13685 break;
13686 case 1:
13687 printf (_("DSBT addressing used\n"));
13688 break;
13689 default:
13690 printf ("??? (%d)\n", val);
13691 break;
13692 }
13693 return p;
13694
87779176 13695 case Tag_ABI_PID:
f6f0e17b 13696 val = read_uleb128 (p, &len, end);
87779176
JM
13697 p += len;
13698 printf (" Tag_ABI_PID: ");
13699 switch (val)
13700 {
13701 case 0:
13702 printf (_("Data addressing position-dependent\n"));
13703 break;
13704 case 1:
13705 printf (_("Data addressing position-independent, GOT near DP\n"));
13706 break;
13707 case 2:
13708 printf (_("Data addressing position-independent, GOT far from DP\n"));
13709 break;
13710 default:
13711 printf ("??? (%d)\n", val);
13712 break;
13713 }
13714 return p;
13715
13716 case Tag_ABI_PIC:
f6f0e17b 13717 val = read_uleb128 (p, &len, end);
87779176
JM
13718 p += len;
13719 printf (" Tag_ABI_PIC: ");
13720 switch (val)
13721 {
13722 case 0:
13723 printf (_("Code addressing position-dependent\n"));
13724 break;
13725 case 1:
13726 printf (_("Code addressing position-independent\n"));
13727 break;
13728 default:
13729 printf ("??? (%d)\n", val);
13730 break;
13731 }
13732 return p;
13733
13734 case Tag_ABI_array_object_alignment:
f6f0e17b 13735 val = read_uleb128 (p, &len, end);
87779176
JM
13736 p += len;
13737 printf (" Tag_ABI_array_object_alignment: ");
13738 switch (val)
13739 {
13740 case 0:
13741 printf (_("8-byte\n"));
13742 break;
13743 case 1:
13744 printf (_("4-byte\n"));
13745 break;
13746 case 2:
13747 printf (_("16-byte\n"));
13748 break;
13749 default:
13750 printf ("??? (%d)\n", val);
13751 break;
13752 }
13753 return p;
13754
13755 case Tag_ABI_array_object_align_expected:
f6f0e17b 13756 val = read_uleb128 (p, &len, end);
87779176
JM
13757 p += len;
13758 printf (" Tag_ABI_array_object_align_expected: ");
13759 switch (val)
13760 {
13761 case 0:
13762 printf (_("8-byte\n"));
13763 break;
13764 case 1:
13765 printf (_("4-byte\n"));
13766 break;
13767 case 2:
13768 printf (_("16-byte\n"));
13769 break;
13770 default:
13771 printf ("??? (%d)\n", val);
13772 break;
13773 }
13774 return p;
13775
3cbd1c06 13776 case Tag_ABI_compatibility:
071436c6 13777 {
071436c6
NC
13778 val = read_uleb128 (p, &len, end);
13779 p += len;
13780 printf (" Tag_ABI_compatibility: ");
071436c6 13781 printf (_("flag = %d, vendor = "), val);
4082ef84
NC
13782 if (p < end - 1)
13783 {
13784 size_t maxlen = (end - p) - 1;
13785
13786 print_symbol ((int) maxlen, (const char *) p);
13787 p += strnlen ((char *) p, maxlen) + 1;
13788 }
13789 else
13790 {
13791 printf (_("<corrupt>"));
13792 p = (unsigned char *) end;
13793 }
071436c6 13794 putchar ('\n');
071436c6
NC
13795 return p;
13796 }
87779176
JM
13797
13798 case Tag_ABI_conformance:
071436c6 13799 {
4082ef84
NC
13800 printf (" Tag_ABI_conformance: \"");
13801 if (p < end - 1)
13802 {
13803 size_t maxlen = (end - p) - 1;
071436c6 13804
4082ef84
NC
13805 print_symbol ((int) maxlen, (const char *) p);
13806 p += strnlen ((char *) p, maxlen) + 1;
13807 }
13808 else
13809 {
13810 printf (_("<corrupt>"));
13811 p = (unsigned char *) end;
13812 }
071436c6 13813 printf ("\"\n");
071436c6
NC
13814 return p;
13815 }
59e6276b
JM
13816 }
13817
f6f0e17b
NC
13818 return display_tag_value (tag, p, end);
13819}
59e6276b 13820
f6f0e17b
NC
13821static void
13822display_raw_attribute (unsigned char * p, unsigned char * end)
13823{
13824 unsigned long addr = 0;
13825 size_t bytes = end - p;
13826
e0a31db1 13827 assert (end > p);
f6f0e17b 13828 while (bytes)
87779176 13829 {
f6f0e17b
NC
13830 int j;
13831 int k;
13832 int lbytes = (bytes > 16 ? 16 : bytes);
13833
13834 printf (" 0x%8.8lx ", addr);
13835
13836 for (j = 0; j < 16; j++)
13837 {
13838 if (j < lbytes)
13839 printf ("%2.2x", p[j]);
13840 else
13841 printf (" ");
13842
13843 if ((j & 3) == 3)
13844 printf (" ");
13845 }
13846
13847 for (j = 0; j < lbytes; j++)
13848 {
13849 k = p[j];
13850 if (k >= ' ' && k < 0x7f)
13851 printf ("%c", k);
13852 else
13853 printf (".");
13854 }
13855
13856 putchar ('\n');
13857
13858 p += lbytes;
13859 bytes -= lbytes;
13860 addr += lbytes;
87779176 13861 }
59e6276b 13862
f6f0e17b 13863 putchar ('\n');
59e6276b
JM
13864}
13865
13761a11
NC
13866static unsigned char *
13867display_msp430x_attribute (unsigned char * p,
13868 const unsigned char * const end)
13869{
13870 unsigned int len;
13871 int val;
13872 int tag;
13873
13874 tag = read_uleb128 (p, & len, end);
13875 p += len;
0b4362b0 13876
13761a11
NC
13877 switch (tag)
13878 {
13879 case OFBA_MSPABI_Tag_ISA:
13880 val = read_uleb128 (p, &len, end);
13881 p += len;
13882 printf (" Tag_ISA: ");
13883 switch (val)
13884 {
13885 case 0: printf (_("None\n")); break;
13886 case 1: printf (_("MSP430\n")); break;
13887 case 2: printf (_("MSP430X\n")); break;
13888 default: printf ("??? (%d)\n", val); break;
13889 }
13890 break;
13891
13892 case OFBA_MSPABI_Tag_Code_Model:
13893 val = read_uleb128 (p, &len, end);
13894 p += len;
13895 printf (" Tag_Code_Model: ");
13896 switch (val)
13897 {
13898 case 0: printf (_("None\n")); break;
13899 case 1: printf (_("Small\n")); break;
13900 case 2: printf (_("Large\n")); break;
13901 default: printf ("??? (%d)\n", val); break;
13902 }
13903 break;
13904
13905 case OFBA_MSPABI_Tag_Data_Model:
13906 val = read_uleb128 (p, &len, end);
13907 p += len;
13908 printf (" Tag_Data_Model: ");
13909 switch (val)
13910 {
13911 case 0: printf (_("None\n")); break;
13912 case 1: printf (_("Small\n")); break;
13913 case 2: printf (_("Large\n")); break;
13914 case 3: printf (_("Restricted Large\n")); break;
13915 default: printf ("??? (%d)\n", val); break;
13916 }
13917 break;
13918
13919 default:
13920 printf (_(" <unknown tag %d>: "), tag);
13921
13922 if (tag & 1)
13923 {
071436c6 13924 putchar ('"');
4082ef84
NC
13925 if (p < end - 1)
13926 {
13927 size_t maxlen = (end - p) - 1;
13928
13929 print_symbol ((int) maxlen, (const char *) p);
13930 p += strnlen ((char *) p, maxlen) + 1;
13931 }
13932 else
13933 {
13934 printf (_("<corrupt>"));
13935 p = (unsigned char *) end;
13936 }
071436c6 13937 printf ("\"\n");
13761a11
NC
13938 }
13939 else
13940 {
13941 val = read_uleb128 (p, &len, end);
13942 p += len;
13943 printf ("%d (0x%x)\n", val, val);
13944 }
13945 break;
13946 }
13947
4082ef84 13948 assert (p <= end);
13761a11
NC
13949 return p;
13950}
13951
11c1ff18 13952static int
60bca95a
NC
13953process_attributes (FILE * file,
13954 const char * public_name,
104d59d1 13955 unsigned int proc_type,
f6f0e17b
NC
13956 unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
13957 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const))
11c1ff18 13958{
2cf0635d 13959 Elf_Internal_Shdr * sect;
11c1ff18
PB
13960 unsigned i;
13961
13962 /* Find the section header so that we get the size. */
13963 for (i = 0, sect = section_headers;
13964 i < elf_header.e_shnum;
13965 i++, sect++)
13966 {
071436c6
NC
13967 unsigned char * contents;
13968 unsigned char * p;
13969
104d59d1 13970 if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
11c1ff18
PB
13971 continue;
13972
3f5e193b
NC
13973 contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
13974 sect->sh_size, _("attributes"));
60bca95a 13975 if (contents == NULL)
11c1ff18 13976 continue;
60bca95a 13977
11c1ff18
PB
13978 p = contents;
13979 if (*p == 'A')
13980 {
071436c6
NC
13981 bfd_vma section_len;
13982
13983 section_len = sect->sh_size - 1;
11c1ff18 13984 p++;
60bca95a 13985
071436c6 13986 while (section_len > 0)
11c1ff18 13987 {
071436c6 13988 bfd_vma attr_len;
e9847026 13989 unsigned int namelen;
11c1ff18 13990 bfd_boolean public_section;
104d59d1 13991 bfd_boolean gnu_section;
11c1ff18 13992
071436c6 13993 if (section_len <= 4)
e0a31db1
NC
13994 {
13995 error (_("Tag section ends prematurely\n"));
13996 break;
13997 }
071436c6 13998 attr_len = byte_get (p, 4);
11c1ff18 13999 p += 4;
60bca95a 14000
071436c6 14001 if (attr_len > section_len)
11c1ff18 14002 {
071436c6
NC
14003 error (_("Bad attribute length (%u > %u)\n"),
14004 (unsigned) attr_len, (unsigned) section_len);
14005 attr_len = section_len;
11c1ff18 14006 }
74e1a04b 14007 /* PR 17531: file: 001-101425-0.004 */
071436c6 14008 else if (attr_len < 5)
74e1a04b 14009 {
071436c6 14010 error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
74e1a04b
NC
14011 break;
14012 }
e9847026 14013
071436c6
NC
14014 section_len -= attr_len;
14015 attr_len -= 4;
14016
14017 namelen = strnlen ((char *) p, attr_len) + 1;
14018 if (namelen == 0 || namelen >= attr_len)
e9847026
NC
14019 {
14020 error (_("Corrupt attribute section name\n"));
14021 break;
14022 }
14023
071436c6
NC
14024 printf (_("Attribute Section: "));
14025 print_symbol (INT_MAX, (const char *) p);
14026 putchar ('\n');
60bca95a
NC
14027
14028 if (public_name && streq ((char *) p, public_name))
11c1ff18
PB
14029 public_section = TRUE;
14030 else
14031 public_section = FALSE;
60bca95a
NC
14032
14033 if (streq ((char *) p, "gnu"))
104d59d1
JM
14034 gnu_section = TRUE;
14035 else
14036 gnu_section = FALSE;
60bca95a 14037
11c1ff18 14038 p += namelen;
071436c6 14039 attr_len -= namelen;
e0a31db1 14040
071436c6 14041 while (attr_len > 0 && p < contents + sect->sh_size)
11c1ff18 14042 {
e0a31db1 14043 int tag;
11c1ff18
PB
14044 int val;
14045 bfd_vma size;
071436c6 14046 unsigned char * end;
60bca95a 14047
e0a31db1 14048 /* PR binutils/17531: Safe handling of corrupt files. */
071436c6 14049 if (attr_len < 6)
e0a31db1
NC
14050 {
14051 error (_("Unused bytes at end of section\n"));
14052 section_len = 0;
14053 break;
14054 }
14055
14056 tag = *(p++);
11c1ff18 14057 size = byte_get (p, 4);
071436c6 14058 if (size > attr_len)
11c1ff18 14059 {
e9847026 14060 error (_("Bad subsection length (%u > %u)\n"),
071436c6
NC
14061 (unsigned) size, (unsigned) attr_len);
14062 size = attr_len;
11c1ff18 14063 }
e0a31db1
NC
14064 /* PR binutils/17531: Safe handling of corrupt files. */
14065 if (size < 6)
14066 {
14067 error (_("Bad subsection length (%u < 6)\n"),
14068 (unsigned) size);
14069 section_len = 0;
14070 break;
14071 }
60bca95a 14072
071436c6 14073 attr_len -= size;
11c1ff18 14074 end = p + size - 1;
071436c6 14075 assert (end <= contents + sect->sh_size);
11c1ff18 14076 p += 4;
60bca95a 14077
11c1ff18
PB
14078 switch (tag)
14079 {
14080 case 1:
2b692964 14081 printf (_("File Attributes\n"));
11c1ff18
PB
14082 break;
14083 case 2:
2b692964 14084 printf (_("Section Attributes:"));
11c1ff18
PB
14085 goto do_numlist;
14086 case 3:
2b692964 14087 printf (_("Symbol Attributes:"));
11c1ff18
PB
14088 do_numlist:
14089 for (;;)
14090 {
91d6fa6a 14091 unsigned int j;
60bca95a 14092
f6f0e17b 14093 val = read_uleb128 (p, &j, end);
91d6fa6a 14094 p += j;
11c1ff18
PB
14095 if (val == 0)
14096 break;
14097 printf (" %d", val);
14098 }
14099 printf ("\n");
14100 break;
14101 default:
2b692964 14102 printf (_("Unknown tag: %d\n"), tag);
11c1ff18
PB
14103 public_section = FALSE;
14104 break;
14105 }
60bca95a 14106
071436c6 14107 if (public_section && display_pub_attribute != NULL)
11c1ff18
PB
14108 {
14109 while (p < end)
f6f0e17b 14110 p = display_pub_attribute (p, end);
071436c6 14111 assert (p <= end);
104d59d1 14112 }
071436c6 14113 else if (gnu_section && display_proc_gnu_attribute != NULL)
104d59d1
JM
14114 {
14115 while (p < end)
14116 p = display_gnu_attribute (p,
f6f0e17b
NC
14117 display_proc_gnu_attribute,
14118 end);
071436c6 14119 assert (p <= end);
11c1ff18 14120 }
071436c6 14121 else if (p < end)
11c1ff18 14122 {
071436c6 14123 printf (_(" Unknown attribute:\n"));
f6f0e17b 14124 display_raw_attribute (p, end);
11c1ff18
PB
14125 p = end;
14126 }
071436c6
NC
14127 else
14128 attr_len = 0;
11c1ff18
PB
14129 }
14130 }
14131 }
14132 else
e9847026 14133 printf (_("Unknown format '%c' (%d)\n"), *p, *p);
d70c5fc7 14134
60bca95a 14135 free (contents);
11c1ff18
PB
14136 }
14137 return 1;
14138}
14139
104d59d1 14140static int
2cf0635d 14141process_arm_specific (FILE * file)
104d59d1
JM
14142{
14143 return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
14144 display_arm_attribute, NULL);
14145}
14146
34c8bcba 14147static int
2cf0635d 14148process_power_specific (FILE * file)
34c8bcba
JM
14149{
14150 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14151 display_power_gnu_attribute);
14152}
14153
643f7afb
AK
14154static int
14155process_s390_specific (FILE * file)
14156{
14157 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14158 display_s390_gnu_attribute);
14159}
14160
9e8c70f9
DM
14161static int
14162process_sparc_specific (FILE * file)
14163{
14164 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14165 display_sparc_gnu_attribute);
14166}
14167
59e6276b
JM
14168static int
14169process_tic6x_specific (FILE * file)
14170{
14171 return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
14172 display_tic6x_attribute, NULL);
14173}
14174
13761a11
NC
14175static int
14176process_msp430x_specific (FILE * file)
14177{
14178 return process_attributes (file, "mspabi", SHT_MSP430_ATTRIBUTES,
14179 display_msp430x_attribute, NULL);
14180}
14181
ccb4c951
RS
14182/* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
14183 Print the Address, Access and Initial fields of an entry at VMA ADDR
82b1b41b
NC
14184 and return the VMA of the next entry, or -1 if there was a problem.
14185 Does not read from DATA_END or beyond. */
ccb4c951
RS
14186
14187static bfd_vma
82b1b41b
NC
14188print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
14189 unsigned char * data_end)
ccb4c951
RS
14190{
14191 printf (" ");
14192 print_vma (addr, LONG_HEX);
14193 printf (" ");
14194 if (addr < pltgot + 0xfff0)
14195 printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
14196 else
14197 printf ("%10s", "");
14198 printf (" ");
14199 if (data == NULL)
2b692964 14200 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
ccb4c951
RS
14201 else
14202 {
14203 bfd_vma entry;
82b1b41b 14204 unsigned char * from = data + addr - pltgot;
ccb4c951 14205
82b1b41b
NC
14206 if (from + (is_32bit_elf ? 4 : 8) > data_end)
14207 {
14208 warn (_("MIPS GOT entry extends beyond the end of available data\n"));
14209 printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
14210 return (bfd_vma) -1;
14211 }
14212 else
14213 {
14214 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14215 print_vma (entry, LONG_HEX);
14216 }
ccb4c951
RS
14217 }
14218 return addr + (is_32bit_elf ? 4 : 8);
14219}
14220
861fb55a
DJ
14221/* DATA points to the contents of a MIPS PLT GOT that starts at VMA
14222 PLTGOT. Print the Address and Initial fields of an entry at VMA
14223 ADDR and return the VMA of the next entry. */
14224
14225static bfd_vma
2cf0635d 14226print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
861fb55a
DJ
14227{
14228 printf (" ");
14229 print_vma (addr, LONG_HEX);
14230 printf (" ");
14231 if (data == NULL)
2b692964 14232 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
861fb55a
DJ
14233 else
14234 {
14235 bfd_vma entry;
14236
14237 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14238 print_vma (entry, LONG_HEX);
14239 }
14240 return addr + (is_32bit_elf ? 4 : 8);
14241}
14242
351cdf24
MF
14243static void
14244print_mips_ases (unsigned int mask)
14245{
14246 if (mask & AFL_ASE_DSP)
14247 fputs ("\n\tDSP ASE", stdout);
14248 if (mask & AFL_ASE_DSPR2)
14249 fputs ("\n\tDSP R2 ASE", stdout);
8f4f9071
MF
14250 if (mask & AFL_ASE_DSPR3)
14251 fputs ("\n\tDSP R3 ASE", stdout);
351cdf24
MF
14252 if (mask & AFL_ASE_EVA)
14253 fputs ("\n\tEnhanced VA Scheme", stdout);
14254 if (mask & AFL_ASE_MCU)
14255 fputs ("\n\tMCU (MicroController) ASE", stdout);
14256 if (mask & AFL_ASE_MDMX)
14257 fputs ("\n\tMDMX ASE", stdout);
14258 if (mask & AFL_ASE_MIPS3D)
14259 fputs ("\n\tMIPS-3D ASE", stdout);
14260 if (mask & AFL_ASE_MT)
14261 fputs ("\n\tMT ASE", stdout);
14262 if (mask & AFL_ASE_SMARTMIPS)
14263 fputs ("\n\tSmartMIPS ASE", stdout);
14264 if (mask & AFL_ASE_VIRT)
14265 fputs ("\n\tVZ ASE", stdout);
14266 if (mask & AFL_ASE_MSA)
14267 fputs ("\n\tMSA ASE", stdout);
14268 if (mask & AFL_ASE_MIPS16)
14269 fputs ("\n\tMIPS16 ASE", stdout);
14270 if (mask & AFL_ASE_MICROMIPS)
14271 fputs ("\n\tMICROMIPS ASE", stdout);
14272 if (mask & AFL_ASE_XPA)
14273 fputs ("\n\tXPA ASE", stdout);
14274 if (mask == 0)
14275 fprintf (stdout, "\n\t%s", _("None"));
00ac7aa0
MF
14276 else if ((mask & ~AFL_ASE_MASK) != 0)
14277 fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
351cdf24
MF
14278}
14279
14280static void
14281print_mips_isa_ext (unsigned int isa_ext)
14282{
14283 switch (isa_ext)
14284 {
14285 case 0:
14286 fputs (_("None"), stdout);
14287 break;
14288 case AFL_EXT_XLR:
14289 fputs ("RMI XLR", stdout);
14290 break;
2c629856
N
14291 case AFL_EXT_OCTEON3:
14292 fputs ("Cavium Networks Octeon3", stdout);
14293 break;
351cdf24
MF
14294 case AFL_EXT_OCTEON2:
14295 fputs ("Cavium Networks Octeon2", stdout);
14296 break;
14297 case AFL_EXT_OCTEONP:
14298 fputs ("Cavium Networks OcteonP", stdout);
14299 break;
14300 case AFL_EXT_LOONGSON_3A:
14301 fputs ("Loongson 3A", stdout);
14302 break;
14303 case AFL_EXT_OCTEON:
14304 fputs ("Cavium Networks Octeon", stdout);
14305 break;
14306 case AFL_EXT_5900:
14307 fputs ("Toshiba R5900", stdout);
14308 break;
14309 case AFL_EXT_4650:
14310 fputs ("MIPS R4650", stdout);
14311 break;
14312 case AFL_EXT_4010:
14313 fputs ("LSI R4010", stdout);
14314 break;
14315 case AFL_EXT_4100:
14316 fputs ("NEC VR4100", stdout);
14317 break;
14318 case AFL_EXT_3900:
14319 fputs ("Toshiba R3900", stdout);
14320 break;
14321 case AFL_EXT_10000:
14322 fputs ("MIPS R10000", stdout);
14323 break;
14324 case AFL_EXT_SB1:
14325 fputs ("Broadcom SB-1", stdout);
14326 break;
14327 case AFL_EXT_4111:
14328 fputs ("NEC VR4111/VR4181", stdout);
14329 break;
14330 case AFL_EXT_4120:
14331 fputs ("NEC VR4120", stdout);
14332 break;
14333 case AFL_EXT_5400:
14334 fputs ("NEC VR5400", stdout);
14335 break;
14336 case AFL_EXT_5500:
14337 fputs ("NEC VR5500", stdout);
14338 break;
14339 case AFL_EXT_LOONGSON_2E:
14340 fputs ("ST Microelectronics Loongson 2E", stdout);
14341 break;
14342 case AFL_EXT_LOONGSON_2F:
14343 fputs ("ST Microelectronics Loongson 2F", stdout);
14344 break;
14345 default:
00ac7aa0 14346 fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
351cdf24
MF
14347 }
14348}
14349
14350static int
14351get_mips_reg_size (int reg_size)
14352{
14353 return (reg_size == AFL_REG_NONE) ? 0
14354 : (reg_size == AFL_REG_32) ? 32
14355 : (reg_size == AFL_REG_64) ? 64
14356 : (reg_size == AFL_REG_128) ? 128
14357 : -1;
14358}
14359
19e6b90e 14360static int
2cf0635d 14361process_mips_specific (FILE * file)
5b18a4bc 14362{
2cf0635d 14363 Elf_Internal_Dyn * entry;
351cdf24 14364 Elf_Internal_Shdr *sect = NULL;
19e6b90e
L
14365 size_t liblist_offset = 0;
14366 size_t liblistno = 0;
14367 size_t conflictsno = 0;
14368 size_t options_offset = 0;
14369 size_t conflicts_offset = 0;
861fb55a
DJ
14370 size_t pltrelsz = 0;
14371 size_t pltrel = 0;
ccb4c951 14372 bfd_vma pltgot = 0;
861fb55a
DJ
14373 bfd_vma mips_pltgot = 0;
14374 bfd_vma jmprel = 0;
ccb4c951
RS
14375 bfd_vma local_gotno = 0;
14376 bfd_vma gotsym = 0;
14377 bfd_vma symtabno = 0;
103f02d3 14378
2cf19d5c
JM
14379 process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14380 display_mips_gnu_attribute);
14381
351cdf24
MF
14382 sect = find_section (".MIPS.abiflags");
14383
14384 if (sect != NULL)
14385 {
14386 Elf_External_ABIFlags_v0 *abiflags_ext;
14387 Elf_Internal_ABIFlags_v0 abiflags_in;
14388
14389 if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
14390 fputs ("\nCorrupt ABI Flags section.\n", stdout);
14391 else
14392 {
14393 abiflags_ext = get_data (NULL, file, sect->sh_offset, 1,
14394 sect->sh_size, _("MIPS ABI Flags section"));
14395 if (abiflags_ext)
14396 {
14397 abiflags_in.version = BYTE_GET (abiflags_ext->version);
14398 abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
14399 abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
14400 abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
14401 abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
14402 abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
14403 abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
14404 abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
14405 abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
14406 abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
14407 abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
14408
14409 printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
14410 printf ("\nISA: MIPS%d", abiflags_in.isa_level);
14411 if (abiflags_in.isa_rev > 1)
14412 printf ("r%d", abiflags_in.isa_rev);
14413 printf ("\nGPR size: %d",
14414 get_mips_reg_size (abiflags_in.gpr_size));
14415 printf ("\nCPR1 size: %d",
14416 get_mips_reg_size (abiflags_in.cpr1_size));
14417 printf ("\nCPR2 size: %d",
14418 get_mips_reg_size (abiflags_in.cpr2_size));
14419 fputs ("\nFP ABI: ", stdout);
14420 print_mips_fp_abi_value (abiflags_in.fp_abi);
14421 fputs ("ISA Extension: ", stdout);
14422 print_mips_isa_ext (abiflags_in.isa_ext);
14423 fputs ("\nASEs:", stdout);
14424 print_mips_ases (abiflags_in.ases);
14425 printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
14426 printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
14427 fputc ('\n', stdout);
14428 free (abiflags_ext);
14429 }
14430 }
14431 }
14432
19e6b90e
L
14433 /* We have a lot of special sections. Thanks SGI! */
14434 if (dynamic_section == NULL)
14435 /* No information available. */
14436 return 0;
252b5132 14437
071436c6
NC
14438 for (entry = dynamic_section;
14439 /* PR 17531 file: 012-50589-0.004. */
14440 entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
14441 ++entry)
252b5132
RH
14442 switch (entry->d_tag)
14443 {
14444 case DT_MIPS_LIBLIST:
d93f0186
NC
14445 liblist_offset
14446 = offset_from_vma (file, entry->d_un.d_val,
14447 liblistno * sizeof (Elf32_External_Lib));
252b5132
RH
14448 break;
14449 case DT_MIPS_LIBLISTNO:
14450 liblistno = entry->d_un.d_val;
14451 break;
14452 case DT_MIPS_OPTIONS:
d93f0186 14453 options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
252b5132
RH
14454 break;
14455 case DT_MIPS_CONFLICT:
d93f0186
NC
14456 conflicts_offset
14457 = offset_from_vma (file, entry->d_un.d_val,
14458 conflictsno * sizeof (Elf32_External_Conflict));
252b5132
RH
14459 break;
14460 case DT_MIPS_CONFLICTNO:
14461 conflictsno = entry->d_un.d_val;
14462 break;
ccb4c951 14463 case DT_PLTGOT:
861fb55a
DJ
14464 pltgot = entry->d_un.d_ptr;
14465 break;
ccb4c951
RS
14466 case DT_MIPS_LOCAL_GOTNO:
14467 local_gotno = entry->d_un.d_val;
14468 break;
14469 case DT_MIPS_GOTSYM:
14470 gotsym = entry->d_un.d_val;
14471 break;
14472 case DT_MIPS_SYMTABNO:
14473 symtabno = entry->d_un.d_val;
14474 break;
861fb55a
DJ
14475 case DT_MIPS_PLTGOT:
14476 mips_pltgot = entry->d_un.d_ptr;
14477 break;
14478 case DT_PLTREL:
14479 pltrel = entry->d_un.d_val;
14480 break;
14481 case DT_PLTRELSZ:
14482 pltrelsz = entry->d_un.d_val;
14483 break;
14484 case DT_JMPREL:
14485 jmprel = entry->d_un.d_ptr;
14486 break;
252b5132
RH
14487 default:
14488 break;
14489 }
14490
14491 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
14492 {
2cf0635d 14493 Elf32_External_Lib * elib;
252b5132
RH
14494 size_t cnt;
14495
3f5e193b
NC
14496 elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
14497 liblistno,
14498 sizeof (Elf32_External_Lib),
9cf03b7e 14499 _("liblist section data"));
a6e9f9df 14500 if (elib)
252b5132 14501 {
2b692964 14502 printf (_("\nSection '.liblist' contains %lu entries:\n"),
a6e9f9df 14503 (unsigned long) liblistno);
2b692964 14504 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
a6e9f9df
AM
14505 stdout);
14506
14507 for (cnt = 0; cnt < liblistno; ++cnt)
252b5132 14508 {
a6e9f9df 14509 Elf32_Lib liblist;
91d6fa6a 14510 time_t atime;
d5b07ef4 14511 char timebuf[128];
2cf0635d 14512 struct tm * tmp;
a6e9f9df
AM
14513
14514 liblist.l_name = BYTE_GET (elib[cnt].l_name);
91d6fa6a 14515 atime = BYTE_GET (elib[cnt].l_time_stamp);
a6e9f9df
AM
14516 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
14517 liblist.l_version = BYTE_GET (elib[cnt].l_version);
14518 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
14519
91d6fa6a 14520 tmp = gmtime (&atime);
e9e44622
JJ
14521 snprintf (timebuf, sizeof (timebuf),
14522 "%04u-%02u-%02uT%02u:%02u:%02u",
14523 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
14524 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
a6e9f9df 14525
31104126 14526 printf ("%3lu: ", (unsigned long) cnt);
d79b3d50
NC
14527 if (VALID_DYNAMIC_NAME (liblist.l_name))
14528 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
14529 else
2b692964 14530 printf (_("<corrupt: %9ld>"), liblist.l_name);
31104126
NC
14531 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
14532 liblist.l_version);
a6e9f9df
AM
14533
14534 if (liblist.l_flags == 0)
2b692964 14535 puts (_(" NONE"));
a6e9f9df
AM
14536 else
14537 {
14538 static const struct
252b5132 14539 {
2cf0635d 14540 const char * name;
a6e9f9df 14541 int bit;
252b5132 14542 }
a6e9f9df
AM
14543 l_flags_vals[] =
14544 {
14545 { " EXACT_MATCH", LL_EXACT_MATCH },
14546 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
14547 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
14548 { " EXPORTS", LL_EXPORTS },
14549 { " DELAY_LOAD", LL_DELAY_LOAD },
14550 { " DELTA", LL_DELTA }
14551 };
14552 int flags = liblist.l_flags;
14553 size_t fcnt;
14554
60bca95a 14555 for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
a6e9f9df
AM
14556 if ((flags & l_flags_vals[fcnt].bit) != 0)
14557 {
14558 fputs (l_flags_vals[fcnt].name, stdout);
14559 flags ^= l_flags_vals[fcnt].bit;
14560 }
14561 if (flags != 0)
14562 printf (" %#x", (unsigned int) flags);
252b5132 14563
a6e9f9df
AM
14564 puts ("");
14565 }
252b5132 14566 }
252b5132 14567
a6e9f9df
AM
14568 free (elib);
14569 }
252b5132
RH
14570 }
14571
14572 if (options_offset != 0)
14573 {
2cf0635d 14574 Elf_External_Options * eopt;
2cf0635d
NC
14575 Elf_Internal_Options * iopt;
14576 Elf_Internal_Options * option;
252b5132
RH
14577 size_t offset;
14578 int cnt;
351cdf24 14579 sect = section_headers;
252b5132
RH
14580
14581 /* Find the section header so that we get the size. */
071436c6 14582 sect = find_section_by_type (SHT_MIPS_OPTIONS);
948f632f 14583 /* PR 17533 file: 012-277276-0.004. */
071436c6
NC
14584 if (sect == NULL)
14585 {
14586 error (_("No MIPS_OPTIONS header found\n"));
14587 return 0;
14588 }
252b5132 14589
3f5e193b
NC
14590 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
14591 sect->sh_size, _("options"));
a6e9f9df 14592 if (eopt)
252b5132 14593 {
3f5e193b
NC
14594 iopt = (Elf_Internal_Options *)
14595 cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
a6e9f9df
AM
14596 if (iopt == NULL)
14597 {
8b73c356 14598 error (_("Out of memory allocatinf space for MIPS options\n"));
a6e9f9df
AM
14599 return 0;
14600 }
76da6bbe 14601
a6e9f9df
AM
14602 offset = cnt = 0;
14603 option = iopt;
252b5132 14604
82b1b41b 14605 while (offset <= sect->sh_size - sizeof (* eopt))
a6e9f9df 14606 {
2cf0635d 14607 Elf_External_Options * eoption;
252b5132 14608
a6e9f9df 14609 eoption = (Elf_External_Options *) ((char *) eopt + offset);
252b5132 14610
a6e9f9df
AM
14611 option->kind = BYTE_GET (eoption->kind);
14612 option->size = BYTE_GET (eoption->size);
14613 option->section = BYTE_GET (eoption->section);
14614 option->info = BYTE_GET (eoption->info);
76da6bbe 14615
82b1b41b
NC
14616 /* PR 17531: file: ffa0fa3b. */
14617 if (option->size < sizeof (* eopt)
14618 || offset + option->size > sect->sh_size)
14619 {
55325047
NC
14620 error (_("Invalid size (%u) for MIPS option\n"), option->size);
14621 return 0;
82b1b41b 14622 }
a6e9f9df 14623 offset += option->size;
14ae95f2 14624
a6e9f9df
AM
14625 ++option;
14626 ++cnt;
14627 }
252b5132 14628
a6e9f9df 14629 printf (_("\nSection '%s' contains %d entries:\n"),
74e1a04b 14630 printable_section_name (sect), cnt);
76da6bbe 14631
a6e9f9df 14632 option = iopt;
82b1b41b 14633 offset = 0;
252b5132 14634
a6e9f9df 14635 while (cnt-- > 0)
252b5132 14636 {
a6e9f9df
AM
14637 size_t len;
14638
14639 switch (option->kind)
252b5132 14640 {
a6e9f9df
AM
14641 case ODK_NULL:
14642 /* This shouldn't happen. */
14643 printf (" NULL %d %lx", option->section, option->info);
14644 break;
14645 case ODK_REGINFO:
14646 printf (" REGINFO ");
14647 if (elf_header.e_machine == EM_MIPS)
14648 {
14649 /* 32bit form. */
2cf0635d 14650 Elf32_External_RegInfo * ereg;
b34976b6 14651 Elf32_RegInfo reginfo;
a6e9f9df
AM
14652
14653 ereg = (Elf32_External_RegInfo *) (option + 1);
14654 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
14655 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
14656 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
14657 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
14658 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
14659 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
14660
14661 printf ("GPR %08lx GP 0x%lx\n",
14662 reginfo.ri_gprmask,
14663 (unsigned long) reginfo.ri_gp_value);
14664 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
14665 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
14666 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
14667 }
14668 else
14669 {
14670 /* 64 bit form. */
2cf0635d 14671 Elf64_External_RegInfo * ereg;
a6e9f9df
AM
14672 Elf64_Internal_RegInfo reginfo;
14673
14674 ereg = (Elf64_External_RegInfo *) (option + 1);
14675 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
14676 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
14677 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
14678 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
14679 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
66543521 14680 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
a6e9f9df
AM
14681
14682 printf ("GPR %08lx GP 0x",
14683 reginfo.ri_gprmask);
14684 printf_vma (reginfo.ri_gp_value);
14685 printf ("\n");
14686
14687 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
14688 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
14689 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
14690 }
14691 ++option;
14692 continue;
14693 case ODK_EXCEPTIONS:
14694 fputs (" EXCEPTIONS fpe_min(", stdout);
14695 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
14696 fputs (") fpe_max(", stdout);
14697 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
14698 fputs (")", stdout);
14699
14700 if (option->info & OEX_PAGE0)
14701 fputs (" PAGE0", stdout);
14702 if (option->info & OEX_SMM)
14703 fputs (" SMM", stdout);
14704 if (option->info & OEX_FPDBUG)
14705 fputs (" FPDBUG", stdout);
14706 if (option->info & OEX_DISMISS)
14707 fputs (" DISMISS", stdout);
14708 break;
14709 case ODK_PAD:
14710 fputs (" PAD ", stdout);
14711 if (option->info & OPAD_PREFIX)
14712 fputs (" PREFIX", stdout);
14713 if (option->info & OPAD_POSTFIX)
14714 fputs (" POSTFIX", stdout);
14715 if (option->info & OPAD_SYMBOL)
14716 fputs (" SYMBOL", stdout);
14717 break;
14718 case ODK_HWPATCH:
14719 fputs (" HWPATCH ", stdout);
14720 if (option->info & OHW_R4KEOP)
14721 fputs (" R4KEOP", stdout);
14722 if (option->info & OHW_R8KPFETCH)
14723 fputs (" R8KPFETCH", stdout);
14724 if (option->info & OHW_R5KEOP)
14725 fputs (" R5KEOP", stdout);
14726 if (option->info & OHW_R5KCVTL)
14727 fputs (" R5KCVTL", stdout);
14728 break;
14729 case ODK_FILL:
14730 fputs (" FILL ", stdout);
14731 /* XXX Print content of info word? */
14732 break;
14733 case ODK_TAGS:
14734 fputs (" TAGS ", stdout);
14735 /* XXX Print content of info word? */
14736 break;
14737 case ODK_HWAND:
14738 fputs (" HWAND ", stdout);
14739 if (option->info & OHWA0_R4KEOP_CHECKED)
14740 fputs (" R4KEOP_CHECKED", stdout);
14741 if (option->info & OHWA0_R4KEOP_CLEAN)
14742 fputs (" R4KEOP_CLEAN", stdout);
14743 break;
14744 case ODK_HWOR:
14745 fputs (" HWOR ", stdout);
14746 if (option->info & OHWA0_R4KEOP_CHECKED)
14747 fputs (" R4KEOP_CHECKED", stdout);
14748 if (option->info & OHWA0_R4KEOP_CLEAN)
14749 fputs (" R4KEOP_CLEAN", stdout);
14750 break;
14751 case ODK_GP_GROUP:
14752 printf (" GP_GROUP %#06lx self-contained %#06lx",
14753 option->info & OGP_GROUP,
14754 (option->info & OGP_SELF) >> 16);
14755 break;
14756 case ODK_IDENT:
14757 printf (" IDENT %#06lx self-contained %#06lx",
14758 option->info & OGP_GROUP,
14759 (option->info & OGP_SELF) >> 16);
14760 break;
14761 default:
14762 /* This shouldn't happen. */
14763 printf (" %3d ??? %d %lx",
14764 option->kind, option->section, option->info);
14765 break;
252b5132 14766 }
a6e9f9df 14767
2cf0635d 14768 len = sizeof (* eopt);
a6e9f9df 14769 while (len < option->size)
82b1b41b 14770 {
7e27a9d5 14771 unsigned char datum = * ((unsigned char *) eopt + offset + len);
a6e9f9df 14772
82b1b41b
NC
14773 if (ISPRINT (datum))
14774 printf ("%c", datum);
14775 else
14776 printf ("\\%03o", datum);
14777 len ++;
14778 }
a6e9f9df 14779 fputs ("\n", stdout);
82b1b41b
NC
14780
14781 offset += option->size;
252b5132 14782 ++option;
252b5132
RH
14783 }
14784
a6e9f9df 14785 free (eopt);
252b5132 14786 }
252b5132
RH
14787 }
14788
14789 if (conflicts_offset != 0 && conflictsno != 0)
14790 {
2cf0635d 14791 Elf32_Conflict * iconf;
252b5132
RH
14792 size_t cnt;
14793
14794 if (dynamic_symbols == NULL)
14795 {
591a748a 14796 error (_("conflict list found without a dynamic symbol table\n"));
252b5132
RH
14797 return 0;
14798 }
14799
3f5e193b 14800 iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
252b5132
RH
14801 if (iconf == NULL)
14802 {
8b73c356 14803 error (_("Out of memory allocating space for dynamic conflicts\n"));
252b5132
RH
14804 return 0;
14805 }
14806
9ea033b2 14807 if (is_32bit_elf)
252b5132 14808 {
2cf0635d 14809 Elf32_External_Conflict * econf32;
a6e9f9df 14810
3f5e193b
NC
14811 econf32 = (Elf32_External_Conflict *)
14812 get_data (NULL, file, conflicts_offset, conflictsno,
14813 sizeof (* econf32), _("conflict"));
a6e9f9df
AM
14814 if (!econf32)
14815 return 0;
252b5132
RH
14816
14817 for (cnt = 0; cnt < conflictsno; ++cnt)
14818 iconf[cnt] = BYTE_GET (econf32[cnt]);
a6e9f9df
AM
14819
14820 free (econf32);
252b5132
RH
14821 }
14822 else
14823 {
2cf0635d 14824 Elf64_External_Conflict * econf64;
a6e9f9df 14825
3f5e193b
NC
14826 econf64 = (Elf64_External_Conflict *)
14827 get_data (NULL, file, conflicts_offset, conflictsno,
14828 sizeof (* econf64), _("conflict"));
a6e9f9df
AM
14829 if (!econf64)
14830 return 0;
252b5132
RH
14831
14832 for (cnt = 0; cnt < conflictsno; ++cnt)
14833 iconf[cnt] = BYTE_GET (econf64[cnt]);
a6e9f9df
AM
14834
14835 free (econf64);
252b5132
RH
14836 }
14837
c7e7ca54
NC
14838 printf (_("\nSection '.conflict' contains %lu entries:\n"),
14839 (unsigned long) conflictsno);
252b5132
RH
14840 puts (_(" Num: Index Value Name"));
14841
14842 for (cnt = 0; cnt < conflictsno; ++cnt)
14843 {
b34976b6 14844 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
e0a31db1
NC
14845
14846 if (iconf[cnt] >= num_dynamic_syms)
14847 printf (_("<corrupt symbol index>"));
d79b3d50 14848 else
e0a31db1
NC
14849 {
14850 Elf_Internal_Sym * psym;
14851
14852 psym = & dynamic_symbols[iconf[cnt]];
14853 print_vma (psym->st_value, FULL_HEX);
14854 putchar (' ');
14855 if (VALID_DYNAMIC_NAME (psym->st_name))
14856 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
14857 else
14858 printf (_("<corrupt: %14ld>"), psym->st_name);
14859 }
31104126 14860 putchar ('\n');
252b5132
RH
14861 }
14862
252b5132
RH
14863 free (iconf);
14864 }
14865
ccb4c951
RS
14866 if (pltgot != 0 && local_gotno != 0)
14867 {
91d6fa6a 14868 bfd_vma ent, local_end, global_end;
bbeee7ea 14869 size_t i, offset;
2cf0635d 14870 unsigned char * data;
82b1b41b 14871 unsigned char * data_end;
bbeee7ea 14872 int addr_size;
ccb4c951 14873
91d6fa6a 14874 ent = pltgot;
ccb4c951
RS
14875 addr_size = (is_32bit_elf ? 4 : 8);
14876 local_end = pltgot + local_gotno * addr_size;
ccb4c951 14877
74e1a04b
NC
14878 /* PR binutils/17533 file: 012-111227-0.004 */
14879 if (symtabno < gotsym)
14880 {
14881 error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
82b1b41b 14882 (unsigned long) gotsym, (unsigned long) symtabno);
74e1a04b
NC
14883 return 0;
14884 }
82b1b41b 14885
74e1a04b 14886 global_end = local_end + (symtabno - gotsym) * addr_size;
82b1b41b
NC
14887 /* PR 17531: file: 54c91a34. */
14888 if (global_end < local_end)
14889 {
14890 error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
14891 return 0;
14892 }
948f632f 14893
ccb4c951 14894 offset = offset_from_vma (file, pltgot, global_end - pltgot);
3f5e193b 14895 data = (unsigned char *) get_data (NULL, file, offset,
9cf03b7e
NC
14896 global_end - pltgot, 1,
14897 _("Global Offset Table data"));
59245841
NC
14898 if (data == NULL)
14899 return 0;
82b1b41b 14900 data_end = data + (global_end - pltgot);
59245841 14901
ccb4c951
RS
14902 printf (_("\nPrimary GOT:\n"));
14903 printf (_(" Canonical gp value: "));
14904 print_vma (pltgot + 0x7ff0, LONG_HEX);
14905 printf ("\n\n");
14906
14907 printf (_(" Reserved entries:\n"));
14908 printf (_(" %*s %10s %*s Purpose\n"),
2b692964
NC
14909 addr_size * 2, _("Address"), _("Access"),
14910 addr_size * 2, _("Initial"));
82b1b41b 14911 ent = print_mips_got_entry (data, pltgot, ent, data_end);
2b692964 14912 printf (_(" Lazy resolver\n"));
82b1b41b
NC
14913 if (ent == (bfd_vma) -1)
14914 goto got_print_fail;
ccb4c951 14915 if (data
91d6fa6a 14916 && (byte_get (data + ent - pltgot, addr_size)
ccb4c951
RS
14917 >> (addr_size * 8 - 1)) != 0)
14918 {
82b1b41b 14919 ent = print_mips_got_entry (data, pltgot, ent, data_end);
2b692964 14920 printf (_(" Module pointer (GNU extension)\n"));
82b1b41b
NC
14921 if (ent == (bfd_vma) -1)
14922 goto got_print_fail;
ccb4c951
RS
14923 }
14924 printf ("\n");
14925
91d6fa6a 14926 if (ent < local_end)
ccb4c951
RS
14927 {
14928 printf (_(" Local entries:\n"));
cc5914eb 14929 printf (" %*s %10s %*s\n",
2b692964
NC
14930 addr_size * 2, _("Address"), _("Access"),
14931 addr_size * 2, _("Initial"));
91d6fa6a 14932 while (ent < local_end)
ccb4c951 14933 {
82b1b41b 14934 ent = print_mips_got_entry (data, pltgot, ent, data_end);
ccb4c951 14935 printf ("\n");
82b1b41b
NC
14936 if (ent == (bfd_vma) -1)
14937 goto got_print_fail;
ccb4c951
RS
14938 }
14939 printf ("\n");
14940 }
14941
14942 if (gotsym < symtabno)
14943 {
14944 int sym_width;
14945
14946 printf (_(" Global entries:\n"));
cc5914eb 14947 printf (" %*s %10s %*s %*s %-7s %3s %s\n",
9cf03b7e
NC
14948 addr_size * 2, _("Address"),
14949 _("Access"),
2b692964 14950 addr_size * 2, _("Initial"),
9cf03b7e
NC
14951 addr_size * 2, _("Sym.Val."),
14952 _("Type"),
14953 /* Note for translators: "Ndx" = abbreviated form of "Index". */
14954 _("Ndx"), _("Name"));
0b4362b0 14955
ccb4c951 14956 sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
e0a31db1 14957
ccb4c951
RS
14958 for (i = gotsym; i < symtabno; i++)
14959 {
82b1b41b 14960 ent = print_mips_got_entry (data, pltgot, ent, data_end);
ccb4c951 14961 printf (" ");
e0a31db1
NC
14962
14963 if (dynamic_symbols == NULL)
14964 printf (_("<no dynamic symbols>"));
14965 else if (i < num_dynamic_syms)
14966 {
14967 Elf_Internal_Sym * psym = dynamic_symbols + i;
14968
14969 print_vma (psym->st_value, LONG_HEX);
14970 printf (" %-7s %3s ",
14971 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
14972 get_symbol_index_type (psym->st_shndx));
14973
14974 if (VALID_DYNAMIC_NAME (psym->st_name))
14975 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
14976 else
14977 printf (_("<corrupt: %14ld>"), psym->st_name);
14978 }
ccb4c951 14979 else
7fc5ac57
JBG
14980 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
14981 (unsigned long) i);
e0a31db1 14982
ccb4c951 14983 printf ("\n");
82b1b41b
NC
14984 if (ent == (bfd_vma) -1)
14985 break;
ccb4c951
RS
14986 }
14987 printf ("\n");
14988 }
14989
82b1b41b 14990 got_print_fail:
ccb4c951
RS
14991 if (data)
14992 free (data);
14993 }
14994
861fb55a
DJ
14995 if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
14996 {
91d6fa6a 14997 bfd_vma ent, end;
861fb55a
DJ
14998 size_t offset, rel_offset;
14999 unsigned long count, i;
2cf0635d 15000 unsigned char * data;
861fb55a 15001 int addr_size, sym_width;
2cf0635d 15002 Elf_Internal_Rela * rels;
861fb55a
DJ
15003
15004 rel_offset = offset_from_vma (file, jmprel, pltrelsz);
15005 if (pltrel == DT_RELA)
15006 {
15007 if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
15008 return 0;
15009 }
15010 else
15011 {
15012 if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
15013 return 0;
15014 }
15015
91d6fa6a 15016 ent = mips_pltgot;
861fb55a
DJ
15017 addr_size = (is_32bit_elf ? 4 : 8);
15018 end = mips_pltgot + (2 + count) * addr_size;
15019
15020 offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
3f5e193b 15021 data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
9cf03b7e 15022 1, _("Procedure Linkage Table data"));
59245841
NC
15023 if (data == NULL)
15024 return 0;
15025
9cf03b7e 15026 printf ("\nPLT GOT:\n\n");
861fb55a
DJ
15027 printf (_(" Reserved entries:\n"));
15028 printf (_(" %*s %*s Purpose\n"),
2b692964 15029 addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
91d6fa6a 15030 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
2b692964 15031 printf (_(" PLT lazy resolver\n"));
91d6fa6a 15032 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
2b692964 15033 printf (_(" Module pointer\n"));
861fb55a
DJ
15034 printf ("\n");
15035
15036 printf (_(" Entries:\n"));
cc5914eb 15037 printf (" %*s %*s %*s %-7s %3s %s\n",
2b692964
NC
15038 addr_size * 2, _("Address"),
15039 addr_size * 2, _("Initial"),
15040 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
861fb55a
DJ
15041 sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
15042 for (i = 0; i < count; i++)
15043 {
df97ab2a 15044 unsigned long idx = get_reloc_symindex (rels[i].r_info);
861fb55a 15045
91d6fa6a 15046 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
861fb55a 15047 printf (" ");
e0a31db1 15048
df97ab2a
MF
15049 if (idx >= num_dynamic_syms)
15050 printf (_("<corrupt symbol index: %lu>"), idx);
861fb55a 15051 else
e0a31db1 15052 {
df97ab2a 15053 Elf_Internal_Sym * psym = dynamic_symbols + idx;
e0a31db1
NC
15054
15055 print_vma (psym->st_value, LONG_HEX);
15056 printf (" %-7s %3s ",
15057 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
15058 get_symbol_index_type (psym->st_shndx));
15059 if (VALID_DYNAMIC_NAME (psym->st_name))
15060 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
15061 else
15062 printf (_("<corrupt: %14ld>"), psym->st_name);
15063 }
861fb55a
DJ
15064 printf ("\n");
15065 }
15066 printf ("\n");
15067
15068 if (data)
15069 free (data);
15070 free (rels);
15071 }
15072
252b5132
RH
15073 return 1;
15074}
15075
35c08157
KLC
15076static int
15077process_nds32_specific (FILE * file)
15078{
15079 Elf_Internal_Shdr *sect = NULL;
15080
15081 sect = find_section (".nds32_e_flags");
15082 if (sect != NULL)
15083 {
15084 unsigned int *flag;
15085
15086 printf ("\nNDS32 elf flags section:\n");
15087 flag = get_data (NULL, file, sect->sh_offset, 1,
15088 sect->sh_size, _("NDS32 elf flags section"));
15089
15090 switch ((*flag) & 0x3)
15091 {
15092 case 0:
15093 printf ("(VEC_SIZE):\tNo entry.\n");
15094 break;
15095 case 1:
15096 printf ("(VEC_SIZE):\t4 bytes\n");
15097 break;
15098 case 2:
15099 printf ("(VEC_SIZE):\t16 bytes\n");
15100 break;
15101 case 3:
15102 printf ("(VEC_SIZE):\treserved\n");
15103 break;
15104 }
15105 }
15106
15107 return TRUE;
15108}
15109
047b2264 15110static int
2cf0635d 15111process_gnu_liblist (FILE * file)
047b2264 15112{
2cf0635d
NC
15113 Elf_Internal_Shdr * section;
15114 Elf_Internal_Shdr * string_sec;
15115 Elf32_External_Lib * elib;
15116 char * strtab;
c256ffe7 15117 size_t strtab_size;
047b2264
JJ
15118 size_t cnt;
15119 unsigned i;
15120
15121 if (! do_arch)
15122 return 0;
15123
15124 for (i = 0, section = section_headers;
15125 i < elf_header.e_shnum;
b34976b6 15126 i++, section++)
047b2264
JJ
15127 {
15128 switch (section->sh_type)
15129 {
15130 case SHT_GNU_LIBLIST:
4fbb74a6 15131 if (section->sh_link >= elf_header.e_shnum)
c256ffe7
JJ
15132 break;
15133
3f5e193b
NC
15134 elib = (Elf32_External_Lib *)
15135 get_data (NULL, file, section->sh_offset, 1, section->sh_size,
9cf03b7e 15136 _("liblist section data"));
047b2264
JJ
15137
15138 if (elib == NULL)
15139 break;
4fbb74a6 15140 string_sec = section_headers + section->sh_link;
047b2264 15141
3f5e193b
NC
15142 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
15143 string_sec->sh_size,
15144 _("liblist string table"));
047b2264
JJ
15145 if (strtab == NULL
15146 || section->sh_entsize != sizeof (Elf32_External_Lib))
15147 {
15148 free (elib);
2842702f 15149 free (strtab);
047b2264
JJ
15150 break;
15151 }
59245841 15152 strtab_size = string_sec->sh_size;
047b2264
JJ
15153
15154 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
74e1a04b 15155 printable_section_name (section),
0af1713e 15156 (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
047b2264 15157
2b692964 15158 puts (_(" Library Time Stamp Checksum Version Flags"));
047b2264
JJ
15159
15160 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
15161 ++cnt)
15162 {
15163 Elf32_Lib liblist;
91d6fa6a 15164 time_t atime;
d5b07ef4 15165 char timebuf[128];
2cf0635d 15166 struct tm * tmp;
047b2264
JJ
15167
15168 liblist.l_name = BYTE_GET (elib[cnt].l_name);
91d6fa6a 15169 atime = BYTE_GET (elib[cnt].l_time_stamp);
047b2264
JJ
15170 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
15171 liblist.l_version = BYTE_GET (elib[cnt].l_version);
15172 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
15173
91d6fa6a 15174 tmp = gmtime (&atime);
e9e44622
JJ
15175 snprintf (timebuf, sizeof (timebuf),
15176 "%04u-%02u-%02uT%02u:%02u:%02u",
15177 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
15178 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
047b2264
JJ
15179
15180 printf ("%3lu: ", (unsigned long) cnt);
15181 if (do_wide)
c256ffe7 15182 printf ("%-20s", liblist.l_name < strtab_size
2b692964 15183 ? strtab + liblist.l_name : _("<corrupt>"));
047b2264 15184 else
c256ffe7 15185 printf ("%-20.20s", liblist.l_name < strtab_size
2b692964 15186 ? strtab + liblist.l_name : _("<corrupt>"));
047b2264
JJ
15187 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
15188 liblist.l_version, liblist.l_flags);
15189 }
15190
15191 free (elib);
2842702f 15192 free (strtab);
047b2264
JJ
15193 }
15194 }
15195
15196 return 1;
15197}
15198
9437c45b 15199static const char *
d3ba0551 15200get_note_type (unsigned e_type)
779fe533
NC
15201{
15202 static char buff[64];
103f02d3 15203
1ec5cd37
NC
15204 if (elf_header.e_type == ET_CORE)
15205 switch (e_type)
15206 {
57346661 15207 case NT_AUXV:
1ec5cd37 15208 return _("NT_AUXV (auxiliary vector)");
57346661 15209 case NT_PRSTATUS:
1ec5cd37 15210 return _("NT_PRSTATUS (prstatus structure)");
57346661 15211 case NT_FPREGSET:
1ec5cd37 15212 return _("NT_FPREGSET (floating point registers)");
57346661 15213 case NT_PRPSINFO:
1ec5cd37 15214 return _("NT_PRPSINFO (prpsinfo structure)");
57346661 15215 case NT_TASKSTRUCT:
1ec5cd37 15216 return _("NT_TASKSTRUCT (task structure)");
57346661 15217 case NT_PRXFPREG:
1ec5cd37 15218 return _("NT_PRXFPREG (user_xfpregs structure)");
e1e95dec
AM
15219 case NT_PPC_VMX:
15220 return _("NT_PPC_VMX (ppc Altivec registers)");
89eeb0bc
LM
15221 case NT_PPC_VSX:
15222 return _("NT_PPC_VSX (ppc VSX registers)");
ff826ef3
TT
15223 case NT_386_TLS:
15224 return _("NT_386_TLS (x86 TLS information)");
15225 case NT_386_IOPERM:
15226 return _("NT_386_IOPERM (x86 I/O permissions)");
4339cae0
L
15227 case NT_X86_XSTATE:
15228 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
0675e188
UW
15229 case NT_S390_HIGH_GPRS:
15230 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
d7eeb400
MS
15231 case NT_S390_TIMER:
15232 return _("NT_S390_TIMER (s390 timer register)");
15233 case NT_S390_TODCMP:
15234 return _("NT_S390_TODCMP (s390 TOD comparator register)");
15235 case NT_S390_TODPREG:
15236 return _("NT_S390_TODPREG (s390 TOD programmable register)");
15237 case NT_S390_CTRS:
15238 return _("NT_S390_CTRS (s390 control registers)");
15239 case NT_S390_PREFIX:
15240 return _("NT_S390_PREFIX (s390 prefix register)");
a367d729
AK
15241 case NT_S390_LAST_BREAK:
15242 return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
15243 case NT_S390_SYSTEM_CALL:
15244 return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
abb3f6cc
NC
15245 case NT_S390_TDB:
15246 return _("NT_S390_TDB (s390 transaction diagnostic block)");
4ef9f41a
AA
15247 case NT_S390_VXRS_LOW:
15248 return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
15249 case NT_S390_VXRS_HIGH:
15250 return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
faa9a424
UW
15251 case NT_ARM_VFP:
15252 return _("NT_ARM_VFP (arm VFP registers)");
652451f8
YZ
15253 case NT_ARM_TLS:
15254 return _("NT_ARM_TLS (AArch TLS registers)");
15255 case NT_ARM_HW_BREAK:
15256 return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
15257 case NT_ARM_HW_WATCH:
15258 return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
57346661 15259 case NT_PSTATUS:
1ec5cd37 15260 return _("NT_PSTATUS (pstatus structure)");
57346661 15261 case NT_FPREGS:
1ec5cd37 15262 return _("NT_FPREGS (floating point registers)");
57346661 15263 case NT_PSINFO:
1ec5cd37 15264 return _("NT_PSINFO (psinfo structure)");
57346661 15265 case NT_LWPSTATUS:
1ec5cd37 15266 return _("NT_LWPSTATUS (lwpstatus_t structure)");
57346661 15267 case NT_LWPSINFO:
1ec5cd37 15268 return _("NT_LWPSINFO (lwpsinfo_t structure)");
57346661 15269 case NT_WIN32PSTATUS:
1ec5cd37 15270 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
9ece1fa9
TT
15271 case NT_SIGINFO:
15272 return _("NT_SIGINFO (siginfo_t data)");
15273 case NT_FILE:
15274 return _("NT_FILE (mapped files)");
1ec5cd37
NC
15275 default:
15276 break;
15277 }
15278 else
15279 switch (e_type)
15280 {
15281 case NT_VERSION:
15282 return _("NT_VERSION (version)");
15283 case NT_ARCH:
15284 return _("NT_ARCH (architecture)");
15285 default:
15286 break;
15287 }
15288
e9e44622 15289 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
1ec5cd37 15290 return buff;
779fe533
NC
15291}
15292
9ece1fa9
TT
15293static int
15294print_core_note (Elf_Internal_Note *pnote)
15295{
15296 unsigned int addr_size = is_32bit_elf ? 4 : 8;
15297 bfd_vma count, page_size;
15298 unsigned char *descdata, *filenames, *descend;
15299
15300 if (pnote->type != NT_FILE)
15301 return 1;
15302
15303#ifndef BFD64
15304 if (!is_32bit_elf)
15305 {
15306 printf (_(" Cannot decode 64-bit note in 32-bit build\n"));
15307 /* Still "successful". */
15308 return 1;
15309 }
15310#endif
15311
15312 if (pnote->descsz < 2 * addr_size)
15313 {
15314 printf (_(" Malformed note - too short for header\n"));
15315 return 0;
15316 }
15317
15318 descdata = (unsigned char *) pnote->descdata;
15319 descend = descdata + pnote->descsz;
15320
15321 if (descdata[pnote->descsz - 1] != '\0')
15322 {
15323 printf (_(" Malformed note - does not end with \\0\n"));
15324 return 0;
15325 }
15326
15327 count = byte_get (descdata, addr_size);
15328 descdata += addr_size;
15329
15330 page_size = byte_get (descdata, addr_size);
15331 descdata += addr_size;
15332
15333 if (pnote->descsz < 2 * addr_size + count * 3 * addr_size)
15334 {
15335 printf (_(" Malformed note - too short for supplied file count\n"));
15336 return 0;
15337 }
15338
15339 printf (_(" Page size: "));
15340 print_vma (page_size, DEC);
15341 printf ("\n");
15342
15343 printf (_(" %*s%*s%*s\n"),
15344 (int) (2 + 2 * addr_size), _("Start"),
15345 (int) (4 + 2 * addr_size), _("End"),
15346 (int) (4 + 2 * addr_size), _("Page Offset"));
15347 filenames = descdata + count * 3 * addr_size;
595712bb 15348 while (count-- > 0)
9ece1fa9
TT
15349 {
15350 bfd_vma start, end, file_ofs;
15351
15352 if (filenames == descend)
15353 {
15354 printf (_(" Malformed note - filenames end too early\n"));
15355 return 0;
15356 }
15357
15358 start = byte_get (descdata, addr_size);
15359 descdata += addr_size;
15360 end = byte_get (descdata, addr_size);
15361 descdata += addr_size;
15362 file_ofs = byte_get (descdata, addr_size);
15363 descdata += addr_size;
15364
15365 printf (" ");
15366 print_vma (start, FULL_HEX);
15367 printf (" ");
15368 print_vma (end, FULL_HEX);
15369 printf (" ");
15370 print_vma (file_ofs, FULL_HEX);
15371 printf ("\n %s\n", filenames);
15372
15373 filenames += 1 + strlen ((char *) filenames);
15374 }
15375
15376 return 1;
15377}
15378
1118d252
RM
15379static const char *
15380get_gnu_elf_note_type (unsigned e_type)
15381{
15382 static char buff[64];
15383
15384 switch (e_type)
15385 {
15386 case NT_GNU_ABI_TAG:
15387 return _("NT_GNU_ABI_TAG (ABI version tag)");
15388 case NT_GNU_HWCAP:
15389 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
15390 case NT_GNU_BUILD_ID:
15391 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
0297aed6
DM
15392 case NT_GNU_GOLD_VERSION:
15393 return _("NT_GNU_GOLD_VERSION (gold version)");
1118d252
RM
15394 default:
15395 break;
15396 }
15397
15398 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15399 return buff;
15400}
15401
664f90a3
TT
15402static int
15403print_gnu_note (Elf_Internal_Note *pnote)
15404{
15405 switch (pnote->type)
15406 {
15407 case NT_GNU_BUILD_ID:
15408 {
15409 unsigned long i;
15410
15411 printf (_(" Build ID: "));
15412 for (i = 0; i < pnote->descsz; ++i)
15413 printf ("%02x", pnote->descdata[i] & 0xff);
9cf03b7e 15414 printf ("\n");
664f90a3
TT
15415 }
15416 break;
15417
15418 case NT_GNU_ABI_TAG:
15419 {
15420 unsigned long os, major, minor, subminor;
15421 const char *osname;
15422
3102e897
NC
15423 /* PR 17531: file: 030-599401-0.004. */
15424 if (pnote->descsz < 16)
15425 {
15426 printf (_(" <corrupt GNU_ABI_TAG>\n"));
15427 break;
15428 }
15429
664f90a3
TT
15430 os = byte_get ((unsigned char *) pnote->descdata, 4);
15431 major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
15432 minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
15433 subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
15434
15435 switch (os)
15436 {
15437 case GNU_ABI_TAG_LINUX:
15438 osname = "Linux";
15439 break;
15440 case GNU_ABI_TAG_HURD:
15441 osname = "Hurd";
15442 break;
15443 case GNU_ABI_TAG_SOLARIS:
15444 osname = "Solaris";
15445 break;
15446 case GNU_ABI_TAG_FREEBSD:
15447 osname = "FreeBSD";
15448 break;
15449 case GNU_ABI_TAG_NETBSD:
15450 osname = "NetBSD";
15451 break;
14ae95f2
RM
15452 case GNU_ABI_TAG_SYLLABLE:
15453 osname = "Syllable";
15454 break;
15455 case GNU_ABI_TAG_NACL:
15456 osname = "NaCl";
15457 break;
664f90a3
TT
15458 default:
15459 osname = "Unknown";
15460 break;
15461 }
15462
15463 printf (_(" OS: %s, ABI: %ld.%ld.%ld\n"), osname,
15464 major, minor, subminor);
15465 }
15466 break;
926c5385
CC
15467
15468 case NT_GNU_GOLD_VERSION:
15469 {
15470 unsigned long i;
15471
15472 printf (_(" Version: "));
15473 for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
15474 printf ("%c", pnote->descdata[i]);
15475 printf ("\n");
15476 }
15477 break;
664f90a3
TT
15478 }
15479
15480 return 1;
15481}
15482
685080f2
NC
15483static const char *
15484get_v850_elf_note_type (enum v850_notes n_type)
15485{
15486 static char buff[64];
15487
15488 switch (n_type)
15489 {
15490 case V850_NOTE_ALIGNMENT: return _("Alignment of 8-byte objects");
15491 case V850_NOTE_DATA_SIZE: return _("Sizeof double and long double");
15492 case V850_NOTE_FPU_INFO: return _("Type of FPU support needed");
15493 case V850_NOTE_SIMD_INFO: return _("Use of SIMD instructions");
15494 case V850_NOTE_CACHE_INFO: return _("Use of cache");
15495 case V850_NOTE_MMU_INFO: return _("Use of MMU");
15496 default:
15497 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
15498 return buff;
15499 }
15500}
15501
15502static int
15503print_v850_note (Elf_Internal_Note * pnote)
15504{
15505 unsigned int val;
15506
15507 if (pnote->descsz != 4)
15508 return 0;
15509 val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
15510
15511 if (val == 0)
15512 {
15513 printf (_("not set\n"));
15514 return 1;
15515 }
15516
15517 switch (pnote->type)
15518 {
15519 case V850_NOTE_ALIGNMENT:
15520 switch (val)
15521 {
15522 case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return 1;
15523 case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return 1;
15524 }
15525 break;
14ae95f2 15526
685080f2
NC
15527 case V850_NOTE_DATA_SIZE:
15528 switch (val)
15529 {
15530 case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return 1;
15531 case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return 1;
15532 }
15533 break;
14ae95f2 15534
685080f2
NC
15535 case V850_NOTE_FPU_INFO:
15536 switch (val)
15537 {
15538 case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return 1;
15539 case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return 1;
15540 }
15541 break;
14ae95f2 15542
685080f2
NC
15543 case V850_NOTE_MMU_INFO:
15544 case V850_NOTE_CACHE_INFO:
15545 case V850_NOTE_SIMD_INFO:
15546 if (val == EF_RH850_SIMD)
15547 {
15548 printf (_("yes\n"));
15549 return 1;
15550 }
15551 break;
15552
15553 default:
15554 /* An 'unknown note type' message will already have been displayed. */
15555 break;
15556 }
15557
15558 printf (_("unknown value: %x\n"), val);
15559 return 0;
15560}
15561
c6056a74
SF
15562static int
15563process_netbsd_elf_note (Elf_Internal_Note * pnote)
15564{
15565 unsigned int version;
15566
15567 switch (pnote->type)
15568 {
15569 case NT_NETBSD_IDENT:
15570 version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
15571 if ((version / 10000) % 100)
15572 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
15573 version, version / 100000000, (version / 1000000) % 100,
15574 (version / 10000) % 100 > 26 ? "Z" : "",
15575 'A' + (version / 10000) % 26);
15576 else
15577 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
15578 version, version / 100000000, (version / 1000000) % 100,
15579 (version / 100) % 100);
15580 return 1;
15581
15582 case NT_NETBSD_MARCH:
15583 printf (" NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
15584 pnote->descdata);
15585 return 1;
15586
15587 default:
15588 break;
15589 }
15590
15591 printf (" NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
15592 pnote->type);
15593 return 1;
15594}
15595
f4ddf30f
JB
15596static const char *
15597get_freebsd_elfcore_note_type (unsigned e_type)
15598{
f4ddf30f
JB
15599 switch (e_type)
15600 {
15601 case NT_FREEBSD_THRMISC:
15602 return _("NT_THRMISC (thrmisc structure)");
15603 case NT_FREEBSD_PROCSTAT_PROC:
15604 return _("NT_PROCSTAT_PROC (proc data)");
15605 case NT_FREEBSD_PROCSTAT_FILES:
15606 return _("NT_PROCSTAT_FILES (files data)");
15607 case NT_FREEBSD_PROCSTAT_VMMAP:
15608 return _("NT_PROCSTAT_VMMAP (vmmap data)");
15609 case NT_FREEBSD_PROCSTAT_GROUPS:
15610 return _("NT_PROCSTAT_GROUPS (groups data)");
15611 case NT_FREEBSD_PROCSTAT_UMASK:
15612 return _("NT_PROCSTAT_UMASK (umask data)");
15613 case NT_FREEBSD_PROCSTAT_RLIMIT:
15614 return _("NT_PROCSTAT_RLIMIT (rlimit data)");
15615 case NT_FREEBSD_PROCSTAT_OSREL:
15616 return _("NT_PROCSTAT_OSREL (osreldate data)");
15617 case NT_FREEBSD_PROCSTAT_PSSTRINGS:
15618 return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
15619 case NT_FREEBSD_PROCSTAT_AUXV:
15620 return _("NT_PROCSTAT_AUXV (auxv data)");
15621 }
15622 return get_note_type (e_type);
15623}
15624
9437c45b 15625static const char *
d3ba0551 15626get_netbsd_elfcore_note_type (unsigned e_type)
9437c45b
JT
15627{
15628 static char buff[64];
15629
b4db1224 15630 if (e_type == NT_NETBSDCORE_PROCINFO)
9437c45b
JT
15631 {
15632 /* NetBSD core "procinfo" structure. */
15633 return _("NetBSD procinfo structure");
15634 }
15635
15636 /* As of Jan 2002 there are no other machine-independent notes
15637 defined for NetBSD core files. If the note type is less
15638 than the start of the machine-dependent note types, we don't
15639 understand it. */
15640
b4db1224 15641 if (e_type < NT_NETBSDCORE_FIRSTMACH)
9437c45b 15642 {
e9e44622 15643 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
9437c45b
JT
15644 return buff;
15645 }
15646
15647 switch (elf_header.e_machine)
15648 {
15649 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
15650 and PT_GETFPREGS == mach+2. */
15651
15652 case EM_OLD_ALPHA:
15653 case EM_ALPHA:
15654 case EM_SPARC:
15655 case EM_SPARC32PLUS:
15656 case EM_SPARCV9:
15657 switch (e_type)
15658 {
2b692964 15659 case NT_NETBSDCORE_FIRSTMACH + 0:
b4db1224 15660 return _("PT_GETREGS (reg structure)");
2b692964 15661 case NT_NETBSDCORE_FIRSTMACH + 2:
b4db1224 15662 return _("PT_GETFPREGS (fpreg structure)");
9437c45b
JT
15663 default:
15664 break;
15665 }
15666 break;
15667
15668 /* On all other arch's, PT_GETREGS == mach+1 and
15669 PT_GETFPREGS == mach+3. */
15670 default:
15671 switch (e_type)
15672 {
2b692964 15673 case NT_NETBSDCORE_FIRSTMACH + 1:
b4db1224 15674 return _("PT_GETREGS (reg structure)");
2b692964 15675 case NT_NETBSDCORE_FIRSTMACH + 3:
b4db1224 15676 return _("PT_GETFPREGS (fpreg structure)");
9437c45b
JT
15677 default:
15678 break;
15679 }
15680 }
15681
9cf03b7e 15682 snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
e9e44622 15683 e_type - NT_NETBSDCORE_FIRSTMACH);
9437c45b
JT
15684 return buff;
15685}
15686
70616151
TT
15687static const char *
15688get_stapsdt_note_type (unsigned e_type)
15689{
15690 static char buff[64];
15691
15692 switch (e_type)
15693 {
15694 case NT_STAPSDT:
15695 return _("NT_STAPSDT (SystemTap probe descriptors)");
15696
15697 default:
15698 break;
15699 }
15700
15701 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15702 return buff;
15703}
15704
c6a9fc58
TT
15705static int
15706print_stapsdt_note (Elf_Internal_Note *pnote)
15707{
15708 int addr_size = is_32bit_elf ? 4 : 8;
15709 char *data = pnote->descdata;
15710 char *data_end = pnote->descdata + pnote->descsz;
15711 bfd_vma pc, base_addr, semaphore;
15712 char *provider, *probe, *arg_fmt;
15713
15714 pc = byte_get ((unsigned char *) data, addr_size);
15715 data += addr_size;
15716 base_addr = byte_get ((unsigned char *) data, addr_size);
15717 data += addr_size;
15718 semaphore = byte_get ((unsigned char *) data, addr_size);
15719 data += addr_size;
15720
15721 provider = data;
15722 data += strlen (data) + 1;
15723 probe = data;
15724 data += strlen (data) + 1;
15725 arg_fmt = data;
15726 data += strlen (data) + 1;
15727
15728 printf (_(" Provider: %s\n"), provider);
15729 printf (_(" Name: %s\n"), probe);
15730 printf (_(" Location: "));
15731 print_vma (pc, FULL_HEX);
15732 printf (_(", Base: "));
15733 print_vma (base_addr, FULL_HEX);
15734 printf (_(", Semaphore: "));
15735 print_vma (semaphore, FULL_HEX);
9cf03b7e 15736 printf ("\n");
c6a9fc58
TT
15737 printf (_(" Arguments: %s\n"), arg_fmt);
15738
15739 return data == data_end;
15740}
15741
00e98fc7
TG
15742static const char *
15743get_ia64_vms_note_type (unsigned e_type)
15744{
15745 static char buff[64];
15746
15747 switch (e_type)
15748 {
15749 case NT_VMS_MHD:
15750 return _("NT_VMS_MHD (module header)");
15751 case NT_VMS_LNM:
15752 return _("NT_VMS_LNM (language name)");
15753 case NT_VMS_SRC:
15754 return _("NT_VMS_SRC (source files)");
15755 case NT_VMS_TITLE:
9cf03b7e 15756 return "NT_VMS_TITLE";
00e98fc7
TG
15757 case NT_VMS_EIDC:
15758 return _("NT_VMS_EIDC (consistency check)");
15759 case NT_VMS_FPMODE:
15760 return _("NT_VMS_FPMODE (FP mode)");
15761 case NT_VMS_LINKTIME:
9cf03b7e 15762 return "NT_VMS_LINKTIME";
00e98fc7
TG
15763 case NT_VMS_IMGNAM:
15764 return _("NT_VMS_IMGNAM (image name)");
15765 case NT_VMS_IMGID:
15766 return _("NT_VMS_IMGID (image id)");
15767 case NT_VMS_LINKID:
15768 return _("NT_VMS_LINKID (link id)");
15769 case NT_VMS_IMGBID:
15770 return _("NT_VMS_IMGBID (build id)");
15771 case NT_VMS_GSTNAM:
15772 return _("NT_VMS_GSTNAM (sym table name)");
15773 case NT_VMS_ORIG_DYN:
9cf03b7e 15774 return "NT_VMS_ORIG_DYN";
00e98fc7 15775 case NT_VMS_PATCHTIME:
9cf03b7e 15776 return "NT_VMS_PATCHTIME";
00e98fc7
TG
15777 default:
15778 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15779 return buff;
15780 }
15781}
15782
15783static int
15784print_ia64_vms_note (Elf_Internal_Note * pnote)
15785{
15786 switch (pnote->type)
15787 {
15788 case NT_VMS_MHD:
15789 if (pnote->descsz > 36)
15790 {
15791 size_t l = strlen (pnote->descdata + 34);
15792 printf (_(" Creation date : %.17s\n"), pnote->descdata);
15793 printf (_(" Last patch date: %.17s\n"), pnote->descdata + 17);
15794 printf (_(" Module name : %s\n"), pnote->descdata + 34);
15795 printf (_(" Module version : %s\n"), pnote->descdata + 34 + l + 1);
15796 }
15797 else
15798 printf (_(" Invalid size\n"));
15799 break;
15800 case NT_VMS_LNM:
15801 printf (_(" Language: %s\n"), pnote->descdata);
15802 break;
15803#ifdef BFD64
15804 case NT_VMS_FPMODE:
9cf03b7e 15805 printf (_(" Floating Point mode: "));
4a5cb34f 15806 printf ("0x%016" BFD_VMA_FMT "x\n",
948f632f 15807 (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
00e98fc7
TG
15808 break;
15809 case NT_VMS_LINKTIME:
15810 printf (_(" Link time: "));
15811 print_vms_time
15812 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
15813 printf ("\n");
15814 break;
15815 case NT_VMS_PATCHTIME:
15816 printf (_(" Patch time: "));
15817 print_vms_time
15818 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
15819 printf ("\n");
15820 break;
15821 case NT_VMS_ORIG_DYN:
15822 printf (_(" Major id: %u, minor id: %u\n"),
15823 (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
15824 (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
9cf03b7e 15825 printf (_(" Last modified : "));
00e98fc7
TG
15826 print_vms_time
15827 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
9cf03b7e 15828 printf (_("\n Link flags : "));
4a5cb34f 15829 printf ("0x%016" BFD_VMA_FMT "x\n",
948f632f 15830 (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
00e98fc7 15831 printf (_(" Header flags: 0x%08x\n"),
948f632f 15832 (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
00e98fc7
TG
15833 printf (_(" Image id : %s\n"), pnote->descdata + 32);
15834 break;
15835#endif
15836 case NT_VMS_IMGNAM:
15837 printf (_(" Image name: %s\n"), pnote->descdata);
15838 break;
15839 case NT_VMS_GSTNAM:
15840 printf (_(" Global symbol table name: %s\n"), pnote->descdata);
15841 break;
15842 case NT_VMS_IMGID:
15843 printf (_(" Image id: %s\n"), pnote->descdata);
15844 break;
15845 case NT_VMS_LINKID:
15846 printf (_(" Linker id: %s\n"), pnote->descdata);
15847 break;
15848 default:
15849 break;
15850 }
15851 return 1;
15852}
15853
6d118b09
NC
15854/* Note that by the ELF standard, the name field is already null byte
15855 terminated, and namesz includes the terminating null byte.
15856 I.E. the value of namesz for the name "FSF" is 4.
15857
e3c8793a 15858 If the value of namesz is zero, there is no name present. */
779fe533 15859static int
2cf0635d 15860process_note (Elf_Internal_Note * pnote)
779fe533 15861{
2cf0635d
NC
15862 const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
15863 const char * nt;
9437c45b
JT
15864
15865 if (pnote->namesz == 0)
1ec5cd37
NC
15866 /* If there is no note name, then use the default set of
15867 note type strings. */
15868 nt = get_note_type (pnote->type);
15869
1118d252
RM
15870 else if (const_strneq (pnote->namedata, "GNU"))
15871 /* GNU-specific object file notes. */
15872 nt = get_gnu_elf_note_type (pnote->type);
f4ddf30f
JB
15873
15874 else if (const_strneq (pnote->namedata, "FreeBSD"))
15875 /* FreeBSD-specific core file notes. */
15876 nt = get_freebsd_elfcore_note_type (pnote->type);
1118d252 15877
0112cd26 15878 else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
1ec5cd37
NC
15879 /* NetBSD-specific core file notes. */
15880 nt = get_netbsd_elfcore_note_type (pnote->type);
15881
c6056a74
SF
15882 else if (const_strneq (pnote->namedata, "NetBSD"))
15883 /* NetBSD-specific core file notes. */
15884 return process_netbsd_elf_note (pnote);
15885
b15fa79e
AM
15886 else if (strneq (pnote->namedata, "SPU/", 4))
15887 {
15888 /* SPU-specific core file notes. */
15889 nt = pnote->namedata + 4;
15890 name = "SPU";
15891 }
15892
00e98fc7
TG
15893 else if (const_strneq (pnote->namedata, "IPF/VMS"))
15894 /* VMS/ia64-specific file notes. */
15895 nt = get_ia64_vms_note_type (pnote->type);
15896
70616151
TT
15897 else if (const_strneq (pnote->namedata, "stapsdt"))
15898 nt = get_stapsdt_note_type (pnote->type);
15899
9437c45b 15900 else
1ec5cd37
NC
15901 /* Don't recognize this note name; just use the default set of
15902 note type strings. */
00e98fc7 15903 nt = get_note_type (pnote->type);
9437c45b 15904
2aee03ae 15905 printf (" %-20s 0x%08lx\t%s\n", name, pnote->descsz, nt);
00e98fc7
TG
15906
15907 if (const_strneq (pnote->namedata, "IPF/VMS"))
15908 return print_ia64_vms_note (pnote);
664f90a3
TT
15909 else if (const_strneq (pnote->namedata, "GNU"))
15910 return print_gnu_note (pnote);
c6a9fc58
TT
15911 else if (const_strneq (pnote->namedata, "stapsdt"))
15912 return print_stapsdt_note (pnote);
9ece1fa9
TT
15913 else if (const_strneq (pnote->namedata, "CORE"))
15914 return print_core_note (pnote);
00e98fc7
TG
15915 else
15916 return 1;
779fe533
NC
15917}
15918
6d118b09 15919
779fe533 15920static int
2cf0635d 15921process_corefile_note_segment (FILE * file, bfd_vma offset, bfd_vma length)
779fe533 15922{
2cf0635d
NC
15923 Elf_External_Note * pnotes;
15924 Elf_External_Note * external;
c8071705 15925 char * end;
b34976b6 15926 int res = 1;
103f02d3 15927
779fe533
NC
15928 if (length <= 0)
15929 return 0;
103f02d3 15930
3f5e193b 15931 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
15b42fb0 15932 _("notes"));
dd24e3da 15933 if (pnotes == NULL)
a6e9f9df 15934 return 0;
779fe533 15935
103f02d3 15936 external = pnotes;
103f02d3 15937
9dd3a467 15938 printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
f3485b74 15939 (unsigned long) offset, (unsigned long) length);
2aee03ae 15940 printf (_(" %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
103f02d3 15941
c8071705
NC
15942 end = (char *) pnotes + length;
15943 while ((char *) external < end)
779fe533 15944 {
b34976b6 15945 Elf_Internal_Note inote;
15b42fb0
AM
15946 size_t min_notesz;
15947 char *next;
2cf0635d 15948 char * temp = NULL;
c8071705 15949 size_t data_remaining = end - (char *) external;
6d118b09 15950
00e98fc7 15951 if (!is_ia64_vms ())
15b42fb0 15952 {
9dd3a467
NC
15953 /* PR binutils/15191
15954 Make sure that there is enough data to read. */
15b42fb0
AM
15955 min_notesz = offsetof (Elf_External_Note, name);
15956 if (data_remaining < min_notesz)
9dd3a467
NC
15957 {
15958 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
15959 (int) data_remaining);
15960 break;
15961 }
15b42fb0
AM
15962 inote.type = BYTE_GET (external->type);
15963 inote.namesz = BYTE_GET (external->namesz);
15964 inote.namedata = external->name;
15965 inote.descsz = BYTE_GET (external->descsz);
15966 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
834f871c 15967 /* PR 17531: file: 3443835e. */
c8071705 15968 if (inote.descdata < (char *) pnotes || inote.descdata > end)
834f871c
NC
15969 {
15970 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
15971 inote.descdata = inote.namedata;
15972 inote.namesz = 0;
15973 }
14ae95f2 15974
15b42fb0
AM
15975 inote.descpos = offset + (inote.descdata - (char *) pnotes);
15976 next = inote.descdata + align_power (inote.descsz, 2);
15977 }
00e98fc7 15978 else
15b42fb0
AM
15979 {
15980 Elf64_External_VMS_Note *vms_external;
00e98fc7 15981
9dd3a467
NC
15982 /* PR binutils/15191
15983 Make sure that there is enough data to read. */
15b42fb0
AM
15984 min_notesz = offsetof (Elf64_External_VMS_Note, name);
15985 if (data_remaining < min_notesz)
9dd3a467
NC
15986 {
15987 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
15988 (int) data_remaining);
15989 break;
15990 }
3e55a963 15991
15b42fb0
AM
15992 vms_external = (Elf64_External_VMS_Note *) external;
15993 inote.type = BYTE_GET (vms_external->type);
15994 inote.namesz = BYTE_GET (vms_external->namesz);
15995 inote.namedata = vms_external->name;
15996 inote.descsz = BYTE_GET (vms_external->descsz);
15997 inote.descdata = inote.namedata + align_power (inote.namesz, 3);
15998 inote.descpos = offset + (inote.descdata - (char *) pnotes);
15999 next = inote.descdata + align_power (inote.descsz, 3);
16000 }
16001
16002 if (inote.descdata < (char *) external + min_notesz
16003 || next < (char *) external + min_notesz
5d921cbd
NC
16004 /* PR binutils/17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4. */
16005 || inote.namedata + inote.namesz < inote.namedata
16006 || inote.descdata + inote.descsz < inote.descdata
15b42fb0 16007 || data_remaining < (size_t)(next - (char *) external))
3e55a963 16008 {
15b42fb0 16009 warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
0af1713e 16010 (unsigned long) ((char *) external - (char *) pnotes));
9dd3a467 16011 warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
3e55a963
NC
16012 inote.type, inote.namesz, inote.descsz);
16013 break;
16014 }
16015
15b42fb0 16016 external = (Elf_External_Note *) next;
dd24e3da 16017
6d118b09
NC
16018 /* Verify that name is null terminated. It appears that at least
16019 one version of Linux (RedHat 6.0) generates corefiles that don't
16020 comply with the ELF spec by failing to include the null byte in
16021 namesz. */
8b971f9f 16022 if (inote.namedata[inote.namesz - 1] != '\0')
6d118b09 16023 {
3f5e193b 16024 temp = (char *) malloc (inote.namesz + 1);
6d118b09
NC
16025 if (temp == NULL)
16026 {
8b73c356 16027 error (_("Out of memory allocating space for inote name\n"));
6d118b09
NC
16028 res = 0;
16029 break;
16030 }
76da6bbe 16031
6d118b09
NC
16032 strncpy (temp, inote.namedata, inote.namesz);
16033 temp[inote.namesz] = 0;
76da6bbe 16034
6d118b09
NC
16035 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
16036 inote.namedata = temp;
16037 }
16038
16039 res &= process_note (& inote);
103f02d3 16040
6d118b09
NC
16041 if (temp != NULL)
16042 {
16043 free (temp);
16044 temp = NULL;
16045 }
779fe533
NC
16046 }
16047
16048 free (pnotes);
103f02d3 16049
779fe533
NC
16050 return res;
16051}
16052
16053static int
2cf0635d 16054process_corefile_note_segments (FILE * file)
779fe533 16055{
2cf0635d 16056 Elf_Internal_Phdr * segment;
b34976b6
AM
16057 unsigned int i;
16058 int res = 1;
103f02d3 16059
d93f0186 16060 if (! get_program_headers (file))
779fe533 16061 return 0;
103f02d3 16062
779fe533
NC
16063 for (i = 0, segment = program_headers;
16064 i < elf_header.e_phnum;
b34976b6 16065 i++, segment++)
779fe533
NC
16066 {
16067 if (segment->p_type == PT_NOTE)
103f02d3 16068 res &= process_corefile_note_segment (file,
30800947
NC
16069 (bfd_vma) segment->p_offset,
16070 (bfd_vma) segment->p_filesz);
779fe533 16071 }
103f02d3 16072
779fe533
NC
16073 return res;
16074}
16075
685080f2
NC
16076static int
16077process_v850_notes (FILE * file, bfd_vma offset, bfd_vma length)
16078{
16079 Elf_External_Note * pnotes;
16080 Elf_External_Note * external;
c8071705 16081 char * end;
685080f2
NC
16082 int res = 1;
16083
16084 if (length <= 0)
16085 return 0;
16086
16087 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
16088 _("v850 notes"));
16089 if (pnotes == NULL)
16090 return 0;
16091
16092 external = pnotes;
c8071705 16093 end = (char*) pnotes + length;
685080f2
NC
16094
16095 printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
16096 (unsigned long) offset, (unsigned long) length);
16097
c8071705 16098 while ((char *) external + sizeof (Elf_External_Note) < end)
685080f2
NC
16099 {
16100 Elf_External_Note * next;
16101 Elf_Internal_Note inote;
16102
16103 inote.type = BYTE_GET (external->type);
16104 inote.namesz = BYTE_GET (external->namesz);
16105 inote.namedata = external->name;
16106 inote.descsz = BYTE_GET (external->descsz);
16107 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
16108 inote.descpos = offset + (inote.descdata - (char *) pnotes);
16109
c8071705
NC
16110 if (inote.descdata < (char *) pnotes || inote.descdata >= end)
16111 {
16112 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
16113 inote.descdata = inote.namedata;
16114 inote.namesz = 0;
16115 }
16116
685080f2
NC
16117 next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
16118
c8071705 16119 if ( ((char *) next > end)
685080f2
NC
16120 || ((char *) next < (char *) pnotes))
16121 {
16122 warn (_("corrupt descsz found in note at offset 0x%lx\n"),
16123 (unsigned long) ((char *) external - (char *) pnotes));
16124 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
16125 inote.type, inote.namesz, inote.descsz);
16126 break;
16127 }
16128
16129 external = next;
16130
16131 /* Prevent out-of-bounds indexing. */
c8071705 16132 if ( inote.namedata + inote.namesz > end
685080f2
NC
16133 || inote.namedata + inote.namesz < inote.namedata)
16134 {
16135 warn (_("corrupt namesz found in note at offset 0x%lx\n"),
16136 (unsigned long) ((char *) external - (char *) pnotes));
16137 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
16138 inote.type, inote.namesz, inote.descsz);
16139 break;
16140 }
16141
16142 printf (" %s: ", get_v850_elf_note_type (inote.type));
16143
16144 if (! print_v850_note (& inote))
16145 {
16146 res = 0;
16147 printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
16148 inote.namesz, inote.descsz);
16149 }
16150 }
16151
16152 free (pnotes);
16153
16154 return res;
16155}
16156
779fe533 16157static int
2cf0635d 16158process_note_sections (FILE * file)
1ec5cd37 16159{
2cf0635d 16160 Elf_Internal_Shdr * section;
1ec5cd37 16161 unsigned long i;
df565f32 16162 int n = 0;
1ec5cd37
NC
16163 int res = 1;
16164
16165 for (i = 0, section = section_headers;
fa1908fd 16166 i < elf_header.e_shnum && section != NULL;
1ec5cd37 16167 i++, section++)
685080f2
NC
16168 {
16169 if (section->sh_type == SHT_NOTE)
16170 {
16171 res &= process_corefile_note_segment (file,
16172 (bfd_vma) section->sh_offset,
16173 (bfd_vma) section->sh_size);
16174 n++;
16175 }
16176
16177 if (( elf_header.e_machine == EM_V800
16178 || elf_header.e_machine == EM_V850
16179 || elf_header.e_machine == EM_CYGNUS_V850)
16180 && section->sh_type == SHT_RENESAS_INFO)
16181 {
16182 res &= process_v850_notes (file,
16183 (bfd_vma) section->sh_offset,
16184 (bfd_vma) section->sh_size);
16185 n++;
16186 }
16187 }
df565f32
NC
16188
16189 if (n == 0)
16190 /* Try processing NOTE segments instead. */
16191 return process_corefile_note_segments (file);
1ec5cd37
NC
16192
16193 return res;
16194}
16195
16196static int
2cf0635d 16197process_notes (FILE * file)
779fe533
NC
16198{
16199 /* If we have not been asked to display the notes then do nothing. */
16200 if (! do_notes)
16201 return 1;
103f02d3 16202
779fe533 16203 if (elf_header.e_type != ET_CORE)
1ec5cd37 16204 return process_note_sections (file);
103f02d3 16205
779fe533 16206 /* No program headers means no NOTE segment. */
1ec5cd37
NC
16207 if (elf_header.e_phnum > 0)
16208 return process_corefile_note_segments (file);
779fe533 16209
1ec5cd37
NC
16210 printf (_("No note segments present in the core file.\n"));
16211 return 1;
779fe533
NC
16212}
16213
252b5132 16214static int
2cf0635d 16215process_arch_specific (FILE * file)
252b5132 16216{
a952a375
NC
16217 if (! do_arch)
16218 return 1;
16219
252b5132
RH
16220 switch (elf_header.e_machine)
16221 {
11c1ff18
PB
16222 case EM_ARM:
16223 return process_arm_specific (file);
252b5132 16224 case EM_MIPS:
4fe85591 16225 case EM_MIPS_RS3_LE:
252b5132
RH
16226 return process_mips_specific (file);
16227 break;
35c08157
KLC
16228 case EM_NDS32:
16229 return process_nds32_specific (file);
16230 break;
34c8bcba
JM
16231 case EM_PPC:
16232 return process_power_specific (file);
16233 break;
643f7afb
AK
16234 case EM_S390:
16235 case EM_S390_OLD:
16236 return process_s390_specific (file);
16237 break;
9e8c70f9
DM
16238 case EM_SPARC:
16239 case EM_SPARC32PLUS:
16240 case EM_SPARCV9:
16241 return process_sparc_specific (file);
16242 break;
59e6276b
JM
16243 case EM_TI_C6000:
16244 return process_tic6x_specific (file);
16245 break;
13761a11
NC
16246 case EM_MSP430:
16247 return process_msp430x_specific (file);
252b5132
RH
16248 default:
16249 break;
16250 }
16251 return 1;
16252}
16253
16254static int
2cf0635d 16255get_file_header (FILE * file)
252b5132 16256{
9ea033b2
NC
16257 /* Read in the identity array. */
16258 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
252b5132
RH
16259 return 0;
16260
9ea033b2 16261 /* Determine how to read the rest of the header. */
b34976b6 16262 switch (elf_header.e_ident[EI_DATA])
9ea033b2
NC
16263 {
16264 default: /* fall through */
16265 case ELFDATANONE: /* fall through */
adab8cdc
AO
16266 case ELFDATA2LSB:
16267 byte_get = byte_get_little_endian;
16268 byte_put = byte_put_little_endian;
16269 break;
16270 case ELFDATA2MSB:
16271 byte_get = byte_get_big_endian;
16272 byte_put = byte_put_big_endian;
16273 break;
9ea033b2
NC
16274 }
16275
16276 /* For now we only support 32 bit and 64 bit ELF files. */
b34976b6 16277 is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
9ea033b2
NC
16278
16279 /* Read in the rest of the header. */
16280 if (is_32bit_elf)
16281 {
16282 Elf32_External_Ehdr ehdr32;
252b5132 16283
9ea033b2
NC
16284 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
16285 return 0;
103f02d3 16286
9ea033b2
NC
16287 elf_header.e_type = BYTE_GET (ehdr32.e_type);
16288 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
16289 elf_header.e_version = BYTE_GET (ehdr32.e_version);
16290 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
16291 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
16292 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
16293 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
16294 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
16295 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
16296 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
16297 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
16298 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
16299 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
16300 }
252b5132 16301 else
9ea033b2
NC
16302 {
16303 Elf64_External_Ehdr ehdr64;
a952a375
NC
16304
16305 /* If we have been compiled with sizeof (bfd_vma) == 4, then
16306 we will not be able to cope with the 64bit data found in
16307 64 ELF files. Detect this now and abort before we start
50c2245b 16308 overwriting things. */
a952a375
NC
16309 if (sizeof (bfd_vma) < 8)
16310 {
e3c8793a
NC
16311 error (_("This instance of readelf has been built without support for a\n\
1631264 bit data type and so it cannot read 64 bit ELF files.\n"));
a952a375
NC
16313 return 0;
16314 }
103f02d3 16315
9ea033b2
NC
16316 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
16317 return 0;
103f02d3 16318
9ea033b2
NC
16319 elf_header.e_type = BYTE_GET (ehdr64.e_type);
16320 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
16321 elf_header.e_version = BYTE_GET (ehdr64.e_version);
66543521
AM
16322 elf_header.e_entry = BYTE_GET (ehdr64.e_entry);
16323 elf_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
16324 elf_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
9ea033b2
NC
16325 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
16326 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
16327 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
16328 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
16329 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
16330 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
16331 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
16332 }
252b5132 16333
7ece0d85
JJ
16334 if (elf_header.e_shoff)
16335 {
16336 /* There may be some extensions in the first section header. Don't
16337 bomb if we can't read it. */
16338 if (is_32bit_elf)
049b0c3a 16339 get_32bit_section_headers (file, TRUE);
7ece0d85 16340 else
049b0c3a 16341 get_64bit_section_headers (file, TRUE);
7ece0d85 16342 }
560f3c1c 16343
252b5132
RH
16344 return 1;
16345}
16346
fb52b2f4
NC
16347/* Process one ELF object file according to the command line options.
16348 This file may actually be stored in an archive. The file is
16349 positioned at the start of the ELF object. */
16350
ff78d6d6 16351static int
2cf0635d 16352process_object (char * file_name, FILE * file)
252b5132 16353{
252b5132
RH
16354 unsigned int i;
16355
252b5132
RH
16356 if (! get_file_header (file))
16357 {
16358 error (_("%s: Failed to read file header\n"), file_name);
ff78d6d6 16359 return 1;
252b5132
RH
16360 }
16361
16362 /* Initialise per file variables. */
60bca95a 16363 for (i = ARRAY_SIZE (version_info); i--;)
252b5132
RH
16364 version_info[i] = 0;
16365
60bca95a 16366 for (i = ARRAY_SIZE (dynamic_info); i--;)
252b5132 16367 dynamic_info[i] = 0;
5115b233 16368 dynamic_info_DT_GNU_HASH = 0;
252b5132
RH
16369
16370 /* Process the file. */
16371 if (show_name)
16372 printf (_("\nFile: %s\n"), file_name);
16373
18bd398b
NC
16374 /* Initialise the dump_sects array from the cmdline_dump_sects array.
16375 Note we do this even if cmdline_dump_sects is empty because we
16376 must make sure that the dump_sets array is zeroed out before each
16377 object file is processed. */
16378 if (num_dump_sects > num_cmdline_dump_sects)
09c11c86 16379 memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
18bd398b
NC
16380
16381 if (num_cmdline_dump_sects > 0)
16382 {
16383 if (num_dump_sects == 0)
16384 /* A sneaky way of allocating the dump_sects array. */
09c11c86 16385 request_dump_bynumber (num_cmdline_dump_sects, 0);
18bd398b
NC
16386
16387 assert (num_dump_sects >= num_cmdline_dump_sects);
09c11c86
NC
16388 memcpy (dump_sects, cmdline_dump_sects,
16389 num_cmdline_dump_sects * sizeof (* dump_sects));
18bd398b 16390 }
d70c5fc7 16391
252b5132 16392 if (! process_file_header ())
fb52b2f4 16393 return 1;
252b5132 16394
d1f5c6e3 16395 if (! process_section_headers (file))
2f62977e 16396 {
d1f5c6e3
L
16397 /* Without loaded section headers we cannot process lots of
16398 things. */
2f62977e 16399 do_unwind = do_version = do_dump = do_arch = 0;
252b5132 16400
2f62977e 16401 if (! do_using_dynamic)
2c610e4b 16402 do_syms = do_dyn_syms = do_reloc = 0;
2f62977e 16403 }
252b5132 16404
d1f5c6e3
L
16405 if (! process_section_groups (file))
16406 {
16407 /* Without loaded section groups we cannot process unwind. */
16408 do_unwind = 0;
16409 }
16410
2f62977e 16411 if (process_program_headers (file))
b2d38a17 16412 process_dynamic_section (file);
252b5132
RH
16413
16414 process_relocs (file);
16415
4d6ed7c8
NC
16416 process_unwind (file);
16417
252b5132
RH
16418 process_symbol_table (file);
16419
16420 process_syminfo (file);
16421
16422 process_version_sections (file);
16423
16424 process_section_contents (file);
f5842774 16425
1ec5cd37 16426 process_notes (file);
103f02d3 16427
047b2264
JJ
16428 process_gnu_liblist (file);
16429
252b5132
RH
16430 process_arch_specific (file);
16431
d93f0186
NC
16432 if (program_headers)
16433 {
16434 free (program_headers);
16435 program_headers = NULL;
16436 }
16437
252b5132
RH
16438 if (section_headers)
16439 {
16440 free (section_headers);
16441 section_headers = NULL;
16442 }
16443
16444 if (string_table)
16445 {
16446 free (string_table);
16447 string_table = NULL;
d40ac9bd 16448 string_table_length = 0;
252b5132
RH
16449 }
16450
16451 if (dynamic_strings)
16452 {
16453 free (dynamic_strings);
16454 dynamic_strings = NULL;
d79b3d50 16455 dynamic_strings_length = 0;
252b5132
RH
16456 }
16457
16458 if (dynamic_symbols)
16459 {
16460 free (dynamic_symbols);
16461 dynamic_symbols = NULL;
19936277 16462 num_dynamic_syms = 0;
252b5132
RH
16463 }
16464
16465 if (dynamic_syminfo)
16466 {
16467 free (dynamic_syminfo);
16468 dynamic_syminfo = NULL;
16469 }
ff78d6d6 16470
293c573e
MR
16471 if (dynamic_section)
16472 {
16473 free (dynamic_section);
16474 dynamic_section = NULL;
16475 }
16476
e4b17d5c
L
16477 if (section_headers_groups)
16478 {
16479 free (section_headers_groups);
16480 section_headers_groups = NULL;
16481 }
16482
16483 if (section_groups)
16484 {
2cf0635d
NC
16485 struct group_list * g;
16486 struct group_list * next;
e4b17d5c
L
16487
16488 for (i = 0; i < group_count; i++)
16489 {
16490 for (g = section_groups [i].root; g != NULL; g = next)
16491 {
16492 next = g->next;
16493 free (g);
16494 }
16495 }
16496
16497 free (section_groups);
16498 section_groups = NULL;
16499 }
16500
19e6b90e 16501 free_debug_memory ();
18bd398b 16502
ff78d6d6 16503 return 0;
252b5132
RH
16504}
16505
2cf0635d
NC
16506/* Process an ELF archive.
16507 On entry the file is positioned just after the ARMAG string. */
16508
16509static int
16510process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
16511{
16512 struct archive_info arch;
16513 struct archive_info nested_arch;
16514 size_t got;
2cf0635d
NC
16515 int ret;
16516
16517 show_name = 1;
16518
16519 /* The ARCH structure is used to hold information about this archive. */
16520 arch.file_name = NULL;
16521 arch.file = NULL;
16522 arch.index_array = NULL;
16523 arch.sym_table = NULL;
16524 arch.longnames = NULL;
16525
16526 /* The NESTED_ARCH structure is used as a single-item cache of information
16527 about a nested archive (when members of a thin archive reside within
16528 another regular archive file). */
16529 nested_arch.file_name = NULL;
16530 nested_arch.file = NULL;
16531 nested_arch.index_array = NULL;
16532 nested_arch.sym_table = NULL;
16533 nested_arch.longnames = NULL;
16534
16535 if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
16536 {
16537 ret = 1;
16538 goto out;
4145f1d5 16539 }
fb52b2f4 16540
4145f1d5
NC
16541 if (do_archive_index)
16542 {
2cf0635d 16543 if (arch.sym_table == NULL)
4145f1d5
NC
16544 error (_("%s: unable to dump the index as none was found\n"), file_name);
16545 else
16546 {
591f7597 16547 unsigned long i, l;
4145f1d5
NC
16548 unsigned long current_pos;
16549
591f7597
NC
16550 printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
16551 file_name, (unsigned long) arch.index_num, arch.sym_size);
4145f1d5
NC
16552 current_pos = ftell (file);
16553
2cf0635d 16554 for (i = l = 0; i < arch.index_num; i++)
4145f1d5 16555 {
2cf0635d
NC
16556 if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
16557 {
16558 char * member_name;
4145f1d5 16559
2cf0635d
NC
16560 member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
16561
16562 if (member_name != NULL)
16563 {
16564 char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
16565
16566 if (qualified_name != NULL)
16567 {
c2a7d3f5
NC
16568 printf (_("Contents of binary %s at offset "), qualified_name);
16569 (void) print_vma (arch.index_array[i], PREFIX_HEX);
16570 putchar ('\n');
2cf0635d
NC
16571 free (qualified_name);
16572 }
4145f1d5
NC
16573 }
16574 }
2cf0635d
NC
16575
16576 if (l >= arch.sym_size)
4145f1d5
NC
16577 {
16578 error (_("%s: end of the symbol table reached before the end of the index\n"),
16579 file_name);
cb8f3167 16580 break;
4145f1d5 16581 }
591f7597
NC
16582 /* PR 17531: file: 0b6630b2. */
16583 printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
16584 l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
4145f1d5
NC
16585 }
16586
c2a7d3f5
NC
16587 if (arch.uses_64bit_indicies)
16588 l = (l + 7) & ~ 7;
16589 else
16590 l += l & 1;
16591
2cf0635d 16592 if (l < arch.sym_size)
c2a7d3f5
NC
16593 error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
16594 file_name, arch.sym_size - l);
4145f1d5 16595
4145f1d5
NC
16596 if (fseek (file, current_pos, SEEK_SET) != 0)
16597 {
16598 error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
2cf0635d
NC
16599 ret = 1;
16600 goto out;
4145f1d5 16601 }
fb52b2f4 16602 }
4145f1d5
NC
16603
16604 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
16605 && !do_segments && !do_header && !do_dump && !do_version
16606 && !do_histogram && !do_debugging && !do_arch && !do_notes
2c610e4b 16607 && !do_section_groups && !do_dyn_syms)
2cf0635d
NC
16608 {
16609 ret = 0; /* Archive index only. */
16610 goto out;
16611 }
fb52b2f4
NC
16612 }
16613
d989285c 16614 ret = 0;
fb52b2f4
NC
16615
16616 while (1)
16617 {
2cf0635d
NC
16618 char * name;
16619 size_t namelen;
16620 char * qualified_name;
16621
16622 /* Read the next archive header. */
16623 if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
16624 {
16625 error (_("%s: failed to seek to next archive header\n"), file_name);
16626 return 1;
16627 }
16628 got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
16629 if (got != sizeof arch.arhdr)
16630 {
16631 if (got == 0)
16632 break;
16633 error (_("%s: failed to read archive header\n"), file_name);
16634 ret = 1;
16635 break;
16636 }
16637 if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
16638 {
16639 error (_("%s: did not find a valid archive header\n"), arch.file_name);
16640 ret = 1;
16641 break;
16642 }
16643
16644 arch.next_arhdr_offset += sizeof arch.arhdr;
16645
16646 archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
16647 if (archive_file_size & 01)
16648 ++archive_file_size;
16649
16650 name = get_archive_member_name (&arch, &nested_arch);
16651 if (name == NULL)
fb52b2f4 16652 {
0fd3a477 16653 error (_("%s: bad archive file name\n"), file_name);
d989285c
ILT
16654 ret = 1;
16655 break;
fb52b2f4 16656 }
2cf0635d 16657 namelen = strlen (name);
fb52b2f4 16658
2cf0635d
NC
16659 qualified_name = make_qualified_name (&arch, &nested_arch, name);
16660 if (qualified_name == NULL)
fb52b2f4 16661 {
2cf0635d 16662 error (_("%s: bad archive file name\n"), file_name);
d989285c
ILT
16663 ret = 1;
16664 break;
fb52b2f4
NC
16665 }
16666
2cf0635d
NC
16667 if (is_thin_archive && arch.nested_member_origin == 0)
16668 {
16669 /* This is a proxy for an external member of a thin archive. */
16670 FILE * member_file;
16671 char * member_file_name = adjust_relative_path (file_name, name, namelen);
16672 if (member_file_name == NULL)
16673 {
16674 ret = 1;
16675 break;
16676 }
16677
16678 member_file = fopen (member_file_name, "rb");
16679 if (member_file == NULL)
16680 {
16681 error (_("Input file '%s' is not readable.\n"), member_file_name);
16682 free (member_file_name);
16683 ret = 1;
16684 break;
16685 }
16686
16687 archive_file_offset = arch.nested_member_origin;
16688
16689 ret |= process_object (qualified_name, member_file);
16690
16691 fclose (member_file);
16692 free (member_file_name);
16693 }
16694 else if (is_thin_archive)
16695 {
a043396b
NC
16696 /* PR 15140: Allow for corrupt thin archives. */
16697 if (nested_arch.file == NULL)
16698 {
16699 error (_("%s: contains corrupt thin archive: %s\n"),
16700 file_name, name);
16701 ret = 1;
16702 break;
16703 }
16704
2cf0635d
NC
16705 /* This is a proxy for a member of a nested archive. */
16706 archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
16707
16708 /* The nested archive file will have been opened and setup by
16709 get_archive_member_name. */
16710 if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
16711 {
16712 error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
16713 ret = 1;
16714 break;
16715 }
16716
16717 ret |= process_object (qualified_name, nested_arch.file);
16718 }
16719 else
16720 {
16721 archive_file_offset = arch.next_arhdr_offset;
16722 arch.next_arhdr_offset += archive_file_size;
fb52b2f4 16723
2cf0635d
NC
16724 ret |= process_object (qualified_name, file);
16725 }
fb52b2f4 16726
2b52916e
L
16727 if (dump_sects != NULL)
16728 {
16729 free (dump_sects);
16730 dump_sects = NULL;
16731 num_dump_sects = 0;
16732 }
16733
2cf0635d 16734 free (qualified_name);
fb52b2f4
NC
16735 }
16736
4145f1d5 16737 out:
2cf0635d
NC
16738 if (nested_arch.file != NULL)
16739 fclose (nested_arch.file);
16740 release_archive (&nested_arch);
16741 release_archive (&arch);
fb52b2f4 16742
d989285c 16743 return ret;
fb52b2f4
NC
16744}
16745
16746static int
2cf0635d 16747process_file (char * file_name)
fb52b2f4 16748{
2cf0635d 16749 FILE * file;
fb52b2f4
NC
16750 struct stat statbuf;
16751 char armag[SARMAG];
16752 int ret;
16753
16754 if (stat (file_name, &statbuf) < 0)
16755 {
f24ddbdd
NC
16756 if (errno == ENOENT)
16757 error (_("'%s': No such file\n"), file_name);
16758 else
16759 error (_("Could not locate '%s'. System error message: %s\n"),
16760 file_name, strerror (errno));
16761 return 1;
16762 }
16763
16764 if (! S_ISREG (statbuf.st_mode))
16765 {
16766 error (_("'%s' is not an ordinary file\n"), file_name);
fb52b2f4
NC
16767 return 1;
16768 }
16769
16770 file = fopen (file_name, "rb");
16771 if (file == NULL)
16772 {
f24ddbdd 16773 error (_("Input file '%s' is not readable.\n"), file_name);
fb52b2f4
NC
16774 return 1;
16775 }
16776
16777 if (fread (armag, SARMAG, 1, file) != 1)
16778 {
4145f1d5 16779 error (_("%s: Failed to read file's magic number\n"), file_name);
fb52b2f4
NC
16780 fclose (file);
16781 return 1;
16782 }
16783
f54498b4
NC
16784 current_file_size = (bfd_size_type) statbuf.st_size;
16785
fb52b2f4 16786 if (memcmp (armag, ARMAG, SARMAG) == 0)
2cf0635d
NC
16787 ret = process_archive (file_name, file, FALSE);
16788 else if (memcmp (armag, ARMAGT, SARMAG) == 0)
16789 ret = process_archive (file_name, file, TRUE);
fb52b2f4
NC
16790 else
16791 {
4145f1d5
NC
16792 if (do_archive_index)
16793 error (_("File %s is not an archive so its index cannot be displayed.\n"),
16794 file_name);
16795
fb52b2f4
NC
16796 rewind (file);
16797 archive_file_size = archive_file_offset = 0;
16798 ret = process_object (file_name, file);
16799 }
16800
16801 fclose (file);
16802
f54498b4 16803 current_file_size = 0;
fb52b2f4
NC
16804 return ret;
16805}
16806
252b5132
RH
16807#ifdef SUPPORT_DISASSEMBLY
16808/* Needed by the i386 disassembler. For extra credit, someone could
9ea033b2 16809 fix this so that we insert symbolic addresses here, esp for GOT/PLT
e3c8793a 16810 symbols. */
252b5132
RH
16811
16812void
2cf0635d 16813print_address (unsigned int addr, FILE * outfile)
252b5132
RH
16814{
16815 fprintf (outfile,"0x%8.8x", addr);
16816}
16817
e3c8793a 16818/* Needed by the i386 disassembler. */
252b5132
RH
16819void
16820db_task_printsym (unsigned int addr)
16821{
16822 print_address (addr, stderr);
16823}
16824#endif
16825
16826int
2cf0635d 16827main (int argc, char ** argv)
252b5132 16828{
ff78d6d6
L
16829 int err;
16830
252b5132
RH
16831#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
16832 setlocale (LC_MESSAGES, "");
3882b010
L
16833#endif
16834#if defined (HAVE_SETLOCALE)
16835 setlocale (LC_CTYPE, "");
252b5132
RH
16836#endif
16837 bindtextdomain (PACKAGE, LOCALEDIR);
16838 textdomain (PACKAGE);
16839
869b9d07
MM
16840 expandargv (&argc, &argv);
16841
252b5132
RH
16842 parse_args (argc, argv);
16843
18bd398b 16844 if (num_dump_sects > 0)
59f14fc0 16845 {
18bd398b 16846 /* Make a copy of the dump_sects array. */
3f5e193b
NC
16847 cmdline_dump_sects = (dump_type *)
16848 malloc (num_dump_sects * sizeof (* dump_sects));
59f14fc0 16849 if (cmdline_dump_sects == NULL)
591a748a 16850 error (_("Out of memory allocating dump request table.\n"));
59f14fc0
AS
16851 else
16852 {
09c11c86
NC
16853 memcpy (cmdline_dump_sects, dump_sects,
16854 num_dump_sects * sizeof (* dump_sects));
59f14fc0
AS
16855 num_cmdline_dump_sects = num_dump_sects;
16856 }
16857 }
16858
18bd398b
NC
16859 if (optind < (argc - 1))
16860 show_name = 1;
5656ba2c
L
16861 else if (optind >= argc)
16862 {
16863 warn (_("Nothing to do.\n"));
16864 usage (stderr);
16865 }
18bd398b 16866
ff78d6d6 16867 err = 0;
252b5132 16868 while (optind < argc)
18bd398b 16869 err |= process_file (argv[optind++]);
252b5132
RH
16870
16871 if (dump_sects != NULL)
16872 free (dump_sects);
59f14fc0
AS
16873 if (cmdline_dump_sects != NULL)
16874 free (cmdline_dump_sects);
252b5132 16875
ff78d6d6 16876 return err;
252b5132 16877}