]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - binutils/readelf.c
ld/testsuite: Initialise a variable to prevent tcl errors
[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
fabcb361
RH
1853static const char *
1854get_alpha_dynamic_type (unsigned long type)
1855{
1856 switch (type)
1857 {
1858 case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1859 default:
1860 return NULL;
1861 }
1862}
1863
1c0d3aa6
NC
1864static const char *
1865get_score_dynamic_type (unsigned long type)
1866{
1867 switch (type)
1868 {
1869 case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1870 case DT_SCORE_LOCAL_GOTNO: return "SCORE_LOCAL_GOTNO";
1871 case DT_SCORE_SYMTABNO: return "SCORE_SYMTABNO";
1872 case DT_SCORE_GOTSYM: return "SCORE_GOTSYM";
1873 case DT_SCORE_UNREFEXTNO: return "SCORE_UNREFEXTNO";
1874 case DT_SCORE_HIPAGENO: return "SCORE_HIPAGENO";
1875 default:
1876 return NULL;
1877 }
1878}
1879
40b36596
JM
1880static const char *
1881get_tic6x_dynamic_type (unsigned long type)
1882{
1883 switch (type)
1884 {
1885 case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1886 case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1887 case DT_C6000_DSBT_BASE: return "C6000_DSBT_BASE";
1888 case DT_C6000_DSBT_SIZE: return "C6000_DSBT_SIZE";
1889 case DT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
1890 case DT_C6000_DSBT_INDEX: return "C6000_DSBT_INDEX";
1891 default:
1892 return NULL;
1893 }
1894}
1c0d3aa6 1895
36591ba1
SL
1896static const char *
1897get_nios2_dynamic_type (unsigned long type)
1898{
1899 switch (type)
1900 {
1901 case DT_NIOS2_GP: return "NIOS2_GP";
1902 default:
1903 return NULL;
1904 }
1905}
1906
252b5132 1907static const char *
d3ba0551 1908get_dynamic_type (unsigned long type)
252b5132 1909{
e9e44622 1910 static char buff[64];
252b5132
RH
1911
1912 switch (type)
1913 {
1914 case DT_NULL: return "NULL";
1915 case DT_NEEDED: return "NEEDED";
1916 case DT_PLTRELSZ: return "PLTRELSZ";
1917 case DT_PLTGOT: return "PLTGOT";
1918 case DT_HASH: return "HASH";
1919 case DT_STRTAB: return "STRTAB";
1920 case DT_SYMTAB: return "SYMTAB";
1921 case DT_RELA: return "RELA";
1922 case DT_RELASZ: return "RELASZ";
1923 case DT_RELAENT: return "RELAENT";
1924 case DT_STRSZ: return "STRSZ";
1925 case DT_SYMENT: return "SYMENT";
1926 case DT_INIT: return "INIT";
1927 case DT_FINI: return "FINI";
1928 case DT_SONAME: return "SONAME";
1929 case DT_RPATH: return "RPATH";
1930 case DT_SYMBOLIC: return "SYMBOLIC";
1931 case DT_REL: return "REL";
1932 case DT_RELSZ: return "RELSZ";
1933 case DT_RELENT: return "RELENT";
1934 case DT_PLTREL: return "PLTREL";
1935 case DT_DEBUG: return "DEBUG";
1936 case DT_TEXTREL: return "TEXTREL";
1937 case DT_JMPREL: return "JMPREL";
1938 case DT_BIND_NOW: return "BIND_NOW";
1939 case DT_INIT_ARRAY: return "INIT_ARRAY";
1940 case DT_FINI_ARRAY: return "FINI_ARRAY";
1941 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1942 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
d1133906
NC
1943 case DT_RUNPATH: return "RUNPATH";
1944 case DT_FLAGS: return "FLAGS";
2d0e6f43 1945
d1133906
NC
1946 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1947 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
103f02d3 1948
05107a46 1949 case DT_CHECKSUM: return "CHECKSUM";
252b5132
RH
1950 case DT_PLTPADSZ: return "PLTPADSZ";
1951 case DT_MOVEENT: return "MOVEENT";
1952 case DT_MOVESZ: return "MOVESZ";
dcefbbbd 1953 case DT_FEATURE: return "FEATURE";
252b5132
RH
1954 case DT_POSFLAG_1: return "POSFLAG_1";
1955 case DT_SYMINSZ: return "SYMINSZ";
1956 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
103f02d3 1957
252b5132 1958 case DT_ADDRRNGLO: return "ADDRRNGLO";
dcefbbbd
L
1959 case DT_CONFIG: return "CONFIG";
1960 case DT_DEPAUDIT: return "DEPAUDIT";
1961 case DT_AUDIT: return "AUDIT";
1962 case DT_PLTPAD: return "PLTPAD";
1963 case DT_MOVETAB: return "MOVETAB";
252b5132 1964 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
103f02d3 1965
252b5132 1966 case DT_VERSYM: return "VERSYM";
103f02d3 1967
67a4f2b7
AO
1968 case DT_TLSDESC_GOT: return "TLSDESC_GOT";
1969 case DT_TLSDESC_PLT: return "TLSDESC_PLT";
252b5132
RH
1970 case DT_RELACOUNT: return "RELACOUNT";
1971 case DT_RELCOUNT: return "RELCOUNT";
1972 case DT_FLAGS_1: return "FLAGS_1";
1973 case DT_VERDEF: return "VERDEF";
1974 case DT_VERDEFNUM: return "VERDEFNUM";
1975 case DT_VERNEED: return "VERNEED";
1976 case DT_VERNEEDNUM: return "VERNEEDNUM";
103f02d3 1977
019148e4 1978 case DT_AUXILIARY: return "AUXILIARY";
252b5132
RH
1979 case DT_USED: return "USED";
1980 case DT_FILTER: return "FILTER";
103f02d3 1981
047b2264
JJ
1982 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
1983 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
1984 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
1985 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
1986 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
fdc90cb4 1987 case DT_GNU_HASH: return "GNU_HASH";
047b2264 1988
252b5132
RH
1989 default:
1990 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1991 {
2cf0635d 1992 const char * result;
103f02d3 1993
252b5132
RH
1994 switch (elf_header.e_machine)
1995 {
1996 case EM_MIPS:
4fe85591 1997 case EM_MIPS_RS3_LE:
252b5132
RH
1998 result = get_mips_dynamic_type (type);
1999 break;
9a097730
RH
2000 case EM_SPARCV9:
2001 result = get_sparc64_dynamic_type (type);
2002 break;
7490d522
AM
2003 case EM_PPC:
2004 result = get_ppc_dynamic_type (type);
2005 break;
f1cb7e17
AM
2006 case EM_PPC64:
2007 result = get_ppc64_dynamic_type (type);
2008 break;
ecc51f48
NC
2009 case EM_IA_64:
2010 result = get_ia64_dynamic_type (type);
2011 break;
fabcb361
RH
2012 case EM_ALPHA:
2013 result = get_alpha_dynamic_type (type);
2014 break;
1c0d3aa6
NC
2015 case EM_SCORE:
2016 result = get_score_dynamic_type (type);
2017 break;
40b36596
JM
2018 case EM_TI_C6000:
2019 result = get_tic6x_dynamic_type (type);
2020 break;
36591ba1
SL
2021 case EM_ALTERA_NIOS2:
2022 result = get_nios2_dynamic_type (type);
2023 break;
252b5132
RH
2024 default:
2025 result = NULL;
2026 break;
2027 }
2028
2029 if (result != NULL)
2030 return result;
2031
e9e44622 2032 snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
252b5132 2033 }
eec8f817
DA
2034 else if (((type >= DT_LOOS) && (type <= DT_HIOS))
2035 || (elf_header.e_machine == EM_PARISC
2036 && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
103f02d3 2037 {
2cf0635d 2038 const char * result;
103f02d3
UD
2039
2040 switch (elf_header.e_machine)
2041 {
2042 case EM_PARISC:
2043 result = get_parisc_dynamic_type (type);
2044 break;
148b93f2
NC
2045 case EM_IA_64:
2046 result = get_ia64_dynamic_type (type);
2047 break;
103f02d3
UD
2048 default:
2049 result = NULL;
2050 break;
2051 }
2052
2053 if (result != NULL)
2054 return result;
2055
e9e44622
JJ
2056 snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2057 type);
103f02d3 2058 }
252b5132 2059 else
e9e44622 2060 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
103f02d3 2061
252b5132
RH
2062 return buff;
2063 }
2064}
2065
2066static char *
d3ba0551 2067get_file_type (unsigned e_type)
252b5132 2068{
b34976b6 2069 static char buff[32];
252b5132
RH
2070
2071 switch (e_type)
2072 {
2073 case ET_NONE: return _("NONE (None)");
2074 case ET_REL: return _("REL (Relocatable file)");
ba2685cc
AM
2075 case ET_EXEC: return _("EXEC (Executable file)");
2076 case ET_DYN: return _("DYN (Shared object file)");
2077 case ET_CORE: return _("CORE (Core file)");
252b5132
RH
2078
2079 default:
2080 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
e9e44622 2081 snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
252b5132 2082 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
e9e44622 2083 snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
252b5132 2084 else
e9e44622 2085 snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
252b5132
RH
2086 return buff;
2087 }
2088}
2089
2090static char *
d3ba0551 2091get_machine_name (unsigned e_machine)
252b5132 2092{
b34976b6 2093 static char buff[64]; /* XXX */
252b5132
RH
2094
2095 switch (e_machine)
2096 {
c45021f2 2097 case EM_NONE: return _("None");
a06ea964 2098 case EM_AARCH64: return "AArch64";
c45021f2
NC
2099 case EM_M32: return "WE32100";
2100 case EM_SPARC: return "Sparc";
e9f53129 2101 case EM_SPU: return "SPU";
c45021f2
NC
2102 case EM_386: return "Intel 80386";
2103 case EM_68K: return "MC68000";
2104 case EM_88K: return "MC88000";
22abe556 2105 case EM_IAMCU: return "Intel MCU";
c45021f2
NC
2106 case EM_860: return "Intel 80860";
2107 case EM_MIPS: return "MIPS R3000";
2108 case EM_S370: return "IBM System/370";
7036c0e1 2109 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
252b5132 2110 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
c45021f2 2111 case EM_PARISC: return "HPPA";
252b5132 2112 case EM_PPC_OLD: return "Power PC (old)";
7036c0e1 2113 case EM_SPARC32PLUS: return "Sparc v8+" ;
c45021f2
NC
2114 case EM_960: return "Intel 90860";
2115 case EM_PPC: return "PowerPC";
285d1771 2116 case EM_PPC64: return "PowerPC64";
c45021f2 2117 case EM_FR20: return "Fujitsu FR20";
3f8107ab 2118 case EM_FT32: return "FTDI FT32";
c45021f2 2119 case EM_RH32: return "TRW RH32";
b34976b6 2120 case EM_MCORE: return "MCORE";
7036c0e1
AJ
2121 case EM_ARM: return "ARM";
2122 case EM_OLD_ALPHA: return "Digital Alpha (old)";
ef230218 2123 case EM_SH: return "Renesas / SuperH SH";
c45021f2
NC
2124 case EM_SPARCV9: return "Sparc v9";
2125 case EM_TRICORE: return "Siemens Tricore";
584da044 2126 case EM_ARC: return "ARC";
886a2506
NC
2127 case EM_ARC_COMPACT: return "ARCompact";
2128 case EM_ARC_COMPACT2: return "ARCv2";
c2dcd04e
NC
2129 case EM_H8_300: return "Renesas H8/300";
2130 case EM_H8_300H: return "Renesas H8/300H";
2131 case EM_H8S: return "Renesas H8S";
2132 case EM_H8_500: return "Renesas H8/500";
30800947 2133 case EM_IA_64: return "Intel IA-64";
252b5132
RH
2134 case EM_MIPS_X: return "Stanford MIPS-X";
2135 case EM_COLDFIRE: return "Motorola Coldfire";
c45021f2 2136 case EM_ALPHA: return "Alpha";
2b0337b0
AO
2137 case EM_CYGNUS_D10V:
2138 case EM_D10V: return "d10v";
2139 case EM_CYGNUS_D30V:
b34976b6 2140 case EM_D30V: return "d30v";
2b0337b0 2141 case EM_CYGNUS_M32R:
26597c86 2142 case EM_M32R: return "Renesas M32R (formerly Mitsubishi M32r)";
2b0337b0 2143 case EM_CYGNUS_V850:
708e2187 2144 case EM_V800: return "Renesas V850 (using RH850 ABI)";
f6c1a2d5 2145 case EM_V850: return "Renesas V850";
2b0337b0
AO
2146 case EM_CYGNUS_MN10300:
2147 case EM_MN10300: return "mn10300";
2148 case EM_CYGNUS_MN10200:
2149 case EM_MN10200: return "mn10200";
5506d11a 2150 case EM_MOXIE: return "Moxie";
2b0337b0
AO
2151 case EM_CYGNUS_FR30:
2152 case EM_FR30: return "Fujitsu FR30";
b34976b6 2153 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
2b0337b0 2154 case EM_PJ_OLD:
b34976b6 2155 case EM_PJ: return "picoJava";
7036c0e1
AJ
2156 case EM_MMA: return "Fujitsu Multimedia Accelerator";
2157 case EM_PCP: return "Siemens PCP";
2158 case EM_NCPU: return "Sony nCPU embedded RISC processor";
2159 case EM_NDR1: return "Denso NDR1 microprocesspr";
2160 case EM_STARCORE: return "Motorola Star*Core processor";
2161 case EM_ME16: return "Toyota ME16 processor";
2162 case EM_ST100: return "STMicroelectronics ST100 processor";
2163 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
11636f9e
JM
2164 case EM_PDSP: return "Sony DSP processor";
2165 case EM_PDP10: return "Digital Equipment Corp. PDP-10";
2166 case EM_PDP11: return "Digital Equipment Corp. PDP-11";
7036c0e1
AJ
2167 case EM_FX66: return "Siemens FX66 microcontroller";
2168 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2169 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
2170 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
6927f982 2171 case EM_68HC12: return "Motorola MC68HC12 Microcontroller";
7036c0e1
AJ
2172 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
2173 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
2174 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
2175 case EM_SVX: return "Silicon Graphics SVx";
2176 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
2177 case EM_VAX: return "Digital VAX";
619ed720 2178 case EM_VISIUM: return "CDS VISIUMcore processor";
2b0337b0 2179 case EM_AVR_OLD:
b34976b6 2180 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
1b61cf92 2181 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
c45021f2
NC
2182 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
2183 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
2184 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
b34976b6 2185 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
c45021f2 2186 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
3b36097d 2187 case EM_PRISM: return "Vitesse Prism";
bcedfee6 2188 case EM_X86_64: return "Advanced Micro Devices X86-64";
8a9036a4 2189 case EM_L1OM: return "Intel L1OM";
7a9068fe 2190 case EM_K1OM: return "Intel K1OM";
b7498e0e 2191 case EM_S390_OLD:
b34976b6 2192 case EM_S390: return "IBM S/390";
1c0d3aa6 2193 case EM_SCORE: return "SUNPLUS S+Core";
61865e30 2194 case EM_XSTORMY16: return "Sanyo XStormy16 CPU core";
73589c9d 2195 case EM_OR1K: return "OpenRISC 1000";
1fe1f39c 2196 case EM_CRX: return "National Semiconductor CRX microprocessor";
cfb8c092 2197 case EM_ADAPTEVA_EPIPHANY: return "Adapteva EPIPHANY";
d172d4ba 2198 case EM_DLX: return "OpenDLX";
1e4cf259 2199 case EM_IP2K_OLD:
b34976b6 2200 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
3b36097d 2201 case EM_IQ2000: return "Vitesse IQ2000";
88da6820
NC
2202 case EM_XTENSA_OLD:
2203 case EM_XTENSA: return "Tensilica Xtensa Processor";
11636f9e
JM
2204 case EM_VIDEOCORE: return "Alphamosaic VideoCore processor";
2205 case EM_TMM_GPP: return "Thompson Multimedia General Purpose Processor";
2206 case EM_NS32K: return "National Semiconductor 32000 series";
2207 case EM_TPC: return "Tenor Network TPC processor";
2208 case EM_ST200: return "STMicroelectronics ST200 microcontroller";
2209 case EM_MAX: return "MAX Processor";
2210 case EM_CR: return "National Semiconductor CompactRISC";
2211 case EM_F2MC16: return "Fujitsu F2MC16";
2212 case EM_MSP430: return "Texas Instruments msp430 microcontroller";
84e94c90 2213 case EM_LATTICEMICO32: return "Lattice Mico32";
ff7eeb89 2214 case EM_M32C_OLD:
49f58d10 2215 case EM_M32C: return "Renesas M32c";
d031aafb 2216 case EM_MT: return "Morpho Techologies MT processor";
7bbe5bc5 2217 case EM_BLACKFIN: return "Analog Devices Blackfin";
11636f9e
JM
2218 case EM_SE_C33: return "S1C33 Family of Seiko Epson processors";
2219 case EM_SEP: return "Sharp embedded microprocessor";
2220 case EM_ARCA: return "Arca RISC microprocessor";
2221 case EM_UNICORE: return "Unicore";
2222 case EM_EXCESS: return "eXcess 16/32/64-bit configurable embedded CPU";
2223 case EM_DXP: return "Icera Semiconductor Inc. Deep Execution Processor";
64fd6348
NC
2224 case EM_NIOS32: return "Altera Nios";
2225 case EM_ALTERA_NIOS2: return "Altera Nios II";
c29aca4a 2226 case EM_C166:
d70c5fc7 2227 case EM_XC16X: return "Infineon Technologies xc16x";
11636f9e
JM
2228 case EM_M16C: return "Renesas M16C series microprocessors";
2229 case EM_DSPIC30F: return "Microchip Technology dsPIC30F Digital Signal Controller";
2230 case EM_CE: return "Freescale Communication Engine RISC core";
2231 case EM_TSK3000: return "Altium TSK3000 core";
2232 case EM_RS08: return "Freescale RS08 embedded processor";
2233 case EM_ECOG2: return "Cyan Technology eCOG2 microprocessor";
2234 case EM_DSP24: return "New Japan Radio (NJR) 24-bit DSP Processor";
2235 case EM_VIDEOCORE3: return "Broadcom VideoCore III processor";
2236 case EM_SE_C17: return "Seiko Epson C17 family";
2237 case EM_TI_C6000: return "Texas Instruments TMS320C6000 DSP family";
2238 case EM_TI_C2000: return "Texas Instruments TMS320C2000 DSP family";
2239 case EM_TI_C5500: return "Texas Instruments TMS320C55x DSP family";
2240 case EM_MMDSP_PLUS: return "STMicroelectronics 64bit VLIW Data Signal Processor";
2241 case EM_CYPRESS_M8C: return "Cypress M8C microprocessor";
2242 case EM_R32C: return "Renesas R32C series microprocessors";
2243 case EM_TRIMEDIA: return "NXP Semiconductors TriMedia architecture family";
2244 case EM_QDSP6: return "QUALCOMM DSP6 Processor";
2245 case EM_8051: return "Intel 8051 and variants";
2246 case EM_STXP7X: return "STMicroelectronics STxP7x family";
2247 case EM_NDS32: return "Andes Technology compact code size embedded RISC processor family";
2248 case EM_ECOG1X: return "Cyan Technology eCOG1X family";
2249 case EM_MAXQ30: return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2250 case EM_XIMO16: return "New Japan Radio (NJR) 16-bit DSP Processor";
2251 case EM_MANIK: return "M2000 Reconfigurable RISC Microprocessor";
2252 case EM_CRAYNV2: return "Cray Inc. NV2 vector architecture";
15ab5209 2253 case EM_CYGNUS_MEP: return "Toshiba MeP Media Engine";
cb8f3167 2254 case EM_CR16:
f6c1a2d5 2255 case EM_MICROBLAZE:
7ba29e2a 2256 case EM_MICROBLAZE_OLD: return "Xilinx MicroBlaze";
99c513f6 2257 case EM_RL78: return "Renesas RL78";
c7927a3c 2258 case EM_RX: return "Renesas RX";
a3c62988 2259 case EM_METAG: return "Imagination Technologies Meta processor architecture";
11636f9e
JM
2260 case EM_MCST_ELBRUS: return "MCST Elbrus general purpose hardware architecture";
2261 case EM_ECOG16: return "Cyan Technology eCOG16 family";
2262 case EM_ETPU: return "Freescale Extended Time Processing Unit";
2263 case EM_SLE9X: return "Infineon Technologies SLE9X core";
2264 case EM_AVR32: return "Atmel Corporation 32-bit microprocessor family";
2265 case EM_STM8: return "STMicroeletronics STM8 8-bit microcontroller";
2266 case EM_TILE64: return "Tilera TILE64 multicore architecture family";
2267 case EM_TILEPRO: return "Tilera TILEPro multicore architecture family";
aa137e4d 2268 case EM_TILEGX: return "Tilera TILE-Gx multicore architecture family";
11636f9e 2269 case EM_CUDA: return "NVIDIA CUDA architecture";
f6c1a2d5 2270 case EM_XGATE: return "Motorola XGATE embedded processor";
252b5132 2271 default:
35d9dd2f 2272 snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
252b5132
RH
2273 return buff;
2274 }
2275}
2276
a9522a21
AB
2277static void
2278decode_ARC_machine_flags (unsigned e_flags, unsigned e_machine, char buf[])
2279{
2280 /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2. Some
2281 other compilers don't a specific architecture type in the e_flags, and
2282 instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
2283 architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
2284 architectures.
2285
2286 Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
2287 but also sets a specific architecture type in the e_flags field.
2288
2289 However, when decoding the flags we don't worry if we see an
2290 unexpected pairing, for example EM_ARC_COMPACT machine type, with
2291 ARCEM architecture type. */
2292
2293 switch (e_flags & EF_ARC_MACH_MSK)
2294 {
2295 /* We only expect these to occur for EM_ARC_COMPACT2. */
2296 case EF_ARC_CPU_ARCV2EM:
2297 strcat (buf, ", ARC EM");
2298 break;
2299 case EF_ARC_CPU_ARCV2HS:
2300 strcat (buf, ", ARC HS");
2301 break;
2302
2303 /* We only expect these to occur for EM_ARC_COMPACT. */
2304 case E_ARC_MACH_ARC600:
2305 strcat (buf, ", ARC600");
2306 break;
2307 case E_ARC_MACH_ARC601:
2308 strcat (buf, ", ARC601");
2309 break;
2310 case E_ARC_MACH_ARC700:
2311 strcat (buf, ", ARC700");
2312 break;
8699fc3e
AB
2313 case E_ARC_MACH_NPS400:
2314 strcat (buf, ", NPS400");
2315 break;
a9522a21
AB
2316
2317 /* The only times we should end up here are (a) A corrupt ELF, (b) A
2318 new ELF with new architecture being read by an old version of
2319 readelf, or (c) An ELF built with non-GNU compiler that does not
2320 set the architecture in the e_flags. */
2321 default:
2322 if (e_machine == EM_ARC_COMPACT)
2323 strcat (buf, ", Unknown ARCompact");
2324 else
2325 strcat (buf, ", Unknown ARC");
2326 break;
2327 }
2328
2329 switch (e_flags & EF_ARC_OSABI_MSK)
2330 {
2331 case E_ARC_OSABI_ORIG:
2332 strcat (buf, ", (ABI:legacy)");
2333 break;
2334 case E_ARC_OSABI_V2:
2335 strcat (buf, ", (ABI:v2)");
2336 break;
2337 /* Only upstream 3.9+ kernels will support ARCv2 ISA. */
2338 case E_ARC_OSABI_V3:
2339 strcat (buf, ", v3 no-legacy-syscalls ABI");
2340 break;
2341 default:
2342 strcat (buf, ", unrecognised ARC OSABI flag");
2343 break;
2344 }
2345}
2346
f3485b74 2347static void
d3ba0551 2348decode_ARM_machine_flags (unsigned e_flags, char buf[])
f3485b74
NC
2349{
2350 unsigned eabi;
2351 int unknown = 0;
2352
2353 eabi = EF_ARM_EABI_VERSION (e_flags);
2354 e_flags &= ~ EF_ARM_EABIMASK;
2355
2356 /* Handle "generic" ARM flags. */
2357 if (e_flags & EF_ARM_RELEXEC)
2358 {
2359 strcat (buf, ", relocatable executable");
2360 e_flags &= ~ EF_ARM_RELEXEC;
2361 }
76da6bbe 2362
f3485b74
NC
2363 /* Now handle EABI specific flags. */
2364 switch (eabi)
2365 {
2366 default:
2c71103e 2367 strcat (buf, ", <unrecognized EABI>");
f3485b74
NC
2368 if (e_flags)
2369 unknown = 1;
2370 break;
2371
2372 case EF_ARM_EABI_VER1:
a5bcd848 2373 strcat (buf, ", Version1 EABI");
f3485b74
NC
2374 while (e_flags)
2375 {
2376 unsigned flag;
76da6bbe 2377
f3485b74
NC
2378 /* Process flags one bit at a time. */
2379 flag = e_flags & - e_flags;
2380 e_flags &= ~ flag;
76da6bbe 2381
f3485b74
NC
2382 switch (flag)
2383 {
a5bcd848 2384 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
f3485b74
NC
2385 strcat (buf, ", sorted symbol tables");
2386 break;
76da6bbe 2387
f3485b74
NC
2388 default:
2389 unknown = 1;
2390 break;
2391 }
2392 }
2393 break;
76da6bbe 2394
a5bcd848
PB
2395 case EF_ARM_EABI_VER2:
2396 strcat (buf, ", Version2 EABI");
2397 while (e_flags)
2398 {
2399 unsigned flag;
2400
2401 /* Process flags one bit at a time. */
2402 flag = e_flags & - e_flags;
2403 e_flags &= ~ flag;
2404
2405 switch (flag)
2406 {
2407 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2408 strcat (buf, ", sorted symbol tables");
2409 break;
2410
2411 case EF_ARM_DYNSYMSUSESEGIDX:
2412 strcat (buf, ", dynamic symbols use segment index");
2413 break;
2414
2415 case EF_ARM_MAPSYMSFIRST:
2416 strcat (buf, ", mapping symbols precede others");
2417 break;
2418
2419 default:
2420 unknown = 1;
2421 break;
2422 }
2423 }
2424 break;
2425
d507cf36
PB
2426 case EF_ARM_EABI_VER3:
2427 strcat (buf, ", Version3 EABI");
8cb51566
PB
2428 break;
2429
2430 case EF_ARM_EABI_VER4:
2431 strcat (buf, ", Version4 EABI");
3bfcb652
NC
2432 while (e_flags)
2433 {
2434 unsigned flag;
2435
2436 /* Process flags one bit at a time. */
2437 flag = e_flags & - e_flags;
2438 e_flags &= ~ flag;
2439
2440 switch (flag)
2441 {
2442 case EF_ARM_BE8:
2443 strcat (buf, ", BE8");
2444 break;
2445
2446 case EF_ARM_LE8:
2447 strcat (buf, ", LE8");
2448 break;
2449
2450 default:
2451 unknown = 1;
2452 break;
2453 }
2454 break;
2455 }
2456 break;
3a4a14e9
PB
2457
2458 case EF_ARM_EABI_VER5:
2459 strcat (buf, ", Version5 EABI");
d507cf36
PB
2460 while (e_flags)
2461 {
2462 unsigned flag;
2463
2464 /* Process flags one bit at a time. */
2465 flag = e_flags & - e_flags;
2466 e_flags &= ~ flag;
2467
2468 switch (flag)
2469 {
2470 case EF_ARM_BE8:
2471 strcat (buf, ", BE8");
2472 break;
2473
2474 case EF_ARM_LE8:
2475 strcat (buf, ", LE8");
2476 break;
2477
3bfcb652
NC
2478 case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT. */
2479 strcat (buf, ", soft-float ABI");
2480 break;
2481
2482 case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT. */
2483 strcat (buf, ", hard-float ABI");
2484 break;
2485
d507cf36
PB
2486 default:
2487 unknown = 1;
2488 break;
2489 }
2490 }
2491 break;
2492
f3485b74 2493 case EF_ARM_EABI_UNKNOWN:
a5bcd848 2494 strcat (buf, ", GNU EABI");
f3485b74
NC
2495 while (e_flags)
2496 {
2497 unsigned flag;
76da6bbe 2498
f3485b74
NC
2499 /* Process flags one bit at a time. */
2500 flag = e_flags & - e_flags;
2501 e_flags &= ~ flag;
76da6bbe 2502
f3485b74
NC
2503 switch (flag)
2504 {
a5bcd848 2505 case EF_ARM_INTERWORK:
f3485b74
NC
2506 strcat (buf, ", interworking enabled");
2507 break;
76da6bbe 2508
a5bcd848 2509 case EF_ARM_APCS_26:
f3485b74
NC
2510 strcat (buf, ", uses APCS/26");
2511 break;
76da6bbe 2512
a5bcd848 2513 case EF_ARM_APCS_FLOAT:
f3485b74
NC
2514 strcat (buf, ", uses APCS/float");
2515 break;
76da6bbe 2516
a5bcd848 2517 case EF_ARM_PIC:
f3485b74
NC
2518 strcat (buf, ", position independent");
2519 break;
76da6bbe 2520
a5bcd848 2521 case EF_ARM_ALIGN8:
f3485b74
NC
2522 strcat (buf, ", 8 bit structure alignment");
2523 break;
76da6bbe 2524
a5bcd848 2525 case EF_ARM_NEW_ABI:
f3485b74
NC
2526 strcat (buf, ", uses new ABI");
2527 break;
76da6bbe 2528
a5bcd848 2529 case EF_ARM_OLD_ABI:
f3485b74
NC
2530 strcat (buf, ", uses old ABI");
2531 break;
76da6bbe 2532
a5bcd848 2533 case EF_ARM_SOFT_FLOAT:
f3485b74
NC
2534 strcat (buf, ", software FP");
2535 break;
76da6bbe 2536
90e01f86
ILT
2537 case EF_ARM_VFP_FLOAT:
2538 strcat (buf, ", VFP");
2539 break;
2540
fde78edd
NC
2541 case EF_ARM_MAVERICK_FLOAT:
2542 strcat (buf, ", Maverick FP");
2543 break;
2544
f3485b74
NC
2545 default:
2546 unknown = 1;
2547 break;
2548 }
2549 }
2550 }
f3485b74
NC
2551
2552 if (unknown)
2b692964 2553 strcat (buf,_(", <unknown>"));
f3485b74
NC
2554}
2555
343433df
AB
2556static void
2557decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2558{
2559 --size; /* Leave space for null terminator. */
2560
2561 switch (e_flags & EF_AVR_MACH)
2562 {
2563 case E_AVR_MACH_AVR1:
2564 strncat (buf, ", avr:1", size);
2565 break;
2566 case E_AVR_MACH_AVR2:
2567 strncat (buf, ", avr:2", size);
2568 break;
2569 case E_AVR_MACH_AVR25:
2570 strncat (buf, ", avr:25", size);
2571 break;
2572 case E_AVR_MACH_AVR3:
2573 strncat (buf, ", avr:3", size);
2574 break;
2575 case E_AVR_MACH_AVR31:
2576 strncat (buf, ", avr:31", size);
2577 break;
2578 case E_AVR_MACH_AVR35:
2579 strncat (buf, ", avr:35", size);
2580 break;
2581 case E_AVR_MACH_AVR4:
2582 strncat (buf, ", avr:4", size);
2583 break;
2584 case E_AVR_MACH_AVR5:
2585 strncat (buf, ", avr:5", size);
2586 break;
2587 case E_AVR_MACH_AVR51:
2588 strncat (buf, ", avr:51", size);
2589 break;
2590 case E_AVR_MACH_AVR6:
2591 strncat (buf, ", avr:6", size);
2592 break;
2593 case E_AVR_MACH_AVRTINY:
2594 strncat (buf, ", avr:100", size);
2595 break;
2596 case E_AVR_MACH_XMEGA1:
2597 strncat (buf, ", avr:101", size);
2598 break;
2599 case E_AVR_MACH_XMEGA2:
2600 strncat (buf, ", avr:102", size);
2601 break;
2602 case E_AVR_MACH_XMEGA3:
2603 strncat (buf, ", avr:103", size);
2604 break;
2605 case E_AVR_MACH_XMEGA4:
2606 strncat (buf, ", avr:104", size);
2607 break;
2608 case E_AVR_MACH_XMEGA5:
2609 strncat (buf, ", avr:105", size);
2610 break;
2611 case E_AVR_MACH_XMEGA6:
2612 strncat (buf, ", avr:106", size);
2613 break;
2614 case E_AVR_MACH_XMEGA7:
2615 strncat (buf, ", avr:107", size);
2616 break;
2617 default:
2618 strncat (buf, ", avr:<unknown>", size);
2619 break;
2620 }
2621
2622 size -= strlen (buf);
2623 if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2624 strncat (buf, ", link-relax", size);
2625}
2626
35c08157
KLC
2627static void
2628decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2629{
2630 unsigned abi;
2631 unsigned arch;
2632 unsigned config;
2633 unsigned version;
2634 int has_fpu = 0;
2635 int r = 0;
2636
2637 static const char *ABI_STRINGS[] =
2638 {
2639 "ABI v0", /* use r5 as return register; only used in N1213HC */
2640 "ABI v1", /* use r0 as return register */
2641 "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2642 "ABI v2fp", /* for FPU */
40c7a7cb
KLC
2643 "AABI",
2644 "ABI2 FP+"
35c08157
KLC
2645 };
2646 static const char *VER_STRINGS[] =
2647 {
2648 "Andes ELF V1.3 or older",
2649 "Andes ELF V1.3.1",
2650 "Andes ELF V1.4"
2651 };
2652 static const char *ARCH_STRINGS[] =
2653 {
2654 "",
2655 "Andes Star v1.0",
2656 "Andes Star v2.0",
2657 "Andes Star v3.0",
2658 "Andes Star v3.0m"
2659 };
2660
2661 abi = EF_NDS_ABI & e_flags;
2662 arch = EF_NDS_ARCH & e_flags;
2663 config = EF_NDS_INST & e_flags;
2664 version = EF_NDS32_ELF_VERSION & e_flags;
2665
2666 memset (buf, 0, size);
2667
2668 switch (abi)
2669 {
2670 case E_NDS_ABI_V0:
2671 case E_NDS_ABI_V1:
2672 case E_NDS_ABI_V2:
2673 case E_NDS_ABI_V2FP:
2674 case E_NDS_ABI_AABI:
40c7a7cb 2675 case E_NDS_ABI_V2FP_PLUS:
35c08157
KLC
2676 /* In case there are holes in the array. */
2677 r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2678 break;
2679
2680 default:
2681 r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2682 break;
2683 }
2684
2685 switch (version)
2686 {
2687 case E_NDS32_ELF_VER_1_2:
2688 case E_NDS32_ELF_VER_1_3:
2689 case E_NDS32_ELF_VER_1_4:
2690 r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2691 break;
2692
2693 default:
2694 r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2695 break;
2696 }
2697
2698 if (E_NDS_ABI_V0 == abi)
2699 {
2700 /* OLD ABI; only used in N1213HC, has performance extension 1. */
2701 r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2702 if (arch == E_NDS_ARCH_STAR_V1_0)
2703 r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2704 return;
2705 }
2706
2707 switch (arch)
2708 {
2709 case E_NDS_ARCH_STAR_V1_0:
2710 case E_NDS_ARCH_STAR_V2_0:
2711 case E_NDS_ARCH_STAR_V3_0:
2712 case E_NDS_ARCH_STAR_V3_M:
2713 r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2714 break;
2715
2716 default:
2717 r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2718 /* ARCH version determines how the e_flags are interpreted.
2719 If it is unknown, we cannot proceed. */
2720 return;
2721 }
2722
2723 /* Newer ABI; Now handle architecture specific flags. */
2724 if (arch == E_NDS_ARCH_STAR_V1_0)
2725 {
2726 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2727 r += snprintf (buf + r, size -r, ", MFUSR_PC");
2728
2729 if (!(config & E_NDS32_HAS_NO_MAC_INST))
2730 r += snprintf (buf + r, size -r, ", MAC");
2731
2732 if (config & E_NDS32_HAS_DIV_INST)
2733 r += snprintf (buf + r, size -r, ", DIV");
2734
2735 if (config & E_NDS32_HAS_16BIT_INST)
2736 r += snprintf (buf + r, size -r, ", 16b");
2737 }
2738 else
2739 {
2740 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2741 {
2742 if (version <= E_NDS32_ELF_VER_1_3)
2743 r += snprintf (buf + r, size -r, ", [B8]");
2744 else
2745 r += snprintf (buf + r, size -r, ", EX9");
2746 }
2747
2748 if (config & E_NDS32_HAS_MAC_DX_INST)
2749 r += snprintf (buf + r, size -r, ", MAC_DX");
2750
2751 if (config & E_NDS32_HAS_DIV_DX_INST)
2752 r += snprintf (buf + r, size -r, ", DIV_DX");
2753
2754 if (config & E_NDS32_HAS_16BIT_INST)
2755 {
2756 if (version <= E_NDS32_ELF_VER_1_3)
2757 r += snprintf (buf + r, size -r, ", 16b");
2758 else
2759 r += snprintf (buf + r, size -r, ", IFC");
2760 }
2761 }
2762
2763 if (config & E_NDS32_HAS_EXT_INST)
2764 r += snprintf (buf + r, size -r, ", PERF1");
2765
2766 if (config & E_NDS32_HAS_EXT2_INST)
2767 r += snprintf (buf + r, size -r, ", PERF2");
2768
2769 if (config & E_NDS32_HAS_FPU_INST)
2770 {
2771 has_fpu = 1;
2772 r += snprintf (buf + r, size -r, ", FPU_SP");
2773 }
2774
2775 if (config & E_NDS32_HAS_FPU_DP_INST)
2776 {
2777 has_fpu = 1;
2778 r += snprintf (buf + r, size -r, ", FPU_DP");
2779 }
2780
2781 if (config & E_NDS32_HAS_FPU_MAC_INST)
2782 {
2783 has_fpu = 1;
2784 r += snprintf (buf + r, size -r, ", FPU_MAC");
2785 }
2786
2787 if (has_fpu)
2788 {
2789 switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
2790 {
2791 case E_NDS32_FPU_REG_8SP_4DP:
2792 r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
2793 break;
2794 case E_NDS32_FPU_REG_16SP_8DP:
2795 r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
2796 break;
2797 case E_NDS32_FPU_REG_32SP_16DP:
2798 r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
2799 break;
2800 case E_NDS32_FPU_REG_32SP_32DP:
2801 r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
2802 break;
2803 }
2804 }
2805
2806 if (config & E_NDS32_HAS_AUDIO_INST)
2807 r += snprintf (buf + r, size -r, ", AUDIO");
2808
2809 if (config & E_NDS32_HAS_STRING_INST)
2810 r += snprintf (buf + r, size -r, ", STR");
2811
2812 if (config & E_NDS32_HAS_REDUCED_REGS)
2813 r += snprintf (buf + r, size -r, ", 16REG");
2814
2815 if (config & E_NDS32_HAS_VIDEO_INST)
2816 {
2817 if (version <= E_NDS32_ELF_VER_1_3)
2818 r += snprintf (buf + r, size -r, ", VIDEO");
2819 else
2820 r += snprintf (buf + r, size -r, ", SATURATION");
2821 }
2822
2823 if (config & E_NDS32_HAS_ENCRIPT_INST)
2824 r += snprintf (buf + r, size -r, ", ENCRP");
2825
2826 if (config & E_NDS32_HAS_L2C_INST)
2827 r += snprintf (buf + r, size -r, ", L2C");
2828}
2829
252b5132 2830static char *
d3ba0551 2831get_machine_flags (unsigned e_flags, unsigned e_machine)
252b5132 2832{
b34976b6 2833 static char buf[1024];
252b5132
RH
2834
2835 buf[0] = '\0';
76da6bbe 2836
252b5132
RH
2837 if (e_flags)
2838 {
2839 switch (e_machine)
2840 {
2841 default:
2842 break;
2843
886a2506 2844 case EM_ARC_COMPACT2:
886a2506 2845 case EM_ARC_COMPACT:
a9522a21
AB
2846 decode_ARC_machine_flags (e_flags, e_machine, buf);
2847 break;
886a2506 2848
f3485b74
NC
2849 case EM_ARM:
2850 decode_ARM_machine_flags (e_flags, buf);
2851 break;
76da6bbe 2852
343433df
AB
2853 case EM_AVR:
2854 decode_AVR_machine_flags (e_flags, buf, sizeof buf);
2855 break;
2856
781303ce
MF
2857 case EM_BLACKFIN:
2858 if (e_flags & EF_BFIN_PIC)
2859 strcat (buf, ", PIC");
2860
2861 if (e_flags & EF_BFIN_FDPIC)
2862 strcat (buf, ", FDPIC");
2863
2864 if (e_flags & EF_BFIN_CODE_IN_L1)
2865 strcat (buf, ", code in L1");
2866
2867 if (e_flags & EF_BFIN_DATA_IN_L1)
2868 strcat (buf, ", data in L1");
2869
2870 break;
2871
ec2dfb42
AO
2872 case EM_CYGNUS_FRV:
2873 switch (e_flags & EF_FRV_CPU_MASK)
2874 {
2875 case EF_FRV_CPU_GENERIC:
2876 break;
2877
2878 default:
2879 strcat (buf, ", fr???");
2880 break;
57346661 2881
ec2dfb42
AO
2882 case EF_FRV_CPU_FR300:
2883 strcat (buf, ", fr300");
2884 break;
2885
2886 case EF_FRV_CPU_FR400:
2887 strcat (buf, ", fr400");
2888 break;
2889 case EF_FRV_CPU_FR405:
2890 strcat (buf, ", fr405");
2891 break;
2892
2893 case EF_FRV_CPU_FR450:
2894 strcat (buf, ", fr450");
2895 break;
2896
2897 case EF_FRV_CPU_FR500:
2898 strcat (buf, ", fr500");
2899 break;
2900 case EF_FRV_CPU_FR550:
2901 strcat (buf, ", fr550");
2902 break;
2903
2904 case EF_FRV_CPU_SIMPLE:
2905 strcat (buf, ", simple");
2906 break;
2907 case EF_FRV_CPU_TOMCAT:
2908 strcat (buf, ", tomcat");
2909 break;
2910 }
1c877e87 2911 break;
ec2dfb42 2912
53c7db4b 2913 case EM_68K:
425c6cb0 2914 if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
76f57f3a 2915 strcat (buf, ", m68000");
425c6cb0 2916 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
3bdcfdf4
KH
2917 strcat (buf, ", cpu32");
2918 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
2919 strcat (buf, ", fido_a");
425c6cb0 2920 else
266abb8f 2921 {
2cf0635d
NC
2922 char const * isa = _("unknown");
2923 char const * mac = _("unknown mac");
2924 char const * additional = NULL;
0112cd26 2925
c694fd50 2926 switch (e_flags & EF_M68K_CF_ISA_MASK)
266abb8f 2927 {
c694fd50 2928 case EF_M68K_CF_ISA_A_NODIV:
0b2e31dc
NS
2929 isa = "A";
2930 additional = ", nodiv";
2931 break;
c694fd50 2932 case EF_M68K_CF_ISA_A:
266abb8f
NS
2933 isa = "A";
2934 break;
c694fd50 2935 case EF_M68K_CF_ISA_A_PLUS:
266abb8f
NS
2936 isa = "A+";
2937 break;
c694fd50 2938 case EF_M68K_CF_ISA_B_NOUSP:
0b2e31dc
NS
2939 isa = "B";
2940 additional = ", nousp";
2941 break;
c694fd50 2942 case EF_M68K_CF_ISA_B:
266abb8f
NS
2943 isa = "B";
2944 break;
f608cd77
NS
2945 case EF_M68K_CF_ISA_C:
2946 isa = "C";
2947 break;
2948 case EF_M68K_CF_ISA_C_NODIV:
2949 isa = "C";
2950 additional = ", nodiv";
2951 break;
266abb8f
NS
2952 }
2953 strcat (buf, ", cf, isa ");
2954 strcat (buf, isa);
0b2e31dc
NS
2955 if (additional)
2956 strcat (buf, additional);
c694fd50 2957 if (e_flags & EF_M68K_CF_FLOAT)
0b2e31dc 2958 strcat (buf, ", float");
c694fd50 2959 switch (e_flags & EF_M68K_CF_MAC_MASK)
266abb8f
NS
2960 {
2961 case 0:
2962 mac = NULL;
2963 break;
c694fd50 2964 case EF_M68K_CF_MAC:
266abb8f
NS
2965 mac = "mac";
2966 break;
c694fd50 2967 case EF_M68K_CF_EMAC:
266abb8f
NS
2968 mac = "emac";
2969 break;
f608cd77
NS
2970 case EF_M68K_CF_EMAC_B:
2971 mac = "emac_b";
2972 break;
266abb8f
NS
2973 }
2974 if (mac)
2975 {
2976 strcat (buf, ", ");
2977 strcat (buf, mac);
2978 }
266abb8f 2979 }
53c7db4b 2980 break;
33c63f9d 2981
153a2776
NC
2982 case EM_CYGNUS_MEP:
2983 switch (e_flags & EF_MEP_CPU_MASK)
2984 {
2985 case EF_MEP_CPU_MEP: strcat (buf, ", generic MeP"); break;
2986 case EF_MEP_CPU_C2: strcat (buf, ", MeP C2"); break;
2987 case EF_MEP_CPU_C3: strcat (buf, ", MeP C3"); break;
2988 case EF_MEP_CPU_C4: strcat (buf, ", MeP C4"); break;
2989 case EF_MEP_CPU_C5: strcat (buf, ", MeP C5"); break;
2990 case EF_MEP_CPU_H1: strcat (buf, ", MeP H1"); break;
2991 default: strcat (buf, _(", <unknown MeP cpu type>")); break;
2992 }
2993
2994 switch (e_flags & EF_MEP_COP_MASK)
2995 {
2996 case EF_MEP_COP_NONE: break;
2997 case EF_MEP_COP_AVC: strcat (buf, ", AVC coprocessor"); break;
2998 case EF_MEP_COP_AVC2: strcat (buf, ", AVC2 coprocessor"); break;
2999 case EF_MEP_COP_FMAX: strcat (buf, ", FMAX coprocessor"); break;
3000 case EF_MEP_COP_IVC2: strcat (buf, ", IVC2 coprocessor"); break;
3001 default: strcat (buf, _("<unknown MeP copro type>")); break;
3002 }
3003
3004 if (e_flags & EF_MEP_LIBRARY)
3005 strcat (buf, ", Built for Library");
3006
3007 if (e_flags & EF_MEP_INDEX_MASK)
3008 sprintf (buf + strlen (buf), ", Configuration Index: %#x",
3009 e_flags & EF_MEP_INDEX_MASK);
3010
3011 if (e_flags & ~ EF_MEP_ALL_FLAGS)
3012 sprintf (buf + strlen (buf), _(", unknown flags bits: %#x"),
3013 e_flags & ~ EF_MEP_ALL_FLAGS);
3014 break;
3015
252b5132
RH
3016 case EM_PPC:
3017 if (e_flags & EF_PPC_EMB)
3018 strcat (buf, ", emb");
3019
3020 if (e_flags & EF_PPC_RELOCATABLE)
2b692964 3021 strcat (buf, _(", relocatable"));
252b5132
RH
3022
3023 if (e_flags & EF_PPC_RELOCATABLE_LIB)
2b692964 3024 strcat (buf, _(", relocatable-lib"));
252b5132
RH
3025 break;
3026
ee67d69a
AM
3027 case EM_PPC64:
3028 if (e_flags & EF_PPC64_ABI)
3029 {
3030 char abi[] = ", abiv0";
3031
3032 abi[6] += e_flags & EF_PPC64_ABI;
3033 strcat (buf, abi);
3034 }
3035 break;
3036
708e2187
NC
3037 case EM_V800:
3038 if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
3039 strcat (buf, ", RH850 ABI");
0b4362b0 3040
708e2187
NC
3041 if (e_flags & EF_V800_850E3)
3042 strcat (buf, ", V3 architecture");
3043
3044 if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
3045 strcat (buf, ", FPU not used");
3046
3047 if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
3048 strcat (buf, ", regmode: COMMON");
3049
3050 if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
3051 strcat (buf, ", r4 not used");
3052
3053 if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
3054 strcat (buf, ", r30 not used");
3055
3056 if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
3057 strcat (buf, ", r5 not used");
3058
3059 if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
3060 strcat (buf, ", r2 not used");
3061
3062 for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
3063 {
3064 switch (e_flags & - e_flags)
3065 {
3066 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
3067 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
708e2187
NC
3068 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
3069 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
708e2187
NC
3070 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
3071 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
3072 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
3073 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
3074 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
3075 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
3076 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
3077 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
3078 default: break;
3079 }
3080 }
3081 break;
3082
2b0337b0 3083 case EM_V850:
252b5132
RH
3084 case EM_CYGNUS_V850:
3085 switch (e_flags & EF_V850_ARCH)
3086 {
78c8d46c
NC
3087 case E_V850E3V5_ARCH:
3088 strcat (buf, ", v850e3v5");
3089 break;
1cd986c5
NC
3090 case E_V850E2V3_ARCH:
3091 strcat (buf, ", v850e2v3");
3092 break;
3093 case E_V850E2_ARCH:
3094 strcat (buf, ", v850e2");
3095 break;
3096 case E_V850E1_ARCH:
3097 strcat (buf, ", v850e1");
8ad30312 3098 break;
252b5132
RH
3099 case E_V850E_ARCH:
3100 strcat (buf, ", v850e");
3101 break;
252b5132
RH
3102 case E_V850_ARCH:
3103 strcat (buf, ", v850");
3104 break;
3105 default:
2b692964 3106 strcat (buf, _(", unknown v850 architecture variant"));
252b5132
RH
3107 break;
3108 }
3109 break;
3110
2b0337b0 3111 case EM_M32R:
252b5132
RH
3112 case EM_CYGNUS_M32R:
3113 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3114 strcat (buf, ", m32r");
252b5132
RH
3115 break;
3116
3117 case EM_MIPS:
4fe85591 3118 case EM_MIPS_RS3_LE:
252b5132
RH
3119 if (e_flags & EF_MIPS_NOREORDER)
3120 strcat (buf, ", noreorder");
3121
3122 if (e_flags & EF_MIPS_PIC)
3123 strcat (buf, ", pic");
3124
3125 if (e_flags & EF_MIPS_CPIC)
3126 strcat (buf, ", cpic");
3127
d1bdd336
TS
3128 if (e_flags & EF_MIPS_UCODE)
3129 strcat (buf, ", ugen_reserved");
3130
252b5132
RH
3131 if (e_flags & EF_MIPS_ABI2)
3132 strcat (buf, ", abi2");
3133
43521d43
TS
3134 if (e_flags & EF_MIPS_OPTIONS_FIRST)
3135 strcat (buf, ", odk first");
3136
a5d22d2a
TS
3137 if (e_flags & EF_MIPS_32BITMODE)
3138 strcat (buf, ", 32bitmode");
3139
ba92f887
MR
3140 if (e_flags & EF_MIPS_NAN2008)
3141 strcat (buf, ", nan2008");
3142
fef1b0b3
SE
3143 if (e_flags & EF_MIPS_FP64)
3144 strcat (buf, ", fp64");
3145
156c2f8b
NC
3146 switch ((e_flags & EF_MIPS_MACH))
3147 {
3148 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3149 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3150 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
156c2f8b 3151 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
810dfa6e
L
3152 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3153 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3154 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3155 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
c6c98b38 3156 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
ebcb91b7 3157 case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
350cc38d
MS
3158 case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3159 case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
fd503541 3160 case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
05c6f050 3161 case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
67c2a3e8 3162 case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
d32e5c54 3163 case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
52b6b6b9 3164 case E_MIPS_MACH_XLR: strcat (buf, ", xlr"); break;
43521d43
TS
3165 case 0:
3166 /* We simply ignore the field in this case to avoid confusion:
3167 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3168 extension. */
3169 break;
2b692964 3170 default: strcat (buf, _(", unknown CPU")); break;
156c2f8b 3171 }
43521d43
TS
3172
3173 switch ((e_flags & EF_MIPS_ABI))
3174 {
3175 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3176 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3177 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3178 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3179 case 0:
3180 /* We simply ignore the field in this case to avoid confusion:
3181 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3182 This means it is likely to be an o32 file, but not for
3183 sure. */
3184 break;
2b692964 3185 default: strcat (buf, _(", unknown ABI")); break;
43521d43
TS
3186 }
3187
3188 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3189 strcat (buf, ", mdmx");
3190
3191 if (e_flags & EF_MIPS_ARCH_ASE_M16)
3192 strcat (buf, ", mips16");
3193
df58fc94
RS
3194 if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3195 strcat (buf, ", micromips");
3196
43521d43
TS
3197 switch ((e_flags & EF_MIPS_ARCH))
3198 {
3199 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3200 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3201 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3202 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3203 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3204 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
cb44e358 3205 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
7361da2c 3206 case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
43521d43 3207 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
5f74bc13 3208 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
7361da2c 3209 case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
2b692964 3210 default: strcat (buf, _(", unknown ISA")); break;
43521d43 3211 }
252b5132 3212 break;
351b4b40 3213
35c08157
KLC
3214 case EM_NDS32:
3215 decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3216 break;
3217
ccde1100
AO
3218 case EM_SH:
3219 switch ((e_flags & EF_SH_MACH_MASK))
3220 {
3221 case EF_SH1: strcat (buf, ", sh1"); break;
3222 case EF_SH2: strcat (buf, ", sh2"); break;
3223 case EF_SH3: strcat (buf, ", sh3"); break;
3224 case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3225 case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3226 case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3227 case EF_SH3E: strcat (buf, ", sh3e"); break;
3228 case EF_SH4: strcat (buf, ", sh4"); break;
3229 case EF_SH5: strcat (buf, ", sh5"); break;
3230 case EF_SH2E: strcat (buf, ", sh2e"); break;
3231 case EF_SH4A: strcat (buf, ", sh4a"); break;
1d70c7fb 3232 case EF_SH2A: strcat (buf, ", sh2a"); break;
ccde1100
AO
3233 case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3234 case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
1d70c7fb 3235 case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
0b92ab21
NH
3236 case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3237 case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3238 case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3239 case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3240 case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3241 case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
2b692964 3242 default: strcat (buf, _(", unknown ISA")); break;
ccde1100
AO
3243 }
3244
cec6a5b8
MR
3245 if (e_flags & EF_SH_PIC)
3246 strcat (buf, ", pic");
3247
3248 if (e_flags & EF_SH_FDPIC)
3249 strcat (buf, ", fdpic");
ccde1100 3250 break;
948f632f 3251
73589c9d
CS
3252 case EM_OR1K:
3253 if (e_flags & EF_OR1K_NODELAY)
3254 strcat (buf, ", no delay");
3255 break;
57346661 3256
351b4b40
RH
3257 case EM_SPARCV9:
3258 if (e_flags & EF_SPARC_32PLUS)
3259 strcat (buf, ", v8+");
3260
3261 if (e_flags & EF_SPARC_SUN_US1)
d07faca2
RH
3262 strcat (buf, ", ultrasparcI");
3263
3264 if (e_flags & EF_SPARC_SUN_US3)
3265 strcat (buf, ", ultrasparcIII");
351b4b40
RH
3266
3267 if (e_flags & EF_SPARC_HAL_R1)
3268 strcat (buf, ", halr1");
3269
3270 if (e_flags & EF_SPARC_LEDATA)
3271 strcat (buf, ", ledata");
3272
3273 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3274 strcat (buf, ", tso");
3275
3276 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3277 strcat (buf, ", pso");
3278
3279 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3280 strcat (buf, ", rmo");
3281 break;
7d466069 3282
103f02d3
UD
3283 case EM_PARISC:
3284 switch (e_flags & EF_PARISC_ARCH)
3285 {
3286 case EFA_PARISC_1_0:
3287 strcpy (buf, ", PA-RISC 1.0");
3288 break;
3289 case EFA_PARISC_1_1:
3290 strcpy (buf, ", PA-RISC 1.1");
3291 break;
3292 case EFA_PARISC_2_0:
3293 strcpy (buf, ", PA-RISC 2.0");
3294 break;
3295 default:
3296 break;
3297 }
3298 if (e_flags & EF_PARISC_TRAPNIL)
3299 strcat (buf, ", trapnil");
3300 if (e_flags & EF_PARISC_EXT)
3301 strcat (buf, ", ext");
3302 if (e_flags & EF_PARISC_LSB)
3303 strcat (buf, ", lsb");
3304 if (e_flags & EF_PARISC_WIDE)
3305 strcat (buf, ", wide");
3306 if (e_flags & EF_PARISC_NO_KABP)
3307 strcat (buf, ", no kabp");
3308 if (e_flags & EF_PARISC_LAZYSWAP)
3309 strcat (buf, ", lazyswap");
30800947 3310 break;
76da6bbe 3311
7d466069 3312 case EM_PJ:
2b0337b0 3313 case EM_PJ_OLD:
7d466069
ILT
3314 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3315 strcat (buf, ", new calling convention");
3316
3317 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3318 strcat (buf, ", gnu calling convention");
3319 break;
4d6ed7c8
NC
3320
3321 case EM_IA_64:
3322 if ((e_flags & EF_IA_64_ABI64))
3323 strcat (buf, ", 64-bit");
3324 else
3325 strcat (buf, ", 32-bit");
3326 if ((e_flags & EF_IA_64_REDUCEDFP))
3327 strcat (buf, ", reduced fp model");
3328 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3329 strcat (buf, ", no function descriptors, constant gp");
3330 else if ((e_flags & EF_IA_64_CONS_GP))
3331 strcat (buf, ", constant gp");
3332 if ((e_flags & EF_IA_64_ABSOLUTE))
3333 strcat (buf, ", absolute");
28f997cf
TG
3334 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3335 {
3336 if ((e_flags & EF_IA_64_VMS_LINKAGES))
3337 strcat (buf, ", vms_linkages");
3338 switch ((e_flags & EF_IA_64_VMS_COMCOD))
3339 {
3340 case EF_IA_64_VMS_COMCOD_SUCCESS:
3341 break;
3342 case EF_IA_64_VMS_COMCOD_WARNING:
3343 strcat (buf, ", warning");
3344 break;
3345 case EF_IA_64_VMS_COMCOD_ERROR:
3346 strcat (buf, ", error");
3347 break;
3348 case EF_IA_64_VMS_COMCOD_ABORT:
3349 strcat (buf, ", abort");
3350 break;
3351 default:
bee0ee85
NC
3352 warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3353 e_flags & EF_IA_64_VMS_COMCOD);
3354 strcat (buf, ", <unknown>");
28f997cf
TG
3355 }
3356 }
4d6ed7c8 3357 break;
179d3252
JT
3358
3359 case EM_VAX:
3360 if ((e_flags & EF_VAX_NONPIC))
3361 strcat (buf, ", non-PIC");
3362 if ((e_flags & EF_VAX_DFLOAT))
3363 strcat (buf, ", D-Float");
3364 if ((e_flags & EF_VAX_GFLOAT))
3365 strcat (buf, ", G-Float");
3366 break;
c7927a3c 3367
619ed720
EB
3368 case EM_VISIUM:
3369 if (e_flags & EF_VISIUM_ARCH_MCM)
3370 strcat (buf, ", mcm");
3371 else if (e_flags & EF_VISIUM_ARCH_MCM24)
3372 strcat (buf, ", mcm24");
3373 if (e_flags & EF_VISIUM_ARCH_GR6)
3374 strcat (buf, ", gr6");
3375 break;
3376
4046d87a 3377 case EM_RL78:
1740ba0c
NC
3378 switch (e_flags & E_FLAG_RL78_CPU_MASK)
3379 {
3380 case E_FLAG_RL78_ANY_CPU: break;
3381 case E_FLAG_RL78_G10: strcat (buf, ", G10"); break;
3382 case E_FLAG_RL78_G13: strcat (buf, ", G13"); break;
3383 case E_FLAG_RL78_G14: strcat (buf, ", G14"); break;
3384 }
856ea05c
KP
3385 if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3386 strcat (buf, ", 64-bit doubles");
4046d87a 3387 break;
0b4362b0 3388
c7927a3c
NC
3389 case EM_RX:
3390 if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3391 strcat (buf, ", 64-bit doubles");
3392 if (e_flags & E_FLAG_RX_DSP)
dd24e3da 3393 strcat (buf, ", dsp");
d4cb0ea0 3394 if (e_flags & E_FLAG_RX_PID)
0b4362b0 3395 strcat (buf, ", pid");
708e2187
NC
3396 if (e_flags & E_FLAG_RX_ABI)
3397 strcat (buf, ", RX ABI");
3525236c
NC
3398 if (e_flags & E_FLAG_RX_SINSNS_SET)
3399 strcat (buf, e_flags & E_FLAG_RX_SINSNS_YES
3400 ? ", uses String instructions" : ", bans String instructions");
a117b0a5
YS
3401 if (e_flags & E_FLAG_RX_V2)
3402 strcat (buf, ", V2");
d4cb0ea0 3403 break;
55786da2
AK
3404
3405 case EM_S390:
3406 if (e_flags & EF_S390_HIGH_GPRS)
3407 strcat (buf, ", highgprs");
d4cb0ea0 3408 break;
40b36596
JM
3409
3410 case EM_TI_C6000:
3411 if ((e_flags & EF_C6000_REL))
3412 strcat (buf, ", relocatable module");
d4cb0ea0 3413 break;
13761a11
NC
3414
3415 case EM_MSP430:
3416 strcat (buf, _(": architecture variant: "));
3417 switch (e_flags & EF_MSP430_MACH)
3418 {
3419 case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3420 case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3421 case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3422 case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3423 case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3424 case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3425 case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3426 case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3427 case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3428 case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3429 case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3430 case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3431 case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3432 case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3433 case E_MSP430_MACH_MSP430X : strcat (buf, "MSP430X"); break;
3434 default:
3435 strcat (buf, _(": unknown")); break;
3436 }
3437
3438 if (e_flags & ~ EF_MSP430_MACH)
3439 strcat (buf, _(": unknown extra flag bits also present"));
252b5132
RH
3440 }
3441 }
3442
3443 return buf;
3444}
3445
252b5132 3446static const char *
d3ba0551
AM
3447get_osabi_name (unsigned int osabi)
3448{
3449 static char buff[32];
3450
3451 switch (osabi)
3452 {
3453 case ELFOSABI_NONE: return "UNIX - System V";
3454 case ELFOSABI_HPUX: return "UNIX - HP-UX";
3455 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
9c55345c 3456 case ELFOSABI_GNU: return "UNIX - GNU";
d3ba0551
AM
3457 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
3458 case ELFOSABI_AIX: return "UNIX - AIX";
3459 case ELFOSABI_IRIX: return "UNIX - IRIX";
3460 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
3461 case ELFOSABI_TRU64: return "UNIX - TRU64";
3462 case ELFOSABI_MODESTO: return "Novell - Modesto";
3463 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
3464 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
3465 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
3b26c801 3466 case ELFOSABI_AROS: return "AROS";
11636f9e 3467 case ELFOSABI_FENIXOS: return "FenixOS";
d3ba0551 3468 default:
40b36596
JM
3469 if (osabi >= 64)
3470 switch (elf_header.e_machine)
3471 {
3472 case EM_ARM:
3473 switch (osabi)
3474 {
3475 case ELFOSABI_ARM: return "ARM";
3476 default:
3477 break;
3478 }
3479 break;
3480
3481 case EM_MSP430:
3482 case EM_MSP430_OLD:
619ed720 3483 case EM_VISIUM:
40b36596
JM
3484 switch (osabi)
3485 {
3486 case ELFOSABI_STANDALONE: return _("Standalone App");
3487 default:
3488 break;
3489 }
3490 break;
3491
3492 case EM_TI_C6000:
3493 switch (osabi)
3494 {
3495 case ELFOSABI_C6000_ELFABI: return _("Bare-metal C6000");
3496 case ELFOSABI_C6000_LINUX: return "Linux C6000";
3497 default:
3498 break;
3499 }
3500 break;
3501
3502 default:
3503 break;
3504 }
e9e44622 3505 snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
d3ba0551
AM
3506 return buff;
3507 }
3508}
3509
a06ea964
NC
3510static const char *
3511get_aarch64_segment_type (unsigned long type)
3512{
3513 switch (type)
3514 {
3515 case PT_AARCH64_ARCHEXT:
3516 return "AARCH64_ARCHEXT";
3517 default:
3518 break;
3519 }
3520
3521 return NULL;
3522}
3523
b294bdf8
MM
3524static const char *
3525get_arm_segment_type (unsigned long type)
3526{
3527 switch (type)
3528 {
3529 case PT_ARM_EXIDX:
3530 return "EXIDX";
3531 default:
3532 break;
3533 }
3534
3535 return NULL;
3536}
3537
d3ba0551
AM
3538static const char *
3539get_mips_segment_type (unsigned long type)
252b5132
RH
3540{
3541 switch (type)
3542 {
3543 case PT_MIPS_REGINFO:
3544 return "REGINFO";
3545 case PT_MIPS_RTPROC:
3546 return "RTPROC";
3547 case PT_MIPS_OPTIONS:
3548 return "OPTIONS";
351cdf24
MF
3549 case PT_MIPS_ABIFLAGS:
3550 return "ABIFLAGS";
252b5132
RH
3551 default:
3552 break;
3553 }
3554
3555 return NULL;
3556}
3557
103f02d3 3558static const char *
d3ba0551 3559get_parisc_segment_type (unsigned long type)
103f02d3
UD
3560{
3561 switch (type)
3562 {
3563 case PT_HP_TLS: return "HP_TLS";
3564 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
3565 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
3566 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
3567 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
3568 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
3569 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
3570 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
3571 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
3572 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
3573 case PT_HP_PARALLEL: return "HP_PARALLEL";
3574 case PT_HP_FASTBIND: return "HP_FASTBIND";
eec8f817
DA
3575 case PT_HP_OPT_ANNOT: return "HP_OPT_ANNOT";
3576 case PT_HP_HSL_ANNOT: return "HP_HSL_ANNOT";
3577 case PT_HP_STACK: return "HP_STACK";
3578 case PT_HP_CORE_UTSNAME: return "HP_CORE_UTSNAME";
103f02d3
UD
3579 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
3580 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
61472819 3581 case PT_PARISC_WEAKORDER: return "PARISC_WEAKORDER";
103f02d3
UD
3582 default:
3583 break;
3584 }
3585
3586 return NULL;
3587}
3588
4d6ed7c8 3589static const char *
d3ba0551 3590get_ia64_segment_type (unsigned long type)
4d6ed7c8
NC
3591{
3592 switch (type)
3593 {
3594 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
3595 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
00428cca
AM
3596 case PT_HP_TLS: return "HP_TLS";
3597 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
3598 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
3599 case PT_IA_64_HP_STACK: return "HP_STACK";
4d6ed7c8
NC
3600 default:
3601 break;
3602 }
3603
3604 return NULL;
3605}
3606
40b36596
JM
3607static const char *
3608get_tic6x_segment_type (unsigned long type)
3609{
3610 switch (type)
3611 {
3612 case PT_C6000_PHATTR: return "C6000_PHATTR";
3613 default:
3614 break;
3615 }
3616
3617 return NULL;
3618}
3619
252b5132 3620static const char *
d3ba0551 3621get_segment_type (unsigned long p_type)
252b5132 3622{
b34976b6 3623 static char buff[32];
252b5132
RH
3624
3625 switch (p_type)
3626 {
b34976b6
AM
3627 case PT_NULL: return "NULL";
3628 case PT_LOAD: return "LOAD";
252b5132 3629 case PT_DYNAMIC: return "DYNAMIC";
b34976b6
AM
3630 case PT_INTERP: return "INTERP";
3631 case PT_NOTE: return "NOTE";
3632 case PT_SHLIB: return "SHLIB";
3633 case PT_PHDR: return "PHDR";
13ae64f3 3634 case PT_TLS: return "TLS";
252b5132 3635
65765700
JJ
3636 case PT_GNU_EH_FRAME:
3637 return "GNU_EH_FRAME";
2b05f1b7 3638 case PT_GNU_STACK: return "GNU_STACK";
8c37241b 3639 case PT_GNU_RELRO: return "GNU_RELRO";
65765700 3640
252b5132
RH
3641 default:
3642 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3643 {
2cf0635d 3644 const char * result;
103f02d3 3645
252b5132
RH
3646 switch (elf_header.e_machine)
3647 {
a06ea964
NC
3648 case EM_AARCH64:
3649 result = get_aarch64_segment_type (p_type);
3650 break;
b294bdf8
MM
3651 case EM_ARM:
3652 result = get_arm_segment_type (p_type);
3653 break;
252b5132 3654 case EM_MIPS:
4fe85591 3655 case EM_MIPS_RS3_LE:
252b5132
RH
3656 result = get_mips_segment_type (p_type);
3657 break;
103f02d3
UD
3658 case EM_PARISC:
3659 result = get_parisc_segment_type (p_type);
3660 break;
4d6ed7c8
NC
3661 case EM_IA_64:
3662 result = get_ia64_segment_type (p_type);
3663 break;
40b36596
JM
3664 case EM_TI_C6000:
3665 result = get_tic6x_segment_type (p_type);
3666 break;
252b5132
RH
3667 default:
3668 result = NULL;
3669 break;
3670 }
103f02d3 3671
252b5132
RH
3672 if (result != NULL)
3673 return result;
103f02d3 3674
252b5132
RH
3675 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
3676 }
3677 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
103f02d3 3678 {
2cf0635d 3679 const char * result;
103f02d3
UD
3680
3681 switch (elf_header.e_machine)
3682 {
3683 case EM_PARISC:
3684 result = get_parisc_segment_type (p_type);
3685 break;
00428cca
AM
3686 case EM_IA_64:
3687 result = get_ia64_segment_type (p_type);
3688 break;
103f02d3
UD
3689 default:
3690 result = NULL;
3691 break;
3692 }
3693
3694 if (result != NULL)
3695 return result;
3696
3697 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
3698 }
252b5132 3699 else
e9e44622 3700 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
252b5132
RH
3701
3702 return buff;
3703 }
3704}
3705
3706static const char *
d3ba0551 3707get_mips_section_type_name (unsigned int sh_type)
252b5132
RH
3708{
3709 switch (sh_type)
3710 {
b34976b6
AM
3711 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
3712 case SHT_MIPS_MSYM: return "MIPS_MSYM";
3713 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
3714 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
3715 case SHT_MIPS_UCODE: return "MIPS_UCODE";
3716 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
3717 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
3718 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
3719 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
3720 case SHT_MIPS_RELD: return "MIPS_RELD";
3721 case SHT_MIPS_IFACE: return "MIPS_IFACE";
3722 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
3723 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
3724 case SHT_MIPS_SHDR: return "MIPS_SHDR";
3725 case SHT_MIPS_FDESC: return "MIPS_FDESC";
3726 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
3727 case SHT_MIPS_DENSE: return "MIPS_DENSE";
3728 case SHT_MIPS_PDESC: return "MIPS_PDESC";
3729 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
3730 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
3731 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
3732 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
3733 case SHT_MIPS_LINE: return "MIPS_LINE";
3734 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
3735 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
3736 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
3737 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
3738 case SHT_MIPS_DWARF: return "MIPS_DWARF";
3739 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
3740 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
3741 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
3742 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
3743 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
3744 case SHT_MIPS_XLATE: return "MIPS_XLATE";
3745 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
3746 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
3747 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
3748 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
252b5132 3749 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
351cdf24 3750 case SHT_MIPS_ABIFLAGS: return "MIPS_ABIFLAGS";
252b5132
RH
3751 default:
3752 break;
3753 }
3754 return NULL;
3755}
3756
103f02d3 3757static const char *
d3ba0551 3758get_parisc_section_type_name (unsigned int sh_type)
103f02d3
UD
3759{
3760 switch (sh_type)
3761 {
3762 case SHT_PARISC_EXT: return "PARISC_EXT";
3763 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
3764 case SHT_PARISC_DOC: return "PARISC_DOC";
eec8f817
DA
3765 case SHT_PARISC_ANNOT: return "PARISC_ANNOT";
3766 case SHT_PARISC_SYMEXTN: return "PARISC_SYMEXTN";
3767 case SHT_PARISC_STUBS: return "PARISC_STUBS";
61472819 3768 case SHT_PARISC_DLKM: return "PARISC_DLKM";
103f02d3
UD
3769 default:
3770 break;
3771 }
3772 return NULL;
3773}
3774
4d6ed7c8 3775static const char *
d3ba0551 3776get_ia64_section_type_name (unsigned int sh_type)
4d6ed7c8 3777{
18bd398b 3778 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
ecc51f48
NC
3779 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
3780 return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
0de14b54 3781
4d6ed7c8
NC
3782 switch (sh_type)
3783 {
148b93f2
NC
3784 case SHT_IA_64_EXT: return "IA_64_EXT";
3785 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
3786 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
3787 case SHT_IA_64_VMS_TRACE: return "VMS_TRACE";
3788 case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
3789 case SHT_IA_64_VMS_DEBUG: return "VMS_DEBUG";
3790 case SHT_IA_64_VMS_DEBUG_STR: return "VMS_DEBUG_STR";
3791 case SHT_IA_64_VMS_LINKAGES: return "VMS_LINKAGES";
3792 case SHT_IA_64_VMS_SYMBOL_VECTOR: return "VMS_SYMBOL_VECTOR";
3793 case SHT_IA_64_VMS_FIXUP: return "VMS_FIXUP";
4d6ed7c8
NC
3794 default:
3795 break;
3796 }
3797 return NULL;
3798}
3799
d2b2c203
DJ
3800static const char *
3801get_x86_64_section_type_name (unsigned int sh_type)
3802{
3803 switch (sh_type)
3804 {
3805 case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
3806 default:
3807 break;
3808 }
3809 return NULL;
3810}
3811
a06ea964
NC
3812static const char *
3813get_aarch64_section_type_name (unsigned int sh_type)
3814{
3815 switch (sh_type)
3816 {
3817 case SHT_AARCH64_ATTRIBUTES:
3818 return "AARCH64_ATTRIBUTES";
3819 default:
3820 break;
3821 }
3822 return NULL;
3823}
3824
40a18ebd
NC
3825static const char *
3826get_arm_section_type_name (unsigned int sh_type)
3827{
3828 switch (sh_type)
3829 {
7f6fed87
NC
3830 case SHT_ARM_EXIDX: return "ARM_EXIDX";
3831 case SHT_ARM_PREEMPTMAP: return "ARM_PREEMPTMAP";
3832 case SHT_ARM_ATTRIBUTES: return "ARM_ATTRIBUTES";
3833 case SHT_ARM_DEBUGOVERLAY: return "ARM_DEBUGOVERLAY";
3834 case SHT_ARM_OVERLAYSECTION: return "ARM_OVERLAYSECTION";
40a18ebd
NC
3835 default:
3836 break;
3837 }
3838 return NULL;
3839}
3840
40b36596
JM
3841static const char *
3842get_tic6x_section_type_name (unsigned int sh_type)
3843{
3844 switch (sh_type)
3845 {
3846 case SHT_C6000_UNWIND:
3847 return "C6000_UNWIND";
3848 case SHT_C6000_PREEMPTMAP:
3849 return "C6000_PREEMPTMAP";
3850 case SHT_C6000_ATTRIBUTES:
3851 return "C6000_ATTRIBUTES";
3852 case SHT_TI_ICODE:
3853 return "TI_ICODE";
3854 case SHT_TI_XREF:
3855 return "TI_XREF";
3856 case SHT_TI_HANDLER:
3857 return "TI_HANDLER";
3858 case SHT_TI_INITINFO:
3859 return "TI_INITINFO";
3860 case SHT_TI_PHATTRS:
3861 return "TI_PHATTRS";
3862 default:
3863 break;
3864 }
3865 return NULL;
3866}
3867
13761a11
NC
3868static const char *
3869get_msp430x_section_type_name (unsigned int sh_type)
3870{
3871 switch (sh_type)
3872 {
3873 case SHT_MSP430_SEC_FLAGS: return "MSP430_SEC_FLAGS";
3874 case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
3875 case SHT_MSP430_ATTRIBUTES: return "MSP430_ATTRIBUTES";
3876 default: return NULL;
3877 }
3878}
3879
685080f2
NC
3880static const char *
3881get_v850_section_type_name (unsigned int sh_type)
3882{
3883 switch (sh_type)
3884 {
3885 case SHT_V850_SCOMMON: return "V850 Small Common";
3886 case SHT_V850_TCOMMON: return "V850 Tiny Common";
3887 case SHT_V850_ZCOMMON: return "V850 Zero Common";
3888 case SHT_RENESAS_IOP: return "RENESAS IOP";
3889 case SHT_RENESAS_INFO: return "RENESAS INFO";
3890 default: return NULL;
3891 }
3892}
3893
252b5132 3894static const char *
d3ba0551 3895get_section_type_name (unsigned int sh_type)
252b5132 3896{
b34976b6 3897 static char buff[32];
9fb71ee4 3898 const char * result;
252b5132
RH
3899
3900 switch (sh_type)
3901 {
3902 case SHT_NULL: return "NULL";
3903 case SHT_PROGBITS: return "PROGBITS";
3904 case SHT_SYMTAB: return "SYMTAB";
3905 case SHT_STRTAB: return "STRTAB";
3906 case SHT_RELA: return "RELA";
3907 case SHT_HASH: return "HASH";
3908 case SHT_DYNAMIC: return "DYNAMIC";
3909 case SHT_NOTE: return "NOTE";
3910 case SHT_NOBITS: return "NOBITS";
3911 case SHT_REL: return "REL";
3912 case SHT_SHLIB: return "SHLIB";
3913 case SHT_DYNSYM: return "DYNSYM";
d1133906
NC
3914 case SHT_INIT_ARRAY: return "INIT_ARRAY";
3915 case SHT_FINI_ARRAY: return "FINI_ARRAY";
3916 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
fdc90cb4 3917 case SHT_GNU_HASH: return "GNU_HASH";
93ebe586
NC
3918 case SHT_GROUP: return "GROUP";
3919 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
252b5132
RH
3920 case SHT_GNU_verdef: return "VERDEF";
3921 case SHT_GNU_verneed: return "VERNEED";
3922 case SHT_GNU_versym: return "VERSYM";
b34976b6
AM
3923 case 0x6ffffff0: return "VERSYM";
3924 case 0x6ffffffc: return "VERDEF";
252b5132
RH
3925 case 0x7ffffffd: return "AUXILIARY";
3926 case 0x7fffffff: return "FILTER";
047b2264 3927 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
252b5132
RH
3928
3929 default:
3930 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
3931 {
252b5132
RH
3932 switch (elf_header.e_machine)
3933 {
3934 case EM_MIPS:
4fe85591 3935 case EM_MIPS_RS3_LE:
252b5132
RH
3936 result = get_mips_section_type_name (sh_type);
3937 break;
103f02d3
UD
3938 case EM_PARISC:
3939 result = get_parisc_section_type_name (sh_type);
3940 break;
4d6ed7c8
NC
3941 case EM_IA_64:
3942 result = get_ia64_section_type_name (sh_type);
3943 break;
d2b2c203 3944 case EM_X86_64:
8a9036a4 3945 case EM_L1OM:
7a9068fe 3946 case EM_K1OM:
d2b2c203
DJ
3947 result = get_x86_64_section_type_name (sh_type);
3948 break;
a06ea964
NC
3949 case EM_AARCH64:
3950 result = get_aarch64_section_type_name (sh_type);
3951 break;
40a18ebd
NC
3952 case EM_ARM:
3953 result = get_arm_section_type_name (sh_type);
3954 break;
40b36596
JM
3955 case EM_TI_C6000:
3956 result = get_tic6x_section_type_name (sh_type);
3957 break;
13761a11
NC
3958 case EM_MSP430:
3959 result = get_msp430x_section_type_name (sh_type);
3960 break;
685080f2
NC
3961 case EM_V800:
3962 case EM_V850:
3963 case EM_CYGNUS_V850:
3964 result = get_v850_section_type_name (sh_type);
3965 break;
252b5132
RH
3966 default:
3967 result = NULL;
3968 break;
3969 }
3970
3971 if (result != NULL)
3972 return result;
3973
9fb71ee4 3974 sprintf (buff, "LOPROC+%#x", sh_type - SHT_LOPROC);
252b5132
RH
3975 }
3976 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
148b93f2 3977 {
148b93f2
NC
3978 switch (elf_header.e_machine)
3979 {
3980 case EM_IA_64:
3981 result = get_ia64_section_type_name (sh_type);
3982 break;
3983 default:
3984 result = NULL;
3985 break;
3986 }
3987
3988 if (result != NULL)
3989 return result;
3990
9fb71ee4 3991 sprintf (buff, "LOOS+%#x", sh_type - SHT_LOOS);
148b93f2 3992 }
252b5132 3993 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
685080f2
NC
3994 {
3995 switch (elf_header.e_machine)
3996 {
3997 case EM_V800:
3998 case EM_V850:
3999 case EM_CYGNUS_V850:
9fb71ee4 4000 result = get_v850_section_type_name (sh_type);
a9fb83be 4001 break;
685080f2 4002 default:
9fb71ee4 4003 result = NULL;
685080f2
NC
4004 break;
4005 }
4006
9fb71ee4
NC
4007 if (result != NULL)
4008 return result;
4009
4010 sprintf (buff, "LOUSER+%#x", sh_type - SHT_LOUSER);
685080f2 4011 }
252b5132 4012 else
a7dbfd1c
NC
4013 /* This message is probably going to be displayed in a 15
4014 character wide field, so put the hex value first. */
4015 snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
103f02d3 4016
252b5132
RH
4017 return buff;
4018 }
4019}
4020
2979dc34 4021#define OPTION_DEBUG_DUMP 512
2c610e4b 4022#define OPTION_DYN_SYMS 513
fd2f0033
TT
4023#define OPTION_DWARF_DEPTH 514
4024#define OPTION_DWARF_START 515
4723351a 4025#define OPTION_DWARF_CHECK 516
2979dc34 4026
85b1c36d 4027static struct option options[] =
252b5132 4028{
b34976b6 4029 {"all", no_argument, 0, 'a'},
252b5132
RH
4030 {"file-header", no_argument, 0, 'h'},
4031 {"program-headers", no_argument, 0, 'l'},
b34976b6
AM
4032 {"headers", no_argument, 0, 'e'},
4033 {"histogram", no_argument, 0, 'I'},
4034 {"segments", no_argument, 0, 'l'},
4035 {"sections", no_argument, 0, 'S'},
252b5132 4036 {"section-headers", no_argument, 0, 'S'},
f5842774 4037 {"section-groups", no_argument, 0, 'g'},
5477e8a0 4038 {"section-details", no_argument, 0, 't'},
595cf52e 4039 {"full-section-name",no_argument, 0, 'N'},
b34976b6
AM
4040 {"symbols", no_argument, 0, 's'},
4041 {"syms", no_argument, 0, 's'},
2c610e4b 4042 {"dyn-syms", no_argument, 0, OPTION_DYN_SYMS},
b34976b6
AM
4043 {"relocs", no_argument, 0, 'r'},
4044 {"notes", no_argument, 0, 'n'},
4045 {"dynamic", no_argument, 0, 'd'},
a952a375 4046 {"arch-specific", no_argument, 0, 'A'},
252b5132
RH
4047 {"version-info", no_argument, 0, 'V'},
4048 {"use-dynamic", no_argument, 0, 'D'},
09c11c86 4049 {"unwind", no_argument, 0, 'u'},
4145f1d5 4050 {"archive-index", no_argument, 0, 'c'},
b34976b6 4051 {"hex-dump", required_argument, 0, 'x'},
cf13d699 4052 {"relocated-dump", required_argument, 0, 'R'},
09c11c86 4053 {"string-dump", required_argument, 0, 'p'},
0e602686 4054 {"decompress", no_argument, 0, 'z'},
252b5132
RH
4055#ifdef SUPPORT_DISASSEMBLY
4056 {"instruction-dump", required_argument, 0, 'i'},
4057#endif
cf13d699 4058 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
252b5132 4059
fd2f0033
TT
4060 {"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH},
4061 {"dwarf-start", required_argument, 0, OPTION_DWARF_START},
4723351a 4062 {"dwarf-check", no_argument, 0, OPTION_DWARF_CHECK},
fd2f0033 4063
b34976b6
AM
4064 {"version", no_argument, 0, 'v'},
4065 {"wide", no_argument, 0, 'W'},
4066 {"help", no_argument, 0, 'H'},
4067 {0, no_argument, 0, 0}
252b5132
RH
4068};
4069
4070static void
2cf0635d 4071usage (FILE * stream)
252b5132 4072{
92f01d61
JM
4073 fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
4074 fprintf (stream, _(" Display information about the contents of ELF format files\n"));
4075 fprintf (stream, _(" Options are:\n\
8b53311e
NC
4076 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4077 -h --file-header Display the ELF file header\n\
4078 -l --program-headers Display the program headers\n\
4079 --segments An alias for --program-headers\n\
4080 -S --section-headers Display the sections' header\n\
4081 --sections An alias for --section-headers\n\
f5842774 4082 -g --section-groups Display the section groups\n\
5477e8a0 4083 -t --section-details Display the section details\n\
8b53311e
NC
4084 -e --headers Equivalent to: -h -l -S\n\
4085 -s --syms Display the symbol table\n\
3f08eb35 4086 --symbols An alias for --syms\n\
2c610e4b 4087 --dyn-syms Display the dynamic symbol table\n\
8b53311e
NC
4088 -n --notes Display the core notes (if present)\n\
4089 -r --relocs Display the relocations (if present)\n\
4090 -u --unwind Display the unwind info (if present)\n\
b2d38a17 4091 -d --dynamic Display the dynamic section (if present)\n\
8b53311e 4092 -V --version-info Display the version sections (if present)\n\
1b31d05e 4093 -A --arch-specific Display architecture specific information (if any)\n\
4145f1d5 4094 -c --archive-index Display the symbol/file index in an archive\n\
8b53311e 4095 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
09c11c86
NC
4096 -x --hex-dump=<number|name>\n\
4097 Dump the contents of section <number|name> as bytes\n\
4098 -p --string-dump=<number|name>\n\
4099 Dump the contents of section <number|name> as strings\n\
cf13d699
NC
4100 -R --relocated-dump=<number|name>\n\
4101 Dump the contents of section <number|name> as relocated bytes\n\
0e602686 4102 -z --decompress Decompress section before dumping it\n\
f9f0e732 4103 -w[lLiaprmfFsoRt] or\n\
1ed06042 4104 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
6f875884 4105 =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
657d0d47
CC
4106 =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4107 =addr,=cu_index]\n\
8b53311e 4108 Display the contents of DWARF2 debug sections\n"));
fd2f0033
TT
4109 fprintf (stream, _("\
4110 --dwarf-depth=N Do not display DIEs at depth N or greater\n\
4111 --dwarf-start=N Display DIEs starting with N, at the same depth\n\
4112 or deeper\n"));
252b5132 4113#ifdef SUPPORT_DISASSEMBLY
92f01d61 4114 fprintf (stream, _("\
09c11c86
NC
4115 -i --instruction-dump=<number|name>\n\
4116 Disassemble the contents of section <number|name>\n"));
252b5132 4117#endif
92f01d61 4118 fprintf (stream, _("\
8b53311e
NC
4119 -I --histogram Display histogram of bucket list lengths\n\
4120 -W --wide Allow output width to exceed 80 characters\n\
07012eee 4121 @<file> Read options from <file>\n\
8b53311e
NC
4122 -H --help Display this information\n\
4123 -v --version Display the version number of readelf\n"));
1118d252 4124
92f01d61
JM
4125 if (REPORT_BUGS_TO[0] && stream == stdout)
4126 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
252b5132 4127
92f01d61 4128 exit (stream == stdout ? 0 : 1);
252b5132
RH
4129}
4130
18bd398b
NC
4131/* Record the fact that the user wants the contents of section number
4132 SECTION to be displayed using the method(s) encoded as flags bits
4133 in TYPE. Note, TYPE can be zero if we are creating the array for
4134 the first time. */
4135
252b5132 4136static void
09c11c86 4137request_dump_bynumber (unsigned int section, dump_type type)
252b5132
RH
4138{
4139 if (section >= num_dump_sects)
4140 {
2cf0635d 4141 dump_type * new_dump_sects;
252b5132 4142
3f5e193b
NC
4143 new_dump_sects = (dump_type *) calloc (section + 1,
4144 sizeof (* dump_sects));
252b5132
RH
4145
4146 if (new_dump_sects == NULL)
591a748a 4147 error (_("Out of memory allocating dump request table.\n"));
252b5132
RH
4148 else
4149 {
4150 /* Copy current flag settings. */
09c11c86 4151 memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
252b5132
RH
4152
4153 free (dump_sects);
4154
4155 dump_sects = new_dump_sects;
4156 num_dump_sects = section + 1;
4157 }
4158 }
4159
4160 if (dump_sects)
b34976b6 4161 dump_sects[section] |= type;
252b5132
RH
4162
4163 return;
4164}
4165
aef1f6d0
DJ
4166/* Request a dump by section name. */
4167
4168static void
2cf0635d 4169request_dump_byname (const char * section, dump_type type)
aef1f6d0 4170{
2cf0635d 4171 struct dump_list_entry * new_request;
aef1f6d0 4172
3f5e193b
NC
4173 new_request = (struct dump_list_entry *)
4174 malloc (sizeof (struct dump_list_entry));
aef1f6d0 4175 if (!new_request)
591a748a 4176 error (_("Out of memory allocating dump request table.\n"));
aef1f6d0
DJ
4177
4178 new_request->name = strdup (section);
4179 if (!new_request->name)
591a748a 4180 error (_("Out of memory allocating dump request table.\n"));
aef1f6d0
DJ
4181
4182 new_request->type = type;
4183
4184 new_request->next = dump_sects_byname;
4185 dump_sects_byname = new_request;
4186}
4187
cf13d699
NC
4188static inline void
4189request_dump (dump_type type)
4190{
4191 int section;
4192 char * cp;
4193
4194 do_dump++;
4195 section = strtoul (optarg, & cp, 0);
4196
4197 if (! *cp && section >= 0)
4198 request_dump_bynumber (section, type);
4199 else
4200 request_dump_byname (optarg, type);
4201}
4202
4203
252b5132 4204static void
2cf0635d 4205parse_args (int argc, char ** argv)
252b5132
RH
4206{
4207 int c;
4208
4209 if (argc < 2)
92f01d61 4210 usage (stderr);
252b5132
RH
4211
4212 while ((c = getopt_long
0e602686 4213 (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
252b5132 4214 {
252b5132
RH
4215 switch (c)
4216 {
4217 case 0:
4218 /* Long options. */
4219 break;
4220 case 'H':
92f01d61 4221 usage (stdout);
252b5132
RH
4222 break;
4223
4224 case 'a':
b34976b6
AM
4225 do_syms++;
4226 do_reloc++;
4227 do_unwind++;
4228 do_dynamic++;
4229 do_header++;
4230 do_sections++;
f5842774 4231 do_section_groups++;
b34976b6
AM
4232 do_segments++;
4233 do_version++;
4234 do_histogram++;
4235 do_arch++;
4236 do_notes++;
252b5132 4237 break;
f5842774
L
4238 case 'g':
4239 do_section_groups++;
4240 break;
5477e8a0 4241 case 't':
595cf52e 4242 case 'N':
5477e8a0
L
4243 do_sections++;
4244 do_section_details++;
595cf52e 4245 break;
252b5132 4246 case 'e':
b34976b6
AM
4247 do_header++;
4248 do_sections++;
4249 do_segments++;
252b5132 4250 break;
a952a375 4251 case 'A':
b34976b6 4252 do_arch++;
a952a375 4253 break;
252b5132 4254 case 'D':
b34976b6 4255 do_using_dynamic++;
252b5132
RH
4256 break;
4257 case 'r':
b34976b6 4258 do_reloc++;
252b5132 4259 break;
4d6ed7c8 4260 case 'u':
b34976b6 4261 do_unwind++;
4d6ed7c8 4262 break;
252b5132 4263 case 'h':
b34976b6 4264 do_header++;
252b5132
RH
4265 break;
4266 case 'l':
b34976b6 4267 do_segments++;
252b5132
RH
4268 break;
4269 case 's':
b34976b6 4270 do_syms++;
252b5132
RH
4271 break;
4272 case 'S':
b34976b6 4273 do_sections++;
252b5132
RH
4274 break;
4275 case 'd':
b34976b6 4276 do_dynamic++;
252b5132 4277 break;
a952a375 4278 case 'I':
b34976b6 4279 do_histogram++;
a952a375 4280 break;
779fe533 4281 case 'n':
b34976b6 4282 do_notes++;
779fe533 4283 break;
4145f1d5
NC
4284 case 'c':
4285 do_archive_index++;
4286 break;
252b5132 4287 case 'x':
cf13d699 4288 request_dump (HEX_DUMP);
aef1f6d0 4289 break;
09c11c86 4290 case 'p':
cf13d699
NC
4291 request_dump (STRING_DUMP);
4292 break;
4293 case 'R':
4294 request_dump (RELOC_DUMP);
09c11c86 4295 break;
0e602686
NC
4296 case 'z':
4297 decompress_dumps++;
4298 break;
252b5132 4299 case 'w':
b34976b6 4300 do_dump++;
252b5132 4301 if (optarg == 0)
613ff48b
CC
4302 {
4303 do_debugging = 1;
4304 dwarf_select_sections_all ();
4305 }
252b5132
RH
4306 else
4307 {
4308 do_debugging = 0;
4cb93e3b 4309 dwarf_select_sections_by_letters (optarg);
252b5132
RH
4310 }
4311 break;
2979dc34 4312 case OPTION_DEBUG_DUMP:
b34976b6 4313 do_dump++;
2979dc34
JJ
4314 if (optarg == 0)
4315 do_debugging = 1;
4316 else
4317 {
2979dc34 4318 do_debugging = 0;
4cb93e3b 4319 dwarf_select_sections_by_names (optarg);
2979dc34
JJ
4320 }
4321 break;
fd2f0033
TT
4322 case OPTION_DWARF_DEPTH:
4323 {
4324 char *cp;
4325
4326 dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4327 }
4328 break;
4329 case OPTION_DWARF_START:
4330 {
4331 char *cp;
4332
4333 dwarf_start_die = strtoul (optarg, & cp, 0);
4334 }
4335 break;
4723351a
CC
4336 case OPTION_DWARF_CHECK:
4337 dwarf_check = 1;
4338 break;
2c610e4b
L
4339 case OPTION_DYN_SYMS:
4340 do_dyn_syms++;
4341 break;
252b5132
RH
4342#ifdef SUPPORT_DISASSEMBLY
4343 case 'i':
cf13d699
NC
4344 request_dump (DISASS_DUMP);
4345 break;
252b5132
RH
4346#endif
4347 case 'v':
4348 print_version (program_name);
4349 break;
4350 case 'V':
b34976b6 4351 do_version++;
252b5132 4352 break;
d974e256 4353 case 'W':
b34976b6 4354 do_wide++;
d974e256 4355 break;
252b5132 4356 default:
252b5132
RH
4357 /* xgettext:c-format */
4358 error (_("Invalid option '-%c'\n"), c);
4359 /* Drop through. */
4360 case '?':
92f01d61 4361 usage (stderr);
252b5132
RH
4362 }
4363 }
4364
4d6ed7c8 4365 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
252b5132 4366 && !do_segments && !do_header && !do_dump && !do_version
f5842774 4367 && !do_histogram && !do_debugging && !do_arch && !do_notes
2c610e4b
L
4368 && !do_section_groups && !do_archive_index
4369 && !do_dyn_syms)
92f01d61 4370 usage (stderr);
252b5132
RH
4371}
4372
4373static const char *
d3ba0551 4374get_elf_class (unsigned int elf_class)
252b5132 4375{
b34976b6 4376 static char buff[32];
103f02d3 4377
252b5132
RH
4378 switch (elf_class)
4379 {
4380 case ELFCLASSNONE: return _("none");
e3c8793a
NC
4381 case ELFCLASS32: return "ELF32";
4382 case ELFCLASS64: return "ELF64";
ab5e7794 4383 default:
e9e44622 4384 snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
ab5e7794 4385 return buff;
252b5132
RH
4386 }
4387}
4388
4389static const char *
d3ba0551 4390get_data_encoding (unsigned int encoding)
252b5132 4391{
b34976b6 4392 static char buff[32];
103f02d3 4393
252b5132
RH
4394 switch (encoding)
4395 {
4396 case ELFDATANONE: return _("none");
33c63f9d
CM
4397 case ELFDATA2LSB: return _("2's complement, little endian");
4398 case ELFDATA2MSB: return _("2's complement, big endian");
103f02d3 4399 default:
e9e44622 4400 snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
ab5e7794 4401 return buff;
252b5132
RH
4402 }
4403}
4404
252b5132 4405/* Decode the data held in 'elf_header'. */
ee42cf8c 4406
252b5132 4407static int
d3ba0551 4408process_file_header (void)
252b5132 4409{
b34976b6
AM
4410 if ( elf_header.e_ident[EI_MAG0] != ELFMAG0
4411 || elf_header.e_ident[EI_MAG1] != ELFMAG1
4412 || elf_header.e_ident[EI_MAG2] != ELFMAG2
4413 || elf_header.e_ident[EI_MAG3] != ELFMAG3)
252b5132
RH
4414 {
4415 error
4416 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4417 return 0;
4418 }
4419
2dc4cec1
L
4420 init_dwarf_regnames (elf_header.e_machine);
4421
252b5132
RH
4422 if (do_header)
4423 {
4424 int i;
4425
4426 printf (_("ELF Header:\n"));
4427 printf (_(" Magic: "));
b34976b6
AM
4428 for (i = 0; i < EI_NIDENT; i++)
4429 printf ("%2.2x ", elf_header.e_ident[i]);
252b5132
RH
4430 printf ("\n");
4431 printf (_(" Class: %s\n"),
b34976b6 4432 get_elf_class (elf_header.e_ident[EI_CLASS]));
252b5132 4433 printf (_(" Data: %s\n"),
b34976b6 4434 get_data_encoding (elf_header.e_ident[EI_DATA]));
252b5132 4435 printf (_(" Version: %d %s\n"),
b34976b6
AM
4436 elf_header.e_ident[EI_VERSION],
4437 (elf_header.e_ident[EI_VERSION] == EV_CURRENT
789be9f7 4438 ? "(current)"
b34976b6 4439 : (elf_header.e_ident[EI_VERSION] != EV_NONE
2b692964 4440 ? _("<unknown: %lx>")
789be9f7 4441 : "")));
252b5132 4442 printf (_(" OS/ABI: %s\n"),
b34976b6 4443 get_osabi_name (elf_header.e_ident[EI_OSABI]));
252b5132 4444 printf (_(" ABI Version: %d\n"),
b34976b6 4445 elf_header.e_ident[EI_ABIVERSION]);
252b5132
RH
4446 printf (_(" Type: %s\n"),
4447 get_file_type (elf_header.e_type));
4448 printf (_(" Machine: %s\n"),
4449 get_machine_name (elf_header.e_machine));
4450 printf (_(" Version: 0x%lx\n"),
4451 (unsigned long) elf_header.e_version);
76da6bbe 4452
f7a99963
NC
4453 printf (_(" Entry point address: "));
4454 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4455 printf (_("\n Start of program headers: "));
4456 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4457 printf (_(" (bytes into file)\n Start of section headers: "));
4458 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
4459 printf (_(" (bytes into file)\n"));
76da6bbe 4460
252b5132
RH
4461 printf (_(" Flags: 0x%lx%s\n"),
4462 (unsigned long) elf_header.e_flags,
4463 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
4464 printf (_(" Size of this header: %ld (bytes)\n"),
4465 (long) elf_header.e_ehsize);
4466 printf (_(" Size of program headers: %ld (bytes)\n"),
4467 (long) elf_header.e_phentsize);
2046a35d 4468 printf (_(" Number of program headers: %ld"),
252b5132 4469 (long) elf_header.e_phnum);
2046a35d
AM
4470 if (section_headers != NULL
4471 && elf_header.e_phnum == PN_XNUM
4472 && section_headers[0].sh_info != 0)
cc5914eb 4473 printf (" (%ld)", (long) section_headers[0].sh_info);
2046a35d 4474 putc ('\n', stdout);
252b5132
RH
4475 printf (_(" Size of section headers: %ld (bytes)\n"),
4476 (long) elf_header.e_shentsize);
560f3c1c 4477 printf (_(" Number of section headers: %ld"),
252b5132 4478 (long) elf_header.e_shnum);
4fbb74a6 4479 if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
560f3c1c
AM
4480 printf (" (%ld)", (long) section_headers[0].sh_size);
4481 putc ('\n', stdout);
4482 printf (_(" Section header string table index: %ld"),
252b5132 4483 (long) elf_header.e_shstrndx);
4fbb74a6
AM
4484 if (section_headers != NULL
4485 && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
72de5009 4486 printf (" (%u)", section_headers[0].sh_link);
15ba6505
AM
4487 else if (elf_header.e_shstrndx != SHN_UNDEF
4488 && elf_header.e_shstrndx >= elf_header.e_shnum)
2b692964 4489 printf (_(" <corrupt: out of range>"));
560f3c1c
AM
4490 putc ('\n', stdout);
4491 }
4492
4493 if (section_headers != NULL)
4494 {
2046a35d
AM
4495 if (elf_header.e_phnum == PN_XNUM
4496 && section_headers[0].sh_info != 0)
4497 elf_header.e_phnum = section_headers[0].sh_info;
4fbb74a6 4498 if (elf_header.e_shnum == SHN_UNDEF)
560f3c1c 4499 elf_header.e_shnum = section_headers[0].sh_size;
4fbb74a6 4500 if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
560f3c1c 4501 elf_header.e_shstrndx = section_headers[0].sh_link;
4fbb74a6 4502 else if (elf_header.e_shstrndx >= elf_header.e_shnum)
0b49d371 4503 elf_header.e_shstrndx = SHN_UNDEF;
560f3c1c
AM
4504 free (section_headers);
4505 section_headers = NULL;
252b5132 4506 }
103f02d3 4507
9ea033b2
NC
4508 return 1;
4509}
4510
e0a31db1 4511static bfd_boolean
91d6fa6a 4512get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
9ea033b2 4513{
2cf0635d
NC
4514 Elf32_External_Phdr * phdrs;
4515 Elf32_External_Phdr * external;
4516 Elf_Internal_Phdr * internal;
b34976b6 4517 unsigned int i;
e0a31db1
NC
4518 unsigned int size = elf_header.e_phentsize;
4519 unsigned int num = elf_header.e_phnum;
4520
4521 /* PR binutils/17531: Cope with unexpected section header sizes. */
4522 if (size == 0 || num == 0)
4523 return FALSE;
4524 if (size < sizeof * phdrs)
4525 {
4526 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4527 return FALSE;
4528 }
4529 if (size > sizeof * phdrs)
4530 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
103f02d3 4531
3f5e193b 4532 phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
e0a31db1
NC
4533 size, num, _("program headers"));
4534 if (phdrs == NULL)
4535 return FALSE;
9ea033b2 4536
91d6fa6a 4537 for (i = 0, internal = pheaders, external = phdrs;
9ea033b2 4538 i < elf_header.e_phnum;
b34976b6 4539 i++, internal++, external++)
252b5132 4540 {
9ea033b2
NC
4541 internal->p_type = BYTE_GET (external->p_type);
4542 internal->p_offset = BYTE_GET (external->p_offset);
4543 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4544 internal->p_paddr = BYTE_GET (external->p_paddr);
4545 internal->p_filesz = BYTE_GET (external->p_filesz);
4546 internal->p_memsz = BYTE_GET (external->p_memsz);
4547 internal->p_flags = BYTE_GET (external->p_flags);
4548 internal->p_align = BYTE_GET (external->p_align);
252b5132
RH
4549 }
4550
9ea033b2 4551 free (phdrs);
e0a31db1 4552 return TRUE;
252b5132
RH
4553}
4554
e0a31db1 4555static bfd_boolean
91d6fa6a 4556get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
9ea033b2 4557{
2cf0635d
NC
4558 Elf64_External_Phdr * phdrs;
4559 Elf64_External_Phdr * external;
4560 Elf_Internal_Phdr * internal;
b34976b6 4561 unsigned int i;
e0a31db1
NC
4562 unsigned int size = elf_header.e_phentsize;
4563 unsigned int num = elf_header.e_phnum;
4564
4565 /* PR binutils/17531: Cope with unexpected section header sizes. */
4566 if (size == 0 || num == 0)
4567 return FALSE;
4568 if (size < sizeof * phdrs)
4569 {
4570 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4571 return FALSE;
4572 }
4573 if (size > sizeof * phdrs)
4574 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
103f02d3 4575
3f5e193b 4576 phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
e0a31db1 4577 size, num, _("program headers"));
a6e9f9df 4578 if (!phdrs)
e0a31db1 4579 return FALSE;
9ea033b2 4580
91d6fa6a 4581 for (i = 0, internal = pheaders, external = phdrs;
9ea033b2 4582 i < elf_header.e_phnum;
b34976b6 4583 i++, internal++, external++)
9ea033b2
NC
4584 {
4585 internal->p_type = BYTE_GET (external->p_type);
4586 internal->p_flags = BYTE_GET (external->p_flags);
66543521
AM
4587 internal->p_offset = BYTE_GET (external->p_offset);
4588 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4589 internal->p_paddr = BYTE_GET (external->p_paddr);
4590 internal->p_filesz = BYTE_GET (external->p_filesz);
4591 internal->p_memsz = BYTE_GET (external->p_memsz);
4592 internal->p_align = BYTE_GET (external->p_align);
9ea033b2
NC
4593 }
4594
4595 free (phdrs);
e0a31db1 4596 return TRUE;
9ea033b2 4597}
252b5132 4598
d93f0186
NC
4599/* Returns 1 if the program headers were read into `program_headers'. */
4600
4601static int
2cf0635d 4602get_program_headers (FILE * file)
d93f0186 4603{
2cf0635d 4604 Elf_Internal_Phdr * phdrs;
d93f0186
NC
4605
4606 /* Check cache of prior read. */
4607 if (program_headers != NULL)
4608 return 1;
4609
3f5e193b
NC
4610 phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
4611 sizeof (Elf_Internal_Phdr));
d93f0186
NC
4612
4613 if (phdrs == NULL)
4614 {
8b73c356
NC
4615 error (_("Out of memory reading %u program headers\n"),
4616 elf_header.e_phnum);
d93f0186
NC
4617 return 0;
4618 }
4619
4620 if (is_32bit_elf
4621 ? get_32bit_program_headers (file, phdrs)
4622 : get_64bit_program_headers (file, phdrs))
4623 {
4624 program_headers = phdrs;
4625 return 1;
4626 }
4627
4628 free (phdrs);
4629 return 0;
4630}
4631
2f62977e
NC
4632/* Returns 1 if the program headers were loaded. */
4633
252b5132 4634static int
2cf0635d 4635process_program_headers (FILE * file)
252b5132 4636{
2cf0635d 4637 Elf_Internal_Phdr * segment;
b34976b6 4638 unsigned int i;
252b5132
RH
4639
4640 if (elf_header.e_phnum == 0)
4641 {
82f2dbf7
NC
4642 /* PR binutils/12467. */
4643 if (elf_header.e_phoff != 0)
4644 warn (_("possibly corrupt ELF header - it has a non-zero program"
9035ed51 4645 " header offset, but no program headers\n"));
82f2dbf7 4646 else if (do_segments)
252b5132 4647 printf (_("\nThere are no program headers in this file.\n"));
2f62977e 4648 return 0;
252b5132
RH
4649 }
4650
4651 if (do_segments && !do_header)
4652 {
f7a99963
NC
4653 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
4654 printf (_("Entry point "));
4655 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4656 printf (_("\nThere are %d program headers, starting at offset "),
4657 elf_header.e_phnum);
4658 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4659 printf ("\n");
252b5132
RH
4660 }
4661
d93f0186 4662 if (! get_program_headers (file))
252b5132 4663 return 0;
103f02d3 4664
252b5132
RH
4665 if (do_segments)
4666 {
3a1a2036
NC
4667 if (elf_header.e_phnum > 1)
4668 printf (_("\nProgram Headers:\n"));
4669 else
4670 printf (_("\nProgram Headers:\n"));
76da6bbe 4671
f7a99963
NC
4672 if (is_32bit_elf)
4673 printf
4674 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
d974e256
JJ
4675 else if (do_wide)
4676 printf
4677 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
f7a99963
NC
4678 else
4679 {
4680 printf
4681 (_(" Type Offset VirtAddr PhysAddr\n"));
4682 printf
4683 (_(" FileSiz MemSiz Flags Align\n"));
4684 }
252b5132
RH
4685 }
4686
252b5132 4687 dynamic_addr = 0;
1b228002 4688 dynamic_size = 0;
252b5132
RH
4689
4690 for (i = 0, segment = program_headers;
4691 i < elf_header.e_phnum;
b34976b6 4692 i++, segment++)
252b5132
RH
4693 {
4694 if (do_segments)
4695 {
103f02d3 4696 printf (" %-14.14s ", get_segment_type (segment->p_type));
f7a99963
NC
4697
4698 if (is_32bit_elf)
4699 {
4700 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4701 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
4702 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
4703 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
4704 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
4705 printf ("%c%c%c ",
4706 (segment->p_flags & PF_R ? 'R' : ' '),
4707 (segment->p_flags & PF_W ? 'W' : ' '),
4708 (segment->p_flags & PF_X ? 'E' : ' '));
4709 printf ("%#lx", (unsigned long) segment->p_align);
4710 }
d974e256
JJ
4711 else if (do_wide)
4712 {
4713 if ((unsigned long) segment->p_offset == segment->p_offset)
4714 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4715 else
4716 {
4717 print_vma (segment->p_offset, FULL_HEX);
4718 putchar (' ');
4719 }
4720
4721 print_vma (segment->p_vaddr, FULL_HEX);
4722 putchar (' ');
4723 print_vma (segment->p_paddr, FULL_HEX);
4724 putchar (' ');
4725
4726 if ((unsigned long) segment->p_filesz == segment->p_filesz)
4727 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
4728 else
4729 {
4730 print_vma (segment->p_filesz, FULL_HEX);
4731 putchar (' ');
4732 }
4733
4734 if ((unsigned long) segment->p_memsz == segment->p_memsz)
4735 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
4736 else
4737 {
f48e6c45 4738 print_vma (segment->p_memsz, FULL_HEX);
d974e256
JJ
4739 }
4740
4741 printf (" %c%c%c ",
4742 (segment->p_flags & PF_R ? 'R' : ' '),
4743 (segment->p_flags & PF_W ? 'W' : ' '),
4744 (segment->p_flags & PF_X ? 'E' : ' '));
4745
4746 if ((unsigned long) segment->p_align == segment->p_align)
4747 printf ("%#lx", (unsigned long) segment->p_align);
4748 else
4749 {
4750 print_vma (segment->p_align, PREFIX_HEX);
4751 }
4752 }
f7a99963
NC
4753 else
4754 {
4755 print_vma (segment->p_offset, FULL_HEX);
4756 putchar (' ');
4757 print_vma (segment->p_vaddr, FULL_HEX);
4758 putchar (' ');
4759 print_vma (segment->p_paddr, FULL_HEX);
4760 printf ("\n ");
4761 print_vma (segment->p_filesz, FULL_HEX);
4762 putchar (' ');
4763 print_vma (segment->p_memsz, FULL_HEX);
4764 printf (" %c%c%c ",
4765 (segment->p_flags & PF_R ? 'R' : ' '),
4766 (segment->p_flags & PF_W ? 'W' : ' '),
4767 (segment->p_flags & PF_X ? 'E' : ' '));
4768 print_vma (segment->p_align, HEX);
4769 }
252b5132
RH
4770 }
4771
f54498b4
NC
4772 if (do_segments)
4773 putc ('\n', stdout);
4774
252b5132
RH
4775 switch (segment->p_type)
4776 {
252b5132
RH
4777 case PT_DYNAMIC:
4778 if (dynamic_addr)
4779 error (_("more than one dynamic segment\n"));
4780
20737c13
AM
4781 /* By default, assume that the .dynamic section is the first
4782 section in the DYNAMIC segment. */
4783 dynamic_addr = segment->p_offset;
4784 dynamic_size = segment->p_filesz;
f54498b4
NC
4785 /* PR binutils/17512: Avoid corrupt dynamic section info in the segment. */
4786 if (dynamic_addr + dynamic_size >= current_file_size)
4787 {
4788 error (_("the dynamic segment offset + size exceeds the size of the file\n"));
4789 dynamic_addr = dynamic_size = 0;
4790 }
20737c13 4791
b2d38a17
NC
4792 /* Try to locate the .dynamic section. If there is
4793 a section header table, we can easily locate it. */
4794 if (section_headers != NULL)
4795 {
2cf0635d 4796 Elf_Internal_Shdr * sec;
b2d38a17 4797
89fac5e3
RS
4798 sec = find_section (".dynamic");
4799 if (sec == NULL || sec->sh_size == 0)
b2d38a17 4800 {
28f997cf
TG
4801 /* A corresponding .dynamic section is expected, but on
4802 IA-64/OpenVMS it is OK for it to be missing. */
4803 if (!is_ia64_vms ())
4804 error (_("no .dynamic section in the dynamic segment\n"));
b2d38a17
NC
4805 break;
4806 }
4807
42bb2e33 4808 if (sec->sh_type == SHT_NOBITS)
20737c13
AM
4809 {
4810 dynamic_size = 0;
4811 break;
4812 }
42bb2e33 4813
b2d38a17
NC
4814 dynamic_addr = sec->sh_offset;
4815 dynamic_size = sec->sh_size;
4816
4817 if (dynamic_addr < segment->p_offset
4818 || dynamic_addr > segment->p_offset + segment->p_filesz)
20737c13
AM
4819 warn (_("the .dynamic section is not contained"
4820 " within the dynamic segment\n"));
b2d38a17 4821 else if (dynamic_addr > segment->p_offset)
20737c13
AM
4822 warn (_("the .dynamic section is not the first section"
4823 " in the dynamic segment.\n"));
b2d38a17 4824 }
252b5132
RH
4825 break;
4826
4827 case PT_INTERP:
fb52b2f4
NC
4828 if (fseek (file, archive_file_offset + (long) segment->p_offset,
4829 SEEK_SET))
252b5132
RH
4830 error (_("Unable to find program interpreter name\n"));
4831 else
4832 {
f8eae8b2 4833 char fmt [32];
9495b2e6 4834 int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
f8eae8b2
L
4835
4836 if (ret >= (int) sizeof (fmt) || ret < 0)
591a748a 4837 error (_("Internal error: failed to create format string to display program interpreter\n"));
f8eae8b2 4838
252b5132 4839 program_interpreter[0] = 0;
7bd7b3ef
AM
4840 if (fscanf (file, fmt, program_interpreter) <= 0)
4841 error (_("Unable to read program interpreter name\n"));
252b5132
RH
4842
4843 if (do_segments)
f54498b4 4844 printf (_(" [Requesting program interpreter: %s]\n"),
252b5132
RH
4845 program_interpreter);
4846 }
4847 break;
4848 }
252b5132
RH
4849 }
4850
c256ffe7 4851 if (do_segments && section_headers != NULL && string_table != NULL)
252b5132
RH
4852 {
4853 printf (_("\n Section to Segment mapping:\n"));
4854 printf (_(" Segment Sections...\n"));
4855
252b5132
RH
4856 for (i = 0; i < elf_header.e_phnum; i++)
4857 {
9ad5cbcf 4858 unsigned int j;
2cf0635d 4859 Elf_Internal_Shdr * section;
252b5132
RH
4860
4861 segment = program_headers + i;
b391a3e3 4862 section = section_headers + 1;
252b5132
RH
4863
4864 printf (" %2.2d ", i);
4865
b34976b6 4866 for (j = 1; j < elf_header.e_shnum; j++, section++)
252b5132 4867 {
f4638467
AM
4868 if (!ELF_TBSS_SPECIAL (section, segment)
4869 && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
74e1a04b 4870 printf ("%s ", printable_section_name (section));
252b5132
RH
4871 }
4872
4873 putc ('\n',stdout);
4874 }
4875 }
4876
252b5132
RH
4877 return 1;
4878}
4879
4880
d93f0186
NC
4881/* Find the file offset corresponding to VMA by using the program headers. */
4882
4883static long
2cf0635d 4884offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
d93f0186 4885{
2cf0635d 4886 Elf_Internal_Phdr * seg;
d93f0186
NC
4887
4888 if (! get_program_headers (file))
4889 {
4890 warn (_("Cannot interpret virtual addresses without program headers.\n"));
4891 return (long) vma;
4892 }
4893
4894 for (seg = program_headers;
4895 seg < program_headers + elf_header.e_phnum;
4896 ++seg)
4897 {
4898 if (seg->p_type != PT_LOAD)
4899 continue;
4900
4901 if (vma >= (seg->p_vaddr & -seg->p_align)
4902 && vma + size <= seg->p_vaddr + seg->p_filesz)
4903 return vma - seg->p_vaddr + seg->p_offset;
4904 }
4905
4906 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
0af1713e 4907 (unsigned long) vma);
d93f0186
NC
4908 return (long) vma;
4909}
4910
4911
049b0c3a
NC
4912/* Allocate memory and load the sections headers into the global pointer
4913 SECTION_HEADERS. If PROBE is true, this is just a probe and we do not
4914 generate any error messages if the load fails. */
4915
4916static bfd_boolean
4917get_32bit_section_headers (FILE * file, bfd_boolean probe)
252b5132 4918{
2cf0635d
NC
4919 Elf32_External_Shdr * shdrs;
4920 Elf_Internal_Shdr * internal;
b34976b6 4921 unsigned int i;
049b0c3a
NC
4922 unsigned int size = elf_header.e_shentsize;
4923 unsigned int num = probe ? 1 : elf_header.e_shnum;
4924
4925 /* PR binutils/17531: Cope with unexpected section header sizes. */
4926 if (size == 0 || num == 0)
4927 return FALSE;
4928 if (size < sizeof * shdrs)
4929 {
4930 if (! probe)
4931 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
4932 return FALSE;
4933 }
4934 if (!probe && size > sizeof * shdrs)
4935 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
252b5132 4936
3f5e193b 4937 shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
049b0c3a
NC
4938 size, num,
4939 probe ? NULL : _("section headers"));
4940 if (shdrs == NULL)
4941 return FALSE;
252b5132 4942
049b0c3a
NC
4943 if (section_headers != NULL)
4944 free (section_headers);
3f5e193b
NC
4945 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4946 sizeof (Elf_Internal_Shdr));
252b5132
RH
4947 if (section_headers == NULL)
4948 {
049b0c3a 4949 if (!probe)
8b73c356 4950 error (_("Out of memory reading %u section headers\n"), num);
049b0c3a 4951 return FALSE;
252b5132
RH
4952 }
4953
4954 for (i = 0, internal = section_headers;
560f3c1c 4955 i < num;
b34976b6 4956 i++, internal++)
252b5132
RH
4957 {
4958 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
4959 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
4960 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
4961 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
4962 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
4963 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
4964 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
4965 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
4966 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4967 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
4968 }
4969
4970 free (shdrs);
049b0c3a 4971 return TRUE;
252b5132
RH
4972}
4973
049b0c3a
NC
4974static bfd_boolean
4975get_64bit_section_headers (FILE * file, bfd_boolean probe)
9ea033b2 4976{
2cf0635d
NC
4977 Elf64_External_Shdr * shdrs;
4978 Elf_Internal_Shdr * internal;
b34976b6 4979 unsigned int i;
049b0c3a
NC
4980 unsigned int size = elf_header.e_shentsize;
4981 unsigned int num = probe ? 1 : elf_header.e_shnum;
4982
4983 /* PR binutils/17531: Cope with unexpected section header sizes. */
4984 if (size == 0 || num == 0)
4985 return FALSE;
4986 if (size < sizeof * shdrs)
4987 {
4988 if (! probe)
4989 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
4990 return FALSE;
4991 }
4992 if (! probe && size > sizeof * shdrs)
4993 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
9ea033b2 4994
3f5e193b 4995 shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
049b0c3a
NC
4996 size, num,
4997 probe ? NULL : _("section headers"));
4998 if (shdrs == NULL)
4999 return FALSE;
9ea033b2 5000
049b0c3a
NC
5001 if (section_headers != NULL)
5002 free (section_headers);
3f5e193b
NC
5003 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
5004 sizeof (Elf_Internal_Shdr));
9ea033b2
NC
5005 if (section_headers == NULL)
5006 {
049b0c3a 5007 if (! probe)
8b73c356 5008 error (_("Out of memory reading %u section headers\n"), num);
049b0c3a 5009 return FALSE;
9ea033b2
NC
5010 }
5011
5012 for (i = 0, internal = section_headers;
560f3c1c 5013 i < num;
b34976b6 5014 i++, internal++)
9ea033b2
NC
5015 {
5016 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5017 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
66543521
AM
5018 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5019 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5020 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5021 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
9ea033b2
NC
5022 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5023 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5024 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5025 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5026 }
5027
5028 free (shdrs);
049b0c3a 5029 return TRUE;
9ea033b2
NC
5030}
5031
252b5132 5032static Elf_Internal_Sym *
ba5cdace
NC
5033get_32bit_elf_symbols (FILE * file,
5034 Elf_Internal_Shdr * section,
5035 unsigned long * num_syms_return)
252b5132 5036{
ba5cdace 5037 unsigned long number = 0;
dd24e3da 5038 Elf32_External_Sym * esyms = NULL;
ba5cdace 5039 Elf_External_Sym_Shndx * shndx = NULL;
dd24e3da 5040 Elf_Internal_Sym * isyms = NULL;
2cf0635d 5041 Elf_Internal_Sym * psym;
b34976b6 5042 unsigned int j;
252b5132 5043
c9c1d674
EG
5044 if (section->sh_size == 0)
5045 {
5046 if (num_syms_return != NULL)
5047 * num_syms_return = 0;
5048 return NULL;
5049 }
5050
dd24e3da 5051 /* Run some sanity checks first. */
c9c1d674 5052 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
dd24e3da 5053 {
c9c1d674
EG
5054 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5055 printable_section_name (section), (unsigned long) section->sh_entsize);
ba5cdace 5056 goto exit_point;
dd24e3da
NC
5057 }
5058
f54498b4
NC
5059 if (section->sh_size > current_file_size)
5060 {
5061 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
74e1a04b 5062 printable_section_name (section), (unsigned long) section->sh_size);
f54498b4
NC
5063 goto exit_point;
5064 }
5065
dd24e3da
NC
5066 number = section->sh_size / section->sh_entsize;
5067
5068 if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
5069 {
c9c1d674 5070 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
8066deb1
AM
5071 (unsigned long) section->sh_size,
5072 printable_section_name (section),
5073 (unsigned long) section->sh_entsize);
ba5cdace 5074 goto exit_point;
dd24e3da
NC
5075 }
5076
3f5e193b
NC
5077 esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5078 section->sh_size, _("symbols"));
dd24e3da 5079 if (esyms == NULL)
ba5cdace 5080 goto exit_point;
252b5132 5081
6a40cf0c
NC
5082 {
5083 elf_section_list * entry;
5084
5085 shndx = NULL;
5086 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5087 if (entry->hdr->sh_link == (unsigned long) (section - section_headers))
c9c1d674 5088 {
6a40cf0c
NC
5089 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5090 entry->hdr->sh_offset,
5091 1, entry->hdr->sh_size,
5092 _("symbol table section indicies"));
5093 if (shndx == NULL)
5094 goto exit_point;
5095 /* PR17531: file: heap-buffer-overflow */
5096 else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5097 {
5098 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5099 printable_section_name (entry->hdr),
5100 (unsigned long) entry->hdr->sh_size,
5101 (unsigned long) section->sh_size);
5102 goto exit_point;
5103 }
c9c1d674 5104 }
6a40cf0c 5105 }
9ad5cbcf 5106
3f5e193b 5107 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
252b5132
RH
5108
5109 if (isyms == NULL)
5110 {
8b73c356
NC
5111 error (_("Out of memory reading %lu symbols\n"),
5112 (unsigned long) number);
dd24e3da 5113 goto exit_point;
252b5132
RH
5114 }
5115
dd24e3da 5116 for (j = 0, psym = isyms; j < number; j++, psym++)
252b5132
RH
5117 {
5118 psym->st_name = BYTE_GET (esyms[j].st_name);
5119 psym->st_value = BYTE_GET (esyms[j].st_value);
5120 psym->st_size = BYTE_GET (esyms[j].st_size);
5121 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4fbb74a6 5122 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
9ad5cbcf
AM
5123 psym->st_shndx
5124 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4fbb74a6
AM
5125 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5126 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
252b5132
RH
5127 psym->st_info = BYTE_GET (esyms[j].st_info);
5128 psym->st_other = BYTE_GET (esyms[j].st_other);
5129 }
5130
dd24e3da 5131 exit_point:
ba5cdace 5132 if (shndx != NULL)
9ad5cbcf 5133 free (shndx);
ba5cdace 5134 if (esyms != NULL)
dd24e3da 5135 free (esyms);
252b5132 5136
ba5cdace
NC
5137 if (num_syms_return != NULL)
5138 * num_syms_return = isyms == NULL ? 0 : number;
5139
252b5132
RH
5140 return isyms;
5141}
5142
9ea033b2 5143static Elf_Internal_Sym *
ba5cdace
NC
5144get_64bit_elf_symbols (FILE * file,
5145 Elf_Internal_Shdr * section,
5146 unsigned long * num_syms_return)
9ea033b2 5147{
ba5cdace
NC
5148 unsigned long number = 0;
5149 Elf64_External_Sym * esyms = NULL;
5150 Elf_External_Sym_Shndx * shndx = NULL;
5151 Elf_Internal_Sym * isyms = NULL;
2cf0635d 5152 Elf_Internal_Sym * psym;
b34976b6 5153 unsigned int j;
9ea033b2 5154
c9c1d674
EG
5155 if (section->sh_size == 0)
5156 {
5157 if (num_syms_return != NULL)
5158 * num_syms_return = 0;
5159 return NULL;
5160 }
5161
dd24e3da 5162 /* Run some sanity checks first. */
c9c1d674 5163 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
dd24e3da 5164 {
c9c1d674 5165 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
8066deb1
AM
5166 printable_section_name (section),
5167 (unsigned long) section->sh_entsize);
ba5cdace 5168 goto exit_point;
dd24e3da
NC
5169 }
5170
f54498b4
NC
5171 if (section->sh_size > current_file_size)
5172 {
5173 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
8066deb1
AM
5174 printable_section_name (section),
5175 (unsigned long) section->sh_size);
f54498b4
NC
5176 goto exit_point;
5177 }
5178
dd24e3da
NC
5179 number = section->sh_size / section->sh_entsize;
5180
5181 if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5182 {
c9c1d674 5183 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
8066deb1
AM
5184 (unsigned long) section->sh_size,
5185 printable_section_name (section),
5186 (unsigned long) section->sh_entsize);
ba5cdace 5187 goto exit_point;
dd24e3da
NC
5188 }
5189
3f5e193b
NC
5190 esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5191 section->sh_size, _("symbols"));
a6e9f9df 5192 if (!esyms)
ba5cdace 5193 goto exit_point;
9ea033b2 5194
6a40cf0c
NC
5195 {
5196 elf_section_list * entry;
5197
5198 shndx = NULL;
5199 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5200 if (entry->hdr->sh_link == (unsigned long) (section - section_headers))
c9c1d674 5201 {
6a40cf0c
NC
5202 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5203 entry->hdr->sh_offset,
5204 1, entry->hdr->sh_size,
5205 _("symbol table section indicies"));
5206 if (shndx == NULL)
5207 goto exit_point;
5208 /* PR17531: file: heap-buffer-overflow */
5209 else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5210 {
5211 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5212 printable_section_name (entry->hdr),
5213 (unsigned long) entry->hdr->sh_size,
5214 (unsigned long) section->sh_size);
5215 goto exit_point;
5216 }
c9c1d674 5217 }
6a40cf0c 5218 }
9ad5cbcf 5219
3f5e193b 5220 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
9ea033b2
NC
5221
5222 if (isyms == NULL)
5223 {
8b73c356
NC
5224 error (_("Out of memory reading %lu symbols\n"),
5225 (unsigned long) number);
ba5cdace 5226 goto exit_point;
9ea033b2
NC
5227 }
5228
ba5cdace 5229 for (j = 0, psym = isyms; j < number; j++, psym++)
9ea033b2
NC
5230 {
5231 psym->st_name = BYTE_GET (esyms[j].st_name);
5232 psym->st_info = BYTE_GET (esyms[j].st_info);
5233 psym->st_other = BYTE_GET (esyms[j].st_other);
5234 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
ba5cdace 5235
4fbb74a6 5236 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
9ad5cbcf
AM
5237 psym->st_shndx
5238 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4fbb74a6
AM
5239 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5240 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
ba5cdace 5241
66543521
AM
5242 psym->st_value = BYTE_GET (esyms[j].st_value);
5243 psym->st_size = BYTE_GET (esyms[j].st_size);
9ea033b2
NC
5244 }
5245
ba5cdace
NC
5246 exit_point:
5247 if (shndx != NULL)
9ad5cbcf 5248 free (shndx);
ba5cdace
NC
5249 if (esyms != NULL)
5250 free (esyms);
5251
5252 if (num_syms_return != NULL)
5253 * num_syms_return = isyms == NULL ? 0 : number;
9ea033b2
NC
5254
5255 return isyms;
5256}
5257
d1133906 5258static const char *
d3ba0551 5259get_elf_section_flags (bfd_vma sh_flags)
d1133906 5260{
5477e8a0 5261 static char buff[1024];
2cf0635d 5262 char * p = buff;
8d5ff12c 5263 int field_size = is_32bit_elf ? 8 : 16;
91d6fa6a
NC
5264 int sindex;
5265 int size = sizeof (buff) - (field_size + 4 + 1);
8d5ff12c
L
5266 bfd_vma os_flags = 0;
5267 bfd_vma proc_flags = 0;
5268 bfd_vma unknown_flags = 0;
148b93f2 5269 static const struct
5477e8a0 5270 {
2cf0635d 5271 const char * str;
5477e8a0
L
5272 int len;
5273 }
5274 flags [] =
5275 {
cfcac11d
NC
5276 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
5277 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
5278 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
5279 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
5280 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
5281 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
5282 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5283 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5284 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
5285 /* 9 */ { STRING_COMMA_LEN ("TLS") },
5286 /* IA-64 specific. */
5287 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5288 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5289 /* IA-64 OpenVMS specific. */
5290 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5291 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5292 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5293 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5294 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5295 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
18ae9cc1 5296 /* Generic. */
cfcac11d 5297 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
18ae9cc1 5298 /* SPARC specific. */
77115a4a 5299 /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
ac4c9b04
MG
5300 /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5301 /* ARM specific. */
5302 /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
5303 /* 22 */ { STRING_COMMA_LEN ("ARM_NOREAD") },
5304 /* 23 */ { STRING_COMMA_LEN ("COMDEF") }
5477e8a0
L
5305 };
5306
5307 if (do_section_details)
5308 {
8d5ff12c
L
5309 sprintf (buff, "[%*.*lx]: ",
5310 field_size, field_size, (unsigned long) sh_flags);
5311 p += field_size + 4;
5477e8a0 5312 }
76da6bbe 5313
d1133906
NC
5314 while (sh_flags)
5315 {
5316 bfd_vma flag;
5317
5318 flag = sh_flags & - sh_flags;
5319 sh_flags &= ~ flag;
76da6bbe 5320
5477e8a0 5321 if (do_section_details)
d1133906 5322 {
5477e8a0
L
5323 switch (flag)
5324 {
91d6fa6a
NC
5325 case SHF_WRITE: sindex = 0; break;
5326 case SHF_ALLOC: sindex = 1; break;
5327 case SHF_EXECINSTR: sindex = 2; break;
5328 case SHF_MERGE: sindex = 3; break;
5329 case SHF_STRINGS: sindex = 4; break;
5330 case SHF_INFO_LINK: sindex = 5; break;
5331 case SHF_LINK_ORDER: sindex = 6; break;
5332 case SHF_OS_NONCONFORMING: sindex = 7; break;
5333 case SHF_GROUP: sindex = 8; break;
5334 case SHF_TLS: sindex = 9; break;
18ae9cc1 5335 case SHF_EXCLUDE: sindex = 18; break;
77115a4a 5336 case SHF_COMPRESSED: sindex = 20; break;
76da6bbe 5337
5477e8a0 5338 default:
91d6fa6a 5339 sindex = -1;
cfcac11d 5340 switch (elf_header.e_machine)
148b93f2 5341 {
cfcac11d 5342 case EM_IA_64:
148b93f2 5343 if (flag == SHF_IA_64_SHORT)
91d6fa6a 5344 sindex = 10;
148b93f2 5345 else if (flag == SHF_IA_64_NORECOV)
91d6fa6a 5346 sindex = 11;
148b93f2
NC
5347#ifdef BFD64
5348 else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5349 switch (flag)
5350 {
91d6fa6a
NC
5351 case SHF_IA_64_VMS_GLOBAL: sindex = 12; break;
5352 case SHF_IA_64_VMS_OVERLAID: sindex = 13; break;
5353 case SHF_IA_64_VMS_SHARED: sindex = 14; break;
5354 case SHF_IA_64_VMS_VECTOR: sindex = 15; break;
5355 case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5356 case SHF_IA_64_VMS_PROTECTED: sindex = 17; break;
148b93f2
NC
5357 default: break;
5358 }
5359#endif
cfcac11d
NC
5360 break;
5361
caa83f8b 5362 case EM_386:
22abe556 5363 case EM_IAMCU:
caa83f8b 5364 case EM_X86_64:
7f502d6c 5365 case EM_L1OM:
7a9068fe 5366 case EM_K1OM:
cfcac11d
NC
5367 case EM_OLD_SPARCV9:
5368 case EM_SPARC32PLUS:
5369 case EM_SPARCV9:
5370 case EM_SPARC:
18ae9cc1 5371 if (flag == SHF_ORDERED)
91d6fa6a 5372 sindex = 19;
cfcac11d 5373 break;
ac4c9b04
MG
5374
5375 case EM_ARM:
5376 switch (flag)
5377 {
5378 case SHF_ENTRYSECT: sindex = 21; break;
5379 case SHF_ARM_NOREAD: sindex = 22; break;
5380 case SHF_COMDEF: sindex = 23; break;
5381 default: break;
5382 }
5383 break;
5384
cfcac11d
NC
5385 default:
5386 break;
148b93f2 5387 }
5477e8a0
L
5388 }
5389
91d6fa6a 5390 if (sindex != -1)
5477e8a0 5391 {
8d5ff12c
L
5392 if (p != buff + field_size + 4)
5393 {
5394 if (size < (10 + 2))
bee0ee85
NC
5395 {
5396 warn (_("Internal error: not enough buffer room for section flag info"));
5397 return _("<unknown>");
5398 }
8d5ff12c
L
5399 size -= 2;
5400 *p++ = ',';
5401 *p++ = ' ';
5402 }
5403
91d6fa6a
NC
5404 size -= flags [sindex].len;
5405 p = stpcpy (p, flags [sindex].str);
5477e8a0 5406 }
3b22753a 5407 else if (flag & SHF_MASKOS)
8d5ff12c 5408 os_flags |= flag;
d1133906 5409 else if (flag & SHF_MASKPROC)
8d5ff12c 5410 proc_flags |= flag;
d1133906 5411 else
8d5ff12c 5412 unknown_flags |= flag;
5477e8a0
L
5413 }
5414 else
5415 {
5416 switch (flag)
5417 {
5418 case SHF_WRITE: *p = 'W'; break;
5419 case SHF_ALLOC: *p = 'A'; break;
5420 case SHF_EXECINSTR: *p = 'X'; break;
5421 case SHF_MERGE: *p = 'M'; break;
5422 case SHF_STRINGS: *p = 'S'; break;
5423 case SHF_INFO_LINK: *p = 'I'; break;
5424 case SHF_LINK_ORDER: *p = 'L'; break;
5425 case SHF_OS_NONCONFORMING: *p = 'O'; break;
5426 case SHF_GROUP: *p = 'G'; break;
5427 case SHF_TLS: *p = 'T'; break;
18ae9cc1 5428 case SHF_EXCLUDE: *p = 'E'; break;
77115a4a 5429 case SHF_COMPRESSED: *p = 'C'; break;
5477e8a0
L
5430
5431 default:
8a9036a4 5432 if ((elf_header.e_machine == EM_X86_64
7a9068fe
L
5433 || elf_header.e_machine == EM_L1OM
5434 || elf_header.e_machine == EM_K1OM)
5477e8a0
L
5435 && flag == SHF_X86_64_LARGE)
5436 *p = 'l';
91f68a68
MG
5437 else if (elf_header.e_machine == EM_ARM
5438 && flag == SHF_ARM_NOREAD)
5439 *p = 'y';
5477e8a0
L
5440 else if (flag & SHF_MASKOS)
5441 {
5442 *p = 'o';
5443 sh_flags &= ~ SHF_MASKOS;
5444 }
5445 else if (flag & SHF_MASKPROC)
5446 {
5447 *p = 'p';
5448 sh_flags &= ~ SHF_MASKPROC;
5449 }
5450 else
5451 *p = 'x';
5452 break;
5453 }
5454 p++;
d1133906
NC
5455 }
5456 }
76da6bbe 5457
8d5ff12c
L
5458 if (do_section_details)
5459 {
5460 if (os_flags)
5461 {
5462 size -= 5 + field_size;
5463 if (p != buff + field_size + 4)
5464 {
5465 if (size < (2 + 1))
bee0ee85
NC
5466 {
5467 warn (_("Internal error: not enough buffer room for section flag info"));
5468 return _("<unknown>");
5469 }
8d5ff12c
L
5470 size -= 2;
5471 *p++ = ',';
5472 *p++ = ' ';
5473 }
5474 sprintf (p, "OS (%*.*lx)", field_size, field_size,
5475 (unsigned long) os_flags);
5476 p += 5 + field_size;
5477 }
5478 if (proc_flags)
5479 {
5480 size -= 7 + field_size;
5481 if (p != buff + field_size + 4)
5482 {
5483 if (size < (2 + 1))
bee0ee85
NC
5484 {
5485 warn (_("Internal error: not enough buffer room for section flag info"));
5486 return _("<unknown>");
5487 }
8d5ff12c
L
5488 size -= 2;
5489 *p++ = ',';
5490 *p++ = ' ';
5491 }
5492 sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5493 (unsigned long) proc_flags);
5494 p += 7 + field_size;
5495 }
5496 if (unknown_flags)
5497 {
5498 size -= 10 + field_size;
5499 if (p != buff + field_size + 4)
5500 {
5501 if (size < (2 + 1))
bee0ee85
NC
5502 {
5503 warn (_("Internal error: not enough buffer room for section flag info"));
5504 return _("<unknown>");
5505 }
8d5ff12c
L
5506 size -= 2;
5507 *p++ = ',';
5508 *p++ = ' ';
5509 }
2b692964 5510 sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
8d5ff12c
L
5511 (unsigned long) unknown_flags);
5512 p += 10 + field_size;
5513 }
5514 }
5515
e9e44622 5516 *p = '\0';
d1133906
NC
5517 return buff;
5518}
5519
77115a4a
L
5520static unsigned int
5521get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf)
5522{
5523 if (is_32bit_elf)
5524 {
5525 Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
5526 chdr->ch_type = BYTE_GET (echdr->ch_type);
5527 chdr->ch_size = BYTE_GET (echdr->ch_size);
5528 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5529 return sizeof (*echdr);
5530 }
5531 else
5532 {
5533 Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) buf;
5534 chdr->ch_type = BYTE_GET (echdr->ch_type);
5535 chdr->ch_size = BYTE_GET (echdr->ch_size);
5536 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5537 return sizeof (*echdr);
5538 }
5539}
5540
252b5132 5541static int
2cf0635d 5542process_section_headers (FILE * file)
252b5132 5543{
2cf0635d 5544 Elf_Internal_Shdr * section;
b34976b6 5545 unsigned int i;
252b5132
RH
5546
5547 section_headers = NULL;
5548
5549 if (elf_header.e_shnum == 0)
5550 {
82f2dbf7
NC
5551 /* PR binutils/12467. */
5552 if (elf_header.e_shoff != 0)
5553 warn (_("possibly corrupt ELF file header - it has a non-zero"
5554 " section header offset, but no section headers\n"));
5555 else if (do_sections)
252b5132
RH
5556 printf (_("\nThere are no sections in this file.\n"));
5557
5558 return 1;
5559 }
5560
5561 if (do_sections && !do_header)
9ea033b2 5562 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
252b5132
RH
5563 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
5564
9ea033b2
NC
5565 if (is_32bit_elf)
5566 {
049b0c3a 5567 if (! get_32bit_section_headers (file, FALSE))
9ea033b2
NC
5568 return 0;
5569 }
049b0c3a 5570 else if (! get_64bit_section_headers (file, FALSE))
252b5132
RH
5571 return 0;
5572
5573 /* Read in the string table, so that we have names to display. */
0b49d371 5574 if (elf_header.e_shstrndx != SHN_UNDEF
4fbb74a6 5575 && elf_header.e_shstrndx < elf_header.e_shnum)
252b5132 5576 {
4fbb74a6 5577 section = section_headers + elf_header.e_shstrndx;
d40ac9bd 5578
c256ffe7
JJ
5579 if (section->sh_size != 0)
5580 {
3f5e193b
NC
5581 string_table = (char *) get_data (NULL, file, section->sh_offset,
5582 1, section->sh_size,
5583 _("string table"));
0de14b54 5584
c256ffe7
JJ
5585 string_table_length = string_table != NULL ? section->sh_size : 0;
5586 }
252b5132
RH
5587 }
5588
5589 /* Scan the sections for the dynamic symbol table
e3c8793a 5590 and dynamic string table and debug sections. */
252b5132
RH
5591 dynamic_symbols = NULL;
5592 dynamic_strings = NULL;
5593 dynamic_syminfo = NULL;
6a40cf0c 5594 symtab_shndx_list = NULL;
103f02d3 5595
89fac5e3
RS
5596 eh_addr_size = is_32bit_elf ? 4 : 8;
5597 switch (elf_header.e_machine)
5598 {
5599 case EM_MIPS:
5600 case EM_MIPS_RS3_LE:
5601 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
5602 FDE addresses. However, the ABI also has a semi-official ILP32
5603 variant for which the normal FDE address size rules apply.
5604
5605 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
5606 section, where XX is the size of longs in bits. Unfortunately,
5607 earlier compilers provided no way of distinguishing ILP32 objects
5608 from LP64 objects, so if there's any doubt, we should assume that
5609 the official LP64 form is being used. */
5610 if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
5611 && find_section (".gcc_compiled_long32") == NULL)
5612 eh_addr_size = 8;
5613 break;
0f56a26a
DD
5614
5615 case EM_H8_300:
5616 case EM_H8_300H:
5617 switch (elf_header.e_flags & EF_H8_MACH)
5618 {
5619 case E_H8_MACH_H8300:
5620 case E_H8_MACH_H8300HN:
5621 case E_H8_MACH_H8300SN:
5622 case E_H8_MACH_H8300SXN:
5623 eh_addr_size = 2;
5624 break;
5625 case E_H8_MACH_H8300H:
5626 case E_H8_MACH_H8300S:
5627 case E_H8_MACH_H8300SX:
5628 eh_addr_size = 4;
5629 break;
5630 }
f4236fe4
DD
5631 break;
5632
ff7eeb89 5633 case EM_M32C_OLD:
f4236fe4
DD
5634 case EM_M32C:
5635 switch (elf_header.e_flags & EF_M32C_CPU_MASK)
5636 {
5637 case EF_M32C_CPU_M16C:
5638 eh_addr_size = 2;
5639 break;
5640 }
5641 break;
89fac5e3
RS
5642 }
5643
76ca31c0
NC
5644#define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
5645 do \
5646 { \
5647 bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64; \
5648 if (section->sh_entsize != expected_entsize) \
9dd3a467 5649 { \
76ca31c0
NC
5650 char buf[40]; \
5651 sprintf_vma (buf, section->sh_entsize); \
5652 /* Note: coded this way so that there is a single string for \
5653 translation. */ \
5654 error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
5655 error (_("(Using the expected size of %u for the rest of this dump)\n"), \
5656 (unsigned) expected_entsize); \
9dd3a467 5657 section->sh_entsize = expected_entsize; \
76ca31c0
NC
5658 } \
5659 } \
08d8fa11 5660 while (0)
9dd3a467
NC
5661
5662#define CHECK_ENTSIZE(section, i, type) \
08d8fa11
JJ
5663 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
5664 sizeof (Elf64_External_##type))
5665
252b5132
RH
5666 for (i = 0, section = section_headers;
5667 i < elf_header.e_shnum;
b34976b6 5668 i++, section++)
252b5132 5669 {
2cf0635d 5670 char * name = SECTION_NAME (section);
252b5132
RH
5671
5672 if (section->sh_type == SHT_DYNSYM)
5673 {
5674 if (dynamic_symbols != NULL)
5675 {
5676 error (_("File contains multiple dynamic symbol tables\n"));
5677 continue;
5678 }
5679
08d8fa11 5680 CHECK_ENTSIZE (section, i, Sym);
ba5cdace 5681 dynamic_symbols = GET_ELF_SYMBOLS (file, section, & num_dynamic_syms);
252b5132
RH
5682 }
5683 else if (section->sh_type == SHT_STRTAB
18bd398b 5684 && streq (name, ".dynstr"))
252b5132
RH
5685 {
5686 if (dynamic_strings != NULL)
5687 {
5688 error (_("File contains multiple dynamic string tables\n"));
5689 continue;
5690 }
5691
3f5e193b
NC
5692 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
5693 1, section->sh_size,
5694 _("dynamic strings"));
59245841 5695 dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
252b5132 5696 }
9ad5cbcf
AM
5697 else if (section->sh_type == SHT_SYMTAB_SHNDX)
5698 {
6a40cf0c
NC
5699 elf_section_list * entry = xmalloc (sizeof * entry);
5700 entry->hdr = section;
5701 entry->next = symtab_shndx_list;
5702 symtab_shndx_list = entry;
9ad5cbcf 5703 }
08d8fa11
JJ
5704 else if (section->sh_type == SHT_SYMTAB)
5705 CHECK_ENTSIZE (section, i, Sym);
5706 else if (section->sh_type == SHT_GROUP)
5707 CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
5708 else if (section->sh_type == SHT_REL)
5709 CHECK_ENTSIZE (section, i, Rel);
5710 else if (section->sh_type == SHT_RELA)
5711 CHECK_ENTSIZE (section, i, Rela);
252b5132 5712 else if ((do_debugging || do_debug_info || do_debug_abbrevs
f9f0e732 5713 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
cb8f3167 5714 || do_debug_aranges || do_debug_frames || do_debug_macinfo
657d0d47
CC
5715 || do_debug_str || do_debug_loc || do_debug_ranges
5716 || do_debug_addr || do_debug_cu_index)
1b315056
CS
5717 && (const_strneq (name, ".debug_")
5718 || const_strneq (name, ".zdebug_")))
252b5132 5719 {
1b315056
CS
5720 if (name[1] == 'z')
5721 name += sizeof (".zdebug_") - 1;
5722 else
5723 name += sizeof (".debug_") - 1;
252b5132
RH
5724
5725 if (do_debugging
4723351a
CC
5726 || (do_debug_info && const_strneq (name, "info"))
5727 || (do_debug_info && const_strneq (name, "types"))
5728 || (do_debug_abbrevs && const_strneq (name, "abbrev"))
b40bf0a2
NC
5729 || (do_debug_lines && strcmp (name, "line") == 0)
5730 || (do_debug_lines && const_strneq (name, "line."))
4723351a
CC
5731 || (do_debug_pubnames && const_strneq (name, "pubnames"))
5732 || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
459d52c8
DE
5733 || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
5734 || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
4723351a
CC
5735 || (do_debug_aranges && const_strneq (name, "aranges"))
5736 || (do_debug_ranges && const_strneq (name, "ranges"))
5737 || (do_debug_frames && const_strneq (name, "frame"))
5738 || (do_debug_macinfo && const_strneq (name, "macinfo"))
5739 || (do_debug_macinfo && const_strneq (name, "macro"))
5740 || (do_debug_str && const_strneq (name, "str"))
5741 || (do_debug_loc && const_strneq (name, "loc"))
657d0d47
CC
5742 || (do_debug_addr && const_strneq (name, "addr"))
5743 || (do_debug_cu_index && const_strneq (name, "cu_index"))
5744 || (do_debug_cu_index && const_strneq (name, "tu_index"))
252b5132 5745 )
09c11c86 5746 request_dump_bynumber (i, DEBUG_DUMP);
252b5132 5747 }
a262ae96 5748 /* Linkonce section to be combined with .debug_info at link time. */
09fd7e38 5749 else if ((do_debugging || do_debug_info)
0112cd26 5750 && const_strneq (name, ".gnu.linkonce.wi."))
09c11c86 5751 request_dump_bynumber (i, DEBUG_DUMP);
18bd398b 5752 else if (do_debug_frames && streq (name, ".eh_frame"))
09c11c86 5753 request_dump_bynumber (i, DEBUG_DUMP);
5bbdf3d5
DE
5754 else if (do_gdb_index && streq (name, ".gdb_index"))
5755 request_dump_bynumber (i, DEBUG_DUMP);
6f875884
TG
5756 /* Trace sections for Itanium VMS. */
5757 else if ((do_debugging || do_trace_info || do_trace_abbrevs
5758 || do_trace_aranges)
5759 && const_strneq (name, ".trace_"))
5760 {
5761 name += sizeof (".trace_") - 1;
5762
5763 if (do_debugging
5764 || (do_trace_info && streq (name, "info"))
5765 || (do_trace_abbrevs && streq (name, "abbrev"))
5766 || (do_trace_aranges && streq (name, "aranges"))
5767 )
5768 request_dump_bynumber (i, DEBUG_DUMP);
5769 }
252b5132
RH
5770 }
5771
5772 if (! do_sections)
5773 return 1;
5774
3a1a2036
NC
5775 if (elf_header.e_shnum > 1)
5776 printf (_("\nSection Headers:\n"));
5777 else
5778 printf (_("\nSection Header:\n"));
76da6bbe 5779
f7a99963 5780 if (is_32bit_elf)
595cf52e 5781 {
5477e8a0 5782 if (do_section_details)
595cf52e
L
5783 {
5784 printf (_(" [Nr] Name\n"));
5477e8a0 5785 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
595cf52e
L
5786 }
5787 else
5788 printf
5789 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
5790 }
d974e256 5791 else if (do_wide)
595cf52e 5792 {
5477e8a0 5793 if (do_section_details)
595cf52e
L
5794 {
5795 printf (_(" [Nr] Name\n"));
5477e8a0 5796 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
595cf52e
L
5797 }
5798 else
5799 printf
5800 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
5801 }
f7a99963
NC
5802 else
5803 {
5477e8a0 5804 if (do_section_details)
595cf52e
L
5805 {
5806 printf (_(" [Nr] Name\n"));
5477e8a0
L
5807 printf (_(" Type Address Offset Link\n"));
5808 printf (_(" Size EntSize Info Align\n"));
595cf52e
L
5809 }
5810 else
5811 {
5812 printf (_(" [Nr] Name Type Address Offset\n"));
5813 printf (_(" Size EntSize Flags Link Info Align\n"));
5814 }
f7a99963 5815 }
252b5132 5816
5477e8a0
L
5817 if (do_section_details)
5818 printf (_(" Flags\n"));
5819
252b5132
RH
5820 for (i = 0, section = section_headers;
5821 i < elf_header.e_shnum;
b34976b6 5822 i++, section++)
252b5132 5823 {
7bfd842d 5824 printf (" [%2u] ", i);
5477e8a0 5825 if (do_section_details)
74e1a04b 5826 printf ("%s\n ", printable_section_name (section));
595cf52e 5827 else
74e1a04b 5828 print_symbol (-17, SECTION_NAME (section));
0b4362b0 5829
ea52a088
NC
5830 printf (do_wide ? " %-15s " : " %-15.15s ",
5831 get_section_type_name (section->sh_type));
0b4362b0 5832
f7a99963
NC
5833 if (is_32bit_elf)
5834 {
cfcac11d
NC
5835 const char * link_too_big = NULL;
5836
f7a99963 5837 print_vma (section->sh_addr, LONG_HEX);
76da6bbe 5838
f7a99963
NC
5839 printf ( " %6.6lx %6.6lx %2.2lx",
5840 (unsigned long) section->sh_offset,
5841 (unsigned long) section->sh_size,
5842 (unsigned long) section->sh_entsize);
d1133906 5843
5477e8a0
L
5844 if (do_section_details)
5845 fputs (" ", stdout);
5846 else
5847 printf (" %3s ", get_elf_section_flags (section->sh_flags));
76da6bbe 5848
cfcac11d
NC
5849 if (section->sh_link >= elf_header.e_shnum)
5850 {
5851 link_too_big = "";
5852 /* The sh_link value is out of range. Normally this indicates
caa83f8b 5853 an error but it can have special values in Solaris binaries. */
cfcac11d
NC
5854 switch (elf_header.e_machine)
5855 {
caa83f8b 5856 case EM_386:
22abe556 5857 case EM_IAMCU:
caa83f8b 5858 case EM_X86_64:
7f502d6c 5859 case EM_L1OM:
7a9068fe 5860 case EM_K1OM:
cfcac11d
NC
5861 case EM_OLD_SPARCV9:
5862 case EM_SPARC32PLUS:
5863 case EM_SPARCV9:
5864 case EM_SPARC:
5865 if (section->sh_link == (SHN_BEFORE & 0xffff))
5866 link_too_big = "BEFORE";
5867 else if (section->sh_link == (SHN_AFTER & 0xffff))
5868 link_too_big = "AFTER";
5869 break;
5870 default:
5871 break;
5872 }
5873 }
5874
5875 if (do_section_details)
5876 {
5877 if (link_too_big != NULL && * link_too_big)
5878 printf ("<%s> ", link_too_big);
5879 else
5880 printf ("%2u ", section->sh_link);
5881 printf ("%3u %2lu\n", section->sh_info,
5882 (unsigned long) section->sh_addralign);
5883 }
5884 else
5885 printf ("%2u %3u %2lu\n",
5886 section->sh_link,
5887 section->sh_info,
5888 (unsigned long) section->sh_addralign);
5889
5890 if (link_too_big && ! * link_too_big)
5891 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
5892 i, section->sh_link);
f7a99963 5893 }
d974e256
JJ
5894 else if (do_wide)
5895 {
5896 print_vma (section->sh_addr, LONG_HEX);
5897
5898 if ((long) section->sh_offset == section->sh_offset)
5899 printf (" %6.6lx", (unsigned long) section->sh_offset);
5900 else
5901 {
5902 putchar (' ');
5903 print_vma (section->sh_offset, LONG_HEX);
5904 }
5905
5906 if ((unsigned long) section->sh_size == section->sh_size)
5907 printf (" %6.6lx", (unsigned long) section->sh_size);
5908 else
5909 {
5910 putchar (' ');
5911 print_vma (section->sh_size, LONG_HEX);
5912 }
5913
5914 if ((unsigned long) section->sh_entsize == section->sh_entsize)
5915 printf (" %2.2lx", (unsigned long) section->sh_entsize);
5916 else
5917 {
5918 putchar (' ');
5919 print_vma (section->sh_entsize, LONG_HEX);
5920 }
5921
5477e8a0
L
5922 if (do_section_details)
5923 fputs (" ", stdout);
5924 else
5925 printf (" %3s ", get_elf_section_flags (section->sh_flags));
d974e256 5926
72de5009 5927 printf ("%2u %3u ", section->sh_link, section->sh_info);
d974e256
JJ
5928
5929 if ((unsigned long) section->sh_addralign == section->sh_addralign)
72de5009 5930 printf ("%2lu\n", (unsigned long) section->sh_addralign);
d974e256
JJ
5931 else
5932 {
5933 print_vma (section->sh_addralign, DEC);
5934 putchar ('\n');
5935 }
5936 }
5477e8a0 5937 else if (do_section_details)
595cf52e 5938 {
5477e8a0 5939 printf (" %-15.15s ",
595cf52e 5940 get_section_type_name (section->sh_type));
595cf52e
L
5941 print_vma (section->sh_addr, LONG_HEX);
5942 if ((long) section->sh_offset == section->sh_offset)
5477e8a0 5943 printf (" %16.16lx", (unsigned long) section->sh_offset);
595cf52e
L
5944 else
5945 {
5946 printf (" ");
5947 print_vma (section->sh_offset, LONG_HEX);
5948 }
72de5009 5949 printf (" %u\n ", section->sh_link);
595cf52e 5950 print_vma (section->sh_size, LONG_HEX);
5477e8a0 5951 putchar (' ');
595cf52e
L
5952 print_vma (section->sh_entsize, LONG_HEX);
5953
72de5009
AM
5954 printf (" %-16u %lu\n",
5955 section->sh_info,
595cf52e
L
5956 (unsigned long) section->sh_addralign);
5957 }
f7a99963
NC
5958 else
5959 {
5960 putchar (' ');
5961 print_vma (section->sh_addr, LONG_HEX);
53c7db4b
KH
5962 if ((long) section->sh_offset == section->sh_offset)
5963 printf (" %8.8lx", (unsigned long) section->sh_offset);
5964 else
5965 {
5966 printf (" ");
5967 print_vma (section->sh_offset, LONG_HEX);
5968 }
f7a99963
NC
5969 printf ("\n ");
5970 print_vma (section->sh_size, LONG_HEX);
5971 printf (" ");
5972 print_vma (section->sh_entsize, LONG_HEX);
76da6bbe 5973
d1133906 5974 printf (" %3s ", get_elf_section_flags (section->sh_flags));
76da6bbe 5975
72de5009
AM
5976 printf (" %2u %3u %lu\n",
5977 section->sh_link,
5978 section->sh_info,
f7a99963
NC
5979 (unsigned long) section->sh_addralign);
5980 }
5477e8a0
L
5981
5982 if (do_section_details)
77115a4a
L
5983 {
5984 printf (" %s\n", get_elf_section_flags (section->sh_flags));
5985 if ((section->sh_flags & SHF_COMPRESSED) != 0)
5986 {
5987 /* Minimum section size is 12 bytes for 32-bit compression
5988 header + 12 bytes for compressed data header. */
5989 unsigned char buf[24];
5990 assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
5991 if (get_data (&buf, (FILE *) file, section->sh_offset, 1,
5992 sizeof (buf), _("compression header")))
5993 {
5994 Elf_Internal_Chdr chdr;
5995 get_compression_header (&chdr, buf);
5996 if (chdr.ch_type == ELFCOMPRESS_ZLIB)
5997 printf (" ZLIB, ");
5998 else
5999 printf (_(" [<unknown>: 0x%x], "),
6000 chdr.ch_type);
6001 print_vma (chdr.ch_size, LONG_HEX);
6002 printf (", %lu\n", (unsigned long) chdr.ch_addralign);
6003 }
6004 }
6005 }
252b5132
RH
6006 }
6007
5477e8a0 6008 if (!do_section_details)
3dbcc61d 6009 {
9fb71ee4
NC
6010 /* The ordering of the letters shown here matches the ordering of the
6011 corresponding SHF_xxx values, and hence the order in which these
6012 letters will be displayed to the user. */
6013 printf (_("Key to Flags:\n\
6014 W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6015 L (link order), O (extra OS processing required), G (group), T (TLS),\n\
6016 C (compressed), x (unknown), o (OS specific), E (exclude),\n"));
3dbcc61d 6017 if (elf_header.e_machine == EM_X86_64
7a9068fe
L
6018 || elf_header.e_machine == EM_L1OM
6019 || elf_header.e_machine == EM_K1OM)
9fb71ee4 6020 printf (_("l (large), "));
91f68a68 6021 else if (elf_header.e_machine == EM_ARM)
9fb71ee4
NC
6022 printf (_("y (noread), "));
6023 printf ("p (processor specific)\n");
0b4362b0 6024 }
d1133906 6025
252b5132
RH
6026 return 1;
6027}
6028
f5842774
L
6029static const char *
6030get_group_flags (unsigned int flags)
6031{
6032 static char buff[32];
6033 switch (flags)
6034 {
220453ec
AM
6035 case 0:
6036 return "";
6037
f5842774 6038 case GRP_COMDAT:
220453ec 6039 return "COMDAT ";
f5842774
L
6040
6041 default:
220453ec 6042 snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x] "), flags);
f5842774
L
6043 break;
6044 }
6045 return buff;
6046}
6047
6048static int
2cf0635d 6049process_section_groups (FILE * file)
f5842774 6050{
2cf0635d 6051 Elf_Internal_Shdr * section;
f5842774 6052 unsigned int i;
2cf0635d
NC
6053 struct group * group;
6054 Elf_Internal_Shdr * symtab_sec;
6055 Elf_Internal_Shdr * strtab_sec;
6056 Elf_Internal_Sym * symtab;
ba5cdace 6057 unsigned long num_syms;
2cf0635d 6058 char * strtab;
c256ffe7 6059 size_t strtab_size;
d1f5c6e3
L
6060
6061 /* Don't process section groups unless needed. */
6062 if (!do_unwind && !do_section_groups)
6063 return 1;
f5842774
L
6064
6065 if (elf_header.e_shnum == 0)
6066 {
6067 if (do_section_groups)
82f2dbf7 6068 printf (_("\nThere are no sections to group in this file.\n"));
f5842774
L
6069
6070 return 1;
6071 }
6072
6073 if (section_headers == NULL)
6074 {
6075 error (_("Section headers are not available!\n"));
fa1908fd
NC
6076 /* PR 13622: This can happen with a corrupt ELF header. */
6077 return 0;
f5842774
L
6078 }
6079
3f5e193b
NC
6080 section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
6081 sizeof (struct group *));
e4b17d5c
L
6082
6083 if (section_headers_groups == NULL)
6084 {
8b73c356
NC
6085 error (_("Out of memory reading %u section group headers\n"),
6086 elf_header.e_shnum);
e4b17d5c
L
6087 return 0;
6088 }
6089
f5842774 6090 /* Scan the sections for the group section. */
d1f5c6e3 6091 group_count = 0;
f5842774
L
6092 for (i = 0, section = section_headers;
6093 i < elf_header.e_shnum;
6094 i++, section++)
e4b17d5c
L
6095 if (section->sh_type == SHT_GROUP)
6096 group_count++;
6097
d1f5c6e3
L
6098 if (group_count == 0)
6099 {
6100 if (do_section_groups)
6101 printf (_("\nThere are no section groups in this file.\n"));
6102
6103 return 1;
6104 }
6105
3f5e193b 6106 section_groups = (struct group *) calloc (group_count, sizeof (struct group));
e4b17d5c
L
6107
6108 if (section_groups == NULL)
6109 {
8b73c356
NC
6110 error (_("Out of memory reading %lu groups\n"),
6111 (unsigned long) group_count);
e4b17d5c
L
6112 return 0;
6113 }
6114
d1f5c6e3
L
6115 symtab_sec = NULL;
6116 strtab_sec = NULL;
6117 symtab = NULL;
ba5cdace 6118 num_syms = 0;
d1f5c6e3 6119 strtab = NULL;
c256ffe7 6120 strtab_size = 0;
e4b17d5c
L
6121 for (i = 0, section = section_headers, group = section_groups;
6122 i < elf_header.e_shnum;
6123 i++, section++)
f5842774
L
6124 {
6125 if (section->sh_type == SHT_GROUP)
6126 {
74e1a04b
NC
6127 const char * name = printable_section_name (section);
6128 const char * group_name;
2cf0635d
NC
6129 unsigned char * start;
6130 unsigned char * indices;
f5842774 6131 unsigned int entry, j, size;
2cf0635d
NC
6132 Elf_Internal_Shdr * sec;
6133 Elf_Internal_Sym * sym;
f5842774
L
6134
6135 /* Get the symbol table. */
4fbb74a6
AM
6136 if (section->sh_link >= elf_header.e_shnum
6137 || ((sec = section_headers + section->sh_link)->sh_type
c256ffe7 6138 != SHT_SYMTAB))
f5842774
L
6139 {
6140 error (_("Bad sh_link in group section `%s'\n"), name);
6141 continue;
6142 }
d1f5c6e3
L
6143
6144 if (symtab_sec != sec)
6145 {
6146 symtab_sec = sec;
6147 if (symtab)
6148 free (symtab);
ba5cdace 6149 symtab = GET_ELF_SYMBOLS (file, symtab_sec, & num_syms);
d1f5c6e3 6150 }
f5842774 6151
dd24e3da
NC
6152 if (symtab == NULL)
6153 {
6154 error (_("Corrupt header in group section `%s'\n"), name);
6155 continue;
6156 }
6157
ba5cdace
NC
6158 if (section->sh_info >= num_syms)
6159 {
6160 error (_("Bad sh_info in group section `%s'\n"), name);
6161 continue;
6162 }
6163
f5842774
L
6164 sym = symtab + section->sh_info;
6165
6166 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6167 {
4fbb74a6
AM
6168 if (sym->st_shndx == 0
6169 || sym->st_shndx >= elf_header.e_shnum)
f5842774
L
6170 {
6171 error (_("Bad sh_info in group section `%s'\n"), name);
6172 continue;
6173 }
ba2685cc 6174
4fbb74a6 6175 group_name = SECTION_NAME (section_headers + sym->st_shndx);
c256ffe7
JJ
6176 strtab_sec = NULL;
6177 if (strtab)
6178 free (strtab);
f5842774 6179 strtab = NULL;
c256ffe7 6180 strtab_size = 0;
f5842774
L
6181 }
6182 else
6183 {
6184 /* Get the string table. */
4fbb74a6 6185 if (symtab_sec->sh_link >= elf_header.e_shnum)
c256ffe7
JJ
6186 {
6187 strtab_sec = NULL;
6188 if (strtab)
6189 free (strtab);
6190 strtab = NULL;
6191 strtab_size = 0;
6192 }
6193 else if (strtab_sec
4fbb74a6 6194 != (sec = section_headers + symtab_sec->sh_link))
d1f5c6e3
L
6195 {
6196 strtab_sec = sec;
6197 if (strtab)
6198 free (strtab);
071436c6 6199
3f5e193b 6200 strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
071436c6
NC
6201 1, strtab_sec->sh_size,
6202 _("string table"));
c256ffe7 6203 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
d1f5c6e3 6204 }
c256ffe7 6205 group_name = sym->st_name < strtab_size
2b692964 6206 ? strtab + sym->st_name : _("<corrupt>");
f5842774
L
6207 }
6208
c9c1d674
EG
6209 /* PR 17531: file: loop. */
6210 if (section->sh_entsize > section->sh_size)
6211 {
6212 error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6213 printable_section_name (section),
8066deb1
AM
6214 (unsigned long) section->sh_entsize,
6215 (unsigned long) section->sh_size);
c9c1d674
EG
6216 break;
6217 }
6218
3f5e193b
NC
6219 start = (unsigned char *) get_data (NULL, file, section->sh_offset,
6220 1, section->sh_size,
6221 _("section data"));
59245841
NC
6222 if (start == NULL)
6223 continue;
f5842774
L
6224
6225 indices = start;
6226 size = (section->sh_size / section->sh_entsize) - 1;
6227 entry = byte_get (indices, 4);
6228 indices += 4;
e4b17d5c
L
6229
6230 if (do_section_groups)
6231 {
2b692964 6232 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
391cb864 6233 get_group_flags (entry), i, name, group_name, size);
ba2685cc 6234
e4b17d5c
L
6235 printf (_(" [Index] Name\n"));
6236 }
6237
6238 group->group_index = i;
6239
f5842774
L
6240 for (j = 0; j < size; j++)
6241 {
2cf0635d 6242 struct group_list * g;
e4b17d5c 6243
f5842774
L
6244 entry = byte_get (indices, 4);
6245 indices += 4;
6246
4fbb74a6 6247 if (entry >= elf_header.e_shnum)
391cb864 6248 {
57028622
NC
6249 static unsigned num_group_errors = 0;
6250
6251 if (num_group_errors ++ < 10)
6252 {
6253 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6254 entry, i, elf_header.e_shnum - 1);
6255 if (num_group_errors == 10)
6256 warn (_("Futher error messages about overlarge group section indicies suppressed\n"));
6257 }
391cb864
L
6258 continue;
6259 }
391cb864 6260
4fbb74a6 6261 if (section_headers_groups [entry] != NULL)
e4b17d5c 6262 {
d1f5c6e3
L
6263 if (entry)
6264 {
57028622
NC
6265 static unsigned num_errs = 0;
6266
6267 if (num_errs ++ < 10)
6268 {
6269 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6270 entry, i,
6271 section_headers_groups [entry]->group_index);
6272 if (num_errs == 10)
6273 warn (_("Further error messages about already contained group sections suppressed\n"));
6274 }
d1f5c6e3
L
6275 continue;
6276 }
6277 else
6278 {
6279 /* Intel C/C++ compiler may put section 0 in a
6280 section group. We just warn it the first time
6281 and ignore it afterwards. */
6282 static int warned = 0;
6283 if (!warned)
6284 {
6285 error (_("section 0 in group section [%5u]\n"),
4fbb74a6 6286 section_headers_groups [entry]->group_index);
d1f5c6e3
L
6287 warned++;
6288 }
6289 }
e4b17d5c
L
6290 }
6291
4fbb74a6 6292 section_headers_groups [entry] = group;
e4b17d5c
L
6293
6294 if (do_section_groups)
6295 {
4fbb74a6 6296 sec = section_headers + entry;
74e1a04b 6297 printf (" [%5u] %s\n", entry, printable_section_name (sec));
ba2685cc
AM
6298 }
6299
3f5e193b 6300 g = (struct group_list *) xmalloc (sizeof (struct group_list));
e4b17d5c
L
6301 g->section_index = entry;
6302 g->next = group->root;
6303 group->root = g;
f5842774
L
6304 }
6305
f5842774
L
6306 if (start)
6307 free (start);
e4b17d5c
L
6308
6309 group++;
f5842774
L
6310 }
6311 }
6312
d1f5c6e3
L
6313 if (symtab)
6314 free (symtab);
6315 if (strtab)
6316 free (strtab);
f5842774
L
6317 return 1;
6318}
6319
28f997cf
TG
6320/* Data used to display dynamic fixups. */
6321
6322struct ia64_vms_dynfixup
6323{
6324 bfd_vma needed_ident; /* Library ident number. */
6325 bfd_vma needed; /* Index in the dstrtab of the library name. */
6326 bfd_vma fixup_needed; /* Index of the library. */
6327 bfd_vma fixup_rela_cnt; /* Number of fixups. */
6328 bfd_vma fixup_rela_off; /* Fixups offset in the dynamic segment. */
6329};
6330
6331/* Data used to display dynamic relocations. */
6332
6333struct ia64_vms_dynimgrela
6334{
6335 bfd_vma img_rela_cnt; /* Number of relocations. */
6336 bfd_vma img_rela_off; /* Reloc offset in the dynamic segment. */
6337};
6338
6339/* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6340 library). */
6341
6342static void
6343dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
6344 const char *strtab, unsigned int strtab_sz)
6345{
6346 Elf64_External_VMS_IMAGE_FIXUP *imfs;
6347 long i;
6348 const char *lib_name;
6349
6350 imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
6351 1, fixup->fixup_rela_cnt * sizeof (*imfs),
6352 _("dynamic section image fixups"));
6353 if (!imfs)
6354 return;
6355
6356 if (fixup->needed < strtab_sz)
6357 lib_name = strtab + fixup->needed;
6358 else
6359 {
6360 warn ("corrupt library name index of 0x%lx found in dynamic entry",
7f01b0c6 6361 (unsigned long) fixup->needed);
28f997cf
TG
6362 lib_name = "???";
6363 }
6364 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
6365 (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
6366 printf
6367 (_("Seg Offset Type SymVec DataType\n"));
6368
6369 for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
6370 {
6371 unsigned int type;
6372 const char *rtype;
6373
6374 printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
6375 printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
6376 type = BYTE_GET (imfs [i].type);
6377 rtype = elf_ia64_reloc_type (type);
6378 if (rtype == NULL)
6379 printf (" 0x%08x ", type);
6380 else
6381 printf (" %-32s ", rtype);
6382 printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
6383 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
6384 }
6385
6386 free (imfs);
6387}
6388
6389/* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
6390
6391static void
6392dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
6393{
6394 Elf64_External_VMS_IMAGE_RELA *imrs;
6395 long i;
6396
6397 imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
6398 1, imgrela->img_rela_cnt * sizeof (*imrs),
9cf03b7e 6399 _("dynamic section image relocations"));
28f997cf
TG
6400 if (!imrs)
6401 return;
6402
6403 printf (_("\nImage relocs\n"));
6404 printf
6405 (_("Seg Offset Type Addend Seg Sym Off\n"));
6406
6407 for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
6408 {
6409 unsigned int type;
6410 const char *rtype;
6411
6412 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
6413 printf ("%08" BFD_VMA_FMT "x ",
6414 (bfd_vma) BYTE_GET (imrs [i].rela_offset));
6415 type = BYTE_GET (imrs [i].type);
6416 rtype = elf_ia64_reloc_type (type);
6417 if (rtype == NULL)
6418 printf ("0x%08x ", type);
6419 else
6420 printf ("%-31s ", rtype);
6421 print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
6422 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
6423 printf ("%08" BFD_VMA_FMT "x\n",
6424 (bfd_vma) BYTE_GET (imrs [i].sym_offset));
6425 }
6426
6427 free (imrs);
6428}
6429
6430/* Display IA-64 OpenVMS dynamic relocations and fixups. */
6431
6432static int
6433process_ia64_vms_dynamic_relocs (FILE *file)
6434{
6435 struct ia64_vms_dynfixup fixup;
6436 struct ia64_vms_dynimgrela imgrela;
6437 Elf_Internal_Dyn *entry;
6438 int res = 0;
6439 bfd_vma strtab_off = 0;
6440 bfd_vma strtab_sz = 0;
6441 char *strtab = NULL;
6442
6443 memset (&fixup, 0, sizeof (fixup));
6444 memset (&imgrela, 0, sizeof (imgrela));
6445
6446 /* Note: the order of the entries is specified by the OpenVMS specs. */
6447 for (entry = dynamic_section;
6448 entry < dynamic_section + dynamic_nent;
6449 entry++)
6450 {
6451 switch (entry->d_tag)
6452 {
6453 case DT_IA_64_VMS_STRTAB_OFFSET:
6454 strtab_off = entry->d_un.d_val;
6455 break;
6456 case DT_STRSZ:
6457 strtab_sz = entry->d_un.d_val;
6458 if (strtab == NULL)
6459 strtab = get_data (NULL, file, dynamic_addr + strtab_off,
6460 1, strtab_sz, _("dynamic string section"));
6461 break;
6462
6463 case DT_IA_64_VMS_NEEDED_IDENT:
6464 fixup.needed_ident = entry->d_un.d_val;
6465 break;
6466 case DT_NEEDED:
6467 fixup.needed = entry->d_un.d_val;
6468 break;
6469 case DT_IA_64_VMS_FIXUP_NEEDED:
6470 fixup.fixup_needed = entry->d_un.d_val;
6471 break;
6472 case DT_IA_64_VMS_FIXUP_RELA_CNT:
6473 fixup.fixup_rela_cnt = entry->d_un.d_val;
6474 break;
6475 case DT_IA_64_VMS_FIXUP_RELA_OFF:
6476 fixup.fixup_rela_off = entry->d_un.d_val;
6477 res++;
6478 dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
6479 break;
6480
6481 case DT_IA_64_VMS_IMG_RELA_CNT:
6482 imgrela.img_rela_cnt = entry->d_un.d_val;
6483 break;
6484 case DT_IA_64_VMS_IMG_RELA_OFF:
6485 imgrela.img_rela_off = entry->d_un.d_val;
6486 res++;
6487 dump_ia64_vms_dynamic_relocs (file, &imgrela);
6488 break;
6489
6490 default:
6491 break;
6492 }
6493 }
6494
6495 if (strtab != NULL)
6496 free (strtab);
6497
6498 return res;
6499}
6500
85b1c36d 6501static struct
566b0d53 6502{
2cf0635d 6503 const char * name;
566b0d53
L
6504 int reloc;
6505 int size;
6506 int rela;
6507} dynamic_relocations [] =
6508{
6509 { "REL", DT_REL, DT_RELSZ, FALSE },
6510 { "RELA", DT_RELA, DT_RELASZ, TRUE },
6511 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
6512};
6513
252b5132 6514/* Process the reloc section. */
18bd398b 6515
252b5132 6516static int
2cf0635d 6517process_relocs (FILE * file)
252b5132 6518{
b34976b6
AM
6519 unsigned long rel_size;
6520 unsigned long rel_offset;
252b5132
RH
6521
6522
6523 if (!do_reloc)
6524 return 1;
6525
6526 if (do_using_dynamic)
6527 {
566b0d53 6528 int is_rela;
2cf0635d 6529 const char * name;
566b0d53
L
6530 int has_dynamic_reloc;
6531 unsigned int i;
0de14b54 6532
566b0d53 6533 has_dynamic_reloc = 0;
252b5132 6534
566b0d53 6535 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
252b5132 6536 {
566b0d53
L
6537 is_rela = dynamic_relocations [i].rela;
6538 name = dynamic_relocations [i].name;
6539 rel_size = dynamic_info [dynamic_relocations [i].size];
6540 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
103f02d3 6541
566b0d53
L
6542 has_dynamic_reloc |= rel_size;
6543
6544 if (is_rela == UNKNOWN)
aa903cfb 6545 {
566b0d53
L
6546 if (dynamic_relocations [i].reloc == DT_JMPREL)
6547 switch (dynamic_info[DT_PLTREL])
6548 {
6549 case DT_REL:
6550 is_rela = FALSE;
6551 break;
6552 case DT_RELA:
6553 is_rela = TRUE;
6554 break;
6555 }
aa903cfb 6556 }
252b5132 6557
566b0d53
L
6558 if (rel_size)
6559 {
6560 printf
6561 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
6562 name, rel_offset, rel_size);
252b5132 6563
d93f0186
NC
6564 dump_relocations (file,
6565 offset_from_vma (file, rel_offset, rel_size),
6566 rel_size,
566b0d53 6567 dynamic_symbols, num_dynamic_syms,
bb4d2ac2
L
6568 dynamic_strings, dynamic_strings_length,
6569 is_rela, 1);
566b0d53 6570 }
252b5132 6571 }
566b0d53 6572
28f997cf
TG
6573 if (is_ia64_vms ())
6574 has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
6575
566b0d53 6576 if (! has_dynamic_reloc)
252b5132
RH
6577 printf (_("\nThere are no dynamic relocations in this file.\n"));
6578 }
6579 else
6580 {
2cf0635d 6581 Elf_Internal_Shdr * section;
b34976b6
AM
6582 unsigned long i;
6583 int found = 0;
252b5132
RH
6584
6585 for (i = 0, section = section_headers;
6586 i < elf_header.e_shnum;
b34976b6 6587 i++, section++)
252b5132
RH
6588 {
6589 if ( section->sh_type != SHT_RELA
6590 && section->sh_type != SHT_REL)
6591 continue;
6592
6593 rel_offset = section->sh_offset;
6594 rel_size = section->sh_size;
6595
6596 if (rel_size)
6597 {
2cf0635d 6598 Elf_Internal_Shdr * strsec;
b34976b6 6599 int is_rela;
103f02d3 6600
252b5132
RH
6601 printf (_("\nRelocation section "));
6602
6603 if (string_table == NULL)
19936277 6604 printf ("%d", section->sh_name);
252b5132 6605 else
74e1a04b 6606 printf ("'%s'", printable_section_name (section));
252b5132
RH
6607
6608 printf (_(" at offset 0x%lx contains %lu entries:\n"),
6609 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
6610
d79b3d50
NC
6611 is_rela = section->sh_type == SHT_RELA;
6612
4fbb74a6
AM
6613 if (section->sh_link != 0
6614 && section->sh_link < elf_header.e_shnum)
af3fc3bc 6615 {
2cf0635d
NC
6616 Elf_Internal_Shdr * symsec;
6617 Elf_Internal_Sym * symtab;
d79b3d50 6618 unsigned long nsyms;
c256ffe7 6619 unsigned long strtablen = 0;
2cf0635d 6620 char * strtab = NULL;
57346661 6621
4fbb74a6 6622 symsec = section_headers + section->sh_link;
08d8fa11
JJ
6623 if (symsec->sh_type != SHT_SYMTAB
6624 && symsec->sh_type != SHT_DYNSYM)
6625 continue;
6626
ba5cdace 6627 symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms);
252b5132 6628
af3fc3bc
AM
6629 if (symtab == NULL)
6630 continue;
252b5132 6631
4fbb74a6
AM
6632 if (symsec->sh_link != 0
6633 && symsec->sh_link < elf_header.e_shnum)
c256ffe7 6634 {
4fbb74a6 6635 strsec = section_headers + symsec->sh_link;
103f02d3 6636
3f5e193b 6637 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
071436c6
NC
6638 1, strsec->sh_size,
6639 _("string table"));
c256ffe7
JJ
6640 strtablen = strtab == NULL ? 0 : strsec->sh_size;
6641 }
252b5132 6642
d79b3d50 6643 dump_relocations (file, rel_offset, rel_size,
bb4d2ac2
L
6644 symtab, nsyms, strtab, strtablen,
6645 is_rela,
6646 symsec->sh_type == SHT_DYNSYM);
d79b3d50
NC
6647 if (strtab)
6648 free (strtab);
6649 free (symtab);
6650 }
6651 else
6652 dump_relocations (file, rel_offset, rel_size,
bb4d2ac2 6653 NULL, 0, NULL, 0, is_rela, 0);
252b5132
RH
6654
6655 found = 1;
6656 }
6657 }
6658
6659 if (! found)
6660 printf (_("\nThere are no relocations in this file.\n"));
6661 }
6662
6663 return 1;
6664}
6665
4d6ed7c8
NC
6666/* An absolute address consists of a section and an offset. If the
6667 section is NULL, the offset itself is the address, otherwise, the
6668 address equals to LOAD_ADDRESS(section) + offset. */
6669
6670struct absaddr
948f632f
DA
6671{
6672 unsigned short section;
6673 bfd_vma offset;
6674};
4d6ed7c8 6675
1949de15
L
6676#define ABSADDR(a) \
6677 ((a).section \
6678 ? section_headers [(a).section].sh_addr + (a).offset \
6679 : (a).offset)
6680
948f632f
DA
6681/* Find the nearest symbol at or below ADDR. Returns the symbol
6682 name, if found, and the offset from the symbol to ADDR. */
4d6ed7c8 6683
4d6ed7c8 6684static void
2cf0635d 6685find_symbol_for_address (Elf_Internal_Sym * symtab,
948f632f
DA
6686 unsigned long nsyms,
6687 const char * strtab,
6688 unsigned long strtab_size,
6689 struct absaddr addr,
6690 const char ** symname,
6691 bfd_vma * offset)
4d6ed7c8 6692{
d3ba0551 6693 bfd_vma dist = 0x100000;
2cf0635d 6694 Elf_Internal_Sym * sym;
948f632f
DA
6695 Elf_Internal_Sym * beg;
6696 Elf_Internal_Sym * end;
2cf0635d 6697 Elf_Internal_Sym * best = NULL;
4d6ed7c8 6698
0b6ae522 6699 REMOVE_ARCH_BITS (addr.offset);
948f632f
DA
6700 beg = symtab;
6701 end = symtab + nsyms;
0b6ae522 6702
948f632f 6703 while (beg < end)
4d6ed7c8 6704 {
948f632f
DA
6705 bfd_vma value;
6706
6707 sym = beg + (end - beg) / 2;
0b6ae522 6708
948f632f 6709 value = sym->st_value;
0b6ae522
DJ
6710 REMOVE_ARCH_BITS (value);
6711
948f632f 6712 if (sym->st_name != 0
4d6ed7c8 6713 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
0b6ae522
DJ
6714 && addr.offset >= value
6715 && addr.offset - value < dist)
4d6ed7c8
NC
6716 {
6717 best = sym;
0b6ae522 6718 dist = addr.offset - value;
4d6ed7c8
NC
6719 if (!dist)
6720 break;
6721 }
948f632f
DA
6722
6723 if (addr.offset < value)
6724 end = sym;
6725 else
6726 beg = sym + 1;
4d6ed7c8 6727 }
1b31d05e 6728
4d6ed7c8
NC
6729 if (best)
6730 {
57346661 6731 *symname = (best->st_name >= strtab_size
2b692964 6732 ? _("<corrupt>") : strtab + best->st_name);
4d6ed7c8
NC
6733 *offset = dist;
6734 return;
6735 }
1b31d05e 6736
4d6ed7c8
NC
6737 *symname = NULL;
6738 *offset = addr.offset;
6739}
6740
948f632f
DA
6741static int
6742symcmp (const void *p, const void *q)
6743{
6744 Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
6745 Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
6746
6747 return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
6748}
6749
6750/* Process the unwind section. */
6751
6752#include "unwind-ia64.h"
6753
6754struct ia64_unw_table_entry
6755{
6756 struct absaddr start;
6757 struct absaddr end;
6758 struct absaddr info;
6759};
6760
6761struct ia64_unw_aux_info
6762{
6763 struct ia64_unw_table_entry *table; /* Unwind table. */
6764 unsigned long table_len; /* Length of unwind table. */
6765 unsigned char * info; /* Unwind info. */
6766 unsigned long info_size; /* Size of unwind info. */
6767 bfd_vma info_addr; /* Starting address of unwind info. */
6768 bfd_vma seg_base; /* Starting address of segment. */
6769 Elf_Internal_Sym * symtab; /* The symbol table. */
6770 unsigned long nsyms; /* Number of symbols. */
6771 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
6772 unsigned long nfuns; /* Number of entries in funtab. */
6773 char * strtab; /* The string table. */
6774 unsigned long strtab_size; /* Size of string table. */
6775};
6776
4d6ed7c8 6777static void
2cf0635d 6778dump_ia64_unwind (struct ia64_unw_aux_info * aux)
4d6ed7c8 6779{
2cf0635d 6780 struct ia64_unw_table_entry * tp;
948f632f 6781 unsigned long j, nfuns;
4d6ed7c8 6782 int in_body;
7036c0e1 6783
948f632f
DA
6784 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
6785 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
6786 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
6787 aux->funtab[nfuns++] = aux->symtab[j];
6788 aux->nfuns = nfuns;
6789 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
6790
4d6ed7c8
NC
6791 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
6792 {
6793 bfd_vma stamp;
6794 bfd_vma offset;
2cf0635d
NC
6795 const unsigned char * dp;
6796 const unsigned char * head;
53774b7e 6797 const unsigned char * end;
2cf0635d 6798 const char * procname;
4d6ed7c8 6799
948f632f 6800 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
57346661 6801 aux->strtab_size, tp->start, &procname, &offset);
4d6ed7c8
NC
6802
6803 fputs ("\n<", stdout);
6804
6805 if (procname)
6806 {
6807 fputs (procname, stdout);
6808
6809 if (offset)
6810 printf ("+%lx", (unsigned long) offset);
6811 }
6812
6813 fputs (">: [", stdout);
6814 print_vma (tp->start.offset, PREFIX_HEX);
6815 fputc ('-', stdout);
6816 print_vma (tp->end.offset, PREFIX_HEX);
86f55779 6817 printf ("], info at +0x%lx\n",
4d6ed7c8
NC
6818 (unsigned long) (tp->info.offset - aux->seg_base));
6819
53774b7e
NC
6820 /* PR 17531: file: 86232b32. */
6821 if (aux->info == NULL)
6822 continue;
6823
6824 /* PR 17531: file: 0997b4d1. */
6825 if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
6826 {
6827 warn (_("Invalid offset %lx in table entry %ld\n"),
6828 (long) tp->info.offset, (long) (tp - aux->table));
6829 continue;
6830 }
6831
1949de15 6832 head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
a4a00738 6833 stamp = byte_get ((unsigned char *) head, sizeof (stamp));
4d6ed7c8 6834
86f55779 6835 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4d6ed7c8
NC
6836 (unsigned) UNW_VER (stamp),
6837 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
6838 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
6839 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
89fac5e3 6840 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
4d6ed7c8
NC
6841
6842 if (UNW_VER (stamp) != 1)
6843 {
2b692964 6844 printf (_("\tUnknown version.\n"));
4d6ed7c8
NC
6845 continue;
6846 }
6847
6848 in_body = 0;
53774b7e
NC
6849 end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
6850 /* PR 17531: file: 16ceda89. */
6851 if (end > aux->info + aux->info_size)
6852 end = aux->info + aux->info_size;
6853 for (dp = head + 8; dp < end;)
b4477bc8 6854 dp = unw_decode (dp, in_body, & in_body, end);
4d6ed7c8 6855 }
948f632f
DA
6856
6857 free (aux->funtab);
4d6ed7c8
NC
6858}
6859
53774b7e 6860static bfd_boolean
2cf0635d
NC
6861slurp_ia64_unwind_table (FILE * file,
6862 struct ia64_unw_aux_info * aux,
6863 Elf_Internal_Shdr * sec)
4d6ed7c8 6864{
89fac5e3 6865 unsigned long size, nrelas, i;
2cf0635d
NC
6866 Elf_Internal_Phdr * seg;
6867 struct ia64_unw_table_entry * tep;
6868 Elf_Internal_Shdr * relsec;
6869 Elf_Internal_Rela * rela;
6870 Elf_Internal_Rela * rp;
6871 unsigned char * table;
6872 unsigned char * tp;
6873 Elf_Internal_Sym * sym;
6874 const char * relname;
4d6ed7c8 6875
53774b7e
NC
6876 aux->table_len = 0;
6877
4d6ed7c8
NC
6878 /* First, find the starting address of the segment that includes
6879 this section: */
6880
6881 if (elf_header.e_phnum)
6882 {
d93f0186 6883 if (! get_program_headers (file))
53774b7e 6884 return FALSE;
4d6ed7c8 6885
d93f0186
NC
6886 for (seg = program_headers;
6887 seg < program_headers + elf_header.e_phnum;
6888 ++seg)
4d6ed7c8
NC
6889 {
6890 if (seg->p_type != PT_LOAD)
6891 continue;
6892
6893 if (sec->sh_addr >= seg->p_vaddr
6894 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
6895 {
6896 aux->seg_base = seg->p_vaddr;
6897 break;
6898 }
6899 }
4d6ed7c8
NC
6900 }
6901
6902 /* Second, build the unwind table from the contents of the unwind section: */
6903 size = sec->sh_size;
3f5e193b
NC
6904 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
6905 _("unwind table"));
a6e9f9df 6906 if (!table)
53774b7e 6907 return FALSE;
4d6ed7c8 6908
53774b7e 6909 aux->table_len = size / (3 * eh_addr_size);
3f5e193b 6910 aux->table = (struct ia64_unw_table_entry *)
53774b7e 6911 xcmalloc (aux->table_len, sizeof (aux->table[0]));
89fac5e3 6912 tep = aux->table;
53774b7e
NC
6913
6914 for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
4d6ed7c8
NC
6915 {
6916 tep->start.section = SHN_UNDEF;
6917 tep->end.section = SHN_UNDEF;
6918 tep->info.section = SHN_UNDEF;
c6a0c689
AM
6919 tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6920 tep->end.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6921 tep->info.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
4d6ed7c8
NC
6922 tep->start.offset += aux->seg_base;
6923 tep->end.offset += aux->seg_base;
6924 tep->info.offset += aux->seg_base;
6925 }
6926 free (table);
6927
41e92641 6928 /* Third, apply any relocations to the unwind table: */
4d6ed7c8
NC
6929 for (relsec = section_headers;
6930 relsec < section_headers + elf_header.e_shnum;
6931 ++relsec)
6932 {
6933 if (relsec->sh_type != SHT_RELA
4fbb74a6
AM
6934 || relsec->sh_info >= elf_header.e_shnum
6935 || section_headers + relsec->sh_info != sec)
4d6ed7c8
NC
6936 continue;
6937
6938 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
6939 & rela, & nrelas))
53774b7e
NC
6940 {
6941 free (aux->table);
6942 aux->table = NULL;
6943 aux->table_len = 0;
6944 return FALSE;
6945 }
4d6ed7c8
NC
6946
6947 for (rp = rela; rp < rela + nrelas; ++rp)
6948 {
aca88567
NC
6949 relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
6950 sym = aux->symtab + get_reloc_symindex (rp->r_info);
4d6ed7c8 6951
82b1b41b
NC
6952 /* PR 17531: file: 9fa67536. */
6953 if (relname == NULL)
6954 {
6955 warn (_("Skipping unknown relocation type: %u\n"), get_reloc_type (rp->r_info));
6956 continue;
6957 }
948f632f 6958
0112cd26 6959 if (! const_strneq (relname, "R_IA64_SEGREL"))
4d6ed7c8 6960 {
82b1b41b 6961 warn (_("Skipping unexpected relocation type: %s\n"), relname);
4d6ed7c8
NC
6962 continue;
6963 }
6964
89fac5e3 6965 i = rp->r_offset / (3 * eh_addr_size);
4d6ed7c8 6966
53774b7e
NC
6967 /* PR 17531: file: 5bc8d9bf. */
6968 if (i >= aux->table_len)
6969 {
6970 warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
6971 continue;
6972 }
6973
6974 switch (rp->r_offset / eh_addr_size % 3)
4d6ed7c8
NC
6975 {
6976 case 0:
6977 aux->table[i].start.section = sym->st_shndx;
e466bc6e 6978 aux->table[i].start.offset = rp->r_addend + sym->st_value;
4d6ed7c8
NC
6979 break;
6980 case 1:
6981 aux->table[i].end.section = sym->st_shndx;
e466bc6e 6982 aux->table[i].end.offset = rp->r_addend + sym->st_value;
4d6ed7c8
NC
6983 break;
6984 case 2:
6985 aux->table[i].info.section = sym->st_shndx;
e466bc6e 6986 aux->table[i].info.offset = rp->r_addend + sym->st_value;
4d6ed7c8
NC
6987 break;
6988 default:
6989 break;
6990 }
6991 }
6992
6993 free (rela);
6994 }
6995
53774b7e 6996 return TRUE;
4d6ed7c8
NC
6997}
6998
1b31d05e 6999static void
2cf0635d 7000ia64_process_unwind (FILE * file)
4d6ed7c8 7001{
2cf0635d
NC
7002 Elf_Internal_Shdr * sec;
7003 Elf_Internal_Shdr * unwsec = NULL;
7004 Elf_Internal_Shdr * strsec;
89fac5e3 7005 unsigned long i, unwcount = 0, unwstart = 0;
57346661 7006 struct ia64_unw_aux_info aux;
f1467e33 7007
4d6ed7c8
NC
7008 memset (& aux, 0, sizeof (aux));
7009
4d6ed7c8
NC
7010 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7011 {
c256ffe7 7012 if (sec->sh_type == SHT_SYMTAB
4fbb74a6 7013 && sec->sh_link < elf_header.e_shnum)
4d6ed7c8 7014 {
ba5cdace 7015 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
4d6ed7c8 7016
4fbb74a6 7017 strsec = section_headers + sec->sh_link;
4082ef84
NC
7018 if (aux.strtab != NULL)
7019 {
7020 error (_("Multiple auxillary string tables encountered\n"));
7021 free (aux.strtab);
7022 }
3f5e193b
NC
7023 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7024 1, strsec->sh_size,
7025 _("string table"));
c256ffe7 7026 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
4d6ed7c8
NC
7027 }
7028 else if (sec->sh_type == SHT_IA_64_UNWIND)
579f31ac
JJ
7029 unwcount++;
7030 }
7031
7032 if (!unwcount)
7033 printf (_("\nThere are no unwind sections in this file.\n"));
7034
7035 while (unwcount-- > 0)
7036 {
2cf0635d 7037 char * suffix;
579f31ac
JJ
7038 size_t len, len2;
7039
4082ef84 7040 for (i = unwstart, sec = section_headers + unwstart, unwsec = NULL;
579f31ac
JJ
7041 i < elf_header.e_shnum; ++i, ++sec)
7042 if (sec->sh_type == SHT_IA_64_UNWIND)
7043 {
7044 unwsec = sec;
7045 break;
7046 }
4082ef84
NC
7047 /* We have already counted the number of SHT_IA64_UNWIND
7048 sections so the loop above should never fail. */
7049 assert (unwsec != NULL);
579f31ac
JJ
7050
7051 unwstart = i + 1;
7052 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
7053
e4b17d5c
L
7054 if ((unwsec->sh_flags & SHF_GROUP) != 0)
7055 {
7056 /* We need to find which section group it is in. */
4082ef84 7057 struct group_list * g;
e4b17d5c 7058
4082ef84
NC
7059 if (section_headers_groups == NULL
7060 || section_headers_groups [i] == NULL)
7061 i = elf_header.e_shnum;
7062 else
e4b17d5c 7063 {
4082ef84 7064 g = section_headers_groups [i]->root;
18bd398b 7065
4082ef84
NC
7066 for (; g != NULL; g = g->next)
7067 {
7068 sec = section_headers + g->section_index;
e4b17d5c 7069
4082ef84
NC
7070 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
7071 break;
7072 }
7073
7074 if (g == NULL)
7075 i = elf_header.e_shnum;
7076 }
e4b17d5c 7077 }
18bd398b 7078 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
579f31ac 7079 {
18bd398b 7080 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
579f31ac
JJ
7081 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
7082 suffix = SECTION_NAME (unwsec) + len;
7083 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7084 ++i, ++sec)
18bd398b
NC
7085 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
7086 && streq (SECTION_NAME (sec) + len2, suffix))
579f31ac
JJ
7087 break;
7088 }
7089 else
7090 {
7091 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
18bd398b 7092 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
579f31ac
JJ
7093 len = sizeof (ELF_STRING_ia64_unwind) - 1;
7094 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
7095 suffix = "";
18bd398b 7096 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
579f31ac
JJ
7097 suffix = SECTION_NAME (unwsec) + len;
7098 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7099 ++i, ++sec)
18bd398b
NC
7100 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
7101 && streq (SECTION_NAME (sec) + len2, suffix))
579f31ac
JJ
7102 break;
7103 }
7104
7105 if (i == elf_header.e_shnum)
7106 {
7107 printf (_("\nCould not find unwind info section for "));
7108
7109 if (string_table == NULL)
7110 printf ("%d", unwsec->sh_name);
7111 else
74e1a04b 7112 printf ("'%s'", printable_section_name (unwsec));
579f31ac
JJ
7113 }
7114 else
4d6ed7c8 7115 {
4d6ed7c8 7116 aux.info_addr = sec->sh_addr;
3f5e193b 7117 aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
4082ef84
NC
7118 sec->sh_size,
7119 _("unwind info"));
59245841 7120 aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
4d6ed7c8 7121
579f31ac 7122 printf (_("\nUnwind section "));
4d6ed7c8 7123
579f31ac
JJ
7124 if (string_table == NULL)
7125 printf ("%d", unwsec->sh_name);
7126 else
74e1a04b 7127 printf ("'%s'", printable_section_name (unwsec));
4d6ed7c8 7128
579f31ac 7129 printf (_(" at offset 0x%lx contains %lu entries:\n"),
e59b4dfb 7130 (unsigned long) unwsec->sh_offset,
89fac5e3 7131 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
4d6ed7c8 7132
53774b7e
NC
7133 if (slurp_ia64_unwind_table (file, & aux, unwsec)
7134 && aux.table_len > 0)
579f31ac
JJ
7135 dump_ia64_unwind (& aux);
7136
7137 if (aux.table)
7138 free ((char *) aux.table);
7139 if (aux.info)
7140 free ((char *) aux.info);
7141 aux.table = NULL;
7142 aux.info = NULL;
7143 }
4d6ed7c8 7144 }
4d6ed7c8 7145
4d6ed7c8
NC
7146 if (aux.symtab)
7147 free (aux.symtab);
7148 if (aux.strtab)
7149 free ((char *) aux.strtab);
4d6ed7c8
NC
7150}
7151
3f5e193b
NC
7152struct hppa_unw_table_entry
7153 {
7154 struct absaddr start;
7155 struct absaddr end;
948f632f 7156 unsigned int Cannot_unwind:1; /* 0 */
3f5e193b
NC
7157 unsigned int Millicode:1; /* 1 */
7158 unsigned int Millicode_save_sr0:1; /* 2 */
7159 unsigned int Region_description:2; /* 3..4 */
7160 unsigned int reserved1:1; /* 5 */
7161 unsigned int Entry_SR:1; /* 6 */
7162 unsigned int Entry_FR:4; /* number saved */ /* 7..10 */
7163 unsigned int Entry_GR:5; /* number saved */ /* 11..15 */
7164 unsigned int Args_stored:1; /* 16 */
948f632f
DA
7165 unsigned int Variable_Frame:1; /* 17 */
7166 unsigned int Separate_Package_Body:1; /* 18 */
3f5e193b 7167 unsigned int Frame_Extension_Millicode:1; /* 19 */
948f632f
DA
7168 unsigned int Stack_Overflow_Check:1; /* 20 */
7169 unsigned int Two_Instruction_SP_Increment:1;/* 21 */
3f5e193b
NC
7170 unsigned int Ada_Region:1; /* 22 */
7171 unsigned int cxx_info:1; /* 23 */
948f632f
DA
7172 unsigned int cxx_try_catch:1; /* 24 */
7173 unsigned int sched_entry_seq:1; /* 25 */
3f5e193b 7174 unsigned int reserved2:1; /* 26 */
948f632f
DA
7175 unsigned int Save_SP:1; /* 27 */
7176 unsigned int Save_RP:1; /* 28 */
3f5e193b
NC
7177 unsigned int Save_MRP_in_frame:1; /* 29 */
7178 unsigned int extn_ptr_defined:1; /* 30 */
948f632f 7179 unsigned int Cleanup_defined:1; /* 31 */
3f5e193b 7180
948f632f
DA
7181 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
7182 unsigned int HP_UX_interrupt_marker:1; /* 1 */
3f5e193b 7183 unsigned int Large_frame:1; /* 2 */
948f632f 7184 unsigned int Pseudo_SP_Set:1; /* 3 */
3f5e193b
NC
7185 unsigned int reserved4:1; /* 4 */
7186 unsigned int Total_frame_size:27; /* 5..31 */
7187 };
7188
57346661 7189struct hppa_unw_aux_info
948f632f
DA
7190{
7191 struct hppa_unw_table_entry * table; /* Unwind table. */
7192 unsigned long table_len; /* Length of unwind table. */
7193 bfd_vma seg_base; /* Starting address of segment. */
7194 Elf_Internal_Sym * symtab; /* The symbol table. */
7195 unsigned long nsyms; /* Number of symbols. */
7196 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7197 unsigned long nfuns; /* Number of entries in funtab. */
7198 char * strtab; /* The string table. */
7199 unsigned long strtab_size; /* Size of string table. */
7200};
57346661
AM
7201
7202static void
2cf0635d 7203dump_hppa_unwind (struct hppa_unw_aux_info * aux)
57346661 7204{
2cf0635d 7205 struct hppa_unw_table_entry * tp;
948f632f
DA
7206 unsigned long j, nfuns;
7207
7208 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7209 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7210 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7211 aux->funtab[nfuns++] = aux->symtab[j];
7212 aux->nfuns = nfuns;
7213 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
57346661 7214
57346661
AM
7215 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7216 {
7217 bfd_vma offset;
2cf0635d 7218 const char * procname;
57346661 7219
948f632f 7220 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
57346661
AM
7221 aux->strtab_size, tp->start, &procname,
7222 &offset);
7223
7224 fputs ("\n<", stdout);
7225
7226 if (procname)
7227 {
7228 fputs (procname, stdout);
7229
7230 if (offset)
7231 printf ("+%lx", (unsigned long) offset);
7232 }
7233
7234 fputs (">: [", stdout);
7235 print_vma (tp->start.offset, PREFIX_HEX);
7236 fputc ('-', stdout);
7237 print_vma (tp->end.offset, PREFIX_HEX);
7238 printf ("]\n\t");
7239
18bd398b
NC
7240#define PF(_m) if (tp->_m) printf (#_m " ");
7241#define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
57346661
AM
7242 PF(Cannot_unwind);
7243 PF(Millicode);
7244 PF(Millicode_save_sr0);
18bd398b 7245 /* PV(Region_description); */
57346661
AM
7246 PF(Entry_SR);
7247 PV(Entry_FR);
7248 PV(Entry_GR);
7249 PF(Args_stored);
7250 PF(Variable_Frame);
7251 PF(Separate_Package_Body);
7252 PF(Frame_Extension_Millicode);
7253 PF(Stack_Overflow_Check);
7254 PF(Two_Instruction_SP_Increment);
7255 PF(Ada_Region);
7256 PF(cxx_info);
7257 PF(cxx_try_catch);
7258 PF(sched_entry_seq);
7259 PF(Save_SP);
7260 PF(Save_RP);
7261 PF(Save_MRP_in_frame);
7262 PF(extn_ptr_defined);
7263 PF(Cleanup_defined);
7264 PF(MPE_XL_interrupt_marker);
7265 PF(HP_UX_interrupt_marker);
7266 PF(Large_frame);
7267 PF(Pseudo_SP_Set);
7268 PV(Total_frame_size);
7269#undef PF
7270#undef PV
7271 }
7272
18bd398b 7273 printf ("\n");
948f632f
DA
7274
7275 free (aux->funtab);
57346661
AM
7276}
7277
7278static int
2cf0635d
NC
7279slurp_hppa_unwind_table (FILE * file,
7280 struct hppa_unw_aux_info * aux,
7281 Elf_Internal_Shdr * sec)
57346661 7282{
1c0751b2 7283 unsigned long size, unw_ent_size, nentries, nrelas, i;
2cf0635d
NC
7284 Elf_Internal_Phdr * seg;
7285 struct hppa_unw_table_entry * tep;
7286 Elf_Internal_Shdr * relsec;
7287 Elf_Internal_Rela * rela;
7288 Elf_Internal_Rela * rp;
7289 unsigned char * table;
7290 unsigned char * tp;
7291 Elf_Internal_Sym * sym;
7292 const char * relname;
57346661 7293
57346661
AM
7294 /* First, find the starting address of the segment that includes
7295 this section. */
7296
7297 if (elf_header.e_phnum)
7298 {
7299 if (! get_program_headers (file))
7300 return 0;
7301
7302 for (seg = program_headers;
7303 seg < program_headers + elf_header.e_phnum;
7304 ++seg)
7305 {
7306 if (seg->p_type != PT_LOAD)
7307 continue;
7308
7309 if (sec->sh_addr >= seg->p_vaddr
7310 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7311 {
7312 aux->seg_base = seg->p_vaddr;
7313 break;
7314 }
7315 }
7316 }
7317
7318 /* Second, build the unwind table from the contents of the unwind
7319 section. */
7320 size = sec->sh_size;
3f5e193b
NC
7321 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7322 _("unwind table"));
57346661
AM
7323 if (!table)
7324 return 0;
7325
1c0751b2
DA
7326 unw_ent_size = 16;
7327 nentries = size / unw_ent_size;
7328 size = unw_ent_size * nentries;
57346661 7329
3f5e193b
NC
7330 tep = aux->table = (struct hppa_unw_table_entry *)
7331 xcmalloc (nentries, sizeof (aux->table[0]));
57346661 7332
1c0751b2 7333 for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
57346661
AM
7334 {
7335 unsigned int tmp1, tmp2;
7336
7337 tep->start.section = SHN_UNDEF;
7338 tep->end.section = SHN_UNDEF;
7339
1c0751b2
DA
7340 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
7341 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
7342 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
7343 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
7344
7345 tep->start.offset += aux->seg_base;
7346 tep->end.offset += aux->seg_base;
57346661
AM
7347
7348 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
7349 tep->Millicode = (tmp1 >> 30) & 0x1;
7350 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
7351 tep->Region_description = (tmp1 >> 27) & 0x3;
7352 tep->reserved1 = (tmp1 >> 26) & 0x1;
7353 tep->Entry_SR = (tmp1 >> 25) & 0x1;
7354 tep->Entry_FR = (tmp1 >> 21) & 0xf;
7355 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
7356 tep->Args_stored = (tmp1 >> 15) & 0x1;
7357 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
7358 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
7359 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
7360 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
7361 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
7362 tep->Ada_Region = (tmp1 >> 9) & 0x1;
7363 tep->cxx_info = (tmp1 >> 8) & 0x1;
7364 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
7365 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
7366 tep->reserved2 = (tmp1 >> 5) & 0x1;
7367 tep->Save_SP = (tmp1 >> 4) & 0x1;
7368 tep->Save_RP = (tmp1 >> 3) & 0x1;
7369 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
7370 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
7371 tep->Cleanup_defined = tmp1 & 0x1;
7372
7373 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
7374 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
7375 tep->Large_frame = (tmp2 >> 29) & 0x1;
7376 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
7377 tep->reserved4 = (tmp2 >> 27) & 0x1;
7378 tep->Total_frame_size = tmp2 & 0x7ffffff;
57346661
AM
7379 }
7380 free (table);
7381
7382 /* Third, apply any relocations to the unwind table. */
57346661
AM
7383 for (relsec = section_headers;
7384 relsec < section_headers + elf_header.e_shnum;
7385 ++relsec)
7386 {
7387 if (relsec->sh_type != SHT_RELA
4fbb74a6
AM
7388 || relsec->sh_info >= elf_header.e_shnum
7389 || section_headers + relsec->sh_info != sec)
57346661
AM
7390 continue;
7391
7392 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7393 & rela, & nrelas))
7394 return 0;
7395
7396 for (rp = rela; rp < rela + nrelas; ++rp)
7397 {
aca88567
NC
7398 relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
7399 sym = aux->symtab + get_reloc_symindex (rp->r_info);
57346661
AM
7400
7401 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
0112cd26 7402 if (! const_strneq (relname, "R_PARISC_SEGREL"))
57346661
AM
7403 {
7404 warn (_("Skipping unexpected relocation type %s\n"), relname);
7405 continue;
7406 }
7407
7408 i = rp->r_offset / unw_ent_size;
7409
89fac5e3 7410 switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
57346661
AM
7411 {
7412 case 0:
7413 aux->table[i].start.section = sym->st_shndx;
1e456d54 7414 aux->table[i].start.offset = sym->st_value + rp->r_addend;
57346661
AM
7415 break;
7416 case 1:
7417 aux->table[i].end.section = sym->st_shndx;
1e456d54 7418 aux->table[i].end.offset = sym->st_value + rp->r_addend;
57346661
AM
7419 break;
7420 default:
7421 break;
7422 }
7423 }
7424
7425 free (rela);
7426 }
7427
1c0751b2 7428 aux->table_len = nentries;
57346661
AM
7429
7430 return 1;
7431}
7432
1b31d05e 7433static void
2cf0635d 7434hppa_process_unwind (FILE * file)
57346661 7435{
57346661 7436 struct hppa_unw_aux_info aux;
2cf0635d
NC
7437 Elf_Internal_Shdr * unwsec = NULL;
7438 Elf_Internal_Shdr * strsec;
7439 Elf_Internal_Shdr * sec;
18bd398b 7440 unsigned long i;
57346661 7441
c256ffe7 7442 if (string_table == NULL)
1b31d05e
NC
7443 return;
7444
7445 memset (& aux, 0, sizeof (aux));
57346661
AM
7446
7447 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7448 {
c256ffe7 7449 if (sec->sh_type == SHT_SYMTAB
4fbb74a6 7450 && sec->sh_link < elf_header.e_shnum)
57346661 7451 {
ba5cdace 7452 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
57346661 7453
4fbb74a6 7454 strsec = section_headers + sec->sh_link;
4082ef84
NC
7455 if (aux.strtab != NULL)
7456 {
7457 error (_("Multiple auxillary string tables encountered\n"));
7458 free (aux.strtab);
7459 }
3f5e193b
NC
7460 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7461 1, strsec->sh_size,
7462 _("string table"));
c256ffe7 7463 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
57346661 7464 }
18bd398b 7465 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
57346661
AM
7466 unwsec = sec;
7467 }
7468
7469 if (!unwsec)
7470 printf (_("\nThere are no unwind sections in this file.\n"));
7471
7472 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7473 {
18bd398b 7474 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
57346661 7475 {
74e1a04b
NC
7476 printf (_("\nUnwind section '%s' at offset 0x%lx contains %lu entries:\n"),
7477 printable_section_name (sec),
57346661 7478 (unsigned long) sec->sh_offset,
89fac5e3 7479 (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
57346661
AM
7480
7481 slurp_hppa_unwind_table (file, &aux, sec);
7482 if (aux.table_len > 0)
7483 dump_hppa_unwind (&aux);
7484
7485 if (aux.table)
7486 free ((char *) aux.table);
7487 aux.table = NULL;
7488 }
7489 }
7490
7491 if (aux.symtab)
7492 free (aux.symtab);
7493 if (aux.strtab)
7494 free ((char *) aux.strtab);
57346661
AM
7495}
7496
0b6ae522
DJ
7497struct arm_section
7498{
a734115a
NC
7499 unsigned char * data; /* The unwind data. */
7500 Elf_Internal_Shdr * sec; /* The cached unwind section header. */
7501 Elf_Internal_Rela * rela; /* The cached relocations for this section. */
7502 unsigned long nrelas; /* The number of relocations. */
7503 unsigned int rel_type; /* REL or RELA ? */
7504 Elf_Internal_Rela * next_rela; /* Cyclic pointer to the next reloc to process. */
0b6ae522
DJ
7505};
7506
7507struct arm_unw_aux_info
7508{
a734115a
NC
7509 FILE * file; /* The file containing the unwind sections. */
7510 Elf_Internal_Sym * symtab; /* The file's symbol table. */
7511 unsigned long nsyms; /* Number of symbols. */
948f632f
DA
7512 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7513 unsigned long nfuns; /* Number of these symbols. */
a734115a
NC
7514 char * strtab; /* The file's string table. */
7515 unsigned long strtab_size; /* Size of string table. */
0b6ae522
DJ
7516};
7517
7518static const char *
7519arm_print_vma_and_name (struct arm_unw_aux_info *aux,
7520 bfd_vma fn, struct absaddr addr)
7521{
7522 const char *procname;
7523 bfd_vma sym_offset;
7524
7525 if (addr.section == SHN_UNDEF)
7526 addr.offset = fn;
7527
948f632f 7528 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
0b6ae522
DJ
7529 aux->strtab_size, addr, &procname,
7530 &sym_offset);
7531
7532 print_vma (fn, PREFIX_HEX);
7533
7534 if (procname)
7535 {
7536 fputs (" <", stdout);
7537 fputs (procname, stdout);
7538
7539 if (sym_offset)
7540 printf ("+0x%lx", (unsigned long) sym_offset);
7541 fputc ('>', stdout);
7542 }
7543
7544 return procname;
7545}
7546
7547static void
7548arm_free_section (struct arm_section *arm_sec)
7549{
7550 if (arm_sec->data != NULL)
7551 free (arm_sec->data);
7552
7553 if (arm_sec->rela != NULL)
7554 free (arm_sec->rela);
7555}
7556
a734115a
NC
7557/* 1) If SEC does not match the one cached in ARM_SEC, then free the current
7558 cached section and install SEC instead.
7559 2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
7560 and return its valued in * WORDP, relocating if necessary.
1b31d05e 7561 3) Update the NEXT_RELA field in ARM_SEC and store the section index and
a734115a 7562 relocation's offset in ADDR.
1b31d05e
NC
7563 4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
7564 into the string table of the symbol associated with the reloc. If no
7565 reloc was applied store -1 there.
7566 5) Return TRUE upon success, FALSE otherwise. */
a734115a
NC
7567
7568static bfd_boolean
1b31d05e
NC
7569get_unwind_section_word (struct arm_unw_aux_info * aux,
7570 struct arm_section * arm_sec,
7571 Elf_Internal_Shdr * sec,
7572 bfd_vma word_offset,
7573 unsigned int * wordp,
7574 struct absaddr * addr,
7575 bfd_vma * sym_name)
0b6ae522
DJ
7576{
7577 Elf_Internal_Rela *rp;
7578 Elf_Internal_Sym *sym;
7579 const char * relname;
7580 unsigned int word;
7581 bfd_boolean wrapped;
7582
e0a31db1
NC
7583 if (sec == NULL || arm_sec == NULL)
7584 return FALSE;
7585
0b6ae522
DJ
7586 addr->section = SHN_UNDEF;
7587 addr->offset = 0;
7588
1b31d05e
NC
7589 if (sym_name != NULL)
7590 *sym_name = (bfd_vma) -1;
7591
a734115a 7592 /* If necessary, update the section cache. */
0b6ae522
DJ
7593 if (sec != arm_sec->sec)
7594 {
7595 Elf_Internal_Shdr *relsec;
7596
7597 arm_free_section (arm_sec);
7598
7599 arm_sec->sec = sec;
7600 arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
7601 sec->sh_size, _("unwind data"));
0b6ae522
DJ
7602 arm_sec->rela = NULL;
7603 arm_sec->nrelas = 0;
7604
7605 for (relsec = section_headers;
7606 relsec < section_headers + elf_header.e_shnum;
7607 ++relsec)
7608 {
7609 if (relsec->sh_info >= elf_header.e_shnum
1ae40aa4
NC
7610 || section_headers + relsec->sh_info != sec
7611 /* PR 15745: Check the section type as well. */
7612 || (relsec->sh_type != SHT_REL
7613 && relsec->sh_type != SHT_RELA))
0b6ae522
DJ
7614 continue;
7615
a734115a 7616 arm_sec->rel_type = relsec->sh_type;
0b6ae522
DJ
7617 if (relsec->sh_type == SHT_REL)
7618 {
7619 if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
7620 relsec->sh_size,
7621 & arm_sec->rela, & arm_sec->nrelas))
a734115a 7622 return FALSE;
0b6ae522 7623 }
1ae40aa4 7624 else /* relsec->sh_type == SHT_RELA */
0b6ae522
DJ
7625 {
7626 if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
7627 relsec->sh_size,
7628 & arm_sec->rela, & arm_sec->nrelas))
a734115a 7629 return FALSE;
0b6ae522 7630 }
1ae40aa4 7631 break;
0b6ae522
DJ
7632 }
7633
7634 arm_sec->next_rela = arm_sec->rela;
7635 }
7636
a734115a 7637 /* If there is no unwind data we can do nothing. */
0b6ae522 7638 if (arm_sec->data == NULL)
a734115a 7639 return FALSE;
0b6ae522 7640
e0a31db1 7641 /* If the offset is invalid then fail. */
1a915552
NC
7642 if (word_offset > (sec->sh_size - 4)
7643 /* PR 18879 */
7644 || (sec->sh_size < 5 && word_offset >= sec->sh_size)
7645 || ((bfd_signed_vma) word_offset) < 0)
e0a31db1
NC
7646 return FALSE;
7647
a734115a 7648 /* Get the word at the required offset. */
0b6ae522
DJ
7649 word = byte_get (arm_sec->data + word_offset, 4);
7650
0eff7165
NC
7651 /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128. */
7652 if (arm_sec->rela == NULL)
7653 {
7654 * wordp = word;
7655 return TRUE;
7656 }
7657
a734115a 7658 /* Look through the relocs to find the one that applies to the provided offset. */
0b6ae522
DJ
7659 wrapped = FALSE;
7660 for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
7661 {
7662 bfd_vma prelval, offset;
7663
7664 if (rp->r_offset > word_offset && !wrapped)
7665 {
7666 rp = arm_sec->rela;
7667 wrapped = TRUE;
7668 }
7669 if (rp->r_offset > word_offset)
7670 break;
7671
7672 if (rp->r_offset & 3)
7673 {
7674 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
7675 (unsigned long) rp->r_offset);
7676 continue;
7677 }
7678
7679 if (rp->r_offset < word_offset)
7680 continue;
7681
74e1a04b
NC
7682 /* PR 17531: file: 027-161405-0.004 */
7683 if (aux->symtab == NULL)
7684 continue;
7685
0b6ae522
DJ
7686 if (arm_sec->rel_type == SHT_REL)
7687 {
7688 offset = word & 0x7fffffff;
7689 if (offset & 0x40000000)
7690 offset |= ~ (bfd_vma) 0x7fffffff;
7691 }
a734115a 7692 else if (arm_sec->rel_type == SHT_RELA)
0b6ae522 7693 offset = rp->r_addend;
a734115a 7694 else
74e1a04b
NC
7695 {
7696 error (_("Unknown section relocation type %d encountered\n"),
7697 arm_sec->rel_type);
7698 break;
7699 }
0b6ae522 7700
071436c6
NC
7701 /* PR 17531 file: 027-1241568-0.004. */
7702 if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
7703 {
7704 error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
7705 (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
7706 break;
7707 }
7708
7709 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
0b6ae522
DJ
7710 offset += sym->st_value;
7711 prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
7712
a734115a
NC
7713 /* Check that we are processing the expected reloc type. */
7714 if (elf_header.e_machine == EM_ARM)
7715 {
7716 relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
071436c6
NC
7717 if (relname == NULL)
7718 {
7719 warn (_("Skipping unknown ARM relocation type: %d\n"),
7720 (int) ELF32_R_TYPE (rp->r_info));
7721 continue;
7722 }
a734115a
NC
7723
7724 if (streq (relname, "R_ARM_NONE"))
7725 continue;
0b4362b0 7726
a734115a
NC
7727 if (! streq (relname, "R_ARM_PREL31"))
7728 {
071436c6 7729 warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
a734115a
NC
7730 continue;
7731 }
7732 }
7733 else if (elf_header.e_machine == EM_TI_C6000)
7734 {
7735 relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
071436c6
NC
7736 if (relname == NULL)
7737 {
7738 warn (_("Skipping unknown C6000 relocation type: %d\n"),
7739 (int) ELF32_R_TYPE (rp->r_info));
7740 continue;
7741 }
0b4362b0 7742
a734115a
NC
7743 if (streq (relname, "R_C6000_NONE"))
7744 continue;
7745
7746 if (! streq (relname, "R_C6000_PREL31"))
7747 {
071436c6 7748 warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
a734115a
NC
7749 continue;
7750 }
7751
7752 prelval >>= 1;
7753 }
7754 else
74e1a04b
NC
7755 {
7756 /* This function currently only supports ARM and TI unwinders. */
7757 warn (_("Only TI and ARM unwinders are currently supported\n"));
7758 break;
7759 }
fa197c1c 7760
0b6ae522
DJ
7761 word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
7762 addr->section = sym->st_shndx;
7763 addr->offset = offset;
74e1a04b 7764
1b31d05e
NC
7765 if (sym_name)
7766 * sym_name = sym->st_name;
0b6ae522
DJ
7767 break;
7768 }
7769
7770 *wordp = word;
7771 arm_sec->next_rela = rp;
7772
a734115a 7773 return TRUE;
0b6ae522
DJ
7774}
7775
a734115a
NC
7776static const char *tic6x_unwind_regnames[16] =
7777{
0b4362b0
RM
7778 "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
7779 "A14", "A13", "A12", "A11", "A10",
a734115a
NC
7780 "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
7781};
fa197c1c 7782
0b6ae522 7783static void
fa197c1c 7784decode_tic6x_unwind_regmask (unsigned int mask)
0b6ae522 7785{
fa197c1c
PB
7786 int i;
7787
7788 for (i = 12; mask; mask >>= 1, i--)
7789 {
7790 if (mask & 1)
7791 {
7792 fputs (tic6x_unwind_regnames[i], stdout);
7793 if (mask > 1)
7794 fputs (", ", stdout);
7795 }
7796 }
7797}
0b6ae522
DJ
7798
7799#define ADVANCE \
7800 if (remaining == 0 && more_words) \
7801 { \
7802 data_offset += 4; \
1b31d05e
NC
7803 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, \
7804 data_offset, & word, & addr, NULL)) \
0b6ae522
DJ
7805 return; \
7806 remaining = 4; \
7807 more_words--; \
7808 } \
7809
7810#define GET_OP(OP) \
7811 ADVANCE; \
7812 if (remaining) \
7813 { \
7814 remaining--; \
7815 (OP) = word >> 24; \
7816 word <<= 8; \
7817 } \
7818 else \
7819 { \
2b692964 7820 printf (_("[Truncated opcode]\n")); \
0b6ae522
DJ
7821 return; \
7822 } \
cc5914eb 7823 printf ("0x%02x ", OP)
0b6ae522 7824
fa197c1c 7825static void
948f632f
DA
7826decode_arm_unwind_bytecode (struct arm_unw_aux_info * aux,
7827 unsigned int word,
7828 unsigned int remaining,
7829 unsigned int more_words,
7830 bfd_vma data_offset,
7831 Elf_Internal_Shdr * data_sec,
7832 struct arm_section * data_arm_sec)
fa197c1c
PB
7833{
7834 struct absaddr addr;
0b6ae522
DJ
7835
7836 /* Decode the unwinding instructions. */
7837 while (1)
7838 {
7839 unsigned int op, op2;
7840
7841 ADVANCE;
7842 if (remaining == 0)
7843 break;
7844 remaining--;
7845 op = word >> 24;
7846 word <<= 8;
7847
cc5914eb 7848 printf (" 0x%02x ", op);
0b6ae522
DJ
7849
7850 if ((op & 0xc0) == 0x00)
7851 {
7852 int offset = ((op & 0x3f) << 2) + 4;
61865e30 7853
cc5914eb 7854 printf (" vsp = vsp + %d", offset);
0b6ae522
DJ
7855 }
7856 else if ((op & 0xc0) == 0x40)
7857 {
7858 int offset = ((op & 0x3f) << 2) + 4;
61865e30 7859
cc5914eb 7860 printf (" vsp = vsp - %d", offset);
0b6ae522
DJ
7861 }
7862 else if ((op & 0xf0) == 0x80)
7863 {
7864 GET_OP (op2);
7865 if (op == 0x80 && op2 == 0)
7866 printf (_("Refuse to unwind"));
7867 else
7868 {
7869 unsigned int mask = ((op & 0x0f) << 8) | op2;
7870 int first = 1;
7871 int i;
2b692964 7872
0b6ae522
DJ
7873 printf ("pop {");
7874 for (i = 0; i < 12; i++)
7875 if (mask & (1 << i))
7876 {
7877 if (first)
7878 first = 0;
7879 else
7880 printf (", ");
7881 printf ("r%d", 4 + i);
7882 }
7883 printf ("}");
7884 }
7885 }
7886 else if ((op & 0xf0) == 0x90)
7887 {
7888 if (op == 0x9d || op == 0x9f)
7889 printf (_(" [Reserved]"));
7890 else
cc5914eb 7891 printf (" vsp = r%d", op & 0x0f);
0b6ae522
DJ
7892 }
7893 else if ((op & 0xf0) == 0xa0)
7894 {
7895 int end = 4 + (op & 0x07);
7896 int first = 1;
7897 int i;
61865e30 7898
0b6ae522
DJ
7899 printf (" pop {");
7900 for (i = 4; i <= end; i++)
7901 {
7902 if (first)
7903 first = 0;
7904 else
7905 printf (", ");
7906 printf ("r%d", i);
7907 }
7908 if (op & 0x08)
7909 {
1b31d05e 7910 if (!first)
0b6ae522
DJ
7911 printf (", ");
7912 printf ("r14");
7913 }
7914 printf ("}");
7915 }
7916 else if (op == 0xb0)
7917 printf (_(" finish"));
7918 else if (op == 0xb1)
7919 {
7920 GET_OP (op2);
7921 if (op2 == 0 || (op2 & 0xf0) != 0)
7922 printf (_("[Spare]"));
7923 else
7924 {
7925 unsigned int mask = op2 & 0x0f;
7926 int first = 1;
7927 int i;
61865e30 7928
0b6ae522
DJ
7929 printf ("pop {");
7930 for (i = 0; i < 12; i++)
7931 if (mask & (1 << i))
7932 {
7933 if (first)
7934 first = 0;
7935 else
7936 printf (", ");
7937 printf ("r%d", i);
7938 }
7939 printf ("}");
7940 }
7941 }
7942 else if (op == 0xb2)
7943 {
b115cf96 7944 unsigned char buf[9];
0b6ae522
DJ
7945 unsigned int i, len;
7946 unsigned long offset;
61865e30 7947
b115cf96 7948 for (i = 0; i < sizeof (buf); i++)
0b6ae522
DJ
7949 {
7950 GET_OP (buf[i]);
7951 if ((buf[i] & 0x80) == 0)
7952 break;
7953 }
4082ef84
NC
7954 if (i == sizeof (buf))
7955 printf (_("corrupt change to vsp"));
7956 else
7957 {
7958 offset = read_uleb128 (buf, &len, buf + i + 1);
7959 assert (len == i + 1);
7960 offset = offset * 4 + 0x204;
7961 printf ("vsp = vsp + %ld", offset);
7962 }
0b6ae522 7963 }
61865e30 7964 else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
0b6ae522 7965 {
61865e30
NC
7966 unsigned int first, last;
7967
7968 GET_OP (op2);
7969 first = op2 >> 4;
7970 last = op2 & 0x0f;
7971 if (op == 0xc8)
7972 first = first + 16;
7973 printf ("pop {D%d", first);
7974 if (last)
7975 printf ("-D%d", first + last);
7976 printf ("}");
7977 }
7978 else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
7979 {
7980 unsigned int count = op & 0x07;
7981
7982 printf ("pop {D8");
7983 if (count)
7984 printf ("-D%d", 8 + count);
7985 printf ("}");
7986 }
7987 else if (op >= 0xc0 && op <= 0xc5)
7988 {
7989 unsigned int count = op & 0x07;
7990
7991 printf (" pop {wR10");
7992 if (count)
7993 printf ("-wR%d", 10 + count);
7994 printf ("}");
7995 }
7996 else if (op == 0xc6)
7997 {
7998 unsigned int first, last;
7999
8000 GET_OP (op2);
8001 first = op2 >> 4;
8002 last = op2 & 0x0f;
8003 printf ("pop {wR%d", first);
8004 if (last)
8005 printf ("-wR%d", first + last);
8006 printf ("}");
8007 }
8008 else if (op == 0xc7)
8009 {
8010 GET_OP (op2);
8011 if (op2 == 0 || (op2 & 0xf0) != 0)
8012 printf (_("[Spare]"));
0b6ae522
DJ
8013 else
8014 {
61865e30
NC
8015 unsigned int mask = op2 & 0x0f;
8016 int first = 1;
8017 int i;
8018
8019 printf ("pop {");
8020 for (i = 0; i < 4; i++)
8021 if (mask & (1 << i))
8022 {
8023 if (first)
8024 first = 0;
8025 else
8026 printf (", ");
8027 printf ("wCGR%d", i);
8028 }
8029 printf ("}");
0b6ae522
DJ
8030 }
8031 }
61865e30
NC
8032 else
8033 printf (_(" [unsupported opcode]"));
0b6ae522
DJ
8034 printf ("\n");
8035 }
fa197c1c
PB
8036}
8037
8038static void
948f632f
DA
8039decode_tic6x_unwind_bytecode (struct arm_unw_aux_info * aux,
8040 unsigned int word,
8041 unsigned int remaining,
8042 unsigned int more_words,
8043 bfd_vma data_offset,
8044 Elf_Internal_Shdr * data_sec,
8045 struct arm_section * data_arm_sec)
fa197c1c
PB
8046{
8047 struct absaddr addr;
8048
8049 /* Decode the unwinding instructions. */
8050 while (1)
8051 {
8052 unsigned int op, op2;
8053
8054 ADVANCE;
8055 if (remaining == 0)
8056 break;
8057 remaining--;
8058 op = word >> 24;
8059 word <<= 8;
8060
9cf03b7e 8061 printf (" 0x%02x ", op);
fa197c1c
PB
8062
8063 if ((op & 0xc0) == 0x00)
8064 {
8065 int offset = ((op & 0x3f) << 3) + 8;
9cf03b7e 8066 printf (" sp = sp + %d", offset);
fa197c1c
PB
8067 }
8068 else if ((op & 0xc0) == 0x80)
8069 {
8070 GET_OP (op2);
8071 if (op == 0x80 && op2 == 0)
8072 printf (_("Refuse to unwind"));
8073 else
8074 {
8075 unsigned int mask = ((op & 0x1f) << 8) | op2;
8076 if (op & 0x20)
8077 printf ("pop compact {");
8078 else
8079 printf ("pop {");
8080
8081 decode_tic6x_unwind_regmask (mask);
8082 printf("}");
8083 }
8084 }
8085 else if ((op & 0xf0) == 0xc0)
8086 {
8087 unsigned int reg;
8088 unsigned int nregs;
8089 unsigned int i;
8090 const char *name;
a734115a
NC
8091 struct
8092 {
fa197c1c
PB
8093 unsigned int offset;
8094 unsigned int reg;
8095 } regpos[16];
8096
8097 /* Scan entire instruction first so that GET_OP output is not
8098 interleaved with disassembly. */
8099 nregs = 0;
8100 for (i = 0; nregs < (op & 0xf); i++)
8101 {
8102 GET_OP (op2);
8103 reg = op2 >> 4;
8104 if (reg != 0xf)
8105 {
8106 regpos[nregs].offset = i * 2;
8107 regpos[nregs].reg = reg;
8108 nregs++;
8109 }
8110
8111 reg = op2 & 0xf;
8112 if (reg != 0xf)
8113 {
8114 regpos[nregs].offset = i * 2 + 1;
8115 regpos[nregs].reg = reg;
8116 nregs++;
8117 }
8118 }
8119
8120 printf (_("pop frame {"));
8121 reg = nregs - 1;
8122 for (i = i * 2; i > 0; i--)
8123 {
8124 if (regpos[reg].offset == i - 1)
8125 {
8126 name = tic6x_unwind_regnames[regpos[reg].reg];
8127 if (reg > 0)
8128 reg--;
8129 }
8130 else
8131 name = _("[pad]");
8132
8133 fputs (name, stdout);
8134 if (i > 1)
8135 printf (", ");
8136 }
8137
8138 printf ("}");
8139 }
8140 else if (op == 0xd0)
8141 printf (" MOV FP, SP");
8142 else if (op == 0xd1)
8143 printf (" __c6xabi_pop_rts");
8144 else if (op == 0xd2)
8145 {
8146 unsigned char buf[9];
8147 unsigned int i, len;
8148 unsigned long offset;
a734115a 8149
fa197c1c
PB
8150 for (i = 0; i < sizeof (buf); i++)
8151 {
8152 GET_OP (buf[i]);
8153 if ((buf[i] & 0x80) == 0)
8154 break;
8155 }
0eff7165
NC
8156 /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2. */
8157 if (i == sizeof (buf))
8158 {
8159 printf ("<corrupt sp adjust>\n");
8160 warn (_("Corrupt stack pointer adjustment detected\n"));
8161 return;
8162 }
948f632f 8163
f6f0e17b 8164 offset = read_uleb128 (buf, &len, buf + i + 1);
fa197c1c
PB
8165 assert (len == i + 1);
8166 offset = offset * 8 + 0x408;
8167 printf (_("sp = sp + %ld"), offset);
8168 }
8169 else if ((op & 0xf0) == 0xe0)
8170 {
8171 if ((op & 0x0f) == 7)
8172 printf (" RETURN");
8173 else
8174 printf (" MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
8175 }
8176 else
8177 {
8178 printf (_(" [unsupported opcode]"));
8179 }
8180 putchar ('\n');
8181 }
8182}
8183
8184static bfd_vma
a734115a 8185arm_expand_prel31 (bfd_vma word, bfd_vma where)
fa197c1c
PB
8186{
8187 bfd_vma offset;
8188
8189 offset = word & 0x7fffffff;
8190 if (offset & 0x40000000)
8191 offset |= ~ (bfd_vma) 0x7fffffff;
8192
8193 if (elf_header.e_machine == EM_TI_C6000)
8194 offset <<= 1;
8195
8196 return offset + where;
8197}
8198
8199static void
1b31d05e
NC
8200decode_arm_unwind (struct arm_unw_aux_info * aux,
8201 unsigned int word,
8202 unsigned int remaining,
8203 bfd_vma data_offset,
8204 Elf_Internal_Shdr * data_sec,
8205 struct arm_section * data_arm_sec)
fa197c1c
PB
8206{
8207 int per_index;
8208 unsigned int more_words = 0;
37e14bc3 8209 struct absaddr addr;
1b31d05e 8210 bfd_vma sym_name = (bfd_vma) -1;
fa197c1c
PB
8211
8212 if (remaining == 0)
8213 {
1b31d05e
NC
8214 /* Fetch the first word.
8215 Note - when decoding an object file the address extracted
8216 here will always be 0. So we also pass in the sym_name
8217 parameter so that we can find the symbol associated with
8218 the personality routine. */
8219 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, data_offset,
8220 & word, & addr, & sym_name))
fa197c1c 8221 return;
1b31d05e 8222
fa197c1c
PB
8223 remaining = 4;
8224 }
8225
8226 if ((word & 0x80000000) == 0)
8227 {
8228 /* Expand prel31 for personality routine. */
8229 bfd_vma fn;
8230 const char *procname;
8231
a734115a 8232 fn = arm_expand_prel31 (word, data_sec->sh_addr + data_offset);
fa197c1c 8233 printf (_(" Personality routine: "));
1b31d05e
NC
8234 if (fn == 0
8235 && addr.section == SHN_UNDEF && addr.offset == 0
8236 && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
8237 {
8238 procname = aux->strtab + sym_name;
8239 print_vma (fn, PREFIX_HEX);
8240 if (procname)
8241 {
8242 fputs (" <", stdout);
8243 fputs (procname, stdout);
8244 fputc ('>', stdout);
8245 }
8246 }
8247 else
8248 procname = arm_print_vma_and_name (aux, fn, addr);
fa197c1c
PB
8249 fputc ('\n', stdout);
8250
8251 /* The GCC personality routines use the standard compact
8252 encoding, starting with one byte giving the number of
8253 words. */
8254 if (procname != NULL
8255 && (const_strneq (procname, "__gcc_personality_v0")
8256 || const_strneq (procname, "__gxx_personality_v0")
8257 || const_strneq (procname, "__gcj_personality_v0")
8258 || const_strneq (procname, "__gnu_objc_personality_v0")))
8259 {
8260 remaining = 0;
8261 more_words = 1;
8262 ADVANCE;
8263 if (!remaining)
8264 {
8265 printf (_(" [Truncated data]\n"));
8266 return;
8267 }
8268 more_words = word >> 24;
8269 word <<= 8;
8270 remaining--;
8271 per_index = -1;
8272 }
8273 else
8274 return;
8275 }
8276 else
8277 {
1b31d05e 8278 /* ARM EHABI Section 6.3:
0b4362b0 8279
1b31d05e 8280 An exception-handling table entry for the compact model looks like:
0b4362b0 8281
1b31d05e
NC
8282 31 30-28 27-24 23-0
8283 -- ----- ----- ----
8284 1 0 index Data for personalityRoutine[index] */
8285
8286 if (elf_header.e_machine == EM_ARM
8287 && (word & 0x70000000))
83c257ca 8288 warn (_("Corrupt ARM compact model table entry: %x \n"), word);
1b31d05e 8289
fa197c1c 8290 per_index = (word >> 24) & 0x7f;
1b31d05e 8291 printf (_(" Compact model index: %d\n"), per_index);
fa197c1c
PB
8292 if (per_index == 0)
8293 {
8294 more_words = 0;
8295 word <<= 8;
8296 remaining--;
8297 }
8298 else if (per_index < 3)
8299 {
8300 more_words = (word >> 16) & 0xff;
8301 word <<= 16;
8302 remaining -= 2;
8303 }
8304 }
8305
8306 switch (elf_header.e_machine)
8307 {
8308 case EM_ARM:
8309 if (per_index < 3)
8310 {
8311 decode_arm_unwind_bytecode (aux, word, remaining, more_words,
8312 data_offset, data_sec, data_arm_sec);
8313 }
8314 else
1b31d05e
NC
8315 {
8316 warn (_("Unknown ARM compact model index encountered\n"));
8317 printf (_(" [reserved]\n"));
8318 }
fa197c1c
PB
8319 break;
8320
8321 case EM_TI_C6000:
8322 if (per_index < 3)
8323 {
8324 decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
1b31d05e 8325 data_offset, data_sec, data_arm_sec);
fa197c1c
PB
8326 }
8327 else if (per_index < 5)
8328 {
8329 if (((word >> 17) & 0x7f) == 0x7f)
8330 printf (_(" Restore stack from frame pointer\n"));
8331 else
8332 printf (_(" Stack increment %d\n"), (word >> 14) & 0x1fc);
8333 printf (_(" Registers restored: "));
8334 if (per_index == 4)
8335 printf (" (compact) ");
8336 decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
8337 putchar ('\n');
8338 printf (_(" Return register: %s\n"),
8339 tic6x_unwind_regnames[word & 0xf]);
8340 }
8341 else
1b31d05e 8342 printf (_(" [reserved (%d)]\n"), per_index);
fa197c1c
PB
8343 break;
8344
8345 default:
74e1a04b 8346 error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
1b31d05e 8347 elf_header.e_machine);
fa197c1c 8348 }
0b6ae522
DJ
8349
8350 /* Decode the descriptors. Not implemented. */
8351}
8352
8353static void
8354dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
8355{
8356 struct arm_section exidx_arm_sec, extab_arm_sec;
8357 unsigned int i, exidx_len;
948f632f 8358 unsigned long j, nfuns;
0b6ae522
DJ
8359
8360 memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
8361 memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
8362 exidx_len = exidx_sec->sh_size / 8;
8363
948f632f
DA
8364 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
8365 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
8366 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
8367 aux->funtab[nfuns++] = aux->symtab[j];
8368 aux->nfuns = nfuns;
8369 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
8370
0b6ae522
DJ
8371 for (i = 0; i < exidx_len; i++)
8372 {
8373 unsigned int exidx_fn, exidx_entry;
8374 struct absaddr fn_addr, entry_addr;
8375 bfd_vma fn;
8376
8377 fputc ('\n', stdout);
8378
1b31d05e
NC
8379 if (! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8380 8 * i, & exidx_fn, & fn_addr, NULL)
8381 || ! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8382 8 * i + 4, & exidx_entry, & entry_addr, NULL))
0b6ae522 8383 {
948f632f 8384 free (aux->funtab);
1b31d05e
NC
8385 arm_free_section (& exidx_arm_sec);
8386 arm_free_section (& extab_arm_sec);
0b6ae522
DJ
8387 return;
8388 }
8389
83c257ca
NC
8390 /* ARM EHABI, Section 5:
8391 An index table entry consists of 2 words.
8392 The first word contains a prel31 offset to the start of a function, with bit 31 clear. */
8393 if (exidx_fn & 0x80000000)
8394 warn (_("corrupt index table entry: %x\n"), exidx_fn);
8395
a734115a 8396 fn = arm_expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
0b6ae522 8397
a734115a 8398 arm_print_vma_and_name (aux, fn, fn_addr);
0b6ae522
DJ
8399 fputs (": ", stdout);
8400
8401 if (exidx_entry == 1)
8402 {
8403 print_vma (exidx_entry, PREFIX_HEX);
8404 fputs (" [cantunwind]\n", stdout);
8405 }
8406 else if (exidx_entry & 0x80000000)
8407 {
8408 print_vma (exidx_entry, PREFIX_HEX);
8409 fputc ('\n', stdout);
8410 decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
8411 }
8412 else
8413 {
8f73510c 8414 bfd_vma table, table_offset = 0;
0b6ae522
DJ
8415 Elf_Internal_Shdr *table_sec;
8416
8417 fputs ("@", stdout);
a734115a 8418 table = arm_expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
0b6ae522
DJ
8419 print_vma (table, PREFIX_HEX);
8420 printf ("\n");
8421
8422 /* Locate the matching .ARM.extab. */
8423 if (entry_addr.section != SHN_UNDEF
8424 && entry_addr.section < elf_header.e_shnum)
8425 {
8426 table_sec = section_headers + entry_addr.section;
8427 table_offset = entry_addr.offset;
1a915552
NC
8428 /* PR 18879 */
8429 if (table_offset > table_sec->sh_size
8430 || ((bfd_signed_vma) table_offset) < 0)
8431 {
8432 warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
8433 (unsigned long) table_offset,
8434 printable_section_name (table_sec));
8435 continue;
8436 }
0b6ae522
DJ
8437 }
8438 else
8439 {
8440 table_sec = find_section_by_address (table);
8441 if (table_sec != NULL)
8442 table_offset = table - table_sec->sh_addr;
8443 }
8444 if (table_sec == NULL)
8445 {
8446 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
8447 (unsigned long) table);
8448 continue;
8449 }
8450 decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
8451 &extab_arm_sec);
8452 }
8453 }
8454
8455 printf ("\n");
8456
948f632f 8457 free (aux->funtab);
0b6ae522
DJ
8458 arm_free_section (&exidx_arm_sec);
8459 arm_free_section (&extab_arm_sec);
8460}
8461
fa197c1c 8462/* Used for both ARM and C6X unwinding tables. */
1b31d05e
NC
8463
8464static void
0b6ae522
DJ
8465arm_process_unwind (FILE *file)
8466{
8467 struct arm_unw_aux_info aux;
8468 Elf_Internal_Shdr *unwsec = NULL;
8469 Elf_Internal_Shdr *strsec;
8470 Elf_Internal_Shdr *sec;
8471 unsigned long i;
fa197c1c 8472 unsigned int sec_type;
0b6ae522 8473
fa197c1c
PB
8474 switch (elf_header.e_machine)
8475 {
8476 case EM_ARM:
8477 sec_type = SHT_ARM_EXIDX;
8478 break;
8479
8480 case EM_TI_C6000:
8481 sec_type = SHT_C6000_UNWIND;
8482 break;
8483
0b4362b0 8484 default:
74e1a04b 8485 error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
1b31d05e
NC
8486 elf_header.e_machine);
8487 return;
fa197c1c
PB
8488 }
8489
0b6ae522 8490 if (string_table == NULL)
1b31d05e
NC
8491 return;
8492
8493 memset (& aux, 0, sizeof (aux));
8494 aux.file = file;
0b6ae522
DJ
8495
8496 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8497 {
8498 if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
8499 {
ba5cdace 8500 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
0b6ae522
DJ
8501
8502 strsec = section_headers + sec->sh_link;
74e1a04b
NC
8503
8504 /* PR binutils/17531 file: 011-12666-0.004. */
8505 if (aux.strtab != NULL)
8506 {
4082ef84 8507 error (_("Multiple string tables found in file.\n"));
74e1a04b
NC
8508 free (aux.strtab);
8509 }
0b6ae522
DJ
8510 aux.strtab = get_data (NULL, file, strsec->sh_offset,
8511 1, strsec->sh_size, _("string table"));
8512 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8513 }
fa197c1c 8514 else if (sec->sh_type == sec_type)
0b6ae522
DJ
8515 unwsec = sec;
8516 }
8517
1b31d05e 8518 if (unwsec == NULL)
0b6ae522 8519 printf (_("\nThere are no unwind sections in this file.\n"));
1b31d05e
NC
8520 else
8521 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8522 {
8523 if (sec->sh_type == sec_type)
8524 {
8525 printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
74e1a04b 8526 printable_section_name (sec),
1b31d05e
NC
8527 (unsigned long) sec->sh_offset,
8528 (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
0b6ae522 8529
1b31d05e
NC
8530 dump_arm_unwind (&aux, sec);
8531 }
8532 }
0b6ae522
DJ
8533
8534 if (aux.symtab)
8535 free (aux.symtab);
8536 if (aux.strtab)
8537 free ((char *) aux.strtab);
0b6ae522
DJ
8538}
8539
1b31d05e 8540static void
2cf0635d 8541process_unwind (FILE * file)
57346661 8542{
2cf0635d
NC
8543 struct unwind_handler
8544 {
57346661 8545 int machtype;
1b31d05e 8546 void (* handler)(FILE *);
2cf0635d
NC
8547 } handlers[] =
8548 {
0b6ae522 8549 { EM_ARM, arm_process_unwind },
57346661
AM
8550 { EM_IA_64, ia64_process_unwind },
8551 { EM_PARISC, hppa_process_unwind },
fa197c1c 8552 { EM_TI_C6000, arm_process_unwind },
57346661
AM
8553 { 0, 0 }
8554 };
8555 int i;
8556
8557 if (!do_unwind)
1b31d05e 8558 return;
57346661
AM
8559
8560 for (i = 0; handlers[i].handler != NULL; i++)
8561 if (elf_header.e_machine == handlers[i].machtype)
9f758fdc
NC
8562 {
8563 handlers[i].handler (file);
8564 return;
8565 }
57346661 8566
1b31d05e
NC
8567 printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
8568 get_machine_name (elf_header.e_machine));
57346661
AM
8569}
8570
252b5132 8571static void
2cf0635d 8572dynamic_section_mips_val (Elf_Internal_Dyn * entry)
252b5132
RH
8573{
8574 switch (entry->d_tag)
8575 {
8576 case DT_MIPS_FLAGS:
8577 if (entry->d_un.d_val == 0)
4b68bca3 8578 printf (_("NONE"));
252b5132
RH
8579 else
8580 {
8581 static const char * opts[] =
8582 {
8583 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
8584 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
8585 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
8586 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
8587 "RLD_ORDER_SAFE"
8588 };
8589 unsigned int cnt;
8590 int first = 1;
2b692964 8591
60bca95a 8592 for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
252b5132
RH
8593 if (entry->d_un.d_val & (1 << cnt))
8594 {
8595 printf ("%s%s", first ? "" : " ", opts[cnt]);
8596 first = 0;
8597 }
252b5132
RH
8598 }
8599 break;
103f02d3 8600
252b5132 8601 case DT_MIPS_IVERSION:
d79b3d50 8602 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
4b68bca3 8603 printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
252b5132 8604 else
76ca31c0
NC
8605 {
8606 char buf[40];
8607 sprintf_vma (buf, entry->d_un.d_ptr);
8608 /* Note: coded this way so that there is a single string for translation. */
8609 printf (_("<corrupt: %s>"), buf);
8610 }
252b5132 8611 break;
103f02d3 8612
252b5132
RH
8613 case DT_MIPS_TIME_STAMP:
8614 {
8615 char timebuf[20];
2cf0635d 8616 struct tm * tmp;
91d6fa6a 8617 time_t atime = entry->d_un.d_val;
82b1b41b 8618
91d6fa6a 8619 tmp = gmtime (&atime);
82b1b41b
NC
8620 /* PR 17531: file: 6accc532. */
8621 if (tmp == NULL)
8622 snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
8623 else
8624 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
8625 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8626 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
4b68bca3 8627 printf (_("Time Stamp: %s"), timebuf);
252b5132
RH
8628 }
8629 break;
103f02d3 8630
252b5132
RH
8631 case DT_MIPS_RLD_VERSION:
8632 case DT_MIPS_LOCAL_GOTNO:
8633 case DT_MIPS_CONFLICTNO:
8634 case DT_MIPS_LIBLISTNO:
8635 case DT_MIPS_SYMTABNO:
8636 case DT_MIPS_UNREFEXTNO:
8637 case DT_MIPS_HIPAGENO:
8638 case DT_MIPS_DELTA_CLASS_NO:
8639 case DT_MIPS_DELTA_INSTANCE_NO:
8640 case DT_MIPS_DELTA_RELOC_NO:
8641 case DT_MIPS_DELTA_SYM_NO:
8642 case DT_MIPS_DELTA_CLASSSYM_NO:
8643 case DT_MIPS_COMPACT_SIZE:
4b68bca3 8644 print_vma (entry->d_un.d_ptr, DEC);
252b5132 8645 break;
103f02d3
UD
8646
8647 default:
4b68bca3 8648 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
103f02d3 8649 }
4b68bca3 8650 putchar ('\n');
103f02d3
UD
8651}
8652
103f02d3 8653static void
2cf0635d 8654dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
103f02d3
UD
8655{
8656 switch (entry->d_tag)
8657 {
8658 case DT_HP_DLD_FLAGS:
8659 {
8660 static struct
8661 {
8662 long int bit;
2cf0635d 8663 const char * str;
5e220199
NC
8664 }
8665 flags[] =
8666 {
8667 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
8668 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
8669 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
8670 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
8671 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
8672 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
8673 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
8674 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
8675 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
8676 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
eec8f817
DA
8677 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
8678 { DT_HP_GST, "HP_GST" },
8679 { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
8680 { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
8681 { DT_HP_NODELETE, "HP_NODELETE" },
8682 { DT_HP_GROUP, "HP_GROUP" },
8683 { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
5e220199 8684 };
103f02d3 8685 int first = 1;
5e220199 8686 size_t cnt;
f7a99963 8687 bfd_vma val = entry->d_un.d_val;
103f02d3 8688
60bca95a 8689 for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
103f02d3 8690 if (val & flags[cnt].bit)
30800947
NC
8691 {
8692 if (! first)
8693 putchar (' ');
8694 fputs (flags[cnt].str, stdout);
8695 first = 0;
8696 val ^= flags[cnt].bit;
8697 }
76da6bbe 8698
103f02d3 8699 if (val != 0 || first)
f7a99963
NC
8700 {
8701 if (! first)
8702 putchar (' ');
8703 print_vma (val, HEX);
8704 }
103f02d3
UD
8705 }
8706 break;
76da6bbe 8707
252b5132 8708 default:
f7a99963
NC
8709 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8710 break;
252b5132 8711 }
35b1837e 8712 putchar ('\n');
252b5132
RH
8713}
8714
28f997cf
TG
8715#ifdef BFD64
8716
8717/* VMS vs Unix time offset and factor. */
8718
8719#define VMS_EPOCH_OFFSET 35067168000000000LL
8720#define VMS_GRANULARITY_FACTOR 10000000
8721
8722/* Display a VMS time in a human readable format. */
8723
8724static void
8725print_vms_time (bfd_int64_t vmstime)
8726{
8727 struct tm *tm;
8728 time_t unxtime;
8729
8730 unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
8731 tm = gmtime (&unxtime);
8732 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
8733 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
8734 tm->tm_hour, tm->tm_min, tm->tm_sec);
8735}
8736#endif /* BFD64 */
8737
ecc51f48 8738static void
2cf0635d 8739dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
ecc51f48
NC
8740{
8741 switch (entry->d_tag)
8742 {
0de14b54 8743 case DT_IA_64_PLT_RESERVE:
bdf4d63a 8744 /* First 3 slots reserved. */
ecc51f48
NC
8745 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8746 printf (" -- ");
8747 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
bdf4d63a
JJ
8748 break;
8749
28f997cf
TG
8750 case DT_IA_64_VMS_LINKTIME:
8751#ifdef BFD64
8752 print_vms_time (entry->d_un.d_val);
8753#endif
8754 break;
8755
8756 case DT_IA_64_VMS_LNKFLAGS:
8757 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8758 if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
8759 printf (" CALL_DEBUG");
8760 if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
8761 printf (" NOP0BUFS");
8762 if (entry->d_un.d_val & VMS_LF_P0IMAGE)
8763 printf (" P0IMAGE");
8764 if (entry->d_un.d_val & VMS_LF_MKTHREADS)
8765 printf (" MKTHREADS");
8766 if (entry->d_un.d_val & VMS_LF_UPCALLS)
8767 printf (" UPCALLS");
8768 if (entry->d_un.d_val & VMS_LF_IMGSTA)
8769 printf (" IMGSTA");
8770 if (entry->d_un.d_val & VMS_LF_INITIALIZE)
8771 printf (" INITIALIZE");
8772 if (entry->d_un.d_val & VMS_LF_MAIN)
8773 printf (" MAIN");
8774 if (entry->d_un.d_val & VMS_LF_EXE_INIT)
8775 printf (" EXE_INIT");
8776 if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
8777 printf (" TBK_IN_IMG");
8778 if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
8779 printf (" DBG_IN_IMG");
8780 if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
8781 printf (" TBK_IN_DSF");
8782 if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
8783 printf (" DBG_IN_DSF");
8784 if (entry->d_un.d_val & VMS_LF_SIGNATURES)
8785 printf (" SIGNATURES");
8786 if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
8787 printf (" REL_SEG_OFF");
8788 break;
8789
bdf4d63a
JJ
8790 default:
8791 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8792 break;
ecc51f48 8793 }
bdf4d63a 8794 putchar ('\n');
ecc51f48
NC
8795}
8796
252b5132 8797static int
2cf0635d 8798get_32bit_dynamic_section (FILE * file)
252b5132 8799{
2cf0635d
NC
8800 Elf32_External_Dyn * edyn;
8801 Elf32_External_Dyn * ext;
8802 Elf_Internal_Dyn * entry;
103f02d3 8803
3f5e193b
NC
8804 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8805 dynamic_size, _("dynamic section"));
a6e9f9df
AM
8806 if (!edyn)
8807 return 0;
103f02d3 8808
071436c6
NC
8809 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8810 might not have the luxury of section headers. Look for the DT_NULL
8811 terminator to determine the number of entries. */
ba2685cc 8812 for (ext = edyn, dynamic_nent = 0;
53c3012c 8813 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
ba2685cc
AM
8814 ext++)
8815 {
8816 dynamic_nent++;
8817 if (BYTE_GET (ext->d_tag) == DT_NULL)
8818 break;
8819 }
252b5132 8820
3f5e193b
NC
8821 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8822 sizeof (* entry));
b2d38a17 8823 if (dynamic_section == NULL)
252b5132 8824 {
8b73c356
NC
8825 error (_("Out of memory allocating space for %lu dynamic entries\n"),
8826 (unsigned long) dynamic_nent);
9ea033b2
NC
8827 free (edyn);
8828 return 0;
8829 }
252b5132 8830
fb514b26 8831 for (ext = edyn, entry = dynamic_section;
ba2685cc 8832 entry < dynamic_section + dynamic_nent;
fb514b26 8833 ext++, entry++)
9ea033b2 8834 {
fb514b26
AM
8835 entry->d_tag = BYTE_GET (ext->d_tag);
8836 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
252b5132
RH
8837 }
8838
9ea033b2
NC
8839 free (edyn);
8840
8841 return 1;
8842}
8843
8844static int
2cf0635d 8845get_64bit_dynamic_section (FILE * file)
9ea033b2 8846{
2cf0635d
NC
8847 Elf64_External_Dyn * edyn;
8848 Elf64_External_Dyn * ext;
8849 Elf_Internal_Dyn * entry;
103f02d3 8850
071436c6 8851 /* Read in the data. */
3f5e193b
NC
8852 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8853 dynamic_size, _("dynamic section"));
a6e9f9df
AM
8854 if (!edyn)
8855 return 0;
103f02d3 8856
071436c6
NC
8857 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8858 might not have the luxury of section headers. Look for the DT_NULL
8859 terminator to determine the number of entries. */
ba2685cc 8860 for (ext = edyn, dynamic_nent = 0;
53c3012c
AM
8861 /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer. */
8862 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
ba2685cc
AM
8863 ext++)
8864 {
8865 dynamic_nent++;
66543521 8866 if (BYTE_GET (ext->d_tag) == DT_NULL)
ba2685cc
AM
8867 break;
8868 }
252b5132 8869
3f5e193b
NC
8870 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8871 sizeof (* entry));
b2d38a17 8872 if (dynamic_section == NULL)
252b5132 8873 {
8b73c356
NC
8874 error (_("Out of memory allocating space for %lu dynamic entries\n"),
8875 (unsigned long) dynamic_nent);
252b5132
RH
8876 free (edyn);
8877 return 0;
8878 }
8879
071436c6 8880 /* Convert from external to internal formats. */
fb514b26 8881 for (ext = edyn, entry = dynamic_section;
ba2685cc 8882 entry < dynamic_section + dynamic_nent;
fb514b26 8883 ext++, entry++)
252b5132 8884 {
66543521
AM
8885 entry->d_tag = BYTE_GET (ext->d_tag);
8886 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
252b5132
RH
8887 }
8888
8889 free (edyn);
8890
9ea033b2
NC
8891 return 1;
8892}
8893
e9e44622
JJ
8894static void
8895print_dynamic_flags (bfd_vma flags)
d1133906 8896{
e9e44622 8897 int first = 1;
13ae64f3 8898
d1133906
NC
8899 while (flags)
8900 {
8901 bfd_vma flag;
8902
8903 flag = flags & - flags;
8904 flags &= ~ flag;
8905
e9e44622
JJ
8906 if (first)
8907 first = 0;
8908 else
8909 putc (' ', stdout);
13ae64f3 8910
d1133906
NC
8911 switch (flag)
8912 {
e9e44622
JJ
8913 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
8914 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
8915 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
8916 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
8917 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
2b692964 8918 default: fputs (_("unknown"), stdout); break;
d1133906
NC
8919 }
8920 }
e9e44622 8921 puts ("");
d1133906
NC
8922}
8923
b2d38a17
NC
8924/* Parse and display the contents of the dynamic section. */
8925
9ea033b2 8926static int
2cf0635d 8927process_dynamic_section (FILE * file)
9ea033b2 8928{
2cf0635d 8929 Elf_Internal_Dyn * entry;
9ea033b2
NC
8930
8931 if (dynamic_size == 0)
8932 {
8933 if (do_dynamic)
b2d38a17 8934 printf (_("\nThere is no dynamic section in this file.\n"));
9ea033b2
NC
8935
8936 return 1;
8937 }
8938
8939 if (is_32bit_elf)
8940 {
b2d38a17 8941 if (! get_32bit_dynamic_section (file))
9ea033b2
NC
8942 return 0;
8943 }
b2d38a17 8944 else if (! get_64bit_dynamic_section (file))
9ea033b2
NC
8945 return 0;
8946
252b5132
RH
8947 /* Find the appropriate symbol table. */
8948 if (dynamic_symbols == NULL)
8949 {
86dba8ee
AM
8950 for (entry = dynamic_section;
8951 entry < dynamic_section + dynamic_nent;
8952 ++entry)
252b5132 8953 {
c8286bd1 8954 Elf_Internal_Shdr section;
252b5132
RH
8955
8956 if (entry->d_tag != DT_SYMTAB)
8957 continue;
8958
8959 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
8960
8961 /* Since we do not know how big the symbol table is,
8962 we default to reading in the entire file (!) and
8963 processing that. This is overkill, I know, but it
e3c8793a 8964 should work. */
d93f0186 8965 section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
252b5132 8966
fb52b2f4
NC
8967 if (archive_file_offset != 0)
8968 section.sh_size = archive_file_size - section.sh_offset;
8969 else
8970 {
8971 if (fseek (file, 0, SEEK_END))
591a748a 8972 error (_("Unable to seek to end of file!\n"));
fb52b2f4
NC
8973
8974 section.sh_size = ftell (file) - section.sh_offset;
8975 }
252b5132 8976
9ea033b2 8977 if (is_32bit_elf)
9ad5cbcf 8978 section.sh_entsize = sizeof (Elf32_External_Sym);
9ea033b2 8979 else
9ad5cbcf 8980 section.sh_entsize = sizeof (Elf64_External_Sym);
071436c6 8981 section.sh_name = string_table_length;
252b5132 8982
ba5cdace 8983 dynamic_symbols = GET_ELF_SYMBOLS (file, &section, & num_dynamic_syms);
19936277 8984 if (num_dynamic_syms < 1)
252b5132
RH
8985 {
8986 error (_("Unable to determine the number of symbols to load\n"));
8987 continue;
8988 }
252b5132
RH
8989 }
8990 }
8991
8992 /* Similarly find a string table. */
8993 if (dynamic_strings == NULL)
8994 {
86dba8ee
AM
8995 for (entry = dynamic_section;
8996 entry < dynamic_section + dynamic_nent;
8997 ++entry)
252b5132
RH
8998 {
8999 unsigned long offset;
b34976b6 9000 long str_tab_len;
252b5132
RH
9001
9002 if (entry->d_tag != DT_STRTAB)
9003 continue;
9004
9005 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
9006
9007 /* Since we do not know how big the string table is,
9008 we default to reading in the entire file (!) and
9009 processing that. This is overkill, I know, but it
e3c8793a 9010 should work. */
252b5132 9011
d93f0186 9012 offset = offset_from_vma (file, entry->d_un.d_val, 0);
fb52b2f4
NC
9013
9014 if (archive_file_offset != 0)
9015 str_tab_len = archive_file_size - offset;
9016 else
9017 {
9018 if (fseek (file, 0, SEEK_END))
9019 error (_("Unable to seek to end of file\n"));
9020 str_tab_len = ftell (file) - offset;
9021 }
252b5132
RH
9022
9023 if (str_tab_len < 1)
9024 {
9025 error
9026 (_("Unable to determine the length of the dynamic string table\n"));
9027 continue;
9028 }
9029
3f5e193b
NC
9030 dynamic_strings = (char *) get_data (NULL, file, offset, 1,
9031 str_tab_len,
9032 _("dynamic string table"));
59245841 9033 dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
252b5132
RH
9034 break;
9035 }
9036 }
9037
9038 /* And find the syminfo section if available. */
9039 if (dynamic_syminfo == NULL)
9040 {
3e8bba36 9041 unsigned long syminsz = 0;
252b5132 9042
86dba8ee
AM
9043 for (entry = dynamic_section;
9044 entry < dynamic_section + dynamic_nent;
9045 ++entry)
252b5132
RH
9046 {
9047 if (entry->d_tag == DT_SYMINENT)
9048 {
9049 /* Note: these braces are necessary to avoid a syntax
9050 error from the SunOS4 C compiler. */
049b0c3a
NC
9051 /* PR binutils/17531: A corrupt file can trigger this test.
9052 So do not use an assert, instead generate an error message. */
9053 if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
071436c6 9054 error (_("Bad value (%d) for SYMINENT entry\n"),
049b0c3a 9055 (int) entry->d_un.d_val);
252b5132
RH
9056 }
9057 else if (entry->d_tag == DT_SYMINSZ)
9058 syminsz = entry->d_un.d_val;
9059 else if (entry->d_tag == DT_SYMINFO)
d93f0186
NC
9060 dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
9061 syminsz);
252b5132
RH
9062 }
9063
9064 if (dynamic_syminfo_offset != 0 && syminsz != 0)
9065 {
2cf0635d
NC
9066 Elf_External_Syminfo * extsyminfo;
9067 Elf_External_Syminfo * extsym;
9068 Elf_Internal_Syminfo * syminfo;
252b5132
RH
9069
9070 /* There is a syminfo section. Read the data. */
3f5e193b
NC
9071 extsyminfo = (Elf_External_Syminfo *)
9072 get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
9073 _("symbol information"));
a6e9f9df
AM
9074 if (!extsyminfo)
9075 return 0;
252b5132 9076
3f5e193b 9077 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
252b5132
RH
9078 if (dynamic_syminfo == NULL)
9079 {
8b73c356
NC
9080 error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9081 (unsigned long) syminsz);
252b5132
RH
9082 return 0;
9083 }
9084
9085 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
86dba8ee
AM
9086 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
9087 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
9088 ++syminfo, ++extsym)
252b5132 9089 {
86dba8ee
AM
9090 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
9091 syminfo->si_flags = BYTE_GET (extsym->si_flags);
252b5132
RH
9092 }
9093
9094 free (extsyminfo);
9095 }
9096 }
9097
9098 if (do_dynamic && dynamic_addr)
8b73c356
NC
9099 printf (_("\nDynamic section at offset 0x%lx contains %lu entries:\n"),
9100 dynamic_addr, (unsigned long) dynamic_nent);
252b5132
RH
9101 if (do_dynamic)
9102 printf (_(" Tag Type Name/Value\n"));
9103
86dba8ee
AM
9104 for (entry = dynamic_section;
9105 entry < dynamic_section + dynamic_nent;
9106 entry++)
252b5132
RH
9107 {
9108 if (do_dynamic)
f7a99963 9109 {
2cf0635d 9110 const char * dtype;
e699b9ff 9111
f7a99963
NC
9112 putchar (' ');
9113 print_vma (entry->d_tag, FULL_HEX);
e699b9ff
ILT
9114 dtype = get_dynamic_type (entry->d_tag);
9115 printf (" (%s)%*s", dtype,
9116 ((is_32bit_elf ? 27 : 19)
9117 - (int) strlen (dtype)),
f7a99963
NC
9118 " ");
9119 }
252b5132
RH
9120
9121 switch (entry->d_tag)
9122 {
d1133906
NC
9123 case DT_FLAGS:
9124 if (do_dynamic)
e9e44622 9125 print_dynamic_flags (entry->d_un.d_val);
d1133906 9126 break;
76da6bbe 9127
252b5132
RH
9128 case DT_AUXILIARY:
9129 case DT_FILTER:
019148e4
L
9130 case DT_CONFIG:
9131 case DT_DEPAUDIT:
9132 case DT_AUDIT:
252b5132
RH
9133 if (do_dynamic)
9134 {
019148e4 9135 switch (entry->d_tag)
b34976b6 9136 {
019148e4
L
9137 case DT_AUXILIARY:
9138 printf (_("Auxiliary library"));
9139 break;
9140
9141 case DT_FILTER:
9142 printf (_("Filter library"));
9143 break;
9144
b34976b6 9145 case DT_CONFIG:
019148e4
L
9146 printf (_("Configuration file"));
9147 break;
9148
9149 case DT_DEPAUDIT:
9150 printf (_("Dependency audit library"));
9151 break;
9152
9153 case DT_AUDIT:
9154 printf (_("Audit library"));
9155 break;
9156 }
252b5132 9157
d79b3d50
NC
9158 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9159 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
252b5132 9160 else
f7a99963
NC
9161 {
9162 printf (": ");
9163 print_vma (entry->d_un.d_val, PREFIX_HEX);
9164 putchar ('\n');
9165 }
252b5132
RH
9166 }
9167 break;
9168
dcefbbbd 9169 case DT_FEATURE:
252b5132
RH
9170 if (do_dynamic)
9171 {
9172 printf (_("Flags:"));
86f55779 9173
252b5132
RH
9174 if (entry->d_un.d_val == 0)
9175 printf (_(" None\n"));
9176 else
9177 {
9178 unsigned long int val = entry->d_un.d_val;
86f55779 9179
252b5132
RH
9180 if (val & DTF_1_PARINIT)
9181 {
9182 printf (" PARINIT");
9183 val ^= DTF_1_PARINIT;
9184 }
dcefbbbd
L
9185 if (val & DTF_1_CONFEXP)
9186 {
9187 printf (" CONFEXP");
9188 val ^= DTF_1_CONFEXP;
9189 }
252b5132
RH
9190 if (val != 0)
9191 printf (" %lx", val);
9192 puts ("");
9193 }
9194 }
9195 break;
9196
9197 case DT_POSFLAG_1:
9198 if (do_dynamic)
9199 {
9200 printf (_("Flags:"));
86f55779 9201
252b5132
RH
9202 if (entry->d_un.d_val == 0)
9203 printf (_(" None\n"));
9204 else
9205 {
9206 unsigned long int val = entry->d_un.d_val;
86f55779 9207
252b5132
RH
9208 if (val & DF_P1_LAZYLOAD)
9209 {
9210 printf (" LAZYLOAD");
9211 val ^= DF_P1_LAZYLOAD;
9212 }
9213 if (val & DF_P1_GROUPPERM)
9214 {
9215 printf (" GROUPPERM");
9216 val ^= DF_P1_GROUPPERM;
9217 }
9218 if (val != 0)
9219 printf (" %lx", val);
9220 puts ("");
9221 }
9222 }
9223 break;
9224
9225 case DT_FLAGS_1:
9226 if (do_dynamic)
9227 {
9228 printf (_("Flags:"));
9229 if (entry->d_un.d_val == 0)
9230 printf (_(" None\n"));
9231 else
9232 {
9233 unsigned long int val = entry->d_un.d_val;
86f55779 9234
252b5132
RH
9235 if (val & DF_1_NOW)
9236 {
9237 printf (" NOW");
9238 val ^= DF_1_NOW;
9239 }
9240 if (val & DF_1_GLOBAL)
9241 {
9242 printf (" GLOBAL");
9243 val ^= DF_1_GLOBAL;
9244 }
9245 if (val & DF_1_GROUP)
9246 {
9247 printf (" GROUP");
9248 val ^= DF_1_GROUP;
9249 }
9250 if (val & DF_1_NODELETE)
9251 {
9252 printf (" NODELETE");
9253 val ^= DF_1_NODELETE;
9254 }
9255 if (val & DF_1_LOADFLTR)
9256 {
9257 printf (" LOADFLTR");
9258 val ^= DF_1_LOADFLTR;
9259 }
9260 if (val & DF_1_INITFIRST)
9261 {
9262 printf (" INITFIRST");
9263 val ^= DF_1_INITFIRST;
9264 }
9265 if (val & DF_1_NOOPEN)
9266 {
9267 printf (" NOOPEN");
9268 val ^= DF_1_NOOPEN;
9269 }
9270 if (val & DF_1_ORIGIN)
9271 {
9272 printf (" ORIGIN");
9273 val ^= DF_1_ORIGIN;
9274 }
9275 if (val & DF_1_DIRECT)
9276 {
9277 printf (" DIRECT");
9278 val ^= DF_1_DIRECT;
9279 }
9280 if (val & DF_1_TRANS)
9281 {
9282 printf (" TRANS");
9283 val ^= DF_1_TRANS;
9284 }
9285 if (val & DF_1_INTERPOSE)
9286 {
9287 printf (" INTERPOSE");
9288 val ^= DF_1_INTERPOSE;
9289 }
f7db6139 9290 if (val & DF_1_NODEFLIB)
dcefbbbd 9291 {
f7db6139
L
9292 printf (" NODEFLIB");
9293 val ^= DF_1_NODEFLIB;
dcefbbbd
L
9294 }
9295 if (val & DF_1_NODUMP)
9296 {
9297 printf (" NODUMP");
9298 val ^= DF_1_NODUMP;
9299 }
34b60028 9300 if (val & DF_1_CONFALT)
dcefbbbd 9301 {
34b60028
L
9302 printf (" CONFALT");
9303 val ^= DF_1_CONFALT;
9304 }
9305 if (val & DF_1_ENDFILTEE)
9306 {
9307 printf (" ENDFILTEE");
9308 val ^= DF_1_ENDFILTEE;
9309 }
9310 if (val & DF_1_DISPRELDNE)
9311 {
9312 printf (" DISPRELDNE");
9313 val ^= DF_1_DISPRELDNE;
9314 }
9315 if (val & DF_1_DISPRELPND)
9316 {
9317 printf (" DISPRELPND");
9318 val ^= DF_1_DISPRELPND;
9319 }
9320 if (val & DF_1_NODIRECT)
9321 {
9322 printf (" NODIRECT");
9323 val ^= DF_1_NODIRECT;
9324 }
9325 if (val & DF_1_IGNMULDEF)
9326 {
9327 printf (" IGNMULDEF");
9328 val ^= DF_1_IGNMULDEF;
9329 }
9330 if (val & DF_1_NOKSYMS)
9331 {
9332 printf (" NOKSYMS");
9333 val ^= DF_1_NOKSYMS;
9334 }
9335 if (val & DF_1_NOHDR)
9336 {
9337 printf (" NOHDR");
9338 val ^= DF_1_NOHDR;
9339 }
9340 if (val & DF_1_EDITED)
9341 {
9342 printf (" EDITED");
9343 val ^= DF_1_EDITED;
9344 }
9345 if (val & DF_1_NORELOC)
9346 {
9347 printf (" NORELOC");
9348 val ^= DF_1_NORELOC;
9349 }
9350 if (val & DF_1_SYMINTPOSE)
9351 {
9352 printf (" SYMINTPOSE");
9353 val ^= DF_1_SYMINTPOSE;
9354 }
9355 if (val & DF_1_GLOBAUDIT)
9356 {
9357 printf (" GLOBAUDIT");
9358 val ^= DF_1_GLOBAUDIT;
9359 }
9360 if (val & DF_1_SINGLETON)
9361 {
9362 printf (" SINGLETON");
9363 val ^= DF_1_SINGLETON;
dcefbbbd 9364 }
5c383f02
RO
9365 if (val & DF_1_STUB)
9366 {
9367 printf (" STUB");
9368 val ^= DF_1_STUB;
9369 }
9370 if (val & DF_1_PIE)
9371 {
9372 printf (" PIE");
9373 val ^= DF_1_PIE;
9374 }
252b5132
RH
9375 if (val != 0)
9376 printf (" %lx", val);
9377 puts ("");
9378 }
9379 }
9380 break;
9381
9382 case DT_PLTREL:
566b0d53 9383 dynamic_info[entry->d_tag] = entry->d_un.d_val;
252b5132
RH
9384 if (do_dynamic)
9385 puts (get_dynamic_type (entry->d_un.d_val));
9386 break;
9387
9388 case DT_NULL :
9389 case DT_NEEDED :
9390 case DT_PLTGOT :
9391 case DT_HASH :
9392 case DT_STRTAB :
9393 case DT_SYMTAB :
9394 case DT_RELA :
9395 case DT_INIT :
9396 case DT_FINI :
9397 case DT_SONAME :
9398 case DT_RPATH :
9399 case DT_SYMBOLIC:
9400 case DT_REL :
9401 case DT_DEBUG :
9402 case DT_TEXTREL :
9403 case DT_JMPREL :
019148e4 9404 case DT_RUNPATH :
252b5132
RH
9405 dynamic_info[entry->d_tag] = entry->d_un.d_val;
9406
9407 if (do_dynamic)
9408 {
2cf0635d 9409 char * name;
252b5132 9410
d79b3d50
NC
9411 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9412 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
252b5132 9413 else
d79b3d50 9414 name = NULL;
252b5132
RH
9415
9416 if (name)
9417 {
9418 switch (entry->d_tag)
9419 {
9420 case DT_NEEDED:
9421 printf (_("Shared library: [%s]"), name);
9422
18bd398b 9423 if (streq (name, program_interpreter))
f7a99963 9424 printf (_(" program interpreter"));
252b5132
RH
9425 break;
9426
9427 case DT_SONAME:
f7a99963 9428 printf (_("Library soname: [%s]"), name);
252b5132
RH
9429 break;
9430
9431 case DT_RPATH:
f7a99963 9432 printf (_("Library rpath: [%s]"), name);
252b5132
RH
9433 break;
9434
019148e4
L
9435 case DT_RUNPATH:
9436 printf (_("Library runpath: [%s]"), name);
9437 break;
9438
252b5132 9439 default:
f7a99963
NC
9440 print_vma (entry->d_un.d_val, PREFIX_HEX);
9441 break;
252b5132
RH
9442 }
9443 }
9444 else
f7a99963
NC
9445 print_vma (entry->d_un.d_val, PREFIX_HEX);
9446
9447 putchar ('\n');
252b5132
RH
9448 }
9449 break;
9450
9451 case DT_PLTRELSZ:
9452 case DT_RELASZ :
9453 case DT_STRSZ :
9454 case DT_RELSZ :
9455 case DT_RELAENT :
9456 case DT_SYMENT :
9457 case DT_RELENT :
566b0d53 9458 dynamic_info[entry->d_tag] = entry->d_un.d_val;
252b5132
RH
9459 case DT_PLTPADSZ:
9460 case DT_MOVEENT :
9461 case DT_MOVESZ :
9462 case DT_INIT_ARRAYSZ:
9463 case DT_FINI_ARRAYSZ:
047b2264
JJ
9464 case DT_GNU_CONFLICTSZ:
9465 case DT_GNU_LIBLISTSZ:
252b5132 9466 if (do_dynamic)
f7a99963
NC
9467 {
9468 print_vma (entry->d_un.d_val, UNSIGNED);
2b692964 9469 printf (_(" (bytes)\n"));
f7a99963 9470 }
252b5132
RH
9471 break;
9472
9473 case DT_VERDEFNUM:
9474 case DT_VERNEEDNUM:
9475 case DT_RELACOUNT:
9476 case DT_RELCOUNT:
9477 if (do_dynamic)
f7a99963
NC
9478 {
9479 print_vma (entry->d_un.d_val, UNSIGNED);
9480 putchar ('\n');
9481 }
252b5132
RH
9482 break;
9483
9484 case DT_SYMINSZ:
9485 case DT_SYMINENT:
9486 case DT_SYMINFO:
9487 case DT_USED:
9488 case DT_INIT_ARRAY:
9489 case DT_FINI_ARRAY:
9490 if (do_dynamic)
9491 {
d79b3d50
NC
9492 if (entry->d_tag == DT_USED
9493 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
252b5132 9494 {
2cf0635d 9495 char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
252b5132 9496
b34976b6 9497 if (*name)
252b5132
RH
9498 {
9499 printf (_("Not needed object: [%s]\n"), name);
9500 break;
9501 }
9502 }
103f02d3 9503
f7a99963
NC
9504 print_vma (entry->d_un.d_val, PREFIX_HEX);
9505 putchar ('\n');
252b5132
RH
9506 }
9507 break;
9508
9509 case DT_BIND_NOW:
9510 /* The value of this entry is ignored. */
35b1837e
AM
9511 if (do_dynamic)
9512 putchar ('\n');
252b5132 9513 break;
103f02d3 9514
047b2264
JJ
9515 case DT_GNU_PRELINKED:
9516 if (do_dynamic)
9517 {
2cf0635d 9518 struct tm * tmp;
91d6fa6a 9519 time_t atime = entry->d_un.d_val;
047b2264 9520
91d6fa6a 9521 tmp = gmtime (&atime);
071436c6
NC
9522 /* PR 17533 file: 041-1244816-0.004. */
9523 if (tmp == NULL)
5a2cbcf4
L
9524 printf (_("<corrupt time val: %lx"),
9525 (unsigned long) atime);
071436c6
NC
9526 else
9527 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
9528 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9529 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
047b2264
JJ
9530
9531 }
9532 break;
9533
fdc90cb4
JJ
9534 case DT_GNU_HASH:
9535 dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
9536 if (do_dynamic)
9537 {
9538 print_vma (entry->d_un.d_val, PREFIX_HEX);
9539 putchar ('\n');
9540 }
9541 break;
9542
252b5132
RH
9543 default:
9544 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
b34976b6 9545 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
252b5132
RH
9546 entry->d_un.d_val;
9547
9548 if (do_dynamic)
9549 {
9550 switch (elf_header.e_machine)
9551 {
9552 case EM_MIPS:
4fe85591 9553 case EM_MIPS_RS3_LE:
b2d38a17 9554 dynamic_section_mips_val (entry);
252b5132 9555 break;
103f02d3 9556 case EM_PARISC:
b2d38a17 9557 dynamic_section_parisc_val (entry);
103f02d3 9558 break;
ecc51f48 9559 case EM_IA_64:
b2d38a17 9560 dynamic_section_ia64_val (entry);
ecc51f48 9561 break;
252b5132 9562 default:
f7a99963
NC
9563 print_vma (entry->d_un.d_val, PREFIX_HEX);
9564 putchar ('\n');
252b5132
RH
9565 }
9566 }
9567 break;
9568 }
9569 }
9570
9571 return 1;
9572}
9573
9574static char *
d3ba0551 9575get_ver_flags (unsigned int flags)
252b5132 9576{
b34976b6 9577 static char buff[32];
252b5132
RH
9578
9579 buff[0] = 0;
9580
9581 if (flags == 0)
9582 return _("none");
9583
9584 if (flags & VER_FLG_BASE)
9585 strcat (buff, "BASE ");
9586
9587 if (flags & VER_FLG_WEAK)
9588 {
9589 if (flags & VER_FLG_BASE)
9590 strcat (buff, "| ");
9591
9592 strcat (buff, "WEAK ");
9593 }
9594
44ec90b9
RO
9595 if (flags & VER_FLG_INFO)
9596 {
9597 if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
9598 strcat (buff, "| ");
9599
9600 strcat (buff, "INFO ");
9601 }
9602
9603 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
2b692964 9604 strcat (buff, _("| <unknown>"));
252b5132
RH
9605
9606 return buff;
9607}
9608
9609/* Display the contents of the version sections. */
98fb390a 9610
252b5132 9611static int
2cf0635d 9612process_version_sections (FILE * file)
252b5132 9613{
2cf0635d 9614 Elf_Internal_Shdr * section;
b34976b6
AM
9615 unsigned i;
9616 int found = 0;
252b5132
RH
9617
9618 if (! do_version)
9619 return 1;
9620
9621 for (i = 0, section = section_headers;
9622 i < elf_header.e_shnum;
b34976b6 9623 i++, section++)
252b5132
RH
9624 {
9625 switch (section->sh_type)
9626 {
9627 case SHT_GNU_verdef:
9628 {
2cf0635d 9629 Elf_External_Verdef * edefs;
b34976b6
AM
9630 unsigned int idx;
9631 unsigned int cnt;
2cf0635d 9632 char * endbuf;
252b5132
RH
9633
9634 found = 1;
9635
74e1a04b
NC
9636 printf (_("\nVersion definition section '%s' contains %u entries:\n"),
9637 printable_section_name (section),
9638 section->sh_info);
252b5132
RH
9639
9640 printf (_(" Addr: 0x"));
9641 printf_vma (section->sh_addr);
74e1a04b 9642 printf (_(" Offset: %#08lx Link: %u (%s)"),
1b228002 9643 (unsigned long) section->sh_offset, section->sh_link,
74e1a04b 9644 printable_section_name_from_index (section->sh_link));
252b5132 9645
3f5e193b
NC
9646 edefs = (Elf_External_Verdef *)
9647 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
9648 _("version definition section"));
a6e9f9df
AM
9649 if (!edefs)
9650 break;
59245841 9651 endbuf = (char *) edefs + section->sh_size;
252b5132 9652
b34976b6 9653 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
252b5132 9654 {
2cf0635d
NC
9655 char * vstart;
9656 Elf_External_Verdef * edef;
b34976b6 9657 Elf_Internal_Verdef ent;
2cf0635d 9658 Elf_External_Verdaux * eaux;
b34976b6
AM
9659 Elf_Internal_Verdaux aux;
9660 int j;
9661 int isum;
103f02d3 9662
7e26601c
NC
9663 /* Check for very large indicies. */
9664 if (idx > (size_t) (endbuf - (char *) edefs))
dd24e3da
NC
9665 break;
9666
252b5132 9667 vstart = ((char *) edefs) + idx;
54806181
AM
9668 if (vstart + sizeof (*edef) > endbuf)
9669 break;
252b5132
RH
9670
9671 edef = (Elf_External_Verdef *) vstart;
9672
9673 ent.vd_version = BYTE_GET (edef->vd_version);
9674 ent.vd_flags = BYTE_GET (edef->vd_flags);
9675 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
9676 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
9677 ent.vd_hash = BYTE_GET (edef->vd_hash);
9678 ent.vd_aux = BYTE_GET (edef->vd_aux);
9679 ent.vd_next = BYTE_GET (edef->vd_next);
9680
9681 printf (_(" %#06x: Rev: %d Flags: %s"),
9682 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
9683
9684 printf (_(" Index: %d Cnt: %d "),
9685 ent.vd_ndx, ent.vd_cnt);
9686
dd24e3da 9687 /* Check for overflow. */
7e26601c 9688 if (ent.vd_aux > (size_t) (endbuf - vstart))
dd24e3da
NC
9689 break;
9690
252b5132
RH
9691 vstart += ent.vd_aux;
9692
9693 eaux = (Elf_External_Verdaux *) vstart;
9694
9695 aux.vda_name = BYTE_GET (eaux->vda_name);
9696 aux.vda_next = BYTE_GET (eaux->vda_next);
9697
d79b3d50
NC
9698 if (VALID_DYNAMIC_NAME (aux.vda_name))
9699 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
252b5132
RH
9700 else
9701 printf (_("Name index: %ld\n"), aux.vda_name);
9702
9703 isum = idx + ent.vd_aux;
9704
b34976b6 9705 for (j = 1; j < ent.vd_cnt; j++)
252b5132 9706 {
dd24e3da 9707 /* Check for overflow. */
7e26601c 9708 if (aux.vda_next > (size_t) (endbuf - vstart))
dd24e3da
NC
9709 break;
9710
252b5132
RH
9711 isum += aux.vda_next;
9712 vstart += aux.vda_next;
9713
9714 eaux = (Elf_External_Verdaux *) vstart;
54806181
AM
9715 if (vstart + sizeof (*eaux) > endbuf)
9716 break;
252b5132
RH
9717
9718 aux.vda_name = BYTE_GET (eaux->vda_name);
9719 aux.vda_next = BYTE_GET (eaux->vda_next);
9720
d79b3d50 9721 if (VALID_DYNAMIC_NAME (aux.vda_name))
252b5132 9722 printf (_(" %#06x: Parent %d: %s\n"),
d79b3d50 9723 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
252b5132
RH
9724 else
9725 printf (_(" %#06x: Parent %d, name index: %ld\n"),
9726 isum, j, aux.vda_name);
9727 }
dd24e3da 9728
54806181
AM
9729 if (j < ent.vd_cnt)
9730 printf (_(" Version def aux past end of section\n"));
252b5132 9731
5d921cbd
NC
9732 /* PR 17531: file: id:000001,src:000172+005151,op:splice,rep:2. */
9733 if (idx + ent.vd_next <= idx)
9734 break;
9735
252b5132
RH
9736 idx += ent.vd_next;
9737 }
dd24e3da 9738
54806181
AM
9739 if (cnt < section->sh_info)
9740 printf (_(" Version definition past end of section\n"));
252b5132
RH
9741
9742 free (edefs);
9743 }
9744 break;
103f02d3 9745
252b5132
RH
9746 case SHT_GNU_verneed:
9747 {
2cf0635d 9748 Elf_External_Verneed * eneed;
b34976b6
AM
9749 unsigned int idx;
9750 unsigned int cnt;
2cf0635d 9751 char * endbuf;
252b5132
RH
9752
9753 found = 1;
9754
72de5009 9755 printf (_("\nVersion needs section '%s' contains %u entries:\n"),
74e1a04b 9756 printable_section_name (section), section->sh_info);
252b5132
RH
9757
9758 printf (_(" Addr: 0x"));
9759 printf_vma (section->sh_addr);
72de5009 9760 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
1b228002 9761 (unsigned long) section->sh_offset, section->sh_link,
74e1a04b 9762 printable_section_name_from_index (section->sh_link));
252b5132 9763
3f5e193b
NC
9764 eneed = (Elf_External_Verneed *) get_data (NULL, file,
9765 section->sh_offset, 1,
9766 section->sh_size,
9cf03b7e 9767 _("Version Needs section"));
a6e9f9df
AM
9768 if (!eneed)
9769 break;
59245841 9770 endbuf = (char *) eneed + section->sh_size;
252b5132
RH
9771
9772 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9773 {
2cf0635d 9774 Elf_External_Verneed * entry;
b34976b6
AM
9775 Elf_Internal_Verneed ent;
9776 int j;
9777 int isum;
2cf0635d 9778 char * vstart;
252b5132 9779
7e26601c 9780 if (idx > (size_t) (endbuf - (char *) eneed))
dd24e3da
NC
9781 break;
9782
252b5132 9783 vstart = ((char *) eneed) + idx;
54806181
AM
9784 if (vstart + sizeof (*entry) > endbuf)
9785 break;
252b5132
RH
9786
9787 entry = (Elf_External_Verneed *) vstart;
9788
9789 ent.vn_version = BYTE_GET (entry->vn_version);
9790 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
9791 ent.vn_file = BYTE_GET (entry->vn_file);
9792 ent.vn_aux = BYTE_GET (entry->vn_aux);
9793 ent.vn_next = BYTE_GET (entry->vn_next);
9794
9795 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
9796
d79b3d50
NC
9797 if (VALID_DYNAMIC_NAME (ent.vn_file))
9798 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
252b5132
RH
9799 else
9800 printf (_(" File: %lx"), ent.vn_file);
9801
9802 printf (_(" Cnt: %d\n"), ent.vn_cnt);
9803
dd24e3da 9804 /* Check for overflow. */
7e26601c 9805 if (ent.vn_aux > (size_t) (endbuf - vstart))
dd24e3da 9806 break;
252b5132
RH
9807 vstart += ent.vn_aux;
9808
9809 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
9810 {
2cf0635d 9811 Elf_External_Vernaux * eaux;
b34976b6 9812 Elf_Internal_Vernaux aux;
252b5132 9813
54806181
AM
9814 if (vstart + sizeof (*eaux) > endbuf)
9815 break;
252b5132
RH
9816 eaux = (Elf_External_Vernaux *) vstart;
9817
9818 aux.vna_hash = BYTE_GET (eaux->vna_hash);
9819 aux.vna_flags = BYTE_GET (eaux->vna_flags);
9820 aux.vna_other = BYTE_GET (eaux->vna_other);
9821 aux.vna_name = BYTE_GET (eaux->vna_name);
9822 aux.vna_next = BYTE_GET (eaux->vna_next);
9823
d79b3d50 9824 if (VALID_DYNAMIC_NAME (aux.vna_name))
ecc2063b 9825 printf (_(" %#06x: Name: %s"),
d79b3d50 9826 isum, GET_DYNAMIC_NAME (aux.vna_name));
252b5132 9827 else
ecc2063b 9828 printf (_(" %#06x: Name index: %lx"),
252b5132
RH
9829 isum, aux.vna_name);
9830
9831 printf (_(" Flags: %s Version: %d\n"),
9832 get_ver_flags (aux.vna_flags), aux.vna_other);
9833
dd24e3da 9834 /* Check for overflow. */
53774b7e
NC
9835 if (aux.vna_next > (size_t) (endbuf - vstart)
9836 || (aux.vna_next == 0 && j < ent.vn_cnt - 1))
9837 {
9838 warn (_("Invalid vna_next field of %lx\n"),
9839 aux.vna_next);
9840 j = ent.vn_cnt;
9841 break;
9842 }
252b5132
RH
9843 isum += aux.vna_next;
9844 vstart += aux.vna_next;
9845 }
9cf03b7e 9846
54806181 9847 if (j < ent.vn_cnt)
9cf03b7e 9848 warn (_("Missing Version Needs auxillary information\n"));
252b5132 9849
bcf83b2a 9850 if (ent.vn_next == 0 && cnt < section->sh_info - 1)
c24cf8b6
NC
9851 {
9852 warn (_("Corrupt Version Needs structure - offset to next structure is zero with entries still left to be processed\n"));
9853 cnt = section->sh_info;
9854 break;
9855 }
252b5132
RH
9856 idx += ent.vn_next;
9857 }
9cf03b7e 9858
54806181 9859 if (cnt < section->sh_info)
9cf03b7e 9860 warn (_("Missing Version Needs information\n"));
103f02d3 9861
252b5132
RH
9862 free (eneed);
9863 }
9864 break;
9865
9866 case SHT_GNU_versym:
9867 {
2cf0635d 9868 Elf_Internal_Shdr * link_section;
8b73c356
NC
9869 size_t total;
9870 unsigned int cnt;
2cf0635d
NC
9871 unsigned char * edata;
9872 unsigned short * data;
9873 char * strtab;
9874 Elf_Internal_Sym * symbols;
9875 Elf_Internal_Shdr * string_sec;
ba5cdace 9876 unsigned long num_syms;
d3ba0551 9877 long off;
252b5132 9878
4fbb74a6 9879 if (section->sh_link >= elf_header.e_shnum)
c256ffe7
JJ
9880 break;
9881
4fbb74a6 9882 link_section = section_headers + section->sh_link;
08d8fa11 9883 total = section->sh_size / sizeof (Elf_External_Versym);
252b5132 9884
4fbb74a6 9885 if (link_section->sh_link >= elf_header.e_shnum)
c256ffe7
JJ
9886 break;
9887
252b5132
RH
9888 found = 1;
9889
ba5cdace 9890 symbols = GET_ELF_SYMBOLS (file, link_section, & num_syms);
dd24e3da
NC
9891 if (symbols == NULL)
9892 break;
252b5132 9893
4fbb74a6 9894 string_sec = section_headers + link_section->sh_link;
252b5132 9895
3f5e193b
NC
9896 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
9897 string_sec->sh_size,
9898 _("version string table"));
a6e9f9df 9899 if (!strtab)
0429c154
MS
9900 {
9901 free (symbols);
9902 break;
9903 }
252b5132 9904
8b73c356
NC
9905 printf (_("\nVersion symbols section '%s' contains %lu entries:\n"),
9906 printable_section_name (section), (unsigned long) total);
252b5132
RH
9907
9908 printf (_(" Addr: "));
9909 printf_vma (section->sh_addr);
72de5009 9910 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
1b228002 9911 (unsigned long) section->sh_offset, section->sh_link,
74e1a04b 9912 printable_section_name (link_section));
252b5132 9913
d3ba0551
AM
9914 off = offset_from_vma (file,
9915 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
9916 total * sizeof (short));
3f5e193b
NC
9917 edata = (unsigned char *) get_data (NULL, file, off, total,
9918 sizeof (short),
9919 _("version symbol data"));
a6e9f9df
AM
9920 if (!edata)
9921 {
9922 free (strtab);
0429c154 9923 free (symbols);
a6e9f9df
AM
9924 break;
9925 }
252b5132 9926
3f5e193b 9927 data = (short unsigned int *) cmalloc (total, sizeof (short));
252b5132
RH
9928
9929 for (cnt = total; cnt --;)
b34976b6
AM
9930 data[cnt] = byte_get (edata + cnt * sizeof (short),
9931 sizeof (short));
252b5132
RH
9932
9933 free (edata);
9934
9935 for (cnt = 0; cnt < total; cnt += 4)
9936 {
9937 int j, nn;
ab273396
AM
9938 char *name;
9939 char *invalid = _("*invalid*");
252b5132
RH
9940
9941 printf (" %03x:", cnt);
9942
9943 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
b34976b6 9944 switch (data[cnt + j])
252b5132
RH
9945 {
9946 case 0:
9947 fputs (_(" 0 (*local*) "), stdout);
9948 break;
9949
9950 case 1:
9951 fputs (_(" 1 (*global*) "), stdout);
9952 break;
9953
9954 default:
c244d050
NC
9955 nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
9956 data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
252b5132 9957
dd24e3da 9958 /* If this index value is greater than the size of the symbols
ba5cdace
NC
9959 array, break to avoid an out-of-bounds read. */
9960 if ((unsigned long)(cnt + j) >= num_syms)
dd24e3da
NC
9961 {
9962 warn (_("invalid index into symbol array\n"));
9963 break;
9964 }
9965
ab273396
AM
9966 name = NULL;
9967 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
252b5132 9968 {
b34976b6
AM
9969 Elf_Internal_Verneed ivn;
9970 unsigned long offset;
252b5132 9971
d93f0186
NC
9972 offset = offset_from_vma
9973 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
9974 sizeof (Elf_External_Verneed));
252b5132 9975
b34976b6 9976 do
252b5132 9977 {
b34976b6
AM
9978 Elf_Internal_Vernaux ivna;
9979 Elf_External_Verneed evn;
9980 Elf_External_Vernaux evna;
9981 unsigned long a_off;
252b5132 9982
59245841
NC
9983 if (get_data (&evn, file, offset, sizeof (evn), 1,
9984 _("version need")) == NULL)
9985 break;
0b4362b0 9986
252b5132
RH
9987 ivn.vn_aux = BYTE_GET (evn.vn_aux);
9988 ivn.vn_next = BYTE_GET (evn.vn_next);
9989
9990 a_off = offset + ivn.vn_aux;
9991
9992 do
9993 {
59245841
NC
9994 if (get_data (&evna, file, a_off, sizeof (evna),
9995 1, _("version need aux (2)")) == NULL)
9996 {
9997 ivna.vna_next = 0;
9998 ivna.vna_other = 0;
9999 }
10000 else
10001 {
10002 ivna.vna_next = BYTE_GET (evna.vna_next);
10003 ivna.vna_other = BYTE_GET (evna.vna_other);
10004 }
252b5132
RH
10005
10006 a_off += ivna.vna_next;
10007 }
b34976b6 10008 while (ivna.vna_other != data[cnt + j]
252b5132
RH
10009 && ivna.vna_next != 0);
10010
b34976b6 10011 if (ivna.vna_other == data[cnt + j])
252b5132
RH
10012 {
10013 ivna.vna_name = BYTE_GET (evna.vna_name);
10014
54806181 10015 if (ivna.vna_name >= string_sec->sh_size)
ab273396 10016 name = invalid;
54806181
AM
10017 else
10018 name = strtab + ivna.vna_name;
252b5132
RH
10019 break;
10020 }
10021
10022 offset += ivn.vn_next;
10023 }
10024 while (ivn.vn_next);
10025 }
00d93f34 10026
ab273396 10027 if (data[cnt + j] != 0x8001
b34976b6 10028 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
252b5132 10029 {
b34976b6
AM
10030 Elf_Internal_Verdef ivd;
10031 Elf_External_Verdef evd;
10032 unsigned long offset;
252b5132 10033
d93f0186
NC
10034 offset = offset_from_vma
10035 (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10036 sizeof evd);
252b5132
RH
10037
10038 do
10039 {
59245841
NC
10040 if (get_data (&evd, file, offset, sizeof (evd), 1,
10041 _("version def")) == NULL)
10042 {
10043 ivd.vd_next = 0;
948f632f 10044 /* PR 17531: file: 046-1082287-0.004. */
3102e897
NC
10045 ivd.vd_ndx = (data[cnt + j] & VERSYM_VERSION) + 1;
10046 break;
59245841
NC
10047 }
10048 else
10049 {
10050 ivd.vd_next = BYTE_GET (evd.vd_next);
10051 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10052 }
252b5132
RH
10053
10054 offset += ivd.vd_next;
10055 }
c244d050 10056 while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
252b5132
RH
10057 && ivd.vd_next != 0);
10058
c244d050 10059 if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
252b5132 10060 {
b34976b6
AM
10061 Elf_External_Verdaux evda;
10062 Elf_Internal_Verdaux ivda;
252b5132
RH
10063
10064 ivd.vd_aux = BYTE_GET (evd.vd_aux);
10065
59245841
NC
10066 if (get_data (&evda, file,
10067 offset - ivd.vd_next + ivd.vd_aux,
10068 sizeof (evda), 1,
10069 _("version def aux")) == NULL)
10070 break;
252b5132
RH
10071
10072 ivda.vda_name = BYTE_GET (evda.vda_name);
10073
54806181 10074 if (ivda.vda_name >= string_sec->sh_size)
ab273396
AM
10075 name = invalid;
10076 else if (name != NULL && name != invalid)
10077 name = _("*both*");
54806181
AM
10078 else
10079 name = strtab + ivda.vda_name;
252b5132
RH
10080 }
10081 }
ab273396
AM
10082 if (name != NULL)
10083 nn += printf ("(%s%-*s",
10084 name,
10085 12 - (int) strlen (name),
10086 ")");
252b5132
RH
10087
10088 if (nn < 18)
10089 printf ("%*c", 18 - nn, ' ');
10090 }
10091
10092 putchar ('\n');
10093 }
10094
10095 free (data);
10096 free (strtab);
10097 free (symbols);
10098 }
10099 break;
103f02d3 10100
252b5132
RH
10101 default:
10102 break;
10103 }
10104 }
10105
10106 if (! found)
10107 printf (_("\nNo version information found in this file.\n"));
10108
10109 return 1;
10110}
10111
d1133906 10112static const char *
d3ba0551 10113get_symbol_binding (unsigned int binding)
252b5132 10114{
b34976b6 10115 static char buff[32];
252b5132
RH
10116
10117 switch (binding)
10118 {
b34976b6
AM
10119 case STB_LOCAL: return "LOCAL";
10120 case STB_GLOBAL: return "GLOBAL";
10121 case STB_WEAK: return "WEAK";
252b5132
RH
10122 default:
10123 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
e9e44622
JJ
10124 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
10125 binding);
252b5132 10126 else if (binding >= STB_LOOS && binding <= STB_HIOS)
3e7a7d11
NC
10127 {
10128 if (binding == STB_GNU_UNIQUE
9c55345c
TS
10129 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10130 /* GNU is still using the default value 0. */
3e7a7d11
NC
10131 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10132 return "UNIQUE";
10133 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
10134 }
252b5132 10135 else
e9e44622 10136 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
252b5132
RH
10137 return buff;
10138 }
10139}
10140
d1133906 10141static const char *
d3ba0551 10142get_symbol_type (unsigned int type)
252b5132 10143{
b34976b6 10144 static char buff[32];
252b5132
RH
10145
10146 switch (type)
10147 {
b34976b6
AM
10148 case STT_NOTYPE: return "NOTYPE";
10149 case STT_OBJECT: return "OBJECT";
10150 case STT_FUNC: return "FUNC";
10151 case STT_SECTION: return "SECTION";
10152 case STT_FILE: return "FILE";
10153 case STT_COMMON: return "COMMON";
10154 case STT_TLS: return "TLS";
15ab5209
DB
10155 case STT_RELC: return "RELC";
10156 case STT_SRELC: return "SRELC";
252b5132
RH
10157 default:
10158 if (type >= STT_LOPROC && type <= STT_HIPROC)
df75f1af 10159 {
3510a7b8
NC
10160 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
10161 return "THUMB_FUNC";
103f02d3 10162
351b4b40 10163 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
103f02d3
UD
10164 return "REGISTER";
10165
10166 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
10167 return "PARISC_MILLI";
10168
e9e44622 10169 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
df75f1af 10170 }
252b5132 10171 else if (type >= STT_LOOS && type <= STT_HIOS)
103f02d3
UD
10172 {
10173 if (elf_header.e_machine == EM_PARISC)
10174 {
10175 if (type == STT_HP_OPAQUE)
10176 return "HP_OPAQUE";
10177 if (type == STT_HP_STUB)
10178 return "HP_STUB";
10179 }
10180
d8045f23 10181 if (type == STT_GNU_IFUNC
9c55345c 10182 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
83c257ca 10183 || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
9c55345c 10184 /* GNU is still using the default value 0. */
d8045f23
NC
10185 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10186 return "IFUNC";
10187
e9e44622 10188 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
103f02d3 10189 }
252b5132 10190 else
e9e44622 10191 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
252b5132
RH
10192 return buff;
10193 }
10194}
10195
d1133906 10196static const char *
d3ba0551 10197get_symbol_visibility (unsigned int visibility)
d1133906
NC
10198{
10199 switch (visibility)
10200 {
b34976b6
AM
10201 case STV_DEFAULT: return "DEFAULT";
10202 case STV_INTERNAL: return "INTERNAL";
10203 case STV_HIDDEN: return "HIDDEN";
d1133906 10204 case STV_PROTECTED: return "PROTECTED";
bee0ee85
NC
10205 default:
10206 error (_("Unrecognized visibility value: %u"), visibility);
10207 return _("<unknown>");
d1133906
NC
10208 }
10209}
10210
5e2b0d47
NC
10211static const char *
10212get_mips_symbol_other (unsigned int other)
10213{
10214 switch (other)
10215 {
df58fc94
RS
10216 case STO_OPTIONAL:
10217 return "OPTIONAL";
10218 case STO_MIPS_PLT:
10219 return "MIPS PLT";
10220 case STO_MIPS_PIC:
10221 return "MIPS PIC";
10222 case STO_MICROMIPS:
10223 return "MICROMIPS";
10224 case STO_MICROMIPS | STO_MIPS_PIC:
10225 return "MICROMIPS, MIPS PIC";
10226 case STO_MIPS16:
10227 return "MIPS16";
10228 default:
10229 return NULL;
5e2b0d47
NC
10230 }
10231}
10232
28f997cf
TG
10233static const char *
10234get_ia64_symbol_other (unsigned int other)
10235{
10236 if (is_ia64_vms ())
10237 {
10238 static char res[32];
10239
10240 res[0] = 0;
10241
10242 /* Function types is for images and .STB files only. */
10243 switch (elf_header.e_type)
10244 {
10245 case ET_DYN:
10246 case ET_EXEC:
10247 switch (VMS_ST_FUNC_TYPE (other))
10248 {
10249 case VMS_SFT_CODE_ADDR:
10250 strcat (res, " CA");
10251 break;
10252 case VMS_SFT_SYMV_IDX:
10253 strcat (res, " VEC");
10254 break;
10255 case VMS_SFT_FD:
10256 strcat (res, " FD");
10257 break;
10258 case VMS_SFT_RESERVE:
10259 strcat (res, " RSV");
10260 break;
10261 default:
bee0ee85
NC
10262 warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
10263 VMS_ST_FUNC_TYPE (other));
10264 strcat (res, " <unknown>");
10265 break;
28f997cf
TG
10266 }
10267 break;
10268 default:
10269 break;
10270 }
10271 switch (VMS_ST_LINKAGE (other))
10272 {
10273 case VMS_STL_IGNORE:
10274 strcat (res, " IGN");
10275 break;
10276 case VMS_STL_RESERVE:
10277 strcat (res, " RSV");
10278 break;
10279 case VMS_STL_STD:
10280 strcat (res, " STD");
10281 break;
10282 case VMS_STL_LNK:
10283 strcat (res, " LNK");
10284 break;
10285 default:
bee0ee85
NC
10286 warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
10287 VMS_ST_LINKAGE (other));
10288 strcat (res, " <unknown>");
10289 break;
28f997cf
TG
10290 }
10291
10292 if (res[0] != 0)
10293 return res + 1;
10294 else
10295 return res;
10296 }
10297 return NULL;
10298}
10299
6911b7dc
AM
10300static const char *
10301get_ppc64_symbol_other (unsigned int other)
10302{
10303 if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
10304 {
10305 static char buf[32];
10306 snprintf (buf, sizeof buf, _("<localentry>: %d"),
10307 PPC64_LOCAL_ENTRY_OFFSET (other));
10308 return buf;
10309 }
10310 return NULL;
10311}
10312
5e2b0d47
NC
10313static const char *
10314get_symbol_other (unsigned int other)
10315{
10316 const char * result = NULL;
10317 static char buff [32];
10318
10319 if (other == 0)
10320 return "";
10321
10322 switch (elf_header.e_machine)
10323 {
10324 case EM_MIPS:
10325 result = get_mips_symbol_other (other);
28f997cf
TG
10326 break;
10327 case EM_IA_64:
10328 result = get_ia64_symbol_other (other);
10329 break;
6911b7dc
AM
10330 case EM_PPC64:
10331 result = get_ppc64_symbol_other (other);
10332 break;
5e2b0d47
NC
10333 default:
10334 break;
10335 }
10336
10337 if (result)
10338 return result;
10339
10340 snprintf (buff, sizeof buff, _("<other>: %x"), other);
10341 return buff;
10342}
10343
d1133906 10344static const char *
d3ba0551 10345get_symbol_index_type (unsigned int type)
252b5132 10346{
b34976b6 10347 static char buff[32];
5cf1065c 10348
252b5132
RH
10349 switch (type)
10350 {
b34976b6
AM
10351 case SHN_UNDEF: return "UND";
10352 case SHN_ABS: return "ABS";
10353 case SHN_COMMON: return "COM";
252b5132 10354 default:
9ce701e2
L
10355 if (type == SHN_IA_64_ANSI_COMMON
10356 && elf_header.e_machine == EM_IA_64
10357 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
10358 return "ANSI_COM";
8a9036a4 10359 else if ((elf_header.e_machine == EM_X86_64
7a9068fe
L
10360 || elf_header.e_machine == EM_L1OM
10361 || elf_header.e_machine == EM_K1OM)
3b22753a
L
10362 && type == SHN_X86_64_LCOMMON)
10363 return "LARGE_COM";
ac145307
BS
10364 else if ((type == SHN_MIPS_SCOMMON
10365 && elf_header.e_machine == EM_MIPS)
10366 || (type == SHN_TIC6X_SCOMMON
10367 && elf_header.e_machine == EM_TI_C6000))
172553c7
TS
10368 return "SCOM";
10369 else if (type == SHN_MIPS_SUNDEFINED
10370 && elf_header.e_machine == EM_MIPS)
10371 return "SUND";
9ce701e2 10372 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
4fbb74a6 10373 sprintf (buff, "PRC[0x%04x]", type & 0xffff);
252b5132 10374 else if (type >= SHN_LOOS && type <= SHN_HIOS)
4fbb74a6
AM
10375 sprintf (buff, "OS [0x%04x]", type & 0xffff);
10376 else if (type >= SHN_LORESERVE)
10377 sprintf (buff, "RSV[0x%04x]", type & 0xffff);
c6d8cab4 10378 else if (type >= elf_header.e_shnum)
e0a31db1 10379 sprintf (buff, _("bad section index[%3d]"), type);
252b5132 10380 else
232e7cb8 10381 sprintf (buff, "%3d", type);
5cf1065c 10382 break;
252b5132 10383 }
5cf1065c
NC
10384
10385 return buff;
252b5132
RH
10386}
10387
66543521 10388static bfd_vma *
57028622 10389get_dynamic_data (FILE * file, bfd_size_type number, unsigned int ent_size)
252b5132 10390{
2cf0635d
NC
10391 unsigned char * e_data;
10392 bfd_vma * i_data;
252b5132 10393
57028622
NC
10394 /* If the size_t type is smaller than the bfd_size_type, eg because
10395 you are building a 32-bit tool on a 64-bit host, then make sure
10396 that when (number) is cast to (size_t) no information is lost. */
10397 if (sizeof (size_t) < sizeof (bfd_size_type)
10398 && (bfd_size_type) ((size_t) number) != number)
10399 {
ed754a13
AM
10400 error (_("Size truncation prevents reading %" BFD_VMA_FMT "u"
10401 " elements of size %u\n"),
10402 number, ent_size);
57028622
NC
10403 return NULL;
10404 }
948f632f 10405
3102e897
NC
10406 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
10407 attempting to allocate memory when the read is bound to fail. */
10408 if (ent_size * number > current_file_size)
10409 {
ed754a13
AM
10410 error (_("Invalid number of dynamic entries: %" BFD_VMA_FMT "u\n"),
10411 number);
3102e897
NC
10412 return NULL;
10413 }
10414
57028622 10415 e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
252b5132
RH
10416 if (e_data == NULL)
10417 {
ed754a13
AM
10418 error (_("Out of memory reading %" BFD_VMA_FMT "u dynamic entries\n"),
10419 number);
252b5132
RH
10420 return NULL;
10421 }
10422
57028622 10423 if (fread (e_data, ent_size, (size_t) number, file) != number)
252b5132 10424 {
ed754a13
AM
10425 error (_("Unable to read in %" BFD_VMA_FMT "u bytes of dynamic data\n"),
10426 number * ent_size);
3102e897 10427 free (e_data);
252b5132
RH
10428 return NULL;
10429 }
10430
57028622 10431 i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
252b5132
RH
10432 if (i_data == NULL)
10433 {
ed754a13
AM
10434 error (_("Out of memory allocating space for %" BFD_VMA_FMT "u"
10435 " dynamic entries\n"),
10436 number);
252b5132
RH
10437 free (e_data);
10438 return NULL;
10439 }
10440
10441 while (number--)
66543521 10442 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
252b5132
RH
10443
10444 free (e_data);
10445
10446 return i_data;
10447}
10448
6bd1a22c
L
10449static void
10450print_dynamic_symbol (bfd_vma si, unsigned long hn)
10451{
2cf0635d 10452 Elf_Internal_Sym * psym;
6bd1a22c
L
10453 int n;
10454
6bd1a22c
L
10455 n = print_vma (si, DEC_5);
10456 if (n < 5)
0b4362b0 10457 fputs (&" "[n], stdout);
6bd1a22c 10458 printf (" %3lu: ", hn);
e0a31db1
NC
10459
10460 if (dynamic_symbols == NULL || si >= num_dynamic_syms)
10461 {
3102e897
NC
10462 printf (_("<No info available for dynamic symbol number %lu>\n"),
10463 (unsigned long) si);
e0a31db1
NC
10464 return;
10465 }
10466
10467 psym = dynamic_symbols + si;
6bd1a22c
L
10468 print_vma (psym->st_value, LONG_HEX);
10469 putchar (' ');
10470 print_vma (psym->st_size, DEC_5);
10471
f4be36b3
AM
10472 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10473 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
10474 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
6bd1a22c
L
10475 /* Check to see if any other bits in the st_other field are set.
10476 Note - displaying this information disrupts the layout of the
10477 table being generated, but for the moment this case is very
10478 rare. */
10479 if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
10480 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
10481 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
10482 if (VALID_DYNAMIC_NAME (psym->st_name))
10483 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
10484 else
2b692964 10485 printf (_(" <corrupt: %14ld>"), psym->st_name);
6bd1a22c
L
10486 putchar ('\n');
10487}
10488
bb4d2ac2
L
10489static const char *
10490get_symbol_version_string (FILE *file, int is_dynsym,
10491 const char *strtab,
10492 unsigned long int strtab_size,
10493 unsigned int si, Elf_Internal_Sym *psym,
10494 enum versioned_symbol_info *sym_info,
10495 unsigned short *vna_other)
10496{
ab273396
AM
10497 unsigned char data[2];
10498 unsigned short vers_data;
10499 unsigned long offset;
bb4d2ac2 10500
ab273396
AM
10501 if (!is_dynsym
10502 || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
10503 return NULL;
bb4d2ac2 10504
ab273396
AM
10505 offset = offset_from_vma (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10506 sizeof data + si * sizeof (vers_data));
bb4d2ac2 10507
ab273396
AM
10508 if (get_data (&data, file, offset + si * sizeof (vers_data),
10509 sizeof (data), 1, _("version data")) == NULL)
10510 return NULL;
10511
10512 vers_data = byte_get (data, 2);
bb4d2ac2 10513
ab273396
AM
10514 if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data <= 1)
10515 return NULL;
bb4d2ac2 10516
ab273396
AM
10517 /* Usually we'd only see verdef for defined symbols, and verneed for
10518 undefined symbols. However, symbols defined by the linker in
10519 .dynbss for variables copied from a shared library in order to
10520 avoid text relocations are defined yet have verneed. We could
10521 use a heuristic to detect the special case, for example, check
10522 for verneed first on symbols defined in SHT_NOBITS sections, but
10523 it is simpler and more reliable to just look for both verdef and
10524 verneed. .dynbss might not be mapped to a SHT_NOBITS section. */
bb4d2ac2 10525
ab273396
AM
10526 if (psym->st_shndx != SHN_UNDEF
10527 && vers_data != 0x8001
10528 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10529 {
10530 Elf_Internal_Verdef ivd;
10531 Elf_Internal_Verdaux ivda;
10532 Elf_External_Verdaux evda;
10533 unsigned long off;
bb4d2ac2 10534
ab273396
AM
10535 off = offset_from_vma (file,
10536 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10537 sizeof (Elf_External_Verdef));
10538
10539 do
bb4d2ac2 10540 {
ab273396
AM
10541 Elf_External_Verdef evd;
10542
10543 if (get_data (&evd, file, off, sizeof (evd), 1,
10544 _("version def")) == NULL)
10545 {
10546 ivd.vd_ndx = 0;
10547 ivd.vd_aux = 0;
10548 ivd.vd_next = 0;
10549 }
10550 else
bb4d2ac2 10551 {
ab273396
AM
10552 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10553 ivd.vd_aux = BYTE_GET (evd.vd_aux);
10554 ivd.vd_next = BYTE_GET (evd.vd_next);
10555 }
bb4d2ac2 10556
ab273396
AM
10557 off += ivd.vd_next;
10558 }
10559 while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
bb4d2ac2 10560
ab273396
AM
10561 if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
10562 {
10563 off -= ivd.vd_next;
10564 off += ivd.vd_aux;
bb4d2ac2 10565
ab273396
AM
10566 if (get_data (&evda, file, off, sizeof (evda), 1,
10567 _("version def aux")) != NULL)
10568 {
10569 ivda.vda_name = BYTE_GET (evda.vda_name);
bb4d2ac2 10570
ab273396
AM
10571 if (psym->st_name != ivda.vda_name)
10572 {
10573 *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
10574 ? symbol_hidden : symbol_public);
10575 return (ivda.vda_name < strtab_size
10576 ? strtab + ivda.vda_name : _("<corrupt>"));
10577 }
10578 }
10579 }
10580 }
bb4d2ac2 10581
ab273396
AM
10582 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10583 {
10584 Elf_External_Verneed evn;
10585 Elf_Internal_Verneed ivn;
10586 Elf_Internal_Vernaux ivna;
bb4d2ac2 10587
ab273396
AM
10588 offset = offset_from_vma (file,
10589 version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10590 sizeof evn);
10591 do
10592 {
10593 unsigned long vna_off;
bb4d2ac2 10594
ab273396
AM
10595 if (get_data (&evn, file, offset, sizeof (evn), 1,
10596 _("version need")) == NULL)
10597 {
10598 ivna.vna_next = 0;
10599 ivna.vna_other = 0;
10600 ivna.vna_name = 0;
10601 break;
10602 }
bb4d2ac2 10603
ab273396
AM
10604 ivn.vn_aux = BYTE_GET (evn.vn_aux);
10605 ivn.vn_next = BYTE_GET (evn.vn_next);
bb4d2ac2 10606
ab273396 10607 vna_off = offset + ivn.vn_aux;
bb4d2ac2 10608
ab273396
AM
10609 do
10610 {
10611 Elf_External_Vernaux evna;
bb4d2ac2 10612
ab273396
AM
10613 if (get_data (&evna, file, vna_off, sizeof (evna), 1,
10614 _("version need aux (3)")) == NULL)
bb4d2ac2 10615 {
ab273396
AM
10616 ivna.vna_next = 0;
10617 ivna.vna_other = 0;
10618 ivna.vna_name = 0;
bb4d2ac2 10619 }
bb4d2ac2 10620 else
bb4d2ac2 10621 {
ab273396
AM
10622 ivna.vna_other = BYTE_GET (evna.vna_other);
10623 ivna.vna_next = BYTE_GET (evna.vna_next);
10624 ivna.vna_name = BYTE_GET (evna.vna_name);
10625 }
bb4d2ac2 10626
ab273396
AM
10627 vna_off += ivna.vna_next;
10628 }
10629 while (ivna.vna_other != vers_data && ivna.vna_next != 0);
bb4d2ac2 10630
ab273396
AM
10631 if (ivna.vna_other == vers_data)
10632 break;
bb4d2ac2 10633
ab273396
AM
10634 offset += ivn.vn_next;
10635 }
10636 while (ivn.vn_next != 0);
bb4d2ac2 10637
ab273396
AM
10638 if (ivna.vna_other == vers_data)
10639 {
10640 *sym_info = symbol_undefined;
10641 *vna_other = ivna.vna_other;
10642 return (ivna.vna_name < strtab_size
10643 ? strtab + ivna.vna_name : _("<corrupt>"));
bb4d2ac2
L
10644 }
10645 }
ab273396 10646 return NULL;
bb4d2ac2
L
10647}
10648
e3c8793a 10649/* Dump the symbol table. */
252b5132 10650static int
2cf0635d 10651process_symbol_table (FILE * file)
252b5132 10652{
2cf0635d 10653 Elf_Internal_Shdr * section;
8b73c356
NC
10654 bfd_size_type nbuckets = 0;
10655 bfd_size_type nchains = 0;
2cf0635d
NC
10656 bfd_vma * buckets = NULL;
10657 bfd_vma * chains = NULL;
fdc90cb4 10658 bfd_vma ngnubuckets = 0;
2cf0635d
NC
10659 bfd_vma * gnubuckets = NULL;
10660 bfd_vma * gnuchains = NULL;
6bd1a22c 10661 bfd_vma gnusymidx = 0;
071436c6 10662 bfd_size_type ngnuchains = 0;
252b5132 10663
2c610e4b 10664 if (!do_syms && !do_dyn_syms && !do_histogram)
252b5132
RH
10665 return 1;
10666
6bd1a22c
L
10667 if (dynamic_info[DT_HASH]
10668 && (do_histogram
2c610e4b
L
10669 || (do_using_dynamic
10670 && !do_dyn_syms
10671 && dynamic_strings != NULL)))
252b5132 10672 {
66543521
AM
10673 unsigned char nb[8];
10674 unsigned char nc[8];
8b73c356 10675 unsigned int hash_ent_size = 4;
66543521
AM
10676
10677 if ((elf_header.e_machine == EM_ALPHA
10678 || elf_header.e_machine == EM_S390
10679 || elf_header.e_machine == EM_S390_OLD)
10680 && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
10681 hash_ent_size = 8;
10682
fb52b2f4
NC
10683 if (fseek (file,
10684 (archive_file_offset
10685 + offset_from_vma (file, dynamic_info[DT_HASH],
10686 sizeof nb + sizeof nc)),
d93f0186 10687 SEEK_SET))
252b5132 10688 {
591a748a 10689 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 10690 goto no_hash;
252b5132
RH
10691 }
10692
66543521 10693 if (fread (nb, hash_ent_size, 1, file) != 1)
252b5132
RH
10694 {
10695 error (_("Failed to read in number of buckets\n"));
d3a44ec6 10696 goto no_hash;
252b5132
RH
10697 }
10698
66543521 10699 if (fread (nc, hash_ent_size, 1, file) != 1)
252b5132
RH
10700 {
10701 error (_("Failed to read in number of chains\n"));
d3a44ec6 10702 goto no_hash;
252b5132
RH
10703 }
10704
66543521
AM
10705 nbuckets = byte_get (nb, hash_ent_size);
10706 nchains = byte_get (nc, hash_ent_size);
252b5132 10707
66543521
AM
10708 buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
10709 chains = get_dynamic_data (file, nchains, hash_ent_size);
252b5132 10710
d3a44ec6 10711 no_hash:
252b5132 10712 if (buckets == NULL || chains == NULL)
d3a44ec6
JJ
10713 {
10714 if (do_using_dynamic)
10715 return 0;
10716 free (buckets);
10717 free (chains);
10718 buckets = NULL;
10719 chains = NULL;
10720 nbuckets = 0;
10721 nchains = 0;
10722 }
252b5132
RH
10723 }
10724
6bd1a22c
L
10725 if (dynamic_info_DT_GNU_HASH
10726 && (do_histogram
2c610e4b
L
10727 || (do_using_dynamic
10728 && !do_dyn_syms
10729 && dynamic_strings != NULL)))
252b5132 10730 {
6bd1a22c
L
10731 unsigned char nb[16];
10732 bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
10733 bfd_vma buckets_vma;
10734
10735 if (fseek (file,
10736 (archive_file_offset
10737 + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
10738 sizeof nb)),
10739 SEEK_SET))
10740 {
10741 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 10742 goto no_gnu_hash;
6bd1a22c 10743 }
252b5132 10744
6bd1a22c
L
10745 if (fread (nb, 16, 1, file) != 1)
10746 {
10747 error (_("Failed to read in number of buckets\n"));
d3a44ec6 10748 goto no_gnu_hash;
6bd1a22c
L
10749 }
10750
10751 ngnubuckets = byte_get (nb, 4);
10752 gnusymidx = byte_get (nb + 4, 4);
10753 bitmaskwords = byte_get (nb + 8, 4);
10754 buckets_vma = dynamic_info_DT_GNU_HASH + 16;
f7a99963 10755 if (is_32bit_elf)
6bd1a22c 10756 buckets_vma += bitmaskwords * 4;
f7a99963 10757 else
6bd1a22c 10758 buckets_vma += bitmaskwords * 8;
252b5132 10759
6bd1a22c
L
10760 if (fseek (file,
10761 (archive_file_offset
10762 + offset_from_vma (file, buckets_vma, 4)),
10763 SEEK_SET))
252b5132 10764 {
6bd1a22c 10765 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 10766 goto no_gnu_hash;
6bd1a22c
L
10767 }
10768
10769 gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
252b5132 10770
6bd1a22c 10771 if (gnubuckets == NULL)
d3a44ec6 10772 goto no_gnu_hash;
6bd1a22c
L
10773
10774 for (i = 0; i < ngnubuckets; i++)
10775 if (gnubuckets[i] != 0)
10776 {
10777 if (gnubuckets[i] < gnusymidx)
10778 return 0;
10779
10780 if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
10781 maxchain = gnubuckets[i];
10782 }
10783
10784 if (maxchain == 0xffffffff)
d3a44ec6 10785 goto no_gnu_hash;
6bd1a22c
L
10786
10787 maxchain -= gnusymidx;
10788
10789 if (fseek (file,
10790 (archive_file_offset
10791 + offset_from_vma (file, buckets_vma
10792 + 4 * (ngnubuckets + maxchain), 4)),
10793 SEEK_SET))
10794 {
10795 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 10796 goto no_gnu_hash;
6bd1a22c
L
10797 }
10798
10799 do
10800 {
10801 if (fread (nb, 4, 1, file) != 1)
252b5132 10802 {
6bd1a22c 10803 error (_("Failed to determine last chain length\n"));
d3a44ec6 10804 goto no_gnu_hash;
6bd1a22c 10805 }
252b5132 10806
6bd1a22c 10807 if (maxchain + 1 == 0)
d3a44ec6 10808 goto no_gnu_hash;
252b5132 10809
6bd1a22c
L
10810 ++maxchain;
10811 }
10812 while ((byte_get (nb, 4) & 1) == 0);
76da6bbe 10813
6bd1a22c
L
10814 if (fseek (file,
10815 (archive_file_offset
10816 + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
10817 SEEK_SET))
10818 {
10819 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 10820 goto no_gnu_hash;
6bd1a22c
L
10821 }
10822
10823 gnuchains = get_dynamic_data (file, maxchain, 4);
071436c6 10824 ngnuchains = maxchain;
6bd1a22c 10825
d3a44ec6 10826 no_gnu_hash:
6bd1a22c 10827 if (gnuchains == NULL)
d3a44ec6
JJ
10828 {
10829 free (gnubuckets);
d3a44ec6
JJ
10830 gnubuckets = NULL;
10831 ngnubuckets = 0;
f64fddf1
NC
10832 if (do_using_dynamic)
10833 return 0;
d3a44ec6 10834 }
6bd1a22c
L
10835 }
10836
10837 if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
10838 && do_syms
10839 && do_using_dynamic
3102e897
NC
10840 && dynamic_strings != NULL
10841 && dynamic_symbols != NULL)
6bd1a22c
L
10842 {
10843 unsigned long hn;
10844
10845 if (dynamic_info[DT_HASH])
10846 {
10847 bfd_vma si;
10848
10849 printf (_("\nSymbol table for image:\n"));
10850 if (is_32bit_elf)
10851 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10852 else
10853 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10854
10855 for (hn = 0; hn < nbuckets; hn++)
10856 {
10857 if (! buckets[hn])
10858 continue;
10859
10860 for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
10861 print_dynamic_symbol (si, hn);
252b5132
RH
10862 }
10863 }
6bd1a22c
L
10864
10865 if (dynamic_info_DT_GNU_HASH)
10866 {
10867 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
10868 if (is_32bit_elf)
10869 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10870 else
10871 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10872
10873 for (hn = 0; hn < ngnubuckets; ++hn)
10874 if (gnubuckets[hn] != 0)
10875 {
10876 bfd_vma si = gnubuckets[hn];
10877 bfd_vma off = si - gnusymidx;
10878
10879 do
10880 {
10881 print_dynamic_symbol (si, hn);
10882 si++;
10883 }
071436c6 10884 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
6bd1a22c
L
10885 }
10886 }
252b5132 10887 }
8b73c356
NC
10888 else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
10889 && section_headers != NULL)
252b5132 10890 {
b34976b6 10891 unsigned int i;
252b5132
RH
10892
10893 for (i = 0, section = section_headers;
10894 i < elf_header.e_shnum;
10895 i++, section++)
10896 {
b34976b6 10897 unsigned int si;
2cf0635d 10898 char * strtab = NULL;
c256ffe7 10899 unsigned long int strtab_size = 0;
2cf0635d
NC
10900 Elf_Internal_Sym * symtab;
10901 Elf_Internal_Sym * psym;
ba5cdace 10902 unsigned long num_syms;
252b5132 10903
2c610e4b
L
10904 if ((section->sh_type != SHT_SYMTAB
10905 && section->sh_type != SHT_DYNSYM)
10906 || (!do_syms
10907 && section->sh_type == SHT_SYMTAB))
252b5132
RH
10908 continue;
10909
dd24e3da
NC
10910 if (section->sh_entsize == 0)
10911 {
10912 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
74e1a04b 10913 printable_section_name (section));
dd24e3da
NC
10914 continue;
10915 }
10916
252b5132 10917 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
74e1a04b 10918 printable_section_name (section),
252b5132 10919 (unsigned long) (section->sh_size / section->sh_entsize));
dd24e3da 10920
f7a99963 10921 if (is_32bit_elf)
ca47b30c 10922 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
f7a99963 10923 else
ca47b30c 10924 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
252b5132 10925
ba5cdace 10926 symtab = GET_ELF_SYMBOLS (file, section, & num_syms);
252b5132
RH
10927 if (symtab == NULL)
10928 continue;
10929
10930 if (section->sh_link == elf_header.e_shstrndx)
c256ffe7
JJ
10931 {
10932 strtab = string_table;
10933 strtab_size = string_table_length;
10934 }
4fbb74a6 10935 else if (section->sh_link < elf_header.e_shnum)
252b5132 10936 {
2cf0635d 10937 Elf_Internal_Shdr * string_sec;
252b5132 10938
4fbb74a6 10939 string_sec = section_headers + section->sh_link;
252b5132 10940
3f5e193b
NC
10941 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
10942 1, string_sec->sh_size,
10943 _("string table"));
c256ffe7 10944 strtab_size = strtab != NULL ? string_sec->sh_size : 0;
252b5132
RH
10945 }
10946
ba5cdace 10947 for (si = 0, psym = symtab; si < num_syms; si++, psym++)
252b5132 10948 {
bb4d2ac2
L
10949 const char *version_string;
10950 enum versioned_symbol_info sym_info;
10951 unsigned short vna_other;
10952
5e220199 10953 printf ("%6d: ", si);
f7a99963
NC
10954 print_vma (psym->st_value, LONG_HEX);
10955 putchar (' ');
10956 print_vma (psym->st_size, DEC_5);
d1133906
NC
10957 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10958 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
f4be36b3 10959 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
5e2b0d47
NC
10960 /* Check to see if any other bits in the st_other field are set.
10961 Note - displaying this information disrupts the layout of the
10962 table being generated, but for the moment this case is very rare. */
10963 if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
10964 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
31104126 10965 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
c256ffe7 10966 print_symbol (25, psym->st_name < strtab_size
2b692964 10967 ? strtab + psym->st_name : _("<corrupt>"));
252b5132 10968
bb4d2ac2
L
10969 version_string
10970 = get_symbol_version_string (file,
10971 section->sh_type == SHT_DYNSYM,
10972 strtab, strtab_size, si,
10973 psym, &sym_info, &vna_other);
10974 if (version_string)
252b5132 10975 {
bb4d2ac2
L
10976 if (sym_info == symbol_undefined)
10977 printf ("@%s (%d)", version_string, vna_other);
10978 else
10979 printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
10980 version_string);
252b5132
RH
10981 }
10982
10983 putchar ('\n');
10984 }
10985
10986 free (symtab);
10987 if (strtab != string_table)
10988 free (strtab);
10989 }
10990 }
10991 else if (do_syms)
10992 printf
10993 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
10994
10995 if (do_histogram && buckets != NULL)
10996 {
2cf0635d
NC
10997 unsigned long * lengths;
10998 unsigned long * counts;
66543521
AM
10999 unsigned long hn;
11000 bfd_vma si;
11001 unsigned long maxlength = 0;
11002 unsigned long nzero_counts = 0;
11003 unsigned long nsyms = 0;
94d15024 11004 unsigned long chained;
252b5132 11005
66543521
AM
11006 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
11007 (unsigned long) nbuckets);
252b5132 11008
3f5e193b 11009 lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
252b5132
RH
11010 if (lengths == NULL)
11011 {
8b73c356 11012 error (_("Out of memory allocating space for histogram buckets\n"));
252b5132
RH
11013 return 0;
11014 }
8b73c356
NC
11015
11016 printf (_(" Length Number %% of total Coverage\n"));
252b5132
RH
11017 for (hn = 0; hn < nbuckets; ++hn)
11018 {
94d15024
MF
11019 for (si = buckets[hn], chained = 0;
11020 si > 0 && si < nchains && si < nbuckets && chained <= nchains;
11021 si = chains[si], ++chained)
252b5132 11022 {
b34976b6 11023 ++nsyms;
252b5132 11024 if (maxlength < ++lengths[hn])
b34976b6 11025 ++maxlength;
252b5132 11026 }
94d15024
MF
11027
11028 /* PR binutils/17531: A corrupt binary could contain broken
11029 histogram data. Do not go into an infinite loop trying
11030 to process it. */
11031 if (chained > nchains)
11032 {
11033 error (_("histogram chain is corrupt\n"));
11034 break;
11035 }
252b5132
RH
11036 }
11037
3f5e193b 11038 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
252b5132
RH
11039 if (counts == NULL)
11040 {
b2e951ec 11041 free (lengths);
8b73c356 11042 error (_("Out of memory allocating space for histogram counts\n"));
252b5132
RH
11043 return 0;
11044 }
11045
11046 for (hn = 0; hn < nbuckets; ++hn)
b34976b6 11047 ++counts[lengths[hn]];
252b5132 11048
103f02d3 11049 if (nbuckets > 0)
252b5132 11050 {
66543521
AM
11051 unsigned long i;
11052 printf (" 0 %-10lu (%5.1f%%)\n",
103f02d3 11053 counts[0], (counts[0] * 100.0) / nbuckets);
66543521 11054 for (i = 1; i <= maxlength; ++i)
103f02d3 11055 {
66543521
AM
11056 nzero_counts += counts[i] * i;
11057 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11058 i, counts[i], (counts[i] * 100.0) / nbuckets,
103f02d3
UD
11059 (nzero_counts * 100.0) / nsyms);
11060 }
252b5132
RH
11061 }
11062
11063 free (counts);
11064 free (lengths);
11065 }
11066
11067 if (buckets != NULL)
11068 {
11069 free (buckets);
11070 free (chains);
11071 }
11072
d3a44ec6 11073 if (do_histogram && gnubuckets != NULL)
fdc90cb4 11074 {
2cf0635d
NC
11075 unsigned long * lengths;
11076 unsigned long * counts;
fdc90cb4
JJ
11077 unsigned long hn;
11078 unsigned long maxlength = 0;
11079 unsigned long nzero_counts = 0;
11080 unsigned long nsyms = 0;
fdc90cb4 11081
8b73c356
NC
11082 printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
11083 (unsigned long) ngnubuckets);
11084
3f5e193b 11085 lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
fdc90cb4
JJ
11086 if (lengths == NULL)
11087 {
8b73c356 11088 error (_("Out of memory allocating space for gnu histogram buckets\n"));
fdc90cb4
JJ
11089 return 0;
11090 }
11091
fdc90cb4
JJ
11092 printf (_(" Length Number %% of total Coverage\n"));
11093
11094 for (hn = 0; hn < ngnubuckets; ++hn)
11095 if (gnubuckets[hn] != 0)
11096 {
11097 bfd_vma off, length = 1;
11098
6bd1a22c 11099 for (off = gnubuckets[hn] - gnusymidx;
071436c6
NC
11100 /* PR 17531 file: 010-77222-0.004. */
11101 off < ngnuchains && (gnuchains[off] & 1) == 0;
11102 ++off)
fdc90cb4
JJ
11103 ++length;
11104 lengths[hn] = length;
11105 if (length > maxlength)
11106 maxlength = length;
11107 nsyms += length;
11108 }
11109
3f5e193b 11110 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
fdc90cb4
JJ
11111 if (counts == NULL)
11112 {
b2e951ec 11113 free (lengths);
8b73c356 11114 error (_("Out of memory allocating space for gnu histogram counts\n"));
fdc90cb4
JJ
11115 return 0;
11116 }
11117
11118 for (hn = 0; hn < ngnubuckets; ++hn)
11119 ++counts[lengths[hn]];
11120
11121 if (ngnubuckets > 0)
11122 {
11123 unsigned long j;
11124 printf (" 0 %-10lu (%5.1f%%)\n",
11125 counts[0], (counts[0] * 100.0) / ngnubuckets);
11126 for (j = 1; j <= maxlength; ++j)
11127 {
11128 nzero_counts += counts[j] * j;
11129 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11130 j, counts[j], (counts[j] * 100.0) / ngnubuckets,
11131 (nzero_counts * 100.0) / nsyms);
11132 }
11133 }
11134
11135 free (counts);
11136 free (lengths);
11137 free (gnubuckets);
11138 free (gnuchains);
11139 }
11140
252b5132
RH
11141 return 1;
11142}
11143
11144static int
2cf0635d 11145process_syminfo (FILE * file ATTRIBUTE_UNUSED)
252b5132 11146{
b4c96d0d 11147 unsigned int i;
252b5132
RH
11148
11149 if (dynamic_syminfo == NULL
11150 || !do_dynamic)
11151 /* No syminfo, this is ok. */
11152 return 1;
11153
11154 /* There better should be a dynamic symbol section. */
11155 if (dynamic_symbols == NULL || dynamic_strings == NULL)
11156 return 0;
11157
11158 if (dynamic_addr)
11159 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
11160 dynamic_syminfo_offset, dynamic_syminfo_nent);
11161
11162 printf (_(" Num: Name BoundTo Flags\n"));
11163 for (i = 0; i < dynamic_syminfo_nent; ++i)
11164 {
11165 unsigned short int flags = dynamic_syminfo[i].si_flags;
11166
31104126 11167 printf ("%4d: ", i);
4082ef84
NC
11168 if (i >= num_dynamic_syms)
11169 printf (_("<corrupt index>"));
11170 else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
d79b3d50
NC
11171 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
11172 else
2b692964 11173 printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
31104126 11174 putchar (' ');
252b5132
RH
11175
11176 switch (dynamic_syminfo[i].si_boundto)
11177 {
11178 case SYMINFO_BT_SELF:
11179 fputs ("SELF ", stdout);
11180 break;
11181 case SYMINFO_BT_PARENT:
11182 fputs ("PARENT ", stdout);
11183 break;
11184 default:
11185 if (dynamic_syminfo[i].si_boundto > 0
d79b3d50
NC
11186 && dynamic_syminfo[i].si_boundto < dynamic_nent
11187 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
31104126 11188 {
d79b3d50 11189 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
31104126
NC
11190 putchar (' ' );
11191 }
252b5132
RH
11192 else
11193 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
11194 break;
11195 }
11196
11197 if (flags & SYMINFO_FLG_DIRECT)
11198 printf (" DIRECT");
11199 if (flags & SYMINFO_FLG_PASSTHRU)
11200 printf (" PASSTHRU");
11201 if (flags & SYMINFO_FLG_COPY)
11202 printf (" COPY");
11203 if (flags & SYMINFO_FLG_LAZYLOAD)
11204 printf (" LAZYLOAD");
11205
11206 puts ("");
11207 }
11208
11209 return 1;
11210}
11211
cf13d699
NC
11212/* Check to see if the given reloc needs to be handled in a target specific
11213 manner. If so then process the reloc and return TRUE otherwise return
11214 FALSE. */
09c11c86 11215
cf13d699
NC
11216static bfd_boolean
11217target_specific_reloc_handling (Elf_Internal_Rela * reloc,
11218 unsigned char * start,
11219 Elf_Internal_Sym * symtab)
252b5132 11220{
cf13d699 11221 unsigned int reloc_type = get_reloc_type (reloc->r_info);
252b5132 11222
cf13d699 11223 switch (elf_header.e_machine)
252b5132 11224 {
13761a11
NC
11225 case EM_MSP430:
11226 case EM_MSP430_OLD:
11227 {
11228 static Elf_Internal_Sym * saved_sym = NULL;
11229
11230 switch (reloc_type)
11231 {
11232 case 10: /* R_MSP430_SYM_DIFF */
11233 if (uses_msp430x_relocs ())
11234 break;
11235 case 21: /* R_MSP430X_SYM_DIFF */
11236 saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11237 return TRUE;
11238
11239 case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
11240 case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
11241 goto handle_sym_diff;
0b4362b0 11242
13761a11
NC
11243 case 5: /* R_MSP430_16_BYTE */
11244 case 9: /* R_MSP430_8 */
11245 if (uses_msp430x_relocs ())
11246 break;
11247 goto handle_sym_diff;
11248
11249 case 2: /* R_MSP430_ABS16 */
11250 case 15: /* R_MSP430X_ABS16 */
11251 if (! uses_msp430x_relocs ())
11252 break;
11253 goto handle_sym_diff;
0b4362b0 11254
13761a11
NC
11255 handle_sym_diff:
11256 if (saved_sym != NULL)
11257 {
11258 bfd_vma value;
11259
11260 value = reloc->r_addend
11261 + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11262 - saved_sym->st_value);
11263
11264 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
11265
11266 saved_sym = NULL;
11267 return TRUE;
11268 }
11269 break;
11270
11271 default:
11272 if (saved_sym != NULL)
071436c6 11273 error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
13761a11
NC
11274 break;
11275 }
11276 break;
11277 }
11278
cf13d699
NC
11279 case EM_MN10300:
11280 case EM_CYGNUS_MN10300:
11281 {
11282 static Elf_Internal_Sym * saved_sym = NULL;
252b5132 11283
cf13d699
NC
11284 switch (reloc_type)
11285 {
11286 case 34: /* R_MN10300_ALIGN */
11287 return TRUE;
11288 case 33: /* R_MN10300_SYM_DIFF */
11289 saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11290 return TRUE;
11291 case 1: /* R_MN10300_32 */
11292 case 2: /* R_MN10300_16 */
11293 if (saved_sym != NULL)
11294 {
11295 bfd_vma value;
252b5132 11296
cf13d699
NC
11297 value = reloc->r_addend
11298 + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11299 - saved_sym->st_value);
252b5132 11300
cf13d699 11301 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
252b5132 11302
cf13d699
NC
11303 saved_sym = NULL;
11304 return TRUE;
11305 }
11306 break;
11307 default:
11308 if (saved_sym != NULL)
071436c6 11309 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
cf13d699
NC
11310 break;
11311 }
11312 break;
11313 }
6ff71e76
NC
11314
11315 case EM_RL78:
11316 {
11317 static bfd_vma saved_sym1 = 0;
11318 static bfd_vma saved_sym2 = 0;
11319 static bfd_vma value;
11320
11321 switch (reloc_type)
11322 {
11323 case 0x80: /* R_RL78_SYM. */
11324 saved_sym1 = saved_sym2;
11325 saved_sym2 = symtab[get_reloc_symindex (reloc->r_info)].st_value;
11326 saved_sym2 += reloc->r_addend;
11327 return TRUE;
11328
11329 case 0x83: /* R_RL78_OPsub. */
11330 value = saved_sym1 - saved_sym2;
11331 saved_sym2 = saved_sym1 = 0;
11332 return TRUE;
11333 break;
11334
11335 case 0x41: /* R_RL78_ABS32. */
11336 byte_put (start + reloc->r_offset, value, 4);
11337 value = 0;
11338 return TRUE;
11339
11340 case 0x43: /* R_RL78_ABS16. */
11341 byte_put (start + reloc->r_offset, value, 2);
11342 value = 0;
11343 return TRUE;
11344
11345 default:
11346 break;
11347 }
11348 break;
11349 }
252b5132
RH
11350 }
11351
cf13d699 11352 return FALSE;
252b5132
RH
11353}
11354
aca88567
NC
11355/* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
11356 DWARF debug sections. This is a target specific test. Note - we do not
11357 go through the whole including-target-headers-multiple-times route, (as
11358 we have already done with <elf/h8.h>) because this would become very
11359 messy and even then this function would have to contain target specific
11360 information (the names of the relocs instead of their numeric values).
11361 FIXME: This is not the correct way to solve this problem. The proper way
11362 is to have target specific reloc sizing and typing functions created by
11363 the reloc-macros.h header, in the same way that it already creates the
11364 reloc naming functions. */
11365
11366static bfd_boolean
11367is_32bit_abs_reloc (unsigned int reloc_type)
11368{
11369 switch (elf_header.e_machine)
11370 {
41e92641 11371 case EM_386:
22abe556 11372 case EM_IAMCU:
41e92641 11373 return reloc_type == 1; /* R_386_32. */
aca88567
NC
11374 case EM_68K:
11375 return reloc_type == 1; /* R_68K_32. */
11376 case EM_860:
11377 return reloc_type == 1; /* R_860_32. */
137b6b5f
AM
11378 case EM_960:
11379 return reloc_type == 2; /* R_960_32. */
a06ea964
NC
11380 case EM_AARCH64:
11381 return reloc_type == 258; /* R_AARCH64_ABS32 */
aca88567 11382 case EM_ALPHA:
137b6b5f 11383 return reloc_type == 1; /* R_ALPHA_REFLONG. */
41e92641
NC
11384 case EM_ARC:
11385 return reloc_type == 1; /* R_ARC_32. */
886a2506
NC
11386 case EM_ARC_COMPACT:
11387 case EM_ARC_COMPACT2:
11388 return reloc_type == 4; /* R_ARC_32. */
41e92641
NC
11389 case EM_ARM:
11390 return reloc_type == 2; /* R_ARM_ABS32 */
cb8f3167 11391 case EM_AVR_OLD:
aca88567
NC
11392 case EM_AVR:
11393 return reloc_type == 1;
cfb8c092
NC
11394 case EM_ADAPTEVA_EPIPHANY:
11395 return reloc_type == 3;
aca88567
NC
11396 case EM_BLACKFIN:
11397 return reloc_type == 0x12; /* R_byte4_data. */
11398 case EM_CRIS:
11399 return reloc_type == 3; /* R_CRIS_32. */
11400 case EM_CR16:
11401 return reloc_type == 3; /* R_CR16_NUM32. */
11402 case EM_CRX:
11403 return reloc_type == 15; /* R_CRX_NUM32. */
11404 case EM_CYGNUS_FRV:
11405 return reloc_type == 1;
41e92641
NC
11406 case EM_CYGNUS_D10V:
11407 case EM_D10V:
11408 return reloc_type == 6; /* R_D10V_32. */
aca88567
NC
11409 case EM_CYGNUS_D30V:
11410 case EM_D30V:
11411 return reloc_type == 12; /* R_D30V_32_NORMAL. */
41e92641
NC
11412 case EM_DLX:
11413 return reloc_type == 3; /* R_DLX_RELOC_32. */
aca88567
NC
11414 case EM_CYGNUS_FR30:
11415 case EM_FR30:
11416 return reloc_type == 3; /* R_FR30_32. */
3f8107ab
AM
11417 case EM_FT32:
11418 return reloc_type == 1; /* R_FT32_32. */
aca88567
NC
11419 case EM_H8S:
11420 case EM_H8_300:
11421 case EM_H8_300H:
11422 return reloc_type == 1; /* R_H8_DIR32. */
3730236a 11423 case EM_IA_64:
d1c4b12b
NC
11424 return reloc_type == 0x65 /* R_IA64_SECREL32LSB. */
11425 || reloc_type == 0x25; /* R_IA64_DIR32LSB. */
aca88567
NC
11426 case EM_IP2K_OLD:
11427 case EM_IP2K:
11428 return reloc_type == 2; /* R_IP2K_32. */
11429 case EM_IQ2000:
11430 return reloc_type == 2; /* R_IQ2000_32. */
84e94c90
NC
11431 case EM_LATTICEMICO32:
11432 return reloc_type == 3; /* R_LM32_32. */
ff7eeb89 11433 case EM_M32C_OLD:
aca88567
NC
11434 case EM_M32C:
11435 return reloc_type == 3; /* R_M32C_32. */
11436 case EM_M32R:
11437 return reloc_type == 34; /* R_M32R_32_RELA. */
adec12c1
AM
11438 case EM_68HC11:
11439 case EM_68HC12:
11440 return reloc_type == 6; /* R_M68HC11_32. */
aca88567
NC
11441 case EM_MCORE:
11442 return reloc_type == 1; /* R_MCORE_ADDR32. */
11443 case EM_CYGNUS_MEP:
11444 return reloc_type == 4; /* R_MEP_32. */
a3c62988
NC
11445 case EM_METAG:
11446 return reloc_type == 2; /* R_METAG_ADDR32. */
137b6b5f
AM
11447 case EM_MICROBLAZE:
11448 return reloc_type == 1; /* R_MICROBLAZE_32. */
aca88567
NC
11449 case EM_MIPS:
11450 return reloc_type == 2; /* R_MIPS_32. */
11451 case EM_MMIX:
11452 return reloc_type == 4; /* R_MMIX_32. */
11453 case EM_CYGNUS_MN10200:
11454 case EM_MN10200:
11455 return reloc_type == 1; /* R_MN10200_32. */
11456 case EM_CYGNUS_MN10300:
11457 case EM_MN10300:
11458 return reloc_type == 1; /* R_MN10300_32. */
5506d11a
AM
11459 case EM_MOXIE:
11460 return reloc_type == 1; /* R_MOXIE_32. */
aca88567
NC
11461 case EM_MSP430_OLD:
11462 case EM_MSP430:
13761a11 11463 return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32. */
aca88567
NC
11464 case EM_MT:
11465 return reloc_type == 2; /* R_MT_32. */
35c08157
KLC
11466 case EM_NDS32:
11467 return reloc_type == 20; /* R_NDS32_RELA. */
3e0873ac 11468 case EM_ALTERA_NIOS2:
36591ba1 11469 return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32. */
3e0873ac
NC
11470 case EM_NIOS32:
11471 return reloc_type == 1; /* R_NIOS_32. */
73589c9d
CS
11472 case EM_OR1K:
11473 return reloc_type == 1; /* R_OR1K_32. */
aca88567 11474 case EM_PARISC:
5fda8eca
NC
11475 return (reloc_type == 1 /* R_PARISC_DIR32. */
11476 || reloc_type == 41); /* R_PARISC_SECREL32. */
aca88567
NC
11477 case EM_PJ:
11478 case EM_PJ_OLD:
11479 return reloc_type == 1; /* R_PJ_DATA_DIR32. */
11480 case EM_PPC64:
11481 return reloc_type == 1; /* R_PPC64_ADDR32. */
11482 case EM_PPC:
11483 return reloc_type == 1; /* R_PPC_ADDR32. */
99c513f6
DD
11484 case EM_RL78:
11485 return reloc_type == 1; /* R_RL78_DIR32. */
c7927a3c
NC
11486 case EM_RX:
11487 return reloc_type == 1; /* R_RX_DIR32. */
aca88567
NC
11488 case EM_S370:
11489 return reloc_type == 1; /* R_I370_ADDR31. */
11490 case EM_S390_OLD:
11491 case EM_S390:
11492 return reloc_type == 4; /* R_S390_32. */
41e92641
NC
11493 case EM_SCORE:
11494 return reloc_type == 8; /* R_SCORE_ABS32. */
aca88567
NC
11495 case EM_SH:
11496 return reloc_type == 1; /* R_SH_DIR32. */
11497 case EM_SPARC32PLUS:
11498 case EM_SPARCV9:
11499 case EM_SPARC:
11500 return reloc_type == 3 /* R_SPARC_32. */
11501 || reloc_type == 23; /* R_SPARC_UA32. */
a7dd7d05
AM
11502 case EM_SPU:
11503 return reloc_type == 6; /* R_SPU_ADDR32 */
40b36596
JM
11504 case EM_TI_C6000:
11505 return reloc_type == 1; /* R_C6000_ABS32. */
aa137e4d
NC
11506 case EM_TILEGX:
11507 return reloc_type == 2; /* R_TILEGX_32. */
11508 case EM_TILEPRO:
11509 return reloc_type == 1; /* R_TILEPRO_32. */
aca88567
NC
11510 case EM_CYGNUS_V850:
11511 case EM_V850:
11512 return reloc_type == 6; /* R_V850_ABS32. */
708e2187
NC
11513 case EM_V800:
11514 return reloc_type == 0x33; /* R_V810_WORD. */
aca88567
NC
11515 case EM_VAX:
11516 return reloc_type == 1; /* R_VAX_32. */
619ed720
EB
11517 case EM_VISIUM:
11518 return reloc_type == 3; /* R_VISIUM_32. */
aca88567 11519 case EM_X86_64:
8a9036a4 11520 case EM_L1OM:
7a9068fe 11521 case EM_K1OM:
aca88567 11522 return reloc_type == 10; /* R_X86_64_32. */
c29aca4a
NC
11523 case EM_XC16X:
11524 case EM_C166:
11525 return reloc_type == 3; /* R_XC16C_ABS_32. */
f6c1a2d5
NC
11526 case EM_XGATE:
11527 return reloc_type == 4; /* R_XGATE_32. */
aca88567
NC
11528 case EM_XSTORMY16:
11529 return reloc_type == 1; /* R_XSTROMY16_32. */
11530 case EM_XTENSA_OLD:
11531 case EM_XTENSA:
11532 return reloc_type == 1; /* R_XTENSA_32. */
aca88567 11533 default:
bee0ee85
NC
11534 {
11535 static unsigned int prev_warn = 0;
11536
11537 /* Avoid repeating the same warning multiple times. */
11538 if (prev_warn != elf_header.e_machine)
11539 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
11540 elf_header.e_machine);
11541 prev_warn = elf_header.e_machine;
11542 return FALSE;
11543 }
aca88567
NC
11544 }
11545}
11546
11547/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11548 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
11549
11550static bfd_boolean
11551is_32bit_pcrel_reloc (unsigned int reloc_type)
11552{
11553 switch (elf_header.e_machine)
11554 {
41e92641 11555 case EM_386:
22abe556 11556 case EM_IAMCU:
3e0873ac 11557 return reloc_type == 2; /* R_386_PC32. */
aca88567 11558 case EM_68K:
3e0873ac 11559 return reloc_type == 4; /* R_68K_PC32. */
a06ea964
NC
11560 case EM_AARCH64:
11561 return reloc_type == 261; /* R_AARCH64_PREL32 */
cfb8c092
NC
11562 case EM_ADAPTEVA_EPIPHANY:
11563 return reloc_type == 6;
aca88567
NC
11564 case EM_ALPHA:
11565 return reloc_type == 10; /* R_ALPHA_SREL32. */
726c18e1
CZ
11566 case EM_ARC_COMPACT:
11567 case EM_ARC_COMPACT2:
11568 return reloc_type == 49; /* R_ARC_32_PCREL. */
41e92641 11569 case EM_ARM:
3e0873ac 11570 return reloc_type == 3; /* R_ARM_REL32 */
137b6b5f
AM
11571 case EM_MICROBLAZE:
11572 return reloc_type == 2; /* R_MICROBLAZE_32_PCREL. */
73589c9d
CS
11573 case EM_OR1K:
11574 return reloc_type == 9; /* R_OR1K_32_PCREL. */
aca88567 11575 case EM_PARISC:
85acf597 11576 return reloc_type == 9; /* R_PARISC_PCREL32. */
aca88567
NC
11577 case EM_PPC:
11578 return reloc_type == 26; /* R_PPC_REL32. */
11579 case EM_PPC64:
3e0873ac 11580 return reloc_type == 26; /* R_PPC64_REL32. */
aca88567
NC
11581 case EM_S390_OLD:
11582 case EM_S390:
3e0873ac 11583 return reloc_type == 5; /* R_390_PC32. */
aca88567 11584 case EM_SH:
3e0873ac 11585 return reloc_type == 2; /* R_SH_REL32. */
aca88567
NC
11586 case EM_SPARC32PLUS:
11587 case EM_SPARCV9:
11588 case EM_SPARC:
3e0873ac 11589 return reloc_type == 6; /* R_SPARC_DISP32. */
a7dd7d05
AM
11590 case EM_SPU:
11591 return reloc_type == 13; /* R_SPU_REL32. */
aa137e4d
NC
11592 case EM_TILEGX:
11593 return reloc_type == 6; /* R_TILEGX_32_PCREL. */
11594 case EM_TILEPRO:
11595 return reloc_type == 4; /* R_TILEPRO_32_PCREL. */
619ed720
EB
11596 case EM_VISIUM:
11597 return reloc_type == 6; /* R_VISIUM_32_PCREL */
aca88567 11598 case EM_X86_64:
8a9036a4 11599 case EM_L1OM:
7a9068fe 11600 case EM_K1OM:
3e0873ac 11601 return reloc_type == 2; /* R_X86_64_PC32. */
2fcb9706
BW
11602 case EM_XTENSA_OLD:
11603 case EM_XTENSA:
11604 return reloc_type == 14; /* R_XTENSA_32_PCREL. */
aca88567
NC
11605 default:
11606 /* Do not abort or issue an error message here. Not all targets use
11607 pc-relative 32-bit relocs in their DWARF debug information and we
11608 have already tested for target coverage in is_32bit_abs_reloc. A
cf13d699
NC
11609 more helpful warning message will be generated by apply_relocations
11610 anyway, so just return. */
aca88567
NC
11611 return FALSE;
11612 }
11613}
11614
11615/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11616 a 64-bit absolute RELA relocation used in DWARF debug sections. */
11617
11618static bfd_boolean
11619is_64bit_abs_reloc (unsigned int reloc_type)
11620{
11621 switch (elf_header.e_machine)
11622 {
a06ea964
NC
11623 case EM_AARCH64:
11624 return reloc_type == 257; /* R_AARCH64_ABS64. */
aca88567
NC
11625 case EM_ALPHA:
11626 return reloc_type == 2; /* R_ALPHA_REFQUAD. */
3730236a
NC
11627 case EM_IA_64:
11628 return reloc_type == 0x27; /* R_IA64_DIR64LSB. */
3e0873ac
NC
11629 case EM_PARISC:
11630 return reloc_type == 80; /* R_PARISC_DIR64. */
aca88567
NC
11631 case EM_PPC64:
11632 return reloc_type == 38; /* R_PPC64_ADDR64. */
11633 case EM_SPARC32PLUS:
11634 case EM_SPARCV9:
11635 case EM_SPARC:
11636 return reloc_type == 54; /* R_SPARC_UA64. */
11637 case EM_X86_64:
8a9036a4 11638 case EM_L1OM:
7a9068fe 11639 case EM_K1OM:
aca88567 11640 return reloc_type == 1; /* R_X86_64_64. */
e819ade1
AS
11641 case EM_S390_OLD:
11642 case EM_S390:
aa137e4d
NC
11643 return reloc_type == 22; /* R_S390_64. */
11644 case EM_TILEGX:
11645 return reloc_type == 1; /* R_TILEGX_64. */
85a82265 11646 case EM_MIPS:
aa137e4d 11647 return reloc_type == 18; /* R_MIPS_64. */
aca88567
NC
11648 default:
11649 return FALSE;
11650 }
11651}
11652
85acf597
RH
11653/* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
11654 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
11655
11656static bfd_boolean
11657is_64bit_pcrel_reloc (unsigned int reloc_type)
11658{
11659 switch (elf_header.e_machine)
11660 {
a06ea964
NC
11661 case EM_AARCH64:
11662 return reloc_type == 260; /* R_AARCH64_PREL64. */
85acf597 11663 case EM_ALPHA:
aa137e4d 11664 return reloc_type == 11; /* R_ALPHA_SREL64. */
85acf597 11665 case EM_IA_64:
aa137e4d 11666 return reloc_type == 0x4f; /* R_IA64_PCREL64LSB. */
85acf597 11667 case EM_PARISC:
aa137e4d 11668 return reloc_type == 72; /* R_PARISC_PCREL64. */
85acf597 11669 case EM_PPC64:
aa137e4d 11670 return reloc_type == 44; /* R_PPC64_REL64. */
85acf597
RH
11671 case EM_SPARC32PLUS:
11672 case EM_SPARCV9:
11673 case EM_SPARC:
aa137e4d 11674 return reloc_type == 46; /* R_SPARC_DISP64. */
85acf597 11675 case EM_X86_64:
8a9036a4 11676 case EM_L1OM:
7a9068fe 11677 case EM_K1OM:
aa137e4d 11678 return reloc_type == 24; /* R_X86_64_PC64. */
85acf597
RH
11679 case EM_S390_OLD:
11680 case EM_S390:
aa137e4d
NC
11681 return reloc_type == 23; /* R_S390_PC64. */
11682 case EM_TILEGX:
11683 return reloc_type == 5; /* R_TILEGX_64_PCREL. */
85acf597
RH
11684 default:
11685 return FALSE;
11686 }
11687}
11688
4dc3c23d
AM
11689/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11690 a 24-bit absolute RELA relocation used in DWARF debug sections. */
11691
11692static bfd_boolean
11693is_24bit_abs_reloc (unsigned int reloc_type)
11694{
11695 switch (elf_header.e_machine)
11696 {
11697 case EM_CYGNUS_MN10200:
11698 case EM_MN10200:
11699 return reloc_type == 4; /* R_MN10200_24. */
11700 default:
11701 return FALSE;
11702 }
11703}
11704
aca88567
NC
11705/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11706 a 16-bit absolute RELA relocation used in DWARF debug sections. */
11707
11708static bfd_boolean
11709is_16bit_abs_reloc (unsigned int reloc_type)
4b78141a
NC
11710{
11711 switch (elf_header.e_machine)
11712 {
886a2506
NC
11713 case EM_ARC:
11714 case EM_ARC_COMPACT:
11715 case EM_ARC_COMPACT2:
11716 return reloc_type == 2; /* R_ARC_16. */
aca88567
NC
11717 case EM_AVR_OLD:
11718 case EM_AVR:
11719 return reloc_type == 4; /* R_AVR_16. */
cfb8c092
NC
11720 case EM_ADAPTEVA_EPIPHANY:
11721 return reloc_type == 5;
41e92641
NC
11722 case EM_CYGNUS_D10V:
11723 case EM_D10V:
11724 return reloc_type == 3; /* R_D10V_16. */
4b78141a
NC
11725 case EM_H8S:
11726 case EM_H8_300:
11727 case EM_H8_300H:
aca88567
NC
11728 return reloc_type == R_H8_DIR16;
11729 case EM_IP2K_OLD:
11730 case EM_IP2K:
11731 return reloc_type == 1; /* R_IP2K_16. */
ff7eeb89 11732 case EM_M32C_OLD:
f4236fe4
DD
11733 case EM_M32C:
11734 return reloc_type == 1; /* R_M32C_16 */
aca88567 11735 case EM_MSP430:
13761a11
NC
11736 if (uses_msp430x_relocs ())
11737 return reloc_type == 2; /* R_MSP430_ABS16. */
78c8d46c 11738 case EM_MSP430_OLD:
aca88567 11739 return reloc_type == 5; /* R_MSP430_16_BYTE. */
35c08157
KLC
11740 case EM_NDS32:
11741 return reloc_type == 19; /* R_NDS32_RELA. */
3e0873ac 11742 case EM_ALTERA_NIOS2:
36591ba1 11743 return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16. */
3e0873ac
NC
11744 case EM_NIOS32:
11745 return reloc_type == 9; /* R_NIOS_16. */
73589c9d
CS
11746 case EM_OR1K:
11747 return reloc_type == 2; /* R_OR1K_16. */
40b36596
JM
11748 case EM_TI_C6000:
11749 return reloc_type == 2; /* R_C6000_ABS16. */
c29aca4a
NC
11750 case EM_XC16X:
11751 case EM_C166:
11752 return reloc_type == 2; /* R_XC16C_ABS_16. */
e63734a3
AM
11753 case EM_CYGNUS_MN10200:
11754 case EM_MN10200:
11755 return reloc_type == 2; /* R_MN10200_16. */
0a22ae8e
NC
11756 case EM_CYGNUS_MN10300:
11757 case EM_MN10300:
11758 return reloc_type == 2; /* R_MN10300_16. */
619ed720
EB
11759 case EM_VISIUM:
11760 return reloc_type == 2; /* R_VISIUM_16. */
f6c1a2d5
NC
11761 case EM_XGATE:
11762 return reloc_type == 3; /* R_XGATE_16. */
4b78141a 11763 default:
aca88567 11764 return FALSE;
4b78141a
NC
11765 }
11766}
11767
2a7b2e88
JK
11768/* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
11769 relocation entries (possibly formerly used for SHT_GROUP sections). */
11770
11771static bfd_boolean
11772is_none_reloc (unsigned int reloc_type)
11773{
11774 switch (elf_header.e_machine)
11775 {
cb8f3167
NC
11776 case EM_68K: /* R_68K_NONE. */
11777 case EM_386: /* R_386_NONE. */
2a7b2e88
JK
11778 case EM_SPARC32PLUS:
11779 case EM_SPARCV9:
cb8f3167
NC
11780 case EM_SPARC: /* R_SPARC_NONE. */
11781 case EM_MIPS: /* R_MIPS_NONE. */
11782 case EM_PARISC: /* R_PARISC_NONE. */
11783 case EM_ALPHA: /* R_ALPHA_NONE. */
cfb8c092 11784 case EM_ADAPTEVA_EPIPHANY:
cb8f3167
NC
11785 case EM_PPC: /* R_PPC_NONE. */
11786 case EM_PPC64: /* R_PPC64_NONE. */
886a2506
NC
11787 case EM_ARC: /* R_ARC_NONE. */
11788 case EM_ARC_COMPACT: /* R_ARC_NONE. */
11789 case EM_ARC_COMPACT2: /* R_ARC_NONE. */
cb8f3167
NC
11790 case EM_ARM: /* R_ARM_NONE. */
11791 case EM_IA_64: /* R_IA64_NONE. */
11792 case EM_SH: /* R_SH_NONE. */
2a7b2e88 11793 case EM_S390_OLD:
cb8f3167
NC
11794 case EM_S390: /* R_390_NONE. */
11795 case EM_CRIS: /* R_CRIS_NONE. */
11796 case EM_X86_64: /* R_X86_64_NONE. */
8a9036a4 11797 case EM_L1OM: /* R_X86_64_NONE. */
7a9068fe 11798 case EM_K1OM: /* R_X86_64_NONE. */
cb8f3167 11799 case EM_MN10300: /* R_MN10300_NONE. */
3f8107ab 11800 case EM_FT32: /* R_FT32_NONE. */
5506d11a 11801 case EM_MOXIE: /* R_MOXIE_NONE. */
cb8f3167 11802 case EM_M32R: /* R_M32R_NONE. */
40b36596 11803 case EM_TI_C6000:/* R_C6000_NONE. */
aa137e4d
NC
11804 case EM_TILEGX: /* R_TILEGX_NONE. */
11805 case EM_TILEPRO: /* R_TILEPRO_NONE. */
c29aca4a
NC
11806 case EM_XC16X:
11807 case EM_C166: /* R_XC16X_NONE. */
36591ba1
SL
11808 case EM_ALTERA_NIOS2: /* R_NIOS2_NONE. */
11809 case EM_NIOS32: /* R_NIOS_NONE. */
73589c9d 11810 case EM_OR1K: /* R_OR1K_NONE. */
cb8f3167 11811 return reloc_type == 0;
a06ea964
NC
11812 case EM_AARCH64:
11813 return reloc_type == 0 || reloc_type == 256;
35c08157
KLC
11814 case EM_NDS32:
11815 return (reloc_type == 0 /* R_XTENSA_NONE. */
11816 || reloc_type == 204 /* R_NDS32_DIFF8. */
11817 || reloc_type == 205 /* R_NDS32_DIFF16. */
11818 || reloc_type == 206 /* R_NDS32_DIFF32. */
11819 || reloc_type == 207 /* R_NDS32_ULEB128. */);
58332dda
JK
11820 case EM_XTENSA_OLD:
11821 case EM_XTENSA:
4dc3c23d
AM
11822 return (reloc_type == 0 /* R_XTENSA_NONE. */
11823 || reloc_type == 17 /* R_XTENSA_DIFF8. */
11824 || reloc_type == 18 /* R_XTENSA_DIFF16. */
11825 || reloc_type == 19 /* R_XTENSA_DIFF32. */);
a3c62988
NC
11826 case EM_METAG:
11827 return reloc_type == 3; /* R_METAG_NONE. */
2a7b2e88
JK
11828 }
11829 return FALSE;
11830}
11831
d1c4b12b
NC
11832/* Returns TRUE if there is a relocation against
11833 section NAME at OFFSET bytes. */
11834
11835bfd_boolean
11836reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
11837{
11838 Elf_Internal_Rela * relocs;
11839 Elf_Internal_Rela * rp;
11840
11841 if (dsec == NULL || dsec->reloc_info == NULL)
11842 return FALSE;
11843
11844 relocs = (Elf_Internal_Rela *) dsec->reloc_info;
11845
11846 for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
11847 if (rp->r_offset == offset)
11848 return TRUE;
11849
11850 return FALSE;
11851}
11852
cf13d699
NC
11853/* Apply relocations to a section.
11854 Note: So far support has been added only for those relocations
11855 which can be found in debug sections.
d1c4b12b
NC
11856 If RELOCS_RETURN is non-NULL then returns in it a pointer to the
11857 loaded relocs. It is then the caller's responsibility to free them.
cf13d699 11858 FIXME: Add support for more relocations ? */
1b315056 11859
cf13d699 11860static void
d1c4b12b
NC
11861apply_relocations (void * file,
11862 const Elf_Internal_Shdr * section,
11863 unsigned char * start,
11864 bfd_size_type size,
11865 void ** relocs_return,
11866 unsigned long * num_relocs_return)
1b315056 11867{
cf13d699 11868 Elf_Internal_Shdr * relsec;
0d2a7a93 11869 unsigned char * end = start + size;
cb8f3167 11870
d1c4b12b
NC
11871 if (relocs_return != NULL)
11872 {
11873 * (Elf_Internal_Rela **) relocs_return = NULL;
11874 * num_relocs_return = 0;
11875 }
11876
cf13d699
NC
11877 if (elf_header.e_type != ET_REL)
11878 return;
1b315056 11879
cf13d699 11880 /* Find the reloc section associated with the section. */
5b18a4bc
NC
11881 for (relsec = section_headers;
11882 relsec < section_headers + elf_header.e_shnum;
11883 ++relsec)
252b5132 11884 {
41e92641
NC
11885 bfd_boolean is_rela;
11886 unsigned long num_relocs;
2cf0635d
NC
11887 Elf_Internal_Rela * relocs;
11888 Elf_Internal_Rela * rp;
11889 Elf_Internal_Shdr * symsec;
11890 Elf_Internal_Sym * symtab;
ba5cdace 11891 unsigned long num_syms;
2cf0635d 11892 Elf_Internal_Sym * sym;
252b5132 11893
41e92641 11894 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
4fbb74a6
AM
11895 || relsec->sh_info >= elf_header.e_shnum
11896 || section_headers + relsec->sh_info != section
c256ffe7 11897 || relsec->sh_size == 0
4fbb74a6 11898 || relsec->sh_link >= elf_header.e_shnum)
5b18a4bc 11899 continue;
428409d5 11900
41e92641
NC
11901 is_rela = relsec->sh_type == SHT_RELA;
11902
11903 if (is_rela)
11904 {
3f5e193b
NC
11905 if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
11906 relsec->sh_size, & relocs, & num_relocs))
41e92641
NC
11907 return;
11908 }
11909 else
11910 {
3f5e193b
NC
11911 if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
11912 relsec->sh_size, & relocs, & num_relocs))
41e92641
NC
11913 return;
11914 }
11915
11916 /* SH uses RELA but uses in place value instead of the addend field. */
11917 if (elf_header.e_machine == EM_SH)
11918 is_rela = FALSE;
428409d5 11919
4fbb74a6 11920 symsec = section_headers + relsec->sh_link;
ba5cdace 11921 symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec, & num_syms);
103f02d3 11922
41e92641 11923 for (rp = relocs; rp < relocs + num_relocs; ++rp)
252b5132 11924 {
41e92641
NC
11925 bfd_vma addend;
11926 unsigned int reloc_type;
11927 unsigned int reloc_size;
91d6fa6a 11928 unsigned char * rloc;
ba5cdace 11929 unsigned long sym_index;
4b78141a 11930
aca88567 11931 reloc_type = get_reloc_type (rp->r_info);
41e92641 11932
98fb390a 11933 if (target_specific_reloc_handling (rp, start, symtab))
2a7b2e88 11934 continue;
98fb390a
NC
11935 else if (is_none_reloc (reloc_type))
11936 continue;
11937 else if (is_32bit_abs_reloc (reloc_type)
11938 || is_32bit_pcrel_reloc (reloc_type))
aca88567 11939 reloc_size = 4;
85acf597
RH
11940 else if (is_64bit_abs_reloc (reloc_type)
11941 || is_64bit_pcrel_reloc (reloc_type))
aca88567 11942 reloc_size = 8;
4dc3c23d
AM
11943 else if (is_24bit_abs_reloc (reloc_type))
11944 reloc_size = 3;
aca88567
NC
11945 else if (is_16bit_abs_reloc (reloc_type))
11946 reloc_size = 2;
11947 else
4b78141a 11948 {
bee0ee85
NC
11949 static unsigned int prev_reloc = 0;
11950 if (reloc_type != prev_reloc)
11951 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
11952 reloc_type, printable_section_name (section));
11953 prev_reloc = reloc_type;
4b78141a
NC
11954 continue;
11955 }
103f02d3 11956
91d6fa6a 11957 rloc = start + rp->r_offset;
c8da6823 11958 if ((rloc + reloc_size) > end || (rloc < start))
700dd8b7
L
11959 {
11960 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
11961 (unsigned long) rp->r_offset,
74e1a04b 11962 printable_section_name (section));
700dd8b7
L
11963 continue;
11964 }
103f02d3 11965
ba5cdace
NC
11966 sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
11967 if (sym_index >= num_syms)
11968 {
11969 warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
74e1a04b 11970 sym_index, printable_section_name (section));
ba5cdace
NC
11971 continue;
11972 }
11973 sym = symtab + sym_index;
41e92641
NC
11974
11975 /* If the reloc has a symbol associated with it,
55f25fc3
L
11976 make sure that it is of an appropriate type.
11977
11978 Relocations against symbols without type can happen.
11979 Gcc -feliminate-dwarf2-dups may generate symbols
11980 without type for debug info.
11981
11982 Icc generates relocations against function symbols
11983 instead of local labels.
11984
11985 Relocations against object symbols can happen, eg when
11986 referencing a global array. For an example of this see
11987 the _clz.o binary in libgcc.a. */
aca88567 11988 if (sym != symtab
b8871f35 11989 && ELF_ST_TYPE (sym->st_info) != STT_COMMON
55f25fc3 11990 && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
5b18a4bc 11991 {
41e92641 11992 warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
aca88567 11993 get_symbol_type (ELF_ST_TYPE (sym->st_info)),
99dcb0b9 11994 (long int)(rp - relocs),
74e1a04b 11995 printable_section_name (relsec));
aca88567 11996 continue;
5b18a4bc 11997 }
252b5132 11998
4dc3c23d
AM
11999 addend = 0;
12000 if (is_rela)
12001 addend += rp->r_addend;
c47320c3
AM
12002 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
12003 partial_inplace. */
4dc3c23d
AM
12004 if (!is_rela
12005 || (elf_header.e_machine == EM_XTENSA
12006 && reloc_type == 1)
12007 || ((elf_header.e_machine == EM_PJ
12008 || elf_header.e_machine == EM_PJ_OLD)
c47320c3
AM
12009 && reloc_type == 1)
12010 || ((elf_header.e_machine == EM_D30V
12011 || elf_header.e_machine == EM_CYGNUS_D30V)
12012 && reloc_type == 12))
91d6fa6a 12013 addend += byte_get (rloc, reloc_size);
cb8f3167 12014
85acf597
RH
12015 if (is_32bit_pcrel_reloc (reloc_type)
12016 || is_64bit_pcrel_reloc (reloc_type))
12017 {
12018 /* On HPPA, all pc-relative relocations are biased by 8. */
12019 if (elf_header.e_machine == EM_PARISC)
12020 addend -= 8;
91d6fa6a 12021 byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
85acf597
RH
12022 reloc_size);
12023 }
41e92641 12024 else
91d6fa6a 12025 byte_put (rloc, addend + sym->st_value, reloc_size);
5b18a4bc 12026 }
252b5132 12027
5b18a4bc 12028 free (symtab);
d1c4b12b
NC
12029
12030 if (relocs_return)
12031 {
12032 * (Elf_Internal_Rela **) relocs_return = relocs;
12033 * num_relocs_return = num_relocs;
12034 }
12035 else
12036 free (relocs);
12037
5b18a4bc
NC
12038 break;
12039 }
5b18a4bc 12040}
103f02d3 12041
cf13d699
NC
12042#ifdef SUPPORT_DISASSEMBLY
12043static int
12044disassemble_section (Elf_Internal_Shdr * section, FILE * file)
12045{
74e1a04b 12046 printf (_("\nAssembly dump of section %s\n"), printable_section_name (section));
cf13d699 12047
74e1a04b 12048 /* FIXME: XXX -- to be done --- XXX */
cf13d699
NC
12049
12050 return 1;
12051}
12052#endif
12053
12054/* Reads in the contents of SECTION from FILE, returning a pointer
12055 to a malloc'ed buffer or NULL if something went wrong. */
12056
12057static char *
12058get_section_contents (Elf_Internal_Shdr * section, FILE * file)
12059{
12060 bfd_size_type num_bytes;
12061
12062 num_bytes = section->sh_size;
12063
12064 if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
12065 {
12066 printf (_("\nSection '%s' has no data to dump.\n"),
74e1a04b 12067 printable_section_name (section));
cf13d699
NC
12068 return NULL;
12069 }
12070
3f5e193b
NC
12071 return (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
12072 _("section contents"));
cf13d699
NC
12073}
12074
0e602686
NC
12075/* Uncompresses a section that was compressed using zlib, in place. */
12076
12077static bfd_boolean
12078uncompress_section_contents (unsigned char **buffer,
12079 dwarf_size_type uncompressed_size,
12080 dwarf_size_type *size)
12081{
12082 dwarf_size_type compressed_size = *size;
12083 unsigned char * compressed_buffer = *buffer;
12084 unsigned char * uncompressed_buffer;
12085 z_stream strm;
12086 int rc;
12087
12088 /* It is possible the section consists of several compressed
12089 buffers concatenated together, so we uncompress in a loop. */
12090 /* PR 18313: The state field in the z_stream structure is supposed
12091 to be invisible to the user (ie us), but some compilers will
12092 still complain about it being used without initialisation. So
12093 we first zero the entire z_stream structure and then set the fields
12094 that we need. */
12095 memset (& strm, 0, sizeof strm);
12096 strm.avail_in = compressed_size;
12097 strm.next_in = (Bytef *) compressed_buffer;
12098 strm.avail_out = uncompressed_size;
12099 uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
12100
12101 rc = inflateInit (& strm);
12102 while (strm.avail_in > 0)
12103 {
12104 if (rc != Z_OK)
12105 goto fail;
12106 strm.next_out = ((Bytef *) uncompressed_buffer
12107 + (uncompressed_size - strm.avail_out));
12108 rc = inflate (&strm, Z_FINISH);
12109 if (rc != Z_STREAM_END)
12110 goto fail;
12111 rc = inflateReset (& strm);
12112 }
12113 rc = inflateEnd (& strm);
12114 if (rc != Z_OK
12115 || strm.avail_out != 0)
12116 goto fail;
12117
12118 *buffer = uncompressed_buffer;
12119 *size = uncompressed_size;
12120 return TRUE;
12121
12122 fail:
12123 free (uncompressed_buffer);
12124 /* Indicate decompression failure. */
12125 *buffer = NULL;
12126 return FALSE;
12127}
dd24e3da 12128
cf13d699
NC
12129static void
12130dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
12131{
0e602686
NC
12132 Elf_Internal_Shdr * relsec;
12133 bfd_size_type num_bytes;
fd8008d8
L
12134 unsigned char * data;
12135 unsigned char * end;
12136 unsigned char * real_start;
12137 unsigned char * start;
0e602686 12138 bfd_boolean some_strings_shown;
cf13d699 12139
fd8008d8
L
12140 real_start = start = (unsigned char *) get_section_contents (section,
12141 file);
cf13d699
NC
12142 if (start == NULL)
12143 return;
0e602686 12144 num_bytes = section->sh_size;
cf13d699 12145
74e1a04b 12146 printf (_("\nString dump of section '%s':\n"), printable_section_name (section));
cf13d699 12147
0e602686
NC
12148 if (decompress_dumps)
12149 {
12150 dwarf_size_type new_size = num_bytes;
12151 dwarf_size_type uncompressed_size = 0;
12152
12153 if ((section->sh_flags & SHF_COMPRESSED) != 0)
12154 {
12155 Elf_Internal_Chdr chdr;
12156 unsigned int compression_header_size
12157 = get_compression_header (& chdr, (unsigned char *) start);
12158
813dabb9 12159 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
0e602686 12160 {
813dabb9
L
12161 warn (_("section '%s' has unsupported compress type: %d\n"),
12162 printable_section_name (section), chdr.ch_type);
12163 return;
12164 }
12165 else if (chdr.ch_addralign != section->sh_addralign)
12166 {
12167 warn (_("compressed section '%s' is corrupted\n"),
12168 printable_section_name (section));
12169 return;
0e602686 12170 }
813dabb9
L
12171 uncompressed_size = chdr.ch_size;
12172 start += compression_header_size;
12173 new_size -= compression_header_size;
0e602686
NC
12174 }
12175 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12176 {
12177 /* Read the zlib header. In this case, it should be "ZLIB"
12178 followed by the uncompressed section size, 8 bytes in
12179 big-endian order. */
12180 uncompressed_size = start[4]; uncompressed_size <<= 8;
12181 uncompressed_size += start[5]; uncompressed_size <<= 8;
12182 uncompressed_size += start[6]; uncompressed_size <<= 8;
12183 uncompressed_size += start[7]; uncompressed_size <<= 8;
12184 uncompressed_size += start[8]; uncompressed_size <<= 8;
12185 uncompressed_size += start[9]; uncompressed_size <<= 8;
12186 uncompressed_size += start[10]; uncompressed_size <<= 8;
12187 uncompressed_size += start[11];
12188 start += 12;
12189 new_size -= 12;
12190 }
12191
12192 if (uncompressed_size
fd8008d8 12193 && uncompress_section_contents (& start,
0e602686
NC
12194 uncompressed_size, & new_size))
12195 num_bytes = new_size;
12196 }
fd8008d8 12197
cf13d699
NC
12198 /* If the section being dumped has relocations against it the user might
12199 be expecting these relocations to have been applied. Check for this
12200 case and issue a warning message in order to avoid confusion.
12201 FIXME: Maybe we ought to have an option that dumps a section with
12202 relocs applied ? */
12203 for (relsec = section_headers;
12204 relsec < section_headers + elf_header.e_shnum;
12205 ++relsec)
12206 {
12207 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12208 || relsec->sh_info >= elf_header.e_shnum
12209 || section_headers + relsec->sh_info != section
12210 || relsec->sh_size == 0
12211 || relsec->sh_link >= elf_header.e_shnum)
12212 continue;
12213
12214 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12215 break;
12216 }
12217
cf13d699
NC
12218 data = start;
12219 end = start + num_bytes;
12220 some_strings_shown = FALSE;
12221
12222 while (data < end)
12223 {
12224 while (!ISPRINT (* data))
12225 if (++ data >= end)
12226 break;
12227
12228 if (data < end)
12229 {
071436c6
NC
12230 size_t maxlen = end - data;
12231
cf13d699 12232#ifndef __MSVCRT__
c975cc98
NC
12233 /* PR 11128: Use two separate invocations in order to work
12234 around bugs in the Solaris 8 implementation of printf. */
12235 printf (" [%6tx] ", data - start);
cf13d699 12236#else
071436c6 12237 printf (" [%6Ix] ", (size_t) (data - start));
cf13d699 12238#endif
4082ef84
NC
12239 if (maxlen > 0)
12240 {
fd8008d8 12241 print_symbol ((int) maxlen, (const char *) data);
4082ef84 12242 putchar ('\n');
fd8008d8 12243 data += strnlen ((const char *) data, maxlen);
4082ef84
NC
12244 }
12245 else
12246 {
12247 printf (_("<corrupt>\n"));
12248 data = end;
12249 }
cf13d699
NC
12250 some_strings_shown = TRUE;
12251 }
12252 }
12253
12254 if (! some_strings_shown)
12255 printf (_(" No strings found in this section."));
12256
0e602686 12257 free (real_start);
cf13d699
NC
12258
12259 putchar ('\n');
12260}
12261
12262static void
12263dump_section_as_bytes (Elf_Internal_Shdr * section,
12264 FILE * file,
12265 bfd_boolean relocate)
12266{
12267 Elf_Internal_Shdr * relsec;
0e602686
NC
12268 bfd_size_type bytes;
12269 bfd_size_type section_size;
12270 bfd_vma addr;
12271 unsigned char * data;
12272 unsigned char * real_start;
12273 unsigned char * start;
12274
12275 real_start = start = (unsigned char *) get_section_contents (section, file);
cf13d699
NC
12276 if (start == NULL)
12277 return;
0e602686 12278 section_size = section->sh_size;
cf13d699 12279
74e1a04b 12280 printf (_("\nHex dump of section '%s':\n"), printable_section_name (section));
cf13d699 12281
0e602686
NC
12282 if (decompress_dumps)
12283 {
12284 dwarf_size_type new_size = section_size;
12285 dwarf_size_type uncompressed_size = 0;
12286
12287 if ((section->sh_flags & SHF_COMPRESSED) != 0)
12288 {
12289 Elf_Internal_Chdr chdr;
12290 unsigned int compression_header_size
12291 = get_compression_header (& chdr, start);
12292
813dabb9 12293 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
0e602686 12294 {
813dabb9
L
12295 warn (_("section '%s' has unsupported compress type: %d\n"),
12296 printable_section_name (section), chdr.ch_type);
12297 return;
0e602686 12298 }
813dabb9
L
12299 else if (chdr.ch_addralign != section->sh_addralign)
12300 {
12301 warn (_("compressed section '%s' is corrupted\n"),
12302 printable_section_name (section));
12303 return;
12304 }
12305 uncompressed_size = chdr.ch_size;
12306 start += compression_header_size;
12307 new_size -= compression_header_size;
0e602686
NC
12308 }
12309 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12310 {
12311 /* Read the zlib header. In this case, it should be "ZLIB"
12312 followed by the uncompressed section size, 8 bytes in
12313 big-endian order. */
12314 uncompressed_size = start[4]; uncompressed_size <<= 8;
12315 uncompressed_size += start[5]; uncompressed_size <<= 8;
12316 uncompressed_size += start[6]; uncompressed_size <<= 8;
12317 uncompressed_size += start[7]; uncompressed_size <<= 8;
12318 uncompressed_size += start[8]; uncompressed_size <<= 8;
12319 uncompressed_size += start[9]; uncompressed_size <<= 8;
12320 uncompressed_size += start[10]; uncompressed_size <<= 8;
12321 uncompressed_size += start[11];
12322 start += 12;
12323 new_size -= 12;
12324 }
12325
12326 if (uncompressed_size
12327 && uncompress_section_contents (& start, uncompressed_size,
12328 & new_size))
12329 section_size = new_size;
12330 }
14ae95f2 12331
cf13d699
NC
12332 if (relocate)
12333 {
0e602686 12334 apply_relocations (file, section, start, section_size, NULL, NULL);
cf13d699
NC
12335 }
12336 else
12337 {
12338 /* If the section being dumped has relocations against it the user might
12339 be expecting these relocations to have been applied. Check for this
12340 case and issue a warning message in order to avoid confusion.
12341 FIXME: Maybe we ought to have an option that dumps a section with
12342 relocs applied ? */
12343 for (relsec = section_headers;
12344 relsec < section_headers + elf_header.e_shnum;
12345 ++relsec)
12346 {
12347 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12348 || relsec->sh_info >= elf_header.e_shnum
12349 || section_headers + relsec->sh_info != section
12350 || relsec->sh_size == 0
12351 || relsec->sh_link >= elf_header.e_shnum)
12352 continue;
12353
12354 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12355 break;
12356 }
12357 }
12358
12359 addr = section->sh_addr;
0e602686 12360 bytes = section_size;
cf13d699
NC
12361 data = start;
12362
12363 while (bytes)
12364 {
12365 int j;
12366 int k;
12367 int lbytes;
12368
12369 lbytes = (bytes > 16 ? 16 : bytes);
12370
12371 printf (" 0x%8.8lx ", (unsigned long) addr);
12372
12373 for (j = 0; j < 16; j++)
12374 {
12375 if (j < lbytes)
12376 printf ("%2.2x", data[j]);
12377 else
12378 printf (" ");
12379
12380 if ((j & 3) == 3)
12381 printf (" ");
12382 }
12383
12384 for (j = 0; j < lbytes; j++)
12385 {
12386 k = data[j];
12387 if (k >= ' ' && k < 0x7f)
12388 printf ("%c", k);
12389 else
12390 printf (".");
12391 }
12392
12393 putchar ('\n');
12394
12395 data += lbytes;
12396 addr += lbytes;
12397 bytes -= lbytes;
12398 }
12399
0e602686 12400 free (real_start);
cf13d699
NC
12401
12402 putchar ('\n');
12403}
12404
d966045b
DJ
12405static int
12406load_specific_debug_section (enum dwarf_section_display_enum debug,
0d2a7a93 12407 const Elf_Internal_Shdr * sec, void * file)
1007acb3 12408{
2cf0635d 12409 struct dwarf_section * section = &debug_displays [debug].section;
19e6b90e 12410 char buf [64];
1007acb3 12411
19e6b90e
L
12412 /* If it is already loaded, do nothing. */
12413 if (section->start != NULL)
12414 return 1;
1007acb3 12415
19e6b90e
L
12416 snprintf (buf, sizeof (buf), _("%s section data"), section->name);
12417 section->address = sec->sh_addr;
06614111 12418 section->user_data = NULL;
3f5e193b
NC
12419 section->start = (unsigned char *) get_data (NULL, (FILE *) file,
12420 sec->sh_offset, 1,
12421 sec->sh_size, buf);
59245841
NC
12422 if (section->start == NULL)
12423 section->size = 0;
12424 else
12425 {
77115a4a
L
12426 unsigned char *start = section->start;
12427 dwarf_size_type size = sec->sh_size;
dab394de 12428 dwarf_size_type uncompressed_size = 0;
77115a4a
L
12429
12430 if ((sec->sh_flags & SHF_COMPRESSED) != 0)
12431 {
12432 Elf_Internal_Chdr chdr;
12433 unsigned int compression_header_size
12434 = get_compression_header (&chdr, start);
813dabb9
L
12435 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12436 {
12437 warn (_("section '%s' has unsupported compress type: %d\n"),
12438 section->name, chdr.ch_type);
12439 return 0;
12440 }
12441 else if (chdr.ch_addralign != sec->sh_addralign)
12442 {
12443 warn (_("compressed section '%s' is corrupted\n"),
12444 section->name);
12445 return 0;
12446 }
dab394de 12447 uncompressed_size = chdr.ch_size;
77115a4a
L
12448 start += compression_header_size;
12449 size -= compression_header_size;
12450 }
dab394de
L
12451 else if (size > 12 && streq ((char *) start, "ZLIB"))
12452 {
12453 /* Read the zlib header. In this case, it should be "ZLIB"
12454 followed by the uncompressed section size, 8 bytes in
12455 big-endian order. */
12456 uncompressed_size = start[4]; uncompressed_size <<= 8;
12457 uncompressed_size += start[5]; uncompressed_size <<= 8;
12458 uncompressed_size += start[6]; uncompressed_size <<= 8;
12459 uncompressed_size += start[7]; uncompressed_size <<= 8;
12460 uncompressed_size += start[8]; uncompressed_size <<= 8;
12461 uncompressed_size += start[9]; uncompressed_size <<= 8;
12462 uncompressed_size += start[10]; uncompressed_size <<= 8;
12463 uncompressed_size += start[11];
12464 start += 12;
12465 size -= 12;
12466 }
12467
12468 if (uncompressed_size
12469 && uncompress_section_contents (&start, uncompressed_size,
12470 &size))
77115a4a
L
12471 {
12472 /* Free the compressed buffer, update the section buffer
12473 and the section size if uncompress is successful. */
12474 free (section->start);
12475 section->start = start;
77115a4a
L
12476 }
12477 section->size = size;
59245841 12478 }
4a114e3e 12479
1b315056
CS
12480 if (section->start == NULL)
12481 return 0;
12482
19e6b90e 12483 if (debug_displays [debug].relocate)
d1c4b12b
NC
12484 apply_relocations ((FILE *) file, sec, section->start, section->size,
12485 & section->reloc_info, & section->num_relocs);
12486 else
12487 {
12488 section->reloc_info = NULL;
12489 section->num_relocs = 0;
12490 }
1007acb3 12491
1b315056 12492 return 1;
1007acb3
L
12493}
12494
657d0d47
CC
12495/* If this is not NULL, load_debug_section will only look for sections
12496 within the list of sections given here. */
12497unsigned int *section_subset = NULL;
12498
d966045b 12499int
2cf0635d 12500load_debug_section (enum dwarf_section_display_enum debug, void * file)
d966045b 12501{
2cf0635d
NC
12502 struct dwarf_section * section = &debug_displays [debug].section;
12503 Elf_Internal_Shdr * sec;
d966045b
DJ
12504
12505 /* Locate the debug section. */
657d0d47 12506 sec = find_section_in_set (section->uncompressed_name, section_subset);
d966045b
DJ
12507 if (sec != NULL)
12508 section->name = section->uncompressed_name;
12509 else
12510 {
657d0d47 12511 sec = find_section_in_set (section->compressed_name, section_subset);
d966045b
DJ
12512 if (sec != NULL)
12513 section->name = section->compressed_name;
12514 }
12515 if (sec == NULL)
12516 return 0;
12517
657d0d47
CC
12518 /* If we're loading from a subset of sections, and we've loaded
12519 a section matching this name before, it's likely that it's a
12520 different one. */
12521 if (section_subset != NULL)
12522 free_debug_section (debug);
12523
3f5e193b 12524 return load_specific_debug_section (debug, sec, (FILE *) file);
d966045b
DJ
12525}
12526
19e6b90e
L
12527void
12528free_debug_section (enum dwarf_section_display_enum debug)
1007acb3 12529{
2cf0635d 12530 struct dwarf_section * section = &debug_displays [debug].section;
1007acb3 12531
19e6b90e
L
12532 if (section->start == NULL)
12533 return;
1007acb3 12534
19e6b90e
L
12535 free ((char *) section->start);
12536 section->start = NULL;
12537 section->address = 0;
12538 section->size = 0;
1007acb3
L
12539}
12540
1007acb3 12541static int
657d0d47 12542display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
1007acb3 12543{
2cf0635d 12544 char * name = SECTION_NAME (section);
74e1a04b 12545 const char * print_name = printable_section_name (section);
19e6b90e
L
12546 bfd_size_type length;
12547 int result = 1;
3f5e193b 12548 int i;
1007acb3 12549
19e6b90e
L
12550 length = section->sh_size;
12551 if (length == 0)
1007acb3 12552 {
74e1a04b 12553 printf (_("\nSection '%s' has no debugging data.\n"), print_name);
19e6b90e 12554 return 0;
1007acb3 12555 }
5dff79d8
NC
12556 if (section->sh_type == SHT_NOBITS)
12557 {
12558 /* There is no point in dumping the contents of a debugging section
12559 which has the NOBITS type - the bits in the file will be random.
12560 This can happen when a file containing a .eh_frame section is
12561 stripped with the --only-keep-debug command line option. */
74e1a04b
NC
12562 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
12563 print_name);
5dff79d8
NC
12564 return 0;
12565 }
1007acb3 12566
0112cd26 12567 if (const_strneq (name, ".gnu.linkonce.wi."))
19e6b90e 12568 name = ".debug_info";
1007acb3 12569
19e6b90e
L
12570 /* See if we know how to display the contents of this section. */
12571 for (i = 0; i < max; i++)
1b315056 12572 if (streq (debug_displays[i].section.uncompressed_name, name)
b40bf0a2 12573 || (i == line && const_strneq (name, ".debug_line."))
1b315056 12574 || streq (debug_displays[i].section.compressed_name, name))
19e6b90e 12575 {
2cf0635d 12576 struct dwarf_section * sec = &debug_displays [i].section;
d966045b
DJ
12577 int secondary = (section != find_section (name));
12578
12579 if (secondary)
3f5e193b 12580 free_debug_section ((enum dwarf_section_display_enum) i);
1007acb3 12581
b40bf0a2
NC
12582 if (i == line && const_strneq (name, ".debug_line."))
12583 sec->name = name;
12584 else if (streq (sec->uncompressed_name, name))
d966045b
DJ
12585 sec->name = sec->uncompressed_name;
12586 else
12587 sec->name = sec->compressed_name;
3f5e193b
NC
12588 if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
12589 section, file))
19e6b90e 12590 {
657d0d47
CC
12591 /* If this debug section is part of a CU/TU set in a .dwp file,
12592 restrict load_debug_section to the sections in that set. */
12593 section_subset = find_cu_tu_set (file, shndx);
12594
19e6b90e 12595 result &= debug_displays[i].display (sec, file);
1007acb3 12596
657d0d47
CC
12597 section_subset = NULL;
12598
d966045b 12599 if (secondary || (i != info && i != abbrev))
3f5e193b 12600 free_debug_section ((enum dwarf_section_display_enum) i);
19e6b90e 12601 }
1007acb3 12602
19e6b90e
L
12603 break;
12604 }
1007acb3 12605
19e6b90e 12606 if (i == max)
1007acb3 12607 {
74e1a04b 12608 printf (_("Unrecognized debug section: %s\n"), print_name);
19e6b90e 12609 result = 0;
1007acb3
L
12610 }
12611
19e6b90e 12612 return result;
5b18a4bc 12613}
103f02d3 12614
aef1f6d0
DJ
12615/* Set DUMP_SECTS for all sections where dumps were requested
12616 based on section name. */
12617
12618static void
12619initialise_dumps_byname (void)
12620{
2cf0635d 12621 struct dump_list_entry * cur;
aef1f6d0
DJ
12622
12623 for (cur = dump_sects_byname; cur; cur = cur->next)
12624 {
12625 unsigned int i;
12626 int any;
12627
12628 for (i = 0, any = 0; i < elf_header.e_shnum; i++)
12629 if (streq (SECTION_NAME (section_headers + i), cur->name))
12630 {
09c11c86 12631 request_dump_bynumber (i, cur->type);
aef1f6d0
DJ
12632 any = 1;
12633 }
12634
12635 if (!any)
12636 warn (_("Section '%s' was not dumped because it does not exist!\n"),
12637 cur->name);
12638 }
12639}
12640
5b18a4bc 12641static void
2cf0635d 12642process_section_contents (FILE * file)
5b18a4bc 12643{
2cf0635d 12644 Elf_Internal_Shdr * section;
19e6b90e 12645 unsigned int i;
103f02d3 12646
19e6b90e
L
12647 if (! do_dump)
12648 return;
103f02d3 12649
aef1f6d0
DJ
12650 initialise_dumps_byname ();
12651
19e6b90e
L
12652 for (i = 0, section = section_headers;
12653 i < elf_header.e_shnum && i < num_dump_sects;
12654 i++, section++)
12655 {
12656#ifdef SUPPORT_DISASSEMBLY
12657 if (dump_sects[i] & DISASS_DUMP)
12658 disassemble_section (section, file);
12659#endif
12660 if (dump_sects[i] & HEX_DUMP)
cf13d699 12661 dump_section_as_bytes (section, file, FALSE);
103f02d3 12662
cf13d699
NC
12663 if (dump_sects[i] & RELOC_DUMP)
12664 dump_section_as_bytes (section, file, TRUE);
09c11c86
NC
12665
12666 if (dump_sects[i] & STRING_DUMP)
12667 dump_section_as_strings (section, file);
cf13d699
NC
12668
12669 if (dump_sects[i] & DEBUG_DUMP)
657d0d47 12670 display_debug_section (i, section, file);
5b18a4bc 12671 }
103f02d3 12672
19e6b90e
L
12673 /* Check to see if the user requested a
12674 dump of a section that does not exist. */
12675 while (i++ < num_dump_sects)
12676 if (dump_sects[i])
12677 warn (_("Section %d was not dumped because it does not exist!\n"), i);
5b18a4bc 12678}
103f02d3 12679
5b18a4bc 12680static void
19e6b90e 12681process_mips_fpe_exception (int mask)
5b18a4bc 12682{
19e6b90e
L
12683 if (mask)
12684 {
12685 int first = 1;
12686 if (mask & OEX_FPU_INEX)
12687 fputs ("INEX", stdout), first = 0;
12688 if (mask & OEX_FPU_UFLO)
12689 printf ("%sUFLO", first ? "" : "|"), first = 0;
12690 if (mask & OEX_FPU_OFLO)
12691 printf ("%sOFLO", first ? "" : "|"), first = 0;
12692 if (mask & OEX_FPU_DIV0)
12693 printf ("%sDIV0", first ? "" : "|"), first = 0;
12694 if (mask & OEX_FPU_INVAL)
12695 printf ("%sINVAL", first ? "" : "|");
12696 }
5b18a4bc 12697 else
19e6b90e 12698 fputs ("0", stdout);
5b18a4bc 12699}
103f02d3 12700
f6f0e17b
NC
12701/* Display's the value of TAG at location P. If TAG is
12702 greater than 0 it is assumed to be an unknown tag, and
12703 a message is printed to this effect. Otherwise it is
12704 assumed that a message has already been printed.
12705
12706 If the bottom bit of TAG is set it assumed to have a
12707 string value, otherwise it is assumed to have an integer
12708 value.
12709
12710 Returns an updated P pointing to the first unread byte
12711 beyond the end of TAG's value.
12712
12713 Reads at or beyond END will not be made. */
12714
12715static unsigned char *
12716display_tag_value (int tag,
12717 unsigned char * p,
12718 const unsigned char * const end)
12719{
12720 unsigned long val;
12721
12722 if (tag > 0)
12723 printf (" Tag_unknown_%d: ", tag);
12724
12725 if (p >= end)
12726 {
4082ef84 12727 warn (_("<corrupt tag>\n"));
f6f0e17b
NC
12728 }
12729 else if (tag & 1)
12730 {
071436c6
NC
12731 /* PR 17531 file: 027-19978-0.004. */
12732 size_t maxlen = (end - p) - 1;
12733
12734 putchar ('"');
4082ef84
NC
12735 if (maxlen > 0)
12736 {
12737 print_symbol ((int) maxlen, (const char *) p);
12738 p += strnlen ((char *) p, maxlen) + 1;
12739 }
12740 else
12741 {
12742 printf (_("<corrupt string tag>"));
12743 p = (unsigned char *) end;
12744 }
071436c6 12745 printf ("\"\n");
f6f0e17b
NC
12746 }
12747 else
12748 {
12749 unsigned int len;
12750
12751 val = read_uleb128 (p, &len, end);
12752 p += len;
12753 printf ("%ld (0x%lx)\n", val, val);
12754 }
12755
4082ef84 12756 assert (p <= end);
f6f0e17b
NC
12757 return p;
12758}
12759
11c1ff18
PB
12760/* ARM EABI attributes section. */
12761typedef struct
12762{
70e99720 12763 unsigned int tag;
2cf0635d 12764 const char * name;
11c1ff18 12765 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
70e99720 12766 unsigned int type;
2cf0635d 12767 const char ** table;
11c1ff18
PB
12768} arm_attr_public_tag;
12769
2cf0635d 12770static const char * arm_attr_tag_CPU_arch[] =
11c1ff18 12771 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
ff8646ee
TP
12772 "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "", "v8-M.baseline",
12773 "v8-M.mainline"};
2cf0635d
NC
12774static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
12775static const char * arm_attr_tag_THUMB_ISA_use[] =
4ed7ed8d 12776 {"No", "Thumb-1", "Thumb-2", "Yes"};
75375b3e 12777static const char * arm_attr_tag_FP_arch[] =
bca38921 12778 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
a715796b 12779 "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
2cf0635d 12780static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
dd24e3da 12781static const char * arm_attr_tag_Advanced_SIMD_arch[] =
9411fd44
MW
12782 {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
12783 "NEON for ARMv8.1"};
2cf0635d 12784static const char * arm_attr_tag_PCS_config[] =
11c1ff18
PB
12785 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
12786 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
2cf0635d 12787static const char * arm_attr_tag_ABI_PCS_R9_use[] =
11c1ff18 12788 {"V6", "SB", "TLS", "Unused"};
2cf0635d 12789static const char * arm_attr_tag_ABI_PCS_RW_data[] =
11c1ff18 12790 {"Absolute", "PC-relative", "SB-relative", "None"};
2cf0635d 12791static const char * arm_attr_tag_ABI_PCS_RO_data[] =
11c1ff18 12792 {"Absolute", "PC-relative", "None"};
2cf0635d 12793static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
11c1ff18 12794 {"None", "direct", "GOT-indirect"};
2cf0635d 12795static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
11c1ff18 12796 {"None", "??? 1", "2", "??? 3", "4"};
2cf0635d
NC
12797static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
12798static const char * arm_attr_tag_ABI_FP_denormal[] =
f5f53991 12799 {"Unused", "Needed", "Sign only"};
2cf0635d
NC
12800static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
12801static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
12802static const char * arm_attr_tag_ABI_FP_number_model[] =
11c1ff18 12803 {"Unused", "Finite", "RTABI", "IEEE 754"};
2cf0635d 12804static const char * arm_attr_tag_ABI_enum_size[] =
11c1ff18 12805 {"Unused", "small", "int", "forced to int"};
2cf0635d 12806static const char * arm_attr_tag_ABI_HardFP_use[] =
99654aaf 12807 {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
2cf0635d 12808static const char * arm_attr_tag_ABI_VFP_args[] =
5c294fee 12809 {"AAPCS", "VFP registers", "custom", "compatible"};
2cf0635d 12810static const char * arm_attr_tag_ABI_WMMX_args[] =
11c1ff18 12811 {"AAPCS", "WMMX registers", "custom"};
2cf0635d 12812static const char * arm_attr_tag_ABI_optimization_goals[] =
11c1ff18
PB
12813 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
12814 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
2cf0635d 12815static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
11c1ff18
PB
12816 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
12817 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
2cf0635d 12818static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
75375b3e 12819static const char * arm_attr_tag_FP_HP_extension[] =
8e79c3df 12820 {"Not Allowed", "Allowed"};
2cf0635d 12821static const char * arm_attr_tag_ABI_FP_16bit_format[] =
8e79c3df 12822 {"None", "IEEE 754", "Alternative Format"};
dd24e3da 12823static const char * arm_attr_tag_MPextension_use[] =
cd21e546
MGD
12824 {"Not Allowed", "Allowed"};
12825static const char * arm_attr_tag_DIV_use[] =
dd24e3da 12826 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
cd21e546 12827 "Allowed in v7-A with integer division extension"};
2cf0635d
NC
12828static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
12829static const char * arm_attr_tag_Virtualization_use[] =
dd24e3da 12830 {"Not Allowed", "TrustZone", "Virtualization Extensions",
cd21e546 12831 "TrustZone and Virtualization Extensions"};
dd24e3da 12832static const char * arm_attr_tag_MPextension_use_legacy[] =
f5f53991 12833 {"Not Allowed", "Allowed"};
11c1ff18
PB
12834
12835#define LOOKUP(id, name) \
12836 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
d70c5fc7 12837static arm_attr_public_tag arm_attr_public_tags[] =
11c1ff18
PB
12838{
12839 {4, "CPU_raw_name", 1, NULL},
12840 {5, "CPU_name", 1, NULL},
12841 LOOKUP(6, CPU_arch),
12842 {7, "CPU_arch_profile", 0, NULL},
12843 LOOKUP(8, ARM_ISA_use),
12844 LOOKUP(9, THUMB_ISA_use),
75375b3e 12845 LOOKUP(10, FP_arch),
11c1ff18 12846 LOOKUP(11, WMMX_arch),
f5f53991
AS
12847 LOOKUP(12, Advanced_SIMD_arch),
12848 LOOKUP(13, PCS_config),
11c1ff18
PB
12849 LOOKUP(14, ABI_PCS_R9_use),
12850 LOOKUP(15, ABI_PCS_RW_data),
f5f53991 12851 LOOKUP(16, ABI_PCS_RO_data),
11c1ff18
PB
12852 LOOKUP(17, ABI_PCS_GOT_use),
12853 LOOKUP(18, ABI_PCS_wchar_t),
12854 LOOKUP(19, ABI_FP_rounding),
12855 LOOKUP(20, ABI_FP_denormal),
12856 LOOKUP(21, ABI_FP_exceptions),
12857 LOOKUP(22, ABI_FP_user_exceptions),
12858 LOOKUP(23, ABI_FP_number_model),
75375b3e
MGD
12859 {24, "ABI_align_needed", 0, NULL},
12860 {25, "ABI_align_preserved", 0, NULL},
11c1ff18
PB
12861 LOOKUP(26, ABI_enum_size),
12862 LOOKUP(27, ABI_HardFP_use),
12863 LOOKUP(28, ABI_VFP_args),
12864 LOOKUP(29, ABI_WMMX_args),
12865 LOOKUP(30, ABI_optimization_goals),
12866 LOOKUP(31, ABI_FP_optimization_goals),
8e79c3df 12867 {32, "compatibility", 0, NULL},
f5f53991 12868 LOOKUP(34, CPU_unaligned_access),
75375b3e 12869 LOOKUP(36, FP_HP_extension),
8e79c3df 12870 LOOKUP(38, ABI_FP_16bit_format),
cd21e546
MGD
12871 LOOKUP(42, MPextension_use),
12872 LOOKUP(44, DIV_use),
f5f53991
AS
12873 {64, "nodefaults", 0, NULL},
12874 {65, "also_compatible_with", 0, NULL},
12875 LOOKUP(66, T2EE_use),
12876 {67, "conformance", 1, NULL},
12877 LOOKUP(68, Virtualization_use),
cd21e546 12878 LOOKUP(70, MPextension_use_legacy)
11c1ff18
PB
12879};
12880#undef LOOKUP
12881
11c1ff18 12882static unsigned char *
f6f0e17b
NC
12883display_arm_attribute (unsigned char * p,
12884 const unsigned char * const end)
11c1ff18 12885{
70e99720 12886 unsigned int tag;
11c1ff18 12887 unsigned int len;
70e99720 12888 unsigned int val;
2cf0635d 12889 arm_attr_public_tag * attr;
11c1ff18 12890 unsigned i;
70e99720 12891 unsigned int type;
11c1ff18 12892
f6f0e17b 12893 tag = read_uleb128 (p, &len, end);
11c1ff18
PB
12894 p += len;
12895 attr = NULL;
2cf0635d 12896 for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
11c1ff18
PB
12897 {
12898 if (arm_attr_public_tags[i].tag == tag)
12899 {
12900 attr = &arm_attr_public_tags[i];
12901 break;
12902 }
12903 }
12904
12905 if (attr)
12906 {
12907 printf (" Tag_%s: ", attr->name);
12908 switch (attr->type)
12909 {
12910 case 0:
12911 switch (tag)
12912 {
12913 case 7: /* Tag_CPU_arch_profile. */
f6f0e17b 12914 val = read_uleb128 (p, &len, end);
11c1ff18
PB
12915 p += len;
12916 switch (val)
12917 {
2b692964
NC
12918 case 0: printf (_("None\n")); break;
12919 case 'A': printf (_("Application\n")); break;
12920 case 'R': printf (_("Realtime\n")); break;
12921 case 'M': printf (_("Microcontroller\n")); break;
12922 case 'S': printf (_("Application or Realtime\n")); break;
11c1ff18
PB
12923 default: printf ("??? (%d)\n", val); break;
12924 }
12925 break;
12926
75375b3e 12927 case 24: /* Tag_align_needed. */
f6f0e17b 12928 val = read_uleb128 (p, &len, end);
75375b3e
MGD
12929 p += len;
12930 switch (val)
12931 {
2b692964
NC
12932 case 0: printf (_("None\n")); break;
12933 case 1: printf (_("8-byte\n")); break;
12934 case 2: printf (_("4-byte\n")); break;
75375b3e
MGD
12935 case 3: printf ("??? 3\n"); break;
12936 default:
12937 if (val <= 12)
dd24e3da 12938 printf (_("8-byte and up to %d-byte extended\n"),
75375b3e
MGD
12939 1 << val);
12940 else
12941 printf ("??? (%d)\n", val);
12942 break;
12943 }
12944 break;
12945
12946 case 25: /* Tag_align_preserved. */
f6f0e17b 12947 val = read_uleb128 (p, &len, end);
75375b3e
MGD
12948 p += len;
12949 switch (val)
12950 {
2b692964
NC
12951 case 0: printf (_("None\n")); break;
12952 case 1: printf (_("8-byte, except leaf SP\n")); break;
12953 case 2: printf (_("8-byte\n")); break;
75375b3e
MGD
12954 case 3: printf ("??? 3\n"); break;
12955 default:
12956 if (val <= 12)
dd24e3da 12957 printf (_("8-byte and up to %d-byte extended\n"),
75375b3e
MGD
12958 1 << val);
12959 else
12960 printf ("??? (%d)\n", val);
12961 break;
12962 }
12963 break;
12964
11c1ff18 12965 case 32: /* Tag_compatibility. */
071436c6 12966 {
071436c6
NC
12967 val = read_uleb128 (p, &len, end);
12968 p += len;
071436c6 12969 printf (_("flag = %d, vendor = "), val);
4082ef84
NC
12970 if (p < end - 1)
12971 {
12972 size_t maxlen = (end - p) - 1;
12973
12974 print_symbol ((int) maxlen, (const char *) p);
12975 p += strnlen ((char *) p, maxlen) + 1;
12976 }
12977 else
12978 {
12979 printf (_("<corrupt>"));
12980 p = (unsigned char *) end;
12981 }
071436c6 12982 putchar ('\n');
071436c6 12983 }
11c1ff18
PB
12984 break;
12985
f5f53991 12986 case 64: /* Tag_nodefaults. */
541a3cbd
NC
12987 /* PR 17531: file: 001-505008-0.01. */
12988 if (p < end)
12989 p++;
2b692964 12990 printf (_("True\n"));
f5f53991
AS
12991 break;
12992
12993 case 65: /* Tag_also_compatible_with. */
f6f0e17b 12994 val = read_uleb128 (p, &len, end);
f5f53991
AS
12995 p += len;
12996 if (val == 6 /* Tag_CPU_arch. */)
12997 {
f6f0e17b 12998 val = read_uleb128 (p, &len, end);
f5f53991 12999 p += len;
071436c6 13000 if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
f5f53991
AS
13001 printf ("??? (%d)\n", val);
13002 else
13003 printf ("%s\n", arm_attr_tag_CPU_arch[val]);
13004 }
13005 else
13006 printf ("???\n");
071436c6
NC
13007 while (p < end && *(p++) != '\0' /* NUL terminator. */)
13008 ;
f5f53991
AS
13009 break;
13010
11c1ff18 13011 default:
bee0ee85
NC
13012 printf (_("<unknown: %d>\n"), tag);
13013 break;
11c1ff18
PB
13014 }
13015 return p;
13016
13017 case 1:
f6f0e17b 13018 return display_tag_value (-1, p, end);
11c1ff18 13019 case 2:
f6f0e17b 13020 return display_tag_value (0, p, end);
11c1ff18
PB
13021
13022 default:
13023 assert (attr->type & 0x80);
f6f0e17b 13024 val = read_uleb128 (p, &len, end);
11c1ff18
PB
13025 p += len;
13026 type = attr->type & 0x7f;
13027 if (val >= type)
13028 printf ("??? (%d)\n", val);
13029 else
13030 printf ("%s\n", attr->table[val]);
13031 return p;
13032 }
13033 }
11c1ff18 13034
f6f0e17b 13035 return display_tag_value (tag, p, end);
11c1ff18
PB
13036}
13037
104d59d1 13038static unsigned char *
60bca95a 13039display_gnu_attribute (unsigned char * p,
f6f0e17b
NC
13040 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const),
13041 const unsigned char * const end)
104d59d1
JM
13042{
13043 int tag;
13044 unsigned int len;
13045 int val;
104d59d1 13046
f6f0e17b 13047 tag = read_uleb128 (p, &len, end);
104d59d1
JM
13048 p += len;
13049
13050 /* Tag_compatibility is the only generic GNU attribute defined at
13051 present. */
13052 if (tag == 32)
13053 {
f6f0e17b 13054 val = read_uleb128 (p, &len, end);
104d59d1 13055 p += len;
071436c6
NC
13056
13057 printf (_("flag = %d, vendor = "), val);
f6f0e17b
NC
13058 if (p == end)
13059 {
071436c6 13060 printf (_("<corrupt>\n"));
f6f0e17b
NC
13061 warn (_("corrupt vendor attribute\n"));
13062 }
13063 else
13064 {
4082ef84
NC
13065 if (p < end - 1)
13066 {
13067 size_t maxlen = (end - p) - 1;
071436c6 13068
4082ef84
NC
13069 print_symbol ((int) maxlen, (const char *) p);
13070 p += strnlen ((char *) p, maxlen) + 1;
13071 }
13072 else
13073 {
13074 printf (_("<corrupt>"));
13075 p = (unsigned char *) end;
13076 }
071436c6 13077 putchar ('\n');
f6f0e17b 13078 }
104d59d1
JM
13079 return p;
13080 }
13081
13082 if ((tag & 2) == 0 && display_proc_gnu_attribute)
f6f0e17b 13083 return display_proc_gnu_attribute (p, tag, end);
104d59d1 13084
f6f0e17b 13085 return display_tag_value (tag, p, end);
104d59d1
JM
13086}
13087
34c8bcba 13088static unsigned char *
f6f0e17b
NC
13089display_power_gnu_attribute (unsigned char * p,
13090 int tag,
13091 const unsigned char * const end)
34c8bcba 13092{
34c8bcba
JM
13093 unsigned int len;
13094 int val;
13095
13096 if (tag == Tag_GNU_Power_ABI_FP)
13097 {
f6f0e17b 13098 val = read_uleb128 (p, &len, end);
34c8bcba
JM
13099 p += len;
13100 printf (" Tag_GNU_Power_ABI_FP: ");
60bca95a 13101
34c8bcba
JM
13102 switch (val)
13103 {
13104 case 0:
2b692964 13105 printf (_("Hard or soft float\n"));
34c8bcba
JM
13106 break;
13107 case 1:
2b692964 13108 printf (_("Hard float\n"));
34c8bcba
JM
13109 break;
13110 case 2:
2b692964 13111 printf (_("Soft float\n"));
34c8bcba 13112 break;
3c7b9897 13113 case 3:
2b692964 13114 printf (_("Single-precision hard float\n"));
3c7b9897 13115 break;
34c8bcba
JM
13116 default:
13117 printf ("??? (%d)\n", val);
13118 break;
13119 }
13120 return p;
13121 }
13122
c6e65352
DJ
13123 if (tag == Tag_GNU_Power_ABI_Vector)
13124 {
f6f0e17b 13125 val = read_uleb128 (p, &len, end);
c6e65352
DJ
13126 p += len;
13127 printf (" Tag_GNU_Power_ABI_Vector: ");
13128 switch (val)
13129 {
13130 case 0:
2b692964 13131 printf (_("Any\n"));
c6e65352
DJ
13132 break;
13133 case 1:
2b692964 13134 printf (_("Generic\n"));
c6e65352
DJ
13135 break;
13136 case 2:
13137 printf ("AltiVec\n");
13138 break;
13139 case 3:
13140 printf ("SPE\n");
13141 break;
13142 default:
13143 printf ("??? (%d)\n", val);
13144 break;
13145 }
13146 return p;
13147 }
13148
f82e0623
NF
13149 if (tag == Tag_GNU_Power_ABI_Struct_Return)
13150 {
f6f0e17b
NC
13151 if (p == end)
13152 {
071436c6 13153 warn (_("corrupt Tag_GNU_Power_ABI_Struct_Return\n"));
f6f0e17b
NC
13154 return p;
13155 }
0b4362b0 13156
f6f0e17b 13157 val = read_uleb128 (p, &len, end);
f82e0623
NF
13158 p += len;
13159 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
13160 switch (val)
13161 {
13162 case 0:
2b692964 13163 printf (_("Any\n"));
f82e0623
NF
13164 break;
13165 case 1:
13166 printf ("r3/r4\n");
13167 break;
13168 case 2:
2b692964 13169 printf (_("Memory\n"));
f82e0623
NF
13170 break;
13171 default:
13172 printf ("??? (%d)\n", val);
13173 break;
13174 }
13175 return p;
13176 }
13177
f6f0e17b 13178 return display_tag_value (tag & 1, p, end);
34c8bcba
JM
13179}
13180
643f7afb
AK
13181static unsigned char *
13182display_s390_gnu_attribute (unsigned char * p,
13183 int tag,
13184 const unsigned char * const end)
13185{
13186 unsigned int len;
13187 int val;
13188
13189 if (tag == Tag_GNU_S390_ABI_Vector)
13190 {
13191 val = read_uleb128 (p, &len, end);
13192 p += len;
13193 printf (" Tag_GNU_S390_ABI_Vector: ");
13194
13195 switch (val)
13196 {
13197 case 0:
13198 printf (_("any\n"));
13199 break;
13200 case 1:
13201 printf (_("software\n"));
13202 break;
13203 case 2:
13204 printf (_("hardware\n"));
13205 break;
13206 default:
13207 printf ("??? (%d)\n", val);
13208 break;
13209 }
13210 return p;
13211 }
13212
13213 return display_tag_value (tag & 1, p, end);
13214}
13215
9e8c70f9
DM
13216static void
13217display_sparc_hwcaps (int mask)
13218{
13219 if (mask)
13220 {
13221 int first = 1;
071436c6 13222
9e8c70f9
DM
13223 if (mask & ELF_SPARC_HWCAP_MUL32)
13224 fputs ("mul32", stdout), first = 0;
13225 if (mask & ELF_SPARC_HWCAP_DIV32)
13226 printf ("%sdiv32", first ? "" : "|"), first = 0;
13227 if (mask & ELF_SPARC_HWCAP_FSMULD)
13228 printf ("%sfsmuld", first ? "" : "|"), first = 0;
13229 if (mask & ELF_SPARC_HWCAP_V8PLUS)
13230 printf ("%sv8plus", first ? "" : "|"), first = 0;
13231 if (mask & ELF_SPARC_HWCAP_POPC)
13232 printf ("%spopc", first ? "" : "|"), first = 0;
13233 if (mask & ELF_SPARC_HWCAP_VIS)
13234 printf ("%svis", first ? "" : "|"), first = 0;
13235 if (mask & ELF_SPARC_HWCAP_VIS2)
13236 printf ("%svis2", first ? "" : "|"), first = 0;
13237 if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
13238 printf ("%sASIBlkInit", first ? "" : "|"), first = 0;
13239 if (mask & ELF_SPARC_HWCAP_FMAF)
13240 printf ("%sfmaf", first ? "" : "|"), first = 0;
13241 if (mask & ELF_SPARC_HWCAP_VIS3)
13242 printf ("%svis3", first ? "" : "|"), first = 0;
13243 if (mask & ELF_SPARC_HWCAP_HPC)
13244 printf ("%shpc", first ? "" : "|"), first = 0;
13245 if (mask & ELF_SPARC_HWCAP_RANDOM)
13246 printf ("%srandom", first ? "" : "|"), first = 0;
13247 if (mask & ELF_SPARC_HWCAP_TRANS)
13248 printf ("%strans", first ? "" : "|"), first = 0;
13249 if (mask & ELF_SPARC_HWCAP_FJFMAU)
13250 printf ("%sfjfmau", first ? "" : "|"), first = 0;
13251 if (mask & ELF_SPARC_HWCAP_IMA)
13252 printf ("%sima", first ? "" : "|"), first = 0;
13253 if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
13254 printf ("%scspare", first ? "" : "|"), first = 0;
13255 }
13256 else
071436c6
NC
13257 fputc ('0', stdout);
13258 fputc ('\n', stdout);
9e8c70f9
DM
13259}
13260
3d68f91c
JM
13261static void
13262display_sparc_hwcaps2 (int mask)
13263{
13264 if (mask)
13265 {
13266 int first = 1;
071436c6 13267
3d68f91c
JM
13268 if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
13269 fputs ("fjathplus", stdout), first = 0;
13270 if (mask & ELF_SPARC_HWCAP2_VIS3B)
13271 printf ("%svis3b", first ? "" : "|"), first = 0;
13272 if (mask & ELF_SPARC_HWCAP2_ADP)
13273 printf ("%sadp", first ? "" : "|"), first = 0;
13274 if (mask & ELF_SPARC_HWCAP2_SPARC5)
13275 printf ("%ssparc5", first ? "" : "|"), first = 0;
13276 if (mask & ELF_SPARC_HWCAP2_MWAIT)
13277 printf ("%smwait", first ? "" : "|"), first = 0;
13278 if (mask & ELF_SPARC_HWCAP2_XMPMUL)
13279 printf ("%sxmpmul", first ? "" : "|"), first = 0;
13280 if (mask & ELF_SPARC_HWCAP2_XMONT)
13281 printf ("%sxmont2", first ? "" : "|"), first = 0;
13282 if (mask & ELF_SPARC_HWCAP2_NSEC)
13283 printf ("%snsec", first ? "" : "|"), first = 0;
13284 if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
13285 printf ("%sfjathhpc", first ? "" : "|"), first = 0;
13286 if (mask & ELF_SPARC_HWCAP2_FJDES)
13287 printf ("%sfjdes", first ? "" : "|"), first = 0;
13288 if (mask & ELF_SPARC_HWCAP2_FJAES)
13289 printf ("%sfjaes", first ? "" : "|"), first = 0;
13290 }
13291 else
071436c6
NC
13292 fputc ('0', stdout);
13293 fputc ('\n', stdout);
3d68f91c
JM
13294}
13295
9e8c70f9 13296static unsigned char *
f6f0e17b
NC
13297display_sparc_gnu_attribute (unsigned char * p,
13298 int tag,
13299 const unsigned char * const end)
9e8c70f9 13300{
3d68f91c
JM
13301 unsigned int len;
13302 int val;
13303
9e8c70f9
DM
13304 if (tag == Tag_GNU_Sparc_HWCAPS)
13305 {
f6f0e17b 13306 val = read_uleb128 (p, &len, end);
9e8c70f9
DM
13307 p += len;
13308 printf (" Tag_GNU_Sparc_HWCAPS: ");
9e8c70f9
DM
13309 display_sparc_hwcaps (val);
13310 return p;
3d68f91c
JM
13311 }
13312 if (tag == Tag_GNU_Sparc_HWCAPS2)
13313 {
13314 val = read_uleb128 (p, &len, end);
13315 p += len;
13316 printf (" Tag_GNU_Sparc_HWCAPS2: ");
13317 display_sparc_hwcaps2 (val);
13318 return p;
13319 }
9e8c70f9 13320
f6f0e17b 13321 return display_tag_value (tag, p, end);
9e8c70f9
DM
13322}
13323
351cdf24
MF
13324static void
13325print_mips_fp_abi_value (int val)
13326{
13327 switch (val)
13328 {
13329 case Val_GNU_MIPS_ABI_FP_ANY:
13330 printf (_("Hard or soft float\n"));
13331 break;
13332 case Val_GNU_MIPS_ABI_FP_DOUBLE:
13333 printf (_("Hard float (double precision)\n"));
13334 break;
13335 case Val_GNU_MIPS_ABI_FP_SINGLE:
13336 printf (_("Hard float (single precision)\n"));
13337 break;
13338 case Val_GNU_MIPS_ABI_FP_SOFT:
13339 printf (_("Soft float\n"));
13340 break;
13341 case Val_GNU_MIPS_ABI_FP_OLD_64:
13342 printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
13343 break;
13344 case Val_GNU_MIPS_ABI_FP_XX:
13345 printf (_("Hard float (32-bit CPU, Any FPU)\n"));
13346 break;
13347 case Val_GNU_MIPS_ABI_FP_64:
13348 printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
13349 break;
13350 case Val_GNU_MIPS_ABI_FP_64A:
13351 printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
13352 break;
3350cc01
CM
13353 case Val_GNU_MIPS_ABI_FP_NAN2008:
13354 printf (_("NaN 2008 compatibility\n"));
13355 break;
351cdf24
MF
13356 default:
13357 printf ("??? (%d)\n", val);
13358 break;
13359 }
13360}
13361
2cf19d5c 13362static unsigned char *
f6f0e17b
NC
13363display_mips_gnu_attribute (unsigned char * p,
13364 int tag,
13365 const unsigned char * const end)
2cf19d5c 13366{
2cf19d5c
JM
13367 if (tag == Tag_GNU_MIPS_ABI_FP)
13368 {
f6f0e17b
NC
13369 unsigned int len;
13370 int val;
13371
13372 val = read_uleb128 (p, &len, end);
2cf19d5c
JM
13373 p += len;
13374 printf (" Tag_GNU_MIPS_ABI_FP: ");
60bca95a 13375
351cdf24
MF
13376 print_mips_fp_abi_value (val);
13377
2cf19d5c
JM
13378 return p;
13379 }
13380
a9f58168
CF
13381 if (tag == Tag_GNU_MIPS_ABI_MSA)
13382 {
13383 unsigned int len;
13384 int val;
13385
13386 val = read_uleb128 (p, &len, end);
13387 p += len;
13388 printf (" Tag_GNU_MIPS_ABI_MSA: ");
13389
13390 switch (val)
13391 {
13392 case Val_GNU_MIPS_ABI_MSA_ANY:
13393 printf (_("Any MSA or not\n"));
13394 break;
13395 case Val_GNU_MIPS_ABI_MSA_128:
13396 printf (_("128-bit MSA\n"));
13397 break;
13398 default:
13399 printf ("??? (%d)\n", val);
13400 break;
13401 }
13402 return p;
13403 }
13404
f6f0e17b 13405 return display_tag_value (tag & 1, p, end);
2cf19d5c
JM
13406}
13407
59e6276b 13408static unsigned char *
f6f0e17b
NC
13409display_tic6x_attribute (unsigned char * p,
13410 const unsigned char * const end)
59e6276b
JM
13411{
13412 int tag;
13413 unsigned int len;
13414 int val;
13415
f6f0e17b 13416 tag = read_uleb128 (p, &len, end);
59e6276b
JM
13417 p += len;
13418
13419 switch (tag)
13420 {
75fa6dc1 13421 case Tag_ISA:
f6f0e17b 13422 val = read_uleb128 (p, &len, end);
59e6276b 13423 p += len;
75fa6dc1 13424 printf (" Tag_ISA: ");
59e6276b
JM
13425
13426 switch (val)
13427 {
75fa6dc1 13428 case C6XABI_Tag_ISA_none:
59e6276b
JM
13429 printf (_("None\n"));
13430 break;
75fa6dc1 13431 case C6XABI_Tag_ISA_C62X:
59e6276b
JM
13432 printf ("C62x\n");
13433 break;
75fa6dc1 13434 case C6XABI_Tag_ISA_C67X:
59e6276b
JM
13435 printf ("C67x\n");
13436 break;
75fa6dc1 13437 case C6XABI_Tag_ISA_C67XP:
59e6276b
JM
13438 printf ("C67x+\n");
13439 break;
75fa6dc1 13440 case C6XABI_Tag_ISA_C64X:
59e6276b
JM
13441 printf ("C64x\n");
13442 break;
75fa6dc1 13443 case C6XABI_Tag_ISA_C64XP:
59e6276b
JM
13444 printf ("C64x+\n");
13445 break;
75fa6dc1 13446 case C6XABI_Tag_ISA_C674X:
59e6276b
JM
13447 printf ("C674x\n");
13448 break;
13449 default:
13450 printf ("??? (%d)\n", val);
13451 break;
13452 }
13453 return p;
13454
87779176 13455 case Tag_ABI_wchar_t:
f6f0e17b 13456 val = read_uleb128 (p, &len, end);
87779176
JM
13457 p += len;
13458 printf (" Tag_ABI_wchar_t: ");
13459 switch (val)
13460 {
13461 case 0:
13462 printf (_("Not used\n"));
13463 break;
13464 case 1:
13465 printf (_("2 bytes\n"));
13466 break;
13467 case 2:
13468 printf (_("4 bytes\n"));
13469 break;
13470 default:
13471 printf ("??? (%d)\n", val);
13472 break;
13473 }
13474 return p;
13475
13476 case Tag_ABI_stack_align_needed:
f6f0e17b 13477 val = read_uleb128 (p, &len, end);
87779176
JM
13478 p += len;
13479 printf (" Tag_ABI_stack_align_needed: ");
13480 switch (val)
13481 {
13482 case 0:
13483 printf (_("8-byte\n"));
13484 break;
13485 case 1:
13486 printf (_("16-byte\n"));
13487 break;
13488 default:
13489 printf ("??? (%d)\n", val);
13490 break;
13491 }
13492 return p;
13493
13494 case Tag_ABI_stack_align_preserved:
f6f0e17b 13495 val = read_uleb128 (p, &len, end);
87779176
JM
13496 p += len;
13497 printf (" Tag_ABI_stack_align_preserved: ");
13498 switch (val)
13499 {
13500 case 0:
13501 printf (_("8-byte\n"));
13502 break;
13503 case 1:
13504 printf (_("16-byte\n"));
13505 break;
13506 default:
13507 printf ("??? (%d)\n", val);
13508 break;
13509 }
13510 return p;
13511
b5593623 13512 case Tag_ABI_DSBT:
f6f0e17b 13513 val = read_uleb128 (p, &len, end);
b5593623
JM
13514 p += len;
13515 printf (" Tag_ABI_DSBT: ");
13516 switch (val)
13517 {
13518 case 0:
13519 printf (_("DSBT addressing not used\n"));
13520 break;
13521 case 1:
13522 printf (_("DSBT addressing used\n"));
13523 break;
13524 default:
13525 printf ("??? (%d)\n", val);
13526 break;
13527 }
13528 return p;
13529
87779176 13530 case Tag_ABI_PID:
f6f0e17b 13531 val = read_uleb128 (p, &len, end);
87779176
JM
13532 p += len;
13533 printf (" Tag_ABI_PID: ");
13534 switch (val)
13535 {
13536 case 0:
13537 printf (_("Data addressing position-dependent\n"));
13538 break;
13539 case 1:
13540 printf (_("Data addressing position-independent, GOT near DP\n"));
13541 break;
13542 case 2:
13543 printf (_("Data addressing position-independent, GOT far from DP\n"));
13544 break;
13545 default:
13546 printf ("??? (%d)\n", val);
13547 break;
13548 }
13549 return p;
13550
13551 case Tag_ABI_PIC:
f6f0e17b 13552 val = read_uleb128 (p, &len, end);
87779176
JM
13553 p += len;
13554 printf (" Tag_ABI_PIC: ");
13555 switch (val)
13556 {
13557 case 0:
13558 printf (_("Code addressing position-dependent\n"));
13559 break;
13560 case 1:
13561 printf (_("Code addressing position-independent\n"));
13562 break;
13563 default:
13564 printf ("??? (%d)\n", val);
13565 break;
13566 }
13567 return p;
13568
13569 case Tag_ABI_array_object_alignment:
f6f0e17b 13570 val = read_uleb128 (p, &len, end);
87779176
JM
13571 p += len;
13572 printf (" Tag_ABI_array_object_alignment: ");
13573 switch (val)
13574 {
13575 case 0:
13576 printf (_("8-byte\n"));
13577 break;
13578 case 1:
13579 printf (_("4-byte\n"));
13580 break;
13581 case 2:
13582 printf (_("16-byte\n"));
13583 break;
13584 default:
13585 printf ("??? (%d)\n", val);
13586 break;
13587 }
13588 return p;
13589
13590 case Tag_ABI_array_object_align_expected:
f6f0e17b 13591 val = read_uleb128 (p, &len, end);
87779176
JM
13592 p += len;
13593 printf (" Tag_ABI_array_object_align_expected: ");
13594 switch (val)
13595 {
13596 case 0:
13597 printf (_("8-byte\n"));
13598 break;
13599 case 1:
13600 printf (_("4-byte\n"));
13601 break;
13602 case 2:
13603 printf (_("16-byte\n"));
13604 break;
13605 default:
13606 printf ("??? (%d)\n", val);
13607 break;
13608 }
13609 return p;
13610
3cbd1c06 13611 case Tag_ABI_compatibility:
071436c6 13612 {
071436c6
NC
13613 val = read_uleb128 (p, &len, end);
13614 p += len;
13615 printf (" Tag_ABI_compatibility: ");
071436c6 13616 printf (_("flag = %d, vendor = "), val);
4082ef84
NC
13617 if (p < end - 1)
13618 {
13619 size_t maxlen = (end - p) - 1;
13620
13621 print_symbol ((int) maxlen, (const char *) p);
13622 p += strnlen ((char *) p, maxlen) + 1;
13623 }
13624 else
13625 {
13626 printf (_("<corrupt>"));
13627 p = (unsigned char *) end;
13628 }
071436c6 13629 putchar ('\n');
071436c6
NC
13630 return p;
13631 }
87779176
JM
13632
13633 case Tag_ABI_conformance:
071436c6 13634 {
4082ef84
NC
13635 printf (" Tag_ABI_conformance: \"");
13636 if (p < end - 1)
13637 {
13638 size_t maxlen = (end - p) - 1;
071436c6 13639
4082ef84
NC
13640 print_symbol ((int) maxlen, (const char *) p);
13641 p += strnlen ((char *) p, maxlen) + 1;
13642 }
13643 else
13644 {
13645 printf (_("<corrupt>"));
13646 p = (unsigned char *) end;
13647 }
071436c6 13648 printf ("\"\n");
071436c6
NC
13649 return p;
13650 }
59e6276b
JM
13651 }
13652
f6f0e17b
NC
13653 return display_tag_value (tag, p, end);
13654}
59e6276b 13655
f6f0e17b
NC
13656static void
13657display_raw_attribute (unsigned char * p, unsigned char * end)
13658{
13659 unsigned long addr = 0;
13660 size_t bytes = end - p;
13661
e0a31db1 13662 assert (end > p);
f6f0e17b 13663 while (bytes)
87779176 13664 {
f6f0e17b
NC
13665 int j;
13666 int k;
13667 int lbytes = (bytes > 16 ? 16 : bytes);
13668
13669 printf (" 0x%8.8lx ", addr);
13670
13671 for (j = 0; j < 16; j++)
13672 {
13673 if (j < lbytes)
13674 printf ("%2.2x", p[j]);
13675 else
13676 printf (" ");
13677
13678 if ((j & 3) == 3)
13679 printf (" ");
13680 }
13681
13682 for (j = 0; j < lbytes; j++)
13683 {
13684 k = p[j];
13685 if (k >= ' ' && k < 0x7f)
13686 printf ("%c", k);
13687 else
13688 printf (".");
13689 }
13690
13691 putchar ('\n');
13692
13693 p += lbytes;
13694 bytes -= lbytes;
13695 addr += lbytes;
87779176 13696 }
59e6276b 13697
f6f0e17b 13698 putchar ('\n');
59e6276b
JM
13699}
13700
13761a11
NC
13701static unsigned char *
13702display_msp430x_attribute (unsigned char * p,
13703 const unsigned char * const end)
13704{
13705 unsigned int len;
13706 int val;
13707 int tag;
13708
13709 tag = read_uleb128 (p, & len, end);
13710 p += len;
0b4362b0 13711
13761a11
NC
13712 switch (tag)
13713 {
13714 case OFBA_MSPABI_Tag_ISA:
13715 val = read_uleb128 (p, &len, end);
13716 p += len;
13717 printf (" Tag_ISA: ");
13718 switch (val)
13719 {
13720 case 0: printf (_("None\n")); break;
13721 case 1: printf (_("MSP430\n")); break;
13722 case 2: printf (_("MSP430X\n")); break;
13723 default: printf ("??? (%d)\n", val); break;
13724 }
13725 break;
13726
13727 case OFBA_MSPABI_Tag_Code_Model:
13728 val = read_uleb128 (p, &len, end);
13729 p += len;
13730 printf (" Tag_Code_Model: ");
13731 switch (val)
13732 {
13733 case 0: printf (_("None\n")); break;
13734 case 1: printf (_("Small\n")); break;
13735 case 2: printf (_("Large\n")); break;
13736 default: printf ("??? (%d)\n", val); break;
13737 }
13738 break;
13739
13740 case OFBA_MSPABI_Tag_Data_Model:
13741 val = read_uleb128 (p, &len, end);
13742 p += len;
13743 printf (" Tag_Data_Model: ");
13744 switch (val)
13745 {
13746 case 0: printf (_("None\n")); break;
13747 case 1: printf (_("Small\n")); break;
13748 case 2: printf (_("Large\n")); break;
13749 case 3: printf (_("Restricted Large\n")); break;
13750 default: printf ("??? (%d)\n", val); break;
13751 }
13752 break;
13753
13754 default:
13755 printf (_(" <unknown tag %d>: "), tag);
13756
13757 if (tag & 1)
13758 {
071436c6 13759 putchar ('"');
4082ef84
NC
13760 if (p < end - 1)
13761 {
13762 size_t maxlen = (end - p) - 1;
13763
13764 print_symbol ((int) maxlen, (const char *) p);
13765 p += strnlen ((char *) p, maxlen) + 1;
13766 }
13767 else
13768 {
13769 printf (_("<corrupt>"));
13770 p = (unsigned char *) end;
13771 }
071436c6 13772 printf ("\"\n");
13761a11
NC
13773 }
13774 else
13775 {
13776 val = read_uleb128 (p, &len, end);
13777 p += len;
13778 printf ("%d (0x%x)\n", val, val);
13779 }
13780 break;
13781 }
13782
4082ef84 13783 assert (p <= end);
13761a11
NC
13784 return p;
13785}
13786
11c1ff18 13787static int
60bca95a
NC
13788process_attributes (FILE * file,
13789 const char * public_name,
104d59d1 13790 unsigned int proc_type,
f6f0e17b
NC
13791 unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
13792 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const))
11c1ff18 13793{
2cf0635d 13794 Elf_Internal_Shdr * sect;
11c1ff18
PB
13795 unsigned i;
13796
13797 /* Find the section header so that we get the size. */
13798 for (i = 0, sect = section_headers;
13799 i < elf_header.e_shnum;
13800 i++, sect++)
13801 {
071436c6
NC
13802 unsigned char * contents;
13803 unsigned char * p;
13804
104d59d1 13805 if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
11c1ff18
PB
13806 continue;
13807
3f5e193b
NC
13808 contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
13809 sect->sh_size, _("attributes"));
60bca95a 13810 if (contents == NULL)
11c1ff18 13811 continue;
60bca95a 13812
11c1ff18
PB
13813 p = contents;
13814 if (*p == 'A')
13815 {
071436c6
NC
13816 bfd_vma section_len;
13817
13818 section_len = sect->sh_size - 1;
11c1ff18 13819 p++;
60bca95a 13820
071436c6 13821 while (section_len > 0)
11c1ff18 13822 {
071436c6 13823 bfd_vma attr_len;
e9847026 13824 unsigned int namelen;
11c1ff18 13825 bfd_boolean public_section;
104d59d1 13826 bfd_boolean gnu_section;
11c1ff18 13827
071436c6 13828 if (section_len <= 4)
e0a31db1
NC
13829 {
13830 error (_("Tag section ends prematurely\n"));
13831 break;
13832 }
071436c6 13833 attr_len = byte_get (p, 4);
11c1ff18 13834 p += 4;
60bca95a 13835
071436c6 13836 if (attr_len > section_len)
11c1ff18 13837 {
071436c6
NC
13838 error (_("Bad attribute length (%u > %u)\n"),
13839 (unsigned) attr_len, (unsigned) section_len);
13840 attr_len = section_len;
11c1ff18 13841 }
74e1a04b 13842 /* PR 17531: file: 001-101425-0.004 */
071436c6 13843 else if (attr_len < 5)
74e1a04b 13844 {
071436c6 13845 error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
74e1a04b
NC
13846 break;
13847 }
e9847026 13848
071436c6
NC
13849 section_len -= attr_len;
13850 attr_len -= 4;
13851
13852 namelen = strnlen ((char *) p, attr_len) + 1;
13853 if (namelen == 0 || namelen >= attr_len)
e9847026
NC
13854 {
13855 error (_("Corrupt attribute section name\n"));
13856 break;
13857 }
13858
071436c6
NC
13859 printf (_("Attribute Section: "));
13860 print_symbol (INT_MAX, (const char *) p);
13861 putchar ('\n');
60bca95a
NC
13862
13863 if (public_name && streq ((char *) p, public_name))
11c1ff18
PB
13864 public_section = TRUE;
13865 else
13866 public_section = FALSE;
60bca95a
NC
13867
13868 if (streq ((char *) p, "gnu"))
104d59d1
JM
13869 gnu_section = TRUE;
13870 else
13871 gnu_section = FALSE;
60bca95a 13872
11c1ff18 13873 p += namelen;
071436c6 13874 attr_len -= namelen;
e0a31db1 13875
071436c6 13876 while (attr_len > 0 && p < contents + sect->sh_size)
11c1ff18 13877 {
e0a31db1 13878 int tag;
11c1ff18
PB
13879 int val;
13880 bfd_vma size;
071436c6 13881 unsigned char * end;
60bca95a 13882
e0a31db1 13883 /* PR binutils/17531: Safe handling of corrupt files. */
071436c6 13884 if (attr_len < 6)
e0a31db1
NC
13885 {
13886 error (_("Unused bytes at end of section\n"));
13887 section_len = 0;
13888 break;
13889 }
13890
13891 tag = *(p++);
11c1ff18 13892 size = byte_get (p, 4);
071436c6 13893 if (size > attr_len)
11c1ff18 13894 {
e9847026 13895 error (_("Bad subsection length (%u > %u)\n"),
071436c6
NC
13896 (unsigned) size, (unsigned) attr_len);
13897 size = attr_len;
11c1ff18 13898 }
e0a31db1
NC
13899 /* PR binutils/17531: Safe handling of corrupt files. */
13900 if (size < 6)
13901 {
13902 error (_("Bad subsection length (%u < 6)\n"),
13903 (unsigned) size);
13904 section_len = 0;
13905 break;
13906 }
60bca95a 13907
071436c6 13908 attr_len -= size;
11c1ff18 13909 end = p + size - 1;
071436c6 13910 assert (end <= contents + sect->sh_size);
11c1ff18 13911 p += 4;
60bca95a 13912
11c1ff18
PB
13913 switch (tag)
13914 {
13915 case 1:
2b692964 13916 printf (_("File Attributes\n"));
11c1ff18
PB
13917 break;
13918 case 2:
2b692964 13919 printf (_("Section Attributes:"));
11c1ff18
PB
13920 goto do_numlist;
13921 case 3:
2b692964 13922 printf (_("Symbol Attributes:"));
11c1ff18
PB
13923 do_numlist:
13924 for (;;)
13925 {
91d6fa6a 13926 unsigned int j;
60bca95a 13927
f6f0e17b 13928 val = read_uleb128 (p, &j, end);
91d6fa6a 13929 p += j;
11c1ff18
PB
13930 if (val == 0)
13931 break;
13932 printf (" %d", val);
13933 }
13934 printf ("\n");
13935 break;
13936 default:
2b692964 13937 printf (_("Unknown tag: %d\n"), tag);
11c1ff18
PB
13938 public_section = FALSE;
13939 break;
13940 }
60bca95a 13941
071436c6 13942 if (public_section && display_pub_attribute != NULL)
11c1ff18
PB
13943 {
13944 while (p < end)
f6f0e17b 13945 p = display_pub_attribute (p, end);
071436c6 13946 assert (p <= end);
104d59d1 13947 }
071436c6 13948 else if (gnu_section && display_proc_gnu_attribute != NULL)
104d59d1
JM
13949 {
13950 while (p < end)
13951 p = display_gnu_attribute (p,
f6f0e17b
NC
13952 display_proc_gnu_attribute,
13953 end);
071436c6 13954 assert (p <= end);
11c1ff18 13955 }
071436c6 13956 else if (p < end)
11c1ff18 13957 {
071436c6 13958 printf (_(" Unknown attribute:\n"));
f6f0e17b 13959 display_raw_attribute (p, end);
11c1ff18
PB
13960 p = end;
13961 }
071436c6
NC
13962 else
13963 attr_len = 0;
11c1ff18
PB
13964 }
13965 }
13966 }
13967 else
e9847026 13968 printf (_("Unknown format '%c' (%d)\n"), *p, *p);
d70c5fc7 13969
60bca95a 13970 free (contents);
11c1ff18
PB
13971 }
13972 return 1;
13973}
13974
104d59d1 13975static int
2cf0635d 13976process_arm_specific (FILE * file)
104d59d1
JM
13977{
13978 return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
13979 display_arm_attribute, NULL);
13980}
13981
34c8bcba 13982static int
2cf0635d 13983process_power_specific (FILE * file)
34c8bcba
JM
13984{
13985 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13986 display_power_gnu_attribute);
13987}
13988
643f7afb
AK
13989static int
13990process_s390_specific (FILE * file)
13991{
13992 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13993 display_s390_gnu_attribute);
13994}
13995
9e8c70f9
DM
13996static int
13997process_sparc_specific (FILE * file)
13998{
13999 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14000 display_sparc_gnu_attribute);
14001}
14002
59e6276b
JM
14003static int
14004process_tic6x_specific (FILE * file)
14005{
14006 return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
14007 display_tic6x_attribute, NULL);
14008}
14009
13761a11
NC
14010static int
14011process_msp430x_specific (FILE * file)
14012{
14013 return process_attributes (file, "mspabi", SHT_MSP430_ATTRIBUTES,
14014 display_msp430x_attribute, NULL);
14015}
14016
ccb4c951
RS
14017/* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
14018 Print the Address, Access and Initial fields of an entry at VMA ADDR
82b1b41b
NC
14019 and return the VMA of the next entry, or -1 if there was a problem.
14020 Does not read from DATA_END or beyond. */
ccb4c951
RS
14021
14022static bfd_vma
82b1b41b
NC
14023print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
14024 unsigned char * data_end)
ccb4c951
RS
14025{
14026 printf (" ");
14027 print_vma (addr, LONG_HEX);
14028 printf (" ");
14029 if (addr < pltgot + 0xfff0)
14030 printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
14031 else
14032 printf ("%10s", "");
14033 printf (" ");
14034 if (data == NULL)
2b692964 14035 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
ccb4c951
RS
14036 else
14037 {
14038 bfd_vma entry;
82b1b41b 14039 unsigned char * from = data + addr - pltgot;
ccb4c951 14040
82b1b41b
NC
14041 if (from + (is_32bit_elf ? 4 : 8) > data_end)
14042 {
14043 warn (_("MIPS GOT entry extends beyond the end of available data\n"));
14044 printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
14045 return (bfd_vma) -1;
14046 }
14047 else
14048 {
14049 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14050 print_vma (entry, LONG_HEX);
14051 }
ccb4c951
RS
14052 }
14053 return addr + (is_32bit_elf ? 4 : 8);
14054}
14055
861fb55a
DJ
14056/* DATA points to the contents of a MIPS PLT GOT that starts at VMA
14057 PLTGOT. Print the Address and Initial fields of an entry at VMA
14058 ADDR and return the VMA of the next entry. */
14059
14060static bfd_vma
2cf0635d 14061print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
861fb55a
DJ
14062{
14063 printf (" ");
14064 print_vma (addr, LONG_HEX);
14065 printf (" ");
14066 if (data == NULL)
2b692964 14067 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
861fb55a
DJ
14068 else
14069 {
14070 bfd_vma entry;
14071
14072 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14073 print_vma (entry, LONG_HEX);
14074 }
14075 return addr + (is_32bit_elf ? 4 : 8);
14076}
14077
351cdf24
MF
14078static void
14079print_mips_ases (unsigned int mask)
14080{
14081 if (mask & AFL_ASE_DSP)
14082 fputs ("\n\tDSP ASE", stdout);
14083 if (mask & AFL_ASE_DSPR2)
14084 fputs ("\n\tDSP R2 ASE", stdout);
14085 if (mask & AFL_ASE_EVA)
14086 fputs ("\n\tEnhanced VA Scheme", stdout);
14087 if (mask & AFL_ASE_MCU)
14088 fputs ("\n\tMCU (MicroController) ASE", stdout);
14089 if (mask & AFL_ASE_MDMX)
14090 fputs ("\n\tMDMX ASE", stdout);
14091 if (mask & AFL_ASE_MIPS3D)
14092 fputs ("\n\tMIPS-3D ASE", stdout);
14093 if (mask & AFL_ASE_MT)
14094 fputs ("\n\tMT ASE", stdout);
14095 if (mask & AFL_ASE_SMARTMIPS)
14096 fputs ("\n\tSmartMIPS ASE", stdout);
14097 if (mask & AFL_ASE_VIRT)
14098 fputs ("\n\tVZ ASE", stdout);
14099 if (mask & AFL_ASE_MSA)
14100 fputs ("\n\tMSA ASE", stdout);
14101 if (mask & AFL_ASE_MIPS16)
14102 fputs ("\n\tMIPS16 ASE", stdout);
14103 if (mask & AFL_ASE_MICROMIPS)
14104 fputs ("\n\tMICROMIPS ASE", stdout);
14105 if (mask & AFL_ASE_XPA)
14106 fputs ("\n\tXPA ASE", stdout);
14107 if (mask == 0)
14108 fprintf (stdout, "\n\t%s", _("None"));
00ac7aa0
MF
14109 else if ((mask & ~AFL_ASE_MASK) != 0)
14110 fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
351cdf24
MF
14111}
14112
14113static void
14114print_mips_isa_ext (unsigned int isa_ext)
14115{
14116 switch (isa_ext)
14117 {
14118 case 0:
14119 fputs (_("None"), stdout);
14120 break;
14121 case AFL_EXT_XLR:
14122 fputs ("RMI XLR", stdout);
14123 break;
2c629856
N
14124 case AFL_EXT_OCTEON3:
14125 fputs ("Cavium Networks Octeon3", stdout);
14126 break;
351cdf24
MF
14127 case AFL_EXT_OCTEON2:
14128 fputs ("Cavium Networks Octeon2", stdout);
14129 break;
14130 case AFL_EXT_OCTEONP:
14131 fputs ("Cavium Networks OcteonP", stdout);
14132 break;
14133 case AFL_EXT_LOONGSON_3A:
14134 fputs ("Loongson 3A", stdout);
14135 break;
14136 case AFL_EXT_OCTEON:
14137 fputs ("Cavium Networks Octeon", stdout);
14138 break;
14139 case AFL_EXT_5900:
14140 fputs ("Toshiba R5900", stdout);
14141 break;
14142 case AFL_EXT_4650:
14143 fputs ("MIPS R4650", stdout);
14144 break;
14145 case AFL_EXT_4010:
14146 fputs ("LSI R4010", stdout);
14147 break;
14148 case AFL_EXT_4100:
14149 fputs ("NEC VR4100", stdout);
14150 break;
14151 case AFL_EXT_3900:
14152 fputs ("Toshiba R3900", stdout);
14153 break;
14154 case AFL_EXT_10000:
14155 fputs ("MIPS R10000", stdout);
14156 break;
14157 case AFL_EXT_SB1:
14158 fputs ("Broadcom SB-1", stdout);
14159 break;
14160 case AFL_EXT_4111:
14161 fputs ("NEC VR4111/VR4181", stdout);
14162 break;
14163 case AFL_EXT_4120:
14164 fputs ("NEC VR4120", stdout);
14165 break;
14166 case AFL_EXT_5400:
14167 fputs ("NEC VR5400", stdout);
14168 break;
14169 case AFL_EXT_5500:
14170 fputs ("NEC VR5500", stdout);
14171 break;
14172 case AFL_EXT_LOONGSON_2E:
14173 fputs ("ST Microelectronics Loongson 2E", stdout);
14174 break;
14175 case AFL_EXT_LOONGSON_2F:
14176 fputs ("ST Microelectronics Loongson 2F", stdout);
14177 break;
14178 default:
00ac7aa0 14179 fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
351cdf24
MF
14180 }
14181}
14182
14183static int
14184get_mips_reg_size (int reg_size)
14185{
14186 return (reg_size == AFL_REG_NONE) ? 0
14187 : (reg_size == AFL_REG_32) ? 32
14188 : (reg_size == AFL_REG_64) ? 64
14189 : (reg_size == AFL_REG_128) ? 128
14190 : -1;
14191}
14192
19e6b90e 14193static int
2cf0635d 14194process_mips_specific (FILE * file)
5b18a4bc 14195{
2cf0635d 14196 Elf_Internal_Dyn * entry;
351cdf24 14197 Elf_Internal_Shdr *sect = NULL;
19e6b90e
L
14198 size_t liblist_offset = 0;
14199 size_t liblistno = 0;
14200 size_t conflictsno = 0;
14201 size_t options_offset = 0;
14202 size_t conflicts_offset = 0;
861fb55a
DJ
14203 size_t pltrelsz = 0;
14204 size_t pltrel = 0;
ccb4c951 14205 bfd_vma pltgot = 0;
861fb55a
DJ
14206 bfd_vma mips_pltgot = 0;
14207 bfd_vma jmprel = 0;
ccb4c951
RS
14208 bfd_vma local_gotno = 0;
14209 bfd_vma gotsym = 0;
14210 bfd_vma symtabno = 0;
103f02d3 14211
2cf19d5c
JM
14212 process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14213 display_mips_gnu_attribute);
14214
351cdf24
MF
14215 sect = find_section (".MIPS.abiflags");
14216
14217 if (sect != NULL)
14218 {
14219 Elf_External_ABIFlags_v0 *abiflags_ext;
14220 Elf_Internal_ABIFlags_v0 abiflags_in;
14221
14222 if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
14223 fputs ("\nCorrupt ABI Flags section.\n", stdout);
14224 else
14225 {
14226 abiflags_ext = get_data (NULL, file, sect->sh_offset, 1,
14227 sect->sh_size, _("MIPS ABI Flags section"));
14228 if (abiflags_ext)
14229 {
14230 abiflags_in.version = BYTE_GET (abiflags_ext->version);
14231 abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
14232 abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
14233 abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
14234 abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
14235 abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
14236 abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
14237 abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
14238 abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
14239 abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
14240 abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
14241
14242 printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
14243 printf ("\nISA: MIPS%d", abiflags_in.isa_level);
14244 if (abiflags_in.isa_rev > 1)
14245 printf ("r%d", abiflags_in.isa_rev);
14246 printf ("\nGPR size: %d",
14247 get_mips_reg_size (abiflags_in.gpr_size));
14248 printf ("\nCPR1 size: %d",
14249 get_mips_reg_size (abiflags_in.cpr1_size));
14250 printf ("\nCPR2 size: %d",
14251 get_mips_reg_size (abiflags_in.cpr2_size));
14252 fputs ("\nFP ABI: ", stdout);
14253 print_mips_fp_abi_value (abiflags_in.fp_abi);
14254 fputs ("ISA Extension: ", stdout);
14255 print_mips_isa_ext (abiflags_in.isa_ext);
14256 fputs ("\nASEs:", stdout);
14257 print_mips_ases (abiflags_in.ases);
14258 printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
14259 printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
14260 fputc ('\n', stdout);
14261 free (abiflags_ext);
14262 }
14263 }
14264 }
14265
19e6b90e
L
14266 /* We have a lot of special sections. Thanks SGI! */
14267 if (dynamic_section == NULL)
14268 /* No information available. */
14269 return 0;
252b5132 14270
071436c6
NC
14271 for (entry = dynamic_section;
14272 /* PR 17531 file: 012-50589-0.004. */
14273 entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
14274 ++entry)
252b5132
RH
14275 switch (entry->d_tag)
14276 {
14277 case DT_MIPS_LIBLIST:
d93f0186
NC
14278 liblist_offset
14279 = offset_from_vma (file, entry->d_un.d_val,
14280 liblistno * sizeof (Elf32_External_Lib));
252b5132
RH
14281 break;
14282 case DT_MIPS_LIBLISTNO:
14283 liblistno = entry->d_un.d_val;
14284 break;
14285 case DT_MIPS_OPTIONS:
d93f0186 14286 options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
252b5132
RH
14287 break;
14288 case DT_MIPS_CONFLICT:
d93f0186
NC
14289 conflicts_offset
14290 = offset_from_vma (file, entry->d_un.d_val,
14291 conflictsno * sizeof (Elf32_External_Conflict));
252b5132
RH
14292 break;
14293 case DT_MIPS_CONFLICTNO:
14294 conflictsno = entry->d_un.d_val;
14295 break;
ccb4c951 14296 case DT_PLTGOT:
861fb55a
DJ
14297 pltgot = entry->d_un.d_ptr;
14298 break;
ccb4c951
RS
14299 case DT_MIPS_LOCAL_GOTNO:
14300 local_gotno = entry->d_un.d_val;
14301 break;
14302 case DT_MIPS_GOTSYM:
14303 gotsym = entry->d_un.d_val;
14304 break;
14305 case DT_MIPS_SYMTABNO:
14306 symtabno = entry->d_un.d_val;
14307 break;
861fb55a
DJ
14308 case DT_MIPS_PLTGOT:
14309 mips_pltgot = entry->d_un.d_ptr;
14310 break;
14311 case DT_PLTREL:
14312 pltrel = entry->d_un.d_val;
14313 break;
14314 case DT_PLTRELSZ:
14315 pltrelsz = entry->d_un.d_val;
14316 break;
14317 case DT_JMPREL:
14318 jmprel = entry->d_un.d_ptr;
14319 break;
252b5132
RH
14320 default:
14321 break;
14322 }
14323
14324 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
14325 {
2cf0635d 14326 Elf32_External_Lib * elib;
252b5132
RH
14327 size_t cnt;
14328
3f5e193b
NC
14329 elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
14330 liblistno,
14331 sizeof (Elf32_External_Lib),
9cf03b7e 14332 _("liblist section data"));
a6e9f9df 14333 if (elib)
252b5132 14334 {
2b692964 14335 printf (_("\nSection '.liblist' contains %lu entries:\n"),
a6e9f9df 14336 (unsigned long) liblistno);
2b692964 14337 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
a6e9f9df
AM
14338 stdout);
14339
14340 for (cnt = 0; cnt < liblistno; ++cnt)
252b5132 14341 {
a6e9f9df 14342 Elf32_Lib liblist;
91d6fa6a 14343 time_t atime;
a6e9f9df 14344 char timebuf[20];
2cf0635d 14345 struct tm * tmp;
a6e9f9df
AM
14346
14347 liblist.l_name = BYTE_GET (elib[cnt].l_name);
91d6fa6a 14348 atime = BYTE_GET (elib[cnt].l_time_stamp);
a6e9f9df
AM
14349 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
14350 liblist.l_version = BYTE_GET (elib[cnt].l_version);
14351 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
14352
91d6fa6a 14353 tmp = gmtime (&atime);
e9e44622
JJ
14354 snprintf (timebuf, sizeof (timebuf),
14355 "%04u-%02u-%02uT%02u:%02u:%02u",
14356 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
14357 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
a6e9f9df 14358
31104126 14359 printf ("%3lu: ", (unsigned long) cnt);
d79b3d50
NC
14360 if (VALID_DYNAMIC_NAME (liblist.l_name))
14361 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
14362 else
2b692964 14363 printf (_("<corrupt: %9ld>"), liblist.l_name);
31104126
NC
14364 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
14365 liblist.l_version);
a6e9f9df
AM
14366
14367 if (liblist.l_flags == 0)
2b692964 14368 puts (_(" NONE"));
a6e9f9df
AM
14369 else
14370 {
14371 static const struct
252b5132 14372 {
2cf0635d 14373 const char * name;
a6e9f9df 14374 int bit;
252b5132 14375 }
a6e9f9df
AM
14376 l_flags_vals[] =
14377 {
14378 { " EXACT_MATCH", LL_EXACT_MATCH },
14379 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
14380 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
14381 { " EXPORTS", LL_EXPORTS },
14382 { " DELAY_LOAD", LL_DELAY_LOAD },
14383 { " DELTA", LL_DELTA }
14384 };
14385 int flags = liblist.l_flags;
14386 size_t fcnt;
14387
60bca95a 14388 for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
a6e9f9df
AM
14389 if ((flags & l_flags_vals[fcnt].bit) != 0)
14390 {
14391 fputs (l_flags_vals[fcnt].name, stdout);
14392 flags ^= l_flags_vals[fcnt].bit;
14393 }
14394 if (flags != 0)
14395 printf (" %#x", (unsigned int) flags);
252b5132 14396
a6e9f9df
AM
14397 puts ("");
14398 }
252b5132 14399 }
252b5132 14400
a6e9f9df
AM
14401 free (elib);
14402 }
252b5132
RH
14403 }
14404
14405 if (options_offset != 0)
14406 {
2cf0635d 14407 Elf_External_Options * eopt;
2cf0635d
NC
14408 Elf_Internal_Options * iopt;
14409 Elf_Internal_Options * option;
252b5132
RH
14410 size_t offset;
14411 int cnt;
351cdf24 14412 sect = section_headers;
252b5132
RH
14413
14414 /* Find the section header so that we get the size. */
071436c6 14415 sect = find_section_by_type (SHT_MIPS_OPTIONS);
948f632f 14416 /* PR 17533 file: 012-277276-0.004. */
071436c6
NC
14417 if (sect == NULL)
14418 {
14419 error (_("No MIPS_OPTIONS header found\n"));
14420 return 0;
14421 }
252b5132 14422
3f5e193b
NC
14423 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
14424 sect->sh_size, _("options"));
a6e9f9df 14425 if (eopt)
252b5132 14426 {
3f5e193b
NC
14427 iopt = (Elf_Internal_Options *)
14428 cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
a6e9f9df
AM
14429 if (iopt == NULL)
14430 {
8b73c356 14431 error (_("Out of memory allocatinf space for MIPS options\n"));
a6e9f9df
AM
14432 return 0;
14433 }
76da6bbe 14434
a6e9f9df
AM
14435 offset = cnt = 0;
14436 option = iopt;
252b5132 14437
82b1b41b 14438 while (offset <= sect->sh_size - sizeof (* eopt))
a6e9f9df 14439 {
2cf0635d 14440 Elf_External_Options * eoption;
252b5132 14441
a6e9f9df 14442 eoption = (Elf_External_Options *) ((char *) eopt + offset);
252b5132 14443
a6e9f9df
AM
14444 option->kind = BYTE_GET (eoption->kind);
14445 option->size = BYTE_GET (eoption->size);
14446 option->section = BYTE_GET (eoption->section);
14447 option->info = BYTE_GET (eoption->info);
76da6bbe 14448
82b1b41b
NC
14449 /* PR 17531: file: ffa0fa3b. */
14450 if (option->size < sizeof (* eopt)
14451 || offset + option->size > sect->sh_size)
14452 {
55325047
NC
14453 error (_("Invalid size (%u) for MIPS option\n"), option->size);
14454 return 0;
82b1b41b 14455 }
a6e9f9df 14456 offset += option->size;
14ae95f2 14457
a6e9f9df
AM
14458 ++option;
14459 ++cnt;
14460 }
252b5132 14461
a6e9f9df 14462 printf (_("\nSection '%s' contains %d entries:\n"),
74e1a04b 14463 printable_section_name (sect), cnt);
76da6bbe 14464
a6e9f9df 14465 option = iopt;
82b1b41b 14466 offset = 0;
252b5132 14467
a6e9f9df 14468 while (cnt-- > 0)
252b5132 14469 {
a6e9f9df
AM
14470 size_t len;
14471
14472 switch (option->kind)
252b5132 14473 {
a6e9f9df
AM
14474 case ODK_NULL:
14475 /* This shouldn't happen. */
14476 printf (" NULL %d %lx", option->section, option->info);
14477 break;
14478 case ODK_REGINFO:
14479 printf (" REGINFO ");
14480 if (elf_header.e_machine == EM_MIPS)
14481 {
14482 /* 32bit form. */
2cf0635d 14483 Elf32_External_RegInfo * ereg;
b34976b6 14484 Elf32_RegInfo reginfo;
a6e9f9df
AM
14485
14486 ereg = (Elf32_External_RegInfo *) (option + 1);
14487 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
14488 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
14489 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
14490 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
14491 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
14492 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
14493
14494 printf ("GPR %08lx GP 0x%lx\n",
14495 reginfo.ri_gprmask,
14496 (unsigned long) reginfo.ri_gp_value);
14497 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
14498 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
14499 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
14500 }
14501 else
14502 {
14503 /* 64 bit form. */
2cf0635d 14504 Elf64_External_RegInfo * ereg;
a6e9f9df
AM
14505 Elf64_Internal_RegInfo reginfo;
14506
14507 ereg = (Elf64_External_RegInfo *) (option + 1);
14508 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
14509 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
14510 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
14511 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
14512 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
66543521 14513 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
a6e9f9df
AM
14514
14515 printf ("GPR %08lx GP 0x",
14516 reginfo.ri_gprmask);
14517 printf_vma (reginfo.ri_gp_value);
14518 printf ("\n");
14519
14520 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
14521 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
14522 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
14523 }
14524 ++option;
14525 continue;
14526 case ODK_EXCEPTIONS:
14527 fputs (" EXCEPTIONS fpe_min(", stdout);
14528 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
14529 fputs (") fpe_max(", stdout);
14530 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
14531 fputs (")", stdout);
14532
14533 if (option->info & OEX_PAGE0)
14534 fputs (" PAGE0", stdout);
14535 if (option->info & OEX_SMM)
14536 fputs (" SMM", stdout);
14537 if (option->info & OEX_FPDBUG)
14538 fputs (" FPDBUG", stdout);
14539 if (option->info & OEX_DISMISS)
14540 fputs (" DISMISS", stdout);
14541 break;
14542 case ODK_PAD:
14543 fputs (" PAD ", stdout);
14544 if (option->info & OPAD_PREFIX)
14545 fputs (" PREFIX", stdout);
14546 if (option->info & OPAD_POSTFIX)
14547 fputs (" POSTFIX", stdout);
14548 if (option->info & OPAD_SYMBOL)
14549 fputs (" SYMBOL", stdout);
14550 break;
14551 case ODK_HWPATCH:
14552 fputs (" HWPATCH ", stdout);
14553 if (option->info & OHW_R4KEOP)
14554 fputs (" R4KEOP", stdout);
14555 if (option->info & OHW_R8KPFETCH)
14556 fputs (" R8KPFETCH", stdout);
14557 if (option->info & OHW_R5KEOP)
14558 fputs (" R5KEOP", stdout);
14559 if (option->info & OHW_R5KCVTL)
14560 fputs (" R5KCVTL", stdout);
14561 break;
14562 case ODK_FILL:
14563 fputs (" FILL ", stdout);
14564 /* XXX Print content of info word? */
14565 break;
14566 case ODK_TAGS:
14567 fputs (" TAGS ", stdout);
14568 /* XXX Print content of info word? */
14569 break;
14570 case ODK_HWAND:
14571 fputs (" HWAND ", stdout);
14572 if (option->info & OHWA0_R4KEOP_CHECKED)
14573 fputs (" R4KEOP_CHECKED", stdout);
14574 if (option->info & OHWA0_R4KEOP_CLEAN)
14575 fputs (" R4KEOP_CLEAN", stdout);
14576 break;
14577 case ODK_HWOR:
14578 fputs (" HWOR ", stdout);
14579 if (option->info & OHWA0_R4KEOP_CHECKED)
14580 fputs (" R4KEOP_CHECKED", stdout);
14581 if (option->info & OHWA0_R4KEOP_CLEAN)
14582 fputs (" R4KEOP_CLEAN", stdout);
14583 break;
14584 case ODK_GP_GROUP:
14585 printf (" GP_GROUP %#06lx self-contained %#06lx",
14586 option->info & OGP_GROUP,
14587 (option->info & OGP_SELF) >> 16);
14588 break;
14589 case ODK_IDENT:
14590 printf (" IDENT %#06lx self-contained %#06lx",
14591 option->info & OGP_GROUP,
14592 (option->info & OGP_SELF) >> 16);
14593 break;
14594 default:
14595 /* This shouldn't happen. */
14596 printf (" %3d ??? %d %lx",
14597 option->kind, option->section, option->info);
14598 break;
252b5132 14599 }
a6e9f9df 14600
2cf0635d 14601 len = sizeof (* eopt);
a6e9f9df 14602 while (len < option->size)
82b1b41b 14603 {
7e27a9d5 14604 unsigned char datum = * ((unsigned char *) eopt + offset + len);
a6e9f9df 14605
82b1b41b
NC
14606 if (ISPRINT (datum))
14607 printf ("%c", datum);
14608 else
14609 printf ("\\%03o", datum);
14610 len ++;
14611 }
a6e9f9df 14612 fputs ("\n", stdout);
82b1b41b
NC
14613
14614 offset += option->size;
252b5132 14615 ++option;
252b5132
RH
14616 }
14617
a6e9f9df 14618 free (eopt);
252b5132 14619 }
252b5132
RH
14620 }
14621
14622 if (conflicts_offset != 0 && conflictsno != 0)
14623 {
2cf0635d 14624 Elf32_Conflict * iconf;
252b5132
RH
14625 size_t cnt;
14626
14627 if (dynamic_symbols == NULL)
14628 {
591a748a 14629 error (_("conflict list found without a dynamic symbol table\n"));
252b5132
RH
14630 return 0;
14631 }
14632
3f5e193b 14633 iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
252b5132
RH
14634 if (iconf == NULL)
14635 {
8b73c356 14636 error (_("Out of memory allocating space for dynamic conflicts\n"));
252b5132
RH
14637 return 0;
14638 }
14639
9ea033b2 14640 if (is_32bit_elf)
252b5132 14641 {
2cf0635d 14642 Elf32_External_Conflict * econf32;
a6e9f9df 14643
3f5e193b
NC
14644 econf32 = (Elf32_External_Conflict *)
14645 get_data (NULL, file, conflicts_offset, conflictsno,
14646 sizeof (* econf32), _("conflict"));
a6e9f9df
AM
14647 if (!econf32)
14648 return 0;
252b5132
RH
14649
14650 for (cnt = 0; cnt < conflictsno; ++cnt)
14651 iconf[cnt] = BYTE_GET (econf32[cnt]);
a6e9f9df
AM
14652
14653 free (econf32);
252b5132
RH
14654 }
14655 else
14656 {
2cf0635d 14657 Elf64_External_Conflict * econf64;
a6e9f9df 14658
3f5e193b
NC
14659 econf64 = (Elf64_External_Conflict *)
14660 get_data (NULL, file, conflicts_offset, conflictsno,
14661 sizeof (* econf64), _("conflict"));
a6e9f9df
AM
14662 if (!econf64)
14663 return 0;
252b5132
RH
14664
14665 for (cnt = 0; cnt < conflictsno; ++cnt)
14666 iconf[cnt] = BYTE_GET (econf64[cnt]);
a6e9f9df
AM
14667
14668 free (econf64);
252b5132
RH
14669 }
14670
c7e7ca54
NC
14671 printf (_("\nSection '.conflict' contains %lu entries:\n"),
14672 (unsigned long) conflictsno);
252b5132
RH
14673 puts (_(" Num: Index Value Name"));
14674
14675 for (cnt = 0; cnt < conflictsno; ++cnt)
14676 {
b34976b6 14677 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
e0a31db1
NC
14678
14679 if (iconf[cnt] >= num_dynamic_syms)
14680 printf (_("<corrupt symbol index>"));
d79b3d50 14681 else
e0a31db1
NC
14682 {
14683 Elf_Internal_Sym * psym;
14684
14685 psym = & dynamic_symbols[iconf[cnt]];
14686 print_vma (psym->st_value, FULL_HEX);
14687 putchar (' ');
14688 if (VALID_DYNAMIC_NAME (psym->st_name))
14689 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
14690 else
14691 printf (_("<corrupt: %14ld>"), psym->st_name);
14692 }
31104126 14693 putchar ('\n');
252b5132
RH
14694 }
14695
252b5132
RH
14696 free (iconf);
14697 }
14698
ccb4c951
RS
14699 if (pltgot != 0 && local_gotno != 0)
14700 {
91d6fa6a 14701 bfd_vma ent, local_end, global_end;
bbeee7ea 14702 size_t i, offset;
2cf0635d 14703 unsigned char * data;
82b1b41b 14704 unsigned char * data_end;
bbeee7ea 14705 int addr_size;
ccb4c951 14706
91d6fa6a 14707 ent = pltgot;
ccb4c951
RS
14708 addr_size = (is_32bit_elf ? 4 : 8);
14709 local_end = pltgot + local_gotno * addr_size;
ccb4c951 14710
74e1a04b
NC
14711 /* PR binutils/17533 file: 012-111227-0.004 */
14712 if (symtabno < gotsym)
14713 {
14714 error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
82b1b41b 14715 (unsigned long) gotsym, (unsigned long) symtabno);
74e1a04b
NC
14716 return 0;
14717 }
82b1b41b 14718
74e1a04b 14719 global_end = local_end + (symtabno - gotsym) * addr_size;
82b1b41b
NC
14720 /* PR 17531: file: 54c91a34. */
14721 if (global_end < local_end)
14722 {
14723 error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
14724 return 0;
14725 }
948f632f 14726
ccb4c951 14727 offset = offset_from_vma (file, pltgot, global_end - pltgot);
3f5e193b 14728 data = (unsigned char *) get_data (NULL, file, offset,
9cf03b7e
NC
14729 global_end - pltgot, 1,
14730 _("Global Offset Table data"));
59245841
NC
14731 if (data == NULL)
14732 return 0;
82b1b41b 14733 data_end = data + (global_end - pltgot);
59245841 14734
ccb4c951
RS
14735 printf (_("\nPrimary GOT:\n"));
14736 printf (_(" Canonical gp value: "));
14737 print_vma (pltgot + 0x7ff0, LONG_HEX);
14738 printf ("\n\n");
14739
14740 printf (_(" Reserved entries:\n"));
14741 printf (_(" %*s %10s %*s Purpose\n"),
2b692964
NC
14742 addr_size * 2, _("Address"), _("Access"),
14743 addr_size * 2, _("Initial"));
82b1b41b 14744 ent = print_mips_got_entry (data, pltgot, ent, data_end);
2b692964 14745 printf (_(" Lazy resolver\n"));
82b1b41b
NC
14746 if (ent == (bfd_vma) -1)
14747 goto got_print_fail;
ccb4c951 14748 if (data
91d6fa6a 14749 && (byte_get (data + ent - pltgot, addr_size)
ccb4c951
RS
14750 >> (addr_size * 8 - 1)) != 0)
14751 {
82b1b41b 14752 ent = print_mips_got_entry (data, pltgot, ent, data_end);
2b692964 14753 printf (_(" Module pointer (GNU extension)\n"));
82b1b41b
NC
14754 if (ent == (bfd_vma) -1)
14755 goto got_print_fail;
ccb4c951
RS
14756 }
14757 printf ("\n");
14758
91d6fa6a 14759 if (ent < local_end)
ccb4c951
RS
14760 {
14761 printf (_(" Local entries:\n"));
cc5914eb 14762 printf (" %*s %10s %*s\n",
2b692964
NC
14763 addr_size * 2, _("Address"), _("Access"),
14764 addr_size * 2, _("Initial"));
91d6fa6a 14765 while (ent < local_end)
ccb4c951 14766 {
82b1b41b 14767 ent = print_mips_got_entry (data, pltgot, ent, data_end);
ccb4c951 14768 printf ("\n");
82b1b41b
NC
14769 if (ent == (bfd_vma) -1)
14770 goto got_print_fail;
ccb4c951
RS
14771 }
14772 printf ("\n");
14773 }
14774
14775 if (gotsym < symtabno)
14776 {
14777 int sym_width;
14778
14779 printf (_(" Global entries:\n"));
cc5914eb 14780 printf (" %*s %10s %*s %*s %-7s %3s %s\n",
9cf03b7e
NC
14781 addr_size * 2, _("Address"),
14782 _("Access"),
2b692964 14783 addr_size * 2, _("Initial"),
9cf03b7e
NC
14784 addr_size * 2, _("Sym.Val."),
14785 _("Type"),
14786 /* Note for translators: "Ndx" = abbreviated form of "Index". */
14787 _("Ndx"), _("Name"));
0b4362b0 14788
ccb4c951 14789 sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
e0a31db1 14790
ccb4c951
RS
14791 for (i = gotsym; i < symtabno; i++)
14792 {
82b1b41b 14793 ent = print_mips_got_entry (data, pltgot, ent, data_end);
ccb4c951 14794 printf (" ");
e0a31db1
NC
14795
14796 if (dynamic_symbols == NULL)
14797 printf (_("<no dynamic symbols>"));
14798 else if (i < num_dynamic_syms)
14799 {
14800 Elf_Internal_Sym * psym = dynamic_symbols + i;
14801
14802 print_vma (psym->st_value, LONG_HEX);
14803 printf (" %-7s %3s ",
14804 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
14805 get_symbol_index_type (psym->st_shndx));
14806
14807 if (VALID_DYNAMIC_NAME (psym->st_name))
14808 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
14809 else
14810 printf (_("<corrupt: %14ld>"), psym->st_name);
14811 }
ccb4c951 14812 else
7fc5ac57
JBG
14813 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
14814 (unsigned long) i);
e0a31db1 14815
ccb4c951 14816 printf ("\n");
82b1b41b
NC
14817 if (ent == (bfd_vma) -1)
14818 break;
ccb4c951
RS
14819 }
14820 printf ("\n");
14821 }
14822
82b1b41b 14823 got_print_fail:
ccb4c951
RS
14824 if (data)
14825 free (data);
14826 }
14827
861fb55a
DJ
14828 if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
14829 {
91d6fa6a 14830 bfd_vma ent, end;
861fb55a
DJ
14831 size_t offset, rel_offset;
14832 unsigned long count, i;
2cf0635d 14833 unsigned char * data;
861fb55a 14834 int addr_size, sym_width;
2cf0635d 14835 Elf_Internal_Rela * rels;
861fb55a
DJ
14836
14837 rel_offset = offset_from_vma (file, jmprel, pltrelsz);
14838 if (pltrel == DT_RELA)
14839 {
14840 if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
14841 return 0;
14842 }
14843 else
14844 {
14845 if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
14846 return 0;
14847 }
14848
91d6fa6a 14849 ent = mips_pltgot;
861fb55a
DJ
14850 addr_size = (is_32bit_elf ? 4 : 8);
14851 end = mips_pltgot + (2 + count) * addr_size;
14852
14853 offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
3f5e193b 14854 data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
9cf03b7e 14855 1, _("Procedure Linkage Table data"));
59245841
NC
14856 if (data == NULL)
14857 return 0;
14858
9cf03b7e 14859 printf ("\nPLT GOT:\n\n");
861fb55a
DJ
14860 printf (_(" Reserved entries:\n"));
14861 printf (_(" %*s %*s Purpose\n"),
2b692964 14862 addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
91d6fa6a 14863 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
2b692964 14864 printf (_(" PLT lazy resolver\n"));
91d6fa6a 14865 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
2b692964 14866 printf (_(" Module pointer\n"));
861fb55a
DJ
14867 printf ("\n");
14868
14869 printf (_(" Entries:\n"));
cc5914eb 14870 printf (" %*s %*s %*s %-7s %3s %s\n",
2b692964
NC
14871 addr_size * 2, _("Address"),
14872 addr_size * 2, _("Initial"),
14873 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
861fb55a
DJ
14874 sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
14875 for (i = 0; i < count; i++)
14876 {
df97ab2a 14877 unsigned long idx = get_reloc_symindex (rels[i].r_info);
861fb55a 14878
91d6fa6a 14879 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
861fb55a 14880 printf (" ");
e0a31db1 14881
df97ab2a
MF
14882 if (idx >= num_dynamic_syms)
14883 printf (_("<corrupt symbol index: %lu>"), idx);
861fb55a 14884 else
e0a31db1 14885 {
df97ab2a 14886 Elf_Internal_Sym * psym = dynamic_symbols + idx;
e0a31db1
NC
14887
14888 print_vma (psym->st_value, LONG_HEX);
14889 printf (" %-7s %3s ",
14890 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
14891 get_symbol_index_type (psym->st_shndx));
14892 if (VALID_DYNAMIC_NAME (psym->st_name))
14893 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
14894 else
14895 printf (_("<corrupt: %14ld>"), psym->st_name);
14896 }
861fb55a
DJ
14897 printf ("\n");
14898 }
14899 printf ("\n");
14900
14901 if (data)
14902 free (data);
14903 free (rels);
14904 }
14905
252b5132
RH
14906 return 1;
14907}
14908
35c08157
KLC
14909static int
14910process_nds32_specific (FILE * file)
14911{
14912 Elf_Internal_Shdr *sect = NULL;
14913
14914 sect = find_section (".nds32_e_flags");
14915 if (sect != NULL)
14916 {
14917 unsigned int *flag;
14918
14919 printf ("\nNDS32 elf flags section:\n");
14920 flag = get_data (NULL, file, sect->sh_offset, 1,
14921 sect->sh_size, _("NDS32 elf flags section"));
14922
14923 switch ((*flag) & 0x3)
14924 {
14925 case 0:
14926 printf ("(VEC_SIZE):\tNo entry.\n");
14927 break;
14928 case 1:
14929 printf ("(VEC_SIZE):\t4 bytes\n");
14930 break;
14931 case 2:
14932 printf ("(VEC_SIZE):\t16 bytes\n");
14933 break;
14934 case 3:
14935 printf ("(VEC_SIZE):\treserved\n");
14936 break;
14937 }
14938 }
14939
14940 return TRUE;
14941}
14942
047b2264 14943static int
2cf0635d 14944process_gnu_liblist (FILE * file)
047b2264 14945{
2cf0635d
NC
14946 Elf_Internal_Shdr * section;
14947 Elf_Internal_Shdr * string_sec;
14948 Elf32_External_Lib * elib;
14949 char * strtab;
c256ffe7 14950 size_t strtab_size;
047b2264
JJ
14951 size_t cnt;
14952 unsigned i;
14953
14954 if (! do_arch)
14955 return 0;
14956
14957 for (i = 0, section = section_headers;
14958 i < elf_header.e_shnum;
b34976b6 14959 i++, section++)
047b2264
JJ
14960 {
14961 switch (section->sh_type)
14962 {
14963 case SHT_GNU_LIBLIST:
4fbb74a6 14964 if (section->sh_link >= elf_header.e_shnum)
c256ffe7
JJ
14965 break;
14966
3f5e193b
NC
14967 elib = (Elf32_External_Lib *)
14968 get_data (NULL, file, section->sh_offset, 1, section->sh_size,
9cf03b7e 14969 _("liblist section data"));
047b2264
JJ
14970
14971 if (elib == NULL)
14972 break;
4fbb74a6 14973 string_sec = section_headers + section->sh_link;
047b2264 14974
3f5e193b
NC
14975 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
14976 string_sec->sh_size,
14977 _("liblist string table"));
047b2264
JJ
14978 if (strtab == NULL
14979 || section->sh_entsize != sizeof (Elf32_External_Lib))
14980 {
14981 free (elib);
2842702f 14982 free (strtab);
047b2264
JJ
14983 break;
14984 }
59245841 14985 strtab_size = string_sec->sh_size;
047b2264
JJ
14986
14987 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
74e1a04b 14988 printable_section_name (section),
0af1713e 14989 (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
047b2264 14990
2b692964 14991 puts (_(" Library Time Stamp Checksum Version Flags"));
047b2264
JJ
14992
14993 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
14994 ++cnt)
14995 {
14996 Elf32_Lib liblist;
91d6fa6a 14997 time_t atime;
047b2264 14998 char timebuf[20];
2cf0635d 14999 struct tm * tmp;
047b2264
JJ
15000
15001 liblist.l_name = BYTE_GET (elib[cnt].l_name);
91d6fa6a 15002 atime = BYTE_GET (elib[cnt].l_time_stamp);
047b2264
JJ
15003 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
15004 liblist.l_version = BYTE_GET (elib[cnt].l_version);
15005 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
15006
91d6fa6a 15007 tmp = gmtime (&atime);
e9e44622
JJ
15008 snprintf (timebuf, sizeof (timebuf),
15009 "%04u-%02u-%02uT%02u:%02u:%02u",
15010 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
15011 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
047b2264
JJ
15012
15013 printf ("%3lu: ", (unsigned long) cnt);
15014 if (do_wide)
c256ffe7 15015 printf ("%-20s", liblist.l_name < strtab_size
2b692964 15016 ? strtab + liblist.l_name : _("<corrupt>"));
047b2264 15017 else
c256ffe7 15018 printf ("%-20.20s", liblist.l_name < strtab_size
2b692964 15019 ? strtab + liblist.l_name : _("<corrupt>"));
047b2264
JJ
15020 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
15021 liblist.l_version, liblist.l_flags);
15022 }
15023
15024 free (elib);
2842702f 15025 free (strtab);
047b2264
JJ
15026 }
15027 }
15028
15029 return 1;
15030}
15031
9437c45b 15032static const char *
d3ba0551 15033get_note_type (unsigned e_type)
779fe533
NC
15034{
15035 static char buff[64];
103f02d3 15036
1ec5cd37
NC
15037 if (elf_header.e_type == ET_CORE)
15038 switch (e_type)
15039 {
57346661 15040 case NT_AUXV:
1ec5cd37 15041 return _("NT_AUXV (auxiliary vector)");
57346661 15042 case NT_PRSTATUS:
1ec5cd37 15043 return _("NT_PRSTATUS (prstatus structure)");
57346661 15044 case NT_FPREGSET:
1ec5cd37 15045 return _("NT_FPREGSET (floating point registers)");
57346661 15046 case NT_PRPSINFO:
1ec5cd37 15047 return _("NT_PRPSINFO (prpsinfo structure)");
57346661 15048 case NT_TASKSTRUCT:
1ec5cd37 15049 return _("NT_TASKSTRUCT (task structure)");
57346661 15050 case NT_PRXFPREG:
1ec5cd37 15051 return _("NT_PRXFPREG (user_xfpregs structure)");
e1e95dec
AM
15052 case NT_PPC_VMX:
15053 return _("NT_PPC_VMX (ppc Altivec registers)");
89eeb0bc
LM
15054 case NT_PPC_VSX:
15055 return _("NT_PPC_VSX (ppc VSX registers)");
ff826ef3
TT
15056 case NT_386_TLS:
15057 return _("NT_386_TLS (x86 TLS information)");
15058 case NT_386_IOPERM:
15059 return _("NT_386_IOPERM (x86 I/O permissions)");
4339cae0
L
15060 case NT_X86_XSTATE:
15061 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
0675e188
UW
15062 case NT_S390_HIGH_GPRS:
15063 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
d7eeb400
MS
15064 case NT_S390_TIMER:
15065 return _("NT_S390_TIMER (s390 timer register)");
15066 case NT_S390_TODCMP:
15067 return _("NT_S390_TODCMP (s390 TOD comparator register)");
15068 case NT_S390_TODPREG:
15069 return _("NT_S390_TODPREG (s390 TOD programmable register)");
15070 case NT_S390_CTRS:
15071 return _("NT_S390_CTRS (s390 control registers)");
15072 case NT_S390_PREFIX:
15073 return _("NT_S390_PREFIX (s390 prefix register)");
a367d729
AK
15074 case NT_S390_LAST_BREAK:
15075 return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
15076 case NT_S390_SYSTEM_CALL:
15077 return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
abb3f6cc
NC
15078 case NT_S390_TDB:
15079 return _("NT_S390_TDB (s390 transaction diagnostic block)");
4ef9f41a
AA
15080 case NT_S390_VXRS_LOW:
15081 return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
15082 case NT_S390_VXRS_HIGH:
15083 return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
faa9a424
UW
15084 case NT_ARM_VFP:
15085 return _("NT_ARM_VFP (arm VFP registers)");
652451f8
YZ
15086 case NT_ARM_TLS:
15087 return _("NT_ARM_TLS (AArch TLS registers)");
15088 case NT_ARM_HW_BREAK:
15089 return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
15090 case NT_ARM_HW_WATCH:
15091 return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
57346661 15092 case NT_PSTATUS:
1ec5cd37 15093 return _("NT_PSTATUS (pstatus structure)");
57346661 15094 case NT_FPREGS:
1ec5cd37 15095 return _("NT_FPREGS (floating point registers)");
57346661 15096 case NT_PSINFO:
1ec5cd37 15097 return _("NT_PSINFO (psinfo structure)");
57346661 15098 case NT_LWPSTATUS:
1ec5cd37 15099 return _("NT_LWPSTATUS (lwpstatus_t structure)");
57346661 15100 case NT_LWPSINFO:
1ec5cd37 15101 return _("NT_LWPSINFO (lwpsinfo_t structure)");
57346661 15102 case NT_WIN32PSTATUS:
1ec5cd37 15103 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
9ece1fa9
TT
15104 case NT_SIGINFO:
15105 return _("NT_SIGINFO (siginfo_t data)");
15106 case NT_FILE:
15107 return _("NT_FILE (mapped files)");
1ec5cd37
NC
15108 default:
15109 break;
15110 }
15111 else
15112 switch (e_type)
15113 {
15114 case NT_VERSION:
15115 return _("NT_VERSION (version)");
15116 case NT_ARCH:
15117 return _("NT_ARCH (architecture)");
15118 default:
15119 break;
15120 }
15121
e9e44622 15122 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
1ec5cd37 15123 return buff;
779fe533
NC
15124}
15125
9ece1fa9
TT
15126static int
15127print_core_note (Elf_Internal_Note *pnote)
15128{
15129 unsigned int addr_size = is_32bit_elf ? 4 : 8;
15130 bfd_vma count, page_size;
15131 unsigned char *descdata, *filenames, *descend;
15132
15133 if (pnote->type != NT_FILE)
15134 return 1;
15135
15136#ifndef BFD64
15137 if (!is_32bit_elf)
15138 {
15139 printf (_(" Cannot decode 64-bit note in 32-bit build\n"));
15140 /* Still "successful". */
15141 return 1;
15142 }
15143#endif
15144
15145 if (pnote->descsz < 2 * addr_size)
15146 {
15147 printf (_(" Malformed note - too short for header\n"));
15148 return 0;
15149 }
15150
15151 descdata = (unsigned char *) pnote->descdata;
15152 descend = descdata + pnote->descsz;
15153
15154 if (descdata[pnote->descsz - 1] != '\0')
15155 {
15156 printf (_(" Malformed note - does not end with \\0\n"));
15157 return 0;
15158 }
15159
15160 count = byte_get (descdata, addr_size);
15161 descdata += addr_size;
15162
15163 page_size = byte_get (descdata, addr_size);
15164 descdata += addr_size;
15165
15166 if (pnote->descsz < 2 * addr_size + count * 3 * addr_size)
15167 {
15168 printf (_(" Malformed note - too short for supplied file count\n"));
15169 return 0;
15170 }
15171
15172 printf (_(" Page size: "));
15173 print_vma (page_size, DEC);
15174 printf ("\n");
15175
15176 printf (_(" %*s%*s%*s\n"),
15177 (int) (2 + 2 * addr_size), _("Start"),
15178 (int) (4 + 2 * addr_size), _("End"),
15179 (int) (4 + 2 * addr_size), _("Page Offset"));
15180 filenames = descdata + count * 3 * addr_size;
595712bb 15181 while (count-- > 0)
9ece1fa9
TT
15182 {
15183 bfd_vma start, end, file_ofs;
15184
15185 if (filenames == descend)
15186 {
15187 printf (_(" Malformed note - filenames end too early\n"));
15188 return 0;
15189 }
15190
15191 start = byte_get (descdata, addr_size);
15192 descdata += addr_size;
15193 end = byte_get (descdata, addr_size);
15194 descdata += addr_size;
15195 file_ofs = byte_get (descdata, addr_size);
15196 descdata += addr_size;
15197
15198 printf (" ");
15199 print_vma (start, FULL_HEX);
15200 printf (" ");
15201 print_vma (end, FULL_HEX);
15202 printf (" ");
15203 print_vma (file_ofs, FULL_HEX);
15204 printf ("\n %s\n", filenames);
15205
15206 filenames += 1 + strlen ((char *) filenames);
15207 }
15208
15209 return 1;
15210}
15211
1118d252
RM
15212static const char *
15213get_gnu_elf_note_type (unsigned e_type)
15214{
15215 static char buff[64];
15216
15217 switch (e_type)
15218 {
15219 case NT_GNU_ABI_TAG:
15220 return _("NT_GNU_ABI_TAG (ABI version tag)");
15221 case NT_GNU_HWCAP:
15222 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
15223 case NT_GNU_BUILD_ID:
15224 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
0297aed6
DM
15225 case NT_GNU_GOLD_VERSION:
15226 return _("NT_GNU_GOLD_VERSION (gold version)");
1118d252
RM
15227 default:
15228 break;
15229 }
15230
15231 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15232 return buff;
15233}
15234
664f90a3
TT
15235static int
15236print_gnu_note (Elf_Internal_Note *pnote)
15237{
15238 switch (pnote->type)
15239 {
15240 case NT_GNU_BUILD_ID:
15241 {
15242 unsigned long i;
15243
15244 printf (_(" Build ID: "));
15245 for (i = 0; i < pnote->descsz; ++i)
15246 printf ("%02x", pnote->descdata[i] & 0xff);
9cf03b7e 15247 printf ("\n");
664f90a3
TT
15248 }
15249 break;
15250
15251 case NT_GNU_ABI_TAG:
15252 {
15253 unsigned long os, major, minor, subminor;
15254 const char *osname;
15255
3102e897
NC
15256 /* PR 17531: file: 030-599401-0.004. */
15257 if (pnote->descsz < 16)
15258 {
15259 printf (_(" <corrupt GNU_ABI_TAG>\n"));
15260 break;
15261 }
15262
664f90a3
TT
15263 os = byte_get ((unsigned char *) pnote->descdata, 4);
15264 major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
15265 minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
15266 subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
15267
15268 switch (os)
15269 {
15270 case GNU_ABI_TAG_LINUX:
15271 osname = "Linux";
15272 break;
15273 case GNU_ABI_TAG_HURD:
15274 osname = "Hurd";
15275 break;
15276 case GNU_ABI_TAG_SOLARIS:
15277 osname = "Solaris";
15278 break;
15279 case GNU_ABI_TAG_FREEBSD:
15280 osname = "FreeBSD";
15281 break;
15282 case GNU_ABI_TAG_NETBSD:
15283 osname = "NetBSD";
15284 break;
14ae95f2
RM
15285 case GNU_ABI_TAG_SYLLABLE:
15286 osname = "Syllable";
15287 break;
15288 case GNU_ABI_TAG_NACL:
15289 osname = "NaCl";
15290 break;
664f90a3
TT
15291 default:
15292 osname = "Unknown";
15293 break;
15294 }
15295
15296 printf (_(" OS: %s, ABI: %ld.%ld.%ld\n"), osname,
15297 major, minor, subminor);
15298 }
15299 break;
926c5385
CC
15300
15301 case NT_GNU_GOLD_VERSION:
15302 {
15303 unsigned long i;
15304
15305 printf (_(" Version: "));
15306 for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
15307 printf ("%c", pnote->descdata[i]);
15308 printf ("\n");
15309 }
15310 break;
664f90a3
TT
15311 }
15312
15313 return 1;
15314}
15315
685080f2
NC
15316static const char *
15317get_v850_elf_note_type (enum v850_notes n_type)
15318{
15319 static char buff[64];
15320
15321 switch (n_type)
15322 {
15323 case V850_NOTE_ALIGNMENT: return _("Alignment of 8-byte objects");
15324 case V850_NOTE_DATA_SIZE: return _("Sizeof double and long double");
15325 case V850_NOTE_FPU_INFO: return _("Type of FPU support needed");
15326 case V850_NOTE_SIMD_INFO: return _("Use of SIMD instructions");
15327 case V850_NOTE_CACHE_INFO: return _("Use of cache");
15328 case V850_NOTE_MMU_INFO: return _("Use of MMU");
15329 default:
15330 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
15331 return buff;
15332 }
15333}
15334
15335static int
15336print_v850_note (Elf_Internal_Note * pnote)
15337{
15338 unsigned int val;
15339
15340 if (pnote->descsz != 4)
15341 return 0;
15342 val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
15343
15344 if (val == 0)
15345 {
15346 printf (_("not set\n"));
15347 return 1;
15348 }
15349
15350 switch (pnote->type)
15351 {
15352 case V850_NOTE_ALIGNMENT:
15353 switch (val)
15354 {
15355 case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return 1;
15356 case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return 1;
15357 }
15358 break;
14ae95f2 15359
685080f2
NC
15360 case V850_NOTE_DATA_SIZE:
15361 switch (val)
15362 {
15363 case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return 1;
15364 case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return 1;
15365 }
15366 break;
14ae95f2 15367
685080f2
NC
15368 case V850_NOTE_FPU_INFO:
15369 switch (val)
15370 {
15371 case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return 1;
15372 case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return 1;
15373 }
15374 break;
14ae95f2 15375
685080f2
NC
15376 case V850_NOTE_MMU_INFO:
15377 case V850_NOTE_CACHE_INFO:
15378 case V850_NOTE_SIMD_INFO:
15379 if (val == EF_RH850_SIMD)
15380 {
15381 printf (_("yes\n"));
15382 return 1;
15383 }
15384 break;
15385
15386 default:
15387 /* An 'unknown note type' message will already have been displayed. */
15388 break;
15389 }
15390
15391 printf (_("unknown value: %x\n"), val);
15392 return 0;
15393}
15394
c6056a74
SF
15395static int
15396process_netbsd_elf_note (Elf_Internal_Note * pnote)
15397{
15398 unsigned int version;
15399
15400 switch (pnote->type)
15401 {
15402 case NT_NETBSD_IDENT:
15403 version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
15404 if ((version / 10000) % 100)
15405 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
15406 version, version / 100000000, (version / 1000000) % 100,
15407 (version / 10000) % 100 > 26 ? "Z" : "",
15408 'A' + (version / 10000) % 26);
15409 else
15410 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
15411 version, version / 100000000, (version / 1000000) % 100,
15412 (version / 100) % 100);
15413 return 1;
15414
15415 case NT_NETBSD_MARCH:
15416 printf (" NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
15417 pnote->descdata);
15418 return 1;
15419
15420 default:
15421 break;
15422 }
15423
15424 printf (" NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
15425 pnote->type);
15426 return 1;
15427}
15428
f4ddf30f
JB
15429static const char *
15430get_freebsd_elfcore_note_type (unsigned e_type)
15431{
f4ddf30f
JB
15432 switch (e_type)
15433 {
15434 case NT_FREEBSD_THRMISC:
15435 return _("NT_THRMISC (thrmisc structure)");
15436 case NT_FREEBSD_PROCSTAT_PROC:
15437 return _("NT_PROCSTAT_PROC (proc data)");
15438 case NT_FREEBSD_PROCSTAT_FILES:
15439 return _("NT_PROCSTAT_FILES (files data)");
15440 case NT_FREEBSD_PROCSTAT_VMMAP:
15441 return _("NT_PROCSTAT_VMMAP (vmmap data)");
15442 case NT_FREEBSD_PROCSTAT_GROUPS:
15443 return _("NT_PROCSTAT_GROUPS (groups data)");
15444 case NT_FREEBSD_PROCSTAT_UMASK:
15445 return _("NT_PROCSTAT_UMASK (umask data)");
15446 case NT_FREEBSD_PROCSTAT_RLIMIT:
15447 return _("NT_PROCSTAT_RLIMIT (rlimit data)");
15448 case NT_FREEBSD_PROCSTAT_OSREL:
15449 return _("NT_PROCSTAT_OSREL (osreldate data)");
15450 case NT_FREEBSD_PROCSTAT_PSSTRINGS:
15451 return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
15452 case NT_FREEBSD_PROCSTAT_AUXV:
15453 return _("NT_PROCSTAT_AUXV (auxv data)");
15454 }
15455 return get_note_type (e_type);
15456}
15457
9437c45b 15458static const char *
d3ba0551 15459get_netbsd_elfcore_note_type (unsigned e_type)
9437c45b
JT
15460{
15461 static char buff[64];
15462
b4db1224 15463 if (e_type == NT_NETBSDCORE_PROCINFO)
9437c45b
JT
15464 {
15465 /* NetBSD core "procinfo" structure. */
15466 return _("NetBSD procinfo structure");
15467 }
15468
15469 /* As of Jan 2002 there are no other machine-independent notes
15470 defined for NetBSD core files. If the note type is less
15471 than the start of the machine-dependent note types, we don't
15472 understand it. */
15473
b4db1224 15474 if (e_type < NT_NETBSDCORE_FIRSTMACH)
9437c45b 15475 {
e9e44622 15476 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
9437c45b
JT
15477 return buff;
15478 }
15479
15480 switch (elf_header.e_machine)
15481 {
15482 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
15483 and PT_GETFPREGS == mach+2. */
15484
15485 case EM_OLD_ALPHA:
15486 case EM_ALPHA:
15487 case EM_SPARC:
15488 case EM_SPARC32PLUS:
15489 case EM_SPARCV9:
15490 switch (e_type)
15491 {
2b692964 15492 case NT_NETBSDCORE_FIRSTMACH + 0:
b4db1224 15493 return _("PT_GETREGS (reg structure)");
2b692964 15494 case NT_NETBSDCORE_FIRSTMACH + 2:
b4db1224 15495 return _("PT_GETFPREGS (fpreg structure)");
9437c45b
JT
15496 default:
15497 break;
15498 }
15499 break;
15500
15501 /* On all other arch's, PT_GETREGS == mach+1 and
15502 PT_GETFPREGS == mach+3. */
15503 default:
15504 switch (e_type)
15505 {
2b692964 15506 case NT_NETBSDCORE_FIRSTMACH + 1:
b4db1224 15507 return _("PT_GETREGS (reg structure)");
2b692964 15508 case NT_NETBSDCORE_FIRSTMACH + 3:
b4db1224 15509 return _("PT_GETFPREGS (fpreg structure)");
9437c45b
JT
15510 default:
15511 break;
15512 }
15513 }
15514
9cf03b7e 15515 snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
e9e44622 15516 e_type - NT_NETBSDCORE_FIRSTMACH);
9437c45b
JT
15517 return buff;
15518}
15519
70616151
TT
15520static const char *
15521get_stapsdt_note_type (unsigned e_type)
15522{
15523 static char buff[64];
15524
15525 switch (e_type)
15526 {
15527 case NT_STAPSDT:
15528 return _("NT_STAPSDT (SystemTap probe descriptors)");
15529
15530 default:
15531 break;
15532 }
15533
15534 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15535 return buff;
15536}
15537
c6a9fc58
TT
15538static int
15539print_stapsdt_note (Elf_Internal_Note *pnote)
15540{
15541 int addr_size = is_32bit_elf ? 4 : 8;
15542 char *data = pnote->descdata;
15543 char *data_end = pnote->descdata + pnote->descsz;
15544 bfd_vma pc, base_addr, semaphore;
15545 char *provider, *probe, *arg_fmt;
15546
15547 pc = byte_get ((unsigned char *) data, addr_size);
15548 data += addr_size;
15549 base_addr = byte_get ((unsigned char *) data, addr_size);
15550 data += addr_size;
15551 semaphore = byte_get ((unsigned char *) data, addr_size);
15552 data += addr_size;
15553
15554 provider = data;
15555 data += strlen (data) + 1;
15556 probe = data;
15557 data += strlen (data) + 1;
15558 arg_fmt = data;
15559 data += strlen (data) + 1;
15560
15561 printf (_(" Provider: %s\n"), provider);
15562 printf (_(" Name: %s\n"), probe);
15563 printf (_(" Location: "));
15564 print_vma (pc, FULL_HEX);
15565 printf (_(", Base: "));
15566 print_vma (base_addr, FULL_HEX);
15567 printf (_(", Semaphore: "));
15568 print_vma (semaphore, FULL_HEX);
9cf03b7e 15569 printf ("\n");
c6a9fc58
TT
15570 printf (_(" Arguments: %s\n"), arg_fmt);
15571
15572 return data == data_end;
15573}
15574
00e98fc7
TG
15575static const char *
15576get_ia64_vms_note_type (unsigned e_type)
15577{
15578 static char buff[64];
15579
15580 switch (e_type)
15581 {
15582 case NT_VMS_MHD:
15583 return _("NT_VMS_MHD (module header)");
15584 case NT_VMS_LNM:
15585 return _("NT_VMS_LNM (language name)");
15586 case NT_VMS_SRC:
15587 return _("NT_VMS_SRC (source files)");
15588 case NT_VMS_TITLE:
9cf03b7e 15589 return "NT_VMS_TITLE";
00e98fc7
TG
15590 case NT_VMS_EIDC:
15591 return _("NT_VMS_EIDC (consistency check)");
15592 case NT_VMS_FPMODE:
15593 return _("NT_VMS_FPMODE (FP mode)");
15594 case NT_VMS_LINKTIME:
9cf03b7e 15595 return "NT_VMS_LINKTIME";
00e98fc7
TG
15596 case NT_VMS_IMGNAM:
15597 return _("NT_VMS_IMGNAM (image name)");
15598 case NT_VMS_IMGID:
15599 return _("NT_VMS_IMGID (image id)");
15600 case NT_VMS_LINKID:
15601 return _("NT_VMS_LINKID (link id)");
15602 case NT_VMS_IMGBID:
15603 return _("NT_VMS_IMGBID (build id)");
15604 case NT_VMS_GSTNAM:
15605 return _("NT_VMS_GSTNAM (sym table name)");
15606 case NT_VMS_ORIG_DYN:
9cf03b7e 15607 return "NT_VMS_ORIG_DYN";
00e98fc7 15608 case NT_VMS_PATCHTIME:
9cf03b7e 15609 return "NT_VMS_PATCHTIME";
00e98fc7
TG
15610 default:
15611 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15612 return buff;
15613 }
15614}
15615
15616static int
15617print_ia64_vms_note (Elf_Internal_Note * pnote)
15618{
15619 switch (pnote->type)
15620 {
15621 case NT_VMS_MHD:
15622 if (pnote->descsz > 36)
15623 {
15624 size_t l = strlen (pnote->descdata + 34);
15625 printf (_(" Creation date : %.17s\n"), pnote->descdata);
15626 printf (_(" Last patch date: %.17s\n"), pnote->descdata + 17);
15627 printf (_(" Module name : %s\n"), pnote->descdata + 34);
15628 printf (_(" Module version : %s\n"), pnote->descdata + 34 + l + 1);
15629 }
15630 else
15631 printf (_(" Invalid size\n"));
15632 break;
15633 case NT_VMS_LNM:
15634 printf (_(" Language: %s\n"), pnote->descdata);
15635 break;
15636#ifdef BFD64
15637 case NT_VMS_FPMODE:
9cf03b7e 15638 printf (_(" Floating Point mode: "));
4a5cb34f 15639 printf ("0x%016" BFD_VMA_FMT "x\n",
948f632f 15640 (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
00e98fc7
TG
15641 break;
15642 case NT_VMS_LINKTIME:
15643 printf (_(" Link time: "));
15644 print_vms_time
15645 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
15646 printf ("\n");
15647 break;
15648 case NT_VMS_PATCHTIME:
15649 printf (_(" Patch time: "));
15650 print_vms_time
15651 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
15652 printf ("\n");
15653 break;
15654 case NT_VMS_ORIG_DYN:
15655 printf (_(" Major id: %u, minor id: %u\n"),
15656 (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
15657 (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
9cf03b7e 15658 printf (_(" Last modified : "));
00e98fc7
TG
15659 print_vms_time
15660 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
9cf03b7e 15661 printf (_("\n Link flags : "));
4a5cb34f 15662 printf ("0x%016" BFD_VMA_FMT "x\n",
948f632f 15663 (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
00e98fc7 15664 printf (_(" Header flags: 0x%08x\n"),
948f632f 15665 (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
00e98fc7
TG
15666 printf (_(" Image id : %s\n"), pnote->descdata + 32);
15667 break;
15668#endif
15669 case NT_VMS_IMGNAM:
15670 printf (_(" Image name: %s\n"), pnote->descdata);
15671 break;
15672 case NT_VMS_GSTNAM:
15673 printf (_(" Global symbol table name: %s\n"), pnote->descdata);
15674 break;
15675 case NT_VMS_IMGID:
15676 printf (_(" Image id: %s\n"), pnote->descdata);
15677 break;
15678 case NT_VMS_LINKID:
15679 printf (_(" Linker id: %s\n"), pnote->descdata);
15680 break;
15681 default:
15682 break;
15683 }
15684 return 1;
15685}
15686
6d118b09
NC
15687/* Note that by the ELF standard, the name field is already null byte
15688 terminated, and namesz includes the terminating null byte.
15689 I.E. the value of namesz for the name "FSF" is 4.
15690
e3c8793a 15691 If the value of namesz is zero, there is no name present. */
779fe533 15692static int
2cf0635d 15693process_note (Elf_Internal_Note * pnote)
779fe533 15694{
2cf0635d
NC
15695 const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
15696 const char * nt;
9437c45b
JT
15697
15698 if (pnote->namesz == 0)
1ec5cd37
NC
15699 /* If there is no note name, then use the default set of
15700 note type strings. */
15701 nt = get_note_type (pnote->type);
15702
1118d252
RM
15703 else if (const_strneq (pnote->namedata, "GNU"))
15704 /* GNU-specific object file notes. */
15705 nt = get_gnu_elf_note_type (pnote->type);
f4ddf30f
JB
15706
15707 else if (const_strneq (pnote->namedata, "FreeBSD"))
15708 /* FreeBSD-specific core file notes. */
15709 nt = get_freebsd_elfcore_note_type (pnote->type);
1118d252 15710
0112cd26 15711 else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
1ec5cd37
NC
15712 /* NetBSD-specific core file notes. */
15713 nt = get_netbsd_elfcore_note_type (pnote->type);
15714
c6056a74
SF
15715 else if (const_strneq (pnote->namedata, "NetBSD"))
15716 /* NetBSD-specific core file notes. */
15717 return process_netbsd_elf_note (pnote);
15718
b15fa79e
AM
15719 else if (strneq (pnote->namedata, "SPU/", 4))
15720 {
15721 /* SPU-specific core file notes. */
15722 nt = pnote->namedata + 4;
15723 name = "SPU";
15724 }
15725
00e98fc7
TG
15726 else if (const_strneq (pnote->namedata, "IPF/VMS"))
15727 /* VMS/ia64-specific file notes. */
15728 nt = get_ia64_vms_note_type (pnote->type);
15729
70616151
TT
15730 else if (const_strneq (pnote->namedata, "stapsdt"))
15731 nt = get_stapsdt_note_type (pnote->type);
15732
9437c45b 15733 else
1ec5cd37
NC
15734 /* Don't recognize this note name; just use the default set of
15735 note type strings. */
00e98fc7 15736 nt = get_note_type (pnote->type);
9437c45b 15737
2aee03ae 15738 printf (" %-20s 0x%08lx\t%s\n", name, pnote->descsz, nt);
00e98fc7
TG
15739
15740 if (const_strneq (pnote->namedata, "IPF/VMS"))
15741 return print_ia64_vms_note (pnote);
664f90a3
TT
15742 else if (const_strneq (pnote->namedata, "GNU"))
15743 return print_gnu_note (pnote);
c6a9fc58
TT
15744 else if (const_strneq (pnote->namedata, "stapsdt"))
15745 return print_stapsdt_note (pnote);
9ece1fa9
TT
15746 else if (const_strneq (pnote->namedata, "CORE"))
15747 return print_core_note (pnote);
00e98fc7
TG
15748 else
15749 return 1;
779fe533
NC
15750}
15751
6d118b09 15752
779fe533 15753static int
2cf0635d 15754process_corefile_note_segment (FILE * file, bfd_vma offset, bfd_vma length)
779fe533 15755{
2cf0635d
NC
15756 Elf_External_Note * pnotes;
15757 Elf_External_Note * external;
c8071705 15758 char * end;
b34976b6 15759 int res = 1;
103f02d3 15760
779fe533
NC
15761 if (length <= 0)
15762 return 0;
103f02d3 15763
3f5e193b 15764 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
15b42fb0 15765 _("notes"));
dd24e3da 15766 if (pnotes == NULL)
a6e9f9df 15767 return 0;
779fe533 15768
103f02d3 15769 external = pnotes;
103f02d3 15770
9dd3a467 15771 printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
f3485b74 15772 (unsigned long) offset, (unsigned long) length);
2aee03ae 15773 printf (_(" %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
103f02d3 15774
c8071705
NC
15775 end = (char *) pnotes + length;
15776 while ((char *) external < end)
779fe533 15777 {
b34976b6 15778 Elf_Internal_Note inote;
15b42fb0
AM
15779 size_t min_notesz;
15780 char *next;
2cf0635d 15781 char * temp = NULL;
c8071705 15782 size_t data_remaining = end - (char *) external;
6d118b09 15783
00e98fc7 15784 if (!is_ia64_vms ())
15b42fb0 15785 {
9dd3a467
NC
15786 /* PR binutils/15191
15787 Make sure that there is enough data to read. */
15b42fb0
AM
15788 min_notesz = offsetof (Elf_External_Note, name);
15789 if (data_remaining < min_notesz)
9dd3a467
NC
15790 {
15791 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
15792 (int) data_remaining);
15793 break;
15794 }
15b42fb0
AM
15795 inote.type = BYTE_GET (external->type);
15796 inote.namesz = BYTE_GET (external->namesz);
15797 inote.namedata = external->name;
15798 inote.descsz = BYTE_GET (external->descsz);
15799 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
834f871c 15800 /* PR 17531: file: 3443835e. */
c8071705 15801 if (inote.descdata < (char *) pnotes || inote.descdata > end)
834f871c
NC
15802 {
15803 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
15804 inote.descdata = inote.namedata;
15805 inote.namesz = 0;
15806 }
14ae95f2 15807
15b42fb0
AM
15808 inote.descpos = offset + (inote.descdata - (char *) pnotes);
15809 next = inote.descdata + align_power (inote.descsz, 2);
15810 }
00e98fc7 15811 else
15b42fb0
AM
15812 {
15813 Elf64_External_VMS_Note *vms_external;
00e98fc7 15814
9dd3a467
NC
15815 /* PR binutils/15191
15816 Make sure that there is enough data to read. */
15b42fb0
AM
15817 min_notesz = offsetof (Elf64_External_VMS_Note, name);
15818 if (data_remaining < min_notesz)
9dd3a467
NC
15819 {
15820 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
15821 (int) data_remaining);
15822 break;
15823 }
3e55a963 15824
15b42fb0
AM
15825 vms_external = (Elf64_External_VMS_Note *) external;
15826 inote.type = BYTE_GET (vms_external->type);
15827 inote.namesz = BYTE_GET (vms_external->namesz);
15828 inote.namedata = vms_external->name;
15829 inote.descsz = BYTE_GET (vms_external->descsz);
15830 inote.descdata = inote.namedata + align_power (inote.namesz, 3);
15831 inote.descpos = offset + (inote.descdata - (char *) pnotes);
15832 next = inote.descdata + align_power (inote.descsz, 3);
15833 }
15834
15835 if (inote.descdata < (char *) external + min_notesz
15836 || next < (char *) external + min_notesz
5d921cbd
NC
15837 /* PR binutils/17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4. */
15838 || inote.namedata + inote.namesz < inote.namedata
15839 || inote.descdata + inote.descsz < inote.descdata
15b42fb0 15840 || data_remaining < (size_t)(next - (char *) external))
3e55a963 15841 {
15b42fb0 15842 warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
0af1713e 15843 (unsigned long) ((char *) external - (char *) pnotes));
9dd3a467 15844 warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
3e55a963
NC
15845 inote.type, inote.namesz, inote.descsz);
15846 break;
15847 }
15848
15b42fb0 15849 external = (Elf_External_Note *) next;
dd24e3da 15850
6d118b09
NC
15851 /* Verify that name is null terminated. It appears that at least
15852 one version of Linux (RedHat 6.0) generates corefiles that don't
15853 comply with the ELF spec by failing to include the null byte in
15854 namesz. */
8b971f9f 15855 if (inote.namedata[inote.namesz - 1] != '\0')
6d118b09 15856 {
3f5e193b 15857 temp = (char *) malloc (inote.namesz + 1);
6d118b09
NC
15858 if (temp == NULL)
15859 {
8b73c356 15860 error (_("Out of memory allocating space for inote name\n"));
6d118b09
NC
15861 res = 0;
15862 break;
15863 }
76da6bbe 15864
6d118b09
NC
15865 strncpy (temp, inote.namedata, inote.namesz);
15866 temp[inote.namesz] = 0;
76da6bbe 15867
6d118b09
NC
15868 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
15869 inote.namedata = temp;
15870 }
15871
15872 res &= process_note (& inote);
103f02d3 15873
6d118b09
NC
15874 if (temp != NULL)
15875 {
15876 free (temp);
15877 temp = NULL;
15878 }
779fe533
NC
15879 }
15880
15881 free (pnotes);
103f02d3 15882
779fe533
NC
15883 return res;
15884}
15885
15886static int
2cf0635d 15887process_corefile_note_segments (FILE * file)
779fe533 15888{
2cf0635d 15889 Elf_Internal_Phdr * segment;
b34976b6
AM
15890 unsigned int i;
15891 int res = 1;
103f02d3 15892
d93f0186 15893 if (! get_program_headers (file))
779fe533 15894 return 0;
103f02d3 15895
779fe533
NC
15896 for (i = 0, segment = program_headers;
15897 i < elf_header.e_phnum;
b34976b6 15898 i++, segment++)
779fe533
NC
15899 {
15900 if (segment->p_type == PT_NOTE)
103f02d3 15901 res &= process_corefile_note_segment (file,
30800947
NC
15902 (bfd_vma) segment->p_offset,
15903 (bfd_vma) segment->p_filesz);
779fe533 15904 }
103f02d3 15905
779fe533
NC
15906 return res;
15907}
15908
685080f2
NC
15909static int
15910process_v850_notes (FILE * file, bfd_vma offset, bfd_vma length)
15911{
15912 Elf_External_Note * pnotes;
15913 Elf_External_Note * external;
c8071705 15914 char * end;
685080f2
NC
15915 int res = 1;
15916
15917 if (length <= 0)
15918 return 0;
15919
15920 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
15921 _("v850 notes"));
15922 if (pnotes == NULL)
15923 return 0;
15924
15925 external = pnotes;
c8071705 15926 end = (char*) pnotes + length;
685080f2
NC
15927
15928 printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
15929 (unsigned long) offset, (unsigned long) length);
15930
c8071705 15931 while ((char *) external + sizeof (Elf_External_Note) < end)
685080f2
NC
15932 {
15933 Elf_External_Note * next;
15934 Elf_Internal_Note inote;
15935
15936 inote.type = BYTE_GET (external->type);
15937 inote.namesz = BYTE_GET (external->namesz);
15938 inote.namedata = external->name;
15939 inote.descsz = BYTE_GET (external->descsz);
15940 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
15941 inote.descpos = offset + (inote.descdata - (char *) pnotes);
15942
c8071705
NC
15943 if (inote.descdata < (char *) pnotes || inote.descdata >= end)
15944 {
15945 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
15946 inote.descdata = inote.namedata;
15947 inote.namesz = 0;
15948 }
15949
685080f2
NC
15950 next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
15951
c8071705 15952 if ( ((char *) next > end)
685080f2
NC
15953 || ((char *) next < (char *) pnotes))
15954 {
15955 warn (_("corrupt descsz found in note at offset 0x%lx\n"),
15956 (unsigned long) ((char *) external - (char *) pnotes));
15957 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
15958 inote.type, inote.namesz, inote.descsz);
15959 break;
15960 }
15961
15962 external = next;
15963
15964 /* Prevent out-of-bounds indexing. */
c8071705 15965 if ( inote.namedata + inote.namesz > end
685080f2
NC
15966 || inote.namedata + inote.namesz < inote.namedata)
15967 {
15968 warn (_("corrupt namesz found in note at offset 0x%lx\n"),
15969 (unsigned long) ((char *) external - (char *) pnotes));
15970 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
15971 inote.type, inote.namesz, inote.descsz);
15972 break;
15973 }
15974
15975 printf (" %s: ", get_v850_elf_note_type (inote.type));
15976
15977 if (! print_v850_note (& inote))
15978 {
15979 res = 0;
15980 printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
15981 inote.namesz, inote.descsz);
15982 }
15983 }
15984
15985 free (pnotes);
15986
15987 return res;
15988}
15989
779fe533 15990static int
2cf0635d 15991process_note_sections (FILE * file)
1ec5cd37 15992{
2cf0635d 15993 Elf_Internal_Shdr * section;
1ec5cd37 15994 unsigned long i;
df565f32 15995 int n = 0;
1ec5cd37
NC
15996 int res = 1;
15997
15998 for (i = 0, section = section_headers;
fa1908fd 15999 i < elf_header.e_shnum && section != NULL;
1ec5cd37 16000 i++, section++)
685080f2
NC
16001 {
16002 if (section->sh_type == SHT_NOTE)
16003 {
16004 res &= process_corefile_note_segment (file,
16005 (bfd_vma) section->sh_offset,
16006 (bfd_vma) section->sh_size);
16007 n++;
16008 }
16009
16010 if (( elf_header.e_machine == EM_V800
16011 || elf_header.e_machine == EM_V850
16012 || elf_header.e_machine == EM_CYGNUS_V850)
16013 && section->sh_type == SHT_RENESAS_INFO)
16014 {
16015 res &= process_v850_notes (file,
16016 (bfd_vma) section->sh_offset,
16017 (bfd_vma) section->sh_size);
16018 n++;
16019 }
16020 }
df565f32
NC
16021
16022 if (n == 0)
16023 /* Try processing NOTE segments instead. */
16024 return process_corefile_note_segments (file);
1ec5cd37
NC
16025
16026 return res;
16027}
16028
16029static int
2cf0635d 16030process_notes (FILE * file)
779fe533
NC
16031{
16032 /* If we have not been asked to display the notes then do nothing. */
16033 if (! do_notes)
16034 return 1;
103f02d3 16035
779fe533 16036 if (elf_header.e_type != ET_CORE)
1ec5cd37 16037 return process_note_sections (file);
103f02d3 16038
779fe533 16039 /* No program headers means no NOTE segment. */
1ec5cd37
NC
16040 if (elf_header.e_phnum > 0)
16041 return process_corefile_note_segments (file);
779fe533 16042
1ec5cd37
NC
16043 printf (_("No note segments present in the core file.\n"));
16044 return 1;
779fe533
NC
16045}
16046
252b5132 16047static int
2cf0635d 16048process_arch_specific (FILE * file)
252b5132 16049{
a952a375
NC
16050 if (! do_arch)
16051 return 1;
16052
252b5132
RH
16053 switch (elf_header.e_machine)
16054 {
11c1ff18
PB
16055 case EM_ARM:
16056 return process_arm_specific (file);
252b5132 16057 case EM_MIPS:
4fe85591 16058 case EM_MIPS_RS3_LE:
252b5132
RH
16059 return process_mips_specific (file);
16060 break;
35c08157
KLC
16061 case EM_NDS32:
16062 return process_nds32_specific (file);
16063 break;
34c8bcba
JM
16064 case EM_PPC:
16065 return process_power_specific (file);
16066 break;
643f7afb
AK
16067 case EM_S390:
16068 case EM_S390_OLD:
16069 return process_s390_specific (file);
16070 break;
9e8c70f9
DM
16071 case EM_SPARC:
16072 case EM_SPARC32PLUS:
16073 case EM_SPARCV9:
16074 return process_sparc_specific (file);
16075 break;
59e6276b
JM
16076 case EM_TI_C6000:
16077 return process_tic6x_specific (file);
16078 break;
13761a11
NC
16079 case EM_MSP430:
16080 return process_msp430x_specific (file);
252b5132
RH
16081 default:
16082 break;
16083 }
16084 return 1;
16085}
16086
16087static int
2cf0635d 16088get_file_header (FILE * file)
252b5132 16089{
9ea033b2
NC
16090 /* Read in the identity array. */
16091 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
252b5132
RH
16092 return 0;
16093
9ea033b2 16094 /* Determine how to read the rest of the header. */
b34976b6 16095 switch (elf_header.e_ident[EI_DATA])
9ea033b2
NC
16096 {
16097 default: /* fall through */
16098 case ELFDATANONE: /* fall through */
adab8cdc
AO
16099 case ELFDATA2LSB:
16100 byte_get = byte_get_little_endian;
16101 byte_put = byte_put_little_endian;
16102 break;
16103 case ELFDATA2MSB:
16104 byte_get = byte_get_big_endian;
16105 byte_put = byte_put_big_endian;
16106 break;
9ea033b2
NC
16107 }
16108
16109 /* For now we only support 32 bit and 64 bit ELF files. */
b34976b6 16110 is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
9ea033b2
NC
16111
16112 /* Read in the rest of the header. */
16113 if (is_32bit_elf)
16114 {
16115 Elf32_External_Ehdr ehdr32;
252b5132 16116
9ea033b2
NC
16117 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
16118 return 0;
103f02d3 16119
9ea033b2
NC
16120 elf_header.e_type = BYTE_GET (ehdr32.e_type);
16121 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
16122 elf_header.e_version = BYTE_GET (ehdr32.e_version);
16123 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
16124 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
16125 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
16126 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
16127 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
16128 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
16129 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
16130 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
16131 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
16132 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
16133 }
252b5132 16134 else
9ea033b2
NC
16135 {
16136 Elf64_External_Ehdr ehdr64;
a952a375
NC
16137
16138 /* If we have been compiled with sizeof (bfd_vma) == 4, then
16139 we will not be able to cope with the 64bit data found in
16140 64 ELF files. Detect this now and abort before we start
50c2245b 16141 overwriting things. */
a952a375
NC
16142 if (sizeof (bfd_vma) < 8)
16143 {
e3c8793a
NC
16144 error (_("This instance of readelf has been built without support for a\n\
1614564 bit data type and so it cannot read 64 bit ELF files.\n"));
a952a375
NC
16146 return 0;
16147 }
103f02d3 16148
9ea033b2
NC
16149 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
16150 return 0;
103f02d3 16151
9ea033b2
NC
16152 elf_header.e_type = BYTE_GET (ehdr64.e_type);
16153 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
16154 elf_header.e_version = BYTE_GET (ehdr64.e_version);
66543521
AM
16155 elf_header.e_entry = BYTE_GET (ehdr64.e_entry);
16156 elf_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
16157 elf_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
9ea033b2
NC
16158 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
16159 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
16160 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
16161 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
16162 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
16163 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
16164 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
16165 }
252b5132 16166
7ece0d85
JJ
16167 if (elf_header.e_shoff)
16168 {
16169 /* There may be some extensions in the first section header. Don't
16170 bomb if we can't read it. */
16171 if (is_32bit_elf)
049b0c3a 16172 get_32bit_section_headers (file, TRUE);
7ece0d85 16173 else
049b0c3a 16174 get_64bit_section_headers (file, TRUE);
7ece0d85 16175 }
560f3c1c 16176
252b5132
RH
16177 return 1;
16178}
16179
fb52b2f4
NC
16180/* Process one ELF object file according to the command line options.
16181 This file may actually be stored in an archive. The file is
16182 positioned at the start of the ELF object. */
16183
ff78d6d6 16184static int
2cf0635d 16185process_object (char * file_name, FILE * file)
252b5132 16186{
252b5132
RH
16187 unsigned int i;
16188
252b5132
RH
16189 if (! get_file_header (file))
16190 {
16191 error (_("%s: Failed to read file header\n"), file_name);
ff78d6d6 16192 return 1;
252b5132
RH
16193 }
16194
16195 /* Initialise per file variables. */
60bca95a 16196 for (i = ARRAY_SIZE (version_info); i--;)
252b5132
RH
16197 version_info[i] = 0;
16198
60bca95a 16199 for (i = ARRAY_SIZE (dynamic_info); i--;)
252b5132 16200 dynamic_info[i] = 0;
5115b233 16201 dynamic_info_DT_GNU_HASH = 0;
252b5132
RH
16202
16203 /* Process the file. */
16204 if (show_name)
16205 printf (_("\nFile: %s\n"), file_name);
16206
18bd398b
NC
16207 /* Initialise the dump_sects array from the cmdline_dump_sects array.
16208 Note we do this even if cmdline_dump_sects is empty because we
16209 must make sure that the dump_sets array is zeroed out before each
16210 object file is processed. */
16211 if (num_dump_sects > num_cmdline_dump_sects)
09c11c86 16212 memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
18bd398b
NC
16213
16214 if (num_cmdline_dump_sects > 0)
16215 {
16216 if (num_dump_sects == 0)
16217 /* A sneaky way of allocating the dump_sects array. */
09c11c86 16218 request_dump_bynumber (num_cmdline_dump_sects, 0);
18bd398b
NC
16219
16220 assert (num_dump_sects >= num_cmdline_dump_sects);
09c11c86
NC
16221 memcpy (dump_sects, cmdline_dump_sects,
16222 num_cmdline_dump_sects * sizeof (* dump_sects));
18bd398b 16223 }
d70c5fc7 16224
252b5132 16225 if (! process_file_header ())
fb52b2f4 16226 return 1;
252b5132 16227
d1f5c6e3 16228 if (! process_section_headers (file))
2f62977e 16229 {
d1f5c6e3
L
16230 /* Without loaded section headers we cannot process lots of
16231 things. */
2f62977e 16232 do_unwind = do_version = do_dump = do_arch = 0;
252b5132 16233
2f62977e 16234 if (! do_using_dynamic)
2c610e4b 16235 do_syms = do_dyn_syms = do_reloc = 0;
2f62977e 16236 }
252b5132 16237
d1f5c6e3
L
16238 if (! process_section_groups (file))
16239 {
16240 /* Without loaded section groups we cannot process unwind. */
16241 do_unwind = 0;
16242 }
16243
2f62977e 16244 if (process_program_headers (file))
b2d38a17 16245 process_dynamic_section (file);
252b5132
RH
16246
16247 process_relocs (file);
16248
4d6ed7c8
NC
16249 process_unwind (file);
16250
252b5132
RH
16251 process_symbol_table (file);
16252
16253 process_syminfo (file);
16254
16255 process_version_sections (file);
16256
16257 process_section_contents (file);
f5842774 16258
1ec5cd37 16259 process_notes (file);
103f02d3 16260
047b2264
JJ
16261 process_gnu_liblist (file);
16262
252b5132
RH
16263 process_arch_specific (file);
16264
d93f0186
NC
16265 if (program_headers)
16266 {
16267 free (program_headers);
16268 program_headers = NULL;
16269 }
16270
252b5132
RH
16271 if (section_headers)
16272 {
16273 free (section_headers);
16274 section_headers = NULL;
16275 }
16276
16277 if (string_table)
16278 {
16279 free (string_table);
16280 string_table = NULL;
d40ac9bd 16281 string_table_length = 0;
252b5132
RH
16282 }
16283
16284 if (dynamic_strings)
16285 {
16286 free (dynamic_strings);
16287 dynamic_strings = NULL;
d79b3d50 16288 dynamic_strings_length = 0;
252b5132
RH
16289 }
16290
16291 if (dynamic_symbols)
16292 {
16293 free (dynamic_symbols);
16294 dynamic_symbols = NULL;
19936277 16295 num_dynamic_syms = 0;
252b5132
RH
16296 }
16297
16298 if (dynamic_syminfo)
16299 {
16300 free (dynamic_syminfo);
16301 dynamic_syminfo = NULL;
16302 }
ff78d6d6 16303
293c573e
MR
16304 if (dynamic_section)
16305 {
16306 free (dynamic_section);
16307 dynamic_section = NULL;
16308 }
16309
e4b17d5c
L
16310 if (section_headers_groups)
16311 {
16312 free (section_headers_groups);
16313 section_headers_groups = NULL;
16314 }
16315
16316 if (section_groups)
16317 {
2cf0635d
NC
16318 struct group_list * g;
16319 struct group_list * next;
e4b17d5c
L
16320
16321 for (i = 0; i < group_count; i++)
16322 {
16323 for (g = section_groups [i].root; g != NULL; g = next)
16324 {
16325 next = g->next;
16326 free (g);
16327 }
16328 }
16329
16330 free (section_groups);
16331 section_groups = NULL;
16332 }
16333
19e6b90e 16334 free_debug_memory ();
18bd398b 16335
ff78d6d6 16336 return 0;
252b5132
RH
16337}
16338
2cf0635d
NC
16339/* Process an ELF archive.
16340 On entry the file is positioned just after the ARMAG string. */
16341
16342static int
16343process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
16344{
16345 struct archive_info arch;
16346 struct archive_info nested_arch;
16347 size_t got;
2cf0635d
NC
16348 int ret;
16349
16350 show_name = 1;
16351
16352 /* The ARCH structure is used to hold information about this archive. */
16353 arch.file_name = NULL;
16354 arch.file = NULL;
16355 arch.index_array = NULL;
16356 arch.sym_table = NULL;
16357 arch.longnames = NULL;
16358
16359 /* The NESTED_ARCH structure is used as a single-item cache of information
16360 about a nested archive (when members of a thin archive reside within
16361 another regular archive file). */
16362 nested_arch.file_name = NULL;
16363 nested_arch.file = NULL;
16364 nested_arch.index_array = NULL;
16365 nested_arch.sym_table = NULL;
16366 nested_arch.longnames = NULL;
16367
16368 if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
16369 {
16370 ret = 1;
16371 goto out;
4145f1d5 16372 }
fb52b2f4 16373
4145f1d5
NC
16374 if (do_archive_index)
16375 {
2cf0635d 16376 if (arch.sym_table == NULL)
4145f1d5
NC
16377 error (_("%s: unable to dump the index as none was found\n"), file_name);
16378 else
16379 {
591f7597 16380 unsigned long i, l;
4145f1d5
NC
16381 unsigned long current_pos;
16382
591f7597
NC
16383 printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
16384 file_name, (unsigned long) arch.index_num, arch.sym_size);
4145f1d5
NC
16385 current_pos = ftell (file);
16386
2cf0635d 16387 for (i = l = 0; i < arch.index_num; i++)
4145f1d5 16388 {
2cf0635d
NC
16389 if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
16390 {
16391 char * member_name;
4145f1d5 16392
2cf0635d
NC
16393 member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
16394
16395 if (member_name != NULL)
16396 {
16397 char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
16398
16399 if (qualified_name != NULL)
16400 {
c2a7d3f5
NC
16401 printf (_("Contents of binary %s at offset "), qualified_name);
16402 (void) print_vma (arch.index_array[i], PREFIX_HEX);
16403 putchar ('\n');
2cf0635d
NC
16404 free (qualified_name);
16405 }
4145f1d5
NC
16406 }
16407 }
2cf0635d
NC
16408
16409 if (l >= arch.sym_size)
4145f1d5
NC
16410 {
16411 error (_("%s: end of the symbol table reached before the end of the index\n"),
16412 file_name);
cb8f3167 16413 break;
4145f1d5 16414 }
591f7597
NC
16415 /* PR 17531: file: 0b6630b2. */
16416 printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
16417 l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
4145f1d5
NC
16418 }
16419
c2a7d3f5
NC
16420 if (arch.uses_64bit_indicies)
16421 l = (l + 7) & ~ 7;
16422 else
16423 l += l & 1;
16424
2cf0635d 16425 if (l < arch.sym_size)
c2a7d3f5
NC
16426 error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
16427 file_name, arch.sym_size - l);
4145f1d5 16428
4145f1d5
NC
16429 if (fseek (file, current_pos, SEEK_SET) != 0)
16430 {
16431 error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
2cf0635d
NC
16432 ret = 1;
16433 goto out;
4145f1d5 16434 }
fb52b2f4 16435 }
4145f1d5
NC
16436
16437 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
16438 && !do_segments && !do_header && !do_dump && !do_version
16439 && !do_histogram && !do_debugging && !do_arch && !do_notes
2c610e4b 16440 && !do_section_groups && !do_dyn_syms)
2cf0635d
NC
16441 {
16442 ret = 0; /* Archive index only. */
16443 goto out;
16444 }
fb52b2f4
NC
16445 }
16446
d989285c 16447 ret = 0;
fb52b2f4
NC
16448
16449 while (1)
16450 {
2cf0635d
NC
16451 char * name;
16452 size_t namelen;
16453 char * qualified_name;
16454
16455 /* Read the next archive header. */
16456 if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
16457 {
16458 error (_("%s: failed to seek to next archive header\n"), file_name);
16459 return 1;
16460 }
16461 got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
16462 if (got != sizeof arch.arhdr)
16463 {
16464 if (got == 0)
16465 break;
16466 error (_("%s: failed to read archive header\n"), file_name);
16467 ret = 1;
16468 break;
16469 }
16470 if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
16471 {
16472 error (_("%s: did not find a valid archive header\n"), arch.file_name);
16473 ret = 1;
16474 break;
16475 }
16476
16477 arch.next_arhdr_offset += sizeof arch.arhdr;
16478
16479 archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
16480 if (archive_file_size & 01)
16481 ++archive_file_size;
16482
16483 name = get_archive_member_name (&arch, &nested_arch);
16484 if (name == NULL)
fb52b2f4 16485 {
0fd3a477 16486 error (_("%s: bad archive file name\n"), file_name);
d989285c
ILT
16487 ret = 1;
16488 break;
fb52b2f4 16489 }
2cf0635d 16490 namelen = strlen (name);
fb52b2f4 16491
2cf0635d
NC
16492 qualified_name = make_qualified_name (&arch, &nested_arch, name);
16493 if (qualified_name == NULL)
fb52b2f4 16494 {
2cf0635d 16495 error (_("%s: bad archive file name\n"), file_name);
d989285c
ILT
16496 ret = 1;
16497 break;
fb52b2f4
NC
16498 }
16499
2cf0635d
NC
16500 if (is_thin_archive && arch.nested_member_origin == 0)
16501 {
16502 /* This is a proxy for an external member of a thin archive. */
16503 FILE * member_file;
16504 char * member_file_name = adjust_relative_path (file_name, name, namelen);
16505 if (member_file_name == NULL)
16506 {
16507 ret = 1;
16508 break;
16509 }
16510
16511 member_file = fopen (member_file_name, "rb");
16512 if (member_file == NULL)
16513 {
16514 error (_("Input file '%s' is not readable.\n"), member_file_name);
16515 free (member_file_name);
16516 ret = 1;
16517 break;
16518 }
16519
16520 archive_file_offset = arch.nested_member_origin;
16521
16522 ret |= process_object (qualified_name, member_file);
16523
16524 fclose (member_file);
16525 free (member_file_name);
16526 }
16527 else if (is_thin_archive)
16528 {
a043396b
NC
16529 /* PR 15140: Allow for corrupt thin archives. */
16530 if (nested_arch.file == NULL)
16531 {
16532 error (_("%s: contains corrupt thin archive: %s\n"),
16533 file_name, name);
16534 ret = 1;
16535 break;
16536 }
16537
2cf0635d
NC
16538 /* This is a proxy for a member of a nested archive. */
16539 archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
16540
16541 /* The nested archive file will have been opened and setup by
16542 get_archive_member_name. */
16543 if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
16544 {
16545 error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
16546 ret = 1;
16547 break;
16548 }
16549
16550 ret |= process_object (qualified_name, nested_arch.file);
16551 }
16552 else
16553 {
16554 archive_file_offset = arch.next_arhdr_offset;
16555 arch.next_arhdr_offset += archive_file_size;
fb52b2f4 16556
2cf0635d
NC
16557 ret |= process_object (qualified_name, file);
16558 }
fb52b2f4 16559
2b52916e
L
16560 if (dump_sects != NULL)
16561 {
16562 free (dump_sects);
16563 dump_sects = NULL;
16564 num_dump_sects = 0;
16565 }
16566
2cf0635d 16567 free (qualified_name);
fb52b2f4
NC
16568 }
16569
4145f1d5 16570 out:
2cf0635d
NC
16571 if (nested_arch.file != NULL)
16572 fclose (nested_arch.file);
16573 release_archive (&nested_arch);
16574 release_archive (&arch);
fb52b2f4 16575
d989285c 16576 return ret;
fb52b2f4
NC
16577}
16578
16579static int
2cf0635d 16580process_file (char * file_name)
fb52b2f4 16581{
2cf0635d 16582 FILE * file;
fb52b2f4
NC
16583 struct stat statbuf;
16584 char armag[SARMAG];
16585 int ret;
16586
16587 if (stat (file_name, &statbuf) < 0)
16588 {
f24ddbdd
NC
16589 if (errno == ENOENT)
16590 error (_("'%s': No such file\n"), file_name);
16591 else
16592 error (_("Could not locate '%s'. System error message: %s\n"),
16593 file_name, strerror (errno));
16594 return 1;
16595 }
16596
16597 if (! S_ISREG (statbuf.st_mode))
16598 {
16599 error (_("'%s' is not an ordinary file\n"), file_name);
fb52b2f4
NC
16600 return 1;
16601 }
16602
16603 file = fopen (file_name, "rb");
16604 if (file == NULL)
16605 {
f24ddbdd 16606 error (_("Input file '%s' is not readable.\n"), file_name);
fb52b2f4
NC
16607 return 1;
16608 }
16609
16610 if (fread (armag, SARMAG, 1, file) != 1)
16611 {
4145f1d5 16612 error (_("%s: Failed to read file's magic number\n"), file_name);
fb52b2f4
NC
16613 fclose (file);
16614 return 1;
16615 }
16616
f54498b4
NC
16617 current_file_size = (bfd_size_type) statbuf.st_size;
16618
fb52b2f4 16619 if (memcmp (armag, ARMAG, SARMAG) == 0)
2cf0635d
NC
16620 ret = process_archive (file_name, file, FALSE);
16621 else if (memcmp (armag, ARMAGT, SARMAG) == 0)
16622 ret = process_archive (file_name, file, TRUE);
fb52b2f4
NC
16623 else
16624 {
4145f1d5
NC
16625 if (do_archive_index)
16626 error (_("File %s is not an archive so its index cannot be displayed.\n"),
16627 file_name);
16628
fb52b2f4
NC
16629 rewind (file);
16630 archive_file_size = archive_file_offset = 0;
16631 ret = process_object (file_name, file);
16632 }
16633
16634 fclose (file);
16635
f54498b4 16636 current_file_size = 0;
fb52b2f4
NC
16637 return ret;
16638}
16639
252b5132
RH
16640#ifdef SUPPORT_DISASSEMBLY
16641/* Needed by the i386 disassembler. For extra credit, someone could
9ea033b2 16642 fix this so that we insert symbolic addresses here, esp for GOT/PLT
e3c8793a 16643 symbols. */
252b5132
RH
16644
16645void
2cf0635d 16646print_address (unsigned int addr, FILE * outfile)
252b5132
RH
16647{
16648 fprintf (outfile,"0x%8.8x", addr);
16649}
16650
e3c8793a 16651/* Needed by the i386 disassembler. */
252b5132
RH
16652void
16653db_task_printsym (unsigned int addr)
16654{
16655 print_address (addr, stderr);
16656}
16657#endif
16658
16659int
2cf0635d 16660main (int argc, char ** argv)
252b5132 16661{
ff78d6d6
L
16662 int err;
16663
252b5132
RH
16664#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
16665 setlocale (LC_MESSAGES, "");
3882b010
L
16666#endif
16667#if defined (HAVE_SETLOCALE)
16668 setlocale (LC_CTYPE, "");
252b5132
RH
16669#endif
16670 bindtextdomain (PACKAGE, LOCALEDIR);
16671 textdomain (PACKAGE);
16672
869b9d07
MM
16673 expandargv (&argc, &argv);
16674
252b5132
RH
16675 parse_args (argc, argv);
16676
18bd398b 16677 if (num_dump_sects > 0)
59f14fc0 16678 {
18bd398b 16679 /* Make a copy of the dump_sects array. */
3f5e193b
NC
16680 cmdline_dump_sects = (dump_type *)
16681 malloc (num_dump_sects * sizeof (* dump_sects));
59f14fc0 16682 if (cmdline_dump_sects == NULL)
591a748a 16683 error (_("Out of memory allocating dump request table.\n"));
59f14fc0
AS
16684 else
16685 {
09c11c86
NC
16686 memcpy (cmdline_dump_sects, dump_sects,
16687 num_dump_sects * sizeof (* dump_sects));
59f14fc0
AS
16688 num_cmdline_dump_sects = num_dump_sects;
16689 }
16690 }
16691
18bd398b
NC
16692 if (optind < (argc - 1))
16693 show_name = 1;
5656ba2c
L
16694 else if (optind >= argc)
16695 {
16696 warn (_("Nothing to do.\n"));
16697 usage (stderr);
16698 }
18bd398b 16699
ff78d6d6 16700 err = 0;
252b5132 16701 while (optind < argc)
18bd398b 16702 err |= process_file (argv[optind++]);
252b5132
RH
16703
16704 if (dump_sects != NULL)
16705 free (dump_sects);
59f14fc0
AS
16706 if (cmdline_dump_sects != NULL)
16707 free (cmdline_dump_sects);
252b5132 16708
ff78d6d6 16709 return err;
252b5132 16710}