arc: Remove EF_ARC_CPU_GENERIC constant.
[deliverable/binutils-gdb.git] / binutils / readelf.c
CommitLineData
252b5132 1/* readelf.c -- display contents of an ELF format file
6f2750fe 2 Copyright (C) 1998-2016 Free Software Foundation, Inc.
252b5132
RH
3
4 Originally developed by Eric Youngdale <eric@andante.jic.com>
12ab83a9 5 Modifications by Nick Clifton <nickc@redhat.com>
252b5132
RH
6
7 This file is part of GNU Binutils.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
32866df7 11 the Free Software Foundation; either version 3 of the License, or
252b5132
RH
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
b43b5d5f
NC
21 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
22 02110-1301, USA. */
252b5132 23\f
9eb20dd8 24/* The difference between readelf and objdump:
252b5132 25
74013231 26 Both programs are capable of displaying the contents of ELF format files,
9eb20dd8 27 so why does the binutils project have two file dumpers ?
0de14b54 28
9eb20dd8
NC
29 The reason is that objdump sees an ELF file through a BFD filter of the
30 world; if BFD has a bug where, say, it disagrees about a machine constant
31 in e_flags, then the odds are good that it will remain internally
32 consistent. The linker sees it the BFD way, objdump sees it the BFD way,
33 GAS sees it the BFD way. There was need for a tool to go find out what
34 the file actually says.
35
36 This is why the readelf program does not link against the BFD library - it
37 exists as an independent program to help verify the correct working of BFD.
38
39 There is also the case that readelf can provide more information about an
40 ELF file than is provided by objdump. In particular it can display DWARF
41 debugging information which (at the moment) objdump cannot. */
42\f
3db64b00 43#include "sysdep.h"
252b5132 44#include <assert.h>
252b5132 45#include <time.h>
1b315056 46#include <zlib.h>
3bfcb652 47#ifdef HAVE_WCHAR_H
7bfd842d 48#include <wchar.h>
3bfcb652 49#endif
252b5132 50
a952a375 51#if __GNUC__ >= 2
19936277 52/* Define BFD64 here, even if our default architecture is 32 bit ELF
a952a375 53 as this will allow us to read in and parse 64bit and 32bit ELF files.
b34976b6 54 Only do this if we believe that the compiler can support a 64 bit
a952a375 55 data type. For now we only rely on GCC being able to do this. */
19936277 56#define BFD64
a952a375
NC
57#endif
58
3db64b00
AM
59#include "bfd.h"
60#include "bucomm.h"
3284fe0c 61#include "elfcomm.h"
19e6b90e 62#include "dwarf.h"
252b5132
RH
63
64#include "elf/common.h"
65#include "elf/external.h"
66#include "elf/internal.h"
252b5132 67
4b78141a
NC
68
69/* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
70 we can obtain the H8 reloc numbers. We need these for the
71 get_reloc_size() function. We include h8.h again after defining
72 RELOC_MACROS_GEN_FUNC so that we get the naming function as well. */
73
74#include "elf/h8.h"
75#undef _ELF_H8_H
76
77/* Undo the effects of #including reloc-macros.h. */
78
79#undef START_RELOC_NUMBERS
80#undef RELOC_NUMBER
81#undef FAKE_RELOC
82#undef EMPTY_RELOC
83#undef END_RELOC_NUMBERS
84#undef _RELOC_MACROS_H
85
252b5132
RH
86/* The following headers use the elf/reloc-macros.h file to
87 automatically generate relocation recognition functions
88 such as elf_mips_reloc_type() */
89
90#define RELOC_MACROS_GEN_FUNC
91
a06ea964 92#include "elf/aarch64.h"
252b5132 93#include "elf/alpha.h"
3b16e843 94#include "elf/arc.h"
252b5132 95#include "elf/arm.h"
3b16e843 96#include "elf/avr.h"
1d65ded4 97#include "elf/bfin.h"
60bca95a 98#include "elf/cr16.h"
3b16e843 99#include "elf/cris.h"
1c0d3aa6 100#include "elf/crx.h"
252b5132
RH
101#include "elf/d10v.h"
102#include "elf/d30v.h"
d172d4ba 103#include "elf/dlx.h"
cfb8c092 104#include "elf/epiphany.h"
252b5132 105#include "elf/fr30.h"
5c70f934 106#include "elf/frv.h"
3f8107ab 107#include "elf/ft32.h"
3b16e843
NC
108#include "elf/h8.h"
109#include "elf/hppa.h"
110#include "elf/i386.h"
35b1837e 111#include "elf/i370.h"
3b16e843
NC
112#include "elf/i860.h"
113#include "elf/i960.h"
114#include "elf/ia64.h"
1e4cf259 115#include "elf/ip2k.h"
84e94c90 116#include "elf/lm32.h"
1c0d3aa6 117#include "elf/iq2000.h"
49f58d10 118#include "elf/m32c.h"
3b16e843
NC
119#include "elf/m32r.h"
120#include "elf/m68k.h"
75751cd9 121#include "elf/m68hc11.h"
252b5132 122#include "elf/mcore.h"
15ab5209 123#include "elf/mep.h"
a3c62988 124#include "elf/metag.h"
7ba29e2a 125#include "elf/microblaze.h"
3b16e843 126#include "elf/mips.h"
3c3bdf30 127#include "elf/mmix.h"
3b16e843
NC
128#include "elf/mn10200.h"
129#include "elf/mn10300.h"
5506d11a 130#include "elf/moxie.h"
4970f871 131#include "elf/mt.h"
2469cfa2 132#include "elf/msp430.h"
35c08157 133#include "elf/nds32.h"
13761a11 134#include "elf/nios2.h"
73589c9d 135#include "elf/or1k.h"
7d466069 136#include "elf/pj.h"
3b16e843 137#include "elf/ppc.h"
c833c019 138#include "elf/ppc64.h"
99c513f6 139#include "elf/rl78.h"
c7927a3c 140#include "elf/rx.h"
a85d7ed0 141#include "elf/s390.h"
1c0d3aa6 142#include "elf/score.h"
3b16e843
NC
143#include "elf/sh.h"
144#include "elf/sparc.h"
e9f53129 145#include "elf/spu.h"
40b36596 146#include "elf/tic6x.h"
aa137e4d
NC
147#include "elf/tilegx.h"
148#include "elf/tilepro.h"
3b16e843 149#include "elf/v850.h"
179d3252 150#include "elf/vax.h"
619ed720 151#include "elf/visium.h"
3b16e843 152#include "elf/x86-64.h"
c29aca4a 153#include "elf/xc16x.h"
f6c1a2d5 154#include "elf/xgate.h"
93fbbb04 155#include "elf/xstormy16.h"
88da6820 156#include "elf/xtensa.h"
252b5132 157
252b5132 158#include "getopt.h"
566b0d53 159#include "libiberty.h"
09c11c86 160#include "safe-ctype.h"
2cf0635d 161#include "filenames.h"
252b5132 162
15b42fb0
AM
163#ifndef offsetof
164#define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
165#endif
166
6a40cf0c
NC
167typedef struct elf_section_list
168{
169 Elf_Internal_Shdr * hdr;
170 struct elf_section_list * next;
171} elf_section_list;
172
2cf0635d 173char * program_name = "readelf";
c9c1d674 174static unsigned long archive_file_offset;
85b1c36d 175static unsigned long archive_file_size;
f54498b4 176static bfd_size_type current_file_size;
85b1c36d
BE
177static unsigned long dynamic_addr;
178static bfd_size_type dynamic_size;
8b73c356 179static size_t dynamic_nent;
2cf0635d 180static char * dynamic_strings;
85b1c36d 181static unsigned long dynamic_strings_length;
2cf0635d 182static char * string_table;
85b1c36d
BE
183static unsigned long string_table_length;
184static unsigned long num_dynamic_syms;
2cf0635d
NC
185static Elf_Internal_Sym * dynamic_symbols;
186static Elf_Internal_Syminfo * dynamic_syminfo;
85b1c36d
BE
187static unsigned long dynamic_syminfo_offset;
188static unsigned int dynamic_syminfo_nent;
f8eae8b2 189static char program_interpreter[PATH_MAX];
bb8a0291 190static bfd_vma dynamic_info[DT_ENCODING];
fdc90cb4 191static bfd_vma dynamic_info_DT_GNU_HASH;
85b1c36d
BE
192static bfd_vma version_info[16];
193static Elf_Internal_Ehdr elf_header;
2cf0635d
NC
194static Elf_Internal_Shdr * section_headers;
195static Elf_Internal_Phdr * program_headers;
196static Elf_Internal_Dyn * dynamic_section;
6a40cf0c 197static elf_section_list * symtab_shndx_list;
85b1c36d
BE
198static int show_name;
199static int do_dynamic;
200static int do_syms;
2c610e4b 201static int do_dyn_syms;
85b1c36d
BE
202static int do_reloc;
203static int do_sections;
204static int do_section_groups;
5477e8a0 205static int do_section_details;
85b1c36d
BE
206static int do_segments;
207static int do_unwind;
208static int do_using_dynamic;
209static int do_header;
210static int do_dump;
211static int do_version;
85b1c36d
BE
212static int do_histogram;
213static int do_debugging;
85b1c36d
BE
214static int do_arch;
215static int do_notes;
4145f1d5 216static int do_archive_index;
85b1c36d 217static int is_32bit_elf;
0e602686 218static int decompress_dumps;
252b5132 219
e4b17d5c
L
220struct group_list
221{
2cf0635d 222 struct group_list * next;
e4b17d5c
L
223 unsigned int section_index;
224};
225
226struct group
227{
2cf0635d 228 struct group_list * root;
e4b17d5c
L
229 unsigned int group_index;
230};
231
85b1c36d 232static size_t group_count;
2cf0635d
NC
233static struct group * section_groups;
234static struct group ** section_headers_groups;
e4b17d5c 235
09c11c86
NC
236
237/* Flag bits indicating particular types of dump. */
238#define HEX_DUMP (1 << 0) /* The -x command line switch. */
239#define DISASS_DUMP (1 << 1) /* The -i command line switch. */
240#define DEBUG_DUMP (1 << 2) /* The -w command line switch. */
241#define STRING_DUMP (1 << 3) /* The -p command line switch. */
cf13d699 242#define RELOC_DUMP (1 << 4) /* The -R command line switch. */
09c11c86
NC
243
244typedef unsigned char dump_type;
245
246/* A linked list of the section names for which dumps were requested. */
aef1f6d0
DJ
247struct dump_list_entry
248{
2cf0635d 249 char * name;
09c11c86 250 dump_type type;
2cf0635d 251 struct dump_list_entry * next;
aef1f6d0 252};
2cf0635d 253static struct dump_list_entry * dump_sects_byname;
aef1f6d0 254
09c11c86
NC
255/* A dynamic array of flags indicating for which sections a dump
256 has been requested via command line switches. */
257static dump_type * cmdline_dump_sects = NULL;
258static unsigned int num_cmdline_dump_sects = 0;
18bd398b
NC
259
260/* A dynamic array of flags indicating for which sections a dump of
261 some kind has been requested. It is reset on a per-object file
aef1f6d0
DJ
262 basis and then initialised from the cmdline_dump_sects array,
263 the results of interpreting the -w switch, and the
264 dump_sects_byname list. */
09c11c86
NC
265static dump_type * dump_sects = NULL;
266static unsigned int num_dump_sects = 0;
252b5132 267
252b5132 268
c256ffe7 269/* How to print a vma value. */
843dd992
NC
270typedef enum print_mode
271{
272 HEX,
273 DEC,
274 DEC_5,
275 UNSIGNED,
276 PREFIX_HEX,
277 FULL_HEX,
278 LONG_HEX
279}
280print_mode;
281
bb4d2ac2
L
282/* Versioned symbol info. */
283enum versioned_symbol_info
284{
285 symbol_undefined,
286 symbol_hidden,
287 symbol_public
288};
289
290static const char *get_symbol_version_string
291 (FILE *file, int is_dynsym, const char *strtab,
292 unsigned long int strtab_size, unsigned int si,
293 Elf_Internal_Sym *psym, enum versioned_symbol_info *sym_info,
294 unsigned short *vna_other);
295
9c19a809
NC
296#define UNKNOWN -1
297
2b692964
NC
298#define SECTION_NAME(X) \
299 ((X) == NULL ? _("<none>") \
300 : string_table == NULL ? _("<no-name>") \
301 : ((X)->sh_name >= string_table_length ? _("<corrupt>") \
0b49d371 302 : string_table + (X)->sh_name))
252b5132 303
ee42cf8c 304#define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
252b5132 305
ba5cdace
NC
306#define GET_ELF_SYMBOLS(file, section, sym_count) \
307 (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count) \
308 : get_64bit_elf_symbols (file, section, sym_count))
9ea033b2 309
d79b3d50
NC
310#define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
311/* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
312 already been called and verified that the string exists. */
313#define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
18bd398b 314
61865e30
NC
315#define REMOVE_ARCH_BITS(ADDR) \
316 do \
317 { \
318 if (elf_header.e_machine == EM_ARM) \
319 (ADDR) &= ~1; \
320 } \
321 while (0)
d79b3d50 322\f
c9c1d674
EG
323/* Retrieve NMEMB structures, each SIZE bytes long from FILE starting at OFFSET +
324 the offset of the current archive member, if we are examining an archive.
59245841
NC
325 Put the retrieved data into VAR, if it is not NULL. Otherwise allocate a buffer
326 using malloc and fill that. In either case return the pointer to the start of
327 the retrieved data or NULL if something went wrong. If something does go wrong
c9c1d674
EG
328 and REASON is not NULL then emit an error message using REASON as part of the
329 context. */
59245841 330
c256ffe7 331static void *
57028622
NC
332get_data (void * var, FILE * file, unsigned long offset, bfd_size_type size,
333 bfd_size_type nmemb, const char * reason)
a6e9f9df 334{
2cf0635d 335 void * mvar;
57028622 336 bfd_size_type amt = size * nmemb;
a6e9f9df 337
c256ffe7 338 if (size == 0 || nmemb == 0)
a6e9f9df
AM
339 return NULL;
340
57028622
NC
341 /* If the size_t type is smaller than the bfd_size_type, eg because
342 you are building a 32-bit tool on a 64-bit host, then make sure
343 that when the sizes are cast to (size_t) no information is lost. */
344 if (sizeof (size_t) < sizeof (bfd_size_type)
345 && ( (bfd_size_type) ((size_t) size) != size
346 || (bfd_size_type) ((size_t) nmemb) != nmemb))
347 {
348 if (reason)
349 error (_("Size truncation prevents reading 0x%llx elements of size 0x%llx for %s\n"),
350 (unsigned long long) nmemb, (unsigned long long) size, reason);
351 return NULL;
352 }
353
354 /* Check for size overflow. */
355 if (amt < nmemb)
356 {
357 if (reason)
358 error (_("Size overflow prevents reading 0x%llx elements of size 0x%llx for %s\n"),
359 (unsigned long long) nmemb, (unsigned long long) size, reason);
360 return NULL;
361 }
362
c9c1d674
EG
363 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
364 attempting to allocate memory when the read is bound to fail. */
365 if (amt > current_file_size
366 || offset + archive_file_offset + amt > current_file_size)
a6e9f9df 367 {
049b0c3a 368 if (reason)
57028622
NC
369 error (_("Reading 0x%llx bytes extends past end of file for %s\n"),
370 (unsigned long long) amt, reason);
a6e9f9df
AM
371 return NULL;
372 }
373
c9c1d674 374 if (fseek (file, archive_file_offset + offset, SEEK_SET))
071436c6
NC
375 {
376 if (reason)
c9c1d674
EG
377 error (_("Unable to seek to 0x%lx for %s\n"),
378 (unsigned long) archive_file_offset + offset, reason);
071436c6
NC
379 return NULL;
380 }
381
a6e9f9df
AM
382 mvar = var;
383 if (mvar == NULL)
384 {
c256ffe7 385 /* Check for overflow. */
57028622 386 if (nmemb < (~(bfd_size_type) 0 - 1) / size)
c256ffe7 387 /* + 1 so that we can '\0' terminate invalid string table sections. */
57028622 388 mvar = malloc ((size_t) amt + 1);
a6e9f9df
AM
389
390 if (mvar == NULL)
391 {
049b0c3a 392 if (reason)
57028622
NC
393 error (_("Out of memory allocating 0x%llx bytes for %s\n"),
394 (unsigned long long) amt, reason);
a6e9f9df
AM
395 return NULL;
396 }
c256ffe7 397
c9c1d674 398 ((char *) mvar)[amt] = '\0';
a6e9f9df
AM
399 }
400
57028622 401 if (fread (mvar, (size_t) size, (size_t) nmemb, file) != nmemb)
a6e9f9df 402 {
049b0c3a 403 if (reason)
57028622
NC
404 error (_("Unable to read in 0x%llx bytes of %s\n"),
405 (unsigned long long) amt, reason);
a6e9f9df
AM
406 if (mvar != var)
407 free (mvar);
408 return NULL;
409 }
410
411 return mvar;
412}
413
14a91970 414/* Print a VMA value. */
cb8f3167 415
66543521 416static int
14a91970 417print_vma (bfd_vma vma, print_mode mode)
66543521 418{
66543521
AM
419 int nc = 0;
420
14a91970 421 switch (mode)
66543521 422 {
14a91970
AM
423 case FULL_HEX:
424 nc = printf ("0x");
425 /* Drop through. */
66543521 426
14a91970 427 case LONG_HEX:
f7a99963 428#ifdef BFD64
14a91970 429 if (is_32bit_elf)
437c2fb7 430 return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
f7a99963 431#endif
14a91970
AM
432 printf_vma (vma);
433 return nc + 16;
b19aac67 434
14a91970
AM
435 case DEC_5:
436 if (vma <= 99999)
437 return printf ("%5" BFD_VMA_FMT "d", vma);
438 /* Drop through. */
66543521 439
14a91970
AM
440 case PREFIX_HEX:
441 nc = printf ("0x");
442 /* Drop through. */
66543521 443
14a91970
AM
444 case HEX:
445 return nc + printf ("%" BFD_VMA_FMT "x", vma);
b19aac67 446
14a91970
AM
447 case DEC:
448 return printf ("%" BFD_VMA_FMT "d", vma);
b19aac67 449
14a91970
AM
450 case UNSIGNED:
451 return printf ("%" BFD_VMA_FMT "u", vma);
f7a99963 452 }
66543521 453 return 0;
f7a99963
NC
454}
455
7bfd842d 456/* Display a symbol on stdout. Handles the display of control characters and
3bfcb652 457 multibye characters (assuming the host environment supports them).
31104126 458
7bfd842d
NC
459 Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
460
461 If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
462 padding as necessary.
171191ba
NC
463
464 Returns the number of emitted characters. */
465
466static unsigned int
7a88bc9c 467print_symbol (int width, const char *symbol)
31104126 468{
171191ba 469 bfd_boolean extra_padding = FALSE;
7bfd842d 470 int num_printed = 0;
3bfcb652 471#ifdef HAVE_MBSTATE_T
7bfd842d 472 mbstate_t state;
3bfcb652 473#endif
7bfd842d 474 int width_remaining;
961c521f 475
7bfd842d 476 if (width < 0)
961c521f 477 {
961c521f
NC
478 /* Keep the width positive. This also helps. */
479 width = - width;
171191ba 480 extra_padding = TRUE;
0b4362b0 481 }
74e1a04b 482 assert (width != 0);
961c521f 483
7bfd842d
NC
484 if (do_wide)
485 /* Set the remaining width to a very large value.
486 This simplifies the code below. */
487 width_remaining = INT_MAX;
488 else
489 width_remaining = width;
cb8f3167 490
3bfcb652 491#ifdef HAVE_MBSTATE_T
7bfd842d
NC
492 /* Initialise the multibyte conversion state. */
493 memset (& state, 0, sizeof (state));
3bfcb652 494#endif
961c521f 495
7bfd842d
NC
496 while (width_remaining)
497 {
498 size_t n;
7bfd842d 499 const char c = *symbol++;
961c521f 500
7bfd842d 501 if (c == 0)
961c521f
NC
502 break;
503
7bfd842d
NC
504 /* Do not print control characters directly as they can affect terminal
505 settings. Such characters usually appear in the names generated
506 by the assembler for local labels. */
507 if (ISCNTRL (c))
961c521f 508 {
7bfd842d 509 if (width_remaining < 2)
961c521f
NC
510 break;
511
7bfd842d
NC
512 printf ("^%c", c + 0x40);
513 width_remaining -= 2;
171191ba 514 num_printed += 2;
961c521f 515 }
7bfd842d
NC
516 else if (ISPRINT (c))
517 {
518 putchar (c);
519 width_remaining --;
520 num_printed ++;
521 }
961c521f
NC
522 else
523 {
3bfcb652
NC
524#ifdef HAVE_MBSTATE_T
525 wchar_t w;
526#endif
7bfd842d
NC
527 /* Let printf do the hard work of displaying multibyte characters. */
528 printf ("%.1s", symbol - 1);
529 width_remaining --;
530 num_printed ++;
531
3bfcb652 532#ifdef HAVE_MBSTATE_T
7bfd842d
NC
533 /* Try to find out how many bytes made up the character that was
534 just printed. Advance the symbol pointer past the bytes that
535 were displayed. */
536 n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
3bfcb652
NC
537#else
538 n = 1;
539#endif
7bfd842d
NC
540 if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
541 symbol += (n - 1);
961c521f 542 }
961c521f 543 }
171191ba 544
7bfd842d 545 if (extra_padding && num_printed < width)
171191ba
NC
546 {
547 /* Fill in the remaining spaces. */
7bfd842d
NC
548 printf ("%-*s", width - num_printed, " ");
549 num_printed = width;
171191ba
NC
550 }
551
552 return num_printed;
31104126
NC
553}
554
74e1a04b
NC
555/* Returns a pointer to a static buffer containing a printable version of
556 the given section's name. Like print_symbol, except that it does not try
557 to print multibyte characters, it just interprets them as hex values. */
558
559static const char *
0d2a7a93 560printable_section_name (const Elf_Internal_Shdr * sec)
74e1a04b
NC
561{
562#define MAX_PRINT_SEC_NAME_LEN 128
563 static char sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
564 const char * name = SECTION_NAME (sec);
565 char * buf = sec_name_buf;
566 char c;
567 unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
568
569 while ((c = * name ++) != 0)
570 {
571 if (ISCNTRL (c))
572 {
573 if (remaining < 2)
574 break;
948f632f 575
74e1a04b
NC
576 * buf ++ = '^';
577 * buf ++ = c + 0x40;
578 remaining -= 2;
579 }
580 else if (ISPRINT (c))
581 {
582 * buf ++ = c;
583 remaining -= 1;
584 }
585 else
586 {
587 static char hex[17] = "0123456789ABCDEF";
588
589 if (remaining < 4)
590 break;
591 * buf ++ = '<';
592 * buf ++ = hex[(c & 0xf0) >> 4];
593 * buf ++ = hex[c & 0x0f];
594 * buf ++ = '>';
595 remaining -= 4;
596 }
597
598 if (remaining == 0)
599 break;
600 }
601
602 * buf = 0;
603 return sec_name_buf;
604}
605
606static const char *
607printable_section_name_from_index (unsigned long ndx)
608{
609 if (ndx >= elf_header.e_shnum)
610 return _("<corrupt>");
611
612 return printable_section_name (section_headers + ndx);
613}
614
89fac5e3
RS
615/* Return a pointer to section NAME, or NULL if no such section exists. */
616
617static Elf_Internal_Shdr *
2cf0635d 618find_section (const char * name)
89fac5e3
RS
619{
620 unsigned int i;
621
622 for (i = 0; i < elf_header.e_shnum; i++)
623 if (streq (SECTION_NAME (section_headers + i), name))
624 return section_headers + i;
625
626 return NULL;
627}
628
0b6ae522
DJ
629/* Return a pointer to a section containing ADDR, or NULL if no such
630 section exists. */
631
632static Elf_Internal_Shdr *
633find_section_by_address (bfd_vma addr)
634{
635 unsigned int i;
636
637 for (i = 0; i < elf_header.e_shnum; i++)
638 {
639 Elf_Internal_Shdr *sec = section_headers + i;
640 if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
641 return sec;
642 }
643
644 return NULL;
645}
646
071436c6
NC
647static Elf_Internal_Shdr *
648find_section_by_type (unsigned int type)
649{
650 unsigned int i;
651
652 for (i = 0; i < elf_header.e_shnum; i++)
653 {
654 Elf_Internal_Shdr *sec = section_headers + i;
655 if (sec->sh_type == type)
656 return sec;
657 }
658
659 return NULL;
660}
661
657d0d47
CC
662/* Return a pointer to section NAME, or NULL if no such section exists,
663 restricted to the list of sections given in SET. */
664
665static Elf_Internal_Shdr *
666find_section_in_set (const char * name, unsigned int * set)
667{
668 unsigned int i;
669
670 if (set != NULL)
671 {
672 while ((i = *set++) > 0)
673 if (streq (SECTION_NAME (section_headers + i), name))
674 return section_headers + i;
675 }
676
677 return find_section (name);
678}
679
0b6ae522
DJ
680/* Read an unsigned LEB128 encoded value from p. Set *PLEN to the number of
681 bytes read. */
682
f6f0e17b
NC
683static inline unsigned long
684read_uleb128 (unsigned char *data,
685 unsigned int *length_return,
686 const unsigned char * const end)
0b6ae522 687{
f6f0e17b 688 return read_leb128 (data, length_return, FALSE, end);
0b6ae522
DJ
689}
690
28f997cf
TG
691/* Return true if the current file is for IA-64 machine and OpenVMS ABI.
692 This OS has so many departures from the ELF standard that we test it at
693 many places. */
694
695static inline int
696is_ia64_vms (void)
697{
698 return elf_header.e_machine == EM_IA_64
699 && elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
700}
701
bcedfee6 702/* Guess the relocation size commonly used by the specific machines. */
252b5132 703
252b5132 704static int
2dc4cec1 705guess_is_rela (unsigned int e_machine)
252b5132 706{
9c19a809 707 switch (e_machine)
252b5132
RH
708 {
709 /* Targets that use REL relocations. */
252b5132 710 case EM_386:
22abe556 711 case EM_IAMCU:
63fcb9e9 712 case EM_960:
e9f53129 713 case EM_ARM:
2b0337b0 714 case EM_D10V:
252b5132 715 case EM_CYGNUS_D10V:
e9f53129 716 case EM_DLX:
252b5132 717 case EM_MIPS:
4fe85591 718 case EM_MIPS_RS3_LE:
e9f53129 719 case EM_CYGNUS_M32R:
1c0d3aa6 720 case EM_SCORE:
f6c1a2d5 721 case EM_XGATE:
9c19a809 722 return FALSE;
103f02d3 723
252b5132
RH
724 /* Targets that use RELA relocations. */
725 case EM_68K:
e9f53129 726 case EM_860:
a06ea964 727 case EM_AARCH64:
cfb8c092 728 case EM_ADAPTEVA_EPIPHANY:
e9f53129
AM
729 case EM_ALPHA:
730 case EM_ALTERA_NIOS2:
886a2506
NC
731 case EM_ARC:
732 case EM_ARC_COMPACT:
733 case EM_ARC_COMPACT2:
e9f53129
AM
734 case EM_AVR:
735 case EM_AVR_OLD:
736 case EM_BLACKFIN:
60bca95a 737 case EM_CR16:
e9f53129
AM
738 case EM_CRIS:
739 case EM_CRX:
2b0337b0 740 case EM_D30V:
252b5132 741 case EM_CYGNUS_D30V:
2b0337b0 742 case EM_FR30:
3f8107ab 743 case EM_FT32:
252b5132 744 case EM_CYGNUS_FR30:
5c70f934 745 case EM_CYGNUS_FRV:
e9f53129
AM
746 case EM_H8S:
747 case EM_H8_300:
748 case EM_H8_300H:
800eeca4 749 case EM_IA_64:
1e4cf259
NC
750 case EM_IP2K:
751 case EM_IP2K_OLD:
3b36097d 752 case EM_IQ2000:
84e94c90 753 case EM_LATTICEMICO32:
ff7eeb89 754 case EM_M32C_OLD:
49f58d10 755 case EM_M32C:
e9f53129
AM
756 case EM_M32R:
757 case EM_MCORE:
15ab5209 758 case EM_CYGNUS_MEP:
a3c62988 759 case EM_METAG:
e9f53129
AM
760 case EM_MMIX:
761 case EM_MN10200:
762 case EM_CYGNUS_MN10200:
763 case EM_MN10300:
764 case EM_CYGNUS_MN10300:
5506d11a 765 case EM_MOXIE:
e9f53129
AM
766 case EM_MSP430:
767 case EM_MSP430_OLD:
d031aafb 768 case EM_MT:
35c08157 769 case EM_NDS32:
64fd6348 770 case EM_NIOS32:
73589c9d 771 case EM_OR1K:
e9f53129
AM
772 case EM_PPC64:
773 case EM_PPC:
99c513f6 774 case EM_RL78:
c7927a3c 775 case EM_RX:
e9f53129
AM
776 case EM_S390:
777 case EM_S390_OLD:
778 case EM_SH:
779 case EM_SPARC:
780 case EM_SPARC32PLUS:
781 case EM_SPARCV9:
782 case EM_SPU:
40b36596 783 case EM_TI_C6000:
aa137e4d
NC
784 case EM_TILEGX:
785 case EM_TILEPRO:
708e2187 786 case EM_V800:
e9f53129
AM
787 case EM_V850:
788 case EM_CYGNUS_V850:
789 case EM_VAX:
619ed720 790 case EM_VISIUM:
e9f53129 791 case EM_X86_64:
8a9036a4 792 case EM_L1OM:
7a9068fe 793 case EM_K1OM:
e9f53129
AM
794 case EM_XSTORMY16:
795 case EM_XTENSA:
796 case EM_XTENSA_OLD:
7ba29e2a
NC
797 case EM_MICROBLAZE:
798 case EM_MICROBLAZE_OLD:
9c19a809 799 return TRUE;
103f02d3 800
e9f53129
AM
801 case EM_68HC05:
802 case EM_68HC08:
803 case EM_68HC11:
804 case EM_68HC16:
805 case EM_FX66:
806 case EM_ME16:
d1133906 807 case EM_MMA:
d1133906
NC
808 case EM_NCPU:
809 case EM_NDR1:
e9f53129 810 case EM_PCP:
d1133906 811 case EM_ST100:
e9f53129 812 case EM_ST19:
d1133906 813 case EM_ST7:
e9f53129
AM
814 case EM_ST9PLUS:
815 case EM_STARCORE:
d1133906 816 case EM_SVX:
e9f53129 817 case EM_TINYJ:
9c19a809
NC
818 default:
819 warn (_("Don't know about relocations on this machine architecture\n"));
820 return FALSE;
821 }
822}
252b5132 823
9c19a809 824static int
2cf0635d 825slurp_rela_relocs (FILE * file,
d3ba0551
AM
826 unsigned long rel_offset,
827 unsigned long rel_size,
2cf0635d
NC
828 Elf_Internal_Rela ** relasp,
829 unsigned long * nrelasp)
9c19a809 830{
2cf0635d 831 Elf_Internal_Rela * relas;
8b73c356 832 size_t nrelas;
4d6ed7c8 833 unsigned int i;
252b5132 834
4d6ed7c8
NC
835 if (is_32bit_elf)
836 {
2cf0635d 837 Elf32_External_Rela * erelas;
103f02d3 838
3f5e193b 839 erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset, 1,
9cf03b7e 840 rel_size, _("32-bit relocation data"));
a6e9f9df
AM
841 if (!erelas)
842 return 0;
252b5132 843
4d6ed7c8 844 nrelas = rel_size / sizeof (Elf32_External_Rela);
103f02d3 845
3f5e193b
NC
846 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
847 sizeof (Elf_Internal_Rela));
103f02d3 848
4d6ed7c8
NC
849 if (relas == NULL)
850 {
c256ffe7 851 free (erelas);
591a748a 852 error (_("out of memory parsing relocs\n"));
4d6ed7c8
NC
853 return 0;
854 }
103f02d3 855
4d6ed7c8
NC
856 for (i = 0; i < nrelas; i++)
857 {
858 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
859 relas[i].r_info = BYTE_GET (erelas[i].r_info);
598aaa76 860 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
4d6ed7c8 861 }
103f02d3 862
4d6ed7c8
NC
863 free (erelas);
864 }
865 else
866 {
2cf0635d 867 Elf64_External_Rela * erelas;
103f02d3 868
3f5e193b 869 erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset, 1,
9cf03b7e 870 rel_size, _("64-bit relocation data"));
a6e9f9df
AM
871 if (!erelas)
872 return 0;
4d6ed7c8
NC
873
874 nrelas = rel_size / sizeof (Elf64_External_Rela);
103f02d3 875
3f5e193b
NC
876 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
877 sizeof (Elf_Internal_Rela));
103f02d3 878
4d6ed7c8
NC
879 if (relas == NULL)
880 {
c256ffe7 881 free (erelas);
591a748a 882 error (_("out of memory parsing relocs\n"));
4d6ed7c8 883 return 0;
9c19a809 884 }
4d6ed7c8
NC
885
886 for (i = 0; i < nrelas; i++)
9c19a809 887 {
66543521
AM
888 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
889 relas[i].r_info = BYTE_GET (erelas[i].r_info);
598aaa76 890 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
861fb55a
DJ
891
892 /* The #ifdef BFD64 below is to prevent a compile time
893 warning. We know that if we do not have a 64 bit data
894 type that we will never execute this code anyway. */
895#ifdef BFD64
896 if (elf_header.e_machine == EM_MIPS
897 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
898 {
899 /* In little-endian objects, r_info isn't really a
900 64-bit little-endian value: it has a 32-bit
901 little-endian symbol index followed by four
902 individual byte fields. Reorder INFO
903 accordingly. */
91d6fa6a
NC
904 bfd_vma inf = relas[i].r_info;
905 inf = (((inf & 0xffffffff) << 32)
906 | ((inf >> 56) & 0xff)
907 | ((inf >> 40) & 0xff00)
908 | ((inf >> 24) & 0xff0000)
909 | ((inf >> 8) & 0xff000000));
910 relas[i].r_info = inf;
861fb55a
DJ
911 }
912#endif /* BFD64 */
4d6ed7c8 913 }
103f02d3 914
4d6ed7c8
NC
915 free (erelas);
916 }
917 *relasp = relas;
918 *nrelasp = nrelas;
919 return 1;
920}
103f02d3 921
4d6ed7c8 922static int
2cf0635d 923slurp_rel_relocs (FILE * file,
d3ba0551
AM
924 unsigned long rel_offset,
925 unsigned long rel_size,
2cf0635d
NC
926 Elf_Internal_Rela ** relsp,
927 unsigned long * nrelsp)
4d6ed7c8 928{
2cf0635d 929 Elf_Internal_Rela * rels;
8b73c356 930 size_t nrels;
4d6ed7c8 931 unsigned int i;
103f02d3 932
4d6ed7c8
NC
933 if (is_32bit_elf)
934 {
2cf0635d 935 Elf32_External_Rel * erels;
103f02d3 936
3f5e193b 937 erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset, 1,
9cf03b7e 938 rel_size, _("32-bit relocation data"));
a6e9f9df
AM
939 if (!erels)
940 return 0;
103f02d3 941
4d6ed7c8 942 nrels = rel_size / sizeof (Elf32_External_Rel);
103f02d3 943
3f5e193b 944 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
103f02d3 945
4d6ed7c8
NC
946 if (rels == NULL)
947 {
c256ffe7 948 free (erels);
591a748a 949 error (_("out of memory parsing relocs\n"));
4d6ed7c8
NC
950 return 0;
951 }
952
953 for (i = 0; i < nrels; i++)
954 {
955 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
956 rels[i].r_info = BYTE_GET (erels[i].r_info);
c8286bd1 957 rels[i].r_addend = 0;
9ea033b2 958 }
4d6ed7c8
NC
959
960 free (erels);
9c19a809
NC
961 }
962 else
963 {
2cf0635d 964 Elf64_External_Rel * erels;
9ea033b2 965
3f5e193b 966 erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset, 1,
9cf03b7e 967 rel_size, _("64-bit relocation data"));
a6e9f9df
AM
968 if (!erels)
969 return 0;
103f02d3 970
4d6ed7c8 971 nrels = rel_size / sizeof (Elf64_External_Rel);
103f02d3 972
3f5e193b 973 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
103f02d3 974
4d6ed7c8 975 if (rels == NULL)
9c19a809 976 {
c256ffe7 977 free (erels);
591a748a 978 error (_("out of memory parsing relocs\n"));
4d6ed7c8
NC
979 return 0;
980 }
103f02d3 981
4d6ed7c8
NC
982 for (i = 0; i < nrels; i++)
983 {
66543521
AM
984 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
985 rels[i].r_info = BYTE_GET (erels[i].r_info);
c8286bd1 986 rels[i].r_addend = 0;
861fb55a
DJ
987
988 /* The #ifdef BFD64 below is to prevent a compile time
989 warning. We know that if we do not have a 64 bit data
990 type that we will never execute this code anyway. */
991#ifdef BFD64
992 if (elf_header.e_machine == EM_MIPS
993 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
994 {
995 /* In little-endian objects, r_info isn't really a
996 64-bit little-endian value: it has a 32-bit
997 little-endian symbol index followed by four
998 individual byte fields. Reorder INFO
999 accordingly. */
91d6fa6a
NC
1000 bfd_vma inf = rels[i].r_info;
1001 inf = (((inf & 0xffffffff) << 32)
1002 | ((inf >> 56) & 0xff)
1003 | ((inf >> 40) & 0xff00)
1004 | ((inf >> 24) & 0xff0000)
1005 | ((inf >> 8) & 0xff000000));
1006 rels[i].r_info = inf;
861fb55a
DJ
1007 }
1008#endif /* BFD64 */
4d6ed7c8 1009 }
103f02d3 1010
4d6ed7c8
NC
1011 free (erels);
1012 }
1013 *relsp = rels;
1014 *nrelsp = nrels;
1015 return 1;
1016}
103f02d3 1017
aca88567
NC
1018/* Returns the reloc type extracted from the reloc info field. */
1019
1020static unsigned int
1021get_reloc_type (bfd_vma reloc_info)
1022{
1023 if (is_32bit_elf)
1024 return ELF32_R_TYPE (reloc_info);
1025
1026 switch (elf_header.e_machine)
1027 {
1028 case EM_MIPS:
1029 /* Note: We assume that reloc_info has already been adjusted for us. */
1030 return ELF64_MIPS_R_TYPE (reloc_info);
1031
1032 case EM_SPARCV9:
1033 return ELF64_R_TYPE_ID (reloc_info);
1034
1035 default:
1036 return ELF64_R_TYPE (reloc_info);
1037 }
1038}
1039
1040/* Return the symbol index extracted from the reloc info field. */
1041
1042static bfd_vma
1043get_reloc_symindex (bfd_vma reloc_info)
1044{
1045 return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
1046}
1047
13761a11
NC
1048static inline bfd_boolean
1049uses_msp430x_relocs (void)
1050{
1051 return
1052 elf_header.e_machine == EM_MSP430 /* Paranoia. */
1053 /* GCC uses osabi == ELFOSBI_STANDALONE. */
1054 && (((elf_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
1055 /* TI compiler uses ELFOSABI_NONE. */
1056 || (elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
1057}
1058
d3ba0551
AM
1059/* Display the contents of the relocation data found at the specified
1060 offset. */
ee42cf8c 1061
41e92641 1062static void
2cf0635d 1063dump_relocations (FILE * file,
d3ba0551
AM
1064 unsigned long rel_offset,
1065 unsigned long rel_size,
2cf0635d 1066 Elf_Internal_Sym * symtab,
d3ba0551 1067 unsigned long nsyms,
2cf0635d 1068 char * strtab,
d79b3d50 1069 unsigned long strtablen,
bb4d2ac2
L
1070 int is_rela,
1071 int is_dynsym)
4d6ed7c8 1072{
b34976b6 1073 unsigned int i;
2cf0635d 1074 Elf_Internal_Rela * rels;
103f02d3 1075
4d6ed7c8
NC
1076 if (is_rela == UNKNOWN)
1077 is_rela = guess_is_rela (elf_header.e_machine);
103f02d3 1078
4d6ed7c8
NC
1079 if (is_rela)
1080 {
c8286bd1 1081 if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
41e92641 1082 return;
4d6ed7c8
NC
1083 }
1084 else
1085 {
1086 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
41e92641 1087 return;
252b5132
RH
1088 }
1089
410f7a12
L
1090 if (is_32bit_elf)
1091 {
1092 if (is_rela)
2c71103e
NC
1093 {
1094 if (do_wide)
1095 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
1096 else
1097 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
1098 }
410f7a12 1099 else
2c71103e
NC
1100 {
1101 if (do_wide)
1102 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
1103 else
1104 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
1105 }
410f7a12 1106 }
252b5132 1107 else
410f7a12
L
1108 {
1109 if (is_rela)
2c71103e
NC
1110 {
1111 if (do_wide)
8beeaeb7 1112 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
2c71103e
NC
1113 else
1114 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
1115 }
410f7a12 1116 else
2c71103e
NC
1117 {
1118 if (do_wide)
8beeaeb7 1119 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
2c71103e
NC
1120 else
1121 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
1122 }
410f7a12 1123 }
252b5132
RH
1124
1125 for (i = 0; i < rel_size; i++)
1126 {
2cf0635d 1127 const char * rtype;
b34976b6 1128 bfd_vma offset;
91d6fa6a 1129 bfd_vma inf;
b34976b6
AM
1130 bfd_vma symtab_index;
1131 bfd_vma type;
103f02d3 1132
b34976b6 1133 offset = rels[i].r_offset;
91d6fa6a 1134 inf = rels[i].r_info;
103f02d3 1135
91d6fa6a
NC
1136 type = get_reloc_type (inf);
1137 symtab_index = get_reloc_symindex (inf);
252b5132 1138
410f7a12
L
1139 if (is_32bit_elf)
1140 {
39dbeff8
AM
1141 printf ("%8.8lx %8.8lx ",
1142 (unsigned long) offset & 0xffffffff,
91d6fa6a 1143 (unsigned long) inf & 0xffffffff);
410f7a12
L
1144 }
1145 else
1146 {
39dbeff8
AM
1147#if BFD_HOST_64BIT_LONG
1148 printf (do_wide
1149 ? "%16.16lx %16.16lx "
1150 : "%12.12lx %12.12lx ",
91d6fa6a 1151 offset, inf);
39dbeff8 1152#elif BFD_HOST_64BIT_LONG_LONG
6e3d6dc1 1153#ifndef __MSVCRT__
39dbeff8
AM
1154 printf (do_wide
1155 ? "%16.16llx %16.16llx "
1156 : "%12.12llx %12.12llx ",
91d6fa6a 1157 offset, inf);
6e3d6dc1
NC
1158#else
1159 printf (do_wide
1160 ? "%16.16I64x %16.16I64x "
1161 : "%12.12I64x %12.12I64x ",
91d6fa6a 1162 offset, inf);
6e3d6dc1 1163#endif
39dbeff8 1164#else
2c71103e
NC
1165 printf (do_wide
1166 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1167 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
410f7a12
L
1168 _bfd_int64_high (offset),
1169 _bfd_int64_low (offset),
91d6fa6a
NC
1170 _bfd_int64_high (inf),
1171 _bfd_int64_low (inf));
9ea033b2 1172#endif
410f7a12 1173 }
103f02d3 1174
252b5132
RH
1175 switch (elf_header.e_machine)
1176 {
1177 default:
1178 rtype = NULL;
1179 break;
1180
a06ea964
NC
1181 case EM_AARCH64:
1182 rtype = elf_aarch64_reloc_type (type);
1183 break;
1184
2b0337b0 1185 case EM_M32R:
252b5132 1186 case EM_CYGNUS_M32R:
9ea033b2 1187 rtype = elf_m32r_reloc_type (type);
252b5132
RH
1188 break;
1189
1190 case EM_386:
22abe556 1191 case EM_IAMCU:
9ea033b2 1192 rtype = elf_i386_reloc_type (type);
252b5132
RH
1193 break;
1194
ba2685cc
AM
1195 case EM_68HC11:
1196 case EM_68HC12:
1197 rtype = elf_m68hc11_reloc_type (type);
1198 break;
75751cd9 1199
252b5132 1200 case EM_68K:
9ea033b2 1201 rtype = elf_m68k_reloc_type (type);
252b5132
RH
1202 break;
1203
63fcb9e9 1204 case EM_960:
9ea033b2 1205 rtype = elf_i960_reloc_type (type);
63fcb9e9
ILT
1206 break;
1207
adde6300 1208 case EM_AVR:
2b0337b0 1209 case EM_AVR_OLD:
adde6300
AM
1210 rtype = elf_avr_reloc_type (type);
1211 break;
1212
9ea033b2
NC
1213 case EM_OLD_SPARCV9:
1214 case EM_SPARC32PLUS:
1215 case EM_SPARCV9:
252b5132 1216 case EM_SPARC:
9ea033b2 1217 rtype = elf_sparc_reloc_type (type);
252b5132
RH
1218 break;
1219
e9f53129
AM
1220 case EM_SPU:
1221 rtype = elf_spu_reloc_type (type);
1222 break;
1223
708e2187
NC
1224 case EM_V800:
1225 rtype = v800_reloc_type (type);
1226 break;
2b0337b0 1227 case EM_V850:
252b5132 1228 case EM_CYGNUS_V850:
9ea033b2 1229 rtype = v850_reloc_type (type);
252b5132
RH
1230 break;
1231
2b0337b0 1232 case EM_D10V:
252b5132 1233 case EM_CYGNUS_D10V:
9ea033b2 1234 rtype = elf_d10v_reloc_type (type);
252b5132
RH
1235 break;
1236
2b0337b0 1237 case EM_D30V:
252b5132 1238 case EM_CYGNUS_D30V:
9ea033b2 1239 rtype = elf_d30v_reloc_type (type);
252b5132
RH
1240 break;
1241
d172d4ba
NC
1242 case EM_DLX:
1243 rtype = elf_dlx_reloc_type (type);
1244 break;
1245
252b5132 1246 case EM_SH:
9ea033b2 1247 rtype = elf_sh_reloc_type (type);
252b5132
RH
1248 break;
1249
2b0337b0 1250 case EM_MN10300:
252b5132 1251 case EM_CYGNUS_MN10300:
9ea033b2 1252 rtype = elf_mn10300_reloc_type (type);
252b5132
RH
1253 break;
1254
2b0337b0 1255 case EM_MN10200:
252b5132 1256 case EM_CYGNUS_MN10200:
9ea033b2 1257 rtype = elf_mn10200_reloc_type (type);
252b5132
RH
1258 break;
1259
2b0337b0 1260 case EM_FR30:
252b5132 1261 case EM_CYGNUS_FR30:
9ea033b2 1262 rtype = elf_fr30_reloc_type (type);
252b5132
RH
1263 break;
1264
ba2685cc
AM
1265 case EM_CYGNUS_FRV:
1266 rtype = elf_frv_reloc_type (type);
1267 break;
5c70f934 1268
3f8107ab
AM
1269 case EM_FT32:
1270 rtype = elf_ft32_reloc_type (type);
1271 break;
1272
252b5132 1273 case EM_MCORE:
9ea033b2 1274 rtype = elf_mcore_reloc_type (type);
252b5132
RH
1275 break;
1276
3c3bdf30
NC
1277 case EM_MMIX:
1278 rtype = elf_mmix_reloc_type (type);
1279 break;
1280
5506d11a
AM
1281 case EM_MOXIE:
1282 rtype = elf_moxie_reloc_type (type);
1283 break;
1284
2469cfa2 1285 case EM_MSP430:
13761a11
NC
1286 if (uses_msp430x_relocs ())
1287 {
1288 rtype = elf_msp430x_reloc_type (type);
1289 break;
1290 }
2469cfa2
NC
1291 case EM_MSP430_OLD:
1292 rtype = elf_msp430_reloc_type (type);
1293 break;
1294
35c08157
KLC
1295 case EM_NDS32:
1296 rtype = elf_nds32_reloc_type (type);
1297 break;
1298
252b5132 1299 case EM_PPC:
9ea033b2 1300 rtype = elf_ppc_reloc_type (type);
252b5132
RH
1301 break;
1302
c833c019
AM
1303 case EM_PPC64:
1304 rtype = elf_ppc64_reloc_type (type);
1305 break;
1306
252b5132 1307 case EM_MIPS:
4fe85591 1308 case EM_MIPS_RS3_LE:
9ea033b2 1309 rtype = elf_mips_reloc_type (type);
252b5132
RH
1310 break;
1311
1312 case EM_ALPHA:
9ea033b2 1313 rtype = elf_alpha_reloc_type (type);
252b5132
RH
1314 break;
1315
1316 case EM_ARM:
9ea033b2 1317 rtype = elf_arm_reloc_type (type);
252b5132
RH
1318 break;
1319
584da044 1320 case EM_ARC:
886a2506
NC
1321 case EM_ARC_COMPACT:
1322 case EM_ARC_COMPACT2:
9ea033b2 1323 rtype = elf_arc_reloc_type (type);
252b5132
RH
1324 break;
1325
1326 case EM_PARISC:
69e617ca 1327 rtype = elf_hppa_reloc_type (type);
252b5132 1328 break;
7d466069 1329
b8720f9d
JL
1330 case EM_H8_300:
1331 case EM_H8_300H:
1332 case EM_H8S:
1333 rtype = elf_h8_reloc_type (type);
1334 break;
1335
73589c9d
CS
1336 case EM_OR1K:
1337 rtype = elf_or1k_reloc_type (type);
3b16e843
NC
1338 break;
1339
7d466069 1340 case EM_PJ:
2b0337b0 1341 case EM_PJ_OLD:
7d466069
ILT
1342 rtype = elf_pj_reloc_type (type);
1343 break;
800eeca4
JW
1344 case EM_IA_64:
1345 rtype = elf_ia64_reloc_type (type);
1346 break;
1b61cf92
HPN
1347
1348 case EM_CRIS:
1349 rtype = elf_cris_reloc_type (type);
1350 break;
535c37ff
JE
1351
1352 case EM_860:
1353 rtype = elf_i860_reloc_type (type);
1354 break;
bcedfee6
NC
1355
1356 case EM_X86_64:
8a9036a4 1357 case EM_L1OM:
7a9068fe 1358 case EM_K1OM:
bcedfee6
NC
1359 rtype = elf_x86_64_reloc_type (type);
1360 break;
a85d7ed0 1361
35b1837e
AM
1362 case EM_S370:
1363 rtype = i370_reloc_type (type);
1364 break;
1365
53c7db4b
KH
1366 case EM_S390_OLD:
1367 case EM_S390:
1368 rtype = elf_s390_reloc_type (type);
1369 break;
93fbbb04 1370
1c0d3aa6
NC
1371 case EM_SCORE:
1372 rtype = elf_score_reloc_type (type);
1373 break;
1374
93fbbb04
GK
1375 case EM_XSTORMY16:
1376 rtype = elf_xstormy16_reloc_type (type);
1377 break;
179d3252 1378
1fe1f39c
NC
1379 case EM_CRX:
1380 rtype = elf_crx_reloc_type (type);
1381 break;
1382
179d3252
JT
1383 case EM_VAX:
1384 rtype = elf_vax_reloc_type (type);
1385 break;
1e4cf259 1386
619ed720
EB
1387 case EM_VISIUM:
1388 rtype = elf_visium_reloc_type (type);
1389 break;
1390
cfb8c092
NC
1391 case EM_ADAPTEVA_EPIPHANY:
1392 rtype = elf_epiphany_reloc_type (type);
1393 break;
1394
1e4cf259
NC
1395 case EM_IP2K:
1396 case EM_IP2K_OLD:
1397 rtype = elf_ip2k_reloc_type (type);
1398 break;
3b36097d
SC
1399
1400 case EM_IQ2000:
1401 rtype = elf_iq2000_reloc_type (type);
1402 break;
88da6820
NC
1403
1404 case EM_XTENSA_OLD:
1405 case EM_XTENSA:
1406 rtype = elf_xtensa_reloc_type (type);
1407 break;
a34e3ecb 1408
84e94c90
NC
1409 case EM_LATTICEMICO32:
1410 rtype = elf_lm32_reloc_type (type);
1411 break;
1412
ff7eeb89 1413 case EM_M32C_OLD:
49f58d10
JB
1414 case EM_M32C:
1415 rtype = elf_m32c_reloc_type (type);
1416 break;
1417
d031aafb
NS
1418 case EM_MT:
1419 rtype = elf_mt_reloc_type (type);
a34e3ecb 1420 break;
1d65ded4
CM
1421
1422 case EM_BLACKFIN:
1423 rtype = elf_bfin_reloc_type (type);
1424 break;
15ab5209
DB
1425
1426 case EM_CYGNUS_MEP:
1427 rtype = elf_mep_reloc_type (type);
1428 break;
60bca95a
NC
1429
1430 case EM_CR16:
1431 rtype = elf_cr16_reloc_type (type);
1432 break;
dd24e3da 1433
7ba29e2a
NC
1434 case EM_MICROBLAZE:
1435 case EM_MICROBLAZE_OLD:
1436 rtype = elf_microblaze_reloc_type (type);
1437 break;
c7927a3c 1438
99c513f6
DD
1439 case EM_RL78:
1440 rtype = elf_rl78_reloc_type (type);
1441 break;
1442
c7927a3c
NC
1443 case EM_RX:
1444 rtype = elf_rx_reloc_type (type);
1445 break;
c29aca4a 1446
a3c62988
NC
1447 case EM_METAG:
1448 rtype = elf_metag_reloc_type (type);
1449 break;
1450
c29aca4a
NC
1451 case EM_XC16X:
1452 case EM_C166:
1453 rtype = elf_xc16x_reloc_type (type);
1454 break;
40b36596
JM
1455
1456 case EM_TI_C6000:
1457 rtype = elf_tic6x_reloc_type (type);
1458 break;
aa137e4d
NC
1459
1460 case EM_TILEGX:
1461 rtype = elf_tilegx_reloc_type (type);
1462 break;
1463
1464 case EM_TILEPRO:
1465 rtype = elf_tilepro_reloc_type (type);
1466 break;
f6c1a2d5
NC
1467
1468 case EM_XGATE:
1469 rtype = elf_xgate_reloc_type (type);
1470 break;
36591ba1
SL
1471
1472 case EM_ALTERA_NIOS2:
1473 rtype = elf_nios2_reloc_type (type);
1474 break;
252b5132
RH
1475 }
1476
1477 if (rtype == NULL)
39dbeff8 1478 printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
252b5132 1479 else
8beeaeb7 1480 printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
252b5132 1481
7ace3541 1482 if (elf_header.e_machine == EM_ALPHA
157c2599 1483 && rtype != NULL
7ace3541
RH
1484 && streq (rtype, "R_ALPHA_LITUSE")
1485 && is_rela)
1486 {
1487 switch (rels[i].r_addend)
1488 {
1489 case LITUSE_ALPHA_ADDR: rtype = "ADDR"; break;
1490 case LITUSE_ALPHA_BASE: rtype = "BASE"; break;
1491 case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1492 case LITUSE_ALPHA_JSR: rtype = "JSR"; break;
1493 case LITUSE_ALPHA_TLSGD: rtype = "TLSGD"; break;
1494 case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1495 case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1496 default: rtype = NULL;
1497 }
1498 if (rtype)
1499 printf (" (%s)", rtype);
1500 else
1501 {
1502 putchar (' ');
1503 printf (_("<unknown addend: %lx>"),
1504 (unsigned long) rels[i].r_addend);
1505 }
1506 }
1507 else if (symtab_index)
252b5132 1508 {
af3fc3bc 1509 if (symtab == NULL || symtab_index >= nsyms)
2b692964 1510 printf (_(" bad symbol index: %08lx"), (unsigned long) symtab_index);
af3fc3bc 1511 else
19936277 1512 {
2cf0635d 1513 Elf_Internal_Sym * psym;
bb4d2ac2
L
1514 const char * version_string;
1515 enum versioned_symbol_info sym_info;
1516 unsigned short vna_other;
19936277 1517
af3fc3bc 1518 psym = symtab + symtab_index;
103f02d3 1519
bb4d2ac2
L
1520 version_string
1521 = get_symbol_version_string (file, is_dynsym,
1522 strtab, strtablen,
1523 symtab_index,
1524 psym,
1525 &sym_info,
1526 &vna_other);
1527
af3fc3bc 1528 printf (" ");
171191ba 1529
d8045f23
NC
1530 if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1531 {
1532 const char * name;
1533 unsigned int len;
1534 unsigned int width = is_32bit_elf ? 8 : 14;
1535
1536 /* Relocations against GNU_IFUNC symbols do not use the value
1537 of the symbol as the address to relocate against. Instead
1538 they invoke the function named by the symbol and use its
1539 result as the address for relocation.
1540
1541 To indicate this to the user, do not display the value of
1542 the symbol in the "Symbols's Value" field. Instead show
1543 its name followed by () as a hint that the symbol is
1544 invoked. */
1545
1546 if (strtab == NULL
1547 || psym->st_name == 0
1548 || psym->st_name >= strtablen)
1549 name = "??";
1550 else
1551 name = strtab + psym->st_name;
1552
1553 len = print_symbol (width, name);
bb4d2ac2
L
1554 if (version_string)
1555 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1556 version_string);
d8045f23
NC
1557 printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1558 }
1559 else
1560 {
1561 print_vma (psym->st_value, LONG_HEX);
171191ba 1562
d8045f23
NC
1563 printf (is_32bit_elf ? " " : " ");
1564 }
103f02d3 1565
af3fc3bc 1566 if (psym->st_name == 0)
f1ef08cb 1567 {
2cf0635d 1568 const char * sec_name = "<null>";
f1ef08cb
AM
1569 char name_buf[40];
1570
1571 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1572 {
4fbb74a6 1573 if (psym->st_shndx < elf_header.e_shnum)
74e1a04b 1574 sec_name = SECTION_NAME (section_headers + psym->st_shndx);
f1ef08cb
AM
1575 else if (psym->st_shndx == SHN_ABS)
1576 sec_name = "ABS";
1577 else if (psym->st_shndx == SHN_COMMON)
1578 sec_name = "COMMON";
ac145307
BS
1579 else if ((elf_header.e_machine == EM_MIPS
1580 && psym->st_shndx == SHN_MIPS_SCOMMON)
1581 || (elf_header.e_machine == EM_TI_C6000
1582 && psym->st_shndx == SHN_TIC6X_SCOMMON))
172553c7
TS
1583 sec_name = "SCOMMON";
1584 else if (elf_header.e_machine == EM_MIPS
1585 && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1586 sec_name = "SUNDEF";
8a9036a4 1587 else if ((elf_header.e_machine == EM_X86_64
7a9068fe
L
1588 || elf_header.e_machine == EM_L1OM
1589 || elf_header.e_machine == EM_K1OM)
3b22753a
L
1590 && psym->st_shndx == SHN_X86_64_LCOMMON)
1591 sec_name = "LARGE_COMMON";
9ce701e2
L
1592 else if (elf_header.e_machine == EM_IA_64
1593 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1594 && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1595 sec_name = "ANSI_COM";
28f997cf 1596 else if (is_ia64_vms ()
148b93f2
NC
1597 && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1598 sec_name = "VMS_SYMVEC";
f1ef08cb
AM
1599 else
1600 {
1601 sprintf (name_buf, "<section 0x%x>",
1602 (unsigned int) psym->st_shndx);
1603 sec_name = name_buf;
1604 }
1605 }
1606 print_symbol (22, sec_name);
1607 }
af3fc3bc 1608 else if (strtab == NULL)
d79b3d50 1609 printf (_("<string table index: %3ld>"), psym->st_name);
c256ffe7 1610 else if (psym->st_name >= strtablen)
d79b3d50 1611 printf (_("<corrupt string table index: %3ld>"), psym->st_name);
af3fc3bc 1612 else
bb4d2ac2
L
1613 {
1614 print_symbol (22, strtab + psym->st_name);
1615 if (version_string)
1616 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1617 version_string);
1618 }
103f02d3 1619
af3fc3bc 1620 if (is_rela)
171191ba 1621 {
7360e63f 1622 bfd_vma off = rels[i].r_addend;
171191ba 1623
7360e63f 1624 if ((bfd_signed_vma) off < 0)
598aaa76 1625 printf (" - %" BFD_VMA_FMT "x", - off);
171191ba 1626 else
598aaa76 1627 printf (" + %" BFD_VMA_FMT "x", off);
171191ba 1628 }
19936277 1629 }
252b5132 1630 }
1b228002 1631 else if (is_rela)
f7a99963 1632 {
7360e63f 1633 bfd_vma off = rels[i].r_addend;
e04d7088
L
1634
1635 printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
7360e63f 1636 if ((bfd_signed_vma) off < 0)
e04d7088
L
1637 printf ("-%" BFD_VMA_FMT "x", - off);
1638 else
1639 printf ("%" BFD_VMA_FMT "x", off);
f7a99963 1640 }
252b5132 1641
157c2599
NC
1642 if (elf_header.e_machine == EM_SPARCV9
1643 && rtype != NULL
1644 && streq (rtype, "R_SPARC_OLO10"))
91d6fa6a 1645 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
351b4b40 1646
252b5132 1647 putchar ('\n');
2c71103e 1648
aca88567 1649#ifdef BFD64
53c7db4b 1650 if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
2c71103e 1651 {
91d6fa6a
NC
1652 bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1653 bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
2cf0635d
NC
1654 const char * rtype2 = elf_mips_reloc_type (type2);
1655 const char * rtype3 = elf_mips_reloc_type (type3);
aca88567 1656
2c71103e
NC
1657 printf (" Type2: ");
1658
1659 if (rtype2 == NULL)
39dbeff8
AM
1660 printf (_("unrecognized: %-7lx"),
1661 (unsigned long) type2 & 0xffffffff);
2c71103e
NC
1662 else
1663 printf ("%-17.17s", rtype2);
1664
18bd398b 1665 printf ("\n Type3: ");
2c71103e
NC
1666
1667 if (rtype3 == NULL)
39dbeff8
AM
1668 printf (_("unrecognized: %-7lx"),
1669 (unsigned long) type3 & 0xffffffff);
2c71103e
NC
1670 else
1671 printf ("%-17.17s", rtype3);
1672
53c7db4b 1673 putchar ('\n');
2c71103e 1674 }
aca88567 1675#endif /* BFD64 */
252b5132
RH
1676 }
1677
c8286bd1 1678 free (rels);
252b5132
RH
1679}
1680
1681static const char *
d3ba0551 1682get_mips_dynamic_type (unsigned long type)
252b5132
RH
1683{
1684 switch (type)
1685 {
1686 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1687 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1688 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1689 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1690 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1691 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1692 case DT_MIPS_MSYM: return "MIPS_MSYM";
1693 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1694 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1695 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1696 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1697 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1698 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1699 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1700 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1701 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1702 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
a5499fa4 1703 case DT_MIPS_RLD_MAP_REL: return "MIPS_RLD_MAP_REL";
252b5132
RH
1704 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1705 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1706 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1707 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1708 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1709 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1710 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1711 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1712 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1713 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1714 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1715 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1716 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1717 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1718 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1719 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1720 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1721 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1722 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1723 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1724 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1725 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1726 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1727 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1728 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1729 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
861fb55a
DJ
1730 case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1731 case DT_MIPS_RWPLT: return "MIPS_RWPLT";
252b5132
RH
1732 default:
1733 return NULL;
1734 }
1735}
1736
9a097730 1737static const char *
d3ba0551 1738get_sparc64_dynamic_type (unsigned long type)
9a097730
RH
1739{
1740 switch (type)
1741 {
1742 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1743 default:
1744 return NULL;
1745 }
103f02d3
UD
1746}
1747
7490d522
AM
1748static const char *
1749get_ppc_dynamic_type (unsigned long type)
1750{
1751 switch (type)
1752 {
a7f2871e 1753 case DT_PPC_GOT: return "PPC_GOT";
e8910a83 1754 case DT_PPC_OPT: return "PPC_OPT";
7490d522
AM
1755 default:
1756 return NULL;
1757 }
1758}
1759
f1cb7e17 1760static const char *
d3ba0551 1761get_ppc64_dynamic_type (unsigned long type)
f1cb7e17
AM
1762{
1763 switch (type)
1764 {
a7f2871e
AM
1765 case DT_PPC64_GLINK: return "PPC64_GLINK";
1766 case DT_PPC64_OPD: return "PPC64_OPD";
1767 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
e8910a83 1768 case DT_PPC64_OPT: return "PPC64_OPT";
f1cb7e17
AM
1769 default:
1770 return NULL;
1771 }
1772}
1773
103f02d3 1774static const char *
d3ba0551 1775get_parisc_dynamic_type (unsigned long type)
103f02d3
UD
1776{
1777 switch (type)
1778 {
1779 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1780 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1781 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1782 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1783 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1784 case DT_HP_PREINIT: return "HP_PREINIT";
1785 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1786 case DT_HP_NEEDED: return "HP_NEEDED";
1787 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1788 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1789 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1790 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1791 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
eec8f817
DA
1792 case DT_HP_EPLTREL: return "HP_GST_EPLTREL";
1793 case DT_HP_EPLTRELSZ: return "HP_GST_EPLTRELSZ";
1794 case DT_HP_FILTERED: return "HP_FILTERED";
1795 case DT_HP_FILTER_TLS: return "HP_FILTER_TLS";
1796 case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1797 case DT_HP_LAZYLOAD: return "HP_LAZYLOAD";
1798 case DT_HP_BIND_NOW_COUNT: return "HP_BIND_NOW_COUNT";
1799 case DT_PLT: return "PLT";
1800 case DT_PLT_SIZE: return "PLT_SIZE";
1801 case DT_DLT: return "DLT";
1802 case DT_DLT_SIZE: return "DLT_SIZE";
103f02d3
UD
1803 default:
1804 return NULL;
1805 }
1806}
9a097730 1807
ecc51f48 1808static const char *
d3ba0551 1809get_ia64_dynamic_type (unsigned long type)
ecc51f48
NC
1810{
1811 switch (type)
1812 {
148b93f2
NC
1813 case DT_IA_64_PLT_RESERVE: return "IA_64_PLT_RESERVE";
1814 case DT_IA_64_VMS_SUBTYPE: return "VMS_SUBTYPE";
1815 case DT_IA_64_VMS_IMGIOCNT: return "VMS_IMGIOCNT";
1816 case DT_IA_64_VMS_LNKFLAGS: return "VMS_LNKFLAGS";
1817 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1818 case DT_IA_64_VMS_IDENT: return "VMS_IDENT";
1819 case DT_IA_64_VMS_NEEDED_IDENT: return "VMS_NEEDED_IDENT";
1820 case DT_IA_64_VMS_IMG_RELA_CNT: return "VMS_IMG_RELA_CNT";
1821 case DT_IA_64_VMS_SEG_RELA_CNT: return "VMS_SEG_RELA_CNT";
1822 case DT_IA_64_VMS_FIXUP_RELA_CNT: return "VMS_FIXUP_RELA_CNT";
1823 case DT_IA_64_VMS_FIXUP_NEEDED: return "VMS_FIXUP_NEEDED";
1824 case DT_IA_64_VMS_SYMVEC_CNT: return "VMS_SYMVEC_CNT";
1825 case DT_IA_64_VMS_XLATED: return "VMS_XLATED";
1826 case DT_IA_64_VMS_STACKSIZE: return "VMS_STACKSIZE";
1827 case DT_IA_64_VMS_UNWINDSZ: return "VMS_UNWINDSZ";
1828 case DT_IA_64_VMS_UNWIND_CODSEG: return "VMS_UNWIND_CODSEG";
1829 case DT_IA_64_VMS_UNWIND_INFOSEG: return "VMS_UNWIND_INFOSEG";
1830 case DT_IA_64_VMS_LINKTIME: return "VMS_LINKTIME";
1831 case DT_IA_64_VMS_SEG_NO: return "VMS_SEG_NO";
1832 case DT_IA_64_VMS_SYMVEC_OFFSET: return "VMS_SYMVEC_OFFSET";
1833 case DT_IA_64_VMS_SYMVEC_SEG: return "VMS_SYMVEC_SEG";
1834 case DT_IA_64_VMS_UNWIND_OFFSET: return "VMS_UNWIND_OFFSET";
1835 case DT_IA_64_VMS_UNWIND_SEG: return "VMS_UNWIND_SEG";
1836 case DT_IA_64_VMS_STRTAB_OFFSET: return "VMS_STRTAB_OFFSET";
1837 case DT_IA_64_VMS_SYSVER_OFFSET: return "VMS_SYSVER_OFFSET";
1838 case DT_IA_64_VMS_IMG_RELA_OFF: return "VMS_IMG_RELA_OFF";
1839 case DT_IA_64_VMS_SEG_RELA_OFF: return "VMS_SEG_RELA_OFF";
1840 case DT_IA_64_VMS_FIXUP_RELA_OFF: return "VMS_FIXUP_RELA_OFF";
1841 case DT_IA_64_VMS_PLTGOT_OFFSET: return "VMS_PLTGOT_OFFSET";
1842 case DT_IA_64_VMS_PLTGOT_SEG: return "VMS_PLTGOT_SEG";
1843 case DT_IA_64_VMS_FPMODE: return "VMS_FPMODE";
ecc51f48
NC
1844 default:
1845 return NULL;
1846 }
1847}
1848
fabcb361
RH
1849static const char *
1850get_alpha_dynamic_type (unsigned long type)
1851{
1852 switch (type)
1853 {
1854 case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1855 default:
1856 return NULL;
1857 }
1858}
1859
1c0d3aa6
NC
1860static const char *
1861get_score_dynamic_type (unsigned long type)
1862{
1863 switch (type)
1864 {
1865 case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1866 case DT_SCORE_LOCAL_GOTNO: return "SCORE_LOCAL_GOTNO";
1867 case DT_SCORE_SYMTABNO: return "SCORE_SYMTABNO";
1868 case DT_SCORE_GOTSYM: return "SCORE_GOTSYM";
1869 case DT_SCORE_UNREFEXTNO: return "SCORE_UNREFEXTNO";
1870 case DT_SCORE_HIPAGENO: return "SCORE_HIPAGENO";
1871 default:
1872 return NULL;
1873 }
1874}
1875
40b36596
JM
1876static const char *
1877get_tic6x_dynamic_type (unsigned long type)
1878{
1879 switch (type)
1880 {
1881 case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1882 case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1883 case DT_C6000_DSBT_BASE: return "C6000_DSBT_BASE";
1884 case DT_C6000_DSBT_SIZE: return "C6000_DSBT_SIZE";
1885 case DT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
1886 case DT_C6000_DSBT_INDEX: return "C6000_DSBT_INDEX";
1887 default:
1888 return NULL;
1889 }
1890}
1c0d3aa6 1891
36591ba1
SL
1892static const char *
1893get_nios2_dynamic_type (unsigned long type)
1894{
1895 switch (type)
1896 {
1897 case DT_NIOS2_GP: return "NIOS2_GP";
1898 default:
1899 return NULL;
1900 }
1901}
1902
252b5132 1903static const char *
d3ba0551 1904get_dynamic_type (unsigned long type)
252b5132 1905{
e9e44622 1906 static char buff[64];
252b5132
RH
1907
1908 switch (type)
1909 {
1910 case DT_NULL: return "NULL";
1911 case DT_NEEDED: return "NEEDED";
1912 case DT_PLTRELSZ: return "PLTRELSZ";
1913 case DT_PLTGOT: return "PLTGOT";
1914 case DT_HASH: return "HASH";
1915 case DT_STRTAB: return "STRTAB";
1916 case DT_SYMTAB: return "SYMTAB";
1917 case DT_RELA: return "RELA";
1918 case DT_RELASZ: return "RELASZ";
1919 case DT_RELAENT: return "RELAENT";
1920 case DT_STRSZ: return "STRSZ";
1921 case DT_SYMENT: return "SYMENT";
1922 case DT_INIT: return "INIT";
1923 case DT_FINI: return "FINI";
1924 case DT_SONAME: return "SONAME";
1925 case DT_RPATH: return "RPATH";
1926 case DT_SYMBOLIC: return "SYMBOLIC";
1927 case DT_REL: return "REL";
1928 case DT_RELSZ: return "RELSZ";
1929 case DT_RELENT: return "RELENT";
1930 case DT_PLTREL: return "PLTREL";
1931 case DT_DEBUG: return "DEBUG";
1932 case DT_TEXTREL: return "TEXTREL";
1933 case DT_JMPREL: return "JMPREL";
1934 case DT_BIND_NOW: return "BIND_NOW";
1935 case DT_INIT_ARRAY: return "INIT_ARRAY";
1936 case DT_FINI_ARRAY: return "FINI_ARRAY";
1937 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1938 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
d1133906
NC
1939 case DT_RUNPATH: return "RUNPATH";
1940 case DT_FLAGS: return "FLAGS";
2d0e6f43 1941
d1133906
NC
1942 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1943 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
103f02d3 1944
05107a46 1945 case DT_CHECKSUM: return "CHECKSUM";
252b5132
RH
1946 case DT_PLTPADSZ: return "PLTPADSZ";
1947 case DT_MOVEENT: return "MOVEENT";
1948 case DT_MOVESZ: return "MOVESZ";
dcefbbbd 1949 case DT_FEATURE: return "FEATURE";
252b5132
RH
1950 case DT_POSFLAG_1: return "POSFLAG_1";
1951 case DT_SYMINSZ: return "SYMINSZ";
1952 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
103f02d3 1953
252b5132 1954 case DT_ADDRRNGLO: return "ADDRRNGLO";
dcefbbbd
L
1955 case DT_CONFIG: return "CONFIG";
1956 case DT_DEPAUDIT: return "DEPAUDIT";
1957 case DT_AUDIT: return "AUDIT";
1958 case DT_PLTPAD: return "PLTPAD";
1959 case DT_MOVETAB: return "MOVETAB";
252b5132 1960 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
103f02d3 1961
252b5132 1962 case DT_VERSYM: return "VERSYM";
103f02d3 1963
67a4f2b7
AO
1964 case DT_TLSDESC_GOT: return "TLSDESC_GOT";
1965 case DT_TLSDESC_PLT: return "TLSDESC_PLT";
252b5132
RH
1966 case DT_RELACOUNT: return "RELACOUNT";
1967 case DT_RELCOUNT: return "RELCOUNT";
1968 case DT_FLAGS_1: return "FLAGS_1";
1969 case DT_VERDEF: return "VERDEF";
1970 case DT_VERDEFNUM: return "VERDEFNUM";
1971 case DT_VERNEED: return "VERNEED";
1972 case DT_VERNEEDNUM: return "VERNEEDNUM";
103f02d3 1973
019148e4 1974 case DT_AUXILIARY: return "AUXILIARY";
252b5132
RH
1975 case DT_USED: return "USED";
1976 case DT_FILTER: return "FILTER";
103f02d3 1977
047b2264
JJ
1978 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
1979 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
1980 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
1981 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
1982 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
fdc90cb4 1983 case DT_GNU_HASH: return "GNU_HASH";
047b2264 1984
252b5132
RH
1985 default:
1986 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1987 {
2cf0635d 1988 const char * result;
103f02d3 1989
252b5132
RH
1990 switch (elf_header.e_machine)
1991 {
1992 case EM_MIPS:
4fe85591 1993 case EM_MIPS_RS3_LE:
252b5132
RH
1994 result = get_mips_dynamic_type (type);
1995 break;
9a097730
RH
1996 case EM_SPARCV9:
1997 result = get_sparc64_dynamic_type (type);
1998 break;
7490d522
AM
1999 case EM_PPC:
2000 result = get_ppc_dynamic_type (type);
2001 break;
f1cb7e17
AM
2002 case EM_PPC64:
2003 result = get_ppc64_dynamic_type (type);
2004 break;
ecc51f48
NC
2005 case EM_IA_64:
2006 result = get_ia64_dynamic_type (type);
2007 break;
fabcb361
RH
2008 case EM_ALPHA:
2009 result = get_alpha_dynamic_type (type);
2010 break;
1c0d3aa6
NC
2011 case EM_SCORE:
2012 result = get_score_dynamic_type (type);
2013 break;
40b36596
JM
2014 case EM_TI_C6000:
2015 result = get_tic6x_dynamic_type (type);
2016 break;
36591ba1
SL
2017 case EM_ALTERA_NIOS2:
2018 result = get_nios2_dynamic_type (type);
2019 break;
252b5132
RH
2020 default:
2021 result = NULL;
2022 break;
2023 }
2024
2025 if (result != NULL)
2026 return result;
2027
e9e44622 2028 snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
252b5132 2029 }
eec8f817
DA
2030 else if (((type >= DT_LOOS) && (type <= DT_HIOS))
2031 || (elf_header.e_machine == EM_PARISC
2032 && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
103f02d3 2033 {
2cf0635d 2034 const char * result;
103f02d3
UD
2035
2036 switch (elf_header.e_machine)
2037 {
2038 case EM_PARISC:
2039 result = get_parisc_dynamic_type (type);
2040 break;
148b93f2
NC
2041 case EM_IA_64:
2042 result = get_ia64_dynamic_type (type);
2043 break;
103f02d3
UD
2044 default:
2045 result = NULL;
2046 break;
2047 }
2048
2049 if (result != NULL)
2050 return result;
2051
e9e44622
JJ
2052 snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2053 type);
103f02d3 2054 }
252b5132 2055 else
e9e44622 2056 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
103f02d3 2057
252b5132
RH
2058 return buff;
2059 }
2060}
2061
2062static char *
d3ba0551 2063get_file_type (unsigned e_type)
252b5132 2064{
b34976b6 2065 static char buff[32];
252b5132
RH
2066
2067 switch (e_type)
2068 {
2069 case ET_NONE: return _("NONE (None)");
2070 case ET_REL: return _("REL (Relocatable file)");
ba2685cc
AM
2071 case ET_EXEC: return _("EXEC (Executable file)");
2072 case ET_DYN: return _("DYN (Shared object file)");
2073 case ET_CORE: return _("CORE (Core file)");
252b5132
RH
2074
2075 default:
2076 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
e9e44622 2077 snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
252b5132 2078 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
e9e44622 2079 snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
252b5132 2080 else
e9e44622 2081 snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
252b5132
RH
2082 return buff;
2083 }
2084}
2085
2086static char *
d3ba0551 2087get_machine_name (unsigned e_machine)
252b5132 2088{
b34976b6 2089 static char buff[64]; /* XXX */
252b5132
RH
2090
2091 switch (e_machine)
2092 {
c45021f2 2093 case EM_NONE: return _("None");
a06ea964 2094 case EM_AARCH64: return "AArch64";
c45021f2
NC
2095 case EM_M32: return "WE32100";
2096 case EM_SPARC: return "Sparc";
e9f53129 2097 case EM_SPU: return "SPU";
c45021f2
NC
2098 case EM_386: return "Intel 80386";
2099 case EM_68K: return "MC68000";
2100 case EM_88K: return "MC88000";
22abe556 2101 case EM_IAMCU: return "Intel MCU";
c45021f2
NC
2102 case EM_860: return "Intel 80860";
2103 case EM_MIPS: return "MIPS R3000";
2104 case EM_S370: return "IBM System/370";
7036c0e1 2105 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
252b5132 2106 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
c45021f2 2107 case EM_PARISC: return "HPPA";
252b5132 2108 case EM_PPC_OLD: return "Power PC (old)";
7036c0e1 2109 case EM_SPARC32PLUS: return "Sparc v8+" ;
c45021f2
NC
2110 case EM_960: return "Intel 90860";
2111 case EM_PPC: return "PowerPC";
285d1771 2112 case EM_PPC64: return "PowerPC64";
c45021f2 2113 case EM_FR20: return "Fujitsu FR20";
3f8107ab 2114 case EM_FT32: return "FTDI FT32";
c45021f2 2115 case EM_RH32: return "TRW RH32";
b34976b6 2116 case EM_MCORE: return "MCORE";
7036c0e1
AJ
2117 case EM_ARM: return "ARM";
2118 case EM_OLD_ALPHA: return "Digital Alpha (old)";
ef230218 2119 case EM_SH: return "Renesas / SuperH SH";
c45021f2
NC
2120 case EM_SPARCV9: return "Sparc v9";
2121 case EM_TRICORE: return "Siemens Tricore";
584da044 2122 case EM_ARC: return "ARC";
886a2506
NC
2123 case EM_ARC_COMPACT: return "ARCompact";
2124 case EM_ARC_COMPACT2: return "ARCv2";
c2dcd04e
NC
2125 case EM_H8_300: return "Renesas H8/300";
2126 case EM_H8_300H: return "Renesas H8/300H";
2127 case EM_H8S: return "Renesas H8S";
2128 case EM_H8_500: return "Renesas H8/500";
30800947 2129 case EM_IA_64: return "Intel IA-64";
252b5132
RH
2130 case EM_MIPS_X: return "Stanford MIPS-X";
2131 case EM_COLDFIRE: return "Motorola Coldfire";
c45021f2 2132 case EM_ALPHA: return "Alpha";
2b0337b0
AO
2133 case EM_CYGNUS_D10V:
2134 case EM_D10V: return "d10v";
2135 case EM_CYGNUS_D30V:
b34976b6 2136 case EM_D30V: return "d30v";
2b0337b0 2137 case EM_CYGNUS_M32R:
26597c86 2138 case EM_M32R: return "Renesas M32R (formerly Mitsubishi M32r)";
2b0337b0 2139 case EM_CYGNUS_V850:
708e2187 2140 case EM_V800: return "Renesas V850 (using RH850 ABI)";
f6c1a2d5 2141 case EM_V850: return "Renesas V850";
2b0337b0
AO
2142 case EM_CYGNUS_MN10300:
2143 case EM_MN10300: return "mn10300";
2144 case EM_CYGNUS_MN10200:
2145 case EM_MN10200: return "mn10200";
5506d11a 2146 case EM_MOXIE: return "Moxie";
2b0337b0
AO
2147 case EM_CYGNUS_FR30:
2148 case EM_FR30: return "Fujitsu FR30";
b34976b6 2149 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
2b0337b0 2150 case EM_PJ_OLD:
b34976b6 2151 case EM_PJ: return "picoJava";
7036c0e1
AJ
2152 case EM_MMA: return "Fujitsu Multimedia Accelerator";
2153 case EM_PCP: return "Siemens PCP";
2154 case EM_NCPU: return "Sony nCPU embedded RISC processor";
2155 case EM_NDR1: return "Denso NDR1 microprocesspr";
2156 case EM_STARCORE: return "Motorola Star*Core processor";
2157 case EM_ME16: return "Toyota ME16 processor";
2158 case EM_ST100: return "STMicroelectronics ST100 processor";
2159 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
11636f9e
JM
2160 case EM_PDSP: return "Sony DSP processor";
2161 case EM_PDP10: return "Digital Equipment Corp. PDP-10";
2162 case EM_PDP11: return "Digital Equipment Corp. PDP-11";
7036c0e1
AJ
2163 case EM_FX66: return "Siemens FX66 microcontroller";
2164 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2165 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
2166 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
6927f982 2167 case EM_68HC12: return "Motorola MC68HC12 Microcontroller";
7036c0e1
AJ
2168 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
2169 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
2170 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
2171 case EM_SVX: return "Silicon Graphics SVx";
2172 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
2173 case EM_VAX: return "Digital VAX";
619ed720 2174 case EM_VISIUM: return "CDS VISIUMcore processor";
2b0337b0 2175 case EM_AVR_OLD:
b34976b6 2176 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
1b61cf92 2177 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
c45021f2
NC
2178 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
2179 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
2180 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
b34976b6 2181 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
c45021f2 2182 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
3b36097d 2183 case EM_PRISM: return "Vitesse Prism";
bcedfee6 2184 case EM_X86_64: return "Advanced Micro Devices X86-64";
8a9036a4 2185 case EM_L1OM: return "Intel L1OM";
7a9068fe 2186 case EM_K1OM: return "Intel K1OM";
b7498e0e 2187 case EM_S390_OLD:
b34976b6 2188 case EM_S390: return "IBM S/390";
1c0d3aa6 2189 case EM_SCORE: return "SUNPLUS S+Core";
61865e30 2190 case EM_XSTORMY16: return "Sanyo XStormy16 CPU core";
73589c9d 2191 case EM_OR1K: return "OpenRISC 1000";
1fe1f39c 2192 case EM_CRX: return "National Semiconductor CRX microprocessor";
cfb8c092 2193 case EM_ADAPTEVA_EPIPHANY: return "Adapteva EPIPHANY";
d172d4ba 2194 case EM_DLX: return "OpenDLX";
1e4cf259 2195 case EM_IP2K_OLD:
b34976b6 2196 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
3b36097d 2197 case EM_IQ2000: return "Vitesse IQ2000";
88da6820
NC
2198 case EM_XTENSA_OLD:
2199 case EM_XTENSA: return "Tensilica Xtensa Processor";
11636f9e
JM
2200 case EM_VIDEOCORE: return "Alphamosaic VideoCore processor";
2201 case EM_TMM_GPP: return "Thompson Multimedia General Purpose Processor";
2202 case EM_NS32K: return "National Semiconductor 32000 series";
2203 case EM_TPC: return "Tenor Network TPC processor";
2204 case EM_ST200: return "STMicroelectronics ST200 microcontroller";
2205 case EM_MAX: return "MAX Processor";
2206 case EM_CR: return "National Semiconductor CompactRISC";
2207 case EM_F2MC16: return "Fujitsu F2MC16";
2208 case EM_MSP430: return "Texas Instruments msp430 microcontroller";
84e94c90 2209 case EM_LATTICEMICO32: return "Lattice Mico32";
ff7eeb89 2210 case EM_M32C_OLD:
49f58d10 2211 case EM_M32C: return "Renesas M32c";
d031aafb 2212 case EM_MT: return "Morpho Techologies MT processor";
7bbe5bc5 2213 case EM_BLACKFIN: return "Analog Devices Blackfin";
11636f9e
JM
2214 case EM_SE_C33: return "S1C33 Family of Seiko Epson processors";
2215 case EM_SEP: return "Sharp embedded microprocessor";
2216 case EM_ARCA: return "Arca RISC microprocessor";
2217 case EM_UNICORE: return "Unicore";
2218 case EM_EXCESS: return "eXcess 16/32/64-bit configurable embedded CPU";
2219 case EM_DXP: return "Icera Semiconductor Inc. Deep Execution Processor";
64fd6348
NC
2220 case EM_NIOS32: return "Altera Nios";
2221 case EM_ALTERA_NIOS2: return "Altera Nios II";
c29aca4a 2222 case EM_C166:
d70c5fc7 2223 case EM_XC16X: return "Infineon Technologies xc16x";
11636f9e
JM
2224 case EM_M16C: return "Renesas M16C series microprocessors";
2225 case EM_DSPIC30F: return "Microchip Technology dsPIC30F Digital Signal Controller";
2226 case EM_CE: return "Freescale Communication Engine RISC core";
2227 case EM_TSK3000: return "Altium TSK3000 core";
2228 case EM_RS08: return "Freescale RS08 embedded processor";
2229 case EM_ECOG2: return "Cyan Technology eCOG2 microprocessor";
2230 case EM_DSP24: return "New Japan Radio (NJR) 24-bit DSP Processor";
2231 case EM_VIDEOCORE3: return "Broadcom VideoCore III processor";
2232 case EM_SE_C17: return "Seiko Epson C17 family";
2233 case EM_TI_C6000: return "Texas Instruments TMS320C6000 DSP family";
2234 case EM_TI_C2000: return "Texas Instruments TMS320C2000 DSP family";
2235 case EM_TI_C5500: return "Texas Instruments TMS320C55x DSP family";
2236 case EM_MMDSP_PLUS: return "STMicroelectronics 64bit VLIW Data Signal Processor";
2237 case EM_CYPRESS_M8C: return "Cypress M8C microprocessor";
2238 case EM_R32C: return "Renesas R32C series microprocessors";
2239 case EM_TRIMEDIA: return "NXP Semiconductors TriMedia architecture family";
2240 case EM_QDSP6: return "QUALCOMM DSP6 Processor";
2241 case EM_8051: return "Intel 8051 and variants";
2242 case EM_STXP7X: return "STMicroelectronics STxP7x family";
2243 case EM_NDS32: return "Andes Technology compact code size embedded RISC processor family";
2244 case EM_ECOG1X: return "Cyan Technology eCOG1X family";
2245 case EM_MAXQ30: return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2246 case EM_XIMO16: return "New Japan Radio (NJR) 16-bit DSP Processor";
2247 case EM_MANIK: return "M2000 Reconfigurable RISC Microprocessor";
2248 case EM_CRAYNV2: return "Cray Inc. NV2 vector architecture";
15ab5209 2249 case EM_CYGNUS_MEP: return "Toshiba MeP Media Engine";
cb8f3167 2250 case EM_CR16:
f6c1a2d5 2251 case EM_MICROBLAZE:
7ba29e2a 2252 case EM_MICROBLAZE_OLD: return "Xilinx MicroBlaze";
99c513f6 2253 case EM_RL78: return "Renesas RL78";
c7927a3c 2254 case EM_RX: return "Renesas RX";
a3c62988 2255 case EM_METAG: return "Imagination Technologies Meta processor architecture";
11636f9e
JM
2256 case EM_MCST_ELBRUS: return "MCST Elbrus general purpose hardware architecture";
2257 case EM_ECOG16: return "Cyan Technology eCOG16 family";
2258 case EM_ETPU: return "Freescale Extended Time Processing Unit";
2259 case EM_SLE9X: return "Infineon Technologies SLE9X core";
2260 case EM_AVR32: return "Atmel Corporation 32-bit microprocessor family";
2261 case EM_STM8: return "STMicroeletronics STM8 8-bit microcontroller";
2262 case EM_TILE64: return "Tilera TILE64 multicore architecture family";
2263 case EM_TILEPRO: return "Tilera TILEPro multicore architecture family";
aa137e4d 2264 case EM_TILEGX: return "Tilera TILE-Gx multicore architecture family";
11636f9e 2265 case EM_CUDA: return "NVIDIA CUDA architecture";
f6c1a2d5 2266 case EM_XGATE: return "Motorola XGATE embedded processor";
252b5132 2267 default:
35d9dd2f 2268 snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
252b5132
RH
2269 return buff;
2270 }
2271}
2272
a9522a21
AB
2273static void
2274decode_ARC_machine_flags (unsigned e_flags, unsigned e_machine, char buf[])
2275{
2276 /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2. Some
2277 other compilers don't a specific architecture type in the e_flags, and
2278 instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
2279 architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
2280 architectures.
2281
2282 Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
2283 but also sets a specific architecture type in the e_flags field.
2284
2285 However, when decoding the flags we don't worry if we see an
2286 unexpected pairing, for example EM_ARC_COMPACT machine type, with
2287 ARCEM architecture type. */
2288
2289 switch (e_flags & EF_ARC_MACH_MSK)
2290 {
2291 /* We only expect these to occur for EM_ARC_COMPACT2. */
2292 case EF_ARC_CPU_ARCV2EM:
2293 strcat (buf, ", ARC EM");
2294 break;
2295 case EF_ARC_CPU_ARCV2HS:
2296 strcat (buf, ", ARC HS");
2297 break;
2298
2299 /* We only expect these to occur for EM_ARC_COMPACT. */
2300 case E_ARC_MACH_ARC600:
2301 strcat (buf, ", ARC600");
2302 break;
2303 case E_ARC_MACH_ARC601:
2304 strcat (buf, ", ARC601");
2305 break;
2306 case E_ARC_MACH_ARC700:
2307 strcat (buf, ", ARC700");
2308 break;
2309
2310 /* The only times we should end up here are (a) A corrupt ELF, (b) A
2311 new ELF with new architecture being read by an old version of
2312 readelf, or (c) An ELF built with non-GNU compiler that does not
2313 set the architecture in the e_flags. */
2314 default:
2315 if (e_machine == EM_ARC_COMPACT)
2316 strcat (buf, ", Unknown ARCompact");
2317 else
2318 strcat (buf, ", Unknown ARC");
2319 break;
2320 }
2321
2322 switch (e_flags & EF_ARC_OSABI_MSK)
2323 {
2324 case E_ARC_OSABI_ORIG:
2325 strcat (buf, ", (ABI:legacy)");
2326 break;
2327 case E_ARC_OSABI_V2:
2328 strcat (buf, ", (ABI:v2)");
2329 break;
2330 /* Only upstream 3.9+ kernels will support ARCv2 ISA. */
2331 case E_ARC_OSABI_V3:
2332 strcat (buf, ", v3 no-legacy-syscalls ABI");
2333 break;
2334 default:
2335 strcat (buf, ", unrecognised ARC OSABI flag");
2336 break;
2337 }
2338}
2339
f3485b74 2340static void
d3ba0551 2341decode_ARM_machine_flags (unsigned e_flags, char buf[])
f3485b74
NC
2342{
2343 unsigned eabi;
2344 int unknown = 0;
2345
2346 eabi = EF_ARM_EABI_VERSION (e_flags);
2347 e_flags &= ~ EF_ARM_EABIMASK;
2348
2349 /* Handle "generic" ARM flags. */
2350 if (e_flags & EF_ARM_RELEXEC)
2351 {
2352 strcat (buf, ", relocatable executable");
2353 e_flags &= ~ EF_ARM_RELEXEC;
2354 }
76da6bbe 2355
f3485b74
NC
2356 /* Now handle EABI specific flags. */
2357 switch (eabi)
2358 {
2359 default:
2c71103e 2360 strcat (buf, ", <unrecognized EABI>");
f3485b74
NC
2361 if (e_flags)
2362 unknown = 1;
2363 break;
2364
2365 case EF_ARM_EABI_VER1:
a5bcd848 2366 strcat (buf, ", Version1 EABI");
f3485b74
NC
2367 while (e_flags)
2368 {
2369 unsigned flag;
76da6bbe 2370
f3485b74
NC
2371 /* Process flags one bit at a time. */
2372 flag = e_flags & - e_flags;
2373 e_flags &= ~ flag;
76da6bbe 2374
f3485b74
NC
2375 switch (flag)
2376 {
a5bcd848 2377 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
f3485b74
NC
2378 strcat (buf, ", sorted symbol tables");
2379 break;
76da6bbe 2380
f3485b74
NC
2381 default:
2382 unknown = 1;
2383 break;
2384 }
2385 }
2386 break;
76da6bbe 2387
a5bcd848
PB
2388 case EF_ARM_EABI_VER2:
2389 strcat (buf, ", Version2 EABI");
2390 while (e_flags)
2391 {
2392 unsigned flag;
2393
2394 /* Process flags one bit at a time. */
2395 flag = e_flags & - e_flags;
2396 e_flags &= ~ flag;
2397
2398 switch (flag)
2399 {
2400 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2401 strcat (buf, ", sorted symbol tables");
2402 break;
2403
2404 case EF_ARM_DYNSYMSUSESEGIDX:
2405 strcat (buf, ", dynamic symbols use segment index");
2406 break;
2407
2408 case EF_ARM_MAPSYMSFIRST:
2409 strcat (buf, ", mapping symbols precede others");
2410 break;
2411
2412 default:
2413 unknown = 1;
2414 break;
2415 }
2416 }
2417 break;
2418
d507cf36
PB
2419 case EF_ARM_EABI_VER3:
2420 strcat (buf, ", Version3 EABI");
8cb51566
PB
2421 break;
2422
2423 case EF_ARM_EABI_VER4:
2424 strcat (buf, ", Version4 EABI");
3bfcb652
NC
2425 while (e_flags)
2426 {
2427 unsigned flag;
2428
2429 /* Process flags one bit at a time. */
2430 flag = e_flags & - e_flags;
2431 e_flags &= ~ flag;
2432
2433 switch (flag)
2434 {
2435 case EF_ARM_BE8:
2436 strcat (buf, ", BE8");
2437 break;
2438
2439 case EF_ARM_LE8:
2440 strcat (buf, ", LE8");
2441 break;
2442
2443 default:
2444 unknown = 1;
2445 break;
2446 }
2447 break;
2448 }
2449 break;
3a4a14e9
PB
2450
2451 case EF_ARM_EABI_VER5:
2452 strcat (buf, ", Version5 EABI");
d507cf36
PB
2453 while (e_flags)
2454 {
2455 unsigned flag;
2456
2457 /* Process flags one bit at a time. */
2458 flag = e_flags & - e_flags;
2459 e_flags &= ~ flag;
2460
2461 switch (flag)
2462 {
2463 case EF_ARM_BE8:
2464 strcat (buf, ", BE8");
2465 break;
2466
2467 case EF_ARM_LE8:
2468 strcat (buf, ", LE8");
2469 break;
2470
3bfcb652
NC
2471 case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT. */
2472 strcat (buf, ", soft-float ABI");
2473 break;
2474
2475 case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT. */
2476 strcat (buf, ", hard-float ABI");
2477 break;
2478
d507cf36
PB
2479 default:
2480 unknown = 1;
2481 break;
2482 }
2483 }
2484 break;
2485
f3485b74 2486 case EF_ARM_EABI_UNKNOWN:
a5bcd848 2487 strcat (buf, ", GNU EABI");
f3485b74
NC
2488 while (e_flags)
2489 {
2490 unsigned flag;
76da6bbe 2491
f3485b74
NC
2492 /* Process flags one bit at a time. */
2493 flag = e_flags & - e_flags;
2494 e_flags &= ~ flag;
76da6bbe 2495
f3485b74
NC
2496 switch (flag)
2497 {
a5bcd848 2498 case EF_ARM_INTERWORK:
f3485b74
NC
2499 strcat (buf, ", interworking enabled");
2500 break;
76da6bbe 2501
a5bcd848 2502 case EF_ARM_APCS_26:
f3485b74
NC
2503 strcat (buf, ", uses APCS/26");
2504 break;
76da6bbe 2505
a5bcd848 2506 case EF_ARM_APCS_FLOAT:
f3485b74
NC
2507 strcat (buf, ", uses APCS/float");
2508 break;
76da6bbe 2509
a5bcd848 2510 case EF_ARM_PIC:
f3485b74
NC
2511 strcat (buf, ", position independent");
2512 break;
76da6bbe 2513
a5bcd848 2514 case EF_ARM_ALIGN8:
f3485b74
NC
2515 strcat (buf, ", 8 bit structure alignment");
2516 break;
76da6bbe 2517
a5bcd848 2518 case EF_ARM_NEW_ABI:
f3485b74
NC
2519 strcat (buf, ", uses new ABI");
2520 break;
76da6bbe 2521
a5bcd848 2522 case EF_ARM_OLD_ABI:
f3485b74
NC
2523 strcat (buf, ", uses old ABI");
2524 break;
76da6bbe 2525
a5bcd848 2526 case EF_ARM_SOFT_FLOAT:
f3485b74
NC
2527 strcat (buf, ", software FP");
2528 break;
76da6bbe 2529
90e01f86
ILT
2530 case EF_ARM_VFP_FLOAT:
2531 strcat (buf, ", VFP");
2532 break;
2533
fde78edd
NC
2534 case EF_ARM_MAVERICK_FLOAT:
2535 strcat (buf, ", Maverick FP");
2536 break;
2537
f3485b74
NC
2538 default:
2539 unknown = 1;
2540 break;
2541 }
2542 }
2543 }
f3485b74
NC
2544
2545 if (unknown)
2b692964 2546 strcat (buf,_(", <unknown>"));
f3485b74
NC
2547}
2548
343433df
AB
2549static void
2550decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2551{
2552 --size; /* Leave space for null terminator. */
2553
2554 switch (e_flags & EF_AVR_MACH)
2555 {
2556 case E_AVR_MACH_AVR1:
2557 strncat (buf, ", avr:1", size);
2558 break;
2559 case E_AVR_MACH_AVR2:
2560 strncat (buf, ", avr:2", size);
2561 break;
2562 case E_AVR_MACH_AVR25:
2563 strncat (buf, ", avr:25", size);
2564 break;
2565 case E_AVR_MACH_AVR3:
2566 strncat (buf, ", avr:3", size);
2567 break;
2568 case E_AVR_MACH_AVR31:
2569 strncat (buf, ", avr:31", size);
2570 break;
2571 case E_AVR_MACH_AVR35:
2572 strncat (buf, ", avr:35", size);
2573 break;
2574 case E_AVR_MACH_AVR4:
2575 strncat (buf, ", avr:4", size);
2576 break;
2577 case E_AVR_MACH_AVR5:
2578 strncat (buf, ", avr:5", size);
2579 break;
2580 case E_AVR_MACH_AVR51:
2581 strncat (buf, ", avr:51", size);
2582 break;
2583 case E_AVR_MACH_AVR6:
2584 strncat (buf, ", avr:6", size);
2585 break;
2586 case E_AVR_MACH_AVRTINY:
2587 strncat (buf, ", avr:100", size);
2588 break;
2589 case E_AVR_MACH_XMEGA1:
2590 strncat (buf, ", avr:101", size);
2591 break;
2592 case E_AVR_MACH_XMEGA2:
2593 strncat (buf, ", avr:102", size);
2594 break;
2595 case E_AVR_MACH_XMEGA3:
2596 strncat (buf, ", avr:103", size);
2597 break;
2598 case E_AVR_MACH_XMEGA4:
2599 strncat (buf, ", avr:104", size);
2600 break;
2601 case E_AVR_MACH_XMEGA5:
2602 strncat (buf, ", avr:105", size);
2603 break;
2604 case E_AVR_MACH_XMEGA6:
2605 strncat (buf, ", avr:106", size);
2606 break;
2607 case E_AVR_MACH_XMEGA7:
2608 strncat (buf, ", avr:107", size);
2609 break;
2610 default:
2611 strncat (buf, ", avr:<unknown>", size);
2612 break;
2613 }
2614
2615 size -= strlen (buf);
2616 if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2617 strncat (buf, ", link-relax", size);
2618}
2619
35c08157
KLC
2620static void
2621decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2622{
2623 unsigned abi;
2624 unsigned arch;
2625 unsigned config;
2626 unsigned version;
2627 int has_fpu = 0;
2628 int r = 0;
2629
2630 static const char *ABI_STRINGS[] =
2631 {
2632 "ABI v0", /* use r5 as return register; only used in N1213HC */
2633 "ABI v1", /* use r0 as return register */
2634 "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2635 "ABI v2fp", /* for FPU */
40c7a7cb
KLC
2636 "AABI",
2637 "ABI2 FP+"
35c08157
KLC
2638 };
2639 static const char *VER_STRINGS[] =
2640 {
2641 "Andes ELF V1.3 or older",
2642 "Andes ELF V1.3.1",
2643 "Andes ELF V1.4"
2644 };
2645 static const char *ARCH_STRINGS[] =
2646 {
2647 "",
2648 "Andes Star v1.0",
2649 "Andes Star v2.0",
2650 "Andes Star v3.0",
2651 "Andes Star v3.0m"
2652 };
2653
2654 abi = EF_NDS_ABI & e_flags;
2655 arch = EF_NDS_ARCH & e_flags;
2656 config = EF_NDS_INST & e_flags;
2657 version = EF_NDS32_ELF_VERSION & e_flags;
2658
2659 memset (buf, 0, size);
2660
2661 switch (abi)
2662 {
2663 case E_NDS_ABI_V0:
2664 case E_NDS_ABI_V1:
2665 case E_NDS_ABI_V2:
2666 case E_NDS_ABI_V2FP:
2667 case E_NDS_ABI_AABI:
40c7a7cb 2668 case E_NDS_ABI_V2FP_PLUS:
35c08157
KLC
2669 /* In case there are holes in the array. */
2670 r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2671 break;
2672
2673 default:
2674 r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2675 break;
2676 }
2677
2678 switch (version)
2679 {
2680 case E_NDS32_ELF_VER_1_2:
2681 case E_NDS32_ELF_VER_1_3:
2682 case E_NDS32_ELF_VER_1_4:
2683 r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2684 break;
2685
2686 default:
2687 r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2688 break;
2689 }
2690
2691 if (E_NDS_ABI_V0 == abi)
2692 {
2693 /* OLD ABI; only used in N1213HC, has performance extension 1. */
2694 r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2695 if (arch == E_NDS_ARCH_STAR_V1_0)
2696 r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2697 return;
2698 }
2699
2700 switch (arch)
2701 {
2702 case E_NDS_ARCH_STAR_V1_0:
2703 case E_NDS_ARCH_STAR_V2_0:
2704 case E_NDS_ARCH_STAR_V3_0:
2705 case E_NDS_ARCH_STAR_V3_M:
2706 r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2707 break;
2708
2709 default:
2710 r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2711 /* ARCH version determines how the e_flags are interpreted.
2712 If it is unknown, we cannot proceed. */
2713 return;
2714 }
2715
2716 /* Newer ABI; Now handle architecture specific flags. */
2717 if (arch == E_NDS_ARCH_STAR_V1_0)
2718 {
2719 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2720 r += snprintf (buf + r, size -r, ", MFUSR_PC");
2721
2722 if (!(config & E_NDS32_HAS_NO_MAC_INST))
2723 r += snprintf (buf + r, size -r, ", MAC");
2724
2725 if (config & E_NDS32_HAS_DIV_INST)
2726 r += snprintf (buf + r, size -r, ", DIV");
2727
2728 if (config & E_NDS32_HAS_16BIT_INST)
2729 r += snprintf (buf + r, size -r, ", 16b");
2730 }
2731 else
2732 {
2733 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2734 {
2735 if (version <= E_NDS32_ELF_VER_1_3)
2736 r += snprintf (buf + r, size -r, ", [B8]");
2737 else
2738 r += snprintf (buf + r, size -r, ", EX9");
2739 }
2740
2741 if (config & E_NDS32_HAS_MAC_DX_INST)
2742 r += snprintf (buf + r, size -r, ", MAC_DX");
2743
2744 if (config & E_NDS32_HAS_DIV_DX_INST)
2745 r += snprintf (buf + r, size -r, ", DIV_DX");
2746
2747 if (config & E_NDS32_HAS_16BIT_INST)
2748 {
2749 if (version <= E_NDS32_ELF_VER_1_3)
2750 r += snprintf (buf + r, size -r, ", 16b");
2751 else
2752 r += snprintf (buf + r, size -r, ", IFC");
2753 }
2754 }
2755
2756 if (config & E_NDS32_HAS_EXT_INST)
2757 r += snprintf (buf + r, size -r, ", PERF1");
2758
2759 if (config & E_NDS32_HAS_EXT2_INST)
2760 r += snprintf (buf + r, size -r, ", PERF2");
2761
2762 if (config & E_NDS32_HAS_FPU_INST)
2763 {
2764 has_fpu = 1;
2765 r += snprintf (buf + r, size -r, ", FPU_SP");
2766 }
2767
2768 if (config & E_NDS32_HAS_FPU_DP_INST)
2769 {
2770 has_fpu = 1;
2771 r += snprintf (buf + r, size -r, ", FPU_DP");
2772 }
2773
2774 if (config & E_NDS32_HAS_FPU_MAC_INST)
2775 {
2776 has_fpu = 1;
2777 r += snprintf (buf + r, size -r, ", FPU_MAC");
2778 }
2779
2780 if (has_fpu)
2781 {
2782 switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
2783 {
2784 case E_NDS32_FPU_REG_8SP_4DP:
2785 r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
2786 break;
2787 case E_NDS32_FPU_REG_16SP_8DP:
2788 r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
2789 break;
2790 case E_NDS32_FPU_REG_32SP_16DP:
2791 r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
2792 break;
2793 case E_NDS32_FPU_REG_32SP_32DP:
2794 r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
2795 break;
2796 }
2797 }
2798
2799 if (config & E_NDS32_HAS_AUDIO_INST)
2800 r += snprintf (buf + r, size -r, ", AUDIO");
2801
2802 if (config & E_NDS32_HAS_STRING_INST)
2803 r += snprintf (buf + r, size -r, ", STR");
2804
2805 if (config & E_NDS32_HAS_REDUCED_REGS)
2806 r += snprintf (buf + r, size -r, ", 16REG");
2807
2808 if (config & E_NDS32_HAS_VIDEO_INST)
2809 {
2810 if (version <= E_NDS32_ELF_VER_1_3)
2811 r += snprintf (buf + r, size -r, ", VIDEO");
2812 else
2813 r += snprintf (buf + r, size -r, ", SATURATION");
2814 }
2815
2816 if (config & E_NDS32_HAS_ENCRIPT_INST)
2817 r += snprintf (buf + r, size -r, ", ENCRP");
2818
2819 if (config & E_NDS32_HAS_L2C_INST)
2820 r += snprintf (buf + r, size -r, ", L2C");
2821}
2822
252b5132 2823static char *
d3ba0551 2824get_machine_flags (unsigned e_flags, unsigned e_machine)
252b5132 2825{
b34976b6 2826 static char buf[1024];
252b5132
RH
2827
2828 buf[0] = '\0';
76da6bbe 2829
252b5132
RH
2830 if (e_flags)
2831 {
2832 switch (e_machine)
2833 {
2834 default:
2835 break;
2836
886a2506 2837 case EM_ARC_COMPACT2:
886a2506 2838 case EM_ARC_COMPACT:
a9522a21
AB
2839 decode_ARC_machine_flags (e_flags, e_machine, buf);
2840 break;
886a2506 2841
f3485b74
NC
2842 case EM_ARM:
2843 decode_ARM_machine_flags (e_flags, buf);
2844 break;
76da6bbe 2845
343433df
AB
2846 case EM_AVR:
2847 decode_AVR_machine_flags (e_flags, buf, sizeof buf);
2848 break;
2849
781303ce
MF
2850 case EM_BLACKFIN:
2851 if (e_flags & EF_BFIN_PIC)
2852 strcat (buf, ", PIC");
2853
2854 if (e_flags & EF_BFIN_FDPIC)
2855 strcat (buf, ", FDPIC");
2856
2857 if (e_flags & EF_BFIN_CODE_IN_L1)
2858 strcat (buf, ", code in L1");
2859
2860 if (e_flags & EF_BFIN_DATA_IN_L1)
2861 strcat (buf, ", data in L1");
2862
2863 break;
2864
ec2dfb42
AO
2865 case EM_CYGNUS_FRV:
2866 switch (e_flags & EF_FRV_CPU_MASK)
2867 {
2868 case EF_FRV_CPU_GENERIC:
2869 break;
2870
2871 default:
2872 strcat (buf, ", fr???");
2873 break;
57346661 2874
ec2dfb42
AO
2875 case EF_FRV_CPU_FR300:
2876 strcat (buf, ", fr300");
2877 break;
2878
2879 case EF_FRV_CPU_FR400:
2880 strcat (buf, ", fr400");
2881 break;
2882 case EF_FRV_CPU_FR405:
2883 strcat (buf, ", fr405");
2884 break;
2885
2886 case EF_FRV_CPU_FR450:
2887 strcat (buf, ", fr450");
2888 break;
2889
2890 case EF_FRV_CPU_FR500:
2891 strcat (buf, ", fr500");
2892 break;
2893 case EF_FRV_CPU_FR550:
2894 strcat (buf, ", fr550");
2895 break;
2896
2897 case EF_FRV_CPU_SIMPLE:
2898 strcat (buf, ", simple");
2899 break;
2900 case EF_FRV_CPU_TOMCAT:
2901 strcat (buf, ", tomcat");
2902 break;
2903 }
1c877e87 2904 break;
ec2dfb42 2905
53c7db4b 2906 case EM_68K:
425c6cb0 2907 if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
76f57f3a 2908 strcat (buf, ", m68000");
425c6cb0 2909 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
3bdcfdf4
KH
2910 strcat (buf, ", cpu32");
2911 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
2912 strcat (buf, ", fido_a");
425c6cb0 2913 else
266abb8f 2914 {
2cf0635d
NC
2915 char const * isa = _("unknown");
2916 char const * mac = _("unknown mac");
2917 char const * additional = NULL;
0112cd26 2918
c694fd50 2919 switch (e_flags & EF_M68K_CF_ISA_MASK)
266abb8f 2920 {
c694fd50 2921 case EF_M68K_CF_ISA_A_NODIV:
0b2e31dc
NS
2922 isa = "A";
2923 additional = ", nodiv";
2924 break;
c694fd50 2925 case EF_M68K_CF_ISA_A:
266abb8f
NS
2926 isa = "A";
2927 break;
c694fd50 2928 case EF_M68K_CF_ISA_A_PLUS:
266abb8f
NS
2929 isa = "A+";
2930 break;
c694fd50 2931 case EF_M68K_CF_ISA_B_NOUSP:
0b2e31dc
NS
2932 isa = "B";
2933 additional = ", nousp";
2934 break;
c694fd50 2935 case EF_M68K_CF_ISA_B:
266abb8f
NS
2936 isa = "B";
2937 break;
f608cd77
NS
2938 case EF_M68K_CF_ISA_C:
2939 isa = "C";
2940 break;
2941 case EF_M68K_CF_ISA_C_NODIV:
2942 isa = "C";
2943 additional = ", nodiv";
2944 break;
266abb8f
NS
2945 }
2946 strcat (buf, ", cf, isa ");
2947 strcat (buf, isa);
0b2e31dc
NS
2948 if (additional)
2949 strcat (buf, additional);
c694fd50 2950 if (e_flags & EF_M68K_CF_FLOAT)
0b2e31dc 2951 strcat (buf, ", float");
c694fd50 2952 switch (e_flags & EF_M68K_CF_MAC_MASK)
266abb8f
NS
2953 {
2954 case 0:
2955 mac = NULL;
2956 break;
c694fd50 2957 case EF_M68K_CF_MAC:
266abb8f
NS
2958 mac = "mac";
2959 break;
c694fd50 2960 case EF_M68K_CF_EMAC:
266abb8f
NS
2961 mac = "emac";
2962 break;
f608cd77
NS
2963 case EF_M68K_CF_EMAC_B:
2964 mac = "emac_b";
2965 break;
266abb8f
NS
2966 }
2967 if (mac)
2968 {
2969 strcat (buf, ", ");
2970 strcat (buf, mac);
2971 }
266abb8f 2972 }
53c7db4b 2973 break;
33c63f9d 2974
153a2776
NC
2975 case EM_CYGNUS_MEP:
2976 switch (e_flags & EF_MEP_CPU_MASK)
2977 {
2978 case EF_MEP_CPU_MEP: strcat (buf, ", generic MeP"); break;
2979 case EF_MEP_CPU_C2: strcat (buf, ", MeP C2"); break;
2980 case EF_MEP_CPU_C3: strcat (buf, ", MeP C3"); break;
2981 case EF_MEP_CPU_C4: strcat (buf, ", MeP C4"); break;
2982 case EF_MEP_CPU_C5: strcat (buf, ", MeP C5"); break;
2983 case EF_MEP_CPU_H1: strcat (buf, ", MeP H1"); break;
2984 default: strcat (buf, _(", <unknown MeP cpu type>")); break;
2985 }
2986
2987 switch (e_flags & EF_MEP_COP_MASK)
2988 {
2989 case EF_MEP_COP_NONE: break;
2990 case EF_MEP_COP_AVC: strcat (buf, ", AVC coprocessor"); break;
2991 case EF_MEP_COP_AVC2: strcat (buf, ", AVC2 coprocessor"); break;
2992 case EF_MEP_COP_FMAX: strcat (buf, ", FMAX coprocessor"); break;
2993 case EF_MEP_COP_IVC2: strcat (buf, ", IVC2 coprocessor"); break;
2994 default: strcat (buf, _("<unknown MeP copro type>")); break;
2995 }
2996
2997 if (e_flags & EF_MEP_LIBRARY)
2998 strcat (buf, ", Built for Library");
2999
3000 if (e_flags & EF_MEP_INDEX_MASK)
3001 sprintf (buf + strlen (buf), ", Configuration Index: %#x",
3002 e_flags & EF_MEP_INDEX_MASK);
3003
3004 if (e_flags & ~ EF_MEP_ALL_FLAGS)
3005 sprintf (buf + strlen (buf), _(", unknown flags bits: %#x"),
3006 e_flags & ~ EF_MEP_ALL_FLAGS);
3007 break;
3008
252b5132
RH
3009 case EM_PPC:
3010 if (e_flags & EF_PPC_EMB)
3011 strcat (buf, ", emb");
3012
3013 if (e_flags & EF_PPC_RELOCATABLE)
2b692964 3014 strcat (buf, _(", relocatable"));
252b5132
RH
3015
3016 if (e_flags & EF_PPC_RELOCATABLE_LIB)
2b692964 3017 strcat (buf, _(", relocatable-lib"));
252b5132
RH
3018 break;
3019
ee67d69a
AM
3020 case EM_PPC64:
3021 if (e_flags & EF_PPC64_ABI)
3022 {
3023 char abi[] = ", abiv0";
3024
3025 abi[6] += e_flags & EF_PPC64_ABI;
3026 strcat (buf, abi);
3027 }
3028 break;
3029
708e2187
NC
3030 case EM_V800:
3031 if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
3032 strcat (buf, ", RH850 ABI");
0b4362b0 3033
708e2187
NC
3034 if (e_flags & EF_V800_850E3)
3035 strcat (buf, ", V3 architecture");
3036
3037 if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
3038 strcat (buf, ", FPU not used");
3039
3040 if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
3041 strcat (buf, ", regmode: COMMON");
3042
3043 if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
3044 strcat (buf, ", r4 not used");
3045
3046 if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
3047 strcat (buf, ", r30 not used");
3048
3049 if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
3050 strcat (buf, ", r5 not used");
3051
3052 if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
3053 strcat (buf, ", r2 not used");
3054
3055 for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
3056 {
3057 switch (e_flags & - e_flags)
3058 {
3059 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
3060 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
708e2187
NC
3061 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
3062 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
708e2187
NC
3063 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
3064 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
3065 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
3066 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
3067 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
3068 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
3069 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
3070 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
3071 default: break;
3072 }
3073 }
3074 break;
3075
2b0337b0 3076 case EM_V850:
252b5132
RH
3077 case EM_CYGNUS_V850:
3078 switch (e_flags & EF_V850_ARCH)
3079 {
78c8d46c
NC
3080 case E_V850E3V5_ARCH:
3081 strcat (buf, ", v850e3v5");
3082 break;
1cd986c5
NC
3083 case E_V850E2V3_ARCH:
3084 strcat (buf, ", v850e2v3");
3085 break;
3086 case E_V850E2_ARCH:
3087 strcat (buf, ", v850e2");
3088 break;
3089 case E_V850E1_ARCH:
3090 strcat (buf, ", v850e1");
8ad30312 3091 break;
252b5132
RH
3092 case E_V850E_ARCH:
3093 strcat (buf, ", v850e");
3094 break;
252b5132
RH
3095 case E_V850_ARCH:
3096 strcat (buf, ", v850");
3097 break;
3098 default:
2b692964 3099 strcat (buf, _(", unknown v850 architecture variant"));
252b5132
RH
3100 break;
3101 }
3102 break;
3103
2b0337b0 3104 case EM_M32R:
252b5132
RH
3105 case EM_CYGNUS_M32R:
3106 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3107 strcat (buf, ", m32r");
252b5132
RH
3108 break;
3109
3110 case EM_MIPS:
4fe85591 3111 case EM_MIPS_RS3_LE:
252b5132
RH
3112 if (e_flags & EF_MIPS_NOREORDER)
3113 strcat (buf, ", noreorder");
3114
3115 if (e_flags & EF_MIPS_PIC)
3116 strcat (buf, ", pic");
3117
3118 if (e_flags & EF_MIPS_CPIC)
3119 strcat (buf, ", cpic");
3120
d1bdd336
TS
3121 if (e_flags & EF_MIPS_UCODE)
3122 strcat (buf, ", ugen_reserved");
3123
252b5132
RH
3124 if (e_flags & EF_MIPS_ABI2)
3125 strcat (buf, ", abi2");
3126
43521d43
TS
3127 if (e_flags & EF_MIPS_OPTIONS_FIRST)
3128 strcat (buf, ", odk first");
3129
a5d22d2a
TS
3130 if (e_flags & EF_MIPS_32BITMODE)
3131 strcat (buf, ", 32bitmode");
3132
ba92f887
MR
3133 if (e_flags & EF_MIPS_NAN2008)
3134 strcat (buf, ", nan2008");
3135
fef1b0b3
SE
3136 if (e_flags & EF_MIPS_FP64)
3137 strcat (buf, ", fp64");
3138
156c2f8b
NC
3139 switch ((e_flags & EF_MIPS_MACH))
3140 {
3141 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3142 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3143 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
156c2f8b 3144 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
810dfa6e
L
3145 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3146 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3147 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3148 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
c6c98b38 3149 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
ebcb91b7 3150 case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
350cc38d
MS
3151 case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3152 case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
fd503541 3153 case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
05c6f050 3154 case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
67c2a3e8 3155 case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
d32e5c54 3156 case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
52b6b6b9 3157 case E_MIPS_MACH_XLR: strcat (buf, ", xlr"); break;
43521d43
TS
3158 case 0:
3159 /* We simply ignore the field in this case to avoid confusion:
3160 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3161 extension. */
3162 break;
2b692964 3163 default: strcat (buf, _(", unknown CPU")); break;
156c2f8b 3164 }
43521d43
TS
3165
3166 switch ((e_flags & EF_MIPS_ABI))
3167 {
3168 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3169 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3170 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3171 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3172 case 0:
3173 /* We simply ignore the field in this case to avoid confusion:
3174 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3175 This means it is likely to be an o32 file, but not for
3176 sure. */
3177 break;
2b692964 3178 default: strcat (buf, _(", unknown ABI")); break;
43521d43
TS
3179 }
3180
3181 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3182 strcat (buf, ", mdmx");
3183
3184 if (e_flags & EF_MIPS_ARCH_ASE_M16)
3185 strcat (buf, ", mips16");
3186
df58fc94
RS
3187 if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3188 strcat (buf, ", micromips");
3189
43521d43
TS
3190 switch ((e_flags & EF_MIPS_ARCH))
3191 {
3192 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3193 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3194 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3195 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3196 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3197 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
cb44e358 3198 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
7361da2c 3199 case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
43521d43 3200 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
5f74bc13 3201 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
7361da2c 3202 case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
2b692964 3203 default: strcat (buf, _(", unknown ISA")); break;
43521d43 3204 }
252b5132 3205 break;
351b4b40 3206
35c08157
KLC
3207 case EM_NDS32:
3208 decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3209 break;
3210
ccde1100
AO
3211 case EM_SH:
3212 switch ((e_flags & EF_SH_MACH_MASK))
3213 {
3214 case EF_SH1: strcat (buf, ", sh1"); break;
3215 case EF_SH2: strcat (buf, ", sh2"); break;
3216 case EF_SH3: strcat (buf, ", sh3"); break;
3217 case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3218 case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3219 case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3220 case EF_SH3E: strcat (buf, ", sh3e"); break;
3221 case EF_SH4: strcat (buf, ", sh4"); break;
3222 case EF_SH5: strcat (buf, ", sh5"); break;
3223 case EF_SH2E: strcat (buf, ", sh2e"); break;
3224 case EF_SH4A: strcat (buf, ", sh4a"); break;
1d70c7fb 3225 case EF_SH2A: strcat (buf, ", sh2a"); break;
ccde1100
AO
3226 case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3227 case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
1d70c7fb 3228 case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
0b92ab21
NH
3229 case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3230 case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3231 case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3232 case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3233 case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3234 case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
2b692964 3235 default: strcat (buf, _(", unknown ISA")); break;
ccde1100
AO
3236 }
3237
cec6a5b8
MR
3238 if (e_flags & EF_SH_PIC)
3239 strcat (buf, ", pic");
3240
3241 if (e_flags & EF_SH_FDPIC)
3242 strcat (buf, ", fdpic");
ccde1100 3243 break;
948f632f 3244
73589c9d
CS
3245 case EM_OR1K:
3246 if (e_flags & EF_OR1K_NODELAY)
3247 strcat (buf, ", no delay");
3248 break;
57346661 3249
351b4b40
RH
3250 case EM_SPARCV9:
3251 if (e_flags & EF_SPARC_32PLUS)
3252 strcat (buf, ", v8+");
3253
3254 if (e_flags & EF_SPARC_SUN_US1)
d07faca2
RH
3255 strcat (buf, ", ultrasparcI");
3256
3257 if (e_flags & EF_SPARC_SUN_US3)
3258 strcat (buf, ", ultrasparcIII");
351b4b40
RH
3259
3260 if (e_flags & EF_SPARC_HAL_R1)
3261 strcat (buf, ", halr1");
3262
3263 if (e_flags & EF_SPARC_LEDATA)
3264 strcat (buf, ", ledata");
3265
3266 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3267 strcat (buf, ", tso");
3268
3269 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3270 strcat (buf, ", pso");
3271
3272 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3273 strcat (buf, ", rmo");
3274 break;
7d466069 3275
103f02d3
UD
3276 case EM_PARISC:
3277 switch (e_flags & EF_PARISC_ARCH)
3278 {
3279 case EFA_PARISC_1_0:
3280 strcpy (buf, ", PA-RISC 1.0");
3281 break;
3282 case EFA_PARISC_1_1:
3283 strcpy (buf, ", PA-RISC 1.1");
3284 break;
3285 case EFA_PARISC_2_0:
3286 strcpy (buf, ", PA-RISC 2.0");
3287 break;
3288 default:
3289 break;
3290 }
3291 if (e_flags & EF_PARISC_TRAPNIL)
3292 strcat (buf, ", trapnil");
3293 if (e_flags & EF_PARISC_EXT)
3294 strcat (buf, ", ext");
3295 if (e_flags & EF_PARISC_LSB)
3296 strcat (buf, ", lsb");
3297 if (e_flags & EF_PARISC_WIDE)
3298 strcat (buf, ", wide");
3299 if (e_flags & EF_PARISC_NO_KABP)
3300 strcat (buf, ", no kabp");
3301 if (e_flags & EF_PARISC_LAZYSWAP)
3302 strcat (buf, ", lazyswap");
30800947 3303 break;
76da6bbe 3304
7d466069 3305 case EM_PJ:
2b0337b0 3306 case EM_PJ_OLD:
7d466069
ILT
3307 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3308 strcat (buf, ", new calling convention");
3309
3310 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3311 strcat (buf, ", gnu calling convention");
3312 break;
4d6ed7c8
NC
3313
3314 case EM_IA_64:
3315 if ((e_flags & EF_IA_64_ABI64))
3316 strcat (buf, ", 64-bit");
3317 else
3318 strcat (buf, ", 32-bit");
3319 if ((e_flags & EF_IA_64_REDUCEDFP))
3320 strcat (buf, ", reduced fp model");
3321 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3322 strcat (buf, ", no function descriptors, constant gp");
3323 else if ((e_flags & EF_IA_64_CONS_GP))
3324 strcat (buf, ", constant gp");
3325 if ((e_flags & EF_IA_64_ABSOLUTE))
3326 strcat (buf, ", absolute");
28f997cf
TG
3327 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3328 {
3329 if ((e_flags & EF_IA_64_VMS_LINKAGES))
3330 strcat (buf, ", vms_linkages");
3331 switch ((e_flags & EF_IA_64_VMS_COMCOD))
3332 {
3333 case EF_IA_64_VMS_COMCOD_SUCCESS:
3334 break;
3335 case EF_IA_64_VMS_COMCOD_WARNING:
3336 strcat (buf, ", warning");
3337 break;
3338 case EF_IA_64_VMS_COMCOD_ERROR:
3339 strcat (buf, ", error");
3340 break;
3341 case EF_IA_64_VMS_COMCOD_ABORT:
3342 strcat (buf, ", abort");
3343 break;
3344 default:
bee0ee85
NC
3345 warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3346 e_flags & EF_IA_64_VMS_COMCOD);
3347 strcat (buf, ", <unknown>");
28f997cf
TG
3348 }
3349 }
4d6ed7c8 3350 break;
179d3252
JT
3351
3352 case EM_VAX:
3353 if ((e_flags & EF_VAX_NONPIC))
3354 strcat (buf, ", non-PIC");
3355 if ((e_flags & EF_VAX_DFLOAT))
3356 strcat (buf, ", D-Float");
3357 if ((e_flags & EF_VAX_GFLOAT))
3358 strcat (buf, ", G-Float");
3359 break;
c7927a3c 3360
619ed720
EB
3361 case EM_VISIUM:
3362 if (e_flags & EF_VISIUM_ARCH_MCM)
3363 strcat (buf, ", mcm");
3364 else if (e_flags & EF_VISIUM_ARCH_MCM24)
3365 strcat (buf, ", mcm24");
3366 if (e_flags & EF_VISIUM_ARCH_GR6)
3367 strcat (buf, ", gr6");
3368 break;
3369
4046d87a 3370 case EM_RL78:
1740ba0c
NC
3371 switch (e_flags & E_FLAG_RL78_CPU_MASK)
3372 {
3373 case E_FLAG_RL78_ANY_CPU: break;
3374 case E_FLAG_RL78_G10: strcat (buf, ", G10"); break;
3375 case E_FLAG_RL78_G13: strcat (buf, ", G13"); break;
3376 case E_FLAG_RL78_G14: strcat (buf, ", G14"); break;
3377 }
856ea05c
KP
3378 if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3379 strcat (buf, ", 64-bit doubles");
4046d87a 3380 break;
0b4362b0 3381
c7927a3c
NC
3382 case EM_RX:
3383 if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3384 strcat (buf, ", 64-bit doubles");
3385 if (e_flags & E_FLAG_RX_DSP)
dd24e3da 3386 strcat (buf, ", dsp");
d4cb0ea0 3387 if (e_flags & E_FLAG_RX_PID)
0b4362b0 3388 strcat (buf, ", pid");
708e2187
NC
3389 if (e_flags & E_FLAG_RX_ABI)
3390 strcat (buf, ", RX ABI");
3525236c
NC
3391 if (e_flags & E_FLAG_RX_SINSNS_SET)
3392 strcat (buf, e_flags & E_FLAG_RX_SINSNS_YES
3393 ? ", uses String instructions" : ", bans String instructions");
a117b0a5
YS
3394 if (e_flags & E_FLAG_RX_V2)
3395 strcat (buf, ", V2");
d4cb0ea0 3396 break;
55786da2
AK
3397
3398 case EM_S390:
3399 if (e_flags & EF_S390_HIGH_GPRS)
3400 strcat (buf, ", highgprs");
d4cb0ea0 3401 break;
40b36596
JM
3402
3403 case EM_TI_C6000:
3404 if ((e_flags & EF_C6000_REL))
3405 strcat (buf, ", relocatable module");
d4cb0ea0 3406 break;
13761a11
NC
3407
3408 case EM_MSP430:
3409 strcat (buf, _(": architecture variant: "));
3410 switch (e_flags & EF_MSP430_MACH)
3411 {
3412 case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3413 case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3414 case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3415 case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3416 case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3417 case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3418 case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3419 case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3420 case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3421 case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3422 case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3423 case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3424 case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3425 case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3426 case E_MSP430_MACH_MSP430X : strcat (buf, "MSP430X"); break;
3427 default:
3428 strcat (buf, _(": unknown")); break;
3429 }
3430
3431 if (e_flags & ~ EF_MSP430_MACH)
3432 strcat (buf, _(": unknown extra flag bits also present"));
252b5132
RH
3433 }
3434 }
3435
3436 return buf;
3437}
3438
252b5132 3439static const char *
d3ba0551
AM
3440get_osabi_name (unsigned int osabi)
3441{
3442 static char buff[32];
3443
3444 switch (osabi)
3445 {
3446 case ELFOSABI_NONE: return "UNIX - System V";
3447 case ELFOSABI_HPUX: return "UNIX - HP-UX";
3448 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
9c55345c 3449 case ELFOSABI_GNU: return "UNIX - GNU";
d3ba0551
AM
3450 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
3451 case ELFOSABI_AIX: return "UNIX - AIX";
3452 case ELFOSABI_IRIX: return "UNIX - IRIX";
3453 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
3454 case ELFOSABI_TRU64: return "UNIX - TRU64";
3455 case ELFOSABI_MODESTO: return "Novell - Modesto";
3456 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
3457 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
3458 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
3b26c801 3459 case ELFOSABI_AROS: return "AROS";
11636f9e 3460 case ELFOSABI_FENIXOS: return "FenixOS";
d3ba0551 3461 default:
40b36596
JM
3462 if (osabi >= 64)
3463 switch (elf_header.e_machine)
3464 {
3465 case EM_ARM:
3466 switch (osabi)
3467 {
3468 case ELFOSABI_ARM: return "ARM";
3469 default:
3470 break;
3471 }
3472 break;
3473
3474 case EM_MSP430:
3475 case EM_MSP430_OLD:
619ed720 3476 case EM_VISIUM:
40b36596
JM
3477 switch (osabi)
3478 {
3479 case ELFOSABI_STANDALONE: return _("Standalone App");
3480 default:
3481 break;
3482 }
3483 break;
3484
3485 case EM_TI_C6000:
3486 switch (osabi)
3487 {
3488 case ELFOSABI_C6000_ELFABI: return _("Bare-metal C6000");
3489 case ELFOSABI_C6000_LINUX: return "Linux C6000";
3490 default:
3491 break;
3492 }
3493 break;
3494
3495 default:
3496 break;
3497 }
e9e44622 3498 snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
d3ba0551
AM
3499 return buff;
3500 }
3501}
3502
a06ea964
NC
3503static const char *
3504get_aarch64_segment_type (unsigned long type)
3505{
3506 switch (type)
3507 {
3508 case PT_AARCH64_ARCHEXT:
3509 return "AARCH64_ARCHEXT";
3510 default:
3511 break;
3512 }
3513
3514 return NULL;
3515}
3516
b294bdf8
MM
3517static const char *
3518get_arm_segment_type (unsigned long type)
3519{
3520 switch (type)
3521 {
3522 case PT_ARM_EXIDX:
3523 return "EXIDX";
3524 default:
3525 break;
3526 }
3527
3528 return NULL;
3529}
3530
d3ba0551
AM
3531static const char *
3532get_mips_segment_type (unsigned long type)
252b5132
RH
3533{
3534 switch (type)
3535 {
3536 case PT_MIPS_REGINFO:
3537 return "REGINFO";
3538 case PT_MIPS_RTPROC:
3539 return "RTPROC";
3540 case PT_MIPS_OPTIONS:
3541 return "OPTIONS";
351cdf24
MF
3542 case PT_MIPS_ABIFLAGS:
3543 return "ABIFLAGS";
252b5132
RH
3544 default:
3545 break;
3546 }
3547
3548 return NULL;
3549}
3550
103f02d3 3551static const char *
d3ba0551 3552get_parisc_segment_type (unsigned long type)
103f02d3
UD
3553{
3554 switch (type)
3555 {
3556 case PT_HP_TLS: return "HP_TLS";
3557 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
3558 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
3559 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
3560 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
3561 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
3562 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
3563 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
3564 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
3565 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
3566 case PT_HP_PARALLEL: return "HP_PARALLEL";
3567 case PT_HP_FASTBIND: return "HP_FASTBIND";
eec8f817
DA
3568 case PT_HP_OPT_ANNOT: return "HP_OPT_ANNOT";
3569 case PT_HP_HSL_ANNOT: return "HP_HSL_ANNOT";
3570 case PT_HP_STACK: return "HP_STACK";
3571 case PT_HP_CORE_UTSNAME: return "HP_CORE_UTSNAME";
103f02d3
UD
3572 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
3573 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
61472819 3574 case PT_PARISC_WEAKORDER: return "PARISC_WEAKORDER";
103f02d3
UD
3575 default:
3576 break;
3577 }
3578
3579 return NULL;
3580}
3581
4d6ed7c8 3582static const char *
d3ba0551 3583get_ia64_segment_type (unsigned long type)
4d6ed7c8
NC
3584{
3585 switch (type)
3586 {
3587 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
3588 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
00428cca
AM
3589 case PT_HP_TLS: return "HP_TLS";
3590 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
3591 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
3592 case PT_IA_64_HP_STACK: return "HP_STACK";
4d6ed7c8
NC
3593 default:
3594 break;
3595 }
3596
3597 return NULL;
3598}
3599
40b36596
JM
3600static const char *
3601get_tic6x_segment_type (unsigned long type)
3602{
3603 switch (type)
3604 {
3605 case PT_C6000_PHATTR: return "C6000_PHATTR";
3606 default:
3607 break;
3608 }
3609
3610 return NULL;
3611}
3612
252b5132 3613static const char *
d3ba0551 3614get_segment_type (unsigned long p_type)
252b5132 3615{
b34976b6 3616 static char buff[32];
252b5132
RH
3617
3618 switch (p_type)
3619 {
b34976b6
AM
3620 case PT_NULL: return "NULL";
3621 case PT_LOAD: return "LOAD";
252b5132 3622 case PT_DYNAMIC: return "DYNAMIC";
b34976b6
AM
3623 case PT_INTERP: return "INTERP";
3624 case PT_NOTE: return "NOTE";
3625 case PT_SHLIB: return "SHLIB";
3626 case PT_PHDR: return "PHDR";
13ae64f3 3627 case PT_TLS: return "TLS";
252b5132 3628
65765700
JJ
3629 case PT_GNU_EH_FRAME:
3630 return "GNU_EH_FRAME";
2b05f1b7 3631 case PT_GNU_STACK: return "GNU_STACK";
8c37241b 3632 case PT_GNU_RELRO: return "GNU_RELRO";
65765700 3633
252b5132
RH
3634 default:
3635 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3636 {
2cf0635d 3637 const char * result;
103f02d3 3638
252b5132
RH
3639 switch (elf_header.e_machine)
3640 {
a06ea964
NC
3641 case EM_AARCH64:
3642 result = get_aarch64_segment_type (p_type);
3643 break;
b294bdf8
MM
3644 case EM_ARM:
3645 result = get_arm_segment_type (p_type);
3646 break;
252b5132 3647 case EM_MIPS:
4fe85591 3648 case EM_MIPS_RS3_LE:
252b5132
RH
3649 result = get_mips_segment_type (p_type);
3650 break;
103f02d3
UD
3651 case EM_PARISC:
3652 result = get_parisc_segment_type (p_type);
3653 break;
4d6ed7c8
NC
3654 case EM_IA_64:
3655 result = get_ia64_segment_type (p_type);
3656 break;
40b36596
JM
3657 case EM_TI_C6000:
3658 result = get_tic6x_segment_type (p_type);
3659 break;
252b5132
RH
3660 default:
3661 result = NULL;
3662 break;
3663 }
103f02d3 3664
252b5132
RH
3665 if (result != NULL)
3666 return result;
103f02d3 3667
252b5132
RH
3668 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
3669 }
3670 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
103f02d3 3671 {
2cf0635d 3672 const char * result;
103f02d3
UD
3673
3674 switch (elf_header.e_machine)
3675 {
3676 case EM_PARISC:
3677 result = get_parisc_segment_type (p_type);
3678 break;
00428cca
AM
3679 case EM_IA_64:
3680 result = get_ia64_segment_type (p_type);
3681 break;
103f02d3
UD
3682 default:
3683 result = NULL;
3684 break;
3685 }
3686
3687 if (result != NULL)
3688 return result;
3689
3690 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
3691 }
252b5132 3692 else
e9e44622 3693 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
252b5132
RH
3694
3695 return buff;
3696 }
3697}
3698
3699static const char *
d3ba0551 3700get_mips_section_type_name (unsigned int sh_type)
252b5132
RH
3701{
3702 switch (sh_type)
3703 {
b34976b6
AM
3704 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
3705 case SHT_MIPS_MSYM: return "MIPS_MSYM";
3706 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
3707 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
3708 case SHT_MIPS_UCODE: return "MIPS_UCODE";
3709 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
3710 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
3711 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
3712 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
3713 case SHT_MIPS_RELD: return "MIPS_RELD";
3714 case SHT_MIPS_IFACE: return "MIPS_IFACE";
3715 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
3716 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
3717 case SHT_MIPS_SHDR: return "MIPS_SHDR";
3718 case SHT_MIPS_FDESC: return "MIPS_FDESC";
3719 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
3720 case SHT_MIPS_DENSE: return "MIPS_DENSE";
3721 case SHT_MIPS_PDESC: return "MIPS_PDESC";
3722 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
3723 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
3724 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
3725 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
3726 case SHT_MIPS_LINE: return "MIPS_LINE";
3727 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
3728 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
3729 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
3730 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
3731 case SHT_MIPS_DWARF: return "MIPS_DWARF";
3732 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
3733 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
3734 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
3735 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
3736 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
3737 case SHT_MIPS_XLATE: return "MIPS_XLATE";
3738 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
3739 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
3740 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
3741 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
252b5132 3742 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
351cdf24 3743 case SHT_MIPS_ABIFLAGS: return "MIPS_ABIFLAGS";
252b5132
RH
3744 default:
3745 break;
3746 }
3747 return NULL;
3748}
3749
103f02d3 3750static const char *
d3ba0551 3751get_parisc_section_type_name (unsigned int sh_type)
103f02d3
UD
3752{
3753 switch (sh_type)
3754 {
3755 case SHT_PARISC_EXT: return "PARISC_EXT";
3756 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
3757 case SHT_PARISC_DOC: return "PARISC_DOC";
eec8f817
DA
3758 case SHT_PARISC_ANNOT: return "PARISC_ANNOT";
3759 case SHT_PARISC_SYMEXTN: return "PARISC_SYMEXTN";
3760 case SHT_PARISC_STUBS: return "PARISC_STUBS";
61472819 3761 case SHT_PARISC_DLKM: return "PARISC_DLKM";
103f02d3
UD
3762 default:
3763 break;
3764 }
3765 return NULL;
3766}
3767
4d6ed7c8 3768static const char *
d3ba0551 3769get_ia64_section_type_name (unsigned int sh_type)
4d6ed7c8 3770{
18bd398b 3771 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
ecc51f48
NC
3772 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
3773 return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
0de14b54 3774
4d6ed7c8
NC
3775 switch (sh_type)
3776 {
148b93f2
NC
3777 case SHT_IA_64_EXT: return "IA_64_EXT";
3778 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
3779 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
3780 case SHT_IA_64_VMS_TRACE: return "VMS_TRACE";
3781 case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
3782 case SHT_IA_64_VMS_DEBUG: return "VMS_DEBUG";
3783 case SHT_IA_64_VMS_DEBUG_STR: return "VMS_DEBUG_STR";
3784 case SHT_IA_64_VMS_LINKAGES: return "VMS_LINKAGES";
3785 case SHT_IA_64_VMS_SYMBOL_VECTOR: return "VMS_SYMBOL_VECTOR";
3786 case SHT_IA_64_VMS_FIXUP: return "VMS_FIXUP";
4d6ed7c8
NC
3787 default:
3788 break;
3789 }
3790 return NULL;
3791}
3792
d2b2c203
DJ
3793static const char *
3794get_x86_64_section_type_name (unsigned int sh_type)
3795{
3796 switch (sh_type)
3797 {
3798 case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
3799 default:
3800 break;
3801 }
3802 return NULL;
3803}
3804
a06ea964
NC
3805static const char *
3806get_aarch64_section_type_name (unsigned int sh_type)
3807{
3808 switch (sh_type)
3809 {
3810 case SHT_AARCH64_ATTRIBUTES:
3811 return "AARCH64_ATTRIBUTES";
3812 default:
3813 break;
3814 }
3815 return NULL;
3816}
3817
40a18ebd
NC
3818static const char *
3819get_arm_section_type_name (unsigned int sh_type)
3820{
3821 switch (sh_type)
3822 {
7f6fed87
NC
3823 case SHT_ARM_EXIDX: return "ARM_EXIDX";
3824 case SHT_ARM_PREEMPTMAP: return "ARM_PREEMPTMAP";
3825 case SHT_ARM_ATTRIBUTES: return "ARM_ATTRIBUTES";
3826 case SHT_ARM_DEBUGOVERLAY: return "ARM_DEBUGOVERLAY";
3827 case SHT_ARM_OVERLAYSECTION: return "ARM_OVERLAYSECTION";
40a18ebd
NC
3828 default:
3829 break;
3830 }
3831 return NULL;
3832}
3833
40b36596
JM
3834static const char *
3835get_tic6x_section_type_name (unsigned int sh_type)
3836{
3837 switch (sh_type)
3838 {
3839 case SHT_C6000_UNWIND:
3840 return "C6000_UNWIND";
3841 case SHT_C6000_PREEMPTMAP:
3842 return "C6000_PREEMPTMAP";
3843 case SHT_C6000_ATTRIBUTES:
3844 return "C6000_ATTRIBUTES";
3845 case SHT_TI_ICODE:
3846 return "TI_ICODE";
3847 case SHT_TI_XREF:
3848 return "TI_XREF";
3849 case SHT_TI_HANDLER:
3850 return "TI_HANDLER";
3851 case SHT_TI_INITINFO:
3852 return "TI_INITINFO";
3853 case SHT_TI_PHATTRS:
3854 return "TI_PHATTRS";
3855 default:
3856 break;
3857 }
3858 return NULL;
3859}
3860
13761a11
NC
3861static const char *
3862get_msp430x_section_type_name (unsigned int sh_type)
3863{
3864 switch (sh_type)
3865 {
3866 case SHT_MSP430_SEC_FLAGS: return "MSP430_SEC_FLAGS";
3867 case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
3868 case SHT_MSP430_ATTRIBUTES: return "MSP430_ATTRIBUTES";
3869 default: return NULL;
3870 }
3871}
3872
685080f2
NC
3873static const char *
3874get_v850_section_type_name (unsigned int sh_type)
3875{
3876 switch (sh_type)
3877 {
3878 case SHT_V850_SCOMMON: return "V850 Small Common";
3879 case SHT_V850_TCOMMON: return "V850 Tiny Common";
3880 case SHT_V850_ZCOMMON: return "V850 Zero Common";
3881 case SHT_RENESAS_IOP: return "RENESAS IOP";
3882 case SHT_RENESAS_INFO: return "RENESAS INFO";
3883 default: return NULL;
3884 }
3885}
3886
252b5132 3887static const char *
d3ba0551 3888get_section_type_name (unsigned int sh_type)
252b5132 3889{
b34976b6 3890 static char buff[32];
9fb71ee4 3891 const char * result;
252b5132
RH
3892
3893 switch (sh_type)
3894 {
3895 case SHT_NULL: return "NULL";
3896 case SHT_PROGBITS: return "PROGBITS";
3897 case SHT_SYMTAB: return "SYMTAB";
3898 case SHT_STRTAB: return "STRTAB";
3899 case SHT_RELA: return "RELA";
3900 case SHT_HASH: return "HASH";
3901 case SHT_DYNAMIC: return "DYNAMIC";
3902 case SHT_NOTE: return "NOTE";
3903 case SHT_NOBITS: return "NOBITS";
3904 case SHT_REL: return "REL";
3905 case SHT_SHLIB: return "SHLIB";
3906 case SHT_DYNSYM: return "DYNSYM";
d1133906
NC
3907 case SHT_INIT_ARRAY: return "INIT_ARRAY";
3908 case SHT_FINI_ARRAY: return "FINI_ARRAY";
3909 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
fdc90cb4 3910 case SHT_GNU_HASH: return "GNU_HASH";
93ebe586
NC
3911 case SHT_GROUP: return "GROUP";
3912 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
252b5132
RH
3913 case SHT_GNU_verdef: return "VERDEF";
3914 case SHT_GNU_verneed: return "VERNEED";
3915 case SHT_GNU_versym: return "VERSYM";
b34976b6
AM
3916 case 0x6ffffff0: return "VERSYM";
3917 case 0x6ffffffc: return "VERDEF";
252b5132
RH
3918 case 0x7ffffffd: return "AUXILIARY";
3919 case 0x7fffffff: return "FILTER";
047b2264 3920 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
252b5132
RH
3921
3922 default:
3923 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
3924 {
252b5132
RH
3925 switch (elf_header.e_machine)
3926 {
3927 case EM_MIPS:
4fe85591 3928 case EM_MIPS_RS3_LE:
252b5132
RH
3929 result = get_mips_section_type_name (sh_type);
3930 break;
103f02d3
UD
3931 case EM_PARISC:
3932 result = get_parisc_section_type_name (sh_type);
3933 break;
4d6ed7c8
NC
3934 case EM_IA_64:
3935 result = get_ia64_section_type_name (sh_type);
3936 break;
d2b2c203 3937 case EM_X86_64:
8a9036a4 3938 case EM_L1OM:
7a9068fe 3939 case EM_K1OM:
d2b2c203
DJ
3940 result = get_x86_64_section_type_name (sh_type);
3941 break;
a06ea964
NC
3942 case EM_AARCH64:
3943 result = get_aarch64_section_type_name (sh_type);
3944 break;
40a18ebd
NC
3945 case EM_ARM:
3946 result = get_arm_section_type_name (sh_type);
3947 break;
40b36596
JM
3948 case EM_TI_C6000:
3949 result = get_tic6x_section_type_name (sh_type);
3950 break;
13761a11
NC
3951 case EM_MSP430:
3952 result = get_msp430x_section_type_name (sh_type);
3953 break;
685080f2
NC
3954 case EM_V800:
3955 case EM_V850:
3956 case EM_CYGNUS_V850:
3957 result = get_v850_section_type_name (sh_type);
3958 break;
252b5132
RH
3959 default:
3960 result = NULL;
3961 break;
3962 }
3963
3964 if (result != NULL)
3965 return result;
3966
9fb71ee4 3967 sprintf (buff, "LOPROC+%#x", sh_type - SHT_LOPROC);
252b5132
RH
3968 }
3969 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
148b93f2 3970 {
148b93f2
NC
3971 switch (elf_header.e_machine)
3972 {
3973 case EM_IA_64:
3974 result = get_ia64_section_type_name (sh_type);
3975 break;
3976 default:
3977 result = NULL;
3978 break;
3979 }
3980
3981 if (result != NULL)
3982 return result;
3983
9fb71ee4 3984 sprintf (buff, "LOOS+%#x", sh_type - SHT_LOOS);
148b93f2 3985 }
252b5132 3986 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
685080f2
NC
3987 {
3988 switch (elf_header.e_machine)
3989 {
3990 case EM_V800:
3991 case EM_V850:
3992 case EM_CYGNUS_V850:
9fb71ee4 3993 result = get_v850_section_type_name (sh_type);
a9fb83be 3994 break;
685080f2 3995 default:
9fb71ee4 3996 result = NULL;
685080f2
NC
3997 break;
3998 }
3999
9fb71ee4
NC
4000 if (result != NULL)
4001 return result;
4002
4003 sprintf (buff, "LOUSER+%#x", sh_type - SHT_LOUSER);
685080f2 4004 }
252b5132 4005 else
a7dbfd1c
NC
4006 /* This message is probably going to be displayed in a 15
4007 character wide field, so put the hex value first. */
4008 snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
103f02d3 4009
252b5132
RH
4010 return buff;
4011 }
4012}
4013
2979dc34 4014#define OPTION_DEBUG_DUMP 512
2c610e4b 4015#define OPTION_DYN_SYMS 513
fd2f0033
TT
4016#define OPTION_DWARF_DEPTH 514
4017#define OPTION_DWARF_START 515
4723351a 4018#define OPTION_DWARF_CHECK 516
2979dc34 4019
85b1c36d 4020static struct option options[] =
252b5132 4021{
b34976b6 4022 {"all", no_argument, 0, 'a'},
252b5132
RH
4023 {"file-header", no_argument, 0, 'h'},
4024 {"program-headers", no_argument, 0, 'l'},
b34976b6
AM
4025 {"headers", no_argument, 0, 'e'},
4026 {"histogram", no_argument, 0, 'I'},
4027 {"segments", no_argument, 0, 'l'},
4028 {"sections", no_argument, 0, 'S'},
252b5132 4029 {"section-headers", no_argument, 0, 'S'},
f5842774 4030 {"section-groups", no_argument, 0, 'g'},
5477e8a0 4031 {"section-details", no_argument, 0, 't'},
595cf52e 4032 {"full-section-name",no_argument, 0, 'N'},
b34976b6
AM
4033 {"symbols", no_argument, 0, 's'},
4034 {"syms", no_argument, 0, 's'},
2c610e4b 4035 {"dyn-syms", no_argument, 0, OPTION_DYN_SYMS},
b34976b6
AM
4036 {"relocs", no_argument, 0, 'r'},
4037 {"notes", no_argument, 0, 'n'},
4038 {"dynamic", no_argument, 0, 'd'},
a952a375 4039 {"arch-specific", no_argument, 0, 'A'},
252b5132
RH
4040 {"version-info", no_argument, 0, 'V'},
4041 {"use-dynamic", no_argument, 0, 'D'},
09c11c86 4042 {"unwind", no_argument, 0, 'u'},
4145f1d5 4043 {"archive-index", no_argument, 0, 'c'},
b34976b6 4044 {"hex-dump", required_argument, 0, 'x'},
cf13d699 4045 {"relocated-dump", required_argument, 0, 'R'},
09c11c86 4046 {"string-dump", required_argument, 0, 'p'},
0e602686 4047 {"decompress", no_argument, 0, 'z'},
252b5132
RH
4048#ifdef SUPPORT_DISASSEMBLY
4049 {"instruction-dump", required_argument, 0, 'i'},
4050#endif
cf13d699 4051 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
252b5132 4052
fd2f0033
TT
4053 {"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH},
4054 {"dwarf-start", required_argument, 0, OPTION_DWARF_START},
4723351a 4055 {"dwarf-check", no_argument, 0, OPTION_DWARF_CHECK},
fd2f0033 4056
b34976b6
AM
4057 {"version", no_argument, 0, 'v'},
4058 {"wide", no_argument, 0, 'W'},
4059 {"help", no_argument, 0, 'H'},
4060 {0, no_argument, 0, 0}
252b5132
RH
4061};
4062
4063static void
2cf0635d 4064usage (FILE * stream)
252b5132 4065{
92f01d61
JM
4066 fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
4067 fprintf (stream, _(" Display information about the contents of ELF format files\n"));
4068 fprintf (stream, _(" Options are:\n\
8b53311e
NC
4069 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4070 -h --file-header Display the ELF file header\n\
4071 -l --program-headers Display the program headers\n\
4072 --segments An alias for --program-headers\n\
4073 -S --section-headers Display the sections' header\n\
4074 --sections An alias for --section-headers\n\
f5842774 4075 -g --section-groups Display the section groups\n\
5477e8a0 4076 -t --section-details Display the section details\n\
8b53311e
NC
4077 -e --headers Equivalent to: -h -l -S\n\
4078 -s --syms Display the symbol table\n\
3f08eb35 4079 --symbols An alias for --syms\n\
2c610e4b 4080 --dyn-syms Display the dynamic symbol table\n\
8b53311e
NC
4081 -n --notes Display the core notes (if present)\n\
4082 -r --relocs Display the relocations (if present)\n\
4083 -u --unwind Display the unwind info (if present)\n\
b2d38a17 4084 -d --dynamic Display the dynamic section (if present)\n\
8b53311e 4085 -V --version-info Display the version sections (if present)\n\
1b31d05e 4086 -A --arch-specific Display architecture specific information (if any)\n\
4145f1d5 4087 -c --archive-index Display the symbol/file index in an archive\n\
8b53311e 4088 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
09c11c86
NC
4089 -x --hex-dump=<number|name>\n\
4090 Dump the contents of section <number|name> as bytes\n\
4091 -p --string-dump=<number|name>\n\
4092 Dump the contents of section <number|name> as strings\n\
cf13d699
NC
4093 -R --relocated-dump=<number|name>\n\
4094 Dump the contents of section <number|name> as relocated bytes\n\
0e602686 4095 -z --decompress Decompress section before dumping it\n\
f9f0e732 4096 -w[lLiaprmfFsoRt] or\n\
1ed06042 4097 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
6f875884 4098 =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
657d0d47
CC
4099 =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4100 =addr,=cu_index]\n\
8b53311e 4101 Display the contents of DWARF2 debug sections\n"));
fd2f0033
TT
4102 fprintf (stream, _("\
4103 --dwarf-depth=N Do not display DIEs at depth N or greater\n\
4104 --dwarf-start=N Display DIEs starting with N, at the same depth\n\
4105 or deeper\n"));
252b5132 4106#ifdef SUPPORT_DISASSEMBLY
92f01d61 4107 fprintf (stream, _("\
09c11c86
NC
4108 -i --instruction-dump=<number|name>\n\
4109 Disassemble the contents of section <number|name>\n"));
252b5132 4110#endif
92f01d61 4111 fprintf (stream, _("\
8b53311e
NC
4112 -I --histogram Display histogram of bucket list lengths\n\
4113 -W --wide Allow output width to exceed 80 characters\n\
07012eee 4114 @<file> Read options from <file>\n\
8b53311e
NC
4115 -H --help Display this information\n\
4116 -v --version Display the version number of readelf\n"));
1118d252 4117
92f01d61
JM
4118 if (REPORT_BUGS_TO[0] && stream == stdout)
4119 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
252b5132 4120
92f01d61 4121 exit (stream == stdout ? 0 : 1);
252b5132
RH
4122}
4123
18bd398b
NC
4124/* Record the fact that the user wants the contents of section number
4125 SECTION to be displayed using the method(s) encoded as flags bits
4126 in TYPE. Note, TYPE can be zero if we are creating the array for
4127 the first time. */
4128
252b5132 4129static void
09c11c86 4130request_dump_bynumber (unsigned int section, dump_type type)
252b5132
RH
4131{
4132 if (section >= num_dump_sects)
4133 {
2cf0635d 4134 dump_type * new_dump_sects;
252b5132 4135
3f5e193b
NC
4136 new_dump_sects = (dump_type *) calloc (section + 1,
4137 sizeof (* dump_sects));
252b5132
RH
4138
4139 if (new_dump_sects == NULL)
591a748a 4140 error (_("Out of memory allocating dump request table.\n"));
252b5132
RH
4141 else
4142 {
4143 /* Copy current flag settings. */
09c11c86 4144 memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
252b5132
RH
4145
4146 free (dump_sects);
4147
4148 dump_sects = new_dump_sects;
4149 num_dump_sects = section + 1;
4150 }
4151 }
4152
4153 if (dump_sects)
b34976b6 4154 dump_sects[section] |= type;
252b5132
RH
4155
4156 return;
4157}
4158
aef1f6d0
DJ
4159/* Request a dump by section name. */
4160
4161static void
2cf0635d 4162request_dump_byname (const char * section, dump_type type)
aef1f6d0 4163{
2cf0635d 4164 struct dump_list_entry * new_request;
aef1f6d0 4165
3f5e193b
NC
4166 new_request = (struct dump_list_entry *)
4167 malloc (sizeof (struct dump_list_entry));
aef1f6d0 4168 if (!new_request)
591a748a 4169 error (_("Out of memory allocating dump request table.\n"));
aef1f6d0
DJ
4170
4171 new_request->name = strdup (section);
4172 if (!new_request->name)
591a748a 4173 error (_("Out of memory allocating dump request table.\n"));
aef1f6d0
DJ
4174
4175 new_request->type = type;
4176
4177 new_request->next = dump_sects_byname;
4178 dump_sects_byname = new_request;
4179}
4180
cf13d699
NC
4181static inline void
4182request_dump (dump_type type)
4183{
4184 int section;
4185 char * cp;
4186
4187 do_dump++;
4188 section = strtoul (optarg, & cp, 0);
4189
4190 if (! *cp && section >= 0)
4191 request_dump_bynumber (section, type);
4192 else
4193 request_dump_byname (optarg, type);
4194}
4195
4196
252b5132 4197static void
2cf0635d 4198parse_args (int argc, char ** argv)
252b5132
RH
4199{
4200 int c;
4201
4202 if (argc < 2)
92f01d61 4203 usage (stderr);
252b5132
RH
4204
4205 while ((c = getopt_long
0e602686 4206 (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
252b5132 4207 {
252b5132
RH
4208 switch (c)
4209 {
4210 case 0:
4211 /* Long options. */
4212 break;
4213 case 'H':
92f01d61 4214 usage (stdout);
252b5132
RH
4215 break;
4216
4217 case 'a':
b34976b6
AM
4218 do_syms++;
4219 do_reloc++;
4220 do_unwind++;
4221 do_dynamic++;
4222 do_header++;
4223 do_sections++;
f5842774 4224 do_section_groups++;
b34976b6
AM
4225 do_segments++;
4226 do_version++;
4227 do_histogram++;
4228 do_arch++;
4229 do_notes++;
252b5132 4230 break;
f5842774
L
4231 case 'g':
4232 do_section_groups++;
4233 break;
5477e8a0 4234 case 't':
595cf52e 4235 case 'N':
5477e8a0
L
4236 do_sections++;
4237 do_section_details++;
595cf52e 4238 break;
252b5132 4239 case 'e':
b34976b6
AM
4240 do_header++;
4241 do_sections++;
4242 do_segments++;
252b5132 4243 break;
a952a375 4244 case 'A':
b34976b6 4245 do_arch++;
a952a375 4246 break;
252b5132 4247 case 'D':
b34976b6 4248 do_using_dynamic++;
252b5132
RH
4249 break;
4250 case 'r':
b34976b6 4251 do_reloc++;
252b5132 4252 break;
4d6ed7c8 4253 case 'u':
b34976b6 4254 do_unwind++;
4d6ed7c8 4255 break;
252b5132 4256 case 'h':
b34976b6 4257 do_header++;
252b5132
RH
4258 break;
4259 case 'l':
b34976b6 4260 do_segments++;
252b5132
RH
4261 break;
4262 case 's':
b34976b6 4263 do_syms++;
252b5132
RH
4264 break;
4265 case 'S':
b34976b6 4266 do_sections++;
252b5132
RH
4267 break;
4268 case 'd':
b34976b6 4269 do_dynamic++;
252b5132 4270 break;
a952a375 4271 case 'I':
b34976b6 4272 do_histogram++;
a952a375 4273 break;
779fe533 4274 case 'n':
b34976b6 4275 do_notes++;
779fe533 4276 break;
4145f1d5
NC
4277 case 'c':
4278 do_archive_index++;
4279 break;
252b5132 4280 case 'x':
cf13d699 4281 request_dump (HEX_DUMP);
aef1f6d0 4282 break;
09c11c86 4283 case 'p':
cf13d699
NC
4284 request_dump (STRING_DUMP);
4285 break;
4286 case 'R':
4287 request_dump (RELOC_DUMP);
09c11c86 4288 break;
0e602686
NC
4289 case 'z':
4290 decompress_dumps++;
4291 break;
252b5132 4292 case 'w':
b34976b6 4293 do_dump++;
252b5132 4294 if (optarg == 0)
613ff48b
CC
4295 {
4296 do_debugging = 1;
4297 dwarf_select_sections_all ();
4298 }
252b5132
RH
4299 else
4300 {
4301 do_debugging = 0;
4cb93e3b 4302 dwarf_select_sections_by_letters (optarg);
252b5132
RH
4303 }
4304 break;
2979dc34 4305 case OPTION_DEBUG_DUMP:
b34976b6 4306 do_dump++;
2979dc34
JJ
4307 if (optarg == 0)
4308 do_debugging = 1;
4309 else
4310 {
2979dc34 4311 do_debugging = 0;
4cb93e3b 4312 dwarf_select_sections_by_names (optarg);
2979dc34
JJ
4313 }
4314 break;
fd2f0033
TT
4315 case OPTION_DWARF_DEPTH:
4316 {
4317 char *cp;
4318
4319 dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4320 }
4321 break;
4322 case OPTION_DWARF_START:
4323 {
4324 char *cp;
4325
4326 dwarf_start_die = strtoul (optarg, & cp, 0);
4327 }
4328 break;
4723351a
CC
4329 case OPTION_DWARF_CHECK:
4330 dwarf_check = 1;
4331 break;
2c610e4b
L
4332 case OPTION_DYN_SYMS:
4333 do_dyn_syms++;
4334 break;
252b5132
RH
4335#ifdef SUPPORT_DISASSEMBLY
4336 case 'i':
cf13d699
NC
4337 request_dump (DISASS_DUMP);
4338 break;
252b5132
RH
4339#endif
4340 case 'v':
4341 print_version (program_name);
4342 break;
4343 case 'V':
b34976b6 4344 do_version++;
252b5132 4345 break;
d974e256 4346 case 'W':
b34976b6 4347 do_wide++;
d974e256 4348 break;
252b5132 4349 default:
252b5132
RH
4350 /* xgettext:c-format */
4351 error (_("Invalid option '-%c'\n"), c);
4352 /* Drop through. */
4353 case '?':
92f01d61 4354 usage (stderr);
252b5132
RH
4355 }
4356 }
4357
4d6ed7c8 4358 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
252b5132 4359 && !do_segments && !do_header && !do_dump && !do_version
f5842774 4360 && !do_histogram && !do_debugging && !do_arch && !do_notes
2c610e4b
L
4361 && !do_section_groups && !do_archive_index
4362 && !do_dyn_syms)
92f01d61 4363 usage (stderr);
252b5132
RH
4364}
4365
4366static const char *
d3ba0551 4367get_elf_class (unsigned int elf_class)
252b5132 4368{
b34976b6 4369 static char buff[32];
103f02d3 4370
252b5132
RH
4371 switch (elf_class)
4372 {
4373 case ELFCLASSNONE: return _("none");
e3c8793a
NC
4374 case ELFCLASS32: return "ELF32";
4375 case ELFCLASS64: return "ELF64";
ab5e7794 4376 default:
e9e44622 4377 snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
ab5e7794 4378 return buff;
252b5132
RH
4379 }
4380}
4381
4382static const char *
d3ba0551 4383get_data_encoding (unsigned int encoding)
252b5132 4384{
b34976b6 4385 static char buff[32];
103f02d3 4386
252b5132
RH
4387 switch (encoding)
4388 {
4389 case ELFDATANONE: return _("none");
33c63f9d
CM
4390 case ELFDATA2LSB: return _("2's complement, little endian");
4391 case ELFDATA2MSB: return _("2's complement, big endian");
103f02d3 4392 default:
e9e44622 4393 snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
ab5e7794 4394 return buff;
252b5132
RH
4395 }
4396}
4397
252b5132 4398/* Decode the data held in 'elf_header'. */
ee42cf8c 4399
252b5132 4400static int
d3ba0551 4401process_file_header (void)
252b5132 4402{
b34976b6
AM
4403 if ( elf_header.e_ident[EI_MAG0] != ELFMAG0
4404 || elf_header.e_ident[EI_MAG1] != ELFMAG1
4405 || elf_header.e_ident[EI_MAG2] != ELFMAG2
4406 || elf_header.e_ident[EI_MAG3] != ELFMAG3)
252b5132
RH
4407 {
4408 error
4409 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4410 return 0;
4411 }
4412
2dc4cec1
L
4413 init_dwarf_regnames (elf_header.e_machine);
4414
252b5132
RH
4415 if (do_header)
4416 {
4417 int i;
4418
4419 printf (_("ELF Header:\n"));
4420 printf (_(" Magic: "));
b34976b6
AM
4421 for (i = 0; i < EI_NIDENT; i++)
4422 printf ("%2.2x ", elf_header.e_ident[i]);
252b5132
RH
4423 printf ("\n");
4424 printf (_(" Class: %s\n"),
b34976b6 4425 get_elf_class (elf_header.e_ident[EI_CLASS]));
252b5132 4426 printf (_(" Data: %s\n"),
b34976b6 4427 get_data_encoding (elf_header.e_ident[EI_DATA]));
252b5132 4428 printf (_(" Version: %d %s\n"),
b34976b6
AM
4429 elf_header.e_ident[EI_VERSION],
4430 (elf_header.e_ident[EI_VERSION] == EV_CURRENT
789be9f7 4431 ? "(current)"
b34976b6 4432 : (elf_header.e_ident[EI_VERSION] != EV_NONE
2b692964 4433 ? _("<unknown: %lx>")
789be9f7 4434 : "")));
252b5132 4435 printf (_(" OS/ABI: %s\n"),
b34976b6 4436 get_osabi_name (elf_header.e_ident[EI_OSABI]));
252b5132 4437 printf (_(" ABI Version: %d\n"),
b34976b6 4438 elf_header.e_ident[EI_ABIVERSION]);
252b5132
RH
4439 printf (_(" Type: %s\n"),
4440 get_file_type (elf_header.e_type));
4441 printf (_(" Machine: %s\n"),
4442 get_machine_name (elf_header.e_machine));
4443 printf (_(" Version: 0x%lx\n"),
4444 (unsigned long) elf_header.e_version);
76da6bbe 4445
f7a99963
NC
4446 printf (_(" Entry point address: "));
4447 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4448 printf (_("\n Start of program headers: "));
4449 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4450 printf (_(" (bytes into file)\n Start of section headers: "));
4451 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
4452 printf (_(" (bytes into file)\n"));
76da6bbe 4453
252b5132
RH
4454 printf (_(" Flags: 0x%lx%s\n"),
4455 (unsigned long) elf_header.e_flags,
4456 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
4457 printf (_(" Size of this header: %ld (bytes)\n"),
4458 (long) elf_header.e_ehsize);
4459 printf (_(" Size of program headers: %ld (bytes)\n"),
4460 (long) elf_header.e_phentsize);
2046a35d 4461 printf (_(" Number of program headers: %ld"),
252b5132 4462 (long) elf_header.e_phnum);
2046a35d
AM
4463 if (section_headers != NULL
4464 && elf_header.e_phnum == PN_XNUM
4465 && section_headers[0].sh_info != 0)
cc5914eb 4466 printf (" (%ld)", (long) section_headers[0].sh_info);
2046a35d 4467 putc ('\n', stdout);
252b5132
RH
4468 printf (_(" Size of section headers: %ld (bytes)\n"),
4469 (long) elf_header.e_shentsize);
560f3c1c 4470 printf (_(" Number of section headers: %ld"),
252b5132 4471 (long) elf_header.e_shnum);
4fbb74a6 4472 if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
560f3c1c
AM
4473 printf (" (%ld)", (long) section_headers[0].sh_size);
4474 putc ('\n', stdout);
4475 printf (_(" Section header string table index: %ld"),
252b5132 4476 (long) elf_header.e_shstrndx);
4fbb74a6
AM
4477 if (section_headers != NULL
4478 && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
72de5009 4479 printf (" (%u)", section_headers[0].sh_link);
15ba6505
AM
4480 else if (elf_header.e_shstrndx != SHN_UNDEF
4481 && elf_header.e_shstrndx >= elf_header.e_shnum)
2b692964 4482 printf (_(" <corrupt: out of range>"));
560f3c1c
AM
4483 putc ('\n', stdout);
4484 }
4485
4486 if (section_headers != NULL)
4487 {
2046a35d
AM
4488 if (elf_header.e_phnum == PN_XNUM
4489 && section_headers[0].sh_info != 0)
4490 elf_header.e_phnum = section_headers[0].sh_info;
4fbb74a6 4491 if (elf_header.e_shnum == SHN_UNDEF)
560f3c1c 4492 elf_header.e_shnum = section_headers[0].sh_size;
4fbb74a6 4493 if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
560f3c1c 4494 elf_header.e_shstrndx = section_headers[0].sh_link;
4fbb74a6 4495 else if (elf_header.e_shstrndx >= elf_header.e_shnum)
0b49d371 4496 elf_header.e_shstrndx = SHN_UNDEF;
560f3c1c
AM
4497 free (section_headers);
4498 section_headers = NULL;
252b5132 4499 }
103f02d3 4500
9ea033b2
NC
4501 return 1;
4502}
4503
e0a31db1 4504static bfd_boolean
91d6fa6a 4505get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
9ea033b2 4506{
2cf0635d
NC
4507 Elf32_External_Phdr * phdrs;
4508 Elf32_External_Phdr * external;
4509 Elf_Internal_Phdr * internal;
b34976b6 4510 unsigned int i;
e0a31db1
NC
4511 unsigned int size = elf_header.e_phentsize;
4512 unsigned int num = elf_header.e_phnum;
4513
4514 /* PR binutils/17531: Cope with unexpected section header sizes. */
4515 if (size == 0 || num == 0)
4516 return FALSE;
4517 if (size < sizeof * phdrs)
4518 {
4519 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4520 return FALSE;
4521 }
4522 if (size > sizeof * phdrs)
4523 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
103f02d3 4524
3f5e193b 4525 phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
e0a31db1
NC
4526 size, num, _("program headers"));
4527 if (phdrs == NULL)
4528 return FALSE;
9ea033b2 4529
91d6fa6a 4530 for (i = 0, internal = pheaders, external = phdrs;
9ea033b2 4531 i < elf_header.e_phnum;
b34976b6 4532 i++, internal++, external++)
252b5132 4533 {
9ea033b2
NC
4534 internal->p_type = BYTE_GET (external->p_type);
4535 internal->p_offset = BYTE_GET (external->p_offset);
4536 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4537 internal->p_paddr = BYTE_GET (external->p_paddr);
4538 internal->p_filesz = BYTE_GET (external->p_filesz);
4539 internal->p_memsz = BYTE_GET (external->p_memsz);
4540 internal->p_flags = BYTE_GET (external->p_flags);
4541 internal->p_align = BYTE_GET (external->p_align);
252b5132
RH
4542 }
4543
9ea033b2 4544 free (phdrs);
e0a31db1 4545 return TRUE;
252b5132
RH
4546}
4547
e0a31db1 4548static bfd_boolean
91d6fa6a 4549get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
9ea033b2 4550{
2cf0635d
NC
4551 Elf64_External_Phdr * phdrs;
4552 Elf64_External_Phdr * external;
4553 Elf_Internal_Phdr * internal;
b34976b6 4554 unsigned int i;
e0a31db1
NC
4555 unsigned int size = elf_header.e_phentsize;
4556 unsigned int num = elf_header.e_phnum;
4557
4558 /* PR binutils/17531: Cope with unexpected section header sizes. */
4559 if (size == 0 || num == 0)
4560 return FALSE;
4561 if (size < sizeof * phdrs)
4562 {
4563 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4564 return FALSE;
4565 }
4566 if (size > sizeof * phdrs)
4567 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
103f02d3 4568
3f5e193b 4569 phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
e0a31db1 4570 size, num, _("program headers"));
a6e9f9df 4571 if (!phdrs)
e0a31db1 4572 return FALSE;
9ea033b2 4573
91d6fa6a 4574 for (i = 0, internal = pheaders, external = phdrs;
9ea033b2 4575 i < elf_header.e_phnum;
b34976b6 4576 i++, internal++, external++)
9ea033b2
NC
4577 {
4578 internal->p_type = BYTE_GET (external->p_type);
4579 internal->p_flags = BYTE_GET (external->p_flags);
66543521
AM
4580 internal->p_offset = BYTE_GET (external->p_offset);
4581 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4582 internal->p_paddr = BYTE_GET (external->p_paddr);
4583 internal->p_filesz = BYTE_GET (external->p_filesz);
4584 internal->p_memsz = BYTE_GET (external->p_memsz);
4585 internal->p_align = BYTE_GET (external->p_align);
9ea033b2
NC
4586 }
4587
4588 free (phdrs);
e0a31db1 4589 return TRUE;
9ea033b2 4590}
252b5132 4591
d93f0186
NC
4592/* Returns 1 if the program headers were read into `program_headers'. */
4593
4594static int
2cf0635d 4595get_program_headers (FILE * file)
d93f0186 4596{
2cf0635d 4597 Elf_Internal_Phdr * phdrs;
d93f0186
NC
4598
4599 /* Check cache of prior read. */
4600 if (program_headers != NULL)
4601 return 1;
4602
3f5e193b
NC
4603 phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
4604 sizeof (Elf_Internal_Phdr));
d93f0186
NC
4605
4606 if (phdrs == NULL)
4607 {
8b73c356
NC
4608 error (_("Out of memory reading %u program headers\n"),
4609 elf_header.e_phnum);
d93f0186
NC
4610 return 0;
4611 }
4612
4613 if (is_32bit_elf
4614 ? get_32bit_program_headers (file, phdrs)
4615 : get_64bit_program_headers (file, phdrs))
4616 {
4617 program_headers = phdrs;
4618 return 1;
4619 }
4620
4621 free (phdrs);
4622 return 0;
4623}
4624
2f62977e
NC
4625/* Returns 1 if the program headers were loaded. */
4626
252b5132 4627static int
2cf0635d 4628process_program_headers (FILE * file)
252b5132 4629{
2cf0635d 4630 Elf_Internal_Phdr * segment;
b34976b6 4631 unsigned int i;
252b5132
RH
4632
4633 if (elf_header.e_phnum == 0)
4634 {
82f2dbf7
NC
4635 /* PR binutils/12467. */
4636 if (elf_header.e_phoff != 0)
4637 warn (_("possibly corrupt ELF header - it has a non-zero program"
9035ed51 4638 " header offset, but no program headers\n"));
82f2dbf7 4639 else if (do_segments)
252b5132 4640 printf (_("\nThere are no program headers in this file.\n"));
2f62977e 4641 return 0;
252b5132
RH
4642 }
4643
4644 if (do_segments && !do_header)
4645 {
f7a99963
NC
4646 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
4647 printf (_("Entry point "));
4648 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4649 printf (_("\nThere are %d program headers, starting at offset "),
4650 elf_header.e_phnum);
4651 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4652 printf ("\n");
252b5132
RH
4653 }
4654
d93f0186 4655 if (! get_program_headers (file))
252b5132 4656 return 0;
103f02d3 4657
252b5132
RH
4658 if (do_segments)
4659 {
3a1a2036
NC
4660 if (elf_header.e_phnum > 1)
4661 printf (_("\nProgram Headers:\n"));
4662 else
4663 printf (_("\nProgram Headers:\n"));
76da6bbe 4664
f7a99963
NC
4665 if (is_32bit_elf)
4666 printf
4667 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
d974e256
JJ
4668 else if (do_wide)
4669 printf
4670 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
f7a99963
NC
4671 else
4672 {
4673 printf
4674 (_(" Type Offset VirtAddr PhysAddr\n"));
4675 printf
4676 (_(" FileSiz MemSiz Flags Align\n"));
4677 }
252b5132
RH
4678 }
4679
252b5132 4680 dynamic_addr = 0;
1b228002 4681 dynamic_size = 0;
252b5132
RH
4682
4683 for (i = 0, segment = program_headers;
4684 i < elf_header.e_phnum;
b34976b6 4685 i++, segment++)
252b5132
RH
4686 {
4687 if (do_segments)
4688 {
103f02d3 4689 printf (" %-14.14s ", get_segment_type (segment->p_type));
f7a99963
NC
4690
4691 if (is_32bit_elf)
4692 {
4693 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4694 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
4695 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
4696 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
4697 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
4698 printf ("%c%c%c ",
4699 (segment->p_flags & PF_R ? 'R' : ' '),
4700 (segment->p_flags & PF_W ? 'W' : ' '),
4701 (segment->p_flags & PF_X ? 'E' : ' '));
4702 printf ("%#lx", (unsigned long) segment->p_align);
4703 }
d974e256
JJ
4704 else if (do_wide)
4705 {
4706 if ((unsigned long) segment->p_offset == segment->p_offset)
4707 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4708 else
4709 {
4710 print_vma (segment->p_offset, FULL_HEX);
4711 putchar (' ');
4712 }
4713
4714 print_vma (segment->p_vaddr, FULL_HEX);
4715 putchar (' ');
4716 print_vma (segment->p_paddr, FULL_HEX);
4717 putchar (' ');
4718
4719 if ((unsigned long) segment->p_filesz == segment->p_filesz)
4720 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
4721 else
4722 {
4723 print_vma (segment->p_filesz, FULL_HEX);
4724 putchar (' ');
4725 }
4726
4727 if ((unsigned long) segment->p_memsz == segment->p_memsz)
4728 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
4729 else
4730 {
f48e6c45 4731 print_vma (segment->p_memsz, FULL_HEX);
d974e256
JJ
4732 }
4733
4734 printf (" %c%c%c ",
4735 (segment->p_flags & PF_R ? 'R' : ' '),
4736 (segment->p_flags & PF_W ? 'W' : ' '),
4737 (segment->p_flags & PF_X ? 'E' : ' '));
4738
4739 if ((unsigned long) segment->p_align == segment->p_align)
4740 printf ("%#lx", (unsigned long) segment->p_align);
4741 else
4742 {
4743 print_vma (segment->p_align, PREFIX_HEX);
4744 }
4745 }
f7a99963
NC
4746 else
4747 {
4748 print_vma (segment->p_offset, FULL_HEX);
4749 putchar (' ');
4750 print_vma (segment->p_vaddr, FULL_HEX);
4751 putchar (' ');
4752 print_vma (segment->p_paddr, FULL_HEX);
4753 printf ("\n ");
4754 print_vma (segment->p_filesz, FULL_HEX);
4755 putchar (' ');
4756 print_vma (segment->p_memsz, FULL_HEX);
4757 printf (" %c%c%c ",
4758 (segment->p_flags & PF_R ? 'R' : ' '),
4759 (segment->p_flags & PF_W ? 'W' : ' '),
4760 (segment->p_flags & PF_X ? 'E' : ' '));
4761 print_vma (segment->p_align, HEX);
4762 }
252b5132
RH
4763 }
4764
f54498b4
NC
4765 if (do_segments)
4766 putc ('\n', stdout);
4767
252b5132
RH
4768 switch (segment->p_type)
4769 {
252b5132
RH
4770 case PT_DYNAMIC:
4771 if (dynamic_addr)
4772 error (_("more than one dynamic segment\n"));
4773
20737c13
AM
4774 /* By default, assume that the .dynamic section is the first
4775 section in the DYNAMIC segment. */
4776 dynamic_addr = segment->p_offset;
4777 dynamic_size = segment->p_filesz;
f54498b4
NC
4778 /* PR binutils/17512: Avoid corrupt dynamic section info in the segment. */
4779 if (dynamic_addr + dynamic_size >= current_file_size)
4780 {
4781 error (_("the dynamic segment offset + size exceeds the size of the file\n"));
4782 dynamic_addr = dynamic_size = 0;
4783 }
20737c13 4784
b2d38a17
NC
4785 /* Try to locate the .dynamic section. If there is
4786 a section header table, we can easily locate it. */
4787 if (section_headers != NULL)
4788 {
2cf0635d 4789 Elf_Internal_Shdr * sec;
b2d38a17 4790
89fac5e3
RS
4791 sec = find_section (".dynamic");
4792 if (sec == NULL || sec->sh_size == 0)
b2d38a17 4793 {
28f997cf
TG
4794 /* A corresponding .dynamic section is expected, but on
4795 IA-64/OpenVMS it is OK for it to be missing. */
4796 if (!is_ia64_vms ())
4797 error (_("no .dynamic section in the dynamic segment\n"));
b2d38a17
NC
4798 break;
4799 }
4800
42bb2e33 4801 if (sec->sh_type == SHT_NOBITS)
20737c13
AM
4802 {
4803 dynamic_size = 0;
4804 break;
4805 }
42bb2e33 4806
b2d38a17
NC
4807 dynamic_addr = sec->sh_offset;
4808 dynamic_size = sec->sh_size;
4809
4810 if (dynamic_addr < segment->p_offset
4811 || dynamic_addr > segment->p_offset + segment->p_filesz)
20737c13
AM
4812 warn (_("the .dynamic section is not contained"
4813 " within the dynamic segment\n"));
b2d38a17 4814 else if (dynamic_addr > segment->p_offset)
20737c13
AM
4815 warn (_("the .dynamic section is not the first section"
4816 " in the dynamic segment.\n"));
b2d38a17 4817 }
252b5132
RH
4818 break;
4819
4820 case PT_INTERP:
fb52b2f4
NC
4821 if (fseek (file, archive_file_offset + (long) segment->p_offset,
4822 SEEK_SET))
252b5132
RH
4823 error (_("Unable to find program interpreter name\n"));
4824 else
4825 {
f8eae8b2 4826 char fmt [32];
9495b2e6 4827 int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
f8eae8b2
L
4828
4829 if (ret >= (int) sizeof (fmt) || ret < 0)
591a748a 4830 error (_("Internal error: failed to create format string to display program interpreter\n"));
f8eae8b2 4831
252b5132 4832 program_interpreter[0] = 0;
7bd7b3ef
AM
4833 if (fscanf (file, fmt, program_interpreter) <= 0)
4834 error (_("Unable to read program interpreter name\n"));
252b5132
RH
4835
4836 if (do_segments)
f54498b4 4837 printf (_(" [Requesting program interpreter: %s]\n"),
252b5132
RH
4838 program_interpreter);
4839 }
4840 break;
4841 }
252b5132
RH
4842 }
4843
c256ffe7 4844 if (do_segments && section_headers != NULL && string_table != NULL)
252b5132
RH
4845 {
4846 printf (_("\n Section to Segment mapping:\n"));
4847 printf (_(" Segment Sections...\n"));
4848
252b5132
RH
4849 for (i = 0; i < elf_header.e_phnum; i++)
4850 {
9ad5cbcf 4851 unsigned int j;
2cf0635d 4852 Elf_Internal_Shdr * section;
252b5132
RH
4853
4854 segment = program_headers + i;
b391a3e3 4855 section = section_headers + 1;
252b5132
RH
4856
4857 printf (" %2.2d ", i);
4858
b34976b6 4859 for (j = 1; j < elf_header.e_shnum; j++, section++)
252b5132 4860 {
f4638467
AM
4861 if (!ELF_TBSS_SPECIAL (section, segment)
4862 && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
74e1a04b 4863 printf ("%s ", printable_section_name (section));
252b5132
RH
4864 }
4865
4866 putc ('\n',stdout);
4867 }
4868 }
4869
252b5132
RH
4870 return 1;
4871}
4872
4873
d93f0186
NC
4874/* Find the file offset corresponding to VMA by using the program headers. */
4875
4876static long
2cf0635d 4877offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
d93f0186 4878{
2cf0635d 4879 Elf_Internal_Phdr * seg;
d93f0186
NC
4880
4881 if (! get_program_headers (file))
4882 {
4883 warn (_("Cannot interpret virtual addresses without program headers.\n"));
4884 return (long) vma;
4885 }
4886
4887 for (seg = program_headers;
4888 seg < program_headers + elf_header.e_phnum;
4889 ++seg)
4890 {
4891 if (seg->p_type != PT_LOAD)
4892 continue;
4893
4894 if (vma >= (seg->p_vaddr & -seg->p_align)
4895 && vma + size <= seg->p_vaddr + seg->p_filesz)
4896 return vma - seg->p_vaddr + seg->p_offset;
4897 }
4898
4899 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
0af1713e 4900 (unsigned long) vma);
d93f0186
NC
4901 return (long) vma;
4902}
4903
4904
049b0c3a
NC
4905/* Allocate memory and load the sections headers into the global pointer
4906 SECTION_HEADERS. If PROBE is true, this is just a probe and we do not
4907 generate any error messages if the load fails. */
4908
4909static bfd_boolean
4910get_32bit_section_headers (FILE * file, bfd_boolean probe)
252b5132 4911{
2cf0635d
NC
4912 Elf32_External_Shdr * shdrs;
4913 Elf_Internal_Shdr * internal;
b34976b6 4914 unsigned int i;
049b0c3a
NC
4915 unsigned int size = elf_header.e_shentsize;
4916 unsigned int num = probe ? 1 : elf_header.e_shnum;
4917
4918 /* PR binutils/17531: Cope with unexpected section header sizes. */
4919 if (size == 0 || num == 0)
4920 return FALSE;
4921 if (size < sizeof * shdrs)
4922 {
4923 if (! probe)
4924 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
4925 return FALSE;
4926 }
4927 if (!probe && size > sizeof * shdrs)
4928 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
252b5132 4929
3f5e193b 4930 shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
049b0c3a
NC
4931 size, num,
4932 probe ? NULL : _("section headers"));
4933 if (shdrs == NULL)
4934 return FALSE;
252b5132 4935
049b0c3a
NC
4936 if (section_headers != NULL)
4937 free (section_headers);
3f5e193b
NC
4938 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4939 sizeof (Elf_Internal_Shdr));
252b5132
RH
4940 if (section_headers == NULL)
4941 {
049b0c3a 4942 if (!probe)
8b73c356 4943 error (_("Out of memory reading %u section headers\n"), num);
049b0c3a 4944 return FALSE;
252b5132
RH
4945 }
4946
4947 for (i = 0, internal = section_headers;
560f3c1c 4948 i < num;
b34976b6 4949 i++, internal++)
252b5132
RH
4950 {
4951 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
4952 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
4953 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
4954 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
4955 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
4956 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
4957 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
4958 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
4959 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4960 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
4961 }
4962
4963 free (shdrs);
049b0c3a 4964 return TRUE;
252b5132
RH
4965}
4966
049b0c3a
NC
4967static bfd_boolean
4968get_64bit_section_headers (FILE * file, bfd_boolean probe)
9ea033b2 4969{
2cf0635d
NC
4970 Elf64_External_Shdr * shdrs;
4971 Elf_Internal_Shdr * internal;
b34976b6 4972 unsigned int i;
049b0c3a
NC
4973 unsigned int size = elf_header.e_shentsize;
4974 unsigned int num = probe ? 1 : elf_header.e_shnum;
4975
4976 /* PR binutils/17531: Cope with unexpected section header sizes. */
4977 if (size == 0 || num == 0)
4978 return FALSE;
4979 if (size < sizeof * shdrs)
4980 {
4981 if (! probe)
4982 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
4983 return FALSE;
4984 }
4985 if (! probe && size > sizeof * shdrs)
4986 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
9ea033b2 4987
3f5e193b 4988 shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
049b0c3a
NC
4989 size, num,
4990 probe ? NULL : _("section headers"));
4991 if (shdrs == NULL)
4992 return FALSE;
9ea033b2 4993
049b0c3a
NC
4994 if (section_headers != NULL)
4995 free (section_headers);
3f5e193b
NC
4996 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4997 sizeof (Elf_Internal_Shdr));
9ea033b2
NC
4998 if (section_headers == NULL)
4999 {
049b0c3a 5000 if (! probe)
8b73c356 5001 error (_("Out of memory reading %u section headers\n"), num);
049b0c3a 5002 return FALSE;
9ea033b2
NC
5003 }
5004
5005 for (i = 0, internal = section_headers;
560f3c1c 5006 i < num;
b34976b6 5007 i++, internal++)
9ea033b2
NC
5008 {
5009 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5010 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
66543521
AM
5011 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5012 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5013 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5014 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
9ea033b2
NC
5015 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5016 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5017 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5018 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5019 }
5020
5021 free (shdrs);
049b0c3a 5022 return TRUE;
9ea033b2
NC
5023}
5024
252b5132 5025static Elf_Internal_Sym *
ba5cdace
NC
5026get_32bit_elf_symbols (FILE * file,
5027 Elf_Internal_Shdr * section,
5028 unsigned long * num_syms_return)
252b5132 5029{
ba5cdace 5030 unsigned long number = 0;
dd24e3da 5031 Elf32_External_Sym * esyms = NULL;
ba5cdace 5032 Elf_External_Sym_Shndx * shndx = NULL;
dd24e3da 5033 Elf_Internal_Sym * isyms = NULL;
2cf0635d 5034 Elf_Internal_Sym * psym;
b34976b6 5035 unsigned int j;
252b5132 5036
c9c1d674
EG
5037 if (section->sh_size == 0)
5038 {
5039 if (num_syms_return != NULL)
5040 * num_syms_return = 0;
5041 return NULL;
5042 }
5043
dd24e3da 5044 /* Run some sanity checks first. */
c9c1d674 5045 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
dd24e3da 5046 {
c9c1d674
EG
5047 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5048 printable_section_name (section), (unsigned long) section->sh_entsize);
ba5cdace 5049 goto exit_point;
dd24e3da
NC
5050 }
5051
f54498b4
NC
5052 if (section->sh_size > current_file_size)
5053 {
5054 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
74e1a04b 5055 printable_section_name (section), (unsigned long) section->sh_size);
f54498b4
NC
5056 goto exit_point;
5057 }
5058
dd24e3da
NC
5059 number = section->sh_size / section->sh_entsize;
5060
5061 if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
5062 {
c9c1d674 5063 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
8066deb1
AM
5064 (unsigned long) section->sh_size,
5065 printable_section_name (section),
5066 (unsigned long) section->sh_entsize);
ba5cdace 5067 goto exit_point;
dd24e3da
NC
5068 }
5069
3f5e193b
NC
5070 esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5071 section->sh_size, _("symbols"));
dd24e3da 5072 if (esyms == NULL)
ba5cdace 5073 goto exit_point;
252b5132 5074
6a40cf0c
NC
5075 {
5076 elf_section_list * entry;
5077
5078 shndx = NULL;
5079 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5080 if (entry->hdr->sh_link == (unsigned long) (section - section_headers))
c9c1d674 5081 {
6a40cf0c
NC
5082 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5083 entry->hdr->sh_offset,
5084 1, entry->hdr->sh_size,
5085 _("symbol table section indicies"));
5086 if (shndx == NULL)
5087 goto exit_point;
5088 /* PR17531: file: heap-buffer-overflow */
5089 else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5090 {
5091 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5092 printable_section_name (entry->hdr),
5093 (unsigned long) entry->hdr->sh_size,
5094 (unsigned long) section->sh_size);
5095 goto exit_point;
5096 }
c9c1d674 5097 }
6a40cf0c 5098 }
9ad5cbcf 5099
3f5e193b 5100 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
252b5132
RH
5101
5102 if (isyms == NULL)
5103 {
8b73c356
NC
5104 error (_("Out of memory reading %lu symbols\n"),
5105 (unsigned long) number);
dd24e3da 5106 goto exit_point;
252b5132
RH
5107 }
5108
dd24e3da 5109 for (j = 0, psym = isyms; j < number; j++, psym++)
252b5132
RH
5110 {
5111 psym->st_name = BYTE_GET (esyms[j].st_name);
5112 psym->st_value = BYTE_GET (esyms[j].st_value);
5113 psym->st_size = BYTE_GET (esyms[j].st_size);
5114 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4fbb74a6 5115 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
9ad5cbcf
AM
5116 psym->st_shndx
5117 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4fbb74a6
AM
5118 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5119 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
252b5132
RH
5120 psym->st_info = BYTE_GET (esyms[j].st_info);
5121 psym->st_other = BYTE_GET (esyms[j].st_other);
5122 }
5123
dd24e3da 5124 exit_point:
ba5cdace 5125 if (shndx != NULL)
9ad5cbcf 5126 free (shndx);
ba5cdace 5127 if (esyms != NULL)
dd24e3da 5128 free (esyms);
252b5132 5129
ba5cdace
NC
5130 if (num_syms_return != NULL)
5131 * num_syms_return = isyms == NULL ? 0 : number;
5132
252b5132
RH
5133 return isyms;
5134}
5135
9ea033b2 5136static Elf_Internal_Sym *
ba5cdace
NC
5137get_64bit_elf_symbols (FILE * file,
5138 Elf_Internal_Shdr * section,
5139 unsigned long * num_syms_return)
9ea033b2 5140{
ba5cdace
NC
5141 unsigned long number = 0;
5142 Elf64_External_Sym * esyms = NULL;
5143 Elf_External_Sym_Shndx * shndx = NULL;
5144 Elf_Internal_Sym * isyms = NULL;
2cf0635d 5145 Elf_Internal_Sym * psym;
b34976b6 5146 unsigned int j;
9ea033b2 5147
c9c1d674
EG
5148 if (section->sh_size == 0)
5149 {
5150 if (num_syms_return != NULL)
5151 * num_syms_return = 0;
5152 return NULL;
5153 }
5154
dd24e3da 5155 /* Run some sanity checks first. */
c9c1d674 5156 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
dd24e3da 5157 {
c9c1d674 5158 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
8066deb1
AM
5159 printable_section_name (section),
5160 (unsigned long) section->sh_entsize);
ba5cdace 5161 goto exit_point;
dd24e3da
NC
5162 }
5163
f54498b4
NC
5164 if (section->sh_size > current_file_size)
5165 {
5166 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
8066deb1
AM
5167 printable_section_name (section),
5168 (unsigned long) section->sh_size);
f54498b4
NC
5169 goto exit_point;
5170 }
5171
dd24e3da
NC
5172 number = section->sh_size / section->sh_entsize;
5173
5174 if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5175 {
c9c1d674 5176 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
8066deb1
AM
5177 (unsigned long) section->sh_size,
5178 printable_section_name (section),
5179 (unsigned long) section->sh_entsize);
ba5cdace 5180 goto exit_point;
dd24e3da
NC
5181 }
5182
3f5e193b
NC
5183 esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5184 section->sh_size, _("symbols"));
a6e9f9df 5185 if (!esyms)
ba5cdace 5186 goto exit_point;
9ea033b2 5187
6a40cf0c
NC
5188 {
5189 elf_section_list * entry;
5190
5191 shndx = NULL;
5192 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5193 if (entry->hdr->sh_link == (unsigned long) (section - section_headers))
c9c1d674 5194 {
6a40cf0c
NC
5195 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5196 entry->hdr->sh_offset,
5197 1, entry->hdr->sh_size,
5198 _("symbol table section indicies"));
5199 if (shndx == NULL)
5200 goto exit_point;
5201 /* PR17531: file: heap-buffer-overflow */
5202 else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5203 {
5204 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5205 printable_section_name (entry->hdr),
5206 (unsigned long) entry->hdr->sh_size,
5207 (unsigned long) section->sh_size);
5208 goto exit_point;
5209 }
c9c1d674 5210 }
6a40cf0c 5211 }
9ad5cbcf 5212
3f5e193b 5213 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
9ea033b2
NC
5214
5215 if (isyms == NULL)
5216 {
8b73c356
NC
5217 error (_("Out of memory reading %lu symbols\n"),
5218 (unsigned long) number);
ba5cdace 5219 goto exit_point;
9ea033b2
NC
5220 }
5221
ba5cdace 5222 for (j = 0, psym = isyms; j < number; j++, psym++)
9ea033b2
NC
5223 {
5224 psym->st_name = BYTE_GET (esyms[j].st_name);
5225 psym->st_info = BYTE_GET (esyms[j].st_info);
5226 psym->st_other = BYTE_GET (esyms[j].st_other);
5227 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
ba5cdace 5228
4fbb74a6 5229 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
9ad5cbcf
AM
5230 psym->st_shndx
5231 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4fbb74a6
AM
5232 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5233 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
ba5cdace 5234
66543521
AM
5235 psym->st_value = BYTE_GET (esyms[j].st_value);
5236 psym->st_size = BYTE_GET (esyms[j].st_size);
9ea033b2
NC
5237 }
5238
ba5cdace
NC
5239 exit_point:
5240 if (shndx != NULL)
9ad5cbcf 5241 free (shndx);
ba5cdace
NC
5242 if (esyms != NULL)
5243 free (esyms);
5244
5245 if (num_syms_return != NULL)
5246 * num_syms_return = isyms == NULL ? 0 : number;
9ea033b2
NC
5247
5248 return isyms;
5249}
5250
d1133906 5251static const char *
d3ba0551 5252get_elf_section_flags (bfd_vma sh_flags)
d1133906 5253{
5477e8a0 5254 static char buff[1024];
2cf0635d 5255 char * p = buff;
8d5ff12c 5256 int field_size = is_32bit_elf ? 8 : 16;
91d6fa6a
NC
5257 int sindex;
5258 int size = sizeof (buff) - (field_size + 4 + 1);
8d5ff12c
L
5259 bfd_vma os_flags = 0;
5260 bfd_vma proc_flags = 0;
5261 bfd_vma unknown_flags = 0;
148b93f2 5262 static const struct
5477e8a0 5263 {
2cf0635d 5264 const char * str;
5477e8a0
L
5265 int len;
5266 }
5267 flags [] =
5268 {
cfcac11d
NC
5269 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
5270 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
5271 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
5272 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
5273 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
5274 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
5275 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5276 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5277 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
5278 /* 9 */ { STRING_COMMA_LEN ("TLS") },
5279 /* IA-64 specific. */
5280 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5281 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5282 /* IA-64 OpenVMS specific. */
5283 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5284 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5285 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5286 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5287 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5288 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
18ae9cc1 5289 /* Generic. */
cfcac11d 5290 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
18ae9cc1 5291 /* SPARC specific. */
77115a4a 5292 /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
ac4c9b04
MG
5293 /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5294 /* ARM specific. */
5295 /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
5296 /* 22 */ { STRING_COMMA_LEN ("ARM_NOREAD") },
5297 /* 23 */ { STRING_COMMA_LEN ("COMDEF") }
5477e8a0
L
5298 };
5299
5300 if (do_section_details)
5301 {
8d5ff12c
L
5302 sprintf (buff, "[%*.*lx]: ",
5303 field_size, field_size, (unsigned long) sh_flags);
5304 p += field_size + 4;
5477e8a0 5305 }
76da6bbe 5306
d1133906
NC
5307 while (sh_flags)
5308 {
5309 bfd_vma flag;
5310
5311 flag = sh_flags & - sh_flags;
5312 sh_flags &= ~ flag;
76da6bbe 5313
5477e8a0 5314 if (do_section_details)
d1133906 5315 {
5477e8a0
L
5316 switch (flag)
5317 {
91d6fa6a
NC
5318 case SHF_WRITE: sindex = 0; break;
5319 case SHF_ALLOC: sindex = 1; break;
5320 case SHF_EXECINSTR: sindex = 2; break;
5321 case SHF_MERGE: sindex = 3; break;
5322 case SHF_STRINGS: sindex = 4; break;
5323 case SHF_INFO_LINK: sindex = 5; break;
5324 case SHF_LINK_ORDER: sindex = 6; break;
5325 case SHF_OS_NONCONFORMING: sindex = 7; break;
5326 case SHF_GROUP: sindex = 8; break;
5327 case SHF_TLS: sindex = 9; break;
18ae9cc1 5328 case SHF_EXCLUDE: sindex = 18; break;
77115a4a 5329 case SHF_COMPRESSED: sindex = 20; break;
76da6bbe 5330
5477e8a0 5331 default:
91d6fa6a 5332 sindex = -1;
cfcac11d 5333 switch (elf_header.e_machine)
148b93f2 5334 {
cfcac11d 5335 case EM_IA_64:
148b93f2 5336 if (flag == SHF_IA_64_SHORT)
91d6fa6a 5337 sindex = 10;
148b93f2 5338 else if (flag == SHF_IA_64_NORECOV)
91d6fa6a 5339 sindex = 11;
148b93f2
NC
5340#ifdef BFD64
5341 else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5342 switch (flag)
5343 {
91d6fa6a
NC
5344 case SHF_IA_64_VMS_GLOBAL: sindex = 12; break;
5345 case SHF_IA_64_VMS_OVERLAID: sindex = 13; break;
5346 case SHF_IA_64_VMS_SHARED: sindex = 14; break;
5347 case SHF_IA_64_VMS_VECTOR: sindex = 15; break;
5348 case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5349 case SHF_IA_64_VMS_PROTECTED: sindex = 17; break;
148b93f2
NC
5350 default: break;
5351 }
5352#endif
cfcac11d
NC
5353 break;
5354
caa83f8b 5355 case EM_386:
22abe556 5356 case EM_IAMCU:
caa83f8b 5357 case EM_X86_64:
7f502d6c 5358 case EM_L1OM:
7a9068fe 5359 case EM_K1OM:
cfcac11d
NC
5360 case EM_OLD_SPARCV9:
5361 case EM_SPARC32PLUS:
5362 case EM_SPARCV9:
5363 case EM_SPARC:
18ae9cc1 5364 if (flag == SHF_ORDERED)
91d6fa6a 5365 sindex = 19;
cfcac11d 5366 break;
ac4c9b04
MG
5367
5368 case EM_ARM:
5369 switch (flag)
5370 {
5371 case SHF_ENTRYSECT: sindex = 21; break;
5372 case SHF_ARM_NOREAD: sindex = 22; break;
5373 case SHF_COMDEF: sindex = 23; break;
5374 default: break;
5375 }
5376 break;
5377
cfcac11d
NC
5378 default:
5379 break;
148b93f2 5380 }
5477e8a0
L
5381 }
5382
91d6fa6a 5383 if (sindex != -1)
5477e8a0 5384 {
8d5ff12c
L
5385 if (p != buff + field_size + 4)
5386 {
5387 if (size < (10 + 2))
bee0ee85
NC
5388 {
5389 warn (_("Internal error: not enough buffer room for section flag info"));
5390 return _("<unknown>");
5391 }
8d5ff12c
L
5392 size -= 2;
5393 *p++ = ',';
5394 *p++ = ' ';
5395 }
5396
91d6fa6a
NC
5397 size -= flags [sindex].len;
5398 p = stpcpy (p, flags [sindex].str);
5477e8a0 5399 }
3b22753a 5400 else if (flag & SHF_MASKOS)
8d5ff12c 5401 os_flags |= flag;
d1133906 5402 else if (flag & SHF_MASKPROC)
8d5ff12c 5403 proc_flags |= flag;
d1133906 5404 else
8d5ff12c 5405 unknown_flags |= flag;
5477e8a0
L
5406 }
5407 else
5408 {
5409 switch (flag)
5410 {
5411 case SHF_WRITE: *p = 'W'; break;
5412 case SHF_ALLOC: *p = 'A'; break;
5413 case SHF_EXECINSTR: *p = 'X'; break;
5414 case SHF_MERGE: *p = 'M'; break;
5415 case SHF_STRINGS: *p = 'S'; break;
5416 case SHF_INFO_LINK: *p = 'I'; break;
5417 case SHF_LINK_ORDER: *p = 'L'; break;
5418 case SHF_OS_NONCONFORMING: *p = 'O'; break;
5419 case SHF_GROUP: *p = 'G'; break;
5420 case SHF_TLS: *p = 'T'; break;
18ae9cc1 5421 case SHF_EXCLUDE: *p = 'E'; break;
77115a4a 5422 case SHF_COMPRESSED: *p = 'C'; break;
5477e8a0
L
5423
5424 default:
8a9036a4 5425 if ((elf_header.e_machine == EM_X86_64
7a9068fe
L
5426 || elf_header.e_machine == EM_L1OM
5427 || elf_header.e_machine == EM_K1OM)
5477e8a0
L
5428 && flag == SHF_X86_64_LARGE)
5429 *p = 'l';
91f68a68
MG
5430 else if (elf_header.e_machine == EM_ARM
5431 && flag == SHF_ARM_NOREAD)
5432 *p = 'y';
5477e8a0
L
5433 else if (flag & SHF_MASKOS)
5434 {
5435 *p = 'o';
5436 sh_flags &= ~ SHF_MASKOS;
5437 }
5438 else if (flag & SHF_MASKPROC)
5439 {
5440 *p = 'p';
5441 sh_flags &= ~ SHF_MASKPROC;
5442 }
5443 else
5444 *p = 'x';
5445 break;
5446 }
5447 p++;
d1133906
NC
5448 }
5449 }
76da6bbe 5450
8d5ff12c
L
5451 if (do_section_details)
5452 {
5453 if (os_flags)
5454 {
5455 size -= 5 + field_size;
5456 if (p != buff + field_size + 4)
5457 {
5458 if (size < (2 + 1))
bee0ee85
NC
5459 {
5460 warn (_("Internal error: not enough buffer room for section flag info"));
5461 return _("<unknown>");
5462 }
8d5ff12c
L
5463 size -= 2;
5464 *p++ = ',';
5465 *p++ = ' ';
5466 }
5467 sprintf (p, "OS (%*.*lx)", field_size, field_size,
5468 (unsigned long) os_flags);
5469 p += 5 + field_size;
5470 }
5471 if (proc_flags)
5472 {
5473 size -= 7 + field_size;
5474 if (p != buff + field_size + 4)
5475 {
5476 if (size < (2 + 1))
bee0ee85
NC
5477 {
5478 warn (_("Internal error: not enough buffer room for section flag info"));
5479 return _("<unknown>");
5480 }
8d5ff12c
L
5481 size -= 2;
5482 *p++ = ',';
5483 *p++ = ' ';
5484 }
5485 sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5486 (unsigned long) proc_flags);
5487 p += 7 + field_size;
5488 }
5489 if (unknown_flags)
5490 {
5491 size -= 10 + field_size;
5492 if (p != buff + field_size + 4)
5493 {
5494 if (size < (2 + 1))
bee0ee85
NC
5495 {
5496 warn (_("Internal error: not enough buffer room for section flag info"));
5497 return _("<unknown>");
5498 }
8d5ff12c
L
5499 size -= 2;
5500 *p++ = ',';
5501 *p++ = ' ';
5502 }
2b692964 5503 sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
8d5ff12c
L
5504 (unsigned long) unknown_flags);
5505 p += 10 + field_size;
5506 }
5507 }
5508
e9e44622 5509 *p = '\0';
d1133906
NC
5510 return buff;
5511}
5512
77115a4a
L
5513static unsigned int
5514get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf)
5515{
5516 if (is_32bit_elf)
5517 {
5518 Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
5519 chdr->ch_type = BYTE_GET (echdr->ch_type);
5520 chdr->ch_size = BYTE_GET (echdr->ch_size);
5521 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5522 return sizeof (*echdr);
5523 }
5524 else
5525 {
5526 Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) buf;
5527 chdr->ch_type = BYTE_GET (echdr->ch_type);
5528 chdr->ch_size = BYTE_GET (echdr->ch_size);
5529 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5530 return sizeof (*echdr);
5531 }
5532}
5533
252b5132 5534static int
2cf0635d 5535process_section_headers (FILE * file)
252b5132 5536{
2cf0635d 5537 Elf_Internal_Shdr * section;
b34976b6 5538 unsigned int i;
252b5132
RH
5539
5540 section_headers = NULL;
5541
5542 if (elf_header.e_shnum == 0)
5543 {
82f2dbf7
NC
5544 /* PR binutils/12467. */
5545 if (elf_header.e_shoff != 0)
5546 warn (_("possibly corrupt ELF file header - it has a non-zero"
5547 " section header offset, but no section headers\n"));
5548 else if (do_sections)
252b5132
RH
5549 printf (_("\nThere are no sections in this file.\n"));
5550
5551 return 1;
5552 }
5553
5554 if (do_sections && !do_header)
9ea033b2 5555 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
252b5132
RH
5556 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
5557
9ea033b2
NC
5558 if (is_32bit_elf)
5559 {
049b0c3a 5560 if (! get_32bit_section_headers (file, FALSE))
9ea033b2
NC
5561 return 0;
5562 }
049b0c3a 5563 else if (! get_64bit_section_headers (file, FALSE))
252b5132
RH
5564 return 0;
5565
5566 /* Read in the string table, so that we have names to display. */
0b49d371 5567 if (elf_header.e_shstrndx != SHN_UNDEF
4fbb74a6 5568 && elf_header.e_shstrndx < elf_header.e_shnum)
252b5132 5569 {
4fbb74a6 5570 section = section_headers + elf_header.e_shstrndx;
d40ac9bd 5571
c256ffe7
JJ
5572 if (section->sh_size != 0)
5573 {
3f5e193b
NC
5574 string_table = (char *) get_data (NULL, file, section->sh_offset,
5575 1, section->sh_size,
5576 _("string table"));
0de14b54 5577
c256ffe7
JJ
5578 string_table_length = string_table != NULL ? section->sh_size : 0;
5579 }
252b5132
RH
5580 }
5581
5582 /* Scan the sections for the dynamic symbol table
e3c8793a 5583 and dynamic string table and debug sections. */
252b5132
RH
5584 dynamic_symbols = NULL;
5585 dynamic_strings = NULL;
5586 dynamic_syminfo = NULL;
6a40cf0c 5587 symtab_shndx_list = NULL;
103f02d3 5588
89fac5e3
RS
5589 eh_addr_size = is_32bit_elf ? 4 : 8;
5590 switch (elf_header.e_machine)
5591 {
5592 case EM_MIPS:
5593 case EM_MIPS_RS3_LE:
5594 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
5595 FDE addresses. However, the ABI also has a semi-official ILP32
5596 variant for which the normal FDE address size rules apply.
5597
5598 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
5599 section, where XX is the size of longs in bits. Unfortunately,
5600 earlier compilers provided no way of distinguishing ILP32 objects
5601 from LP64 objects, so if there's any doubt, we should assume that
5602 the official LP64 form is being used. */
5603 if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
5604 && find_section (".gcc_compiled_long32") == NULL)
5605 eh_addr_size = 8;
5606 break;
0f56a26a
DD
5607
5608 case EM_H8_300:
5609 case EM_H8_300H:
5610 switch (elf_header.e_flags & EF_H8_MACH)
5611 {
5612 case E_H8_MACH_H8300:
5613 case E_H8_MACH_H8300HN:
5614 case E_H8_MACH_H8300SN:
5615 case E_H8_MACH_H8300SXN:
5616 eh_addr_size = 2;
5617 break;
5618 case E_H8_MACH_H8300H:
5619 case E_H8_MACH_H8300S:
5620 case E_H8_MACH_H8300SX:
5621 eh_addr_size = 4;
5622 break;
5623 }
f4236fe4
DD
5624 break;
5625
ff7eeb89 5626 case EM_M32C_OLD:
f4236fe4
DD
5627 case EM_M32C:
5628 switch (elf_header.e_flags & EF_M32C_CPU_MASK)
5629 {
5630 case EF_M32C_CPU_M16C:
5631 eh_addr_size = 2;
5632 break;
5633 }
5634 break;
89fac5e3
RS
5635 }
5636
76ca31c0
NC
5637#define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
5638 do \
5639 { \
5640 bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64; \
5641 if (section->sh_entsize != expected_entsize) \
9dd3a467 5642 { \
76ca31c0
NC
5643 char buf[40]; \
5644 sprintf_vma (buf, section->sh_entsize); \
5645 /* Note: coded this way so that there is a single string for \
5646 translation. */ \
5647 error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
5648 error (_("(Using the expected size of %u for the rest of this dump)\n"), \
5649 (unsigned) expected_entsize); \
9dd3a467 5650 section->sh_entsize = expected_entsize; \
76ca31c0
NC
5651 } \
5652 } \
08d8fa11 5653 while (0)
9dd3a467
NC
5654
5655#define CHECK_ENTSIZE(section, i, type) \
08d8fa11
JJ
5656 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
5657 sizeof (Elf64_External_##type))
5658
252b5132
RH
5659 for (i = 0, section = section_headers;
5660 i < elf_header.e_shnum;
b34976b6 5661 i++, section++)
252b5132 5662 {
2cf0635d 5663 char * name = SECTION_NAME (section);
252b5132
RH
5664
5665 if (section->sh_type == SHT_DYNSYM)
5666 {
5667 if (dynamic_symbols != NULL)
5668 {
5669 error (_("File contains multiple dynamic symbol tables\n"));
5670 continue;
5671 }
5672
08d8fa11 5673 CHECK_ENTSIZE (section, i, Sym);
ba5cdace 5674 dynamic_symbols = GET_ELF_SYMBOLS (file, section, & num_dynamic_syms);
252b5132
RH
5675 }
5676 else if (section->sh_type == SHT_STRTAB
18bd398b 5677 && streq (name, ".dynstr"))
252b5132
RH
5678 {
5679 if (dynamic_strings != NULL)
5680 {
5681 error (_("File contains multiple dynamic string tables\n"));
5682 continue;
5683 }
5684
3f5e193b
NC
5685 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
5686 1, section->sh_size,
5687 _("dynamic strings"));
59245841 5688 dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
252b5132 5689 }
9ad5cbcf
AM
5690 else if (section->sh_type == SHT_SYMTAB_SHNDX)
5691 {
6a40cf0c
NC
5692 elf_section_list * entry = xmalloc (sizeof * entry);
5693 entry->hdr = section;
5694 entry->next = symtab_shndx_list;
5695 symtab_shndx_list = entry;
9ad5cbcf 5696 }
08d8fa11
JJ
5697 else if (section->sh_type == SHT_SYMTAB)
5698 CHECK_ENTSIZE (section, i, Sym);
5699 else if (section->sh_type == SHT_GROUP)
5700 CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
5701 else if (section->sh_type == SHT_REL)
5702 CHECK_ENTSIZE (section, i, Rel);
5703 else if (section->sh_type == SHT_RELA)
5704 CHECK_ENTSIZE (section, i, Rela);
252b5132 5705 else if ((do_debugging || do_debug_info || do_debug_abbrevs
f9f0e732 5706 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
cb8f3167 5707 || do_debug_aranges || do_debug_frames || do_debug_macinfo
657d0d47
CC
5708 || do_debug_str || do_debug_loc || do_debug_ranges
5709 || do_debug_addr || do_debug_cu_index)
1b315056
CS
5710 && (const_strneq (name, ".debug_")
5711 || const_strneq (name, ".zdebug_")))
252b5132 5712 {
1b315056
CS
5713 if (name[1] == 'z')
5714 name += sizeof (".zdebug_") - 1;
5715 else
5716 name += sizeof (".debug_") - 1;
252b5132
RH
5717
5718 if (do_debugging
4723351a
CC
5719 || (do_debug_info && const_strneq (name, "info"))
5720 || (do_debug_info && const_strneq (name, "types"))
5721 || (do_debug_abbrevs && const_strneq (name, "abbrev"))
b40bf0a2
NC
5722 || (do_debug_lines && strcmp (name, "line") == 0)
5723 || (do_debug_lines && const_strneq (name, "line."))
4723351a
CC
5724 || (do_debug_pubnames && const_strneq (name, "pubnames"))
5725 || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
459d52c8
DE
5726 || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
5727 || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
4723351a
CC
5728 || (do_debug_aranges && const_strneq (name, "aranges"))
5729 || (do_debug_ranges && const_strneq (name, "ranges"))
5730 || (do_debug_frames && const_strneq (name, "frame"))
5731 || (do_debug_macinfo && const_strneq (name, "macinfo"))
5732 || (do_debug_macinfo && const_strneq (name, "macro"))
5733 || (do_debug_str && const_strneq (name, "str"))
5734 || (do_debug_loc && const_strneq (name, "loc"))
657d0d47
CC
5735 || (do_debug_addr && const_strneq (name, "addr"))
5736 || (do_debug_cu_index && const_strneq (name, "cu_index"))
5737 || (do_debug_cu_index && const_strneq (name, "tu_index"))
252b5132 5738 )
09c11c86 5739 request_dump_bynumber (i, DEBUG_DUMP);
252b5132 5740 }
a262ae96 5741 /* Linkonce section to be combined with .debug_info at link time. */
09fd7e38 5742 else if ((do_debugging || do_debug_info)
0112cd26 5743 && const_strneq (name, ".gnu.linkonce.wi."))
09c11c86 5744 request_dump_bynumber (i, DEBUG_DUMP);
18bd398b 5745 else if (do_debug_frames && streq (name, ".eh_frame"))
09c11c86 5746 request_dump_bynumber (i, DEBUG_DUMP);
5bbdf3d5
DE
5747 else if (do_gdb_index && streq (name, ".gdb_index"))
5748 request_dump_bynumber (i, DEBUG_DUMP);
6f875884
TG
5749 /* Trace sections for Itanium VMS. */
5750 else if ((do_debugging || do_trace_info || do_trace_abbrevs
5751 || do_trace_aranges)
5752 && const_strneq (name, ".trace_"))
5753 {
5754 name += sizeof (".trace_") - 1;
5755
5756 if (do_debugging
5757 || (do_trace_info && streq (name, "info"))
5758 || (do_trace_abbrevs && streq (name, "abbrev"))
5759 || (do_trace_aranges && streq (name, "aranges"))
5760 )
5761 request_dump_bynumber (i, DEBUG_DUMP);
5762 }
252b5132
RH
5763 }
5764
5765 if (! do_sections)
5766 return 1;
5767
3a1a2036
NC
5768 if (elf_header.e_shnum > 1)
5769 printf (_("\nSection Headers:\n"));
5770 else
5771 printf (_("\nSection Header:\n"));
76da6bbe 5772
f7a99963 5773 if (is_32bit_elf)
595cf52e 5774 {
5477e8a0 5775 if (do_section_details)
595cf52e
L
5776 {
5777 printf (_(" [Nr] Name\n"));
5477e8a0 5778 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
595cf52e
L
5779 }
5780 else
5781 printf
5782 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
5783 }
d974e256 5784 else if (do_wide)
595cf52e 5785 {
5477e8a0 5786 if (do_section_details)
595cf52e
L
5787 {
5788 printf (_(" [Nr] Name\n"));
5477e8a0 5789 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
595cf52e
L
5790 }
5791 else
5792 printf
5793 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
5794 }
f7a99963
NC
5795 else
5796 {
5477e8a0 5797 if (do_section_details)
595cf52e
L
5798 {
5799 printf (_(" [Nr] Name\n"));
5477e8a0
L
5800 printf (_(" Type Address Offset Link\n"));
5801 printf (_(" Size EntSize Info Align\n"));
595cf52e
L
5802 }
5803 else
5804 {
5805 printf (_(" [Nr] Name Type Address Offset\n"));
5806 printf (_(" Size EntSize Flags Link Info Align\n"));
5807 }
f7a99963 5808 }
252b5132 5809
5477e8a0
L
5810 if (do_section_details)
5811 printf (_(" Flags\n"));
5812
252b5132
RH
5813 for (i = 0, section = section_headers;
5814 i < elf_header.e_shnum;
b34976b6 5815 i++, section++)
252b5132 5816 {
7bfd842d 5817 printf (" [%2u] ", i);
5477e8a0 5818 if (do_section_details)
74e1a04b 5819 printf ("%s\n ", printable_section_name (section));
595cf52e 5820 else
74e1a04b 5821 print_symbol (-17, SECTION_NAME (section));
0b4362b0 5822
ea52a088
NC
5823 printf (do_wide ? " %-15s " : " %-15.15s ",
5824 get_section_type_name (section->sh_type));
0b4362b0 5825
f7a99963
NC
5826 if (is_32bit_elf)
5827 {
cfcac11d
NC
5828 const char * link_too_big = NULL;
5829
f7a99963 5830 print_vma (section->sh_addr, LONG_HEX);
76da6bbe 5831
f7a99963
NC
5832 printf ( " %6.6lx %6.6lx %2.2lx",
5833 (unsigned long) section->sh_offset,
5834 (unsigned long) section->sh_size,
5835 (unsigned long) section->sh_entsize);
d1133906 5836
5477e8a0
L
5837 if (do_section_details)
5838 fputs (" ", stdout);
5839 else
5840 printf (" %3s ", get_elf_section_flags (section->sh_flags));
76da6bbe 5841
cfcac11d
NC
5842 if (section->sh_link >= elf_header.e_shnum)
5843 {
5844 link_too_big = "";
5845 /* The sh_link value is out of range. Normally this indicates
caa83f8b 5846 an error but it can have special values in Solaris binaries. */
cfcac11d
NC
5847 switch (elf_header.e_machine)
5848 {
caa83f8b 5849 case EM_386:
22abe556 5850 case EM_IAMCU:
caa83f8b 5851 case EM_X86_64:
7f502d6c 5852 case EM_L1OM:
7a9068fe 5853 case EM_K1OM:
cfcac11d
NC
5854 case EM_OLD_SPARCV9:
5855 case EM_SPARC32PLUS:
5856 case EM_SPARCV9:
5857 case EM_SPARC:
5858 if (section->sh_link == (SHN_BEFORE & 0xffff))
5859 link_too_big = "BEFORE";
5860 else if (section->sh_link == (SHN_AFTER & 0xffff))
5861 link_too_big = "AFTER";
5862 break;
5863 default:
5864 break;
5865 }
5866 }
5867
5868 if (do_section_details)
5869 {
5870 if (link_too_big != NULL && * link_too_big)
5871 printf ("<%s> ", link_too_big);
5872 else
5873 printf ("%2u ", section->sh_link);
5874 printf ("%3u %2lu\n", section->sh_info,
5875 (unsigned long) section->sh_addralign);
5876 }
5877 else
5878 printf ("%2u %3u %2lu\n",
5879 section->sh_link,
5880 section->sh_info,
5881 (unsigned long) section->sh_addralign);
5882
5883 if (link_too_big && ! * link_too_big)
5884 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
5885 i, section->sh_link);
f7a99963 5886 }
d974e256
JJ
5887 else if (do_wide)
5888 {
5889 print_vma (section->sh_addr, LONG_HEX);
5890
5891 if ((long) section->sh_offset == section->sh_offset)
5892 printf (" %6.6lx", (unsigned long) section->sh_offset);
5893 else
5894 {
5895 putchar (' ');
5896 print_vma (section->sh_offset, LONG_HEX);
5897 }
5898
5899 if ((unsigned long) section->sh_size == section->sh_size)
5900 printf (" %6.6lx", (unsigned long) section->sh_size);
5901 else
5902 {
5903 putchar (' ');
5904 print_vma (section->sh_size, LONG_HEX);
5905 }
5906
5907 if ((unsigned long) section->sh_entsize == section->sh_entsize)
5908 printf (" %2.2lx", (unsigned long) section->sh_entsize);
5909 else
5910 {
5911 putchar (' ');
5912 print_vma (section->sh_entsize, LONG_HEX);
5913 }
5914
5477e8a0
L
5915 if (do_section_details)
5916 fputs (" ", stdout);
5917 else
5918 printf (" %3s ", get_elf_section_flags (section->sh_flags));
d974e256 5919
72de5009 5920 printf ("%2u %3u ", section->sh_link, section->sh_info);
d974e256
JJ
5921
5922 if ((unsigned long) section->sh_addralign == section->sh_addralign)
72de5009 5923 printf ("%2lu\n", (unsigned long) section->sh_addralign);
d974e256
JJ
5924 else
5925 {
5926 print_vma (section->sh_addralign, DEC);
5927 putchar ('\n');
5928 }
5929 }
5477e8a0 5930 else if (do_section_details)
595cf52e 5931 {
5477e8a0 5932 printf (" %-15.15s ",
595cf52e 5933 get_section_type_name (section->sh_type));
595cf52e
L
5934 print_vma (section->sh_addr, LONG_HEX);
5935 if ((long) section->sh_offset == section->sh_offset)
5477e8a0 5936 printf (" %16.16lx", (unsigned long) section->sh_offset);
595cf52e
L
5937 else
5938 {
5939 printf (" ");
5940 print_vma (section->sh_offset, LONG_HEX);
5941 }
72de5009 5942 printf (" %u\n ", section->sh_link);
595cf52e 5943 print_vma (section->sh_size, LONG_HEX);
5477e8a0 5944 putchar (' ');
595cf52e
L
5945 print_vma (section->sh_entsize, LONG_HEX);
5946
72de5009
AM
5947 printf (" %-16u %lu\n",
5948 section->sh_info,
595cf52e
L
5949 (unsigned long) section->sh_addralign);
5950 }
f7a99963
NC
5951 else
5952 {
5953 putchar (' ');
5954 print_vma (section->sh_addr, LONG_HEX);
53c7db4b
KH
5955 if ((long) section->sh_offset == section->sh_offset)
5956 printf (" %8.8lx", (unsigned long) section->sh_offset);
5957 else
5958 {
5959 printf (" ");
5960 print_vma (section->sh_offset, LONG_HEX);
5961 }
f7a99963
NC
5962 printf ("\n ");
5963 print_vma (section->sh_size, LONG_HEX);
5964 printf (" ");
5965 print_vma (section->sh_entsize, LONG_HEX);
76da6bbe 5966
d1133906 5967 printf (" %3s ", get_elf_section_flags (section->sh_flags));
76da6bbe 5968
72de5009
AM
5969 printf (" %2u %3u %lu\n",
5970 section->sh_link,
5971 section->sh_info,
f7a99963
NC
5972 (unsigned long) section->sh_addralign);
5973 }
5477e8a0
L
5974
5975 if (do_section_details)
77115a4a
L
5976 {
5977 printf (" %s\n", get_elf_section_flags (section->sh_flags));
5978 if ((section->sh_flags & SHF_COMPRESSED) != 0)
5979 {
5980 /* Minimum section size is 12 bytes for 32-bit compression
5981 header + 12 bytes for compressed data header. */
5982 unsigned char buf[24];
5983 assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
5984 if (get_data (&buf, (FILE *) file, section->sh_offset, 1,
5985 sizeof (buf), _("compression header")))
5986 {
5987 Elf_Internal_Chdr chdr;
5988 get_compression_header (&chdr, buf);
5989 if (chdr.ch_type == ELFCOMPRESS_ZLIB)
5990 printf (" ZLIB, ");
5991 else
5992 printf (_(" [<unknown>: 0x%x], "),
5993 chdr.ch_type);
5994 print_vma (chdr.ch_size, LONG_HEX);
5995 printf (", %lu\n", (unsigned long) chdr.ch_addralign);
5996 }
5997 }
5998 }
252b5132
RH
5999 }
6000
5477e8a0 6001 if (!do_section_details)
3dbcc61d 6002 {
9fb71ee4
NC
6003 /* The ordering of the letters shown here matches the ordering of the
6004 corresponding SHF_xxx values, and hence the order in which these
6005 letters will be displayed to the user. */
6006 printf (_("Key to Flags:\n\
6007 W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6008 L (link order), O (extra OS processing required), G (group), T (TLS),\n\
6009 C (compressed), x (unknown), o (OS specific), E (exclude),\n"));
3dbcc61d 6010 if (elf_header.e_machine == EM_X86_64
7a9068fe
L
6011 || elf_header.e_machine == EM_L1OM
6012 || elf_header.e_machine == EM_K1OM)
9fb71ee4 6013 printf (_("l (large), "));
91f68a68 6014 else if (elf_header.e_machine == EM_ARM)
9fb71ee4
NC
6015 printf (_("y (noread), "));
6016 printf ("p (processor specific)\n");
0b4362b0 6017 }
d1133906 6018
252b5132
RH
6019 return 1;
6020}
6021
f5842774
L
6022static const char *
6023get_group_flags (unsigned int flags)
6024{
6025 static char buff[32];
6026 switch (flags)
6027 {
220453ec
AM
6028 case 0:
6029 return "";
6030
f5842774 6031 case GRP_COMDAT:
220453ec 6032 return "COMDAT ";
f5842774
L
6033
6034 default:
220453ec 6035 snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x] "), flags);
f5842774
L
6036 break;
6037 }
6038 return buff;
6039}
6040
6041static int
2cf0635d 6042process_section_groups (FILE * file)
f5842774 6043{
2cf0635d 6044 Elf_Internal_Shdr * section;
f5842774 6045 unsigned int i;
2cf0635d
NC
6046 struct group * group;
6047 Elf_Internal_Shdr * symtab_sec;
6048 Elf_Internal_Shdr * strtab_sec;
6049 Elf_Internal_Sym * symtab;
ba5cdace 6050 unsigned long num_syms;
2cf0635d 6051 char * strtab;
c256ffe7 6052 size_t strtab_size;
d1f5c6e3
L
6053
6054 /* Don't process section groups unless needed. */
6055 if (!do_unwind && !do_section_groups)
6056 return 1;
f5842774
L
6057
6058 if (elf_header.e_shnum == 0)
6059 {
6060 if (do_section_groups)
82f2dbf7 6061 printf (_("\nThere are no sections to group in this file.\n"));
f5842774
L
6062
6063 return 1;
6064 }
6065
6066 if (section_headers == NULL)
6067 {
6068 error (_("Section headers are not available!\n"));
fa1908fd
NC
6069 /* PR 13622: This can happen with a corrupt ELF header. */
6070 return 0;
f5842774
L
6071 }
6072
3f5e193b
NC
6073 section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
6074 sizeof (struct group *));
e4b17d5c
L
6075
6076 if (section_headers_groups == NULL)
6077 {
8b73c356
NC
6078 error (_("Out of memory reading %u section group headers\n"),
6079 elf_header.e_shnum);
e4b17d5c
L
6080 return 0;
6081 }
6082
f5842774 6083 /* Scan the sections for the group section. */
d1f5c6e3 6084 group_count = 0;
f5842774
L
6085 for (i = 0, section = section_headers;
6086 i < elf_header.e_shnum;
6087 i++, section++)
e4b17d5c
L
6088 if (section->sh_type == SHT_GROUP)
6089 group_count++;
6090
d1f5c6e3
L
6091 if (group_count == 0)
6092 {
6093 if (do_section_groups)
6094 printf (_("\nThere are no section groups in this file.\n"));
6095
6096 return 1;
6097 }
6098
3f5e193b 6099 section_groups = (struct group *) calloc (group_count, sizeof (struct group));
e4b17d5c
L
6100
6101 if (section_groups == NULL)
6102 {
8b73c356
NC
6103 error (_("Out of memory reading %lu groups\n"),
6104 (unsigned long) group_count);
e4b17d5c
L
6105 return 0;
6106 }
6107
d1f5c6e3
L
6108 symtab_sec = NULL;
6109 strtab_sec = NULL;
6110 symtab = NULL;
ba5cdace 6111 num_syms = 0;
d1f5c6e3 6112 strtab = NULL;
c256ffe7 6113 strtab_size = 0;
e4b17d5c
L
6114 for (i = 0, section = section_headers, group = section_groups;
6115 i < elf_header.e_shnum;
6116 i++, section++)
f5842774
L
6117 {
6118 if (section->sh_type == SHT_GROUP)
6119 {
74e1a04b
NC
6120 const char * name = printable_section_name (section);
6121 const char * group_name;
2cf0635d
NC
6122 unsigned char * start;
6123 unsigned char * indices;
f5842774 6124 unsigned int entry, j, size;
2cf0635d
NC
6125 Elf_Internal_Shdr * sec;
6126 Elf_Internal_Sym * sym;
f5842774
L
6127
6128 /* Get the symbol table. */
4fbb74a6
AM
6129 if (section->sh_link >= elf_header.e_shnum
6130 || ((sec = section_headers + section->sh_link)->sh_type
c256ffe7 6131 != SHT_SYMTAB))
f5842774
L
6132 {
6133 error (_("Bad sh_link in group section `%s'\n"), name);
6134 continue;
6135 }
d1f5c6e3
L
6136
6137 if (symtab_sec != sec)
6138 {
6139 symtab_sec = sec;
6140 if (symtab)
6141 free (symtab);
ba5cdace 6142 symtab = GET_ELF_SYMBOLS (file, symtab_sec, & num_syms);
d1f5c6e3 6143 }
f5842774 6144
dd24e3da
NC
6145 if (symtab == NULL)
6146 {
6147 error (_("Corrupt header in group section `%s'\n"), name);
6148 continue;
6149 }
6150
ba5cdace
NC
6151 if (section->sh_info >= num_syms)
6152 {
6153 error (_("Bad sh_info in group section `%s'\n"), name);
6154 continue;
6155 }
6156
f5842774
L
6157 sym = symtab + section->sh_info;
6158
6159 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6160 {
4fbb74a6
AM
6161 if (sym->st_shndx == 0
6162 || sym->st_shndx >= elf_header.e_shnum)
f5842774
L
6163 {
6164 error (_("Bad sh_info in group section `%s'\n"), name);
6165 continue;
6166 }
ba2685cc 6167
4fbb74a6 6168 group_name = SECTION_NAME (section_headers + sym->st_shndx);
c256ffe7
JJ
6169 strtab_sec = NULL;
6170 if (strtab)
6171 free (strtab);
f5842774 6172 strtab = NULL;
c256ffe7 6173 strtab_size = 0;
f5842774
L
6174 }
6175 else
6176 {
6177 /* Get the string table. */
4fbb74a6 6178 if (symtab_sec->sh_link >= elf_header.e_shnum)
c256ffe7
JJ
6179 {
6180 strtab_sec = NULL;
6181 if (strtab)
6182 free (strtab);
6183 strtab = NULL;
6184 strtab_size = 0;
6185 }
6186 else if (strtab_sec
4fbb74a6 6187 != (sec = section_headers + symtab_sec->sh_link))
d1f5c6e3
L
6188 {
6189 strtab_sec = sec;
6190 if (strtab)
6191 free (strtab);
071436c6 6192
3f5e193b 6193 strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
071436c6
NC
6194 1, strtab_sec->sh_size,
6195 _("string table"));
c256ffe7 6196 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
d1f5c6e3 6197 }
c256ffe7 6198 group_name = sym->st_name < strtab_size
2b692964 6199 ? strtab + sym->st_name : _("<corrupt>");
f5842774
L
6200 }
6201
c9c1d674
EG
6202 /* PR 17531: file: loop. */
6203 if (section->sh_entsize > section->sh_size)
6204 {
6205 error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6206 printable_section_name (section),
8066deb1
AM
6207 (unsigned long) section->sh_entsize,
6208 (unsigned long) section->sh_size);
c9c1d674
EG
6209 break;
6210 }
6211
3f5e193b
NC
6212 start = (unsigned char *) get_data (NULL, file, section->sh_offset,
6213 1, section->sh_size,
6214 _("section data"));
59245841
NC
6215 if (start == NULL)
6216 continue;
f5842774
L
6217
6218 indices = start;
6219 size = (section->sh_size / section->sh_entsize) - 1;
6220 entry = byte_get (indices, 4);
6221 indices += 4;
e4b17d5c
L
6222
6223 if (do_section_groups)
6224 {
2b692964 6225 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
391cb864 6226 get_group_flags (entry), i, name, group_name, size);
ba2685cc 6227
e4b17d5c
L
6228 printf (_(" [Index] Name\n"));
6229 }
6230
6231 group->group_index = i;
6232
f5842774
L
6233 for (j = 0; j < size; j++)
6234 {
2cf0635d 6235 struct group_list * g;
e4b17d5c 6236
f5842774
L
6237 entry = byte_get (indices, 4);
6238 indices += 4;
6239
4fbb74a6 6240 if (entry >= elf_header.e_shnum)
391cb864 6241 {
57028622
NC
6242 static unsigned num_group_errors = 0;
6243
6244 if (num_group_errors ++ < 10)
6245 {
6246 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6247 entry, i, elf_header.e_shnum - 1);
6248 if (num_group_errors == 10)
6249 warn (_("Futher error messages about overlarge group section indicies suppressed\n"));
6250 }
391cb864
L
6251 continue;
6252 }
391cb864 6253
4fbb74a6 6254 if (section_headers_groups [entry] != NULL)
e4b17d5c 6255 {
d1f5c6e3
L
6256 if (entry)
6257 {
57028622
NC
6258 static unsigned num_errs = 0;
6259
6260 if (num_errs ++ < 10)
6261 {
6262 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6263 entry, i,
6264 section_headers_groups [entry]->group_index);
6265 if (num_errs == 10)
6266 warn (_("Further error messages about already contained group sections suppressed\n"));
6267 }
d1f5c6e3
L
6268 continue;
6269 }
6270 else
6271 {
6272 /* Intel C/C++ compiler may put section 0 in a
6273 section group. We just warn it the first time
6274 and ignore it afterwards. */
6275 static int warned = 0;
6276 if (!warned)
6277 {
6278 error (_("section 0 in group section [%5u]\n"),
4fbb74a6 6279 section_headers_groups [entry]->group_index);
d1f5c6e3
L
6280 warned++;
6281 }
6282 }
e4b17d5c
L
6283 }
6284
4fbb74a6 6285 section_headers_groups [entry] = group;
e4b17d5c
L
6286
6287 if (do_section_groups)
6288 {
4fbb74a6 6289 sec = section_headers + entry;
74e1a04b 6290 printf (" [%5u] %s\n", entry, printable_section_name (sec));
ba2685cc
AM
6291 }
6292
3f5e193b 6293 g = (struct group_list *) xmalloc (sizeof (struct group_list));
e4b17d5c
L
6294 g->section_index = entry;
6295 g->next = group->root;
6296 group->root = g;
f5842774
L
6297 }
6298
f5842774
L
6299 if (start)
6300 free (start);
e4b17d5c
L
6301
6302 group++;
f5842774
L
6303 }
6304 }
6305
d1f5c6e3
L
6306 if (symtab)
6307 free (symtab);
6308 if (strtab)
6309 free (strtab);
f5842774
L
6310 return 1;
6311}
6312
28f997cf
TG
6313/* Data used to display dynamic fixups. */
6314
6315struct ia64_vms_dynfixup
6316{
6317 bfd_vma needed_ident; /* Library ident number. */
6318 bfd_vma needed; /* Index in the dstrtab of the library name. */
6319 bfd_vma fixup_needed; /* Index of the library. */
6320 bfd_vma fixup_rela_cnt; /* Number of fixups. */
6321 bfd_vma fixup_rela_off; /* Fixups offset in the dynamic segment. */
6322};
6323
6324/* Data used to display dynamic relocations. */
6325
6326struct ia64_vms_dynimgrela
6327{
6328 bfd_vma img_rela_cnt; /* Number of relocations. */
6329 bfd_vma img_rela_off; /* Reloc offset in the dynamic segment. */
6330};
6331
6332/* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6333 library). */
6334
6335static void
6336dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
6337 const char *strtab, unsigned int strtab_sz)
6338{
6339 Elf64_External_VMS_IMAGE_FIXUP *imfs;
6340 long i;
6341 const char *lib_name;
6342
6343 imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
6344 1, fixup->fixup_rela_cnt * sizeof (*imfs),
6345 _("dynamic section image fixups"));
6346 if (!imfs)
6347 return;
6348
6349 if (fixup->needed < strtab_sz)
6350 lib_name = strtab + fixup->needed;
6351 else
6352 {
6353 warn ("corrupt library name index of 0x%lx found in dynamic entry",
7f01b0c6 6354 (unsigned long) fixup->needed);
28f997cf
TG
6355 lib_name = "???";
6356 }
6357 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
6358 (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
6359 printf
6360 (_("Seg Offset Type SymVec DataType\n"));
6361
6362 for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
6363 {
6364 unsigned int type;
6365 const char *rtype;
6366
6367 printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
6368 printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
6369 type = BYTE_GET (imfs [i].type);
6370 rtype = elf_ia64_reloc_type (type);
6371 if (rtype == NULL)
6372 printf (" 0x%08x ", type);
6373 else
6374 printf (" %-32s ", rtype);
6375 printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
6376 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
6377 }
6378
6379 free (imfs);
6380}
6381
6382/* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
6383
6384static void
6385dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
6386{
6387 Elf64_External_VMS_IMAGE_RELA *imrs;
6388 long i;
6389
6390 imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
6391 1, imgrela->img_rela_cnt * sizeof (*imrs),
9cf03b7e 6392 _("dynamic section image relocations"));
28f997cf
TG
6393 if (!imrs)
6394 return;
6395
6396 printf (_("\nImage relocs\n"));
6397 printf
6398 (_("Seg Offset Type Addend Seg Sym Off\n"));
6399
6400 for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
6401 {
6402 unsigned int type;
6403 const char *rtype;
6404
6405 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
6406 printf ("%08" BFD_VMA_FMT "x ",
6407 (bfd_vma) BYTE_GET (imrs [i].rela_offset));
6408 type = BYTE_GET (imrs [i].type);
6409 rtype = elf_ia64_reloc_type (type);
6410 if (rtype == NULL)
6411 printf ("0x%08x ", type);
6412 else
6413 printf ("%-31s ", rtype);
6414 print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
6415 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
6416 printf ("%08" BFD_VMA_FMT "x\n",
6417 (bfd_vma) BYTE_GET (imrs [i].sym_offset));
6418 }
6419
6420 free (imrs);
6421}
6422
6423/* Display IA-64 OpenVMS dynamic relocations and fixups. */
6424
6425static int
6426process_ia64_vms_dynamic_relocs (FILE *file)
6427{
6428 struct ia64_vms_dynfixup fixup;
6429 struct ia64_vms_dynimgrela imgrela;
6430 Elf_Internal_Dyn *entry;
6431 int res = 0;
6432 bfd_vma strtab_off = 0;
6433 bfd_vma strtab_sz = 0;
6434 char *strtab = NULL;
6435
6436 memset (&fixup, 0, sizeof (fixup));
6437 memset (&imgrela, 0, sizeof (imgrela));
6438
6439 /* Note: the order of the entries is specified by the OpenVMS specs. */
6440 for (entry = dynamic_section;
6441 entry < dynamic_section + dynamic_nent;
6442 entry++)
6443 {
6444 switch (entry->d_tag)
6445 {
6446 case DT_IA_64_VMS_STRTAB_OFFSET:
6447 strtab_off = entry->d_un.d_val;
6448 break;
6449 case DT_STRSZ:
6450 strtab_sz = entry->d_un.d_val;
6451 if (strtab == NULL)
6452 strtab = get_data (NULL, file, dynamic_addr + strtab_off,
6453 1, strtab_sz, _("dynamic string section"));
6454 break;
6455
6456 case DT_IA_64_VMS_NEEDED_IDENT:
6457 fixup.needed_ident = entry->d_un.d_val;
6458 break;
6459 case DT_NEEDED:
6460 fixup.needed = entry->d_un.d_val;
6461 break;
6462 case DT_IA_64_VMS_FIXUP_NEEDED:
6463 fixup.fixup_needed = entry->d_un.d_val;
6464 break;
6465 case DT_IA_64_VMS_FIXUP_RELA_CNT:
6466 fixup.fixup_rela_cnt = entry->d_un.d_val;
6467 break;
6468 case DT_IA_64_VMS_FIXUP_RELA_OFF:
6469 fixup.fixup_rela_off = entry->d_un.d_val;
6470 res++;
6471 dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
6472 break;
6473
6474 case DT_IA_64_VMS_IMG_RELA_CNT:
6475 imgrela.img_rela_cnt = entry->d_un.d_val;
6476 break;
6477 case DT_IA_64_VMS_IMG_RELA_OFF:
6478 imgrela.img_rela_off = entry->d_un.d_val;
6479 res++;
6480 dump_ia64_vms_dynamic_relocs (file, &imgrela);
6481 break;
6482
6483 default:
6484 break;
6485 }
6486 }
6487
6488 if (strtab != NULL)
6489 free (strtab);
6490
6491 return res;
6492}
6493
85b1c36d 6494static struct
566b0d53 6495{
2cf0635d 6496 const char * name;
566b0d53
L
6497 int reloc;
6498 int size;
6499 int rela;
6500} dynamic_relocations [] =
6501{
6502 { "REL", DT_REL, DT_RELSZ, FALSE },
6503 { "RELA", DT_RELA, DT_RELASZ, TRUE },
6504 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
6505};
6506
252b5132 6507/* Process the reloc section. */
18bd398b 6508
252b5132 6509static int
2cf0635d 6510process_relocs (FILE * file)
252b5132 6511{
b34976b6
AM
6512 unsigned long rel_size;
6513 unsigned long rel_offset;
252b5132
RH
6514
6515
6516 if (!do_reloc)
6517 return 1;
6518
6519 if (do_using_dynamic)
6520 {
566b0d53 6521 int is_rela;
2cf0635d 6522 const char * name;
566b0d53
L
6523 int has_dynamic_reloc;
6524 unsigned int i;
0de14b54 6525
566b0d53 6526 has_dynamic_reloc = 0;
252b5132 6527
566b0d53 6528 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
252b5132 6529 {
566b0d53
L
6530 is_rela = dynamic_relocations [i].rela;
6531 name = dynamic_relocations [i].name;
6532 rel_size = dynamic_info [dynamic_relocations [i].size];
6533 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
103f02d3 6534
566b0d53
L
6535 has_dynamic_reloc |= rel_size;
6536
6537 if (is_rela == UNKNOWN)
aa903cfb 6538 {
566b0d53
L
6539 if (dynamic_relocations [i].reloc == DT_JMPREL)
6540 switch (dynamic_info[DT_PLTREL])
6541 {
6542 case DT_REL:
6543 is_rela = FALSE;
6544 break;
6545 case DT_RELA:
6546 is_rela = TRUE;
6547 break;
6548 }
aa903cfb 6549 }
252b5132 6550
566b0d53
L
6551 if (rel_size)
6552 {
6553 printf
6554 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
6555 name, rel_offset, rel_size);
252b5132 6556
d93f0186
NC
6557 dump_relocations (file,
6558 offset_from_vma (file, rel_offset, rel_size),
6559 rel_size,
566b0d53 6560 dynamic_symbols, num_dynamic_syms,
bb4d2ac2
L
6561 dynamic_strings, dynamic_strings_length,
6562 is_rela, 1);
566b0d53 6563 }
252b5132 6564 }
566b0d53 6565
28f997cf
TG
6566 if (is_ia64_vms ())
6567 has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
6568
566b0d53 6569 if (! has_dynamic_reloc)
252b5132
RH
6570 printf (_("\nThere are no dynamic relocations in this file.\n"));
6571 }
6572 else
6573 {
2cf0635d 6574 Elf_Internal_Shdr * section;
b34976b6
AM
6575 unsigned long i;
6576 int found = 0;
252b5132
RH
6577
6578 for (i = 0, section = section_headers;
6579 i < elf_header.e_shnum;
b34976b6 6580 i++, section++)
252b5132
RH
6581 {
6582 if ( section->sh_type != SHT_RELA
6583 && section->sh_type != SHT_REL)
6584 continue;
6585
6586 rel_offset = section->sh_offset;
6587 rel_size = section->sh_size;
6588
6589 if (rel_size)
6590 {
2cf0635d 6591 Elf_Internal_Shdr * strsec;
b34976b6 6592 int is_rela;
103f02d3 6593
252b5132
RH
6594 printf (_("\nRelocation section "));
6595
6596 if (string_table == NULL)
19936277 6597 printf ("%d", section->sh_name);
252b5132 6598 else
74e1a04b 6599 printf ("'%s'", printable_section_name (section));
252b5132
RH
6600
6601 printf (_(" at offset 0x%lx contains %lu entries:\n"),
6602 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
6603
d79b3d50
NC
6604 is_rela = section->sh_type == SHT_RELA;
6605
4fbb74a6
AM
6606 if (section->sh_link != 0
6607 && section->sh_link < elf_header.e_shnum)
af3fc3bc 6608 {
2cf0635d
NC
6609 Elf_Internal_Shdr * symsec;
6610 Elf_Internal_Sym * symtab;
d79b3d50 6611 unsigned long nsyms;
c256ffe7 6612 unsigned long strtablen = 0;
2cf0635d 6613 char * strtab = NULL;
57346661 6614
4fbb74a6 6615 symsec = section_headers + section->sh_link;
08d8fa11
JJ
6616 if (symsec->sh_type != SHT_SYMTAB
6617 && symsec->sh_type != SHT_DYNSYM)
6618 continue;
6619
ba5cdace 6620 symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms);
252b5132 6621
af3fc3bc
AM
6622 if (symtab == NULL)
6623 continue;
252b5132 6624
4fbb74a6
AM
6625 if (symsec->sh_link != 0
6626 && symsec->sh_link < elf_header.e_shnum)
c256ffe7 6627 {
4fbb74a6 6628 strsec = section_headers + symsec->sh_link;
103f02d3 6629
3f5e193b 6630 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
071436c6
NC
6631 1, strsec->sh_size,
6632 _("string table"));
c256ffe7
JJ
6633 strtablen = strtab == NULL ? 0 : strsec->sh_size;
6634 }
252b5132 6635
d79b3d50 6636 dump_relocations (file, rel_offset, rel_size,
bb4d2ac2
L
6637 symtab, nsyms, strtab, strtablen,
6638 is_rela,
6639 symsec->sh_type == SHT_DYNSYM);
d79b3d50
NC
6640 if (strtab)
6641 free (strtab);
6642 free (symtab);
6643 }
6644 else
6645 dump_relocations (file, rel_offset, rel_size,
bb4d2ac2 6646 NULL, 0, NULL, 0, is_rela, 0);
252b5132
RH
6647
6648 found = 1;
6649 }
6650 }
6651
6652 if (! found)
6653 printf (_("\nThere are no relocations in this file.\n"));
6654 }
6655
6656 return 1;
6657}
6658
4d6ed7c8
NC
6659/* An absolute address consists of a section and an offset. If the
6660 section is NULL, the offset itself is the address, otherwise, the
6661 address equals to LOAD_ADDRESS(section) + offset. */
6662
6663struct absaddr
948f632f
DA
6664{
6665 unsigned short section;
6666 bfd_vma offset;
6667};
4d6ed7c8 6668
1949de15
L
6669#define ABSADDR(a) \
6670 ((a).section \
6671 ? section_headers [(a).section].sh_addr + (a).offset \
6672 : (a).offset)
6673
948f632f
DA
6674/* Find the nearest symbol at or below ADDR. Returns the symbol
6675 name, if found, and the offset from the symbol to ADDR. */
4d6ed7c8 6676
4d6ed7c8 6677static void
2cf0635d 6678find_symbol_for_address (Elf_Internal_Sym * symtab,
948f632f
DA
6679 unsigned long nsyms,
6680 const char * strtab,
6681 unsigned long strtab_size,
6682 struct absaddr addr,
6683 const char ** symname,
6684 bfd_vma * offset)
4d6ed7c8 6685{
d3ba0551 6686 bfd_vma dist = 0x100000;
2cf0635d 6687 Elf_Internal_Sym * sym;
948f632f
DA
6688 Elf_Internal_Sym * beg;
6689 Elf_Internal_Sym * end;
2cf0635d 6690 Elf_Internal_Sym * best = NULL;
4d6ed7c8 6691
0b6ae522 6692 REMOVE_ARCH_BITS (addr.offset);
948f632f
DA
6693 beg = symtab;
6694 end = symtab + nsyms;
0b6ae522 6695
948f632f 6696 while (beg < end)
4d6ed7c8 6697 {
948f632f
DA
6698 bfd_vma value;
6699
6700 sym = beg + (end - beg) / 2;
0b6ae522 6701
948f632f 6702 value = sym->st_value;
0b6ae522
DJ
6703 REMOVE_ARCH_BITS (value);
6704
948f632f 6705 if (sym->st_name != 0
4d6ed7c8 6706 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
0b6ae522
DJ
6707 && addr.offset >= value
6708 && addr.offset - value < dist)
4d6ed7c8
NC
6709 {
6710 best = sym;
0b6ae522 6711 dist = addr.offset - value;
4d6ed7c8
NC
6712 if (!dist)
6713 break;
6714 }
948f632f
DA
6715
6716 if (addr.offset < value)
6717 end = sym;
6718 else
6719 beg = sym + 1;
4d6ed7c8 6720 }
1b31d05e 6721
4d6ed7c8
NC
6722 if (best)
6723 {
57346661 6724 *symname = (best->st_name >= strtab_size
2b692964 6725 ? _("<corrupt>") : strtab + best->st_name);
4d6ed7c8
NC
6726 *offset = dist;
6727 return;
6728 }
1b31d05e 6729
4d6ed7c8
NC
6730 *symname = NULL;
6731 *offset = addr.offset;
6732}
6733
948f632f
DA
6734static int
6735symcmp (const void *p, const void *q)
6736{
6737 Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
6738 Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
6739
6740 return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
6741}
6742
6743/* Process the unwind section. */
6744
6745#include "unwind-ia64.h"
6746
6747struct ia64_unw_table_entry
6748{
6749 struct absaddr start;
6750 struct absaddr end;
6751 struct absaddr info;
6752};
6753
6754struct ia64_unw_aux_info
6755{
6756 struct ia64_unw_table_entry *table; /* Unwind table. */
6757 unsigned long table_len; /* Length of unwind table. */
6758 unsigned char * info; /* Unwind info. */
6759 unsigned long info_size; /* Size of unwind info. */
6760 bfd_vma info_addr; /* Starting address of unwind info. */
6761 bfd_vma seg_base; /* Starting address of segment. */
6762 Elf_Internal_Sym * symtab; /* The symbol table. */
6763 unsigned long nsyms; /* Number of symbols. */
6764 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
6765 unsigned long nfuns; /* Number of entries in funtab. */
6766 char * strtab; /* The string table. */
6767 unsigned long strtab_size; /* Size of string table. */
6768};
6769
4d6ed7c8 6770static void
2cf0635d 6771dump_ia64_unwind (struct ia64_unw_aux_info * aux)
4d6ed7c8 6772{
2cf0635d 6773 struct ia64_unw_table_entry * tp;
948f632f 6774 unsigned long j, nfuns;
4d6ed7c8 6775 int in_body;
7036c0e1 6776
948f632f
DA
6777 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
6778 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
6779 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
6780 aux->funtab[nfuns++] = aux->symtab[j];
6781 aux->nfuns = nfuns;
6782 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
6783
4d6ed7c8
NC
6784 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
6785 {
6786 bfd_vma stamp;
6787 bfd_vma offset;
2cf0635d
NC
6788 const unsigned char * dp;
6789 const unsigned char * head;
53774b7e 6790 const unsigned char * end;
2cf0635d 6791 const char * procname;
4d6ed7c8 6792
948f632f 6793 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
57346661 6794 aux->strtab_size, tp->start, &procname, &offset);
4d6ed7c8
NC
6795
6796 fputs ("\n<", stdout);
6797
6798 if (procname)
6799 {
6800 fputs (procname, stdout);
6801
6802 if (offset)
6803 printf ("+%lx", (unsigned long) offset);
6804 }
6805
6806 fputs (">: [", stdout);
6807 print_vma (tp->start.offset, PREFIX_HEX);
6808 fputc ('-', stdout);
6809 print_vma (tp->end.offset, PREFIX_HEX);
86f55779 6810 printf ("], info at +0x%lx\n",
4d6ed7c8
NC
6811 (unsigned long) (tp->info.offset - aux->seg_base));
6812
53774b7e
NC
6813 /* PR 17531: file: 86232b32. */
6814 if (aux->info == NULL)
6815 continue;
6816
6817 /* PR 17531: file: 0997b4d1. */
6818 if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
6819 {
6820 warn (_("Invalid offset %lx in table entry %ld\n"),
6821 (long) tp->info.offset, (long) (tp - aux->table));
6822 continue;
6823 }
6824
1949de15 6825 head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
a4a00738 6826 stamp = byte_get ((unsigned char *) head, sizeof (stamp));
4d6ed7c8 6827
86f55779 6828 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4d6ed7c8
NC
6829 (unsigned) UNW_VER (stamp),
6830 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
6831 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
6832 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
89fac5e3 6833 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
4d6ed7c8
NC
6834
6835 if (UNW_VER (stamp) != 1)
6836 {
2b692964 6837 printf (_("\tUnknown version.\n"));
4d6ed7c8
NC
6838 continue;
6839 }
6840
6841 in_body = 0;
53774b7e
NC
6842 end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
6843 /* PR 17531: file: 16ceda89. */
6844 if (end > aux->info + aux->info_size)
6845 end = aux->info + aux->info_size;
6846 for (dp = head + 8; dp < end;)
b4477bc8 6847 dp = unw_decode (dp, in_body, & in_body, end);
4d6ed7c8 6848 }
948f632f
DA
6849
6850 free (aux->funtab);
4d6ed7c8
NC
6851}
6852
53774b7e 6853static bfd_boolean
2cf0635d
NC
6854slurp_ia64_unwind_table (FILE * file,
6855 struct ia64_unw_aux_info * aux,
6856 Elf_Internal_Shdr * sec)
4d6ed7c8 6857{
89fac5e3 6858 unsigned long size, nrelas, i;
2cf0635d
NC
6859 Elf_Internal_Phdr * seg;
6860 struct ia64_unw_table_entry * tep;
6861 Elf_Internal_Shdr * relsec;
6862 Elf_Internal_Rela * rela;
6863 Elf_Internal_Rela * rp;
6864 unsigned char * table;
6865 unsigned char * tp;
6866 Elf_Internal_Sym * sym;
6867 const char * relname;
4d6ed7c8 6868
53774b7e
NC
6869 aux->table_len = 0;
6870
4d6ed7c8
NC
6871 /* First, find the starting address of the segment that includes
6872 this section: */
6873
6874 if (elf_header.e_phnum)
6875 {
d93f0186 6876 if (! get_program_headers (file))
53774b7e 6877 return FALSE;
4d6ed7c8 6878
d93f0186
NC
6879 for (seg = program_headers;
6880 seg < program_headers + elf_header.e_phnum;
6881 ++seg)
4d6ed7c8
NC
6882 {
6883 if (seg->p_type != PT_LOAD)
6884 continue;
6885
6886 if (sec->sh_addr >= seg->p_vaddr
6887 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
6888 {
6889 aux->seg_base = seg->p_vaddr;
6890 break;
6891 }
6892 }
4d6ed7c8
NC
6893 }
6894
6895 /* Second, build the unwind table from the contents of the unwind section: */
6896 size = sec->sh_size;
3f5e193b
NC
6897 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
6898 _("unwind table"));
a6e9f9df 6899 if (!table)
53774b7e 6900 return FALSE;
4d6ed7c8 6901
53774b7e 6902 aux->table_len = size / (3 * eh_addr_size);
3f5e193b 6903 aux->table = (struct ia64_unw_table_entry *)
53774b7e 6904 xcmalloc (aux->table_len, sizeof (aux->table[0]));
89fac5e3 6905 tep = aux->table;
53774b7e
NC
6906
6907 for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
4d6ed7c8
NC
6908 {
6909 tep->start.section = SHN_UNDEF;
6910 tep->end.section = SHN_UNDEF;
6911 tep->info.section = SHN_UNDEF;
c6a0c689
AM
6912 tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6913 tep->end.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6914 tep->info.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
4d6ed7c8
NC
6915 tep->start.offset += aux->seg_base;
6916 tep->end.offset += aux->seg_base;
6917 tep->info.offset += aux->seg_base;
6918 }
6919 free (table);
6920
41e92641 6921 /* Third, apply any relocations to the unwind table: */
4d6ed7c8
NC
6922 for (relsec = section_headers;
6923 relsec < section_headers + elf_header.e_shnum;
6924 ++relsec)
6925 {
6926 if (relsec->sh_type != SHT_RELA
4fbb74a6
AM
6927 || relsec->sh_info >= elf_header.e_shnum
6928 || section_headers + relsec->sh_info != sec)
4d6ed7c8
NC
6929 continue;
6930
6931 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
6932 & rela, & nrelas))
53774b7e
NC
6933 {
6934 free (aux->table);
6935 aux->table = NULL;
6936 aux->table_len = 0;
6937 return FALSE;
6938 }
4d6ed7c8
NC
6939
6940 for (rp = rela; rp < rela + nrelas; ++rp)
6941 {
aca88567
NC
6942 relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
6943 sym = aux->symtab + get_reloc_symindex (rp->r_info);
4d6ed7c8 6944
82b1b41b
NC
6945 /* PR 17531: file: 9fa67536. */
6946 if (relname == NULL)
6947 {
6948 warn (_("Skipping unknown relocation type: %u\n"), get_reloc_type (rp->r_info));
6949 continue;
6950 }
948f632f 6951
0112cd26 6952 if (! const_strneq (relname, "R_IA64_SEGREL"))
4d6ed7c8 6953 {
82b1b41b 6954 warn (_("Skipping unexpected relocation type: %s\n"), relname);
4d6ed7c8
NC
6955 continue;
6956 }
6957
89fac5e3 6958 i = rp->r_offset / (3 * eh_addr_size);
4d6ed7c8 6959
53774b7e
NC
6960 /* PR 17531: file: 5bc8d9bf. */
6961 if (i >= aux->table_len)
6962 {
6963 warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
6964 continue;
6965 }
6966
6967 switch (rp->r_offset / eh_addr_size % 3)
4d6ed7c8
NC
6968 {
6969 case 0:
6970 aux->table[i].start.section = sym->st_shndx;
e466bc6e 6971 aux->table[i].start.offset = rp->r_addend + sym->st_value;
4d6ed7c8
NC
6972 break;
6973 case 1:
6974 aux->table[i].end.section = sym->st_shndx;
e466bc6e 6975 aux->table[i].end.offset = rp->r_addend + sym->st_value;
4d6ed7c8
NC
6976 break;
6977 case 2:
6978 aux->table[i].info.section = sym->st_shndx;
e466bc6e 6979 aux->table[i].info.offset = rp->r_addend + sym->st_value;
4d6ed7c8
NC
6980 break;
6981 default:
6982 break;
6983 }
6984 }
6985
6986 free (rela);
6987 }
6988
53774b7e 6989 return TRUE;
4d6ed7c8
NC
6990}
6991
1b31d05e 6992static void
2cf0635d 6993ia64_process_unwind (FILE * file)
4d6ed7c8 6994{
2cf0635d
NC
6995 Elf_Internal_Shdr * sec;
6996 Elf_Internal_Shdr * unwsec = NULL;
6997 Elf_Internal_Shdr * strsec;
89fac5e3 6998 unsigned long i, unwcount = 0, unwstart = 0;
57346661 6999 struct ia64_unw_aux_info aux;
f1467e33 7000
4d6ed7c8
NC
7001 memset (& aux, 0, sizeof (aux));
7002
4d6ed7c8
NC
7003 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7004 {
c256ffe7 7005 if (sec->sh_type == SHT_SYMTAB
4fbb74a6 7006 && sec->sh_link < elf_header.e_shnum)
4d6ed7c8 7007 {
ba5cdace 7008 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
4d6ed7c8 7009
4fbb74a6 7010 strsec = section_headers + sec->sh_link;
4082ef84
NC
7011 if (aux.strtab != NULL)
7012 {
7013 error (_("Multiple auxillary string tables encountered\n"));
7014 free (aux.strtab);
7015 }
3f5e193b
NC
7016 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7017 1, strsec->sh_size,
7018 _("string table"));
c256ffe7 7019 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
4d6ed7c8
NC
7020 }
7021 else if (sec->sh_type == SHT_IA_64_UNWIND)
579f31ac
JJ
7022 unwcount++;
7023 }
7024
7025 if (!unwcount)
7026 printf (_("\nThere are no unwind sections in this file.\n"));
7027
7028 while (unwcount-- > 0)
7029 {
2cf0635d 7030 char * suffix;
579f31ac
JJ
7031 size_t len, len2;
7032
4082ef84 7033 for (i = unwstart, sec = section_headers + unwstart, unwsec = NULL;
579f31ac
JJ
7034 i < elf_header.e_shnum; ++i, ++sec)
7035 if (sec->sh_type == SHT_IA_64_UNWIND)
7036 {
7037 unwsec = sec;
7038 break;
7039 }
4082ef84
NC
7040 /* We have already counted the number of SHT_IA64_UNWIND
7041 sections so the loop above should never fail. */
7042 assert (unwsec != NULL);
579f31ac
JJ
7043
7044 unwstart = i + 1;
7045 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
7046
e4b17d5c
L
7047 if ((unwsec->sh_flags & SHF_GROUP) != 0)
7048 {
7049 /* We need to find which section group it is in. */
4082ef84 7050 struct group_list * g;
e4b17d5c 7051
4082ef84
NC
7052 if (section_headers_groups == NULL
7053 || section_headers_groups [i] == NULL)
7054 i = elf_header.e_shnum;
7055 else
e4b17d5c 7056 {
4082ef84 7057 g = section_headers_groups [i]->root;
18bd398b 7058
4082ef84
NC
7059 for (; g != NULL; g = g->next)
7060 {
7061 sec = section_headers + g->section_index;
e4b17d5c 7062
4082ef84
NC
7063 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
7064 break;
7065 }
7066
7067 if (g == NULL)
7068 i = elf_header.e_shnum;
7069 }
e4b17d5c 7070 }
18bd398b 7071 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
579f31ac 7072 {
18bd398b 7073 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
579f31ac
JJ
7074 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
7075 suffix = SECTION_NAME (unwsec) + len;
7076 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7077 ++i, ++sec)
18bd398b
NC
7078 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
7079 && streq (SECTION_NAME (sec) + len2, suffix))
579f31ac
JJ
7080 break;
7081 }
7082 else
7083 {
7084 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
18bd398b 7085 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
579f31ac
JJ
7086 len = sizeof (ELF_STRING_ia64_unwind) - 1;
7087 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
7088 suffix = "";
18bd398b 7089 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
579f31ac
JJ
7090 suffix = SECTION_NAME (unwsec) + len;
7091 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7092 ++i, ++sec)
18bd398b
NC
7093 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
7094 && streq (SECTION_NAME (sec) + len2, suffix))
579f31ac
JJ
7095 break;
7096 }
7097
7098 if (i == elf_header.e_shnum)
7099 {
7100 printf (_("\nCould not find unwind info section for "));
7101
7102 if (string_table == NULL)
7103 printf ("%d", unwsec->sh_name);
7104 else
74e1a04b 7105 printf ("'%s'", printable_section_name (unwsec));
579f31ac
JJ
7106 }
7107 else
4d6ed7c8 7108 {
4d6ed7c8 7109 aux.info_addr = sec->sh_addr;
3f5e193b 7110 aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
4082ef84
NC
7111 sec->sh_size,
7112 _("unwind info"));
59245841 7113 aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
4d6ed7c8 7114
579f31ac 7115 printf (_("\nUnwind section "));
4d6ed7c8 7116
579f31ac
JJ
7117 if (string_table == NULL)
7118 printf ("%d", unwsec->sh_name);
7119 else
74e1a04b 7120 printf ("'%s'", printable_section_name (unwsec));
4d6ed7c8 7121
579f31ac 7122 printf (_(" at offset 0x%lx contains %lu entries:\n"),
e59b4dfb 7123 (unsigned long) unwsec->sh_offset,
89fac5e3 7124 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
4d6ed7c8 7125
53774b7e
NC
7126 if (slurp_ia64_unwind_table (file, & aux, unwsec)
7127 && aux.table_len > 0)
579f31ac
JJ
7128 dump_ia64_unwind (& aux);
7129
7130 if (aux.table)
7131 free ((char *) aux.table);
7132 if (aux.info)
7133 free ((char *) aux.info);
7134 aux.table = NULL;
7135 aux.info = NULL;
7136 }
4d6ed7c8 7137 }
4d6ed7c8 7138
4d6ed7c8
NC
7139 if (aux.symtab)
7140 free (aux.symtab);
7141 if (aux.strtab)
7142 free ((char *) aux.strtab);
4d6ed7c8
NC
7143}
7144
3f5e193b
NC
7145struct hppa_unw_table_entry
7146 {
7147 struct absaddr start;
7148 struct absaddr end;
948f632f 7149 unsigned int Cannot_unwind:1; /* 0 */
3f5e193b
NC
7150 unsigned int Millicode:1; /* 1 */
7151 unsigned int Millicode_save_sr0:1; /* 2 */
7152 unsigned int Region_description:2; /* 3..4 */
7153 unsigned int reserved1:1; /* 5 */
7154 unsigned int Entry_SR:1; /* 6 */
7155 unsigned int Entry_FR:4; /* number saved */ /* 7..10 */
7156 unsigned int Entry_GR:5; /* number saved */ /* 11..15 */
7157 unsigned int Args_stored:1; /* 16 */
948f632f
DA
7158 unsigned int Variable_Frame:1; /* 17 */
7159 unsigned int Separate_Package_Body:1; /* 18 */
3f5e193b 7160 unsigned int Frame_Extension_Millicode:1; /* 19 */
948f632f
DA
7161 unsigned int Stack_Overflow_Check:1; /* 20 */
7162 unsigned int Two_Instruction_SP_Increment:1;/* 21 */
3f5e193b
NC
7163 unsigned int Ada_Region:1; /* 22 */
7164 unsigned int cxx_info:1; /* 23 */
948f632f
DA
7165 unsigned int cxx_try_catch:1; /* 24 */
7166 unsigned int sched_entry_seq:1; /* 25 */
3f5e193b 7167 unsigned int reserved2:1; /* 26 */
948f632f
DA
7168 unsigned int Save_SP:1; /* 27 */
7169 unsigned int Save_RP:1; /* 28 */
3f5e193b
NC
7170 unsigned int Save_MRP_in_frame:1; /* 29 */
7171 unsigned int extn_ptr_defined:1; /* 30 */
948f632f 7172 unsigned int Cleanup_defined:1; /* 31 */
3f5e193b 7173
948f632f
DA
7174 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
7175 unsigned int HP_UX_interrupt_marker:1; /* 1 */
3f5e193b 7176 unsigned int Large_frame:1; /* 2 */
948f632f 7177 unsigned int Pseudo_SP_Set:1; /* 3 */
3f5e193b
NC
7178 unsigned int reserved4:1; /* 4 */
7179 unsigned int Total_frame_size:27; /* 5..31 */
7180 };
7181
57346661 7182struct hppa_unw_aux_info
948f632f
DA
7183{
7184 struct hppa_unw_table_entry * table; /* Unwind table. */
7185 unsigned long table_len; /* Length of unwind table. */
7186 bfd_vma seg_base; /* Starting address of segment. */
7187 Elf_Internal_Sym * symtab; /* The symbol table. */
7188 unsigned long nsyms; /* Number of symbols. */
7189 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7190 unsigned long nfuns; /* Number of entries in funtab. */
7191 char * strtab; /* The string table. */
7192 unsigned long strtab_size; /* Size of string table. */
7193};
57346661
AM
7194
7195static void
2cf0635d 7196dump_hppa_unwind (struct hppa_unw_aux_info * aux)
57346661 7197{
2cf0635d 7198 struct hppa_unw_table_entry * tp;
948f632f
DA
7199 unsigned long j, nfuns;
7200
7201 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7202 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7203 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7204 aux->funtab[nfuns++] = aux->symtab[j];
7205 aux->nfuns = nfuns;
7206 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
57346661 7207
57346661
AM
7208 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7209 {
7210 bfd_vma offset;
2cf0635d 7211 const char * procname;
57346661 7212
948f632f 7213 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
57346661
AM
7214 aux->strtab_size, tp->start, &procname,
7215 &offset);
7216
7217 fputs ("\n<", stdout);
7218
7219 if (procname)
7220 {
7221 fputs (procname, stdout);
7222
7223 if (offset)
7224 printf ("+%lx", (unsigned long) offset);
7225 }
7226
7227 fputs (">: [", stdout);
7228 print_vma (tp->start.offset, PREFIX_HEX);
7229 fputc ('-', stdout);
7230 print_vma (tp->end.offset, PREFIX_HEX);
7231 printf ("]\n\t");
7232
18bd398b
NC
7233#define PF(_m) if (tp->_m) printf (#_m " ");
7234#define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
57346661
AM
7235 PF(Cannot_unwind);
7236 PF(Millicode);
7237 PF(Millicode_save_sr0);
18bd398b 7238 /* PV(Region_description); */
57346661
AM
7239 PF(Entry_SR);
7240 PV(Entry_FR);
7241 PV(Entry_GR);
7242 PF(Args_stored);
7243 PF(Variable_Frame);
7244 PF(Separate_Package_Body);
7245 PF(Frame_Extension_Millicode);
7246 PF(Stack_Overflow_Check);
7247 PF(Two_Instruction_SP_Increment);
7248 PF(Ada_Region);
7249 PF(cxx_info);
7250 PF(cxx_try_catch);
7251 PF(sched_entry_seq);
7252 PF(Save_SP);
7253 PF(Save_RP);
7254 PF(Save_MRP_in_frame);
7255 PF(extn_ptr_defined);
7256 PF(Cleanup_defined);
7257 PF(MPE_XL_interrupt_marker);
7258 PF(HP_UX_interrupt_marker);
7259 PF(Large_frame);
7260 PF(Pseudo_SP_Set);
7261 PV(Total_frame_size);
7262#undef PF
7263#undef PV
7264 }
7265
18bd398b 7266 printf ("\n");
948f632f
DA
7267
7268 free (aux->funtab);
57346661
AM
7269}
7270
7271static int
2cf0635d
NC
7272slurp_hppa_unwind_table (FILE * file,
7273 struct hppa_unw_aux_info * aux,
7274 Elf_Internal_Shdr * sec)
57346661 7275{
1c0751b2 7276 unsigned long size, unw_ent_size, nentries, nrelas, i;
2cf0635d
NC
7277 Elf_Internal_Phdr * seg;
7278 struct hppa_unw_table_entry * tep;
7279 Elf_Internal_Shdr * relsec;
7280 Elf_Internal_Rela * rela;
7281 Elf_Internal_Rela * rp;
7282 unsigned char * table;
7283 unsigned char * tp;
7284 Elf_Internal_Sym * sym;
7285 const char * relname;
57346661 7286
57346661
AM
7287 /* First, find the starting address of the segment that includes
7288 this section. */
7289
7290 if (elf_header.e_phnum)
7291 {
7292 if (! get_program_headers (file))
7293 return 0;
7294
7295 for (seg = program_headers;
7296 seg < program_headers + elf_header.e_phnum;
7297 ++seg)
7298 {
7299 if (seg->p_type != PT_LOAD)
7300 continue;
7301
7302 if (sec->sh_addr >= seg->p_vaddr
7303 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7304 {
7305 aux->seg_base = seg->p_vaddr;
7306 break;
7307 }
7308 }
7309 }
7310
7311 /* Second, build the unwind table from the contents of the unwind
7312 section. */
7313 size = sec->sh_size;
3f5e193b
NC
7314 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7315 _("unwind table"));
57346661
AM
7316 if (!table)
7317 return 0;
7318
1c0751b2
DA
7319 unw_ent_size = 16;
7320 nentries = size / unw_ent_size;
7321 size = unw_ent_size * nentries;
57346661 7322
3f5e193b
NC
7323 tep = aux->table = (struct hppa_unw_table_entry *)
7324 xcmalloc (nentries, sizeof (aux->table[0]));
57346661 7325
1c0751b2 7326 for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
57346661
AM
7327 {
7328 unsigned int tmp1, tmp2;
7329
7330 tep->start.section = SHN_UNDEF;
7331 tep->end.section = SHN_UNDEF;
7332
1c0751b2
DA
7333 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
7334 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
7335 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
7336 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
7337
7338 tep->start.offset += aux->seg_base;
7339 tep->end.offset += aux->seg_base;
57346661
AM
7340
7341 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
7342 tep->Millicode = (tmp1 >> 30) & 0x1;
7343 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
7344 tep->Region_description = (tmp1 >> 27) & 0x3;
7345 tep->reserved1 = (tmp1 >> 26) & 0x1;
7346 tep->Entry_SR = (tmp1 >> 25) & 0x1;
7347 tep->Entry_FR = (tmp1 >> 21) & 0xf;
7348 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
7349 tep->Args_stored = (tmp1 >> 15) & 0x1;
7350 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
7351 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
7352 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
7353 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
7354 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
7355 tep->Ada_Region = (tmp1 >> 9) & 0x1;
7356 tep->cxx_info = (tmp1 >> 8) & 0x1;
7357 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
7358 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
7359 tep->reserved2 = (tmp1 >> 5) & 0x1;
7360 tep->Save_SP = (tmp1 >> 4) & 0x1;
7361 tep->Save_RP = (tmp1 >> 3) & 0x1;
7362 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
7363 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
7364 tep->Cleanup_defined = tmp1 & 0x1;
7365
7366 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
7367 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
7368 tep->Large_frame = (tmp2 >> 29) & 0x1;
7369 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
7370 tep->reserved4 = (tmp2 >> 27) & 0x1;
7371 tep->Total_frame_size = tmp2 & 0x7ffffff;
57346661
AM
7372 }
7373 free (table);
7374
7375 /* Third, apply any relocations to the unwind table. */
57346661
AM
7376 for (relsec = section_headers;
7377 relsec < section_headers + elf_header.e_shnum;
7378 ++relsec)
7379 {
7380 if (relsec->sh_type != SHT_RELA
4fbb74a6
AM
7381 || relsec->sh_info >= elf_header.e_shnum
7382 || section_headers + relsec->sh_info != sec)
57346661
AM
7383 continue;
7384
7385 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7386 & rela, & nrelas))
7387 return 0;
7388
7389 for (rp = rela; rp < rela + nrelas; ++rp)
7390 {
aca88567
NC
7391 relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
7392 sym = aux->symtab + get_reloc_symindex (rp->r_info);
57346661
AM
7393
7394 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
0112cd26 7395 if (! const_strneq (relname, "R_PARISC_SEGREL"))
57346661
AM
7396 {
7397 warn (_("Skipping unexpected relocation type %s\n"), relname);
7398 continue;
7399 }
7400
7401 i = rp->r_offset / unw_ent_size;
7402
89fac5e3 7403 switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
57346661
AM
7404 {
7405 case 0:
7406 aux->table[i].start.section = sym->st_shndx;
1e456d54 7407 aux->table[i].start.offset = sym->st_value + rp->r_addend;
57346661
AM
7408 break;
7409 case 1:
7410 aux->table[i].end.section = sym->st_shndx;
1e456d54 7411 aux->table[i].end.offset = sym->st_value + rp->r_addend;
57346661
AM
7412 break;
7413 default:
7414 break;
7415 }
7416 }
7417
7418 free (rela);
7419 }
7420
1c0751b2 7421 aux->table_len = nentries;
57346661
AM
7422
7423 return 1;
7424}
7425
1b31d05e 7426static void
2cf0635d 7427hppa_process_unwind (FILE * file)
57346661 7428{
57346661 7429 struct hppa_unw_aux_info aux;
2cf0635d
NC
7430 Elf_Internal_Shdr * unwsec = NULL;
7431 Elf_Internal_Shdr * strsec;
7432 Elf_Internal_Shdr * sec;
18bd398b 7433 unsigned long i;
57346661 7434
c256ffe7 7435 if (string_table == NULL)
1b31d05e
NC
7436 return;
7437
7438 memset (& aux, 0, sizeof (aux));
57346661
AM
7439
7440 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7441 {
c256ffe7 7442 if (sec->sh_type == SHT_SYMTAB
4fbb74a6 7443 && sec->sh_link < elf_header.e_shnum)
57346661 7444 {
ba5cdace 7445 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
57346661 7446
4fbb74a6 7447 strsec = section_headers + sec->sh_link;
4082ef84
NC
7448 if (aux.strtab != NULL)
7449 {
7450 error (_("Multiple auxillary string tables encountered\n"));
7451 free (aux.strtab);
7452 }
3f5e193b
NC
7453 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7454 1, strsec->sh_size,
7455 _("string table"));
c256ffe7 7456 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
57346661 7457 }
18bd398b 7458 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
57346661
AM
7459 unwsec = sec;
7460 }
7461
7462 if (!unwsec)
7463 printf (_("\nThere are no unwind sections in this file.\n"));
7464
7465 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7466 {
18bd398b 7467 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
57346661 7468 {
74e1a04b
NC
7469 printf (_("\nUnwind section '%s' at offset 0x%lx contains %lu entries:\n"),
7470 printable_section_name (sec),
57346661 7471 (unsigned long) sec->sh_offset,
89fac5e3 7472 (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
57346661
AM
7473
7474 slurp_hppa_unwind_table (file, &aux, sec);
7475 if (aux.table_len > 0)
7476 dump_hppa_unwind (&aux);
7477
7478 if (aux.table)
7479 free ((char *) aux.table);
7480 aux.table = NULL;
7481 }
7482 }
7483
7484 if (aux.symtab)
7485 free (aux.symtab);
7486 if (aux.strtab)
7487 free ((char *) aux.strtab);
57346661
AM
7488}
7489
0b6ae522
DJ
7490struct arm_section
7491{
a734115a
NC
7492 unsigned char * data; /* The unwind data. */
7493 Elf_Internal_Shdr * sec; /* The cached unwind section header. */
7494 Elf_Internal_Rela * rela; /* The cached relocations for this section. */
7495 unsigned long nrelas; /* The number of relocations. */
7496 unsigned int rel_type; /* REL or RELA ? */
7497 Elf_Internal_Rela * next_rela; /* Cyclic pointer to the next reloc to process. */
0b6ae522
DJ
7498};
7499
7500struct arm_unw_aux_info
7501{
a734115a
NC
7502 FILE * file; /* The file containing the unwind sections. */
7503 Elf_Internal_Sym * symtab; /* The file's symbol table. */
7504 unsigned long nsyms; /* Number of symbols. */
948f632f
DA
7505 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7506 unsigned long nfuns; /* Number of these symbols. */
a734115a
NC
7507 char * strtab; /* The file's string table. */
7508 unsigned long strtab_size; /* Size of string table. */
0b6ae522
DJ
7509};
7510
7511static const char *
7512arm_print_vma_and_name (struct arm_unw_aux_info *aux,
7513 bfd_vma fn, struct absaddr addr)
7514{
7515 const char *procname;
7516 bfd_vma sym_offset;
7517
7518 if (addr.section == SHN_UNDEF)
7519 addr.offset = fn;
7520
948f632f 7521 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
0b6ae522
DJ
7522 aux->strtab_size, addr, &procname,
7523 &sym_offset);
7524
7525 print_vma (fn, PREFIX_HEX);
7526
7527 if (procname)
7528 {
7529 fputs (" <", stdout);
7530 fputs (procname, stdout);
7531
7532 if (sym_offset)
7533 printf ("+0x%lx", (unsigned long) sym_offset);
7534 fputc ('>', stdout);
7535 }
7536
7537 return procname;
7538}
7539
7540static void
7541arm_free_section (struct arm_section *arm_sec)
7542{
7543 if (arm_sec->data != NULL)
7544 free (arm_sec->data);
7545
7546 if (arm_sec->rela != NULL)
7547 free (arm_sec->rela);
7548}
7549
a734115a
NC
7550/* 1) If SEC does not match the one cached in ARM_SEC, then free the current
7551 cached section and install SEC instead.
7552 2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
7553 and return its valued in * WORDP, relocating if necessary.
1b31d05e 7554 3) Update the NEXT_RELA field in ARM_SEC and store the section index and
a734115a 7555 relocation's offset in ADDR.
1b31d05e
NC
7556 4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
7557 into the string table of the symbol associated with the reloc. If no
7558 reloc was applied store -1 there.
7559 5) Return TRUE upon success, FALSE otherwise. */
a734115a
NC
7560
7561static bfd_boolean
1b31d05e
NC
7562get_unwind_section_word (struct arm_unw_aux_info * aux,
7563 struct arm_section * arm_sec,
7564 Elf_Internal_Shdr * sec,
7565 bfd_vma word_offset,
7566 unsigned int * wordp,
7567 struct absaddr * addr,
7568 bfd_vma * sym_name)
0b6ae522
DJ
7569{
7570 Elf_Internal_Rela *rp;
7571 Elf_Internal_Sym *sym;
7572 const char * relname;
7573 unsigned int word;
7574 bfd_boolean wrapped;
7575
e0a31db1
NC
7576 if (sec == NULL || arm_sec == NULL)
7577 return FALSE;
7578
0b6ae522
DJ
7579 addr->section = SHN_UNDEF;
7580 addr->offset = 0;
7581
1b31d05e
NC
7582 if (sym_name != NULL)
7583 *sym_name = (bfd_vma) -1;
7584
a734115a 7585 /* If necessary, update the section cache. */
0b6ae522
DJ
7586 if (sec != arm_sec->sec)
7587 {
7588 Elf_Internal_Shdr *relsec;
7589
7590 arm_free_section (arm_sec);
7591
7592 arm_sec->sec = sec;
7593 arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
7594 sec->sh_size, _("unwind data"));
0b6ae522
DJ
7595 arm_sec->rela = NULL;
7596 arm_sec->nrelas = 0;
7597
7598 for (relsec = section_headers;
7599 relsec < section_headers + elf_header.e_shnum;
7600 ++relsec)
7601 {
7602 if (relsec->sh_info >= elf_header.e_shnum
1ae40aa4
NC
7603 || section_headers + relsec->sh_info != sec
7604 /* PR 15745: Check the section type as well. */
7605 || (relsec->sh_type != SHT_REL
7606 && relsec->sh_type != SHT_RELA))
0b6ae522
DJ
7607 continue;
7608
a734115a 7609 arm_sec->rel_type = relsec->sh_type;
0b6ae522
DJ
7610 if (relsec->sh_type == SHT_REL)
7611 {
7612 if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
7613 relsec->sh_size,
7614 & arm_sec->rela, & arm_sec->nrelas))
a734115a 7615 return FALSE;
0b6ae522 7616 }
1ae40aa4 7617 else /* relsec->sh_type == SHT_RELA */
0b6ae522
DJ
7618 {
7619 if (!slurp_rela_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 break;
0b6ae522
DJ
7625 }
7626
7627 arm_sec->next_rela = arm_sec->rela;
7628 }
7629
a734115a 7630 /* If there is no unwind data we can do nothing. */
0b6ae522 7631 if (arm_sec->data == NULL)
a734115a 7632 return FALSE;
0b6ae522 7633
e0a31db1 7634 /* If the offset is invalid then fail. */
1a915552
NC
7635 if (word_offset > (sec->sh_size - 4)
7636 /* PR 18879 */
7637 || (sec->sh_size < 5 && word_offset >= sec->sh_size)
7638 || ((bfd_signed_vma) word_offset) < 0)
e0a31db1
NC
7639 return FALSE;
7640
a734115a 7641 /* Get the word at the required offset. */
0b6ae522
DJ
7642 word = byte_get (arm_sec->data + word_offset, 4);
7643
0eff7165
NC
7644 /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128. */
7645 if (arm_sec->rela == NULL)
7646 {
7647 * wordp = word;
7648 return TRUE;
7649 }
7650
a734115a 7651 /* Look through the relocs to find the one that applies to the provided offset. */
0b6ae522
DJ
7652 wrapped = FALSE;
7653 for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
7654 {
7655 bfd_vma prelval, offset;
7656
7657 if (rp->r_offset > word_offset && !wrapped)
7658 {
7659 rp = arm_sec->rela;
7660 wrapped = TRUE;
7661 }
7662 if (rp->r_offset > word_offset)
7663 break;
7664
7665 if (rp->r_offset & 3)
7666 {
7667 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
7668 (unsigned long) rp->r_offset);
7669 continue;
7670 }
7671
7672 if (rp->r_offset < word_offset)
7673 continue;
7674
74e1a04b
NC
7675 /* PR 17531: file: 027-161405-0.004 */
7676 if (aux->symtab == NULL)
7677 continue;
7678
0b6ae522
DJ
7679 if (arm_sec->rel_type == SHT_REL)
7680 {
7681 offset = word & 0x7fffffff;
7682 if (offset & 0x40000000)
7683 offset |= ~ (bfd_vma) 0x7fffffff;
7684 }
a734115a 7685 else if (arm_sec->rel_type == SHT_RELA)
0b6ae522 7686 offset = rp->r_addend;
a734115a 7687 else
74e1a04b
NC
7688 {
7689 error (_("Unknown section relocation type %d encountered\n"),
7690 arm_sec->rel_type);
7691 break;
7692 }
0b6ae522 7693
071436c6
NC
7694 /* PR 17531 file: 027-1241568-0.004. */
7695 if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
7696 {
7697 error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
7698 (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
7699 break;
7700 }
7701
7702 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
0b6ae522
DJ
7703 offset += sym->st_value;
7704 prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
7705
a734115a
NC
7706 /* Check that we are processing the expected reloc type. */
7707 if (elf_header.e_machine == EM_ARM)
7708 {
7709 relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
071436c6
NC
7710 if (relname == NULL)
7711 {
7712 warn (_("Skipping unknown ARM relocation type: %d\n"),
7713 (int) ELF32_R_TYPE (rp->r_info));
7714 continue;
7715 }
a734115a
NC
7716
7717 if (streq (relname, "R_ARM_NONE"))
7718 continue;
0b4362b0 7719
a734115a
NC
7720 if (! streq (relname, "R_ARM_PREL31"))
7721 {
071436c6 7722 warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
a734115a
NC
7723 continue;
7724 }
7725 }
7726 else if (elf_header.e_machine == EM_TI_C6000)
7727 {
7728 relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
071436c6
NC
7729 if (relname == NULL)
7730 {
7731 warn (_("Skipping unknown C6000 relocation type: %d\n"),
7732 (int) ELF32_R_TYPE (rp->r_info));
7733 continue;
7734 }
0b4362b0 7735
a734115a
NC
7736 if (streq (relname, "R_C6000_NONE"))
7737 continue;
7738
7739 if (! streq (relname, "R_C6000_PREL31"))
7740 {
071436c6 7741 warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
a734115a
NC
7742 continue;
7743 }
7744
7745 prelval >>= 1;
7746 }
7747 else
74e1a04b
NC
7748 {
7749 /* This function currently only supports ARM and TI unwinders. */
7750 warn (_("Only TI and ARM unwinders are currently supported\n"));
7751 break;
7752 }
fa197c1c 7753
0b6ae522
DJ
7754 word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
7755 addr->section = sym->st_shndx;
7756 addr->offset = offset;
74e1a04b 7757
1b31d05e
NC
7758 if (sym_name)
7759 * sym_name = sym->st_name;
0b6ae522
DJ
7760 break;
7761 }
7762
7763 *wordp = word;
7764 arm_sec->next_rela = rp;
7765
a734115a 7766 return TRUE;
0b6ae522
DJ
7767}
7768
a734115a
NC
7769static const char *tic6x_unwind_regnames[16] =
7770{
0b4362b0
RM
7771 "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
7772 "A14", "A13", "A12", "A11", "A10",
a734115a
NC
7773 "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
7774};
fa197c1c 7775
0b6ae522 7776static void
fa197c1c 7777decode_tic6x_unwind_regmask (unsigned int mask)
0b6ae522 7778{
fa197c1c
PB
7779 int i;
7780
7781 for (i = 12; mask; mask >>= 1, i--)
7782 {
7783 if (mask & 1)
7784 {
7785 fputs (tic6x_unwind_regnames[i], stdout);
7786 if (mask > 1)
7787 fputs (", ", stdout);
7788 }
7789 }
7790}
0b6ae522
DJ
7791
7792#define ADVANCE \
7793 if (remaining == 0 && more_words) \
7794 { \
7795 data_offset += 4; \
1b31d05e
NC
7796 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, \
7797 data_offset, & word, & addr, NULL)) \
0b6ae522
DJ
7798 return; \
7799 remaining = 4; \
7800 more_words--; \
7801 } \
7802
7803#define GET_OP(OP) \
7804 ADVANCE; \
7805 if (remaining) \
7806 { \
7807 remaining--; \
7808 (OP) = word >> 24; \
7809 word <<= 8; \
7810 } \
7811 else \
7812 { \
2b692964 7813 printf (_("[Truncated opcode]\n")); \
0b6ae522
DJ
7814 return; \
7815 } \
cc5914eb 7816 printf ("0x%02x ", OP)
0b6ae522 7817
fa197c1c 7818static void
948f632f
DA
7819decode_arm_unwind_bytecode (struct arm_unw_aux_info * aux,
7820 unsigned int word,
7821 unsigned int remaining,
7822 unsigned int more_words,
7823 bfd_vma data_offset,
7824 Elf_Internal_Shdr * data_sec,
7825 struct arm_section * data_arm_sec)
fa197c1c
PB
7826{
7827 struct absaddr addr;
0b6ae522
DJ
7828
7829 /* Decode the unwinding instructions. */
7830 while (1)
7831 {
7832 unsigned int op, op2;
7833
7834 ADVANCE;
7835 if (remaining == 0)
7836 break;
7837 remaining--;
7838 op = word >> 24;
7839 word <<= 8;
7840
cc5914eb 7841 printf (" 0x%02x ", op);
0b6ae522
DJ
7842
7843 if ((op & 0xc0) == 0x00)
7844 {
7845 int offset = ((op & 0x3f) << 2) + 4;
61865e30 7846
cc5914eb 7847 printf (" vsp = vsp + %d", offset);
0b6ae522
DJ
7848 }
7849 else if ((op & 0xc0) == 0x40)
7850 {
7851 int offset = ((op & 0x3f) << 2) + 4;
61865e30 7852
cc5914eb 7853 printf (" vsp = vsp - %d", offset);
0b6ae522
DJ
7854 }
7855 else if ((op & 0xf0) == 0x80)
7856 {
7857 GET_OP (op2);
7858 if (op == 0x80 && op2 == 0)
7859 printf (_("Refuse to unwind"));
7860 else
7861 {
7862 unsigned int mask = ((op & 0x0f) << 8) | op2;
7863 int first = 1;
7864 int i;
2b692964 7865
0b6ae522
DJ
7866 printf ("pop {");
7867 for (i = 0; i < 12; i++)
7868 if (mask & (1 << i))
7869 {
7870 if (first)
7871 first = 0;
7872 else
7873 printf (", ");
7874 printf ("r%d", 4 + i);
7875 }
7876 printf ("}");
7877 }
7878 }
7879 else if ((op & 0xf0) == 0x90)
7880 {
7881 if (op == 0x9d || op == 0x9f)
7882 printf (_(" [Reserved]"));
7883 else
cc5914eb 7884 printf (" vsp = r%d", op & 0x0f);
0b6ae522
DJ
7885 }
7886 else if ((op & 0xf0) == 0xa0)
7887 {
7888 int end = 4 + (op & 0x07);
7889 int first = 1;
7890 int i;
61865e30 7891
0b6ae522
DJ
7892 printf (" pop {");
7893 for (i = 4; i <= end; i++)
7894 {
7895 if (first)
7896 first = 0;
7897 else
7898 printf (", ");
7899 printf ("r%d", i);
7900 }
7901 if (op & 0x08)
7902 {
1b31d05e 7903 if (!first)
0b6ae522
DJ
7904 printf (", ");
7905 printf ("r14");
7906 }
7907 printf ("}");
7908 }
7909 else if (op == 0xb0)
7910 printf (_(" finish"));
7911 else if (op == 0xb1)
7912 {
7913 GET_OP (op2);
7914 if (op2 == 0 || (op2 & 0xf0) != 0)
7915 printf (_("[Spare]"));
7916 else
7917 {
7918 unsigned int mask = op2 & 0x0f;
7919 int first = 1;
7920 int i;
61865e30 7921
0b6ae522
DJ
7922 printf ("pop {");
7923 for (i = 0; i < 12; i++)
7924 if (mask & (1 << i))
7925 {
7926 if (first)
7927 first = 0;
7928 else
7929 printf (", ");
7930 printf ("r%d", i);
7931 }
7932 printf ("}");
7933 }
7934 }
7935 else if (op == 0xb2)
7936 {
b115cf96 7937 unsigned char buf[9];
0b6ae522
DJ
7938 unsigned int i, len;
7939 unsigned long offset;
61865e30 7940
b115cf96 7941 for (i = 0; i < sizeof (buf); i++)
0b6ae522
DJ
7942 {
7943 GET_OP (buf[i]);
7944 if ((buf[i] & 0x80) == 0)
7945 break;
7946 }
4082ef84
NC
7947 if (i == sizeof (buf))
7948 printf (_("corrupt change to vsp"));
7949 else
7950 {
7951 offset = read_uleb128 (buf, &len, buf + i + 1);
7952 assert (len == i + 1);
7953 offset = offset * 4 + 0x204;
7954 printf ("vsp = vsp + %ld", offset);
7955 }
0b6ae522 7956 }
61865e30 7957 else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
0b6ae522 7958 {
61865e30
NC
7959 unsigned int first, last;
7960
7961 GET_OP (op2);
7962 first = op2 >> 4;
7963 last = op2 & 0x0f;
7964 if (op == 0xc8)
7965 first = first + 16;
7966 printf ("pop {D%d", first);
7967 if (last)
7968 printf ("-D%d", first + last);
7969 printf ("}");
7970 }
7971 else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
7972 {
7973 unsigned int count = op & 0x07;
7974
7975 printf ("pop {D8");
7976 if (count)
7977 printf ("-D%d", 8 + count);
7978 printf ("}");
7979 }
7980 else if (op >= 0xc0 && op <= 0xc5)
7981 {
7982 unsigned int count = op & 0x07;
7983
7984 printf (" pop {wR10");
7985 if (count)
7986 printf ("-wR%d", 10 + count);
7987 printf ("}");
7988 }
7989 else if (op == 0xc6)
7990 {
7991 unsigned int first, last;
7992
7993 GET_OP (op2);
7994 first = op2 >> 4;
7995 last = op2 & 0x0f;
7996 printf ("pop {wR%d", first);
7997 if (last)
7998 printf ("-wR%d", first + last);
7999 printf ("}");
8000 }
8001 else if (op == 0xc7)
8002 {
8003 GET_OP (op2);
8004 if (op2 == 0 || (op2 & 0xf0) != 0)
8005 printf (_("[Spare]"));
0b6ae522
DJ
8006 else
8007 {
61865e30
NC
8008 unsigned int mask = op2 & 0x0f;
8009 int first = 1;
8010 int i;
8011
8012 printf ("pop {");
8013 for (i = 0; i < 4; i++)
8014 if (mask & (1 << i))
8015 {
8016 if (first)
8017 first = 0;
8018 else
8019 printf (", ");
8020 printf ("wCGR%d", i);
8021 }
8022 printf ("}");
0b6ae522
DJ
8023 }
8024 }
61865e30
NC
8025 else
8026 printf (_(" [unsupported opcode]"));
0b6ae522
DJ
8027 printf ("\n");
8028 }
fa197c1c
PB
8029}
8030
8031static void
948f632f
DA
8032decode_tic6x_unwind_bytecode (struct arm_unw_aux_info * aux,
8033 unsigned int word,
8034 unsigned int remaining,
8035 unsigned int more_words,
8036 bfd_vma data_offset,
8037 Elf_Internal_Shdr * data_sec,
8038 struct arm_section * data_arm_sec)
fa197c1c
PB
8039{
8040 struct absaddr addr;
8041
8042 /* Decode the unwinding instructions. */
8043 while (1)
8044 {
8045 unsigned int op, op2;
8046
8047 ADVANCE;
8048 if (remaining == 0)
8049 break;
8050 remaining--;
8051 op = word >> 24;
8052 word <<= 8;
8053
9cf03b7e 8054 printf (" 0x%02x ", op);
fa197c1c
PB
8055
8056 if ((op & 0xc0) == 0x00)
8057 {
8058 int offset = ((op & 0x3f) << 3) + 8;
9cf03b7e 8059 printf (" sp = sp + %d", offset);
fa197c1c
PB
8060 }
8061 else if ((op & 0xc0) == 0x80)
8062 {
8063 GET_OP (op2);
8064 if (op == 0x80 && op2 == 0)
8065 printf (_("Refuse to unwind"));
8066 else
8067 {
8068 unsigned int mask = ((op & 0x1f) << 8) | op2;
8069 if (op & 0x20)
8070 printf ("pop compact {");
8071 else
8072 printf ("pop {");
8073
8074 decode_tic6x_unwind_regmask (mask);
8075 printf("}");
8076 }
8077 }
8078 else if ((op & 0xf0) == 0xc0)
8079 {
8080 unsigned int reg;
8081 unsigned int nregs;
8082 unsigned int i;
8083 const char *name;
a734115a
NC
8084 struct
8085 {
fa197c1c
PB
8086 unsigned int offset;
8087 unsigned int reg;
8088 } regpos[16];
8089
8090 /* Scan entire instruction first so that GET_OP output is not
8091 interleaved with disassembly. */
8092 nregs = 0;
8093 for (i = 0; nregs < (op & 0xf); i++)
8094 {
8095 GET_OP (op2);
8096 reg = op2 >> 4;
8097 if (reg != 0xf)
8098 {
8099 regpos[nregs].offset = i * 2;
8100 regpos[nregs].reg = reg;
8101 nregs++;
8102 }
8103
8104 reg = op2 & 0xf;
8105 if (reg != 0xf)
8106 {
8107 regpos[nregs].offset = i * 2 + 1;
8108 regpos[nregs].reg = reg;
8109 nregs++;
8110 }
8111 }
8112
8113 printf (_("pop frame {"));
8114 reg = nregs - 1;
8115 for (i = i * 2; i > 0; i--)
8116 {
8117 if (regpos[reg].offset == i - 1)
8118 {
8119 name = tic6x_unwind_regnames[regpos[reg].reg];
8120 if (reg > 0)
8121 reg--;
8122 }
8123 else
8124 name = _("[pad]");
8125
8126 fputs (name, stdout);
8127 if (i > 1)
8128 printf (", ");
8129 }
8130
8131 printf ("}");
8132 }
8133 else if (op == 0xd0)
8134 printf (" MOV FP, SP");
8135 else if (op == 0xd1)
8136 printf (" __c6xabi_pop_rts");
8137 else if (op == 0xd2)
8138 {
8139 unsigned char buf[9];
8140 unsigned int i, len;
8141 unsigned long offset;
a734115a 8142
fa197c1c
PB
8143 for (i = 0; i < sizeof (buf); i++)
8144 {
8145 GET_OP (buf[i]);
8146 if ((buf[i] & 0x80) == 0)
8147 break;
8148 }
0eff7165
NC
8149 /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2. */
8150 if (i == sizeof (buf))
8151 {
8152 printf ("<corrupt sp adjust>\n");
8153 warn (_("Corrupt stack pointer adjustment detected\n"));
8154 return;
8155 }
948f632f 8156
f6f0e17b 8157 offset = read_uleb128 (buf, &len, buf + i + 1);
fa197c1c
PB
8158 assert (len == i + 1);
8159 offset = offset * 8 + 0x408;
8160 printf (_("sp = sp + %ld"), offset);
8161 }
8162 else if ((op & 0xf0) == 0xe0)
8163 {
8164 if ((op & 0x0f) == 7)
8165 printf (" RETURN");
8166 else
8167 printf (" MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
8168 }
8169 else
8170 {
8171 printf (_(" [unsupported opcode]"));
8172 }
8173 putchar ('\n');
8174 }
8175}
8176
8177static bfd_vma
a734115a 8178arm_expand_prel31 (bfd_vma word, bfd_vma where)
fa197c1c
PB
8179{
8180 bfd_vma offset;
8181
8182 offset = word & 0x7fffffff;
8183 if (offset & 0x40000000)
8184 offset |= ~ (bfd_vma) 0x7fffffff;
8185
8186 if (elf_header.e_machine == EM_TI_C6000)
8187 offset <<= 1;
8188
8189 return offset + where;
8190}
8191
8192static void
1b31d05e
NC
8193decode_arm_unwind (struct arm_unw_aux_info * aux,
8194 unsigned int word,
8195 unsigned int remaining,
8196 bfd_vma data_offset,
8197 Elf_Internal_Shdr * data_sec,
8198 struct arm_section * data_arm_sec)
fa197c1c
PB
8199{
8200 int per_index;
8201 unsigned int more_words = 0;
37e14bc3 8202 struct absaddr addr;
1b31d05e 8203 bfd_vma sym_name = (bfd_vma) -1;
fa197c1c
PB
8204
8205 if (remaining == 0)
8206 {
1b31d05e
NC
8207 /* Fetch the first word.
8208 Note - when decoding an object file the address extracted
8209 here will always be 0. So we also pass in the sym_name
8210 parameter so that we can find the symbol associated with
8211 the personality routine. */
8212 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, data_offset,
8213 & word, & addr, & sym_name))
fa197c1c 8214 return;
1b31d05e 8215
fa197c1c
PB
8216 remaining = 4;
8217 }
8218
8219 if ((word & 0x80000000) == 0)
8220 {
8221 /* Expand prel31 for personality routine. */
8222 bfd_vma fn;
8223 const char *procname;
8224
a734115a 8225 fn = arm_expand_prel31 (word, data_sec->sh_addr + data_offset);
fa197c1c 8226 printf (_(" Personality routine: "));
1b31d05e
NC
8227 if (fn == 0
8228 && addr.section == SHN_UNDEF && addr.offset == 0
8229 && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
8230 {
8231 procname = aux->strtab + sym_name;
8232 print_vma (fn, PREFIX_HEX);
8233 if (procname)
8234 {
8235 fputs (" <", stdout);
8236 fputs (procname, stdout);
8237 fputc ('>', stdout);
8238 }
8239 }
8240 else
8241 procname = arm_print_vma_and_name (aux, fn, addr);
fa197c1c
PB
8242 fputc ('\n', stdout);
8243
8244 /* The GCC personality routines use the standard compact
8245 encoding, starting with one byte giving the number of
8246 words. */
8247 if (procname != NULL
8248 && (const_strneq (procname, "__gcc_personality_v0")
8249 || const_strneq (procname, "__gxx_personality_v0")
8250 || const_strneq (procname, "__gcj_personality_v0")
8251 || const_strneq (procname, "__gnu_objc_personality_v0")))
8252 {
8253 remaining = 0;
8254 more_words = 1;
8255 ADVANCE;
8256 if (!remaining)
8257 {
8258 printf (_(" [Truncated data]\n"));
8259 return;
8260 }
8261 more_words = word >> 24;
8262 word <<= 8;
8263 remaining--;
8264 per_index = -1;
8265 }
8266 else
8267 return;
8268 }
8269 else
8270 {
1b31d05e 8271 /* ARM EHABI Section 6.3:
0b4362b0 8272
1b31d05e 8273 An exception-handling table entry for the compact model looks like:
0b4362b0 8274
1b31d05e
NC
8275 31 30-28 27-24 23-0
8276 -- ----- ----- ----
8277 1 0 index Data for personalityRoutine[index] */
8278
8279 if (elf_header.e_machine == EM_ARM
8280 && (word & 0x70000000))
83c257ca 8281 warn (_("Corrupt ARM compact model table entry: %x \n"), word);
1b31d05e 8282
fa197c1c 8283 per_index = (word >> 24) & 0x7f;
1b31d05e 8284 printf (_(" Compact model index: %d\n"), per_index);
fa197c1c
PB
8285 if (per_index == 0)
8286 {
8287 more_words = 0;
8288 word <<= 8;
8289 remaining--;
8290 }
8291 else if (per_index < 3)
8292 {
8293 more_words = (word >> 16) & 0xff;
8294 word <<= 16;
8295 remaining -= 2;
8296 }
8297 }
8298
8299 switch (elf_header.e_machine)
8300 {
8301 case EM_ARM:
8302 if (per_index < 3)
8303 {
8304 decode_arm_unwind_bytecode (aux, word, remaining, more_words,
8305 data_offset, data_sec, data_arm_sec);
8306 }
8307 else
1b31d05e
NC
8308 {
8309 warn (_("Unknown ARM compact model index encountered\n"));
8310 printf (_(" [reserved]\n"));
8311 }
fa197c1c
PB
8312 break;
8313
8314 case EM_TI_C6000:
8315 if (per_index < 3)
8316 {
8317 decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
1b31d05e 8318 data_offset, data_sec, data_arm_sec);
fa197c1c
PB
8319 }
8320 else if (per_index < 5)
8321 {
8322 if (((word >> 17) & 0x7f) == 0x7f)
8323 printf (_(" Restore stack from frame pointer\n"));
8324 else
8325 printf (_(" Stack increment %d\n"), (word >> 14) & 0x1fc);
8326 printf (_(" Registers restored: "));
8327 if (per_index == 4)
8328 printf (" (compact) ");
8329 decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
8330 putchar ('\n');
8331 printf (_(" Return register: %s\n"),
8332 tic6x_unwind_regnames[word & 0xf]);
8333 }
8334 else
1b31d05e 8335 printf (_(" [reserved (%d)]\n"), per_index);
fa197c1c
PB
8336 break;
8337
8338 default:
74e1a04b 8339 error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
1b31d05e 8340 elf_header.e_machine);
fa197c1c 8341 }
0b6ae522
DJ
8342
8343 /* Decode the descriptors. Not implemented. */
8344}
8345
8346static void
8347dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
8348{
8349 struct arm_section exidx_arm_sec, extab_arm_sec;
8350 unsigned int i, exidx_len;
948f632f 8351 unsigned long j, nfuns;
0b6ae522
DJ
8352
8353 memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
8354 memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
8355 exidx_len = exidx_sec->sh_size / 8;
8356
948f632f
DA
8357 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
8358 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
8359 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
8360 aux->funtab[nfuns++] = aux->symtab[j];
8361 aux->nfuns = nfuns;
8362 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
8363
0b6ae522
DJ
8364 for (i = 0; i < exidx_len; i++)
8365 {
8366 unsigned int exidx_fn, exidx_entry;
8367 struct absaddr fn_addr, entry_addr;
8368 bfd_vma fn;
8369
8370 fputc ('\n', stdout);
8371
1b31d05e
NC
8372 if (! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8373 8 * i, & exidx_fn, & fn_addr, NULL)
8374 || ! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8375 8 * i + 4, & exidx_entry, & entry_addr, NULL))
0b6ae522 8376 {
948f632f 8377 free (aux->funtab);
1b31d05e
NC
8378 arm_free_section (& exidx_arm_sec);
8379 arm_free_section (& extab_arm_sec);
0b6ae522
DJ
8380 return;
8381 }
8382
83c257ca
NC
8383 /* ARM EHABI, Section 5:
8384 An index table entry consists of 2 words.
8385 The first word contains a prel31 offset to the start of a function, with bit 31 clear. */
8386 if (exidx_fn & 0x80000000)
8387 warn (_("corrupt index table entry: %x\n"), exidx_fn);
8388
a734115a 8389 fn = arm_expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
0b6ae522 8390
a734115a 8391 arm_print_vma_and_name (aux, fn, fn_addr);
0b6ae522
DJ
8392 fputs (": ", stdout);
8393
8394 if (exidx_entry == 1)
8395 {
8396 print_vma (exidx_entry, PREFIX_HEX);
8397 fputs (" [cantunwind]\n", stdout);
8398 }
8399 else if (exidx_entry & 0x80000000)
8400 {
8401 print_vma (exidx_entry, PREFIX_HEX);
8402 fputc ('\n', stdout);
8403 decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
8404 }
8405 else
8406 {
8f73510c 8407 bfd_vma table, table_offset = 0;
0b6ae522
DJ
8408 Elf_Internal_Shdr *table_sec;
8409
8410 fputs ("@", stdout);
a734115a 8411 table = arm_expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
0b6ae522
DJ
8412 print_vma (table, PREFIX_HEX);
8413 printf ("\n");
8414
8415 /* Locate the matching .ARM.extab. */
8416 if (entry_addr.section != SHN_UNDEF
8417 && entry_addr.section < elf_header.e_shnum)
8418 {
8419 table_sec = section_headers + entry_addr.section;
8420 table_offset = entry_addr.offset;
1a915552
NC
8421 /* PR 18879 */
8422 if (table_offset > table_sec->sh_size
8423 || ((bfd_signed_vma) table_offset) < 0)
8424 {
8425 warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
8426 (unsigned long) table_offset,
8427 printable_section_name (table_sec));
8428 continue;
8429 }
0b6ae522
DJ
8430 }
8431 else
8432 {
8433 table_sec = find_section_by_address (table);
8434 if (table_sec != NULL)
8435 table_offset = table - table_sec->sh_addr;
8436 }
8437 if (table_sec == NULL)
8438 {
8439 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
8440 (unsigned long) table);
8441 continue;
8442 }
8443 decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
8444 &extab_arm_sec);
8445 }
8446 }
8447
8448 printf ("\n");
8449
948f632f 8450 free (aux->funtab);
0b6ae522
DJ
8451 arm_free_section (&exidx_arm_sec);
8452 arm_free_section (&extab_arm_sec);
8453}
8454
fa197c1c 8455/* Used for both ARM and C6X unwinding tables. */
1b31d05e
NC
8456
8457static void
0b6ae522
DJ
8458arm_process_unwind (FILE *file)
8459{
8460 struct arm_unw_aux_info aux;
8461 Elf_Internal_Shdr *unwsec = NULL;
8462 Elf_Internal_Shdr *strsec;
8463 Elf_Internal_Shdr *sec;
8464 unsigned long i;
fa197c1c 8465 unsigned int sec_type;
0b6ae522 8466
fa197c1c
PB
8467 switch (elf_header.e_machine)
8468 {
8469 case EM_ARM:
8470 sec_type = SHT_ARM_EXIDX;
8471 break;
8472
8473 case EM_TI_C6000:
8474 sec_type = SHT_C6000_UNWIND;
8475 break;
8476
0b4362b0 8477 default:
74e1a04b 8478 error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
1b31d05e
NC
8479 elf_header.e_machine);
8480 return;
fa197c1c
PB
8481 }
8482
0b6ae522 8483 if (string_table == NULL)
1b31d05e
NC
8484 return;
8485
8486 memset (& aux, 0, sizeof (aux));
8487 aux.file = file;
0b6ae522
DJ
8488
8489 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8490 {
8491 if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
8492 {
ba5cdace 8493 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
0b6ae522
DJ
8494
8495 strsec = section_headers + sec->sh_link;
74e1a04b
NC
8496
8497 /* PR binutils/17531 file: 011-12666-0.004. */
8498 if (aux.strtab != NULL)
8499 {
4082ef84 8500 error (_("Multiple string tables found in file.\n"));
74e1a04b
NC
8501 free (aux.strtab);
8502 }
0b6ae522
DJ
8503 aux.strtab = get_data (NULL, file, strsec->sh_offset,
8504 1, strsec->sh_size, _("string table"));
8505 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8506 }
fa197c1c 8507 else if (sec->sh_type == sec_type)
0b6ae522
DJ
8508 unwsec = sec;
8509 }
8510
1b31d05e 8511 if (unwsec == NULL)
0b6ae522 8512 printf (_("\nThere are no unwind sections in this file.\n"));
1b31d05e
NC
8513 else
8514 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8515 {
8516 if (sec->sh_type == sec_type)
8517 {
8518 printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
74e1a04b 8519 printable_section_name (sec),
1b31d05e
NC
8520 (unsigned long) sec->sh_offset,
8521 (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
0b6ae522 8522
1b31d05e
NC
8523 dump_arm_unwind (&aux, sec);
8524 }
8525 }
0b6ae522
DJ
8526
8527 if (aux.symtab)
8528 free (aux.symtab);
8529 if (aux.strtab)
8530 free ((char *) aux.strtab);
0b6ae522
DJ
8531}
8532
1b31d05e 8533static void
2cf0635d 8534process_unwind (FILE * file)
57346661 8535{
2cf0635d
NC
8536 struct unwind_handler
8537 {
57346661 8538 int machtype;
1b31d05e 8539 void (* handler)(FILE *);
2cf0635d
NC
8540 } handlers[] =
8541 {
0b6ae522 8542 { EM_ARM, arm_process_unwind },
57346661
AM
8543 { EM_IA_64, ia64_process_unwind },
8544 { EM_PARISC, hppa_process_unwind },
fa197c1c 8545 { EM_TI_C6000, arm_process_unwind },
57346661
AM
8546 { 0, 0 }
8547 };
8548 int i;
8549
8550 if (!do_unwind)
1b31d05e 8551 return;
57346661
AM
8552
8553 for (i = 0; handlers[i].handler != NULL; i++)
8554 if (elf_header.e_machine == handlers[i].machtype)
9f758fdc
NC
8555 {
8556 handlers[i].handler (file);
8557 return;
8558 }
57346661 8559
1b31d05e
NC
8560 printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
8561 get_machine_name (elf_header.e_machine));
57346661
AM
8562}
8563
252b5132 8564static void
2cf0635d 8565dynamic_section_mips_val (Elf_Internal_Dyn * entry)
252b5132
RH
8566{
8567 switch (entry->d_tag)
8568 {
8569 case DT_MIPS_FLAGS:
8570 if (entry->d_un.d_val == 0)
4b68bca3 8571 printf (_("NONE"));
252b5132
RH
8572 else
8573 {
8574 static const char * opts[] =
8575 {
8576 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
8577 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
8578 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
8579 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
8580 "RLD_ORDER_SAFE"
8581 };
8582 unsigned int cnt;
8583 int first = 1;
2b692964 8584
60bca95a 8585 for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
252b5132
RH
8586 if (entry->d_un.d_val & (1 << cnt))
8587 {
8588 printf ("%s%s", first ? "" : " ", opts[cnt]);
8589 first = 0;
8590 }
252b5132
RH
8591 }
8592 break;
103f02d3 8593
252b5132 8594 case DT_MIPS_IVERSION:
d79b3d50 8595 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
4b68bca3 8596 printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
252b5132 8597 else
76ca31c0
NC
8598 {
8599 char buf[40];
8600 sprintf_vma (buf, entry->d_un.d_ptr);
8601 /* Note: coded this way so that there is a single string for translation. */
8602 printf (_("<corrupt: %s>"), buf);
8603 }
252b5132 8604 break;
103f02d3 8605
252b5132
RH
8606 case DT_MIPS_TIME_STAMP:
8607 {
8608 char timebuf[20];
2cf0635d 8609 struct tm * tmp;
91d6fa6a 8610 time_t atime = entry->d_un.d_val;
82b1b41b 8611
91d6fa6a 8612 tmp = gmtime (&atime);
82b1b41b
NC
8613 /* PR 17531: file: 6accc532. */
8614 if (tmp == NULL)
8615 snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
8616 else
8617 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
8618 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8619 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
4b68bca3 8620 printf (_("Time Stamp: %s"), timebuf);
252b5132
RH
8621 }
8622 break;
103f02d3 8623
252b5132
RH
8624 case DT_MIPS_RLD_VERSION:
8625 case DT_MIPS_LOCAL_GOTNO:
8626 case DT_MIPS_CONFLICTNO:
8627 case DT_MIPS_LIBLISTNO:
8628 case DT_MIPS_SYMTABNO:
8629 case DT_MIPS_UNREFEXTNO:
8630 case DT_MIPS_HIPAGENO:
8631 case DT_MIPS_DELTA_CLASS_NO:
8632 case DT_MIPS_DELTA_INSTANCE_NO:
8633 case DT_MIPS_DELTA_RELOC_NO:
8634 case DT_MIPS_DELTA_SYM_NO:
8635 case DT_MIPS_DELTA_CLASSSYM_NO:
8636 case DT_MIPS_COMPACT_SIZE:
4b68bca3 8637 print_vma (entry->d_un.d_ptr, DEC);
252b5132 8638 break;
103f02d3
UD
8639
8640 default:
4b68bca3 8641 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
103f02d3 8642 }
4b68bca3 8643 putchar ('\n');
103f02d3
UD
8644}
8645
103f02d3 8646static void
2cf0635d 8647dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
103f02d3
UD
8648{
8649 switch (entry->d_tag)
8650 {
8651 case DT_HP_DLD_FLAGS:
8652 {
8653 static struct
8654 {
8655 long int bit;
2cf0635d 8656 const char * str;
5e220199
NC
8657 }
8658 flags[] =
8659 {
8660 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
8661 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
8662 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
8663 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
8664 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
8665 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
8666 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
8667 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
8668 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
8669 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
eec8f817
DA
8670 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
8671 { DT_HP_GST, "HP_GST" },
8672 { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
8673 { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
8674 { DT_HP_NODELETE, "HP_NODELETE" },
8675 { DT_HP_GROUP, "HP_GROUP" },
8676 { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
5e220199 8677 };
103f02d3 8678 int first = 1;
5e220199 8679 size_t cnt;
f7a99963 8680 bfd_vma val = entry->d_un.d_val;
103f02d3 8681
60bca95a 8682 for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
103f02d3 8683 if (val & flags[cnt].bit)
30800947
NC
8684 {
8685 if (! first)
8686 putchar (' ');
8687 fputs (flags[cnt].str, stdout);
8688 first = 0;
8689 val ^= flags[cnt].bit;
8690 }
76da6bbe 8691
103f02d3 8692 if (val != 0 || first)
f7a99963
NC
8693 {
8694 if (! first)
8695 putchar (' ');
8696 print_vma (val, HEX);
8697 }
103f02d3
UD
8698 }
8699 break;
76da6bbe 8700
252b5132 8701 default:
f7a99963
NC
8702 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8703 break;
252b5132 8704 }
35b1837e 8705 putchar ('\n');
252b5132
RH
8706}
8707
28f997cf
TG
8708#ifdef BFD64
8709
8710/* VMS vs Unix time offset and factor. */
8711
8712#define VMS_EPOCH_OFFSET 35067168000000000LL
8713#define VMS_GRANULARITY_FACTOR 10000000
8714
8715/* Display a VMS time in a human readable format. */
8716
8717static void
8718print_vms_time (bfd_int64_t vmstime)
8719{
8720 struct tm *tm;
8721 time_t unxtime;
8722
8723 unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
8724 tm = gmtime (&unxtime);
8725 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
8726 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
8727 tm->tm_hour, tm->tm_min, tm->tm_sec);
8728}
8729#endif /* BFD64 */
8730
ecc51f48 8731static void
2cf0635d 8732dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
ecc51f48
NC
8733{
8734 switch (entry->d_tag)
8735 {
0de14b54 8736 case DT_IA_64_PLT_RESERVE:
bdf4d63a 8737 /* First 3 slots reserved. */
ecc51f48
NC
8738 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8739 printf (" -- ");
8740 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
bdf4d63a
JJ
8741 break;
8742
28f997cf
TG
8743 case DT_IA_64_VMS_LINKTIME:
8744#ifdef BFD64
8745 print_vms_time (entry->d_un.d_val);
8746#endif
8747 break;
8748
8749 case DT_IA_64_VMS_LNKFLAGS:
8750 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8751 if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
8752 printf (" CALL_DEBUG");
8753 if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
8754 printf (" NOP0BUFS");
8755 if (entry->d_un.d_val & VMS_LF_P0IMAGE)
8756 printf (" P0IMAGE");
8757 if (entry->d_un.d_val & VMS_LF_MKTHREADS)
8758 printf (" MKTHREADS");
8759 if (entry->d_un.d_val & VMS_LF_UPCALLS)
8760 printf (" UPCALLS");
8761 if (entry->d_un.d_val & VMS_LF_IMGSTA)
8762 printf (" IMGSTA");
8763 if (entry->d_un.d_val & VMS_LF_INITIALIZE)
8764 printf (" INITIALIZE");
8765 if (entry->d_un.d_val & VMS_LF_MAIN)
8766 printf (" MAIN");
8767 if (entry->d_un.d_val & VMS_LF_EXE_INIT)
8768 printf (" EXE_INIT");
8769 if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
8770 printf (" TBK_IN_IMG");
8771 if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
8772 printf (" DBG_IN_IMG");
8773 if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
8774 printf (" TBK_IN_DSF");
8775 if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
8776 printf (" DBG_IN_DSF");
8777 if (entry->d_un.d_val & VMS_LF_SIGNATURES)
8778 printf (" SIGNATURES");
8779 if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
8780 printf (" REL_SEG_OFF");
8781 break;
8782
bdf4d63a
JJ
8783 default:
8784 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8785 break;
ecc51f48 8786 }
bdf4d63a 8787 putchar ('\n');
ecc51f48
NC
8788}
8789
252b5132 8790static int
2cf0635d 8791get_32bit_dynamic_section (FILE * file)
252b5132 8792{
2cf0635d
NC
8793 Elf32_External_Dyn * edyn;
8794 Elf32_External_Dyn * ext;
8795 Elf_Internal_Dyn * entry;
103f02d3 8796
3f5e193b
NC
8797 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8798 dynamic_size, _("dynamic section"));
a6e9f9df
AM
8799 if (!edyn)
8800 return 0;
103f02d3 8801
071436c6
NC
8802 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8803 might not have the luxury of section headers. Look for the DT_NULL
8804 terminator to determine the number of entries. */
ba2685cc 8805 for (ext = edyn, dynamic_nent = 0;
53c3012c 8806 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
ba2685cc
AM
8807 ext++)
8808 {
8809 dynamic_nent++;
8810 if (BYTE_GET (ext->d_tag) == DT_NULL)
8811 break;
8812 }
252b5132 8813
3f5e193b
NC
8814 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8815 sizeof (* entry));
b2d38a17 8816 if (dynamic_section == NULL)
252b5132 8817 {
8b73c356
NC
8818 error (_("Out of memory allocating space for %lu dynamic entries\n"),
8819 (unsigned long) dynamic_nent);
9ea033b2
NC
8820 free (edyn);
8821 return 0;
8822 }
252b5132 8823
fb514b26 8824 for (ext = edyn, entry = dynamic_section;
ba2685cc 8825 entry < dynamic_section + dynamic_nent;
fb514b26 8826 ext++, entry++)
9ea033b2 8827 {
fb514b26
AM
8828 entry->d_tag = BYTE_GET (ext->d_tag);
8829 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
252b5132
RH
8830 }
8831
9ea033b2
NC
8832 free (edyn);
8833
8834 return 1;
8835}
8836
8837static int
2cf0635d 8838get_64bit_dynamic_section (FILE * file)
9ea033b2 8839{
2cf0635d
NC
8840 Elf64_External_Dyn * edyn;
8841 Elf64_External_Dyn * ext;
8842 Elf_Internal_Dyn * entry;
103f02d3 8843
071436c6 8844 /* Read in the data. */
3f5e193b
NC
8845 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8846 dynamic_size, _("dynamic section"));
a6e9f9df
AM
8847 if (!edyn)
8848 return 0;
103f02d3 8849
071436c6
NC
8850 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8851 might not have the luxury of section headers. Look for the DT_NULL
8852 terminator to determine the number of entries. */
ba2685cc 8853 for (ext = edyn, dynamic_nent = 0;
53c3012c
AM
8854 /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer. */
8855 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
ba2685cc
AM
8856 ext++)
8857 {
8858 dynamic_nent++;
66543521 8859 if (BYTE_GET (ext->d_tag) == DT_NULL)
ba2685cc
AM
8860 break;
8861 }
252b5132 8862
3f5e193b
NC
8863 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8864 sizeof (* entry));
b2d38a17 8865 if (dynamic_section == NULL)
252b5132 8866 {
8b73c356
NC
8867 error (_("Out of memory allocating space for %lu dynamic entries\n"),
8868 (unsigned long) dynamic_nent);
252b5132
RH
8869 free (edyn);
8870 return 0;
8871 }
8872
071436c6 8873 /* Convert from external to internal formats. */
fb514b26 8874 for (ext = edyn, entry = dynamic_section;
ba2685cc 8875 entry < dynamic_section + dynamic_nent;
fb514b26 8876 ext++, entry++)
252b5132 8877 {
66543521
AM
8878 entry->d_tag = BYTE_GET (ext->d_tag);
8879 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
252b5132
RH
8880 }
8881
8882 free (edyn);
8883
9ea033b2
NC
8884 return 1;
8885}
8886
e9e44622
JJ
8887static void
8888print_dynamic_flags (bfd_vma flags)
d1133906 8889{
e9e44622 8890 int first = 1;
13ae64f3 8891
d1133906
NC
8892 while (flags)
8893 {
8894 bfd_vma flag;
8895
8896 flag = flags & - flags;
8897 flags &= ~ flag;
8898
e9e44622
JJ
8899 if (first)
8900 first = 0;
8901 else
8902 putc (' ', stdout);
13ae64f3 8903
d1133906
NC
8904 switch (flag)
8905 {
e9e44622
JJ
8906 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
8907 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
8908 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
8909 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
8910 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
2b692964 8911 default: fputs (_("unknown"), stdout); break;
d1133906
NC
8912 }
8913 }
e9e44622 8914 puts ("");
d1133906
NC
8915}
8916
b2d38a17
NC
8917/* Parse and display the contents of the dynamic section. */
8918
9ea033b2 8919static int
2cf0635d 8920process_dynamic_section (FILE * file)
9ea033b2 8921{
2cf0635d 8922 Elf_Internal_Dyn * entry;
9ea033b2
NC
8923
8924 if (dynamic_size == 0)
8925 {
8926 if (do_dynamic)
b2d38a17 8927 printf (_("\nThere is no dynamic section in this file.\n"));
9ea033b2
NC
8928
8929 return 1;
8930 }
8931
8932 if (is_32bit_elf)
8933 {
b2d38a17 8934 if (! get_32bit_dynamic_section (file))
9ea033b2
NC
8935 return 0;
8936 }
b2d38a17 8937 else if (! get_64bit_dynamic_section (file))
9ea033b2
NC
8938 return 0;
8939
252b5132
RH
8940 /* Find the appropriate symbol table. */
8941 if (dynamic_symbols == NULL)
8942 {
86dba8ee
AM
8943 for (entry = dynamic_section;
8944 entry < dynamic_section + dynamic_nent;
8945 ++entry)
252b5132 8946 {
c8286bd1 8947 Elf_Internal_Shdr section;
252b5132
RH
8948
8949 if (entry->d_tag != DT_SYMTAB)
8950 continue;
8951
8952 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
8953
8954 /* Since we do not know how big the symbol table is,
8955 we default to reading in the entire file (!) and
8956 processing that. This is overkill, I know, but it
e3c8793a 8957 should work. */
d93f0186 8958 section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
252b5132 8959
fb52b2f4
NC
8960 if (archive_file_offset != 0)
8961 section.sh_size = archive_file_size - section.sh_offset;
8962 else
8963 {
8964 if (fseek (file, 0, SEEK_END))
591a748a 8965 error (_("Unable to seek to end of file!\n"));
fb52b2f4
NC
8966
8967 section.sh_size = ftell (file) - section.sh_offset;
8968 }
252b5132 8969
9ea033b2 8970 if (is_32bit_elf)
9ad5cbcf 8971 section.sh_entsize = sizeof (Elf32_External_Sym);
9ea033b2 8972 else
9ad5cbcf 8973 section.sh_entsize = sizeof (Elf64_External_Sym);
071436c6 8974 section.sh_name = string_table_length;
252b5132 8975
ba5cdace 8976 dynamic_symbols = GET_ELF_SYMBOLS (file, &section, & num_dynamic_syms);
19936277 8977 if (num_dynamic_syms < 1)
252b5132
RH
8978 {
8979 error (_("Unable to determine the number of symbols to load\n"));
8980 continue;
8981 }
252b5132
RH
8982 }
8983 }
8984
8985 /* Similarly find a string table. */
8986 if (dynamic_strings == NULL)
8987 {
86dba8ee
AM
8988 for (entry = dynamic_section;
8989 entry < dynamic_section + dynamic_nent;
8990 ++entry)
252b5132
RH
8991 {
8992 unsigned long offset;
b34976b6 8993 long str_tab_len;
252b5132
RH
8994
8995 if (entry->d_tag != DT_STRTAB)
8996 continue;
8997
8998 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
8999
9000 /* Since we do not know how big the string table is,
9001 we default to reading in the entire file (!) and
9002 processing that. This is overkill, I know, but it
e3c8793a 9003 should work. */
252b5132 9004
d93f0186 9005 offset = offset_from_vma (file, entry->d_un.d_val, 0);
fb52b2f4
NC
9006
9007 if (archive_file_offset != 0)
9008 str_tab_len = archive_file_size - offset;
9009 else
9010 {
9011 if (fseek (file, 0, SEEK_END))
9012 error (_("Unable to seek to end of file\n"));
9013 str_tab_len = ftell (file) - offset;
9014 }
252b5132
RH
9015
9016 if (str_tab_len < 1)
9017 {
9018 error
9019 (_("Unable to determine the length of the dynamic string table\n"));
9020 continue;
9021 }
9022
3f5e193b
NC
9023 dynamic_strings = (char *) get_data (NULL, file, offset, 1,
9024 str_tab_len,
9025 _("dynamic string table"));
59245841 9026 dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
252b5132
RH
9027 break;
9028 }
9029 }
9030
9031 /* And find the syminfo section if available. */
9032 if (dynamic_syminfo == NULL)
9033 {
3e8bba36 9034 unsigned long syminsz = 0;
252b5132 9035
86dba8ee
AM
9036 for (entry = dynamic_section;
9037 entry < dynamic_section + dynamic_nent;
9038 ++entry)
252b5132
RH
9039 {
9040 if (entry->d_tag == DT_SYMINENT)
9041 {
9042 /* Note: these braces are necessary to avoid a syntax
9043 error from the SunOS4 C compiler. */
049b0c3a
NC
9044 /* PR binutils/17531: A corrupt file can trigger this test.
9045 So do not use an assert, instead generate an error message. */
9046 if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
071436c6 9047 error (_("Bad value (%d) for SYMINENT entry\n"),
049b0c3a 9048 (int) entry->d_un.d_val);
252b5132
RH
9049 }
9050 else if (entry->d_tag == DT_SYMINSZ)
9051 syminsz = entry->d_un.d_val;
9052 else if (entry->d_tag == DT_SYMINFO)
d93f0186
NC
9053 dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
9054 syminsz);
252b5132
RH
9055 }
9056
9057 if (dynamic_syminfo_offset != 0 && syminsz != 0)
9058 {
2cf0635d
NC
9059 Elf_External_Syminfo * extsyminfo;
9060 Elf_External_Syminfo * extsym;
9061 Elf_Internal_Syminfo * syminfo;
252b5132
RH
9062
9063 /* There is a syminfo section. Read the data. */
3f5e193b
NC
9064 extsyminfo = (Elf_External_Syminfo *)
9065 get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
9066 _("symbol information"));
a6e9f9df
AM
9067 if (!extsyminfo)
9068 return 0;
252b5132 9069
3f5e193b 9070 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
252b5132
RH
9071 if (dynamic_syminfo == NULL)
9072 {
8b73c356
NC
9073 error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9074 (unsigned long) syminsz);
252b5132
RH
9075 return 0;
9076 }
9077
9078 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
86dba8ee
AM
9079 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
9080 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
9081 ++syminfo, ++extsym)
252b5132 9082 {
86dba8ee
AM
9083 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
9084 syminfo->si_flags = BYTE_GET (extsym->si_flags);
252b5132
RH
9085 }
9086
9087 free (extsyminfo);
9088 }
9089 }
9090
9091 if (do_dynamic && dynamic_addr)
8b73c356
NC
9092 printf (_("\nDynamic section at offset 0x%lx contains %lu entries:\n"),
9093 dynamic_addr, (unsigned long) dynamic_nent);
252b5132
RH
9094 if (do_dynamic)
9095 printf (_(" Tag Type Name/Value\n"));
9096
86dba8ee
AM
9097 for (entry = dynamic_section;
9098 entry < dynamic_section + dynamic_nent;
9099 entry++)
252b5132
RH
9100 {
9101 if (do_dynamic)
f7a99963 9102 {
2cf0635d 9103 const char * dtype;
e699b9ff 9104
f7a99963
NC
9105 putchar (' ');
9106 print_vma (entry->d_tag, FULL_HEX);
e699b9ff
ILT
9107 dtype = get_dynamic_type (entry->d_tag);
9108 printf (" (%s)%*s", dtype,
9109 ((is_32bit_elf ? 27 : 19)
9110 - (int) strlen (dtype)),
f7a99963
NC
9111 " ");
9112 }
252b5132
RH
9113
9114 switch (entry->d_tag)
9115 {
d1133906
NC
9116 case DT_FLAGS:
9117 if (do_dynamic)
e9e44622 9118 print_dynamic_flags (entry->d_un.d_val);
d1133906 9119 break;
76da6bbe 9120
252b5132
RH
9121 case DT_AUXILIARY:
9122 case DT_FILTER:
019148e4
L
9123 case DT_CONFIG:
9124 case DT_DEPAUDIT:
9125 case DT_AUDIT:
252b5132
RH
9126 if (do_dynamic)
9127 {
019148e4 9128 switch (entry->d_tag)
b34976b6 9129 {
019148e4
L
9130 case DT_AUXILIARY:
9131 printf (_("Auxiliary library"));
9132 break;
9133
9134 case DT_FILTER:
9135 printf (_("Filter library"));
9136 break;
9137
b34976b6 9138 case DT_CONFIG:
019148e4
L
9139 printf (_("Configuration file"));
9140 break;
9141
9142 case DT_DEPAUDIT:
9143 printf (_("Dependency audit library"));
9144 break;
9145
9146 case DT_AUDIT:
9147 printf (_("Audit library"));
9148 break;
9149 }
252b5132 9150
d79b3d50
NC
9151 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9152 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
252b5132 9153 else
f7a99963
NC
9154 {
9155 printf (": ");
9156 print_vma (entry->d_un.d_val, PREFIX_HEX);
9157 putchar ('\n');
9158 }
252b5132
RH
9159 }
9160 break;
9161
dcefbbbd 9162 case DT_FEATURE:
252b5132
RH
9163 if (do_dynamic)
9164 {
9165 printf (_("Flags:"));
86f55779 9166
252b5132
RH
9167 if (entry->d_un.d_val == 0)
9168 printf (_(" None\n"));
9169 else
9170 {
9171 unsigned long int val = entry->d_un.d_val;
86f55779 9172
252b5132
RH
9173 if (val & DTF_1_PARINIT)
9174 {
9175 printf (" PARINIT");
9176 val ^= DTF_1_PARINIT;
9177 }
dcefbbbd
L
9178 if (val & DTF_1_CONFEXP)
9179 {
9180 printf (" CONFEXP");
9181 val ^= DTF_1_CONFEXP;
9182 }
252b5132
RH
9183 if (val != 0)
9184 printf (" %lx", val);
9185 puts ("");
9186 }
9187 }
9188 break;
9189
9190 case DT_POSFLAG_1:
9191 if (do_dynamic)
9192 {
9193 printf (_("Flags:"));
86f55779 9194
252b5132
RH
9195 if (entry->d_un.d_val == 0)
9196 printf (_(" None\n"));
9197 else
9198 {
9199 unsigned long int val = entry->d_un.d_val;
86f55779 9200
252b5132
RH
9201 if (val & DF_P1_LAZYLOAD)
9202 {
9203 printf (" LAZYLOAD");
9204 val ^= DF_P1_LAZYLOAD;
9205 }
9206 if (val & DF_P1_GROUPPERM)
9207 {
9208 printf (" GROUPPERM");
9209 val ^= DF_P1_GROUPPERM;
9210 }
9211 if (val != 0)
9212 printf (" %lx", val);
9213 puts ("");
9214 }
9215 }
9216 break;
9217
9218 case DT_FLAGS_1:
9219 if (do_dynamic)
9220 {
9221 printf (_("Flags:"));
9222 if (entry->d_un.d_val == 0)
9223 printf (_(" None\n"));
9224 else
9225 {
9226 unsigned long int val = entry->d_un.d_val;
86f55779 9227
252b5132
RH
9228 if (val & DF_1_NOW)
9229 {
9230 printf (" NOW");
9231 val ^= DF_1_NOW;
9232 }
9233 if (val & DF_1_GLOBAL)
9234 {
9235 printf (" GLOBAL");
9236 val ^= DF_1_GLOBAL;
9237 }
9238 if (val & DF_1_GROUP)
9239 {
9240 printf (" GROUP");
9241 val ^= DF_1_GROUP;
9242 }
9243 if (val & DF_1_NODELETE)
9244 {
9245 printf (" NODELETE");
9246 val ^= DF_1_NODELETE;
9247 }
9248 if (val & DF_1_LOADFLTR)
9249 {
9250 printf (" LOADFLTR");
9251 val ^= DF_1_LOADFLTR;
9252 }
9253 if (val & DF_1_INITFIRST)
9254 {
9255 printf (" INITFIRST");
9256 val ^= DF_1_INITFIRST;
9257 }
9258 if (val & DF_1_NOOPEN)
9259 {
9260 printf (" NOOPEN");
9261 val ^= DF_1_NOOPEN;
9262 }
9263 if (val & DF_1_ORIGIN)
9264 {
9265 printf (" ORIGIN");
9266 val ^= DF_1_ORIGIN;
9267 }
9268 if (val & DF_1_DIRECT)
9269 {
9270 printf (" DIRECT");
9271 val ^= DF_1_DIRECT;
9272 }
9273 if (val & DF_1_TRANS)
9274 {
9275 printf (" TRANS");
9276 val ^= DF_1_TRANS;
9277 }
9278 if (val & DF_1_INTERPOSE)
9279 {
9280 printf (" INTERPOSE");
9281 val ^= DF_1_INTERPOSE;
9282 }
f7db6139 9283 if (val & DF_1_NODEFLIB)
dcefbbbd 9284 {
f7db6139
L
9285 printf (" NODEFLIB");
9286 val ^= DF_1_NODEFLIB;
dcefbbbd
L
9287 }
9288 if (val & DF_1_NODUMP)
9289 {
9290 printf (" NODUMP");
9291 val ^= DF_1_NODUMP;
9292 }
34b60028 9293 if (val & DF_1_CONFALT)
dcefbbbd 9294 {
34b60028
L
9295 printf (" CONFALT");
9296 val ^= DF_1_CONFALT;
9297 }
9298 if (val & DF_1_ENDFILTEE)
9299 {
9300 printf (" ENDFILTEE");
9301 val ^= DF_1_ENDFILTEE;
9302 }
9303 if (val & DF_1_DISPRELDNE)
9304 {
9305 printf (" DISPRELDNE");
9306 val ^= DF_1_DISPRELDNE;
9307 }
9308 if (val & DF_1_DISPRELPND)
9309 {
9310 printf (" DISPRELPND");
9311 val ^= DF_1_DISPRELPND;
9312 }
9313 if (val & DF_1_NODIRECT)
9314 {
9315 printf (" NODIRECT");
9316 val ^= DF_1_NODIRECT;
9317 }
9318 if (val & DF_1_IGNMULDEF)
9319 {
9320 printf (" IGNMULDEF");
9321 val ^= DF_1_IGNMULDEF;
9322 }
9323 if (val & DF_1_NOKSYMS)
9324 {
9325 printf (" NOKSYMS");
9326 val ^= DF_1_NOKSYMS;
9327 }
9328 if (val & DF_1_NOHDR)
9329 {
9330 printf (" NOHDR");
9331 val ^= DF_1_NOHDR;
9332 }
9333 if (val & DF_1_EDITED)
9334 {
9335 printf (" EDITED");
9336 val ^= DF_1_EDITED;
9337 }
9338 if (val & DF_1_NORELOC)
9339 {
9340 printf (" NORELOC");
9341 val ^= DF_1_NORELOC;
9342 }
9343 if (val & DF_1_SYMINTPOSE)
9344 {
9345 printf (" SYMINTPOSE");
9346 val ^= DF_1_SYMINTPOSE;
9347 }
9348 if (val & DF_1_GLOBAUDIT)
9349 {
9350 printf (" GLOBAUDIT");
9351 val ^= DF_1_GLOBAUDIT;
9352 }
9353 if (val & DF_1_SINGLETON)
9354 {
9355 printf (" SINGLETON");
9356 val ^= DF_1_SINGLETON;
dcefbbbd 9357 }
5c383f02
RO
9358 if (val & DF_1_STUB)
9359 {
9360 printf (" STUB");
9361 val ^= DF_1_STUB;
9362 }
9363 if (val & DF_1_PIE)
9364 {
9365 printf (" PIE");
9366 val ^= DF_1_PIE;
9367 }
252b5132
RH
9368 if (val != 0)
9369 printf (" %lx", val);
9370 puts ("");
9371 }
9372 }
9373 break;
9374
9375 case DT_PLTREL:
566b0d53 9376 dynamic_info[entry->d_tag] = entry->d_un.d_val;
252b5132
RH
9377 if (do_dynamic)
9378 puts (get_dynamic_type (entry->d_un.d_val));
9379 break;
9380
9381 case DT_NULL :
9382 case DT_NEEDED :
9383 case DT_PLTGOT :
9384 case DT_HASH :
9385 case DT_STRTAB :
9386 case DT_SYMTAB :
9387 case DT_RELA :
9388 case DT_INIT :
9389 case DT_FINI :
9390 case DT_SONAME :
9391 case DT_RPATH :
9392 case DT_SYMBOLIC:
9393 case DT_REL :
9394 case DT_DEBUG :
9395 case DT_TEXTREL :
9396 case DT_JMPREL :
019148e4 9397 case DT_RUNPATH :
252b5132
RH
9398 dynamic_info[entry->d_tag] = entry->d_un.d_val;
9399
9400 if (do_dynamic)
9401 {
2cf0635d 9402 char * name;
252b5132 9403
d79b3d50
NC
9404 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9405 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
252b5132 9406 else
d79b3d50 9407 name = NULL;
252b5132
RH
9408
9409 if (name)
9410 {
9411 switch (entry->d_tag)
9412 {
9413 case DT_NEEDED:
9414 printf (_("Shared library: [%s]"), name);
9415
18bd398b 9416 if (streq (name, program_interpreter))
f7a99963 9417 printf (_(" program interpreter"));
252b5132
RH
9418 break;
9419
9420 case DT_SONAME:
f7a99963 9421 printf (_("Library soname: [%s]"), name);
252b5132
RH
9422 break;
9423
9424 case DT_RPATH:
f7a99963 9425 printf (_("Library rpath: [%s]"), name);
252b5132
RH
9426 break;
9427
019148e4
L
9428 case DT_RUNPATH:
9429 printf (_("Library runpath: [%s]"), name);
9430 break;
9431
252b5132 9432 default:
f7a99963
NC
9433 print_vma (entry->d_un.d_val, PREFIX_HEX);
9434 break;
252b5132
RH
9435 }
9436 }
9437 else
f7a99963
NC
9438 print_vma (entry->d_un.d_val, PREFIX_HEX);
9439
9440 putchar ('\n');
252b5132
RH
9441 }
9442 break;
9443
9444 case DT_PLTRELSZ:
9445 case DT_RELASZ :
9446 case DT_STRSZ :
9447 case DT_RELSZ :
9448 case DT_RELAENT :
9449 case DT_SYMENT :
9450 case DT_RELENT :
566b0d53 9451 dynamic_info[entry->d_tag] = entry->d_un.d_val;
252b5132
RH
9452 case DT_PLTPADSZ:
9453 case DT_MOVEENT :
9454 case DT_MOVESZ :
9455 case DT_INIT_ARRAYSZ:
9456 case DT_FINI_ARRAYSZ:
047b2264
JJ
9457 case DT_GNU_CONFLICTSZ:
9458 case DT_GNU_LIBLISTSZ:
252b5132 9459 if (do_dynamic)
f7a99963
NC
9460 {
9461 print_vma (entry->d_un.d_val, UNSIGNED);
2b692964 9462 printf (_(" (bytes)\n"));
f7a99963 9463 }
252b5132
RH
9464 break;
9465
9466 case DT_VERDEFNUM:
9467 case DT_VERNEEDNUM:
9468 case DT_RELACOUNT:
9469 case DT_RELCOUNT:
9470 if (do_dynamic)
f7a99963
NC
9471 {
9472 print_vma (entry->d_un.d_val, UNSIGNED);
9473 putchar ('\n');
9474 }
252b5132
RH
9475 break;
9476
9477 case DT_SYMINSZ:
9478 case DT_SYMINENT:
9479 case DT_SYMINFO:
9480 case DT_USED:
9481 case DT_INIT_ARRAY:
9482 case DT_FINI_ARRAY:
9483 if (do_dynamic)
9484 {
d79b3d50
NC
9485 if (entry->d_tag == DT_USED
9486 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
252b5132 9487 {
2cf0635d 9488 char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
252b5132 9489
b34976b6 9490 if (*name)
252b5132
RH
9491 {
9492 printf (_("Not needed object: [%s]\n"), name);
9493 break;
9494 }
9495 }
103f02d3 9496
f7a99963
NC
9497 print_vma (entry->d_un.d_val, PREFIX_HEX);
9498 putchar ('\n');
252b5132
RH
9499 }
9500 break;
9501
9502 case DT_BIND_NOW:
9503 /* The value of this entry is ignored. */
35b1837e
AM
9504 if (do_dynamic)
9505 putchar ('\n');
252b5132 9506 break;
103f02d3 9507
047b2264
JJ
9508 case DT_GNU_PRELINKED:
9509 if (do_dynamic)
9510 {
2cf0635d 9511 struct tm * tmp;
91d6fa6a 9512 time_t atime = entry->d_un.d_val;
047b2264 9513
91d6fa6a 9514 tmp = gmtime (&atime);
071436c6
NC
9515 /* PR 17533 file: 041-1244816-0.004. */
9516 if (tmp == NULL)
5a2cbcf4
L
9517 printf (_("<corrupt time val: %lx"),
9518 (unsigned long) atime);
071436c6
NC
9519 else
9520 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
9521 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9522 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
047b2264
JJ
9523
9524 }
9525 break;
9526
fdc90cb4
JJ
9527 case DT_GNU_HASH:
9528 dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
9529 if (do_dynamic)
9530 {
9531 print_vma (entry->d_un.d_val, PREFIX_HEX);
9532 putchar ('\n');
9533 }
9534 break;
9535
252b5132
RH
9536 default:
9537 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
b34976b6 9538 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
252b5132
RH
9539 entry->d_un.d_val;
9540
9541 if (do_dynamic)
9542 {
9543 switch (elf_header.e_machine)
9544 {
9545 case EM_MIPS:
4fe85591 9546 case EM_MIPS_RS3_LE:
b2d38a17 9547 dynamic_section_mips_val (entry);
252b5132 9548 break;
103f02d3 9549 case EM_PARISC:
b2d38a17 9550 dynamic_section_parisc_val (entry);
103f02d3 9551 break;
ecc51f48 9552 case EM_IA_64:
b2d38a17 9553 dynamic_section_ia64_val (entry);
ecc51f48 9554 break;
252b5132 9555 default:
f7a99963
NC
9556 print_vma (entry->d_un.d_val, PREFIX_HEX);
9557 putchar ('\n');
252b5132
RH
9558 }
9559 }
9560 break;
9561 }
9562 }
9563
9564 return 1;
9565}
9566
9567static char *
d3ba0551 9568get_ver_flags (unsigned int flags)
252b5132 9569{
b34976b6 9570 static char buff[32];
252b5132
RH
9571
9572 buff[0] = 0;
9573
9574 if (flags == 0)
9575 return _("none");
9576
9577 if (flags & VER_FLG_BASE)
9578 strcat (buff, "BASE ");
9579
9580 if (flags & VER_FLG_WEAK)
9581 {
9582 if (flags & VER_FLG_BASE)
9583 strcat (buff, "| ");
9584
9585 strcat (buff, "WEAK ");
9586 }
9587
44ec90b9
RO
9588 if (flags & VER_FLG_INFO)
9589 {
9590 if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
9591 strcat (buff, "| ");
9592
9593 strcat (buff, "INFO ");
9594 }
9595
9596 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
2b692964 9597 strcat (buff, _("| <unknown>"));
252b5132
RH
9598
9599 return buff;
9600}
9601
9602/* Display the contents of the version sections. */
98fb390a 9603
252b5132 9604static int
2cf0635d 9605process_version_sections (FILE * file)
252b5132 9606{
2cf0635d 9607 Elf_Internal_Shdr * section;
b34976b6
AM
9608 unsigned i;
9609 int found = 0;
252b5132
RH
9610
9611 if (! do_version)
9612 return 1;
9613
9614 for (i = 0, section = section_headers;
9615 i < elf_header.e_shnum;
b34976b6 9616 i++, section++)
252b5132
RH
9617 {
9618 switch (section->sh_type)
9619 {
9620 case SHT_GNU_verdef:
9621 {
2cf0635d 9622 Elf_External_Verdef * edefs;
b34976b6
AM
9623 unsigned int idx;
9624 unsigned int cnt;
2cf0635d 9625 char * endbuf;
252b5132
RH
9626
9627 found = 1;
9628
74e1a04b
NC
9629 printf (_("\nVersion definition section '%s' contains %u entries:\n"),
9630 printable_section_name (section),
9631 section->sh_info);
252b5132
RH
9632
9633 printf (_(" Addr: 0x"));
9634 printf_vma (section->sh_addr);
74e1a04b 9635 printf (_(" Offset: %#08lx Link: %u (%s)"),
1b228002 9636 (unsigned long) section->sh_offset, section->sh_link,
74e1a04b 9637 printable_section_name_from_index (section->sh_link));
252b5132 9638
3f5e193b
NC
9639 edefs = (Elf_External_Verdef *)
9640 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
9641 _("version definition section"));
a6e9f9df
AM
9642 if (!edefs)
9643 break;
59245841 9644 endbuf = (char *) edefs + section->sh_size;
252b5132 9645
b34976b6 9646 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
252b5132 9647 {
2cf0635d
NC
9648 char * vstart;
9649 Elf_External_Verdef * edef;
b34976b6 9650 Elf_Internal_Verdef ent;
2cf0635d 9651 Elf_External_Verdaux * eaux;
b34976b6
AM
9652 Elf_Internal_Verdaux aux;
9653 int j;
9654 int isum;
103f02d3 9655
7e26601c
NC
9656 /* Check for very large indicies. */
9657 if (idx > (size_t) (endbuf - (char *) edefs))
dd24e3da
NC
9658 break;
9659
252b5132 9660 vstart = ((char *) edefs) + idx;
54806181
AM
9661 if (vstart + sizeof (*edef) > endbuf)
9662 break;
252b5132
RH
9663
9664 edef = (Elf_External_Verdef *) vstart;
9665
9666 ent.vd_version = BYTE_GET (edef->vd_version);
9667 ent.vd_flags = BYTE_GET (edef->vd_flags);
9668 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
9669 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
9670 ent.vd_hash = BYTE_GET (edef->vd_hash);
9671 ent.vd_aux = BYTE_GET (edef->vd_aux);
9672 ent.vd_next = BYTE_GET (edef->vd_next);
9673
9674 printf (_(" %#06x: Rev: %d Flags: %s"),
9675 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
9676
9677 printf (_(" Index: %d Cnt: %d "),
9678 ent.vd_ndx, ent.vd_cnt);
9679
dd24e3da 9680 /* Check for overflow. */
7e26601c 9681 if (ent.vd_aux > (size_t) (endbuf - vstart))
dd24e3da
NC
9682 break;
9683
252b5132
RH
9684 vstart += ent.vd_aux;
9685
9686 eaux = (Elf_External_Verdaux *) vstart;
9687
9688 aux.vda_name = BYTE_GET (eaux->vda_name);
9689 aux.vda_next = BYTE_GET (eaux->vda_next);
9690
d79b3d50
NC
9691 if (VALID_DYNAMIC_NAME (aux.vda_name))
9692 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
252b5132
RH
9693 else
9694 printf (_("Name index: %ld\n"), aux.vda_name);
9695
9696 isum = idx + ent.vd_aux;
9697
b34976b6 9698 for (j = 1; j < ent.vd_cnt; j++)
252b5132 9699 {
dd24e3da 9700 /* Check for overflow. */
7e26601c 9701 if (aux.vda_next > (size_t) (endbuf - vstart))
dd24e3da
NC
9702 break;
9703
252b5132
RH
9704 isum += aux.vda_next;
9705 vstart += aux.vda_next;
9706
9707 eaux = (Elf_External_Verdaux *) vstart;
54806181
AM
9708 if (vstart + sizeof (*eaux) > endbuf)
9709 break;
252b5132
RH
9710
9711 aux.vda_name = BYTE_GET (eaux->vda_name);
9712 aux.vda_next = BYTE_GET (eaux->vda_next);
9713
d79b3d50 9714 if (VALID_DYNAMIC_NAME (aux.vda_name))
252b5132 9715 printf (_(" %#06x: Parent %d: %s\n"),
d79b3d50 9716 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
252b5132
RH
9717 else
9718 printf (_(" %#06x: Parent %d, name index: %ld\n"),
9719 isum, j, aux.vda_name);
9720 }
dd24e3da 9721
54806181
AM
9722 if (j < ent.vd_cnt)
9723 printf (_(" Version def aux past end of section\n"));
252b5132 9724
5d921cbd
NC
9725 /* PR 17531: file: id:000001,src:000172+005151,op:splice,rep:2. */
9726 if (idx + ent.vd_next <= idx)
9727 break;
9728
252b5132
RH
9729 idx += ent.vd_next;
9730 }
dd24e3da 9731
54806181
AM
9732 if (cnt < section->sh_info)
9733 printf (_(" Version definition past end of section\n"));
252b5132
RH
9734
9735 free (edefs);
9736 }
9737 break;
103f02d3 9738
252b5132
RH
9739 case SHT_GNU_verneed:
9740 {
2cf0635d 9741 Elf_External_Verneed * eneed;
b34976b6
AM
9742 unsigned int idx;
9743 unsigned int cnt;
2cf0635d 9744 char * endbuf;
252b5132
RH
9745
9746 found = 1;
9747
72de5009 9748 printf (_("\nVersion needs section '%s' contains %u entries:\n"),
74e1a04b 9749 printable_section_name (section), section->sh_info);
252b5132
RH
9750
9751 printf (_(" Addr: 0x"));
9752 printf_vma (section->sh_addr);
72de5009 9753 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
1b228002 9754 (unsigned long) section->sh_offset, section->sh_link,
74e1a04b 9755 printable_section_name_from_index (section->sh_link));
252b5132 9756
3f5e193b
NC
9757 eneed = (Elf_External_Verneed *) get_data (NULL, file,
9758 section->sh_offset, 1,
9759 section->sh_size,
9cf03b7e 9760 _("Version Needs section"));
a6e9f9df
AM
9761 if (!eneed)
9762 break;
59245841 9763 endbuf = (char *) eneed + section->sh_size;
252b5132
RH
9764
9765 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9766 {
2cf0635d 9767 Elf_External_Verneed * entry;
b34976b6
AM
9768 Elf_Internal_Verneed ent;
9769 int j;
9770 int isum;
2cf0635d 9771 char * vstart;
252b5132 9772
7e26601c 9773 if (idx > (size_t) (endbuf - (char *) eneed))
dd24e3da
NC
9774 break;
9775
252b5132 9776 vstart = ((char *) eneed) + idx;
54806181
AM
9777 if (vstart + sizeof (*entry) > endbuf)
9778 break;
252b5132
RH
9779
9780 entry = (Elf_External_Verneed *) vstart;
9781
9782 ent.vn_version = BYTE_GET (entry->vn_version);
9783 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
9784 ent.vn_file = BYTE_GET (entry->vn_file);
9785 ent.vn_aux = BYTE_GET (entry->vn_aux);
9786 ent.vn_next = BYTE_GET (entry->vn_next);
9787
9788 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
9789
d79b3d50
NC
9790 if (VALID_DYNAMIC_NAME (ent.vn_file))
9791 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
252b5132
RH
9792 else
9793 printf (_(" File: %lx"), ent.vn_file);
9794
9795 printf (_(" Cnt: %d\n"), ent.vn_cnt);
9796
dd24e3da 9797 /* Check for overflow. */
7e26601c 9798 if (ent.vn_aux > (size_t) (endbuf - vstart))
dd24e3da 9799 break;
252b5132
RH
9800 vstart += ent.vn_aux;
9801
9802 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
9803 {
2cf0635d 9804 Elf_External_Vernaux * eaux;
b34976b6 9805 Elf_Internal_Vernaux aux;
252b5132 9806
54806181
AM
9807 if (vstart + sizeof (*eaux) > endbuf)
9808 break;
252b5132
RH
9809 eaux = (Elf_External_Vernaux *) vstart;
9810
9811 aux.vna_hash = BYTE_GET (eaux->vna_hash);
9812 aux.vna_flags = BYTE_GET (eaux->vna_flags);
9813 aux.vna_other = BYTE_GET (eaux->vna_other);
9814 aux.vna_name = BYTE_GET (eaux->vna_name);
9815 aux.vna_next = BYTE_GET (eaux->vna_next);
9816
d79b3d50 9817 if (VALID_DYNAMIC_NAME (aux.vna_name))
ecc2063b 9818 printf (_(" %#06x: Name: %s"),
d79b3d50 9819 isum, GET_DYNAMIC_NAME (aux.vna_name));
252b5132 9820 else
ecc2063b 9821 printf (_(" %#06x: Name index: %lx"),
252b5132
RH
9822 isum, aux.vna_name);
9823
9824 printf (_(" Flags: %s Version: %d\n"),
9825 get_ver_flags (aux.vna_flags), aux.vna_other);
9826
dd24e3da 9827 /* Check for overflow. */
53774b7e
NC
9828 if (aux.vna_next > (size_t) (endbuf - vstart)
9829 || (aux.vna_next == 0 && j < ent.vn_cnt - 1))
9830 {
9831 warn (_("Invalid vna_next field of %lx\n"),
9832 aux.vna_next);
9833 j = ent.vn_cnt;
9834 break;
9835 }
252b5132
RH
9836 isum += aux.vna_next;
9837 vstart += aux.vna_next;
9838 }
9cf03b7e 9839
54806181 9840 if (j < ent.vn_cnt)
9cf03b7e 9841 warn (_("Missing Version Needs auxillary information\n"));
252b5132 9842
bcf83b2a 9843 if (ent.vn_next == 0 && cnt < section->sh_info - 1)
c24cf8b6
NC
9844 {
9845 warn (_("Corrupt Version Needs structure - offset to next structure is zero with entries still left to be processed\n"));
9846 cnt = section->sh_info;
9847 break;
9848 }
252b5132
RH
9849 idx += ent.vn_next;
9850 }
9cf03b7e 9851
54806181 9852 if (cnt < section->sh_info)
9cf03b7e 9853 warn (_("Missing Version Needs information\n"));
103f02d3 9854
252b5132
RH
9855 free (eneed);
9856 }
9857 break;
9858
9859 case SHT_GNU_versym:
9860 {
2cf0635d 9861 Elf_Internal_Shdr * link_section;
8b73c356
NC
9862 size_t total;
9863 unsigned int cnt;
2cf0635d
NC
9864 unsigned char * edata;
9865 unsigned short * data;
9866 char * strtab;
9867 Elf_Internal_Sym * symbols;
9868 Elf_Internal_Shdr * string_sec;
ba5cdace 9869 unsigned long num_syms;
d3ba0551 9870 long off;
252b5132 9871
4fbb74a6 9872 if (section->sh_link >= elf_header.e_shnum)
c256ffe7
JJ
9873 break;
9874
4fbb74a6 9875 link_section = section_headers + section->sh_link;
08d8fa11 9876 total = section->sh_size / sizeof (Elf_External_Versym);
252b5132 9877
4fbb74a6 9878 if (link_section->sh_link >= elf_header.e_shnum)
c256ffe7
JJ
9879 break;
9880
252b5132
RH
9881 found = 1;
9882
ba5cdace 9883 symbols = GET_ELF_SYMBOLS (file, link_section, & num_syms);
dd24e3da
NC
9884 if (symbols == NULL)
9885 break;
252b5132 9886
4fbb74a6 9887 string_sec = section_headers + link_section->sh_link;
252b5132 9888
3f5e193b
NC
9889 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
9890 string_sec->sh_size,
9891 _("version string table"));
a6e9f9df 9892 if (!strtab)
0429c154
MS
9893 {
9894 free (symbols);
9895 break;
9896 }
252b5132 9897
8b73c356
NC
9898 printf (_("\nVersion symbols section '%s' contains %lu entries:\n"),
9899 printable_section_name (section), (unsigned long) total);
252b5132
RH
9900
9901 printf (_(" Addr: "));
9902 printf_vma (section->sh_addr);
72de5009 9903 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
1b228002 9904 (unsigned long) section->sh_offset, section->sh_link,
74e1a04b 9905 printable_section_name (link_section));
252b5132 9906
d3ba0551
AM
9907 off = offset_from_vma (file,
9908 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
9909 total * sizeof (short));
3f5e193b
NC
9910 edata = (unsigned char *) get_data (NULL, file, off, total,
9911 sizeof (short),
9912 _("version symbol data"));
a6e9f9df
AM
9913 if (!edata)
9914 {
9915 free (strtab);
0429c154 9916 free (symbols);
a6e9f9df
AM
9917 break;
9918 }
252b5132 9919
3f5e193b 9920 data = (short unsigned int *) cmalloc (total, sizeof (short));
252b5132
RH
9921
9922 for (cnt = total; cnt --;)
b34976b6
AM
9923 data[cnt] = byte_get (edata + cnt * sizeof (short),
9924 sizeof (short));
252b5132
RH
9925
9926 free (edata);
9927
9928 for (cnt = 0; cnt < total; cnt += 4)
9929 {
9930 int j, nn;
ab273396
AM
9931 char *name;
9932 char *invalid = _("*invalid*");
252b5132
RH
9933
9934 printf (" %03x:", cnt);
9935
9936 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
b34976b6 9937 switch (data[cnt + j])
252b5132
RH
9938 {
9939 case 0:
9940 fputs (_(" 0 (*local*) "), stdout);
9941 break;
9942
9943 case 1:
9944 fputs (_(" 1 (*global*) "), stdout);
9945 break;
9946
9947 default:
c244d050
NC
9948 nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
9949 data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
252b5132 9950
dd24e3da 9951 /* If this index value is greater than the size of the symbols
ba5cdace
NC
9952 array, break to avoid an out-of-bounds read. */
9953 if ((unsigned long)(cnt + j) >= num_syms)
dd24e3da
NC
9954 {
9955 warn (_("invalid index into symbol array\n"));
9956 break;
9957 }
9958
ab273396
AM
9959 name = NULL;
9960 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
252b5132 9961 {
b34976b6
AM
9962 Elf_Internal_Verneed ivn;
9963 unsigned long offset;
252b5132 9964
d93f0186
NC
9965 offset = offset_from_vma
9966 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
9967 sizeof (Elf_External_Verneed));
252b5132 9968
b34976b6 9969 do
252b5132 9970 {
b34976b6
AM
9971 Elf_Internal_Vernaux ivna;
9972 Elf_External_Verneed evn;
9973 Elf_External_Vernaux evna;
9974 unsigned long a_off;
252b5132 9975
59245841
NC
9976 if (get_data (&evn, file, offset, sizeof (evn), 1,
9977 _("version need")) == NULL)
9978 break;
0b4362b0 9979
252b5132
RH
9980 ivn.vn_aux = BYTE_GET (evn.vn_aux);
9981 ivn.vn_next = BYTE_GET (evn.vn_next);
9982
9983 a_off = offset + ivn.vn_aux;
9984
9985 do
9986 {
59245841
NC
9987 if (get_data (&evna, file, a_off, sizeof (evna),
9988 1, _("version need aux (2)")) == NULL)
9989 {
9990 ivna.vna_next = 0;
9991 ivna.vna_other = 0;
9992 }
9993 else
9994 {
9995 ivna.vna_next = BYTE_GET (evna.vna_next);
9996 ivna.vna_other = BYTE_GET (evna.vna_other);
9997 }
252b5132
RH
9998
9999 a_off += ivna.vna_next;
10000 }
b34976b6 10001 while (ivna.vna_other != data[cnt + j]
252b5132
RH
10002 && ivna.vna_next != 0);
10003
b34976b6 10004 if (ivna.vna_other == data[cnt + j])
252b5132
RH
10005 {
10006 ivna.vna_name = BYTE_GET (evna.vna_name);
10007
54806181 10008 if (ivna.vna_name >= string_sec->sh_size)
ab273396 10009 name = invalid;
54806181
AM
10010 else
10011 name = strtab + ivna.vna_name;
252b5132
RH
10012 break;
10013 }
10014
10015 offset += ivn.vn_next;
10016 }
10017 while (ivn.vn_next);
10018 }
00d93f34 10019
ab273396 10020 if (data[cnt + j] != 0x8001
b34976b6 10021 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
252b5132 10022 {
b34976b6
AM
10023 Elf_Internal_Verdef ivd;
10024 Elf_External_Verdef evd;
10025 unsigned long offset;
252b5132 10026
d93f0186
NC
10027 offset = offset_from_vma
10028 (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10029 sizeof evd);
252b5132
RH
10030
10031 do
10032 {
59245841
NC
10033 if (get_data (&evd, file, offset, sizeof (evd), 1,
10034 _("version def")) == NULL)
10035 {
10036 ivd.vd_next = 0;
948f632f 10037 /* PR 17531: file: 046-1082287-0.004. */
3102e897
NC
10038 ivd.vd_ndx = (data[cnt + j] & VERSYM_VERSION) + 1;
10039 break;
59245841
NC
10040 }
10041 else
10042 {
10043 ivd.vd_next = BYTE_GET (evd.vd_next);
10044 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10045 }
252b5132
RH
10046
10047 offset += ivd.vd_next;
10048 }
c244d050 10049 while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
252b5132
RH
10050 && ivd.vd_next != 0);
10051
c244d050 10052 if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
252b5132 10053 {
b34976b6
AM
10054 Elf_External_Verdaux evda;
10055 Elf_Internal_Verdaux ivda;
252b5132
RH
10056
10057 ivd.vd_aux = BYTE_GET (evd.vd_aux);
10058
59245841
NC
10059 if (get_data (&evda, file,
10060 offset - ivd.vd_next + ivd.vd_aux,
10061 sizeof (evda), 1,
10062 _("version def aux")) == NULL)
10063 break;
252b5132
RH
10064
10065 ivda.vda_name = BYTE_GET (evda.vda_name);
10066
54806181 10067 if (ivda.vda_name >= string_sec->sh_size)
ab273396
AM
10068 name = invalid;
10069 else if (name != NULL && name != invalid)
10070 name = _("*both*");
54806181
AM
10071 else
10072 name = strtab + ivda.vda_name;
252b5132
RH
10073 }
10074 }
ab273396
AM
10075 if (name != NULL)
10076 nn += printf ("(%s%-*s",
10077 name,
10078 12 - (int) strlen (name),
10079 ")");
252b5132
RH
10080
10081 if (nn < 18)
10082 printf ("%*c", 18 - nn, ' ');
10083 }
10084
10085 putchar ('\n');
10086 }
10087
10088 free (data);
10089 free (strtab);
10090 free (symbols);
10091 }
10092 break;
103f02d3 10093
252b5132
RH
10094 default:
10095 break;
10096 }
10097 }
10098
10099 if (! found)
10100 printf (_("\nNo version information found in this file.\n"));
10101
10102 return 1;
10103}
10104
d1133906 10105static const char *
d3ba0551 10106get_symbol_binding (unsigned int binding)
252b5132 10107{
b34976b6 10108 static char buff[32];
252b5132
RH
10109
10110 switch (binding)
10111 {
b34976b6
AM
10112 case STB_LOCAL: return "LOCAL";
10113 case STB_GLOBAL: return "GLOBAL";
10114 case STB_WEAK: return "WEAK";
252b5132
RH
10115 default:
10116 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
e9e44622
JJ
10117 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
10118 binding);
252b5132 10119 else if (binding >= STB_LOOS && binding <= STB_HIOS)
3e7a7d11
NC
10120 {
10121 if (binding == STB_GNU_UNIQUE
9c55345c
TS
10122 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10123 /* GNU is still using the default value 0. */
3e7a7d11
NC
10124 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10125 return "UNIQUE";
10126 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
10127 }
252b5132 10128 else
e9e44622 10129 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
252b5132
RH
10130 return buff;
10131 }
10132}
10133
d1133906 10134static const char *
d3ba0551 10135get_symbol_type (unsigned int type)
252b5132 10136{
b34976b6 10137 static char buff[32];
252b5132
RH
10138
10139 switch (type)
10140 {
b34976b6
AM
10141 case STT_NOTYPE: return "NOTYPE";
10142 case STT_OBJECT: return "OBJECT";
10143 case STT_FUNC: return "FUNC";
10144 case STT_SECTION: return "SECTION";
10145 case STT_FILE: return "FILE";
10146 case STT_COMMON: return "COMMON";
10147 case STT_TLS: return "TLS";
15ab5209
DB
10148 case STT_RELC: return "RELC";
10149 case STT_SRELC: return "SRELC";
252b5132
RH
10150 default:
10151 if (type >= STT_LOPROC && type <= STT_HIPROC)
df75f1af 10152 {
3510a7b8
NC
10153 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
10154 return "THUMB_FUNC";
103f02d3 10155
351b4b40 10156 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
103f02d3
UD
10157 return "REGISTER";
10158
10159 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
10160 return "PARISC_MILLI";
10161
e9e44622 10162 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
df75f1af 10163 }
252b5132 10164 else if (type >= STT_LOOS && type <= STT_HIOS)
103f02d3
UD
10165 {
10166 if (elf_header.e_machine == EM_PARISC)
10167 {
10168 if (type == STT_HP_OPAQUE)
10169 return "HP_OPAQUE";
10170 if (type == STT_HP_STUB)
10171 return "HP_STUB";
10172 }
10173
d8045f23 10174 if (type == STT_GNU_IFUNC
9c55345c 10175 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
83c257ca 10176 || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
9c55345c 10177 /* GNU is still using the default value 0. */
d8045f23
NC
10178 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10179 return "IFUNC";
10180
e9e44622 10181 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
103f02d3 10182 }
252b5132 10183 else
e9e44622 10184 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
252b5132
RH
10185 return buff;
10186 }
10187}
10188
d1133906 10189static const char *
d3ba0551 10190get_symbol_visibility (unsigned int visibility)
d1133906
NC
10191{
10192 switch (visibility)
10193 {
b34976b6
AM
10194 case STV_DEFAULT: return "DEFAULT";
10195 case STV_INTERNAL: return "INTERNAL";
10196 case STV_HIDDEN: return "HIDDEN";
d1133906 10197 case STV_PROTECTED: return "PROTECTED";
bee0ee85
NC
10198 default:
10199 error (_("Unrecognized visibility value: %u"), visibility);
10200 return _("<unknown>");
d1133906
NC
10201 }
10202}
10203
5e2b0d47
NC
10204static const char *
10205get_mips_symbol_other (unsigned int other)
10206{
10207 switch (other)
10208 {
df58fc94
RS
10209 case STO_OPTIONAL:
10210 return "OPTIONAL";
10211 case STO_MIPS_PLT:
10212 return "MIPS PLT";
10213 case STO_MIPS_PIC:
10214 return "MIPS PIC";
10215 case STO_MICROMIPS:
10216 return "MICROMIPS";
10217 case STO_MICROMIPS | STO_MIPS_PIC:
10218 return "MICROMIPS, MIPS PIC";
10219 case STO_MIPS16:
10220 return "MIPS16";
10221 default:
10222 return NULL;
5e2b0d47
NC
10223 }
10224}
10225
28f997cf
TG
10226static const char *
10227get_ia64_symbol_other (unsigned int other)
10228{
10229 if (is_ia64_vms ())
10230 {
10231 static char res[32];
10232
10233 res[0] = 0;
10234
10235 /* Function types is for images and .STB files only. */
10236 switch (elf_header.e_type)
10237 {
10238 case ET_DYN:
10239 case ET_EXEC:
10240 switch (VMS_ST_FUNC_TYPE (other))
10241 {
10242 case VMS_SFT_CODE_ADDR:
10243 strcat (res, " CA");
10244 break;
10245 case VMS_SFT_SYMV_IDX:
10246 strcat (res, " VEC");
10247 break;
10248 case VMS_SFT_FD:
10249 strcat (res, " FD");
10250 break;
10251 case VMS_SFT_RESERVE:
10252 strcat (res, " RSV");
10253 break;
10254 default:
bee0ee85
NC
10255 warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
10256 VMS_ST_FUNC_TYPE (other));
10257 strcat (res, " <unknown>");
10258 break;
28f997cf
TG
10259 }
10260 break;
10261 default:
10262 break;
10263 }
10264 switch (VMS_ST_LINKAGE (other))
10265 {
10266 case VMS_STL_IGNORE:
10267 strcat (res, " IGN");
10268 break;
10269 case VMS_STL_RESERVE:
10270 strcat (res, " RSV");
10271 break;
10272 case VMS_STL_STD:
10273 strcat (res, " STD");
10274 break;
10275 case VMS_STL_LNK:
10276 strcat (res, " LNK");
10277 break;
10278 default:
bee0ee85
NC
10279 warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
10280 VMS_ST_LINKAGE (other));
10281 strcat (res, " <unknown>");
10282 break;
28f997cf
TG
10283 }
10284
10285 if (res[0] != 0)
10286 return res + 1;
10287 else
10288 return res;
10289 }
10290 return NULL;
10291}
10292
6911b7dc
AM
10293static const char *
10294get_ppc64_symbol_other (unsigned int other)
10295{
10296 if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
10297 {
10298 static char buf[32];
10299 snprintf (buf, sizeof buf, _("<localentry>: %d"),
10300 PPC64_LOCAL_ENTRY_OFFSET (other));
10301 return buf;
10302 }
10303 return NULL;
10304}
10305
5e2b0d47
NC
10306static const char *
10307get_symbol_other (unsigned int other)
10308{
10309 const char * result = NULL;
10310 static char buff [32];
10311
10312 if (other == 0)
10313 return "";
10314
10315 switch (elf_header.e_machine)
10316 {
10317 case EM_MIPS:
10318 result = get_mips_symbol_other (other);
28f997cf
TG
10319 break;
10320 case EM_IA_64:
10321 result = get_ia64_symbol_other (other);
10322 break;
6911b7dc
AM
10323 case EM_PPC64:
10324 result = get_ppc64_symbol_other (other);
10325 break;
5e2b0d47
NC
10326 default:
10327 break;
10328 }
10329
10330 if (result)
10331 return result;
10332
10333 snprintf (buff, sizeof buff, _("<other>: %x"), other);
10334 return buff;
10335}
10336
d1133906 10337static const char *
d3ba0551 10338get_symbol_index_type (unsigned int type)
252b5132 10339{
b34976b6 10340 static char buff[32];
5cf1065c 10341
252b5132
RH
10342 switch (type)
10343 {
b34976b6
AM
10344 case SHN_UNDEF: return "UND";
10345 case SHN_ABS: return "ABS";
10346 case SHN_COMMON: return "COM";
252b5132 10347 default:
9ce701e2
L
10348 if (type == SHN_IA_64_ANSI_COMMON
10349 && elf_header.e_machine == EM_IA_64
10350 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
10351 return "ANSI_COM";
8a9036a4 10352 else if ((elf_header.e_machine == EM_X86_64
7a9068fe
L
10353 || elf_header.e_machine == EM_L1OM
10354 || elf_header.e_machine == EM_K1OM)
3b22753a
L
10355 && type == SHN_X86_64_LCOMMON)
10356 return "LARGE_COM";
ac145307
BS
10357 else if ((type == SHN_MIPS_SCOMMON
10358 && elf_header.e_machine == EM_MIPS)
10359 || (type == SHN_TIC6X_SCOMMON
10360 && elf_header.e_machine == EM_TI_C6000))
172553c7
TS
10361 return "SCOM";
10362 else if (type == SHN_MIPS_SUNDEFINED
10363 && elf_header.e_machine == EM_MIPS)
10364 return "SUND";
9ce701e2 10365 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
4fbb74a6 10366 sprintf (buff, "PRC[0x%04x]", type & 0xffff);
252b5132 10367 else if (type >= SHN_LOOS && type <= SHN_HIOS)
4fbb74a6
AM
10368 sprintf (buff, "OS [0x%04x]", type & 0xffff);
10369 else if (type >= SHN_LORESERVE)
10370 sprintf (buff, "RSV[0x%04x]", type & 0xffff);
c6d8cab4 10371 else if (type >= elf_header.e_shnum)
e0a31db1 10372 sprintf (buff, _("bad section index[%3d]"), type);
252b5132 10373 else
232e7cb8 10374 sprintf (buff, "%3d", type);
5cf1065c 10375 break;
252b5132 10376 }
5cf1065c
NC
10377
10378 return buff;
252b5132
RH
10379}
10380
66543521 10381static bfd_vma *
57028622 10382get_dynamic_data (FILE * file, bfd_size_type number, unsigned int ent_size)
252b5132 10383{
2cf0635d
NC
10384 unsigned char * e_data;
10385 bfd_vma * i_data;
252b5132 10386
57028622
NC
10387 /* If the size_t type is smaller than the bfd_size_type, eg because
10388 you are building a 32-bit tool on a 64-bit host, then make sure
10389 that when (number) is cast to (size_t) no information is lost. */
10390 if (sizeof (size_t) < sizeof (bfd_size_type)
10391 && (bfd_size_type) ((size_t) number) != number)
10392 {
10393 error (_("Size truncation prevents reading %llu elements of size %u\n"),
10394 (unsigned long long) number, ent_size);
10395 return NULL;
10396 }
948f632f 10397
3102e897
NC
10398 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
10399 attempting to allocate memory when the read is bound to fail. */
10400 if (ent_size * number > current_file_size)
10401 {
57028622
NC
10402 error (_("Invalid number of dynamic entries: %llu\n"),
10403 (unsigned long long) number);
3102e897
NC
10404 return NULL;
10405 }
10406
57028622 10407 e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
252b5132
RH
10408 if (e_data == NULL)
10409 {
57028622
NC
10410 error (_("Out of memory reading %llu dynamic entries\n"),
10411 (unsigned long long) number);
252b5132
RH
10412 return NULL;
10413 }
10414
57028622 10415 if (fread (e_data, ent_size, (size_t) number, file) != number)
252b5132 10416 {
57028622
NC
10417 error (_("Unable to read in %llu bytes of dynamic data\n"),
10418 (unsigned long long) (number * ent_size));
3102e897 10419 free (e_data);
252b5132
RH
10420 return NULL;
10421 }
10422
57028622 10423 i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
252b5132
RH
10424 if (i_data == NULL)
10425 {
57028622
NC
10426 error (_("Out of memory allocating space for %llu dynamic entries\n"),
10427 (unsigned long long) number);
252b5132
RH
10428 free (e_data);
10429 return NULL;
10430 }
10431
10432 while (number--)
66543521 10433 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
252b5132
RH
10434
10435 free (e_data);
10436
10437 return i_data;
10438}
10439
6bd1a22c
L
10440static void
10441print_dynamic_symbol (bfd_vma si, unsigned long hn)
10442{
2cf0635d 10443 Elf_Internal_Sym * psym;
6bd1a22c
L
10444 int n;
10445
6bd1a22c
L
10446 n = print_vma (si, DEC_5);
10447 if (n < 5)
0b4362b0 10448 fputs (&" "[n], stdout);
6bd1a22c 10449 printf (" %3lu: ", hn);
e0a31db1
NC
10450
10451 if (dynamic_symbols == NULL || si >= num_dynamic_syms)
10452 {
3102e897
NC
10453 printf (_("<No info available for dynamic symbol number %lu>\n"),
10454 (unsigned long) si);
e0a31db1
NC
10455 return;
10456 }
10457
10458 psym = dynamic_symbols + si;
6bd1a22c
L
10459 print_vma (psym->st_value, LONG_HEX);
10460 putchar (' ');
10461 print_vma (psym->st_size, DEC_5);
10462
f4be36b3
AM
10463 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10464 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
10465 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
6bd1a22c
L
10466 /* Check to see if any other bits in the st_other field are set.
10467 Note - displaying this information disrupts the layout of the
10468 table being generated, but for the moment this case is very
10469 rare. */
10470 if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
10471 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
10472 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
10473 if (VALID_DYNAMIC_NAME (psym->st_name))
10474 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
10475 else
2b692964 10476 printf (_(" <corrupt: %14ld>"), psym->st_name);
6bd1a22c
L
10477 putchar ('\n');
10478}
10479
bb4d2ac2
L
10480static const char *
10481get_symbol_version_string (FILE *file, int is_dynsym,
10482 const char *strtab,
10483 unsigned long int strtab_size,
10484 unsigned int si, Elf_Internal_Sym *psym,
10485 enum versioned_symbol_info *sym_info,
10486 unsigned short *vna_other)
10487{
ab273396
AM
10488 unsigned char data[2];
10489 unsigned short vers_data;
10490 unsigned long offset;
bb4d2ac2 10491
ab273396
AM
10492 if (!is_dynsym
10493 || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
10494 return NULL;
bb4d2ac2 10495
ab273396
AM
10496 offset = offset_from_vma (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10497 sizeof data + si * sizeof (vers_data));
bb4d2ac2 10498
ab273396
AM
10499 if (get_data (&data, file, offset + si * sizeof (vers_data),
10500 sizeof (data), 1, _("version data")) == NULL)
10501 return NULL;
10502
10503 vers_data = byte_get (data, 2);
bb4d2ac2 10504
ab273396
AM
10505 if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data <= 1)
10506 return NULL;
bb4d2ac2 10507
ab273396
AM
10508 /* Usually we'd only see verdef for defined symbols, and verneed for
10509 undefined symbols. However, symbols defined by the linker in
10510 .dynbss for variables copied from a shared library in order to
10511 avoid text relocations are defined yet have verneed. We could
10512 use a heuristic to detect the special case, for example, check
10513 for verneed first on symbols defined in SHT_NOBITS sections, but
10514 it is simpler and more reliable to just look for both verdef and
10515 verneed. .dynbss might not be mapped to a SHT_NOBITS section. */
bb4d2ac2 10516
ab273396
AM
10517 if (psym->st_shndx != SHN_UNDEF
10518 && vers_data != 0x8001
10519 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10520 {
10521 Elf_Internal_Verdef ivd;
10522 Elf_Internal_Verdaux ivda;
10523 Elf_External_Verdaux evda;
10524 unsigned long off;
bb4d2ac2 10525
ab273396
AM
10526 off = offset_from_vma (file,
10527 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10528 sizeof (Elf_External_Verdef));
10529
10530 do
bb4d2ac2 10531 {
ab273396
AM
10532 Elf_External_Verdef evd;
10533
10534 if (get_data (&evd, file, off, sizeof (evd), 1,
10535 _("version def")) == NULL)
10536 {
10537 ivd.vd_ndx = 0;
10538 ivd.vd_aux = 0;
10539 ivd.vd_next = 0;
10540 }
10541 else
bb4d2ac2 10542 {
ab273396
AM
10543 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10544 ivd.vd_aux = BYTE_GET (evd.vd_aux);
10545 ivd.vd_next = BYTE_GET (evd.vd_next);
10546 }
bb4d2ac2 10547
ab273396
AM
10548 off += ivd.vd_next;
10549 }
10550 while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
bb4d2ac2 10551
ab273396
AM
10552 if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
10553 {
10554 off -= ivd.vd_next;
10555 off += ivd.vd_aux;
bb4d2ac2 10556
ab273396
AM
10557 if (get_data (&evda, file, off, sizeof (evda), 1,
10558 _("version def aux")) != NULL)
10559 {
10560 ivda.vda_name = BYTE_GET (evda.vda_name);
bb4d2ac2 10561
ab273396
AM
10562 if (psym->st_name != ivda.vda_name)
10563 {
10564 *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
10565 ? symbol_hidden : symbol_public);
10566 return (ivda.vda_name < strtab_size
10567 ? strtab + ivda.vda_name : _("<corrupt>"));
10568 }
10569 }
10570 }
10571 }
bb4d2ac2 10572
ab273396
AM
10573 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10574 {
10575 Elf_External_Verneed evn;
10576 Elf_Internal_Verneed ivn;
10577 Elf_Internal_Vernaux ivna;
bb4d2ac2 10578
ab273396
AM
10579 offset = offset_from_vma (file,
10580 version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10581 sizeof evn);
10582 do
10583 {
10584 unsigned long vna_off;
bb4d2ac2 10585
ab273396
AM
10586 if (get_data (&evn, file, offset, sizeof (evn), 1,
10587 _("version need")) == NULL)
10588 {
10589 ivna.vna_next = 0;
10590 ivna.vna_other = 0;
10591 ivna.vna_name = 0;
10592 break;
10593 }
bb4d2ac2 10594
ab273396
AM
10595 ivn.vn_aux = BYTE_GET (evn.vn_aux);
10596 ivn.vn_next = BYTE_GET (evn.vn_next);
bb4d2ac2 10597
ab273396 10598 vna_off = offset + ivn.vn_aux;
bb4d2ac2 10599
ab273396
AM
10600 do
10601 {
10602 Elf_External_Vernaux evna;
bb4d2ac2 10603
ab273396
AM
10604 if (get_data (&evna, file, vna_off, sizeof (evna), 1,
10605 _("version need aux (3)")) == NULL)
bb4d2ac2 10606 {
ab273396
AM
10607 ivna.vna_next = 0;
10608 ivna.vna_other = 0;
10609 ivna.vna_name = 0;
bb4d2ac2 10610 }
bb4d2ac2 10611 else
bb4d2ac2 10612 {
ab273396
AM
10613 ivna.vna_other = BYTE_GET (evna.vna_other);
10614 ivna.vna_next = BYTE_GET (evna.vna_next);
10615 ivna.vna_name = BYTE_GET (evna.vna_name);
10616 }
bb4d2ac2 10617
ab273396
AM
10618 vna_off += ivna.vna_next;
10619 }
10620 while (ivna.vna_other != vers_data && ivna.vna_next != 0);
bb4d2ac2 10621
ab273396
AM
10622 if (ivna.vna_other == vers_data)
10623 break;
bb4d2ac2 10624
ab273396
AM
10625 offset += ivn.vn_next;
10626 }
10627 while (ivn.vn_next != 0);
bb4d2ac2 10628
ab273396
AM
10629 if (ivna.vna_other == vers_data)
10630 {
10631 *sym_info = symbol_undefined;
10632 *vna_other = ivna.vna_other;
10633 return (ivna.vna_name < strtab_size
10634 ? strtab + ivna.vna_name : _("<corrupt>"));
bb4d2ac2
L
10635 }
10636 }
ab273396 10637 return NULL;
bb4d2ac2
L
10638}
10639
e3c8793a 10640/* Dump the symbol table. */
252b5132 10641static int
2cf0635d 10642process_symbol_table (FILE * file)
252b5132 10643{
2cf0635d 10644 Elf_Internal_Shdr * section;
8b73c356
NC
10645 bfd_size_type nbuckets = 0;
10646 bfd_size_type nchains = 0;
2cf0635d
NC
10647 bfd_vma * buckets = NULL;
10648 bfd_vma * chains = NULL;
fdc90cb4 10649 bfd_vma ngnubuckets = 0;
2cf0635d
NC
10650 bfd_vma * gnubuckets = NULL;
10651 bfd_vma * gnuchains = NULL;
6bd1a22c 10652 bfd_vma gnusymidx = 0;
071436c6 10653 bfd_size_type ngnuchains = 0;
252b5132 10654
2c610e4b 10655 if (!do_syms && !do_dyn_syms && !do_histogram)
252b5132
RH
10656 return 1;
10657
6bd1a22c
L
10658 if (dynamic_info[DT_HASH]
10659 && (do_histogram
2c610e4b
L
10660 || (do_using_dynamic
10661 && !do_dyn_syms
10662 && dynamic_strings != NULL)))
252b5132 10663 {
66543521
AM
10664 unsigned char nb[8];
10665 unsigned char nc[8];
8b73c356 10666 unsigned int hash_ent_size = 4;
66543521
AM
10667
10668 if ((elf_header.e_machine == EM_ALPHA
10669 || elf_header.e_machine == EM_S390
10670 || elf_header.e_machine == EM_S390_OLD)
10671 && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
10672 hash_ent_size = 8;
10673
fb52b2f4
NC
10674 if (fseek (file,
10675 (archive_file_offset
10676 + offset_from_vma (file, dynamic_info[DT_HASH],
10677 sizeof nb + sizeof nc)),
d93f0186 10678 SEEK_SET))
252b5132 10679 {
591a748a 10680 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 10681 goto no_hash;
252b5132
RH
10682 }
10683
66543521 10684 if (fread (nb, hash_ent_size, 1, file) != 1)
252b5132
RH
10685 {
10686 error (_("Failed to read in number of buckets\n"));
d3a44ec6 10687 goto no_hash;
252b5132
RH
10688 }
10689
66543521 10690 if (fread (nc, hash_ent_size, 1, file) != 1)
252b5132
RH
10691 {
10692 error (_("Failed to read in number of chains\n"));
d3a44ec6 10693 goto no_hash;
252b5132
RH
10694 }
10695
66543521
AM
10696 nbuckets = byte_get (nb, hash_ent_size);
10697 nchains = byte_get (nc, hash_ent_size);
252b5132 10698
66543521
AM
10699 buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
10700 chains = get_dynamic_data (file, nchains, hash_ent_size);
252b5132 10701
d3a44ec6 10702 no_hash:
252b5132 10703 if (buckets == NULL || chains == NULL)
d3a44ec6
JJ
10704 {
10705 if (do_using_dynamic)
10706 return 0;
10707 free (buckets);
10708 free (chains);
10709 buckets = NULL;
10710 chains = NULL;
10711 nbuckets = 0;
10712 nchains = 0;
10713 }
252b5132
RH
10714 }
10715
6bd1a22c
L
10716 if (dynamic_info_DT_GNU_HASH
10717 && (do_histogram
2c610e4b
L
10718 || (do_using_dynamic
10719 && !do_dyn_syms
10720 && dynamic_strings != NULL)))
252b5132 10721 {
6bd1a22c
L
10722 unsigned char nb[16];
10723 bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
10724 bfd_vma buckets_vma;
10725
10726 if (fseek (file,
10727 (archive_file_offset
10728 + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
10729 sizeof nb)),
10730 SEEK_SET))
10731 {
10732 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 10733 goto no_gnu_hash;
6bd1a22c 10734 }
252b5132 10735
6bd1a22c
L
10736 if (fread (nb, 16, 1, file) != 1)
10737 {
10738 error (_("Failed to read in number of buckets\n"));
d3a44ec6 10739 goto no_gnu_hash;
6bd1a22c
L
10740 }
10741
10742 ngnubuckets = byte_get (nb, 4);
10743 gnusymidx = byte_get (nb + 4, 4);
10744 bitmaskwords = byte_get (nb + 8, 4);
10745 buckets_vma = dynamic_info_DT_GNU_HASH + 16;
f7a99963 10746 if (is_32bit_elf)
6bd1a22c 10747 buckets_vma += bitmaskwords * 4;
f7a99963 10748 else
6bd1a22c 10749 buckets_vma += bitmaskwords * 8;
252b5132 10750
6bd1a22c
L
10751 if (fseek (file,
10752 (archive_file_offset
10753 + offset_from_vma (file, buckets_vma, 4)),
10754 SEEK_SET))
252b5132 10755 {
6bd1a22c 10756 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 10757 goto no_gnu_hash;
6bd1a22c
L
10758 }
10759
10760 gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
252b5132 10761
6bd1a22c 10762 if (gnubuckets == NULL)
d3a44ec6 10763 goto no_gnu_hash;
6bd1a22c
L
10764
10765 for (i = 0; i < ngnubuckets; i++)
10766 if (gnubuckets[i] != 0)
10767 {
10768 if (gnubuckets[i] < gnusymidx)
10769 return 0;
10770
10771 if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
10772 maxchain = gnubuckets[i];
10773 }
10774
10775 if (maxchain == 0xffffffff)
d3a44ec6 10776 goto no_gnu_hash;
6bd1a22c
L
10777
10778 maxchain -= gnusymidx;
10779
10780 if (fseek (file,
10781 (archive_file_offset
10782 + offset_from_vma (file, buckets_vma
10783 + 4 * (ngnubuckets + maxchain), 4)),
10784 SEEK_SET))
10785 {
10786 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 10787 goto no_gnu_hash;
6bd1a22c
L
10788 }
10789
10790 do
10791 {
10792 if (fread (nb, 4, 1, file) != 1)
252b5132 10793 {
6bd1a22c 10794 error (_("Failed to determine last chain length\n"));
d3a44ec6 10795 goto no_gnu_hash;
6bd1a22c 10796 }
252b5132 10797
6bd1a22c 10798 if (maxchain + 1 == 0)
d3a44ec6 10799 goto no_gnu_hash;
252b5132 10800
6bd1a22c
L
10801 ++maxchain;
10802 }
10803 while ((byte_get (nb, 4) & 1) == 0);
76da6bbe 10804
6bd1a22c
L
10805 if (fseek (file,
10806 (archive_file_offset
10807 + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
10808 SEEK_SET))
10809 {
10810 error (_("Unable to seek to start of dynamic information\n"));
d3a44ec6 10811 goto no_gnu_hash;
6bd1a22c
L
10812 }
10813
10814 gnuchains = get_dynamic_data (file, maxchain, 4);
071436c6 10815 ngnuchains = maxchain;
6bd1a22c 10816
d3a44ec6 10817 no_gnu_hash:
6bd1a22c 10818 if (gnuchains == NULL)
d3a44ec6
JJ
10819 {
10820 free (gnubuckets);
d3a44ec6
JJ
10821 gnubuckets = NULL;
10822 ngnubuckets = 0;
f64fddf1
NC
10823 if (do_using_dynamic)
10824 return 0;
d3a44ec6 10825 }
6bd1a22c
L
10826 }
10827
10828 if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
10829 && do_syms
10830 && do_using_dynamic
3102e897
NC
10831 && dynamic_strings != NULL
10832 && dynamic_symbols != NULL)
6bd1a22c
L
10833 {
10834 unsigned long hn;
10835
10836 if (dynamic_info[DT_HASH])
10837 {
10838 bfd_vma si;
10839
10840 printf (_("\nSymbol table for image:\n"));
10841 if (is_32bit_elf)
10842 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10843 else
10844 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10845
10846 for (hn = 0; hn < nbuckets; hn++)
10847 {
10848 if (! buckets[hn])
10849 continue;
10850
10851 for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
10852 print_dynamic_symbol (si, hn);
252b5132
RH
10853 }
10854 }
6bd1a22c
L
10855
10856 if (dynamic_info_DT_GNU_HASH)
10857 {
10858 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
10859 if (is_32bit_elf)
10860 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10861 else
10862 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10863
10864 for (hn = 0; hn < ngnubuckets; ++hn)
10865 if (gnubuckets[hn] != 0)
10866 {
10867 bfd_vma si = gnubuckets[hn];
10868 bfd_vma off = si - gnusymidx;
10869
10870 do
10871 {
10872 print_dynamic_symbol (si, hn);
10873 si++;
10874 }
071436c6 10875 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
6bd1a22c
L
10876 }
10877 }
252b5132 10878 }
8b73c356
NC
10879 else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
10880 && section_headers != NULL)
252b5132 10881 {
b34976b6 10882 unsigned int i;
252b5132
RH
10883
10884 for (i = 0, section = section_headers;
10885 i < elf_header.e_shnum;
10886 i++, section++)
10887 {
b34976b6 10888 unsigned int si;
2cf0635d 10889 char * strtab = NULL;
c256ffe7 10890 unsigned long int strtab_size = 0;
2cf0635d
NC
10891 Elf_Internal_Sym * symtab;
10892 Elf_Internal_Sym * psym;
ba5cdace 10893 unsigned long num_syms;
252b5132 10894
2c610e4b
L
10895 if ((section->sh_type != SHT_SYMTAB
10896 && section->sh_type != SHT_DYNSYM)
10897 || (!do_syms
10898 && section->sh_type == SHT_SYMTAB))
252b5132
RH
10899 continue;
10900
dd24e3da
NC
10901 if (section->sh_entsize == 0)
10902 {
10903 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
74e1a04b 10904 printable_section_name (section));
dd24e3da
NC
10905 continue;
10906 }
10907
252b5132 10908 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
74e1a04b 10909 printable_section_name (section),
252b5132 10910 (unsigned long) (section->sh_size / section->sh_entsize));
dd24e3da 10911
f7a99963 10912 if (is_32bit_elf)
ca47b30c 10913 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
f7a99963 10914 else
ca47b30c 10915 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
252b5132 10916
ba5cdace 10917 symtab = GET_ELF_SYMBOLS (file, section, & num_syms);
252b5132
RH
10918 if (symtab == NULL)
10919 continue;
10920
10921 if (section->sh_link == elf_header.e_shstrndx)
c256ffe7
JJ
10922 {
10923 strtab = string_table;
10924 strtab_size = string_table_length;
10925 }
4fbb74a6 10926 else if (section->sh_link < elf_header.e_shnum)
252b5132 10927 {
2cf0635d 10928 Elf_Internal_Shdr * string_sec;
252b5132 10929
4fbb74a6 10930 string_sec = section_headers + section->sh_link;
252b5132 10931
3f5e193b
NC
10932 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
10933 1, string_sec->sh_size,
10934 _("string table"));
c256ffe7 10935 strtab_size = strtab != NULL ? string_sec->sh_size : 0;
252b5132
RH
10936 }
10937
ba5cdace 10938 for (si = 0, psym = symtab; si < num_syms; si++, psym++)
252b5132 10939 {
bb4d2ac2
L
10940 const char *version_string;
10941 enum versioned_symbol_info sym_info;
10942 unsigned short vna_other;
10943
5e220199 10944 printf ("%6d: ", si);
f7a99963
NC
10945 print_vma (psym->st_value, LONG_HEX);
10946 putchar (' ');
10947 print_vma (psym->st_size, DEC_5);
d1133906
NC
10948 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10949 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
f4be36b3 10950 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
5e2b0d47
NC
10951 /* Check to see if any other bits in the st_other field are set.
10952 Note - displaying this information disrupts the layout of the
10953 table being generated, but for the moment this case is very rare. */
10954 if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
10955 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
31104126 10956 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
c256ffe7 10957 print_symbol (25, psym->st_name < strtab_size
2b692964 10958 ? strtab + psym->st_name : _("<corrupt>"));
252b5132 10959
bb4d2ac2
L
10960 version_string
10961 = get_symbol_version_string (file,
10962 section->sh_type == SHT_DYNSYM,
10963 strtab, strtab_size, si,
10964 psym, &sym_info, &vna_other);
10965 if (version_string)
252b5132 10966 {
bb4d2ac2
L
10967 if (sym_info == symbol_undefined)
10968 printf ("@%s (%d)", version_string, vna_other);
10969 else
10970 printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
10971 version_string);
252b5132
RH
10972 }
10973
10974 putchar ('\n');
10975 }
10976
10977 free (symtab);
10978 if (strtab != string_table)
10979 free (strtab);
10980 }
10981 }
10982 else if (do_syms)
10983 printf
10984 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
10985
10986 if (do_histogram && buckets != NULL)
10987 {
2cf0635d
NC
10988 unsigned long * lengths;
10989 unsigned long * counts;
66543521
AM
10990 unsigned long hn;
10991 bfd_vma si;
10992 unsigned long maxlength = 0;
10993 unsigned long nzero_counts = 0;
10994 unsigned long nsyms = 0;
94d15024 10995 unsigned long chained;
252b5132 10996
66543521
AM
10997 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
10998 (unsigned long) nbuckets);
252b5132 10999
3f5e193b 11000 lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
252b5132
RH
11001 if (lengths == NULL)
11002 {
8b73c356 11003 error (_("Out of memory allocating space for histogram buckets\n"));
252b5132
RH
11004 return 0;
11005 }
8b73c356
NC
11006
11007 printf (_(" Length Number %% of total Coverage\n"));
252b5132
RH
11008 for (hn = 0; hn < nbuckets; ++hn)
11009 {
94d15024
MF
11010 for (si = buckets[hn], chained = 0;
11011 si > 0 && si < nchains && si < nbuckets && chained <= nchains;
11012 si = chains[si], ++chained)
252b5132 11013 {
b34976b6 11014 ++nsyms;
252b5132 11015 if (maxlength < ++lengths[hn])
b34976b6 11016 ++maxlength;
252b5132 11017 }
94d15024
MF
11018
11019 /* PR binutils/17531: A corrupt binary could contain broken
11020 histogram data. Do not go into an infinite loop trying
11021 to process it. */
11022 if (chained > nchains)
11023 {
11024 error (_("histogram chain is corrupt\n"));
11025 break;
11026 }
252b5132
RH
11027 }
11028
3f5e193b 11029 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
252b5132
RH
11030 if (counts == NULL)
11031 {
b2e951ec 11032 free (lengths);
8b73c356 11033 error (_("Out of memory allocating space for histogram counts\n"));
252b5132
RH
11034 return 0;
11035 }
11036
11037 for (hn = 0; hn < nbuckets; ++hn)
b34976b6 11038 ++counts[lengths[hn]];
252b5132 11039
103f02d3 11040 if (nbuckets > 0)
252b5132 11041 {
66543521
AM
11042 unsigned long i;
11043 printf (" 0 %-10lu (%5.1f%%)\n",
103f02d3 11044 counts[0], (counts[0] * 100.0) / nbuckets);
66543521 11045 for (i = 1; i <= maxlength; ++i)
103f02d3 11046 {
66543521
AM
11047 nzero_counts += counts[i] * i;
11048 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11049 i, counts[i], (counts[i] * 100.0) / nbuckets,
103f02d3
UD
11050 (nzero_counts * 100.0) / nsyms);
11051 }
252b5132
RH
11052 }
11053
11054 free (counts);
11055 free (lengths);
11056 }
11057
11058 if (buckets != NULL)
11059 {
11060 free (buckets);
11061 free (chains);
11062 }
11063
d3a44ec6 11064 if (do_histogram && gnubuckets != NULL)
fdc90cb4 11065 {
2cf0635d
NC
11066 unsigned long * lengths;
11067 unsigned long * counts;
fdc90cb4
JJ
11068 unsigned long hn;
11069 unsigned long maxlength = 0;
11070 unsigned long nzero_counts = 0;
11071 unsigned long nsyms = 0;
fdc90cb4 11072
8b73c356
NC
11073 printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
11074 (unsigned long) ngnubuckets);
11075
3f5e193b 11076 lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
fdc90cb4
JJ
11077 if (lengths == NULL)
11078 {
8b73c356 11079 error (_("Out of memory allocating space for gnu histogram buckets\n"));
fdc90cb4
JJ
11080 return 0;
11081 }
11082
fdc90cb4
JJ
11083 printf (_(" Length Number %% of total Coverage\n"));
11084
11085 for (hn = 0; hn < ngnubuckets; ++hn)
11086 if (gnubuckets[hn] != 0)
11087 {
11088 bfd_vma off, length = 1;
11089
6bd1a22c 11090 for (off = gnubuckets[hn] - gnusymidx;
071436c6
NC
11091 /* PR 17531 file: 010-77222-0.004. */
11092 off < ngnuchains && (gnuchains[off] & 1) == 0;
11093 ++off)
fdc90cb4
JJ
11094 ++length;
11095 lengths[hn] = length;
11096 if (length > maxlength)
11097 maxlength = length;
11098 nsyms += length;
11099 }
11100
3f5e193b 11101 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
fdc90cb4
JJ
11102 if (counts == NULL)
11103 {
b2e951ec 11104 free (lengths);
8b73c356 11105 error (_("Out of memory allocating space for gnu histogram counts\n"));
fdc90cb4
JJ
11106 return 0;
11107 }
11108
11109 for (hn = 0; hn < ngnubuckets; ++hn)
11110 ++counts[lengths[hn]];
11111
11112 if (ngnubuckets > 0)
11113 {
11114 unsigned long j;
11115 printf (" 0 %-10lu (%5.1f%%)\n",
11116 counts[0], (counts[0] * 100.0) / ngnubuckets);
11117 for (j = 1; j <= maxlength; ++j)
11118 {
11119 nzero_counts += counts[j] * j;
11120 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11121 j, counts[j], (counts[j] * 100.0) / ngnubuckets,
11122 (nzero_counts * 100.0) / nsyms);
11123 }
11124 }
11125
11126 free (counts);
11127 free (lengths);
11128 free (gnubuckets);
11129 free (gnuchains);
11130 }
11131
252b5132
RH
11132 return 1;
11133}
11134
11135static int
2cf0635d 11136process_syminfo (FILE * file ATTRIBUTE_UNUSED)
252b5132 11137{
b4c96d0d 11138 unsigned int i;
252b5132
RH
11139
11140 if (dynamic_syminfo == NULL
11141 || !do_dynamic)
11142 /* No syminfo, this is ok. */
11143 return 1;
11144
11145 /* There better should be a dynamic symbol section. */
11146 if (dynamic_symbols == NULL || dynamic_strings == NULL)
11147 return 0;
11148
11149 if (dynamic_addr)
11150 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
11151 dynamic_syminfo_offset, dynamic_syminfo_nent);
11152
11153 printf (_(" Num: Name BoundTo Flags\n"));
11154 for (i = 0; i < dynamic_syminfo_nent; ++i)
11155 {
11156 unsigned short int flags = dynamic_syminfo[i].si_flags;
11157
31104126 11158 printf ("%4d: ", i);
4082ef84
NC
11159 if (i >= num_dynamic_syms)
11160 printf (_("<corrupt index>"));
11161 else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
d79b3d50
NC
11162 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
11163 else
2b692964 11164 printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
31104126 11165 putchar (' ');
252b5132
RH
11166
11167 switch (dynamic_syminfo[i].si_boundto)
11168 {
11169 case SYMINFO_BT_SELF:
11170 fputs ("SELF ", stdout);
11171 break;
11172 case SYMINFO_BT_PARENT:
11173 fputs ("PARENT ", stdout);
11174 break;
11175 default:
11176 if (dynamic_syminfo[i].si_boundto > 0
d79b3d50
NC
11177 && dynamic_syminfo[i].si_boundto < dynamic_nent
11178 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
31104126 11179 {
d79b3d50 11180 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
31104126
NC
11181 putchar (' ' );
11182 }
252b5132
RH
11183 else
11184 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
11185 break;
11186 }
11187
11188 if (flags & SYMINFO_FLG_DIRECT)
11189 printf (" DIRECT");
11190 if (flags & SYMINFO_FLG_PASSTHRU)
11191 printf (" PASSTHRU");
11192 if (flags & SYMINFO_FLG_COPY)
11193 printf (" COPY");
11194 if (flags & SYMINFO_FLG_LAZYLOAD)
11195 printf (" LAZYLOAD");
11196
11197 puts ("");
11198 }
11199
11200 return 1;
11201}
11202
cf13d699
NC
11203/* Check to see if the given reloc needs to be handled in a target specific
11204 manner. If so then process the reloc and return TRUE otherwise return
11205 FALSE. */
09c11c86 11206
cf13d699
NC
11207static bfd_boolean
11208target_specific_reloc_handling (Elf_Internal_Rela * reloc,
11209 unsigned char * start,
11210 Elf_Internal_Sym * symtab)
252b5132 11211{
cf13d699 11212 unsigned int reloc_type = get_reloc_type (reloc->r_info);
252b5132 11213
cf13d699 11214 switch (elf_header.e_machine)
252b5132 11215 {
13761a11
NC
11216 case EM_MSP430:
11217 case EM_MSP430_OLD:
11218 {
11219 static Elf_Internal_Sym * saved_sym = NULL;
11220
11221 switch (reloc_type)
11222 {
11223 case 10: /* R_MSP430_SYM_DIFF */
11224 if (uses_msp430x_relocs ())
11225 break;
11226 case 21: /* R_MSP430X_SYM_DIFF */
11227 saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11228 return TRUE;
11229
11230 case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
11231 case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
11232 goto handle_sym_diff;
0b4362b0 11233
13761a11
NC
11234 case 5: /* R_MSP430_16_BYTE */
11235 case 9: /* R_MSP430_8 */
11236 if (uses_msp430x_relocs ())
11237 break;
11238 goto handle_sym_diff;
11239
11240 case 2: /* R_MSP430_ABS16 */
11241 case 15: /* R_MSP430X_ABS16 */
11242 if (! uses_msp430x_relocs ())
11243 break;
11244 goto handle_sym_diff;
0b4362b0 11245
13761a11
NC
11246 handle_sym_diff:
11247 if (saved_sym != NULL)
11248 {
11249 bfd_vma value;
11250
11251 value = reloc->r_addend
11252 + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11253 - saved_sym->st_value);
11254
11255 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
11256
11257 saved_sym = NULL;
11258 return TRUE;
11259 }
11260 break;
11261
11262 default:
11263 if (saved_sym != NULL)
071436c6 11264 error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
13761a11
NC
11265 break;
11266 }
11267 break;
11268 }
11269
cf13d699
NC
11270 case EM_MN10300:
11271 case EM_CYGNUS_MN10300:
11272 {
11273 static Elf_Internal_Sym * saved_sym = NULL;
252b5132 11274
cf13d699
NC
11275 switch (reloc_type)
11276 {
11277 case 34: /* R_MN10300_ALIGN */
11278 return TRUE;
11279 case 33: /* R_MN10300_SYM_DIFF */
11280 saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11281 return TRUE;
11282 case 1: /* R_MN10300_32 */
11283 case 2: /* R_MN10300_16 */
11284 if (saved_sym != NULL)
11285 {
11286 bfd_vma value;
252b5132 11287
cf13d699
NC
11288 value = reloc->r_addend
11289 + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11290 - saved_sym->st_value);
252b5132 11291
cf13d699 11292 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
252b5132 11293
cf13d699
NC
11294 saved_sym = NULL;
11295 return TRUE;
11296 }
11297 break;
11298 default:
11299 if (saved_sym != NULL)
071436c6 11300 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
cf13d699
NC
11301 break;
11302 }
11303 break;
11304 }
6ff71e76
NC
11305
11306 case EM_RL78:
11307 {
11308 static bfd_vma saved_sym1 = 0;
11309 static bfd_vma saved_sym2 = 0;
11310 static bfd_vma value;
11311
11312 switch (reloc_type)
11313 {
11314 case 0x80: /* R_RL78_SYM. */
11315 saved_sym1 = saved_sym2;
11316 saved_sym2 = symtab[get_reloc_symindex (reloc->r_info)].st_value;
11317 saved_sym2 += reloc->r_addend;
11318 return TRUE;
11319
11320 case 0x83: /* R_RL78_OPsub. */
11321 value = saved_sym1 - saved_sym2;
11322 saved_sym2 = saved_sym1 = 0;
11323 return TRUE;
11324 break;
11325
11326 case 0x41: /* R_RL78_ABS32. */
11327 byte_put (start + reloc->r_offset, value, 4);
11328 value = 0;
11329 return TRUE;
11330
11331 case 0x43: /* R_RL78_ABS16. */
11332 byte_put (start + reloc->r_offset, value, 2);
11333 value = 0;
11334 return TRUE;
11335
11336 default:
11337 break;
11338 }
11339 break;
11340 }
252b5132
RH
11341 }
11342
cf13d699 11343 return FALSE;
252b5132
RH
11344}
11345
aca88567
NC
11346/* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
11347 DWARF debug sections. This is a target specific test. Note - we do not
11348 go through the whole including-target-headers-multiple-times route, (as
11349 we have already done with <elf/h8.h>) because this would become very
11350 messy and even then this function would have to contain target specific
11351 information (the names of the relocs instead of their numeric values).
11352 FIXME: This is not the correct way to solve this problem. The proper way
11353 is to have target specific reloc sizing and typing functions created by
11354 the reloc-macros.h header, in the same way that it already creates the
11355 reloc naming functions. */
11356
11357static bfd_boolean
11358is_32bit_abs_reloc (unsigned int reloc_type)
11359{
11360 switch (elf_header.e_machine)
11361 {
41e92641 11362 case EM_386:
22abe556 11363 case EM_IAMCU:
41e92641 11364 return reloc_type == 1; /* R_386_32. */
aca88567
NC
11365 case EM_68K:
11366 return reloc_type == 1; /* R_68K_32. */
11367 case EM_860:
11368 return reloc_type == 1; /* R_860_32. */
137b6b5f
AM
11369 case EM_960:
11370 return reloc_type == 2; /* R_960_32. */
a06ea964
NC
11371 case EM_AARCH64:
11372 return reloc_type == 258; /* R_AARCH64_ABS32 */
aca88567 11373 case EM_ALPHA:
137b6b5f 11374 return reloc_type == 1; /* R_ALPHA_REFLONG. */
41e92641
NC
11375 case EM_ARC:
11376 return reloc_type == 1; /* R_ARC_32. */
886a2506
NC
11377 case EM_ARC_COMPACT:
11378 case EM_ARC_COMPACT2:
11379 return reloc_type == 4; /* R_ARC_32. */
41e92641
NC
11380 case EM_ARM:
11381 return reloc_type == 2; /* R_ARM_ABS32 */
cb8f3167 11382 case EM_AVR_OLD:
aca88567
NC
11383 case EM_AVR:
11384 return reloc_type == 1;
cfb8c092
NC
11385 case EM_ADAPTEVA_EPIPHANY:
11386 return reloc_type == 3;
aca88567
NC
11387 case EM_BLACKFIN:
11388 return reloc_type == 0x12; /* R_byte4_data. */
11389 case EM_CRIS:
11390 return reloc_type == 3; /* R_CRIS_32. */
11391 case EM_CR16:
11392 return reloc_type == 3; /* R_CR16_NUM32. */
11393 case EM_CRX:
11394 return reloc_type == 15; /* R_CRX_NUM32. */
11395 case EM_CYGNUS_FRV:
11396 return reloc_type == 1;
41e92641
NC
11397 case EM_CYGNUS_D10V:
11398 case EM_D10V:
11399 return reloc_type == 6; /* R_D10V_32. */
aca88567
NC
11400 case EM_CYGNUS_D30V:
11401 case EM_D30V:
11402 return reloc_type == 12; /* R_D30V_32_NORMAL. */
41e92641
NC
11403 case EM_DLX:
11404 return reloc_type == 3; /* R_DLX_RELOC_32. */
aca88567
NC
11405 case EM_CYGNUS_FR30:
11406 case EM_FR30:
11407 return reloc_type == 3; /* R_FR30_32. */
3f8107ab
AM
11408 case EM_FT32:
11409 return reloc_type == 1; /* R_FT32_32. */
aca88567
NC
11410 case EM_H8S:
11411 case EM_H8_300:
11412 case EM_H8_300H:
11413 return reloc_type == 1; /* R_H8_DIR32. */
3730236a 11414 case EM_IA_64:
d1c4b12b
NC
11415 return reloc_type == 0x65 /* R_IA64_SECREL32LSB. */
11416 || reloc_type == 0x25; /* R_IA64_DIR32LSB. */
aca88567
NC
11417 case EM_IP2K_OLD:
11418 case EM_IP2K:
11419 return reloc_type == 2; /* R_IP2K_32. */
11420 case EM_IQ2000:
11421 return reloc_type == 2; /* R_IQ2000_32. */
84e94c90
NC
11422 case EM_LATTICEMICO32:
11423 return reloc_type == 3; /* R_LM32_32. */
ff7eeb89 11424 case EM_M32C_OLD:
aca88567
NC
11425 case EM_M32C:
11426 return reloc_type == 3; /* R_M32C_32. */
11427 case EM_M32R:
11428 return reloc_type == 34; /* R_M32R_32_RELA. */
adec12c1
AM
11429 case EM_68HC11:
11430 case EM_68HC12:
11431 return reloc_type == 6; /* R_M68HC11_32. */
aca88567
NC
11432 case EM_MCORE:
11433 return reloc_type == 1; /* R_MCORE_ADDR32. */
11434 case EM_CYGNUS_MEP:
11435 return reloc_type == 4; /* R_MEP_32. */
a3c62988
NC
11436 case EM_METAG:
11437 return reloc_type == 2; /* R_METAG_ADDR32. */
137b6b5f
AM
11438 case EM_MICROBLAZE:
11439 return reloc_type == 1; /* R_MICROBLAZE_32. */
aca88567
NC
11440 case EM_MIPS:
11441 return reloc_type == 2; /* R_MIPS_32. */
11442 case EM_MMIX:
11443 return reloc_type == 4; /* R_MMIX_32. */
11444 case EM_CYGNUS_MN10200:
11445 case EM_MN10200:
11446 return reloc_type == 1; /* R_MN10200_32. */
11447 case EM_CYGNUS_MN10300:
11448 case EM_MN10300:
11449 return reloc_type == 1; /* R_MN10300_32. */
5506d11a
AM
11450 case EM_MOXIE:
11451 return reloc_type == 1; /* R_MOXIE_32. */
aca88567
NC
11452 case EM_MSP430_OLD:
11453 case EM_MSP430:
13761a11 11454 return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32. */
aca88567
NC
11455 case EM_MT:
11456 return reloc_type == 2; /* R_MT_32. */
35c08157
KLC
11457 case EM_NDS32:
11458 return reloc_type == 20; /* R_NDS32_RELA. */
3e0873ac 11459 case EM_ALTERA_NIOS2:
36591ba1 11460 return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32. */
3e0873ac
NC
11461 case EM_NIOS32:
11462 return reloc_type == 1; /* R_NIOS_32. */
73589c9d
CS
11463 case EM_OR1K:
11464 return reloc_type == 1; /* R_OR1K_32. */
aca88567 11465 case EM_PARISC:
5fda8eca
NC
11466 return (reloc_type == 1 /* R_PARISC_DIR32. */
11467 || reloc_type == 41); /* R_PARISC_SECREL32. */
aca88567
NC
11468 case EM_PJ:
11469 case EM_PJ_OLD:
11470 return reloc_type == 1; /* R_PJ_DATA_DIR32. */
11471 case EM_PPC64:
11472 return reloc_type == 1; /* R_PPC64_ADDR32. */
11473 case EM_PPC:
11474 return reloc_type == 1; /* R_PPC_ADDR32. */
99c513f6
DD
11475 case EM_RL78:
11476 return reloc_type == 1; /* R_RL78_DIR32. */
c7927a3c
NC
11477 case EM_RX:
11478 return reloc_type == 1; /* R_RX_DIR32. */
aca88567
NC
11479 case EM_S370:
11480 return reloc_type == 1; /* R_I370_ADDR31. */
11481 case EM_S390_OLD:
11482 case EM_S390:
11483 return reloc_type == 4; /* R_S390_32. */
41e92641
NC
11484 case EM_SCORE:
11485 return reloc_type == 8; /* R_SCORE_ABS32. */
aca88567
NC
11486 case EM_SH:
11487 return reloc_type == 1; /* R_SH_DIR32. */
11488 case EM_SPARC32PLUS:
11489 case EM_SPARCV9:
11490 case EM_SPARC:
11491 return reloc_type == 3 /* R_SPARC_32. */
11492 || reloc_type == 23; /* R_SPARC_UA32. */
a7dd7d05
AM
11493 case EM_SPU:
11494 return reloc_type == 6; /* R_SPU_ADDR32 */
40b36596
JM
11495 case EM_TI_C6000:
11496 return reloc_type == 1; /* R_C6000_ABS32. */
aa137e4d
NC
11497 case EM_TILEGX:
11498 return reloc_type == 2; /* R_TILEGX_32. */
11499 case EM_TILEPRO:
11500 return reloc_type == 1; /* R_TILEPRO_32. */
aca88567
NC
11501 case EM_CYGNUS_V850:
11502 case EM_V850:
11503 return reloc_type == 6; /* R_V850_ABS32. */
708e2187
NC
11504 case EM_V800:
11505 return reloc_type == 0x33; /* R_V810_WORD. */
aca88567
NC
11506 case EM_VAX:
11507 return reloc_type == 1; /* R_VAX_32. */
619ed720
EB
11508 case EM_VISIUM:
11509 return reloc_type == 3; /* R_VISIUM_32. */
aca88567 11510 case EM_X86_64:
8a9036a4 11511 case EM_L1OM:
7a9068fe 11512 case EM_K1OM:
aca88567 11513 return reloc_type == 10; /* R_X86_64_32. */
c29aca4a
NC
11514 case EM_XC16X:
11515 case EM_C166:
11516 return reloc_type == 3; /* R_XC16C_ABS_32. */
f6c1a2d5
NC
11517 case EM_XGATE:
11518 return reloc_type == 4; /* R_XGATE_32. */
aca88567
NC
11519 case EM_XSTORMY16:
11520 return reloc_type == 1; /* R_XSTROMY16_32. */
11521 case EM_XTENSA_OLD:
11522 case EM_XTENSA:
11523 return reloc_type == 1; /* R_XTENSA_32. */
aca88567 11524 default:
bee0ee85
NC
11525 {
11526 static unsigned int prev_warn = 0;
11527
11528 /* Avoid repeating the same warning multiple times. */
11529 if (prev_warn != elf_header.e_machine)
11530 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
11531 elf_header.e_machine);
11532 prev_warn = elf_header.e_machine;
11533 return FALSE;
11534 }
aca88567
NC
11535 }
11536}
11537
11538/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11539 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
11540
11541static bfd_boolean
11542is_32bit_pcrel_reloc (unsigned int reloc_type)
11543{
11544 switch (elf_header.e_machine)
11545 {
41e92641 11546 case EM_386:
22abe556 11547 case EM_IAMCU:
3e0873ac 11548 return reloc_type == 2; /* R_386_PC32. */
aca88567 11549 case EM_68K:
3e0873ac 11550 return reloc_type == 4; /* R_68K_PC32. */
a06ea964
NC
11551 case EM_AARCH64:
11552 return reloc_type == 261; /* R_AARCH64_PREL32 */
cfb8c092
NC
11553 case EM_ADAPTEVA_EPIPHANY:
11554 return reloc_type == 6;
aca88567
NC
11555 case EM_ALPHA:
11556 return reloc_type == 10; /* R_ALPHA_SREL32. */
726c18e1
CZ
11557 case EM_ARC_COMPACT:
11558 case EM_ARC_COMPACT2:
11559 return reloc_type == 49; /* R_ARC_32_PCREL. */
41e92641 11560 case EM_ARM:
3e0873ac 11561 return reloc_type == 3; /* R_ARM_REL32 */
137b6b5f
AM
11562 case EM_MICROBLAZE:
11563 return reloc_type == 2; /* R_MICROBLAZE_32_PCREL. */
73589c9d
CS
11564 case EM_OR1K:
11565 return reloc_type == 9; /* R_OR1K_32_PCREL. */
aca88567 11566 case EM_PARISC:
85acf597 11567 return reloc_type == 9; /* R_PARISC_PCREL32. */
aca88567
NC
11568 case EM_PPC:
11569 return reloc_type == 26; /* R_PPC_REL32. */
11570 case EM_PPC64:
3e0873ac 11571 return reloc_type == 26; /* R_PPC64_REL32. */
aca88567
NC
11572 case EM_S390_OLD:
11573 case EM_S390:
3e0873ac 11574 return reloc_type == 5; /* R_390_PC32. */
aca88567 11575 case EM_SH:
3e0873ac 11576 return reloc_type == 2; /* R_SH_REL32. */
aca88567
NC
11577 case EM_SPARC32PLUS:
11578 case EM_SPARCV9:
11579 case EM_SPARC:
3e0873ac 11580 return reloc_type == 6; /* R_SPARC_DISP32. */
a7dd7d05
AM
11581 case EM_SPU:
11582 return reloc_type == 13; /* R_SPU_REL32. */
aa137e4d
NC
11583 case EM_TILEGX:
11584 return reloc_type == 6; /* R_TILEGX_32_PCREL. */
11585 case EM_TILEPRO:
11586 return reloc_type == 4; /* R_TILEPRO_32_PCREL. */
619ed720
EB
11587 case EM_VISIUM:
11588 return reloc_type == 6; /* R_VISIUM_32_PCREL */
aca88567 11589 case EM_X86_64:
8a9036a4 11590 case EM_L1OM:
7a9068fe 11591 case EM_K1OM:
3e0873ac 11592 return reloc_type == 2; /* R_X86_64_PC32. */
2fcb9706
BW
11593 case EM_XTENSA_OLD:
11594 case EM_XTENSA:
11595 return reloc_type == 14; /* R_XTENSA_32_PCREL. */
aca88567
NC
11596 default:
11597 /* Do not abort or issue an error message here. Not all targets use
11598 pc-relative 32-bit relocs in their DWARF debug information and we
11599 have already tested for target coverage in is_32bit_abs_reloc. A
cf13d699
NC
11600 more helpful warning message will be generated by apply_relocations
11601 anyway, so just return. */
aca88567
NC
11602 return FALSE;
11603 }
11604}
11605
11606/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11607 a 64-bit absolute RELA relocation used in DWARF debug sections. */
11608
11609static bfd_boolean
11610is_64bit_abs_reloc (unsigned int reloc_type)
11611{
11612 switch (elf_header.e_machine)
11613 {
a06ea964
NC
11614 case EM_AARCH64:
11615 return reloc_type == 257; /* R_AARCH64_ABS64. */
aca88567
NC
11616 case EM_ALPHA:
11617 return reloc_type == 2; /* R_ALPHA_REFQUAD. */
3730236a
NC
11618 case EM_IA_64:
11619 return reloc_type == 0x27; /* R_IA64_DIR64LSB. */
3e0873ac
NC
11620 case EM_PARISC:
11621 return reloc_type == 80; /* R_PARISC_DIR64. */
aca88567
NC
11622 case EM_PPC64:
11623 return reloc_type == 38; /* R_PPC64_ADDR64. */
11624 case EM_SPARC32PLUS:
11625 case EM_SPARCV9:
11626 case EM_SPARC:
11627 return reloc_type == 54; /* R_SPARC_UA64. */
11628 case EM_X86_64:
8a9036a4 11629 case EM_L1OM:
7a9068fe 11630 case EM_K1OM:
aca88567 11631 return reloc_type == 1; /* R_X86_64_64. */
e819ade1
AS
11632 case EM_S390_OLD:
11633 case EM_S390:
aa137e4d
NC
11634 return reloc_type == 22; /* R_S390_64. */
11635 case EM_TILEGX:
11636 return reloc_type == 1; /* R_TILEGX_64. */
85a82265 11637 case EM_MIPS:
aa137e4d 11638 return reloc_type == 18; /* R_MIPS_64. */
aca88567
NC
11639 default:
11640 return FALSE;
11641 }
11642}
11643
85acf597
RH
11644/* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
11645 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
11646
11647static bfd_boolean
11648is_64bit_pcrel_reloc (unsigned int reloc_type)
11649{
11650 switch (elf_header.e_machine)
11651 {
a06ea964
NC
11652 case EM_AARCH64:
11653 return reloc_type == 260; /* R_AARCH64_PREL64. */
85acf597 11654 case EM_ALPHA:
aa137e4d 11655 return reloc_type == 11; /* R_ALPHA_SREL64. */
85acf597 11656 case EM_IA_64:
aa137e4d 11657 return reloc_type == 0x4f; /* R_IA64_PCREL64LSB. */
85acf597 11658 case EM_PARISC:
aa137e4d 11659 return reloc_type == 72; /* R_PARISC_PCREL64. */
85acf597 11660 case EM_PPC64:
aa137e4d 11661 return reloc_type == 44; /* R_PPC64_REL64. */
85acf597
RH
11662 case EM_SPARC32PLUS:
11663 case EM_SPARCV9:
11664 case EM_SPARC:
aa137e4d 11665 return reloc_type == 46; /* R_SPARC_DISP64. */
85acf597 11666 case EM_X86_64:
8a9036a4 11667 case EM_L1OM:
7a9068fe 11668 case EM_K1OM:
aa137e4d 11669 return reloc_type == 24; /* R_X86_64_PC64. */
85acf597
RH
11670 case EM_S390_OLD:
11671 case EM_S390:
aa137e4d
NC
11672 return reloc_type == 23; /* R_S390_PC64. */
11673 case EM_TILEGX:
11674 return reloc_type == 5; /* R_TILEGX_64_PCREL. */
85acf597
RH
11675 default:
11676 return FALSE;
11677 }
11678}
11679
4dc3c23d
AM
11680/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11681 a 24-bit absolute RELA relocation used in DWARF debug sections. */
11682
11683static bfd_boolean
11684is_24bit_abs_reloc (unsigned int reloc_type)
11685{
11686 switch (elf_header.e_machine)
11687 {
11688 case EM_CYGNUS_MN10200:
11689 case EM_MN10200:
11690 return reloc_type == 4; /* R_MN10200_24. */
11691 default:
11692 return FALSE;
11693 }
11694}
11695
aca88567
NC
11696/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11697 a 16-bit absolute RELA relocation used in DWARF debug sections. */
11698
11699static bfd_boolean
11700is_16bit_abs_reloc (unsigned int reloc_type)
4b78141a
NC
11701{
11702 switch (elf_header.e_machine)
11703 {
886a2506
NC
11704 case EM_ARC:
11705 case EM_ARC_COMPACT:
11706 case EM_ARC_COMPACT2:
11707 return reloc_type == 2; /* R_ARC_16. */
aca88567
NC
11708 case EM_AVR_OLD:
11709 case EM_AVR:
11710 return reloc_type == 4; /* R_AVR_16. */
cfb8c092
NC
11711 case EM_ADAPTEVA_EPIPHANY:
11712 return reloc_type == 5;
41e92641
NC
11713 case EM_CYGNUS_D10V:
11714 case EM_D10V:
11715 return reloc_type == 3; /* R_D10V_16. */
4b78141a
NC
11716 case EM_H8S:
11717 case EM_H8_300:
11718 case EM_H8_300H:
aca88567
NC
11719 return reloc_type == R_H8_DIR16;
11720 case EM_IP2K_OLD:
11721 case EM_IP2K:
11722 return reloc_type == 1; /* R_IP2K_16. */
ff7eeb89 11723 case EM_M32C_OLD:
f4236fe4
DD
11724 case EM_M32C:
11725 return reloc_type == 1; /* R_M32C_16 */
aca88567 11726 case EM_MSP430:
13761a11
NC
11727 if (uses_msp430x_relocs ())
11728 return reloc_type == 2; /* R_MSP430_ABS16. */
78c8d46c 11729 case EM_MSP430_OLD:
aca88567 11730 return reloc_type == 5; /* R_MSP430_16_BYTE. */
35c08157
KLC
11731 case EM_NDS32:
11732 return reloc_type == 19; /* R_NDS32_RELA. */
3e0873ac 11733 case EM_ALTERA_NIOS2:
36591ba1 11734 return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16. */
3e0873ac
NC
11735 case EM_NIOS32:
11736 return reloc_type == 9; /* R_NIOS_16. */
73589c9d
CS
11737 case EM_OR1K:
11738 return reloc_type == 2; /* R_OR1K_16. */
40b36596
JM
11739 case EM_TI_C6000:
11740 return reloc_type == 2; /* R_C6000_ABS16. */
c29aca4a
NC
11741 case EM_XC16X:
11742 case EM_C166:
11743 return reloc_type == 2; /* R_XC16C_ABS_16. */
e63734a3
AM
11744 case EM_CYGNUS_MN10200:
11745 case EM_MN10200:
11746 return reloc_type == 2; /* R_MN10200_16. */
0a22ae8e
NC
11747 case EM_CYGNUS_MN10300:
11748 case EM_MN10300:
11749 return reloc_type == 2; /* R_MN10300_16. */
619ed720
EB
11750 case EM_VISIUM:
11751 return reloc_type == 2; /* R_VISIUM_16. */
f6c1a2d5
NC
11752 case EM_XGATE:
11753 return reloc_type == 3; /* R_XGATE_16. */
4b78141a 11754 default:
aca88567 11755 return FALSE;
4b78141a
NC
11756 }
11757}
11758
2a7b2e88
JK
11759/* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
11760 relocation entries (possibly formerly used for SHT_GROUP sections). */
11761
11762static bfd_boolean
11763is_none_reloc (unsigned int reloc_type)
11764{
11765 switch (elf_header.e_machine)
11766 {
cb8f3167
NC
11767 case EM_68K: /* R_68K_NONE. */
11768 case EM_386: /* R_386_NONE. */
2a7b2e88
JK
11769 case EM_SPARC32PLUS:
11770 case EM_SPARCV9:
cb8f3167
NC
11771 case EM_SPARC: /* R_SPARC_NONE. */
11772 case EM_MIPS: /* R_MIPS_NONE. */
11773 case EM_PARISC: /* R_PARISC_NONE. */
11774 case EM_ALPHA: /* R_ALPHA_NONE. */
cfb8c092 11775 case EM_ADAPTEVA_EPIPHANY:
cb8f3167
NC
11776 case EM_PPC: /* R_PPC_NONE. */
11777 case EM_PPC64: /* R_PPC64_NONE. */
886a2506
NC
11778 case EM_ARC: /* R_ARC_NONE. */
11779 case EM_ARC_COMPACT: /* R_ARC_NONE. */
11780 case EM_ARC_COMPACT2: /* R_ARC_NONE. */
cb8f3167
NC
11781 case EM_ARM: /* R_ARM_NONE. */
11782 case EM_IA_64: /* R_IA64_NONE. */
11783 case EM_SH: /* R_SH_NONE. */
2a7b2e88 11784 case EM_S390_OLD:
cb8f3167
NC
11785 case EM_S390: /* R_390_NONE. */
11786 case EM_CRIS: /* R_CRIS_NONE. */
11787 case EM_X86_64: /* R_X86_64_NONE. */
8a9036a4 11788 case EM_L1OM: /* R_X86_64_NONE. */
7a9068fe 11789 case EM_K1OM: /* R_X86_64_NONE. */
cb8f3167 11790 case EM_MN10300: /* R_MN10300_NONE. */
3f8107ab 11791 case EM_FT32: /* R_FT32_NONE. */
5506d11a 11792 case EM_MOXIE: /* R_MOXIE_NONE. */
cb8f3167 11793 case EM_M32R: /* R_M32R_NONE. */
40b36596 11794 case EM_TI_C6000:/* R_C6000_NONE. */
aa137e4d
NC
11795 case EM_TILEGX: /* R_TILEGX_NONE. */
11796 case EM_TILEPRO: /* R_TILEPRO_NONE. */
c29aca4a
NC
11797 case EM_XC16X:
11798 case EM_C166: /* R_XC16X_NONE. */
36591ba1
SL
11799 case EM_ALTERA_NIOS2: /* R_NIOS2_NONE. */
11800 case EM_NIOS32: /* R_NIOS_NONE. */
73589c9d 11801 case EM_OR1K: /* R_OR1K_NONE. */
cb8f3167 11802 return reloc_type == 0;
a06ea964
NC
11803 case EM_AARCH64:
11804 return reloc_type == 0 || reloc_type == 256;
35c08157
KLC
11805 case EM_NDS32:
11806 return (reloc_type == 0 /* R_XTENSA_NONE. */
11807 || reloc_type == 204 /* R_NDS32_DIFF8. */
11808 || reloc_type == 205 /* R_NDS32_DIFF16. */
11809 || reloc_type == 206 /* R_NDS32_DIFF32. */
11810 || reloc_type == 207 /* R_NDS32_ULEB128. */);
58332dda
JK
11811 case EM_XTENSA_OLD:
11812 case EM_XTENSA:
4dc3c23d
AM
11813 return (reloc_type == 0 /* R_XTENSA_NONE. */
11814 || reloc_type == 17 /* R_XTENSA_DIFF8. */
11815 || reloc_type == 18 /* R_XTENSA_DIFF16. */
11816 || reloc_type == 19 /* R_XTENSA_DIFF32. */);
a3c62988
NC
11817 case EM_METAG:
11818 return reloc_type == 3; /* R_METAG_NONE. */
2a7b2e88
JK
11819 }
11820 return FALSE;
11821}
11822
d1c4b12b
NC
11823/* Returns TRUE if there is a relocation against
11824 section NAME at OFFSET bytes. */
11825
11826bfd_boolean
11827reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
11828{
11829 Elf_Internal_Rela * relocs;
11830 Elf_Internal_Rela * rp;
11831
11832 if (dsec == NULL || dsec->reloc_info == NULL)
11833 return FALSE;
11834
11835 relocs = (Elf_Internal_Rela *) dsec->reloc_info;
11836
11837 for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
11838 if (rp->r_offset == offset)
11839 return TRUE;
11840
11841 return FALSE;
11842}
11843
cf13d699
NC
11844/* Apply relocations to a section.
11845 Note: So far support has been added only for those relocations
11846 which can be found in debug sections.
d1c4b12b
NC
11847 If RELOCS_RETURN is non-NULL then returns in it a pointer to the
11848 loaded relocs. It is then the caller's responsibility to free them.
cf13d699 11849 FIXME: Add support for more relocations ? */
1b315056 11850
cf13d699 11851static void
d1c4b12b
NC
11852apply_relocations (void * file,
11853 const Elf_Internal_Shdr * section,
11854 unsigned char * start,
11855 bfd_size_type size,
11856 void ** relocs_return,
11857 unsigned long * num_relocs_return)
1b315056 11858{
cf13d699 11859 Elf_Internal_Shdr * relsec;
0d2a7a93 11860 unsigned char * end = start + size;
cb8f3167 11861
d1c4b12b
NC
11862 if (relocs_return != NULL)
11863 {
11864 * (Elf_Internal_Rela **) relocs_return = NULL;
11865 * num_relocs_return = 0;
11866 }
11867
cf13d699
NC
11868 if (elf_header.e_type != ET_REL)
11869 return;
1b315056 11870
cf13d699 11871 /* Find the reloc section associated with the section. */
5b18a4bc
NC
11872 for (relsec = section_headers;
11873 relsec < section_headers + elf_header.e_shnum;
11874 ++relsec)
252b5132 11875 {
41e92641
NC
11876 bfd_boolean is_rela;
11877 unsigned long num_relocs;
2cf0635d
NC
11878 Elf_Internal_Rela * relocs;
11879 Elf_Internal_Rela * rp;
11880 Elf_Internal_Shdr * symsec;
11881 Elf_Internal_Sym * symtab;
ba5cdace 11882 unsigned long num_syms;
2cf0635d 11883 Elf_Internal_Sym * sym;
252b5132 11884
41e92641 11885 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
4fbb74a6
AM
11886 || relsec->sh_info >= elf_header.e_shnum
11887 || section_headers + relsec->sh_info != section
c256ffe7 11888 || relsec->sh_size == 0
4fbb74a6 11889 || relsec->sh_link >= elf_header.e_shnum)
5b18a4bc 11890 continue;
428409d5 11891
41e92641
NC
11892 is_rela = relsec->sh_type == SHT_RELA;
11893
11894 if (is_rela)
11895 {
3f5e193b
NC
11896 if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
11897 relsec->sh_size, & relocs, & num_relocs))
41e92641
NC
11898 return;
11899 }
11900 else
11901 {
3f5e193b
NC
11902 if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
11903 relsec->sh_size, & relocs, & num_relocs))
41e92641
NC
11904 return;
11905 }
11906
11907 /* SH uses RELA but uses in place value instead of the addend field. */
11908 if (elf_header.e_machine == EM_SH)
11909 is_rela = FALSE;
428409d5 11910
4fbb74a6 11911 symsec = section_headers + relsec->sh_link;
ba5cdace 11912 symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec, & num_syms);
103f02d3 11913
41e92641 11914 for (rp = relocs; rp < relocs + num_relocs; ++rp)
252b5132 11915 {
41e92641
NC
11916 bfd_vma addend;
11917 unsigned int reloc_type;
11918 unsigned int reloc_size;
91d6fa6a 11919 unsigned char * rloc;
ba5cdace 11920 unsigned long sym_index;
4b78141a 11921
aca88567 11922 reloc_type = get_reloc_type (rp->r_info);
41e92641 11923
98fb390a 11924 if (target_specific_reloc_handling (rp, start, symtab))
2a7b2e88 11925 continue;
98fb390a
NC
11926 else if (is_none_reloc (reloc_type))
11927 continue;
11928 else if (is_32bit_abs_reloc (reloc_type)
11929 || is_32bit_pcrel_reloc (reloc_type))
aca88567 11930 reloc_size = 4;
85acf597
RH
11931 else if (is_64bit_abs_reloc (reloc_type)
11932 || is_64bit_pcrel_reloc (reloc_type))
aca88567 11933 reloc_size = 8;
4dc3c23d
AM
11934 else if (is_24bit_abs_reloc (reloc_type))
11935 reloc_size = 3;
aca88567
NC
11936 else if (is_16bit_abs_reloc (reloc_type))
11937 reloc_size = 2;
11938 else
4b78141a 11939 {
bee0ee85
NC
11940 static unsigned int prev_reloc = 0;
11941 if (reloc_type != prev_reloc)
11942 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
11943 reloc_type, printable_section_name (section));
11944 prev_reloc = reloc_type;
4b78141a
NC
11945 continue;
11946 }
103f02d3 11947
91d6fa6a 11948 rloc = start + rp->r_offset;
c8da6823 11949 if ((rloc + reloc_size) > end || (rloc < start))
700dd8b7
L
11950 {
11951 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
11952 (unsigned long) rp->r_offset,
74e1a04b 11953 printable_section_name (section));
700dd8b7
L
11954 continue;
11955 }
103f02d3 11956
ba5cdace
NC
11957 sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
11958 if (sym_index >= num_syms)
11959 {
11960 warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
74e1a04b 11961 sym_index, printable_section_name (section));
ba5cdace
NC
11962 continue;
11963 }
11964 sym = symtab + sym_index;
41e92641
NC
11965
11966 /* If the reloc has a symbol associated with it,
55f25fc3
L
11967 make sure that it is of an appropriate type.
11968
11969 Relocations against symbols without type can happen.
11970 Gcc -feliminate-dwarf2-dups may generate symbols
11971 without type for debug info.
11972
11973 Icc generates relocations against function symbols
11974 instead of local labels.
11975
11976 Relocations against object symbols can happen, eg when
11977 referencing a global array. For an example of this see
11978 the _clz.o binary in libgcc.a. */
aca88567 11979 if (sym != symtab
b8871f35 11980 && ELF_ST_TYPE (sym->st_info) != STT_COMMON
55f25fc3 11981 && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
5b18a4bc 11982 {
41e92641 11983 warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
aca88567 11984 get_symbol_type (ELF_ST_TYPE (sym->st_info)),
99dcb0b9 11985 (long int)(rp - relocs),
74e1a04b 11986 printable_section_name (relsec));
aca88567 11987 continue;
5b18a4bc 11988 }
252b5132 11989
4dc3c23d
AM
11990 addend = 0;
11991 if (is_rela)
11992 addend += rp->r_addend;
c47320c3
AM
11993 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
11994 partial_inplace. */
4dc3c23d
AM
11995 if (!is_rela
11996 || (elf_header.e_machine == EM_XTENSA
11997 && reloc_type == 1)
11998 || ((elf_header.e_machine == EM_PJ
11999 || elf_header.e_machine == EM_PJ_OLD)
c47320c3
AM
12000 && reloc_type == 1)
12001 || ((elf_header.e_machine == EM_D30V
12002 || elf_header.e_machine == EM_CYGNUS_D30V)
12003 && reloc_type == 12))
91d6fa6a 12004 addend += byte_get (rloc, reloc_size);
cb8f3167 12005
85acf597
RH
12006 if (is_32bit_pcrel_reloc (reloc_type)
12007 || is_64bit_pcrel_reloc (reloc_type))
12008 {
12009 /* On HPPA, all pc-relative relocations are biased by 8. */
12010 if (elf_header.e_machine == EM_PARISC)
12011 addend -= 8;
91d6fa6a 12012 byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
85acf597
RH
12013 reloc_size);
12014 }
41e92641 12015 else
91d6fa6a 12016 byte_put (rloc, addend + sym->st_value, reloc_size);
5b18a4bc 12017 }
252b5132 12018
5b18a4bc 12019 free (symtab);
d1c4b12b
NC
12020
12021 if (relocs_return)
12022 {
12023 * (Elf_Internal_Rela **) relocs_return = relocs;
12024 * num_relocs_return = num_relocs;
12025 }
12026 else
12027 free (relocs);
12028
5b18a4bc
NC
12029 break;
12030 }
5b18a4bc 12031}
103f02d3 12032
cf13d699
NC
12033#ifdef SUPPORT_DISASSEMBLY
12034static int
12035disassemble_section (Elf_Internal_Shdr * section, FILE * file)
12036{
74e1a04b 12037 printf (_("\nAssembly dump of section %s\n"), printable_section_name (section));
cf13d699 12038
74e1a04b 12039 /* FIXME: XXX -- to be done --- XXX */
cf13d699
NC
12040
12041 return 1;
12042}
12043#endif
12044
12045/* Reads in the contents of SECTION from FILE, returning a pointer
12046 to a malloc'ed buffer or NULL if something went wrong. */
12047
12048static char *
12049get_section_contents (Elf_Internal_Shdr * section, FILE * file)
12050{
12051 bfd_size_type num_bytes;
12052
12053 num_bytes = section->sh_size;
12054
12055 if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
12056 {
12057 printf (_("\nSection '%s' has no data to dump.\n"),
74e1a04b 12058 printable_section_name (section));
cf13d699
NC
12059 return NULL;
12060 }
12061
3f5e193b
NC
12062 return (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
12063 _("section contents"));
cf13d699
NC
12064}
12065
0e602686
NC
12066/* Uncompresses a section that was compressed using zlib, in place. */
12067
12068static bfd_boolean
12069uncompress_section_contents (unsigned char **buffer,
12070 dwarf_size_type uncompressed_size,
12071 dwarf_size_type *size)
12072{
12073 dwarf_size_type compressed_size = *size;
12074 unsigned char * compressed_buffer = *buffer;
12075 unsigned char * uncompressed_buffer;
12076 z_stream strm;
12077 int rc;
12078
12079 /* It is possible the section consists of several compressed
12080 buffers concatenated together, so we uncompress in a loop. */
12081 /* PR 18313: The state field in the z_stream structure is supposed
12082 to be invisible to the user (ie us), but some compilers will
12083 still complain about it being used without initialisation. So
12084 we first zero the entire z_stream structure and then set the fields
12085 that we need. */
12086 memset (& strm, 0, sizeof strm);
12087 strm.avail_in = compressed_size;
12088 strm.next_in = (Bytef *) compressed_buffer;
12089 strm.avail_out = uncompressed_size;
12090 uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
12091
12092 rc = inflateInit (& strm);
12093 while (strm.avail_in > 0)
12094 {
12095 if (rc != Z_OK)
12096 goto fail;
12097 strm.next_out = ((Bytef *) uncompressed_buffer
12098 + (uncompressed_size - strm.avail_out));
12099 rc = inflate (&strm, Z_FINISH);
12100 if (rc != Z_STREAM_END)
12101 goto fail;
12102 rc = inflateReset (& strm);
12103 }
12104 rc = inflateEnd (& strm);
12105 if (rc != Z_OK
12106 || strm.avail_out != 0)
12107 goto fail;
12108
12109 *buffer = uncompressed_buffer;
12110 *size = uncompressed_size;
12111 return TRUE;
12112
12113 fail:
12114 free (uncompressed_buffer);
12115 /* Indicate decompression failure. */
12116 *buffer = NULL;
12117 return FALSE;
12118}
dd24e3da 12119
cf13d699
NC
12120static void
12121dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
12122{
0e602686
NC
12123 Elf_Internal_Shdr * relsec;
12124 bfd_size_type num_bytes;
fd8008d8
L
12125 unsigned char * data;
12126 unsigned char * end;
12127 unsigned char * real_start;
12128 unsigned char * start;
0e602686 12129 bfd_boolean some_strings_shown;
cf13d699 12130
fd8008d8
L
12131 real_start = start = (unsigned char *) get_section_contents (section,
12132 file);
cf13d699
NC
12133 if (start == NULL)
12134 return;
0e602686 12135 num_bytes = section->sh_size;
cf13d699 12136
74e1a04b 12137 printf (_("\nString dump of section '%s':\n"), printable_section_name (section));
cf13d699 12138
0e602686
NC
12139 if (decompress_dumps)
12140 {
12141 dwarf_size_type new_size = num_bytes;
12142 dwarf_size_type uncompressed_size = 0;
12143
12144 if ((section->sh_flags & SHF_COMPRESSED) != 0)
12145 {
12146 Elf_Internal_Chdr chdr;
12147 unsigned int compression_header_size
12148 = get_compression_header (& chdr, (unsigned char *) start);
12149
813dabb9 12150 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
0e602686 12151 {
813dabb9
L
12152 warn (_("section '%s' has unsupported compress type: %d\n"),
12153 printable_section_name (section), chdr.ch_type);
12154 return;
12155 }
12156 else if (chdr.ch_addralign != section->sh_addralign)
12157 {
12158 warn (_("compressed section '%s' is corrupted\n"),
12159 printable_section_name (section));
12160 return;
0e602686 12161 }
813dabb9
L
12162 uncompressed_size = chdr.ch_size;
12163 start += compression_header_size;
12164 new_size -= compression_header_size;
0e602686
NC
12165 }
12166 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12167 {
12168 /* Read the zlib header. In this case, it should be "ZLIB"
12169 followed by the uncompressed section size, 8 bytes in
12170 big-endian order. */
12171 uncompressed_size = start[4]; uncompressed_size <<= 8;
12172 uncompressed_size += start[5]; uncompressed_size <<= 8;
12173 uncompressed_size += start[6]; uncompressed_size <<= 8;
12174 uncompressed_size += start[7]; uncompressed_size <<= 8;
12175 uncompressed_size += start[8]; uncompressed_size <<= 8;
12176 uncompressed_size += start[9]; uncompressed_size <<= 8;
12177 uncompressed_size += start[10]; uncompressed_size <<= 8;
12178 uncompressed_size += start[11];
12179 start += 12;
12180 new_size -= 12;
12181 }
12182
12183 if (uncompressed_size
fd8008d8 12184 && uncompress_section_contents (& start,
0e602686
NC
12185 uncompressed_size, & new_size))
12186 num_bytes = new_size;
12187 }
fd8008d8 12188
cf13d699
NC
12189 /* If the section being dumped has relocations against it the user might
12190 be expecting these relocations to have been applied. Check for this
12191 case and issue a warning message in order to avoid confusion.
12192 FIXME: Maybe we ought to have an option that dumps a section with
12193 relocs applied ? */
12194 for (relsec = section_headers;
12195 relsec < section_headers + elf_header.e_shnum;
12196 ++relsec)
12197 {
12198 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12199 || relsec->sh_info >= elf_header.e_shnum
12200 || section_headers + relsec->sh_info != section
12201 || relsec->sh_size == 0
12202 || relsec->sh_link >= elf_header.e_shnum)
12203 continue;
12204
12205 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12206 break;
12207 }
12208
cf13d699
NC
12209 data = start;
12210 end = start + num_bytes;
12211 some_strings_shown = FALSE;
12212
12213 while (data < end)
12214 {
12215 while (!ISPRINT (* data))
12216 if (++ data >= end)
12217 break;
12218
12219 if (data < end)
12220 {
071436c6
NC
12221 size_t maxlen = end - data;
12222
cf13d699 12223#ifndef __MSVCRT__
c975cc98
NC
12224 /* PR 11128: Use two separate invocations in order to work
12225 around bugs in the Solaris 8 implementation of printf. */
12226 printf (" [%6tx] ", data - start);
cf13d699 12227#else
071436c6 12228 printf (" [%6Ix] ", (size_t) (data - start));
cf13d699 12229#endif
4082ef84
NC
12230 if (maxlen > 0)
12231 {
fd8008d8 12232 print_symbol ((int) maxlen, (const char *) data);
4082ef84 12233 putchar ('\n');
fd8008d8 12234 data += strnlen ((const char *) data, maxlen);
4082ef84
NC
12235 }
12236 else
12237 {
12238 printf (_("<corrupt>\n"));
12239 data = end;
12240 }
cf13d699
NC
12241 some_strings_shown = TRUE;
12242 }
12243 }
12244
12245 if (! some_strings_shown)
12246 printf (_(" No strings found in this section."));
12247
0e602686 12248 free (real_start);
cf13d699
NC
12249
12250 putchar ('\n');
12251}
12252
12253static void
12254dump_section_as_bytes (Elf_Internal_Shdr * section,
12255 FILE * file,
12256 bfd_boolean relocate)
12257{
12258 Elf_Internal_Shdr * relsec;
0e602686
NC
12259 bfd_size_type bytes;
12260 bfd_size_type section_size;
12261 bfd_vma addr;
12262 unsigned char * data;
12263 unsigned char * real_start;
12264 unsigned char * start;
12265
12266 real_start = start = (unsigned char *) get_section_contents (section, file);
cf13d699
NC
12267 if (start == NULL)
12268 return;
0e602686 12269 section_size = section->sh_size;
cf13d699 12270
74e1a04b 12271 printf (_("\nHex dump of section '%s':\n"), printable_section_name (section));
cf13d699 12272
0e602686
NC
12273 if (decompress_dumps)
12274 {
12275 dwarf_size_type new_size = section_size;
12276 dwarf_size_type uncompressed_size = 0;
12277
12278 if ((section->sh_flags & SHF_COMPRESSED) != 0)
12279 {
12280 Elf_Internal_Chdr chdr;
12281 unsigned int compression_header_size
12282 = get_compression_header (& chdr, start);
12283
813dabb9 12284 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
0e602686 12285 {
813dabb9
L
12286 warn (_("section '%s' has unsupported compress type: %d\n"),
12287 printable_section_name (section), chdr.ch_type);
12288 return;
0e602686 12289 }
813dabb9
L
12290 else if (chdr.ch_addralign != section->sh_addralign)
12291 {
12292 warn (_("compressed section '%s' is corrupted\n"),
12293 printable_section_name (section));
12294 return;
12295 }
12296 uncompressed_size = chdr.ch_size;
12297 start += compression_header_size;
12298 new_size -= compression_header_size;
0e602686
NC
12299 }
12300 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12301 {
12302 /* Read the zlib header. In this case, it should be "ZLIB"
12303 followed by the uncompressed section size, 8 bytes in
12304 big-endian order. */
12305 uncompressed_size = start[4]; uncompressed_size <<= 8;
12306 uncompressed_size += start[5]; uncompressed_size <<= 8;
12307 uncompressed_size += start[6]; uncompressed_size <<= 8;
12308 uncompressed_size += start[7]; uncompressed_size <<= 8;
12309 uncompressed_size += start[8]; uncompressed_size <<= 8;
12310 uncompressed_size += start[9]; uncompressed_size <<= 8;
12311 uncompressed_size += start[10]; uncompressed_size <<= 8;
12312 uncompressed_size += start[11];
12313 start += 12;
12314 new_size -= 12;
12315 }
12316
12317 if (uncompressed_size
12318 && uncompress_section_contents (& start, uncompressed_size,
12319 & new_size))
12320 section_size = new_size;
12321 }
14ae95f2 12322
cf13d699
NC
12323 if (relocate)
12324 {
0e602686 12325 apply_relocations (file, section, start, section_size, NULL, NULL);
cf13d699
NC
12326 }
12327 else
12328 {
12329 /* If the section being dumped has relocations against it the user might
12330 be expecting these relocations to have been applied. Check for this
12331 case and issue a warning message in order to avoid confusion.
12332 FIXME: Maybe we ought to have an option that dumps a section with
12333 relocs applied ? */
12334 for (relsec = section_headers;
12335 relsec < section_headers + elf_header.e_shnum;
12336 ++relsec)
12337 {
12338 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12339 || relsec->sh_info >= elf_header.e_shnum
12340 || section_headers + relsec->sh_info != section
12341 || relsec->sh_size == 0
12342 || relsec->sh_link >= elf_header.e_shnum)
12343 continue;
12344
12345 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12346 break;
12347 }
12348 }
12349
12350 addr = section->sh_addr;
0e602686 12351 bytes = section_size;
cf13d699
NC
12352 data = start;
12353
12354 while (bytes)
12355 {
12356 int j;
12357 int k;
12358 int lbytes;
12359
12360 lbytes = (bytes > 16 ? 16 : bytes);
12361
12362 printf (" 0x%8.8lx ", (unsigned long) addr);
12363
12364 for (j = 0; j < 16; j++)
12365 {
12366 if (j < lbytes)
12367 printf ("%2.2x", data[j]);
12368 else
12369 printf (" ");
12370
12371 if ((j & 3) == 3)
12372 printf (" ");
12373 }
12374
12375 for (j = 0; j < lbytes; j++)
12376 {
12377 k = data[j];
12378 if (k >= ' ' && k < 0x7f)
12379 printf ("%c", k);
12380 else
12381 printf (".");
12382 }
12383
12384 putchar ('\n');
12385
12386 data += lbytes;
12387 addr += lbytes;
12388 bytes -= lbytes;
12389 }
12390
0e602686 12391 free (real_start);
cf13d699
NC
12392
12393 putchar ('\n');
12394}
12395
d966045b
DJ
12396static int
12397load_specific_debug_section (enum dwarf_section_display_enum debug,
0d2a7a93 12398 const Elf_Internal_Shdr * sec, void * file)
1007acb3 12399{
2cf0635d 12400 struct dwarf_section * section = &debug_displays [debug].section;
19e6b90e 12401 char buf [64];
1007acb3 12402
19e6b90e
L
12403 /* If it is already loaded, do nothing. */
12404 if (section->start != NULL)
12405 return 1;
1007acb3 12406
19e6b90e
L
12407 snprintf (buf, sizeof (buf), _("%s section data"), section->name);
12408 section->address = sec->sh_addr;
06614111 12409 section->user_data = NULL;
3f5e193b
NC
12410 section->start = (unsigned char *) get_data (NULL, (FILE *) file,
12411 sec->sh_offset, 1,
12412 sec->sh_size, buf);
59245841
NC
12413 if (section->start == NULL)
12414 section->size = 0;
12415 else
12416 {
77115a4a
L
12417 unsigned char *start = section->start;
12418 dwarf_size_type size = sec->sh_size;
dab394de 12419 dwarf_size_type uncompressed_size = 0;
77115a4a
L
12420
12421 if ((sec->sh_flags & SHF_COMPRESSED) != 0)
12422 {
12423 Elf_Internal_Chdr chdr;
12424 unsigned int compression_header_size
12425 = get_compression_header (&chdr, start);
813dabb9
L
12426 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12427 {
12428 warn (_("section '%s' has unsupported compress type: %d\n"),
12429 section->name, chdr.ch_type);
12430 return 0;
12431 }
12432 else if (chdr.ch_addralign != sec->sh_addralign)
12433 {
12434 warn (_("compressed section '%s' is corrupted\n"),
12435 section->name);
12436 return 0;
12437 }
dab394de 12438 uncompressed_size = chdr.ch_size;
77115a4a
L
12439 start += compression_header_size;
12440 size -= compression_header_size;
12441 }
dab394de
L
12442 else if (size > 12 && streq ((char *) start, "ZLIB"))
12443 {
12444 /* Read the zlib header. In this case, it should be "ZLIB"
12445 followed by the uncompressed section size, 8 bytes in
12446 big-endian order. */
12447 uncompressed_size = start[4]; uncompressed_size <<= 8;
12448 uncompressed_size += start[5]; uncompressed_size <<= 8;
12449 uncompressed_size += start[6]; uncompressed_size <<= 8;
12450 uncompressed_size += start[7]; uncompressed_size <<= 8;
12451 uncompressed_size += start[8]; uncompressed_size <<= 8;
12452 uncompressed_size += start[9]; uncompressed_size <<= 8;
12453 uncompressed_size += start[10]; uncompressed_size <<= 8;
12454 uncompressed_size += start[11];
12455 start += 12;
12456 size -= 12;
12457 }
12458
12459 if (uncompressed_size
12460 && uncompress_section_contents (&start, uncompressed_size,
12461 &size))
77115a4a
L
12462 {
12463 /* Free the compressed buffer, update the section buffer
12464 and the section size if uncompress is successful. */
12465 free (section->start);
12466 section->start = start;
77115a4a
L
12467 }
12468 section->size = size;
59245841 12469 }
4a114e3e 12470
1b315056
CS
12471 if (section->start == NULL)
12472 return 0;
12473
19e6b90e 12474 if (debug_displays [debug].relocate)
d1c4b12b
NC
12475 apply_relocations ((FILE *) file, sec, section->start, section->size,
12476 & section->reloc_info, & section->num_relocs);
12477 else
12478 {
12479 section->reloc_info = NULL;
12480 section->num_relocs = 0;
12481 }
1007acb3 12482
1b315056 12483 return 1;
1007acb3
L
12484}
12485
657d0d47
CC
12486/* If this is not NULL, load_debug_section will only look for sections
12487 within the list of sections given here. */
12488unsigned int *section_subset = NULL;
12489
d966045b 12490int
2cf0635d 12491load_debug_section (enum dwarf_section_display_enum debug, void * file)
d966045b 12492{
2cf0635d
NC
12493 struct dwarf_section * section = &debug_displays [debug].section;
12494 Elf_Internal_Shdr * sec;
d966045b
DJ
12495
12496 /* Locate the debug section. */
657d0d47 12497 sec = find_section_in_set (section->uncompressed_name, section_subset);
d966045b
DJ
12498 if (sec != NULL)
12499 section->name = section->uncompressed_name;
12500 else
12501 {
657d0d47 12502 sec = find_section_in_set (section->compressed_name, section_subset);
d966045b
DJ
12503 if (sec != NULL)
12504 section->name = section->compressed_name;
12505 }
12506 if (sec == NULL)
12507 return 0;
12508
657d0d47
CC
12509 /* If we're loading from a subset of sections, and we've loaded
12510 a section matching this name before, it's likely that it's a
12511 different one. */
12512 if (section_subset != NULL)
12513 free_debug_section (debug);
12514
3f5e193b 12515 return load_specific_debug_section (debug, sec, (FILE *) file);
d966045b
DJ
12516}
12517
19e6b90e
L
12518void
12519free_debug_section (enum dwarf_section_display_enum debug)
1007acb3 12520{
2cf0635d 12521 struct dwarf_section * section = &debug_displays [debug].section;
1007acb3 12522
19e6b90e
L
12523 if (section->start == NULL)
12524 return;
1007acb3 12525
19e6b90e
L
12526 free ((char *) section->start);
12527 section->start = NULL;
12528 section->address = 0;
12529 section->size = 0;
1007acb3
L
12530}
12531
1007acb3 12532static int
657d0d47 12533display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
1007acb3 12534{
2cf0635d 12535 char * name = SECTION_NAME (section);
74e1a04b 12536 const char * print_name = printable_section_name (section);
19e6b90e
L
12537 bfd_size_type length;
12538 int result = 1;
3f5e193b 12539 int i;
1007acb3 12540
19e6b90e
L
12541 length = section->sh_size;
12542 if (length == 0)
1007acb3 12543 {
74e1a04b 12544 printf (_("\nSection '%s' has no debugging data.\n"), print_name);
19e6b90e 12545 return 0;
1007acb3 12546 }
5dff79d8
NC
12547 if (section->sh_type == SHT_NOBITS)
12548 {
12549 /* There is no point in dumping the contents of a debugging section
12550 which has the NOBITS type - the bits in the file will be random.
12551 This can happen when a file containing a .eh_frame section is
12552 stripped with the --only-keep-debug command line option. */
74e1a04b
NC
12553 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
12554 print_name);
5dff79d8
NC
12555 return 0;
12556 }
1007acb3 12557
0112cd26 12558 if (const_strneq (name, ".gnu.linkonce.wi."))
19e6b90e 12559 name = ".debug_info";
1007acb3 12560
19e6b90e
L
12561 /* See if we know how to display the contents of this section. */
12562 for (i = 0; i < max; i++)
1b315056 12563 if (streq (debug_displays[i].section.uncompressed_name, name)
b40bf0a2 12564 || (i == line && const_strneq (name, ".debug_line."))
1b315056 12565 || streq (debug_displays[i].section.compressed_name, name))
19e6b90e 12566 {
2cf0635d 12567 struct dwarf_section * sec = &debug_displays [i].section;
d966045b
DJ
12568 int secondary = (section != find_section (name));
12569
12570 if (secondary)
3f5e193b 12571 free_debug_section ((enum dwarf_section_display_enum) i);
1007acb3 12572
b40bf0a2
NC
12573 if (i == line && const_strneq (name, ".debug_line."))
12574 sec->name = name;
12575 else if (streq (sec->uncompressed_name, name))
d966045b
DJ
12576 sec->name = sec->uncompressed_name;
12577 else
12578 sec->name = sec->compressed_name;
3f5e193b
NC
12579 if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
12580 section, file))
19e6b90e 12581 {
657d0d47
CC
12582 /* If this debug section is part of a CU/TU set in a .dwp file,
12583 restrict load_debug_section to the sections in that set. */
12584 section_subset = find_cu_tu_set (file, shndx);
12585
19e6b90e 12586 result &= debug_displays[i].display (sec, file);
1007acb3 12587
657d0d47
CC
12588 section_subset = NULL;
12589
d966045b 12590 if (secondary || (i != info && i != abbrev))
3f5e193b 12591 free_debug_section ((enum dwarf_section_display_enum) i);
19e6b90e 12592 }
1007acb3 12593
19e6b90e
L
12594 break;
12595 }
1007acb3 12596
19e6b90e 12597 if (i == max)
1007acb3 12598 {
74e1a04b 12599 printf (_("Unrecognized debug section: %s\n"), print_name);
19e6b90e 12600 result = 0;
1007acb3
L
12601 }
12602
19e6b90e 12603 return result;
5b18a4bc 12604}
103f02d3 12605
aef1f6d0
DJ
12606/* Set DUMP_SECTS for all sections where dumps were requested
12607 based on section name. */
12608
12609static void
12610initialise_dumps_byname (void)
12611{
2cf0635d 12612 struct dump_list_entry * cur;
aef1f6d0
DJ
12613
12614 for (cur = dump_sects_byname; cur; cur = cur->next)
12615 {
12616 unsigned int i;
12617 int any;
12618
12619 for (i = 0, any = 0; i < elf_header.e_shnum; i++)
12620 if (streq (SECTION_NAME (section_headers + i), cur->name))
12621 {
09c11c86 12622 request_dump_bynumber (i, cur->type);
aef1f6d0
DJ
12623 any = 1;
12624 }
12625
12626 if (!any)
12627 warn (_("Section '%s' was not dumped because it does not exist!\n"),
12628 cur->name);
12629 }
12630}
12631
5b18a4bc 12632static void
2cf0635d 12633process_section_contents (FILE * file)
5b18a4bc 12634{
2cf0635d 12635 Elf_Internal_Shdr * section;
19e6b90e 12636 unsigned int i;
103f02d3 12637
19e6b90e
L
12638 if (! do_dump)
12639 return;
103f02d3 12640
aef1f6d0
DJ
12641 initialise_dumps_byname ();
12642
19e6b90e
L
12643 for (i = 0, section = section_headers;
12644 i < elf_header.e_shnum && i < num_dump_sects;
12645 i++, section++)
12646 {
12647#ifdef SUPPORT_DISASSEMBLY
12648 if (dump_sects[i] & DISASS_DUMP)
12649 disassemble_section (section, file);
12650#endif
12651 if (dump_sects[i] & HEX_DUMP)
cf13d699 12652 dump_section_as_bytes (section, file, FALSE);
103f02d3 12653
cf13d699
NC
12654 if (dump_sects[i] & RELOC_DUMP)
12655 dump_section_as_bytes (section, file, TRUE);
09c11c86
NC
12656
12657 if (dump_sects[i] & STRING_DUMP)
12658 dump_section_as_strings (section, file);
cf13d699
NC
12659
12660 if (dump_sects[i] & DEBUG_DUMP)
657d0d47 12661 display_debug_section (i, section, file);
5b18a4bc 12662 }
103f02d3 12663
19e6b90e
L
12664 /* Check to see if the user requested a
12665 dump of a section that does not exist. */
12666 while (i++ < num_dump_sects)
12667 if (dump_sects[i])
12668 warn (_("Section %d was not dumped because it does not exist!\n"), i);
5b18a4bc 12669}
103f02d3 12670
5b18a4bc 12671static void
19e6b90e 12672process_mips_fpe_exception (int mask)
5b18a4bc 12673{
19e6b90e
L
12674 if (mask)
12675 {
12676 int first = 1;
12677 if (mask & OEX_FPU_INEX)
12678 fputs ("INEX", stdout), first = 0;
12679 if (mask & OEX_FPU_UFLO)
12680 printf ("%sUFLO", first ? "" : "|"), first = 0;
12681 if (mask & OEX_FPU_OFLO)
12682 printf ("%sOFLO", first ? "" : "|"), first = 0;
12683 if (mask & OEX_FPU_DIV0)
12684 printf ("%sDIV0", first ? "" : "|"), first = 0;
12685 if (mask & OEX_FPU_INVAL)
12686 printf ("%sINVAL", first ? "" : "|");
12687 }
5b18a4bc 12688 else
19e6b90e 12689 fputs ("0", stdout);
5b18a4bc 12690}
103f02d3 12691
f6f0e17b
NC
12692/* Display's the value of TAG at location P. If TAG is
12693 greater than 0 it is assumed to be an unknown tag, and
12694 a message is printed to this effect. Otherwise it is
12695 assumed that a message has already been printed.
12696
12697 If the bottom bit of TAG is set it assumed to have a
12698 string value, otherwise it is assumed to have an integer
12699 value.
12700
12701 Returns an updated P pointing to the first unread byte
12702 beyond the end of TAG's value.
12703
12704 Reads at or beyond END will not be made. */
12705
12706static unsigned char *
12707display_tag_value (int tag,
12708 unsigned char * p,
12709 const unsigned char * const end)
12710{
12711 unsigned long val;
12712
12713 if (tag > 0)
12714 printf (" Tag_unknown_%d: ", tag);
12715
12716 if (p >= end)
12717 {
4082ef84 12718 warn (_("<corrupt tag>\n"));
f6f0e17b
NC
12719 }
12720 else if (tag & 1)
12721 {
071436c6
NC
12722 /* PR 17531 file: 027-19978-0.004. */
12723 size_t maxlen = (end - p) - 1;
12724
12725 putchar ('"');
4082ef84
NC
12726 if (maxlen > 0)
12727 {
12728 print_symbol ((int) maxlen, (const char *) p);
12729 p += strnlen ((char *) p, maxlen) + 1;
12730 }
12731 else
12732 {
12733 printf (_("<corrupt string tag>"));
12734 p = (unsigned char *) end;
12735 }
071436c6 12736 printf ("\"\n");
f6f0e17b
NC
12737 }
12738 else
12739 {
12740 unsigned int len;
12741
12742 val = read_uleb128 (p, &len, end);
12743 p += len;
12744 printf ("%ld (0x%lx)\n", val, val);
12745 }
12746
4082ef84 12747 assert (p <= end);
f6f0e17b
NC
12748 return p;
12749}
12750
11c1ff18
PB
12751/* ARM EABI attributes section. */
12752typedef struct
12753{
70e99720 12754 unsigned int tag;
2cf0635d 12755 const char * name;
11c1ff18 12756 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
70e99720 12757 unsigned int type;
2cf0635d 12758 const char ** table;
11c1ff18
PB
12759} arm_attr_public_tag;
12760
2cf0635d 12761static const char * arm_attr_tag_CPU_arch[] =
11c1ff18 12762 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
ff8646ee
TP
12763 "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "", "v8-M.baseline",
12764 "v8-M.mainline"};
2cf0635d
NC
12765static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
12766static const char * arm_attr_tag_THUMB_ISA_use[] =
4ed7ed8d 12767 {"No", "Thumb-1", "Thumb-2", "Yes"};
75375b3e 12768static const char * arm_attr_tag_FP_arch[] =
bca38921 12769 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
a715796b 12770 "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
2cf0635d 12771static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
dd24e3da 12772static const char * arm_attr_tag_Advanced_SIMD_arch[] =
9411fd44
MW
12773 {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
12774 "NEON for ARMv8.1"};
2cf0635d 12775static const char * arm_attr_tag_PCS_config[] =
11c1ff18
PB
12776 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
12777 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
2cf0635d 12778static const char * arm_attr_tag_ABI_PCS_R9_use[] =
11c1ff18 12779 {"V6", "SB", "TLS", "Unused"};
2cf0635d 12780static const char * arm_attr_tag_ABI_PCS_RW_data[] =
11c1ff18 12781 {"Absolute", "PC-relative", "SB-relative", "None"};
2cf0635d 12782static const char * arm_attr_tag_ABI_PCS_RO_data[] =
11c1ff18 12783 {"Absolute", "PC-relative", "None"};
2cf0635d 12784static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
11c1ff18 12785 {"None", "direct", "GOT-indirect"};
2cf0635d 12786static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
11c1ff18 12787 {"None", "??? 1", "2", "??? 3", "4"};
2cf0635d
NC
12788static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
12789static const char * arm_attr_tag_ABI_FP_denormal[] =
f5f53991 12790 {"Unused", "Needed", "Sign only"};
2cf0635d
NC
12791static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
12792static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
12793static const char * arm_attr_tag_ABI_FP_number_model[] =
11c1ff18 12794 {"Unused", "Finite", "RTABI", "IEEE 754"};
2cf0635d 12795static const char * arm_attr_tag_ABI_enum_size[] =
11c1ff18 12796 {"Unused", "small", "int", "forced to int"};
2cf0635d 12797static const char * arm_attr_tag_ABI_HardFP_use[] =
99654aaf 12798 {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
2cf0635d 12799static const char * arm_attr_tag_ABI_VFP_args[] =
5c294fee 12800 {"AAPCS", "VFP registers", "custom", "compatible"};
2cf0635d 12801static const char * arm_attr_tag_ABI_WMMX_args[] =
11c1ff18 12802 {"AAPCS", "WMMX registers", "custom"};
2cf0635d 12803static const char * arm_attr_tag_ABI_optimization_goals[] =
11c1ff18
PB
12804 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
12805 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
2cf0635d 12806static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
11c1ff18
PB
12807 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
12808 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
2cf0635d 12809static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
75375b3e 12810static const char * arm_attr_tag_FP_HP_extension[] =
8e79c3df 12811 {"Not Allowed", "Allowed"};
2cf0635d 12812static const char * arm_attr_tag_ABI_FP_16bit_format[] =
8e79c3df 12813 {"None", "IEEE 754", "Alternative Format"};
dd24e3da 12814static const char * arm_attr_tag_MPextension_use[] =
cd21e546
MGD
12815 {"Not Allowed", "Allowed"};
12816static const char * arm_attr_tag_DIV_use[] =
dd24e3da 12817 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
cd21e546 12818 "Allowed in v7-A with integer division extension"};
2cf0635d
NC
12819static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
12820static const char * arm_attr_tag_Virtualization_use[] =
dd24e3da 12821 {"Not Allowed", "TrustZone", "Virtualization Extensions",
cd21e546 12822 "TrustZone and Virtualization Extensions"};
dd24e3da 12823static const char * arm_attr_tag_MPextension_use_legacy[] =
f5f53991 12824 {"Not Allowed", "Allowed"};
11c1ff18
PB
12825
12826#define LOOKUP(id, name) \
12827 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
d70c5fc7 12828static arm_attr_public_tag arm_attr_public_tags[] =
11c1ff18
PB
12829{
12830 {4, "CPU_raw_name", 1, NULL},
12831 {5, "CPU_name", 1, NULL},
12832 LOOKUP(6, CPU_arch),
12833 {7, "CPU_arch_profile", 0, NULL},
12834 LOOKUP(8, ARM_ISA_use),
12835 LOOKUP(9, THUMB_ISA_use),
75375b3e 12836 LOOKUP(10, FP_arch),
11c1ff18 12837 LOOKUP(11, WMMX_arch),
f5f53991
AS
12838 LOOKUP(12, Advanced_SIMD_arch),
12839 LOOKUP(13, PCS_config),
11c1ff18
PB
12840 LOOKUP(14, ABI_PCS_R9_use),
12841 LOOKUP(15, ABI_PCS_RW_data),
f5f53991 12842 LOOKUP(16, ABI_PCS_RO_data),
11c1ff18
PB
12843 LOOKUP(17, ABI_PCS_GOT_use),
12844 LOOKUP(18, ABI_PCS_wchar_t),
12845 LOOKUP(19, ABI_FP_rounding),
12846 LOOKUP(20, ABI_FP_denormal),
12847 LOOKUP(21, ABI_FP_exceptions),
12848 LOOKUP(22, ABI_FP_user_exceptions),
12849 LOOKUP(23, ABI_FP_number_model),
75375b3e
MGD
12850 {24, "ABI_align_needed", 0, NULL},
12851 {25, "ABI_align_preserved", 0, NULL},
11c1ff18
PB
12852 LOOKUP(26, ABI_enum_size),
12853 LOOKUP(27, ABI_HardFP_use),
12854 LOOKUP(28, ABI_VFP_args),
12855 LOOKUP(29, ABI_WMMX_args),
12856 LOOKUP(30, ABI_optimization_goals),
12857 LOOKUP(31, ABI_FP_optimization_goals),
8e79c3df 12858 {32, "compatibility", 0, NULL},
f5f53991 12859 LOOKUP(34, CPU_unaligned_access),
75375b3e 12860 LOOKUP(36, FP_HP_extension),
8e79c3df 12861 LOOKUP(38, ABI_FP_16bit_format),
cd21e546
MGD
12862 LOOKUP(42, MPextension_use),
12863 LOOKUP(44, DIV_use),
f5f53991
AS
12864 {64, "nodefaults", 0, NULL},
12865 {65, "also_compatible_with", 0, NULL},
12866 LOOKUP(66, T2EE_use),
12867 {67, "conformance", 1, NULL},
12868 LOOKUP(68, Virtualization_use),
cd21e546 12869 LOOKUP(70, MPextension_use_legacy)
11c1ff18
PB
12870};
12871#undef LOOKUP
12872
11c1ff18 12873static unsigned char *
f6f0e17b
NC
12874display_arm_attribute (unsigned char * p,
12875 const unsigned char * const end)
11c1ff18 12876{
70e99720 12877 unsigned int tag;
11c1ff18 12878 unsigned int len;
70e99720 12879 unsigned int val;
2cf0635d 12880 arm_attr_public_tag * attr;
11c1ff18 12881 unsigned i;
70e99720 12882 unsigned int type;
11c1ff18 12883
f6f0e17b 12884 tag = read_uleb128 (p, &len, end);
11c1ff18
PB
12885 p += len;
12886 attr = NULL;
2cf0635d 12887 for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
11c1ff18
PB
12888 {
12889 if (arm_attr_public_tags[i].tag == tag)
12890 {
12891 attr = &arm_attr_public_tags[i];
12892 break;
12893 }
12894 }
12895
12896 if (attr)
12897 {
12898 printf (" Tag_%s: ", attr->name);
12899 switch (attr->type)
12900 {
12901 case 0:
12902 switch (tag)
12903 {
12904 case 7: /* Tag_CPU_arch_profile. */
f6f0e17b 12905 val = read_uleb128 (p, &len, end);
11c1ff18
PB
12906 p += len;
12907 switch (val)
12908 {
2b692964
NC
12909 case 0: printf (_("None\n")); break;
12910 case 'A': printf (_("Application\n")); break;
12911 case 'R': printf (_("Realtime\n")); break;
12912 case 'M': printf (_("Microcontroller\n")); break;
12913 case 'S': printf (_("Application or Realtime\n")); break;
11c1ff18
PB
12914 default: printf ("??? (%d)\n", val); break;
12915 }
12916 break;
12917
75375b3e 12918 case 24: /* Tag_align_needed. */
f6f0e17b 12919 val = read_uleb128 (p, &len, end);
75375b3e
MGD
12920 p += len;
12921 switch (val)
12922 {
2b692964
NC
12923 case 0: printf (_("None\n")); break;
12924 case 1: printf (_("8-byte\n")); break;
12925 case 2: printf (_("4-byte\n")); break;
75375b3e
MGD
12926 case 3: printf ("??? 3\n"); break;
12927 default:
12928 if (val <= 12)
dd24e3da 12929 printf (_("8-byte and up to %d-byte extended\n"),
75375b3e
MGD
12930 1 << val);
12931 else
12932 printf ("??? (%d)\n", val);
12933 break;
12934 }
12935 break;
12936
12937 case 25: /* Tag_align_preserved. */
f6f0e17b 12938 val = read_uleb128 (p, &len, end);
75375b3e
MGD
12939 p += len;
12940 switch (val)
12941 {
2b692964
NC
12942 case 0: printf (_("None\n")); break;
12943 case 1: printf (_("8-byte, except leaf SP\n")); break;
12944 case 2: printf (_("8-byte\n")); break;
75375b3e
MGD
12945 case 3: printf ("??? 3\n"); break;
12946 default:
12947 if (val <= 12)
dd24e3da 12948 printf (_("8-byte and up to %d-byte extended\n"),
75375b3e
MGD
12949 1 << val);
12950 else
12951 printf ("??? (%d)\n", val);
12952 break;
12953 }
12954 break;
12955
11c1ff18 12956 case 32: /* Tag_compatibility. */
071436c6 12957 {
071436c6
NC
12958 val = read_uleb128 (p, &len, end);
12959 p += len;
071436c6 12960 printf (_("flag = %d, vendor = "), val);
4082ef84
NC
12961 if (p < end - 1)
12962 {
12963 size_t maxlen = (end - p) - 1;
12964
12965 print_symbol ((int) maxlen, (const char *) p);
12966 p += strnlen ((char *) p, maxlen) + 1;
12967 }
12968 else
12969 {
12970 printf (_("<corrupt>"));
12971 p = (unsigned char *) end;
12972 }
071436c6 12973 putchar ('\n');
071436c6 12974 }
11c1ff18
PB
12975 break;
12976
f5f53991 12977 case 64: /* Tag_nodefaults. */
541a3cbd
NC
12978 /* PR 17531: file: 001-505008-0.01. */
12979 if (p < end)
12980 p++;
2b692964 12981 printf (_("True\n"));
f5f53991
AS
12982 break;
12983
12984 case 65: /* Tag_also_compatible_with. */
f6f0e17b 12985 val = read_uleb128 (p, &len, end);
f5f53991
AS
12986 p += len;
12987 if (val == 6 /* Tag_CPU_arch. */)
12988 {
f6f0e17b 12989 val = read_uleb128 (p, &len, end);
f5f53991 12990 p += len;
071436c6 12991 if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
f5f53991
AS
12992 printf ("??? (%d)\n", val);
12993 else
12994 printf ("%s\n", arm_attr_tag_CPU_arch[val]);
12995 }
12996 else
12997 printf ("???\n");
071436c6
NC
12998 while (p < end && *(p++) != '\0' /* NUL terminator. */)
12999 ;
f5f53991
AS
13000 break;
13001
11c1ff18 13002 default:
bee0ee85
NC
13003 printf (_("<unknown: %d>\n"), tag);
13004 break;
11c1ff18
PB
13005 }
13006 return p;
13007
13008 case 1:
f6f0e17b 13009 return display_tag_value (-1, p, end);
11c1ff18 13010 case 2:
f6f0e17b 13011 return display_tag_value (0, p, end);
11c1ff18
PB
13012
13013 default:
13014 assert (attr->type & 0x80);
f6f0e17b 13015 val = read_uleb128 (p, &len, end);
11c1ff18
PB
13016 p += len;
13017 type = attr->type & 0x7f;
13018 if (val >= type)
13019 printf ("??? (%d)\n", val);
13020 else
13021 printf ("%s\n", attr->table[val]);
13022 return p;
13023 }
13024 }
11c1ff18 13025
f6f0e17b 13026 return display_tag_value (tag, p, end);
11c1ff18
PB
13027}
13028
104d59d1 13029static unsigned char *
60bca95a 13030display_gnu_attribute (unsigned char * p,
f6f0e17b
NC
13031 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const),
13032 const unsigned char * const end)
104d59d1
JM
13033{
13034 int tag;
13035 unsigned int len;
13036 int val;
104d59d1 13037
f6f0e17b 13038 tag = read_uleb128 (p, &len, end);
104d59d1
JM
13039 p += len;
13040
13041 /* Tag_compatibility is the only generic GNU attribute defined at
13042 present. */
13043 if (tag == 32)
13044 {
f6f0e17b 13045 val = read_uleb128 (p, &len, end);
104d59d1 13046 p += len;
071436c6
NC
13047
13048 printf (_("flag = %d, vendor = "), val);
f6f0e17b
NC
13049 if (p == end)
13050 {
071436c6 13051 printf (_("<corrupt>\n"));
f6f0e17b
NC
13052 warn (_("corrupt vendor attribute\n"));
13053 }
13054 else
13055 {
4082ef84
NC
13056 if (p < end - 1)
13057 {
13058 size_t maxlen = (end - p) - 1;
071436c6 13059
4082ef84
NC
13060 print_symbol ((int) maxlen, (const char *) p);
13061 p += strnlen ((char *) p, maxlen) + 1;
13062 }
13063 else
13064 {
13065 printf (_("<corrupt>"));
13066 p = (unsigned char *) end;
13067 }
071436c6 13068 putchar ('\n');
f6f0e17b 13069 }
104d59d1
JM
13070 return p;
13071 }
13072
13073 if ((tag & 2) == 0 && display_proc_gnu_attribute)
f6f0e17b 13074 return display_proc_gnu_attribute (p, tag, end);
104d59d1 13075
f6f0e17b 13076 return display_tag_value (tag, p, end);
104d59d1
JM
13077}
13078
34c8bcba 13079static unsigned char *
f6f0e17b
NC
13080display_power_gnu_attribute (unsigned char * p,
13081 int tag,
13082 const unsigned char * const end)
34c8bcba 13083{
34c8bcba
JM
13084 unsigned int len;
13085 int val;
13086
13087 if (tag == Tag_GNU_Power_ABI_FP)
13088 {
f6f0e17b 13089 val = read_uleb128 (p, &len, end);
34c8bcba
JM
13090 p += len;
13091 printf (" Tag_GNU_Power_ABI_FP: ");
60bca95a 13092
34c8bcba
JM
13093 switch (val)
13094 {
13095 case 0:
2b692964 13096 printf (_("Hard or soft float\n"));
34c8bcba
JM
13097 break;
13098 case 1:
2b692964 13099 printf (_("Hard float\n"));
34c8bcba
JM
13100 break;
13101 case 2:
2b692964 13102 printf (_("Soft float\n"));
34c8bcba 13103 break;
3c7b9897 13104 case 3:
2b692964 13105 printf (_("Single-precision hard float\n"));
3c7b9897 13106 break;
34c8bcba
JM
13107 default:
13108 printf ("??? (%d)\n", val);
13109 break;
13110 }
13111 return p;
13112 }
13113
c6e65352
DJ
13114 if (tag == Tag_GNU_Power_ABI_Vector)
13115 {
f6f0e17b 13116 val = read_uleb128 (p, &len, end);
c6e65352
DJ
13117 p += len;
13118 printf (" Tag_GNU_Power_ABI_Vector: ");
13119 switch (val)
13120 {
13121 case 0:
2b692964 13122 printf (_("Any\n"));
c6e65352
DJ
13123 break;
13124 case 1:
2b692964 13125 printf (_("Generic\n"));
c6e65352
DJ
13126 break;
13127 case 2:
13128 printf ("AltiVec\n");
13129 break;
13130 case 3:
13131 printf ("SPE\n");
13132 break;
13133 default:
13134 printf ("??? (%d)\n", val);
13135 break;
13136 }
13137 return p;
13138 }
13139
f82e0623
NF
13140 if (tag == Tag_GNU_Power_ABI_Struct_Return)
13141 {
f6f0e17b
NC
13142 if (p == end)
13143 {
071436c6 13144 warn (_("corrupt Tag_GNU_Power_ABI_Struct_Return\n"));
f6f0e17b
NC
13145 return p;
13146 }
0b4362b0 13147
f6f0e17b 13148 val = read_uleb128 (p, &len, end);
f82e0623
NF
13149 p += len;
13150 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
13151 switch (val)
13152 {
13153 case 0:
2b692964 13154 printf (_("Any\n"));
f82e0623
NF
13155 break;
13156 case 1:
13157 printf ("r3/r4\n");
13158 break;
13159 case 2:
2b692964 13160 printf (_("Memory\n"));
f82e0623
NF
13161 break;
13162 default:
13163 printf ("??? (%d)\n", val);
13164 break;
13165 }
13166 return p;
13167 }
13168
f6f0e17b 13169 return display_tag_value (tag & 1, p, end);
34c8bcba
JM
13170}
13171
643f7afb
AK
13172static unsigned char *
13173display_s390_gnu_attribute (unsigned char * p,
13174 int tag,
13175 const unsigned char * const end)
13176{
13177 unsigned int len;
13178 int val;
13179
13180 if (tag == Tag_GNU_S390_ABI_Vector)
13181 {
13182 val = read_uleb128 (p, &len, end);
13183 p += len;
13184 printf (" Tag_GNU_S390_ABI_Vector: ");
13185
13186 switch (val)
13187 {
13188 case 0:
13189 printf (_("any\n"));
13190 break;
13191 case 1:
13192 printf (_("software\n"));
13193 break;
13194 case 2:
13195 printf (_("hardware\n"));
13196 break;
13197 default:
13198 printf ("??? (%d)\n", val);
13199 break;
13200 }
13201 return p;
13202 }
13203
13204 return display_tag_value (tag & 1, p, end);
13205}
13206
9e8c70f9
DM
13207static void
13208display_sparc_hwcaps (int mask)
13209{
13210 if (mask)
13211 {
13212 int first = 1;
071436c6 13213
9e8c70f9
DM
13214 if (mask & ELF_SPARC_HWCAP_MUL32)
13215 fputs ("mul32", stdout), first = 0;
13216 if (mask & ELF_SPARC_HWCAP_DIV32)
13217 printf ("%sdiv32", first ? "" : "|"), first = 0;
13218 if (mask & ELF_SPARC_HWCAP_FSMULD)
13219 printf ("%sfsmuld", first ? "" : "|"), first = 0;
13220 if (mask & ELF_SPARC_HWCAP_V8PLUS)
13221 printf ("%sv8plus", first ? "" : "|"), first = 0;
13222 if (mask & ELF_SPARC_HWCAP_POPC)
13223 printf ("%spopc", first ? "" : "|"), first = 0;
13224 if (mask & ELF_SPARC_HWCAP_VIS)
13225 printf ("%svis", first ? "" : "|"), first = 0;
13226 if (mask & ELF_SPARC_HWCAP_VIS2)
13227 printf ("%svis2", first ? "" : "|"), first = 0;
13228 if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
13229 printf ("%sASIBlkInit", first ? "" : "|"), first = 0;
13230 if (mask & ELF_SPARC_HWCAP_FMAF)
13231 printf ("%sfmaf", first ? "" : "|"), first = 0;
13232 if (mask & ELF_SPARC_HWCAP_VIS3)
13233 printf ("%svis3", first ? "" : "|"), first = 0;
13234 if (mask & ELF_SPARC_HWCAP_HPC)
13235 printf ("%shpc", first ? "" : "|"), first = 0;
13236 if (mask & ELF_SPARC_HWCAP_RANDOM)
13237 printf ("%srandom", first ? "" : "|"), first = 0;
13238 if (mask & ELF_SPARC_HWCAP_TRANS)
13239 printf ("%strans", first ? "" : "|"), first = 0;
13240 if (mask & ELF_SPARC_HWCAP_FJFMAU)
13241 printf ("%sfjfmau", first ? "" : "|"), first = 0;
13242 if (mask & ELF_SPARC_HWCAP_IMA)
13243 printf ("%sima", first ? "" : "|"), first = 0;
13244 if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
13245 printf ("%scspare", first ? "" : "|"), first = 0;
13246 }
13247 else
071436c6
NC
13248 fputc ('0', stdout);
13249 fputc ('\n', stdout);
9e8c70f9
DM
13250}
13251
3d68f91c
JM
13252static void
13253display_sparc_hwcaps2 (int mask)
13254{
13255 if (mask)
13256 {
13257 int first = 1;
071436c6 13258
3d68f91c
JM
13259 if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
13260 fputs ("fjathplus", stdout), first = 0;
13261 if (mask & ELF_SPARC_HWCAP2_VIS3B)
13262 printf ("%svis3b", first ? "" : "|"), first = 0;
13263 if (mask & ELF_SPARC_HWCAP2_ADP)
13264 printf ("%sadp", first ? "" : "|"), first = 0;
13265 if (mask & ELF_SPARC_HWCAP2_SPARC5)
13266 printf ("%ssparc5", first ? "" : "|"), first = 0;
13267 if (mask & ELF_SPARC_HWCAP2_MWAIT)
13268 printf ("%smwait", first ? "" : "|"), first = 0;
13269 if (mask & ELF_SPARC_HWCAP2_XMPMUL)
13270 printf ("%sxmpmul", first ? "" : "|"), first = 0;
13271 if (mask & ELF_SPARC_HWCAP2_XMONT)
13272 printf ("%sxmont2", first ? "" : "|"), first = 0;
13273 if (mask & ELF_SPARC_HWCAP2_NSEC)
13274 printf ("%snsec", first ? "" : "|"), first = 0;
13275 if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
13276 printf ("%sfjathhpc", first ? "" : "|"), first = 0;
13277 if (mask & ELF_SPARC_HWCAP2_FJDES)
13278 printf ("%sfjdes", first ? "" : "|"), first = 0;
13279 if (mask & ELF_SPARC_HWCAP2_FJAES)
13280 printf ("%sfjaes", first ? "" : "|"), first = 0;
13281 }
13282 else
071436c6
NC
13283 fputc ('0', stdout);
13284 fputc ('\n', stdout);
3d68f91c
JM
13285}
13286
9e8c70f9 13287static unsigned char *
f6f0e17b
NC
13288display_sparc_gnu_attribute (unsigned char * p,
13289 int tag,
13290 const unsigned char * const end)
9e8c70f9 13291{
3d68f91c
JM
13292 unsigned int len;
13293 int val;
13294
9e8c70f9
DM
13295 if (tag == Tag_GNU_Sparc_HWCAPS)
13296 {
f6f0e17b 13297 val = read_uleb128 (p, &len, end);
9e8c70f9
DM
13298 p += len;
13299 printf (" Tag_GNU_Sparc_HWCAPS: ");
9e8c70f9
DM
13300 display_sparc_hwcaps (val);
13301 return p;
3d68f91c
JM
13302 }
13303 if (tag == Tag_GNU_Sparc_HWCAPS2)
13304 {
13305 val = read_uleb128 (p, &len, end);
13306 p += len;
13307 printf (" Tag_GNU_Sparc_HWCAPS2: ");
13308 display_sparc_hwcaps2 (val);
13309 return p;
13310 }
9e8c70f9 13311
f6f0e17b 13312 return display_tag_value (tag, p, end);
9e8c70f9
DM
13313}
13314
351cdf24
MF
13315static void
13316print_mips_fp_abi_value (int val)
13317{
13318 switch (val)
13319 {
13320 case Val_GNU_MIPS_ABI_FP_ANY:
13321 printf (_("Hard or soft float\n"));
13322 break;
13323 case Val_GNU_MIPS_ABI_FP_DOUBLE:
13324 printf (_("Hard float (double precision)\n"));
13325 break;
13326 case Val_GNU_MIPS_ABI_FP_SINGLE:
13327 printf (_("Hard float (single precision)\n"));
13328 break;
13329 case Val_GNU_MIPS_ABI_FP_SOFT:
13330 printf (_("Soft float\n"));
13331 break;
13332 case Val_GNU_MIPS_ABI_FP_OLD_64:
13333 printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
13334 break;
13335 case Val_GNU_MIPS_ABI_FP_XX:
13336 printf (_("Hard float (32-bit CPU, Any FPU)\n"));
13337 break;
13338 case Val_GNU_MIPS_ABI_FP_64:
13339 printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
13340 break;
13341 case Val_GNU_MIPS_ABI_FP_64A:
13342 printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
13343 break;
3350cc01
CM
13344 case Val_GNU_MIPS_ABI_FP_NAN2008:
13345 printf (_("NaN 2008 compatibility\n"));
13346 break;
351cdf24
MF
13347 default:
13348 printf ("??? (%d)\n", val);
13349 break;
13350 }
13351}
13352
2cf19d5c 13353static unsigned char *
f6f0e17b
NC
13354display_mips_gnu_attribute (unsigned char * p,
13355 int tag,
13356 const unsigned char * const end)
2cf19d5c 13357{
2cf19d5c
JM
13358 if (tag == Tag_GNU_MIPS_ABI_FP)
13359 {
f6f0e17b
NC
13360 unsigned int len;
13361 int val;
13362
13363 val = read_uleb128 (p, &len, end);
2cf19d5c
JM
13364 p += len;
13365 printf (" Tag_GNU_MIPS_ABI_FP: ");
60bca95a 13366
351cdf24
MF
13367 print_mips_fp_abi_value (val);
13368
2cf19d5c
JM
13369 return p;
13370 }
13371
a9f58168
CF
13372 if (tag == Tag_GNU_MIPS_ABI_MSA)
13373 {
13374 unsigned int len;
13375 int val;
13376
13377 val = read_uleb128 (p, &len, end);
13378 p += len;
13379 printf (" Tag_GNU_MIPS_ABI_MSA: ");
13380
13381 switch (val)
13382 {
13383 case Val_GNU_MIPS_ABI_MSA_ANY:
13384 printf (_("Any MSA or not\n"));
13385 break;
13386 case Val_GNU_MIPS_ABI_MSA_128:
13387 printf (_("128-bit MSA\n"));
13388 break;
13389 default:
13390 printf ("??? (%d)\n", val);
13391 break;
13392 }
13393 return p;
13394 }
13395
f6f0e17b 13396 return display_tag_value (tag & 1, p, end);
2cf19d5c
JM
13397}
13398
59e6276b 13399static unsigned char *
f6f0e17b
NC
13400display_tic6x_attribute (unsigned char * p,
13401 const unsigned char * const end)
59e6276b
JM
13402{
13403 int tag;
13404 unsigned int len;
13405 int val;
13406
f6f0e17b 13407 tag = read_uleb128 (p, &len, end);
59e6276b
JM
13408 p += len;
13409
13410 switch (tag)
13411 {
75fa6dc1 13412 case Tag_ISA:
f6f0e17b 13413 val = read_uleb128 (p, &len, end);
59e6276b 13414 p += len;
75fa6dc1 13415 printf (" Tag_ISA: ");
59e6276b
JM
13416
13417 switch (val)
13418 {
75fa6dc1 13419 case C6XABI_Tag_ISA_none:
59e6276b
JM
13420 printf (_("None\n"));
13421 break;
75fa6dc1 13422 case C6XABI_Tag_ISA_C62X:
59e6276b
JM
13423 printf ("C62x\n");
13424 break;
75fa6dc1 13425 case C6XABI_Tag_ISA_C67X:
59e6276b
JM
13426 printf ("C67x\n");
13427 break;
75fa6dc1 13428 case C6XABI_Tag_ISA_C67XP:
59e6276b
JM
13429 printf ("C67x+\n");
13430 break;
75fa6dc1 13431 case C6XABI_Tag_ISA_C64X:
59e6276b
JM
13432 printf ("C64x\n");
13433 break;
75fa6dc1 13434 case C6XABI_Tag_ISA_C64XP:
59e6276b
JM
13435 printf ("C64x+\n");
13436 break;
75fa6dc1 13437 case C6XABI_Tag_ISA_C674X:
59e6276b
JM
13438 printf ("C674x\n");
13439 break;
13440 default:
13441 printf ("??? (%d)\n", val);
13442 break;
13443 }
13444 return p;
13445
87779176 13446 case Tag_ABI_wchar_t:
f6f0e17b 13447 val = read_uleb128 (p, &len, end);
87779176
JM
13448 p += len;
13449 printf (" Tag_ABI_wchar_t: ");
13450 switch (val)
13451 {
13452 case 0:
13453 printf (_("Not used\n"));
13454 break;
13455 case 1:
13456 printf (_("2 bytes\n"));
13457 break;
13458 case 2:
13459 printf (_("4 bytes\n"));
13460 break;
13461 default:
13462 printf ("??? (%d)\n", val);
13463 break;
13464 }
13465 return p;
13466
13467 case Tag_ABI_stack_align_needed:
f6f0e17b 13468 val = read_uleb128 (p, &len, end);
87779176
JM
13469 p += len;
13470 printf (" Tag_ABI_stack_align_needed: ");
13471 switch (val)
13472 {
13473 case 0:
13474 printf (_("8-byte\n"));
13475 break;
13476 case 1:
13477 printf (_("16-byte\n"));
13478 break;
13479 default:
13480 printf ("??? (%d)\n", val);
13481 break;
13482 }
13483 return p;
13484
13485 case Tag_ABI_stack_align_preserved:
f6f0e17b 13486 val = read_uleb128 (p, &len, end);
87779176
JM
13487 p += len;
13488 printf (" Tag_ABI_stack_align_preserved: ");
13489 switch (val)
13490 {
13491 case 0:
13492 printf (_("8-byte\n"));
13493 break;
13494 case 1:
13495 printf (_("16-byte\n"));
13496 break;
13497 default:
13498 printf ("??? (%d)\n", val);
13499 break;
13500 }
13501 return p;
13502
b5593623 13503 case Tag_ABI_DSBT:
f6f0e17b 13504 val = read_uleb128 (p, &len, end);
b5593623
JM
13505 p += len;
13506 printf (" Tag_ABI_DSBT: ");
13507 switch (val)
13508 {
13509 case 0:
13510 printf (_("DSBT addressing not used\n"));
13511 break;
13512 case 1:
13513 printf (_("DSBT addressing used\n"));
13514 break;
13515 default:
13516 printf ("??? (%d)\n", val);
13517 break;
13518 }
13519 return p;
13520
87779176 13521 case Tag_ABI_PID:
f6f0e17b 13522 val = read_uleb128 (p, &len, end);
87779176
JM
13523 p += len;
13524 printf (" Tag_ABI_PID: ");
13525 switch (val)
13526 {
13527 case 0:
13528 printf (_("Data addressing position-dependent\n"));
13529 break;
13530 case 1:
13531 printf (_("Data addressing position-independent, GOT near DP\n"));
13532 break;
13533 case 2:
13534 printf (_("Data addressing position-independent, GOT far from DP\n"));
13535 break;
13536 default:
13537 printf ("??? (%d)\n", val);
13538 break;
13539 }
13540 return p;
13541
13542 case Tag_ABI_PIC:
f6f0e17b 13543 val = read_uleb128 (p, &len, end);
87779176
JM
13544 p += len;
13545 printf (" Tag_ABI_PIC: ");
13546 switch (val)
13547 {
13548 case 0:
13549 printf (_("Code addressing position-dependent\n"));
13550 break;
13551 case 1:
13552 printf (_("Code addressing position-independent\n"));
13553 break;
13554 default:
13555 printf ("??? (%d)\n", val);
13556 break;
13557 }
13558 return p;
13559
13560 case Tag_ABI_array_object_alignment:
f6f0e17b 13561 val = read_uleb128 (p, &len, end);
87779176
JM
13562 p += len;
13563 printf (" Tag_ABI_array_object_alignment: ");
13564 switch (val)
13565 {
13566 case 0:
13567 printf (_("8-byte\n"));
13568 break;
13569 case 1:
13570 printf (_("4-byte\n"));
13571 break;
13572 case 2:
13573 printf (_("16-byte\n"));
13574 break;
13575 default:
13576 printf ("??? (%d)\n", val);
13577 break;
13578 }
13579 return p;
13580
13581 case Tag_ABI_array_object_align_expected:
f6f0e17b 13582 val = read_uleb128 (p, &len, end);
87779176
JM
13583 p += len;
13584 printf (" Tag_ABI_array_object_align_expected: ");
13585 switch (val)
13586 {
13587 case 0:
13588 printf (_("8-byte\n"));
13589 break;
13590 case 1:
13591 printf (_("4-byte\n"));
13592 break;
13593 case 2:
13594 printf (_("16-byte\n"));
13595 break;
13596 default:
13597 printf ("??? (%d)\n", val);
13598 break;
13599 }
13600 return p;
13601
3cbd1c06 13602 case Tag_ABI_compatibility:
071436c6 13603 {
071436c6
NC
13604 val = read_uleb128 (p, &len, end);
13605 p += len;
13606 printf (" Tag_ABI_compatibility: ");
071436c6 13607 printf (_("flag = %d, vendor = "), val);
4082ef84
NC
13608 if (p < end - 1)
13609 {
13610 size_t maxlen = (end - p) - 1;
13611
13612 print_symbol ((int) maxlen, (const char *) p);
13613 p += strnlen ((char *) p, maxlen) + 1;
13614 }
13615 else
13616 {
13617 printf (_("<corrupt>"));
13618 p = (unsigned char *) end;
13619 }
071436c6 13620 putchar ('\n');
071436c6
NC
13621 return p;
13622 }
87779176
JM
13623
13624 case Tag_ABI_conformance:
071436c6 13625 {
4082ef84
NC
13626 printf (" Tag_ABI_conformance: \"");
13627 if (p < end - 1)
13628 {
13629 size_t maxlen = (end - p) - 1;
071436c6 13630
4082ef84
NC
13631 print_symbol ((int) maxlen, (const char *) p);
13632 p += strnlen ((char *) p, maxlen) + 1;
13633 }
13634 else
13635 {
13636 printf (_("<corrupt>"));
13637 p = (unsigned char *) end;
13638 }
071436c6 13639 printf ("\"\n");
071436c6
NC
13640 return p;
13641 }
59e6276b
JM
13642 }
13643
f6f0e17b
NC
13644 return display_tag_value (tag, p, end);
13645}
59e6276b 13646
f6f0e17b
NC
13647static void
13648display_raw_attribute (unsigned char * p, unsigned char * end)
13649{
13650 unsigned long addr = 0;
13651 size_t bytes = end - p;
13652
e0a31db1 13653 assert (end > p);
f6f0e17b 13654 while (bytes)
87779176 13655 {
f6f0e17b
NC
13656 int j;
13657 int k;
13658 int lbytes = (bytes > 16 ? 16 : bytes);
13659
13660 printf (" 0x%8.8lx ", addr);
13661
13662 for (j = 0; j < 16; j++)
13663 {
13664 if (j < lbytes)
13665 printf ("%2.2x", p[j]);
13666 else
13667 printf (" ");
13668
13669 if ((j & 3) == 3)
13670 printf (" ");
13671 }
13672
13673 for (j = 0; j < lbytes; j++)
13674 {
13675 k = p[j];
13676 if (k >= ' ' && k < 0x7f)
13677 printf ("%c", k);
13678 else
13679 printf (".");
13680 }
13681
13682 putchar ('\n');
13683
13684 p += lbytes;
13685 bytes -= lbytes;
13686 addr += lbytes;
87779176 13687 }
59e6276b 13688
f6f0e17b 13689 putchar ('\n');
59e6276b
JM
13690}
13691
13761a11
NC
13692static unsigned char *
13693display_msp430x_attribute (unsigned char * p,
13694 const unsigned char * const end)
13695{
13696 unsigned int len;
13697 int val;
13698 int tag;
13699
13700 tag = read_uleb128 (p, & len, end);
13701 p += len;
0b4362b0 13702
13761a11
NC
13703 switch (tag)
13704 {
13705 case OFBA_MSPABI_Tag_ISA:
13706 val = read_uleb128 (p, &len, end);
13707 p += len;
13708 printf (" Tag_ISA: ");
13709 switch (val)
13710 {
13711 case 0: printf (_("None\n")); break;
13712 case 1: printf (_("MSP430\n")); break;
13713 case 2: printf (_("MSP430X\n")); break;
13714 default: printf ("??? (%d)\n", val); break;
13715 }
13716 break;
13717
13718 case OFBA_MSPABI_Tag_Code_Model:
13719 val = read_uleb128 (p, &len, end);
13720 p += len;
13721 printf (" Tag_Code_Model: ");
13722 switch (val)
13723 {
13724 case 0: printf (_("None\n")); break;
13725 case 1: printf (_("Small\n")); break;
13726 case 2: printf (_("Large\n")); break;
13727 default: printf ("??? (%d)\n", val); break;
13728 }
13729 break;
13730
13731 case OFBA_MSPABI_Tag_Data_Model:
13732 val = read_uleb128 (p, &len, end);
13733 p += len;
13734 printf (" Tag_Data_Model: ");
13735 switch (val)
13736 {
13737 case 0: printf (_("None\n")); break;
13738 case 1: printf (_("Small\n")); break;
13739 case 2: printf (_("Large\n")); break;
13740 case 3: printf (_("Restricted Large\n")); break;
13741 default: printf ("??? (%d)\n", val); break;
13742 }
13743 break;
13744
13745 default:
13746 printf (_(" <unknown tag %d>: "), tag);
13747
13748 if (tag & 1)
13749 {
071436c6 13750 putchar ('"');
4082ef84
NC
13751 if (p < end - 1)
13752 {
13753 size_t maxlen = (end - p) - 1;
13754
13755 print_symbol ((int) maxlen, (const char *) p);
13756 p += strnlen ((char *) p, maxlen) + 1;
13757 }
13758 else
13759 {
13760 printf (_("<corrupt>"));
13761 p = (unsigned char *) end;
13762 }
071436c6 13763 printf ("\"\n");
13761a11
NC
13764 }
13765 else
13766 {
13767 val = read_uleb128 (p, &len, end);
13768 p += len;
13769 printf ("%d (0x%x)\n", val, val);
13770 }
13771 break;
13772 }
13773
4082ef84 13774 assert (p <= end);
13761a11
NC
13775 return p;
13776}
13777
11c1ff18 13778static int
60bca95a
NC
13779process_attributes (FILE * file,
13780 const char * public_name,
104d59d1 13781 unsigned int proc_type,
f6f0e17b
NC
13782 unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
13783 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const))
11c1ff18 13784{
2cf0635d 13785 Elf_Internal_Shdr * sect;
11c1ff18
PB
13786 unsigned i;
13787
13788 /* Find the section header so that we get the size. */
13789 for (i = 0, sect = section_headers;
13790 i < elf_header.e_shnum;
13791 i++, sect++)
13792 {
071436c6
NC
13793 unsigned char * contents;
13794 unsigned char * p;
13795
104d59d1 13796 if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
11c1ff18
PB
13797 continue;
13798
3f5e193b
NC
13799 contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
13800 sect->sh_size, _("attributes"));
60bca95a 13801 if (contents == NULL)
11c1ff18 13802 continue;
60bca95a 13803
11c1ff18
PB
13804 p = contents;
13805 if (*p == 'A')
13806 {
071436c6
NC
13807 bfd_vma section_len;
13808
13809 section_len = sect->sh_size - 1;
11c1ff18 13810 p++;
60bca95a 13811
071436c6 13812 while (section_len > 0)
11c1ff18 13813 {
071436c6 13814 bfd_vma attr_len;
e9847026 13815 unsigned int namelen;
11c1ff18 13816 bfd_boolean public_section;
104d59d1 13817 bfd_boolean gnu_section;
11c1ff18 13818
071436c6 13819 if (section_len <= 4)
e0a31db1
NC
13820 {
13821 error (_("Tag section ends prematurely\n"));
13822 break;
13823 }
071436c6 13824 attr_len = byte_get (p, 4);
11c1ff18 13825 p += 4;
60bca95a 13826
071436c6 13827 if (attr_len > section_len)
11c1ff18 13828 {
071436c6
NC
13829 error (_("Bad attribute length (%u > %u)\n"),
13830 (unsigned) attr_len, (unsigned) section_len);
13831 attr_len = section_len;
11c1ff18 13832 }
74e1a04b 13833 /* PR 17531: file: 001-101425-0.004 */
071436c6 13834 else if (attr_len < 5)
74e1a04b 13835 {
071436c6 13836 error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
74e1a04b
NC
13837 break;
13838 }
e9847026 13839
071436c6
NC
13840 section_len -= attr_len;
13841 attr_len -= 4;
13842
13843 namelen = strnlen ((char *) p, attr_len) + 1;
13844 if (namelen == 0 || namelen >= attr_len)
e9847026
NC
13845 {
13846 error (_("Corrupt attribute section name\n"));
13847 break;
13848 }
13849
071436c6
NC
13850 printf (_("Attribute Section: "));
13851 print_symbol (INT_MAX, (const char *) p);
13852 putchar ('\n');
60bca95a
NC
13853
13854 if (public_name && streq ((char *) p, public_name))
11c1ff18
PB
13855 public_section = TRUE;
13856 else
13857 public_section = FALSE;
60bca95a
NC
13858
13859 if (streq ((char *) p, "gnu"))
104d59d1
JM
13860 gnu_section = TRUE;
13861 else
13862 gnu_section = FALSE;
60bca95a 13863
11c1ff18 13864 p += namelen;
071436c6 13865 attr_len -= namelen;
e0a31db1 13866
071436c6 13867 while (attr_len > 0 && p < contents + sect->sh_size)
11c1ff18 13868 {
e0a31db1 13869 int tag;
11c1ff18
PB
13870 int val;
13871 bfd_vma size;
071436c6 13872 unsigned char * end;
60bca95a 13873
e0a31db1 13874 /* PR binutils/17531: Safe handling of corrupt files. */
071436c6 13875 if (attr_len < 6)
e0a31db1
NC
13876 {
13877 error (_("Unused bytes at end of section\n"));
13878 section_len = 0;
13879 break;
13880 }
13881
13882 tag = *(p++);
11c1ff18 13883 size = byte_get (p, 4);
071436c6 13884 if (size > attr_len)
11c1ff18 13885 {
e9847026 13886 error (_("Bad subsection length (%u > %u)\n"),
071436c6
NC
13887 (unsigned) size, (unsigned) attr_len);
13888 size = attr_len;
11c1ff18 13889 }
e0a31db1
NC
13890 /* PR binutils/17531: Safe handling of corrupt files. */
13891 if (size < 6)
13892 {
13893 error (_("Bad subsection length (%u < 6)\n"),
13894 (unsigned) size);
13895 section_len = 0;
13896 break;
13897 }
60bca95a 13898
071436c6 13899 attr_len -= size;
11c1ff18 13900 end = p + size - 1;
071436c6 13901 assert (end <= contents + sect->sh_size);
11c1ff18 13902 p += 4;
60bca95a 13903
11c1ff18
PB
13904 switch (tag)
13905 {
13906 case 1:
2b692964 13907 printf (_("File Attributes\n"));
11c1ff18
PB
13908 break;
13909 case 2:
2b692964 13910 printf (_("Section Attributes:"));
11c1ff18
PB
13911 goto do_numlist;
13912 case 3:
2b692964 13913 printf (_("Symbol Attributes:"));
11c1ff18
PB
13914 do_numlist:
13915 for (;;)
13916 {
91d6fa6a 13917 unsigned int j;
60bca95a 13918
f6f0e17b 13919 val = read_uleb128 (p, &j, end);
91d6fa6a 13920 p += j;
11c1ff18
PB
13921 if (val == 0)
13922 break;
13923 printf (" %d", val);
13924 }
13925 printf ("\n");
13926 break;
13927 default:
2b692964 13928 printf (_("Unknown tag: %d\n"), tag);
11c1ff18
PB
13929 public_section = FALSE;
13930 break;
13931 }
60bca95a 13932
071436c6 13933 if (public_section && display_pub_attribute != NULL)
11c1ff18
PB
13934 {
13935 while (p < end)
f6f0e17b 13936 p = display_pub_attribute (p, end);
071436c6 13937 assert (p <= end);
104d59d1 13938 }
071436c6 13939 else if (gnu_section && display_proc_gnu_attribute != NULL)
104d59d1
JM
13940 {
13941 while (p < end)
13942 p = display_gnu_attribute (p,
f6f0e17b
NC
13943 display_proc_gnu_attribute,
13944 end);
071436c6 13945 assert (p <= end);
11c1ff18 13946 }
071436c6 13947 else if (p < end)
11c1ff18 13948 {
071436c6 13949 printf (_(" Unknown attribute:\n"));
f6f0e17b 13950 display_raw_attribute (p, end);
11c1ff18
PB
13951 p = end;
13952 }
071436c6
NC
13953 else
13954 attr_len = 0;
11c1ff18
PB
13955 }
13956 }
13957 }
13958 else
e9847026 13959 printf (_("Unknown format '%c' (%d)\n"), *p, *p);
d70c5fc7 13960
60bca95a 13961 free (contents);
11c1ff18
PB
13962 }
13963 return 1;
13964}
13965
104d59d1 13966static int
2cf0635d 13967process_arm_specific (FILE * file)
104d59d1
JM
13968{
13969 return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
13970 display_arm_attribute, NULL);
13971}
13972
34c8bcba 13973static int
2cf0635d 13974process_power_specific (FILE * file)
34c8bcba
JM
13975{
13976 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13977 display_power_gnu_attribute);
13978}
13979
643f7afb
AK
13980static int
13981process_s390_specific (FILE * file)
13982{
13983 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13984 display_s390_gnu_attribute);
13985}
13986
9e8c70f9
DM
13987static int
13988process_sparc_specific (FILE * file)
13989{
13990 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13991 display_sparc_gnu_attribute);
13992}
13993
59e6276b
JM
13994static int
13995process_tic6x_specific (FILE * file)
13996{
13997 return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
13998 display_tic6x_attribute, NULL);
13999}
14000
13761a11
NC
14001static int
14002process_msp430x_specific (FILE * file)
14003{
14004 return process_attributes (file, "mspabi", SHT_MSP430_ATTRIBUTES,
14005 display_msp430x_attribute, NULL);
14006}
14007
ccb4c951
RS
14008/* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
14009 Print the Address, Access and Initial fields of an entry at VMA ADDR
82b1b41b
NC
14010 and return the VMA of the next entry, or -1 if there was a problem.
14011 Does not read from DATA_END or beyond. */
ccb4c951
RS
14012
14013static bfd_vma
82b1b41b
NC
14014print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
14015 unsigned char * data_end)
ccb4c951
RS
14016{
14017 printf (" ");
14018 print_vma (addr, LONG_HEX);
14019 printf (" ");
14020 if (addr < pltgot + 0xfff0)
14021 printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
14022 else
14023 printf ("%10s", "");
14024 printf (" ");
14025 if (data == NULL)
2b692964 14026 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
ccb4c951
RS
14027 else
14028 {
14029 bfd_vma entry;
82b1b41b 14030 unsigned char * from = data + addr - pltgot;
ccb4c951 14031
82b1b41b
NC
14032 if (from + (is_32bit_elf ? 4 : 8) > data_end)
14033 {
14034 warn (_("MIPS GOT entry extends beyond the end of available data\n"));
14035 printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
14036 return (bfd_vma) -1;
14037 }
14038 else
14039 {
14040 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14041 print_vma (entry, LONG_HEX);
14042 }
ccb4c951
RS
14043 }
14044 return addr + (is_32bit_elf ? 4 : 8);
14045}
14046
861fb55a
DJ
14047/* DATA points to the contents of a MIPS PLT GOT that starts at VMA
14048 PLTGOT. Print the Address and Initial fields of an entry at VMA
14049 ADDR and return the VMA of the next entry. */
14050
14051static bfd_vma
2cf0635d 14052print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
861fb55a
DJ
14053{
14054 printf (" ");
14055 print_vma (addr, LONG_HEX);
14056 printf (" ");
14057 if (data == NULL)
2b692964 14058 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
861fb55a
DJ
14059 else
14060 {
14061 bfd_vma entry;
14062
14063 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14064 print_vma (entry, LONG_HEX);
14065 }
14066 return addr + (is_32bit_elf ? 4 : 8);
14067}
14068
351cdf24
MF
14069static void
14070print_mips_ases (unsigned int mask)
14071{
14072 if (mask & AFL_ASE_DSP)
14073 fputs ("\n\tDSP ASE", stdout);
14074 if (mask & AFL_ASE_DSPR2)
14075 fputs ("\n\tDSP R2 ASE", stdout);
14076 if (mask & AFL_ASE_EVA)
14077 fputs ("\n\tEnhanced VA Scheme", stdout);
14078 if (mask & AFL_ASE_MCU)
14079 fputs ("\n\tMCU (MicroController) ASE", stdout);
14080 if (mask & AFL_ASE_MDMX)
14081 fputs ("\n\tMDMX ASE", stdout);
14082 if (mask & AFL_ASE_MIPS3D)
14083 fputs ("\n\tMIPS-3D ASE", stdout);
14084 if (mask & AFL_ASE_MT)
14085 fputs ("\n\tMT ASE", stdout);
14086 if (mask & AFL_ASE_SMARTMIPS)
14087 fputs ("\n\tSmartMIPS ASE", stdout);
14088 if (mask & AFL_ASE_VIRT)
14089 fputs ("\n\tVZ ASE", stdout);
14090 if (mask & AFL_ASE_MSA)
14091 fputs ("\n\tMSA ASE", stdout);
14092 if (mask & AFL_ASE_MIPS16)
14093 fputs ("\n\tMIPS16 ASE", stdout);
14094 if (mask & AFL_ASE_MICROMIPS)
14095 fputs ("\n\tMICROMIPS ASE", stdout);
14096 if (mask & AFL_ASE_XPA)
14097 fputs ("\n\tXPA ASE", stdout);
14098 if (mask == 0)
14099 fprintf (stdout, "\n\t%s", _("None"));
00ac7aa0
MF
14100 else if ((mask & ~AFL_ASE_MASK) != 0)
14101 fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
351cdf24
MF
14102}
14103
14104static void
14105print_mips_isa_ext (unsigned int isa_ext)
14106{
14107 switch (isa_ext)
14108 {
14109 case 0:
14110 fputs (_("None"), stdout);
14111 break;
14112 case AFL_EXT_XLR:
14113 fputs ("RMI XLR", stdout);
14114 break;
2c629856
N
14115 case AFL_EXT_OCTEON3:
14116 fputs ("Cavium Networks Octeon3", stdout);
14117 break;
351cdf24
MF
14118 case AFL_EXT_OCTEON2:
14119 fputs ("Cavium Networks Octeon2", stdout);
14120 break;
14121 case AFL_EXT_OCTEONP:
14122 fputs ("Cavium Networks OcteonP", stdout);
14123 break;
14124 case AFL_EXT_LOONGSON_3A:
14125 fputs ("Loongson 3A", stdout);
14126 break;
14127 case AFL_EXT_OCTEON:
14128 fputs ("Cavium Networks Octeon", stdout);
14129 break;
14130 case AFL_EXT_5900:
14131 fputs ("Toshiba R5900", stdout);
14132 break;
14133 case AFL_EXT_4650:
14134 fputs ("MIPS R4650", stdout);
14135 break;
14136 case AFL_EXT_4010:
14137 fputs ("LSI R4010", stdout);
14138 break;
14139 case AFL_EXT_4100:
14140 fputs ("NEC VR4100", stdout);
14141 break;
14142 case AFL_EXT_3900:
14143 fputs ("Toshiba R3900", stdout);
14144 break;
14145 case AFL_EXT_10000:
14146 fputs ("MIPS R10000", stdout);
14147 break;
14148 case AFL_EXT_SB1:
14149 fputs ("Broadcom SB-1", stdout);
14150 break;
14151 case AFL_EXT_4111:
14152 fputs ("NEC VR4111/VR4181", stdout);
14153 break;
14154 case AFL_EXT_4120:
14155 fputs ("NEC VR4120", stdout);
14156 break;
14157 case AFL_EXT_5400:
14158 fputs ("NEC VR5400", stdout);
14159 break;
14160 case AFL_EXT_5500:
14161 fputs ("NEC VR5500", stdout);
14162 break;
14163 case AFL_EXT_LOONGSON_2E:
14164 fputs ("ST Microelectronics Loongson 2E", stdout);
14165 break;
14166 case AFL_EXT_LOONGSON_2F:
14167 fputs ("ST Microelectronics Loongson 2F", stdout);
14168 break;
14169 default:
00ac7aa0 14170 fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
351cdf24
MF
14171 }
14172}
14173
14174static int
14175get_mips_reg_size (int reg_size)
14176{
14177 return (reg_size == AFL_REG_NONE) ? 0
14178 : (reg_size == AFL_REG_32) ? 32
14179 : (reg_size == AFL_REG_64) ? 64
14180 : (reg_size == AFL_REG_128) ? 128
14181 : -1;
14182}
14183
19e6b90e 14184static int
2cf0635d 14185process_mips_specific (FILE * file)
5b18a4bc 14186{
2cf0635d 14187 Elf_Internal_Dyn * entry;
351cdf24 14188 Elf_Internal_Shdr *sect = NULL;
19e6b90e
L
14189 size_t liblist_offset = 0;
14190 size_t liblistno = 0;
14191 size_t conflictsno = 0;
14192 size_t options_offset = 0;
14193 size_t conflicts_offset = 0;
861fb55a
DJ
14194 size_t pltrelsz = 0;
14195 size_t pltrel = 0;
ccb4c951 14196 bfd_vma pltgot = 0;
861fb55a
DJ
14197 bfd_vma mips_pltgot = 0;
14198 bfd_vma jmprel = 0;
ccb4c951
RS
14199 bfd_vma local_gotno = 0;
14200 bfd_vma gotsym = 0;
14201 bfd_vma symtabno = 0;
103f02d3 14202
2cf19d5c
JM
14203 process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14204 display_mips_gnu_attribute);
14205
351cdf24
MF
14206 sect = find_section (".MIPS.abiflags");
14207
14208 if (sect != NULL)
14209 {
14210 Elf_External_ABIFlags_v0 *abiflags_ext;
14211 Elf_Internal_ABIFlags_v0 abiflags_in;
14212
14213 if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
14214 fputs ("\nCorrupt ABI Flags section.\n", stdout);
14215 else
14216 {
14217 abiflags_ext = get_data (NULL, file, sect->sh_offset, 1,
14218 sect->sh_size, _("MIPS ABI Flags section"));
14219 if (abiflags_ext)
14220 {
14221 abiflags_in.version = BYTE_GET (abiflags_ext->version);
14222 abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
14223 abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
14224 abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
14225 abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
14226 abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
14227 abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
14228 abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
14229 abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
14230 abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
14231 abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
14232
14233 printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
14234 printf ("\nISA: MIPS%d", abiflags_in.isa_level);
14235 if (abiflags_in.isa_rev > 1)
14236 printf ("r%d", abiflags_in.isa_rev);
14237 printf ("\nGPR size: %d",
14238 get_mips_reg_size (abiflags_in.gpr_size));
14239 printf ("\nCPR1 size: %d",
14240 get_mips_reg_size (abiflags_in.cpr1_size));
14241 printf ("\nCPR2 size: %d",
14242 get_mips_reg_size (abiflags_in.cpr2_size));
14243 fputs ("\nFP ABI: ", stdout);
14244 print_mips_fp_abi_value (abiflags_in.fp_abi);
14245 fputs ("ISA Extension: ", stdout);
14246 print_mips_isa_ext (abiflags_in.isa_ext);
14247 fputs ("\nASEs:", stdout);
14248 print_mips_ases (abiflags_in.ases);
14249 printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
14250 printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
14251 fputc ('\n', stdout);
14252 free (abiflags_ext);
14253 }
14254 }
14255 }
14256
19e6b90e
L
14257 /* We have a lot of special sections. Thanks SGI! */
14258 if (dynamic_section == NULL)
14259 /* No information available. */
14260 return 0;
252b5132 14261
071436c6
NC
14262 for (entry = dynamic_section;
14263 /* PR 17531 file: 012-50589-0.004. */
14264 entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
14265 ++entry)
252b5132
RH
14266 switch (entry->d_tag)
14267 {
14268 case DT_MIPS_LIBLIST:
d93f0186
NC
14269 liblist_offset
14270 = offset_from_vma (file, entry->d_un.d_val,
14271 liblistno * sizeof (Elf32_External_Lib));
252b5132
RH
14272 break;
14273 case DT_MIPS_LIBLISTNO:
14274 liblistno = entry->d_un.d_val;
14275 break;
14276 case DT_MIPS_OPTIONS:
d93f0186 14277 options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
252b5132
RH
14278 break;
14279 case DT_MIPS_CONFLICT:
d93f0186
NC
14280 conflicts_offset
14281 = offset_from_vma (file, entry->d_un.d_val,
14282 conflictsno * sizeof (Elf32_External_Conflict));
252b5132
RH
14283 break;
14284 case DT_MIPS_CONFLICTNO:
14285 conflictsno = entry->d_un.d_val;
14286 break;
ccb4c951 14287 case DT_PLTGOT:
861fb55a
DJ
14288 pltgot = entry->d_un.d_ptr;
14289 break;
ccb4c951
RS
14290 case DT_MIPS_LOCAL_GOTNO:
14291 local_gotno = entry->d_un.d_val;
14292 break;
14293 case DT_MIPS_GOTSYM:
14294 gotsym = entry->d_un.d_val;
14295 break;
14296 case DT_MIPS_SYMTABNO:
14297 symtabno = entry->d_un.d_val;
14298 break;
861fb55a
DJ
14299 case DT_MIPS_PLTGOT:
14300 mips_pltgot = entry->d_un.d_ptr;
14301 break;
14302 case DT_PLTREL:
14303 pltrel = entry->d_un.d_val;
14304 break;
14305 case DT_PLTRELSZ:
14306 pltrelsz = entry->d_un.d_val;
14307 break;
14308 case DT_JMPREL:
14309 jmprel = entry->d_un.d_ptr;
14310 break;
252b5132
RH
14311 default:
14312 break;
14313 }
14314
14315 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
14316 {
2cf0635d 14317 Elf32_External_Lib * elib;
252b5132
RH
14318 size_t cnt;
14319
3f5e193b
NC
14320 elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
14321 liblistno,
14322 sizeof (Elf32_External_Lib),
9cf03b7e 14323 _("liblist section data"));
a6e9f9df 14324 if (elib)
252b5132 14325 {
2b692964 14326 printf (_("\nSection '.liblist' contains %lu entries:\n"),
a6e9f9df 14327 (unsigned long) liblistno);
2b692964 14328 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
a6e9f9df
AM
14329 stdout);
14330
14331 for (cnt = 0; cnt < liblistno; ++cnt)
252b5132 14332 {
a6e9f9df 14333 Elf32_Lib liblist;
91d6fa6a 14334 time_t atime;
a6e9f9df 14335 char timebuf[20];
2cf0635d 14336 struct tm * tmp;
a6e9f9df
AM
14337
14338 liblist.l_name = BYTE_GET (elib[cnt].l_name);
91d6fa6a 14339 atime = BYTE_GET (elib[cnt].l_time_stamp);
a6e9f9df
AM
14340 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
14341 liblist.l_version = BYTE_GET (elib[cnt].l_version);
14342 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
14343
91d6fa6a 14344 tmp = gmtime (&atime);
e9e44622
JJ
14345 snprintf (timebuf, sizeof (timebuf),
14346 "%04u-%02u-%02uT%02u:%02u:%02u",
14347 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
14348 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
a6e9f9df 14349
31104126 14350 printf ("%3lu: ", (unsigned long) cnt);
d79b3d50
NC
14351 if (VALID_DYNAMIC_NAME (liblist.l_name))
14352 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
14353 else
2b692964 14354 printf (_("<corrupt: %9ld>"), liblist.l_name);
31104126
NC
14355 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
14356 liblist.l_version);
a6e9f9df
AM
14357
14358 if (liblist.l_flags == 0)
2b692964 14359 puts (_(" NONE"));
a6e9f9df
AM
14360 else
14361 {
14362 static const struct
252b5132 14363 {
2cf0635d 14364 const char * name;
a6e9f9df 14365 int bit;
252b5132 14366 }
a6e9f9df
AM
14367 l_flags_vals[] =
14368 {
14369 { " EXACT_MATCH", LL_EXACT_MATCH },
14370 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
14371 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
14372 { " EXPORTS", LL_EXPORTS },
14373 { " DELAY_LOAD", LL_DELAY_LOAD },
14374 { " DELTA", LL_DELTA }
14375 };
14376 int flags = liblist.l_flags;
14377 size_t fcnt;
14378
60bca95a 14379 for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
a6e9f9df
AM
14380 if ((flags & l_flags_vals[fcnt].bit) != 0)
14381 {
14382 fputs (l_flags_vals[fcnt].name, stdout);
14383 flags ^= l_flags_vals[fcnt].bit;
14384 }
14385 if (flags != 0)
14386 printf (" %#x", (unsigned int) flags);
252b5132 14387
a6e9f9df
AM
14388 puts ("");
14389 }
252b5132 14390 }
252b5132 14391
a6e9f9df
AM
14392 free (elib);
14393 }
252b5132
RH
14394 }
14395
14396 if (options_offset != 0)
14397 {
2cf0635d 14398 Elf_External_Options * eopt;
2cf0635d
NC
14399 Elf_Internal_Options * iopt;
14400 Elf_Internal_Options * option;
252b5132
RH
14401 size_t offset;
14402 int cnt;
351cdf24 14403 sect = section_headers;
252b5132
RH
14404
14405 /* Find the section header so that we get the size. */
071436c6 14406 sect = find_section_by_type (SHT_MIPS_OPTIONS);
948f632f 14407 /* PR 17533 file: 012-277276-0.004. */
071436c6
NC
14408 if (sect == NULL)
14409 {
14410 error (_("No MIPS_OPTIONS header found\n"));
14411 return 0;
14412 }
252b5132 14413
3f5e193b
NC
14414 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
14415 sect->sh_size, _("options"));
a6e9f9df 14416 if (eopt)
252b5132 14417 {
3f5e193b
NC
14418 iopt = (Elf_Internal_Options *)
14419 cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
a6e9f9df
AM
14420 if (iopt == NULL)
14421 {
8b73c356 14422 error (_("Out of memory allocatinf space for MIPS options\n"));
a6e9f9df
AM
14423 return 0;
14424 }
76da6bbe 14425
a6e9f9df
AM
14426 offset = cnt = 0;
14427 option = iopt;
252b5132 14428
82b1b41b 14429 while (offset <= sect->sh_size - sizeof (* eopt))
a6e9f9df 14430 {
2cf0635d 14431 Elf_External_Options * eoption;
252b5132 14432
a6e9f9df 14433 eoption = (Elf_External_Options *) ((char *) eopt + offset);
252b5132 14434
a6e9f9df
AM
14435 option->kind = BYTE_GET (eoption->kind);
14436 option->size = BYTE_GET (eoption->size);
14437 option->section = BYTE_GET (eoption->section);
14438 option->info = BYTE_GET (eoption->info);
76da6bbe 14439
82b1b41b
NC
14440 /* PR 17531: file: ffa0fa3b. */
14441 if (option->size < sizeof (* eopt)
14442 || offset + option->size > sect->sh_size)
14443 {
55325047
NC
14444 error (_("Invalid size (%u) for MIPS option\n"), option->size);
14445 return 0;
82b1b41b 14446 }
a6e9f9df 14447 offset += option->size;
14ae95f2 14448
a6e9f9df
AM
14449 ++option;
14450 ++cnt;
14451 }
252b5132 14452
a6e9f9df 14453 printf (_("\nSection '%s' contains %d entries:\n"),
74e1a04b 14454 printable_section_name (sect), cnt);
76da6bbe 14455
a6e9f9df 14456 option = iopt;
82b1b41b 14457 offset = 0;
252b5132 14458
a6e9f9df 14459 while (cnt-- > 0)
252b5132 14460 {
a6e9f9df
AM
14461 size_t len;
14462
14463 switch (option->kind)
252b5132 14464 {
a6e9f9df
AM
14465 case ODK_NULL:
14466 /* This shouldn't happen. */
14467 printf (" NULL %d %lx", option->section, option->info);
14468 break;
14469 case ODK_REGINFO:
14470 printf (" REGINFO ");
14471 if (elf_header.e_machine == EM_MIPS)
14472 {
14473 /* 32bit form. */
2cf0635d 14474 Elf32_External_RegInfo * ereg;
b34976b6 14475 Elf32_RegInfo reginfo;
a6e9f9df
AM
14476
14477 ereg = (Elf32_External_RegInfo *) (option + 1);
14478 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
14479 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
14480 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
14481 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
14482 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
14483 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
14484
14485 printf ("GPR %08lx GP 0x%lx\n",
14486 reginfo.ri_gprmask,
14487 (unsigned long) reginfo.ri_gp_value);
14488 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
14489 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
14490 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
14491 }
14492 else
14493 {
14494 /* 64 bit form. */
2cf0635d 14495 Elf64_External_RegInfo * ereg;
a6e9f9df
AM
14496 Elf64_Internal_RegInfo reginfo;
14497
14498 ereg = (Elf64_External_RegInfo *) (option + 1);
14499 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
14500 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
14501 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
14502 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
14503 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
66543521 14504 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
a6e9f9df
AM
14505
14506 printf ("GPR %08lx GP 0x",
14507 reginfo.ri_gprmask);
14508 printf_vma (reginfo.ri_gp_value);
14509 printf ("\n");
14510
14511 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
14512 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
14513 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
14514 }
14515 ++option;
14516 continue;
14517 case ODK_EXCEPTIONS:
14518 fputs (" EXCEPTIONS fpe_min(", stdout);
14519 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
14520 fputs (") fpe_max(", stdout);
14521 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
14522 fputs (")", stdout);
14523
14524 if (option->info & OEX_PAGE0)
14525 fputs (" PAGE0", stdout);
14526 if (option->info & OEX_SMM)
14527 fputs (" SMM", stdout);
14528 if (option->info & OEX_FPDBUG)
14529 fputs (" FPDBUG", stdout);
14530 if (option->info & OEX_DISMISS)
14531 fputs (" DISMISS", stdout);
14532 break;
14533 case ODK_PAD:
14534 fputs (" PAD ", stdout);
14535 if (option->info & OPAD_PREFIX)
14536 fputs (" PREFIX", stdout);
14537 if (option->info & OPAD_POSTFIX)
14538 fputs (" POSTFIX", stdout);
14539 if (option->info & OPAD_SYMBOL)
14540 fputs (" SYMBOL", stdout);
14541 break;
14542 case ODK_HWPATCH:
14543 fputs (" HWPATCH ", stdout);
14544 if (option->info & OHW_R4KEOP)
14545 fputs (" R4KEOP", stdout);
14546 if (option->info & OHW_R8KPFETCH)
14547 fputs (" R8KPFETCH", stdout);
14548 if (option->info & OHW_R5KEOP)
14549 fputs (" R5KEOP", stdout);
14550 if (option->info & OHW_R5KCVTL)
14551 fputs (" R5KCVTL", stdout);
14552 break;
14553 case ODK_FILL:
14554 fputs (" FILL ", stdout);
14555 /* XXX Print content of info word? */
14556 break;
14557 case ODK_TAGS:
14558 fputs (" TAGS ", stdout);
14559 /* XXX Print content of info word? */
14560 break;
14561 case ODK_HWAND:
14562 fputs (" HWAND ", stdout);
14563 if (option->info & OHWA0_R4KEOP_CHECKED)
14564 fputs (" R4KEOP_CHECKED", stdout);
14565 if (option->info & OHWA0_R4KEOP_CLEAN)
14566 fputs (" R4KEOP_CLEAN", stdout);
14567 break;
14568 case ODK_HWOR:
14569 fputs (" HWOR ", stdout);
14570 if (option->info & OHWA0_R4KEOP_CHECKED)
14571 fputs (" R4KEOP_CHECKED", stdout);
14572 if (option->info & OHWA0_R4KEOP_CLEAN)
14573 fputs (" R4KEOP_CLEAN", stdout);
14574 break;
14575 case ODK_GP_GROUP:
14576 printf (" GP_GROUP %#06lx self-contained %#06lx",
14577 option->info & OGP_GROUP,
14578 (option->info & OGP_SELF) >> 16);
14579 break;
14580 case ODK_IDENT:
14581 printf (" IDENT %#06lx self-contained %#06lx",
14582 option->info & OGP_GROUP,
14583 (option->info & OGP_SELF) >> 16);
14584 break;
14585 default:
14586 /* This shouldn't happen. */
14587 printf (" %3d ??? %d %lx",
14588 option->kind, option->section, option->info);
14589 break;
252b5132 14590 }
a6e9f9df 14591
2cf0635d 14592 len = sizeof (* eopt);
a6e9f9df 14593 while (len < option->size)
82b1b41b 14594 {
7e27a9d5 14595 unsigned char datum = * ((unsigned char *) eopt + offset + len);
a6e9f9df 14596
82b1b41b
NC
14597 if (ISPRINT (datum))
14598 printf ("%c", datum);
14599 else
14600 printf ("\\%03o", datum);
14601 len ++;
14602 }
a6e9f9df 14603 fputs ("\n", stdout);
82b1b41b
NC
14604
14605 offset += option->size;
252b5132 14606 ++option;
252b5132
RH
14607 }
14608
a6e9f9df 14609 free (eopt);
252b5132 14610 }
252b5132
RH
14611 }
14612
14613 if (conflicts_offset != 0 && conflictsno != 0)
14614 {
2cf0635d 14615 Elf32_Conflict * iconf;
252b5132
RH
14616 size_t cnt;
14617
14618 if (dynamic_symbols == NULL)
14619 {
591a748a 14620 error (_("conflict list found without a dynamic symbol table\n"));
252b5132
RH
14621 return 0;
14622 }
14623
3f5e193b 14624 iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
252b5132
RH
14625 if (iconf == NULL)
14626 {
8b73c356 14627 error (_("Out of memory allocating space for dynamic conflicts\n"));
252b5132
RH
14628 return 0;
14629 }
14630
9ea033b2 14631 if (is_32bit_elf)
252b5132 14632 {
2cf0635d 14633 Elf32_External_Conflict * econf32;
a6e9f9df 14634
3f5e193b
NC
14635 econf32 = (Elf32_External_Conflict *)
14636 get_data (NULL, file, conflicts_offset, conflictsno,
14637 sizeof (* econf32), _("conflict"));
a6e9f9df
AM
14638 if (!econf32)
14639 return 0;
252b5132
RH
14640
14641 for (cnt = 0; cnt < conflictsno; ++cnt)
14642 iconf[cnt] = BYTE_GET (econf32[cnt]);
a6e9f9df
AM
14643
14644 free (econf32);
252b5132
RH
14645 }
14646 else
14647 {
2cf0635d 14648 Elf64_External_Conflict * econf64;
a6e9f9df 14649
3f5e193b
NC
14650 econf64 = (Elf64_External_Conflict *)
14651 get_data (NULL, file, conflicts_offset, conflictsno,
14652 sizeof (* econf64), _("conflict"));
a6e9f9df
AM
14653 if (!econf64)
14654 return 0;
252b5132
RH
14655
14656 for (cnt = 0; cnt < conflictsno; ++cnt)
14657 iconf[cnt] = BYTE_GET (econf64[cnt]);
a6e9f9df
AM
14658
14659 free (econf64);
252b5132
RH
14660 }
14661
c7e7ca54
NC
14662 printf (_("\nSection '.conflict' contains %lu entries:\n"),
14663 (unsigned long) conflictsno);
252b5132
RH
14664 puts (_(" Num: Index Value Name"));
14665
14666 for (cnt = 0; cnt < conflictsno; ++cnt)
14667 {
b34976b6 14668 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
e0a31db1
NC
14669
14670 if (iconf[cnt] >= num_dynamic_syms)
14671 printf (_("<corrupt symbol index>"));
d79b3d50 14672 else
e0a31db1
NC
14673 {
14674 Elf_Internal_Sym * psym;
14675
14676 psym = & dynamic_symbols[iconf[cnt]];
14677 print_vma (psym->st_value, FULL_HEX);
14678 putchar (' ');
14679 if (VALID_DYNAMIC_NAME (psym->st_name))
14680 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
14681 else
14682 printf (_("<corrupt: %14ld>"), psym->st_name);
14683 }
31104126 14684 putchar ('\n');
252b5132
RH
14685 }
14686
252b5132
RH
14687 free (iconf);
14688 }
14689
ccb4c951
RS
14690 if (pltgot != 0 && local_gotno != 0)
14691 {
91d6fa6a 14692 bfd_vma ent, local_end, global_end;
bbeee7ea 14693 size_t i, offset;
2cf0635d 14694 unsigned char * data;
82b1b41b 14695 unsigned char * data_end;
bbeee7ea 14696 int addr_size;
ccb4c951 14697
91d6fa6a 14698 ent = pltgot;
ccb4c951
RS
14699 addr_size = (is_32bit_elf ? 4 : 8);
14700 local_end = pltgot + local_gotno * addr_size;
ccb4c951 14701
74e1a04b
NC
14702 /* PR binutils/17533 file: 012-111227-0.004 */
14703 if (symtabno < gotsym)
14704 {
14705 error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
82b1b41b 14706 (unsigned long) gotsym, (unsigned long) symtabno);
74e1a04b
NC
14707 return 0;
14708 }
82b1b41b 14709
74e1a04b 14710 global_end = local_end + (symtabno - gotsym) * addr_size;
82b1b41b
NC
14711 /* PR 17531: file: 54c91a34. */
14712 if (global_end < local_end)
14713 {
14714 error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
14715 return 0;
14716 }
948f632f 14717
ccb4c951 14718 offset = offset_from_vma (file, pltgot, global_end - pltgot);
3f5e193b 14719 data = (unsigned char *) get_data (NULL, file, offset,
9cf03b7e
NC
14720 global_end - pltgot, 1,
14721 _("Global Offset Table data"));
59245841
NC
14722 if (data == NULL)
14723 return 0;
82b1b41b 14724 data_end = data + (global_end - pltgot);
59245841 14725
ccb4c951
RS
14726 printf (_("\nPrimary GOT:\n"));
14727 printf (_(" Canonical gp value: "));
14728 print_vma (pltgot + 0x7ff0, LONG_HEX);
14729 printf ("\n\n");
14730
14731 printf (_(" Reserved entries:\n"));
14732 printf (_(" %*s %10s %*s Purpose\n"),
2b692964
NC
14733 addr_size * 2, _("Address"), _("Access"),
14734 addr_size * 2, _("Initial"));
82b1b41b 14735 ent = print_mips_got_entry (data, pltgot, ent, data_end);
2b692964 14736 printf (_(" Lazy resolver\n"));
82b1b41b
NC
14737 if (ent == (bfd_vma) -1)
14738 goto got_print_fail;
ccb4c951 14739 if (data
91d6fa6a 14740 && (byte_get (data + ent - pltgot, addr_size)
ccb4c951
RS
14741 >> (addr_size * 8 - 1)) != 0)
14742 {
82b1b41b 14743 ent = print_mips_got_entry (data, pltgot, ent, data_end);
2b692964 14744 printf (_(" Module pointer (GNU extension)\n"));
82b1b41b
NC
14745 if (ent == (bfd_vma) -1)
14746 goto got_print_fail;
ccb4c951
RS
14747 }
14748 printf ("\n");
14749
91d6fa6a 14750 if (ent < local_end)
ccb4c951
RS
14751 {
14752 printf (_(" Local entries:\n"));
cc5914eb 14753 printf (" %*s %10s %*s\n",
2b692964
NC
14754 addr_size * 2, _("Address"), _("Access"),
14755 addr_size * 2, _("Initial"));
91d6fa6a 14756 while (ent < local_end)
ccb4c951 14757 {
82b1b41b 14758 ent = print_mips_got_entry (data, pltgot, ent, data_end);
ccb4c951 14759 printf ("\n");
82b1b41b
NC
14760 if (ent == (bfd_vma) -1)
14761 goto got_print_fail;
ccb4c951
RS
14762 }
14763 printf ("\n");
14764 }
14765
14766 if (gotsym < symtabno)
14767 {
14768 int sym_width;
14769
14770 printf (_(" Global entries:\n"));
cc5914eb 14771 printf (" %*s %10s %*s %*s %-7s %3s %s\n",
9cf03b7e
NC
14772 addr_size * 2, _("Address"),
14773 _("Access"),
2b692964 14774 addr_size * 2, _("Initial"),
9cf03b7e
NC
14775 addr_size * 2, _("Sym.Val."),
14776 _("Type"),
14777 /* Note for translators: "Ndx" = abbreviated form of "Index". */
14778 _("Ndx"), _("Name"));
0b4362b0 14779
ccb4c951 14780 sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
e0a31db1 14781
ccb4c951
RS
14782 for (i = gotsym; i < symtabno; i++)
14783 {
82b1b41b 14784 ent = print_mips_got_entry (data, pltgot, ent, data_end);
ccb4c951 14785 printf (" ");
e0a31db1
NC
14786
14787 if (dynamic_symbols == NULL)
14788 printf (_("<no dynamic symbols>"));
14789 else if (i < num_dynamic_syms)
14790 {
14791 Elf_Internal_Sym * psym = dynamic_symbols + i;
14792
14793 print_vma (psym->st_value, LONG_HEX);
14794 printf (" %-7s %3s ",
14795 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
14796 get_symbol_index_type (psym->st_shndx));
14797
14798 if (VALID_DYNAMIC_NAME (psym->st_name))
14799 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
14800 else
14801 printf (_("<corrupt: %14ld>"), psym->st_name);
14802 }
ccb4c951 14803 else
7fc5ac57
JBG
14804 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
14805 (unsigned long) i);
e0a31db1 14806
ccb4c951 14807 printf ("\n");
82b1b41b
NC
14808 if (ent == (bfd_vma) -1)
14809 break;
ccb4c951
RS
14810 }
14811 printf ("\n");
14812 }
14813
82b1b41b 14814 got_print_fail:
ccb4c951
RS
14815 if (data)
14816 free (data);
14817 }
14818
861fb55a
DJ
14819 if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
14820 {
91d6fa6a 14821 bfd_vma ent, end;
861fb55a
DJ
14822 size_t offset, rel_offset;
14823 unsigned long count, i;
2cf0635d 14824 unsigned char * data;
861fb55a 14825 int addr_size, sym_width;
2cf0635d 14826 Elf_Internal_Rela * rels;
861fb55a
DJ
14827
14828 rel_offset = offset_from_vma (file, jmprel, pltrelsz);
14829 if (pltrel == DT_RELA)
14830 {
14831 if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
14832 return 0;
14833 }
14834 else
14835 {
14836 if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
14837 return 0;
14838 }
14839
91d6fa6a 14840 ent = mips_pltgot;
861fb55a
DJ
14841 addr_size = (is_32bit_elf ? 4 : 8);
14842 end = mips_pltgot + (2 + count) * addr_size;
14843
14844 offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
3f5e193b 14845 data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
9cf03b7e 14846 1, _("Procedure Linkage Table data"));
59245841
NC
14847 if (data == NULL)
14848 return 0;
14849
9cf03b7e 14850 printf ("\nPLT GOT:\n\n");
861fb55a
DJ
14851 printf (_(" Reserved entries:\n"));
14852 printf (_(" %*s %*s Purpose\n"),
2b692964 14853 addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
91d6fa6a 14854 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
2b692964 14855 printf (_(" PLT lazy resolver\n"));
91d6fa6a 14856 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
2b692964 14857 printf (_(" Module pointer\n"));
861fb55a
DJ
14858 printf ("\n");
14859
14860 printf (_(" Entries:\n"));
cc5914eb 14861 printf (" %*s %*s %*s %-7s %3s %s\n",
2b692964
NC
14862 addr_size * 2, _("Address"),
14863 addr_size * 2, _("Initial"),
14864 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
861fb55a
DJ
14865 sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
14866 for (i = 0; i < count; i++)
14867 {
df97ab2a 14868 unsigned long idx = get_reloc_symindex (rels[i].r_info);
861fb55a 14869
91d6fa6a 14870 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
861fb55a 14871 printf (" ");
e0a31db1 14872
df97ab2a
MF
14873 if (idx >= num_dynamic_syms)
14874 printf (_("<corrupt symbol index: %lu>"), idx);
861fb55a 14875 else
e0a31db1 14876 {
df97ab2a 14877 Elf_Internal_Sym * psym = dynamic_symbols + idx;
e0a31db1
NC
14878
14879 print_vma (psym->st_value, LONG_HEX);
14880 printf (" %-7s %3s ",
14881 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
14882 get_symbol_index_type (psym->st_shndx));
14883 if (VALID_DYNAMIC_NAME (psym->st_name))
14884 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
14885 else
14886 printf (_("<corrupt: %14ld>"), psym->st_name);
14887 }
861fb55a
DJ
14888 printf ("\n");
14889 }
14890 printf ("\n");
14891
14892 if (data)
14893 free (data);
14894 free (rels);
14895 }
14896
252b5132
RH
14897 return 1;
14898}
14899
35c08157
KLC
14900static int
14901process_nds32_specific (FILE * file)
14902{
14903 Elf_Internal_Shdr *sect = NULL;
14904
14905 sect = find_section (".nds32_e_flags");
14906 if (sect != NULL)
14907 {
14908 unsigned int *flag;
14909
14910 printf ("\nNDS32 elf flags section:\n");
14911 flag = get_data (NULL, file, sect->sh_offset, 1,
14912 sect->sh_size, _("NDS32 elf flags section"));
14913
14914 switch ((*flag) & 0x3)
14915 {
14916 case 0:
14917 printf ("(VEC_SIZE):\tNo entry.\n");
14918 break;
14919 case 1:
14920 printf ("(VEC_SIZE):\t4 bytes\n");
14921 break;
14922 case 2:
14923 printf ("(VEC_SIZE):\t16 bytes\n");
14924 break;
14925 case 3:
14926 printf ("(VEC_SIZE):\treserved\n");
14927 break;
14928 }
14929 }
14930
14931 return TRUE;
14932}
14933
047b2264 14934static int
2cf0635d 14935process_gnu_liblist (FILE * file)
047b2264 14936{
2cf0635d
NC
14937 Elf_Internal_Shdr * section;
14938 Elf_Internal_Shdr * string_sec;
14939 Elf32_External_Lib * elib;
14940 char * strtab;
c256ffe7 14941 size_t strtab_size;
047b2264
JJ
14942 size_t cnt;
14943 unsigned i;
14944
14945 if (! do_arch)
14946 return 0;
14947
14948 for (i = 0, section = section_headers;
14949 i < elf_header.e_shnum;
b34976b6 14950 i++, section++)
047b2264
JJ
14951 {
14952 switch (section->sh_type)
14953 {
14954 case SHT_GNU_LIBLIST:
4fbb74a6 14955 if (section->sh_link >= elf_header.e_shnum)
c256ffe7
JJ
14956 break;
14957
3f5e193b
NC
14958 elib = (Elf32_External_Lib *)
14959 get_data (NULL, file, section->sh_offset, 1, section->sh_size,
9cf03b7e 14960 _("liblist section data"));
047b2264
JJ
14961
14962 if (elib == NULL)
14963 break;
4fbb74a6 14964 string_sec = section_headers + section->sh_link;
047b2264 14965
3f5e193b
NC
14966 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
14967 string_sec->sh_size,
14968 _("liblist string table"));
047b2264
JJ
14969 if (strtab == NULL
14970 || section->sh_entsize != sizeof (Elf32_External_Lib))
14971 {
14972 free (elib);
2842702f 14973 free (strtab);
047b2264
JJ
14974 break;
14975 }
59245841 14976 strtab_size = string_sec->sh_size;
047b2264
JJ
14977
14978 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
74e1a04b 14979 printable_section_name (section),
0af1713e 14980 (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
047b2264 14981
2b692964 14982 puts (_(" Library Time Stamp Checksum Version Flags"));
047b2264
JJ
14983
14984 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
14985 ++cnt)
14986 {
14987 Elf32_Lib liblist;
91d6fa6a 14988 time_t atime;
047b2264 14989 char timebuf[20];
2cf0635d 14990 struct tm * tmp;
047b2264
JJ
14991
14992 liblist.l_name = BYTE_GET (elib[cnt].l_name);
91d6fa6a 14993 atime = BYTE_GET (elib[cnt].l_time_stamp);
047b2264
JJ
14994 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
14995 liblist.l_version = BYTE_GET (elib[cnt].l_version);
14996 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
14997
91d6fa6a 14998 tmp = gmtime (&atime);
e9e44622
JJ
14999 snprintf (timebuf, sizeof (timebuf),
15000 "%04u-%02u-%02uT%02u:%02u:%02u",
15001 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
15002 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
047b2264
JJ
15003
15004 printf ("%3lu: ", (unsigned long) cnt);
15005 if (do_wide)
c256ffe7 15006 printf ("%-20s", liblist.l_name < strtab_size
2b692964 15007 ? strtab + liblist.l_name : _("<corrupt>"));
047b2264 15008 else
c256ffe7 15009 printf ("%-20.20s", liblist.l_name < strtab_size
2b692964 15010 ? strtab + liblist.l_name : _("<corrupt>"));
047b2264
JJ
15011 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
15012 liblist.l_version, liblist.l_flags);
15013 }
15014
15015 free (elib);
2842702f 15016 free (strtab);
047b2264
JJ
15017 }
15018 }
15019
15020 return 1;
15021}
15022
9437c45b 15023static const char *
d3ba0551 15024get_note_type (unsigned e_type)
779fe533
NC
15025{
15026 static char buff[64];
103f02d3 15027
1ec5cd37
NC
15028 if (elf_header.e_type == ET_CORE)
15029 switch (e_type)
15030 {
57346661 15031 case NT_AUXV:
1ec5cd37 15032 return _("NT_AUXV (auxiliary vector)");
57346661 15033 case NT_PRSTATUS:
1ec5cd37 15034 return _("NT_PRSTATUS (prstatus structure)");
57346661 15035 case NT_FPREGSET:
1ec5cd37 15036 return _("NT_FPREGSET (floating point registers)");
57346661 15037 case NT_PRPSINFO:
1ec5cd37 15038 return _("NT_PRPSINFO (prpsinfo structure)");
57346661 15039 case NT_TASKSTRUCT:
1ec5cd37 15040 return _("NT_TASKSTRUCT (task structure)");
57346661 15041 case NT_PRXFPREG:
1ec5cd37 15042 return _("NT_PRXFPREG (user_xfpregs structure)");
e1e95dec
AM
15043 case NT_PPC_VMX:
15044 return _("NT_PPC_VMX (ppc Altivec registers)");
89eeb0bc
LM
15045 case NT_PPC_VSX:
15046 return _("NT_PPC_VSX (ppc VSX registers)");
ff826ef3
TT
15047 case NT_386_TLS:
15048 return _("NT_386_TLS (x86 TLS information)");
15049 case NT_386_IOPERM:
15050 return _("NT_386_IOPERM (x86 I/O permissions)");
4339cae0
L
15051 case NT_X86_XSTATE:
15052 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
0675e188
UW
15053 case NT_S390_HIGH_GPRS:
15054 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
d7eeb400
MS
15055 case NT_S390_TIMER:
15056 return _("NT_S390_TIMER (s390 timer register)");
15057 case NT_S390_TODCMP:
15058 return _("NT_S390_TODCMP (s390 TOD comparator register)");
15059 case NT_S390_TODPREG:
15060 return _("NT_S390_TODPREG (s390 TOD programmable register)");
15061 case NT_S390_CTRS:
15062 return _("NT_S390_CTRS (s390 control registers)");
15063 case NT_S390_PREFIX:
15064 return _("NT_S390_PREFIX (s390 prefix register)");
a367d729
AK
15065 case NT_S390_LAST_BREAK:
15066 return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
15067 case NT_S390_SYSTEM_CALL:
15068 return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
abb3f6cc
NC
15069 case NT_S390_TDB:
15070 return _("NT_S390_TDB (s390 transaction diagnostic block)");
4ef9f41a
AA
15071 case NT_S390_VXRS_LOW:
15072 return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
15073 case NT_S390_VXRS_HIGH:
15074 return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
faa9a424
UW
15075 case NT_ARM_VFP:
15076 return _("NT_ARM_VFP (arm VFP registers)");
652451f8
YZ
15077 case NT_ARM_TLS:
15078 return _("NT_ARM_TLS (AArch TLS registers)");
15079 case NT_ARM_HW_BREAK:
15080 return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
15081 case NT_ARM_HW_WATCH:
15082 return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
57346661 15083 case NT_PSTATUS:
1ec5cd37 15084 return _("NT_PSTATUS (pstatus structure)");
57346661 15085 case NT_FPREGS:
1ec5cd37 15086 return _("NT_FPREGS (floating point registers)");
57346661 15087 case NT_PSINFO:
1ec5cd37 15088 return _("NT_PSINFO (psinfo structure)");
57346661 15089 case NT_LWPSTATUS:
1ec5cd37 15090 return _("NT_LWPSTATUS (lwpstatus_t structure)");
57346661 15091 case NT_LWPSINFO:
1ec5cd37 15092 return _("NT_LWPSINFO (lwpsinfo_t structure)");
57346661 15093 case NT_WIN32PSTATUS:
1ec5cd37 15094 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
9ece1fa9
TT
15095 case NT_SIGINFO:
15096 return _("NT_SIGINFO (siginfo_t data)");
15097 case NT_FILE:
15098 return _("NT_FILE (mapped files)");
1ec5cd37
NC
15099 default:
15100 break;
15101 }
15102 else
15103 switch (e_type)
15104 {
15105 case NT_VERSION:
15106 return _("NT_VERSION (version)");
15107 case NT_ARCH:
15108 return _("NT_ARCH (architecture)");
15109 default:
15110 break;
15111 }
15112
e9e44622 15113 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
1ec5cd37 15114 return buff;
779fe533
NC
15115}
15116
9ece1fa9
TT
15117static int
15118print_core_note (Elf_Internal_Note *pnote)
15119{
15120 unsigned int addr_size = is_32bit_elf ? 4 : 8;
15121 bfd_vma count, page_size;
15122 unsigned char *descdata, *filenames, *descend;
15123
15124 if (pnote->type != NT_FILE)
15125 return 1;
15126
15127#ifndef BFD64
15128 if (!is_32bit_elf)
15129 {
15130 printf (_(" Cannot decode 64-bit note in 32-bit build\n"));
15131 /* Still "successful". */
15132 return 1;
15133 }
15134#endif
15135
15136 if (pnote->descsz < 2 * addr_size)
15137 {
15138 printf (_(" Malformed note - too short for header\n"));
15139 return 0;
15140 }
15141
15142 descdata = (unsigned char *) pnote->descdata;
15143 descend = descdata + pnote->descsz;
15144
15145 if (descdata[pnote->descsz - 1] != '\0')
15146 {
15147 printf (_(" Malformed note - does not end with \\0\n"));
15148 return 0;
15149 }
15150
15151 count = byte_get (descdata, addr_size);
15152 descdata += addr_size;
15153
15154 page_size = byte_get (descdata, addr_size);
15155 descdata += addr_size;
15156
15157 if (pnote->descsz < 2 * addr_size + count * 3 * addr_size)
15158 {
15159 printf (_(" Malformed note - too short for supplied file count\n"));
15160 return 0;
15161 }
15162
15163 printf (_(" Page size: "));
15164 print_vma (page_size, DEC);
15165 printf ("\n");
15166
15167 printf (_(" %*s%*s%*s\n"),
15168 (int) (2 + 2 * addr_size), _("Start"),
15169 (int) (4 + 2 * addr_size), _("End"),
15170 (int) (4 + 2 * addr_size), _("Page Offset"));
15171 filenames = descdata + count * 3 * addr_size;
595712bb 15172 while (count-- > 0)
9ece1fa9
TT
15173 {
15174 bfd_vma start, end, file_ofs;
15175
15176 if (filenames == descend)
15177 {
15178 printf (_(" Malformed note - filenames end too early\n"));
15179 return 0;
15180 }
15181
15182 start = byte_get (descdata, addr_size);
15183 descdata += addr_size;
15184 end = byte_get (descdata, addr_size);
15185 descdata += addr_size;
15186 file_ofs = byte_get (descdata, addr_size);
15187 descdata += addr_size;
15188
15189 printf (" ");
15190 print_vma (start, FULL_HEX);
15191 printf (" ");
15192 print_vma (end, FULL_HEX);
15193 printf (" ");
15194 print_vma (file_ofs, FULL_HEX);
15195 printf ("\n %s\n", filenames);
15196
15197 filenames += 1 + strlen ((char *) filenames);
15198 }
15199
15200 return 1;
15201}
15202
1118d252
RM
15203static const char *
15204get_gnu_elf_note_type (unsigned e_type)
15205{
15206 static char buff[64];
15207
15208 switch (e_type)
15209 {
15210 case NT_GNU_ABI_TAG:
15211 return _("NT_GNU_ABI_TAG (ABI version tag)");
15212 case NT_GNU_HWCAP:
15213 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
15214 case NT_GNU_BUILD_ID:
15215 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
0297aed6
DM
15216 case NT_GNU_GOLD_VERSION:
15217 return _("NT_GNU_GOLD_VERSION (gold version)");
1118d252
RM
15218 default:
15219 break;
15220 }
15221
15222 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15223 return buff;
15224}
15225
664f90a3
TT
15226static int
15227print_gnu_note (Elf_Internal_Note *pnote)
15228{
15229 switch (pnote->type)
15230 {
15231 case NT_GNU_BUILD_ID:
15232 {
15233 unsigned long i;
15234
15235 printf (_(" Build ID: "));
15236 for (i = 0; i < pnote->descsz; ++i)
15237 printf ("%02x", pnote->descdata[i] & 0xff);
9cf03b7e 15238 printf ("\n");
664f90a3
TT
15239 }
15240 break;
15241
15242 case NT_GNU_ABI_TAG:
15243 {
15244 unsigned long os, major, minor, subminor;
15245 const char *osname;
15246
3102e897
NC
15247 /* PR 17531: file: 030-599401-0.004. */
15248 if (pnote->descsz < 16)
15249 {
15250 printf (_(" <corrupt GNU_ABI_TAG>\n"));
15251 break;
15252 }
15253
664f90a3
TT
15254 os = byte_get ((unsigned char *) pnote->descdata, 4);
15255 major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
15256 minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
15257 subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
15258
15259 switch (os)
15260 {
15261 case GNU_ABI_TAG_LINUX:
15262 osname = "Linux";
15263 break;
15264 case GNU_ABI_TAG_HURD:
15265 osname = "Hurd";
15266 break;
15267 case GNU_ABI_TAG_SOLARIS:
15268 osname = "Solaris";
15269 break;
15270 case GNU_ABI_TAG_FREEBSD:
15271 osname = "FreeBSD";
15272 break;
15273 case GNU_ABI_TAG_NETBSD:
15274 osname = "NetBSD";
15275 break;
14ae95f2
RM
15276 case GNU_ABI_TAG_SYLLABLE:
15277 osname = "Syllable";
15278 break;
15279 case GNU_ABI_TAG_NACL:
15280 osname = "NaCl";
15281 break;
664f90a3
TT
15282 default:
15283 osname = "Unknown";
15284 break;
15285 }
15286
15287 printf (_(" OS: %s, ABI: %ld.%ld.%ld\n"), osname,
15288 major, minor, subminor);
15289 }
15290 break;
926c5385
CC
15291
15292 case NT_GNU_GOLD_VERSION:
15293 {
15294 unsigned long i;
15295
15296 printf (_(" Version: "));
15297 for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
15298 printf ("%c", pnote->descdata[i]);
15299 printf ("\n");
15300 }
15301 break;
664f90a3
TT
15302 }
15303
15304 return 1;
15305}
15306
685080f2
NC
15307static const char *
15308get_v850_elf_note_type (enum v850_notes n_type)
15309{
15310 static char buff[64];
15311
15312 switch (n_type)
15313 {
15314 case V850_NOTE_ALIGNMENT: return _("Alignment of 8-byte objects");
15315 case V850_NOTE_DATA_SIZE: return _("Sizeof double and long double");
15316 case V850_NOTE_FPU_INFO: return _("Type of FPU support needed");
15317 case V850_NOTE_SIMD_INFO: return _("Use of SIMD instructions");
15318 case V850_NOTE_CACHE_INFO: return _("Use of cache");
15319 case V850_NOTE_MMU_INFO: return _("Use of MMU");
15320 default:
15321 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
15322 return buff;
15323 }
15324}
15325
15326static int
15327print_v850_note (Elf_Internal_Note * pnote)
15328{
15329 unsigned int val;
15330
15331 if (pnote->descsz != 4)
15332 return 0;
15333 val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
15334
15335 if (val == 0)
15336 {
15337 printf (_("not set\n"));
15338 return 1;
15339 }
15340
15341 switch (pnote->type)
15342 {
15343 case V850_NOTE_ALIGNMENT:
15344 switch (val)
15345 {
15346 case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return 1;
15347 case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return 1;
15348 }
15349 break;
14ae95f2 15350
685080f2
NC
15351 case V850_NOTE_DATA_SIZE:
15352 switch (val)
15353 {
15354 case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return 1;
15355 case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return 1;
15356 }
15357 break;
14ae95f2 15358
685080f2
NC
15359 case V850_NOTE_FPU_INFO:
15360 switch (val)
15361 {
15362 case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return 1;
15363 case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return 1;
15364 }
15365 break;
14ae95f2 15366
685080f2
NC
15367 case V850_NOTE_MMU_INFO:
15368 case V850_NOTE_CACHE_INFO:
15369 case V850_NOTE_SIMD_INFO:
15370 if (val == EF_RH850_SIMD)
15371 {
15372 printf (_("yes\n"));
15373 return 1;
15374 }
15375 break;
15376
15377 default:
15378 /* An 'unknown note type' message will already have been displayed. */
15379 break;
15380 }
15381
15382 printf (_("unknown value: %x\n"), val);
15383 return 0;
15384}
15385
c6056a74
SF
15386static int
15387process_netbsd_elf_note (Elf_Internal_Note * pnote)
15388{
15389 unsigned int version;
15390
15391 switch (pnote->type)
15392 {
15393 case NT_NETBSD_IDENT:
15394 version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
15395 if ((version / 10000) % 100)
15396 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
15397 version, version / 100000000, (version / 1000000) % 100,
15398 (version / 10000) % 100 > 26 ? "Z" : "",
15399 'A' + (version / 10000) % 26);
15400 else
15401 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
15402 version, version / 100000000, (version / 1000000) % 100,
15403 (version / 100) % 100);
15404 return 1;
15405
15406 case NT_NETBSD_MARCH:
15407 printf (" NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
15408 pnote->descdata);
15409 return 1;
15410
15411 default:
15412 break;
15413 }
15414
15415 printf (" NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
15416 pnote->type);
15417 return 1;
15418}
15419
f4ddf30f
JB
15420static const char *
15421get_freebsd_elfcore_note_type (unsigned e_type)
15422{
f4ddf30f
JB
15423 switch (e_type)
15424 {
15425 case NT_FREEBSD_THRMISC:
15426 return _("NT_THRMISC (thrmisc structure)");
15427 case NT_FREEBSD_PROCSTAT_PROC:
15428 return _("NT_PROCSTAT_PROC (proc data)");
15429 case NT_FREEBSD_PROCSTAT_FILES:
15430 return _("NT_PROCSTAT_FILES (files data)");
15431 case NT_FREEBSD_PROCSTAT_VMMAP:
15432 return _("NT_PROCSTAT_VMMAP (vmmap data)");
15433 case NT_FREEBSD_PROCSTAT_GROUPS:
15434 return _("NT_PROCSTAT_GROUPS (groups data)");
15435 case NT_FREEBSD_PROCSTAT_UMASK:
15436 return _("NT_PROCSTAT_UMASK (umask data)");
15437 case NT_FREEBSD_PROCSTAT_RLIMIT:
15438 return _("NT_PROCSTAT_RLIMIT (rlimit data)");
15439 case NT_FREEBSD_PROCSTAT_OSREL:
15440 return _("NT_PROCSTAT_OSREL (osreldate data)");
15441 case NT_FREEBSD_PROCSTAT_PSSTRINGS:
15442 return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
15443 case NT_FREEBSD_PROCSTAT_AUXV:
15444 return _("NT_PROCSTAT_AUXV (auxv data)");
15445 }
15446 return get_note_type (e_type);
15447}
15448
9437c45b 15449static const char *
d3ba0551 15450get_netbsd_elfcore_note_type (unsigned e_type)
9437c45b
JT
15451{
15452 static char buff[64];
15453
b4db1224 15454 if (e_type == NT_NETBSDCORE_PROCINFO)
9437c45b
JT
15455 {
15456 /* NetBSD core "procinfo" structure. */
15457 return _("NetBSD procinfo structure");
15458 }
15459
15460 /* As of Jan 2002 there are no other machine-independent notes
15461 defined for NetBSD core files. If the note type is less
15462 than the start of the machine-dependent note types, we don't
15463 understand it. */
15464
b4db1224 15465 if (e_type < NT_NETBSDCORE_FIRSTMACH)
9437c45b 15466 {
e9e44622 15467 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
9437c45b
JT
15468 return buff;
15469 }
15470
15471 switch (elf_header.e_machine)
15472 {
15473 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
15474 and PT_GETFPREGS == mach+2. */
15475
15476 case EM_OLD_ALPHA:
15477 case EM_ALPHA:
15478 case EM_SPARC:
15479 case EM_SPARC32PLUS:
15480 case EM_SPARCV9:
15481 switch (e_type)
15482 {
2b692964 15483 case NT_NETBSDCORE_FIRSTMACH + 0:
b4db1224 15484 return _("PT_GETREGS (reg structure)");
2b692964 15485 case NT_NETBSDCORE_FIRSTMACH + 2:
b4db1224 15486 return _("PT_GETFPREGS (fpreg structure)");
9437c45b
JT
15487 default:
15488 break;
15489 }
15490 break;
15491
15492 /* On all other arch's, PT_GETREGS == mach+1 and
15493 PT_GETFPREGS == mach+3. */
15494 default:
15495 switch (e_type)
15496 {
2b692964 15497 case NT_NETBSDCORE_FIRSTMACH + 1:
b4db1224 15498 return _("PT_GETREGS (reg structure)");
2b692964 15499 case NT_NETBSDCORE_FIRSTMACH + 3:
b4db1224 15500 return _("PT_GETFPREGS (fpreg structure)");
9437c45b
JT
15501 default:
15502 break;
15503 }
15504 }
15505
9cf03b7e 15506 snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
e9e44622 15507 e_type - NT_NETBSDCORE_FIRSTMACH);
9437c45b
JT
15508 return buff;
15509}
15510
70616151
TT
15511static const char *
15512get_stapsdt_note_type (unsigned e_type)
15513{
15514 static char buff[64];
15515
15516 switch (e_type)
15517 {
15518 case NT_STAPSDT:
15519 return _("NT_STAPSDT (SystemTap probe descriptors)");
15520
15521 default:
15522 break;
15523 }
15524
15525 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15526 return buff;
15527}
15528
c6a9fc58
TT
15529static int
15530print_stapsdt_note (Elf_Internal_Note *pnote)
15531{
15532 int addr_size = is_32bit_elf ? 4 : 8;
15533 char *data = pnote->descdata;
15534 char *data_end = pnote->descdata + pnote->descsz;
15535 bfd_vma pc, base_addr, semaphore;
15536 char *provider, *probe, *arg_fmt;
15537
15538 pc = byte_get ((unsigned char *) data, addr_size);
15539 data += addr_size;
15540 base_addr = byte_get ((unsigned char *) data, addr_size);
15541 data += addr_size;
15542 semaphore = byte_get ((unsigned char *) data, addr_size);
15543 data += addr_size;
15544
15545 provider = data;
15546 data += strlen (data) + 1;
15547 probe = data;
15548 data += strlen (data) + 1;
15549 arg_fmt = data;
15550 data += strlen (data) + 1;
15551
15552 printf (_(" Provider: %s\n"), provider);
15553 printf (_(" Name: %s\n"), probe);
15554 printf (_(" Location: "));
15555 print_vma (pc, FULL_HEX);
15556 printf (_(", Base: "));
15557 print_vma (base_addr, FULL_HEX);
15558 printf (_(", Semaphore: "));
15559 print_vma (semaphore, FULL_HEX);
9cf03b7e 15560 printf ("\n");
c6a9fc58
TT
15561 printf (_(" Arguments: %s\n"), arg_fmt);
15562
15563 return data == data_end;
15564}
15565
00e98fc7
TG
15566static const char *
15567get_ia64_vms_note_type (unsigned e_type)
15568{
15569 static char buff[64];
15570
15571 switch (e_type)
15572 {
15573 case NT_VMS_MHD:
15574 return _("NT_VMS_MHD (module header)");
15575 case NT_VMS_LNM:
15576 return _("NT_VMS_LNM (language name)");
15577 case NT_VMS_SRC:
15578 return _("NT_VMS_SRC (source files)");
15579 case NT_VMS_TITLE:
9cf03b7e 15580 return "NT_VMS_TITLE";
00e98fc7
TG
15581 case NT_VMS_EIDC:
15582 return _("NT_VMS_EIDC (consistency check)");
15583 case NT_VMS_FPMODE:
15584 return _("NT_VMS_FPMODE (FP mode)");
15585 case NT_VMS_LINKTIME:
9cf03b7e 15586 return "NT_VMS_LINKTIME";
00e98fc7
TG
15587 case NT_VMS_IMGNAM:
15588 return _("NT_VMS_IMGNAM (image name)");
15589 case NT_VMS_IMGID:
15590 return _("NT_VMS_IMGID (image id)");
15591 case NT_VMS_LINKID:
15592 return _("NT_VMS_LINKID (link id)");
15593 case NT_VMS_IMGBID:
15594 return _("NT_VMS_IMGBID (build id)");
15595 case NT_VMS_GSTNAM:
15596 return _("NT_VMS_GSTNAM (sym table name)");
15597 case NT_VMS_ORIG_DYN:
9cf03b7e 15598 return "NT_VMS_ORIG_DYN";
00e98fc7 15599 case NT_VMS_PATCHTIME:
9cf03b7e 15600 return "NT_VMS_PATCHTIME";
00e98fc7
TG
15601 default:
15602 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15603 return buff;
15604 }
15605}
15606
15607static int
15608print_ia64_vms_note (Elf_Internal_Note * pnote)
15609{
15610 switch (pnote->type)
15611 {
15612 case NT_VMS_MHD:
15613 if (pnote->descsz > 36)
15614 {
15615 size_t l = strlen (pnote->descdata + 34);
15616 printf (_(" Creation date : %.17s\n"), pnote->descdata);
15617 printf (_(" Last patch date: %.17s\n"), pnote->descdata + 17);
15618 printf (_(" Module name : %s\n"), pnote->descdata + 34);
15619 printf (_(" Module version : %s\n"), pnote->descdata + 34 + l + 1);
15620 }
15621 else
15622 printf (_(" Invalid size\n"));
15623 break;
15624 case NT_VMS_LNM:
15625 printf (_(" Language: %s\n"), pnote->descdata);
15626 break;
15627#ifdef BFD64
15628 case NT_VMS_FPMODE:
9cf03b7e 15629 printf (_(" Floating Point mode: "));
4a5cb34f 15630 printf ("0x%016" BFD_VMA_FMT "x\n",
948f632f 15631 (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
00e98fc7
TG
15632 break;
15633 case NT_VMS_LINKTIME:
15634 printf (_(" Link time: "));
15635 print_vms_time
15636 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
15637 printf ("\n");
15638 break;
15639 case NT_VMS_PATCHTIME:
15640 printf (_(" Patch time: "));
15641 print_vms_time
15642 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
15643 printf ("\n");
15644 break;
15645 case NT_VMS_ORIG_DYN:
15646 printf (_(" Major id: %u, minor id: %u\n"),
15647 (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
15648 (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
9cf03b7e 15649 printf (_(" Last modified : "));
00e98fc7
TG
15650 print_vms_time
15651 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
9cf03b7e 15652 printf (_("\n Link flags : "));
4a5cb34f 15653 printf ("0x%016" BFD_VMA_FMT "x\n",
948f632f 15654 (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
00e98fc7 15655 printf (_(" Header flags: 0x%08x\n"),
948f632f 15656 (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
00e98fc7
TG
15657 printf (_(" Image id : %s\n"), pnote->descdata + 32);
15658 break;
15659#endif
15660 case NT_VMS_IMGNAM:
15661 printf (_(" Image name: %s\n"), pnote->descdata);
15662 break;
15663 case NT_VMS_GSTNAM:
15664 printf (_(" Global symbol table name: %s\n"), pnote->descdata);
15665 break;
15666 case NT_VMS_IMGID:
15667 printf (_(" Image id: %s\n"), pnote->descdata);
15668 break;
15669 case NT_VMS_LINKID:
15670 printf (_(" Linker id: %s\n"), pnote->descdata);
15671 break;
15672 default:
15673 break;
15674 }
15675 return 1;
15676}
15677
6d118b09
NC
15678/* Note that by the ELF standard, the name field is already null byte
15679 terminated, and namesz includes the terminating null byte.
15680 I.E. the value of namesz for the name "FSF" is 4.
15681
e3c8793a 15682 If the value of namesz is zero, there is no name present. */
779fe533 15683static int
2cf0635d 15684process_note (Elf_Internal_Note * pnote)
779fe533 15685{
2cf0635d
NC
15686 const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
15687 const char * nt;
9437c45b
JT
15688
15689 if (pnote->namesz == 0)
1ec5cd37
NC
15690 /* If there is no note name, then use the default set of
15691 note type strings. */
15692 nt = get_note_type (pnote->type);
15693
1118d252
RM
15694 else if (const_strneq (pnote->namedata, "GNU"))
15695 /* GNU-specific object file notes. */
15696 nt = get_gnu_elf_note_type (pnote->type);
f4ddf30f
JB
15697
15698 else if (const_strneq (pnote->namedata, "FreeBSD"))
15699 /* FreeBSD-specific core file notes. */
15700 nt = get_freebsd_elfcore_note_type (pnote->type);
1118d252 15701
0112cd26 15702 else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
1ec5cd37
NC
15703 /* NetBSD-specific core file notes. */
15704 nt = get_netbsd_elfcore_note_type (pnote->type);
15705
c6056a74
SF
15706 else if (const_strneq (pnote->namedata, "NetBSD"))
15707 /* NetBSD-specific core file notes. */
15708 return process_netbsd_elf_note (pnote);
15709
b15fa79e
AM
15710 else if (strneq (pnote->namedata, "SPU/", 4))
15711 {
15712 /* SPU-specific core file notes. */
15713 nt = pnote->namedata + 4;
15714 name = "SPU";
15715 }
15716
00e98fc7
TG
15717 else if (const_strneq (pnote->namedata, "IPF/VMS"))
15718 /* VMS/ia64-specific file notes. */
15719 nt = get_ia64_vms_note_type (pnote->type);
15720
70616151
TT
15721 else if (const_strneq (pnote->namedata, "stapsdt"))
15722 nt = get_stapsdt_note_type (pnote->type);
15723
9437c45b 15724 else
1ec5cd37
NC
15725 /* Don't recognize this note name; just use the default set of
15726 note type strings. */
00e98fc7 15727 nt = get_note_type (pnote->type);
9437c45b 15728
2aee03ae 15729 printf (" %-20s 0x%08lx\t%s\n", name, pnote->descsz, nt);
00e98fc7
TG
15730
15731 if (const_strneq (pnote->namedata, "IPF/VMS"))
15732 return print_ia64_vms_note (pnote);
664f90a3
TT
15733 else if (const_strneq (pnote->namedata, "GNU"))
15734 return print_gnu_note (pnote);
c6a9fc58
TT
15735 else if (const_strneq (pnote->namedata, "stapsdt"))
15736 return print_stapsdt_note (pnote);
9ece1fa9
TT
15737 else if (const_strneq (pnote->namedata, "CORE"))
15738 return print_core_note (pnote);
00e98fc7
TG
15739 else
15740 return 1;
779fe533
NC
15741}
15742
6d118b09 15743
779fe533 15744static int
2cf0635d 15745process_corefile_note_segment (FILE * file, bfd_vma offset, bfd_vma length)
779fe533 15746{
2cf0635d
NC
15747 Elf_External_Note * pnotes;
15748 Elf_External_Note * external;
c8071705 15749 char * end;
b34976b6 15750 int res = 1;
103f02d3 15751
779fe533
NC
15752 if (length <= 0)
15753 return 0;
103f02d3 15754
3f5e193b 15755 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
15b42fb0 15756 _("notes"));
dd24e3da 15757 if (pnotes == NULL)
a6e9f9df 15758 return 0;
779fe533 15759
103f02d3 15760 external = pnotes;
103f02d3 15761
9dd3a467 15762 printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
f3485b74 15763 (unsigned long) offset, (unsigned long) length);
2aee03ae 15764 printf (_(" %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
103f02d3 15765
c8071705
NC
15766 end = (char *) pnotes + length;
15767 while ((char *) external < end)
779fe533 15768 {
b34976b6 15769 Elf_Internal_Note inote;
15b42fb0
AM
15770 size_t min_notesz;
15771 char *next;
2cf0635d 15772 char * temp = NULL;
c8071705 15773 size_t data_remaining = end - (char *) external;
6d118b09 15774
00e98fc7 15775 if (!is_ia64_vms ())
15b42fb0 15776 {
9dd3a467
NC
15777 /* PR binutils/15191
15778 Make sure that there is enough data to read. */
15b42fb0
AM
15779 min_notesz = offsetof (Elf_External_Note, name);
15780 if (data_remaining < min_notesz)
9dd3a467
NC
15781 {
15782 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
15783 (int) data_remaining);
15784 break;
15785 }
15b42fb0
AM
15786 inote.type = BYTE_GET (external->type);
15787 inote.namesz = BYTE_GET (external->namesz);
15788 inote.namedata = external->name;
15789 inote.descsz = BYTE_GET (external->descsz);
15790 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
834f871c 15791 /* PR 17531: file: 3443835e. */
c8071705 15792 if (inote.descdata < (char *) pnotes || inote.descdata > end)
834f871c
NC
15793 {
15794 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
15795 inote.descdata = inote.namedata;
15796 inote.namesz = 0;
15797 }
14ae95f2 15798
15b42fb0
AM
15799 inote.descpos = offset + (inote.descdata - (char *) pnotes);
15800 next = inote.descdata + align_power (inote.descsz, 2);
15801 }
00e98fc7 15802 else
15b42fb0
AM
15803 {
15804 Elf64_External_VMS_Note *vms_external;
00e98fc7 15805
9dd3a467
NC
15806 /* PR binutils/15191
15807 Make sure that there is enough data to read. */
15b42fb0
AM
15808 min_notesz = offsetof (Elf64_External_VMS_Note, name);
15809 if (data_remaining < min_notesz)
9dd3a467
NC
15810 {
15811 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
15812 (int) data_remaining);
15813 break;
15814 }
3e55a963 15815
15b42fb0
AM
15816 vms_external = (Elf64_External_VMS_Note *) external;
15817 inote.type = BYTE_GET (vms_external->type);
15818 inote.namesz = BYTE_GET (vms_external->namesz);
15819 inote.namedata = vms_external->name;
15820 inote.descsz = BYTE_GET (vms_external->descsz);
15821 inote.descdata = inote.namedata + align_power (inote.namesz, 3);
15822 inote.descpos = offset + (inote.descdata - (char *) pnotes);
15823 next = inote.descdata + align_power (inote.descsz, 3);
15824 }
15825
15826 if (inote.descdata < (char *) external + min_notesz
15827 || next < (char *) external + min_notesz
5d921cbd
NC
15828 /* PR binutils/17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4. */
15829 || inote.namedata + inote.namesz < inote.namedata
15830 || inote.descdata + inote.descsz < inote.descdata
15b42fb0 15831 || data_remaining < (size_t)(next - (char *) external))
3e55a963 15832 {
15b42fb0 15833 warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
0af1713e 15834 (unsigned long) ((char *) external - (char *) pnotes));
9dd3a467 15835 warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
3e55a963
NC
15836 inote.type, inote.namesz, inote.descsz);
15837 break;
15838 }
15839
15b42fb0 15840 external = (Elf_External_Note *) next;
dd24e3da 15841
6d118b09
NC
15842 /* Verify that name is null terminated. It appears that at least
15843 one version of Linux (RedHat 6.0) generates corefiles that don't
15844 comply with the ELF spec by failing to include the null byte in
15845 namesz. */
8b971f9f 15846 if (inote.namedata[inote.namesz - 1] != '\0')
6d118b09 15847 {
3f5e193b 15848 temp = (char *) malloc (inote.namesz + 1);
6d118b09
NC
15849 if (temp == NULL)
15850 {
8b73c356 15851 error (_("Out of memory allocating space for inote name\n"));
6d118b09
NC
15852 res = 0;
15853 break;
15854 }
76da6bbe 15855
6d118b09
NC
15856 strncpy (temp, inote.namedata, inote.namesz);
15857 temp[inote.namesz] = 0;
76da6bbe 15858
6d118b09
NC
15859 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
15860 inote.namedata = temp;
15861 }
15862
15863 res &= process_note (& inote);
103f02d3 15864
6d118b09
NC
15865 if (temp != NULL)
15866 {
15867 free (temp);
15868 temp = NULL;
15869 }
779fe533
NC
15870 }
15871
15872 free (pnotes);
103f02d3 15873
779fe533
NC
15874 return res;
15875}
15876
15877static int
2cf0635d 15878process_corefile_note_segments (FILE * file)
779fe533 15879{
2cf0635d 15880 Elf_Internal_Phdr * segment;
b34976b6
AM
15881 unsigned int i;
15882 int res = 1;
103f02d3 15883
d93f0186 15884 if (! get_program_headers (file))
779fe533 15885 return 0;
103f02d3 15886
779fe533
NC
15887 for (i = 0, segment = program_headers;
15888 i < elf_header.e_phnum;
b34976b6 15889 i++, segment++)
779fe533
NC
15890 {
15891 if (segment->p_type == PT_NOTE)
103f02d3 15892 res &= process_corefile_note_segment (file,
30800947
NC
15893 (bfd_vma) segment->p_offset,
15894 (bfd_vma) segment->p_filesz);
779fe533 15895 }
103f02d3 15896
779fe533
NC
15897 return res;
15898}
15899
685080f2
NC
15900static int
15901process_v850_notes (FILE * file, bfd_vma offset, bfd_vma length)
15902{
15903 Elf_External_Note * pnotes;
15904 Elf_External_Note * external;
c8071705 15905 char * end;
685080f2
NC
15906 int res = 1;
15907
15908 if (length <= 0)
15909 return 0;
15910
15911 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
15912 _("v850 notes"));
15913 if (pnotes == NULL)
15914 return 0;
15915
15916 external = pnotes;
c8071705 15917 end = (char*) pnotes + length;
685080f2
NC
15918
15919 printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
15920 (unsigned long) offset, (unsigned long) length);
15921
c8071705 15922 while ((char *) external + sizeof (Elf_External_Note) < end)
685080f2
NC
15923 {
15924 Elf_External_Note * next;
15925 Elf_Internal_Note inote;
15926
15927 inote.type = BYTE_GET (external->type);
15928 inote.namesz = BYTE_GET (external->namesz);
15929 inote.namedata = external->name;
15930 inote.descsz = BYTE_GET (external->descsz);
15931 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
15932 inote.descpos = offset + (inote.descdata - (char *) pnotes);
15933
c8071705
NC
15934 if (inote.descdata < (char *) pnotes || inote.descdata >= end)
15935 {
15936 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
15937 inote.descdata = inote.namedata;
15938 inote.namesz = 0;
15939 }
15940
685080f2
NC
15941 next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
15942
c8071705 15943 if ( ((char *) next > end)
685080f2
NC
15944 || ((char *) next < (char *) pnotes))
15945 {
15946 warn (_("corrupt descsz found in note at offset 0x%lx\n"),
15947 (unsigned long) ((char *) external - (char *) pnotes));
15948 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
15949 inote.type, inote.namesz, inote.descsz);
15950 break;
15951 }
15952
15953 external = next;
15954
15955 /* Prevent out-of-bounds indexing. */
c8071705 15956 if ( inote.namedata + inote.namesz > end
685080f2
NC
15957 || inote.namedata + inote.namesz < inote.namedata)
15958 {
15959 warn (_("corrupt namesz found in note at offset 0x%lx\n"),
15960 (unsigned long) ((char *) external - (char *) pnotes));
15961 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
15962 inote.type, inote.namesz, inote.descsz);
15963 break;
15964 }
15965
15966 printf (" %s: ", get_v850_elf_note_type (inote.type));
15967
15968 if (! print_v850_note (& inote))
15969 {
15970 res = 0;
15971 printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
15972 inote.namesz, inote.descsz);
15973 }
15974 }
15975
15976 free (pnotes);
15977
15978 return res;
15979}
15980
779fe533 15981static int
2cf0635d 15982process_note_sections (FILE * file)
1ec5cd37 15983{
2cf0635d 15984 Elf_Internal_Shdr * section;
1ec5cd37 15985 unsigned long i;
df565f32 15986 int n = 0;
1ec5cd37
NC
15987 int res = 1;
15988
15989 for (i = 0, section = section_headers;
fa1908fd 15990 i < elf_header.e_shnum && section != NULL;
1ec5cd37 15991 i++, section++)
685080f2
NC
15992 {
15993 if (section->sh_type == SHT_NOTE)
15994 {
15995 res &= process_corefile_note_segment (file,
15996 (bfd_vma) section->sh_offset,
15997 (bfd_vma) section->sh_size);
15998 n++;
15999 }
16000
16001 if (( elf_header.e_machine == EM_V800
16002 || elf_header.e_machine == EM_V850
16003 || elf_header.e_machine == EM_CYGNUS_V850)
16004 && section->sh_type == SHT_RENESAS_INFO)
16005 {
16006 res &= process_v850_notes (file,
16007 (bfd_vma) section->sh_offset,
16008 (bfd_vma) section->sh_size);
16009 n++;
16010 }
16011 }
df565f32
NC
16012
16013 if (n == 0)
16014 /* Try processing NOTE segments instead. */
16015 return process_corefile_note_segments (file);
1ec5cd37
NC
16016
16017 return res;
16018}
16019
16020static int
2cf0635d 16021process_notes (FILE * file)
779fe533
NC
16022{
16023 /* If we have not been asked to display the notes then do nothing. */
16024 if (! do_notes)
16025 return 1;
103f02d3 16026
779fe533 16027 if (elf_header.e_type != ET_CORE)
1ec5cd37 16028 return process_note_sections (file);
103f02d3 16029
779fe533 16030 /* No program headers means no NOTE segment. */
1ec5cd37
NC
16031 if (elf_header.e_phnum > 0)
16032 return process_corefile_note_segments (file);
779fe533 16033
1ec5cd37
NC
16034 printf (_("No note segments present in the core file.\n"));
16035 return 1;
779fe533
NC
16036}
16037
252b5132 16038static int
2cf0635d 16039process_arch_specific (FILE * file)
252b5132 16040{
a952a375
NC
16041 if (! do_arch)
16042 return 1;
16043
252b5132
RH
16044 switch (elf_header.e_machine)
16045 {
11c1ff18
PB
16046 case EM_ARM:
16047 return process_arm_specific (file);
252b5132 16048 case EM_MIPS:
4fe85591 16049 case EM_MIPS_RS3_LE:
252b5132
RH
16050 return process_mips_specific (file);
16051 break;
35c08157
KLC
16052 case EM_NDS32:
16053 return process_nds32_specific (file);
16054 break;
34c8bcba
JM
16055 case EM_PPC:
16056 return process_power_specific (file);
16057 break;
643f7afb
AK
16058 case EM_S390:
16059 case EM_S390_OLD:
16060 return process_s390_specific (file);
16061 break;
9e8c70f9
DM
16062 case EM_SPARC:
16063 case EM_SPARC32PLUS:
16064 case EM_SPARCV9:
16065 return process_sparc_specific (file);
16066 break;
59e6276b
JM
16067 case EM_TI_C6000:
16068 return process_tic6x_specific (file);
16069 break;
13761a11
NC
16070 case EM_MSP430:
16071 return process_msp430x_specific (file);
252b5132
RH
16072 default:
16073 break;
16074 }
16075 return 1;
16076}
16077
16078static int
2cf0635d 16079get_file_header (FILE * file)
252b5132 16080{
9ea033b2
NC
16081 /* Read in the identity array. */
16082 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
252b5132
RH
16083 return 0;
16084
9ea033b2 16085 /* Determine how to read the rest of the header. */
b34976b6 16086 switch (elf_header.e_ident[EI_DATA])
9ea033b2
NC
16087 {
16088 default: /* fall through */
16089 case ELFDATANONE: /* fall through */
adab8cdc
AO
16090 case ELFDATA2LSB:
16091 byte_get = byte_get_little_endian;
16092 byte_put = byte_put_little_endian;
16093 break;
16094 case ELFDATA2MSB:
16095 byte_get = byte_get_big_endian;
16096 byte_put = byte_put_big_endian;
16097 break;
9ea033b2
NC
16098 }
16099
16100 /* For now we only support 32 bit and 64 bit ELF files. */
b34976b6 16101 is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
9ea033b2
NC
16102
16103 /* Read in the rest of the header. */
16104 if (is_32bit_elf)
16105 {
16106 Elf32_External_Ehdr ehdr32;
252b5132 16107
9ea033b2
NC
16108 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
16109 return 0;
103f02d3 16110
9ea033b2
NC
16111 elf_header.e_type = BYTE_GET (ehdr32.e_type);
16112 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
16113 elf_header.e_version = BYTE_GET (ehdr32.e_version);
16114 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
16115 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
16116 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
16117 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
16118 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
16119 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
16120 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
16121 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
16122 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
16123 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
16124 }
252b5132 16125 else
9ea033b2
NC
16126 {
16127 Elf64_External_Ehdr ehdr64;
a952a375
NC
16128
16129 /* If we have been compiled with sizeof (bfd_vma) == 4, then
16130 we will not be able to cope with the 64bit data found in
16131 64 ELF files. Detect this now and abort before we start
50c2245b 16132 overwriting things. */
a952a375
NC
16133 if (sizeof (bfd_vma) < 8)
16134 {
e3c8793a
NC
16135 error (_("This instance of readelf has been built without support for a\n\
1613664 bit data type and so it cannot read 64 bit ELF files.\n"));
a952a375
NC
16137 return 0;
16138 }
103f02d3 16139
9ea033b2
NC
16140 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
16141 return 0;
103f02d3 16142
9ea033b2
NC
16143 elf_header.e_type = BYTE_GET (ehdr64.e_type);
16144 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
16145 elf_header.e_version = BYTE_GET (ehdr64.e_version);
66543521
AM
16146 elf_header.e_entry = BYTE_GET (ehdr64.e_entry);
16147 elf_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
16148 elf_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
9ea033b2
NC
16149 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
16150 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
16151 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
16152 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
16153 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
16154 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
16155 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
16156 }
252b5132 16157
7ece0d85
JJ
16158 if (elf_header.e_shoff)
16159 {
16160 /* There may be some extensions in the first section header. Don't
16161 bomb if we can't read it. */
16162 if (is_32bit_elf)
049b0c3a 16163 get_32bit_section_headers (file, TRUE);
7ece0d85 16164 else
049b0c3a 16165 get_64bit_section_headers (file, TRUE);
7ece0d85 16166 }
560f3c1c 16167
252b5132
RH
16168 return 1;
16169}
16170
fb52b2f4
NC
16171/* Process one ELF object file according to the command line options.
16172 This file may actually be stored in an archive. The file is
16173 positioned at the start of the ELF object. */
16174
ff78d6d6 16175static int
2cf0635d 16176process_object (char * file_name, FILE * file)
252b5132 16177{
252b5132
RH
16178 unsigned int i;
16179
252b5132
RH
16180 if (! get_file_header (file))
16181 {
16182 error (_("%s: Failed to read file header\n"), file_name);
ff78d6d6 16183 return 1;
252b5132
RH
16184 }
16185
16186 /* Initialise per file variables. */
60bca95a 16187 for (i = ARRAY_SIZE (version_info); i--;)
252b5132
RH
16188 version_info[i] = 0;
16189
60bca95a 16190 for (i = ARRAY_SIZE (dynamic_info); i--;)
252b5132 16191 dynamic_info[i] = 0;
5115b233 16192 dynamic_info_DT_GNU_HASH = 0;
252b5132
RH
16193
16194 /* Process the file. */
16195 if (show_name)
16196 printf (_("\nFile: %s\n"), file_name);
16197
18bd398b
NC
16198 /* Initialise the dump_sects array from the cmdline_dump_sects array.
16199 Note we do this even if cmdline_dump_sects is empty because we
16200 must make sure that the dump_sets array is zeroed out before each
16201 object file is processed. */
16202 if (num_dump_sects > num_cmdline_dump_sects)
09c11c86 16203 memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
18bd398b
NC
16204
16205 if (num_cmdline_dump_sects > 0)
16206 {
16207 if (num_dump_sects == 0)
16208 /* A sneaky way of allocating the dump_sects array. */
09c11c86 16209 request_dump_bynumber (num_cmdline_dump_sects, 0);
18bd398b
NC
16210
16211 assert (num_dump_sects >= num_cmdline_dump_sects);
09c11c86
NC
16212 memcpy (dump_sects, cmdline_dump_sects,
16213 num_cmdline_dump_sects * sizeof (* dump_sects));
18bd398b 16214 }
d70c5fc7 16215
252b5132 16216 if (! process_file_header ())
fb52b2f4 16217 return 1;
252b5132 16218
d1f5c6e3 16219 if (! process_section_headers (file))
2f62977e 16220 {
d1f5c6e3
L
16221 /* Without loaded section headers we cannot process lots of
16222 things. */
2f62977e 16223 do_unwind = do_version = do_dump = do_arch = 0;
252b5132 16224
2f62977e 16225 if (! do_using_dynamic)
2c610e4b 16226 do_syms = do_dyn_syms = do_reloc = 0;
2f62977e 16227 }
252b5132 16228
d1f5c6e3
L
16229 if (! process_section_groups (file))
16230 {
16231 /* Without loaded section groups we cannot process unwind. */
16232 do_unwind = 0;
16233 }
16234
2f62977e 16235 if (process_program_headers (file))
b2d38a17 16236 process_dynamic_section (file);
252b5132
RH
16237
16238 process_relocs (file);
16239
4d6ed7c8
NC
16240 process_unwind (file);
16241
252b5132
RH
16242 process_symbol_table (file);
16243
16244 process_syminfo (file);
16245
16246 process_version_sections (file);
16247
16248 process_section_contents (file);
f5842774 16249
1ec5cd37 16250 process_notes (file);
103f02d3 16251
047b2264
JJ
16252 process_gnu_liblist (file);
16253
252b5132
RH
16254 process_arch_specific (file);
16255
d93f0186
NC
16256 if (program_headers)
16257 {
16258 free (program_headers);
16259 program_headers = NULL;
16260 }
16261
252b5132
RH
16262 if (section_headers)
16263 {
16264 free (section_headers);
16265 section_headers = NULL;
16266 }
16267
16268 if (string_table)
16269 {
16270 free (string_table);
16271 string_table = NULL;
d40ac9bd 16272 string_table_length = 0;
252b5132
RH
16273 }
16274
16275 if (dynamic_strings)
16276 {
16277 free (dynamic_strings);
16278 dynamic_strings = NULL;
d79b3d50 16279 dynamic_strings_length = 0;
252b5132
RH
16280 }
16281
16282 if (dynamic_symbols)
16283 {
16284 free (dynamic_symbols);
16285 dynamic_symbols = NULL;
19936277 16286 num_dynamic_syms = 0;
252b5132
RH
16287 }
16288
16289 if (dynamic_syminfo)
16290 {
16291 free (dynamic_syminfo);
16292 dynamic_syminfo = NULL;
16293 }
ff78d6d6 16294
293c573e
MR
16295 if (dynamic_section)
16296 {
16297 free (dynamic_section);
16298 dynamic_section = NULL;
16299 }
16300
e4b17d5c
L
16301 if (section_headers_groups)
16302 {
16303 free (section_headers_groups);
16304 section_headers_groups = NULL;
16305 }
16306
16307 if (section_groups)
16308 {
2cf0635d
NC
16309 struct group_list * g;
16310 struct group_list * next;
e4b17d5c
L
16311
16312 for (i = 0; i < group_count; i++)
16313 {
16314 for (g = section_groups [i].root; g != NULL; g = next)
16315 {
16316 next = g->next;
16317 free (g);
16318 }
16319 }
16320
16321 free (section_groups);
16322 section_groups = NULL;
16323 }
16324
19e6b90e 16325 free_debug_memory ();
18bd398b 16326
ff78d6d6 16327 return 0;
252b5132
RH
16328}
16329
2cf0635d
NC
16330/* Process an ELF archive.
16331 On entry the file is positioned just after the ARMAG string. */
16332
16333static int
16334process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
16335{
16336 struct archive_info arch;
16337 struct archive_info nested_arch;
16338 size_t got;
2cf0635d
NC
16339 int ret;
16340
16341 show_name = 1;
16342
16343 /* The ARCH structure is used to hold information about this archive. */
16344 arch.file_name = NULL;
16345 arch.file = NULL;
16346 arch.index_array = NULL;
16347 arch.sym_table = NULL;
16348 arch.longnames = NULL;
16349
16350 /* The NESTED_ARCH structure is used as a single-item cache of information
16351 about a nested archive (when members of a thin archive reside within
16352 another regular archive file). */
16353 nested_arch.file_name = NULL;
16354 nested_arch.file = NULL;
16355 nested_arch.index_array = NULL;
16356 nested_arch.sym_table = NULL;
16357 nested_arch.longnames = NULL;
16358
16359 if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
16360 {
16361 ret = 1;
16362 goto out;
4145f1d5 16363 }
fb52b2f4 16364
4145f1d5
NC
16365 if (do_archive_index)
16366 {
2cf0635d 16367 if (arch.sym_table == NULL)
4145f1d5
NC
16368 error (_("%s: unable to dump the index as none was found\n"), file_name);
16369 else
16370 {
591f7597 16371 unsigned long i, l;
4145f1d5
NC
16372 unsigned long current_pos;
16373
591f7597
NC
16374 printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
16375 file_name, (unsigned long) arch.index_num, arch.sym_size);
4145f1d5
NC
16376 current_pos = ftell (file);
16377
2cf0635d 16378 for (i = l = 0; i < arch.index_num; i++)
4145f1d5 16379 {
2cf0635d
NC
16380 if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
16381 {
16382 char * member_name;
4145f1d5 16383
2cf0635d
NC
16384 member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
16385
16386 if (member_name != NULL)
16387 {
16388 char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
16389
16390 if (qualified_name != NULL)
16391 {
c2a7d3f5
NC
16392 printf (_("Contents of binary %s at offset "), qualified_name);
16393 (void) print_vma (arch.index_array[i], PREFIX_HEX);
16394 putchar ('\n');
2cf0635d
NC
16395 free (qualified_name);
16396 }
4145f1d5
NC
16397 }
16398 }
2cf0635d
NC
16399
16400 if (l >= arch.sym_size)
4145f1d5
NC
16401 {
16402 error (_("%s: end of the symbol table reached before the end of the index\n"),
16403 file_name);
cb8f3167 16404 break;
4145f1d5 16405 }
591f7597
NC
16406 /* PR 17531: file: 0b6630b2. */
16407 printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
16408 l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
4145f1d5
NC
16409 }
16410
c2a7d3f5
NC
16411 if (arch.uses_64bit_indicies)
16412 l = (l + 7) & ~ 7;
16413 else
16414 l += l & 1;
16415
2cf0635d 16416 if (l < arch.sym_size)
c2a7d3f5
NC
16417 error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
16418 file_name, arch.sym_size - l);
4145f1d5 16419
4145f1d5
NC
16420 if (fseek (file, current_pos, SEEK_SET) != 0)
16421 {
16422 error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
2cf0635d
NC
16423 ret = 1;
16424 goto out;
4145f1d5 16425 }
fb52b2f4 16426 }
4145f1d5
NC
16427
16428 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
16429 && !do_segments && !do_header && !do_dump && !do_version
16430 && !do_histogram && !do_debugging && !do_arch && !do_notes
2c610e4b 16431 && !do_section_groups && !do_dyn_syms)
2cf0635d
NC
16432 {
16433 ret = 0; /* Archive index only. */
16434 goto out;
16435 }
fb52b2f4
NC
16436 }
16437
d989285c 16438 ret = 0;
fb52b2f4
NC
16439
16440 while (1)
16441 {
2cf0635d
NC
16442 char * name;
16443 size_t namelen;
16444 char * qualified_name;
16445
16446 /* Read the next archive header. */
16447 if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
16448 {
16449 error (_("%s: failed to seek to next archive header\n"), file_name);
16450 return 1;
16451 }
16452 got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
16453 if (got != sizeof arch.arhdr)
16454 {
16455 if (got == 0)
16456 break;
16457 error (_("%s: failed to read archive header\n"), file_name);
16458 ret = 1;
16459 break;
16460 }
16461 if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
16462 {
16463 error (_("%s: did not find a valid archive header\n"), arch.file_name);
16464 ret = 1;
16465 break;
16466 }
16467
16468 arch.next_arhdr_offset += sizeof arch.arhdr;
16469
16470 archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
16471 if (archive_file_size & 01)
16472 ++archive_file_size;
16473
16474 name = get_archive_member_name (&arch, &nested_arch);
16475 if (name == NULL)
fb52b2f4 16476 {
0fd3a477 16477 error (_("%s: bad archive file name\n"), file_name);
d989285c
ILT
16478 ret = 1;
16479 break;
fb52b2f4 16480 }
2cf0635d 16481 namelen = strlen (name);
fb52b2f4 16482
2cf0635d
NC
16483 qualified_name = make_qualified_name (&arch, &nested_arch, name);
16484 if (qualified_name == NULL)
fb52b2f4 16485 {
2cf0635d 16486 error (_("%s: bad archive file name\n"), file_name);
d989285c
ILT
16487 ret = 1;
16488 break;
fb52b2f4
NC
16489 }
16490
2cf0635d
NC
16491 if (is_thin_archive && arch.nested_member_origin == 0)
16492 {
16493 /* This is a proxy for an external member of a thin archive. */
16494 FILE * member_file;
16495 char * member_file_name = adjust_relative_path (file_name, name, namelen);
16496 if (member_file_name == NULL)
16497 {
16498 ret = 1;
16499 break;
16500 }
16501
16502 member_file = fopen (member_file_name, "rb");
16503 if (member_file == NULL)
16504 {
16505 error (_("Input file '%s' is not readable.\n"), member_file_name);
16506 free (member_file_name);
16507 ret = 1;
16508 break;
16509 }
16510
16511 archive_file_offset = arch.nested_member_origin;
16512
16513 ret |= process_object (qualified_name, member_file);
16514
16515 fclose (member_file);
16516 free (member_file_name);
16517 }
16518 else if (is_thin_archive)
16519 {
a043396b
NC
16520 /* PR 15140: Allow for corrupt thin archives. */
16521 if (nested_arch.file == NULL)
16522 {
16523 error (_("%s: contains corrupt thin archive: %s\n"),
16524 file_name, name);
16525 ret = 1;
16526 break;
16527 }
16528
2cf0635d
NC
16529 /* This is a proxy for a member of a nested archive. */
16530 archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
16531
16532 /* The nested archive file will have been opened and setup by
16533 get_archive_member_name. */
16534 if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
16535 {
16536 error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
16537 ret = 1;
16538 break;
16539 }
16540
16541 ret |= process_object (qualified_name, nested_arch.file);
16542 }
16543 else
16544 {
16545 archive_file_offset = arch.next_arhdr_offset;
16546 arch.next_arhdr_offset += archive_file_size;
fb52b2f4 16547
2cf0635d
NC
16548 ret |= process_object (qualified_name, file);
16549 }
fb52b2f4 16550
2b52916e
L
16551 if (dump_sects != NULL)
16552 {
16553 free (dump_sects);
16554 dump_sects = NULL;
16555 num_dump_sects = 0;
16556 }
16557
2cf0635d 16558 free (qualified_name);
fb52b2f4
NC
16559 }
16560
4145f1d5 16561 out:
2cf0635d
NC
16562 if (nested_arch.file != NULL)
16563 fclose (nested_arch.file);
16564 release_archive (&nested_arch);
16565 release_archive (&arch);
fb52b2f4 16566
d989285c 16567 return ret;
fb52b2f4
NC
16568}
16569
16570static int
2cf0635d 16571process_file (char * file_name)
fb52b2f4 16572{
2cf0635d 16573 FILE * file;
fb52b2f4
NC
16574 struct stat statbuf;
16575 char armag[SARMAG];
16576 int ret;
16577
16578 if (stat (file_name, &statbuf) < 0)
16579 {
f24ddbdd
NC
16580 if (errno == ENOENT)
16581 error (_("'%s': No such file\n"), file_name);
16582 else
16583 error (_("Could not locate '%s'. System error message: %s\n"),
16584 file_name, strerror (errno));
16585 return 1;
16586 }
16587
16588 if (! S_ISREG (statbuf.st_mode))
16589 {
16590 error (_("'%s' is not an ordinary file\n"), file_name);
fb52b2f4
NC
16591 return 1;
16592 }
16593
16594 file = fopen (file_name, "rb");
16595 if (file == NULL)
16596 {
f24ddbdd 16597 error (_("Input file '%s' is not readable.\n"), file_name);
fb52b2f4
NC
16598 return 1;
16599 }
16600
16601 if (fread (armag, SARMAG, 1, file) != 1)
16602 {
4145f1d5 16603 error (_("%s: Failed to read file's magic number\n"), file_name);
fb52b2f4
NC
16604 fclose (file);
16605 return 1;
16606 }
16607
f54498b4
NC
16608 current_file_size = (bfd_size_type) statbuf.st_size;
16609
fb52b2f4 16610 if (memcmp (armag, ARMAG, SARMAG) == 0)
2cf0635d
NC
16611 ret = process_archive (file_name, file, FALSE);
16612 else if (memcmp (armag, ARMAGT, SARMAG) == 0)
16613 ret = process_archive (file_name, file, TRUE);
fb52b2f4
NC
16614 else
16615 {
4145f1d5
NC
16616 if (do_archive_index)
16617 error (_("File %s is not an archive so its index cannot be displayed.\n"),
16618 file_name);
16619
fb52b2f4
NC
16620 rewind (file);
16621 archive_file_size = archive_file_offset = 0;
16622 ret = process_object (file_name, file);
16623 }
16624
16625 fclose (file);
16626
f54498b4 16627 current_file_size = 0;
fb52b2f4
NC
16628 return ret;
16629}
16630
252b5132
RH
16631#ifdef SUPPORT_DISASSEMBLY
16632/* Needed by the i386 disassembler. For extra credit, someone could
9ea033b2 16633 fix this so that we insert symbolic addresses here, esp for GOT/PLT
e3c8793a 16634 symbols. */
252b5132
RH
16635
16636void
2cf0635d 16637print_address (unsigned int addr, FILE * outfile)
252b5132
RH
16638{
16639 fprintf (outfile,"0x%8.8x", addr);
16640}
16641
e3c8793a 16642/* Needed by the i386 disassembler. */
252b5132
RH
16643void
16644db_task_printsym (unsigned int addr)
16645{
16646 print_address (addr, stderr);
16647}
16648#endif
16649
16650int
2cf0635d 16651main (int argc, char ** argv)
252b5132 16652{
ff78d6d6
L
16653 int err;
16654
252b5132
RH
16655#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
16656 setlocale (LC_MESSAGES, "");
3882b010
L
16657#endif
16658#if defined (HAVE_SETLOCALE)
16659 setlocale (LC_CTYPE, "");
252b5132
RH
16660#endif
16661 bindtextdomain (PACKAGE, LOCALEDIR);
16662 textdomain (PACKAGE);
16663
869b9d07
MM
16664 expandargv (&argc, &argv);
16665
252b5132
RH
16666 parse_args (argc, argv);
16667
18bd398b 16668 if (num_dump_sects > 0)
59f14fc0 16669 {
18bd398b 16670 /* Make a copy of the dump_sects array. */
3f5e193b
NC
16671 cmdline_dump_sects = (dump_type *)
16672 malloc (num_dump_sects * sizeof (* dump_sects));
59f14fc0 16673 if (cmdline_dump_sects == NULL)
591a748a 16674 error (_("Out of memory allocating dump request table.\n"));
59f14fc0
AS
16675 else
16676 {
09c11c86
NC
16677 memcpy (cmdline_dump_sects, dump_sects,
16678 num_dump_sects * sizeof (* dump_sects));
59f14fc0
AS
16679 num_cmdline_dump_sects = num_dump_sects;
16680 }
16681 }
16682
18bd398b
NC
16683 if (optind < (argc - 1))
16684 show_name = 1;
5656ba2c
L
16685 else if (optind >= argc)
16686 {
16687 warn (_("Nothing to do.\n"));
16688 usage (stderr);
16689 }
18bd398b 16690
ff78d6d6 16691 err = 0;
252b5132 16692 while (optind < argc)
18bd398b 16693 err |= process_file (argv[optind++]);
252b5132
RH
16694
16695 if (dump_sects != NULL)
16696 free (dump_sects);
59f14fc0
AS
16697 if (cmdline_dump_sects != NULL)
16698 free (cmdline_dump_sects);
252b5132 16699
ff78d6d6 16700 return err;
252b5132 16701}
This page took 2.592909 seconds and 4 git commands to generate.