]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - binutils/readelf.c
Provide dummy libraries for alpha-vms
[thirdparty/binutils-gdb.git] / binutils / readelf.c
CommitLineData
252b5132 1/* readelf.c -- display contents of an ELF format file
b3adc24a 2 Copyright (C) 1998-2020 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"
7d9813f1 63#include "ctf-api.h"
79bc120c 64#include "demangle.h"
252b5132
RH
65
66#include "elf/common.h"
67#include "elf/external.h"
68#include "elf/internal.h"
252b5132 69
4b78141a
NC
70
71/* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
72 we can obtain the H8 reloc numbers. We need these for the
73 get_reloc_size() function. We include h8.h again after defining
74 RELOC_MACROS_GEN_FUNC so that we get the naming function as well. */
75
76#include "elf/h8.h"
77#undef _ELF_H8_H
78
79/* Undo the effects of #including reloc-macros.h. */
80
81#undef START_RELOC_NUMBERS
82#undef RELOC_NUMBER
83#undef FAKE_RELOC
84#undef EMPTY_RELOC
85#undef END_RELOC_NUMBERS
86#undef _RELOC_MACROS_H
87
252b5132
RH
88/* The following headers use the elf/reloc-macros.h file to
89 automatically generate relocation recognition functions
90 such as elf_mips_reloc_type() */
91
92#define RELOC_MACROS_GEN_FUNC
93
a06ea964 94#include "elf/aarch64.h"
252b5132 95#include "elf/alpha.h"
3b16e843 96#include "elf/arc.h"
252b5132 97#include "elf/arm.h"
3b16e843 98#include "elf/avr.h"
1d65ded4 99#include "elf/bfin.h"
60bca95a 100#include "elf/cr16.h"
3b16e843 101#include "elf/cris.h"
1c0d3aa6 102#include "elf/crx.h"
b8891f8d 103#include "elf/csky.h"
252b5132
RH
104#include "elf/d10v.h"
105#include "elf/d30v.h"
d172d4ba 106#include "elf/dlx.h"
aca4efc7 107#include "elf/bpf.h"
cfb8c092 108#include "elf/epiphany.h"
252b5132 109#include "elf/fr30.h"
5c70f934 110#include "elf/frv.h"
3f8107ab 111#include "elf/ft32.h"
3b16e843
NC
112#include "elf/h8.h"
113#include "elf/hppa.h"
114#include "elf/i386.h"
f954747f
AM
115#include "elf/i370.h"
116#include "elf/i860.h"
117#include "elf/i960.h"
3b16e843 118#include "elf/ia64.h"
1e4cf259 119#include "elf/ip2k.h"
84e94c90 120#include "elf/lm32.h"
1c0d3aa6 121#include "elf/iq2000.h"
49f58d10 122#include "elf/m32c.h"
3b16e843
NC
123#include "elf/m32r.h"
124#include "elf/m68k.h"
75751cd9 125#include "elf/m68hc11.h"
7b4ae824 126#include "elf/s12z.h"
252b5132 127#include "elf/mcore.h"
15ab5209 128#include "elf/mep.h"
a3c62988 129#include "elf/metag.h"
7ba29e2a 130#include "elf/microblaze.h"
3b16e843 131#include "elf/mips.h"
3c3bdf30 132#include "elf/mmix.h"
3b16e843
NC
133#include "elf/mn10200.h"
134#include "elf/mn10300.h"
5506d11a 135#include "elf/moxie.h"
4970f871 136#include "elf/mt.h"
2469cfa2 137#include "elf/msp430.h"
35c08157 138#include "elf/nds32.h"
fe944acf 139#include "elf/nfp.h"
13761a11 140#include "elf/nios2.h"
73589c9d 141#include "elf/or1k.h"
7d466069 142#include "elf/pj.h"
3b16e843 143#include "elf/ppc.h"
c833c019 144#include "elf/ppc64.h"
2b100bb5 145#include "elf/pru.h"
03336641 146#include "elf/riscv.h"
99c513f6 147#include "elf/rl78.h"
c7927a3c 148#include "elf/rx.h"
a85d7ed0 149#include "elf/s390.h"
1c0d3aa6 150#include "elf/score.h"
3b16e843
NC
151#include "elf/sh.h"
152#include "elf/sparc.h"
e9f53129 153#include "elf/spu.h"
40b36596 154#include "elf/tic6x.h"
aa137e4d
NC
155#include "elf/tilegx.h"
156#include "elf/tilepro.h"
3b16e843 157#include "elf/v850.h"
179d3252 158#include "elf/vax.h"
619ed720 159#include "elf/visium.h"
f96bd6c2 160#include "elf/wasm32.h"
3b16e843 161#include "elf/x86-64.h"
c29aca4a 162#include "elf/xc16x.h"
f6c1a2d5 163#include "elf/xgate.h"
93fbbb04 164#include "elf/xstormy16.h"
88da6820 165#include "elf/xtensa.h"
6655dba2 166#include "elf/z80.h"
252b5132 167
252b5132 168#include "getopt.h"
566b0d53 169#include "libiberty.h"
09c11c86 170#include "safe-ctype.h"
2cf0635d 171#include "filenames.h"
252b5132 172
15b42fb0
AM
173#ifndef offsetof
174#define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
175#endif
176
6a40cf0c
NC
177typedef struct elf_section_list
178{
dda8d76d
NC
179 Elf_Internal_Shdr * hdr;
180 struct elf_section_list * next;
6a40cf0c
NC
181} elf_section_list;
182
dda8d76d
NC
183/* Flag bits indicating particular types of dump. */
184#define HEX_DUMP (1 << 0) /* The -x command line switch. */
185#define DISASS_DUMP (1 << 1) /* The -i command line switch. */
186#define DEBUG_DUMP (1 << 2) /* The -w command line switch. */
187#define STRING_DUMP (1 << 3) /* The -p command line switch. */
188#define RELOC_DUMP (1 << 4) /* The -R command line switch. */
d344b407 189#define CTF_DUMP (1 << 5) /* The --ctf command line switch. */
dda8d76d
NC
190
191typedef unsigned char dump_type;
192
193/* A linked list of the section names for which dumps were requested. */
194struct dump_list_entry
195{
196 char * name;
197 dump_type type;
198 struct dump_list_entry * next;
199};
200
6431e409
AM
201/* A dynamic array of flags indicating for which sections a dump
202 has been requested via command line switches. */
1b513401
NC
203struct dump_data
204{
6431e409
AM
205 dump_type * dump_sects;
206 unsigned int num_dump_sects;
207};
208
209static struct dump_data cmdline;
210
211static struct dump_list_entry * dump_sects_byname;
212
2cf0635d 213char * program_name = "readelf";
dda8d76d 214
32ec8896
NC
215static bfd_boolean show_name = FALSE;
216static bfd_boolean do_dynamic = FALSE;
217static bfd_boolean do_syms = FALSE;
218static bfd_boolean do_dyn_syms = FALSE;
219static bfd_boolean do_reloc = FALSE;
220static bfd_boolean do_sections = FALSE;
221static bfd_boolean do_section_groups = FALSE;
222static bfd_boolean do_section_details = FALSE;
223static bfd_boolean do_segments = FALSE;
224static bfd_boolean do_unwind = FALSE;
225static bfd_boolean do_using_dynamic = FALSE;
226static bfd_boolean do_header = FALSE;
227static bfd_boolean do_dump = FALSE;
228static bfd_boolean do_version = FALSE;
229static bfd_boolean do_histogram = FALSE;
230static bfd_boolean do_debugging = FALSE;
7d9813f1 231static bfd_boolean do_ctf = FALSE;
32ec8896
NC
232static bfd_boolean do_arch = FALSE;
233static bfd_boolean do_notes = FALSE;
234static bfd_boolean do_archive_index = FALSE;
1b513401 235static bfd_boolean check_all = FALSE;
32ec8896
NC
236static bfd_boolean is_32bit_elf = FALSE;
237static bfd_boolean decompress_dumps = FALSE;
0942c7ab 238static bfd_boolean do_not_show_symbol_truncation = FALSE;
79bc120c
NC
239static bfd_boolean do_demangle = FALSE; /* Pretty print C++ symbol names. */
240static int demangle_flags = DMGL_ANSI | DMGL_PARAMS;
252b5132 241
7d9813f1
NA
242static char *dump_ctf_parent_name;
243static char *dump_ctf_symtab_name;
244static char *dump_ctf_strtab_name;
245
e4b17d5c
L
246struct group_list
247{
dda8d76d
NC
248 struct group_list * next;
249 unsigned int section_index;
e4b17d5c
L
250};
251
252struct group
253{
dda8d76d
NC
254 struct group_list * root;
255 unsigned int group_index;
e4b17d5c
L
256};
257
978c4450
AM
258typedef struct filedata
259{
260 const char * file_name;
261 FILE * handle;
262 bfd_size_type file_size;
263 Elf_Internal_Ehdr file_header;
264 Elf_Internal_Shdr * section_headers;
265 Elf_Internal_Phdr * program_headers;
266 char * string_table;
267 unsigned long string_table_length;
268 unsigned long archive_file_offset;
269 unsigned long archive_file_size;
270 unsigned long dynamic_addr;
271 bfd_size_type dynamic_size;
272 size_t dynamic_nent;
273 Elf_Internal_Dyn * dynamic_section;
8ac10c5b 274 Elf_Internal_Shdr * dynamic_strtab_section;
978c4450
AM
275 char * dynamic_strings;
276 unsigned long dynamic_strings_length;
8ac10c5b 277 Elf_Internal_Shdr * dynamic_symtab_section;
978c4450
AM
278 unsigned long num_dynamic_syms;
279 Elf_Internal_Sym * dynamic_symbols;
280 bfd_vma version_info[16];
281 unsigned int dynamic_syminfo_nent;
282 Elf_Internal_Syminfo * dynamic_syminfo;
283 unsigned long dynamic_syminfo_offset;
284 bfd_size_type nbuckets;
285 bfd_size_type nchains;
286 bfd_vma * buckets;
287 bfd_vma * chains;
288 bfd_size_type ngnubuckets;
289 bfd_size_type ngnuchains;
290 bfd_vma * gnubuckets;
291 bfd_vma * gnuchains;
292 bfd_vma * mipsxlat;
293 bfd_vma gnusymidx;
294 char program_interpreter[PATH_MAX];
295 bfd_vma dynamic_info[DT_ENCODING];
296 bfd_vma dynamic_info_DT_GNU_HASH;
297 bfd_vma dynamic_info_DT_MIPS_XHASH;
298 elf_section_list * symtab_shndx_list;
299 size_t group_count;
300 struct group * section_groups;
301 struct group ** section_headers_groups;
302 /* A dynamic array of flags indicating for which sections a dump of
303 some kind has been requested. It is reset on a per-object file
304 basis and then initialised from the cmdline_dump_sects array,
305 the results of interpreting the -w switch, and the
306 dump_sects_byname list. */
307 struct dump_data dump;
308} Filedata;
aef1f6d0 309
c256ffe7 310/* How to print a vma value. */
843dd992
NC
311typedef enum print_mode
312{
313 HEX,
314 DEC,
315 DEC_5,
316 UNSIGNED,
317 PREFIX_HEX,
318 FULL_HEX,
319 LONG_HEX
320}
321print_mode;
322
bb4d2ac2
L
323/* Versioned symbol info. */
324enum versioned_symbol_info
325{
326 symbol_undefined,
327 symbol_hidden,
328 symbol_public
329};
330
32ec8896 331static const char * get_symbol_version_string
dda8d76d 332 (Filedata *, bfd_boolean, const char *, unsigned long, unsigned,
32ec8896 333 Elf_Internal_Sym *, enum versioned_symbol_info *, unsigned short *);
bb4d2ac2 334
9c19a809
NC
335#define UNKNOWN -1
336
2b692964
NC
337#define SECTION_NAME(X) \
338 ((X) == NULL ? _("<none>") \
dda8d76d
NC
339 : filedata->string_table == NULL ? _("<no-strings>") \
340 : ((X)->sh_name >= filedata->string_table_length ? _("<corrupt>") \
341 : filedata->string_table + (X)->sh_name))
252b5132 342
ee42cf8c 343#define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
252b5132 344
ba5cdace
NC
345#define GET_ELF_SYMBOLS(file, section, sym_count) \
346 (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count) \
347 : get_64bit_elf_symbols (file, section, sym_count))
9ea033b2 348
10ca4b04
L
349#define VALID_SYMBOL_NAME(strtab, strtab_size, offset) \
350 (strtab != NULL && offset < strtab_size)
978c4450
AM
351#define VALID_DYNAMIC_NAME(filedata, offset) \
352 VALID_SYMBOL_NAME (filedata->dynamic_strings, \
353 filedata->dynamic_strings_length, offset)
d79b3d50
NC
354/* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
355 already been called and verified that the string exists. */
978c4450
AM
356#define GET_DYNAMIC_NAME(filedata, offset) \
357 (filedata->dynamic_strings + offset)
18bd398b 358
61865e30
NC
359#define REMOVE_ARCH_BITS(ADDR) \
360 do \
361 { \
dda8d76d 362 if (filedata->file_header.e_machine == EM_ARM) \
61865e30
NC
363 (ADDR) &= ~1; \
364 } \
365 while (0)
f16a9783
MS
366
367/* Get the correct GNU hash section name. */
978c4450
AM
368#define GNU_HASH_SECTION_NAME(filedata) \
369 filedata->dynamic_info_DT_MIPS_XHASH ? ".MIPS.xhash" : ".gnu.hash"
d79b3d50 370\f
66cfc0fd
AM
371/* Print a BFD_VMA to an internal buffer, for use in error messages.
372 BFD_FMA_FMT can't be used in translated strings. */
373
374static const char *
375bfd_vmatoa (char *fmtch, bfd_vma value)
376{
377 /* bfd_vmatoa is used more then once in a printf call for output.
378 Cycle through an array of buffers. */
379 static int buf_pos = 0;
380 static struct bfd_vmatoa_buf
381 {
382 char place[64];
383 } buf[4];
384 char *ret;
385 char fmt[32];
386
387 ret = buf[buf_pos++].place;
388 buf_pos %= ARRAY_SIZE (buf);
389
390 sprintf (fmt, "%%%s%s", BFD_VMA_FMT, fmtch);
391 snprintf (ret, sizeof (buf[0].place), fmt, value);
392 return ret;
393}
394
dda8d76d
NC
395/* Retrieve NMEMB structures, each SIZE bytes long from FILEDATA starting at
396 OFFSET + the offset of the current archive member, if we are examining an
397 archive. Put the retrieved data into VAR, if it is not NULL. Otherwise
398 allocate a buffer using malloc and fill that. In either case return the
399 pointer to the start of the retrieved data or NULL if something went wrong.
400 If something does go wrong and REASON is not NULL then emit an error
401 message using REASON as part of the context. */
59245841 402
c256ffe7 403static void *
dda8d76d
NC
404get_data (void * var,
405 Filedata * filedata,
406 unsigned long offset,
407 bfd_size_type size,
408 bfd_size_type nmemb,
409 const char * reason)
a6e9f9df 410{
2cf0635d 411 void * mvar;
57028622 412 bfd_size_type amt = size * nmemb;
a6e9f9df 413
c256ffe7 414 if (size == 0 || nmemb == 0)
a6e9f9df
AM
415 return NULL;
416
57028622
NC
417 /* If the size_t type is smaller than the bfd_size_type, eg because
418 you are building a 32-bit tool on a 64-bit host, then make sure
419 that when the sizes are cast to (size_t) no information is lost. */
7c1c1904
AM
420 if ((size_t) size != size
421 || (size_t) nmemb != nmemb
422 || (size_t) amt != amt)
57028622
NC
423 {
424 if (reason)
66cfc0fd
AM
425 error (_("Size truncation prevents reading %s"
426 " elements of size %s for %s\n"),
427 bfd_vmatoa ("u", nmemb), bfd_vmatoa ("u", size), reason);
57028622
NC
428 return NULL;
429 }
430
431 /* Check for size overflow. */
7c1c1904 432 if (amt / size != nmemb || (size_t) amt + 1 == 0)
57028622
NC
433 {
434 if (reason)
66cfc0fd
AM
435 error (_("Size overflow prevents reading %s"
436 " elements of size %s for %s\n"),
437 bfd_vmatoa ("u", nmemb), bfd_vmatoa ("u", size), reason);
57028622
NC
438 return NULL;
439 }
440
c22b42ce 441 /* Be kind to memory checkers (eg valgrind, address sanitizer) by not
c9c1d674 442 attempting to allocate memory when the read is bound to fail. */
978c4450
AM
443 if (filedata->archive_file_offset > filedata->file_size
444 || offset > filedata->file_size - filedata->archive_file_offset
445 || amt > filedata->file_size - filedata->archive_file_offset - offset)
a6e9f9df 446 {
049b0c3a 447 if (reason)
66cfc0fd
AM
448 error (_("Reading %s bytes extends past end of file for %s\n"),
449 bfd_vmatoa ("u", amt), reason);
a6e9f9df
AM
450 return NULL;
451 }
452
978c4450
AM
453 if (fseek (filedata->handle, filedata->archive_file_offset + offset,
454 SEEK_SET))
071436c6
NC
455 {
456 if (reason)
c9c1d674 457 error (_("Unable to seek to 0x%lx for %s\n"),
978c4450 458 filedata->archive_file_offset + offset, reason);
071436c6
NC
459 return NULL;
460 }
461
a6e9f9df
AM
462 mvar = var;
463 if (mvar == NULL)
464 {
7c1c1904
AM
465 /* + 1 so that we can '\0' terminate invalid string table sections. */
466 mvar = malloc ((size_t) amt + 1);
a6e9f9df
AM
467
468 if (mvar == NULL)
469 {
049b0c3a 470 if (reason)
66cfc0fd
AM
471 error (_("Out of memory allocating %s bytes for %s\n"),
472 bfd_vmatoa ("u", amt), reason);
a6e9f9df
AM
473 return NULL;
474 }
c256ffe7 475
c9c1d674 476 ((char *) mvar)[amt] = '\0';
a6e9f9df
AM
477 }
478
dda8d76d 479 if (fread (mvar, (size_t) size, (size_t) nmemb, filedata->handle) != nmemb)
a6e9f9df 480 {
049b0c3a 481 if (reason)
66cfc0fd
AM
482 error (_("Unable to read in %s bytes of %s\n"),
483 bfd_vmatoa ("u", amt), reason);
a6e9f9df
AM
484 if (mvar != var)
485 free (mvar);
486 return NULL;
487 }
488
489 return mvar;
490}
491
32ec8896
NC
492/* Print a VMA value in the MODE specified.
493 Returns the number of characters displayed. */
cb8f3167 494
32ec8896 495static unsigned int
14a91970 496print_vma (bfd_vma vma, print_mode mode)
66543521 497{
32ec8896 498 unsigned int nc = 0;
66543521 499
14a91970 500 switch (mode)
66543521 501 {
14a91970
AM
502 case FULL_HEX:
503 nc = printf ("0x");
1a0670f3 504 /* Fall through. */
14a91970 505 case LONG_HEX:
f7a99963 506#ifdef BFD64
14a91970 507 if (is_32bit_elf)
437c2fb7 508 return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
f7a99963 509#endif
14a91970
AM
510 printf_vma (vma);
511 return nc + 16;
b19aac67 512
14a91970
AM
513 case DEC_5:
514 if (vma <= 99999)
515 return printf ("%5" BFD_VMA_FMT "d", vma);
1a0670f3 516 /* Fall through. */
14a91970
AM
517 case PREFIX_HEX:
518 nc = printf ("0x");
1a0670f3 519 /* Fall through. */
14a91970
AM
520 case HEX:
521 return nc + printf ("%" BFD_VMA_FMT "x", vma);
b19aac67 522
14a91970
AM
523 case DEC:
524 return printf ("%" BFD_VMA_FMT "d", vma);
b19aac67 525
14a91970
AM
526 case UNSIGNED:
527 return printf ("%" BFD_VMA_FMT "u", vma);
32ec8896
NC
528
529 default:
530 /* FIXME: Report unrecognised mode ? */
531 return 0;
f7a99963 532 }
f7a99963
NC
533}
534
7bfd842d 535/* Display a symbol on stdout. Handles the display of control characters and
3bfcb652 536 multibye characters (assuming the host environment supports them).
31104126 537
7bfd842d
NC
538 Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
539
0942c7ab
NC
540 If truncation will happen and do_not_show_symbol_truncation is FALSE then display
541 abs(WIDTH) - 5 characters followed by "[...]".
542
7bfd842d
NC
543 If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
544 padding as necessary.
171191ba
NC
545
546 Returns the number of emitted characters. */
547
548static unsigned int
0942c7ab 549print_symbol (signed int width, const char * symbol)
31104126 550{
171191ba 551 bfd_boolean extra_padding = FALSE;
0942c7ab 552 bfd_boolean do_dots = FALSE;
32ec8896 553 signed int num_printed = 0;
3bfcb652 554#ifdef HAVE_MBSTATE_T
7bfd842d 555 mbstate_t state;
3bfcb652 556#endif
32ec8896 557 unsigned int width_remaining;
79bc120c 558 const void * alloced_symbol = NULL;
961c521f 559
7bfd842d 560 if (width < 0)
961c521f 561 {
88305e1b 562 /* Keep the width positive. This helps the code below. */
961c521f 563 width = - width;
171191ba 564 extra_padding = TRUE;
0b4362b0 565 }
56d8f8a9
NC
566 else if (width == 0)
567 return 0;
961c521f 568
7bfd842d
NC
569 if (do_wide)
570 /* Set the remaining width to a very large value.
571 This simplifies the code below. */
572 width_remaining = INT_MAX;
573 else
0942c7ab
NC
574 {
575 width_remaining = width;
576 if (! do_not_show_symbol_truncation
577 && (int) strlen (symbol) > width)
578 {
579 width_remaining -= 5;
580 if ((int) width_remaining < 0)
581 width_remaining = 0;
582 do_dots = TRUE;
583 }
584 }
cb8f3167 585
3bfcb652 586#ifdef HAVE_MBSTATE_T
7bfd842d
NC
587 /* Initialise the multibyte conversion state. */
588 memset (& state, 0, sizeof (state));
3bfcb652 589#endif
961c521f 590
79bc120c
NC
591 if (do_demangle && *symbol)
592 {
593 const char * res = cplus_demangle (symbol, demangle_flags);
594
595 if (res != NULL)
596 alloced_symbol = symbol = res;
597 }
598
7bfd842d
NC
599 while (width_remaining)
600 {
601 size_t n;
7bfd842d 602 const char c = *symbol++;
961c521f 603
7bfd842d 604 if (c == 0)
961c521f
NC
605 break;
606
7bfd842d
NC
607 /* Do not print control characters directly as they can affect terminal
608 settings. Such characters usually appear in the names generated
609 by the assembler for local labels. */
610 if (ISCNTRL (c))
961c521f 611 {
7bfd842d 612 if (width_remaining < 2)
961c521f
NC
613 break;
614
7bfd842d
NC
615 printf ("^%c", c + 0x40);
616 width_remaining -= 2;
171191ba 617 num_printed += 2;
961c521f 618 }
7bfd842d
NC
619 else if (ISPRINT (c))
620 {
621 putchar (c);
622 width_remaining --;
623 num_printed ++;
624 }
961c521f
NC
625 else
626 {
3bfcb652
NC
627#ifdef HAVE_MBSTATE_T
628 wchar_t w;
629#endif
7bfd842d
NC
630 /* Let printf do the hard work of displaying multibyte characters. */
631 printf ("%.1s", symbol - 1);
632 width_remaining --;
633 num_printed ++;
634
3bfcb652 635#ifdef HAVE_MBSTATE_T
7bfd842d
NC
636 /* Try to find out how many bytes made up the character that was
637 just printed. Advance the symbol pointer past the bytes that
638 were displayed. */
639 n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
3bfcb652
NC
640#else
641 n = 1;
642#endif
7bfd842d
NC
643 if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
644 symbol += (n - 1);
961c521f 645 }
961c521f 646 }
171191ba 647
0942c7ab
NC
648 if (do_dots)
649 num_printed += printf ("[...]");
650
7bfd842d 651 if (extra_padding && num_printed < width)
171191ba
NC
652 {
653 /* Fill in the remaining spaces. */
7bfd842d
NC
654 printf ("%-*s", width - num_printed, " ");
655 num_printed = width;
171191ba
NC
656 }
657
79bc120c 658 free ((void *) alloced_symbol);
171191ba 659 return num_printed;
31104126
NC
660}
661
1449284b 662/* Returns a pointer to a static buffer containing a printable version of
74e1a04b
NC
663 the given section's name. Like print_symbol, except that it does not try
664 to print multibyte characters, it just interprets them as hex values. */
665
666static const char *
dda8d76d 667printable_section_name (Filedata * filedata, const Elf_Internal_Shdr * sec)
74e1a04b
NC
668{
669#define MAX_PRINT_SEC_NAME_LEN 128
670 static char sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
671 const char * name = SECTION_NAME (sec);
672 char * buf = sec_name_buf;
673 char c;
674 unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
675
676 while ((c = * name ++) != 0)
677 {
678 if (ISCNTRL (c))
679 {
680 if (remaining < 2)
681 break;
948f632f 682
74e1a04b
NC
683 * buf ++ = '^';
684 * buf ++ = c + 0x40;
685 remaining -= 2;
686 }
687 else if (ISPRINT (c))
688 {
689 * buf ++ = c;
690 remaining -= 1;
691 }
692 else
693 {
694 static char hex[17] = "0123456789ABCDEF";
695
696 if (remaining < 4)
697 break;
698 * buf ++ = '<';
699 * buf ++ = hex[(c & 0xf0) >> 4];
700 * buf ++ = hex[c & 0x0f];
701 * buf ++ = '>';
702 remaining -= 4;
703 }
704
705 if (remaining == 0)
706 break;
707 }
708
709 * buf = 0;
710 return sec_name_buf;
711}
712
713static const char *
dda8d76d 714printable_section_name_from_index (Filedata * filedata, unsigned long ndx)
74e1a04b 715{
dda8d76d 716 if (ndx >= filedata->file_header.e_shnum)
74e1a04b
NC
717 return _("<corrupt>");
718
dda8d76d 719 return printable_section_name (filedata, filedata->section_headers + ndx);
74e1a04b
NC
720}
721
89fac5e3
RS
722/* Return a pointer to section NAME, or NULL if no such section exists. */
723
724static Elf_Internal_Shdr *
dda8d76d 725find_section (Filedata * filedata, const char * name)
89fac5e3
RS
726{
727 unsigned int i;
728
68807c3c
NC
729 if (filedata->section_headers == NULL)
730 return NULL;
dda8d76d
NC
731
732 for (i = 0; i < filedata->file_header.e_shnum; i++)
733 if (streq (SECTION_NAME (filedata->section_headers + i), name))
734 return filedata->section_headers + i;
89fac5e3
RS
735
736 return NULL;
737}
738
0b6ae522
DJ
739/* Return a pointer to a section containing ADDR, or NULL if no such
740 section exists. */
741
742static Elf_Internal_Shdr *
dda8d76d 743find_section_by_address (Filedata * filedata, bfd_vma addr)
0b6ae522
DJ
744{
745 unsigned int i;
746
68807c3c
NC
747 if (filedata->section_headers == NULL)
748 return NULL;
749
dda8d76d 750 for (i = 0; i < filedata->file_header.e_shnum; i++)
0b6ae522 751 {
dda8d76d
NC
752 Elf_Internal_Shdr *sec = filedata->section_headers + i;
753
0b6ae522
DJ
754 if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
755 return sec;
756 }
757
758 return NULL;
759}
760
071436c6 761static Elf_Internal_Shdr *
dda8d76d 762find_section_by_type (Filedata * filedata, unsigned int type)
071436c6
NC
763{
764 unsigned int i;
765
68807c3c
NC
766 if (filedata->section_headers == NULL)
767 return NULL;
768
dda8d76d 769 for (i = 0; i < filedata->file_header.e_shnum; i++)
071436c6 770 {
dda8d76d
NC
771 Elf_Internal_Shdr *sec = filedata->section_headers + i;
772
071436c6
NC
773 if (sec->sh_type == type)
774 return sec;
775 }
776
777 return NULL;
778}
779
657d0d47
CC
780/* Return a pointer to section NAME, or NULL if no such section exists,
781 restricted to the list of sections given in SET. */
782
783static Elf_Internal_Shdr *
dda8d76d 784find_section_in_set (Filedata * filedata, const char * name, unsigned int * set)
657d0d47
CC
785{
786 unsigned int i;
787
68807c3c
NC
788 if (filedata->section_headers == NULL)
789 return NULL;
790
657d0d47
CC
791 if (set != NULL)
792 {
793 while ((i = *set++) > 0)
b814a36d
NC
794 {
795 /* See PR 21156 for a reproducer. */
dda8d76d 796 if (i >= filedata->file_header.e_shnum)
b814a36d
NC
797 continue; /* FIXME: Should we issue an error message ? */
798
dda8d76d
NC
799 if (streq (SECTION_NAME (filedata->section_headers + i), name))
800 return filedata->section_headers + i;
b814a36d 801 }
657d0d47
CC
802 }
803
dda8d76d 804 return find_section (filedata, name);
657d0d47
CC
805}
806
32ec8896 807/* Return TRUE if the current file is for IA-64 machine and OpenVMS ABI.
28f997cf
TG
808 This OS has so many departures from the ELF standard that we test it at
809 many places. */
810
32ec8896 811static inline bfd_boolean
dda8d76d 812is_ia64_vms (Filedata * filedata)
28f997cf 813{
dda8d76d
NC
814 return filedata->file_header.e_machine == EM_IA_64
815 && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
28f997cf
TG
816}
817
bcedfee6 818/* Guess the relocation size commonly used by the specific machines. */
252b5132 819
32ec8896 820static bfd_boolean
2dc4cec1 821guess_is_rela (unsigned int e_machine)
252b5132 822{
9c19a809 823 switch (e_machine)
252b5132
RH
824 {
825 /* Targets that use REL relocations. */
252b5132 826 case EM_386:
22abe556 827 case EM_IAMCU:
f954747f 828 case EM_960:
e9f53129 829 case EM_ARM:
2b0337b0 830 case EM_D10V:
252b5132 831 case EM_CYGNUS_D10V:
e9f53129 832 case EM_DLX:
252b5132 833 case EM_MIPS:
4fe85591 834 case EM_MIPS_RS3_LE:
e9f53129 835 case EM_CYGNUS_M32R:
1c0d3aa6 836 case EM_SCORE:
f6c1a2d5 837 case EM_XGATE:
fe944acf 838 case EM_NFP:
aca4efc7 839 case EM_BPF:
9c19a809 840 return FALSE;
103f02d3 841
252b5132
RH
842 /* Targets that use RELA relocations. */
843 case EM_68K:
f954747f 844 case EM_860:
a06ea964 845 case EM_AARCH64:
cfb8c092 846 case EM_ADAPTEVA_EPIPHANY:
e9f53129
AM
847 case EM_ALPHA:
848 case EM_ALTERA_NIOS2:
886a2506
NC
849 case EM_ARC:
850 case EM_ARC_COMPACT:
851 case EM_ARC_COMPACT2:
e9f53129
AM
852 case EM_AVR:
853 case EM_AVR_OLD:
854 case EM_BLACKFIN:
60bca95a 855 case EM_CR16:
e9f53129
AM
856 case EM_CRIS:
857 case EM_CRX:
b8891f8d 858 case EM_CSKY:
2b0337b0 859 case EM_D30V:
252b5132 860 case EM_CYGNUS_D30V:
2b0337b0 861 case EM_FR30:
3f8107ab 862 case EM_FT32:
252b5132 863 case EM_CYGNUS_FR30:
5c70f934 864 case EM_CYGNUS_FRV:
e9f53129
AM
865 case EM_H8S:
866 case EM_H8_300:
867 case EM_H8_300H:
800eeca4 868 case EM_IA_64:
1e4cf259
NC
869 case EM_IP2K:
870 case EM_IP2K_OLD:
3b36097d 871 case EM_IQ2000:
84e94c90 872 case EM_LATTICEMICO32:
ff7eeb89 873 case EM_M32C_OLD:
49f58d10 874 case EM_M32C:
e9f53129
AM
875 case EM_M32R:
876 case EM_MCORE:
15ab5209 877 case EM_CYGNUS_MEP:
a3c62988 878 case EM_METAG:
e9f53129
AM
879 case EM_MMIX:
880 case EM_MN10200:
881 case EM_CYGNUS_MN10200:
882 case EM_MN10300:
883 case EM_CYGNUS_MN10300:
5506d11a 884 case EM_MOXIE:
e9f53129
AM
885 case EM_MSP430:
886 case EM_MSP430_OLD:
d031aafb 887 case EM_MT:
35c08157 888 case EM_NDS32:
64fd6348 889 case EM_NIOS32:
73589c9d 890 case EM_OR1K:
e9f53129
AM
891 case EM_PPC64:
892 case EM_PPC:
2b100bb5 893 case EM_TI_PRU:
e23eba97 894 case EM_RISCV:
99c513f6 895 case EM_RL78:
c7927a3c 896 case EM_RX:
e9f53129
AM
897 case EM_S390:
898 case EM_S390_OLD:
899 case EM_SH:
900 case EM_SPARC:
901 case EM_SPARC32PLUS:
902 case EM_SPARCV9:
903 case EM_SPU:
40b36596 904 case EM_TI_C6000:
aa137e4d
NC
905 case EM_TILEGX:
906 case EM_TILEPRO:
708e2187 907 case EM_V800:
e9f53129
AM
908 case EM_V850:
909 case EM_CYGNUS_V850:
910 case EM_VAX:
619ed720 911 case EM_VISIUM:
e9f53129 912 case EM_X86_64:
8a9036a4 913 case EM_L1OM:
7a9068fe 914 case EM_K1OM:
e9f53129
AM
915 case EM_XSTORMY16:
916 case EM_XTENSA:
917 case EM_XTENSA_OLD:
7ba29e2a
NC
918 case EM_MICROBLAZE:
919 case EM_MICROBLAZE_OLD:
f96bd6c2 920 case EM_WEBASSEMBLY:
9c19a809 921 return TRUE;
103f02d3 922
e9f53129
AM
923 case EM_68HC05:
924 case EM_68HC08:
925 case EM_68HC11:
926 case EM_68HC16:
927 case EM_FX66:
928 case EM_ME16:
d1133906 929 case EM_MMA:
d1133906
NC
930 case EM_NCPU:
931 case EM_NDR1:
e9f53129 932 case EM_PCP:
d1133906 933 case EM_ST100:
e9f53129 934 case EM_ST19:
d1133906 935 case EM_ST7:
e9f53129
AM
936 case EM_ST9PLUS:
937 case EM_STARCORE:
d1133906 938 case EM_SVX:
e9f53129 939 case EM_TINYJ:
9c19a809
NC
940 default:
941 warn (_("Don't know about relocations on this machine architecture\n"));
942 return FALSE;
943 }
944}
252b5132 945
dda8d76d 946/* Load RELA type relocations from FILEDATA at REL_OFFSET extending for REL_SIZE bytes.
32ec8896
NC
947 Returns TRUE upon success, FALSE otherwise. If successful then a
948 pointer to a malloc'ed buffer containing the relocs is placed in *RELASP,
949 and the number of relocs loaded is placed in *NRELASP. It is the caller's
950 responsibility to free the allocated buffer. */
951
952static bfd_boolean
dda8d76d
NC
953slurp_rela_relocs (Filedata * filedata,
954 unsigned long rel_offset,
955 unsigned long rel_size,
956 Elf_Internal_Rela ** relasp,
957 unsigned long * nrelasp)
9c19a809 958{
2cf0635d 959 Elf_Internal_Rela * relas;
8b73c356 960 size_t nrelas;
4d6ed7c8 961 unsigned int i;
252b5132 962
4d6ed7c8
NC
963 if (is_32bit_elf)
964 {
2cf0635d 965 Elf32_External_Rela * erelas;
103f02d3 966
dda8d76d 967 erelas = (Elf32_External_Rela *) get_data (NULL, filedata, rel_offset, 1,
9cf03b7e 968 rel_size, _("32-bit relocation data"));
a6e9f9df 969 if (!erelas)
32ec8896 970 return FALSE;
252b5132 971
4d6ed7c8 972 nrelas = rel_size / sizeof (Elf32_External_Rela);
103f02d3 973
3f5e193b
NC
974 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
975 sizeof (Elf_Internal_Rela));
103f02d3 976
4d6ed7c8
NC
977 if (relas == NULL)
978 {
c256ffe7 979 free (erelas);
591a748a 980 error (_("out of memory parsing relocs\n"));
32ec8896 981 return FALSE;
4d6ed7c8 982 }
103f02d3 983
4d6ed7c8
NC
984 for (i = 0; i < nrelas; i++)
985 {
986 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
987 relas[i].r_info = BYTE_GET (erelas[i].r_info);
598aaa76 988 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
4d6ed7c8 989 }
103f02d3 990
4d6ed7c8
NC
991 free (erelas);
992 }
993 else
994 {
2cf0635d 995 Elf64_External_Rela * erelas;
103f02d3 996
dda8d76d 997 erelas = (Elf64_External_Rela *) get_data (NULL, filedata, rel_offset, 1,
9cf03b7e 998 rel_size, _("64-bit relocation data"));
a6e9f9df 999 if (!erelas)
32ec8896 1000 return FALSE;
4d6ed7c8
NC
1001
1002 nrelas = rel_size / sizeof (Elf64_External_Rela);
103f02d3 1003
3f5e193b
NC
1004 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
1005 sizeof (Elf_Internal_Rela));
103f02d3 1006
4d6ed7c8
NC
1007 if (relas == NULL)
1008 {
c256ffe7 1009 free (erelas);
591a748a 1010 error (_("out of memory parsing relocs\n"));
32ec8896 1011 return FALSE;
9c19a809 1012 }
4d6ed7c8
NC
1013
1014 for (i = 0; i < nrelas; i++)
9c19a809 1015 {
66543521
AM
1016 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
1017 relas[i].r_info = BYTE_GET (erelas[i].r_info);
598aaa76 1018 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
861fb55a
DJ
1019
1020 /* The #ifdef BFD64 below is to prevent a compile time
1021 warning. We know that if we do not have a 64 bit data
1022 type that we will never execute this code anyway. */
1023#ifdef BFD64
dda8d76d
NC
1024 if (filedata->file_header.e_machine == EM_MIPS
1025 && filedata->file_header.e_ident[EI_DATA] != ELFDATA2MSB)
861fb55a
DJ
1026 {
1027 /* In little-endian objects, r_info isn't really a
1028 64-bit little-endian value: it has a 32-bit
1029 little-endian symbol index followed by four
1030 individual byte fields. Reorder INFO
1031 accordingly. */
91d6fa6a
NC
1032 bfd_vma inf = relas[i].r_info;
1033 inf = (((inf & 0xffffffff) << 32)
1034 | ((inf >> 56) & 0xff)
1035 | ((inf >> 40) & 0xff00)
1036 | ((inf >> 24) & 0xff0000)
1037 | ((inf >> 8) & 0xff000000));
1038 relas[i].r_info = inf;
861fb55a
DJ
1039 }
1040#endif /* BFD64 */
4d6ed7c8 1041 }
103f02d3 1042
4d6ed7c8
NC
1043 free (erelas);
1044 }
32ec8896 1045
4d6ed7c8
NC
1046 *relasp = relas;
1047 *nrelasp = nrelas;
32ec8896 1048 return TRUE;
4d6ed7c8 1049}
103f02d3 1050
dda8d76d 1051/* Load REL type relocations from FILEDATA at REL_OFFSET extending for REL_SIZE bytes.
32ec8896
NC
1052 Returns TRUE upon success, FALSE otherwise. If successful then a
1053 pointer to a malloc'ed buffer containing the relocs is placed in *RELSP,
1054 and the number of relocs loaded is placed in *NRELSP. It is the caller's
1055 responsibility to free the allocated buffer. */
1056
1057static bfd_boolean
dda8d76d
NC
1058slurp_rel_relocs (Filedata * filedata,
1059 unsigned long rel_offset,
1060 unsigned long rel_size,
1061 Elf_Internal_Rela ** relsp,
1062 unsigned long * nrelsp)
4d6ed7c8 1063{
2cf0635d 1064 Elf_Internal_Rela * rels;
8b73c356 1065 size_t nrels;
4d6ed7c8 1066 unsigned int i;
103f02d3 1067
4d6ed7c8
NC
1068 if (is_32bit_elf)
1069 {
2cf0635d 1070 Elf32_External_Rel * erels;
103f02d3 1071
dda8d76d 1072 erels = (Elf32_External_Rel *) get_data (NULL, filedata, rel_offset, 1,
9cf03b7e 1073 rel_size, _("32-bit relocation data"));
a6e9f9df 1074 if (!erels)
32ec8896 1075 return FALSE;
103f02d3 1076
4d6ed7c8 1077 nrels = rel_size / sizeof (Elf32_External_Rel);
103f02d3 1078
3f5e193b 1079 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
103f02d3 1080
4d6ed7c8
NC
1081 if (rels == NULL)
1082 {
c256ffe7 1083 free (erels);
591a748a 1084 error (_("out of memory parsing relocs\n"));
32ec8896 1085 return FALSE;
4d6ed7c8
NC
1086 }
1087
1088 for (i = 0; i < nrels; i++)
1089 {
1090 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
1091 rels[i].r_info = BYTE_GET (erels[i].r_info);
c8286bd1 1092 rels[i].r_addend = 0;
9ea033b2 1093 }
4d6ed7c8
NC
1094
1095 free (erels);
9c19a809
NC
1096 }
1097 else
1098 {
2cf0635d 1099 Elf64_External_Rel * erels;
9ea033b2 1100
dda8d76d 1101 erels = (Elf64_External_Rel *) get_data (NULL, filedata, rel_offset, 1,
9cf03b7e 1102 rel_size, _("64-bit relocation data"));
a6e9f9df 1103 if (!erels)
32ec8896 1104 return FALSE;
103f02d3 1105
4d6ed7c8 1106 nrels = rel_size / sizeof (Elf64_External_Rel);
103f02d3 1107
3f5e193b 1108 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
103f02d3 1109
4d6ed7c8 1110 if (rels == NULL)
9c19a809 1111 {
c256ffe7 1112 free (erels);
591a748a 1113 error (_("out of memory parsing relocs\n"));
32ec8896 1114 return FALSE;
4d6ed7c8 1115 }
103f02d3 1116
4d6ed7c8
NC
1117 for (i = 0; i < nrels; i++)
1118 {
66543521
AM
1119 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
1120 rels[i].r_info = BYTE_GET (erels[i].r_info);
c8286bd1 1121 rels[i].r_addend = 0;
861fb55a
DJ
1122
1123 /* The #ifdef BFD64 below is to prevent a compile time
1124 warning. We know that if we do not have a 64 bit data
1125 type that we will never execute this code anyway. */
1126#ifdef BFD64
dda8d76d
NC
1127 if (filedata->file_header.e_machine == EM_MIPS
1128 && filedata->file_header.e_ident[EI_DATA] != ELFDATA2MSB)
861fb55a
DJ
1129 {
1130 /* In little-endian objects, r_info isn't really a
1131 64-bit little-endian value: it has a 32-bit
1132 little-endian symbol index followed by four
1133 individual byte fields. Reorder INFO
1134 accordingly. */
91d6fa6a
NC
1135 bfd_vma inf = rels[i].r_info;
1136 inf = (((inf & 0xffffffff) << 32)
1137 | ((inf >> 56) & 0xff)
1138 | ((inf >> 40) & 0xff00)
1139 | ((inf >> 24) & 0xff0000)
1140 | ((inf >> 8) & 0xff000000));
1141 rels[i].r_info = inf;
861fb55a
DJ
1142 }
1143#endif /* BFD64 */
4d6ed7c8 1144 }
103f02d3 1145
4d6ed7c8
NC
1146 free (erels);
1147 }
32ec8896 1148
4d6ed7c8
NC
1149 *relsp = rels;
1150 *nrelsp = nrels;
32ec8896 1151 return TRUE;
4d6ed7c8 1152}
103f02d3 1153
aca88567
NC
1154/* Returns the reloc type extracted from the reloc info field. */
1155
1156static unsigned int
dda8d76d 1157get_reloc_type (Filedata * filedata, bfd_vma reloc_info)
aca88567
NC
1158{
1159 if (is_32bit_elf)
1160 return ELF32_R_TYPE (reloc_info);
1161
dda8d76d 1162 switch (filedata->file_header.e_machine)
aca88567
NC
1163 {
1164 case EM_MIPS:
1165 /* Note: We assume that reloc_info has already been adjusted for us. */
1166 return ELF64_MIPS_R_TYPE (reloc_info);
1167
1168 case EM_SPARCV9:
1169 return ELF64_R_TYPE_ID (reloc_info);
1170
1171 default:
1172 return ELF64_R_TYPE (reloc_info);
1173 }
1174}
1175
1176/* Return the symbol index extracted from the reloc info field. */
1177
1178static bfd_vma
1179get_reloc_symindex (bfd_vma reloc_info)
1180{
1181 return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
1182}
1183
13761a11 1184static inline bfd_boolean
dda8d76d 1185uses_msp430x_relocs (Filedata * filedata)
13761a11
NC
1186{
1187 return
dda8d76d 1188 filedata->file_header.e_machine == EM_MSP430 /* Paranoia. */
13761a11 1189 /* GCC uses osabi == ELFOSBI_STANDALONE. */
dda8d76d 1190 && (((filedata->file_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
13761a11 1191 /* TI compiler uses ELFOSABI_NONE. */
dda8d76d 1192 || (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
13761a11
NC
1193}
1194
d3ba0551
AM
1195/* Display the contents of the relocation data found at the specified
1196 offset. */
ee42cf8c 1197
32ec8896 1198static bfd_boolean
dda8d76d
NC
1199dump_relocations (Filedata * filedata,
1200 unsigned long rel_offset,
1201 unsigned long rel_size,
1202 Elf_Internal_Sym * symtab,
1203 unsigned long nsyms,
1204 char * strtab,
1205 unsigned long strtablen,
1206 int is_rela,
1207 bfd_boolean is_dynsym)
4d6ed7c8 1208{
32ec8896 1209 unsigned long i;
2cf0635d 1210 Elf_Internal_Rela * rels;
32ec8896 1211 bfd_boolean res = TRUE;
103f02d3 1212
4d6ed7c8 1213 if (is_rela == UNKNOWN)
dda8d76d 1214 is_rela = guess_is_rela (filedata->file_header.e_machine);
103f02d3 1215
4d6ed7c8
NC
1216 if (is_rela)
1217 {
dda8d76d 1218 if (!slurp_rela_relocs (filedata, rel_offset, rel_size, &rels, &rel_size))
32ec8896 1219 return FALSE;
4d6ed7c8
NC
1220 }
1221 else
1222 {
dda8d76d 1223 if (!slurp_rel_relocs (filedata, rel_offset, rel_size, &rels, &rel_size))
32ec8896 1224 return FALSE;
252b5132
RH
1225 }
1226
410f7a12
L
1227 if (is_32bit_elf)
1228 {
1229 if (is_rela)
2c71103e
NC
1230 {
1231 if (do_wide)
1232 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
1233 else
1234 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
1235 }
410f7a12 1236 else
2c71103e
NC
1237 {
1238 if (do_wide)
1239 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
1240 else
1241 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
1242 }
410f7a12 1243 }
252b5132 1244 else
410f7a12
L
1245 {
1246 if (is_rela)
2c71103e
NC
1247 {
1248 if (do_wide)
8beeaeb7 1249 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
2c71103e
NC
1250 else
1251 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
1252 }
410f7a12 1253 else
2c71103e
NC
1254 {
1255 if (do_wide)
8beeaeb7 1256 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
2c71103e
NC
1257 else
1258 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
1259 }
410f7a12 1260 }
252b5132
RH
1261
1262 for (i = 0; i < rel_size; i++)
1263 {
2cf0635d 1264 const char * rtype;
b34976b6 1265 bfd_vma offset;
91d6fa6a 1266 bfd_vma inf;
b34976b6
AM
1267 bfd_vma symtab_index;
1268 bfd_vma type;
103f02d3 1269
b34976b6 1270 offset = rels[i].r_offset;
91d6fa6a 1271 inf = rels[i].r_info;
103f02d3 1272
dda8d76d 1273 type = get_reloc_type (filedata, inf);
91d6fa6a 1274 symtab_index = get_reloc_symindex (inf);
252b5132 1275
410f7a12
L
1276 if (is_32bit_elf)
1277 {
39dbeff8
AM
1278 printf ("%8.8lx %8.8lx ",
1279 (unsigned long) offset & 0xffffffff,
91d6fa6a 1280 (unsigned long) inf & 0xffffffff);
410f7a12
L
1281 }
1282 else
1283 {
39dbeff8 1284 printf (do_wide
d1ce973e
AM
1285 ? "%16.16" BFD_VMA_FMT "x %16.16" BFD_VMA_FMT "x "
1286 : "%12.12" BFD_VMA_FMT "x %12.12" BFD_VMA_FMT "x ",
91d6fa6a 1287 offset, inf);
410f7a12 1288 }
103f02d3 1289
dda8d76d 1290 switch (filedata->file_header.e_machine)
252b5132
RH
1291 {
1292 default:
1293 rtype = NULL;
1294 break;
1295
a06ea964
NC
1296 case EM_AARCH64:
1297 rtype = elf_aarch64_reloc_type (type);
1298 break;
1299
2b0337b0 1300 case EM_M32R:
252b5132 1301 case EM_CYGNUS_M32R:
9ea033b2 1302 rtype = elf_m32r_reloc_type (type);
252b5132
RH
1303 break;
1304
1305 case EM_386:
22abe556 1306 case EM_IAMCU:
9ea033b2 1307 rtype = elf_i386_reloc_type (type);
252b5132
RH
1308 break;
1309
ba2685cc
AM
1310 case EM_68HC11:
1311 case EM_68HC12:
1312 rtype = elf_m68hc11_reloc_type (type);
1313 break;
75751cd9 1314
7b4ae824
JD
1315 case EM_S12Z:
1316 rtype = elf_s12z_reloc_type (type);
1317 break;
1318
252b5132 1319 case EM_68K:
9ea033b2 1320 rtype = elf_m68k_reloc_type (type);
252b5132
RH
1321 break;
1322
f954747f
AM
1323 case EM_960:
1324 rtype = elf_i960_reloc_type (type);
1325 break;
1326
adde6300 1327 case EM_AVR:
2b0337b0 1328 case EM_AVR_OLD:
adde6300
AM
1329 rtype = elf_avr_reloc_type (type);
1330 break;
1331
9ea033b2
NC
1332 case EM_OLD_SPARCV9:
1333 case EM_SPARC32PLUS:
1334 case EM_SPARCV9:
252b5132 1335 case EM_SPARC:
9ea033b2 1336 rtype = elf_sparc_reloc_type (type);
252b5132
RH
1337 break;
1338
e9f53129
AM
1339 case EM_SPU:
1340 rtype = elf_spu_reloc_type (type);
1341 break;
1342
708e2187
NC
1343 case EM_V800:
1344 rtype = v800_reloc_type (type);
1345 break;
2b0337b0 1346 case EM_V850:
252b5132 1347 case EM_CYGNUS_V850:
9ea033b2 1348 rtype = v850_reloc_type (type);
252b5132
RH
1349 break;
1350
2b0337b0 1351 case EM_D10V:
252b5132 1352 case EM_CYGNUS_D10V:
9ea033b2 1353 rtype = elf_d10v_reloc_type (type);
252b5132
RH
1354 break;
1355
2b0337b0 1356 case EM_D30V:
252b5132 1357 case EM_CYGNUS_D30V:
9ea033b2 1358 rtype = elf_d30v_reloc_type (type);
252b5132
RH
1359 break;
1360
d172d4ba
NC
1361 case EM_DLX:
1362 rtype = elf_dlx_reloc_type (type);
1363 break;
1364
252b5132 1365 case EM_SH:
9ea033b2 1366 rtype = elf_sh_reloc_type (type);
252b5132
RH
1367 break;
1368
2b0337b0 1369 case EM_MN10300:
252b5132 1370 case EM_CYGNUS_MN10300:
9ea033b2 1371 rtype = elf_mn10300_reloc_type (type);
252b5132
RH
1372 break;
1373
2b0337b0 1374 case EM_MN10200:
252b5132 1375 case EM_CYGNUS_MN10200:
9ea033b2 1376 rtype = elf_mn10200_reloc_type (type);
252b5132
RH
1377 break;
1378
2b0337b0 1379 case EM_FR30:
252b5132 1380 case EM_CYGNUS_FR30:
9ea033b2 1381 rtype = elf_fr30_reloc_type (type);
252b5132
RH
1382 break;
1383
ba2685cc
AM
1384 case EM_CYGNUS_FRV:
1385 rtype = elf_frv_reloc_type (type);
1386 break;
5c70f934 1387
b8891f8d
AJ
1388 case EM_CSKY:
1389 rtype = elf_csky_reloc_type (type);
1390 break;
1391
3f8107ab
AM
1392 case EM_FT32:
1393 rtype = elf_ft32_reloc_type (type);
1394 break;
1395
252b5132 1396 case EM_MCORE:
9ea033b2 1397 rtype = elf_mcore_reloc_type (type);
252b5132
RH
1398 break;
1399
3c3bdf30
NC
1400 case EM_MMIX:
1401 rtype = elf_mmix_reloc_type (type);
1402 break;
1403
5506d11a
AM
1404 case EM_MOXIE:
1405 rtype = elf_moxie_reloc_type (type);
1406 break;
1407
2469cfa2 1408 case EM_MSP430:
dda8d76d 1409 if (uses_msp430x_relocs (filedata))
13761a11
NC
1410 {
1411 rtype = elf_msp430x_reloc_type (type);
1412 break;
1413 }
1a0670f3 1414 /* Fall through. */
2469cfa2
NC
1415 case EM_MSP430_OLD:
1416 rtype = elf_msp430_reloc_type (type);
1417 break;
1418
35c08157
KLC
1419 case EM_NDS32:
1420 rtype = elf_nds32_reloc_type (type);
1421 break;
1422
252b5132 1423 case EM_PPC:
9ea033b2 1424 rtype = elf_ppc_reloc_type (type);
252b5132
RH
1425 break;
1426
c833c019
AM
1427 case EM_PPC64:
1428 rtype = elf_ppc64_reloc_type (type);
1429 break;
1430
252b5132 1431 case EM_MIPS:
4fe85591 1432 case EM_MIPS_RS3_LE:
9ea033b2 1433 rtype = elf_mips_reloc_type (type);
252b5132
RH
1434 break;
1435
e23eba97
NC
1436 case EM_RISCV:
1437 rtype = elf_riscv_reloc_type (type);
1438 break;
1439
252b5132 1440 case EM_ALPHA:
9ea033b2 1441 rtype = elf_alpha_reloc_type (type);
252b5132
RH
1442 break;
1443
1444 case EM_ARM:
9ea033b2 1445 rtype = elf_arm_reloc_type (type);
252b5132
RH
1446 break;
1447
584da044 1448 case EM_ARC:
886a2506
NC
1449 case EM_ARC_COMPACT:
1450 case EM_ARC_COMPACT2:
9ea033b2 1451 rtype = elf_arc_reloc_type (type);
252b5132
RH
1452 break;
1453
1454 case EM_PARISC:
69e617ca 1455 rtype = elf_hppa_reloc_type (type);
252b5132 1456 break;
7d466069 1457
b8720f9d
JL
1458 case EM_H8_300:
1459 case EM_H8_300H:
1460 case EM_H8S:
1461 rtype = elf_h8_reloc_type (type);
1462 break;
1463
73589c9d
CS
1464 case EM_OR1K:
1465 rtype = elf_or1k_reloc_type (type);
3b16e843
NC
1466 break;
1467
7d466069 1468 case EM_PJ:
2b0337b0 1469 case EM_PJ_OLD:
7d466069
ILT
1470 rtype = elf_pj_reloc_type (type);
1471 break;
800eeca4
JW
1472 case EM_IA_64:
1473 rtype = elf_ia64_reloc_type (type);
1474 break;
1b61cf92
HPN
1475
1476 case EM_CRIS:
1477 rtype = elf_cris_reloc_type (type);
1478 break;
535c37ff 1479
f954747f
AM
1480 case EM_860:
1481 rtype = elf_i860_reloc_type (type);
1482 break;
1483
bcedfee6 1484 case EM_X86_64:
8a9036a4 1485 case EM_L1OM:
7a9068fe 1486 case EM_K1OM:
bcedfee6
NC
1487 rtype = elf_x86_64_reloc_type (type);
1488 break;
a85d7ed0 1489
f954747f
AM
1490 case EM_S370:
1491 rtype = i370_reloc_type (type);
1492 break;
1493
53c7db4b
KH
1494 case EM_S390_OLD:
1495 case EM_S390:
1496 rtype = elf_s390_reloc_type (type);
1497 break;
93fbbb04 1498
1c0d3aa6
NC
1499 case EM_SCORE:
1500 rtype = elf_score_reloc_type (type);
1501 break;
1502
93fbbb04
GK
1503 case EM_XSTORMY16:
1504 rtype = elf_xstormy16_reloc_type (type);
1505 break;
179d3252 1506
1fe1f39c
NC
1507 case EM_CRX:
1508 rtype = elf_crx_reloc_type (type);
1509 break;
1510
179d3252
JT
1511 case EM_VAX:
1512 rtype = elf_vax_reloc_type (type);
1513 break;
1e4cf259 1514
619ed720
EB
1515 case EM_VISIUM:
1516 rtype = elf_visium_reloc_type (type);
1517 break;
1518
aca4efc7
JM
1519 case EM_BPF:
1520 rtype = elf_bpf_reloc_type (type);
1521 break;
1522
cfb8c092
NC
1523 case EM_ADAPTEVA_EPIPHANY:
1524 rtype = elf_epiphany_reloc_type (type);
1525 break;
1526
1e4cf259
NC
1527 case EM_IP2K:
1528 case EM_IP2K_OLD:
1529 rtype = elf_ip2k_reloc_type (type);
1530 break;
3b36097d
SC
1531
1532 case EM_IQ2000:
1533 rtype = elf_iq2000_reloc_type (type);
1534 break;
88da6820
NC
1535
1536 case EM_XTENSA_OLD:
1537 case EM_XTENSA:
1538 rtype = elf_xtensa_reloc_type (type);
1539 break;
a34e3ecb 1540
84e94c90
NC
1541 case EM_LATTICEMICO32:
1542 rtype = elf_lm32_reloc_type (type);
1543 break;
1544
ff7eeb89 1545 case EM_M32C_OLD:
49f58d10
JB
1546 case EM_M32C:
1547 rtype = elf_m32c_reloc_type (type);
1548 break;
1549
d031aafb
NS
1550 case EM_MT:
1551 rtype = elf_mt_reloc_type (type);
a34e3ecb 1552 break;
1d65ded4
CM
1553
1554 case EM_BLACKFIN:
1555 rtype = elf_bfin_reloc_type (type);
1556 break;
15ab5209
DB
1557
1558 case EM_CYGNUS_MEP:
1559 rtype = elf_mep_reloc_type (type);
1560 break;
60bca95a
NC
1561
1562 case EM_CR16:
1563 rtype = elf_cr16_reloc_type (type);
1564 break;
dd24e3da 1565
7ba29e2a
NC
1566 case EM_MICROBLAZE:
1567 case EM_MICROBLAZE_OLD:
1568 rtype = elf_microblaze_reloc_type (type);
1569 break;
c7927a3c 1570
99c513f6
DD
1571 case EM_RL78:
1572 rtype = elf_rl78_reloc_type (type);
1573 break;
1574
c7927a3c
NC
1575 case EM_RX:
1576 rtype = elf_rx_reloc_type (type);
1577 break;
c29aca4a 1578
a3c62988
NC
1579 case EM_METAG:
1580 rtype = elf_metag_reloc_type (type);
1581 break;
1582
c29aca4a
NC
1583 case EM_XC16X:
1584 case EM_C166:
1585 rtype = elf_xc16x_reloc_type (type);
1586 break;
40b36596
JM
1587
1588 case EM_TI_C6000:
1589 rtype = elf_tic6x_reloc_type (type);
1590 break;
aa137e4d
NC
1591
1592 case EM_TILEGX:
1593 rtype = elf_tilegx_reloc_type (type);
1594 break;
1595
1596 case EM_TILEPRO:
1597 rtype = elf_tilepro_reloc_type (type);
1598 break;
f6c1a2d5 1599
f96bd6c2
PC
1600 case EM_WEBASSEMBLY:
1601 rtype = elf_wasm32_reloc_type (type);
1602 break;
1603
f6c1a2d5
NC
1604 case EM_XGATE:
1605 rtype = elf_xgate_reloc_type (type);
1606 break;
36591ba1
SL
1607
1608 case EM_ALTERA_NIOS2:
1609 rtype = elf_nios2_reloc_type (type);
1610 break;
2b100bb5
DD
1611
1612 case EM_TI_PRU:
1613 rtype = elf_pru_reloc_type (type);
1614 break;
fe944acf
FT
1615
1616 case EM_NFP:
1617 if (EF_NFP_MACH (filedata->file_header.e_flags) == E_NFP_MACH_3200)
1618 rtype = elf_nfp3200_reloc_type (type);
1619 else
1620 rtype = elf_nfp_reloc_type (type);
1621 break;
6655dba2
SB
1622
1623 case EM_Z80:
1624 rtype = elf_z80_reloc_type (type);
1625 break;
252b5132
RH
1626 }
1627
1628 if (rtype == NULL)
39dbeff8 1629 printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
252b5132 1630 else
5c144731 1631 printf (do_wide ? "%-22s" : "%-17.17s", rtype);
252b5132 1632
dda8d76d 1633 if (filedata->file_header.e_machine == EM_ALPHA
157c2599 1634 && rtype != NULL
7ace3541
RH
1635 && streq (rtype, "R_ALPHA_LITUSE")
1636 && is_rela)
1637 {
1638 switch (rels[i].r_addend)
1639 {
1640 case LITUSE_ALPHA_ADDR: rtype = "ADDR"; break;
1641 case LITUSE_ALPHA_BASE: rtype = "BASE"; break;
1642 case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1643 case LITUSE_ALPHA_JSR: rtype = "JSR"; break;
1644 case LITUSE_ALPHA_TLSGD: rtype = "TLSGD"; break;
1645 case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1646 case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1647 default: rtype = NULL;
1648 }
32ec8896 1649
7ace3541
RH
1650 if (rtype)
1651 printf (" (%s)", rtype);
1652 else
1653 {
1654 putchar (' ');
1655 printf (_("<unknown addend: %lx>"),
1656 (unsigned long) rels[i].r_addend);
32ec8896 1657 res = FALSE;
7ace3541
RH
1658 }
1659 }
1660 else if (symtab_index)
252b5132 1661 {
af3fc3bc 1662 if (symtab == NULL || symtab_index >= nsyms)
32ec8896 1663 {
27a45f42
AS
1664 error (_(" bad symbol index: %08lx in reloc\n"),
1665 (unsigned long) symtab_index);
32ec8896
NC
1666 res = FALSE;
1667 }
af3fc3bc 1668 else
19936277 1669 {
2cf0635d 1670 Elf_Internal_Sym * psym;
bb4d2ac2
L
1671 const char * version_string;
1672 enum versioned_symbol_info sym_info;
1673 unsigned short vna_other;
19936277 1674
af3fc3bc 1675 psym = symtab + symtab_index;
103f02d3 1676
bb4d2ac2 1677 version_string
dda8d76d 1678 = get_symbol_version_string (filedata, is_dynsym,
bb4d2ac2
L
1679 strtab, strtablen,
1680 symtab_index,
1681 psym,
1682 &sym_info,
1683 &vna_other);
1684
af3fc3bc 1685 printf (" ");
171191ba 1686
d8045f23
NC
1687 if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1688 {
1689 const char * name;
1690 unsigned int len;
1691 unsigned int width = is_32bit_elf ? 8 : 14;
1692
1693 /* Relocations against GNU_IFUNC symbols do not use the value
1694 of the symbol as the address to relocate against. Instead
1695 they invoke the function named by the symbol and use its
1696 result as the address for relocation.
1697
1698 To indicate this to the user, do not display the value of
1699 the symbol in the "Symbols's Value" field. Instead show
1700 its name followed by () as a hint that the symbol is
1701 invoked. */
1702
1703 if (strtab == NULL
1704 || psym->st_name == 0
1705 || psym->st_name >= strtablen)
1706 name = "??";
1707 else
1708 name = strtab + psym->st_name;
1709
1710 len = print_symbol (width, name);
bb4d2ac2
L
1711 if (version_string)
1712 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1713 version_string);
d8045f23
NC
1714 printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1715 }
1716 else
1717 {
1718 print_vma (psym->st_value, LONG_HEX);
171191ba 1719
d8045f23
NC
1720 printf (is_32bit_elf ? " " : " ");
1721 }
103f02d3 1722
af3fc3bc 1723 if (psym->st_name == 0)
f1ef08cb 1724 {
2cf0635d 1725 const char * sec_name = "<null>";
f1ef08cb
AM
1726 char name_buf[40];
1727
1728 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1729 {
dda8d76d
NC
1730 if (psym->st_shndx < filedata->file_header.e_shnum)
1731 sec_name = SECTION_NAME (filedata->section_headers + psym->st_shndx);
f1ef08cb
AM
1732 else if (psym->st_shndx == SHN_ABS)
1733 sec_name = "ABS";
1734 else if (psym->st_shndx == SHN_COMMON)
1735 sec_name = "COMMON";
dda8d76d 1736 else if ((filedata->file_header.e_machine == EM_MIPS
ac145307 1737 && psym->st_shndx == SHN_MIPS_SCOMMON)
dda8d76d 1738 || (filedata->file_header.e_machine == EM_TI_C6000
ac145307 1739 && psym->st_shndx == SHN_TIC6X_SCOMMON))
172553c7 1740 sec_name = "SCOMMON";
dda8d76d 1741 else if (filedata->file_header.e_machine == EM_MIPS
172553c7
TS
1742 && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1743 sec_name = "SUNDEF";
dda8d76d
NC
1744 else if ((filedata->file_header.e_machine == EM_X86_64
1745 || filedata->file_header.e_machine == EM_L1OM
1746 || filedata->file_header.e_machine == EM_K1OM)
3b22753a
L
1747 && psym->st_shndx == SHN_X86_64_LCOMMON)
1748 sec_name = "LARGE_COMMON";
dda8d76d
NC
1749 else if (filedata->file_header.e_machine == EM_IA_64
1750 && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
9ce701e2
L
1751 && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1752 sec_name = "ANSI_COM";
dda8d76d 1753 else if (is_ia64_vms (filedata)
148b93f2
NC
1754 && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1755 sec_name = "VMS_SYMVEC";
f1ef08cb
AM
1756 else
1757 {
1758 sprintf (name_buf, "<section 0x%x>",
1759 (unsigned int) psym->st_shndx);
1760 sec_name = name_buf;
1761 }
1762 }
1763 print_symbol (22, sec_name);
1764 }
af3fc3bc 1765 else if (strtab == NULL)
d79b3d50 1766 printf (_("<string table index: %3ld>"), psym->st_name);
c256ffe7 1767 else if (psym->st_name >= strtablen)
32ec8896 1768 {
27a45f42
AS
1769 error (_("<corrupt string table index: %3ld>\n"),
1770 psym->st_name);
32ec8896
NC
1771 res = FALSE;
1772 }
af3fc3bc 1773 else
bb4d2ac2
L
1774 {
1775 print_symbol (22, strtab + psym->st_name);
1776 if (version_string)
1777 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1778 version_string);
1779 }
103f02d3 1780
af3fc3bc 1781 if (is_rela)
171191ba 1782 {
7360e63f 1783 bfd_vma off = rels[i].r_addend;
171191ba 1784
7360e63f 1785 if ((bfd_signed_vma) off < 0)
598aaa76 1786 printf (" - %" BFD_VMA_FMT "x", - off);
171191ba 1787 else
598aaa76 1788 printf (" + %" BFD_VMA_FMT "x", off);
171191ba 1789 }
19936277 1790 }
252b5132 1791 }
1b228002 1792 else if (is_rela)
f7a99963 1793 {
7360e63f 1794 bfd_vma off = rels[i].r_addend;
e04d7088
L
1795
1796 printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
7360e63f 1797 if ((bfd_signed_vma) off < 0)
e04d7088
L
1798 printf ("-%" BFD_VMA_FMT "x", - off);
1799 else
1800 printf ("%" BFD_VMA_FMT "x", off);
f7a99963 1801 }
252b5132 1802
dda8d76d 1803 if (filedata->file_header.e_machine == EM_SPARCV9
157c2599
NC
1804 && rtype != NULL
1805 && streq (rtype, "R_SPARC_OLO10"))
91d6fa6a 1806 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
351b4b40 1807
252b5132 1808 putchar ('\n');
2c71103e 1809
aca88567 1810#ifdef BFD64
dda8d76d 1811 if (! is_32bit_elf && filedata->file_header.e_machine == EM_MIPS)
2c71103e 1812 {
91d6fa6a
NC
1813 bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1814 bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
2cf0635d
NC
1815 const char * rtype2 = elf_mips_reloc_type (type2);
1816 const char * rtype3 = elf_mips_reloc_type (type3);
aca88567 1817
2c71103e
NC
1818 printf (" Type2: ");
1819
1820 if (rtype2 == NULL)
39dbeff8
AM
1821 printf (_("unrecognized: %-7lx"),
1822 (unsigned long) type2 & 0xffffffff);
2c71103e
NC
1823 else
1824 printf ("%-17.17s", rtype2);
1825
18bd398b 1826 printf ("\n Type3: ");
2c71103e
NC
1827
1828 if (rtype3 == NULL)
39dbeff8
AM
1829 printf (_("unrecognized: %-7lx"),
1830 (unsigned long) type3 & 0xffffffff);
2c71103e
NC
1831 else
1832 printf ("%-17.17s", rtype3);
1833
53c7db4b 1834 putchar ('\n');
2c71103e 1835 }
aca88567 1836#endif /* BFD64 */
252b5132
RH
1837 }
1838
c8286bd1 1839 free (rels);
32ec8896
NC
1840
1841 return res;
252b5132
RH
1842}
1843
37c18eed
SD
1844static const char *
1845get_aarch64_dynamic_type (unsigned long type)
1846{
1847 switch (type)
1848 {
1849 case DT_AARCH64_BTI_PLT: return "AARCH64_BTI_PLT";
1dbade74 1850 case DT_AARCH64_PAC_PLT: return "AARCH64_PAC_PLT";
2301ed1c 1851 case DT_AARCH64_VARIANT_PCS: return "AARCH64_VARIANT_PCS";
37c18eed
SD
1852 default:
1853 return NULL;
1854 }
1855}
1856
252b5132 1857static const char *
d3ba0551 1858get_mips_dynamic_type (unsigned long type)
252b5132
RH
1859{
1860 switch (type)
1861 {
1862 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1863 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1864 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1865 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1866 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1867 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1868 case DT_MIPS_MSYM: return "MIPS_MSYM";
1869 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1870 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1871 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1872 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1873 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1874 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1875 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1876 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1877 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1878 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
a5499fa4 1879 case DT_MIPS_RLD_MAP_REL: return "MIPS_RLD_MAP_REL";
252b5132
RH
1880 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1881 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1882 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1883 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1884 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1885 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1886 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1887 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1888 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1889 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1890 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1891 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1892 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1893 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1894 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1895 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1896 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1897 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1898 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1899 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1900 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1901 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1902 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1903 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1904 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1905 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
861fb55a
DJ
1906 case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1907 case DT_MIPS_RWPLT: return "MIPS_RWPLT";
f16a9783 1908 case DT_MIPS_XHASH: return "MIPS_XHASH";
252b5132
RH
1909 default:
1910 return NULL;
1911 }
1912}
1913
9a097730 1914static const char *
d3ba0551 1915get_sparc64_dynamic_type (unsigned long type)
9a097730
RH
1916{
1917 switch (type)
1918 {
1919 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1920 default:
1921 return NULL;
1922 }
103f02d3
UD
1923}
1924
7490d522
AM
1925static const char *
1926get_ppc_dynamic_type (unsigned long type)
1927{
1928 switch (type)
1929 {
a7f2871e 1930 case DT_PPC_GOT: return "PPC_GOT";
e8910a83 1931 case DT_PPC_OPT: return "PPC_OPT";
7490d522
AM
1932 default:
1933 return NULL;
1934 }
1935}
1936
f1cb7e17 1937static const char *
d3ba0551 1938get_ppc64_dynamic_type (unsigned long type)
f1cb7e17
AM
1939{
1940 switch (type)
1941 {
a7f2871e
AM
1942 case DT_PPC64_GLINK: return "PPC64_GLINK";
1943 case DT_PPC64_OPD: return "PPC64_OPD";
1944 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
e8910a83 1945 case DT_PPC64_OPT: return "PPC64_OPT";
f1cb7e17
AM
1946 default:
1947 return NULL;
1948 }
1949}
1950
103f02d3 1951static const char *
d3ba0551 1952get_parisc_dynamic_type (unsigned long type)
103f02d3
UD
1953{
1954 switch (type)
1955 {
1956 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1957 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1958 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1959 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1960 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1961 case DT_HP_PREINIT: return "HP_PREINIT";
1962 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1963 case DT_HP_NEEDED: return "HP_NEEDED";
1964 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1965 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1966 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1967 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1968 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
eec8f817
DA
1969 case DT_HP_EPLTREL: return "HP_GST_EPLTREL";
1970 case DT_HP_EPLTRELSZ: return "HP_GST_EPLTRELSZ";
1971 case DT_HP_FILTERED: return "HP_FILTERED";
1972 case DT_HP_FILTER_TLS: return "HP_FILTER_TLS";
1973 case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1974 case DT_HP_LAZYLOAD: return "HP_LAZYLOAD";
1975 case DT_HP_BIND_NOW_COUNT: return "HP_BIND_NOW_COUNT";
1976 case DT_PLT: return "PLT";
1977 case DT_PLT_SIZE: return "PLT_SIZE";
1978 case DT_DLT: return "DLT";
1979 case DT_DLT_SIZE: return "DLT_SIZE";
103f02d3
UD
1980 default:
1981 return NULL;
1982 }
1983}
9a097730 1984
ecc51f48 1985static const char *
d3ba0551 1986get_ia64_dynamic_type (unsigned long type)
ecc51f48
NC
1987{
1988 switch (type)
1989 {
148b93f2
NC
1990 case DT_IA_64_PLT_RESERVE: return "IA_64_PLT_RESERVE";
1991 case DT_IA_64_VMS_SUBTYPE: return "VMS_SUBTYPE";
1992 case DT_IA_64_VMS_IMGIOCNT: return "VMS_IMGIOCNT";
1993 case DT_IA_64_VMS_LNKFLAGS: return "VMS_LNKFLAGS";
1994 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1995 case DT_IA_64_VMS_IDENT: return "VMS_IDENT";
1996 case DT_IA_64_VMS_NEEDED_IDENT: return "VMS_NEEDED_IDENT";
1997 case DT_IA_64_VMS_IMG_RELA_CNT: return "VMS_IMG_RELA_CNT";
1998 case DT_IA_64_VMS_SEG_RELA_CNT: return "VMS_SEG_RELA_CNT";
1999 case DT_IA_64_VMS_FIXUP_RELA_CNT: return "VMS_FIXUP_RELA_CNT";
2000 case DT_IA_64_VMS_FIXUP_NEEDED: return "VMS_FIXUP_NEEDED";
2001 case DT_IA_64_VMS_SYMVEC_CNT: return "VMS_SYMVEC_CNT";
2002 case DT_IA_64_VMS_XLATED: return "VMS_XLATED";
2003 case DT_IA_64_VMS_STACKSIZE: return "VMS_STACKSIZE";
2004 case DT_IA_64_VMS_UNWINDSZ: return "VMS_UNWINDSZ";
2005 case DT_IA_64_VMS_UNWIND_CODSEG: return "VMS_UNWIND_CODSEG";
2006 case DT_IA_64_VMS_UNWIND_INFOSEG: return "VMS_UNWIND_INFOSEG";
2007 case DT_IA_64_VMS_LINKTIME: return "VMS_LINKTIME";
2008 case DT_IA_64_VMS_SEG_NO: return "VMS_SEG_NO";
2009 case DT_IA_64_VMS_SYMVEC_OFFSET: return "VMS_SYMVEC_OFFSET";
2010 case DT_IA_64_VMS_SYMVEC_SEG: return "VMS_SYMVEC_SEG";
2011 case DT_IA_64_VMS_UNWIND_OFFSET: return "VMS_UNWIND_OFFSET";
2012 case DT_IA_64_VMS_UNWIND_SEG: return "VMS_UNWIND_SEG";
2013 case DT_IA_64_VMS_STRTAB_OFFSET: return "VMS_STRTAB_OFFSET";
2014 case DT_IA_64_VMS_SYSVER_OFFSET: return "VMS_SYSVER_OFFSET";
2015 case DT_IA_64_VMS_IMG_RELA_OFF: return "VMS_IMG_RELA_OFF";
2016 case DT_IA_64_VMS_SEG_RELA_OFF: return "VMS_SEG_RELA_OFF";
2017 case DT_IA_64_VMS_FIXUP_RELA_OFF: return "VMS_FIXUP_RELA_OFF";
2018 case DT_IA_64_VMS_PLTGOT_OFFSET: return "VMS_PLTGOT_OFFSET";
2019 case DT_IA_64_VMS_PLTGOT_SEG: return "VMS_PLTGOT_SEG";
2020 case DT_IA_64_VMS_FPMODE: return "VMS_FPMODE";
ecc51f48
NC
2021 default:
2022 return NULL;
2023 }
2024}
2025
fd85a6a1
NC
2026static const char *
2027get_solaris_section_type (unsigned long type)
2028{
2029 switch (type)
2030 {
2031 case 0x6fffffee: return "SUNW_ancillary";
2032 case 0x6fffffef: return "SUNW_capchain";
2033 case 0x6ffffff0: return "SUNW_capinfo";
2034 case 0x6ffffff1: return "SUNW_symsort";
2035 case 0x6ffffff2: return "SUNW_tlssort";
2036 case 0x6ffffff3: return "SUNW_LDYNSYM";
2037 case 0x6ffffff4: return "SUNW_dof";
2038 case 0x6ffffff5: return "SUNW_cap";
2039 case 0x6ffffff6: return "SUNW_SIGNATURE";
2040 case 0x6ffffff7: return "SUNW_ANNOTATE";
2041 case 0x6ffffff8: return "SUNW_DEBUGSTR";
2042 case 0x6ffffff9: return "SUNW_DEBUG";
2043 case 0x6ffffffa: return "SUNW_move";
2044 case 0x6ffffffb: return "SUNW_COMDAT";
2045 case 0x6ffffffc: return "SUNW_syminfo";
2046 case 0x6ffffffd: return "SUNW_verdef";
2047 case 0x6ffffffe: return "SUNW_verneed";
2048 case 0x6fffffff: return "SUNW_versym";
2049 case 0x70000000: return "SPARC_GOTDATA";
2050 default: return NULL;
2051 }
2052}
2053
fabcb361
RH
2054static const char *
2055get_alpha_dynamic_type (unsigned long type)
2056{
2057 switch (type)
2058 {
2059 case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
32ec8896 2060 default: return NULL;
fabcb361
RH
2061 }
2062}
2063
1c0d3aa6
NC
2064static const char *
2065get_score_dynamic_type (unsigned long type)
2066{
2067 switch (type)
2068 {
2069 case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
2070 case DT_SCORE_LOCAL_GOTNO: return "SCORE_LOCAL_GOTNO";
2071 case DT_SCORE_SYMTABNO: return "SCORE_SYMTABNO";
2072 case DT_SCORE_GOTSYM: return "SCORE_GOTSYM";
2073 case DT_SCORE_UNREFEXTNO: return "SCORE_UNREFEXTNO";
2074 case DT_SCORE_HIPAGENO: return "SCORE_HIPAGENO";
32ec8896 2075 default: return NULL;
1c0d3aa6
NC
2076 }
2077}
2078
40b36596
JM
2079static const char *
2080get_tic6x_dynamic_type (unsigned long type)
2081{
2082 switch (type)
2083 {
2084 case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
2085 case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
2086 case DT_C6000_DSBT_BASE: return "C6000_DSBT_BASE";
2087 case DT_C6000_DSBT_SIZE: return "C6000_DSBT_SIZE";
2088 case DT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
2089 case DT_C6000_DSBT_INDEX: return "C6000_DSBT_INDEX";
32ec8896 2090 default: return NULL;
40b36596
JM
2091 }
2092}
1c0d3aa6 2093
36591ba1
SL
2094static const char *
2095get_nios2_dynamic_type (unsigned long type)
2096{
2097 switch (type)
2098 {
2099 case DT_NIOS2_GP: return "NIOS2_GP";
32ec8896 2100 default: return NULL;
36591ba1
SL
2101 }
2102}
2103
fd85a6a1
NC
2104static const char *
2105get_solaris_dynamic_type (unsigned long type)
2106{
2107 switch (type)
2108 {
2109 case 0x6000000d: return "SUNW_AUXILIARY";
2110 case 0x6000000e: return "SUNW_RTLDINF";
2111 case 0x6000000f: return "SUNW_FILTER";
2112 case 0x60000010: return "SUNW_CAP";
2113 case 0x60000011: return "SUNW_SYMTAB";
2114 case 0x60000012: return "SUNW_SYMSZ";
2115 case 0x60000013: return "SUNW_SORTENT";
2116 case 0x60000014: return "SUNW_SYMSORT";
2117 case 0x60000015: return "SUNW_SYMSORTSZ";
2118 case 0x60000016: return "SUNW_TLSSORT";
2119 case 0x60000017: return "SUNW_TLSSORTSZ";
2120 case 0x60000018: return "SUNW_CAPINFO";
2121 case 0x60000019: return "SUNW_STRPAD";
2122 case 0x6000001a: return "SUNW_CAPCHAIN";
2123 case 0x6000001b: return "SUNW_LDMACH";
2124 case 0x6000001d: return "SUNW_CAPCHAINENT";
2125 case 0x6000001f: return "SUNW_CAPCHAINSZ";
2126 case 0x60000021: return "SUNW_PARENT";
2127 case 0x60000023: return "SUNW_ASLR";
2128 case 0x60000025: return "SUNW_RELAX";
2129 case 0x60000029: return "SUNW_NXHEAP";
2130 case 0x6000002b: return "SUNW_NXSTACK";
2131
2132 case 0x70000001: return "SPARC_REGISTER";
2133 case 0x7ffffffd: return "AUXILIARY";
2134 case 0x7ffffffe: return "USED";
2135 case 0x7fffffff: return "FILTER";
2136
15f205b1 2137 default: return NULL;
fd85a6a1
NC
2138 }
2139}
2140
252b5132 2141static const char *
dda8d76d 2142get_dynamic_type (Filedata * filedata, unsigned long type)
252b5132 2143{
e9e44622 2144 static char buff[64];
252b5132
RH
2145
2146 switch (type)
2147 {
2148 case DT_NULL: return "NULL";
2149 case DT_NEEDED: return "NEEDED";
2150 case DT_PLTRELSZ: return "PLTRELSZ";
2151 case DT_PLTGOT: return "PLTGOT";
2152 case DT_HASH: return "HASH";
2153 case DT_STRTAB: return "STRTAB";
2154 case DT_SYMTAB: return "SYMTAB";
2155 case DT_RELA: return "RELA";
2156 case DT_RELASZ: return "RELASZ";
2157 case DT_RELAENT: return "RELAENT";
2158 case DT_STRSZ: return "STRSZ";
2159 case DT_SYMENT: return "SYMENT";
2160 case DT_INIT: return "INIT";
2161 case DT_FINI: return "FINI";
2162 case DT_SONAME: return "SONAME";
2163 case DT_RPATH: return "RPATH";
2164 case DT_SYMBOLIC: return "SYMBOLIC";
2165 case DT_REL: return "REL";
2166 case DT_RELSZ: return "RELSZ";
2167 case DT_RELENT: return "RELENT";
2168 case DT_PLTREL: return "PLTREL";
2169 case DT_DEBUG: return "DEBUG";
2170 case DT_TEXTREL: return "TEXTREL";
2171 case DT_JMPREL: return "JMPREL";
2172 case DT_BIND_NOW: return "BIND_NOW";
2173 case DT_INIT_ARRAY: return "INIT_ARRAY";
2174 case DT_FINI_ARRAY: return "FINI_ARRAY";
2175 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
2176 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
d1133906
NC
2177 case DT_RUNPATH: return "RUNPATH";
2178 case DT_FLAGS: return "FLAGS";
2d0e6f43 2179
d1133906
NC
2180 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2181 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
6d913794 2182 case DT_SYMTAB_SHNDX: return "SYMTAB_SHNDX";
103f02d3 2183
05107a46 2184 case DT_CHECKSUM: return "CHECKSUM";
252b5132
RH
2185 case DT_PLTPADSZ: return "PLTPADSZ";
2186 case DT_MOVEENT: return "MOVEENT";
2187 case DT_MOVESZ: return "MOVESZ";
dcefbbbd 2188 case DT_FEATURE: return "FEATURE";
252b5132
RH
2189 case DT_POSFLAG_1: return "POSFLAG_1";
2190 case DT_SYMINSZ: return "SYMINSZ";
2191 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
103f02d3 2192
252b5132 2193 case DT_ADDRRNGLO: return "ADDRRNGLO";
dcefbbbd
L
2194 case DT_CONFIG: return "CONFIG";
2195 case DT_DEPAUDIT: return "DEPAUDIT";
2196 case DT_AUDIT: return "AUDIT";
2197 case DT_PLTPAD: return "PLTPAD";
2198 case DT_MOVETAB: return "MOVETAB";
252b5132 2199 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
103f02d3 2200
252b5132 2201 case DT_VERSYM: return "VERSYM";
103f02d3 2202
67a4f2b7
AO
2203 case DT_TLSDESC_GOT: return "TLSDESC_GOT";
2204 case DT_TLSDESC_PLT: return "TLSDESC_PLT";
252b5132
RH
2205 case DT_RELACOUNT: return "RELACOUNT";
2206 case DT_RELCOUNT: return "RELCOUNT";
2207 case DT_FLAGS_1: return "FLAGS_1";
2208 case DT_VERDEF: return "VERDEF";
2209 case DT_VERDEFNUM: return "VERDEFNUM";
2210 case DT_VERNEED: return "VERNEED";
2211 case DT_VERNEEDNUM: return "VERNEEDNUM";
103f02d3 2212
019148e4 2213 case DT_AUXILIARY: return "AUXILIARY";
252b5132
RH
2214 case DT_USED: return "USED";
2215 case DT_FILTER: return "FILTER";
103f02d3 2216
047b2264
JJ
2217 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
2218 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
2219 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
2220 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
2221 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
fdc90cb4 2222 case DT_GNU_HASH: return "GNU_HASH";
047b2264 2223
252b5132
RH
2224 default:
2225 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
2226 {
2cf0635d 2227 const char * result;
103f02d3 2228
dda8d76d 2229 switch (filedata->file_header.e_machine)
252b5132 2230 {
37c18eed
SD
2231 case EM_AARCH64:
2232 result = get_aarch64_dynamic_type (type);
2233 break;
252b5132 2234 case EM_MIPS:
4fe85591 2235 case EM_MIPS_RS3_LE:
252b5132
RH
2236 result = get_mips_dynamic_type (type);
2237 break;
9a097730
RH
2238 case EM_SPARCV9:
2239 result = get_sparc64_dynamic_type (type);
2240 break;
7490d522
AM
2241 case EM_PPC:
2242 result = get_ppc_dynamic_type (type);
2243 break;
f1cb7e17
AM
2244 case EM_PPC64:
2245 result = get_ppc64_dynamic_type (type);
2246 break;
ecc51f48
NC
2247 case EM_IA_64:
2248 result = get_ia64_dynamic_type (type);
2249 break;
fabcb361
RH
2250 case EM_ALPHA:
2251 result = get_alpha_dynamic_type (type);
2252 break;
1c0d3aa6
NC
2253 case EM_SCORE:
2254 result = get_score_dynamic_type (type);
2255 break;
40b36596
JM
2256 case EM_TI_C6000:
2257 result = get_tic6x_dynamic_type (type);
2258 break;
36591ba1
SL
2259 case EM_ALTERA_NIOS2:
2260 result = get_nios2_dynamic_type (type);
2261 break;
252b5132 2262 default:
dda8d76d 2263 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
fd85a6a1
NC
2264 result = get_solaris_dynamic_type (type);
2265 else
2266 result = NULL;
252b5132
RH
2267 break;
2268 }
2269
2270 if (result != NULL)
2271 return result;
2272
e9e44622 2273 snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
252b5132 2274 }
eec8f817 2275 else if (((type >= DT_LOOS) && (type <= DT_HIOS))
dda8d76d 2276 || (filedata->file_header.e_machine == EM_PARISC
eec8f817 2277 && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
103f02d3 2278 {
2cf0635d 2279 const char * result;
103f02d3 2280
dda8d76d 2281 switch (filedata->file_header.e_machine)
103f02d3
UD
2282 {
2283 case EM_PARISC:
2284 result = get_parisc_dynamic_type (type);
2285 break;
148b93f2
NC
2286 case EM_IA_64:
2287 result = get_ia64_dynamic_type (type);
2288 break;
103f02d3 2289 default:
dda8d76d 2290 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
fd85a6a1
NC
2291 result = get_solaris_dynamic_type (type);
2292 else
2293 result = NULL;
103f02d3
UD
2294 break;
2295 }
2296
2297 if (result != NULL)
2298 return result;
2299
e9e44622
JJ
2300 snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2301 type);
103f02d3 2302 }
252b5132 2303 else
e9e44622 2304 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
103f02d3 2305
252b5132
RH
2306 return buff;
2307 }
2308}
2309
2310static char *
d3ba0551 2311get_file_type (unsigned e_type)
252b5132 2312{
89246a0e 2313 static char buff[64];
252b5132
RH
2314
2315 switch (e_type)
2316 {
32ec8896
NC
2317 case ET_NONE: return _("NONE (None)");
2318 case ET_REL: return _("REL (Relocatable file)");
2319 case ET_EXEC: return _("EXEC (Executable file)");
2320 case ET_DYN: return _("DYN (Shared object file)");
2321 case ET_CORE: return _("CORE (Core file)");
252b5132
RH
2322
2323 default:
2324 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
e9e44622 2325 snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
252b5132 2326 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
e9e44622 2327 snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
252b5132 2328 else
e9e44622 2329 snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
252b5132
RH
2330 return buff;
2331 }
2332}
2333
2334static char *
d3ba0551 2335get_machine_name (unsigned e_machine)
252b5132 2336{
b34976b6 2337 static char buff[64]; /* XXX */
252b5132
RH
2338
2339 switch (e_machine)
2340 {
55e22ca8
NC
2341 /* Please keep this switch table sorted by increasing EM_ value. */
2342 /* 0 */
c45021f2
NC
2343 case EM_NONE: return _("None");
2344 case EM_M32: return "WE32100";
2345 case EM_SPARC: return "Sparc";
2346 case EM_386: return "Intel 80386";
2347 case EM_68K: return "MC68000";
2348 case EM_88K: return "MC88000";
22abe556 2349 case EM_IAMCU: return "Intel MCU";
fb70ec17 2350 case EM_860: return "Intel 80860";
c45021f2
NC
2351 case EM_MIPS: return "MIPS R3000";
2352 case EM_S370: return "IBM System/370";
55e22ca8 2353 /* 10 */
7036c0e1 2354 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
252b5132 2355 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
c45021f2 2356 case EM_PARISC: return "HPPA";
55e22ca8 2357 case EM_VPP550: return "Fujitsu VPP500";
7036c0e1 2358 case EM_SPARC32PLUS: return "Sparc v8+" ;
d7867d17 2359 case EM_960: return "Intel 80960";
c45021f2 2360 case EM_PPC: return "PowerPC";
55e22ca8 2361 /* 20 */
285d1771 2362 case EM_PPC64: return "PowerPC64";
55e22ca8
NC
2363 case EM_S390_OLD:
2364 case EM_S390: return "IBM S/390";
2365 case EM_SPU: return "SPU";
2366 /* 30 */
2367 case EM_V800: return "Renesas V850 (using RH850 ABI)";
c45021f2
NC
2368 case EM_FR20: return "Fujitsu FR20";
2369 case EM_RH32: return "TRW RH32";
b34976b6 2370 case EM_MCORE: return "MCORE";
55e22ca8 2371 /* 40 */
7036c0e1
AJ
2372 case EM_ARM: return "ARM";
2373 case EM_OLD_ALPHA: return "Digital Alpha (old)";
ef230218 2374 case EM_SH: return "Renesas / SuperH SH";
c45021f2
NC
2375 case EM_SPARCV9: return "Sparc v9";
2376 case EM_TRICORE: return "Siemens Tricore";
584da044 2377 case EM_ARC: return "ARC";
c2dcd04e
NC
2378 case EM_H8_300: return "Renesas H8/300";
2379 case EM_H8_300H: return "Renesas H8/300H";
2380 case EM_H8S: return "Renesas H8S";
2381 case EM_H8_500: return "Renesas H8/500";
55e22ca8 2382 /* 50 */
30800947 2383 case EM_IA_64: return "Intel IA-64";
252b5132
RH
2384 case EM_MIPS_X: return "Stanford MIPS-X";
2385 case EM_COLDFIRE: return "Motorola Coldfire";
55e22ca8 2386 case EM_68HC12: return "Motorola MC68HC12 Microcontroller";
7036c0e1
AJ
2387 case EM_MMA: return "Fujitsu Multimedia Accelerator";
2388 case EM_PCP: return "Siemens PCP";
2389 case EM_NCPU: return "Sony nCPU embedded RISC processor";
2390 case EM_NDR1: return "Denso NDR1 microprocesspr";
2391 case EM_STARCORE: return "Motorola Star*Core processor";
2392 case EM_ME16: return "Toyota ME16 processor";
55e22ca8 2393 /* 60 */
7036c0e1
AJ
2394 case EM_ST100: return "STMicroelectronics ST100 processor";
2395 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
55e22ca8 2396 case EM_X86_64: return "Advanced Micro Devices X86-64";
11636f9e
JM
2397 case EM_PDSP: return "Sony DSP processor";
2398 case EM_PDP10: return "Digital Equipment Corp. PDP-10";
2399 case EM_PDP11: return "Digital Equipment Corp. PDP-11";
7036c0e1
AJ
2400 case EM_FX66: return "Siemens FX66 microcontroller";
2401 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2402 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
2403 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
55e22ca8 2404 /* 70 */
7036c0e1
AJ
2405 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
2406 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
2407 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
2408 case EM_SVX: return "Silicon Graphics SVx";
2409 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
2410 case EM_VAX: return "Digital VAX";
1b61cf92 2411 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
c45021f2
NC
2412 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
2413 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
2414 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
55e22ca8 2415 /* 80 */
b34976b6 2416 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
c45021f2 2417 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
3b36097d 2418 case EM_PRISM: return "Vitesse Prism";
55e22ca8
NC
2419 case EM_AVR_OLD:
2420 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
2421 case EM_CYGNUS_FR30:
2422 case EM_FR30: return "Fujitsu FR30";
2423 case EM_CYGNUS_D10V:
2424 case EM_D10V: return "d10v";
2425 case EM_CYGNUS_D30V:
2426 case EM_D30V: return "d30v";
2427 case EM_CYGNUS_V850:
2428 case EM_V850: return "Renesas V850";
2429 case EM_CYGNUS_M32R:
2430 case EM_M32R: return "Renesas M32R (formerly Mitsubishi M32r)";
2431 case EM_CYGNUS_MN10300:
2432 case EM_MN10300: return "mn10300";
2433 /* 90 */
2434 case EM_CYGNUS_MN10200:
2435 case EM_MN10200: return "mn10200";
2436 case EM_PJ: return "picoJava";
73589c9d 2437 case EM_OR1K: return "OpenRISC 1000";
55e22ca8 2438 case EM_ARC_COMPACT: return "ARCompact";
88da6820
NC
2439 case EM_XTENSA_OLD:
2440 case EM_XTENSA: return "Tensilica Xtensa Processor";
11636f9e
JM
2441 case EM_VIDEOCORE: return "Alphamosaic VideoCore processor";
2442 case EM_TMM_GPP: return "Thompson Multimedia General Purpose Processor";
2443 case EM_NS32K: return "National Semiconductor 32000 series";
2444 case EM_TPC: return "Tenor Network TPC processor";
55e22ca8
NC
2445 case EM_SNP1K: return "Trebia SNP 1000 processor";
2446 /* 100 */
9abca702 2447 case EM_ST200: return "STMicroelectronics ST200 microcontroller";
55e22ca8
NC
2448 case EM_IP2K_OLD:
2449 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
11636f9e
JM
2450 case EM_MAX: return "MAX Processor";
2451 case EM_CR: return "National Semiconductor CompactRISC";
2452 case EM_F2MC16: return "Fujitsu F2MC16";
2453 case EM_MSP430: return "Texas Instruments msp430 microcontroller";
7bbe5bc5 2454 case EM_BLACKFIN: return "Analog Devices Blackfin";
11636f9e
JM
2455 case EM_SE_C33: return "S1C33 Family of Seiko Epson processors";
2456 case EM_SEP: return "Sharp embedded microprocessor";
2457 case EM_ARCA: return "Arca RISC microprocessor";
55e22ca8 2458 /* 110 */
11636f9e
JM
2459 case EM_UNICORE: return "Unicore";
2460 case EM_EXCESS: return "eXcess 16/32/64-bit configurable embedded CPU";
2461 case EM_DXP: return "Icera Semiconductor Inc. Deep Execution Processor";
64fd6348 2462 case EM_ALTERA_NIOS2: return "Altera Nios II";
55e22ca8
NC
2463 case EM_CRX: return "National Semiconductor CRX microprocessor";
2464 case EM_XGATE: return "Motorola XGATE embedded processor";
c29aca4a 2465 case EM_C166:
d70c5fc7 2466 case EM_XC16X: return "Infineon Technologies xc16x";
11636f9e
JM
2467 case EM_M16C: return "Renesas M16C series microprocessors";
2468 case EM_DSPIC30F: return "Microchip Technology dsPIC30F Digital Signal Controller";
2469 case EM_CE: return "Freescale Communication Engine RISC core";
55e22ca8
NC
2470 /* 120 */
2471 case EM_M32C: return "Renesas M32c";
2472 /* 130 */
11636f9e
JM
2473 case EM_TSK3000: return "Altium TSK3000 core";
2474 case EM_RS08: return "Freescale RS08 embedded processor";
2475 case EM_ECOG2: return "Cyan Technology eCOG2 microprocessor";
55e22ca8 2476 case EM_SCORE: return "SUNPLUS S+Core";
11636f9e
JM
2477 case EM_DSP24: return "New Japan Radio (NJR) 24-bit DSP Processor";
2478 case EM_VIDEOCORE3: return "Broadcom VideoCore III processor";
55e22ca8 2479 case EM_LATTICEMICO32: return "Lattice Mico32";
11636f9e 2480 case EM_SE_C17: return "Seiko Epson C17 family";
55e22ca8 2481 /* 140 */
11636f9e
JM
2482 case EM_TI_C6000: return "Texas Instruments TMS320C6000 DSP family";
2483 case EM_TI_C2000: return "Texas Instruments TMS320C2000 DSP family";
2484 case EM_TI_C5500: return "Texas Instruments TMS320C55x DSP family";
55e22ca8
NC
2485 case EM_TI_PRU: return "TI PRU I/O processor";
2486 /* 160 */
11636f9e
JM
2487 case EM_MMDSP_PLUS: return "STMicroelectronics 64bit VLIW Data Signal Processor";
2488 case EM_CYPRESS_M8C: return "Cypress M8C microprocessor";
2489 case EM_R32C: return "Renesas R32C series microprocessors";
2490 case EM_TRIMEDIA: return "NXP Semiconductors TriMedia architecture family";
2491 case EM_QDSP6: return "QUALCOMM DSP6 Processor";
2492 case EM_8051: return "Intel 8051 and variants";
2493 case EM_STXP7X: return "STMicroelectronics STxP7x family";
2494 case EM_NDS32: return "Andes Technology compact code size embedded RISC processor family";
2495 case EM_ECOG1X: return "Cyan Technology eCOG1X family";
2496 case EM_MAXQ30: return "Dallas Semiconductor MAXQ30 Core microcontrollers";
55e22ca8 2497 /* 170 */
11636f9e
JM
2498 case EM_XIMO16: return "New Japan Radio (NJR) 16-bit DSP Processor";
2499 case EM_MANIK: return "M2000 Reconfigurable RISC Microprocessor";
2500 case EM_CRAYNV2: return "Cray Inc. NV2 vector architecture";
c7927a3c 2501 case EM_RX: return "Renesas RX";
a3c62988 2502 case EM_METAG: return "Imagination Technologies Meta processor architecture";
11636f9e
JM
2503 case EM_MCST_ELBRUS: return "MCST Elbrus general purpose hardware architecture";
2504 case EM_ECOG16: return "Cyan Technology eCOG16 family";
55e22ca8
NC
2505 case EM_CR16:
2506 case EM_MICROBLAZE:
2507 case EM_MICROBLAZE_OLD: return "Xilinx MicroBlaze";
11636f9e
JM
2508 case EM_ETPU: return "Freescale Extended Time Processing Unit";
2509 case EM_SLE9X: return "Infineon Technologies SLE9X core";
55e22ca8
NC
2510 /* 180 */
2511 case EM_L1OM: return "Intel L1OM";
2512 case EM_K1OM: return "Intel K1OM";
2513 case EM_INTEL182: return "Intel (reserved)";
2514 case EM_AARCH64: return "AArch64";
2515 case EM_ARM184: return "ARM (reserved)";
2516 case EM_AVR32: return "Atmel Corporation 32-bit microprocessor";
11636f9e
JM
2517 case EM_STM8: return "STMicroeletronics STM8 8-bit microcontroller";
2518 case EM_TILE64: return "Tilera TILE64 multicore architecture family";
2519 case EM_TILEPRO: return "Tilera TILEPro multicore architecture family";
55e22ca8 2520 /* 190 */
11636f9e 2521 case EM_CUDA: return "NVIDIA CUDA architecture";
55e22ca8 2522 case EM_TILEGX: return "Tilera TILE-Gx multicore architecture family";
6d913794
NC
2523 case EM_CLOUDSHIELD: return "CloudShield architecture family";
2524 case EM_COREA_1ST: return "KIPO-KAIST Core-A 1st generation processor family";
2525 case EM_COREA_2ND: return "KIPO-KAIST Core-A 2nd generation processor family";
55e22ca8 2526 case EM_ARC_COMPACT2: return "ARCv2";
6d913794 2527 case EM_OPEN8: return "Open8 8-bit RISC soft processor core";
55e22ca8 2528 case EM_RL78: return "Renesas RL78";
6d913794 2529 case EM_VIDEOCORE5: return "Broadcom VideoCore V processor";
55e22ca8
NC
2530 case EM_78K0R: return "Renesas 78K0R";
2531 /* 200 */
6d913794 2532 case EM_56800EX: return "Freescale 56800EX Digital Signal Controller (DSC)";
15f205b1
NC
2533 case EM_BA1: return "Beyond BA1 CPU architecture";
2534 case EM_BA2: return "Beyond BA2 CPU architecture";
6d913794
NC
2535 case EM_XCORE: return "XMOS xCORE processor family";
2536 case EM_MCHP_PIC: return "Microchip 8-bit PIC(r) family";
55e22ca8 2537 /* 210 */
6d913794
NC
2538 case EM_KM32: return "KM211 KM32 32-bit processor";
2539 case EM_KMX32: return "KM211 KMX32 32-bit processor";
2540 case EM_KMX16: return "KM211 KMX16 16-bit processor";
2541 case EM_KMX8: return "KM211 KMX8 8-bit processor";
2542 case EM_KVARC: return "KM211 KVARC processor";
15f205b1 2543 case EM_CDP: return "Paneve CDP architecture family";
6d913794
NC
2544 case EM_COGE: return "Cognitive Smart Memory Processor";
2545 case EM_COOL: return "Bluechip Systems CoolEngine";
2546 case EM_NORC: return "Nanoradio Optimized RISC";
2547 case EM_CSR_KALIMBA: return "CSR Kalimba architecture family";
55e22ca8 2548 /* 220 */
15f205b1 2549 case EM_Z80: return "Zilog Z80";
55e22ca8
NC
2550 case EM_VISIUM: return "CDS VISIUMcore processor";
2551 case EM_FT32: return "FTDI Chip FT32";
2552 case EM_MOXIE: return "Moxie";
2553 case EM_AMDGPU: return "AMD GPU";
2554 case EM_RISCV: return "RISC-V";
2555 case EM_LANAI: return "Lanai 32-bit processor";
2556 case EM_BPF: return "Linux BPF";
fe944acf 2557 case EM_NFP: return "Netronome Flow Processor";
55e22ca8
NC
2558
2559 /* Large numbers... */
2560 case EM_MT: return "Morpho Techologies MT processor";
2561 case EM_ALPHA: return "Alpha";
2562 case EM_WEBASSEMBLY: return "Web Assembly";
9abca702 2563 case EM_DLX: return "OpenDLX";
55e22ca8
NC
2564 case EM_XSTORMY16: return "Sanyo XStormy16 CPU core";
2565 case EM_IQ2000: return "Vitesse IQ2000";
2566 case EM_M32C_OLD:
2567 case EM_NIOS32: return "Altera Nios";
2568 case EM_CYGNUS_MEP: return "Toshiba MeP Media Engine";
2569 case EM_ADAPTEVA_EPIPHANY: return "Adapteva EPIPHANY";
2570 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
637b1970 2571 case EM_S12Z: return "Freescale S12Z";
b8891f8d 2572 case EM_CSKY: return "C-SKY";
55e22ca8 2573
252b5132 2574 default:
35d9dd2f 2575 snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
252b5132
RH
2576 return buff;
2577 }
2578}
2579
a9522a21
AB
2580static void
2581decode_ARC_machine_flags (unsigned e_flags, unsigned e_machine, char buf[])
2582{
2583 /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2. Some
2584 other compilers don't a specific architecture type in the e_flags, and
2585 instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
2586 architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
2587 architectures.
2588
2589 Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
2590 but also sets a specific architecture type in the e_flags field.
2591
2592 However, when decoding the flags we don't worry if we see an
2593 unexpected pairing, for example EM_ARC_COMPACT machine type, with
2594 ARCEM architecture type. */
2595
2596 switch (e_flags & EF_ARC_MACH_MSK)
2597 {
2598 /* We only expect these to occur for EM_ARC_COMPACT2. */
2599 case EF_ARC_CPU_ARCV2EM:
2600 strcat (buf, ", ARC EM");
2601 break;
2602 case EF_ARC_CPU_ARCV2HS:
2603 strcat (buf, ", ARC HS");
2604 break;
2605
2606 /* We only expect these to occur for EM_ARC_COMPACT. */
2607 case E_ARC_MACH_ARC600:
2608 strcat (buf, ", ARC600");
2609 break;
2610 case E_ARC_MACH_ARC601:
2611 strcat (buf, ", ARC601");
2612 break;
2613 case E_ARC_MACH_ARC700:
2614 strcat (buf, ", ARC700");
2615 break;
2616
2617 /* The only times we should end up here are (a) A corrupt ELF, (b) A
2618 new ELF with new architecture being read by an old version of
2619 readelf, or (c) An ELF built with non-GNU compiler that does not
2620 set the architecture in the e_flags. */
2621 default:
2622 if (e_machine == EM_ARC_COMPACT)
2623 strcat (buf, ", Unknown ARCompact");
2624 else
2625 strcat (buf, ", Unknown ARC");
2626 break;
2627 }
2628
2629 switch (e_flags & EF_ARC_OSABI_MSK)
2630 {
2631 case E_ARC_OSABI_ORIG:
2632 strcat (buf, ", (ABI:legacy)");
2633 break;
2634 case E_ARC_OSABI_V2:
2635 strcat (buf, ", (ABI:v2)");
2636 break;
2637 /* Only upstream 3.9+ kernels will support ARCv2 ISA. */
2638 case E_ARC_OSABI_V3:
2639 strcat (buf, ", v3 no-legacy-syscalls ABI");
2640 break;
53a346d8
CZ
2641 case E_ARC_OSABI_V4:
2642 strcat (buf, ", v4 ABI");
2643 break;
a9522a21
AB
2644 default:
2645 strcat (buf, ", unrecognised ARC OSABI flag");
2646 break;
2647 }
2648}
2649
f3485b74 2650static void
d3ba0551 2651decode_ARM_machine_flags (unsigned e_flags, char buf[])
f3485b74
NC
2652{
2653 unsigned eabi;
32ec8896 2654 bfd_boolean unknown = FALSE;
f3485b74
NC
2655
2656 eabi = EF_ARM_EABI_VERSION (e_flags);
2657 e_flags &= ~ EF_ARM_EABIMASK;
2658
2659 /* Handle "generic" ARM flags. */
2660 if (e_flags & EF_ARM_RELEXEC)
2661 {
2662 strcat (buf, ", relocatable executable");
2663 e_flags &= ~ EF_ARM_RELEXEC;
2664 }
76da6bbe 2665
18a20338
CL
2666 if (e_flags & EF_ARM_PIC)
2667 {
2668 strcat (buf, ", position independent");
2669 e_flags &= ~ EF_ARM_PIC;
2670 }
2671
f3485b74
NC
2672 /* Now handle EABI specific flags. */
2673 switch (eabi)
2674 {
2675 default:
2c71103e 2676 strcat (buf, ", <unrecognized EABI>");
f3485b74 2677 if (e_flags)
32ec8896 2678 unknown = TRUE;
f3485b74
NC
2679 break;
2680
2681 case EF_ARM_EABI_VER1:
a5bcd848 2682 strcat (buf, ", Version1 EABI");
f3485b74
NC
2683 while (e_flags)
2684 {
2685 unsigned flag;
76da6bbe 2686
f3485b74
NC
2687 /* Process flags one bit at a time. */
2688 flag = e_flags & - e_flags;
2689 e_flags &= ~ flag;
76da6bbe 2690
f3485b74
NC
2691 switch (flag)
2692 {
a5bcd848 2693 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
f3485b74
NC
2694 strcat (buf, ", sorted symbol tables");
2695 break;
76da6bbe 2696
f3485b74 2697 default:
32ec8896 2698 unknown = TRUE;
f3485b74
NC
2699 break;
2700 }
2701 }
2702 break;
76da6bbe 2703
a5bcd848
PB
2704 case EF_ARM_EABI_VER2:
2705 strcat (buf, ", Version2 EABI");
2706 while (e_flags)
2707 {
2708 unsigned flag;
2709
2710 /* Process flags one bit at a time. */
2711 flag = e_flags & - e_flags;
2712 e_flags &= ~ flag;
2713
2714 switch (flag)
2715 {
2716 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2717 strcat (buf, ", sorted symbol tables");
2718 break;
2719
2720 case EF_ARM_DYNSYMSUSESEGIDX:
2721 strcat (buf, ", dynamic symbols use segment index");
2722 break;
2723
2724 case EF_ARM_MAPSYMSFIRST:
2725 strcat (buf, ", mapping symbols precede others");
2726 break;
2727
2728 default:
32ec8896 2729 unknown = TRUE;
a5bcd848
PB
2730 break;
2731 }
2732 }
2733 break;
2734
d507cf36
PB
2735 case EF_ARM_EABI_VER3:
2736 strcat (buf, ", Version3 EABI");
8cb51566
PB
2737 break;
2738
2739 case EF_ARM_EABI_VER4:
2740 strcat (buf, ", Version4 EABI");
3bfcb652
NC
2741 while (e_flags)
2742 {
2743 unsigned flag;
2744
2745 /* Process flags one bit at a time. */
2746 flag = e_flags & - e_flags;
2747 e_flags &= ~ flag;
2748
2749 switch (flag)
2750 {
2751 case EF_ARM_BE8:
2752 strcat (buf, ", BE8");
2753 break;
2754
2755 case EF_ARM_LE8:
2756 strcat (buf, ", LE8");
2757 break;
2758
2759 default:
32ec8896 2760 unknown = TRUE;
3bfcb652
NC
2761 break;
2762 }
3bfcb652
NC
2763 }
2764 break;
3a4a14e9
PB
2765
2766 case EF_ARM_EABI_VER5:
2767 strcat (buf, ", Version5 EABI");
d507cf36
PB
2768 while (e_flags)
2769 {
2770 unsigned flag;
2771
2772 /* Process flags one bit at a time. */
2773 flag = e_flags & - e_flags;
2774 e_flags &= ~ flag;
2775
2776 switch (flag)
2777 {
2778 case EF_ARM_BE8:
2779 strcat (buf, ", BE8");
2780 break;
2781
2782 case EF_ARM_LE8:
2783 strcat (buf, ", LE8");
2784 break;
2785
3bfcb652
NC
2786 case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT. */
2787 strcat (buf, ", soft-float ABI");
2788 break;
2789
2790 case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT. */
2791 strcat (buf, ", hard-float ABI");
2792 break;
2793
d507cf36 2794 default:
32ec8896 2795 unknown = TRUE;
d507cf36
PB
2796 break;
2797 }
2798 }
2799 break;
2800
f3485b74 2801 case EF_ARM_EABI_UNKNOWN:
a5bcd848 2802 strcat (buf, ", GNU EABI");
f3485b74
NC
2803 while (e_flags)
2804 {
2805 unsigned flag;
76da6bbe 2806
f3485b74
NC
2807 /* Process flags one bit at a time. */
2808 flag = e_flags & - e_flags;
2809 e_flags &= ~ flag;
76da6bbe 2810
f3485b74
NC
2811 switch (flag)
2812 {
a5bcd848 2813 case EF_ARM_INTERWORK:
f3485b74
NC
2814 strcat (buf, ", interworking enabled");
2815 break;
76da6bbe 2816
a5bcd848 2817 case EF_ARM_APCS_26:
f3485b74
NC
2818 strcat (buf, ", uses APCS/26");
2819 break;
76da6bbe 2820
a5bcd848 2821 case EF_ARM_APCS_FLOAT:
f3485b74
NC
2822 strcat (buf, ", uses APCS/float");
2823 break;
76da6bbe 2824
a5bcd848 2825 case EF_ARM_PIC:
f3485b74
NC
2826 strcat (buf, ", position independent");
2827 break;
76da6bbe 2828
a5bcd848 2829 case EF_ARM_ALIGN8:
f3485b74
NC
2830 strcat (buf, ", 8 bit structure alignment");
2831 break;
76da6bbe 2832
a5bcd848 2833 case EF_ARM_NEW_ABI:
f3485b74
NC
2834 strcat (buf, ", uses new ABI");
2835 break;
76da6bbe 2836
a5bcd848 2837 case EF_ARM_OLD_ABI:
f3485b74
NC
2838 strcat (buf, ", uses old ABI");
2839 break;
76da6bbe 2840
a5bcd848 2841 case EF_ARM_SOFT_FLOAT:
f3485b74
NC
2842 strcat (buf, ", software FP");
2843 break;
76da6bbe 2844
90e01f86
ILT
2845 case EF_ARM_VFP_FLOAT:
2846 strcat (buf, ", VFP");
2847 break;
2848
fde78edd
NC
2849 case EF_ARM_MAVERICK_FLOAT:
2850 strcat (buf, ", Maverick FP");
2851 break;
2852
f3485b74 2853 default:
32ec8896 2854 unknown = TRUE;
f3485b74
NC
2855 break;
2856 }
2857 }
2858 }
f3485b74
NC
2859
2860 if (unknown)
2b692964 2861 strcat (buf,_(", <unknown>"));
f3485b74
NC
2862}
2863
343433df
AB
2864static void
2865decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2866{
2867 --size; /* Leave space for null terminator. */
2868
2869 switch (e_flags & EF_AVR_MACH)
2870 {
2871 case E_AVR_MACH_AVR1:
2872 strncat (buf, ", avr:1", size);
2873 break;
2874 case E_AVR_MACH_AVR2:
2875 strncat (buf, ", avr:2", size);
2876 break;
2877 case E_AVR_MACH_AVR25:
2878 strncat (buf, ", avr:25", size);
2879 break;
2880 case E_AVR_MACH_AVR3:
2881 strncat (buf, ", avr:3", size);
2882 break;
2883 case E_AVR_MACH_AVR31:
2884 strncat (buf, ", avr:31", size);
2885 break;
2886 case E_AVR_MACH_AVR35:
2887 strncat (buf, ", avr:35", size);
2888 break;
2889 case E_AVR_MACH_AVR4:
2890 strncat (buf, ", avr:4", size);
2891 break;
2892 case E_AVR_MACH_AVR5:
2893 strncat (buf, ", avr:5", size);
2894 break;
2895 case E_AVR_MACH_AVR51:
2896 strncat (buf, ", avr:51", size);
2897 break;
2898 case E_AVR_MACH_AVR6:
2899 strncat (buf, ", avr:6", size);
2900 break;
2901 case E_AVR_MACH_AVRTINY:
2902 strncat (buf, ", avr:100", size);
2903 break;
2904 case E_AVR_MACH_XMEGA1:
2905 strncat (buf, ", avr:101", size);
2906 break;
2907 case E_AVR_MACH_XMEGA2:
2908 strncat (buf, ", avr:102", size);
2909 break;
2910 case E_AVR_MACH_XMEGA3:
2911 strncat (buf, ", avr:103", size);
2912 break;
2913 case E_AVR_MACH_XMEGA4:
2914 strncat (buf, ", avr:104", size);
2915 break;
2916 case E_AVR_MACH_XMEGA5:
2917 strncat (buf, ", avr:105", size);
2918 break;
2919 case E_AVR_MACH_XMEGA6:
2920 strncat (buf, ", avr:106", size);
2921 break;
2922 case E_AVR_MACH_XMEGA7:
2923 strncat (buf, ", avr:107", size);
2924 break;
2925 default:
2926 strncat (buf, ", avr:<unknown>", size);
2927 break;
2928 }
2929
2930 size -= strlen (buf);
2931 if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2932 strncat (buf, ", link-relax", size);
2933}
2934
35c08157
KLC
2935static void
2936decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2937{
2938 unsigned abi;
2939 unsigned arch;
2940 unsigned config;
2941 unsigned version;
32ec8896
NC
2942 bfd_boolean has_fpu = FALSE;
2943 unsigned int r = 0;
35c08157
KLC
2944
2945 static const char *ABI_STRINGS[] =
2946 {
2947 "ABI v0", /* use r5 as return register; only used in N1213HC */
2948 "ABI v1", /* use r0 as return register */
2949 "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2950 "ABI v2fp", /* for FPU */
40c7a7cb
KLC
2951 "AABI",
2952 "ABI2 FP+"
35c08157
KLC
2953 };
2954 static const char *VER_STRINGS[] =
2955 {
2956 "Andes ELF V1.3 or older",
2957 "Andes ELF V1.3.1",
2958 "Andes ELF V1.4"
2959 };
2960 static const char *ARCH_STRINGS[] =
2961 {
2962 "",
2963 "Andes Star v1.0",
2964 "Andes Star v2.0",
2965 "Andes Star v3.0",
2966 "Andes Star v3.0m"
2967 };
2968
2969 abi = EF_NDS_ABI & e_flags;
2970 arch = EF_NDS_ARCH & e_flags;
2971 config = EF_NDS_INST & e_flags;
2972 version = EF_NDS32_ELF_VERSION & e_flags;
2973
2974 memset (buf, 0, size);
2975
2976 switch (abi)
2977 {
2978 case E_NDS_ABI_V0:
2979 case E_NDS_ABI_V1:
2980 case E_NDS_ABI_V2:
2981 case E_NDS_ABI_V2FP:
2982 case E_NDS_ABI_AABI:
40c7a7cb 2983 case E_NDS_ABI_V2FP_PLUS:
35c08157
KLC
2984 /* In case there are holes in the array. */
2985 r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2986 break;
2987
2988 default:
2989 r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2990 break;
2991 }
2992
2993 switch (version)
2994 {
2995 case E_NDS32_ELF_VER_1_2:
2996 case E_NDS32_ELF_VER_1_3:
2997 case E_NDS32_ELF_VER_1_4:
2998 r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2999 break;
3000
3001 default:
3002 r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
3003 break;
3004 }
3005
3006 if (E_NDS_ABI_V0 == abi)
3007 {
3008 /* OLD ABI; only used in N1213HC, has performance extension 1. */
3009 r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
3010 if (arch == E_NDS_ARCH_STAR_V1_0)
3011 r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
3012 return;
3013 }
3014
3015 switch (arch)
3016 {
3017 case E_NDS_ARCH_STAR_V1_0:
3018 case E_NDS_ARCH_STAR_V2_0:
3019 case E_NDS_ARCH_STAR_V3_0:
3020 case E_NDS_ARCH_STAR_V3_M:
3021 r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
3022 break;
3023
3024 default:
3025 r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
3026 /* ARCH version determines how the e_flags are interpreted.
3027 If it is unknown, we cannot proceed. */
3028 return;
3029 }
3030
3031 /* Newer ABI; Now handle architecture specific flags. */
3032 if (arch == E_NDS_ARCH_STAR_V1_0)
3033 {
3034 if (config & E_NDS32_HAS_MFUSR_PC_INST)
3035 r += snprintf (buf + r, size -r, ", MFUSR_PC");
3036
3037 if (!(config & E_NDS32_HAS_NO_MAC_INST))
3038 r += snprintf (buf + r, size -r, ", MAC");
3039
3040 if (config & E_NDS32_HAS_DIV_INST)
3041 r += snprintf (buf + r, size -r, ", DIV");
3042
3043 if (config & E_NDS32_HAS_16BIT_INST)
3044 r += snprintf (buf + r, size -r, ", 16b");
3045 }
3046 else
3047 {
3048 if (config & E_NDS32_HAS_MFUSR_PC_INST)
3049 {
3050 if (version <= E_NDS32_ELF_VER_1_3)
3051 r += snprintf (buf + r, size -r, ", [B8]");
3052 else
3053 r += snprintf (buf + r, size -r, ", EX9");
3054 }
3055
3056 if (config & E_NDS32_HAS_MAC_DX_INST)
3057 r += snprintf (buf + r, size -r, ", MAC_DX");
3058
3059 if (config & E_NDS32_HAS_DIV_DX_INST)
3060 r += snprintf (buf + r, size -r, ", DIV_DX");
3061
3062 if (config & E_NDS32_HAS_16BIT_INST)
3063 {
3064 if (version <= E_NDS32_ELF_VER_1_3)
3065 r += snprintf (buf + r, size -r, ", 16b");
3066 else
3067 r += snprintf (buf + r, size -r, ", IFC");
3068 }
3069 }
3070
3071 if (config & E_NDS32_HAS_EXT_INST)
3072 r += snprintf (buf + r, size -r, ", PERF1");
3073
3074 if (config & E_NDS32_HAS_EXT2_INST)
3075 r += snprintf (buf + r, size -r, ", PERF2");
3076
3077 if (config & E_NDS32_HAS_FPU_INST)
3078 {
32ec8896 3079 has_fpu = TRUE;
35c08157
KLC
3080 r += snprintf (buf + r, size -r, ", FPU_SP");
3081 }
3082
3083 if (config & E_NDS32_HAS_FPU_DP_INST)
3084 {
32ec8896 3085 has_fpu = TRUE;
35c08157
KLC
3086 r += snprintf (buf + r, size -r, ", FPU_DP");
3087 }
3088
3089 if (config & E_NDS32_HAS_FPU_MAC_INST)
3090 {
32ec8896 3091 has_fpu = TRUE;
35c08157
KLC
3092 r += snprintf (buf + r, size -r, ", FPU_MAC");
3093 }
3094
3095 if (has_fpu)
3096 {
3097 switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
3098 {
3099 case E_NDS32_FPU_REG_8SP_4DP:
3100 r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
3101 break;
3102 case E_NDS32_FPU_REG_16SP_8DP:
3103 r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
3104 break;
3105 case E_NDS32_FPU_REG_32SP_16DP:
3106 r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
3107 break;
3108 case E_NDS32_FPU_REG_32SP_32DP:
3109 r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
3110 break;
3111 }
3112 }
3113
3114 if (config & E_NDS32_HAS_AUDIO_INST)
3115 r += snprintf (buf + r, size -r, ", AUDIO");
3116
3117 if (config & E_NDS32_HAS_STRING_INST)
3118 r += snprintf (buf + r, size -r, ", STR");
3119
3120 if (config & E_NDS32_HAS_REDUCED_REGS)
3121 r += snprintf (buf + r, size -r, ", 16REG");
3122
3123 if (config & E_NDS32_HAS_VIDEO_INST)
3124 {
3125 if (version <= E_NDS32_ELF_VER_1_3)
3126 r += snprintf (buf + r, size -r, ", VIDEO");
3127 else
3128 r += snprintf (buf + r, size -r, ", SATURATION");
3129 }
3130
3131 if (config & E_NDS32_HAS_ENCRIPT_INST)
3132 r += snprintf (buf + r, size -r, ", ENCRP");
3133
3134 if (config & E_NDS32_HAS_L2C_INST)
3135 r += snprintf (buf + r, size -r, ", L2C");
3136}
3137
252b5132 3138static char *
dda8d76d 3139get_machine_flags (Filedata * filedata, unsigned e_flags, unsigned e_machine)
252b5132 3140{
b34976b6 3141 static char buf[1024];
252b5132
RH
3142
3143 buf[0] = '\0';
76da6bbe 3144
252b5132
RH
3145 if (e_flags)
3146 {
3147 switch (e_machine)
3148 {
3149 default:
3150 break;
3151
886a2506 3152 case EM_ARC_COMPACT2:
886a2506 3153 case EM_ARC_COMPACT:
a9522a21
AB
3154 decode_ARC_machine_flags (e_flags, e_machine, buf);
3155 break;
886a2506 3156
f3485b74
NC
3157 case EM_ARM:
3158 decode_ARM_machine_flags (e_flags, buf);
3159 break;
76da6bbe 3160
343433df
AB
3161 case EM_AVR:
3162 decode_AVR_machine_flags (e_flags, buf, sizeof buf);
3163 break;
3164
781303ce
MF
3165 case EM_BLACKFIN:
3166 if (e_flags & EF_BFIN_PIC)
3167 strcat (buf, ", PIC");
3168
3169 if (e_flags & EF_BFIN_FDPIC)
3170 strcat (buf, ", FDPIC");
3171
3172 if (e_flags & EF_BFIN_CODE_IN_L1)
3173 strcat (buf, ", code in L1");
3174
3175 if (e_flags & EF_BFIN_DATA_IN_L1)
3176 strcat (buf, ", data in L1");
3177
3178 break;
3179
ec2dfb42
AO
3180 case EM_CYGNUS_FRV:
3181 switch (e_flags & EF_FRV_CPU_MASK)
3182 {
3183 case EF_FRV_CPU_GENERIC:
3184 break;
3185
3186 default:
3187 strcat (buf, ", fr???");
3188 break;
57346661 3189
ec2dfb42
AO
3190 case EF_FRV_CPU_FR300:
3191 strcat (buf, ", fr300");
3192 break;
3193
3194 case EF_FRV_CPU_FR400:
3195 strcat (buf, ", fr400");
3196 break;
3197 case EF_FRV_CPU_FR405:
3198 strcat (buf, ", fr405");
3199 break;
3200
3201 case EF_FRV_CPU_FR450:
3202 strcat (buf, ", fr450");
3203 break;
3204
3205 case EF_FRV_CPU_FR500:
3206 strcat (buf, ", fr500");
3207 break;
3208 case EF_FRV_CPU_FR550:
3209 strcat (buf, ", fr550");
3210 break;
3211
3212 case EF_FRV_CPU_SIMPLE:
3213 strcat (buf, ", simple");
3214 break;
3215 case EF_FRV_CPU_TOMCAT:
3216 strcat (buf, ", tomcat");
3217 break;
3218 }
1c877e87 3219 break;
ec2dfb42 3220
53c7db4b 3221 case EM_68K:
425c6cb0 3222 if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
76f57f3a 3223 strcat (buf, ", m68000");
425c6cb0 3224 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
3bdcfdf4
KH
3225 strcat (buf, ", cpu32");
3226 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
3227 strcat (buf, ", fido_a");
425c6cb0 3228 else
266abb8f 3229 {
2cf0635d
NC
3230 char const * isa = _("unknown");
3231 char const * mac = _("unknown mac");
3232 char const * additional = NULL;
0112cd26 3233
c694fd50 3234 switch (e_flags & EF_M68K_CF_ISA_MASK)
266abb8f 3235 {
c694fd50 3236 case EF_M68K_CF_ISA_A_NODIV:
0b2e31dc
NS
3237 isa = "A";
3238 additional = ", nodiv";
3239 break;
c694fd50 3240 case EF_M68K_CF_ISA_A:
266abb8f
NS
3241 isa = "A";
3242 break;
c694fd50 3243 case EF_M68K_CF_ISA_A_PLUS:
266abb8f
NS
3244 isa = "A+";
3245 break;
c694fd50 3246 case EF_M68K_CF_ISA_B_NOUSP:
0b2e31dc
NS
3247 isa = "B";
3248 additional = ", nousp";
3249 break;
c694fd50 3250 case EF_M68K_CF_ISA_B:
266abb8f
NS
3251 isa = "B";
3252 break;
f608cd77
NS
3253 case EF_M68K_CF_ISA_C:
3254 isa = "C";
3255 break;
3256 case EF_M68K_CF_ISA_C_NODIV:
3257 isa = "C";
3258 additional = ", nodiv";
3259 break;
266abb8f
NS
3260 }
3261 strcat (buf, ", cf, isa ");
3262 strcat (buf, isa);
0b2e31dc
NS
3263 if (additional)
3264 strcat (buf, additional);
c694fd50 3265 if (e_flags & EF_M68K_CF_FLOAT)
0b2e31dc 3266 strcat (buf, ", float");
c694fd50 3267 switch (e_flags & EF_M68K_CF_MAC_MASK)
266abb8f
NS
3268 {
3269 case 0:
3270 mac = NULL;
3271 break;
c694fd50 3272 case EF_M68K_CF_MAC:
266abb8f
NS
3273 mac = "mac";
3274 break;
c694fd50 3275 case EF_M68K_CF_EMAC:
266abb8f
NS
3276 mac = "emac";
3277 break;
f608cd77
NS
3278 case EF_M68K_CF_EMAC_B:
3279 mac = "emac_b";
3280 break;
266abb8f
NS
3281 }
3282 if (mac)
3283 {
3284 strcat (buf, ", ");
3285 strcat (buf, mac);
3286 }
266abb8f 3287 }
53c7db4b 3288 break;
33c63f9d 3289
153a2776
NC
3290 case EM_CYGNUS_MEP:
3291 switch (e_flags & EF_MEP_CPU_MASK)
3292 {
3293 case EF_MEP_CPU_MEP: strcat (buf, ", generic MeP"); break;
3294 case EF_MEP_CPU_C2: strcat (buf, ", MeP C2"); break;
3295 case EF_MEP_CPU_C3: strcat (buf, ", MeP C3"); break;
3296 case EF_MEP_CPU_C4: strcat (buf, ", MeP C4"); break;
3297 case EF_MEP_CPU_C5: strcat (buf, ", MeP C5"); break;
3298 case EF_MEP_CPU_H1: strcat (buf, ", MeP H1"); break;
3299 default: strcat (buf, _(", <unknown MeP cpu type>")); break;
3300 }
3301
3302 switch (e_flags & EF_MEP_COP_MASK)
3303 {
3304 case EF_MEP_COP_NONE: break;
3305 case EF_MEP_COP_AVC: strcat (buf, ", AVC coprocessor"); break;
3306 case EF_MEP_COP_AVC2: strcat (buf, ", AVC2 coprocessor"); break;
3307 case EF_MEP_COP_FMAX: strcat (buf, ", FMAX coprocessor"); break;
3308 case EF_MEP_COP_IVC2: strcat (buf, ", IVC2 coprocessor"); break;
3309 default: strcat (buf, _("<unknown MeP copro type>")); break;
3310 }
3311
3312 if (e_flags & EF_MEP_LIBRARY)
3313 strcat (buf, ", Built for Library");
3314
3315 if (e_flags & EF_MEP_INDEX_MASK)
3316 sprintf (buf + strlen (buf), ", Configuration Index: %#x",
3317 e_flags & EF_MEP_INDEX_MASK);
3318
3319 if (e_flags & ~ EF_MEP_ALL_FLAGS)
3320 sprintf (buf + strlen (buf), _(", unknown flags bits: %#x"),
3321 e_flags & ~ EF_MEP_ALL_FLAGS);
3322 break;
3323
252b5132
RH
3324 case EM_PPC:
3325 if (e_flags & EF_PPC_EMB)
3326 strcat (buf, ", emb");
3327
3328 if (e_flags & EF_PPC_RELOCATABLE)
2b692964 3329 strcat (buf, _(", relocatable"));
252b5132
RH
3330
3331 if (e_flags & EF_PPC_RELOCATABLE_LIB)
2b692964 3332 strcat (buf, _(", relocatable-lib"));
252b5132
RH
3333 break;
3334
ee67d69a
AM
3335 case EM_PPC64:
3336 if (e_flags & EF_PPC64_ABI)
3337 {
3338 char abi[] = ", abiv0";
3339
3340 abi[6] += e_flags & EF_PPC64_ABI;
3341 strcat (buf, abi);
3342 }
3343 break;
3344
708e2187
NC
3345 case EM_V800:
3346 if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
3347 strcat (buf, ", RH850 ABI");
0b4362b0 3348
708e2187
NC
3349 if (e_flags & EF_V800_850E3)
3350 strcat (buf, ", V3 architecture");
3351
3352 if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
3353 strcat (buf, ", FPU not used");
3354
3355 if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
3356 strcat (buf, ", regmode: COMMON");
3357
3358 if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
3359 strcat (buf, ", r4 not used");
3360
3361 if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
3362 strcat (buf, ", r30 not used");
3363
3364 if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
3365 strcat (buf, ", r5 not used");
3366
3367 if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
3368 strcat (buf, ", r2 not used");
3369
3370 for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
3371 {
3372 switch (e_flags & - e_flags)
3373 {
3374 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
3375 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
708e2187
NC
3376 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
3377 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
708e2187
NC
3378 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
3379 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
3380 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
3381 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
3382 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
3383 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
3384 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
3385 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
3386 default: break;
3387 }
3388 }
3389 break;
3390
2b0337b0 3391 case EM_V850:
252b5132
RH
3392 case EM_CYGNUS_V850:
3393 switch (e_flags & EF_V850_ARCH)
3394 {
78c8d46c
NC
3395 case E_V850E3V5_ARCH:
3396 strcat (buf, ", v850e3v5");
3397 break;
1cd986c5
NC
3398 case E_V850E2V3_ARCH:
3399 strcat (buf, ", v850e2v3");
3400 break;
3401 case E_V850E2_ARCH:
3402 strcat (buf, ", v850e2");
3403 break;
3404 case E_V850E1_ARCH:
3405 strcat (buf, ", v850e1");
8ad30312 3406 break;
252b5132
RH
3407 case E_V850E_ARCH:
3408 strcat (buf, ", v850e");
3409 break;
252b5132
RH
3410 case E_V850_ARCH:
3411 strcat (buf, ", v850");
3412 break;
3413 default:
2b692964 3414 strcat (buf, _(", unknown v850 architecture variant"));
252b5132
RH
3415 break;
3416 }
3417 break;
3418
2b0337b0 3419 case EM_M32R:
252b5132
RH
3420 case EM_CYGNUS_M32R:
3421 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3422 strcat (buf, ", m32r");
252b5132
RH
3423 break;
3424
3425 case EM_MIPS:
4fe85591 3426 case EM_MIPS_RS3_LE:
252b5132
RH
3427 if (e_flags & EF_MIPS_NOREORDER)
3428 strcat (buf, ", noreorder");
3429
3430 if (e_flags & EF_MIPS_PIC)
3431 strcat (buf, ", pic");
3432
3433 if (e_flags & EF_MIPS_CPIC)
3434 strcat (buf, ", cpic");
3435
d1bdd336
TS
3436 if (e_flags & EF_MIPS_UCODE)
3437 strcat (buf, ", ugen_reserved");
3438
252b5132
RH
3439 if (e_flags & EF_MIPS_ABI2)
3440 strcat (buf, ", abi2");
3441
43521d43
TS
3442 if (e_flags & EF_MIPS_OPTIONS_FIRST)
3443 strcat (buf, ", odk first");
3444
a5d22d2a
TS
3445 if (e_flags & EF_MIPS_32BITMODE)
3446 strcat (buf, ", 32bitmode");
3447
ba92f887
MR
3448 if (e_flags & EF_MIPS_NAN2008)
3449 strcat (buf, ", nan2008");
3450
fef1b0b3
SE
3451 if (e_flags & EF_MIPS_FP64)
3452 strcat (buf, ", fp64");
3453
156c2f8b
NC
3454 switch ((e_flags & EF_MIPS_MACH))
3455 {
3456 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3457 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3458 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
156c2f8b 3459 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
810dfa6e
L
3460 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3461 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3462 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3463 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
ef272caa 3464 case E_MIPS_MACH_5900: strcat (buf, ", 5900"); break;
c6c98b38 3465 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
ebcb91b7 3466 case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
350cc38d
MS
3467 case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3468 case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
ac8cb70f 3469 case E_MIPS_MACH_GS464: strcat (buf, ", gs464"); break;
bd782c07 3470 case E_MIPS_MACH_GS464E: strcat (buf, ", gs464e"); break;
9108bc33 3471 case E_MIPS_MACH_GS264E: strcat (buf, ", gs264e"); break;
05c6f050 3472 case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
67c2a3e8 3473 case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
d32e5c54 3474 case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
52b6b6b9 3475 case E_MIPS_MACH_XLR: strcat (buf, ", xlr"); break;
38bf472a 3476 case E_MIPS_MACH_IAMR2: strcat (buf, ", interaptiv-mr2"); break;
43521d43
TS
3477 case 0:
3478 /* We simply ignore the field in this case to avoid confusion:
3479 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3480 extension. */
3481 break;
2b692964 3482 default: strcat (buf, _(", unknown CPU")); break;
156c2f8b 3483 }
43521d43
TS
3484
3485 switch ((e_flags & EF_MIPS_ABI))
3486 {
3487 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3488 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3489 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3490 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3491 case 0:
3492 /* We simply ignore the field in this case to avoid confusion:
3493 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3494 This means it is likely to be an o32 file, but not for
3495 sure. */
3496 break;
2b692964 3497 default: strcat (buf, _(", unknown ABI")); break;
43521d43
TS
3498 }
3499
3500 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3501 strcat (buf, ", mdmx");
3502
3503 if (e_flags & EF_MIPS_ARCH_ASE_M16)
3504 strcat (buf, ", mips16");
3505
df58fc94
RS
3506 if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3507 strcat (buf, ", micromips");
3508
43521d43
TS
3509 switch ((e_flags & EF_MIPS_ARCH))
3510 {
3511 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3512 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3513 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3514 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3515 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3516 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
cb44e358 3517 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
7361da2c 3518 case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
43521d43 3519 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
5f74bc13 3520 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
7361da2c 3521 case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
2b692964 3522 default: strcat (buf, _(", unknown ISA")); break;
43521d43 3523 }
252b5132 3524 break;
351b4b40 3525
35c08157
KLC
3526 case EM_NDS32:
3527 decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3528 break;
3529
fe944acf
FT
3530 case EM_NFP:
3531 switch (EF_NFP_MACH (e_flags))
3532 {
3533 case E_NFP_MACH_3200:
3534 strcat (buf, ", NFP-32xx");
3535 break;
3536 case E_NFP_MACH_6000:
3537 strcat (buf, ", NFP-6xxx");
3538 break;
3539 }
3540 break;
3541
e23eba97
NC
3542 case EM_RISCV:
3543 if (e_flags & EF_RISCV_RVC)
3544 strcat (buf, ", RVC");
2922d21d 3545
7f999549
JW
3546 if (e_flags & EF_RISCV_RVE)
3547 strcat (buf, ", RVE");
3548
2922d21d
AW
3549 switch (e_flags & EF_RISCV_FLOAT_ABI)
3550 {
3551 case EF_RISCV_FLOAT_ABI_SOFT:
3552 strcat (buf, ", soft-float ABI");
3553 break;
3554
3555 case EF_RISCV_FLOAT_ABI_SINGLE:
3556 strcat (buf, ", single-float ABI");
3557 break;
3558
3559 case EF_RISCV_FLOAT_ABI_DOUBLE:
3560 strcat (buf, ", double-float ABI");
3561 break;
3562
3563 case EF_RISCV_FLOAT_ABI_QUAD:
3564 strcat (buf, ", quad-float ABI");
3565 break;
3566 }
e23eba97
NC
3567 break;
3568
ccde1100
AO
3569 case EM_SH:
3570 switch ((e_flags & EF_SH_MACH_MASK))
3571 {
3572 case EF_SH1: strcat (buf, ", sh1"); break;
3573 case EF_SH2: strcat (buf, ", sh2"); break;
3574 case EF_SH3: strcat (buf, ", sh3"); break;
3575 case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3576 case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3577 case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3578 case EF_SH3E: strcat (buf, ", sh3e"); break;
3579 case EF_SH4: strcat (buf, ", sh4"); break;
3580 case EF_SH5: strcat (buf, ", sh5"); break;
3581 case EF_SH2E: strcat (buf, ", sh2e"); break;
3582 case EF_SH4A: strcat (buf, ", sh4a"); break;
1d70c7fb 3583 case EF_SH2A: strcat (buf, ", sh2a"); break;
ccde1100
AO
3584 case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3585 case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
1d70c7fb 3586 case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
0b92ab21
NH
3587 case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3588 case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3589 case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3590 case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3591 case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3592 case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
2b692964 3593 default: strcat (buf, _(", unknown ISA")); break;
ccde1100
AO
3594 }
3595
cec6a5b8
MR
3596 if (e_flags & EF_SH_PIC)
3597 strcat (buf, ", pic");
3598
3599 if (e_flags & EF_SH_FDPIC)
3600 strcat (buf, ", fdpic");
ccde1100 3601 break;
948f632f 3602
73589c9d
CS
3603 case EM_OR1K:
3604 if (e_flags & EF_OR1K_NODELAY)
3605 strcat (buf, ", no delay");
3606 break;
57346661 3607
351b4b40
RH
3608 case EM_SPARCV9:
3609 if (e_flags & EF_SPARC_32PLUS)
3610 strcat (buf, ", v8+");
3611
3612 if (e_flags & EF_SPARC_SUN_US1)
d07faca2
RH
3613 strcat (buf, ", ultrasparcI");
3614
3615 if (e_flags & EF_SPARC_SUN_US3)
3616 strcat (buf, ", ultrasparcIII");
351b4b40
RH
3617
3618 if (e_flags & EF_SPARC_HAL_R1)
3619 strcat (buf, ", halr1");
3620
3621 if (e_flags & EF_SPARC_LEDATA)
3622 strcat (buf, ", ledata");
3623
3624 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3625 strcat (buf, ", tso");
3626
3627 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3628 strcat (buf, ", pso");
3629
3630 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3631 strcat (buf, ", rmo");
3632 break;
7d466069 3633
103f02d3
UD
3634 case EM_PARISC:
3635 switch (e_flags & EF_PARISC_ARCH)
3636 {
3637 case EFA_PARISC_1_0:
3638 strcpy (buf, ", PA-RISC 1.0");
3639 break;
3640 case EFA_PARISC_1_1:
3641 strcpy (buf, ", PA-RISC 1.1");
3642 break;
3643 case EFA_PARISC_2_0:
3644 strcpy (buf, ", PA-RISC 2.0");
3645 break;
3646 default:
3647 break;
3648 }
3649 if (e_flags & EF_PARISC_TRAPNIL)
3650 strcat (buf, ", trapnil");
3651 if (e_flags & EF_PARISC_EXT)
3652 strcat (buf, ", ext");
3653 if (e_flags & EF_PARISC_LSB)
3654 strcat (buf, ", lsb");
3655 if (e_flags & EF_PARISC_WIDE)
3656 strcat (buf, ", wide");
3657 if (e_flags & EF_PARISC_NO_KABP)
3658 strcat (buf, ", no kabp");
3659 if (e_flags & EF_PARISC_LAZYSWAP)
3660 strcat (buf, ", lazyswap");
30800947 3661 break;
76da6bbe 3662
7d466069 3663 case EM_PJ:
2b0337b0 3664 case EM_PJ_OLD:
7d466069
ILT
3665 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3666 strcat (buf, ", new calling convention");
3667
3668 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3669 strcat (buf, ", gnu calling convention");
3670 break;
4d6ed7c8
NC
3671
3672 case EM_IA_64:
3673 if ((e_flags & EF_IA_64_ABI64))
3674 strcat (buf, ", 64-bit");
3675 else
3676 strcat (buf, ", 32-bit");
3677 if ((e_flags & EF_IA_64_REDUCEDFP))
3678 strcat (buf, ", reduced fp model");
3679 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3680 strcat (buf, ", no function descriptors, constant gp");
3681 else if ((e_flags & EF_IA_64_CONS_GP))
3682 strcat (buf, ", constant gp");
3683 if ((e_flags & EF_IA_64_ABSOLUTE))
3684 strcat (buf, ", absolute");
dda8d76d 3685 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
28f997cf
TG
3686 {
3687 if ((e_flags & EF_IA_64_VMS_LINKAGES))
3688 strcat (buf, ", vms_linkages");
3689 switch ((e_flags & EF_IA_64_VMS_COMCOD))
3690 {
3691 case EF_IA_64_VMS_COMCOD_SUCCESS:
3692 break;
3693 case EF_IA_64_VMS_COMCOD_WARNING:
3694 strcat (buf, ", warning");
3695 break;
3696 case EF_IA_64_VMS_COMCOD_ERROR:
3697 strcat (buf, ", error");
3698 break;
3699 case EF_IA_64_VMS_COMCOD_ABORT:
3700 strcat (buf, ", abort");
3701 break;
3702 default:
bee0ee85
NC
3703 warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3704 e_flags & EF_IA_64_VMS_COMCOD);
3705 strcat (buf, ", <unknown>");
28f997cf
TG
3706 }
3707 }
4d6ed7c8 3708 break;
179d3252
JT
3709
3710 case EM_VAX:
3711 if ((e_flags & EF_VAX_NONPIC))
3712 strcat (buf, ", non-PIC");
3713 if ((e_flags & EF_VAX_DFLOAT))
3714 strcat (buf, ", D-Float");
3715 if ((e_flags & EF_VAX_GFLOAT))
3716 strcat (buf, ", G-Float");
3717 break;
c7927a3c 3718
619ed720
EB
3719 case EM_VISIUM:
3720 if (e_flags & EF_VISIUM_ARCH_MCM)
3721 strcat (buf, ", mcm");
3722 else if (e_flags & EF_VISIUM_ARCH_MCM24)
3723 strcat (buf, ", mcm24");
3724 if (e_flags & EF_VISIUM_ARCH_GR6)
3725 strcat (buf, ", gr6");
3726 break;
3727
4046d87a 3728 case EM_RL78:
1740ba0c
NC
3729 switch (e_flags & E_FLAG_RL78_CPU_MASK)
3730 {
3731 case E_FLAG_RL78_ANY_CPU: break;
3732 case E_FLAG_RL78_G10: strcat (buf, ", G10"); break;
3733 case E_FLAG_RL78_G13: strcat (buf, ", G13"); break;
3734 case E_FLAG_RL78_G14: strcat (buf, ", G14"); break;
3735 }
856ea05c
KP
3736 if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3737 strcat (buf, ", 64-bit doubles");
4046d87a 3738 break;
0b4362b0 3739
c7927a3c
NC
3740 case EM_RX:
3741 if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3742 strcat (buf, ", 64-bit doubles");
3743 if (e_flags & E_FLAG_RX_DSP)
dd24e3da 3744 strcat (buf, ", dsp");
d4cb0ea0 3745 if (e_flags & E_FLAG_RX_PID)
0b4362b0 3746 strcat (buf, ", pid");
708e2187
NC
3747 if (e_flags & E_FLAG_RX_ABI)
3748 strcat (buf, ", RX ABI");
3525236c
NC
3749 if (e_flags & E_FLAG_RX_SINSNS_SET)
3750 strcat (buf, e_flags & E_FLAG_RX_SINSNS_YES
3751 ? ", uses String instructions" : ", bans String instructions");
a117b0a5
YS
3752 if (e_flags & E_FLAG_RX_V2)
3753 strcat (buf, ", V2");
f87673e0
YS
3754 if (e_flags & E_FLAG_RX_V3)
3755 strcat (buf, ", V3");
d4cb0ea0 3756 break;
55786da2
AK
3757
3758 case EM_S390:
3759 if (e_flags & EF_S390_HIGH_GPRS)
3760 strcat (buf, ", highgprs");
d4cb0ea0 3761 break;
40b36596
JM
3762
3763 case EM_TI_C6000:
3764 if ((e_flags & EF_C6000_REL))
3765 strcat (buf, ", relocatable module");
d4cb0ea0 3766 break;
13761a11
NC
3767
3768 case EM_MSP430:
3769 strcat (buf, _(": architecture variant: "));
3770 switch (e_flags & EF_MSP430_MACH)
3771 {
3772 case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3773 case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3774 case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3775 case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3776 case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3777 case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3778 case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3779 case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3780 case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3781 case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3782 case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3783 case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3784 case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3785 case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3786 case E_MSP430_MACH_MSP430X : strcat (buf, "MSP430X"); break;
3787 default:
3788 strcat (buf, _(": unknown")); break;
3789 }
3790
3791 if (e_flags & ~ EF_MSP430_MACH)
3792 strcat (buf, _(": unknown extra flag bits also present"));
6655dba2
SB
3793 break;
3794
3795 case EM_Z80:
3796 switch (e_flags & EF_Z80_MACH_MSK)
3797 {
3798 case EF_Z80_MACH_Z80: strcat (buf, ", Z80"); break;
3799 case EF_Z80_MACH_Z180: strcat (buf, ", Z180"); break;
3800 case EF_Z80_MACH_R800: strcat (buf, ", R800"); break;
3801 case EF_Z80_MACH_EZ80_Z80: strcat (buf, ", EZ80"); break;
3802 case EF_Z80_MACH_EZ80_ADL: strcat (buf, ", EZ80, ADL"); break;
3803 case EF_Z80_MACH_GBZ80: strcat (buf, ", GBZ80"); break;
9fc0b501 3804 case EF_Z80_MACH_Z80N: strcat (buf, ", Z80N"); break;
6655dba2
SB
3805 default:
3806 strcat (buf, _(", unknown")); break;
3807 }
3808 break;
252b5132
RH
3809 }
3810 }
3811
3812 return buf;
3813}
3814
252b5132 3815static const char *
dda8d76d 3816get_osabi_name (Filedata * filedata, unsigned int osabi)
d3ba0551
AM
3817{
3818 static char buff[32];
3819
3820 switch (osabi)
3821 {
3822 case ELFOSABI_NONE: return "UNIX - System V";
3823 case ELFOSABI_HPUX: return "UNIX - HP-UX";
3824 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
9c55345c 3825 case ELFOSABI_GNU: return "UNIX - GNU";
d3ba0551
AM
3826 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
3827 case ELFOSABI_AIX: return "UNIX - AIX";
3828 case ELFOSABI_IRIX: return "UNIX - IRIX";
3829 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
3830 case ELFOSABI_TRU64: return "UNIX - TRU64";
3831 case ELFOSABI_MODESTO: return "Novell - Modesto";
3832 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
3833 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
3834 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
3b26c801 3835 case ELFOSABI_AROS: return "AROS";
11636f9e 3836 case ELFOSABI_FENIXOS: return "FenixOS";
6d913794
NC
3837 case ELFOSABI_CLOUDABI: return "Nuxi CloudABI";
3838 case ELFOSABI_OPENVOS: return "Stratus Technologies OpenVOS";
d3ba0551 3839 default:
40b36596 3840 if (osabi >= 64)
dda8d76d 3841 switch (filedata->file_header.e_machine)
40b36596
JM
3842 {
3843 case EM_ARM:
3844 switch (osabi)
3845 {
3846 case ELFOSABI_ARM: return "ARM";
18a20338 3847 case ELFOSABI_ARM_FDPIC: return "ARM FDPIC";
40b36596
JM
3848 default:
3849 break;
3850 }
3851 break;
3852
3853 case EM_MSP430:
3854 case EM_MSP430_OLD:
619ed720 3855 case EM_VISIUM:
40b36596
JM
3856 switch (osabi)
3857 {
3858 case ELFOSABI_STANDALONE: return _("Standalone App");
3859 default:
3860 break;
3861 }
3862 break;
3863
3864 case EM_TI_C6000:
3865 switch (osabi)
3866 {
3867 case ELFOSABI_C6000_ELFABI: return _("Bare-metal C6000");
3868 case ELFOSABI_C6000_LINUX: return "Linux C6000";
3869 default:
3870 break;
3871 }
3872 break;
3873
3874 default:
3875 break;
3876 }
e9e44622 3877 snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
d3ba0551
AM
3878 return buff;
3879 }
3880}
3881
a06ea964
NC
3882static const char *
3883get_aarch64_segment_type (unsigned long type)
3884{
3885 switch (type)
3886 {
32ec8896
NC
3887 case PT_AARCH64_ARCHEXT: return "AARCH64_ARCHEXT";
3888 default: return NULL;
a06ea964 3889 }
a06ea964
NC
3890}
3891
b294bdf8
MM
3892static const char *
3893get_arm_segment_type (unsigned long type)
3894{
3895 switch (type)
3896 {
32ec8896
NC
3897 case PT_ARM_EXIDX: return "EXIDX";
3898 default: return NULL;
b294bdf8 3899 }
b294bdf8
MM
3900}
3901
b4cbbe8f
AK
3902static const char *
3903get_s390_segment_type (unsigned long type)
3904{
3905 switch (type)
3906 {
3907 case PT_S390_PGSTE: return "S390_PGSTE";
3908 default: return NULL;
3909 }
3910}
3911
d3ba0551
AM
3912static const char *
3913get_mips_segment_type (unsigned long type)
252b5132
RH
3914{
3915 switch (type)
3916 {
32ec8896
NC
3917 case PT_MIPS_REGINFO: return "REGINFO";
3918 case PT_MIPS_RTPROC: return "RTPROC";
3919 case PT_MIPS_OPTIONS: return "OPTIONS";
3920 case PT_MIPS_ABIFLAGS: return "ABIFLAGS";
3921 default: return NULL;
252b5132 3922 }
252b5132
RH
3923}
3924
103f02d3 3925static const char *
d3ba0551 3926get_parisc_segment_type (unsigned long type)
103f02d3
UD
3927{
3928 switch (type)
3929 {
103f02d3
UD
3930 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
3931 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
61472819 3932 case PT_PARISC_WEAKORDER: return "PARISC_WEAKORDER";
32ec8896 3933 default: return NULL;
103f02d3 3934 }
103f02d3
UD
3935}
3936
4d6ed7c8 3937static const char *
d3ba0551 3938get_ia64_segment_type (unsigned long type)
4d6ed7c8
NC
3939{
3940 switch (type)
3941 {
3942 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
3943 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
32ec8896 3944 default: return NULL;
4d6ed7c8 3945 }
4d6ed7c8
NC
3946}
3947
40b36596
JM
3948static const char *
3949get_tic6x_segment_type (unsigned long type)
3950{
3951 switch (type)
3952 {
32ec8896
NC
3953 case PT_C6000_PHATTR: return "C6000_PHATTR";
3954 default: return NULL;
40b36596 3955 }
40b36596
JM
3956}
3957
df3a023b
AM
3958static const char *
3959get_hpux_segment_type (unsigned long type, unsigned e_machine)
3960{
3961 if (e_machine == EM_PARISC)
3962 switch (type)
3963 {
3964 case PT_HP_TLS: return "HP_TLS";
3965 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
3966 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
3967 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
3968 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
3969 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
3970 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
3971 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
3972 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
3973 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
3974 case PT_HP_PARALLEL: return "HP_PARALLEL";
3975 case PT_HP_FASTBIND: return "HP_FASTBIND";
3976 case PT_HP_OPT_ANNOT: return "HP_OPT_ANNOT";
3977 case PT_HP_HSL_ANNOT: return "HP_HSL_ANNOT";
3978 case PT_HP_STACK: return "HP_STACK";
3979 case PT_HP_CORE_UTSNAME: return "HP_CORE_UTSNAME";
3980 default: return NULL;
3981 }
3982
3983 if (e_machine == EM_IA_64)
3984 switch (type)
3985 {
3986 case PT_HP_TLS: return "HP_TLS";
3987 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
3988 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
3989 case PT_IA_64_HP_STACK: return "HP_STACK";
3990 default: return NULL;
3991 }
3992
3993 return NULL;
3994}
3995
5522f910
NC
3996static const char *
3997get_solaris_segment_type (unsigned long type)
3998{
3999 switch (type)
4000 {
4001 case 0x6464e550: return "PT_SUNW_UNWIND";
4002 case 0x6474e550: return "PT_SUNW_EH_FRAME";
4003 case 0x6ffffff7: return "PT_LOSUNW";
4004 case 0x6ffffffa: return "PT_SUNWBSS";
4005 case 0x6ffffffb: return "PT_SUNWSTACK";
4006 case 0x6ffffffc: return "PT_SUNWDTRACE";
4007 case 0x6ffffffd: return "PT_SUNWCAP";
4008 case 0x6fffffff: return "PT_HISUNW";
32ec8896 4009 default: return NULL;
5522f910
NC
4010 }
4011}
4012
252b5132 4013static const char *
dda8d76d 4014get_segment_type (Filedata * filedata, unsigned long p_type)
252b5132 4015{
b34976b6 4016 static char buff[32];
252b5132
RH
4017
4018 switch (p_type)
4019 {
b34976b6
AM
4020 case PT_NULL: return "NULL";
4021 case PT_LOAD: return "LOAD";
252b5132 4022 case PT_DYNAMIC: return "DYNAMIC";
b34976b6
AM
4023 case PT_INTERP: return "INTERP";
4024 case PT_NOTE: return "NOTE";
4025 case PT_SHLIB: return "SHLIB";
4026 case PT_PHDR: return "PHDR";
13ae64f3 4027 case PT_TLS: return "TLS";
32ec8896 4028 case PT_GNU_EH_FRAME: return "GNU_EH_FRAME";
2b05f1b7 4029 case PT_GNU_STACK: return "GNU_STACK";
8c37241b 4030 case PT_GNU_RELRO: return "GNU_RELRO";
0a59decb 4031 case PT_GNU_PROPERTY: return "GNU_PROPERTY";
65765700 4032
3eba3ef3
NC
4033 case PT_OPENBSD_RANDOMIZE: return "OPENBSD_RANDOMIZE";
4034 case PT_OPENBSD_WXNEEDED: return "OPENBSD_WXNEEDED";
4035 case PT_OPENBSD_BOOTDATA: return "OPENBSD_BOOTDATA";
4036
252b5132 4037 default:
df3a023b 4038 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
252b5132 4039 {
2cf0635d 4040 const char * result;
103f02d3 4041
dda8d76d 4042 switch (filedata->file_header.e_machine)
252b5132 4043 {
a06ea964
NC
4044 case EM_AARCH64:
4045 result = get_aarch64_segment_type (p_type);
4046 break;
b294bdf8
MM
4047 case EM_ARM:
4048 result = get_arm_segment_type (p_type);
4049 break;
252b5132 4050 case EM_MIPS:
4fe85591 4051 case EM_MIPS_RS3_LE:
252b5132
RH
4052 result = get_mips_segment_type (p_type);
4053 break;
103f02d3
UD
4054 case EM_PARISC:
4055 result = get_parisc_segment_type (p_type);
4056 break;
4d6ed7c8
NC
4057 case EM_IA_64:
4058 result = get_ia64_segment_type (p_type);
4059 break;
40b36596
JM
4060 case EM_TI_C6000:
4061 result = get_tic6x_segment_type (p_type);
4062 break;
b4cbbe8f
AK
4063 case EM_S390:
4064 case EM_S390_OLD:
4065 result = get_s390_segment_type (p_type);
4066 break;
252b5132
RH
4067 default:
4068 result = NULL;
4069 break;
4070 }
103f02d3 4071
252b5132
RH
4072 if (result != NULL)
4073 return result;
103f02d3 4074
1a9ccd70 4075 sprintf (buff, "LOPROC+%#lx", p_type - PT_LOPROC);
252b5132
RH
4076 }
4077 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
103f02d3 4078 {
df3a023b 4079 const char * result = NULL;
103f02d3 4080
df3a023b 4081 switch (filedata->file_header.e_ident[EI_OSABI])
103f02d3 4082 {
df3a023b
AM
4083 case ELFOSABI_GNU:
4084 case ELFOSABI_FREEBSD:
4085 if (p_type >= PT_GNU_MBIND_LO && p_type <= PT_GNU_MBIND_HI)
4086 {
4087 sprintf (buff, "GNU_MBIND+%#lx", p_type - PT_GNU_MBIND_LO);
4088 result = buff;
4089 }
103f02d3 4090 break;
df3a023b
AM
4091 case ELFOSABI_HPUX:
4092 result = get_hpux_segment_type (p_type,
4093 filedata->file_header.e_machine);
4094 break;
4095 case ELFOSABI_SOLARIS:
4096 result = get_solaris_segment_type (p_type);
00428cca 4097 break;
103f02d3 4098 default:
103f02d3
UD
4099 break;
4100 }
103f02d3
UD
4101 if (result != NULL)
4102 return result;
4103
1a9ccd70 4104 sprintf (buff, "LOOS+%#lx", p_type - PT_LOOS);
103f02d3 4105 }
252b5132 4106 else
e9e44622 4107 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
252b5132
RH
4108
4109 return buff;
4110 }
4111}
4112
53a346d8
CZ
4113static const char *
4114get_arc_section_type_name (unsigned int sh_type)
4115{
4116 switch (sh_type)
4117 {
4118 case SHT_ARC_ATTRIBUTES: return "ARC_ATTRIBUTES";
4119 default:
4120 break;
4121 }
4122 return NULL;
4123}
4124
252b5132 4125static const char *
d3ba0551 4126get_mips_section_type_name (unsigned int sh_type)
252b5132
RH
4127{
4128 switch (sh_type)
4129 {
b34976b6
AM
4130 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
4131 case SHT_MIPS_MSYM: return "MIPS_MSYM";
4132 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
4133 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
4134 case SHT_MIPS_UCODE: return "MIPS_UCODE";
4135 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
4136 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
4137 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
4138 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
4139 case SHT_MIPS_RELD: return "MIPS_RELD";
4140 case SHT_MIPS_IFACE: return "MIPS_IFACE";
4141 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
4142 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
4143 case SHT_MIPS_SHDR: return "MIPS_SHDR";
4144 case SHT_MIPS_FDESC: return "MIPS_FDESC";
4145 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
4146 case SHT_MIPS_DENSE: return "MIPS_DENSE";
4147 case SHT_MIPS_PDESC: return "MIPS_PDESC";
4148 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
4149 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
4150 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
4151 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
4152 case SHT_MIPS_LINE: return "MIPS_LINE";
4153 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
4154 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
4155 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
4156 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
4157 case SHT_MIPS_DWARF: return "MIPS_DWARF";
4158 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
4159 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
4160 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
4161 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
4162 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
4163 case SHT_MIPS_XLATE: return "MIPS_XLATE";
4164 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
4165 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
4166 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
4167 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
252b5132 4168 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
351cdf24 4169 case SHT_MIPS_ABIFLAGS: return "MIPS_ABIFLAGS";
f16a9783 4170 case SHT_MIPS_XHASH: return "MIPS_XHASH";
252b5132
RH
4171 default:
4172 break;
4173 }
4174 return NULL;
4175}
4176
103f02d3 4177static const char *
d3ba0551 4178get_parisc_section_type_name (unsigned int sh_type)
103f02d3
UD
4179{
4180 switch (sh_type)
4181 {
4182 case SHT_PARISC_EXT: return "PARISC_EXT";
4183 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
4184 case SHT_PARISC_DOC: return "PARISC_DOC";
eec8f817
DA
4185 case SHT_PARISC_ANNOT: return "PARISC_ANNOT";
4186 case SHT_PARISC_SYMEXTN: return "PARISC_SYMEXTN";
4187 case SHT_PARISC_STUBS: return "PARISC_STUBS";
61472819 4188 case SHT_PARISC_DLKM: return "PARISC_DLKM";
32ec8896 4189 default: return NULL;
103f02d3 4190 }
103f02d3
UD
4191}
4192
4d6ed7c8 4193static const char *
dda8d76d 4194get_ia64_section_type_name (Filedata * filedata, unsigned int sh_type)
4d6ed7c8 4195{
18bd398b 4196 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
ecc51f48 4197 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
dda8d76d 4198 return get_osabi_name (filedata, (sh_type & 0x00FF0000) >> 16);
0de14b54 4199
4d6ed7c8
NC
4200 switch (sh_type)
4201 {
148b93f2
NC
4202 case SHT_IA_64_EXT: return "IA_64_EXT";
4203 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
4204 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
4205 case SHT_IA_64_VMS_TRACE: return "VMS_TRACE";
4206 case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
4207 case SHT_IA_64_VMS_DEBUG: return "VMS_DEBUG";
4208 case SHT_IA_64_VMS_DEBUG_STR: return "VMS_DEBUG_STR";
4209 case SHT_IA_64_VMS_LINKAGES: return "VMS_LINKAGES";
4210 case SHT_IA_64_VMS_SYMBOL_VECTOR: return "VMS_SYMBOL_VECTOR";
4211 case SHT_IA_64_VMS_FIXUP: return "VMS_FIXUP";
4d6ed7c8
NC
4212 default:
4213 break;
4214 }
4215 return NULL;
4216}
4217
d2b2c203
DJ
4218static const char *
4219get_x86_64_section_type_name (unsigned int sh_type)
4220{
4221 switch (sh_type)
4222 {
4223 case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
32ec8896 4224 default: return NULL;
d2b2c203 4225 }
d2b2c203
DJ
4226}
4227
a06ea964
NC
4228static const char *
4229get_aarch64_section_type_name (unsigned int sh_type)
4230{
4231 switch (sh_type)
4232 {
32ec8896
NC
4233 case SHT_AARCH64_ATTRIBUTES: return "AARCH64_ATTRIBUTES";
4234 default: return NULL;
a06ea964 4235 }
a06ea964
NC
4236}
4237
40a18ebd
NC
4238static const char *
4239get_arm_section_type_name (unsigned int sh_type)
4240{
4241 switch (sh_type)
4242 {
7f6fed87
NC
4243 case SHT_ARM_EXIDX: return "ARM_EXIDX";
4244 case SHT_ARM_PREEMPTMAP: return "ARM_PREEMPTMAP";
4245 case SHT_ARM_ATTRIBUTES: return "ARM_ATTRIBUTES";
4246 case SHT_ARM_DEBUGOVERLAY: return "ARM_DEBUGOVERLAY";
4247 case SHT_ARM_OVERLAYSECTION: return "ARM_OVERLAYSECTION";
32ec8896 4248 default: return NULL;
40a18ebd 4249 }
40a18ebd
NC
4250}
4251
40b36596
JM
4252static const char *
4253get_tic6x_section_type_name (unsigned int sh_type)
4254{
4255 switch (sh_type)
4256 {
32ec8896
NC
4257 case SHT_C6000_UNWIND: return "C6000_UNWIND";
4258 case SHT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
4259 case SHT_C6000_ATTRIBUTES: return "C6000_ATTRIBUTES";
4260 case SHT_TI_ICODE: return "TI_ICODE";
4261 case SHT_TI_XREF: return "TI_XREF";
4262 case SHT_TI_HANDLER: return "TI_HANDLER";
4263 case SHT_TI_INITINFO: return "TI_INITINFO";
4264 case SHT_TI_PHATTRS: return "TI_PHATTRS";
4265 default: return NULL;
40b36596 4266 }
40b36596
JM
4267}
4268
13761a11 4269static const char *
b0191216 4270get_msp430_section_type_name (unsigned int sh_type)
13761a11
NC
4271{
4272 switch (sh_type)
4273 {
32ec8896
NC
4274 case SHT_MSP430_SEC_FLAGS: return "MSP430_SEC_FLAGS";
4275 case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
4276 case SHT_MSP430_ATTRIBUTES: return "MSP430_ATTRIBUTES";
4277 default: return NULL;
13761a11
NC
4278 }
4279}
4280
fe944acf
FT
4281static const char *
4282get_nfp_section_type_name (unsigned int sh_type)
4283{
4284 switch (sh_type)
4285 {
4286 case SHT_NFP_MECONFIG: return "NFP_MECONFIG";
4287 case SHT_NFP_INITREG: return "NFP_INITREG";
4288 case SHT_NFP_UDEBUG: return "NFP_UDEBUG";
4289 default: return NULL;
4290 }
4291}
4292
685080f2
NC
4293static const char *
4294get_v850_section_type_name (unsigned int sh_type)
4295{
4296 switch (sh_type)
4297 {
32ec8896
NC
4298 case SHT_V850_SCOMMON: return "V850 Small Common";
4299 case SHT_V850_TCOMMON: return "V850 Tiny Common";
4300 case SHT_V850_ZCOMMON: return "V850 Zero Common";
4301 case SHT_RENESAS_IOP: return "RENESAS IOP";
4302 case SHT_RENESAS_INFO: return "RENESAS INFO";
4303 default: return NULL;
685080f2
NC
4304 }
4305}
4306
2dc8dd17
JW
4307static const char *
4308get_riscv_section_type_name (unsigned int sh_type)
4309{
4310 switch (sh_type)
4311 {
4312 case SHT_RISCV_ATTRIBUTES: return "RISCV_ATTRIBUTES";
4313 default: return NULL;
4314 }
4315}
4316
0861f561
CQ
4317static const char *
4318get_csky_section_type_name (unsigned int sh_type)
4319{
4320 switch (sh_type)
4321 {
4322 case SHT_CSKY_ATTRIBUTES: return "CSKY_ATTRIBUTES";
4323 default: return NULL;
4324 }
4325}
4326
252b5132 4327static const char *
dda8d76d 4328get_section_type_name (Filedata * filedata, unsigned int sh_type)
252b5132 4329{
b34976b6 4330 static char buff[32];
9fb71ee4 4331 const char * result;
252b5132
RH
4332
4333 switch (sh_type)
4334 {
4335 case SHT_NULL: return "NULL";
4336 case SHT_PROGBITS: return "PROGBITS";
4337 case SHT_SYMTAB: return "SYMTAB";
4338 case SHT_STRTAB: return "STRTAB";
4339 case SHT_RELA: return "RELA";
4340 case SHT_HASH: return "HASH";
4341 case SHT_DYNAMIC: return "DYNAMIC";
4342 case SHT_NOTE: return "NOTE";
4343 case SHT_NOBITS: return "NOBITS";
4344 case SHT_REL: return "REL";
4345 case SHT_SHLIB: return "SHLIB";
4346 case SHT_DYNSYM: return "DYNSYM";
d1133906
NC
4347 case SHT_INIT_ARRAY: return "INIT_ARRAY";
4348 case SHT_FINI_ARRAY: return "FINI_ARRAY";
4349 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
fdc90cb4 4350 case SHT_GNU_HASH: return "GNU_HASH";
93ebe586 4351 case SHT_GROUP: return "GROUP";
67ce483b 4352 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICES";
252b5132
RH
4353 case SHT_GNU_verdef: return "VERDEF";
4354 case SHT_GNU_verneed: return "VERNEED";
4355 case SHT_GNU_versym: return "VERSYM";
b34976b6
AM
4356 case 0x6ffffff0: return "VERSYM";
4357 case 0x6ffffffc: return "VERDEF";
252b5132
RH
4358 case 0x7ffffffd: return "AUXILIARY";
4359 case 0x7fffffff: return "FILTER";
047b2264 4360 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
252b5132
RH
4361
4362 default:
4363 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
4364 {
dda8d76d 4365 switch (filedata->file_header.e_machine)
252b5132 4366 {
53a346d8
CZ
4367 case EM_ARC:
4368 case EM_ARC_COMPACT:
4369 case EM_ARC_COMPACT2:
4370 result = get_arc_section_type_name (sh_type);
4371 break;
252b5132 4372 case EM_MIPS:
4fe85591 4373 case EM_MIPS_RS3_LE:
252b5132
RH
4374 result = get_mips_section_type_name (sh_type);
4375 break;
103f02d3
UD
4376 case EM_PARISC:
4377 result = get_parisc_section_type_name (sh_type);
4378 break;
4d6ed7c8 4379 case EM_IA_64:
dda8d76d 4380 result = get_ia64_section_type_name (filedata, sh_type);
4d6ed7c8 4381 break;
d2b2c203 4382 case EM_X86_64:
8a9036a4 4383 case EM_L1OM:
7a9068fe 4384 case EM_K1OM:
d2b2c203
DJ
4385 result = get_x86_64_section_type_name (sh_type);
4386 break;
a06ea964
NC
4387 case EM_AARCH64:
4388 result = get_aarch64_section_type_name (sh_type);
4389 break;
40a18ebd
NC
4390 case EM_ARM:
4391 result = get_arm_section_type_name (sh_type);
4392 break;
40b36596
JM
4393 case EM_TI_C6000:
4394 result = get_tic6x_section_type_name (sh_type);
4395 break;
13761a11 4396 case EM_MSP430:
b0191216 4397 result = get_msp430_section_type_name (sh_type);
13761a11 4398 break;
fe944acf
FT
4399 case EM_NFP:
4400 result = get_nfp_section_type_name (sh_type);
4401 break;
685080f2
NC
4402 case EM_V800:
4403 case EM_V850:
4404 case EM_CYGNUS_V850:
4405 result = get_v850_section_type_name (sh_type);
4406 break;
2dc8dd17
JW
4407 case EM_RISCV:
4408 result = get_riscv_section_type_name (sh_type);
4409 break;
0861f561
CQ
4410 case EM_CSKY:
4411 result = get_csky_section_type_name (sh_type);
4412 break;
252b5132
RH
4413 default:
4414 result = NULL;
4415 break;
4416 }
4417
4418 if (result != NULL)
4419 return result;
4420
9fb71ee4 4421 sprintf (buff, "LOPROC+%#x", sh_type - SHT_LOPROC);
252b5132
RH
4422 }
4423 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
148b93f2 4424 {
dda8d76d 4425 switch (filedata->file_header.e_machine)
148b93f2
NC
4426 {
4427 case EM_IA_64:
dda8d76d 4428 result = get_ia64_section_type_name (filedata, sh_type);
148b93f2
NC
4429 break;
4430 default:
dda8d76d 4431 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
fd85a6a1
NC
4432 result = get_solaris_section_type (sh_type);
4433 else
1b4b80bf
NC
4434 {
4435 switch (sh_type)
4436 {
4437 case SHT_GNU_INCREMENTAL_INPUTS: result = "GNU_INCREMENTAL_INPUTS"; break;
4438 case SHT_GNU_ATTRIBUTES: result = "GNU_ATTRIBUTES"; break;
4439 case SHT_GNU_HASH: result = "GNU_HASH"; break;
4440 case SHT_GNU_LIBLIST: result = "GNU_LIBLIST"; break;
4441 default:
4442 result = NULL;
4443 break;
4444 }
4445 }
148b93f2
NC
4446 break;
4447 }
4448
4449 if (result != NULL)
4450 return result;
4451
9fb71ee4 4452 sprintf (buff, "LOOS+%#x", sh_type - SHT_LOOS);
148b93f2 4453 }
252b5132 4454 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
685080f2 4455 {
dda8d76d 4456 switch (filedata->file_header.e_machine)
685080f2
NC
4457 {
4458 case EM_V800:
4459 case EM_V850:
4460 case EM_CYGNUS_V850:
9fb71ee4 4461 result = get_v850_section_type_name (sh_type);
a9fb83be 4462 break;
685080f2 4463 default:
9fb71ee4 4464 result = NULL;
685080f2
NC
4465 break;
4466 }
4467
9fb71ee4
NC
4468 if (result != NULL)
4469 return result;
4470
4471 sprintf (buff, "LOUSER+%#x", sh_type - SHT_LOUSER);
685080f2 4472 }
252b5132 4473 else
a7dbfd1c
NC
4474 /* This message is probably going to be displayed in a 15
4475 character wide field, so put the hex value first. */
4476 snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
103f02d3 4477
252b5132
RH
4478 return buff;
4479 }
4480}
4481
79bc120c
NC
4482enum long_option_values
4483{
4484 OPTION_DEBUG_DUMP = 512,
4485 OPTION_DYN_SYMS,
4486 OPTION_DWARF_DEPTH,
4487 OPTION_DWARF_START,
4488 OPTION_DWARF_CHECK,
4489 OPTION_CTF_DUMP,
4490 OPTION_CTF_PARENT,
4491 OPTION_CTF_SYMBOLS,
4492 OPTION_CTF_STRINGS,
4493 OPTION_WITH_SYMBOL_VERSIONS,
4494 OPTION_RECURSE_LIMIT,
4495 OPTION_NO_RECURSE_LIMIT,
4496 OPTION_NO_DEMANGLING
4497};
2979dc34 4498
85b1c36d 4499static struct option options[] =
252b5132 4500{
79bc120c
NC
4501 /* Note - This table is alpha-sorted on the 'val'
4502 field in order to make adding new options easier. */
4503 {"arch-specific", no_argument, 0, 'A'},
b34976b6 4504 {"all", no_argument, 0, 'a'},
79bc120c
NC
4505 {"demangle", optional_argument, 0, 'C'},
4506 {"archive-index", no_argument, 0, 'c'},
4507 {"use-dynamic", no_argument, 0, 'D'},
4508 {"dynamic", no_argument, 0, 'd'},
b34976b6 4509 {"headers", no_argument, 0, 'e'},
79bc120c
NC
4510 {"section-groups", no_argument, 0, 'g'},
4511 {"help", no_argument, 0, 'H'},
4512 {"file-header", no_argument, 0, 'h'},
b34976b6 4513 {"histogram", no_argument, 0, 'I'},
79bc120c
NC
4514 {"lint", no_argument, 0, 'L'},
4515 {"enable-checks", no_argument, 0, 'L'},
4516 {"program-headers", no_argument, 0, 'l'},
b34976b6 4517 {"segments", no_argument, 0, 'l'},
595cf52e 4518 {"full-section-name",no_argument, 0, 'N'},
79bc120c
NC
4519 {"notes", no_argument, 0, 'n'},
4520 {"string-dump", required_argument, 0, 'p'},
4521 {"relocated-dump", required_argument, 0, 'R'},
4522 {"relocs", no_argument, 0, 'r'},
4523 {"section-headers", no_argument, 0, 'S'},
4524 {"sections", no_argument, 0, 'S'},
b34976b6
AM
4525 {"symbols", no_argument, 0, 's'},
4526 {"syms", no_argument, 0, 's'},
79bc120c
NC
4527 {"silent-truncation",no_argument, 0, 'T'},
4528 {"section-details", no_argument, 0, 't'},
09c11c86 4529 {"unwind", no_argument, 0, 'u'},
79bc120c
NC
4530 {"version-info", no_argument, 0, 'V'},
4531 {"version", no_argument, 0, 'v'},
4532 {"wide", no_argument, 0, 'W'},
b34976b6 4533 {"hex-dump", required_argument, 0, 'x'},
0e602686 4534 {"decompress", no_argument, 0, 'z'},
252b5132 4535
79bc120c
NC
4536 {"no-demangle", no_argument, 0, OPTION_NO_DEMANGLING},
4537 {"recurse-limit", no_argument, NULL, OPTION_RECURSE_LIMIT},
4538 {"no-recurse-limit", no_argument, NULL, OPTION_NO_RECURSE_LIMIT},
4539 {"no-recursion-limit", no_argument, NULL, OPTION_NO_RECURSE_LIMIT},
4540 {"dyn-syms", no_argument, 0, OPTION_DYN_SYMS},
4541 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
fd2f0033
TT
4542 {"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH},
4543 {"dwarf-start", required_argument, 0, OPTION_DWARF_START},
4723351a 4544 {"dwarf-check", no_argument, 0, OPTION_DWARF_CHECK},
094e34f2 4545#ifdef ENABLE_LIBCTF
d344b407 4546 {"ctf", required_argument, 0, OPTION_CTF_DUMP},
7d9813f1
NA
4547 {"ctf-symbols", required_argument, 0, OPTION_CTF_SYMBOLS},
4548 {"ctf-strings", required_argument, 0, OPTION_CTF_STRINGS},
4549 {"ctf-parent", required_argument, 0, OPTION_CTF_PARENT},
094e34f2 4550#endif
7d9813f1 4551
b34976b6 4552 {0, no_argument, 0, 0}
252b5132
RH
4553};
4554
4555static void
2cf0635d 4556usage (FILE * stream)
252b5132 4557{
92f01d61
JM
4558 fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
4559 fprintf (stream, _(" Display information about the contents of ELF format files\n"));
4560 fprintf (stream, _(" Options are:\n\
8b53311e
NC
4561 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4562 -h --file-header Display the ELF file header\n\
4563 -l --program-headers Display the program headers\n\
4564 --segments An alias for --program-headers\n\
4565 -S --section-headers Display the sections' header\n\
4566 --sections An alias for --section-headers\n\
f5842774 4567 -g --section-groups Display the section groups\n\
5477e8a0 4568 -t --section-details Display the section details\n\
8b53311e
NC
4569 -e --headers Equivalent to: -h -l -S\n\
4570 -s --syms Display the symbol table\n\
3f08eb35 4571 --symbols An alias for --syms\n\
1b513401 4572 --dyn-syms Display the dynamic symbol table\n\
79bc120c
NC
4573 -C --demangle[=STYLE] Decode low-level symbol names into user-level names\n\
4574 The STYLE, if specified, can be `auto' (the default),\n\
4575 `gnu', `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n\
4576 or `gnat'\n\
4577 --no-demangle Do not demangle low-level symbol names. (This is the default)\n\
4578 --recurse-limit Enable a demangling recursion limit. (This is the default)\n\
4579 --no-recurse-limit Disable a demangling recursion limit\n\
8b53311e
NC
4580 -n --notes Display the core notes (if present)\n\
4581 -r --relocs Display the relocations (if present)\n\
4582 -u --unwind Display the unwind info (if present)\n\
b2d38a17 4583 -d --dynamic Display the dynamic section (if present)\n\
8b53311e 4584 -V --version-info Display the version sections (if present)\n\
1b31d05e 4585 -A --arch-specific Display architecture specific information (if any)\n\
4145f1d5 4586 -c --archive-index Display the symbol/file index in an archive\n\
8b53311e 4587 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
1b513401 4588 -L --lint|--enable-checks Display warning messages for possible problems\n\
09c11c86
NC
4589 -x --hex-dump=<number|name>\n\
4590 Dump the contents of section <number|name> as bytes\n\
4591 -p --string-dump=<number|name>\n\
4592 Dump the contents of section <number|name> as strings\n\
cf13d699
NC
4593 -R --relocated-dump=<number|name>\n\
4594 Dump the contents of section <number|name> as relocated bytes\n\
0e602686 4595 -z --decompress Decompress section before dumping it\n\
e4b7104b 4596 -w[lLiaprmfFsoORtUuTgAckK] or\n\
1ed06042 4597 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
e4b7104b 4598 =frames-interp,=str,=str-offsets,=loc,=Ranges,=pubtypes,\n\
657d0d47 4599 =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
dda8d76d
NC
4600 =addr,=cu_index,=links,=follow-links]\n\
4601 Display the contents of DWARF debug sections\n"));
fd2f0033
TT
4602 fprintf (stream, _("\
4603 --dwarf-depth=N Do not display DIEs at depth N or greater\n\
4604 --dwarf-start=N Display DIEs starting with N, at the same depth\n\
4605 or deeper\n"));
094e34f2 4606#ifdef ENABLE_LIBCTF
7d9813f1
NA
4607 fprintf (stream, _("\
4608 --ctf=<number|name> Display CTF info from section <number|name>\n\
4609 --ctf-parent=<number|name>\n\
4610 Use section <number|name> as the CTF parent\n\n\
4611 --ctf-symbols=<number|name>\n\
4612 Use section <number|name> as the CTF external symtab\n\n\
4613 --ctf-strings=<number|name>\n\
4614 Use section <number|name> as the CTF external strtab\n\n"));
094e34f2 4615#endif
7d9813f1 4616
252b5132 4617#ifdef SUPPORT_DISASSEMBLY
92f01d61 4618 fprintf (stream, _("\
09c11c86
NC
4619 -i --instruction-dump=<number|name>\n\
4620 Disassemble the contents of section <number|name>\n"));
252b5132 4621#endif
92f01d61 4622 fprintf (stream, _("\
8b53311e
NC
4623 -I --histogram Display histogram of bucket list lengths\n\
4624 -W --wide Allow output width to exceed 80 characters\n\
0942c7ab 4625 -T --silent-truncation If a symbol name is truncated, do not add a suffix [...]\n\
07012eee 4626 @<file> Read options from <file>\n\
8b53311e
NC
4627 -H --help Display this information\n\
4628 -v --version Display the version number of readelf\n"));
1118d252 4629
92f01d61
JM
4630 if (REPORT_BUGS_TO[0] && stream == stdout)
4631 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
252b5132 4632
92f01d61 4633 exit (stream == stdout ? 0 : 1);
252b5132
RH
4634}
4635
18bd398b
NC
4636/* Record the fact that the user wants the contents of section number
4637 SECTION to be displayed using the method(s) encoded as flags bits
4638 in TYPE. Note, TYPE can be zero if we are creating the array for
4639 the first time. */
4640
252b5132 4641static void
6431e409
AM
4642request_dump_bynumber (struct dump_data *dumpdata,
4643 unsigned int section, dump_type type)
252b5132 4644{
6431e409 4645 if (section >= dumpdata->num_dump_sects)
252b5132 4646 {
2cf0635d 4647 dump_type * new_dump_sects;
252b5132 4648
3f5e193b 4649 new_dump_sects = (dump_type *) calloc (section + 1,
dda8d76d 4650 sizeof (* new_dump_sects));
252b5132
RH
4651
4652 if (new_dump_sects == NULL)
591a748a 4653 error (_("Out of memory allocating dump request table.\n"));
252b5132
RH
4654 else
4655 {
6431e409 4656 if (dumpdata->dump_sects)
21b65bac
NC
4657 {
4658 /* Copy current flag settings. */
6431e409
AM
4659 memcpy (new_dump_sects, dumpdata->dump_sects,
4660 dumpdata->num_dump_sects * sizeof (* new_dump_sects));
252b5132 4661
6431e409 4662 free (dumpdata->dump_sects);
21b65bac 4663 }
252b5132 4664
6431e409
AM
4665 dumpdata->dump_sects = new_dump_sects;
4666 dumpdata->num_dump_sects = section + 1;
252b5132
RH
4667 }
4668 }
4669
6431e409
AM
4670 if (dumpdata->dump_sects)
4671 dumpdata->dump_sects[section] |= type;
252b5132
RH
4672}
4673
aef1f6d0
DJ
4674/* Request a dump by section name. */
4675
4676static void
2cf0635d 4677request_dump_byname (const char * section, dump_type type)
aef1f6d0 4678{
2cf0635d 4679 struct dump_list_entry * new_request;
aef1f6d0 4680
3f5e193b
NC
4681 new_request = (struct dump_list_entry *)
4682 malloc (sizeof (struct dump_list_entry));
aef1f6d0 4683 if (!new_request)
591a748a 4684 error (_("Out of memory allocating dump request table.\n"));
aef1f6d0
DJ
4685
4686 new_request->name = strdup (section);
4687 if (!new_request->name)
591a748a 4688 error (_("Out of memory allocating dump request table.\n"));
aef1f6d0
DJ
4689
4690 new_request->type = type;
4691
4692 new_request->next = dump_sects_byname;
4693 dump_sects_byname = new_request;
4694}
4695
cf13d699 4696static inline void
6431e409 4697request_dump (struct dump_data *dumpdata, dump_type type)
cf13d699
NC
4698{
4699 int section;
4700 char * cp;
4701
4702 do_dump++;
4703 section = strtoul (optarg, & cp, 0);
4704
4705 if (! *cp && section >= 0)
6431e409 4706 request_dump_bynumber (dumpdata, section, type);
cf13d699
NC
4707 else
4708 request_dump_byname (optarg, type);
4709}
4710
252b5132 4711static void
6431e409 4712parse_args (struct dump_data *dumpdata, int argc, char ** argv)
252b5132
RH
4713{
4714 int c;
4715
4716 if (argc < 2)
92f01d61 4717 usage (stderr);
252b5132
RH
4718
4719 while ((c = getopt_long
79bc120c 4720 (argc, argv, "ACDHILNR:STVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
252b5132 4721 {
252b5132
RH
4722 switch (c)
4723 {
4724 case 0:
4725 /* Long options. */
4726 break;
4727 case 'H':
92f01d61 4728 usage (stdout);
252b5132
RH
4729 break;
4730
4731 case 'a':
32ec8896
NC
4732 do_syms = TRUE;
4733 do_reloc = TRUE;
4734 do_unwind = TRUE;
4735 do_dynamic = TRUE;
4736 do_header = TRUE;
4737 do_sections = TRUE;
4738 do_section_groups = TRUE;
4739 do_segments = TRUE;
4740 do_version = TRUE;
4741 do_histogram = TRUE;
4742 do_arch = TRUE;
4743 do_notes = TRUE;
252b5132 4744 break;
79bc120c 4745
f5842774 4746 case 'g':
32ec8896 4747 do_section_groups = TRUE;
f5842774 4748 break;
5477e8a0 4749 case 't':
595cf52e 4750 case 'N':
32ec8896
NC
4751 do_sections = TRUE;
4752 do_section_details = TRUE;
595cf52e 4753 break;
252b5132 4754 case 'e':
32ec8896
NC
4755 do_header = TRUE;
4756 do_sections = TRUE;
4757 do_segments = TRUE;
252b5132 4758 break;
a952a375 4759 case 'A':
32ec8896 4760 do_arch = TRUE;
a952a375 4761 break;
252b5132 4762 case 'D':
32ec8896 4763 do_using_dynamic = TRUE;
252b5132
RH
4764 break;
4765 case 'r':
32ec8896 4766 do_reloc = TRUE;
252b5132 4767 break;
4d6ed7c8 4768 case 'u':
32ec8896 4769 do_unwind = TRUE;
4d6ed7c8 4770 break;
252b5132 4771 case 'h':
32ec8896 4772 do_header = TRUE;
252b5132
RH
4773 break;
4774 case 'l':
32ec8896 4775 do_segments = TRUE;
252b5132
RH
4776 break;
4777 case 's':
32ec8896 4778 do_syms = TRUE;
252b5132
RH
4779 break;
4780 case 'S':
32ec8896 4781 do_sections = TRUE;
252b5132
RH
4782 break;
4783 case 'd':
32ec8896 4784 do_dynamic = TRUE;
252b5132 4785 break;
a952a375 4786 case 'I':
32ec8896 4787 do_histogram = TRUE;
a952a375 4788 break;
779fe533 4789 case 'n':
32ec8896 4790 do_notes = TRUE;
779fe533 4791 break;
4145f1d5 4792 case 'c':
32ec8896 4793 do_archive_index = TRUE;
4145f1d5 4794 break;
1b513401
NC
4795 case 'L':
4796 do_checks = TRUE;
4797 break;
252b5132 4798 case 'x':
6431e409 4799 request_dump (dumpdata, HEX_DUMP);
aef1f6d0 4800 break;
09c11c86 4801 case 'p':
6431e409 4802 request_dump (dumpdata, STRING_DUMP);
cf13d699
NC
4803 break;
4804 case 'R':
6431e409 4805 request_dump (dumpdata, RELOC_DUMP);
09c11c86 4806 break;
0e602686 4807 case 'z':
32ec8896 4808 decompress_dumps = TRUE;
0e602686 4809 break;
252b5132 4810 case 'w':
32ec8896 4811 do_dump = TRUE;
252b5132 4812 if (optarg == 0)
613ff48b 4813 {
32ec8896 4814 do_debugging = TRUE;
613ff48b
CC
4815 dwarf_select_sections_all ();
4816 }
252b5132
RH
4817 else
4818 {
32ec8896 4819 do_debugging = FALSE;
4cb93e3b 4820 dwarf_select_sections_by_letters (optarg);
252b5132
RH
4821 }
4822 break;
2979dc34 4823 case OPTION_DEBUG_DUMP:
32ec8896 4824 do_dump = TRUE;
2979dc34 4825 if (optarg == 0)
32ec8896 4826 do_debugging = TRUE;
2979dc34
JJ
4827 else
4828 {
32ec8896 4829 do_debugging = FALSE;
4cb93e3b 4830 dwarf_select_sections_by_names (optarg);
2979dc34
JJ
4831 }
4832 break;
fd2f0033
TT
4833 case OPTION_DWARF_DEPTH:
4834 {
4835 char *cp;
4836
4837 dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4838 }
4839 break;
4840 case OPTION_DWARF_START:
4841 {
4842 char *cp;
4843
4844 dwarf_start_die = strtoul (optarg, & cp, 0);
4845 }
4846 break;
4723351a 4847 case OPTION_DWARF_CHECK:
32ec8896 4848 dwarf_check = TRUE;
4723351a 4849 break;
7d9813f1
NA
4850 case OPTION_CTF_DUMP:
4851 do_ctf = TRUE;
6431e409 4852 request_dump (dumpdata, CTF_DUMP);
7d9813f1
NA
4853 break;
4854 case OPTION_CTF_SYMBOLS:
df16e041 4855 free (dump_ctf_symtab_name);
7d9813f1
NA
4856 dump_ctf_symtab_name = strdup (optarg);
4857 break;
4858 case OPTION_CTF_STRINGS:
df16e041 4859 free (dump_ctf_strtab_name);
7d9813f1
NA
4860 dump_ctf_strtab_name = strdup (optarg);
4861 break;
4862 case OPTION_CTF_PARENT:
df16e041 4863 free (dump_ctf_parent_name);
7d9813f1
NA
4864 dump_ctf_parent_name = strdup (optarg);
4865 break;
2c610e4b 4866 case OPTION_DYN_SYMS:
32ec8896 4867 do_dyn_syms = TRUE;
2c610e4b 4868 break;
252b5132
RH
4869#ifdef SUPPORT_DISASSEMBLY
4870 case 'i':
6431e409 4871 request_dump (dumpdata, DISASS_DUMP);
cf13d699 4872 break;
252b5132
RH
4873#endif
4874 case 'v':
4875 print_version (program_name);
4876 break;
4877 case 'V':
32ec8896 4878 do_version = TRUE;
252b5132 4879 break;
d974e256 4880 case 'W':
32ec8896 4881 do_wide = TRUE;
d974e256 4882 break;
0942c7ab
NC
4883 case 'T':
4884 do_not_show_symbol_truncation = TRUE;
4885 break;
79bc120c
NC
4886 case 'C':
4887 do_demangle = TRUE;
4888 if (optarg != NULL)
4889 {
4890 enum demangling_styles style;
4891
4892 style = cplus_demangle_name_to_style (optarg);
4893 if (style == unknown_demangling)
4894 error (_("unknown demangling style `%s'"), optarg);
4895
4896 cplus_demangle_set_style (style);
4897 }
4898 break;
4899 case OPTION_NO_DEMANGLING:
4900 do_demangle = FALSE;
4901 break;
4902 case OPTION_RECURSE_LIMIT:
4903 demangle_flags &= ~ DMGL_NO_RECURSE_LIMIT;
4904 break;
4905 case OPTION_NO_RECURSE_LIMIT:
4906 demangle_flags |= DMGL_NO_RECURSE_LIMIT;
4907 break;
4908 case OPTION_WITH_SYMBOL_VERSIONS:
4909 /* Ignored for backward compatibility. */
4910 break;
4911
252b5132 4912 default:
252b5132
RH
4913 /* xgettext:c-format */
4914 error (_("Invalid option '-%c'\n"), c);
1a0670f3 4915 /* Fall through. */
252b5132 4916 case '?':
92f01d61 4917 usage (stderr);
252b5132
RH
4918 }
4919 }
4920
4d6ed7c8 4921 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
252b5132 4922 && !do_segments && !do_header && !do_dump && !do_version
f5842774 4923 && !do_histogram && !do_debugging && !do_arch && !do_notes
2c610e4b
L
4924 && !do_section_groups && !do_archive_index
4925 && !do_dyn_syms)
1b513401
NC
4926 {
4927 if (do_checks)
4928 {
4929 check_all = TRUE;
4930 do_dynamic = do_syms = do_reloc = do_unwind = do_sections = TRUE;
4931 do_segments = do_header = do_dump = do_version = TRUE;
4932 do_histogram = do_debugging = do_arch = do_notes = TRUE;
4933 do_section_groups = do_archive_index = do_dyn_syms = TRUE;
4934 }
4935 else
4936 usage (stderr);
4937 }
252b5132
RH
4938}
4939
4940static const char *
d3ba0551 4941get_elf_class (unsigned int elf_class)
252b5132 4942{
b34976b6 4943 static char buff[32];
103f02d3 4944
252b5132
RH
4945 switch (elf_class)
4946 {
4947 case ELFCLASSNONE: return _("none");
e3c8793a
NC
4948 case ELFCLASS32: return "ELF32";
4949 case ELFCLASS64: return "ELF64";
ab5e7794 4950 default:
e9e44622 4951 snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
ab5e7794 4952 return buff;
252b5132
RH
4953 }
4954}
4955
4956static const char *
d3ba0551 4957get_data_encoding (unsigned int encoding)
252b5132 4958{
b34976b6 4959 static char buff[32];
103f02d3 4960
252b5132
RH
4961 switch (encoding)
4962 {
4963 case ELFDATANONE: return _("none");
33c63f9d
CM
4964 case ELFDATA2LSB: return _("2's complement, little endian");
4965 case ELFDATA2MSB: return _("2's complement, big endian");
103f02d3 4966 default:
e9e44622 4967 snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
ab5e7794 4968 return buff;
252b5132
RH
4969 }
4970}
4971
dda8d76d 4972/* Decode the data held in 'filedata->file_header'. */
ee42cf8c 4973
32ec8896 4974static bfd_boolean
dda8d76d 4975process_file_header (Filedata * filedata)
252b5132 4976{
dda8d76d
NC
4977 Elf_Internal_Ehdr * header = & filedata->file_header;
4978
4979 if ( header->e_ident[EI_MAG0] != ELFMAG0
4980 || header->e_ident[EI_MAG1] != ELFMAG1
4981 || header->e_ident[EI_MAG2] != ELFMAG2
4982 || header->e_ident[EI_MAG3] != ELFMAG3)
252b5132
RH
4983 {
4984 error
4985 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
32ec8896 4986 return FALSE;
252b5132
RH
4987 }
4988
955ff7fc 4989 init_dwarf_regnames_by_elf_machine_code (header->e_machine);
2dc4cec1 4990
252b5132
RH
4991 if (do_header)
4992 {
32ec8896 4993 unsigned i;
252b5132
RH
4994
4995 printf (_("ELF Header:\n"));
4996 printf (_(" Magic: "));
b34976b6 4997 for (i = 0; i < EI_NIDENT; i++)
dda8d76d 4998 printf ("%2.2x ", header->e_ident[i]);
252b5132
RH
4999 printf ("\n");
5000 printf (_(" Class: %s\n"),
dda8d76d 5001 get_elf_class (header->e_ident[EI_CLASS]));
252b5132 5002 printf (_(" Data: %s\n"),
dda8d76d 5003 get_data_encoding (header->e_ident[EI_DATA]));
e8a64888 5004 printf (_(" Version: %d%s\n"),
dda8d76d
NC
5005 header->e_ident[EI_VERSION],
5006 (header->e_ident[EI_VERSION] == EV_CURRENT
e8a64888 5007 ? _(" (current)")
dda8d76d 5008 : (header->e_ident[EI_VERSION] != EV_NONE
e8a64888 5009 ? _(" <unknown>")
789be9f7 5010 : "")));
252b5132 5011 printf (_(" OS/ABI: %s\n"),
dda8d76d 5012 get_osabi_name (filedata, header->e_ident[EI_OSABI]));
252b5132 5013 printf (_(" ABI Version: %d\n"),
dda8d76d 5014 header->e_ident[EI_ABIVERSION]);
252b5132 5015 printf (_(" Type: %s\n"),
dda8d76d 5016 get_file_type (header->e_type));
252b5132 5017 printf (_(" Machine: %s\n"),
dda8d76d 5018 get_machine_name (header->e_machine));
252b5132 5019 printf (_(" Version: 0x%lx\n"),
e8a64888 5020 header->e_version);
76da6bbe 5021
f7a99963 5022 printf (_(" Entry point address: "));
e8a64888 5023 print_vma (header->e_entry, PREFIX_HEX);
f7a99963 5024 printf (_("\n Start of program headers: "));
e8a64888 5025 print_vma (header->e_phoff, DEC);
f7a99963 5026 printf (_(" (bytes into file)\n Start of section headers: "));
e8a64888 5027 print_vma (header->e_shoff, DEC);
f7a99963 5028 printf (_(" (bytes into file)\n"));
76da6bbe 5029
252b5132 5030 printf (_(" Flags: 0x%lx%s\n"),
e8a64888 5031 header->e_flags,
dda8d76d 5032 get_machine_flags (filedata, header->e_flags, header->e_machine));
e8a64888
AM
5033 printf (_(" Size of this header: %u (bytes)\n"),
5034 header->e_ehsize);
5035 printf (_(" Size of program headers: %u (bytes)\n"),
5036 header->e_phentsize);
5037 printf (_(" Number of program headers: %u"),
5038 header->e_phnum);
dda8d76d
NC
5039 if (filedata->section_headers != NULL
5040 && header->e_phnum == PN_XNUM
5041 && filedata->section_headers[0].sh_info != 0)
e8a64888
AM
5042 {
5043 header->e_phnum = filedata->section_headers[0].sh_info;
5044 printf (" (%u)", header->e_phnum);
5045 }
2046a35d 5046 putc ('\n', stdout);
e8a64888
AM
5047 printf (_(" Size of section headers: %u (bytes)\n"),
5048 header->e_shentsize);
5049 printf (_(" Number of section headers: %u"),
5050 header->e_shnum);
dda8d76d 5051 if (filedata->section_headers != NULL && header->e_shnum == SHN_UNDEF)
e8a64888
AM
5052 {
5053 header->e_shnum = filedata->section_headers[0].sh_size;
5054 printf (" (%u)", header->e_shnum);
5055 }
560f3c1c 5056 putc ('\n', stdout);
e8a64888
AM
5057 printf (_(" Section header string table index: %u"),
5058 header->e_shstrndx);
dda8d76d
NC
5059 if (filedata->section_headers != NULL
5060 && header->e_shstrndx == (SHN_XINDEX & 0xffff))
e8a64888
AM
5061 {
5062 header->e_shstrndx = filedata->section_headers[0].sh_link;
5063 printf (" (%u)", header->e_shstrndx);
5064 }
5065 if (header->e_shstrndx != SHN_UNDEF
5066 && header->e_shstrndx >= header->e_shnum)
5067 {
5068 header->e_shstrndx = SHN_UNDEF;
5069 printf (_(" <corrupt: out of range>"));
5070 }
560f3c1c
AM
5071 putc ('\n', stdout);
5072 }
5073
dda8d76d 5074 if (filedata->section_headers != NULL)
560f3c1c 5075 {
dda8d76d
NC
5076 if (header->e_phnum == PN_XNUM
5077 && filedata->section_headers[0].sh_info != 0)
5078 header->e_phnum = filedata->section_headers[0].sh_info;
5079 if (header->e_shnum == SHN_UNDEF)
5080 header->e_shnum = filedata->section_headers[0].sh_size;
5081 if (header->e_shstrndx == (SHN_XINDEX & 0xffff))
5082 header->e_shstrndx = filedata->section_headers[0].sh_link;
9c1ce108 5083 if (header->e_shstrndx >= header->e_shnum)
dda8d76d
NC
5084 header->e_shstrndx = SHN_UNDEF;
5085 free (filedata->section_headers);
5086 filedata->section_headers = NULL;
252b5132 5087 }
103f02d3 5088
32ec8896 5089 return TRUE;
9ea033b2
NC
5090}
5091
dda8d76d
NC
5092/* Read in the program headers from FILEDATA and store them in PHEADERS.
5093 Returns TRUE upon success, FALSE otherwise. Loads 32-bit headers. */
5094
e0a31db1 5095static bfd_boolean
dda8d76d 5096get_32bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
9ea033b2 5097{
2cf0635d
NC
5098 Elf32_External_Phdr * phdrs;
5099 Elf32_External_Phdr * external;
5100 Elf_Internal_Phdr * internal;
b34976b6 5101 unsigned int i;
dda8d76d
NC
5102 unsigned int size = filedata->file_header.e_phentsize;
5103 unsigned int num = filedata->file_header.e_phnum;
e0a31db1
NC
5104
5105 /* PR binutils/17531: Cope with unexpected section header sizes. */
5106 if (size == 0 || num == 0)
5107 return FALSE;
5108 if (size < sizeof * phdrs)
5109 {
5110 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
5111 return FALSE;
5112 }
5113 if (size > sizeof * phdrs)
5114 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
103f02d3 5115
dda8d76d 5116 phdrs = (Elf32_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
e0a31db1
NC
5117 size, num, _("program headers"));
5118 if (phdrs == NULL)
5119 return FALSE;
9ea033b2 5120
91d6fa6a 5121 for (i = 0, internal = pheaders, external = phdrs;
dda8d76d 5122 i < filedata->file_header.e_phnum;
b34976b6 5123 i++, internal++, external++)
252b5132 5124 {
9ea033b2
NC
5125 internal->p_type = BYTE_GET (external->p_type);
5126 internal->p_offset = BYTE_GET (external->p_offset);
5127 internal->p_vaddr = BYTE_GET (external->p_vaddr);
5128 internal->p_paddr = BYTE_GET (external->p_paddr);
5129 internal->p_filesz = BYTE_GET (external->p_filesz);
5130 internal->p_memsz = BYTE_GET (external->p_memsz);
5131 internal->p_flags = BYTE_GET (external->p_flags);
5132 internal->p_align = BYTE_GET (external->p_align);
252b5132
RH
5133 }
5134
9ea033b2 5135 free (phdrs);
e0a31db1 5136 return TRUE;
252b5132
RH
5137}
5138
dda8d76d
NC
5139/* Read in the program headers from FILEDATA and store them in PHEADERS.
5140 Returns TRUE upon success, FALSE otherwise. Loads 64-bit headers. */
5141
e0a31db1 5142static bfd_boolean
dda8d76d 5143get_64bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
9ea033b2 5144{
2cf0635d
NC
5145 Elf64_External_Phdr * phdrs;
5146 Elf64_External_Phdr * external;
5147 Elf_Internal_Phdr * internal;
b34976b6 5148 unsigned int i;
dda8d76d
NC
5149 unsigned int size = filedata->file_header.e_phentsize;
5150 unsigned int num = filedata->file_header.e_phnum;
e0a31db1
NC
5151
5152 /* PR binutils/17531: Cope with unexpected section header sizes. */
5153 if (size == 0 || num == 0)
5154 return FALSE;
5155 if (size < sizeof * phdrs)
5156 {
5157 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
5158 return FALSE;
5159 }
5160 if (size > sizeof * phdrs)
5161 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
103f02d3 5162
dda8d76d 5163 phdrs = (Elf64_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
e0a31db1 5164 size, num, _("program headers"));
a6e9f9df 5165 if (!phdrs)
e0a31db1 5166 return FALSE;
9ea033b2 5167
91d6fa6a 5168 for (i = 0, internal = pheaders, external = phdrs;
dda8d76d 5169 i < filedata->file_header.e_phnum;
b34976b6 5170 i++, internal++, external++)
9ea033b2
NC
5171 {
5172 internal->p_type = BYTE_GET (external->p_type);
5173 internal->p_flags = BYTE_GET (external->p_flags);
66543521
AM
5174 internal->p_offset = BYTE_GET (external->p_offset);
5175 internal->p_vaddr = BYTE_GET (external->p_vaddr);
5176 internal->p_paddr = BYTE_GET (external->p_paddr);
5177 internal->p_filesz = BYTE_GET (external->p_filesz);
5178 internal->p_memsz = BYTE_GET (external->p_memsz);
5179 internal->p_align = BYTE_GET (external->p_align);
9ea033b2
NC
5180 }
5181
5182 free (phdrs);
e0a31db1 5183 return TRUE;
9ea033b2 5184}
252b5132 5185
32ec8896 5186/* Returns TRUE if the program headers were read into `program_headers'. */
d93f0186 5187
32ec8896 5188static bfd_boolean
dda8d76d 5189get_program_headers (Filedata * filedata)
d93f0186 5190{
2cf0635d 5191 Elf_Internal_Phdr * phdrs;
d93f0186
NC
5192
5193 /* Check cache of prior read. */
dda8d76d 5194 if (filedata->program_headers != NULL)
32ec8896 5195 return TRUE;
d93f0186 5196
82156ab7
NC
5197 /* Be kind to memory checkers by looking for
5198 e_phnum values which we know must be invalid. */
dda8d76d 5199 if (filedata->file_header.e_phnum
82156ab7 5200 * (is_32bit_elf ? sizeof (Elf32_External_Phdr) : sizeof (Elf64_External_Phdr))
dda8d76d 5201 >= filedata->file_size)
82156ab7
NC
5202 {
5203 error (_("Too many program headers - %#x - the file is not that big\n"),
dda8d76d 5204 filedata->file_header.e_phnum);
82156ab7
NC
5205 return FALSE;
5206 }
d93f0186 5207
dda8d76d 5208 phdrs = (Elf_Internal_Phdr *) cmalloc (filedata->file_header.e_phnum,
82156ab7 5209 sizeof (Elf_Internal_Phdr));
d93f0186
NC
5210 if (phdrs == NULL)
5211 {
8b73c356 5212 error (_("Out of memory reading %u program headers\n"),
dda8d76d 5213 filedata->file_header.e_phnum);
32ec8896 5214 return FALSE;
d93f0186
NC
5215 }
5216
5217 if (is_32bit_elf
dda8d76d
NC
5218 ? get_32bit_program_headers (filedata, phdrs)
5219 : get_64bit_program_headers (filedata, phdrs))
d93f0186 5220 {
dda8d76d 5221 filedata->program_headers = phdrs;
32ec8896 5222 return TRUE;
d93f0186
NC
5223 }
5224
5225 free (phdrs);
32ec8896 5226 return FALSE;
d93f0186
NC
5227}
5228
32ec8896 5229/* Returns TRUE if the program headers were loaded. */
2f62977e 5230
32ec8896 5231static bfd_boolean
dda8d76d 5232process_program_headers (Filedata * filedata)
252b5132 5233{
2cf0635d 5234 Elf_Internal_Phdr * segment;
b34976b6 5235 unsigned int i;
1a9ccd70 5236 Elf_Internal_Phdr * previous_load = NULL;
252b5132 5237
978c4450
AM
5238 filedata->dynamic_addr = 0;
5239 filedata->dynamic_size = 0;
663f67df 5240
dda8d76d 5241 if (filedata->file_header.e_phnum == 0)
252b5132 5242 {
82f2dbf7 5243 /* PR binutils/12467. */
dda8d76d 5244 if (filedata->file_header.e_phoff != 0)
32ec8896
NC
5245 {
5246 warn (_("possibly corrupt ELF header - it has a non-zero program"
5247 " header offset, but no program headers\n"));
5248 return FALSE;
5249 }
82f2dbf7 5250 else if (do_segments)
252b5132 5251 printf (_("\nThere are no program headers in this file.\n"));
32ec8896 5252 return TRUE;
252b5132
RH
5253 }
5254
5255 if (do_segments && !do_header)
5256 {
dda8d76d
NC
5257 printf (_("\nElf file type is %s\n"), get_file_type (filedata->file_header.e_type));
5258 printf (_("Entry point 0x%s\n"), bfd_vmatoa ("x", filedata->file_header.e_entry));
d3a49aa8
AM
5259 printf (ngettext ("There is %d program header, starting at offset %s\n",
5260 "There are %d program headers, starting at offset %s\n",
dda8d76d
NC
5261 filedata->file_header.e_phnum),
5262 filedata->file_header.e_phnum,
5263 bfd_vmatoa ("u", filedata->file_header.e_phoff));
252b5132
RH
5264 }
5265
dda8d76d 5266 if (! get_program_headers (filedata))
6b4bf3bc 5267 return TRUE;
103f02d3 5268
252b5132
RH
5269 if (do_segments)
5270 {
dda8d76d 5271 if (filedata->file_header.e_phnum > 1)
3a1a2036
NC
5272 printf (_("\nProgram Headers:\n"));
5273 else
5274 printf (_("\nProgram Headers:\n"));
76da6bbe 5275
f7a99963
NC
5276 if (is_32bit_elf)
5277 printf
5278 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
d974e256
JJ
5279 else if (do_wide)
5280 printf
5281 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
f7a99963
NC
5282 else
5283 {
5284 printf
5285 (_(" Type Offset VirtAddr PhysAddr\n"));
5286 printf
5287 (_(" FileSiz MemSiz Flags Align\n"));
5288 }
252b5132
RH
5289 }
5290
dda8d76d
NC
5291 for (i = 0, segment = filedata->program_headers;
5292 i < filedata->file_header.e_phnum;
b34976b6 5293 i++, segment++)
252b5132
RH
5294 {
5295 if (do_segments)
5296 {
dda8d76d 5297 printf (" %-14.14s ", get_segment_type (filedata, segment->p_type));
f7a99963
NC
5298
5299 if (is_32bit_elf)
5300 {
5301 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
5302 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
5303 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
5304 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
5305 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
5306 printf ("%c%c%c ",
5307 (segment->p_flags & PF_R ? 'R' : ' '),
5308 (segment->p_flags & PF_W ? 'W' : ' '),
5309 (segment->p_flags & PF_X ? 'E' : ' '));
5310 printf ("%#lx", (unsigned long) segment->p_align);
5311 }
d974e256
JJ
5312 else if (do_wide)
5313 {
5314 if ((unsigned long) segment->p_offset == segment->p_offset)
5315 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
5316 else
5317 {
5318 print_vma (segment->p_offset, FULL_HEX);
5319 putchar (' ');
5320 }
5321
5322 print_vma (segment->p_vaddr, FULL_HEX);
5323 putchar (' ');
5324 print_vma (segment->p_paddr, FULL_HEX);
5325 putchar (' ');
5326
5327 if ((unsigned long) segment->p_filesz == segment->p_filesz)
5328 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
5329 else
5330 {
5331 print_vma (segment->p_filesz, FULL_HEX);
5332 putchar (' ');
5333 }
5334
5335 if ((unsigned long) segment->p_memsz == segment->p_memsz)
5336 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
5337 else
5338 {
f48e6c45 5339 print_vma (segment->p_memsz, FULL_HEX);
d974e256
JJ
5340 }
5341
5342 printf (" %c%c%c ",
5343 (segment->p_flags & PF_R ? 'R' : ' '),
5344 (segment->p_flags & PF_W ? 'W' : ' '),
5345 (segment->p_flags & PF_X ? 'E' : ' '));
5346
5347 if ((unsigned long) segment->p_align == segment->p_align)
5348 printf ("%#lx", (unsigned long) segment->p_align);
5349 else
5350 {
5351 print_vma (segment->p_align, PREFIX_HEX);
5352 }
5353 }
f7a99963
NC
5354 else
5355 {
5356 print_vma (segment->p_offset, FULL_HEX);
5357 putchar (' ');
5358 print_vma (segment->p_vaddr, FULL_HEX);
5359 putchar (' ');
5360 print_vma (segment->p_paddr, FULL_HEX);
5361 printf ("\n ");
5362 print_vma (segment->p_filesz, FULL_HEX);
5363 putchar (' ');
5364 print_vma (segment->p_memsz, FULL_HEX);
5365 printf (" %c%c%c ",
5366 (segment->p_flags & PF_R ? 'R' : ' '),
5367 (segment->p_flags & PF_W ? 'W' : ' '),
5368 (segment->p_flags & PF_X ? 'E' : ' '));
1d262527 5369 print_vma (segment->p_align, PREFIX_HEX);
f7a99963 5370 }
252b5132 5371
1a9ccd70
NC
5372 putc ('\n', stdout);
5373 }
f54498b4 5374
252b5132
RH
5375 switch (segment->p_type)
5376 {
1a9ccd70 5377 case PT_LOAD:
502d895c
NC
5378#if 0 /* Do not warn about out of order PT_LOAD segments. Although officially
5379 required by the ELF standard, several programs, including the Linux
5380 kernel, make use of non-ordered segments. */
1a9ccd70
NC
5381 if (previous_load
5382 && previous_load->p_vaddr > segment->p_vaddr)
5383 error (_("LOAD segments must be sorted in order of increasing VirtAddr\n"));
502d895c 5384#endif
1a9ccd70
NC
5385 if (segment->p_memsz < segment->p_filesz)
5386 error (_("the segment's file size is larger than its memory size\n"));
5387 previous_load = segment;
5388 break;
5389
5390 case PT_PHDR:
5391 /* PR 20815 - Verify that the program header is loaded into memory. */
5392 if (i > 0 && previous_load != NULL)
5393 error (_("the PHDR segment must occur before any LOAD segment\n"));
dda8d76d 5394 if (filedata->file_header.e_machine != EM_PARISC)
1a9ccd70
NC
5395 {
5396 unsigned int j;
5397
dda8d76d 5398 for (j = 1; j < filedata->file_header.e_phnum; j++)
c0c121b0
AM
5399 {
5400 Elf_Internal_Phdr *load = filedata->program_headers + j;
5401 if (load->p_type == PT_LOAD
5402 && load->p_offset <= segment->p_offset
5403 && (load->p_offset + load->p_filesz
5404 >= segment->p_offset + segment->p_filesz)
5405 && load->p_vaddr <= segment->p_vaddr
5406 && (load->p_vaddr + load->p_filesz
5407 >= segment->p_vaddr + segment->p_filesz))
5408 break;
5409 }
dda8d76d 5410 if (j == filedata->file_header.e_phnum)
1a9ccd70
NC
5411 error (_("the PHDR segment is not covered by a LOAD segment\n"));
5412 }
5413 break;
5414
252b5132 5415 case PT_DYNAMIC:
978c4450 5416 if (filedata->dynamic_addr)
252b5132
RH
5417 error (_("more than one dynamic segment\n"));
5418
20737c13
AM
5419 /* By default, assume that the .dynamic section is the first
5420 section in the DYNAMIC segment. */
978c4450
AM
5421 filedata->dynamic_addr = segment->p_offset;
5422 filedata->dynamic_size = segment->p_filesz;
20737c13 5423
b2d38a17
NC
5424 /* Try to locate the .dynamic section. If there is
5425 a section header table, we can easily locate it. */
dda8d76d 5426 if (filedata->section_headers != NULL)
b2d38a17 5427 {
2cf0635d 5428 Elf_Internal_Shdr * sec;
b2d38a17 5429
dda8d76d 5430 sec = find_section (filedata, ".dynamic");
89fac5e3 5431 if (sec == NULL || sec->sh_size == 0)
b2d38a17 5432 {
28f997cf
TG
5433 /* A corresponding .dynamic section is expected, but on
5434 IA-64/OpenVMS it is OK for it to be missing. */
dda8d76d 5435 if (!is_ia64_vms (filedata))
28f997cf 5436 error (_("no .dynamic section in the dynamic segment\n"));
b2d38a17
NC
5437 break;
5438 }
5439
42bb2e33 5440 if (sec->sh_type == SHT_NOBITS)
20737c13 5441 {
978c4450 5442 filedata->dynamic_size = 0;
20737c13
AM
5443 break;
5444 }
42bb2e33 5445
978c4450
AM
5446 filedata->dynamic_addr = sec->sh_offset;
5447 filedata->dynamic_size = sec->sh_size;
b2d38a17 5448
8ac10c5b
L
5449 /* The PT_DYNAMIC segment, which is used by the run-time
5450 loader, should exactly match the .dynamic section. */
5451 if (do_checks
5452 && (filedata->dynamic_addr != segment->p_offset
5453 || filedata->dynamic_size != segment->p_filesz))
5454 warn (_("\
5455the .dynamic section is not the same as the dynamic segment\n"));
b2d38a17 5456 }
39e224f6
MW
5457
5458 /* PR binutils/17512: Avoid corrupt dynamic section info in the
5459 segment. Check this after matching against the section headers
5460 so we don't warn on debuginfo file (which have NOBITS .dynamic
5461 sections). */
978c4450
AM
5462 if (filedata->dynamic_addr > filedata->file_size
5463 || (filedata->dynamic_size
5464 > filedata->file_size - filedata->dynamic_addr))
39e224f6
MW
5465 {
5466 error (_("the dynamic segment offset + size exceeds the size of the file\n"));
978c4450 5467 filedata->dynamic_addr = filedata->dynamic_size = 0;
39e224f6 5468 }
252b5132
RH
5469 break;
5470
5471 case PT_INTERP:
978c4450
AM
5472 if (fseek (filedata->handle,
5473 filedata->archive_file_offset + (long) segment->p_offset,
fb52b2f4 5474 SEEK_SET))
252b5132
RH
5475 error (_("Unable to find program interpreter name\n"));
5476 else
5477 {
f8eae8b2 5478 char fmt [32];
9495b2e6 5479 int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
f8eae8b2
L
5480
5481 if (ret >= (int) sizeof (fmt) || ret < 0)
591a748a 5482 error (_("Internal error: failed to create format string to display program interpreter\n"));
f8eae8b2 5483
978c4450
AM
5484 filedata->program_interpreter[0] = 0;
5485 if (fscanf (filedata->handle, fmt,
5486 filedata->program_interpreter) <= 0)
7bd7b3ef 5487 error (_("Unable to read program interpreter name\n"));
252b5132
RH
5488
5489 if (do_segments)
f54498b4 5490 printf (_(" [Requesting program interpreter: %s]\n"),
978c4450 5491 filedata->program_interpreter);
252b5132
RH
5492 }
5493 break;
5494 }
252b5132
RH
5495 }
5496
dda8d76d
NC
5497 if (do_segments
5498 && filedata->section_headers != NULL
5499 && filedata->string_table != NULL)
252b5132
RH
5500 {
5501 printf (_("\n Section to Segment mapping:\n"));
5502 printf (_(" Segment Sections...\n"));
5503
dda8d76d 5504 for (i = 0; i < filedata->file_header.e_phnum; i++)
252b5132 5505 {
9ad5cbcf 5506 unsigned int j;
2cf0635d 5507 Elf_Internal_Shdr * section;
252b5132 5508
dda8d76d
NC
5509 segment = filedata->program_headers + i;
5510 section = filedata->section_headers + 1;
252b5132
RH
5511
5512 printf (" %2.2d ", i);
5513
dda8d76d 5514 for (j = 1; j < filedata->file_header.e_shnum; j++, section++)
252b5132 5515 {
f4638467
AM
5516 if (!ELF_TBSS_SPECIAL (section, segment)
5517 && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
dda8d76d 5518 printf ("%s ", printable_section_name (filedata, section));
252b5132
RH
5519 }
5520
5521 putc ('\n',stdout);
5522 }
5523 }
5524
32ec8896 5525 return TRUE;
252b5132
RH
5526}
5527
5528
d93f0186
NC
5529/* Find the file offset corresponding to VMA by using the program headers. */
5530
5531static long
dda8d76d 5532offset_from_vma (Filedata * filedata, bfd_vma vma, bfd_size_type size)
d93f0186 5533{
2cf0635d 5534 Elf_Internal_Phdr * seg;
d93f0186 5535
dda8d76d 5536 if (! get_program_headers (filedata))
d93f0186
NC
5537 {
5538 warn (_("Cannot interpret virtual addresses without program headers.\n"));
5539 return (long) vma;
5540 }
5541
dda8d76d
NC
5542 for (seg = filedata->program_headers;
5543 seg < filedata->program_headers + filedata->file_header.e_phnum;
d93f0186
NC
5544 ++seg)
5545 {
5546 if (seg->p_type != PT_LOAD)
5547 continue;
5548
5549 if (vma >= (seg->p_vaddr & -seg->p_align)
5550 && vma + size <= seg->p_vaddr + seg->p_filesz)
5551 return vma - seg->p_vaddr + seg->p_offset;
5552 }
5553
5554 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
0af1713e 5555 (unsigned long) vma);
d93f0186
NC
5556 return (long) vma;
5557}
5558
5559
dda8d76d
NC
5560/* Allocate memory and load the sections headers into FILEDATA->filedata->section_headers.
5561 If PROBE is true, this is just a probe and we do not generate any error
5562 messages if the load fails. */
049b0c3a
NC
5563
5564static bfd_boolean
dda8d76d 5565get_32bit_section_headers (Filedata * filedata, bfd_boolean probe)
252b5132 5566{
2cf0635d
NC
5567 Elf32_External_Shdr * shdrs;
5568 Elf_Internal_Shdr * internal;
dda8d76d
NC
5569 unsigned int i;
5570 unsigned int size = filedata->file_header.e_shentsize;
5571 unsigned int num = probe ? 1 : filedata->file_header.e_shnum;
049b0c3a
NC
5572
5573 /* PR binutils/17531: Cope with unexpected section header sizes. */
5574 if (size == 0 || num == 0)
5575 return FALSE;
5576 if (size < sizeof * shdrs)
5577 {
5578 if (! probe)
5579 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5580 return FALSE;
5581 }
5582 if (!probe && size > sizeof * shdrs)
5583 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
252b5132 5584
dda8d76d 5585 shdrs = (Elf32_External_Shdr *) get_data (NULL, filedata, filedata->file_header.e_shoff,
049b0c3a
NC
5586 size, num,
5587 probe ? NULL : _("section headers"));
5588 if (shdrs == NULL)
5589 return FALSE;
252b5132 5590
dda8d76d
NC
5591 free (filedata->section_headers);
5592 filedata->section_headers = (Elf_Internal_Shdr *)
5593 cmalloc (num, sizeof (Elf_Internal_Shdr));
5594 if (filedata->section_headers == NULL)
252b5132 5595 {
049b0c3a 5596 if (!probe)
8b73c356 5597 error (_("Out of memory reading %u section headers\n"), num);
e3d39609 5598 free (shdrs);
049b0c3a 5599 return FALSE;
252b5132
RH
5600 }
5601
dda8d76d 5602 for (i = 0, internal = filedata->section_headers;
560f3c1c 5603 i < num;
b34976b6 5604 i++, internal++)
252b5132
RH
5605 {
5606 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5607 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
5608 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5609 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5610 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5611 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5612 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5613 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5614 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5615 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
315350be
NC
5616 if (!probe && internal->sh_link > num)
5617 warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5618 if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5619 warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
252b5132
RH
5620 }
5621
5622 free (shdrs);
049b0c3a 5623 return TRUE;
252b5132
RH
5624}
5625
dda8d76d
NC
5626/* Like get_32bit_section_headers, except that it fetches 64-bit headers. */
5627
049b0c3a 5628static bfd_boolean
dda8d76d 5629get_64bit_section_headers (Filedata * filedata, bfd_boolean probe)
9ea033b2 5630{
dda8d76d
NC
5631 Elf64_External_Shdr * shdrs;
5632 Elf_Internal_Shdr * internal;
5633 unsigned int i;
5634 unsigned int size = filedata->file_header.e_shentsize;
5635 unsigned int num = probe ? 1 : filedata->file_header.e_shnum;
049b0c3a
NC
5636
5637 /* PR binutils/17531: Cope with unexpected section header sizes. */
5638 if (size == 0 || num == 0)
5639 return FALSE;
dda8d76d 5640
049b0c3a
NC
5641 if (size < sizeof * shdrs)
5642 {
5643 if (! probe)
5644 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5645 return FALSE;
5646 }
dda8d76d 5647
049b0c3a
NC
5648 if (! probe && size > sizeof * shdrs)
5649 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
9ea033b2 5650
dda8d76d
NC
5651 shdrs = (Elf64_External_Shdr *) get_data (NULL, filedata,
5652 filedata->file_header.e_shoff,
049b0c3a
NC
5653 size, num,
5654 probe ? NULL : _("section headers"));
5655 if (shdrs == NULL)
5656 return FALSE;
9ea033b2 5657
dda8d76d
NC
5658 free (filedata->section_headers);
5659 filedata->section_headers = (Elf_Internal_Shdr *)
5660 cmalloc (num, sizeof (Elf_Internal_Shdr));
5661 if (filedata->section_headers == NULL)
9ea033b2 5662 {
049b0c3a 5663 if (! probe)
8b73c356 5664 error (_("Out of memory reading %u section headers\n"), num);
e3d39609 5665 free (shdrs);
049b0c3a 5666 return FALSE;
9ea033b2
NC
5667 }
5668
dda8d76d 5669 for (i = 0, internal = filedata->section_headers;
560f3c1c 5670 i < num;
b34976b6 5671 i++, internal++)
9ea033b2
NC
5672 {
5673 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5674 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
66543521
AM
5675 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5676 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5677 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5678 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
9ea033b2
NC
5679 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5680 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5681 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5682 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
315350be
NC
5683 if (!probe && internal->sh_link > num)
5684 warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5685 if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5686 warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
9ea033b2
NC
5687 }
5688
5689 free (shdrs);
049b0c3a 5690 return TRUE;
9ea033b2
NC
5691}
5692
252b5132 5693static Elf_Internal_Sym *
dda8d76d
NC
5694get_32bit_elf_symbols (Filedata * filedata,
5695 Elf_Internal_Shdr * section,
5696 unsigned long * num_syms_return)
252b5132 5697{
ba5cdace 5698 unsigned long number = 0;
dd24e3da 5699 Elf32_External_Sym * esyms = NULL;
ba5cdace 5700 Elf_External_Sym_Shndx * shndx = NULL;
dd24e3da 5701 Elf_Internal_Sym * isyms = NULL;
2cf0635d 5702 Elf_Internal_Sym * psym;
b34976b6 5703 unsigned int j;
e3d39609 5704 elf_section_list * entry;
252b5132 5705
c9c1d674
EG
5706 if (section->sh_size == 0)
5707 {
5708 if (num_syms_return != NULL)
5709 * num_syms_return = 0;
5710 return NULL;
5711 }
5712
dd24e3da 5713 /* Run some sanity checks first. */
c9c1d674 5714 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
dd24e3da 5715 {
c9c1d674 5716 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
dda8d76d
NC
5717 printable_section_name (filedata, section),
5718 (unsigned long) section->sh_entsize);
ba5cdace 5719 goto exit_point;
dd24e3da
NC
5720 }
5721
dda8d76d 5722 if (section->sh_size > filedata->file_size)
f54498b4
NC
5723 {
5724 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
dda8d76d
NC
5725 printable_section_name (filedata, section),
5726 (unsigned long) section->sh_size);
f54498b4
NC
5727 goto exit_point;
5728 }
5729
dd24e3da
NC
5730 number = section->sh_size / section->sh_entsize;
5731
5732 if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
5733 {
c9c1d674 5734 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
8066deb1 5735 (unsigned long) section->sh_size,
dda8d76d 5736 printable_section_name (filedata, section),
8066deb1 5737 (unsigned long) section->sh_entsize);
ba5cdace 5738 goto exit_point;
dd24e3da
NC
5739 }
5740
dda8d76d 5741 esyms = (Elf32_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
3f5e193b 5742 section->sh_size, _("symbols"));
dd24e3da 5743 if (esyms == NULL)
ba5cdace 5744 goto exit_point;
252b5132 5745
e3d39609 5746 shndx = NULL;
978c4450 5747 for (entry = filedata->symtab_shndx_list; entry != NULL; entry = entry->next)
e3d39609
NC
5748 {
5749 if (entry->hdr->sh_link != (unsigned long) (section - filedata->section_headers))
5750 continue;
5751
5752 if (shndx != NULL)
5753 {
5754 error (_("Multiple symbol table index sections associated with the same symbol section\n"));
5755 free (shndx);
5756 }
5757
5758 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
5759 entry->hdr->sh_offset,
5760 1, entry->hdr->sh_size,
5761 _("symbol table section indices"));
5762 if (shndx == NULL)
5763 goto exit_point;
5764
5765 /* PR17531: file: heap-buffer-overflow */
5766 if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5767 {
5768 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5769 printable_section_name (filedata, entry->hdr),
5770 (unsigned long) entry->hdr->sh_size,
5771 (unsigned long) section->sh_size);
5772 goto exit_point;
c9c1d674 5773 }
e3d39609 5774 }
9ad5cbcf 5775
3f5e193b 5776 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
252b5132
RH
5777
5778 if (isyms == NULL)
5779 {
8b73c356
NC
5780 error (_("Out of memory reading %lu symbols\n"),
5781 (unsigned long) number);
dd24e3da 5782 goto exit_point;
252b5132
RH
5783 }
5784
dd24e3da 5785 for (j = 0, psym = isyms; j < number; j++, psym++)
252b5132
RH
5786 {
5787 psym->st_name = BYTE_GET (esyms[j].st_name);
5788 psym->st_value = BYTE_GET (esyms[j].st_value);
5789 psym->st_size = BYTE_GET (esyms[j].st_size);
5790 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4fbb74a6 5791 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
9ad5cbcf
AM
5792 psym->st_shndx
5793 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4fbb74a6
AM
5794 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5795 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
252b5132
RH
5796 psym->st_info = BYTE_GET (esyms[j].st_info);
5797 psym->st_other = BYTE_GET (esyms[j].st_other);
5798 }
5799
dd24e3da 5800 exit_point:
e3d39609
NC
5801 free (shndx);
5802 free (esyms);
252b5132 5803
ba5cdace
NC
5804 if (num_syms_return != NULL)
5805 * num_syms_return = isyms == NULL ? 0 : number;
5806
252b5132
RH
5807 return isyms;
5808}
5809
9ea033b2 5810static Elf_Internal_Sym *
dda8d76d
NC
5811get_64bit_elf_symbols (Filedata * filedata,
5812 Elf_Internal_Shdr * section,
5813 unsigned long * num_syms_return)
9ea033b2 5814{
ba5cdace
NC
5815 unsigned long number = 0;
5816 Elf64_External_Sym * esyms = NULL;
5817 Elf_External_Sym_Shndx * shndx = NULL;
5818 Elf_Internal_Sym * isyms = NULL;
2cf0635d 5819 Elf_Internal_Sym * psym;
b34976b6 5820 unsigned int j;
e3d39609 5821 elf_section_list * entry;
9ea033b2 5822
c9c1d674
EG
5823 if (section->sh_size == 0)
5824 {
5825 if (num_syms_return != NULL)
5826 * num_syms_return = 0;
5827 return NULL;
5828 }
5829
dd24e3da 5830 /* Run some sanity checks first. */
c9c1d674 5831 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
dd24e3da 5832 {
c9c1d674 5833 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
dda8d76d 5834 printable_section_name (filedata, section),
8066deb1 5835 (unsigned long) section->sh_entsize);
ba5cdace 5836 goto exit_point;
dd24e3da
NC
5837 }
5838
dda8d76d 5839 if (section->sh_size > filedata->file_size)
f54498b4
NC
5840 {
5841 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
dda8d76d 5842 printable_section_name (filedata, section),
8066deb1 5843 (unsigned long) section->sh_size);
f54498b4
NC
5844 goto exit_point;
5845 }
5846
dd24e3da
NC
5847 number = section->sh_size / section->sh_entsize;
5848
5849 if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5850 {
c9c1d674 5851 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
8066deb1 5852 (unsigned long) section->sh_size,
dda8d76d 5853 printable_section_name (filedata, section),
8066deb1 5854 (unsigned long) section->sh_entsize);
ba5cdace 5855 goto exit_point;
dd24e3da
NC
5856 }
5857
dda8d76d 5858 esyms = (Elf64_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
3f5e193b 5859 section->sh_size, _("symbols"));
a6e9f9df 5860 if (!esyms)
ba5cdace 5861 goto exit_point;
9ea033b2 5862
e3d39609 5863 shndx = NULL;
978c4450 5864 for (entry = filedata->symtab_shndx_list; entry != NULL; entry = entry->next)
e3d39609
NC
5865 {
5866 if (entry->hdr->sh_link != (unsigned long) (section - filedata->section_headers))
5867 continue;
5868
5869 if (shndx != NULL)
5870 {
5871 error (_("Multiple symbol table index sections associated with the same symbol section\n"));
5872 free (shndx);
c9c1d674 5873 }
e3d39609
NC
5874
5875 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
5876 entry->hdr->sh_offset,
5877 1, entry->hdr->sh_size,
5878 _("symbol table section indices"));
5879 if (shndx == NULL)
5880 goto exit_point;
5881
5882 /* PR17531: file: heap-buffer-overflow */
5883 if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5884 {
5885 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5886 printable_section_name (filedata, entry->hdr),
5887 (unsigned long) entry->hdr->sh_size,
5888 (unsigned long) section->sh_size);
5889 goto exit_point;
5890 }
5891 }
9ad5cbcf 5892
3f5e193b 5893 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
9ea033b2
NC
5894
5895 if (isyms == NULL)
5896 {
8b73c356
NC
5897 error (_("Out of memory reading %lu symbols\n"),
5898 (unsigned long) number);
ba5cdace 5899 goto exit_point;
9ea033b2
NC
5900 }
5901
ba5cdace 5902 for (j = 0, psym = isyms; j < number; j++, psym++)
9ea033b2
NC
5903 {
5904 psym->st_name = BYTE_GET (esyms[j].st_name);
5905 psym->st_info = BYTE_GET (esyms[j].st_info);
5906 psym->st_other = BYTE_GET (esyms[j].st_other);
5907 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
ba5cdace 5908
4fbb74a6 5909 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
9ad5cbcf
AM
5910 psym->st_shndx
5911 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4fbb74a6
AM
5912 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5913 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
ba5cdace 5914
66543521
AM
5915 psym->st_value = BYTE_GET (esyms[j].st_value);
5916 psym->st_size = BYTE_GET (esyms[j].st_size);
9ea033b2
NC
5917 }
5918
ba5cdace 5919 exit_point:
e3d39609
NC
5920 free (shndx);
5921 free (esyms);
ba5cdace
NC
5922
5923 if (num_syms_return != NULL)
5924 * num_syms_return = isyms == NULL ? 0 : number;
9ea033b2
NC
5925
5926 return isyms;
5927}
5928
d1133906 5929static const char *
dda8d76d 5930get_elf_section_flags (Filedata * filedata, bfd_vma sh_flags)
d1133906 5931{
5477e8a0 5932 static char buff[1024];
2cf0635d 5933 char * p = buff;
32ec8896
NC
5934 unsigned int field_size = is_32bit_elf ? 8 : 16;
5935 signed int sindex;
5936 unsigned int size = sizeof (buff) - (field_size + 4 + 1);
8d5ff12c
L
5937 bfd_vma os_flags = 0;
5938 bfd_vma proc_flags = 0;
5939 bfd_vma unknown_flags = 0;
148b93f2 5940 static const struct
5477e8a0 5941 {
2cf0635d 5942 const char * str;
32ec8896 5943 unsigned int len;
5477e8a0
L
5944 }
5945 flags [] =
5946 {
cfcac11d
NC
5947 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
5948 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
5949 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
5950 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
5951 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
5952 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
5953 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5954 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5955 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
5956 /* 9 */ { STRING_COMMA_LEN ("TLS") },
5957 /* IA-64 specific. */
5958 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5959 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5960 /* IA-64 OpenVMS specific. */
5961 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5962 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5963 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5964 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5965 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5966 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
18ae9cc1 5967 /* Generic. */
cfcac11d 5968 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
18ae9cc1 5969 /* SPARC specific. */
77115a4a 5970 /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
ac4c9b04
MG
5971 /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5972 /* ARM specific. */
5973 /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
f0728ee3 5974 /* 22 */ { STRING_COMMA_LEN ("ARM_PURECODE") },
a91e1603
L
5975 /* 23 */ { STRING_COMMA_LEN ("COMDEF") },
5976 /* GNU specific. */
5977 /* 24 */ { STRING_COMMA_LEN ("GNU_MBIND") },
83eef883
AFB
5978 /* VLE specific. */
5979 /* 25 */ { STRING_COMMA_LEN ("VLE") },
5477e8a0
L
5980 };
5981
5982 if (do_section_details)
5983 {
8d5ff12c
L
5984 sprintf (buff, "[%*.*lx]: ",
5985 field_size, field_size, (unsigned long) sh_flags);
5986 p += field_size + 4;
5477e8a0 5987 }
76da6bbe 5988
d1133906
NC
5989 while (sh_flags)
5990 {
5991 bfd_vma flag;
5992
5993 flag = sh_flags & - sh_flags;
5994 sh_flags &= ~ flag;
76da6bbe 5995
5477e8a0 5996 if (do_section_details)
d1133906 5997 {
5477e8a0
L
5998 switch (flag)
5999 {
91d6fa6a
NC
6000 case SHF_WRITE: sindex = 0; break;
6001 case SHF_ALLOC: sindex = 1; break;
6002 case SHF_EXECINSTR: sindex = 2; break;
6003 case SHF_MERGE: sindex = 3; break;
6004 case SHF_STRINGS: sindex = 4; break;
6005 case SHF_INFO_LINK: sindex = 5; break;
6006 case SHF_LINK_ORDER: sindex = 6; break;
6007 case SHF_OS_NONCONFORMING: sindex = 7; break;
6008 case SHF_GROUP: sindex = 8; break;
6009 case SHF_TLS: sindex = 9; break;
18ae9cc1 6010 case SHF_EXCLUDE: sindex = 18; break;
77115a4a 6011 case SHF_COMPRESSED: sindex = 20; break;
a91e1603 6012 case SHF_GNU_MBIND: sindex = 24; break;
76da6bbe 6013
5477e8a0 6014 default:
91d6fa6a 6015 sindex = -1;
dda8d76d 6016 switch (filedata->file_header.e_machine)
148b93f2 6017 {
cfcac11d 6018 case EM_IA_64:
148b93f2 6019 if (flag == SHF_IA_64_SHORT)
91d6fa6a 6020 sindex = 10;
148b93f2 6021 else if (flag == SHF_IA_64_NORECOV)
91d6fa6a 6022 sindex = 11;
148b93f2 6023#ifdef BFD64
dda8d76d 6024 else if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
148b93f2
NC
6025 switch (flag)
6026 {
91d6fa6a
NC
6027 case SHF_IA_64_VMS_GLOBAL: sindex = 12; break;
6028 case SHF_IA_64_VMS_OVERLAID: sindex = 13; break;
6029 case SHF_IA_64_VMS_SHARED: sindex = 14; break;
6030 case SHF_IA_64_VMS_VECTOR: sindex = 15; break;
6031 case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
6032 case SHF_IA_64_VMS_PROTECTED: sindex = 17; break;
148b93f2
NC
6033 default: break;
6034 }
6035#endif
cfcac11d
NC
6036 break;
6037
caa83f8b 6038 case EM_386:
22abe556 6039 case EM_IAMCU:
caa83f8b 6040 case EM_X86_64:
7f502d6c 6041 case EM_L1OM:
7a9068fe 6042 case EM_K1OM:
cfcac11d
NC
6043 case EM_OLD_SPARCV9:
6044 case EM_SPARC32PLUS:
6045 case EM_SPARCV9:
6046 case EM_SPARC:
18ae9cc1 6047 if (flag == SHF_ORDERED)
91d6fa6a 6048 sindex = 19;
cfcac11d 6049 break;
ac4c9b04
MG
6050
6051 case EM_ARM:
6052 switch (flag)
6053 {
6054 case SHF_ENTRYSECT: sindex = 21; break;
f0728ee3 6055 case SHF_ARM_PURECODE: sindex = 22; break;
ac4c9b04
MG
6056 case SHF_COMDEF: sindex = 23; break;
6057 default: break;
6058 }
6059 break;
83eef883
AFB
6060 case EM_PPC:
6061 if (flag == SHF_PPC_VLE)
6062 sindex = 25;
6063 break;
ac4c9b04 6064
cfcac11d
NC
6065 default:
6066 break;
148b93f2 6067 }
5477e8a0
L
6068 }
6069
91d6fa6a 6070 if (sindex != -1)
5477e8a0 6071 {
8d5ff12c
L
6072 if (p != buff + field_size + 4)
6073 {
6074 if (size < (10 + 2))
bee0ee85
NC
6075 {
6076 warn (_("Internal error: not enough buffer room for section flag info"));
6077 return _("<unknown>");
6078 }
8d5ff12c
L
6079 size -= 2;
6080 *p++ = ',';
6081 *p++ = ' ';
6082 }
6083
91d6fa6a
NC
6084 size -= flags [sindex].len;
6085 p = stpcpy (p, flags [sindex].str);
5477e8a0 6086 }
3b22753a 6087 else if (flag & SHF_MASKOS)
8d5ff12c 6088 os_flags |= flag;
d1133906 6089 else if (flag & SHF_MASKPROC)
8d5ff12c 6090 proc_flags |= flag;
d1133906 6091 else
8d5ff12c 6092 unknown_flags |= flag;
5477e8a0
L
6093 }
6094 else
6095 {
6096 switch (flag)
6097 {
6098 case SHF_WRITE: *p = 'W'; break;
6099 case SHF_ALLOC: *p = 'A'; break;
6100 case SHF_EXECINSTR: *p = 'X'; break;
6101 case SHF_MERGE: *p = 'M'; break;
6102 case SHF_STRINGS: *p = 'S'; break;
6103 case SHF_INFO_LINK: *p = 'I'; break;
6104 case SHF_LINK_ORDER: *p = 'L'; break;
6105 case SHF_OS_NONCONFORMING: *p = 'O'; break;
6106 case SHF_GROUP: *p = 'G'; break;
6107 case SHF_TLS: *p = 'T'; break;
18ae9cc1 6108 case SHF_EXCLUDE: *p = 'E'; break;
77115a4a 6109 case SHF_COMPRESSED: *p = 'C'; break;
a91e1603 6110 case SHF_GNU_MBIND: *p = 'D'; break;
5477e8a0
L
6111
6112 default:
dda8d76d
NC
6113 if ((filedata->file_header.e_machine == EM_X86_64
6114 || filedata->file_header.e_machine == EM_L1OM
6115 || filedata->file_header.e_machine == EM_K1OM)
5477e8a0
L
6116 && flag == SHF_X86_64_LARGE)
6117 *p = 'l';
dda8d76d 6118 else if (filedata->file_header.e_machine == EM_ARM
f0728ee3 6119 && flag == SHF_ARM_PURECODE)
91f68a68 6120 *p = 'y';
dda8d76d 6121 else if (filedata->file_header.e_machine == EM_PPC
83eef883
AFB
6122 && flag == SHF_PPC_VLE)
6123 *p = 'v';
5477e8a0
L
6124 else if (flag & SHF_MASKOS)
6125 {
6126 *p = 'o';
6127 sh_flags &= ~ SHF_MASKOS;
6128 }
6129 else if (flag & SHF_MASKPROC)
6130 {
6131 *p = 'p';
6132 sh_flags &= ~ SHF_MASKPROC;
6133 }
6134 else
6135 *p = 'x';
6136 break;
6137 }
6138 p++;
d1133906
NC
6139 }
6140 }
76da6bbe 6141
8d5ff12c
L
6142 if (do_section_details)
6143 {
6144 if (os_flags)
6145 {
6146 size -= 5 + field_size;
6147 if (p != buff + field_size + 4)
6148 {
6149 if (size < (2 + 1))
bee0ee85
NC
6150 {
6151 warn (_("Internal error: not enough buffer room for section flag info"));
6152 return _("<unknown>");
6153 }
8d5ff12c
L
6154 size -= 2;
6155 *p++ = ',';
6156 *p++ = ' ';
6157 }
6158 sprintf (p, "OS (%*.*lx)", field_size, field_size,
6159 (unsigned long) os_flags);
6160 p += 5 + field_size;
6161 }
6162 if (proc_flags)
6163 {
6164 size -= 7 + field_size;
6165 if (p != buff + field_size + 4)
6166 {
6167 if (size < (2 + 1))
bee0ee85
NC
6168 {
6169 warn (_("Internal error: not enough buffer room for section flag info"));
6170 return _("<unknown>");
6171 }
8d5ff12c
L
6172 size -= 2;
6173 *p++ = ',';
6174 *p++ = ' ';
6175 }
6176 sprintf (p, "PROC (%*.*lx)", field_size, field_size,
6177 (unsigned long) proc_flags);
6178 p += 7 + field_size;
6179 }
6180 if (unknown_flags)
6181 {
6182 size -= 10 + field_size;
6183 if (p != buff + field_size + 4)
6184 {
6185 if (size < (2 + 1))
bee0ee85
NC
6186 {
6187 warn (_("Internal error: not enough buffer room for section flag info"));
6188 return _("<unknown>");
6189 }
8d5ff12c
L
6190 size -= 2;
6191 *p++ = ',';
6192 *p++ = ' ';
6193 }
2b692964 6194 sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
8d5ff12c
L
6195 (unsigned long) unknown_flags);
6196 p += 10 + field_size;
6197 }
6198 }
6199
e9e44622 6200 *p = '\0';
d1133906
NC
6201 return buff;
6202}
6203
5844b465 6204static unsigned int ATTRIBUTE_WARN_UNUSED_RESULT
ebdf1ebf 6205get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf, bfd_size_type size)
77115a4a
L
6206{
6207 if (is_32bit_elf)
6208 {
6209 Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
d8024a91 6210
ebdf1ebf
NC
6211 if (size < sizeof (* echdr))
6212 {
6213 error (_("Compressed section is too small even for a compression header\n"));
6214 return 0;
6215 }
6216
77115a4a
L
6217 chdr->ch_type = BYTE_GET (echdr->ch_type);
6218 chdr->ch_size = BYTE_GET (echdr->ch_size);
6219 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
6220 return sizeof (*echdr);
6221 }
6222 else
6223 {
6224 Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) buf;
d8024a91 6225
ebdf1ebf
NC
6226 if (size < sizeof (* echdr))
6227 {
6228 error (_("Compressed section is too small even for a compression header\n"));
6229 return 0;
6230 }
6231
77115a4a
L
6232 chdr->ch_type = BYTE_GET (echdr->ch_type);
6233 chdr->ch_size = BYTE_GET (echdr->ch_size);
6234 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
6235 return sizeof (*echdr);
6236 }
6237}
6238
32ec8896 6239static bfd_boolean
dda8d76d 6240process_section_headers (Filedata * filedata)
252b5132 6241{
2cf0635d 6242 Elf_Internal_Shdr * section;
b34976b6 6243 unsigned int i;
252b5132 6244
8fb879cd 6245 free (filedata->section_headers);
dda8d76d 6246 filedata->section_headers = NULL;
978c4450
AM
6247 free (filedata->dynamic_symbols);
6248 filedata->dynamic_symbols = NULL;
6249 filedata->num_dynamic_syms = 0;
6250 free (filedata->dynamic_strings);
6251 filedata->dynamic_strings = NULL;
6252 filedata->dynamic_strings_length = 0;
6253 free (filedata->dynamic_syminfo);
6254 filedata->dynamic_syminfo = NULL;
6255 while (filedata->symtab_shndx_list != NULL)
8ff66993 6256 {
978c4450
AM
6257 elf_section_list *next = filedata->symtab_shndx_list->next;
6258 free (filedata->symtab_shndx_list);
6259 filedata->symtab_shndx_list = next;
8ff66993 6260 }
252b5132 6261
dda8d76d 6262 if (filedata->file_header.e_shnum == 0)
252b5132 6263 {
82f2dbf7 6264 /* PR binutils/12467. */
dda8d76d 6265 if (filedata->file_header.e_shoff != 0)
32ec8896
NC
6266 {
6267 warn (_("possibly corrupt ELF file header - it has a non-zero"
6268 " section header offset, but no section headers\n"));
6269 return FALSE;
6270 }
82f2dbf7 6271 else if (do_sections)
252b5132
RH
6272 printf (_("\nThere are no sections in this file.\n"));
6273
32ec8896 6274 return TRUE;
252b5132
RH
6275 }
6276
6277 if (do_sections && !do_header)
d3a49aa8
AM
6278 printf (ngettext ("There is %d section header, "
6279 "starting at offset 0x%lx:\n",
6280 "There are %d section headers, "
6281 "starting at offset 0x%lx:\n",
dda8d76d
NC
6282 filedata->file_header.e_shnum),
6283 filedata->file_header.e_shnum,
6284 (unsigned long) filedata->file_header.e_shoff);
252b5132 6285
9ea033b2
NC
6286 if (is_32bit_elf)
6287 {
dda8d76d 6288 if (! get_32bit_section_headers (filedata, FALSE))
32ec8896
NC
6289 return FALSE;
6290 }
6291 else
6292 {
dda8d76d 6293 if (! get_64bit_section_headers (filedata, FALSE))
32ec8896 6294 return FALSE;
9ea033b2 6295 }
252b5132
RH
6296
6297 /* Read in the string table, so that we have names to display. */
dda8d76d
NC
6298 if (filedata->file_header.e_shstrndx != SHN_UNDEF
6299 && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
252b5132 6300 {
dda8d76d 6301 section = filedata->section_headers + filedata->file_header.e_shstrndx;
d40ac9bd 6302
c256ffe7
JJ
6303 if (section->sh_size != 0)
6304 {
dda8d76d
NC
6305 filedata->string_table = (char *) get_data (NULL, filedata, section->sh_offset,
6306 1, section->sh_size,
6307 _("string table"));
0de14b54 6308
dda8d76d 6309 filedata->string_table_length = filedata->string_table != NULL ? section->sh_size : 0;
c256ffe7 6310 }
252b5132
RH
6311 }
6312
6313 /* Scan the sections for the dynamic symbol table
e3c8793a 6314 and dynamic string table and debug sections. */
89fac5e3 6315 eh_addr_size = is_32bit_elf ? 4 : 8;
dda8d76d 6316 switch (filedata->file_header.e_machine)
89fac5e3
RS
6317 {
6318 case EM_MIPS:
6319 case EM_MIPS_RS3_LE:
6320 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
6321 FDE addresses. However, the ABI also has a semi-official ILP32
6322 variant for which the normal FDE address size rules apply.
6323
6324 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
6325 section, where XX is the size of longs in bits. Unfortunately,
6326 earlier compilers provided no way of distinguishing ILP32 objects
6327 from LP64 objects, so if there's any doubt, we should assume that
6328 the official LP64 form is being used. */
dda8d76d
NC
6329 if ((filedata->file_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
6330 && find_section (filedata, ".gcc_compiled_long32") == NULL)
89fac5e3
RS
6331 eh_addr_size = 8;
6332 break;
0f56a26a
DD
6333
6334 case EM_H8_300:
6335 case EM_H8_300H:
dda8d76d 6336 switch (filedata->file_header.e_flags & EF_H8_MACH)
0f56a26a
DD
6337 {
6338 case E_H8_MACH_H8300:
6339 case E_H8_MACH_H8300HN:
6340 case E_H8_MACH_H8300SN:
6341 case E_H8_MACH_H8300SXN:
6342 eh_addr_size = 2;
6343 break;
6344 case E_H8_MACH_H8300H:
6345 case E_H8_MACH_H8300S:
6346 case E_H8_MACH_H8300SX:
6347 eh_addr_size = 4;
6348 break;
6349 }
f4236fe4
DD
6350 break;
6351
ff7eeb89 6352 case EM_M32C_OLD:
f4236fe4 6353 case EM_M32C:
dda8d76d 6354 switch (filedata->file_header.e_flags & EF_M32C_CPU_MASK)
f4236fe4
DD
6355 {
6356 case EF_M32C_CPU_M16C:
6357 eh_addr_size = 2;
6358 break;
6359 }
6360 break;
89fac5e3
RS
6361 }
6362
76ca31c0
NC
6363#define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
6364 do \
6365 { \
6366 bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64; \
6367 if (section->sh_entsize != expected_entsize) \
9dd3a467 6368 { \
76ca31c0
NC
6369 char buf[40]; \
6370 sprintf_vma (buf, section->sh_entsize); \
6371 /* Note: coded this way so that there is a single string for \
6372 translation. */ \
6373 error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
6374 error (_("(Using the expected size of %u for the rest of this dump)\n"), \
6375 (unsigned) expected_entsize); \
9dd3a467 6376 section->sh_entsize = expected_entsize; \
76ca31c0
NC
6377 } \
6378 } \
08d8fa11 6379 while (0)
9dd3a467
NC
6380
6381#define CHECK_ENTSIZE(section, i, type) \
1b513401 6382 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
08d8fa11
JJ
6383 sizeof (Elf64_External_##type))
6384
dda8d76d
NC
6385 for (i = 0, section = filedata->section_headers;
6386 i < filedata->file_header.e_shnum;
b34976b6 6387 i++, section++)
252b5132 6388 {
2cf0635d 6389 char * name = SECTION_NAME (section);
252b5132 6390
1b513401
NC
6391 /* Run some sanity checks on the headers and
6392 possibly fill in some file data as well. */
6393 switch (section->sh_type)
252b5132 6394 {
1b513401 6395 case SHT_DYNSYM:
978c4450 6396 if (filedata->dynamic_symbols != NULL)
252b5132
RH
6397 {
6398 error (_("File contains multiple dynamic symbol tables\n"));
6399 continue;
6400 }
6401
08d8fa11 6402 CHECK_ENTSIZE (section, i, Sym);
978c4450
AM
6403 filedata->dynamic_symbols
6404 = GET_ELF_SYMBOLS (filedata, section, &filedata->num_dynamic_syms);
8ac10c5b 6405 filedata->dynamic_symtab_section = section;
1b513401
NC
6406 break;
6407
6408 case SHT_STRTAB:
6409 if (streq (name, ".dynstr"))
252b5132 6410 {
1b513401
NC
6411 if (filedata->dynamic_strings != NULL)
6412 {
6413 error (_("File contains multiple dynamic string tables\n"));
6414 continue;
6415 }
6416
6417 filedata->dynamic_strings
6418 = (char *) get_data (NULL, filedata, section->sh_offset,
6419 1, section->sh_size, _("dynamic strings"));
6420 filedata->dynamic_strings_length
6421 = filedata->dynamic_strings == NULL ? 0 : section->sh_size;
8ac10c5b 6422 filedata->dynamic_strtab_section = section;
252b5132 6423 }
1b513401
NC
6424 break;
6425
6426 case SHT_SYMTAB_SHNDX:
6427 {
6428 elf_section_list * entry = xmalloc (sizeof * entry);
6429
6430 entry->hdr = section;
6431 entry->next = filedata->symtab_shndx_list;
6432 filedata->symtab_shndx_list = entry;
6433 }
6434 break;
6435
6436 case SHT_SYMTAB:
6437 CHECK_ENTSIZE (section, i, Sym);
6438 break;
6439
6440 case SHT_GROUP:
6441 CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
6442 break;
252b5132 6443
1b513401
NC
6444 case SHT_REL:
6445 CHECK_ENTSIZE (section, i, Rel);
546cb2d8 6446 if (do_checks && section->sh_size == 0)
1b513401
NC
6447 warn (_("Section '%s': zero-sized relocation section\n"), name);
6448 break;
6449
6450 case SHT_RELA:
6451 CHECK_ENTSIZE (section, i, Rela);
546cb2d8 6452 if (do_checks && section->sh_size == 0)
1b513401
NC
6453 warn (_("Section '%s': zero-sized relocation section\n"), name);
6454 break;
6455
6456 case SHT_NOTE:
6457 case SHT_PROGBITS:
546cb2d8
NC
6458 /* Having a zero sized section is not illegal according to the
6459 ELF standard, but it might be an indication that something
6460 is wrong. So issue a warning if we are running in lint mode. */
6461 if (do_checks && section->sh_size == 0)
1b513401
NC
6462 warn (_("Section '%s': has a size of zero - is this intended ?\n"), name);
6463 break;
6464
6465 default:
6466 break;
6467 }
6468
6469 if ((do_debugging || do_debug_info || do_debug_abbrevs
6470 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
6471 || do_debug_aranges || do_debug_frames || do_debug_macinfo
e4b7104b 6472 || do_debug_str || do_debug_str_offsets || do_debug_loc || do_debug_ranges
1b513401
NC
6473 || do_debug_addr || do_debug_cu_index || do_debug_links)
6474 && (const_strneq (name, ".debug_")
6475 || const_strneq (name, ".zdebug_")))
252b5132 6476 {
1b315056
CS
6477 if (name[1] == 'z')
6478 name += sizeof (".zdebug_") - 1;
6479 else
6480 name += sizeof (".debug_") - 1;
252b5132
RH
6481
6482 if (do_debugging
4723351a
CC
6483 || (do_debug_info && const_strneq (name, "info"))
6484 || (do_debug_info && const_strneq (name, "types"))
6485 || (do_debug_abbrevs && const_strneq (name, "abbrev"))
b40bf0a2
NC
6486 || (do_debug_lines && strcmp (name, "line") == 0)
6487 || (do_debug_lines && const_strneq (name, "line."))
4723351a
CC
6488 || (do_debug_pubnames && const_strneq (name, "pubnames"))
6489 || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
459d52c8
DE
6490 || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
6491 || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
4723351a
CC
6492 || (do_debug_aranges && const_strneq (name, "aranges"))
6493 || (do_debug_ranges && const_strneq (name, "ranges"))
77145576 6494 || (do_debug_ranges && const_strneq (name, "rnglists"))
4723351a
CC
6495 || (do_debug_frames && const_strneq (name, "frame"))
6496 || (do_debug_macinfo && const_strneq (name, "macinfo"))
6497 || (do_debug_macinfo && const_strneq (name, "macro"))
6498 || (do_debug_str && const_strneq (name, "str"))
e4b7104b 6499 || (do_debug_str_offsets && const_strneq (name, "str_offsets"))
4723351a 6500 || (do_debug_loc && const_strneq (name, "loc"))
77145576 6501 || (do_debug_loc && const_strneq (name, "loclists"))
657d0d47
CC
6502 || (do_debug_addr && const_strneq (name, "addr"))
6503 || (do_debug_cu_index && const_strneq (name, "cu_index"))
6504 || (do_debug_cu_index && const_strneq (name, "tu_index"))
252b5132 6505 )
6431e409 6506 request_dump_bynumber (&filedata->dump, i, DEBUG_DUMP);
252b5132 6507 }
a262ae96 6508 /* Linkonce section to be combined with .debug_info at link time. */
09fd7e38 6509 else if ((do_debugging || do_debug_info)
0112cd26 6510 && const_strneq (name, ".gnu.linkonce.wi."))
6431e409 6511 request_dump_bynumber (&filedata->dump, i, DEBUG_DUMP);
18bd398b 6512 else if (do_debug_frames && streq (name, ".eh_frame"))
6431e409 6513 request_dump_bynumber (&filedata->dump, i, DEBUG_DUMP);
61364358
JK
6514 else if (do_gdb_index && (streq (name, ".gdb_index")
6515 || streq (name, ".debug_names")))
6431e409 6516 request_dump_bynumber (&filedata->dump, i, DEBUG_DUMP);
6f875884
TG
6517 /* Trace sections for Itanium VMS. */
6518 else if ((do_debugging || do_trace_info || do_trace_abbrevs
6519 || do_trace_aranges)
6520 && const_strneq (name, ".trace_"))
6521 {
6522 name += sizeof (".trace_") - 1;
6523
6524 if (do_debugging
6525 || (do_trace_info && streq (name, "info"))
6526 || (do_trace_abbrevs && streq (name, "abbrev"))
6527 || (do_trace_aranges && streq (name, "aranges"))
6528 )
6431e409 6529 request_dump_bynumber (&filedata->dump, i, DEBUG_DUMP);
6f875884 6530 }
dda8d76d
NC
6531 else if ((do_debugging || do_debug_links)
6532 && (const_strneq (name, ".gnu_debuglink")
6533 || const_strneq (name, ".gnu_debugaltlink")))
6431e409 6534 request_dump_bynumber (&filedata->dump, i, DEBUG_DUMP);
252b5132
RH
6535 }
6536
6537 if (! do_sections)
32ec8896 6538 return TRUE;
252b5132 6539
dda8d76d 6540 if (filedata->file_header.e_shnum > 1)
3a1a2036
NC
6541 printf (_("\nSection Headers:\n"));
6542 else
6543 printf (_("\nSection Header:\n"));
76da6bbe 6544
f7a99963 6545 if (is_32bit_elf)
595cf52e 6546 {
5477e8a0 6547 if (do_section_details)
595cf52e
L
6548 {
6549 printf (_(" [Nr] Name\n"));
5477e8a0 6550 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
595cf52e
L
6551 }
6552 else
6553 printf
6554 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
6555 }
d974e256 6556 else if (do_wide)
595cf52e 6557 {
5477e8a0 6558 if (do_section_details)
595cf52e
L
6559 {
6560 printf (_(" [Nr] Name\n"));
5477e8a0 6561 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
595cf52e
L
6562 }
6563 else
6564 printf
6565 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
6566 }
f7a99963
NC
6567 else
6568 {
5477e8a0 6569 if (do_section_details)
595cf52e
L
6570 {
6571 printf (_(" [Nr] Name\n"));
5477e8a0
L
6572 printf (_(" Type Address Offset Link\n"));
6573 printf (_(" Size EntSize Info Align\n"));
595cf52e
L
6574 }
6575 else
6576 {
6577 printf (_(" [Nr] Name Type Address Offset\n"));
6578 printf (_(" Size EntSize Flags Link Info Align\n"));
6579 }
f7a99963 6580 }
252b5132 6581
5477e8a0
L
6582 if (do_section_details)
6583 printf (_(" Flags\n"));
6584
dda8d76d
NC
6585 for (i = 0, section = filedata->section_headers;
6586 i < filedata->file_header.e_shnum;
b34976b6 6587 i++, section++)
252b5132 6588 {
dd905818
NC
6589 /* Run some sanity checks on the section header. */
6590
6591 /* Check the sh_link field. */
6592 switch (section->sh_type)
6593 {
285e3f99
AM
6594 case SHT_REL:
6595 case SHT_RELA:
6596 if (section->sh_link == 0
6597 && (filedata->file_header.e_type == ET_EXEC
6598 || filedata->file_header.e_type == ET_DYN))
6599 /* A dynamic relocation section where all entries use a
6600 zero symbol index need not specify a symtab section. */
6601 break;
6602 /* Fall through. */
dd905818
NC
6603 case SHT_SYMTAB_SHNDX:
6604 case SHT_GROUP:
6605 case SHT_HASH:
6606 case SHT_GNU_HASH:
6607 case SHT_GNU_versym:
285e3f99 6608 if (section->sh_link == 0
dda8d76d
NC
6609 || section->sh_link >= filedata->file_header.e_shnum
6610 || (filedata->section_headers[section->sh_link].sh_type != SHT_SYMTAB
6611 && filedata->section_headers[section->sh_link].sh_type != SHT_DYNSYM))
dd905818
NC
6612 warn (_("[%2u]: Link field (%u) should index a symtab section.\n"),
6613 i, section->sh_link);
6614 break;
6615
6616 case SHT_DYNAMIC:
6617 case SHT_SYMTAB:
6618 case SHT_DYNSYM:
6619 case SHT_GNU_verneed:
6620 case SHT_GNU_verdef:
6621 case SHT_GNU_LIBLIST:
285e3f99 6622 if (section->sh_link == 0
dda8d76d
NC
6623 || section->sh_link >= filedata->file_header.e_shnum
6624 || filedata->section_headers[section->sh_link].sh_type != SHT_STRTAB)
dd905818
NC
6625 warn (_("[%2u]: Link field (%u) should index a string section.\n"),
6626 i, section->sh_link);
6627 break;
6628
6629 case SHT_INIT_ARRAY:
6630 case SHT_FINI_ARRAY:
6631 case SHT_PREINIT_ARRAY:
6632 if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6633 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6634 i, section->sh_link);
6635 break;
6636
6637 default:
6638 /* FIXME: Add support for target specific section types. */
6639#if 0 /* Currently we do not check other section types as there are too
6640 many special cases. Stab sections for example have a type
6641 of SHT_PROGBITS but an sh_link field that links to the .stabstr
6642 section. */
6643 if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6644 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6645 i, section->sh_link);
6646#endif
6647 break;
6648 }
6649
6650 /* Check the sh_info field. */
6651 switch (section->sh_type)
6652 {
6653 case SHT_REL:
6654 case SHT_RELA:
285e3f99
AM
6655 if (section->sh_info == 0
6656 && (filedata->file_header.e_type == ET_EXEC
6657 || filedata->file_header.e_type == ET_DYN))
6658 /* Dynamic relocations apply to segments, so they do not
6659 need to specify the section they relocate. */
6660 break;
6661 if (section->sh_info == 0
dda8d76d
NC
6662 || section->sh_info >= filedata->file_header.e_shnum
6663 || (filedata->section_headers[section->sh_info].sh_type != SHT_PROGBITS
6664 && filedata->section_headers[section->sh_info].sh_type != SHT_NOBITS
6665 && filedata->section_headers[section->sh_info].sh_type != SHT_NOTE
6666 && filedata->section_headers[section->sh_info].sh_type != SHT_INIT_ARRAY
385e5b90
L
6667 && filedata->section_headers[section->sh_info].sh_type != SHT_FINI_ARRAY
6668 && filedata->section_headers[section->sh_info].sh_type != SHT_PREINIT_ARRAY
dd905818 6669 /* FIXME: Are other section types valid ? */
dda8d76d 6670 && filedata->section_headers[section->sh_info].sh_type < SHT_LOOS))
285e3f99
AM
6671 warn (_("[%2u]: Info field (%u) should index a relocatable section.\n"),
6672 i, section->sh_info);
dd905818
NC
6673 break;
6674
6675 case SHT_DYNAMIC:
6676 case SHT_HASH:
6677 case SHT_SYMTAB_SHNDX:
6678 case SHT_INIT_ARRAY:
6679 case SHT_FINI_ARRAY:
6680 case SHT_PREINIT_ARRAY:
6681 if (section->sh_info != 0)
6682 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6683 i, section->sh_info);
6684 break;
6685
6686 case SHT_GROUP:
6687 case SHT_SYMTAB:
6688 case SHT_DYNSYM:
6689 /* A symbol index - we assume that it is valid. */
6690 break;
6691
6692 default:
6693 /* FIXME: Add support for target specific section types. */
6694 if (section->sh_type == SHT_NOBITS)
6695 /* NOBITS section headers with non-zero sh_info fields can be
6696 created when a binary is stripped of everything but its debug
1a9ccd70
NC
6697 information. The stripped sections have their headers
6698 preserved but their types set to SHT_NOBITS. So do not check
6699 this type of section. */
dd905818
NC
6700 ;
6701 else if (section->sh_flags & SHF_INFO_LINK)
6702 {
dda8d76d 6703 if (section->sh_info < 1 || section->sh_info >= filedata->file_header.e_shnum)
dd905818
NC
6704 warn (_("[%2u]: Expected link to another section in info field"), i);
6705 }
a91e1603
L
6706 else if (section->sh_type < SHT_LOOS
6707 && (section->sh_flags & SHF_GNU_MBIND) == 0
6708 && section->sh_info != 0)
dd905818
NC
6709 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6710 i, section->sh_info);
6711 break;
6712 }
6713
3e6b6445 6714 /* Check the sh_size field. */
dda8d76d 6715 if (section->sh_size > filedata->file_size
3e6b6445
NC
6716 && section->sh_type != SHT_NOBITS
6717 && section->sh_type != SHT_NULL
6718 && section->sh_type < SHT_LOOS)
6719 warn (_("Size of section %u is larger than the entire file!\n"), i);
6720
7bfd842d 6721 printf (" [%2u] ", i);
5477e8a0 6722 if (do_section_details)
dda8d76d 6723 printf ("%s\n ", printable_section_name (filedata, section));
595cf52e 6724 else
74e1a04b 6725 print_symbol (-17, SECTION_NAME (section));
0b4362b0 6726
ea52a088 6727 printf (do_wide ? " %-15s " : " %-15.15s ",
dda8d76d 6728 get_section_type_name (filedata, section->sh_type));
0b4362b0 6729
f7a99963
NC
6730 if (is_32bit_elf)
6731 {
cfcac11d
NC
6732 const char * link_too_big = NULL;
6733
f7a99963 6734 print_vma (section->sh_addr, LONG_HEX);
76da6bbe 6735
f7a99963
NC
6736 printf ( " %6.6lx %6.6lx %2.2lx",
6737 (unsigned long) section->sh_offset,
6738 (unsigned long) section->sh_size,
6739 (unsigned long) section->sh_entsize);
d1133906 6740
5477e8a0
L
6741 if (do_section_details)
6742 fputs (" ", stdout);
6743 else
dda8d76d 6744 printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
76da6bbe 6745
dda8d76d 6746 if (section->sh_link >= filedata->file_header.e_shnum)
cfcac11d
NC
6747 {
6748 link_too_big = "";
6749 /* The sh_link value is out of range. Normally this indicates
caa83f8b 6750 an error but it can have special values in Solaris binaries. */
dda8d76d 6751 switch (filedata->file_header.e_machine)
cfcac11d 6752 {
caa83f8b 6753 case EM_386:
22abe556 6754 case EM_IAMCU:
caa83f8b 6755 case EM_X86_64:
7f502d6c 6756 case EM_L1OM:
7a9068fe 6757 case EM_K1OM:
cfcac11d
NC
6758 case EM_OLD_SPARCV9:
6759 case EM_SPARC32PLUS:
6760 case EM_SPARCV9:
6761 case EM_SPARC:
6762 if (section->sh_link == (SHN_BEFORE & 0xffff))
6763 link_too_big = "BEFORE";
6764 else if (section->sh_link == (SHN_AFTER & 0xffff))
6765 link_too_big = "AFTER";
6766 break;
6767 default:
6768 break;
6769 }
6770 }
6771
6772 if (do_section_details)
6773 {
6774 if (link_too_big != NULL && * link_too_big)
6775 printf ("<%s> ", link_too_big);
6776 else
6777 printf ("%2u ", section->sh_link);
6778 printf ("%3u %2lu\n", section->sh_info,
6779 (unsigned long) section->sh_addralign);
6780 }
6781 else
6782 printf ("%2u %3u %2lu\n",
6783 section->sh_link,
6784 section->sh_info,
6785 (unsigned long) section->sh_addralign);
6786
6787 if (link_too_big && ! * link_too_big)
6788 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
6789 i, section->sh_link);
f7a99963 6790 }
d974e256
JJ
6791 else if (do_wide)
6792 {
6793 print_vma (section->sh_addr, LONG_HEX);
6794
6795 if ((long) section->sh_offset == section->sh_offset)
6796 printf (" %6.6lx", (unsigned long) section->sh_offset);
6797 else
6798 {
6799 putchar (' ');
6800 print_vma (section->sh_offset, LONG_HEX);
6801 }
6802
6803 if ((unsigned long) section->sh_size == section->sh_size)
6804 printf (" %6.6lx", (unsigned long) section->sh_size);
6805 else
6806 {
6807 putchar (' ');
6808 print_vma (section->sh_size, LONG_HEX);
6809 }
6810
6811 if ((unsigned long) section->sh_entsize == section->sh_entsize)
6812 printf (" %2.2lx", (unsigned long) section->sh_entsize);
6813 else
6814 {
6815 putchar (' ');
6816 print_vma (section->sh_entsize, LONG_HEX);
6817 }
6818
5477e8a0
L
6819 if (do_section_details)
6820 fputs (" ", stdout);
6821 else
dda8d76d 6822 printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
d974e256 6823
72de5009 6824 printf ("%2u %3u ", section->sh_link, section->sh_info);
d974e256
JJ
6825
6826 if ((unsigned long) section->sh_addralign == section->sh_addralign)
72de5009 6827 printf ("%2lu\n", (unsigned long) section->sh_addralign);
d974e256
JJ
6828 else
6829 {
6830 print_vma (section->sh_addralign, DEC);
6831 putchar ('\n');
6832 }
6833 }
5477e8a0 6834 else if (do_section_details)
595cf52e 6835 {
55cc53e9 6836 putchar (' ');
595cf52e
L
6837 print_vma (section->sh_addr, LONG_HEX);
6838 if ((long) section->sh_offset == section->sh_offset)
5477e8a0 6839 printf (" %16.16lx", (unsigned long) section->sh_offset);
595cf52e
L
6840 else
6841 {
6842 printf (" ");
6843 print_vma (section->sh_offset, LONG_HEX);
6844 }
72de5009 6845 printf (" %u\n ", section->sh_link);
595cf52e 6846 print_vma (section->sh_size, LONG_HEX);
5477e8a0 6847 putchar (' ');
595cf52e
L
6848 print_vma (section->sh_entsize, LONG_HEX);
6849
72de5009
AM
6850 printf (" %-16u %lu\n",
6851 section->sh_info,
595cf52e
L
6852 (unsigned long) section->sh_addralign);
6853 }
f7a99963
NC
6854 else
6855 {
6856 putchar (' ');
6857 print_vma (section->sh_addr, LONG_HEX);
53c7db4b
KH
6858 if ((long) section->sh_offset == section->sh_offset)
6859 printf (" %8.8lx", (unsigned long) section->sh_offset);
6860 else
6861 {
6862 printf (" ");
6863 print_vma (section->sh_offset, LONG_HEX);
6864 }
f7a99963
NC
6865 printf ("\n ");
6866 print_vma (section->sh_size, LONG_HEX);
6867 printf (" ");
6868 print_vma (section->sh_entsize, LONG_HEX);
76da6bbe 6869
dda8d76d 6870 printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
76da6bbe 6871
72de5009
AM
6872 printf (" %2u %3u %lu\n",
6873 section->sh_link,
6874 section->sh_info,
f7a99963
NC
6875 (unsigned long) section->sh_addralign);
6876 }
5477e8a0
L
6877
6878 if (do_section_details)
77115a4a 6879 {
dda8d76d 6880 printf (" %s\n", get_elf_section_flags (filedata, section->sh_flags));
77115a4a
L
6881 if ((section->sh_flags & SHF_COMPRESSED) != 0)
6882 {
6883 /* Minimum section size is 12 bytes for 32-bit compression
6884 header + 12 bytes for compressed data header. */
6885 unsigned char buf[24];
d8024a91 6886
77115a4a 6887 assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
dda8d76d 6888 if (get_data (&buf, filedata, section->sh_offset, 1,
77115a4a
L
6889 sizeof (buf), _("compression header")))
6890 {
6891 Elf_Internal_Chdr chdr;
d8024a91 6892
5844b465
NC
6893 if (get_compression_header (&chdr, buf, sizeof (buf)) == 0)
6894 printf (_(" [<corrupt>]\n"));
77115a4a 6895 else
5844b465
NC
6896 {
6897 if (chdr.ch_type == ELFCOMPRESS_ZLIB)
6898 printf (" ZLIB, ");
6899 else
6900 printf (_(" [<unknown>: 0x%x], "),
6901 chdr.ch_type);
6902 print_vma (chdr.ch_size, LONG_HEX);
6903 printf (", %lu\n", (unsigned long) chdr.ch_addralign);
6904 }
77115a4a
L
6905 }
6906 }
6907 }
252b5132
RH
6908 }
6909
5477e8a0 6910 if (!do_section_details)
3dbcc61d 6911 {
9fb71ee4
NC
6912 /* The ordering of the letters shown here matches the ordering of the
6913 corresponding SHF_xxx values, and hence the order in which these
6914 letters will be displayed to the user. */
6915 printf (_("Key to Flags:\n\
6916 W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6917 L (link order), O (extra OS processing required), G (group), T (TLS),\n\
fd85a6a1 6918 C (compressed), x (unknown), o (OS specific), E (exclude),\n "));
dda8d76d
NC
6919 if (filedata->file_header.e_machine == EM_X86_64
6920 || filedata->file_header.e_machine == EM_L1OM
6921 || filedata->file_header.e_machine == EM_K1OM)
9fb71ee4 6922 printf (_("l (large), "));
dda8d76d 6923 else if (filedata->file_header.e_machine == EM_ARM)
f0728ee3 6924 printf (_("y (purecode), "));
dda8d76d 6925 else if (filedata->file_header.e_machine == EM_PPC)
83eef883 6926 printf (_("v (VLE), "));
9fb71ee4 6927 printf ("p (processor specific)\n");
0b4362b0 6928 }
d1133906 6929
32ec8896 6930 return TRUE;
252b5132
RH
6931}
6932
28d13567
AM
6933static bfd_boolean
6934get_symtab (Filedata *filedata, Elf_Internal_Shdr *symsec,
6935 Elf_Internal_Sym **symtab, unsigned long *nsyms,
6936 char **strtab, unsigned long *strtablen)
6937{
6938 *strtab = NULL;
6939 *strtablen = 0;
6940 *symtab = GET_ELF_SYMBOLS (filedata, symsec, nsyms);
6941
6942 if (*symtab == NULL)
6943 return FALSE;
6944
6945 if (symsec->sh_link != 0)
6946 {
6947 Elf_Internal_Shdr *strsec;
6948
6949 if (symsec->sh_link >= filedata->file_header.e_shnum)
6950 {
6951 error (_("Bad sh_link in symbol table section\n"));
6952 free (*symtab);
6953 *symtab = NULL;
6954 *nsyms = 0;
6955 return FALSE;
6956 }
6957
6958 strsec = filedata->section_headers + symsec->sh_link;
6959
6960 *strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
6961 1, strsec->sh_size, _("string table"));
6962 if (*strtab == NULL)
6963 {
6964 free (*symtab);
6965 *symtab = NULL;
6966 *nsyms = 0;
6967 return FALSE;
6968 }
6969 *strtablen = strsec->sh_size;
6970 }
6971 return TRUE;
6972}
6973
f5842774
L
6974static const char *
6975get_group_flags (unsigned int flags)
6976{
1449284b 6977 static char buff[128];
220453ec 6978
6d913794
NC
6979 if (flags == 0)
6980 return "";
6981 else if (flags == GRP_COMDAT)
6982 return "COMDAT ";
f5842774 6983
89246a0e
AM
6984 snprintf (buff, sizeof buff, "[0x%x: %s%s%s]",
6985 flags,
6986 flags & GRP_MASKOS ? _("<OS specific>") : "",
6987 flags & GRP_MASKPROC ? _("<PROC specific>") : "",
6988 (flags & ~(GRP_COMDAT | GRP_MASKOS | GRP_MASKPROC)
6989 ? _("<unknown>") : ""));
6d913794 6990
f5842774
L
6991 return buff;
6992}
6993
32ec8896 6994static bfd_boolean
dda8d76d 6995process_section_groups (Filedata * filedata)
f5842774 6996{
2cf0635d 6997 Elf_Internal_Shdr * section;
f5842774 6998 unsigned int i;
2cf0635d
NC
6999 struct group * group;
7000 Elf_Internal_Shdr * symtab_sec;
7001 Elf_Internal_Shdr * strtab_sec;
7002 Elf_Internal_Sym * symtab;
ba5cdace 7003 unsigned long num_syms;
2cf0635d 7004 char * strtab;
c256ffe7 7005 size_t strtab_size;
d1f5c6e3
L
7006
7007 /* Don't process section groups unless needed. */
7008 if (!do_unwind && !do_section_groups)
32ec8896 7009 return TRUE;
f5842774 7010
dda8d76d 7011 if (filedata->file_header.e_shnum == 0)
f5842774
L
7012 {
7013 if (do_section_groups)
82f2dbf7 7014 printf (_("\nThere are no sections to group in this file.\n"));
f5842774 7015
32ec8896 7016 return TRUE;
f5842774
L
7017 }
7018
dda8d76d 7019 if (filedata->section_headers == NULL)
f5842774
L
7020 {
7021 error (_("Section headers are not available!\n"));
fa1908fd 7022 /* PR 13622: This can happen with a corrupt ELF header. */
32ec8896 7023 return FALSE;
f5842774
L
7024 }
7025
978c4450
AM
7026 filedata->section_headers_groups
7027 = (struct group **) calloc (filedata->file_header.e_shnum,
7028 sizeof (struct group *));
e4b17d5c 7029
978c4450 7030 if (filedata->section_headers_groups == NULL)
e4b17d5c 7031 {
8b73c356 7032 error (_("Out of memory reading %u section group headers\n"),
dda8d76d 7033 filedata->file_header.e_shnum);
32ec8896 7034 return FALSE;
e4b17d5c
L
7035 }
7036
f5842774 7037 /* Scan the sections for the group section. */
978c4450 7038 filedata->group_count = 0;
dda8d76d
NC
7039 for (i = 0, section = filedata->section_headers;
7040 i < filedata->file_header.e_shnum;
f5842774 7041 i++, section++)
e4b17d5c 7042 if (section->sh_type == SHT_GROUP)
978c4450 7043 filedata->group_count++;
e4b17d5c 7044
978c4450 7045 if (filedata->group_count == 0)
d1f5c6e3
L
7046 {
7047 if (do_section_groups)
7048 printf (_("\nThere are no section groups in this file.\n"));
7049
32ec8896 7050 return TRUE;
d1f5c6e3
L
7051 }
7052
978c4450
AM
7053 filedata->section_groups = (struct group *) calloc (filedata->group_count,
7054 sizeof (struct group));
e4b17d5c 7055
978c4450 7056 if (filedata->section_groups == NULL)
e4b17d5c 7057 {
8b73c356 7058 error (_("Out of memory reading %lu groups\n"),
978c4450 7059 (unsigned long) filedata->group_count);
32ec8896 7060 return FALSE;
e4b17d5c
L
7061 }
7062
d1f5c6e3
L
7063 symtab_sec = NULL;
7064 strtab_sec = NULL;
7065 symtab = NULL;
ba5cdace 7066 num_syms = 0;
d1f5c6e3 7067 strtab = NULL;
c256ffe7 7068 strtab_size = 0;
978c4450 7069 for (i = 0, section = filedata->section_headers, group = filedata->section_groups;
dda8d76d 7070 i < filedata->file_header.e_shnum;
e4b17d5c 7071 i++, section++)
f5842774
L
7072 {
7073 if (section->sh_type == SHT_GROUP)
7074 {
dda8d76d 7075 const char * name = printable_section_name (filedata, section);
74e1a04b 7076 const char * group_name;
2cf0635d
NC
7077 unsigned char * start;
7078 unsigned char * indices;
f5842774 7079 unsigned int entry, j, size;
2cf0635d
NC
7080 Elf_Internal_Shdr * sec;
7081 Elf_Internal_Sym * sym;
f5842774
L
7082
7083 /* Get the symbol table. */
dda8d76d
NC
7084 if (section->sh_link >= filedata->file_header.e_shnum
7085 || ((sec = filedata->section_headers + section->sh_link)->sh_type
c256ffe7 7086 != SHT_SYMTAB))
f5842774
L
7087 {
7088 error (_("Bad sh_link in group section `%s'\n"), name);
7089 continue;
7090 }
d1f5c6e3
L
7091
7092 if (symtab_sec != sec)
7093 {
7094 symtab_sec = sec;
9db70fc3 7095 free (symtab);
dda8d76d 7096 symtab = GET_ELF_SYMBOLS (filedata, symtab_sec, & num_syms);
d1f5c6e3 7097 }
f5842774 7098
dd24e3da
NC
7099 if (symtab == NULL)
7100 {
7101 error (_("Corrupt header in group section `%s'\n"), name);
7102 continue;
7103 }
7104
ba5cdace
NC
7105 if (section->sh_info >= num_syms)
7106 {
7107 error (_("Bad sh_info in group section `%s'\n"), name);
7108 continue;
7109 }
7110
f5842774
L
7111 sym = symtab + section->sh_info;
7112
7113 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
7114 {
4fbb74a6 7115 if (sym->st_shndx == 0
dda8d76d 7116 || sym->st_shndx >= filedata->file_header.e_shnum)
f5842774
L
7117 {
7118 error (_("Bad sh_info in group section `%s'\n"), name);
7119 continue;
7120 }
ba2685cc 7121
dda8d76d 7122 group_name = SECTION_NAME (filedata->section_headers + sym->st_shndx);
c256ffe7 7123 strtab_sec = NULL;
9db70fc3 7124 free (strtab);
f5842774 7125 strtab = NULL;
c256ffe7 7126 strtab_size = 0;
f5842774
L
7127 }
7128 else
7129 {
7130 /* Get the string table. */
dda8d76d 7131 if (symtab_sec->sh_link >= filedata->file_header.e_shnum)
c256ffe7
JJ
7132 {
7133 strtab_sec = NULL;
9db70fc3 7134 free (strtab);
c256ffe7
JJ
7135 strtab = NULL;
7136 strtab_size = 0;
7137 }
7138 else if (strtab_sec
dda8d76d 7139 != (sec = filedata->section_headers + symtab_sec->sh_link))
d1f5c6e3
L
7140 {
7141 strtab_sec = sec;
9db70fc3 7142 free (strtab);
071436c6 7143
dda8d76d 7144 strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
071436c6
NC
7145 1, strtab_sec->sh_size,
7146 _("string table"));
c256ffe7 7147 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
d1f5c6e3 7148 }
c256ffe7 7149 group_name = sym->st_name < strtab_size
2b692964 7150 ? strtab + sym->st_name : _("<corrupt>");
f5842774
L
7151 }
7152
c9c1d674
EG
7153 /* PR 17531: file: loop. */
7154 if (section->sh_entsize > section->sh_size)
7155 {
7156 error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
dda8d76d 7157 printable_section_name (filedata, section),
8066deb1
AM
7158 (unsigned long) section->sh_entsize,
7159 (unsigned long) section->sh_size);
61dd8e19 7160 continue;
c9c1d674
EG
7161 }
7162
dda8d76d 7163 start = (unsigned char *) get_data (NULL, filedata, section->sh_offset,
3f5e193b
NC
7164 1, section->sh_size,
7165 _("section data"));
59245841
NC
7166 if (start == NULL)
7167 continue;
f5842774
L
7168
7169 indices = start;
7170 size = (section->sh_size / section->sh_entsize) - 1;
7171 entry = byte_get (indices, 4);
7172 indices += 4;
e4b17d5c
L
7173
7174 if (do_section_groups)
7175 {
2b692964 7176 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
391cb864 7177 get_group_flags (entry), i, name, group_name, size);
ba2685cc 7178
e4b17d5c
L
7179 printf (_(" [Index] Name\n"));
7180 }
7181
7182 group->group_index = i;
7183
f5842774
L
7184 for (j = 0; j < size; j++)
7185 {
2cf0635d 7186 struct group_list * g;
e4b17d5c 7187
f5842774
L
7188 entry = byte_get (indices, 4);
7189 indices += 4;
7190
dda8d76d 7191 if (entry >= filedata->file_header.e_shnum)
391cb864 7192 {
57028622
NC
7193 static unsigned num_group_errors = 0;
7194
7195 if (num_group_errors ++ < 10)
7196 {
7197 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
dda8d76d 7198 entry, i, filedata->file_header.e_shnum - 1);
57028622 7199 if (num_group_errors == 10)
67ce483b 7200 warn (_("Further error messages about overlarge group section indices suppressed\n"));
57028622 7201 }
391cb864
L
7202 continue;
7203 }
391cb864 7204
978c4450 7205 if (filedata->section_headers_groups [entry] != NULL)
e4b17d5c 7206 {
d1f5c6e3
L
7207 if (entry)
7208 {
57028622
NC
7209 static unsigned num_errs = 0;
7210
7211 if (num_errs ++ < 10)
7212 {
7213 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
7214 entry, i,
978c4450 7215 filedata->section_headers_groups [entry]->group_index);
57028622
NC
7216 if (num_errs == 10)
7217 warn (_("Further error messages about already contained group sections suppressed\n"));
7218 }
d1f5c6e3
L
7219 continue;
7220 }
7221 else
7222 {
7223 /* Intel C/C++ compiler may put section 0 in a
32ec8896 7224 section group. We just warn it the first time
d1f5c6e3 7225 and ignore it afterwards. */
32ec8896 7226 static bfd_boolean warned = FALSE;
d1f5c6e3
L
7227 if (!warned)
7228 {
7229 error (_("section 0 in group section [%5u]\n"),
978c4450 7230 filedata->section_headers_groups [entry]->group_index);
32ec8896 7231 warned = TRUE;
d1f5c6e3
L
7232 }
7233 }
e4b17d5c
L
7234 }
7235
978c4450 7236 filedata->section_headers_groups [entry] = group;
e4b17d5c
L
7237
7238 if (do_section_groups)
7239 {
dda8d76d
NC
7240 sec = filedata->section_headers + entry;
7241 printf (" [%5u] %s\n", entry, printable_section_name (filedata, sec));
ba2685cc
AM
7242 }
7243
3f5e193b 7244 g = (struct group_list *) xmalloc (sizeof (struct group_list));
e4b17d5c
L
7245 g->section_index = entry;
7246 g->next = group->root;
7247 group->root = g;
f5842774
L
7248 }
7249
9db70fc3 7250 free (start);
e4b17d5c
L
7251
7252 group++;
f5842774
L
7253 }
7254 }
7255
9db70fc3
AM
7256 free (symtab);
7257 free (strtab);
32ec8896 7258 return TRUE;
f5842774
L
7259}
7260
28f997cf
TG
7261/* Data used to display dynamic fixups. */
7262
7263struct ia64_vms_dynfixup
7264{
7265 bfd_vma needed_ident; /* Library ident number. */
7266 bfd_vma needed; /* Index in the dstrtab of the library name. */
7267 bfd_vma fixup_needed; /* Index of the library. */
7268 bfd_vma fixup_rela_cnt; /* Number of fixups. */
7269 bfd_vma fixup_rela_off; /* Fixups offset in the dynamic segment. */
7270};
7271
7272/* Data used to display dynamic relocations. */
7273
7274struct ia64_vms_dynimgrela
7275{
7276 bfd_vma img_rela_cnt; /* Number of relocations. */
7277 bfd_vma img_rela_off; /* Reloc offset in the dynamic segment. */
7278};
7279
7280/* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
7281 library). */
7282
32ec8896 7283static bfd_boolean
dda8d76d
NC
7284dump_ia64_vms_dynamic_fixups (Filedata * filedata,
7285 struct ia64_vms_dynfixup * fixup,
7286 const char * strtab,
7287 unsigned int strtab_sz)
28f997cf 7288{
32ec8896 7289 Elf64_External_VMS_IMAGE_FIXUP * imfs;
28f997cf 7290 long i;
32ec8896 7291 const char * lib_name;
28f997cf 7292
978c4450
AM
7293 imfs = get_data (NULL, filedata,
7294 filedata->dynamic_addr + fixup->fixup_rela_off,
95099889 7295 sizeof (*imfs), fixup->fixup_rela_cnt,
28f997cf
TG
7296 _("dynamic section image fixups"));
7297 if (!imfs)
32ec8896 7298 return FALSE;
28f997cf
TG
7299
7300 if (fixup->needed < strtab_sz)
7301 lib_name = strtab + fixup->needed;
7302 else
7303 {
32ec8896 7304 warn (_("corrupt library name index of 0x%lx found in dynamic entry"),
7f01b0c6 7305 (unsigned long) fixup->needed);
28f997cf
TG
7306 lib_name = "???";
7307 }
736990c4 7308
28f997cf
TG
7309 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
7310 (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
7311 printf
7312 (_("Seg Offset Type SymVec DataType\n"));
7313
7314 for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
7315 {
7316 unsigned int type;
7317 const char *rtype;
7318
7319 printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
7320 printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
7321 type = BYTE_GET (imfs [i].type);
7322 rtype = elf_ia64_reloc_type (type);
7323 if (rtype == NULL)
7324 printf (" 0x%08x ", type);
7325 else
7326 printf (" %-32s ", rtype);
7327 printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
7328 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
7329 }
7330
7331 free (imfs);
32ec8896 7332 return TRUE;
28f997cf
TG
7333}
7334
7335/* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
7336
32ec8896 7337static bfd_boolean
dda8d76d 7338dump_ia64_vms_dynamic_relocs (Filedata * filedata, struct ia64_vms_dynimgrela *imgrela)
28f997cf
TG
7339{
7340 Elf64_External_VMS_IMAGE_RELA *imrs;
7341 long i;
7342
978c4450
AM
7343 imrs = get_data (NULL, filedata,
7344 filedata->dynamic_addr + imgrela->img_rela_off,
95099889 7345 sizeof (*imrs), imgrela->img_rela_cnt,
9cf03b7e 7346 _("dynamic section image relocations"));
28f997cf 7347 if (!imrs)
32ec8896 7348 return FALSE;
28f997cf
TG
7349
7350 printf (_("\nImage relocs\n"));
7351 printf
7352 (_("Seg Offset Type Addend Seg Sym Off\n"));
7353
7354 for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
7355 {
7356 unsigned int type;
7357 const char *rtype;
7358
7359 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
7360 printf ("%08" BFD_VMA_FMT "x ",
7361 (bfd_vma) BYTE_GET (imrs [i].rela_offset));
7362 type = BYTE_GET (imrs [i].type);
7363 rtype = elf_ia64_reloc_type (type);
7364 if (rtype == NULL)
7365 printf ("0x%08x ", type);
7366 else
7367 printf ("%-31s ", rtype);
7368 print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
7369 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
7370 printf ("%08" BFD_VMA_FMT "x\n",
7371 (bfd_vma) BYTE_GET (imrs [i].sym_offset));
7372 }
7373
7374 free (imrs);
32ec8896 7375 return TRUE;
28f997cf
TG
7376}
7377
7378/* Display IA-64 OpenVMS dynamic relocations and fixups. */
7379
32ec8896 7380static bfd_boolean
dda8d76d 7381process_ia64_vms_dynamic_relocs (Filedata * filedata)
28f997cf
TG
7382{
7383 struct ia64_vms_dynfixup fixup;
7384 struct ia64_vms_dynimgrela imgrela;
7385 Elf_Internal_Dyn *entry;
28f997cf
TG
7386 bfd_vma strtab_off = 0;
7387 bfd_vma strtab_sz = 0;
7388 char *strtab = NULL;
32ec8896 7389 bfd_boolean res = TRUE;
28f997cf
TG
7390
7391 memset (&fixup, 0, sizeof (fixup));
7392 memset (&imgrela, 0, sizeof (imgrela));
7393
7394 /* Note: the order of the entries is specified by the OpenVMS specs. */
978c4450
AM
7395 for (entry = filedata->dynamic_section;
7396 entry < filedata->dynamic_section + filedata->dynamic_nent;
28f997cf
TG
7397 entry++)
7398 {
7399 switch (entry->d_tag)
7400 {
7401 case DT_IA_64_VMS_STRTAB_OFFSET:
7402 strtab_off = entry->d_un.d_val;
7403 break;
7404 case DT_STRSZ:
7405 strtab_sz = entry->d_un.d_val;
7406 if (strtab == NULL)
978c4450
AM
7407 strtab = get_data (NULL, filedata,
7408 filedata->dynamic_addr + strtab_off,
28f997cf 7409 1, strtab_sz, _("dynamic string section"));
736990c4
NC
7410 if (strtab == NULL)
7411 strtab_sz = 0;
28f997cf
TG
7412 break;
7413
7414 case DT_IA_64_VMS_NEEDED_IDENT:
7415 fixup.needed_ident = entry->d_un.d_val;
7416 break;
7417 case DT_NEEDED:
7418 fixup.needed = entry->d_un.d_val;
7419 break;
7420 case DT_IA_64_VMS_FIXUP_NEEDED:
7421 fixup.fixup_needed = entry->d_un.d_val;
7422 break;
7423 case DT_IA_64_VMS_FIXUP_RELA_CNT:
7424 fixup.fixup_rela_cnt = entry->d_un.d_val;
7425 break;
7426 case DT_IA_64_VMS_FIXUP_RELA_OFF:
7427 fixup.fixup_rela_off = entry->d_un.d_val;
dda8d76d 7428 if (! dump_ia64_vms_dynamic_fixups (filedata, &fixup, strtab, strtab_sz))
32ec8896 7429 res = FALSE;
28f997cf 7430 break;
28f997cf
TG
7431 case DT_IA_64_VMS_IMG_RELA_CNT:
7432 imgrela.img_rela_cnt = entry->d_un.d_val;
7433 break;
7434 case DT_IA_64_VMS_IMG_RELA_OFF:
7435 imgrela.img_rela_off = entry->d_un.d_val;
dda8d76d 7436 if (! dump_ia64_vms_dynamic_relocs (filedata, &imgrela))
32ec8896 7437 res = FALSE;
28f997cf
TG
7438 break;
7439
7440 default:
7441 break;
7442 }
7443 }
7444
9db70fc3 7445 free (strtab);
28f997cf
TG
7446
7447 return res;
7448}
7449
85b1c36d 7450static struct
566b0d53 7451{
2cf0635d 7452 const char * name;
566b0d53
L
7453 int reloc;
7454 int size;
7455 int rela;
32ec8896
NC
7456}
7457 dynamic_relocations [] =
566b0d53 7458{
32ec8896
NC
7459 { "REL", DT_REL, DT_RELSZ, FALSE },
7460 { "RELA", DT_RELA, DT_RELASZ, TRUE },
7461 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
566b0d53
L
7462};
7463
252b5132 7464/* Process the reloc section. */
18bd398b 7465
32ec8896 7466static bfd_boolean
dda8d76d 7467process_relocs (Filedata * filedata)
252b5132 7468{
b34976b6
AM
7469 unsigned long rel_size;
7470 unsigned long rel_offset;
252b5132 7471
252b5132 7472 if (!do_reloc)
32ec8896 7473 return TRUE;
252b5132
RH
7474
7475 if (do_using_dynamic)
7476 {
32ec8896 7477 int is_rela;
2cf0635d 7478 const char * name;
32ec8896 7479 bfd_boolean has_dynamic_reloc;
566b0d53 7480 unsigned int i;
0de14b54 7481
32ec8896 7482 has_dynamic_reloc = FALSE;
252b5132 7483
566b0d53 7484 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
252b5132 7485 {
566b0d53
L
7486 is_rela = dynamic_relocations [i].rela;
7487 name = dynamic_relocations [i].name;
978c4450
AM
7488 rel_size = filedata->dynamic_info[dynamic_relocations [i].size];
7489 rel_offset = filedata->dynamic_info[dynamic_relocations [i].reloc];
103f02d3 7490
32ec8896
NC
7491 if (rel_size)
7492 has_dynamic_reloc = TRUE;
566b0d53
L
7493
7494 if (is_rela == UNKNOWN)
aa903cfb 7495 {
566b0d53 7496 if (dynamic_relocations [i].reloc == DT_JMPREL)
978c4450 7497 switch (filedata->dynamic_info[DT_PLTREL])
566b0d53
L
7498 {
7499 case DT_REL:
7500 is_rela = FALSE;
7501 break;
7502 case DT_RELA:
7503 is_rela = TRUE;
7504 break;
7505 }
aa903cfb 7506 }
252b5132 7507
566b0d53
L
7508 if (rel_size)
7509 {
7510 printf
7511 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
7512 name, rel_offset, rel_size);
252b5132 7513
dda8d76d
NC
7514 dump_relocations (filedata,
7515 offset_from_vma (filedata, rel_offset, rel_size),
d93f0186 7516 rel_size,
978c4450
AM
7517 filedata->dynamic_symbols,
7518 filedata->num_dynamic_syms,
7519 filedata->dynamic_strings,
7520 filedata->dynamic_strings_length,
32ec8896 7521 is_rela, TRUE /* is_dynamic */);
566b0d53 7522 }
252b5132 7523 }
566b0d53 7524
dda8d76d
NC
7525 if (is_ia64_vms (filedata))
7526 if (process_ia64_vms_dynamic_relocs (filedata))
32ec8896 7527 has_dynamic_reloc = TRUE;
28f997cf 7528
566b0d53 7529 if (! has_dynamic_reloc)
252b5132
RH
7530 printf (_("\nThere are no dynamic relocations in this file.\n"));
7531 }
7532 else
7533 {
2cf0635d 7534 Elf_Internal_Shdr * section;
b34976b6 7535 unsigned long i;
32ec8896 7536 bfd_boolean found = FALSE;
252b5132 7537
dda8d76d
NC
7538 for (i = 0, section = filedata->section_headers;
7539 i < filedata->file_header.e_shnum;
b34976b6 7540 i++, section++)
252b5132
RH
7541 {
7542 if ( section->sh_type != SHT_RELA
7543 && section->sh_type != SHT_REL)
7544 continue;
7545
7546 rel_offset = section->sh_offset;
7547 rel_size = section->sh_size;
7548
7549 if (rel_size)
7550 {
b34976b6 7551 int is_rela;
d3a49aa8 7552 unsigned long num_rela;
103f02d3 7553
252b5132
RH
7554 printf (_("\nRelocation section "));
7555
dda8d76d 7556 if (filedata->string_table == NULL)
19936277 7557 printf ("%d", section->sh_name);
252b5132 7558 else
dda8d76d 7559 printf ("'%s'", printable_section_name (filedata, section));
252b5132 7560
d3a49aa8
AM
7561 num_rela = rel_size / section->sh_entsize;
7562 printf (ngettext (" at offset 0x%lx contains %lu entry:\n",
7563 " at offset 0x%lx contains %lu entries:\n",
7564 num_rela),
7565 rel_offset, num_rela);
252b5132 7566
d79b3d50
NC
7567 is_rela = section->sh_type == SHT_RELA;
7568
4fbb74a6 7569 if (section->sh_link != 0
dda8d76d 7570 && section->sh_link < filedata->file_header.e_shnum)
af3fc3bc 7571 {
2cf0635d
NC
7572 Elf_Internal_Shdr * symsec;
7573 Elf_Internal_Sym * symtab;
d79b3d50 7574 unsigned long nsyms;
c256ffe7 7575 unsigned long strtablen = 0;
2cf0635d 7576 char * strtab = NULL;
57346661 7577
dda8d76d 7578 symsec = filedata->section_headers + section->sh_link;
08d8fa11
JJ
7579 if (symsec->sh_type != SHT_SYMTAB
7580 && symsec->sh_type != SHT_DYNSYM)
7581 continue;
7582
28d13567
AM
7583 if (!get_symtab (filedata, symsec,
7584 &symtab, &nsyms, &strtab, &strtablen))
af3fc3bc 7585 continue;
252b5132 7586
dda8d76d 7587 dump_relocations (filedata, rel_offset, rel_size,
bb4d2ac2
L
7588 symtab, nsyms, strtab, strtablen,
7589 is_rela,
7590 symsec->sh_type == SHT_DYNSYM);
9db70fc3 7591 free (strtab);
d79b3d50
NC
7592 free (symtab);
7593 }
7594 else
dda8d76d 7595 dump_relocations (filedata, rel_offset, rel_size,
32ec8896
NC
7596 NULL, 0, NULL, 0, is_rela,
7597 FALSE /* is_dynamic */);
252b5132 7598
32ec8896 7599 found = TRUE;
252b5132
RH
7600 }
7601 }
7602
7603 if (! found)
45ac8f4f
NC
7604 {
7605 /* Users sometimes forget the -D option, so try to be helpful. */
7606 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
7607 {
978c4450 7608 if (filedata->dynamic_info[dynamic_relocations [i].size])
45ac8f4f
NC
7609 {
7610 printf (_("\nThere are no static relocations in this file."));
7611 printf (_("\nTo see the dynamic relocations add --use-dynamic to the command line.\n"));
7612
7613 break;
7614 }
7615 }
7616 if (i == ARRAY_SIZE (dynamic_relocations))
7617 printf (_("\nThere are no relocations in this file.\n"));
7618 }
252b5132
RH
7619 }
7620
32ec8896 7621 return TRUE;
252b5132
RH
7622}
7623
4d6ed7c8
NC
7624/* An absolute address consists of a section and an offset. If the
7625 section is NULL, the offset itself is the address, otherwise, the
7626 address equals to LOAD_ADDRESS(section) + offset. */
7627
7628struct absaddr
948f632f
DA
7629{
7630 unsigned short section;
7631 bfd_vma offset;
7632};
4d6ed7c8 7633
948f632f
DA
7634/* Find the nearest symbol at or below ADDR. Returns the symbol
7635 name, if found, and the offset from the symbol to ADDR. */
4d6ed7c8 7636
4d6ed7c8 7637static void
dda8d76d
NC
7638find_symbol_for_address (Filedata * filedata,
7639 Elf_Internal_Sym * symtab,
7640 unsigned long nsyms,
7641 const char * strtab,
7642 unsigned long strtab_size,
7643 struct absaddr addr,
7644 const char ** symname,
7645 bfd_vma * offset)
4d6ed7c8 7646{
d3ba0551 7647 bfd_vma dist = 0x100000;
2cf0635d 7648 Elf_Internal_Sym * sym;
948f632f
DA
7649 Elf_Internal_Sym * beg;
7650 Elf_Internal_Sym * end;
2cf0635d 7651 Elf_Internal_Sym * best = NULL;
4d6ed7c8 7652
0b6ae522 7653 REMOVE_ARCH_BITS (addr.offset);
948f632f
DA
7654 beg = symtab;
7655 end = symtab + nsyms;
0b6ae522 7656
948f632f 7657 while (beg < end)
4d6ed7c8 7658 {
948f632f
DA
7659 bfd_vma value;
7660
7661 sym = beg + (end - beg) / 2;
0b6ae522 7662
948f632f 7663 value = sym->st_value;
0b6ae522
DJ
7664 REMOVE_ARCH_BITS (value);
7665
948f632f 7666 if (sym->st_name != 0
4d6ed7c8 7667 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
0b6ae522
DJ
7668 && addr.offset >= value
7669 && addr.offset - value < dist)
4d6ed7c8
NC
7670 {
7671 best = sym;
0b6ae522 7672 dist = addr.offset - value;
4d6ed7c8
NC
7673 if (!dist)
7674 break;
7675 }
948f632f
DA
7676
7677 if (addr.offset < value)
7678 end = sym;
7679 else
7680 beg = sym + 1;
4d6ed7c8 7681 }
1b31d05e 7682
4d6ed7c8
NC
7683 if (best)
7684 {
57346661 7685 *symname = (best->st_name >= strtab_size
2b692964 7686 ? _("<corrupt>") : strtab + best->st_name);
4d6ed7c8
NC
7687 *offset = dist;
7688 return;
7689 }
1b31d05e 7690
4d6ed7c8
NC
7691 *symname = NULL;
7692 *offset = addr.offset;
7693}
7694
32ec8896 7695static /* signed */ int
948f632f
DA
7696symcmp (const void *p, const void *q)
7697{
7698 Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
7699 Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
7700
7701 return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
7702}
7703
7704/* Process the unwind section. */
7705
7706#include "unwind-ia64.h"
7707
7708struct ia64_unw_table_entry
7709{
7710 struct absaddr start;
7711 struct absaddr end;
7712 struct absaddr info;
7713};
7714
7715struct ia64_unw_aux_info
7716{
32ec8896
NC
7717 struct ia64_unw_table_entry * table; /* Unwind table. */
7718 unsigned long table_len; /* Length of unwind table. */
7719 unsigned char * info; /* Unwind info. */
7720 unsigned long info_size; /* Size of unwind info. */
7721 bfd_vma info_addr; /* Starting address of unwind info. */
7722 bfd_vma seg_base; /* Starting address of segment. */
7723 Elf_Internal_Sym * symtab; /* The symbol table. */
7724 unsigned long nsyms; /* Number of symbols. */
7725 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7726 unsigned long nfuns; /* Number of entries in funtab. */
7727 char * strtab; /* The string table. */
7728 unsigned long strtab_size; /* Size of string table. */
948f632f
DA
7729};
7730
32ec8896 7731static bfd_boolean
dda8d76d 7732dump_ia64_unwind (Filedata * filedata, struct ia64_unw_aux_info * aux)
4d6ed7c8 7733{
2cf0635d 7734 struct ia64_unw_table_entry * tp;
948f632f 7735 unsigned long j, nfuns;
4d6ed7c8 7736 int in_body;
32ec8896 7737 bfd_boolean res = TRUE;
7036c0e1 7738
948f632f
DA
7739 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7740 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7741 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7742 aux->funtab[nfuns++] = aux->symtab[j];
7743 aux->nfuns = nfuns;
7744 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7745
4d6ed7c8
NC
7746 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7747 {
7748 bfd_vma stamp;
7749 bfd_vma offset;
2cf0635d
NC
7750 const unsigned char * dp;
7751 const unsigned char * head;
53774b7e 7752 const unsigned char * end;
2cf0635d 7753 const char * procname;
4d6ed7c8 7754
dda8d76d 7755 find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
57346661 7756 aux->strtab_size, tp->start, &procname, &offset);
4d6ed7c8
NC
7757
7758 fputs ("\n<", stdout);
7759
7760 if (procname)
7761 {
7762 fputs (procname, stdout);
7763
7764 if (offset)
7765 printf ("+%lx", (unsigned long) offset);
7766 }
7767
7768 fputs (">: [", stdout);
7769 print_vma (tp->start.offset, PREFIX_HEX);
7770 fputc ('-', stdout);
7771 print_vma (tp->end.offset, PREFIX_HEX);
86f55779 7772 printf ("], info at +0x%lx\n",
4d6ed7c8
NC
7773 (unsigned long) (tp->info.offset - aux->seg_base));
7774
53774b7e
NC
7775 /* PR 17531: file: 86232b32. */
7776 if (aux->info == NULL)
7777 continue;
7778
97c0a079
AM
7779 offset = tp->info.offset;
7780 if (tp->info.section)
7781 {
7782 if (tp->info.section >= filedata->file_header.e_shnum)
7783 {
7784 warn (_("Invalid section %u in table entry %ld\n"),
7785 tp->info.section, (long) (tp - aux->table));
7786 res = FALSE;
7787 continue;
7788 }
7789 offset += filedata->section_headers[tp->info.section].sh_addr;
7790 }
7791 offset -= aux->info_addr;
53774b7e 7792 /* PR 17531: file: 0997b4d1. */
90679903
AM
7793 if (offset >= aux->info_size
7794 || aux->info_size - offset < 8)
53774b7e
NC
7795 {
7796 warn (_("Invalid offset %lx in table entry %ld\n"),
7797 (long) tp->info.offset, (long) (tp - aux->table));
32ec8896 7798 res = FALSE;
53774b7e
NC
7799 continue;
7800 }
7801
97c0a079 7802 head = aux->info + offset;
a4a00738 7803 stamp = byte_get ((unsigned char *) head, sizeof (stamp));
4d6ed7c8 7804
86f55779 7805 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4d6ed7c8
NC
7806 (unsigned) UNW_VER (stamp),
7807 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
7808 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
7809 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
89fac5e3 7810 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
4d6ed7c8
NC
7811
7812 if (UNW_VER (stamp) != 1)
7813 {
2b692964 7814 printf (_("\tUnknown version.\n"));
4d6ed7c8
NC
7815 continue;
7816 }
7817
7818 in_body = 0;
53774b7e
NC
7819 end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
7820 /* PR 17531: file: 16ceda89. */
7821 if (end > aux->info + aux->info_size)
7822 end = aux->info + aux->info_size;
7823 for (dp = head + 8; dp < end;)
b4477bc8 7824 dp = unw_decode (dp, in_body, & in_body, end);
4d6ed7c8 7825 }
948f632f
DA
7826
7827 free (aux->funtab);
32ec8896
NC
7828
7829 return res;
4d6ed7c8
NC
7830}
7831
53774b7e 7832static bfd_boolean
dda8d76d
NC
7833slurp_ia64_unwind_table (Filedata * filedata,
7834 struct ia64_unw_aux_info * aux,
7835 Elf_Internal_Shdr * sec)
4d6ed7c8 7836{
89fac5e3 7837 unsigned long size, nrelas, i;
2cf0635d
NC
7838 Elf_Internal_Phdr * seg;
7839 struct ia64_unw_table_entry * tep;
7840 Elf_Internal_Shdr * relsec;
7841 Elf_Internal_Rela * rela;
7842 Elf_Internal_Rela * rp;
7843 unsigned char * table;
7844 unsigned char * tp;
7845 Elf_Internal_Sym * sym;
7846 const char * relname;
4d6ed7c8 7847
53774b7e
NC
7848 aux->table_len = 0;
7849
4d6ed7c8
NC
7850 /* First, find the starting address of the segment that includes
7851 this section: */
7852
dda8d76d 7853 if (filedata->file_header.e_phnum)
4d6ed7c8 7854 {
dda8d76d 7855 if (! get_program_headers (filedata))
53774b7e 7856 return FALSE;
4d6ed7c8 7857
dda8d76d
NC
7858 for (seg = filedata->program_headers;
7859 seg < filedata->program_headers + filedata->file_header.e_phnum;
d93f0186 7860 ++seg)
4d6ed7c8
NC
7861 {
7862 if (seg->p_type != PT_LOAD)
7863 continue;
7864
7865 if (sec->sh_addr >= seg->p_vaddr
7866 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7867 {
7868 aux->seg_base = seg->p_vaddr;
7869 break;
7870 }
7871 }
4d6ed7c8
NC
7872 }
7873
7874 /* Second, build the unwind table from the contents of the unwind section: */
7875 size = sec->sh_size;
dda8d76d 7876 table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
3f5e193b 7877 _("unwind table"));
a6e9f9df 7878 if (!table)
53774b7e 7879 return FALSE;
4d6ed7c8 7880
53774b7e 7881 aux->table_len = size / (3 * eh_addr_size);
3f5e193b 7882 aux->table = (struct ia64_unw_table_entry *)
53774b7e 7883 xcmalloc (aux->table_len, sizeof (aux->table[0]));
89fac5e3 7884 tep = aux->table;
53774b7e
NC
7885
7886 for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
4d6ed7c8
NC
7887 {
7888 tep->start.section = SHN_UNDEF;
7889 tep->end.section = SHN_UNDEF;
7890 tep->info.section = SHN_UNDEF;
c6a0c689
AM
7891 tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7892 tep->end.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7893 tep->info.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
4d6ed7c8
NC
7894 tep->start.offset += aux->seg_base;
7895 tep->end.offset += aux->seg_base;
7896 tep->info.offset += aux->seg_base;
7897 }
7898 free (table);
7899
41e92641 7900 /* Third, apply any relocations to the unwind table: */
dda8d76d
NC
7901 for (relsec = filedata->section_headers;
7902 relsec < filedata->section_headers + filedata->file_header.e_shnum;
4d6ed7c8
NC
7903 ++relsec)
7904 {
7905 if (relsec->sh_type != SHT_RELA
dda8d76d
NC
7906 || relsec->sh_info >= filedata->file_header.e_shnum
7907 || filedata->section_headers + relsec->sh_info != sec)
4d6ed7c8
NC
7908 continue;
7909
dda8d76d 7910 if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
4d6ed7c8 7911 & rela, & nrelas))
53774b7e
NC
7912 {
7913 free (aux->table);
7914 aux->table = NULL;
7915 aux->table_len = 0;
7916 return FALSE;
7917 }
4d6ed7c8
NC
7918
7919 for (rp = rela; rp < rela + nrelas; ++rp)
7920 {
4770fb94 7921 unsigned int sym_ndx;
726bd37d
AM
7922 unsigned int r_type = get_reloc_type (filedata, rp->r_info);
7923 relname = elf_ia64_reloc_type (r_type);
4d6ed7c8 7924
82b1b41b
NC
7925 /* PR 17531: file: 9fa67536. */
7926 if (relname == NULL)
7927 {
726bd37d 7928 warn (_("Skipping unknown relocation type: %u\n"), r_type);
82b1b41b
NC
7929 continue;
7930 }
948f632f 7931
0112cd26 7932 if (! const_strneq (relname, "R_IA64_SEGREL"))
4d6ed7c8 7933 {
82b1b41b 7934 warn (_("Skipping unexpected relocation type: %s\n"), relname);
4d6ed7c8
NC
7935 continue;
7936 }
7937
89fac5e3 7938 i = rp->r_offset / (3 * eh_addr_size);
4d6ed7c8 7939
53774b7e
NC
7940 /* PR 17531: file: 5bc8d9bf. */
7941 if (i >= aux->table_len)
7942 {
7943 warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
7944 continue;
7945 }
7946
4770fb94
AM
7947 sym_ndx = get_reloc_symindex (rp->r_info);
7948 if (sym_ndx >= aux->nsyms)
7949 {
7950 warn (_("Skipping reloc with invalid symbol index: %u\n"),
7951 sym_ndx);
7952 continue;
7953 }
7954 sym = aux->symtab + sym_ndx;
7955
53774b7e 7956 switch (rp->r_offset / eh_addr_size % 3)
4d6ed7c8
NC
7957 {
7958 case 0:
7959 aux->table[i].start.section = sym->st_shndx;
e466bc6e 7960 aux->table[i].start.offset = rp->r_addend + sym->st_value;
4d6ed7c8
NC
7961 break;
7962 case 1:
7963 aux->table[i].end.section = sym->st_shndx;
e466bc6e 7964 aux->table[i].end.offset = rp->r_addend + sym->st_value;
4d6ed7c8
NC
7965 break;
7966 case 2:
7967 aux->table[i].info.section = sym->st_shndx;
e466bc6e 7968 aux->table[i].info.offset = rp->r_addend + sym->st_value;
4d6ed7c8
NC
7969 break;
7970 default:
7971 break;
7972 }
7973 }
7974
7975 free (rela);
7976 }
7977
53774b7e 7978 return TRUE;
4d6ed7c8
NC
7979}
7980
32ec8896 7981static bfd_boolean
dda8d76d 7982ia64_process_unwind (Filedata * filedata)
4d6ed7c8 7983{
2cf0635d
NC
7984 Elf_Internal_Shdr * sec;
7985 Elf_Internal_Shdr * unwsec = NULL;
89fac5e3 7986 unsigned long i, unwcount = 0, unwstart = 0;
57346661 7987 struct ia64_unw_aux_info aux;
32ec8896 7988 bfd_boolean res = TRUE;
f1467e33 7989
4d6ed7c8
NC
7990 memset (& aux, 0, sizeof (aux));
7991
dda8d76d 7992 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
4d6ed7c8 7993 {
28d13567 7994 if (sec->sh_type == SHT_SYMTAB)
4d6ed7c8 7995 {
28d13567 7996 if (aux.symtab)
4082ef84 7997 {
28d13567
AM
7998 error (_("Multiple symbol tables encountered\n"));
7999 free (aux.symtab);
8000 aux.symtab = NULL;
4082ef84 8001 free (aux.strtab);
28d13567 8002 aux.strtab = NULL;
4082ef84 8003 }
28d13567
AM
8004 if (!get_symtab (filedata, sec, &aux.symtab, &aux.nsyms,
8005 &aux.strtab, &aux.strtab_size))
8006 return FALSE;
4d6ed7c8
NC
8007 }
8008 else if (sec->sh_type == SHT_IA_64_UNWIND)
579f31ac
JJ
8009 unwcount++;
8010 }
8011
8012 if (!unwcount)
8013 printf (_("\nThere are no unwind sections in this file.\n"));
8014
8015 while (unwcount-- > 0)
8016 {
2cf0635d 8017 char * suffix;
579f31ac
JJ
8018 size_t len, len2;
8019
dda8d76d
NC
8020 for (i = unwstart, sec = filedata->section_headers + unwstart, unwsec = NULL;
8021 i < filedata->file_header.e_shnum; ++i, ++sec)
579f31ac
JJ
8022 if (sec->sh_type == SHT_IA_64_UNWIND)
8023 {
8024 unwsec = sec;
8025 break;
8026 }
4082ef84
NC
8027 /* We have already counted the number of SHT_IA64_UNWIND
8028 sections so the loop above should never fail. */
8029 assert (unwsec != NULL);
579f31ac
JJ
8030
8031 unwstart = i + 1;
8032 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
8033
e4b17d5c
L
8034 if ((unwsec->sh_flags & SHF_GROUP) != 0)
8035 {
8036 /* We need to find which section group it is in. */
4082ef84 8037 struct group_list * g;
e4b17d5c 8038
978c4450
AM
8039 if (filedata->section_headers_groups == NULL
8040 || filedata->section_headers_groups[i] == NULL)
dda8d76d 8041 i = filedata->file_header.e_shnum;
4082ef84 8042 else
e4b17d5c 8043 {
978c4450 8044 g = filedata->section_headers_groups[i]->root;
18bd398b 8045
4082ef84
NC
8046 for (; g != NULL; g = g->next)
8047 {
dda8d76d 8048 sec = filedata->section_headers + g->section_index;
e4b17d5c 8049
4082ef84
NC
8050 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
8051 break;
8052 }
8053
8054 if (g == NULL)
dda8d76d 8055 i = filedata->file_header.e_shnum;
4082ef84 8056 }
e4b17d5c 8057 }
18bd398b 8058 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
579f31ac 8059 {
18bd398b 8060 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
579f31ac
JJ
8061 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
8062 suffix = SECTION_NAME (unwsec) + len;
dda8d76d 8063 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum;
579f31ac 8064 ++i, ++sec)
18bd398b
NC
8065 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
8066 && streq (SECTION_NAME (sec) + len2, suffix))
579f31ac
JJ
8067 break;
8068 }
8069 else
8070 {
8071 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
18bd398b 8072 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
579f31ac
JJ
8073 len = sizeof (ELF_STRING_ia64_unwind) - 1;
8074 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
8075 suffix = "";
18bd398b 8076 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
579f31ac 8077 suffix = SECTION_NAME (unwsec) + len;
dda8d76d 8078 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum;
579f31ac 8079 ++i, ++sec)
18bd398b
NC
8080 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
8081 && streq (SECTION_NAME (sec) + len2, suffix))
579f31ac
JJ
8082 break;
8083 }
8084
dda8d76d 8085 if (i == filedata->file_header.e_shnum)
579f31ac
JJ
8086 {
8087 printf (_("\nCould not find unwind info section for "));
8088
dda8d76d 8089 if (filedata->string_table == NULL)
579f31ac
JJ
8090 printf ("%d", unwsec->sh_name);
8091 else
dda8d76d 8092 printf ("'%s'", printable_section_name (filedata, unwsec));
579f31ac
JJ
8093 }
8094 else
4d6ed7c8 8095 {
4d6ed7c8 8096 aux.info_addr = sec->sh_addr;
dda8d76d 8097 aux.info = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1,
4082ef84
NC
8098 sec->sh_size,
8099 _("unwind info"));
59245841 8100 aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
4d6ed7c8 8101
579f31ac 8102 printf (_("\nUnwind section "));
4d6ed7c8 8103
dda8d76d 8104 if (filedata->string_table == NULL)
579f31ac
JJ
8105 printf ("%d", unwsec->sh_name);
8106 else
dda8d76d 8107 printf ("'%s'", printable_section_name (filedata, unwsec));
4d6ed7c8 8108
579f31ac 8109 printf (_(" at offset 0x%lx contains %lu entries:\n"),
e59b4dfb 8110 (unsigned long) unwsec->sh_offset,
89fac5e3 8111 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
4d6ed7c8 8112
dda8d76d 8113 if (slurp_ia64_unwind_table (filedata, & aux, unwsec)
53774b7e 8114 && aux.table_len > 0)
dda8d76d 8115 dump_ia64_unwind (filedata, & aux);
579f31ac 8116
9db70fc3
AM
8117 free ((char *) aux.table);
8118 free ((char *) aux.info);
579f31ac
JJ
8119 aux.table = NULL;
8120 aux.info = NULL;
8121 }
4d6ed7c8 8122 }
4d6ed7c8 8123
9db70fc3
AM
8124 free (aux.symtab);
8125 free ((char *) aux.strtab);
32ec8896
NC
8126
8127 return res;
4d6ed7c8
NC
8128}
8129
3f5e193b 8130struct hppa_unw_table_entry
32ec8896
NC
8131{
8132 struct absaddr start;
8133 struct absaddr end;
8134 unsigned int Cannot_unwind:1; /* 0 */
8135 unsigned int Millicode:1; /* 1 */
8136 unsigned int Millicode_save_sr0:1; /* 2 */
8137 unsigned int Region_description:2; /* 3..4 */
8138 unsigned int reserved1:1; /* 5 */
8139 unsigned int Entry_SR:1; /* 6 */
8140 unsigned int Entry_FR:4; /* Number saved 7..10 */
8141 unsigned int Entry_GR:5; /* Number saved 11..15 */
8142 unsigned int Args_stored:1; /* 16 */
8143 unsigned int Variable_Frame:1; /* 17 */
8144 unsigned int Separate_Package_Body:1; /* 18 */
8145 unsigned int Frame_Extension_Millicode:1; /* 19 */
8146 unsigned int Stack_Overflow_Check:1; /* 20 */
8147 unsigned int Two_Instruction_SP_Increment:1; /* 21 */
8148 unsigned int Ada_Region:1; /* 22 */
8149 unsigned int cxx_info:1; /* 23 */
8150 unsigned int cxx_try_catch:1; /* 24 */
8151 unsigned int sched_entry_seq:1; /* 25 */
8152 unsigned int reserved2:1; /* 26 */
8153 unsigned int Save_SP:1; /* 27 */
8154 unsigned int Save_RP:1; /* 28 */
8155 unsigned int Save_MRP_in_frame:1; /* 29 */
8156 unsigned int extn_ptr_defined:1; /* 30 */
8157 unsigned int Cleanup_defined:1; /* 31 */
8158
8159 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
8160 unsigned int HP_UX_interrupt_marker:1; /* 1 */
8161 unsigned int Large_frame:1; /* 2 */
8162 unsigned int Pseudo_SP_Set:1; /* 3 */
8163 unsigned int reserved4:1; /* 4 */
8164 unsigned int Total_frame_size:27; /* 5..31 */
8165};
3f5e193b 8166
57346661 8167struct hppa_unw_aux_info
948f632f 8168{
32ec8896
NC
8169 struct hppa_unw_table_entry * table; /* Unwind table. */
8170 unsigned long table_len; /* Length of unwind table. */
8171 bfd_vma seg_base; /* Starting address of segment. */
8172 Elf_Internal_Sym * symtab; /* The symbol table. */
8173 unsigned long nsyms; /* Number of symbols. */
8174 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
8175 unsigned long nfuns; /* Number of entries in funtab. */
8176 char * strtab; /* The string table. */
8177 unsigned long strtab_size; /* Size of string table. */
948f632f 8178};
57346661 8179
32ec8896 8180static bfd_boolean
dda8d76d 8181dump_hppa_unwind (Filedata * filedata, struct hppa_unw_aux_info * aux)
57346661 8182{
2cf0635d 8183 struct hppa_unw_table_entry * tp;
948f632f 8184 unsigned long j, nfuns;
32ec8896 8185 bfd_boolean res = TRUE;
948f632f
DA
8186
8187 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
8188 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
8189 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
8190 aux->funtab[nfuns++] = aux->symtab[j];
8191 aux->nfuns = nfuns;
8192 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
57346661 8193
57346661
AM
8194 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
8195 {
8196 bfd_vma offset;
2cf0635d 8197 const char * procname;
57346661 8198
dda8d76d 8199 find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
57346661
AM
8200 aux->strtab_size, tp->start, &procname,
8201 &offset);
8202
8203 fputs ("\n<", stdout);
8204
8205 if (procname)
8206 {
8207 fputs (procname, stdout);
8208
8209 if (offset)
8210 printf ("+%lx", (unsigned long) offset);
8211 }
8212
8213 fputs (">: [", stdout);
8214 print_vma (tp->start.offset, PREFIX_HEX);
8215 fputc ('-', stdout);
8216 print_vma (tp->end.offset, PREFIX_HEX);
8217 printf ("]\n\t");
8218
18bd398b
NC
8219#define PF(_m) if (tp->_m) printf (#_m " ");
8220#define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
57346661
AM
8221 PF(Cannot_unwind);
8222 PF(Millicode);
8223 PF(Millicode_save_sr0);
18bd398b 8224 /* PV(Region_description); */
57346661
AM
8225 PF(Entry_SR);
8226 PV(Entry_FR);
8227 PV(Entry_GR);
8228 PF(Args_stored);
8229 PF(Variable_Frame);
8230 PF(Separate_Package_Body);
8231 PF(Frame_Extension_Millicode);
8232 PF(Stack_Overflow_Check);
8233 PF(Two_Instruction_SP_Increment);
8234 PF(Ada_Region);
8235 PF(cxx_info);
8236 PF(cxx_try_catch);
8237 PF(sched_entry_seq);
8238 PF(Save_SP);
8239 PF(Save_RP);
8240 PF(Save_MRP_in_frame);
8241 PF(extn_ptr_defined);
8242 PF(Cleanup_defined);
8243 PF(MPE_XL_interrupt_marker);
8244 PF(HP_UX_interrupt_marker);
8245 PF(Large_frame);
8246 PF(Pseudo_SP_Set);
8247 PV(Total_frame_size);
8248#undef PF
8249#undef PV
8250 }
8251
18bd398b 8252 printf ("\n");
948f632f
DA
8253
8254 free (aux->funtab);
32ec8896
NC
8255
8256 return res;
57346661
AM
8257}
8258
32ec8896 8259static bfd_boolean
dda8d76d
NC
8260slurp_hppa_unwind_table (Filedata * filedata,
8261 struct hppa_unw_aux_info * aux,
8262 Elf_Internal_Shdr * sec)
57346661 8263{
1c0751b2 8264 unsigned long size, unw_ent_size, nentries, nrelas, i;
2cf0635d
NC
8265 Elf_Internal_Phdr * seg;
8266 struct hppa_unw_table_entry * tep;
8267 Elf_Internal_Shdr * relsec;
8268 Elf_Internal_Rela * rela;
8269 Elf_Internal_Rela * rp;
8270 unsigned char * table;
8271 unsigned char * tp;
8272 Elf_Internal_Sym * sym;
8273 const char * relname;
57346661 8274
57346661
AM
8275 /* First, find the starting address of the segment that includes
8276 this section. */
dda8d76d 8277 if (filedata->file_header.e_phnum)
57346661 8278 {
dda8d76d 8279 if (! get_program_headers (filedata))
32ec8896 8280 return FALSE;
57346661 8281
dda8d76d
NC
8282 for (seg = filedata->program_headers;
8283 seg < filedata->program_headers + filedata->file_header.e_phnum;
57346661
AM
8284 ++seg)
8285 {
8286 if (seg->p_type != PT_LOAD)
8287 continue;
8288
8289 if (sec->sh_addr >= seg->p_vaddr
8290 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
8291 {
8292 aux->seg_base = seg->p_vaddr;
8293 break;
8294 }
8295 }
8296 }
8297
8298 /* Second, build the unwind table from the contents of the unwind
8299 section. */
8300 size = sec->sh_size;
dda8d76d 8301 table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
3f5e193b 8302 _("unwind table"));
57346661 8303 if (!table)
32ec8896 8304 return FALSE;
57346661 8305
1c0751b2
DA
8306 unw_ent_size = 16;
8307 nentries = size / unw_ent_size;
8308 size = unw_ent_size * nentries;
57346661 8309
e3fdc001 8310 aux->table_len = nentries;
3f5e193b
NC
8311 tep = aux->table = (struct hppa_unw_table_entry *)
8312 xcmalloc (nentries, sizeof (aux->table[0]));
57346661 8313
1c0751b2 8314 for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
57346661
AM
8315 {
8316 unsigned int tmp1, tmp2;
8317
8318 tep->start.section = SHN_UNDEF;
8319 tep->end.section = SHN_UNDEF;
8320
1c0751b2
DA
8321 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
8322 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
8323 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
8324 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
8325
8326 tep->start.offset += aux->seg_base;
8327 tep->end.offset += aux->seg_base;
57346661
AM
8328
8329 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
8330 tep->Millicode = (tmp1 >> 30) & 0x1;
8331 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
8332 tep->Region_description = (tmp1 >> 27) & 0x3;
8333 tep->reserved1 = (tmp1 >> 26) & 0x1;
8334 tep->Entry_SR = (tmp1 >> 25) & 0x1;
8335 tep->Entry_FR = (tmp1 >> 21) & 0xf;
8336 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
8337 tep->Args_stored = (tmp1 >> 15) & 0x1;
8338 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
8339 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
8340 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
8341 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
8342 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
8343 tep->Ada_Region = (tmp1 >> 9) & 0x1;
8344 tep->cxx_info = (tmp1 >> 8) & 0x1;
8345 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
8346 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
8347 tep->reserved2 = (tmp1 >> 5) & 0x1;
8348 tep->Save_SP = (tmp1 >> 4) & 0x1;
8349 tep->Save_RP = (tmp1 >> 3) & 0x1;
8350 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
8351 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
8352 tep->Cleanup_defined = tmp1 & 0x1;
8353
8354 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
8355 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
8356 tep->Large_frame = (tmp2 >> 29) & 0x1;
8357 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
8358 tep->reserved4 = (tmp2 >> 27) & 0x1;
8359 tep->Total_frame_size = tmp2 & 0x7ffffff;
57346661
AM
8360 }
8361 free (table);
8362
8363 /* Third, apply any relocations to the unwind table. */
dda8d76d
NC
8364 for (relsec = filedata->section_headers;
8365 relsec < filedata->section_headers + filedata->file_header.e_shnum;
57346661
AM
8366 ++relsec)
8367 {
8368 if (relsec->sh_type != SHT_RELA
dda8d76d
NC
8369 || relsec->sh_info >= filedata->file_header.e_shnum
8370 || filedata->section_headers + relsec->sh_info != sec)
57346661
AM
8371 continue;
8372
dda8d76d 8373 if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
57346661 8374 & rela, & nrelas))
32ec8896 8375 return FALSE;
57346661
AM
8376
8377 for (rp = rela; rp < rela + nrelas; ++rp)
8378 {
4770fb94 8379 unsigned int sym_ndx;
726bd37d
AM
8380 unsigned int r_type = get_reloc_type (filedata, rp->r_info);
8381 relname = elf_hppa_reloc_type (r_type);
57346661 8382
726bd37d
AM
8383 if (relname == NULL)
8384 {
8385 warn (_("Skipping unknown relocation type: %u\n"), r_type);
8386 continue;
8387 }
8388
57346661 8389 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
0112cd26 8390 if (! const_strneq (relname, "R_PARISC_SEGREL"))
57346661 8391 {
726bd37d 8392 warn (_("Skipping unexpected relocation type: %s\n"), relname);
57346661
AM
8393 continue;
8394 }
8395
8396 i = rp->r_offset / unw_ent_size;
726bd37d
AM
8397 if (i >= aux->table_len)
8398 {
8399 warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
8400 continue;
8401 }
57346661 8402
4770fb94
AM
8403 sym_ndx = get_reloc_symindex (rp->r_info);
8404 if (sym_ndx >= aux->nsyms)
8405 {
8406 warn (_("Skipping reloc with invalid symbol index: %u\n"),
8407 sym_ndx);
8408 continue;
8409 }
8410 sym = aux->symtab + sym_ndx;
8411
43f6cd05 8412 switch ((rp->r_offset % unw_ent_size) / 4)
57346661
AM
8413 {
8414 case 0:
8415 aux->table[i].start.section = sym->st_shndx;
1e456d54 8416 aux->table[i].start.offset = sym->st_value + rp->r_addend;
57346661
AM
8417 break;
8418 case 1:
8419 aux->table[i].end.section = sym->st_shndx;
1e456d54 8420 aux->table[i].end.offset = sym->st_value + rp->r_addend;
57346661
AM
8421 break;
8422 default:
8423 break;
8424 }
8425 }
8426
8427 free (rela);
8428 }
8429
32ec8896 8430 return TRUE;
57346661
AM
8431}
8432
32ec8896 8433static bfd_boolean
dda8d76d 8434hppa_process_unwind (Filedata * filedata)
57346661 8435{
57346661 8436 struct hppa_unw_aux_info aux;
2cf0635d 8437 Elf_Internal_Shdr * unwsec = NULL;
2cf0635d 8438 Elf_Internal_Shdr * sec;
18bd398b 8439 unsigned long i;
32ec8896 8440 bfd_boolean res = TRUE;
57346661 8441
dda8d76d 8442 if (filedata->string_table == NULL)
32ec8896 8443 return FALSE;
1b31d05e
NC
8444
8445 memset (& aux, 0, sizeof (aux));
57346661 8446
dda8d76d 8447 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
57346661 8448 {
28d13567 8449 if (sec->sh_type == SHT_SYMTAB)
57346661 8450 {
28d13567 8451 if (aux.symtab)
4082ef84 8452 {
28d13567
AM
8453 error (_("Multiple symbol tables encountered\n"));
8454 free (aux.symtab);
8455 aux.symtab = NULL;
4082ef84 8456 free (aux.strtab);
28d13567 8457 aux.strtab = NULL;
4082ef84 8458 }
28d13567
AM
8459 if (!get_symtab (filedata, sec, &aux.symtab, &aux.nsyms,
8460 &aux.strtab, &aux.strtab_size))
8461 return FALSE;
57346661 8462 }
18bd398b 8463 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
57346661
AM
8464 unwsec = sec;
8465 }
8466
8467 if (!unwsec)
8468 printf (_("\nThere are no unwind sections in this file.\n"));
8469
dda8d76d 8470 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
57346661 8471 {
18bd398b 8472 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
57346661 8473 {
43f6cd05 8474 unsigned long num_unwind = sec->sh_size / 16;
dda8d76d 8475
d3a49aa8
AM
8476 printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
8477 "contains %lu entry:\n",
8478 "\nUnwind section '%s' at offset 0x%lx "
8479 "contains %lu entries:\n",
8480 num_unwind),
dda8d76d 8481 printable_section_name (filedata, sec),
57346661 8482 (unsigned long) sec->sh_offset,
d3a49aa8 8483 num_unwind);
57346661 8484
dda8d76d 8485 if (! slurp_hppa_unwind_table (filedata, &aux, sec))
32ec8896 8486 res = FALSE;
66b09c7e
S
8487
8488 if (res && aux.table_len > 0)
32ec8896 8489 {
dda8d76d 8490 if (! dump_hppa_unwind (filedata, &aux))
32ec8896
NC
8491 res = FALSE;
8492 }
57346661 8493
9db70fc3 8494 free ((char *) aux.table);
57346661
AM
8495 aux.table = NULL;
8496 }
8497 }
8498
9db70fc3
AM
8499 free (aux.symtab);
8500 free ((char *) aux.strtab);
32ec8896
NC
8501
8502 return res;
57346661
AM
8503}
8504
0b6ae522
DJ
8505struct arm_section
8506{
a734115a
NC
8507 unsigned char * data; /* The unwind data. */
8508 Elf_Internal_Shdr * sec; /* The cached unwind section header. */
8509 Elf_Internal_Rela * rela; /* The cached relocations for this section. */
8510 unsigned long nrelas; /* The number of relocations. */
8511 unsigned int rel_type; /* REL or RELA ? */
8512 Elf_Internal_Rela * next_rela; /* Cyclic pointer to the next reloc to process. */
0b6ae522
DJ
8513};
8514
8515struct arm_unw_aux_info
8516{
dda8d76d 8517 Filedata * filedata; /* The file containing the unwind sections. */
a734115a
NC
8518 Elf_Internal_Sym * symtab; /* The file's symbol table. */
8519 unsigned long nsyms; /* Number of symbols. */
948f632f
DA
8520 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
8521 unsigned long nfuns; /* Number of these symbols. */
a734115a
NC
8522 char * strtab; /* The file's string table. */
8523 unsigned long strtab_size; /* Size of string table. */
0b6ae522
DJ
8524};
8525
8526static const char *
dda8d76d
NC
8527arm_print_vma_and_name (Filedata * filedata,
8528 struct arm_unw_aux_info * aux,
8529 bfd_vma fn,
8530 struct absaddr addr)
0b6ae522
DJ
8531{
8532 const char *procname;
8533 bfd_vma sym_offset;
8534
8535 if (addr.section == SHN_UNDEF)
8536 addr.offset = fn;
8537
dda8d76d 8538 find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
0b6ae522
DJ
8539 aux->strtab_size, addr, &procname,
8540 &sym_offset);
8541
8542 print_vma (fn, PREFIX_HEX);
8543
8544 if (procname)
8545 {
8546 fputs (" <", stdout);
8547 fputs (procname, stdout);
8548
8549 if (sym_offset)
8550 printf ("+0x%lx", (unsigned long) sym_offset);
8551 fputc ('>', stdout);
8552 }
8553
8554 return procname;
8555}
8556
8557static void
8558arm_free_section (struct arm_section *arm_sec)
8559{
9db70fc3
AM
8560 free (arm_sec->data);
8561 free (arm_sec->rela);
0b6ae522
DJ
8562}
8563
a734115a
NC
8564/* 1) If SEC does not match the one cached in ARM_SEC, then free the current
8565 cached section and install SEC instead.
8566 2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
8567 and return its valued in * WORDP, relocating if necessary.
1b31d05e 8568 3) Update the NEXT_RELA field in ARM_SEC and store the section index and
a734115a 8569 relocation's offset in ADDR.
1b31d05e
NC
8570 4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
8571 into the string table of the symbol associated with the reloc. If no
8572 reloc was applied store -1 there.
8573 5) Return TRUE upon success, FALSE otherwise. */
a734115a
NC
8574
8575static bfd_boolean
dda8d76d
NC
8576get_unwind_section_word (Filedata * filedata,
8577 struct arm_unw_aux_info * aux,
1b31d05e
NC
8578 struct arm_section * arm_sec,
8579 Elf_Internal_Shdr * sec,
8580 bfd_vma word_offset,
8581 unsigned int * wordp,
8582 struct absaddr * addr,
8583 bfd_vma * sym_name)
0b6ae522
DJ
8584{
8585 Elf_Internal_Rela *rp;
8586 Elf_Internal_Sym *sym;
8587 const char * relname;
8588 unsigned int word;
8589 bfd_boolean wrapped;
8590
e0a31db1
NC
8591 if (sec == NULL || arm_sec == NULL)
8592 return FALSE;
8593
0b6ae522
DJ
8594 addr->section = SHN_UNDEF;
8595 addr->offset = 0;
8596
1b31d05e
NC
8597 if (sym_name != NULL)
8598 *sym_name = (bfd_vma) -1;
8599
a734115a 8600 /* If necessary, update the section cache. */
0b6ae522
DJ
8601 if (sec != arm_sec->sec)
8602 {
8603 Elf_Internal_Shdr *relsec;
8604
8605 arm_free_section (arm_sec);
8606
8607 arm_sec->sec = sec;
dda8d76d 8608 arm_sec->data = get_data (NULL, aux->filedata, sec->sh_offset, 1,
0b6ae522 8609 sec->sh_size, _("unwind data"));
0b6ae522
DJ
8610 arm_sec->rela = NULL;
8611 arm_sec->nrelas = 0;
8612
dda8d76d
NC
8613 for (relsec = filedata->section_headers;
8614 relsec < filedata->section_headers + filedata->file_header.e_shnum;
0b6ae522
DJ
8615 ++relsec)
8616 {
dda8d76d
NC
8617 if (relsec->sh_info >= filedata->file_header.e_shnum
8618 || filedata->section_headers + relsec->sh_info != sec
1ae40aa4
NC
8619 /* PR 15745: Check the section type as well. */
8620 || (relsec->sh_type != SHT_REL
8621 && relsec->sh_type != SHT_RELA))
0b6ae522
DJ
8622 continue;
8623
a734115a 8624 arm_sec->rel_type = relsec->sh_type;
0b6ae522
DJ
8625 if (relsec->sh_type == SHT_REL)
8626 {
dda8d76d 8627 if (!slurp_rel_relocs (aux->filedata, relsec->sh_offset,
0b6ae522
DJ
8628 relsec->sh_size,
8629 & arm_sec->rela, & arm_sec->nrelas))
a734115a 8630 return FALSE;
0b6ae522 8631 }
1ae40aa4 8632 else /* relsec->sh_type == SHT_RELA */
0b6ae522 8633 {
dda8d76d 8634 if (!slurp_rela_relocs (aux->filedata, relsec->sh_offset,
0b6ae522
DJ
8635 relsec->sh_size,
8636 & arm_sec->rela, & arm_sec->nrelas))
a734115a 8637 return FALSE;
0b6ae522 8638 }
1ae40aa4 8639 break;
0b6ae522
DJ
8640 }
8641
8642 arm_sec->next_rela = arm_sec->rela;
8643 }
8644
a734115a 8645 /* If there is no unwind data we can do nothing. */
0b6ae522 8646 if (arm_sec->data == NULL)
a734115a 8647 return FALSE;
0b6ae522 8648
e0a31db1 8649 /* If the offset is invalid then fail. */
f32ba729
NC
8650 if (/* PR 21343 *//* PR 18879 */
8651 sec->sh_size < 4
8652 || word_offset > (sec->sh_size - 4)
1a915552 8653 || ((bfd_signed_vma) word_offset) < 0)
e0a31db1
NC
8654 return FALSE;
8655
a734115a 8656 /* Get the word at the required offset. */
0b6ae522
DJ
8657 word = byte_get (arm_sec->data + word_offset, 4);
8658
0eff7165
NC
8659 /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128. */
8660 if (arm_sec->rela == NULL)
8661 {
8662 * wordp = word;
8663 return TRUE;
8664 }
8665
a734115a 8666 /* Look through the relocs to find the one that applies to the provided offset. */
0b6ae522
DJ
8667 wrapped = FALSE;
8668 for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
8669 {
8670 bfd_vma prelval, offset;
8671
8672 if (rp->r_offset > word_offset && !wrapped)
8673 {
8674 rp = arm_sec->rela;
8675 wrapped = TRUE;
8676 }
8677 if (rp->r_offset > word_offset)
8678 break;
8679
8680 if (rp->r_offset & 3)
8681 {
8682 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
8683 (unsigned long) rp->r_offset);
8684 continue;
8685 }
8686
8687 if (rp->r_offset < word_offset)
8688 continue;
8689
74e1a04b
NC
8690 /* PR 17531: file: 027-161405-0.004 */
8691 if (aux->symtab == NULL)
8692 continue;
8693
0b6ae522
DJ
8694 if (arm_sec->rel_type == SHT_REL)
8695 {
8696 offset = word & 0x7fffffff;
8697 if (offset & 0x40000000)
8698 offset |= ~ (bfd_vma) 0x7fffffff;
8699 }
a734115a 8700 else if (arm_sec->rel_type == SHT_RELA)
0b6ae522 8701 offset = rp->r_addend;
a734115a 8702 else
74e1a04b
NC
8703 {
8704 error (_("Unknown section relocation type %d encountered\n"),
8705 arm_sec->rel_type);
8706 break;
8707 }
0b6ae522 8708
071436c6
NC
8709 /* PR 17531 file: 027-1241568-0.004. */
8710 if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
8711 {
8712 error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
8713 (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
8714 break;
8715 }
8716
8717 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
0b6ae522
DJ
8718 offset += sym->st_value;
8719 prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
8720
a734115a 8721 /* Check that we are processing the expected reloc type. */
dda8d76d 8722 if (filedata->file_header.e_machine == EM_ARM)
a734115a
NC
8723 {
8724 relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
071436c6
NC
8725 if (relname == NULL)
8726 {
8727 warn (_("Skipping unknown ARM relocation type: %d\n"),
8728 (int) ELF32_R_TYPE (rp->r_info));
8729 continue;
8730 }
a734115a
NC
8731
8732 if (streq (relname, "R_ARM_NONE"))
8733 continue;
0b4362b0 8734
a734115a
NC
8735 if (! streq (relname, "R_ARM_PREL31"))
8736 {
071436c6 8737 warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
a734115a
NC
8738 continue;
8739 }
8740 }
dda8d76d 8741 else if (filedata->file_header.e_machine == EM_TI_C6000)
a734115a
NC
8742 {
8743 relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
071436c6
NC
8744 if (relname == NULL)
8745 {
8746 warn (_("Skipping unknown C6000 relocation type: %d\n"),
8747 (int) ELF32_R_TYPE (rp->r_info));
8748 continue;
8749 }
0b4362b0 8750
a734115a
NC
8751 if (streq (relname, "R_C6000_NONE"))
8752 continue;
8753
8754 if (! streq (relname, "R_C6000_PREL31"))
8755 {
071436c6 8756 warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
a734115a
NC
8757 continue;
8758 }
8759
8760 prelval >>= 1;
8761 }
8762 else
74e1a04b
NC
8763 {
8764 /* This function currently only supports ARM and TI unwinders. */
8765 warn (_("Only TI and ARM unwinders are currently supported\n"));
8766 break;
8767 }
fa197c1c 8768
0b6ae522
DJ
8769 word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
8770 addr->section = sym->st_shndx;
8771 addr->offset = offset;
74e1a04b 8772
1b31d05e
NC
8773 if (sym_name)
8774 * sym_name = sym->st_name;
0b6ae522
DJ
8775 break;
8776 }
8777
8778 *wordp = word;
8779 arm_sec->next_rela = rp;
8780
a734115a 8781 return TRUE;
0b6ae522
DJ
8782}
8783
a734115a
NC
8784static const char *tic6x_unwind_regnames[16] =
8785{
0b4362b0
RM
8786 "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
8787 "A14", "A13", "A12", "A11", "A10",
a734115a
NC
8788 "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
8789};
fa197c1c 8790
0b6ae522 8791static void
fa197c1c 8792decode_tic6x_unwind_regmask (unsigned int mask)
0b6ae522 8793{
fa197c1c
PB
8794 int i;
8795
8796 for (i = 12; mask; mask >>= 1, i--)
8797 {
8798 if (mask & 1)
8799 {
8800 fputs (tic6x_unwind_regnames[i], stdout);
8801 if (mask > 1)
8802 fputs (", ", stdout);
8803 }
8804 }
8805}
0b6ae522
DJ
8806
8807#define ADVANCE \
8808 if (remaining == 0 && more_words) \
8809 { \
8810 data_offset += 4; \
dda8d76d 8811 if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec, \
1b31d05e 8812 data_offset, & word, & addr, NULL)) \
32ec8896 8813 return FALSE; \
0b6ae522
DJ
8814 remaining = 4; \
8815 more_words--; \
8816 } \
8817
8818#define GET_OP(OP) \
8819 ADVANCE; \
8820 if (remaining) \
8821 { \
8822 remaining--; \
8823 (OP) = word >> 24; \
8824 word <<= 8; \
8825 } \
8826 else \
8827 { \
2b692964 8828 printf (_("[Truncated opcode]\n")); \
32ec8896 8829 return FALSE; \
0b6ae522 8830 } \
cc5914eb 8831 printf ("0x%02x ", OP)
0b6ae522 8832
32ec8896 8833static bfd_boolean
dda8d76d
NC
8834decode_arm_unwind_bytecode (Filedata * filedata,
8835 struct arm_unw_aux_info * aux,
948f632f
DA
8836 unsigned int word,
8837 unsigned int remaining,
8838 unsigned int more_words,
8839 bfd_vma data_offset,
8840 Elf_Internal_Shdr * data_sec,
8841 struct arm_section * data_arm_sec)
fa197c1c
PB
8842{
8843 struct absaddr addr;
32ec8896 8844 bfd_boolean res = TRUE;
0b6ae522
DJ
8845
8846 /* Decode the unwinding instructions. */
8847 while (1)
8848 {
8849 unsigned int op, op2;
8850
8851 ADVANCE;
8852 if (remaining == 0)
8853 break;
8854 remaining--;
8855 op = word >> 24;
8856 word <<= 8;
8857
cc5914eb 8858 printf (" 0x%02x ", op);
0b6ae522
DJ
8859
8860 if ((op & 0xc0) == 0x00)
8861 {
8862 int offset = ((op & 0x3f) << 2) + 4;
61865e30 8863
cc5914eb 8864 printf (" vsp = vsp + %d", offset);
0b6ae522
DJ
8865 }
8866 else if ((op & 0xc0) == 0x40)
8867 {
8868 int offset = ((op & 0x3f) << 2) + 4;
61865e30 8869
cc5914eb 8870 printf (" vsp = vsp - %d", offset);
0b6ae522
DJ
8871 }
8872 else if ((op & 0xf0) == 0x80)
8873 {
8874 GET_OP (op2);
8875 if (op == 0x80 && op2 == 0)
8876 printf (_("Refuse to unwind"));
8877 else
8878 {
8879 unsigned int mask = ((op & 0x0f) << 8) | op2;
32ec8896 8880 bfd_boolean first = TRUE;
0b6ae522 8881 int i;
2b692964 8882
0b6ae522
DJ
8883 printf ("pop {");
8884 for (i = 0; i < 12; i++)
8885 if (mask & (1 << i))
8886 {
8887 if (first)
32ec8896 8888 first = FALSE;
0b6ae522
DJ
8889 else
8890 printf (", ");
8891 printf ("r%d", 4 + i);
8892 }
8893 printf ("}");
8894 }
8895 }
8896 else if ((op & 0xf0) == 0x90)
8897 {
8898 if (op == 0x9d || op == 0x9f)
8899 printf (_(" [Reserved]"));
8900 else
cc5914eb 8901 printf (" vsp = r%d", op & 0x0f);
0b6ae522
DJ
8902 }
8903 else if ((op & 0xf0) == 0xa0)
8904 {
8905 int end = 4 + (op & 0x07);
32ec8896 8906 bfd_boolean first = TRUE;
0b6ae522 8907 int i;
61865e30 8908
0b6ae522
DJ
8909 printf (" pop {");
8910 for (i = 4; i <= end; i++)
8911 {
8912 if (first)
32ec8896 8913 first = FALSE;
0b6ae522
DJ
8914 else
8915 printf (", ");
8916 printf ("r%d", i);
8917 }
8918 if (op & 0x08)
8919 {
1b31d05e 8920 if (!first)
0b6ae522
DJ
8921 printf (", ");
8922 printf ("r14");
8923 }
8924 printf ("}");
8925 }
8926 else if (op == 0xb0)
8927 printf (_(" finish"));
8928 else if (op == 0xb1)
8929 {
8930 GET_OP (op2);
8931 if (op2 == 0 || (op2 & 0xf0) != 0)
8932 printf (_("[Spare]"));
8933 else
8934 {
8935 unsigned int mask = op2 & 0x0f;
32ec8896 8936 bfd_boolean first = TRUE;
0b6ae522 8937 int i;
61865e30 8938
0b6ae522
DJ
8939 printf ("pop {");
8940 for (i = 0; i < 12; i++)
8941 if (mask & (1 << i))
8942 {
8943 if (first)
32ec8896 8944 first = FALSE;
0b6ae522
DJ
8945 else
8946 printf (", ");
8947 printf ("r%d", i);
8948 }
8949 printf ("}");
8950 }
8951 }
8952 else if (op == 0xb2)
8953 {
b115cf96 8954 unsigned char buf[9];
0b6ae522
DJ
8955 unsigned int i, len;
8956 unsigned long offset;
61865e30 8957
b115cf96 8958 for (i = 0; i < sizeof (buf); i++)
0b6ae522
DJ
8959 {
8960 GET_OP (buf[i]);
8961 if ((buf[i] & 0x80) == 0)
8962 break;
8963 }
4082ef84 8964 if (i == sizeof (buf))
32ec8896 8965 {
27a45f42 8966 error (_("corrupt change to vsp\n"));
32ec8896
NC
8967 res = FALSE;
8968 }
4082ef84
NC
8969 else
8970 {
cd30bcef 8971 offset = read_leb128 (buf, buf + i + 1, FALSE, &len, NULL);
4082ef84
NC
8972 assert (len == i + 1);
8973 offset = offset * 4 + 0x204;
8974 printf ("vsp = vsp + %ld", offset);
8975 }
0b6ae522 8976 }
61865e30 8977 else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
0b6ae522 8978 {
61865e30
NC
8979 unsigned int first, last;
8980
8981 GET_OP (op2);
8982 first = op2 >> 4;
8983 last = op2 & 0x0f;
8984 if (op == 0xc8)
8985 first = first + 16;
8986 printf ("pop {D%d", first);
8987 if (last)
8988 printf ("-D%d", first + last);
8989 printf ("}");
8990 }
8991 else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
8992 {
8993 unsigned int count = op & 0x07;
8994
8995 printf ("pop {D8");
8996 if (count)
8997 printf ("-D%d", 8 + count);
8998 printf ("}");
8999 }
9000 else if (op >= 0xc0 && op <= 0xc5)
9001 {
9002 unsigned int count = op & 0x07;
9003
9004 printf (" pop {wR10");
9005 if (count)
9006 printf ("-wR%d", 10 + count);
9007 printf ("}");
9008 }
9009 else if (op == 0xc6)
9010 {
9011 unsigned int first, last;
9012
9013 GET_OP (op2);
9014 first = op2 >> 4;
9015 last = op2 & 0x0f;
9016 printf ("pop {wR%d", first);
9017 if (last)
9018 printf ("-wR%d", first + last);
9019 printf ("}");
9020 }
9021 else if (op == 0xc7)
9022 {
9023 GET_OP (op2);
9024 if (op2 == 0 || (op2 & 0xf0) != 0)
9025 printf (_("[Spare]"));
0b6ae522
DJ
9026 else
9027 {
61865e30 9028 unsigned int mask = op2 & 0x0f;
32ec8896 9029 bfd_boolean first = TRUE;
61865e30
NC
9030 int i;
9031
9032 printf ("pop {");
9033 for (i = 0; i < 4; i++)
9034 if (mask & (1 << i))
9035 {
9036 if (first)
32ec8896 9037 first = FALSE;
61865e30
NC
9038 else
9039 printf (", ");
9040 printf ("wCGR%d", i);
9041 }
9042 printf ("}");
0b6ae522
DJ
9043 }
9044 }
61865e30 9045 else
32ec8896
NC
9046 {
9047 printf (_(" [unsupported opcode]"));
9048 res = FALSE;
9049 }
9050
0b6ae522
DJ
9051 printf ("\n");
9052 }
32ec8896
NC
9053
9054 return res;
fa197c1c
PB
9055}
9056
32ec8896 9057static bfd_boolean
dda8d76d
NC
9058decode_tic6x_unwind_bytecode (Filedata * filedata,
9059 struct arm_unw_aux_info * aux,
948f632f
DA
9060 unsigned int word,
9061 unsigned int remaining,
9062 unsigned int more_words,
9063 bfd_vma data_offset,
9064 Elf_Internal_Shdr * data_sec,
9065 struct arm_section * data_arm_sec)
fa197c1c
PB
9066{
9067 struct absaddr addr;
9068
9069 /* Decode the unwinding instructions. */
9070 while (1)
9071 {
9072 unsigned int op, op2;
9073
9074 ADVANCE;
9075 if (remaining == 0)
9076 break;
9077 remaining--;
9078 op = word >> 24;
9079 word <<= 8;
9080
9cf03b7e 9081 printf (" 0x%02x ", op);
fa197c1c
PB
9082
9083 if ((op & 0xc0) == 0x00)
9084 {
9085 int offset = ((op & 0x3f) << 3) + 8;
9cf03b7e 9086 printf (" sp = sp + %d", offset);
fa197c1c
PB
9087 }
9088 else if ((op & 0xc0) == 0x80)
9089 {
9090 GET_OP (op2);
9091 if (op == 0x80 && op2 == 0)
9092 printf (_("Refuse to unwind"));
9093 else
9094 {
9095 unsigned int mask = ((op & 0x1f) << 8) | op2;
9096 if (op & 0x20)
9097 printf ("pop compact {");
9098 else
9099 printf ("pop {");
9100
9101 decode_tic6x_unwind_regmask (mask);
9102 printf("}");
9103 }
9104 }
9105 else if ((op & 0xf0) == 0xc0)
9106 {
9107 unsigned int reg;
9108 unsigned int nregs;
9109 unsigned int i;
9110 const char *name;
a734115a
NC
9111 struct
9112 {
32ec8896
NC
9113 unsigned int offset;
9114 unsigned int reg;
fa197c1c
PB
9115 } regpos[16];
9116
9117 /* Scan entire instruction first so that GET_OP output is not
9118 interleaved with disassembly. */
9119 nregs = 0;
9120 for (i = 0; nregs < (op & 0xf); i++)
9121 {
9122 GET_OP (op2);
9123 reg = op2 >> 4;
9124 if (reg != 0xf)
9125 {
9126 regpos[nregs].offset = i * 2;
9127 regpos[nregs].reg = reg;
9128 nregs++;
9129 }
9130
9131 reg = op2 & 0xf;
9132 if (reg != 0xf)
9133 {
9134 regpos[nregs].offset = i * 2 + 1;
9135 regpos[nregs].reg = reg;
9136 nregs++;
9137 }
9138 }
9139
9140 printf (_("pop frame {"));
18344509 9141 if (nregs == 0)
fa197c1c 9142 {
18344509
NC
9143 printf (_("*corrupt* - no registers specified"));
9144 }
9145 else
9146 {
9147 reg = nregs - 1;
9148 for (i = i * 2; i > 0; i--)
fa197c1c 9149 {
18344509
NC
9150 if (regpos[reg].offset == i - 1)
9151 {
9152 name = tic6x_unwind_regnames[regpos[reg].reg];
9153 if (reg > 0)
9154 reg--;
9155 }
9156 else
9157 name = _("[pad]");
fa197c1c 9158
18344509
NC
9159 fputs (name, stdout);
9160 if (i > 1)
9161 printf (", ");
9162 }
fa197c1c
PB
9163 }
9164
9165 printf ("}");
9166 }
9167 else if (op == 0xd0)
9168 printf (" MOV FP, SP");
9169 else if (op == 0xd1)
9170 printf (" __c6xabi_pop_rts");
9171 else if (op == 0xd2)
9172 {
9173 unsigned char buf[9];
9174 unsigned int i, len;
9175 unsigned long offset;
a734115a 9176
fa197c1c
PB
9177 for (i = 0; i < sizeof (buf); i++)
9178 {
9179 GET_OP (buf[i]);
9180 if ((buf[i] & 0x80) == 0)
9181 break;
9182 }
0eff7165
NC
9183 /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2. */
9184 if (i == sizeof (buf))
9185 {
0eff7165 9186 warn (_("Corrupt stack pointer adjustment detected\n"));
32ec8896 9187 return FALSE;
0eff7165 9188 }
948f632f 9189
cd30bcef 9190 offset = read_leb128 (buf, buf + i + 1, FALSE, &len, NULL);
fa197c1c
PB
9191 assert (len == i + 1);
9192 offset = offset * 8 + 0x408;
9193 printf (_("sp = sp + %ld"), offset);
9194 }
9195 else if ((op & 0xf0) == 0xe0)
9196 {
9197 if ((op & 0x0f) == 7)
9198 printf (" RETURN");
9199 else
9200 printf (" MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
9201 }
9202 else
9203 {
9204 printf (_(" [unsupported opcode]"));
9205 }
9206 putchar ('\n');
9207 }
32ec8896
NC
9208
9209 return TRUE;
fa197c1c
PB
9210}
9211
9212static bfd_vma
dda8d76d 9213arm_expand_prel31 (Filedata * filedata, bfd_vma word, bfd_vma where)
fa197c1c
PB
9214{
9215 bfd_vma offset;
9216
9217 offset = word & 0x7fffffff;
9218 if (offset & 0x40000000)
9219 offset |= ~ (bfd_vma) 0x7fffffff;
9220
dda8d76d 9221 if (filedata->file_header.e_machine == EM_TI_C6000)
fa197c1c
PB
9222 offset <<= 1;
9223
9224 return offset + where;
9225}
9226
32ec8896 9227static bfd_boolean
dda8d76d
NC
9228decode_arm_unwind (Filedata * filedata,
9229 struct arm_unw_aux_info * aux,
1b31d05e
NC
9230 unsigned int word,
9231 unsigned int remaining,
9232 bfd_vma data_offset,
9233 Elf_Internal_Shdr * data_sec,
9234 struct arm_section * data_arm_sec)
fa197c1c
PB
9235{
9236 int per_index;
9237 unsigned int more_words = 0;
37e14bc3 9238 struct absaddr addr;
1b31d05e 9239 bfd_vma sym_name = (bfd_vma) -1;
97953bab 9240 bfd_boolean res = TRUE;
fa197c1c
PB
9241
9242 if (remaining == 0)
9243 {
1b31d05e
NC
9244 /* Fetch the first word.
9245 Note - when decoding an object file the address extracted
9246 here will always be 0. So we also pass in the sym_name
9247 parameter so that we can find the symbol associated with
9248 the personality routine. */
dda8d76d 9249 if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec, data_offset,
1b31d05e 9250 & word, & addr, & sym_name))
32ec8896 9251 return FALSE;
1b31d05e 9252
fa197c1c
PB
9253 remaining = 4;
9254 }
c93dbb25
CZ
9255 else
9256 {
9257 addr.section = SHN_UNDEF;
9258 addr.offset = 0;
9259 }
fa197c1c
PB
9260
9261 if ((word & 0x80000000) == 0)
9262 {
9263 /* Expand prel31 for personality routine. */
9264 bfd_vma fn;
9265 const char *procname;
9266
dda8d76d 9267 fn = arm_expand_prel31 (filedata, word, data_sec->sh_addr + data_offset);
fa197c1c 9268 printf (_(" Personality routine: "));
1b31d05e
NC
9269 if (fn == 0
9270 && addr.section == SHN_UNDEF && addr.offset == 0
9271 && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
9272 {
9273 procname = aux->strtab + sym_name;
9274 print_vma (fn, PREFIX_HEX);
9275 if (procname)
9276 {
9277 fputs (" <", stdout);
9278 fputs (procname, stdout);
9279 fputc ('>', stdout);
9280 }
9281 }
9282 else
dda8d76d 9283 procname = arm_print_vma_and_name (filedata, aux, fn, addr);
fa197c1c
PB
9284 fputc ('\n', stdout);
9285
9286 /* The GCC personality routines use the standard compact
9287 encoding, starting with one byte giving the number of
9288 words. */
9289 if (procname != NULL
9290 && (const_strneq (procname, "__gcc_personality_v0")
9291 || const_strneq (procname, "__gxx_personality_v0")
9292 || const_strneq (procname, "__gcj_personality_v0")
9293 || const_strneq (procname, "__gnu_objc_personality_v0")))
9294 {
9295 remaining = 0;
9296 more_words = 1;
9297 ADVANCE;
9298 if (!remaining)
9299 {
9300 printf (_(" [Truncated data]\n"));
32ec8896 9301 return FALSE;
fa197c1c
PB
9302 }
9303 more_words = word >> 24;
9304 word <<= 8;
9305 remaining--;
9306 per_index = -1;
9307 }
9308 else
32ec8896 9309 return TRUE;
fa197c1c
PB
9310 }
9311 else
9312 {
1b31d05e 9313 /* ARM EHABI Section 6.3:
0b4362b0 9314
1b31d05e 9315 An exception-handling table entry for the compact model looks like:
0b4362b0 9316
1b31d05e
NC
9317 31 30-28 27-24 23-0
9318 -- ----- ----- ----
9319 1 0 index Data for personalityRoutine[index] */
9320
dda8d76d 9321 if (filedata->file_header.e_machine == EM_ARM
1b31d05e 9322 && (word & 0x70000000))
32ec8896
NC
9323 {
9324 warn (_("Corrupt ARM compact model table entry: %x \n"), word);
9325 res = FALSE;
9326 }
1b31d05e 9327
fa197c1c 9328 per_index = (word >> 24) & 0x7f;
1b31d05e 9329 printf (_(" Compact model index: %d\n"), per_index);
fa197c1c
PB
9330 if (per_index == 0)
9331 {
9332 more_words = 0;
9333 word <<= 8;
9334 remaining--;
9335 }
9336 else if (per_index < 3)
9337 {
9338 more_words = (word >> 16) & 0xff;
9339 word <<= 16;
9340 remaining -= 2;
9341 }
9342 }
9343
dda8d76d 9344 switch (filedata->file_header.e_machine)
fa197c1c
PB
9345 {
9346 case EM_ARM:
9347 if (per_index < 3)
9348 {
dda8d76d 9349 if (! decode_arm_unwind_bytecode (filedata, aux, word, remaining, more_words,
32ec8896
NC
9350 data_offset, data_sec, data_arm_sec))
9351 res = FALSE;
fa197c1c
PB
9352 }
9353 else
1b31d05e
NC
9354 {
9355 warn (_("Unknown ARM compact model index encountered\n"));
9356 printf (_(" [reserved]\n"));
32ec8896 9357 res = FALSE;
1b31d05e 9358 }
fa197c1c
PB
9359 break;
9360
9361 case EM_TI_C6000:
9362 if (per_index < 3)
9363 {
dda8d76d 9364 if (! decode_tic6x_unwind_bytecode (filedata, aux, word, remaining, more_words,
32ec8896
NC
9365 data_offset, data_sec, data_arm_sec))
9366 res = FALSE;
fa197c1c
PB
9367 }
9368 else if (per_index < 5)
9369 {
9370 if (((word >> 17) & 0x7f) == 0x7f)
9371 printf (_(" Restore stack from frame pointer\n"));
9372 else
9373 printf (_(" Stack increment %d\n"), (word >> 14) & 0x1fc);
9374 printf (_(" Registers restored: "));
9375 if (per_index == 4)
9376 printf (" (compact) ");
9377 decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
9378 putchar ('\n');
9379 printf (_(" Return register: %s\n"),
9380 tic6x_unwind_regnames[word & 0xf]);
9381 }
9382 else
1b31d05e 9383 printf (_(" [reserved (%d)]\n"), per_index);
fa197c1c
PB
9384 break;
9385
9386 default:
74e1a04b 9387 error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
dda8d76d 9388 filedata->file_header.e_machine);
32ec8896 9389 res = FALSE;
fa197c1c 9390 }
0b6ae522
DJ
9391
9392 /* Decode the descriptors. Not implemented. */
32ec8896
NC
9393
9394 return res;
0b6ae522
DJ
9395}
9396
32ec8896 9397static bfd_boolean
dda8d76d
NC
9398dump_arm_unwind (Filedata * filedata,
9399 struct arm_unw_aux_info * aux,
9400 Elf_Internal_Shdr * exidx_sec)
0b6ae522
DJ
9401{
9402 struct arm_section exidx_arm_sec, extab_arm_sec;
9403 unsigned int i, exidx_len;
948f632f 9404 unsigned long j, nfuns;
32ec8896 9405 bfd_boolean res = TRUE;
0b6ae522
DJ
9406
9407 memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
9408 memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
9409 exidx_len = exidx_sec->sh_size / 8;
9410
948f632f
DA
9411 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
9412 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
9413 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
9414 aux->funtab[nfuns++] = aux->symtab[j];
9415 aux->nfuns = nfuns;
9416 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
9417
0b6ae522
DJ
9418 for (i = 0; i < exidx_len; i++)
9419 {
9420 unsigned int exidx_fn, exidx_entry;
9421 struct absaddr fn_addr, entry_addr;
9422 bfd_vma fn;
9423
9424 fputc ('\n', stdout);
9425
dda8d76d 9426 if (! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
1b31d05e 9427 8 * i, & exidx_fn, & fn_addr, NULL)
dda8d76d 9428 || ! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
1b31d05e 9429 8 * i + 4, & exidx_entry, & entry_addr, NULL))
0b6ae522 9430 {
948f632f 9431 free (aux->funtab);
1b31d05e
NC
9432 arm_free_section (& exidx_arm_sec);
9433 arm_free_section (& extab_arm_sec);
32ec8896 9434 return FALSE;
0b6ae522
DJ
9435 }
9436
83c257ca
NC
9437 /* ARM EHABI, Section 5:
9438 An index table entry consists of 2 words.
9439 The first word contains a prel31 offset to the start of a function, with bit 31 clear. */
9440 if (exidx_fn & 0x80000000)
32ec8896
NC
9441 {
9442 warn (_("corrupt index table entry: %x\n"), exidx_fn);
9443 res = FALSE;
9444 }
83c257ca 9445
dda8d76d 9446 fn = arm_expand_prel31 (filedata, exidx_fn, exidx_sec->sh_addr + 8 * i);
0b6ae522 9447
dda8d76d 9448 arm_print_vma_and_name (filedata, aux, fn, fn_addr);
0b6ae522
DJ
9449 fputs (": ", stdout);
9450
9451 if (exidx_entry == 1)
9452 {
9453 print_vma (exidx_entry, PREFIX_HEX);
9454 fputs (" [cantunwind]\n", stdout);
9455 }
9456 else if (exidx_entry & 0x80000000)
9457 {
9458 print_vma (exidx_entry, PREFIX_HEX);
9459 fputc ('\n', stdout);
dda8d76d 9460 decode_arm_unwind (filedata, aux, exidx_entry, 4, 0, NULL, NULL);
0b6ae522
DJ
9461 }
9462 else
9463 {
8f73510c 9464 bfd_vma table, table_offset = 0;
0b6ae522
DJ
9465 Elf_Internal_Shdr *table_sec;
9466
9467 fputs ("@", stdout);
dda8d76d 9468 table = arm_expand_prel31 (filedata, exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
0b6ae522
DJ
9469 print_vma (table, PREFIX_HEX);
9470 printf ("\n");
9471
9472 /* Locate the matching .ARM.extab. */
9473 if (entry_addr.section != SHN_UNDEF
dda8d76d 9474 && entry_addr.section < filedata->file_header.e_shnum)
0b6ae522 9475 {
dda8d76d 9476 table_sec = filedata->section_headers + entry_addr.section;
0b6ae522 9477 table_offset = entry_addr.offset;
1a915552
NC
9478 /* PR 18879 */
9479 if (table_offset > table_sec->sh_size
9480 || ((bfd_signed_vma) table_offset) < 0)
9481 {
9482 warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
9483 (unsigned long) table_offset,
dda8d76d 9484 printable_section_name (filedata, table_sec));
32ec8896 9485 res = FALSE;
1a915552
NC
9486 continue;
9487 }
0b6ae522
DJ
9488 }
9489 else
9490 {
dda8d76d 9491 table_sec = find_section_by_address (filedata, table);
0b6ae522
DJ
9492 if (table_sec != NULL)
9493 table_offset = table - table_sec->sh_addr;
9494 }
32ec8896 9495
0b6ae522
DJ
9496 if (table_sec == NULL)
9497 {
9498 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
9499 (unsigned long) table);
32ec8896 9500 res = FALSE;
0b6ae522
DJ
9501 continue;
9502 }
32ec8896 9503
dda8d76d 9504 if (! decode_arm_unwind (filedata, aux, 0, 0, table_offset, table_sec,
32ec8896
NC
9505 &extab_arm_sec))
9506 res = FALSE;
0b6ae522
DJ
9507 }
9508 }
9509
9510 printf ("\n");
9511
948f632f 9512 free (aux->funtab);
0b6ae522
DJ
9513 arm_free_section (&exidx_arm_sec);
9514 arm_free_section (&extab_arm_sec);
32ec8896
NC
9515
9516 return res;
0b6ae522
DJ
9517}
9518
fa197c1c 9519/* Used for both ARM and C6X unwinding tables. */
1b31d05e 9520
32ec8896 9521static bfd_boolean
dda8d76d 9522arm_process_unwind (Filedata * filedata)
0b6ae522
DJ
9523{
9524 struct arm_unw_aux_info aux;
9525 Elf_Internal_Shdr *unwsec = NULL;
0b6ae522
DJ
9526 Elf_Internal_Shdr *sec;
9527 unsigned long i;
fa197c1c 9528 unsigned int sec_type;
32ec8896 9529 bfd_boolean res = TRUE;
0b6ae522 9530
dda8d76d 9531 switch (filedata->file_header.e_machine)
fa197c1c
PB
9532 {
9533 case EM_ARM:
9534 sec_type = SHT_ARM_EXIDX;
9535 break;
9536
9537 case EM_TI_C6000:
9538 sec_type = SHT_C6000_UNWIND;
9539 break;
9540
0b4362b0 9541 default:
74e1a04b 9542 error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
dda8d76d 9543 filedata->file_header.e_machine);
32ec8896 9544 return FALSE;
fa197c1c
PB
9545 }
9546
dda8d76d 9547 if (filedata->string_table == NULL)
32ec8896 9548 return FALSE;
1b31d05e
NC
9549
9550 memset (& aux, 0, sizeof (aux));
dda8d76d 9551 aux.filedata = filedata;
0b6ae522 9552
dda8d76d 9553 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
0b6ae522 9554 {
28d13567 9555 if (sec->sh_type == SHT_SYMTAB)
0b6ae522 9556 {
28d13567 9557 if (aux.symtab)
74e1a04b 9558 {
28d13567
AM
9559 error (_("Multiple symbol tables encountered\n"));
9560 free (aux.symtab);
9561 aux.symtab = NULL;
74e1a04b 9562 free (aux.strtab);
28d13567 9563 aux.strtab = NULL;
74e1a04b 9564 }
28d13567
AM
9565 if (!get_symtab (filedata, sec, &aux.symtab, &aux.nsyms,
9566 &aux.strtab, &aux.strtab_size))
9567 return FALSE;
0b6ae522 9568 }
fa197c1c 9569 else if (sec->sh_type == sec_type)
0b6ae522
DJ
9570 unwsec = sec;
9571 }
9572
1b31d05e 9573 if (unwsec == NULL)
0b6ae522 9574 printf (_("\nThere are no unwind sections in this file.\n"));
1b31d05e 9575 else
dda8d76d 9576 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
1b31d05e
NC
9577 {
9578 if (sec->sh_type == sec_type)
9579 {
d3a49aa8
AM
9580 unsigned long num_unwind = sec->sh_size / (2 * eh_addr_size);
9581 printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
9582 "contains %lu entry:\n",
9583 "\nUnwind section '%s' at offset 0x%lx "
9584 "contains %lu entries:\n",
9585 num_unwind),
dda8d76d 9586 printable_section_name (filedata, sec),
1b31d05e 9587 (unsigned long) sec->sh_offset,
d3a49aa8 9588 num_unwind);
0b6ae522 9589
dda8d76d 9590 if (! dump_arm_unwind (filedata, &aux, sec))
32ec8896 9591 res = FALSE;
1b31d05e
NC
9592 }
9593 }
0b6ae522 9594
9db70fc3
AM
9595 free (aux.symtab);
9596 free ((char *) aux.strtab);
32ec8896
NC
9597
9598 return res;
0b6ae522
DJ
9599}
9600
32ec8896 9601static bfd_boolean
dda8d76d 9602process_unwind (Filedata * filedata)
57346661 9603{
2cf0635d
NC
9604 struct unwind_handler
9605 {
32ec8896 9606 unsigned int machtype;
dda8d76d 9607 bfd_boolean (* handler)(Filedata *);
2cf0635d
NC
9608 } handlers[] =
9609 {
0b6ae522 9610 { EM_ARM, arm_process_unwind },
57346661
AM
9611 { EM_IA_64, ia64_process_unwind },
9612 { EM_PARISC, hppa_process_unwind },
fa197c1c 9613 { EM_TI_C6000, arm_process_unwind },
32ec8896 9614 { 0, NULL }
57346661
AM
9615 };
9616 int i;
9617
9618 if (!do_unwind)
32ec8896 9619 return TRUE;
57346661
AM
9620
9621 for (i = 0; handlers[i].handler != NULL; i++)
dda8d76d
NC
9622 if (filedata->file_header.e_machine == handlers[i].machtype)
9623 return handlers[i].handler (filedata);
57346661 9624
1b31d05e 9625 printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
dda8d76d 9626 get_machine_name (filedata->file_header.e_machine));
32ec8896 9627 return TRUE;
57346661
AM
9628}
9629
37c18eed
SD
9630static void
9631dynamic_section_aarch64_val (Elf_Internal_Dyn * entry)
9632{
9633 switch (entry->d_tag)
9634 {
9635 case DT_AARCH64_BTI_PLT:
1dbade74 9636 case DT_AARCH64_PAC_PLT:
37c18eed
SD
9637 break;
9638 default:
9639 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9640 break;
9641 }
9642 putchar ('\n');
9643}
9644
252b5132 9645static void
978c4450 9646dynamic_section_mips_val (Filedata * filedata, Elf_Internal_Dyn * entry)
252b5132
RH
9647{
9648 switch (entry->d_tag)
9649 {
9650 case DT_MIPS_FLAGS:
9651 if (entry->d_un.d_val == 0)
4b68bca3 9652 printf (_("NONE"));
252b5132
RH
9653 else
9654 {
9655 static const char * opts[] =
9656 {
9657 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
9658 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
9659 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
9660 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
9661 "RLD_ORDER_SAFE"
9662 };
9663 unsigned int cnt;
32ec8896 9664 bfd_boolean first = TRUE;
2b692964 9665
60bca95a 9666 for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
252b5132
RH
9667 if (entry->d_un.d_val & (1 << cnt))
9668 {
9669 printf ("%s%s", first ? "" : " ", opts[cnt]);
32ec8896 9670 first = FALSE;
252b5132 9671 }
252b5132
RH
9672 }
9673 break;
103f02d3 9674
252b5132 9675 case DT_MIPS_IVERSION:
978c4450
AM
9676 if (VALID_DYNAMIC_NAME (filedata, entry->d_un.d_val))
9677 printf (_("Interface Version: %s"),
9678 GET_DYNAMIC_NAME (filedata, entry->d_un.d_val));
252b5132 9679 else
76ca31c0
NC
9680 {
9681 char buf[40];
9682 sprintf_vma (buf, entry->d_un.d_ptr);
9683 /* Note: coded this way so that there is a single string for translation. */
9684 printf (_("<corrupt: %s>"), buf);
9685 }
252b5132 9686 break;
103f02d3 9687
252b5132
RH
9688 case DT_MIPS_TIME_STAMP:
9689 {
d5b07ef4 9690 char timebuf[128];
2cf0635d 9691 struct tm * tmp;
91d6fa6a 9692 time_t atime = entry->d_un.d_val;
82b1b41b 9693
91d6fa6a 9694 tmp = gmtime (&atime);
82b1b41b
NC
9695 /* PR 17531: file: 6accc532. */
9696 if (tmp == NULL)
9697 snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
9698 else
9699 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
9700 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9701 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
4b68bca3 9702 printf (_("Time Stamp: %s"), timebuf);
252b5132
RH
9703 }
9704 break;
103f02d3 9705
252b5132
RH
9706 case DT_MIPS_RLD_VERSION:
9707 case DT_MIPS_LOCAL_GOTNO:
9708 case DT_MIPS_CONFLICTNO:
9709 case DT_MIPS_LIBLISTNO:
9710 case DT_MIPS_SYMTABNO:
9711 case DT_MIPS_UNREFEXTNO:
9712 case DT_MIPS_HIPAGENO:
9713 case DT_MIPS_DELTA_CLASS_NO:
9714 case DT_MIPS_DELTA_INSTANCE_NO:
9715 case DT_MIPS_DELTA_RELOC_NO:
9716 case DT_MIPS_DELTA_SYM_NO:
9717 case DT_MIPS_DELTA_CLASSSYM_NO:
9718 case DT_MIPS_COMPACT_SIZE:
c69075ac 9719 print_vma (entry->d_un.d_val, DEC);
252b5132 9720 break;
103f02d3 9721
f16a9783 9722 case DT_MIPS_XHASH:
978c4450
AM
9723 filedata->dynamic_info_DT_MIPS_XHASH = entry->d_un.d_val;
9724 filedata->dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
f16a9783
MS
9725 /* Falls through. */
9726
103f02d3 9727 default:
4b68bca3 9728 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
103f02d3 9729 }
4b68bca3 9730 putchar ('\n');
103f02d3
UD
9731}
9732
103f02d3 9733static void
2cf0635d 9734dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
103f02d3
UD
9735{
9736 switch (entry->d_tag)
9737 {
9738 case DT_HP_DLD_FLAGS:
9739 {
9740 static struct
9741 {
9742 long int bit;
2cf0635d 9743 const char * str;
5e220199
NC
9744 }
9745 flags[] =
9746 {
9747 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
9748 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
9749 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
9750 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
9751 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
9752 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
9753 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
9754 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
9755 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
9756 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
eec8f817
DA
9757 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
9758 { DT_HP_GST, "HP_GST" },
9759 { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
9760 { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
9761 { DT_HP_NODELETE, "HP_NODELETE" },
9762 { DT_HP_GROUP, "HP_GROUP" },
9763 { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
5e220199 9764 };
32ec8896 9765 bfd_boolean first = TRUE;
5e220199 9766 size_t cnt;
f7a99963 9767 bfd_vma val = entry->d_un.d_val;
103f02d3 9768
60bca95a 9769 for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
103f02d3 9770 if (val & flags[cnt].bit)
30800947
NC
9771 {
9772 if (! first)
9773 putchar (' ');
9774 fputs (flags[cnt].str, stdout);
32ec8896 9775 first = FALSE;
30800947
NC
9776 val ^= flags[cnt].bit;
9777 }
76da6bbe 9778
103f02d3 9779 if (val != 0 || first)
f7a99963
NC
9780 {
9781 if (! first)
9782 putchar (' ');
9783 print_vma (val, HEX);
9784 }
103f02d3
UD
9785 }
9786 break;
76da6bbe 9787
252b5132 9788 default:
f7a99963
NC
9789 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9790 break;
252b5132 9791 }
35b1837e 9792 putchar ('\n');
252b5132
RH
9793}
9794
28f997cf
TG
9795#ifdef BFD64
9796
9797/* VMS vs Unix time offset and factor. */
9798
9799#define VMS_EPOCH_OFFSET 35067168000000000LL
9800#define VMS_GRANULARITY_FACTOR 10000000
9801
9802/* Display a VMS time in a human readable format. */
9803
9804static void
9805print_vms_time (bfd_int64_t vmstime)
9806{
9807 struct tm *tm;
9808 time_t unxtime;
9809
9810 unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
9811 tm = gmtime (&unxtime);
9812 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
9813 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
9814 tm->tm_hour, tm->tm_min, tm->tm_sec);
9815}
9816#endif /* BFD64 */
9817
ecc51f48 9818static void
2cf0635d 9819dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
ecc51f48
NC
9820{
9821 switch (entry->d_tag)
9822 {
0de14b54 9823 case DT_IA_64_PLT_RESERVE:
bdf4d63a 9824 /* First 3 slots reserved. */
ecc51f48
NC
9825 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9826 printf (" -- ");
9827 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
bdf4d63a
JJ
9828 break;
9829
28f997cf
TG
9830 case DT_IA_64_VMS_LINKTIME:
9831#ifdef BFD64
9832 print_vms_time (entry->d_un.d_val);
9833#endif
9834 break;
9835
9836 case DT_IA_64_VMS_LNKFLAGS:
9837 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9838 if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
9839 printf (" CALL_DEBUG");
9840 if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
9841 printf (" NOP0BUFS");
9842 if (entry->d_un.d_val & VMS_LF_P0IMAGE)
9843 printf (" P0IMAGE");
9844 if (entry->d_un.d_val & VMS_LF_MKTHREADS)
9845 printf (" MKTHREADS");
9846 if (entry->d_un.d_val & VMS_LF_UPCALLS)
9847 printf (" UPCALLS");
9848 if (entry->d_un.d_val & VMS_LF_IMGSTA)
9849 printf (" IMGSTA");
9850 if (entry->d_un.d_val & VMS_LF_INITIALIZE)
9851 printf (" INITIALIZE");
9852 if (entry->d_un.d_val & VMS_LF_MAIN)
9853 printf (" MAIN");
9854 if (entry->d_un.d_val & VMS_LF_EXE_INIT)
9855 printf (" EXE_INIT");
9856 if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
9857 printf (" TBK_IN_IMG");
9858 if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
9859 printf (" DBG_IN_IMG");
9860 if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
9861 printf (" TBK_IN_DSF");
9862 if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
9863 printf (" DBG_IN_DSF");
9864 if (entry->d_un.d_val & VMS_LF_SIGNATURES)
9865 printf (" SIGNATURES");
9866 if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
9867 printf (" REL_SEG_OFF");
9868 break;
9869
bdf4d63a
JJ
9870 default:
9871 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9872 break;
ecc51f48 9873 }
bdf4d63a 9874 putchar ('\n');
ecc51f48
NC
9875}
9876
32ec8896 9877static bfd_boolean
dda8d76d 9878get_32bit_dynamic_section (Filedata * filedata)
252b5132 9879{
2cf0635d
NC
9880 Elf32_External_Dyn * edyn;
9881 Elf32_External_Dyn * ext;
9882 Elf_Internal_Dyn * entry;
103f02d3 9883
978c4450
AM
9884 edyn = (Elf32_External_Dyn *) get_data (NULL, filedata,
9885 filedata->dynamic_addr, 1,
9886 filedata->dynamic_size,
9887 _("dynamic section"));
a6e9f9df 9888 if (!edyn)
32ec8896 9889 return FALSE;
103f02d3 9890
071436c6
NC
9891 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9892 might not have the luxury of section headers. Look for the DT_NULL
9893 terminator to determine the number of entries. */
978c4450
AM
9894 for (ext = edyn, filedata->dynamic_nent = 0;
9895 (char *) (ext + 1) <= (char *) edyn + filedata->dynamic_size;
ba2685cc
AM
9896 ext++)
9897 {
978c4450 9898 filedata->dynamic_nent++;
ba2685cc
AM
9899 if (BYTE_GET (ext->d_tag) == DT_NULL)
9900 break;
9901 }
252b5132 9902
978c4450
AM
9903 filedata->dynamic_section
9904 = (Elf_Internal_Dyn *) cmalloc (filedata->dynamic_nent, sizeof (* entry));
9905 if (filedata->dynamic_section == NULL)
252b5132 9906 {
8b73c356 9907 error (_("Out of memory allocating space for %lu dynamic entries\n"),
978c4450 9908 (unsigned long) filedata->dynamic_nent);
9ea033b2 9909 free (edyn);
32ec8896 9910 return FALSE;
9ea033b2 9911 }
252b5132 9912
978c4450
AM
9913 for (ext = edyn, entry = filedata->dynamic_section;
9914 entry < filedata->dynamic_section + filedata->dynamic_nent;
fb514b26 9915 ext++, entry++)
9ea033b2 9916 {
fb514b26
AM
9917 entry->d_tag = BYTE_GET (ext->d_tag);
9918 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
252b5132
RH
9919 }
9920
9ea033b2
NC
9921 free (edyn);
9922
32ec8896 9923 return TRUE;
9ea033b2
NC
9924}
9925
32ec8896 9926static bfd_boolean
dda8d76d 9927get_64bit_dynamic_section (Filedata * filedata)
9ea033b2 9928{
2cf0635d
NC
9929 Elf64_External_Dyn * edyn;
9930 Elf64_External_Dyn * ext;
9931 Elf_Internal_Dyn * entry;
103f02d3 9932
071436c6 9933 /* Read in the data. */
978c4450
AM
9934 edyn = (Elf64_External_Dyn *) get_data (NULL, filedata,
9935 filedata->dynamic_addr, 1,
9936 filedata->dynamic_size,
9937 _("dynamic section"));
a6e9f9df 9938 if (!edyn)
32ec8896 9939 return FALSE;
103f02d3 9940
071436c6
NC
9941 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9942 might not have the luxury of section headers. Look for the DT_NULL
9943 terminator to determine the number of entries. */
978c4450 9944 for (ext = edyn, filedata->dynamic_nent = 0;
53c3012c 9945 /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer. */
978c4450 9946 (char *) (ext + 1) <= (char *) edyn + filedata->dynamic_size;
ba2685cc
AM
9947 ext++)
9948 {
978c4450 9949 filedata->dynamic_nent++;
66543521 9950 if (BYTE_GET (ext->d_tag) == DT_NULL)
ba2685cc
AM
9951 break;
9952 }
252b5132 9953
978c4450
AM
9954 filedata->dynamic_section
9955 = (Elf_Internal_Dyn *) cmalloc (filedata->dynamic_nent, sizeof (* entry));
9956 if (filedata->dynamic_section == NULL)
252b5132 9957 {
8b73c356 9958 error (_("Out of memory allocating space for %lu dynamic entries\n"),
978c4450 9959 (unsigned long) filedata->dynamic_nent);
252b5132 9960 free (edyn);
32ec8896 9961 return FALSE;
252b5132
RH
9962 }
9963
071436c6 9964 /* Convert from external to internal formats. */
978c4450
AM
9965 for (ext = edyn, entry = filedata->dynamic_section;
9966 entry < filedata->dynamic_section + filedata->dynamic_nent;
fb514b26 9967 ext++, entry++)
252b5132 9968 {
66543521
AM
9969 entry->d_tag = BYTE_GET (ext->d_tag);
9970 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
252b5132
RH
9971 }
9972
9973 free (edyn);
9974
32ec8896 9975 return TRUE;
9ea033b2
NC
9976}
9977
e9e44622
JJ
9978static void
9979print_dynamic_flags (bfd_vma flags)
d1133906 9980{
32ec8896 9981 bfd_boolean first = TRUE;
13ae64f3 9982
d1133906
NC
9983 while (flags)
9984 {
9985 bfd_vma flag;
9986
9987 flag = flags & - flags;
9988 flags &= ~ flag;
9989
e9e44622 9990 if (first)
32ec8896 9991 first = FALSE;
e9e44622
JJ
9992 else
9993 putc (' ', stdout);
13ae64f3 9994
d1133906
NC
9995 switch (flag)
9996 {
e9e44622
JJ
9997 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
9998 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
9999 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
10000 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
10001 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
2b692964 10002 default: fputs (_("unknown"), stdout); break;
d1133906
NC
10003 }
10004 }
e9e44622 10005 puts ("");
d1133906
NC
10006}
10007
10ca4b04
L
10008static bfd_vma *
10009get_dynamic_data (Filedata * filedata, bfd_size_type number, unsigned int ent_size)
10010{
10011 unsigned char * e_data;
10012 bfd_vma * i_data;
10013
10014 /* If the size_t type is smaller than the bfd_size_type, eg because
10015 you are building a 32-bit tool on a 64-bit host, then make sure
10016 that when (number) is cast to (size_t) no information is lost. */
10017 if (sizeof (size_t) < sizeof (bfd_size_type)
10018 && (bfd_size_type) ((size_t) number) != number)
10019 {
10020 error (_("Size truncation prevents reading %s elements of size %u\n"),
10021 bfd_vmatoa ("u", number), ent_size);
10022 return NULL;
10023 }
10024
10025 /* Be kind to memory checkers (eg valgrind, address sanitizer) by not
10026 attempting to allocate memory when the read is bound to fail. */
10027 if (ent_size * number > filedata->file_size)
10028 {
10029 error (_("Invalid number of dynamic entries: %s\n"),
10030 bfd_vmatoa ("u", number));
10031 return NULL;
10032 }
10033
10034 e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
10035 if (e_data == NULL)
10036 {
10037 error (_("Out of memory reading %s dynamic entries\n"),
10038 bfd_vmatoa ("u", number));
10039 return NULL;
10040 }
10041
10042 if (fread (e_data, ent_size, (size_t) number, filedata->handle) != number)
10043 {
10044 error (_("Unable to read in %s bytes of dynamic data\n"),
10045 bfd_vmatoa ("u", number * ent_size));
10046 free (e_data);
10047 return NULL;
10048 }
10049
10050 i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
10051 if (i_data == NULL)
10052 {
10053 error (_("Out of memory allocating space for %s dynamic entries\n"),
10054 bfd_vmatoa ("u", number));
10055 free (e_data);
10056 return NULL;
10057 }
10058
10059 while (number--)
10060 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
10061
10062 free (e_data);
10063
10064 return i_data;
10065}
10066
10067static unsigned long
10068get_num_dynamic_syms (Filedata * filedata)
10069{
10070 unsigned long num_of_syms = 0;
10071
10072 if (!do_histogram && (!do_using_dynamic || do_dyn_syms))
10073 return num_of_syms;
10074
978c4450 10075 if (filedata->dynamic_info[DT_HASH])
10ca4b04
L
10076 {
10077 unsigned char nb[8];
10078 unsigned char nc[8];
10079 unsigned int hash_ent_size = 4;
10080
10081 if ((filedata->file_header.e_machine == EM_ALPHA
10082 || filedata->file_header.e_machine == EM_S390
10083 || filedata->file_header.e_machine == EM_S390_OLD)
10084 && filedata->file_header.e_ident[EI_CLASS] == ELFCLASS64)
10085 hash_ent_size = 8;
10086
10087 if (fseek (filedata->handle,
978c4450
AM
10088 (filedata->archive_file_offset
10089 + offset_from_vma (filedata, filedata->dynamic_info[DT_HASH],
10ca4b04
L
10090 sizeof nb + sizeof nc)),
10091 SEEK_SET))
10092 {
10093 error (_("Unable to seek to start of dynamic information\n"));
10094 goto no_hash;
10095 }
10096
10097 if (fread (nb, hash_ent_size, 1, filedata->handle) != 1)
10098 {
10099 error (_("Failed to read in number of buckets\n"));
10100 goto no_hash;
10101 }
10102
10103 if (fread (nc, hash_ent_size, 1, filedata->handle) != 1)
10104 {
10105 error (_("Failed to read in number of chains\n"));
10106 goto no_hash;
10107 }
10108
978c4450
AM
10109 filedata->nbuckets = byte_get (nb, hash_ent_size);
10110 filedata->nchains = byte_get (nc, hash_ent_size);
10ca4b04 10111
2482f306
AM
10112 if (filedata->nbuckets != 0 && filedata->nchains != 0)
10113 {
10114 filedata->buckets = get_dynamic_data (filedata, filedata->nbuckets,
10115 hash_ent_size);
10116 filedata->chains = get_dynamic_data (filedata, filedata->nchains,
10117 hash_ent_size);
001890e1 10118
2482f306
AM
10119 if (filedata->buckets != NULL && filedata->chains != NULL)
10120 num_of_syms = filedata->nchains;
10121 }
ceb9bf11 10122 no_hash:
10ca4b04
L
10123 if (num_of_syms == 0)
10124 {
9db70fc3
AM
10125 free (filedata->buckets);
10126 filedata->buckets = NULL;
10127 free (filedata->chains);
10128 filedata->chains = NULL;
978c4450 10129 filedata->nbuckets = 0;
10ca4b04
L
10130 }
10131 }
10132
978c4450 10133 if (filedata->dynamic_info_DT_GNU_HASH)
10ca4b04
L
10134 {
10135 unsigned char nb[16];
10136 bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
10137 bfd_vma buckets_vma;
10138 unsigned long hn;
10ca4b04
L
10139
10140 if (fseek (filedata->handle,
978c4450
AM
10141 (filedata->archive_file_offset
10142 + offset_from_vma (filedata,
10143 filedata->dynamic_info_DT_GNU_HASH,
10ca4b04
L
10144 sizeof nb)),
10145 SEEK_SET))
10146 {
10147 error (_("Unable to seek to start of dynamic information\n"));
10ca4b04
L
10148 goto no_gnu_hash;
10149 }
10150
10151 if (fread (nb, 16, 1, filedata->handle) != 1)
10152 {
10153 error (_("Failed to read in number of buckets\n"));
10ca4b04
L
10154 goto no_gnu_hash;
10155 }
10156
978c4450
AM
10157 filedata->ngnubuckets = byte_get (nb, 4);
10158 filedata->gnusymidx = byte_get (nb + 4, 4);
10ca4b04 10159 bitmaskwords = byte_get (nb + 8, 4);
978c4450 10160 buckets_vma = filedata->dynamic_info_DT_GNU_HASH + 16;
10ca4b04
L
10161 if (is_32bit_elf)
10162 buckets_vma += bitmaskwords * 4;
10163 else
10164 buckets_vma += bitmaskwords * 8;
10165
10166 if (fseek (filedata->handle,
978c4450 10167 (filedata->archive_file_offset
10ca4b04
L
10168 + offset_from_vma (filedata, buckets_vma, 4)),
10169 SEEK_SET))
10170 {
10171 error (_("Unable to seek to start of dynamic information\n"));
10ca4b04
L
10172 goto no_gnu_hash;
10173 }
10174
978c4450
AM
10175 filedata->gnubuckets
10176 = get_dynamic_data (filedata, filedata->ngnubuckets, 4);
10ca4b04 10177
978c4450 10178 if (filedata->gnubuckets == NULL)
90837ea7 10179 goto no_gnu_hash;
10ca4b04 10180
978c4450
AM
10181 for (i = 0; i < filedata->ngnubuckets; i++)
10182 if (filedata->gnubuckets[i] != 0)
10ca4b04 10183 {
978c4450 10184 if (filedata->gnubuckets[i] < filedata->gnusymidx)
90837ea7 10185 goto no_gnu_hash;
10ca4b04 10186
978c4450
AM
10187 if (maxchain == 0xffffffff || filedata->gnubuckets[i] > maxchain)
10188 maxchain = filedata->gnubuckets[i];
10ca4b04
L
10189 }
10190
10191 if (maxchain == 0xffffffff)
90837ea7 10192 goto no_gnu_hash;
10ca4b04 10193
978c4450 10194 maxchain -= filedata->gnusymidx;
10ca4b04
L
10195
10196 if (fseek (filedata->handle,
978c4450
AM
10197 (filedata->archive_file_offset
10198 + offset_from_vma (filedata,
10199 buckets_vma + 4 * (filedata->ngnubuckets
10200 + maxchain),
10201 4)),
10ca4b04
L
10202 SEEK_SET))
10203 {
10204 error (_("Unable to seek to start of dynamic information\n"));
10ca4b04
L
10205 goto no_gnu_hash;
10206 }
10207
10208 do
10209 {
10210 if (fread (nb, 4, 1, filedata->handle) != 1)
10211 {
10212 error (_("Failed to determine last chain length\n"));
10ca4b04
L
10213 goto no_gnu_hash;
10214 }
10215
10216 if (maxchain + 1 == 0)
90837ea7 10217 goto no_gnu_hash;
10ca4b04
L
10218
10219 ++maxchain;
10220 }
10221 while ((byte_get (nb, 4) & 1) == 0);
10222
10223 if (fseek (filedata->handle,
978c4450
AM
10224 (filedata->archive_file_offset
10225 + offset_from_vma (filedata, (buckets_vma
10226 + 4 * filedata->ngnubuckets),
10227 4)),
10ca4b04
L
10228 SEEK_SET))
10229 {
10230 error (_("Unable to seek to start of dynamic information\n"));
10ca4b04
L
10231 goto no_gnu_hash;
10232 }
10233
978c4450
AM
10234 filedata->gnuchains = get_dynamic_data (filedata, maxchain, 4);
10235 filedata->ngnuchains = maxchain;
10ca4b04 10236
978c4450 10237 if (filedata->gnuchains == NULL)
90837ea7 10238 goto no_gnu_hash;
10ca4b04 10239
978c4450 10240 if (filedata->dynamic_info_DT_MIPS_XHASH)
10ca4b04
L
10241 {
10242 if (fseek (filedata->handle,
978c4450 10243 (filedata->archive_file_offset
10ca4b04 10244 + offset_from_vma (filedata, (buckets_vma
978c4450 10245 + 4 * (filedata->ngnubuckets
10ca4b04
L
10246 + maxchain)), 4)),
10247 SEEK_SET))
10248 {
10249 error (_("Unable to seek to start of dynamic information\n"));
10ca4b04
L
10250 goto no_gnu_hash;
10251 }
10252
978c4450 10253 filedata->mipsxlat = get_dynamic_data (filedata, maxchain, 4);
90837ea7
AM
10254 if (filedata->mipsxlat == NULL)
10255 goto no_gnu_hash;
10ca4b04
L
10256 }
10257
978c4450
AM
10258 for (hn = 0; hn < filedata->ngnubuckets; ++hn)
10259 if (filedata->gnubuckets[hn] != 0)
10ca4b04 10260 {
978c4450
AM
10261 bfd_vma si = filedata->gnubuckets[hn];
10262 bfd_vma off = si - filedata->gnusymidx;
10ca4b04
L
10263
10264 do
10265 {
978c4450 10266 if (filedata->dynamic_info_DT_MIPS_XHASH)
10ca4b04 10267 {
c31ab5a0
AM
10268 if (off < filedata->ngnuchains
10269 && filedata->mipsxlat[off] >= num_of_syms)
978c4450 10270 num_of_syms = filedata->mipsxlat[off] + 1;
10ca4b04
L
10271 }
10272 else
10273 {
10274 if (si >= num_of_syms)
10275 num_of_syms = si + 1;
10276 }
10277 si++;
10278 }
978c4450
AM
10279 while (off < filedata->ngnuchains
10280 && (filedata->gnuchains[off++] & 1) == 0);
10ca4b04
L
10281 }
10282
90837ea7 10283 if (num_of_syms == 0)
10ca4b04 10284 {
90837ea7 10285 no_gnu_hash:
9db70fc3
AM
10286 free (filedata->mipsxlat);
10287 filedata->mipsxlat = NULL;
10288 free (filedata->gnuchains);
10289 filedata->gnuchains = NULL;
10290 free (filedata->gnubuckets);
10291 filedata->gnubuckets = NULL;
978c4450
AM
10292 filedata->ngnubuckets = 0;
10293 filedata->ngnuchains = 0;
10ca4b04
L
10294 }
10295 }
10296
10297 return num_of_syms;
10298}
10299
b2d38a17
NC
10300/* Parse and display the contents of the dynamic section. */
10301
32ec8896 10302static bfd_boolean
dda8d76d 10303process_dynamic_section (Filedata * filedata)
9ea033b2 10304{
2cf0635d 10305 Elf_Internal_Dyn * entry;
9ea033b2 10306
978c4450 10307 if (filedata->dynamic_size == 0)
9ea033b2
NC
10308 {
10309 if (do_dynamic)
b2d38a17 10310 printf (_("\nThere is no dynamic section in this file.\n"));
9ea033b2 10311
32ec8896 10312 return TRUE;
9ea033b2
NC
10313 }
10314
10315 if (is_32bit_elf)
10316 {
dda8d76d 10317 if (! get_32bit_dynamic_section (filedata))
32ec8896
NC
10318 return FALSE;
10319 }
10320 else
10321 {
dda8d76d 10322 if (! get_64bit_dynamic_section (filedata))
32ec8896 10323 return FALSE;
9ea033b2 10324 }
9ea033b2 10325
252b5132 10326 /* Find the appropriate symbol table. */
978c4450 10327 if (filedata->dynamic_symbols == NULL || do_histogram)
252b5132 10328 {
2482f306
AM
10329 unsigned long num_of_syms;
10330
978c4450
AM
10331 for (entry = filedata->dynamic_section;
10332 entry < filedata->dynamic_section + filedata->dynamic_nent;
86dba8ee 10333 ++entry)
10ca4b04 10334 if (entry->d_tag == DT_SYMTAB)
978c4450 10335 filedata->dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
10ca4b04 10336 else if (entry->d_tag == DT_SYMENT)
978c4450 10337 filedata->dynamic_info[DT_SYMENT] = entry->d_un.d_val;
10ca4b04 10338 else if (entry->d_tag == DT_HASH)
978c4450 10339 filedata->dynamic_info[DT_HASH] = entry->d_un.d_val;
10ca4b04 10340 else if (entry->d_tag == DT_GNU_HASH)
978c4450 10341 filedata->dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
10ca4b04
L
10342 else if ((filedata->file_header.e_machine == EM_MIPS
10343 || filedata->file_header.e_machine == EM_MIPS_RS3_LE)
10344 && entry->d_tag == DT_MIPS_XHASH)
10345 {
978c4450
AM
10346 filedata->dynamic_info_DT_MIPS_XHASH = entry->d_un.d_val;
10347 filedata->dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
10ca4b04 10348 }
252b5132 10349
2482f306
AM
10350 num_of_syms = get_num_dynamic_syms (filedata);
10351
10352 if (num_of_syms != 0
10353 && filedata->dynamic_symbols == NULL
10354 && filedata->dynamic_info[DT_SYMTAB]
978c4450 10355 && filedata->dynamic_info[DT_SYMENT])
10ca4b04
L
10356 {
10357 Elf_Internal_Phdr *seg;
2482f306 10358 bfd_vma vma = filedata->dynamic_info[DT_SYMTAB];
252b5132 10359
2482f306
AM
10360 if (! get_program_headers (filedata))
10361 {
10362 error (_("Cannot interpret virtual addresses "
10363 "without program headers.\n"));
10364 return FALSE;
10365 }
252b5132 10366
2482f306
AM
10367 for (seg = filedata->program_headers;
10368 seg < filedata->program_headers + filedata->file_header.e_phnum;
10369 ++seg)
10370 {
10371 if (seg->p_type != PT_LOAD)
10372 continue;
252b5132 10373
2482f306
AM
10374 if (seg->p_offset + seg->p_filesz > filedata->file_size)
10375 {
10376 /* See PR 21379 for a reproducer. */
10377 error (_("Invalid PT_LOAD entry\n"));
10378 return FALSE;
10379 }
252b5132 10380
2482f306
AM
10381 if (vma >= (seg->p_vaddr & -seg->p_align)
10382 && vma < seg->p_vaddr + seg->p_filesz)
10383 {
10384 /* Since we do not know how big the symbol table is,
10385 we default to reading in up to the end of PT_LOAD
10386 segment and processing that. This is overkill, I
10387 know, but it should work. */
10388 Elf_Internal_Shdr section;
10389 section.sh_offset = (vma - seg->p_vaddr
10390 + seg->p_offset);
10391 section.sh_size = (num_of_syms
10392 * filedata->dynamic_info[DT_SYMENT]);
10393 section.sh_entsize = filedata->dynamic_info[DT_SYMENT];
8ac10c5b
L
10394
10395 if (do_checks
10396 && filedata->dynamic_symtab_section != NULL
10397 && ((filedata->dynamic_symtab_section->sh_offset
10398 != section.sh_offset)
10399 || (filedata->dynamic_symtab_section->sh_size
10400 != section.sh_size)
10401 || (filedata->dynamic_symtab_section->sh_entsize
10402 != section.sh_entsize)))
10403 warn (_("\
10404the .dynsym section doesn't match the DT_SYMTAB and DT_SYMENT tags\n"));
10405
2482f306
AM
10406 section.sh_name = filedata->string_table_length;
10407 filedata->dynamic_symbols
10408 = GET_ELF_SYMBOLS (filedata, &section,
10409 &filedata->num_dynamic_syms);
10410 if (filedata->dynamic_symbols == NULL
10411 || filedata->num_dynamic_syms != num_of_syms)
10412 {
10413 error (_("Corrupt DT_SYMTAB dynamic entry\n"));
10414 return FALSE;
10415 }
10416 break;
10417 }
10418 }
10419 }
10420 }
252b5132
RH
10421
10422 /* Similarly find a string table. */
978c4450
AM
10423 if (filedata->dynamic_strings == NULL)
10424 for (entry = filedata->dynamic_section;
10425 entry < filedata->dynamic_section + filedata->dynamic_nent;
10ca4b04
L
10426 ++entry)
10427 {
10428 if (entry->d_tag == DT_STRTAB)
978c4450 10429 filedata->dynamic_info[DT_STRTAB] = entry->d_un.d_val;
252b5132 10430
10ca4b04 10431 if (entry->d_tag == DT_STRSZ)
978c4450 10432 filedata->dynamic_info[DT_STRSZ] = entry->d_un.d_val;
252b5132 10433
978c4450
AM
10434 if (filedata->dynamic_info[DT_STRTAB]
10435 && filedata->dynamic_info[DT_STRSZ])
10ca4b04
L
10436 {
10437 unsigned long offset;
978c4450 10438 bfd_size_type str_tab_len = filedata->dynamic_info[DT_STRSZ];
10ca4b04
L
10439
10440 offset = offset_from_vma (filedata,
978c4450 10441 filedata->dynamic_info[DT_STRTAB],
10ca4b04 10442 str_tab_len);
8ac10c5b
L
10443 if (do_checks
10444 && filedata->dynamic_strtab_section
10445 && ((filedata->dynamic_strtab_section->sh_offset
10446 != (file_ptr) offset)
10447 || (filedata->dynamic_strtab_section->sh_size
10448 != str_tab_len)))
10449 warn (_("\
10450the .dynstr section doesn't match the DT_STRTAB and DT_STRSZ tags\n"));
10451
978c4450
AM
10452 filedata->dynamic_strings
10453 = (char *) get_data (NULL, filedata, offset, 1, str_tab_len,
10454 _("dynamic string table"));
10455 if (filedata->dynamic_strings == NULL)
10ca4b04
L
10456 {
10457 error (_("Corrupt DT_STRTAB dynamic entry\n"));
10458 break;
10459 }
e3d39609 10460
978c4450 10461 filedata->dynamic_strings_length = str_tab_len;
10ca4b04
L
10462 break;
10463 }
10464 }
252b5132
RH
10465
10466 /* And find the syminfo section if available. */
978c4450 10467 if (filedata->dynamic_syminfo == NULL)
252b5132 10468 {
3e8bba36 10469 unsigned long syminsz = 0;
252b5132 10470
978c4450
AM
10471 for (entry = filedata->dynamic_section;
10472 entry < filedata->dynamic_section + filedata->dynamic_nent;
86dba8ee 10473 ++entry)
252b5132
RH
10474 {
10475 if (entry->d_tag == DT_SYMINENT)
10476 {
10477 /* Note: these braces are necessary to avoid a syntax
10478 error from the SunOS4 C compiler. */
049b0c3a
NC
10479 /* PR binutils/17531: A corrupt file can trigger this test.
10480 So do not use an assert, instead generate an error message. */
10481 if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
071436c6 10482 error (_("Bad value (%d) for SYMINENT entry\n"),
049b0c3a 10483 (int) entry->d_un.d_val);
252b5132
RH
10484 }
10485 else if (entry->d_tag == DT_SYMINSZ)
10486 syminsz = entry->d_un.d_val;
10487 else if (entry->d_tag == DT_SYMINFO)
978c4450
AM
10488 filedata->dynamic_syminfo_offset
10489 = offset_from_vma (filedata, entry->d_un.d_val, syminsz);
252b5132
RH
10490 }
10491
978c4450 10492 if (filedata->dynamic_syminfo_offset != 0 && syminsz != 0)
252b5132 10493 {
2cf0635d
NC
10494 Elf_External_Syminfo * extsyminfo;
10495 Elf_External_Syminfo * extsym;
10496 Elf_Internal_Syminfo * syminfo;
252b5132
RH
10497
10498 /* There is a syminfo section. Read the data. */
3f5e193b 10499 extsyminfo = (Elf_External_Syminfo *)
978c4450
AM
10500 get_data (NULL, filedata, filedata->dynamic_syminfo_offset,
10501 1, syminsz, _("symbol information"));
a6e9f9df 10502 if (!extsyminfo)
32ec8896 10503 return FALSE;
252b5132 10504
978c4450 10505 if (filedata->dynamic_syminfo != NULL)
e3d39609
NC
10506 {
10507 error (_("Multiple dynamic symbol information sections found\n"));
978c4450 10508 free (filedata->dynamic_syminfo);
e3d39609 10509 }
978c4450
AM
10510 filedata->dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
10511 if (filedata->dynamic_syminfo == NULL)
252b5132 10512 {
2482f306
AM
10513 error (_("Out of memory allocating %lu bytes "
10514 "for dynamic symbol info\n"),
8b73c356 10515 (unsigned long) syminsz);
32ec8896 10516 return FALSE;
252b5132
RH
10517 }
10518
2482f306
AM
10519 filedata->dynamic_syminfo_nent
10520 = syminsz / sizeof (Elf_External_Syminfo);
978c4450 10521 for (syminfo = filedata->dynamic_syminfo, extsym = extsyminfo;
2482f306
AM
10522 syminfo < (filedata->dynamic_syminfo
10523 + filedata->dynamic_syminfo_nent);
86dba8ee 10524 ++syminfo, ++extsym)
252b5132 10525 {
86dba8ee
AM
10526 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
10527 syminfo->si_flags = BYTE_GET (extsym->si_flags);
252b5132
RH
10528 }
10529
10530 free (extsyminfo);
10531 }
10532 }
10533
978c4450 10534 if (do_dynamic && filedata->dynamic_addr)
d3a49aa8
AM
10535 printf (ngettext ("\nDynamic section at offset 0x%lx "
10536 "contains %lu entry:\n",
10537 "\nDynamic section at offset 0x%lx "
10538 "contains %lu entries:\n",
978c4450
AM
10539 filedata->dynamic_nent),
10540 filedata->dynamic_addr, (unsigned long) filedata->dynamic_nent);
252b5132
RH
10541 if (do_dynamic)
10542 printf (_(" Tag Type Name/Value\n"));
10543
978c4450
AM
10544 for (entry = filedata->dynamic_section;
10545 entry < filedata->dynamic_section + filedata->dynamic_nent;
86dba8ee 10546 entry++)
252b5132
RH
10547 {
10548 if (do_dynamic)
f7a99963 10549 {
2cf0635d 10550 const char * dtype;
e699b9ff 10551
f7a99963
NC
10552 putchar (' ');
10553 print_vma (entry->d_tag, FULL_HEX);
dda8d76d 10554 dtype = get_dynamic_type (filedata, entry->d_tag);
e699b9ff 10555 printf (" (%s)%*s", dtype,
32ec8896 10556 ((is_32bit_elf ? 27 : 19) - (int) strlen (dtype)), " ");
f7a99963 10557 }
252b5132
RH
10558
10559 switch (entry->d_tag)
10560 {
d1133906
NC
10561 case DT_FLAGS:
10562 if (do_dynamic)
e9e44622 10563 print_dynamic_flags (entry->d_un.d_val);
d1133906 10564 break;
76da6bbe 10565
252b5132
RH
10566 case DT_AUXILIARY:
10567 case DT_FILTER:
019148e4
L
10568 case DT_CONFIG:
10569 case DT_DEPAUDIT:
10570 case DT_AUDIT:
252b5132
RH
10571 if (do_dynamic)
10572 {
019148e4 10573 switch (entry->d_tag)
b34976b6 10574 {
019148e4
L
10575 case DT_AUXILIARY:
10576 printf (_("Auxiliary library"));
10577 break;
10578
10579 case DT_FILTER:
10580 printf (_("Filter library"));
10581 break;
10582
b34976b6 10583 case DT_CONFIG:
019148e4
L
10584 printf (_("Configuration file"));
10585 break;
10586
10587 case DT_DEPAUDIT:
10588 printf (_("Dependency audit library"));
10589 break;
10590
10591 case DT_AUDIT:
10592 printf (_("Audit library"));
10593 break;
10594 }
252b5132 10595
978c4450
AM
10596 if (VALID_DYNAMIC_NAME (filedata, entry->d_un.d_val))
10597 printf (": [%s]\n",
10598 GET_DYNAMIC_NAME (filedata, entry->d_un.d_val));
252b5132 10599 else
f7a99963
NC
10600 {
10601 printf (": ");
10602 print_vma (entry->d_un.d_val, PREFIX_HEX);
10603 putchar ('\n');
10604 }
252b5132
RH
10605 }
10606 break;
10607
dcefbbbd 10608 case DT_FEATURE:
252b5132
RH
10609 if (do_dynamic)
10610 {
10611 printf (_("Flags:"));
86f55779 10612
252b5132
RH
10613 if (entry->d_un.d_val == 0)
10614 printf (_(" None\n"));
10615 else
10616 {
10617 unsigned long int val = entry->d_un.d_val;
86f55779 10618
252b5132
RH
10619 if (val & DTF_1_PARINIT)
10620 {
10621 printf (" PARINIT");
10622 val ^= DTF_1_PARINIT;
10623 }
dcefbbbd
L
10624 if (val & DTF_1_CONFEXP)
10625 {
10626 printf (" CONFEXP");
10627 val ^= DTF_1_CONFEXP;
10628 }
252b5132
RH
10629 if (val != 0)
10630 printf (" %lx", val);
10631 puts ("");
10632 }
10633 }
10634 break;
10635
10636 case DT_POSFLAG_1:
10637 if (do_dynamic)
10638 {
10639 printf (_("Flags:"));
86f55779 10640
252b5132
RH
10641 if (entry->d_un.d_val == 0)
10642 printf (_(" None\n"));
10643 else
10644 {
10645 unsigned long int val = entry->d_un.d_val;
86f55779 10646
252b5132
RH
10647 if (val & DF_P1_LAZYLOAD)
10648 {
10649 printf (" LAZYLOAD");
10650 val ^= DF_P1_LAZYLOAD;
10651 }
10652 if (val & DF_P1_GROUPPERM)
10653 {
10654 printf (" GROUPPERM");
10655 val ^= DF_P1_GROUPPERM;
10656 }
10657 if (val != 0)
10658 printf (" %lx", val);
10659 puts ("");
10660 }
10661 }
10662 break;
10663
10664 case DT_FLAGS_1:
10665 if (do_dynamic)
10666 {
10667 printf (_("Flags:"));
10668 if (entry->d_un.d_val == 0)
10669 printf (_(" None\n"));
10670 else
10671 {
10672 unsigned long int val = entry->d_un.d_val;
86f55779 10673
252b5132
RH
10674 if (val & DF_1_NOW)
10675 {
10676 printf (" NOW");
10677 val ^= DF_1_NOW;
10678 }
10679 if (val & DF_1_GLOBAL)
10680 {
10681 printf (" GLOBAL");
10682 val ^= DF_1_GLOBAL;
10683 }
10684 if (val & DF_1_GROUP)
10685 {
10686 printf (" GROUP");
10687 val ^= DF_1_GROUP;
10688 }
10689 if (val & DF_1_NODELETE)
10690 {
10691 printf (" NODELETE");
10692 val ^= DF_1_NODELETE;
10693 }
10694 if (val & DF_1_LOADFLTR)
10695 {
10696 printf (" LOADFLTR");
10697 val ^= DF_1_LOADFLTR;
10698 }
10699 if (val & DF_1_INITFIRST)
10700 {
10701 printf (" INITFIRST");
10702 val ^= DF_1_INITFIRST;
10703 }
10704 if (val & DF_1_NOOPEN)
10705 {
10706 printf (" NOOPEN");
10707 val ^= DF_1_NOOPEN;
10708 }
10709 if (val & DF_1_ORIGIN)
10710 {
10711 printf (" ORIGIN");
10712 val ^= DF_1_ORIGIN;
10713 }
10714 if (val & DF_1_DIRECT)
10715 {
10716 printf (" DIRECT");
10717 val ^= DF_1_DIRECT;
10718 }
10719 if (val & DF_1_TRANS)
10720 {
10721 printf (" TRANS");
10722 val ^= DF_1_TRANS;
10723 }
10724 if (val & DF_1_INTERPOSE)
10725 {
10726 printf (" INTERPOSE");
10727 val ^= DF_1_INTERPOSE;
10728 }
f7db6139 10729 if (val & DF_1_NODEFLIB)
dcefbbbd 10730 {
f7db6139
L
10731 printf (" NODEFLIB");
10732 val ^= DF_1_NODEFLIB;
dcefbbbd
L
10733 }
10734 if (val & DF_1_NODUMP)
10735 {
10736 printf (" NODUMP");
10737 val ^= DF_1_NODUMP;
10738 }
34b60028 10739 if (val & DF_1_CONFALT)
dcefbbbd 10740 {
34b60028
L
10741 printf (" CONFALT");
10742 val ^= DF_1_CONFALT;
10743 }
10744 if (val & DF_1_ENDFILTEE)
10745 {
10746 printf (" ENDFILTEE");
10747 val ^= DF_1_ENDFILTEE;
10748 }
10749 if (val & DF_1_DISPRELDNE)
10750 {
10751 printf (" DISPRELDNE");
10752 val ^= DF_1_DISPRELDNE;
10753 }
10754 if (val & DF_1_DISPRELPND)
10755 {
10756 printf (" DISPRELPND");
10757 val ^= DF_1_DISPRELPND;
10758 }
10759 if (val & DF_1_NODIRECT)
10760 {
10761 printf (" NODIRECT");
10762 val ^= DF_1_NODIRECT;
10763 }
10764 if (val & DF_1_IGNMULDEF)
10765 {
10766 printf (" IGNMULDEF");
10767 val ^= DF_1_IGNMULDEF;
10768 }
10769 if (val & DF_1_NOKSYMS)
10770 {
10771 printf (" NOKSYMS");
10772 val ^= DF_1_NOKSYMS;
10773 }
10774 if (val & DF_1_NOHDR)
10775 {
10776 printf (" NOHDR");
10777 val ^= DF_1_NOHDR;
10778 }
10779 if (val & DF_1_EDITED)
10780 {
10781 printf (" EDITED");
10782 val ^= DF_1_EDITED;
10783 }
10784 if (val & DF_1_NORELOC)
10785 {
10786 printf (" NORELOC");
10787 val ^= DF_1_NORELOC;
10788 }
10789 if (val & DF_1_SYMINTPOSE)
10790 {
10791 printf (" SYMINTPOSE");
10792 val ^= DF_1_SYMINTPOSE;
10793 }
10794 if (val & DF_1_GLOBAUDIT)
10795 {
10796 printf (" GLOBAUDIT");
10797 val ^= DF_1_GLOBAUDIT;
10798 }
10799 if (val & DF_1_SINGLETON)
10800 {
10801 printf (" SINGLETON");
10802 val ^= DF_1_SINGLETON;
dcefbbbd 10803 }
5c383f02
RO
10804 if (val & DF_1_STUB)
10805 {
10806 printf (" STUB");
10807 val ^= DF_1_STUB;
10808 }
10809 if (val & DF_1_PIE)
10810 {
10811 printf (" PIE");
10812 val ^= DF_1_PIE;
10813 }
b1202ffa
L
10814 if (val & DF_1_KMOD)
10815 {
10816 printf (" KMOD");
10817 val ^= DF_1_KMOD;
10818 }
10819 if (val & DF_1_WEAKFILTER)
10820 {
10821 printf (" WEAKFILTER");
10822 val ^= DF_1_WEAKFILTER;
10823 }
10824 if (val & DF_1_NOCOMMON)
10825 {
10826 printf (" NOCOMMON");
10827 val ^= DF_1_NOCOMMON;
10828 }
252b5132
RH
10829 if (val != 0)
10830 printf (" %lx", val);
10831 puts ("");
10832 }
10833 }
10834 break;
10835
10836 case DT_PLTREL:
978c4450 10837 filedata->dynamic_info[entry->d_tag] = entry->d_un.d_val;
252b5132 10838 if (do_dynamic)
dda8d76d 10839 puts (get_dynamic_type (filedata, entry->d_un.d_val));
252b5132
RH
10840 break;
10841
10842 case DT_NULL :
10843 case DT_NEEDED :
10844 case DT_PLTGOT :
10845 case DT_HASH :
10846 case DT_STRTAB :
10847 case DT_SYMTAB :
10848 case DT_RELA :
10849 case DT_INIT :
10850 case DT_FINI :
10851 case DT_SONAME :
10852 case DT_RPATH :
10853 case DT_SYMBOLIC:
10854 case DT_REL :
10855 case DT_DEBUG :
10856 case DT_TEXTREL :
10857 case DT_JMPREL :
019148e4 10858 case DT_RUNPATH :
978c4450 10859 filedata->dynamic_info[entry->d_tag] = entry->d_un.d_val;
252b5132
RH
10860
10861 if (do_dynamic)
10862 {
2cf0635d 10863 char * name;
252b5132 10864
978c4450
AM
10865 if (VALID_DYNAMIC_NAME (filedata, entry->d_un.d_val))
10866 name = GET_DYNAMIC_NAME (filedata, entry->d_un.d_val);
252b5132 10867 else
d79b3d50 10868 name = NULL;
252b5132
RH
10869
10870 if (name)
10871 {
10872 switch (entry->d_tag)
10873 {
10874 case DT_NEEDED:
10875 printf (_("Shared library: [%s]"), name);
10876
978c4450 10877 if (streq (name, filedata->program_interpreter))
f7a99963 10878 printf (_(" program interpreter"));
252b5132
RH
10879 break;
10880
10881 case DT_SONAME:
f7a99963 10882 printf (_("Library soname: [%s]"), name);
252b5132
RH
10883 break;
10884
10885 case DT_RPATH:
f7a99963 10886 printf (_("Library rpath: [%s]"), name);
252b5132
RH
10887 break;
10888
019148e4
L
10889 case DT_RUNPATH:
10890 printf (_("Library runpath: [%s]"), name);
10891 break;
10892
252b5132 10893 default:
f7a99963
NC
10894 print_vma (entry->d_un.d_val, PREFIX_HEX);
10895 break;
252b5132
RH
10896 }
10897 }
10898 else
f7a99963
NC
10899 print_vma (entry->d_un.d_val, PREFIX_HEX);
10900
10901 putchar ('\n');
252b5132
RH
10902 }
10903 break;
10904
10905 case DT_PLTRELSZ:
10906 case DT_RELASZ :
10907 case DT_STRSZ :
10908 case DT_RELSZ :
10909 case DT_RELAENT :
10910 case DT_SYMENT :
10911 case DT_RELENT :
978c4450 10912 filedata->dynamic_info[entry->d_tag] = entry->d_un.d_val;
1a0670f3 10913 /* Fall through. */
252b5132
RH
10914 case DT_PLTPADSZ:
10915 case DT_MOVEENT :
10916 case DT_MOVESZ :
10917 case DT_INIT_ARRAYSZ:
10918 case DT_FINI_ARRAYSZ:
047b2264
JJ
10919 case DT_GNU_CONFLICTSZ:
10920 case DT_GNU_LIBLISTSZ:
252b5132 10921 if (do_dynamic)
f7a99963
NC
10922 {
10923 print_vma (entry->d_un.d_val, UNSIGNED);
2b692964 10924 printf (_(" (bytes)\n"));
f7a99963 10925 }
252b5132
RH
10926 break;
10927
10928 case DT_VERDEFNUM:
10929 case DT_VERNEEDNUM:
10930 case DT_RELACOUNT:
10931 case DT_RELCOUNT:
10932 if (do_dynamic)
f7a99963
NC
10933 {
10934 print_vma (entry->d_un.d_val, UNSIGNED);
10935 putchar ('\n');
10936 }
252b5132
RH
10937 break;
10938
10939 case DT_SYMINSZ:
10940 case DT_SYMINENT:
10941 case DT_SYMINFO:
10942 case DT_USED:
10943 case DT_INIT_ARRAY:
10944 case DT_FINI_ARRAY:
10945 if (do_dynamic)
10946 {
d79b3d50 10947 if (entry->d_tag == DT_USED
978c4450 10948 && VALID_DYNAMIC_NAME (filedata, entry->d_un.d_val))
252b5132 10949 {
978c4450 10950 char * name = GET_DYNAMIC_NAME (filedata, entry->d_un.d_val);
252b5132 10951
b34976b6 10952 if (*name)
252b5132
RH
10953 {
10954 printf (_("Not needed object: [%s]\n"), name);
10955 break;
10956 }
10957 }
103f02d3 10958
f7a99963
NC
10959 print_vma (entry->d_un.d_val, PREFIX_HEX);
10960 putchar ('\n');
252b5132
RH
10961 }
10962 break;
10963
10964 case DT_BIND_NOW:
10965 /* The value of this entry is ignored. */
35b1837e
AM
10966 if (do_dynamic)
10967 putchar ('\n');
252b5132 10968 break;
103f02d3 10969
047b2264
JJ
10970 case DT_GNU_PRELINKED:
10971 if (do_dynamic)
10972 {
2cf0635d 10973 struct tm * tmp;
91d6fa6a 10974 time_t atime = entry->d_un.d_val;
047b2264 10975
91d6fa6a 10976 tmp = gmtime (&atime);
071436c6
NC
10977 /* PR 17533 file: 041-1244816-0.004. */
10978 if (tmp == NULL)
5a2cbcf4
L
10979 printf (_("<corrupt time val: %lx"),
10980 (unsigned long) atime);
071436c6
NC
10981 else
10982 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
10983 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
10984 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
047b2264
JJ
10985
10986 }
10987 break;
10988
fdc90cb4 10989 case DT_GNU_HASH:
978c4450 10990 filedata->dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
fdc90cb4
JJ
10991 if (do_dynamic)
10992 {
10993 print_vma (entry->d_un.d_val, PREFIX_HEX);
10994 putchar ('\n');
10995 }
10996 break;
10997
252b5132
RH
10998 default:
10999 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
978c4450
AM
11000 filedata->version_info[DT_VERSIONTAGIDX (entry->d_tag)]
11001 = entry->d_un.d_val;
252b5132
RH
11002
11003 if (do_dynamic)
11004 {
dda8d76d 11005 switch (filedata->file_header.e_machine)
252b5132 11006 {
37c18eed
SD
11007 case EM_AARCH64:
11008 dynamic_section_aarch64_val (entry);
11009 break;
252b5132 11010 case EM_MIPS:
4fe85591 11011 case EM_MIPS_RS3_LE:
978c4450 11012 dynamic_section_mips_val (filedata, entry);
252b5132 11013 break;
103f02d3 11014 case EM_PARISC:
b2d38a17 11015 dynamic_section_parisc_val (entry);
103f02d3 11016 break;
ecc51f48 11017 case EM_IA_64:
b2d38a17 11018 dynamic_section_ia64_val (entry);
ecc51f48 11019 break;
252b5132 11020 default:
f7a99963
NC
11021 print_vma (entry->d_un.d_val, PREFIX_HEX);
11022 putchar ('\n');
252b5132
RH
11023 }
11024 }
11025 break;
11026 }
11027 }
11028
32ec8896 11029 return TRUE;
252b5132
RH
11030}
11031
11032static char *
d3ba0551 11033get_ver_flags (unsigned int flags)
252b5132 11034{
6d4f21f6 11035 static char buff[128];
252b5132
RH
11036
11037 buff[0] = 0;
11038
11039 if (flags == 0)
11040 return _("none");
11041
11042 if (flags & VER_FLG_BASE)
7bb1ad17 11043 strcat (buff, "BASE");
252b5132
RH
11044
11045 if (flags & VER_FLG_WEAK)
11046 {
11047 if (flags & VER_FLG_BASE)
7bb1ad17 11048 strcat (buff, " | ");
252b5132 11049
7bb1ad17 11050 strcat (buff, "WEAK");
252b5132
RH
11051 }
11052
44ec90b9
RO
11053 if (flags & VER_FLG_INFO)
11054 {
11055 if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
7bb1ad17 11056 strcat (buff, " | ");
44ec90b9 11057
7bb1ad17 11058 strcat (buff, "INFO");
44ec90b9
RO
11059 }
11060
11061 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
7bb1ad17
MR
11062 {
11063 if (flags & (VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
11064 strcat (buff, " | ");
11065
11066 strcat (buff, _("<unknown>"));
11067 }
252b5132
RH
11068
11069 return buff;
11070}
11071
11072/* Display the contents of the version sections. */
98fb390a 11073
32ec8896 11074static bfd_boolean
dda8d76d 11075process_version_sections (Filedata * filedata)
252b5132 11076{
2cf0635d 11077 Elf_Internal_Shdr * section;
b34976b6 11078 unsigned i;
32ec8896 11079 bfd_boolean found = FALSE;
252b5132
RH
11080
11081 if (! do_version)
32ec8896 11082 return TRUE;
252b5132 11083
dda8d76d
NC
11084 for (i = 0, section = filedata->section_headers;
11085 i < filedata->file_header.e_shnum;
b34976b6 11086 i++, section++)
252b5132
RH
11087 {
11088 switch (section->sh_type)
11089 {
11090 case SHT_GNU_verdef:
11091 {
2cf0635d 11092 Elf_External_Verdef * edefs;
452bf675
AM
11093 unsigned long idx;
11094 unsigned long cnt;
2cf0635d 11095 char * endbuf;
252b5132 11096
32ec8896 11097 found = TRUE;
252b5132 11098
d3a49aa8
AM
11099 printf (ngettext ("\nVersion definition section '%s' "
11100 "contains %u entry:\n",
11101 "\nVersion definition section '%s' "
11102 "contains %u entries:\n",
11103 section->sh_info),
dda8d76d 11104 printable_section_name (filedata, section),
74e1a04b 11105 section->sh_info);
252b5132 11106
ae9ac79e 11107 printf (_(" Addr: 0x"));
252b5132 11108 printf_vma (section->sh_addr);
233f82cf 11109 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
1b228002 11110 (unsigned long) section->sh_offset, section->sh_link,
dda8d76d 11111 printable_section_name_from_index (filedata, section->sh_link));
252b5132 11112
3f5e193b 11113 edefs = (Elf_External_Verdef *)
dda8d76d 11114 get_data (NULL, filedata, section->sh_offset, 1,section->sh_size,
3f5e193b 11115 _("version definition section"));
a6e9f9df
AM
11116 if (!edefs)
11117 break;
59245841 11118 endbuf = (char *) edefs + section->sh_size;
252b5132 11119
1445030f 11120 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
252b5132 11121 {
2cf0635d
NC
11122 char * vstart;
11123 Elf_External_Verdef * edef;
b34976b6 11124 Elf_Internal_Verdef ent;
2cf0635d 11125 Elf_External_Verdaux * eaux;
b34976b6 11126 Elf_Internal_Verdaux aux;
452bf675 11127 unsigned long isum;
b34976b6 11128 int j;
103f02d3 11129
252b5132 11130 vstart = ((char *) edefs) + idx;
54806181
AM
11131 if (vstart + sizeof (*edef) > endbuf)
11132 break;
252b5132
RH
11133
11134 edef = (Elf_External_Verdef *) vstart;
11135
11136 ent.vd_version = BYTE_GET (edef->vd_version);
11137 ent.vd_flags = BYTE_GET (edef->vd_flags);
11138 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
11139 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
11140 ent.vd_hash = BYTE_GET (edef->vd_hash);
11141 ent.vd_aux = BYTE_GET (edef->vd_aux);
11142 ent.vd_next = BYTE_GET (edef->vd_next);
11143
452bf675 11144 printf (_(" %#06lx: Rev: %d Flags: %s"),
252b5132
RH
11145 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
11146
11147 printf (_(" Index: %d Cnt: %d "),
11148 ent.vd_ndx, ent.vd_cnt);
11149
452bf675 11150 /* Check for overflow. */
1445030f 11151 if (ent.vd_aux > (size_t) (endbuf - vstart))
dd24e3da
NC
11152 break;
11153
252b5132
RH
11154 vstart += ent.vd_aux;
11155
1445030f
AM
11156 if (vstart + sizeof (*eaux) > endbuf)
11157 break;
252b5132
RH
11158 eaux = (Elf_External_Verdaux *) vstart;
11159
11160 aux.vda_name = BYTE_GET (eaux->vda_name);
11161 aux.vda_next = BYTE_GET (eaux->vda_next);
11162
978c4450
AM
11163 if (VALID_DYNAMIC_NAME (filedata, aux.vda_name))
11164 printf (_("Name: %s\n"),
11165 GET_DYNAMIC_NAME (filedata, aux.vda_name));
252b5132
RH
11166 else
11167 printf (_("Name index: %ld\n"), aux.vda_name);
11168
11169 isum = idx + ent.vd_aux;
11170
b34976b6 11171 for (j = 1; j < ent.vd_cnt; j++)
252b5132 11172 {
1445030f
AM
11173 if (aux.vda_next < sizeof (*eaux)
11174 && !(j == ent.vd_cnt - 1 && aux.vda_next == 0))
11175 {
11176 warn (_("Invalid vda_next field of %lx\n"),
11177 aux.vda_next);
11178 j = ent.vd_cnt;
11179 break;
11180 }
dd24e3da 11181 /* Check for overflow. */
7e26601c 11182 if (aux.vda_next > (size_t) (endbuf - vstart))
dd24e3da
NC
11183 break;
11184
252b5132
RH
11185 isum += aux.vda_next;
11186 vstart += aux.vda_next;
11187
54806181
AM
11188 if (vstart + sizeof (*eaux) > endbuf)
11189 break;
1445030f 11190 eaux = (Elf_External_Verdaux *) vstart;
252b5132
RH
11191
11192 aux.vda_name = BYTE_GET (eaux->vda_name);
11193 aux.vda_next = BYTE_GET (eaux->vda_next);
11194
978c4450 11195 if (VALID_DYNAMIC_NAME (filedata, aux.vda_name))
452bf675 11196 printf (_(" %#06lx: Parent %d: %s\n"),
978c4450
AM
11197 isum, j,
11198 GET_DYNAMIC_NAME (filedata, aux.vda_name));
252b5132 11199 else
452bf675 11200 printf (_(" %#06lx: Parent %d, name index: %ld\n"),
252b5132
RH
11201 isum, j, aux.vda_name);
11202 }
dd24e3da 11203
54806181
AM
11204 if (j < ent.vd_cnt)
11205 printf (_(" Version def aux past end of section\n"));
252b5132 11206
c9f02c3e
MR
11207 /* PR 17531:
11208 file: id:000001,src:000172+005151,op:splice,rep:2. */
1445030f
AM
11209 if (ent.vd_next < sizeof (*edef)
11210 && !(cnt == section->sh_info - 1 && ent.vd_next == 0))
11211 {
11212 warn (_("Invalid vd_next field of %lx\n"), ent.vd_next);
11213 cnt = section->sh_info;
11214 break;
11215 }
452bf675 11216 if (ent.vd_next > (size_t) (endbuf - ((char *) edefs + idx)))
5d921cbd
NC
11217 break;
11218
252b5132
RH
11219 idx += ent.vd_next;
11220 }
dd24e3da 11221
54806181
AM
11222 if (cnt < section->sh_info)
11223 printf (_(" Version definition past end of section\n"));
252b5132
RH
11224
11225 free (edefs);
11226 }
11227 break;
103f02d3 11228
252b5132
RH
11229 case SHT_GNU_verneed:
11230 {
2cf0635d 11231 Elf_External_Verneed * eneed;
452bf675
AM
11232 unsigned long idx;
11233 unsigned long cnt;
2cf0635d 11234 char * endbuf;
252b5132 11235
32ec8896 11236 found = TRUE;
252b5132 11237
d3a49aa8
AM
11238 printf (ngettext ("\nVersion needs section '%s' "
11239 "contains %u entry:\n",
11240 "\nVersion needs section '%s' "
11241 "contains %u entries:\n",
11242 section->sh_info),
dda8d76d 11243 printable_section_name (filedata, section), section->sh_info);
252b5132
RH
11244
11245 printf (_(" Addr: 0x"));
11246 printf_vma (section->sh_addr);
72de5009 11247 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
1b228002 11248 (unsigned long) section->sh_offset, section->sh_link,
dda8d76d 11249 printable_section_name_from_index (filedata, section->sh_link));
252b5132 11250
dda8d76d 11251 eneed = (Elf_External_Verneed *) get_data (NULL, filedata,
3f5e193b
NC
11252 section->sh_offset, 1,
11253 section->sh_size,
9cf03b7e 11254 _("Version Needs section"));
a6e9f9df
AM
11255 if (!eneed)
11256 break;
59245841 11257 endbuf = (char *) eneed + section->sh_size;
252b5132
RH
11258
11259 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
11260 {
2cf0635d 11261 Elf_External_Verneed * entry;
b34976b6 11262 Elf_Internal_Verneed ent;
452bf675 11263 unsigned long isum;
b34976b6 11264 int j;
2cf0635d 11265 char * vstart;
252b5132
RH
11266
11267 vstart = ((char *) eneed) + idx;
54806181
AM
11268 if (vstart + sizeof (*entry) > endbuf)
11269 break;
252b5132
RH
11270
11271 entry = (Elf_External_Verneed *) vstart;
11272
11273 ent.vn_version = BYTE_GET (entry->vn_version);
11274 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
11275 ent.vn_file = BYTE_GET (entry->vn_file);
11276 ent.vn_aux = BYTE_GET (entry->vn_aux);
11277 ent.vn_next = BYTE_GET (entry->vn_next);
11278
452bf675 11279 printf (_(" %#06lx: Version: %d"), idx, ent.vn_version);
252b5132 11280
978c4450
AM
11281 if (VALID_DYNAMIC_NAME (filedata, ent.vn_file))
11282 printf (_(" File: %s"),
11283 GET_DYNAMIC_NAME (filedata, ent.vn_file));
252b5132
RH
11284 else
11285 printf (_(" File: %lx"), ent.vn_file);
11286
11287 printf (_(" Cnt: %d\n"), ent.vn_cnt);
11288
dd24e3da 11289 /* Check for overflow. */
7e26601c 11290 if (ent.vn_aux > (size_t) (endbuf - vstart))
dd24e3da 11291 break;
252b5132
RH
11292 vstart += ent.vn_aux;
11293
11294 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
11295 {
2cf0635d 11296 Elf_External_Vernaux * eaux;
b34976b6 11297 Elf_Internal_Vernaux aux;
252b5132 11298
54806181
AM
11299 if (vstart + sizeof (*eaux) > endbuf)
11300 break;
252b5132
RH
11301 eaux = (Elf_External_Vernaux *) vstart;
11302
11303 aux.vna_hash = BYTE_GET (eaux->vna_hash);
11304 aux.vna_flags = BYTE_GET (eaux->vna_flags);
11305 aux.vna_other = BYTE_GET (eaux->vna_other);
11306 aux.vna_name = BYTE_GET (eaux->vna_name);
11307 aux.vna_next = BYTE_GET (eaux->vna_next);
11308
978c4450 11309 if (VALID_DYNAMIC_NAME (filedata, aux.vna_name))
452bf675 11310 printf (_(" %#06lx: Name: %s"),
978c4450 11311 isum, GET_DYNAMIC_NAME (filedata, aux.vna_name));
252b5132 11312 else
452bf675 11313 printf (_(" %#06lx: Name index: %lx"),
252b5132
RH
11314 isum, aux.vna_name);
11315
11316 printf (_(" Flags: %s Version: %d\n"),
11317 get_ver_flags (aux.vna_flags), aux.vna_other);
11318
1445030f
AM
11319 if (aux.vna_next < sizeof (*eaux)
11320 && !(j == ent.vn_cnt - 1 && aux.vna_next == 0))
53774b7e
NC
11321 {
11322 warn (_("Invalid vna_next field of %lx\n"),
11323 aux.vna_next);
11324 j = ent.vn_cnt;
11325 break;
11326 }
1445030f
AM
11327 /* Check for overflow. */
11328 if (aux.vna_next > (size_t) (endbuf - vstart))
11329 break;
252b5132
RH
11330 isum += aux.vna_next;
11331 vstart += aux.vna_next;
11332 }
9cf03b7e 11333
54806181 11334 if (j < ent.vn_cnt)
9cf03b7e 11335 warn (_("Missing Version Needs auxillary information\n"));
252b5132 11336
1445030f
AM
11337 if (ent.vn_next < sizeof (*entry)
11338 && !(cnt == section->sh_info - 1 && ent.vn_next == 0))
c24cf8b6 11339 {
452bf675 11340 warn (_("Invalid vn_next field of %lx\n"), ent.vn_next);
c24cf8b6
NC
11341 cnt = section->sh_info;
11342 break;
11343 }
1445030f
AM
11344 if (ent.vn_next > (size_t) (endbuf - ((char *) eneed + idx)))
11345 break;
252b5132
RH
11346 idx += ent.vn_next;
11347 }
9cf03b7e 11348
54806181 11349 if (cnt < section->sh_info)
9cf03b7e 11350 warn (_("Missing Version Needs information\n"));
103f02d3 11351
252b5132
RH
11352 free (eneed);
11353 }
11354 break;
11355
11356 case SHT_GNU_versym:
11357 {
2cf0635d 11358 Elf_Internal_Shdr * link_section;
8b73c356
NC
11359 size_t total;
11360 unsigned int cnt;
2cf0635d
NC
11361 unsigned char * edata;
11362 unsigned short * data;
11363 char * strtab;
11364 Elf_Internal_Sym * symbols;
11365 Elf_Internal_Shdr * string_sec;
ba5cdace 11366 unsigned long num_syms;
d3ba0551 11367 long off;
252b5132 11368
dda8d76d 11369 if (section->sh_link >= filedata->file_header.e_shnum)
c256ffe7
JJ
11370 break;
11371
dda8d76d 11372 link_section = filedata->section_headers + section->sh_link;
08d8fa11 11373 total = section->sh_size / sizeof (Elf_External_Versym);
252b5132 11374
dda8d76d 11375 if (link_section->sh_link >= filedata->file_header.e_shnum)
c256ffe7
JJ
11376 break;
11377
32ec8896 11378 found = TRUE;
252b5132 11379
dda8d76d 11380 symbols = GET_ELF_SYMBOLS (filedata, link_section, & num_syms);
dd24e3da
NC
11381 if (symbols == NULL)
11382 break;
252b5132 11383
dda8d76d 11384 string_sec = filedata->section_headers + link_section->sh_link;
252b5132 11385
dda8d76d 11386 strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
3f5e193b
NC
11387 string_sec->sh_size,
11388 _("version string table"));
a6e9f9df 11389 if (!strtab)
0429c154
MS
11390 {
11391 free (symbols);
11392 break;
11393 }
252b5132 11394
d3a49aa8
AM
11395 printf (ngettext ("\nVersion symbols section '%s' "
11396 "contains %lu entry:\n",
11397 "\nVersion symbols section '%s' "
11398 "contains %lu entries:\n",
11399 total),
dda8d76d 11400 printable_section_name (filedata, section), (unsigned long) total);
252b5132 11401
ae9ac79e 11402 printf (_(" Addr: 0x"));
252b5132 11403 printf_vma (section->sh_addr);
72de5009 11404 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
1b228002 11405 (unsigned long) section->sh_offset, section->sh_link,
dda8d76d 11406 printable_section_name (filedata, link_section));
252b5132 11407
dda8d76d 11408 off = offset_from_vma (filedata,
978c4450 11409 filedata->version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
d3ba0551 11410 total * sizeof (short));
95099889
AM
11411 edata = (unsigned char *) get_data (NULL, filedata, off,
11412 sizeof (short), total,
11413 _("version symbol data"));
a6e9f9df
AM
11414 if (!edata)
11415 {
11416 free (strtab);
0429c154 11417 free (symbols);
a6e9f9df
AM
11418 break;
11419 }
252b5132 11420
3f5e193b 11421 data = (short unsigned int *) cmalloc (total, sizeof (short));
252b5132
RH
11422
11423 for (cnt = total; cnt --;)
b34976b6
AM
11424 data[cnt] = byte_get (edata + cnt * sizeof (short),
11425 sizeof (short));
252b5132
RH
11426
11427 free (edata);
11428
11429 for (cnt = 0; cnt < total; cnt += 4)
11430 {
11431 int j, nn;
ab273396
AM
11432 char *name;
11433 char *invalid = _("*invalid*");
252b5132
RH
11434
11435 printf (" %03x:", cnt);
11436
11437 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
b34976b6 11438 switch (data[cnt + j])
252b5132
RH
11439 {
11440 case 0:
11441 fputs (_(" 0 (*local*) "), stdout);
11442 break;
11443
11444 case 1:
11445 fputs (_(" 1 (*global*) "), stdout);
11446 break;
11447
11448 default:
c244d050
NC
11449 nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
11450 data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
252b5132 11451
dd24e3da 11452 /* If this index value is greater than the size of the symbols
ba5cdace
NC
11453 array, break to avoid an out-of-bounds read. */
11454 if ((unsigned long)(cnt + j) >= num_syms)
dd24e3da
NC
11455 {
11456 warn (_("invalid index into symbol array\n"));
11457 break;
11458 }
11459
ab273396 11460 name = NULL;
978c4450 11461 if (filedata->version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
252b5132 11462 {
b34976b6
AM
11463 Elf_Internal_Verneed ivn;
11464 unsigned long offset;
252b5132 11465
d93f0186 11466 offset = offset_from_vma
978c4450
AM
11467 (filedata,
11468 filedata->version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
d93f0186 11469 sizeof (Elf_External_Verneed));
252b5132 11470
b34976b6 11471 do
252b5132 11472 {
b34976b6
AM
11473 Elf_Internal_Vernaux ivna;
11474 Elf_External_Verneed evn;
11475 Elf_External_Vernaux evna;
11476 unsigned long a_off;
252b5132 11477
dda8d76d 11478 if (get_data (&evn, filedata, offset, sizeof (evn), 1,
59245841
NC
11479 _("version need")) == NULL)
11480 break;
0b4362b0 11481
252b5132
RH
11482 ivn.vn_aux = BYTE_GET (evn.vn_aux);
11483 ivn.vn_next = BYTE_GET (evn.vn_next);
11484
11485 a_off = offset + ivn.vn_aux;
11486
11487 do
11488 {
dda8d76d 11489 if (get_data (&evna, filedata, a_off, sizeof (evna),
59245841
NC
11490 1, _("version need aux (2)")) == NULL)
11491 {
11492 ivna.vna_next = 0;
11493 ivna.vna_other = 0;
11494 }
11495 else
11496 {
11497 ivna.vna_next = BYTE_GET (evna.vna_next);
11498 ivna.vna_other = BYTE_GET (evna.vna_other);
11499 }
252b5132
RH
11500
11501 a_off += ivna.vna_next;
11502 }
b34976b6 11503 while (ivna.vna_other != data[cnt + j]
252b5132
RH
11504 && ivna.vna_next != 0);
11505
b34976b6 11506 if (ivna.vna_other == data[cnt + j])
252b5132
RH
11507 {
11508 ivna.vna_name = BYTE_GET (evna.vna_name);
11509
54806181 11510 if (ivna.vna_name >= string_sec->sh_size)
ab273396 11511 name = invalid;
54806181
AM
11512 else
11513 name = strtab + ivna.vna_name;
252b5132
RH
11514 break;
11515 }
11516
11517 offset += ivn.vn_next;
11518 }
11519 while (ivn.vn_next);
11520 }
00d93f34 11521
ab273396 11522 if (data[cnt + j] != 0x8001
978c4450 11523 && filedata->version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
252b5132 11524 {
b34976b6
AM
11525 Elf_Internal_Verdef ivd;
11526 Elf_External_Verdef evd;
11527 unsigned long offset;
252b5132 11528
d93f0186 11529 offset = offset_from_vma
978c4450
AM
11530 (filedata,
11531 filedata->version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
d93f0186 11532 sizeof evd);
252b5132
RH
11533
11534 do
11535 {
dda8d76d 11536 if (get_data (&evd, filedata, offset, sizeof (evd), 1,
59245841
NC
11537 _("version def")) == NULL)
11538 {
11539 ivd.vd_next = 0;
948f632f 11540 /* PR 17531: file: 046-1082287-0.004. */
3102e897
NC
11541 ivd.vd_ndx = (data[cnt + j] & VERSYM_VERSION) + 1;
11542 break;
59245841
NC
11543 }
11544 else
11545 {
11546 ivd.vd_next = BYTE_GET (evd.vd_next);
11547 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
11548 }
252b5132
RH
11549
11550 offset += ivd.vd_next;
11551 }
c244d050 11552 while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
252b5132
RH
11553 && ivd.vd_next != 0);
11554
c244d050 11555 if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
252b5132 11556 {
b34976b6
AM
11557 Elf_External_Verdaux evda;
11558 Elf_Internal_Verdaux ivda;
252b5132
RH
11559
11560 ivd.vd_aux = BYTE_GET (evd.vd_aux);
11561
dda8d76d 11562 if (get_data (&evda, filedata,
59245841
NC
11563 offset - ivd.vd_next + ivd.vd_aux,
11564 sizeof (evda), 1,
11565 _("version def aux")) == NULL)
11566 break;
252b5132
RH
11567
11568 ivda.vda_name = BYTE_GET (evda.vda_name);
11569
54806181 11570 if (ivda.vda_name >= string_sec->sh_size)
ab273396
AM
11571 name = invalid;
11572 else if (name != NULL && name != invalid)
11573 name = _("*both*");
54806181
AM
11574 else
11575 name = strtab + ivda.vda_name;
252b5132
RH
11576 }
11577 }
ab273396
AM
11578 if (name != NULL)
11579 nn += printf ("(%s%-*s",
11580 name,
11581 12 - (int) strlen (name),
11582 ")");
252b5132
RH
11583
11584 if (nn < 18)
11585 printf ("%*c", 18 - nn, ' ');
11586 }
11587
11588 putchar ('\n');
11589 }
11590
11591 free (data);
11592 free (strtab);
11593 free (symbols);
11594 }
11595 break;
103f02d3 11596
252b5132
RH
11597 default:
11598 break;
11599 }
11600 }
11601
11602 if (! found)
11603 printf (_("\nNo version information found in this file.\n"));
11604
32ec8896 11605 return TRUE;
252b5132
RH
11606}
11607
d1133906 11608static const char *
dda8d76d 11609get_symbol_binding (Filedata * filedata, unsigned int binding)
252b5132 11610{
89246a0e 11611 static char buff[64];
252b5132
RH
11612
11613 switch (binding)
11614 {
b34976b6
AM
11615 case STB_LOCAL: return "LOCAL";
11616 case STB_GLOBAL: return "GLOBAL";
11617 case STB_WEAK: return "WEAK";
252b5132
RH
11618 default:
11619 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
e9e44622
JJ
11620 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
11621 binding);
252b5132 11622 else if (binding >= STB_LOOS && binding <= STB_HIOS)
3e7a7d11
NC
11623 {
11624 if (binding == STB_GNU_UNIQUE
df3a023b 11625 && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU)
3e7a7d11
NC
11626 return "UNIQUE";
11627 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
11628 }
252b5132 11629 else
e9e44622 11630 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
252b5132
RH
11631 return buff;
11632 }
11633}
11634
d1133906 11635static const char *
dda8d76d 11636get_symbol_type (Filedata * filedata, unsigned int type)
252b5132 11637{
89246a0e 11638 static char buff[64];
252b5132
RH
11639
11640 switch (type)
11641 {
b34976b6
AM
11642 case STT_NOTYPE: return "NOTYPE";
11643 case STT_OBJECT: return "OBJECT";
11644 case STT_FUNC: return "FUNC";
11645 case STT_SECTION: return "SECTION";
11646 case STT_FILE: return "FILE";
11647 case STT_COMMON: return "COMMON";
11648 case STT_TLS: return "TLS";
15ab5209
DB
11649 case STT_RELC: return "RELC";
11650 case STT_SRELC: return "SRELC";
252b5132
RH
11651 default:
11652 if (type >= STT_LOPROC && type <= STT_HIPROC)
df75f1af 11653 {
dda8d76d 11654 if (filedata->file_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
3510a7b8 11655 return "THUMB_FUNC";
103f02d3 11656
dda8d76d 11657 if (filedata->file_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
103f02d3
UD
11658 return "REGISTER";
11659
dda8d76d 11660 if (filedata->file_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
103f02d3
UD
11661 return "PARISC_MILLI";
11662
e9e44622 11663 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
df75f1af 11664 }
252b5132 11665 else if (type >= STT_LOOS && type <= STT_HIOS)
103f02d3 11666 {
dda8d76d 11667 if (filedata->file_header.e_machine == EM_PARISC)
103f02d3
UD
11668 {
11669 if (type == STT_HP_OPAQUE)
11670 return "HP_OPAQUE";
11671 if (type == STT_HP_STUB)
11672 return "HP_STUB";
11673 }
11674
d8045f23 11675 if (type == STT_GNU_IFUNC
dda8d76d 11676 && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
df3a023b 11677 || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD))
d8045f23
NC
11678 return "IFUNC";
11679
e9e44622 11680 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
103f02d3 11681 }
252b5132 11682 else
e9e44622 11683 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
252b5132
RH
11684 return buff;
11685 }
11686}
11687
d1133906 11688static const char *
d3ba0551 11689get_symbol_visibility (unsigned int visibility)
d1133906
NC
11690{
11691 switch (visibility)
11692 {
b34976b6
AM
11693 case STV_DEFAULT: return "DEFAULT";
11694 case STV_INTERNAL: return "INTERNAL";
11695 case STV_HIDDEN: return "HIDDEN";
d1133906 11696 case STV_PROTECTED: return "PROTECTED";
bee0ee85 11697 default:
27a45f42 11698 error (_("Unrecognized visibility value: %u\n"), visibility);
bee0ee85 11699 return _("<unknown>");
d1133906
NC
11700 }
11701}
11702
2057d69d
CZ
11703static const char *
11704get_alpha_symbol_other (unsigned int other)
9abca702 11705{
2057d69d
CZ
11706 switch (other)
11707 {
11708 case STO_ALPHA_NOPV: return "NOPV";
11709 case STO_ALPHA_STD_GPLOAD: return "STD GPLOAD";
11710 default:
27a45f42 11711 error (_("Unrecognized alpha specific other value: %u\n"), other);
2057d69d 11712 return _("<unknown>");
9abca702 11713 }
2057d69d
CZ
11714}
11715
fd85a6a1
NC
11716static const char *
11717get_solaris_symbol_visibility (unsigned int visibility)
11718{
11719 switch (visibility)
11720 {
11721 case 4: return "EXPORTED";
11722 case 5: return "SINGLETON";
11723 case 6: return "ELIMINATE";
11724 default: return get_symbol_visibility (visibility);
11725 }
11726}
11727
2301ed1c
SN
11728static const char *
11729get_aarch64_symbol_other (unsigned int other)
11730{
11731 static char buf[32];
11732
11733 if (other & STO_AARCH64_VARIANT_PCS)
11734 {
11735 other &= ~STO_AARCH64_VARIANT_PCS;
11736 if (other == 0)
11737 return "VARIANT_PCS";
11738 snprintf (buf, sizeof buf, "VARIANT_PCS | %x", other);
11739 return buf;
11740 }
11741 return NULL;
11742}
11743
5e2b0d47
NC
11744static const char *
11745get_mips_symbol_other (unsigned int other)
11746{
11747 switch (other)
11748 {
32ec8896
NC
11749 case STO_OPTIONAL: return "OPTIONAL";
11750 case STO_MIPS_PLT: return "MIPS PLT";
11751 case STO_MIPS_PIC: return "MIPS PIC";
11752 case STO_MICROMIPS: return "MICROMIPS";
11753 case STO_MICROMIPS | STO_MIPS_PIC: return "MICROMIPS, MIPS PIC";
11754 case STO_MIPS16: return "MIPS16";
11755 default: return NULL;
5e2b0d47
NC
11756 }
11757}
11758
28f997cf 11759static const char *
dda8d76d 11760get_ia64_symbol_other (Filedata * filedata, unsigned int other)
28f997cf 11761{
dda8d76d 11762 if (is_ia64_vms (filedata))
28f997cf
TG
11763 {
11764 static char res[32];
11765
11766 res[0] = 0;
11767
11768 /* Function types is for images and .STB files only. */
dda8d76d 11769 switch (filedata->file_header.e_type)
28f997cf
TG
11770 {
11771 case ET_DYN:
11772 case ET_EXEC:
11773 switch (VMS_ST_FUNC_TYPE (other))
11774 {
11775 case VMS_SFT_CODE_ADDR:
11776 strcat (res, " CA");
11777 break;
11778 case VMS_SFT_SYMV_IDX:
11779 strcat (res, " VEC");
11780 break;
11781 case VMS_SFT_FD:
11782 strcat (res, " FD");
11783 break;
11784 case VMS_SFT_RESERVE:
11785 strcat (res, " RSV");
11786 break;
11787 default:
bee0ee85
NC
11788 warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
11789 VMS_ST_FUNC_TYPE (other));
11790 strcat (res, " <unknown>");
11791 break;
28f997cf
TG
11792 }
11793 break;
11794 default:
11795 break;
11796 }
11797 switch (VMS_ST_LINKAGE (other))
11798 {
11799 case VMS_STL_IGNORE:
11800 strcat (res, " IGN");
11801 break;
11802 case VMS_STL_RESERVE:
11803 strcat (res, " RSV");
11804 break;
11805 case VMS_STL_STD:
11806 strcat (res, " STD");
11807 break;
11808 case VMS_STL_LNK:
11809 strcat (res, " LNK");
11810 break;
11811 default:
bee0ee85
NC
11812 warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
11813 VMS_ST_LINKAGE (other));
11814 strcat (res, " <unknown>");
11815 break;
28f997cf
TG
11816 }
11817
11818 if (res[0] != 0)
11819 return res + 1;
11820 else
11821 return res;
11822 }
11823 return NULL;
11824}
11825
6911b7dc
AM
11826static const char *
11827get_ppc64_symbol_other (unsigned int other)
11828{
14732552
AM
11829 if ((other & ~STO_PPC64_LOCAL_MASK) != 0)
11830 return NULL;
11831
11832 other >>= STO_PPC64_LOCAL_BIT;
11833 if (other <= 6)
6911b7dc 11834 {
89246a0e 11835 static char buf[64];
14732552
AM
11836 if (other >= 2)
11837 other = ppc64_decode_local_entry (other);
11838 snprintf (buf, sizeof buf, _("<localentry>: %d"), other);
6911b7dc
AM
11839 return buf;
11840 }
11841 return NULL;
11842}
11843
5e2b0d47 11844static const char *
dda8d76d 11845get_symbol_other (Filedata * filedata, unsigned int other)
5e2b0d47
NC
11846{
11847 const char * result = NULL;
89246a0e 11848 static char buff [64];
5e2b0d47
NC
11849
11850 if (other == 0)
11851 return "";
11852
dda8d76d 11853 switch (filedata->file_header.e_machine)
5e2b0d47 11854 {
2057d69d
CZ
11855 case EM_ALPHA:
11856 result = get_alpha_symbol_other (other);
11857 break;
2301ed1c
SN
11858 case EM_AARCH64:
11859 result = get_aarch64_symbol_other (other);
11860 break;
5e2b0d47
NC
11861 case EM_MIPS:
11862 result = get_mips_symbol_other (other);
28f997cf
TG
11863 break;
11864 case EM_IA_64:
dda8d76d 11865 result = get_ia64_symbol_other (filedata, other);
28f997cf 11866 break;
6911b7dc
AM
11867 case EM_PPC64:
11868 result = get_ppc64_symbol_other (other);
11869 break;
5e2b0d47 11870 default:
fd85a6a1 11871 result = NULL;
5e2b0d47
NC
11872 break;
11873 }
11874
11875 if (result)
11876 return result;
11877
11878 snprintf (buff, sizeof buff, _("<other>: %x"), other);
11879 return buff;
11880}
11881
d1133906 11882static const char *
dda8d76d 11883get_symbol_index_type (Filedata * filedata, unsigned int type)
252b5132 11884{
b34976b6 11885 static char buff[32];
5cf1065c 11886
252b5132
RH
11887 switch (type)
11888 {
b34976b6
AM
11889 case SHN_UNDEF: return "UND";
11890 case SHN_ABS: return "ABS";
11891 case SHN_COMMON: return "COM";
252b5132 11892 default:
9ce701e2 11893 if (type == SHN_IA_64_ANSI_COMMON
10ca4b04
L
11894 && filedata->file_header.e_machine == EM_IA_64
11895 && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
11896 return "ANSI_COM";
11897 else if ((filedata->file_header.e_machine == EM_X86_64
11898 || filedata->file_header.e_machine == EM_L1OM
11899 || filedata->file_header.e_machine == EM_K1OM)
11900 && type == SHN_X86_64_LCOMMON)
11901 return "LARGE_COM";
11902 else if ((type == SHN_MIPS_SCOMMON
11903 && filedata->file_header.e_machine == EM_MIPS)
11904 || (type == SHN_TIC6X_SCOMMON
11905 && filedata->file_header.e_machine == EM_TI_C6000))
11906 return "SCOM";
11907 else if (type == SHN_MIPS_SUNDEFINED
11908 && filedata->file_header.e_machine == EM_MIPS)
11909 return "SUND";
11910 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
11911 sprintf (buff, "PRC[0x%04x]", type & 0xffff);
11912 else if (type >= SHN_LOOS && type <= SHN_HIOS)
11913 sprintf (buff, "OS [0x%04x]", type & 0xffff);
11914 else if (type >= SHN_LORESERVE)
11915 sprintf (buff, "RSV[0x%04x]", type & 0xffff);
11916 else if (filedata->file_header.e_shnum != 0
11917 && type >= filedata->file_header.e_shnum)
11918 sprintf (buff, _("bad section index[%3d]"), type);
11919 else
11920 sprintf (buff, "%3d", type);
11921 break;
fd85a6a1
NC
11922 }
11923
10ca4b04 11924 return buff;
6bd1a22c
L
11925}
11926
bb4d2ac2 11927static const char *
dda8d76d 11928get_symbol_version_string (Filedata * filedata,
1449284b
NC
11929 bfd_boolean is_dynsym,
11930 const char * strtab,
11931 unsigned long int strtab_size,
11932 unsigned int si,
11933 Elf_Internal_Sym * psym,
11934 enum versioned_symbol_info * sym_info,
11935 unsigned short * vna_other)
bb4d2ac2 11936{
ab273396
AM
11937 unsigned char data[2];
11938 unsigned short vers_data;
11939 unsigned long offset;
7a815dd5 11940 unsigned short max_vd_ndx;
bb4d2ac2 11941
ab273396 11942 if (!is_dynsym
978c4450 11943 || filedata->version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
ab273396 11944 return NULL;
bb4d2ac2 11945
978c4450
AM
11946 offset = offset_from_vma (filedata,
11947 filedata->version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
ab273396 11948 sizeof data + si * sizeof (vers_data));
bb4d2ac2 11949
dda8d76d 11950 if (get_data (&data, filedata, offset + si * sizeof (vers_data),
ab273396
AM
11951 sizeof (data), 1, _("version data")) == NULL)
11952 return NULL;
11953
11954 vers_data = byte_get (data, 2);
bb4d2ac2 11955
1f6f5dba 11956 if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data == 0)
ab273396 11957 return NULL;
bb4d2ac2 11958
0b8b7609 11959 *sym_info = (vers_data & VERSYM_HIDDEN) != 0 ? symbol_hidden : symbol_public;
7a815dd5
L
11960 max_vd_ndx = 0;
11961
ab273396
AM
11962 /* Usually we'd only see verdef for defined symbols, and verneed for
11963 undefined symbols. However, symbols defined by the linker in
11964 .dynbss for variables copied from a shared library in order to
11965 avoid text relocations are defined yet have verneed. We could
11966 use a heuristic to detect the special case, for example, check
11967 for verneed first on symbols defined in SHT_NOBITS sections, but
11968 it is simpler and more reliable to just look for both verdef and
11969 verneed. .dynbss might not be mapped to a SHT_NOBITS section. */
bb4d2ac2 11970
ab273396
AM
11971 if (psym->st_shndx != SHN_UNDEF
11972 && vers_data != 0x8001
978c4450 11973 && filedata->version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
ab273396
AM
11974 {
11975 Elf_Internal_Verdef ivd;
11976 Elf_Internal_Verdaux ivda;
11977 Elf_External_Verdaux evda;
11978 unsigned long off;
bb4d2ac2 11979
dda8d76d 11980 off = offset_from_vma (filedata,
978c4450 11981 filedata->version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
ab273396
AM
11982 sizeof (Elf_External_Verdef));
11983
11984 do
bb4d2ac2 11985 {
ab273396
AM
11986 Elf_External_Verdef evd;
11987
dda8d76d 11988 if (get_data (&evd, filedata, off, sizeof (evd), 1,
ab273396
AM
11989 _("version def")) == NULL)
11990 {
11991 ivd.vd_ndx = 0;
11992 ivd.vd_aux = 0;
11993 ivd.vd_next = 0;
1f6f5dba 11994 ivd.vd_flags = 0;
ab273396
AM
11995 }
11996 else
bb4d2ac2 11997 {
ab273396
AM
11998 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
11999 ivd.vd_aux = BYTE_GET (evd.vd_aux);
12000 ivd.vd_next = BYTE_GET (evd.vd_next);
1f6f5dba 12001 ivd.vd_flags = BYTE_GET (evd.vd_flags);
ab273396 12002 }
bb4d2ac2 12003
7a815dd5
L
12004 if ((ivd.vd_ndx & VERSYM_VERSION) > max_vd_ndx)
12005 max_vd_ndx = ivd.vd_ndx & VERSYM_VERSION;
12006
ab273396
AM
12007 off += ivd.vd_next;
12008 }
12009 while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
bb4d2ac2 12010
ab273396
AM
12011 if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
12012 {
9abca702 12013 if (ivd.vd_ndx == 1 && ivd.vd_flags == VER_FLG_BASE)
1f6f5dba
L
12014 return NULL;
12015
ab273396
AM
12016 off -= ivd.vd_next;
12017 off += ivd.vd_aux;
bb4d2ac2 12018
dda8d76d 12019 if (get_data (&evda, filedata, off, sizeof (evda), 1,
ab273396
AM
12020 _("version def aux")) != NULL)
12021 {
12022 ivda.vda_name = BYTE_GET (evda.vda_name);
bb4d2ac2 12023
ab273396 12024 if (psym->st_name != ivda.vda_name)
0b8b7609
AM
12025 return (ivda.vda_name < strtab_size
12026 ? strtab + ivda.vda_name : _("<corrupt>"));
ab273396
AM
12027 }
12028 }
12029 }
bb4d2ac2 12030
978c4450 12031 if (filedata->version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
ab273396
AM
12032 {
12033 Elf_External_Verneed evn;
12034 Elf_Internal_Verneed ivn;
12035 Elf_Internal_Vernaux ivna;
bb4d2ac2 12036
dda8d76d 12037 offset = offset_from_vma (filedata,
978c4450 12038 filedata->version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
ab273396
AM
12039 sizeof evn);
12040 do
12041 {
12042 unsigned long vna_off;
bb4d2ac2 12043
dda8d76d 12044 if (get_data (&evn, filedata, offset, sizeof (evn), 1,
ab273396
AM
12045 _("version need")) == NULL)
12046 {
12047 ivna.vna_next = 0;
12048 ivna.vna_other = 0;
12049 ivna.vna_name = 0;
12050 break;
12051 }
bb4d2ac2 12052
ab273396
AM
12053 ivn.vn_aux = BYTE_GET (evn.vn_aux);
12054 ivn.vn_next = BYTE_GET (evn.vn_next);
bb4d2ac2 12055
ab273396 12056 vna_off = offset + ivn.vn_aux;
bb4d2ac2 12057
ab273396
AM
12058 do
12059 {
12060 Elf_External_Vernaux evna;
bb4d2ac2 12061
dda8d76d 12062 if (get_data (&evna, filedata, vna_off, sizeof (evna), 1,
ab273396 12063 _("version need aux (3)")) == NULL)
bb4d2ac2 12064 {
ab273396
AM
12065 ivna.vna_next = 0;
12066 ivna.vna_other = 0;
12067 ivna.vna_name = 0;
bb4d2ac2 12068 }
bb4d2ac2 12069 else
bb4d2ac2 12070 {
ab273396
AM
12071 ivna.vna_other = BYTE_GET (evna.vna_other);
12072 ivna.vna_next = BYTE_GET (evna.vna_next);
12073 ivna.vna_name = BYTE_GET (evna.vna_name);
12074 }
bb4d2ac2 12075
ab273396
AM
12076 vna_off += ivna.vna_next;
12077 }
12078 while (ivna.vna_other != vers_data && ivna.vna_next != 0);
bb4d2ac2 12079
ab273396
AM
12080 if (ivna.vna_other == vers_data)
12081 break;
bb4d2ac2 12082
ab273396
AM
12083 offset += ivn.vn_next;
12084 }
12085 while (ivn.vn_next != 0);
bb4d2ac2 12086
ab273396
AM
12087 if (ivna.vna_other == vers_data)
12088 {
12089 *sym_info = symbol_undefined;
12090 *vna_other = ivna.vna_other;
12091 return (ivna.vna_name < strtab_size
12092 ? strtab + ivna.vna_name : _("<corrupt>"));
bb4d2ac2 12093 }
7a815dd5
L
12094 else if ((max_vd_ndx || (vers_data & VERSYM_VERSION) != 1)
12095 && (vers_data & VERSYM_VERSION) > max_vd_ndx)
12096 return _("<corrupt>");
bb4d2ac2 12097 }
ab273396 12098 return NULL;
bb4d2ac2
L
12099}
12100
10ca4b04
L
12101static void
12102print_dynamic_symbol (Filedata *filedata, unsigned long si,
12103 Elf_Internal_Sym *symtab,
12104 Elf_Internal_Shdr *section,
12105 char *strtab, size_t strtab_size)
252b5132 12106{
10ca4b04
L
12107 const char *version_string;
12108 enum versioned_symbol_info sym_info;
12109 unsigned short vna_other;
12110 Elf_Internal_Sym *psym = symtab + si;
0942c7ab 12111
10ca4b04
L
12112 printf ("%6ld: ", si);
12113 print_vma (psym->st_value, LONG_HEX);
12114 putchar (' ');
12115 print_vma (psym->st_size, DEC_5);
12116 printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
12117 printf (" %-6s", get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
12118 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
12119 printf (" %-7s", get_solaris_symbol_visibility (psym->st_other));
12120 else
252b5132 12121 {
10ca4b04 12122 unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
252b5132 12123
10ca4b04
L
12124 printf (" %-7s", get_symbol_visibility (vis));
12125 /* Check to see if any other bits in the st_other field are set.
12126 Note - displaying this information disrupts the layout of the
12127 table being generated, but for the moment this case is very rare. */
12128 if (psym->st_other ^ vis)
12129 printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
252b5132 12130 }
10ca4b04 12131 printf (" %4s ", get_symbol_index_type (filedata, psym->st_shndx));
0942c7ab
NC
12132
12133 bfd_boolean is_valid = VALID_SYMBOL_NAME (strtab, strtab_size,
12134 psym->st_name);
12135 const char * sstr = is_valid ? strtab + psym->st_name : _("<corrupt>");
10ca4b04
L
12136
12137 version_string
12138 = get_symbol_version_string (filedata,
12139 (section == NULL
12140 || section->sh_type == SHT_DYNSYM),
12141 strtab, strtab_size, si,
12142 psym, &sym_info, &vna_other);
0942c7ab
NC
12143
12144 int len_avail = 21;
12145 if (! do_wide && version_string != NULL)
12146 {
ddb43bab 12147 char buffer[16];
0942c7ab 12148
ddb43bab 12149 len_avail -= 1 + strlen (version_string);
0942c7ab
NC
12150
12151 if (sym_info == symbol_undefined)
12152 len_avail -= sprintf (buffer," (%d)", vna_other);
12153 else if (sym_info != symbol_hidden)
12154 len_avail -= 1;
12155 }
12156
12157 print_symbol (len_avail, sstr);
12158
10ca4b04
L
12159 if (version_string)
12160 {
12161 if (sym_info == symbol_undefined)
12162 printf ("@%s (%d)", version_string, vna_other);
f7a99963 12163 else
10ca4b04
L
12164 printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
12165 version_string);
12166 }
6bd1a22c 12167
10ca4b04 12168 putchar ('\n');
6bd1a22c 12169
10ca4b04
L
12170 if (ELF_ST_BIND (psym->st_info) == STB_LOCAL
12171 && section != NULL
12172 && si >= section->sh_info
12173 /* Irix 5 and 6 MIPS binaries are known to ignore this requirement. */
12174 && filedata->file_header.e_machine != EM_MIPS
12175 /* Solaris binaries have been found to violate this requirement as
12176 well. Not sure if this is a bug or an ABI requirement. */
12177 && filedata->file_header.e_ident[EI_OSABI] != ELFOSABI_SOLARIS)
12178 warn (_("local symbol %lu found at index >= %s's sh_info value of %u\n"),
12179 si, printable_section_name (filedata, section), section->sh_info);
12180}
f16a9783 12181
10ca4b04
L
12182/* Dump the symbol table. */
12183static bfd_boolean
12184process_symbol_table (Filedata * filedata)
12185{
12186 Elf_Internal_Shdr * section;
f16a9783 12187
10ca4b04
L
12188 if (!do_syms && !do_dyn_syms && !do_histogram)
12189 return TRUE;
6bd1a22c 12190
978c4450 12191 if ((filedata->dynamic_info[DT_HASH] || filedata->dynamic_info_DT_GNU_HASH)
6bd1a22c
L
12192 && do_syms
12193 && do_using_dynamic
978c4450
AM
12194 && filedata->dynamic_strings != NULL
12195 && filedata->dynamic_symbols != NULL)
6bd1a22c 12196 {
10ca4b04 12197 unsigned long si;
6bd1a22c 12198
10ca4b04
L
12199 printf (ngettext ("\nSymbol table for image contains %lu entry:\n",
12200 "\nSymbol table for image contains %lu entries:\n",
978c4450
AM
12201 filedata->num_dynamic_syms),
12202 filedata->num_dynamic_syms);
10ca4b04
L
12203 if (is_32bit_elf)
12204 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
12205 else
12206 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
6bd1a22c 12207
978c4450
AM
12208 for (si = 0; si < filedata->num_dynamic_syms; si++)
12209 print_dynamic_symbol (filedata, si, filedata->dynamic_symbols, NULL,
12210 filedata->dynamic_strings,
12211 filedata->dynamic_strings_length);
252b5132 12212 }
8b73c356 12213 else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
dda8d76d 12214 && filedata->section_headers != NULL)
252b5132 12215 {
b34976b6 12216 unsigned int i;
252b5132 12217
dda8d76d
NC
12218 for (i = 0, section = filedata->section_headers;
12219 i < filedata->file_header.e_shnum;
252b5132
RH
12220 i++, section++)
12221 {
2cf0635d 12222 char * strtab = NULL;
c256ffe7 12223 unsigned long int strtab_size = 0;
2cf0635d 12224 Elf_Internal_Sym * symtab;
ef3df110 12225 unsigned long si, num_syms;
252b5132 12226
2c610e4b
L
12227 if ((section->sh_type != SHT_SYMTAB
12228 && section->sh_type != SHT_DYNSYM)
12229 || (!do_syms
12230 && section->sh_type == SHT_SYMTAB))
252b5132
RH
12231 continue;
12232
dd24e3da
NC
12233 if (section->sh_entsize == 0)
12234 {
12235 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
dda8d76d 12236 printable_section_name (filedata, section));
dd24e3da
NC
12237 continue;
12238 }
12239
d3a49aa8
AM
12240 num_syms = section->sh_size / section->sh_entsize;
12241 printf (ngettext ("\nSymbol table '%s' contains %lu entry:\n",
12242 "\nSymbol table '%s' contains %lu entries:\n",
12243 num_syms),
dda8d76d 12244 printable_section_name (filedata, section),
d3a49aa8 12245 num_syms);
dd24e3da 12246
f7a99963 12247 if (is_32bit_elf)
ca47b30c 12248 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
f7a99963 12249 else
ca47b30c 12250 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
252b5132 12251
dda8d76d 12252 symtab = GET_ELF_SYMBOLS (filedata, section, & num_syms);
252b5132
RH
12253 if (symtab == NULL)
12254 continue;
12255
dda8d76d 12256 if (section->sh_link == filedata->file_header.e_shstrndx)
c256ffe7 12257 {
dda8d76d
NC
12258 strtab = filedata->string_table;
12259 strtab_size = filedata->string_table_length;
c256ffe7 12260 }
dda8d76d 12261 else if (section->sh_link < filedata->file_header.e_shnum)
252b5132 12262 {
2cf0635d 12263 Elf_Internal_Shdr * string_sec;
252b5132 12264
dda8d76d 12265 string_sec = filedata->section_headers + section->sh_link;
252b5132 12266
dda8d76d 12267 strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset,
3f5e193b
NC
12268 1, string_sec->sh_size,
12269 _("string table"));
c256ffe7 12270 strtab_size = strtab != NULL ? string_sec->sh_size : 0;
252b5132
RH
12271 }
12272
10ca4b04
L
12273 for (si = 0; si < num_syms; si++)
12274 print_dynamic_symbol (filedata, si, symtab, section,
12275 strtab, strtab_size);
252b5132
RH
12276
12277 free (symtab);
dda8d76d 12278 if (strtab != filedata->string_table)
252b5132
RH
12279 free (strtab);
12280 }
12281 }
12282 else if (do_syms)
12283 printf
12284 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
12285
978c4450 12286 if (do_histogram && filedata->buckets != NULL)
252b5132 12287 {
2cf0635d
NC
12288 unsigned long * lengths;
12289 unsigned long * counts;
66543521
AM
12290 unsigned long hn;
12291 bfd_vma si;
12292 unsigned long maxlength = 0;
12293 unsigned long nzero_counts = 0;
12294 unsigned long nsyms = 0;
6bd6a03d 12295 char *visited;
252b5132 12296
d3a49aa8
AM
12297 printf (ngettext ("\nHistogram for bucket list length "
12298 "(total of %lu bucket):\n",
12299 "\nHistogram for bucket list length "
12300 "(total of %lu buckets):\n",
978c4450
AM
12301 (unsigned long) filedata->nbuckets),
12302 (unsigned long) filedata->nbuckets);
252b5132 12303
978c4450
AM
12304 lengths = (unsigned long *) calloc (filedata->nbuckets,
12305 sizeof (*lengths));
252b5132
RH
12306 if (lengths == NULL)
12307 {
8b73c356 12308 error (_("Out of memory allocating space for histogram buckets\n"));
fd486f32 12309 goto err_out;
252b5132 12310 }
978c4450
AM
12311 visited = xcmalloc (filedata->nchains, 1);
12312 memset (visited, 0, filedata->nchains);
8b73c356
NC
12313
12314 printf (_(" Length Number %% of total Coverage\n"));
978c4450 12315 for (hn = 0; hn < filedata->nbuckets; ++hn)
252b5132 12316 {
978c4450 12317 for (si = filedata->buckets[hn]; si > 0; si = filedata->chains[si])
252b5132 12318 {
b34976b6 12319 ++nsyms;
252b5132 12320 if (maxlength < ++lengths[hn])
b34976b6 12321 ++maxlength;
978c4450 12322 if (si >= filedata->nchains || visited[si])
6bd6a03d
AM
12323 {
12324 error (_("histogram chain is corrupt\n"));
12325 break;
12326 }
12327 visited[si] = 1;
252b5132
RH
12328 }
12329 }
6bd6a03d 12330 free (visited);
252b5132 12331
3f5e193b 12332 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
252b5132
RH
12333 if (counts == NULL)
12334 {
b2e951ec 12335 free (lengths);
8b73c356 12336 error (_("Out of memory allocating space for histogram counts\n"));
fd486f32 12337 goto err_out;
252b5132
RH
12338 }
12339
978c4450 12340 for (hn = 0; hn < filedata->nbuckets; ++hn)
b34976b6 12341 ++counts[lengths[hn]];
252b5132 12342
978c4450 12343 if (filedata->nbuckets > 0)
252b5132 12344 {
66543521
AM
12345 unsigned long i;
12346 printf (" 0 %-10lu (%5.1f%%)\n",
978c4450 12347 counts[0], (counts[0] * 100.0) / filedata->nbuckets);
66543521 12348 for (i = 1; i <= maxlength; ++i)
103f02d3 12349 {
66543521
AM
12350 nzero_counts += counts[i] * i;
12351 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
978c4450 12352 i, counts[i], (counts[i] * 100.0) / filedata->nbuckets,
103f02d3
UD
12353 (nzero_counts * 100.0) / nsyms);
12354 }
252b5132
RH
12355 }
12356
12357 free (counts);
12358 free (lengths);
12359 }
12360
978c4450
AM
12361 free (filedata->buckets);
12362 filedata->buckets = NULL;
12363 filedata->nbuckets = 0;
12364 free (filedata->chains);
12365 filedata->chains = NULL;
252b5132 12366
978c4450 12367 if (do_histogram && filedata->gnubuckets != NULL)
fdc90cb4 12368 {
2cf0635d
NC
12369 unsigned long * lengths;
12370 unsigned long * counts;
fdc90cb4
JJ
12371 unsigned long hn;
12372 unsigned long maxlength = 0;
12373 unsigned long nzero_counts = 0;
12374 unsigned long nsyms = 0;
fdc90cb4 12375
f16a9783 12376 printf (ngettext ("\nHistogram for `%s' bucket list length "
d3a49aa8 12377 "(total of %lu bucket):\n",
f16a9783 12378 "\nHistogram for `%s' bucket list length "
d3a49aa8 12379 "(total of %lu buckets):\n",
978c4450
AM
12380 (unsigned long) filedata->ngnubuckets),
12381 GNU_HASH_SECTION_NAME (filedata),
12382 (unsigned long) filedata->ngnubuckets);
8b73c356 12383
978c4450
AM
12384 lengths = (unsigned long *) calloc (filedata->ngnubuckets,
12385 sizeof (*lengths));
fdc90cb4
JJ
12386 if (lengths == NULL)
12387 {
8b73c356 12388 error (_("Out of memory allocating space for gnu histogram buckets\n"));
fd486f32 12389 goto err_out;
fdc90cb4
JJ
12390 }
12391
fdc90cb4
JJ
12392 printf (_(" Length Number %% of total Coverage\n"));
12393
978c4450
AM
12394 for (hn = 0; hn < filedata->ngnubuckets; ++hn)
12395 if (filedata->gnubuckets[hn] != 0)
fdc90cb4
JJ
12396 {
12397 bfd_vma off, length = 1;
12398
978c4450 12399 for (off = filedata->gnubuckets[hn] - filedata->gnusymidx;
071436c6 12400 /* PR 17531 file: 010-77222-0.004. */
978c4450
AM
12401 off < filedata->ngnuchains
12402 && (filedata->gnuchains[off] & 1) == 0;
071436c6 12403 ++off)
fdc90cb4
JJ
12404 ++length;
12405 lengths[hn] = length;
12406 if (length > maxlength)
12407 maxlength = length;
12408 nsyms += length;
12409 }
12410
3f5e193b 12411 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
fdc90cb4
JJ
12412 if (counts == NULL)
12413 {
b2e951ec 12414 free (lengths);
8b73c356 12415 error (_("Out of memory allocating space for gnu histogram counts\n"));
fd486f32 12416 goto err_out;
fdc90cb4
JJ
12417 }
12418
978c4450 12419 for (hn = 0; hn < filedata->ngnubuckets; ++hn)
fdc90cb4
JJ
12420 ++counts[lengths[hn]];
12421
978c4450 12422 if (filedata->ngnubuckets > 0)
fdc90cb4
JJ
12423 {
12424 unsigned long j;
12425 printf (" 0 %-10lu (%5.1f%%)\n",
978c4450 12426 counts[0], (counts[0] * 100.0) / filedata->ngnubuckets);
fdc90cb4
JJ
12427 for (j = 1; j <= maxlength; ++j)
12428 {
12429 nzero_counts += counts[j] * j;
12430 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
978c4450 12431 j, counts[j], (counts[j] * 100.0) / filedata->ngnubuckets,
fdc90cb4
JJ
12432 (nzero_counts * 100.0) / nsyms);
12433 }
12434 }
12435
12436 free (counts);
12437 free (lengths);
fdc90cb4 12438 }
978c4450
AM
12439 free (filedata->gnubuckets);
12440 filedata->gnubuckets = NULL;
12441 filedata->ngnubuckets = 0;
12442 free (filedata->gnuchains);
12443 filedata->gnuchains = NULL;
12444 filedata->ngnuchains = 0;
12445 free (filedata->mipsxlat);
12446 filedata->mipsxlat = NULL;
32ec8896 12447 return TRUE;
fd486f32
AM
12448
12449 err_out:
978c4450
AM
12450 free (filedata->gnubuckets);
12451 filedata->gnubuckets = NULL;
12452 filedata->ngnubuckets = 0;
12453 free (filedata->gnuchains);
12454 filedata->gnuchains = NULL;
12455 filedata->ngnuchains = 0;
12456 free (filedata->mipsxlat);
12457 filedata->mipsxlat = NULL;
12458 free (filedata->buckets);
12459 filedata->buckets = NULL;
12460 filedata->nbuckets = 0;
12461 free (filedata->chains);
12462 filedata->chains = NULL;
fd486f32 12463 return FALSE;
252b5132
RH
12464}
12465
32ec8896 12466static bfd_boolean
dda8d76d 12467process_syminfo (Filedata * filedata ATTRIBUTE_UNUSED)
252b5132 12468{
b4c96d0d 12469 unsigned int i;
252b5132 12470
978c4450 12471 if (filedata->dynamic_syminfo == NULL
252b5132
RH
12472 || !do_dynamic)
12473 /* No syminfo, this is ok. */
32ec8896 12474 return TRUE;
252b5132
RH
12475
12476 /* There better should be a dynamic symbol section. */
978c4450 12477 if (filedata->dynamic_symbols == NULL || filedata->dynamic_strings == NULL)
32ec8896 12478 return FALSE;
252b5132 12479
978c4450 12480 if (filedata->dynamic_addr)
d3a49aa8
AM
12481 printf (ngettext ("\nDynamic info segment at offset 0x%lx "
12482 "contains %d entry:\n",
12483 "\nDynamic info segment at offset 0x%lx "
12484 "contains %d entries:\n",
978c4450
AM
12485 filedata->dynamic_syminfo_nent),
12486 filedata->dynamic_syminfo_offset, filedata->dynamic_syminfo_nent);
252b5132
RH
12487
12488 printf (_(" Num: Name BoundTo Flags\n"));
978c4450 12489 for (i = 0; i < filedata->dynamic_syminfo_nent; ++i)
252b5132 12490 {
978c4450 12491 unsigned short int flags = filedata->dynamic_syminfo[i].si_flags;
252b5132 12492
31104126 12493 printf ("%4d: ", i);
978c4450 12494 if (i >= filedata->num_dynamic_syms)
4082ef84 12495 printf (_("<corrupt index>"));
978c4450
AM
12496 else if (VALID_DYNAMIC_NAME (filedata, filedata->dynamic_symbols[i].st_name))
12497 print_symbol (30, GET_DYNAMIC_NAME (filedata,
12498 filedata->dynamic_symbols[i].st_name));
d79b3d50 12499 else
978c4450 12500 printf (_("<corrupt: %19ld>"), filedata->dynamic_symbols[i].st_name);
31104126 12501 putchar (' ');
252b5132 12502
978c4450 12503 switch (filedata->dynamic_syminfo[i].si_boundto)
252b5132
RH
12504 {
12505 case SYMINFO_BT_SELF:
12506 fputs ("SELF ", stdout);
12507 break;
12508 case SYMINFO_BT_PARENT:
12509 fputs ("PARENT ", stdout);
12510 break;
12511 default:
978c4450
AM
12512 if (filedata->dynamic_syminfo[i].si_boundto > 0
12513 && filedata->dynamic_syminfo[i].si_boundto < filedata->dynamic_nent
12514 && VALID_DYNAMIC_NAME (filedata,
12515 filedata->dynamic_section[filedata->dynamic_syminfo[i].si_boundto].d_un.d_val))
31104126 12516 {
978c4450
AM
12517 print_symbol (10, GET_DYNAMIC_NAME (filedata,
12518 filedata->dynamic_section[filedata->dynamic_syminfo[i].si_boundto].d_un.d_val));
31104126
NC
12519 putchar (' ' );
12520 }
252b5132 12521 else
978c4450 12522 printf ("%-10d ", filedata->dynamic_syminfo[i].si_boundto);
252b5132
RH
12523 break;
12524 }
12525
12526 if (flags & SYMINFO_FLG_DIRECT)
12527 printf (" DIRECT");
12528 if (flags & SYMINFO_FLG_PASSTHRU)
12529 printf (" PASSTHRU");
12530 if (flags & SYMINFO_FLG_COPY)
12531 printf (" COPY");
12532 if (flags & SYMINFO_FLG_LAZYLOAD)
12533 printf (" LAZYLOAD");
12534
12535 puts ("");
12536 }
12537
32ec8896 12538 return TRUE;
252b5132
RH
12539}
12540
75802ccb
CE
12541/* A macro which evaluates to TRUE if the region ADDR .. ADDR + NELEM
12542 is contained by the region START .. END. The types of ADDR, START
12543 and END should all be the same. Note both ADDR + NELEM and END
12544 point to just beyond the end of the regions that are being tested. */
12545#define IN_RANGE(START,END,ADDR,NELEM) \
12546 (((ADDR) >= (START)) && ((ADDR) < (END)) && ((ADDR) + (NELEM) <= (END)))
b32e566b 12547
cf13d699
NC
12548/* Check to see if the given reloc needs to be handled in a target specific
12549 manner. If so then process the reloc and return TRUE otherwise return
f84ce13b
NC
12550 FALSE.
12551
12552 If called with reloc == NULL, then this is a signal that reloc processing
12553 for the current section has finished, and any saved state should be
12554 discarded. */
09c11c86 12555
cf13d699 12556static bfd_boolean
dda8d76d
NC
12557target_specific_reloc_handling (Filedata * filedata,
12558 Elf_Internal_Rela * reloc,
12559 unsigned char * start,
12560 unsigned char * end,
12561 Elf_Internal_Sym * symtab,
12562 unsigned long num_syms)
252b5132 12563{
f84ce13b
NC
12564 unsigned int reloc_type = 0;
12565 unsigned long sym_index = 0;
12566
12567 if (reloc)
12568 {
dda8d76d 12569 reloc_type = get_reloc_type (filedata, reloc->r_info);
f84ce13b
NC
12570 sym_index = get_reloc_symindex (reloc->r_info);
12571 }
252b5132 12572
dda8d76d 12573 switch (filedata->file_header.e_machine)
252b5132 12574 {
13761a11
NC
12575 case EM_MSP430:
12576 case EM_MSP430_OLD:
12577 {
12578 static Elf_Internal_Sym * saved_sym = NULL;
12579
f84ce13b
NC
12580 if (reloc == NULL)
12581 {
12582 saved_sym = NULL;
12583 return TRUE;
12584 }
12585
13761a11
NC
12586 switch (reloc_type)
12587 {
12588 case 10: /* R_MSP430_SYM_DIFF */
7d81bc93 12589 case 12: /* R_MSP430_GNU_SUB_ULEB128 */
dda8d76d 12590 if (uses_msp430x_relocs (filedata))
13761a11 12591 break;
1a0670f3 12592 /* Fall through. */
13761a11 12593 case 21: /* R_MSP430X_SYM_DIFF */
7d81bc93 12594 case 23: /* R_MSP430X_GNU_SUB_ULEB128 */
f84ce13b
NC
12595 /* PR 21139. */
12596 if (sym_index >= num_syms)
12597 error (_("MSP430 SYM_DIFF reloc contains invalid symbol index %lu\n"),
12598 sym_index);
12599 else
12600 saved_sym = symtab + sym_index;
13761a11
NC
12601 return TRUE;
12602
12603 case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
12604 case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
12605 goto handle_sym_diff;
0b4362b0 12606
13761a11
NC
12607 case 5: /* R_MSP430_16_BYTE */
12608 case 9: /* R_MSP430_8 */
7d81bc93 12609 case 11: /* R_MSP430_GNU_SET_ULEB128 */
dda8d76d 12610 if (uses_msp430x_relocs (filedata))
13761a11
NC
12611 break;
12612 goto handle_sym_diff;
12613
12614 case 2: /* R_MSP430_ABS16 */
12615 case 15: /* R_MSP430X_ABS16 */
7d81bc93 12616 case 22: /* R_MSP430X_GNU_SET_ULEB128 */
dda8d76d 12617 if (! uses_msp430x_relocs (filedata))
13761a11
NC
12618 break;
12619 goto handle_sym_diff;
0b4362b0 12620
13761a11
NC
12621 handle_sym_diff:
12622 if (saved_sym != NULL)
12623 {
12624 bfd_vma value;
5a805384 12625 unsigned int reloc_size = 0;
7d81bc93
JL
12626 int leb_ret = 0;
12627 switch (reloc_type)
12628 {
12629 case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
12630 reloc_size = 4;
12631 break;
12632 case 11: /* R_MSP430_GNU_SET_ULEB128 */
12633 case 22: /* R_MSP430X_GNU_SET_ULEB128 */
5a805384
AM
12634 if (reloc->r_offset < (size_t) (end - start))
12635 read_leb128 (start + reloc->r_offset, end, FALSE,
12636 &reloc_size, &leb_ret);
7d81bc93
JL
12637 break;
12638 default:
12639 reloc_size = 2;
12640 break;
12641 }
13761a11 12642
5a805384 12643 if (leb_ret != 0 || reloc_size == 0 || reloc_size > 8)
7d81bc93
JL
12644 error (_("MSP430 ULEB128 field at 0x%lx contains invalid "
12645 "ULEB128 value\n"),
12646 (long) reloc->r_offset);
12647 else if (sym_index >= num_syms)
f84ce13b
NC
12648 error (_("MSP430 reloc contains invalid symbol index %lu\n"),
12649 sym_index);
03f7786e 12650 else
f84ce13b
NC
12651 {
12652 value = reloc->r_addend + (symtab[sym_index].st_value
12653 - saved_sym->st_value);
12654
b32e566b 12655 if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
f84ce13b 12656 byte_put (start + reloc->r_offset, value, reloc_size);
b32e566b
NC
12657 else
12658 /* PR 21137 */
12659 error (_("MSP430 sym diff reloc contains invalid offset: 0x%lx\n"),
12660 (long) reloc->r_offset);
f84ce13b 12661 }
13761a11
NC
12662
12663 saved_sym = NULL;
12664 return TRUE;
12665 }
12666 break;
12667
12668 default:
12669 if (saved_sym != NULL)
071436c6 12670 error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
13761a11
NC
12671 break;
12672 }
12673 break;
12674 }
12675
cf13d699
NC
12676 case EM_MN10300:
12677 case EM_CYGNUS_MN10300:
12678 {
12679 static Elf_Internal_Sym * saved_sym = NULL;
252b5132 12680
f84ce13b
NC
12681 if (reloc == NULL)
12682 {
12683 saved_sym = NULL;
12684 return TRUE;
12685 }
12686
cf13d699
NC
12687 switch (reloc_type)
12688 {
12689 case 34: /* R_MN10300_ALIGN */
12690 return TRUE;
12691 case 33: /* R_MN10300_SYM_DIFF */
f84ce13b
NC
12692 if (sym_index >= num_syms)
12693 error (_("MN10300_SYM_DIFF reloc contains invalid symbol index %lu\n"),
12694 sym_index);
12695 else
12696 saved_sym = symtab + sym_index;
cf13d699 12697 return TRUE;
f84ce13b 12698
cf13d699
NC
12699 case 1: /* R_MN10300_32 */
12700 case 2: /* R_MN10300_16 */
12701 if (saved_sym != NULL)
12702 {
03f7786e 12703 int reloc_size = reloc_type == 1 ? 4 : 2;
cf13d699 12704 bfd_vma value;
252b5132 12705
f84ce13b
NC
12706 if (sym_index >= num_syms)
12707 error (_("MN10300 reloc contains invalid symbol index %lu\n"),
12708 sym_index);
03f7786e 12709 else
f84ce13b
NC
12710 {
12711 value = reloc->r_addend + (symtab[sym_index].st_value
12712 - saved_sym->st_value);
12713
b32e566b 12714 if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
f84ce13b 12715 byte_put (start + reloc->r_offset, value, reloc_size);
b32e566b
NC
12716 else
12717 error (_("MN10300 sym diff reloc contains invalid offset: 0x%lx\n"),
12718 (long) reloc->r_offset);
f84ce13b 12719 }
252b5132 12720
cf13d699
NC
12721 saved_sym = NULL;
12722 return TRUE;
12723 }
12724 break;
12725 default:
12726 if (saved_sym != NULL)
071436c6 12727 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
cf13d699
NC
12728 break;
12729 }
12730 break;
12731 }
6ff71e76
NC
12732
12733 case EM_RL78:
12734 {
12735 static bfd_vma saved_sym1 = 0;
12736 static bfd_vma saved_sym2 = 0;
12737 static bfd_vma value;
12738
f84ce13b
NC
12739 if (reloc == NULL)
12740 {
12741 saved_sym1 = saved_sym2 = 0;
12742 return TRUE;
12743 }
12744
6ff71e76
NC
12745 switch (reloc_type)
12746 {
12747 case 0x80: /* R_RL78_SYM. */
12748 saved_sym1 = saved_sym2;
f84ce13b
NC
12749 if (sym_index >= num_syms)
12750 error (_("RL78_SYM reloc contains invalid symbol index %lu\n"),
12751 sym_index);
12752 else
12753 {
12754 saved_sym2 = symtab[sym_index].st_value;
12755 saved_sym2 += reloc->r_addend;
12756 }
6ff71e76
NC
12757 return TRUE;
12758
12759 case 0x83: /* R_RL78_OPsub. */
12760 value = saved_sym1 - saved_sym2;
12761 saved_sym2 = saved_sym1 = 0;
12762 return TRUE;
12763 break;
12764
12765 case 0x41: /* R_RL78_ABS32. */
b32e566b 12766 if (IN_RANGE (start, end, start + reloc->r_offset, 4))
03f7786e 12767 byte_put (start + reloc->r_offset, value, 4);
b32e566b
NC
12768 else
12769 error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12770 (long) reloc->r_offset);
6ff71e76
NC
12771 value = 0;
12772 return TRUE;
12773
12774 case 0x43: /* R_RL78_ABS16. */
b32e566b 12775 if (IN_RANGE (start, end, start + reloc->r_offset, 2))
03f7786e 12776 byte_put (start + reloc->r_offset, value, 2);
b32e566b
NC
12777 else
12778 error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12779 (long) reloc->r_offset);
6ff71e76
NC
12780 value = 0;
12781 return TRUE;
12782
12783 default:
12784 break;
12785 }
12786 break;
12787 }
252b5132
RH
12788 }
12789
cf13d699 12790 return FALSE;
252b5132
RH
12791}
12792
aca88567
NC
12793/* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
12794 DWARF debug sections. This is a target specific test. Note - we do not
12795 go through the whole including-target-headers-multiple-times route, (as
12796 we have already done with <elf/h8.h>) because this would become very
12797 messy and even then this function would have to contain target specific
12798 information (the names of the relocs instead of their numeric values).
12799 FIXME: This is not the correct way to solve this problem. The proper way
12800 is to have target specific reloc sizing and typing functions created by
12801 the reloc-macros.h header, in the same way that it already creates the
12802 reloc naming functions. */
12803
12804static bfd_boolean
dda8d76d 12805is_32bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
aca88567 12806{
d347c9df 12807 /* Please keep this table alpha-sorted for ease of visual lookup. */
dda8d76d 12808 switch (filedata->file_header.e_machine)
aca88567 12809 {
41e92641 12810 case EM_386:
22abe556 12811 case EM_IAMCU:
41e92641 12812 return reloc_type == 1; /* R_386_32. */
aca88567
NC
12813 case EM_68K:
12814 return reloc_type == 1; /* R_68K_32. */
f954747f
AM
12815 case EM_860:
12816 return reloc_type == 1; /* R_860_32. */
12817 case EM_960:
12818 return reloc_type == 2; /* R_960_32. */
a06ea964 12819 case EM_AARCH64:
9282b95a
JW
12820 return (reloc_type == 258
12821 || reloc_type == 1); /* R_AARCH64_ABS32 || R_AARCH64_P32_ABS32 */
aca4efc7
JM
12822 case EM_BPF:
12823 return reloc_type == 11; /* R_BPF_DATA_32 */
d347c9df
PS
12824 case EM_ADAPTEVA_EPIPHANY:
12825 return reloc_type == 3;
aca88567 12826 case EM_ALPHA:
137b6b5f 12827 return reloc_type == 1; /* R_ALPHA_REFLONG. */
41e92641
NC
12828 case EM_ARC:
12829 return reloc_type == 1; /* R_ARC_32. */
886a2506
NC
12830 case EM_ARC_COMPACT:
12831 case EM_ARC_COMPACT2:
12832 return reloc_type == 4; /* R_ARC_32. */
41e92641
NC
12833 case EM_ARM:
12834 return reloc_type == 2; /* R_ARM_ABS32 */
cb8f3167 12835 case EM_AVR_OLD:
aca88567
NC
12836 case EM_AVR:
12837 return reloc_type == 1;
12838 case EM_BLACKFIN:
12839 return reloc_type == 0x12; /* R_byte4_data. */
12840 case EM_CRIS:
12841 return reloc_type == 3; /* R_CRIS_32. */
12842 case EM_CR16:
12843 return reloc_type == 3; /* R_CR16_NUM32. */
12844 case EM_CRX:
12845 return reloc_type == 15; /* R_CRX_NUM32. */
b8891f8d
AJ
12846 case EM_CSKY:
12847 return reloc_type == 1; /* R_CKCORE_ADDR32. */
aca88567
NC
12848 case EM_CYGNUS_FRV:
12849 return reloc_type == 1;
41e92641
NC
12850 case EM_CYGNUS_D10V:
12851 case EM_D10V:
12852 return reloc_type == 6; /* R_D10V_32. */
aca88567
NC
12853 case EM_CYGNUS_D30V:
12854 case EM_D30V:
12855 return reloc_type == 12; /* R_D30V_32_NORMAL. */
41e92641
NC
12856 case EM_DLX:
12857 return reloc_type == 3; /* R_DLX_RELOC_32. */
aca88567
NC
12858 case EM_CYGNUS_FR30:
12859 case EM_FR30:
12860 return reloc_type == 3; /* R_FR30_32. */
3f8107ab
AM
12861 case EM_FT32:
12862 return reloc_type == 1; /* R_FT32_32. */
aca88567
NC
12863 case EM_H8S:
12864 case EM_H8_300:
12865 case EM_H8_300H:
12866 return reloc_type == 1; /* R_H8_DIR32. */
3730236a 12867 case EM_IA_64:
262cdac7
AM
12868 return (reloc_type == 0x64 /* R_IA64_SECREL32MSB. */
12869 || reloc_type == 0x65 /* R_IA64_SECREL32LSB. */
12870 || reloc_type == 0x24 /* R_IA64_DIR32MSB. */
12871 || reloc_type == 0x25 /* R_IA64_DIR32LSB. */);
aca88567
NC
12872 case EM_IP2K_OLD:
12873 case EM_IP2K:
12874 return reloc_type == 2; /* R_IP2K_32. */
12875 case EM_IQ2000:
12876 return reloc_type == 2; /* R_IQ2000_32. */
84e94c90
NC
12877 case EM_LATTICEMICO32:
12878 return reloc_type == 3; /* R_LM32_32. */
ff7eeb89 12879 case EM_M32C_OLD:
aca88567
NC
12880 case EM_M32C:
12881 return reloc_type == 3; /* R_M32C_32. */
12882 case EM_M32R:
12883 return reloc_type == 34; /* R_M32R_32_RELA. */
adec12c1
AM
12884 case EM_68HC11:
12885 case EM_68HC12:
12886 return reloc_type == 6; /* R_M68HC11_32. */
7b4ae824 12887 case EM_S12Z:
2849d19f
JD
12888 return reloc_type == 7 || /* R_S12Z_EXT32 */
12889 reloc_type == 6; /* R_S12Z_CW32. */
aca88567
NC
12890 case EM_MCORE:
12891 return reloc_type == 1; /* R_MCORE_ADDR32. */
12892 case EM_CYGNUS_MEP:
12893 return reloc_type == 4; /* R_MEP_32. */
a3c62988
NC
12894 case EM_METAG:
12895 return reloc_type == 2; /* R_METAG_ADDR32. */
137b6b5f
AM
12896 case EM_MICROBLAZE:
12897 return reloc_type == 1; /* R_MICROBLAZE_32. */
aca88567
NC
12898 case EM_MIPS:
12899 return reloc_type == 2; /* R_MIPS_32. */
12900 case EM_MMIX:
12901 return reloc_type == 4; /* R_MMIX_32. */
12902 case EM_CYGNUS_MN10200:
12903 case EM_MN10200:
12904 return reloc_type == 1; /* R_MN10200_32. */
12905 case EM_CYGNUS_MN10300:
12906 case EM_MN10300:
12907 return reloc_type == 1; /* R_MN10300_32. */
5506d11a
AM
12908 case EM_MOXIE:
12909 return reloc_type == 1; /* R_MOXIE_32. */
aca88567
NC
12910 case EM_MSP430_OLD:
12911 case EM_MSP430:
13761a11 12912 return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32. */
aca88567
NC
12913 case EM_MT:
12914 return reloc_type == 2; /* R_MT_32. */
35c08157
KLC
12915 case EM_NDS32:
12916 return reloc_type == 20; /* R_NDS32_RELA. */
3e0873ac 12917 case EM_ALTERA_NIOS2:
36591ba1 12918 return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32. */
3e0873ac
NC
12919 case EM_NIOS32:
12920 return reloc_type == 1; /* R_NIOS_32. */
73589c9d
CS
12921 case EM_OR1K:
12922 return reloc_type == 1; /* R_OR1K_32. */
aca88567 12923 case EM_PARISC:
9abca702 12924 return (reloc_type == 1 /* R_PARISC_DIR32. */
0df8ad28 12925 || reloc_type == 2 /* R_PARISC_DIR21L. */
5fda8eca 12926 || reloc_type == 41); /* R_PARISC_SECREL32. */
aca88567
NC
12927 case EM_PJ:
12928 case EM_PJ_OLD:
12929 return reloc_type == 1; /* R_PJ_DATA_DIR32. */
12930 case EM_PPC64:
12931 return reloc_type == 1; /* R_PPC64_ADDR32. */
12932 case EM_PPC:
12933 return reloc_type == 1; /* R_PPC_ADDR32. */
2b100bb5
DD
12934 case EM_TI_PRU:
12935 return reloc_type == 11; /* R_PRU_BFD_RELOC_32. */
e23eba97
NC
12936 case EM_RISCV:
12937 return reloc_type == 1; /* R_RISCV_32. */
99c513f6
DD
12938 case EM_RL78:
12939 return reloc_type == 1; /* R_RL78_DIR32. */
c7927a3c
NC
12940 case EM_RX:
12941 return reloc_type == 1; /* R_RX_DIR32. */
f954747f
AM
12942 case EM_S370:
12943 return reloc_type == 1; /* R_I370_ADDR31. */
aca88567
NC
12944 case EM_S390_OLD:
12945 case EM_S390:
12946 return reloc_type == 4; /* R_S390_32. */
41e92641
NC
12947 case EM_SCORE:
12948 return reloc_type == 8; /* R_SCORE_ABS32. */
aca88567
NC
12949 case EM_SH:
12950 return reloc_type == 1; /* R_SH_DIR32. */
12951 case EM_SPARC32PLUS:
12952 case EM_SPARCV9:
12953 case EM_SPARC:
12954 return reloc_type == 3 /* R_SPARC_32. */
12955 || reloc_type == 23; /* R_SPARC_UA32. */
a7dd7d05
AM
12956 case EM_SPU:
12957 return reloc_type == 6; /* R_SPU_ADDR32 */
40b36596
JM
12958 case EM_TI_C6000:
12959 return reloc_type == 1; /* R_C6000_ABS32. */
aa137e4d
NC
12960 case EM_TILEGX:
12961 return reloc_type == 2; /* R_TILEGX_32. */
12962 case EM_TILEPRO:
12963 return reloc_type == 1; /* R_TILEPRO_32. */
aca88567
NC
12964 case EM_CYGNUS_V850:
12965 case EM_V850:
12966 return reloc_type == 6; /* R_V850_ABS32. */
708e2187
NC
12967 case EM_V800:
12968 return reloc_type == 0x33; /* R_V810_WORD. */
aca88567
NC
12969 case EM_VAX:
12970 return reloc_type == 1; /* R_VAX_32. */
619ed720
EB
12971 case EM_VISIUM:
12972 return reloc_type == 3; /* R_VISIUM_32. */
f96bd6c2
PC
12973 case EM_WEBASSEMBLY:
12974 return reloc_type == 1; /* R_WASM32_32. */
aca88567 12975 case EM_X86_64:
8a9036a4 12976 case EM_L1OM:
7a9068fe 12977 case EM_K1OM:
aca88567 12978 return reloc_type == 10; /* R_X86_64_32. */
c29aca4a
NC
12979 case EM_XC16X:
12980 case EM_C166:
12981 return reloc_type == 3; /* R_XC16C_ABS_32. */
f6c1a2d5
NC
12982 case EM_XGATE:
12983 return reloc_type == 4; /* R_XGATE_32. */
aca88567
NC
12984 case EM_XSTORMY16:
12985 return reloc_type == 1; /* R_XSTROMY16_32. */
12986 case EM_XTENSA_OLD:
12987 case EM_XTENSA:
12988 return reloc_type == 1; /* R_XTENSA_32. */
6655dba2
SB
12989 case EM_Z80:
12990 return reloc_type == 6; /* R_Z80_32. */
aca88567 12991 default:
bee0ee85
NC
12992 {
12993 static unsigned int prev_warn = 0;
12994
12995 /* Avoid repeating the same warning multiple times. */
dda8d76d 12996 if (prev_warn != filedata->file_header.e_machine)
bee0ee85 12997 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
dda8d76d
NC
12998 filedata->file_header.e_machine);
12999 prev_warn = filedata->file_header.e_machine;
bee0ee85
NC
13000 return FALSE;
13001 }
aca88567
NC
13002 }
13003}
13004
13005/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13006 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
13007
13008static bfd_boolean
dda8d76d 13009is_32bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
aca88567 13010{
dda8d76d 13011 switch (filedata->file_header.e_machine)
d347c9df 13012 /* Please keep this table alpha-sorted for ease of visual lookup. */
aca88567 13013 {
41e92641 13014 case EM_386:
22abe556 13015 case EM_IAMCU:
3e0873ac 13016 return reloc_type == 2; /* R_386_PC32. */
aca88567 13017 case EM_68K:
3e0873ac 13018 return reloc_type == 4; /* R_68K_PC32. */
a06ea964
NC
13019 case EM_AARCH64:
13020 return reloc_type == 261; /* R_AARCH64_PREL32 */
cfb8c092
NC
13021 case EM_ADAPTEVA_EPIPHANY:
13022 return reloc_type == 6;
aca88567
NC
13023 case EM_ALPHA:
13024 return reloc_type == 10; /* R_ALPHA_SREL32. */
726c18e1
CZ
13025 case EM_ARC_COMPACT:
13026 case EM_ARC_COMPACT2:
13027 return reloc_type == 49; /* R_ARC_32_PCREL. */
41e92641 13028 case EM_ARM:
3e0873ac 13029 return reloc_type == 3; /* R_ARM_REL32 */
d347c9df
PS
13030 case EM_AVR_OLD:
13031 case EM_AVR:
13032 return reloc_type == 36; /* R_AVR_32_PCREL. */
137b6b5f
AM
13033 case EM_MICROBLAZE:
13034 return reloc_type == 2; /* R_MICROBLAZE_32_PCREL. */
73589c9d
CS
13035 case EM_OR1K:
13036 return reloc_type == 9; /* R_OR1K_32_PCREL. */
aca88567 13037 case EM_PARISC:
85acf597 13038 return reloc_type == 9; /* R_PARISC_PCREL32. */
aca88567
NC
13039 case EM_PPC:
13040 return reloc_type == 26; /* R_PPC_REL32. */
13041 case EM_PPC64:
3e0873ac 13042 return reloc_type == 26; /* R_PPC64_REL32. */
25cbdcbb
AS
13043 case EM_RISCV:
13044 return reloc_type == 57; /* R_RISCV_32_PCREL. */
aca88567
NC
13045 case EM_S390_OLD:
13046 case EM_S390:
3e0873ac 13047 return reloc_type == 5; /* R_390_PC32. */
aca88567 13048 case EM_SH:
3e0873ac 13049 return reloc_type == 2; /* R_SH_REL32. */
aca88567
NC
13050 case EM_SPARC32PLUS:
13051 case EM_SPARCV9:
13052 case EM_SPARC:
3e0873ac 13053 return reloc_type == 6; /* R_SPARC_DISP32. */
a7dd7d05
AM
13054 case EM_SPU:
13055 return reloc_type == 13; /* R_SPU_REL32. */
aa137e4d
NC
13056 case EM_TILEGX:
13057 return reloc_type == 6; /* R_TILEGX_32_PCREL. */
13058 case EM_TILEPRO:
13059 return reloc_type == 4; /* R_TILEPRO_32_PCREL. */
619ed720
EB
13060 case EM_VISIUM:
13061 return reloc_type == 6; /* R_VISIUM_32_PCREL */
aca88567 13062 case EM_X86_64:
8a9036a4 13063 case EM_L1OM:
7a9068fe 13064 case EM_K1OM:
3e0873ac 13065 return reloc_type == 2; /* R_X86_64_PC32. */
2057d69d
CZ
13066 case EM_VAX:
13067 return reloc_type == 4; /* R_VAX_PCREL32. */
2fcb9706
BW
13068 case EM_XTENSA_OLD:
13069 case EM_XTENSA:
13070 return reloc_type == 14; /* R_XTENSA_32_PCREL. */
aca88567
NC
13071 default:
13072 /* Do not abort or issue an error message here. Not all targets use
13073 pc-relative 32-bit relocs in their DWARF debug information and we
13074 have already tested for target coverage in is_32bit_abs_reloc. A
cf13d699
NC
13075 more helpful warning message will be generated by apply_relocations
13076 anyway, so just return. */
aca88567
NC
13077 return FALSE;
13078 }
13079}
13080
13081/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13082 a 64-bit absolute RELA relocation used in DWARF debug sections. */
13083
13084static bfd_boolean
dda8d76d 13085is_64bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
aca88567 13086{
dda8d76d 13087 switch (filedata->file_header.e_machine)
aca88567 13088 {
a06ea964
NC
13089 case EM_AARCH64:
13090 return reloc_type == 257; /* R_AARCH64_ABS64. */
aca88567
NC
13091 case EM_ALPHA:
13092 return reloc_type == 2; /* R_ALPHA_REFQUAD. */
3730236a 13093 case EM_IA_64:
262cdac7
AM
13094 return (reloc_type == 0x26 /* R_IA64_DIR64MSB. */
13095 || reloc_type == 0x27 /* R_IA64_DIR64LSB. */);
3e0873ac
NC
13096 case EM_PARISC:
13097 return reloc_type == 80; /* R_PARISC_DIR64. */
aca88567
NC
13098 case EM_PPC64:
13099 return reloc_type == 38; /* R_PPC64_ADDR64. */
e23eba97
NC
13100 case EM_RISCV:
13101 return reloc_type == 2; /* R_RISCV_64. */
aca88567
NC
13102 case EM_SPARC32PLUS:
13103 case EM_SPARCV9:
13104 case EM_SPARC:
714da62f
NC
13105 return reloc_type == 32 /* R_SPARC_64. */
13106 || reloc_type == 54; /* R_SPARC_UA64. */
aca88567 13107 case EM_X86_64:
8a9036a4 13108 case EM_L1OM:
7a9068fe 13109 case EM_K1OM:
aca88567 13110 return reloc_type == 1; /* R_X86_64_64. */
e819ade1
AS
13111 case EM_S390_OLD:
13112 case EM_S390:
aa137e4d
NC
13113 return reloc_type == 22; /* R_S390_64. */
13114 case EM_TILEGX:
13115 return reloc_type == 1; /* R_TILEGX_64. */
85a82265 13116 case EM_MIPS:
aa137e4d 13117 return reloc_type == 18; /* R_MIPS_64. */
aca88567
NC
13118 default:
13119 return FALSE;
13120 }
13121}
13122
85acf597
RH
13123/* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
13124 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
13125
13126static bfd_boolean
dda8d76d 13127is_64bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
85acf597 13128{
dda8d76d 13129 switch (filedata->file_header.e_machine)
85acf597 13130 {
a06ea964
NC
13131 case EM_AARCH64:
13132 return reloc_type == 260; /* R_AARCH64_PREL64. */
85acf597 13133 case EM_ALPHA:
aa137e4d 13134 return reloc_type == 11; /* R_ALPHA_SREL64. */
85acf597 13135 case EM_IA_64:
262cdac7
AM
13136 return (reloc_type == 0x4e /* R_IA64_PCREL64MSB. */
13137 || reloc_type == 0x4f /* R_IA64_PCREL64LSB. */);
85acf597 13138 case EM_PARISC:
aa137e4d 13139 return reloc_type == 72; /* R_PARISC_PCREL64. */
85acf597 13140 case EM_PPC64:
aa137e4d 13141 return reloc_type == 44; /* R_PPC64_REL64. */
85acf597
RH
13142 case EM_SPARC32PLUS:
13143 case EM_SPARCV9:
13144 case EM_SPARC:
aa137e4d 13145 return reloc_type == 46; /* R_SPARC_DISP64. */
85acf597 13146 case EM_X86_64:
8a9036a4 13147 case EM_L1OM:
7a9068fe 13148 case EM_K1OM:
aa137e4d 13149 return reloc_type == 24; /* R_X86_64_PC64. */
85acf597
RH
13150 case EM_S390_OLD:
13151 case EM_S390:
aa137e4d
NC
13152 return reloc_type == 23; /* R_S390_PC64. */
13153 case EM_TILEGX:
13154 return reloc_type == 5; /* R_TILEGX_64_PCREL. */
85acf597
RH
13155 default:
13156 return FALSE;
13157 }
13158}
13159
4dc3c23d
AM
13160/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13161 a 24-bit absolute RELA relocation used in DWARF debug sections. */
13162
13163static bfd_boolean
dda8d76d 13164is_24bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
4dc3c23d 13165{
dda8d76d 13166 switch (filedata->file_header.e_machine)
4dc3c23d
AM
13167 {
13168 case EM_CYGNUS_MN10200:
13169 case EM_MN10200:
13170 return reloc_type == 4; /* R_MN10200_24. */
3ee6e4fb
NC
13171 case EM_FT32:
13172 return reloc_type == 5; /* R_FT32_20. */
6655dba2
SB
13173 case EM_Z80:
13174 return reloc_type == 5; /* R_Z80_24. */
4dc3c23d
AM
13175 default:
13176 return FALSE;
13177 }
13178}
13179
aca88567
NC
13180/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13181 a 16-bit absolute RELA relocation used in DWARF debug sections. */
13182
13183static bfd_boolean
dda8d76d 13184is_16bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
4b78141a 13185{
d347c9df 13186 /* Please keep this table alpha-sorted for ease of visual lookup. */
dda8d76d 13187 switch (filedata->file_header.e_machine)
4b78141a 13188 {
886a2506
NC
13189 case EM_ARC:
13190 case EM_ARC_COMPACT:
13191 case EM_ARC_COMPACT2:
13192 return reloc_type == 2; /* R_ARC_16. */
d347c9df
PS
13193 case EM_ADAPTEVA_EPIPHANY:
13194 return reloc_type == 5;
aca88567
NC
13195 case EM_AVR_OLD:
13196 case EM_AVR:
13197 return reloc_type == 4; /* R_AVR_16. */
41e92641
NC
13198 case EM_CYGNUS_D10V:
13199 case EM_D10V:
13200 return reloc_type == 3; /* R_D10V_16. */
81b42bca
JB
13201 case EM_FT32:
13202 return reloc_type == 2; /* R_FT32_16. */
4b78141a
NC
13203 case EM_H8S:
13204 case EM_H8_300:
13205 case EM_H8_300H:
aca88567
NC
13206 return reloc_type == R_H8_DIR16;
13207 case EM_IP2K_OLD:
13208 case EM_IP2K:
13209 return reloc_type == 1; /* R_IP2K_16. */
ff7eeb89 13210 case EM_M32C_OLD:
f4236fe4
DD
13211 case EM_M32C:
13212 return reloc_type == 1; /* R_M32C_16 */
d347c9df
PS
13213 case EM_CYGNUS_MN10200:
13214 case EM_MN10200:
13215 return reloc_type == 2; /* R_MN10200_16. */
13216 case EM_CYGNUS_MN10300:
13217 case EM_MN10300:
13218 return reloc_type == 2; /* R_MN10300_16. */
aca88567 13219 case EM_MSP430:
dda8d76d 13220 if (uses_msp430x_relocs (filedata))
13761a11 13221 return reloc_type == 2; /* R_MSP430_ABS16. */
1a0670f3 13222 /* Fall through. */
78c8d46c 13223 case EM_MSP430_OLD:
aca88567 13224 return reloc_type == 5; /* R_MSP430_16_BYTE. */
35c08157
KLC
13225 case EM_NDS32:
13226 return reloc_type == 19; /* R_NDS32_RELA. */
3e0873ac 13227 case EM_ALTERA_NIOS2:
36591ba1 13228 return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16. */
3e0873ac
NC
13229 case EM_NIOS32:
13230 return reloc_type == 9; /* R_NIOS_16. */
73589c9d
CS
13231 case EM_OR1K:
13232 return reloc_type == 2; /* R_OR1K_16. */
39e07931
AS
13233 case EM_RISCV:
13234 return reloc_type == 55; /* R_RISCV_SET16. */
2b100bb5
DD
13235 case EM_TI_PRU:
13236 return reloc_type == 8; /* R_PRU_BFD_RELOC_16. */
40b36596
JM
13237 case EM_TI_C6000:
13238 return reloc_type == 2; /* R_C6000_ABS16. */
d347c9df
PS
13239 case EM_VISIUM:
13240 return reloc_type == 2; /* R_VISIUM_16. */
c29aca4a
NC
13241 case EM_XC16X:
13242 case EM_C166:
13243 return reloc_type == 2; /* R_XC16C_ABS_16. */
f6c1a2d5
NC
13244 case EM_XGATE:
13245 return reloc_type == 3; /* R_XGATE_16. */
6655dba2
SB
13246 case EM_Z80:
13247 return reloc_type == 4; /* R_Z80_16. */
4b78141a 13248 default:
aca88567 13249 return FALSE;
4b78141a
NC
13250 }
13251}
13252
39e07931
AS
13253/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13254 a 8-bit absolute RELA relocation used in DWARF debug sections. */
13255
13256static bfd_boolean
13257is_8bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
13258{
13259 switch (filedata->file_header.e_machine)
13260 {
13261 case EM_RISCV:
13262 return reloc_type == 54; /* R_RISCV_SET8. */
6655dba2
SB
13263 case EM_Z80:
13264 return reloc_type == 1; /* R_Z80_8. */
39e07931
AS
13265 default:
13266 return FALSE;
13267 }
13268}
13269
13270/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13271 a 6-bit absolute RELA relocation used in DWARF debug sections. */
13272
13273static bfd_boolean
13274is_6bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
13275{
13276 switch (filedata->file_header.e_machine)
13277 {
13278 case EM_RISCV:
13279 return reloc_type == 53; /* R_RISCV_SET6. */
13280 default:
13281 return FALSE;
13282 }
13283}
13284
03336641
JW
13285/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13286 a 32-bit inplace add RELA relocation used in DWARF debug sections. */
13287
13288static bfd_boolean
13289is_32bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
13290{
13291 /* Please keep this table alpha-sorted for ease of visual lookup. */
13292 switch (filedata->file_header.e_machine)
13293 {
13294 case EM_RISCV:
13295 return reloc_type == 35; /* R_RISCV_ADD32. */
13296 default:
13297 return FALSE;
13298 }
13299}
13300
13301/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13302 a 32-bit inplace sub RELA relocation used in DWARF debug sections. */
13303
13304static bfd_boolean
13305is_32bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
13306{
13307 /* Please keep this table alpha-sorted for ease of visual lookup. */
13308 switch (filedata->file_header.e_machine)
13309 {
13310 case EM_RISCV:
13311 return reloc_type == 39; /* R_RISCV_SUB32. */
13312 default:
13313 return FALSE;
13314 }
13315}
13316
13317/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13318 a 64-bit inplace add RELA relocation used in DWARF debug sections. */
13319
13320static bfd_boolean
13321is_64bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
13322{
13323 /* Please keep this table alpha-sorted for ease of visual lookup. */
13324 switch (filedata->file_header.e_machine)
13325 {
13326 case EM_RISCV:
13327 return reloc_type == 36; /* R_RISCV_ADD64. */
13328 default:
13329 return FALSE;
13330 }
13331}
13332
13333/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13334 a 64-bit inplace sub RELA relocation used in DWARF debug sections. */
13335
13336static bfd_boolean
13337is_64bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
13338{
13339 /* Please keep this table alpha-sorted for ease of visual lookup. */
13340 switch (filedata->file_header.e_machine)
13341 {
13342 case EM_RISCV:
13343 return reloc_type == 40; /* R_RISCV_SUB64. */
13344 default:
13345 return FALSE;
13346 }
13347}
13348
13349/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13350 a 16-bit inplace add RELA relocation used in DWARF debug sections. */
13351
13352static bfd_boolean
13353is_16bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
13354{
13355 /* Please keep this table alpha-sorted for ease of visual lookup. */
13356 switch (filedata->file_header.e_machine)
13357 {
13358 case EM_RISCV:
13359 return reloc_type == 34; /* R_RISCV_ADD16. */
13360 default:
13361 return FALSE;
13362 }
13363}
13364
13365/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13366 a 16-bit inplace sub RELA relocation used in DWARF debug sections. */
13367
13368static bfd_boolean
13369is_16bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
13370{
13371 /* Please keep this table alpha-sorted for ease of visual lookup. */
13372 switch (filedata->file_header.e_machine)
13373 {
13374 case EM_RISCV:
13375 return reloc_type == 38; /* R_RISCV_SUB16. */
13376 default:
13377 return FALSE;
13378 }
13379}
13380
13381/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13382 a 8-bit inplace add RELA relocation used in DWARF debug sections. */
13383
13384static bfd_boolean
13385is_8bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
13386{
13387 /* Please keep this table alpha-sorted for ease of visual lookup. */
13388 switch (filedata->file_header.e_machine)
13389 {
13390 case EM_RISCV:
13391 return reloc_type == 33; /* R_RISCV_ADD8. */
13392 default:
13393 return FALSE;
13394 }
13395}
13396
13397/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13398 a 8-bit inplace sub RELA relocation used in DWARF debug sections. */
13399
13400static bfd_boolean
13401is_8bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
13402{
13403 /* Please keep this table alpha-sorted for ease of visual lookup. */
13404 switch (filedata->file_header.e_machine)
13405 {
13406 case EM_RISCV:
13407 return reloc_type == 37; /* R_RISCV_SUB8. */
13408 default:
13409 return FALSE;
13410 }
13411}
13412
39e07931
AS
13413/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13414 a 6-bit inplace sub RELA relocation used in DWARF debug sections. */
13415
13416static bfd_boolean
13417is_6bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
13418{
13419 switch (filedata->file_header.e_machine)
13420 {
13421 case EM_RISCV:
13422 return reloc_type == 52; /* R_RISCV_SUB6. */
13423 default:
13424 return FALSE;
13425 }
13426}
13427
2a7b2e88
JK
13428/* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
13429 relocation entries (possibly formerly used for SHT_GROUP sections). */
13430
13431static bfd_boolean
dda8d76d 13432is_none_reloc (Filedata * filedata, unsigned int reloc_type)
2a7b2e88 13433{
dda8d76d 13434 switch (filedata->file_header.e_machine)
2a7b2e88 13435 {
cb8f3167 13436 case EM_386: /* R_386_NONE. */
d347c9df 13437 case EM_68K: /* R_68K_NONE. */
cfb8c092 13438 case EM_ADAPTEVA_EPIPHANY:
d347c9df
PS
13439 case EM_ALPHA: /* R_ALPHA_NONE. */
13440 case EM_ALTERA_NIOS2: /* R_NIOS2_NONE. */
886a2506 13441 case EM_ARC: /* R_ARC_NONE. */
886a2506 13442 case EM_ARC_COMPACT2: /* R_ARC_NONE. */
d347c9df 13443 case EM_ARC_COMPACT: /* R_ARC_NONE. */
cb8f3167 13444 case EM_ARM: /* R_ARM_NONE. */
d347c9df 13445 case EM_C166: /* R_XC16X_NONE. */
cb8f3167 13446 case EM_CRIS: /* R_CRIS_NONE. */
d347c9df
PS
13447 case EM_FT32: /* R_FT32_NONE. */
13448 case EM_IA_64: /* R_IA64_NONE. */
7a9068fe 13449 case EM_K1OM: /* R_X86_64_NONE. */
d347c9df
PS
13450 case EM_L1OM: /* R_X86_64_NONE. */
13451 case EM_M32R: /* R_M32R_NONE. */
13452 case EM_MIPS: /* R_MIPS_NONE. */
cb8f3167 13453 case EM_MN10300: /* R_MN10300_NONE. */
5506d11a 13454 case EM_MOXIE: /* R_MOXIE_NONE. */
d347c9df
PS
13455 case EM_NIOS32: /* R_NIOS_NONE. */
13456 case EM_OR1K: /* R_OR1K_NONE. */
13457 case EM_PARISC: /* R_PARISC_NONE. */
13458 case EM_PPC64: /* R_PPC64_NONE. */
13459 case EM_PPC: /* R_PPC_NONE. */
e23eba97 13460 case EM_RISCV: /* R_RISCV_NONE. */
d347c9df
PS
13461 case EM_S390: /* R_390_NONE. */
13462 case EM_S390_OLD:
13463 case EM_SH: /* R_SH_NONE. */
13464 case EM_SPARC32PLUS:
13465 case EM_SPARC: /* R_SPARC_NONE. */
13466 case EM_SPARCV9:
aa137e4d
NC
13467 case EM_TILEGX: /* R_TILEGX_NONE. */
13468 case EM_TILEPRO: /* R_TILEPRO_NONE. */
d347c9df
PS
13469 case EM_TI_C6000:/* R_C6000_NONE. */
13470 case EM_X86_64: /* R_X86_64_NONE. */
c29aca4a 13471 case EM_XC16X:
6655dba2 13472 case EM_Z80: /* R_Z80_NONE. */
f96bd6c2 13473 case EM_WEBASSEMBLY: /* R_WASM32_NONE. */
cb8f3167 13474 return reloc_type == 0;
d347c9df 13475
a06ea964
NC
13476 case EM_AARCH64:
13477 return reloc_type == 0 || reloc_type == 256;
d347c9df
PS
13478 case EM_AVR_OLD:
13479 case EM_AVR:
13480 return (reloc_type == 0 /* R_AVR_NONE. */
13481 || reloc_type == 30 /* R_AVR_DIFF8. */
13482 || reloc_type == 31 /* R_AVR_DIFF16. */
13483 || reloc_type == 32 /* R_AVR_DIFF32. */);
13484 case EM_METAG:
13485 return reloc_type == 3; /* R_METAG_NONE. */
35c08157
KLC
13486 case EM_NDS32:
13487 return (reloc_type == 0 /* R_XTENSA_NONE. */
13488 || reloc_type == 204 /* R_NDS32_DIFF8. */
13489 || reloc_type == 205 /* R_NDS32_DIFF16. */
13490 || reloc_type == 206 /* R_NDS32_DIFF32. */
13491 || reloc_type == 207 /* R_NDS32_ULEB128. */);
2b100bb5
DD
13492 case EM_TI_PRU:
13493 return (reloc_type == 0 /* R_PRU_NONE. */
13494 || reloc_type == 65 /* R_PRU_DIFF8. */
13495 || reloc_type == 66 /* R_PRU_DIFF16. */
13496 || reloc_type == 67 /* R_PRU_DIFF32. */);
58332dda
JK
13497 case EM_XTENSA_OLD:
13498 case EM_XTENSA:
4dc3c23d
AM
13499 return (reloc_type == 0 /* R_XTENSA_NONE. */
13500 || reloc_type == 17 /* R_XTENSA_DIFF8. */
13501 || reloc_type == 18 /* R_XTENSA_DIFF16. */
30ce8e47
MF
13502 || reloc_type == 19 /* R_XTENSA_DIFF32. */
13503 || reloc_type == 57 /* R_XTENSA_PDIFF8. */
13504 || reloc_type == 58 /* R_XTENSA_PDIFF16. */
13505 || reloc_type == 59 /* R_XTENSA_PDIFF32. */
13506 || reloc_type == 60 /* R_XTENSA_NDIFF8. */
13507 || reloc_type == 61 /* R_XTENSA_NDIFF16. */
13508 || reloc_type == 62 /* R_XTENSA_NDIFF32. */);
2a7b2e88
JK
13509 }
13510 return FALSE;
13511}
13512
d1c4b12b
NC
13513/* Returns TRUE if there is a relocation against
13514 section NAME at OFFSET bytes. */
13515
13516bfd_boolean
13517reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
13518{
13519 Elf_Internal_Rela * relocs;
13520 Elf_Internal_Rela * rp;
13521
13522 if (dsec == NULL || dsec->reloc_info == NULL)
13523 return FALSE;
13524
13525 relocs = (Elf_Internal_Rela *) dsec->reloc_info;
13526
13527 for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
13528 if (rp->r_offset == offset)
13529 return TRUE;
13530
13531 return FALSE;
13532}
13533
cf13d699 13534/* Apply relocations to a section.
32ec8896
NC
13535 Returns TRUE upon success, FALSE otherwise.
13536 If RELOCS_RETURN is non-NULL then it is set to point to the loaded relocs.
13537 It is then the caller's responsibility to free them. NUM_RELOCS_RETURN
13538 will be set to the number of relocs loaded.
13539
cf13d699 13540 Note: So far support has been added only for those relocations
32ec8896
NC
13541 which can be found in debug sections. FIXME: Add support for
13542 more relocations ? */
1b315056 13543
32ec8896 13544static bfd_boolean
dda8d76d 13545apply_relocations (Filedata * filedata,
d1c4b12b
NC
13546 const Elf_Internal_Shdr * section,
13547 unsigned char * start,
13548 bfd_size_type size,
1449284b 13549 void ** relocs_return,
d1c4b12b 13550 unsigned long * num_relocs_return)
1b315056 13551{
cf13d699 13552 Elf_Internal_Shdr * relsec;
0d2a7a93 13553 unsigned char * end = start + size;
cb8f3167 13554
d1c4b12b
NC
13555 if (relocs_return != NULL)
13556 {
13557 * (Elf_Internal_Rela **) relocs_return = NULL;
13558 * num_relocs_return = 0;
13559 }
13560
dda8d76d 13561 if (filedata->file_header.e_type != ET_REL)
32ec8896
NC
13562 /* No relocs to apply. */
13563 return TRUE;
1b315056 13564
cf13d699 13565 /* Find the reloc section associated with the section. */
dda8d76d
NC
13566 for (relsec = filedata->section_headers;
13567 relsec < filedata->section_headers + filedata->file_header.e_shnum;
5b18a4bc 13568 ++relsec)
252b5132 13569 {
41e92641
NC
13570 bfd_boolean is_rela;
13571 unsigned long num_relocs;
2cf0635d
NC
13572 Elf_Internal_Rela * relocs;
13573 Elf_Internal_Rela * rp;
13574 Elf_Internal_Shdr * symsec;
13575 Elf_Internal_Sym * symtab;
ba5cdace 13576 unsigned long num_syms;
2cf0635d 13577 Elf_Internal_Sym * sym;
252b5132 13578
41e92641 13579 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
dda8d76d
NC
13580 || relsec->sh_info >= filedata->file_header.e_shnum
13581 || filedata->section_headers + relsec->sh_info != section
c256ffe7 13582 || relsec->sh_size == 0
dda8d76d 13583 || relsec->sh_link >= filedata->file_header.e_shnum)
5b18a4bc 13584 continue;
428409d5 13585
a788aedd
AM
13586 symsec = filedata->section_headers + relsec->sh_link;
13587 if (symsec->sh_type != SHT_SYMTAB
13588 && symsec->sh_type != SHT_DYNSYM)
13589 return FALSE;
13590
41e92641
NC
13591 is_rela = relsec->sh_type == SHT_RELA;
13592
13593 if (is_rela)
13594 {
dda8d76d 13595 if (!slurp_rela_relocs (filedata, relsec->sh_offset,
3f5e193b 13596 relsec->sh_size, & relocs, & num_relocs))
32ec8896 13597 return FALSE;
41e92641
NC
13598 }
13599 else
13600 {
dda8d76d 13601 if (!slurp_rel_relocs (filedata, relsec->sh_offset,
3f5e193b 13602 relsec->sh_size, & relocs, & num_relocs))
32ec8896 13603 return FALSE;
41e92641
NC
13604 }
13605
13606 /* SH uses RELA but uses in place value instead of the addend field. */
dda8d76d 13607 if (filedata->file_header.e_machine == EM_SH)
41e92641 13608 is_rela = FALSE;
428409d5 13609
dda8d76d 13610 symtab = GET_ELF_SYMBOLS (filedata, symsec, & num_syms);
103f02d3 13611
41e92641 13612 for (rp = relocs; rp < relocs + num_relocs; ++rp)
252b5132 13613 {
41e92641
NC
13614 bfd_vma addend;
13615 unsigned int reloc_type;
13616 unsigned int reloc_size;
03336641
JW
13617 bfd_boolean reloc_inplace = FALSE;
13618 bfd_boolean reloc_subtract = FALSE;
91d6fa6a 13619 unsigned char * rloc;
ba5cdace 13620 unsigned long sym_index;
4b78141a 13621
dda8d76d 13622 reloc_type = get_reloc_type (filedata, rp->r_info);
41e92641 13623
dda8d76d 13624 if (target_specific_reloc_handling (filedata, rp, start, end, symtab, num_syms))
2a7b2e88 13625 continue;
dda8d76d 13626 else if (is_none_reloc (filedata, reloc_type))
98fb390a 13627 continue;
dda8d76d
NC
13628 else if (is_32bit_abs_reloc (filedata, reloc_type)
13629 || is_32bit_pcrel_reloc (filedata, reloc_type))
aca88567 13630 reloc_size = 4;
dda8d76d
NC
13631 else if (is_64bit_abs_reloc (filedata, reloc_type)
13632 || is_64bit_pcrel_reloc (filedata, reloc_type))
aca88567 13633 reloc_size = 8;
dda8d76d 13634 else if (is_24bit_abs_reloc (filedata, reloc_type))
4dc3c23d 13635 reloc_size = 3;
dda8d76d 13636 else if (is_16bit_abs_reloc (filedata, reloc_type))
aca88567 13637 reloc_size = 2;
39e07931
AS
13638 else if (is_8bit_abs_reloc (filedata, reloc_type)
13639 || is_6bit_abs_reloc (filedata, reloc_type))
13640 reloc_size = 1;
03336641
JW
13641 else if ((reloc_subtract = is_32bit_inplace_sub_reloc (filedata,
13642 reloc_type))
13643 || is_32bit_inplace_add_reloc (filedata, reloc_type))
13644 {
13645 reloc_size = 4;
13646 reloc_inplace = TRUE;
13647 }
13648 else if ((reloc_subtract = is_64bit_inplace_sub_reloc (filedata,
13649 reloc_type))
13650 || is_64bit_inplace_add_reloc (filedata, reloc_type))
13651 {
13652 reloc_size = 8;
13653 reloc_inplace = TRUE;
13654 }
13655 else if ((reloc_subtract = is_16bit_inplace_sub_reloc (filedata,
13656 reloc_type))
13657 || is_16bit_inplace_add_reloc (filedata, reloc_type))
13658 {
13659 reloc_size = 2;
13660 reloc_inplace = TRUE;
13661 }
13662 else if ((reloc_subtract = is_8bit_inplace_sub_reloc (filedata,
13663 reloc_type))
13664 || is_8bit_inplace_add_reloc (filedata, reloc_type))
13665 {
13666 reloc_size = 1;
13667 reloc_inplace = TRUE;
13668 }
39e07931
AS
13669 else if ((reloc_subtract = is_6bit_inplace_sub_reloc (filedata,
13670 reloc_type)))
13671 {
13672 reloc_size = 1;
13673 reloc_inplace = TRUE;
13674 }
aca88567 13675 else
4b78141a 13676 {
bee0ee85 13677 static unsigned int prev_reloc = 0;
dda8d76d 13678
bee0ee85
NC
13679 if (reloc_type != prev_reloc)
13680 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
dda8d76d 13681 reloc_type, printable_section_name (filedata, section));
bee0ee85 13682 prev_reloc = reloc_type;
4b78141a
NC
13683 continue;
13684 }
103f02d3 13685
91d6fa6a 13686 rloc = start + rp->r_offset;
75802ccb 13687 if (!IN_RANGE (start, end, rloc, reloc_size))
700dd8b7
L
13688 {
13689 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
13690 (unsigned long) rp->r_offset,
dda8d76d 13691 printable_section_name (filedata, section));
700dd8b7
L
13692 continue;
13693 }
103f02d3 13694
ba5cdace
NC
13695 sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
13696 if (sym_index >= num_syms)
13697 {
13698 warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
dda8d76d 13699 sym_index, printable_section_name (filedata, section));
ba5cdace
NC
13700 continue;
13701 }
13702 sym = symtab + sym_index;
41e92641
NC
13703
13704 /* If the reloc has a symbol associated with it,
55f25fc3
L
13705 make sure that it is of an appropriate type.
13706
13707 Relocations against symbols without type can happen.
13708 Gcc -feliminate-dwarf2-dups may generate symbols
13709 without type for debug info.
13710
13711 Icc generates relocations against function symbols
13712 instead of local labels.
13713
13714 Relocations against object symbols can happen, eg when
13715 referencing a global array. For an example of this see
13716 the _clz.o binary in libgcc.a. */
aca88567 13717 if (sym != symtab
b8871f35 13718 && ELF_ST_TYPE (sym->st_info) != STT_COMMON
55f25fc3 13719 && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
5b18a4bc 13720 {
d3a49aa8 13721 warn (_("skipping unexpected symbol type %s in section %s relocation %ld\n"),
dda8d76d
NC
13722 get_symbol_type (filedata, ELF_ST_TYPE (sym->st_info)),
13723 printable_section_name (filedata, relsec),
d3a49aa8 13724 (long int)(rp - relocs));
aca88567 13725 continue;
5b18a4bc 13726 }
252b5132 13727
4dc3c23d
AM
13728 addend = 0;
13729 if (is_rela)
13730 addend += rp->r_addend;
c47320c3
AM
13731 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
13732 partial_inplace. */
4dc3c23d 13733 if (!is_rela
dda8d76d 13734 || (filedata->file_header.e_machine == EM_XTENSA
4dc3c23d 13735 && reloc_type == 1)
dda8d76d
NC
13736 || ((filedata->file_header.e_machine == EM_PJ
13737 || filedata->file_header.e_machine == EM_PJ_OLD)
c47320c3 13738 && reloc_type == 1)
dda8d76d
NC
13739 || ((filedata->file_header.e_machine == EM_D30V
13740 || filedata->file_header.e_machine == EM_CYGNUS_D30V)
03336641
JW
13741 && reloc_type == 12)
13742 || reloc_inplace)
39e07931
AS
13743 {
13744 if (is_6bit_inplace_sub_reloc (filedata, reloc_type))
13745 addend += byte_get (rloc, reloc_size) & 0x3f;
13746 else
13747 addend += byte_get (rloc, reloc_size);
13748 }
cb8f3167 13749
dda8d76d
NC
13750 if (is_32bit_pcrel_reloc (filedata, reloc_type)
13751 || is_64bit_pcrel_reloc (filedata, reloc_type))
85acf597
RH
13752 {
13753 /* On HPPA, all pc-relative relocations are biased by 8. */
dda8d76d 13754 if (filedata->file_header.e_machine == EM_PARISC)
85acf597 13755 addend -= 8;
91d6fa6a 13756 byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
85acf597
RH
13757 reloc_size);
13758 }
39e07931
AS
13759 else if (is_6bit_abs_reloc (filedata, reloc_type)
13760 || is_6bit_inplace_sub_reloc (filedata, reloc_type))
13761 {
13762 if (reloc_subtract)
13763 addend -= sym->st_value;
13764 else
13765 addend += sym->st_value;
13766 addend = (addend & 0x3f) | (byte_get (rloc, reloc_size) & 0xc0);
13767 byte_put (rloc, addend, reloc_size);
13768 }
03336641
JW
13769 else if (reloc_subtract)
13770 byte_put (rloc, addend - sym->st_value, reloc_size);
41e92641 13771 else
91d6fa6a 13772 byte_put (rloc, addend + sym->st_value, reloc_size);
5b18a4bc 13773 }
252b5132 13774
5b18a4bc 13775 free (symtab);
f84ce13b
NC
13776 /* Let the target specific reloc processing code know that
13777 we have finished with these relocs. */
dda8d76d 13778 target_specific_reloc_handling (filedata, NULL, NULL, NULL, NULL, 0);
d1c4b12b
NC
13779
13780 if (relocs_return)
13781 {
13782 * (Elf_Internal_Rela **) relocs_return = relocs;
13783 * num_relocs_return = num_relocs;
13784 }
13785 else
13786 free (relocs);
13787
5b18a4bc
NC
13788 break;
13789 }
32ec8896 13790
dfc616fa 13791 return TRUE;
5b18a4bc 13792}
103f02d3 13793
cf13d699 13794#ifdef SUPPORT_DISASSEMBLY
32ec8896 13795static bfd_boolean
dda8d76d 13796disassemble_section (Elf_Internal_Shdr * section, Filedata * filedata)
cf13d699 13797{
dda8d76d 13798 printf (_("\nAssembly dump of section %s\n"), printable_section_name (filedata, section));
cf13d699 13799
74e1a04b 13800 /* FIXME: XXX -- to be done --- XXX */
cf13d699 13801
32ec8896 13802 return TRUE;
cf13d699
NC
13803}
13804#endif
13805
13806/* Reads in the contents of SECTION from FILE, returning a pointer
13807 to a malloc'ed buffer or NULL if something went wrong. */
13808
13809static char *
dda8d76d 13810get_section_contents (Elf_Internal_Shdr * section, Filedata * filedata)
cf13d699 13811{
dda8d76d 13812 bfd_size_type num_bytes = section->sh_size;
cf13d699
NC
13813
13814 if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
13815 {
c6b78c96 13816 printf (_("Section '%s' has no data to dump.\n"),
dda8d76d 13817 printable_section_name (filedata, section));
cf13d699
NC
13818 return NULL;
13819 }
13820
dda8d76d 13821 return (char *) get_data (NULL, filedata, section->sh_offset, 1, num_bytes,
3f5e193b 13822 _("section contents"));
cf13d699
NC
13823}
13824
0e602686
NC
13825/* Uncompresses a section that was compressed using zlib, in place. */
13826
13827static bfd_boolean
dda8d76d
NC
13828uncompress_section_contents (unsigned char ** buffer,
13829 dwarf_size_type uncompressed_size,
13830 dwarf_size_type * size)
0e602686
NC
13831{
13832 dwarf_size_type compressed_size = *size;
13833 unsigned char * compressed_buffer = *buffer;
13834 unsigned char * uncompressed_buffer;
13835 z_stream strm;
13836 int rc;
13837
13838 /* It is possible the section consists of several compressed
13839 buffers concatenated together, so we uncompress in a loop. */
13840 /* PR 18313: The state field in the z_stream structure is supposed
13841 to be invisible to the user (ie us), but some compilers will
13842 still complain about it being used without initialisation. So
13843 we first zero the entire z_stream structure and then set the fields
13844 that we need. */
13845 memset (& strm, 0, sizeof strm);
13846 strm.avail_in = compressed_size;
13847 strm.next_in = (Bytef *) compressed_buffer;
13848 strm.avail_out = uncompressed_size;
13849 uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
13850
13851 rc = inflateInit (& strm);
13852 while (strm.avail_in > 0)
13853 {
13854 if (rc != Z_OK)
13855 goto fail;
13856 strm.next_out = ((Bytef *) uncompressed_buffer
13857 + (uncompressed_size - strm.avail_out));
13858 rc = inflate (&strm, Z_FINISH);
13859 if (rc != Z_STREAM_END)
13860 goto fail;
13861 rc = inflateReset (& strm);
13862 }
13863 rc = inflateEnd (& strm);
13864 if (rc != Z_OK
13865 || strm.avail_out != 0)
13866 goto fail;
13867
13868 *buffer = uncompressed_buffer;
13869 *size = uncompressed_size;
13870 return TRUE;
13871
13872 fail:
13873 free (uncompressed_buffer);
13874 /* Indicate decompression failure. */
13875 *buffer = NULL;
13876 return FALSE;
13877}
dd24e3da 13878
32ec8896 13879static bfd_boolean
dda8d76d 13880dump_section_as_strings (Elf_Internal_Shdr * section, Filedata * filedata)
cf13d699 13881{
0e602686
NC
13882 Elf_Internal_Shdr * relsec;
13883 bfd_size_type num_bytes;
fd8008d8
L
13884 unsigned char * data;
13885 unsigned char * end;
13886 unsigned char * real_start;
13887 unsigned char * start;
0e602686 13888 bfd_boolean some_strings_shown;
cf13d699 13889
dda8d76d 13890 real_start = start = (unsigned char *) get_section_contents (section, filedata);
cf13d699 13891 if (start == NULL)
c6b78c96
NC
13892 /* PR 21820: Do not fail if the section was empty. */
13893 return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
13894
0e602686 13895 num_bytes = section->sh_size;
cf13d699 13896
dda8d76d 13897 printf (_("\nString dump of section '%s':\n"), printable_section_name (filedata, section));
cf13d699 13898
0e602686
NC
13899 if (decompress_dumps)
13900 {
13901 dwarf_size_type new_size = num_bytes;
13902 dwarf_size_type uncompressed_size = 0;
13903
13904 if ((section->sh_flags & SHF_COMPRESSED) != 0)
13905 {
13906 Elf_Internal_Chdr chdr;
13907 unsigned int compression_header_size
ebdf1ebf
NC
13908 = get_compression_header (& chdr, (unsigned char *) start,
13909 num_bytes);
5844b465
NC
13910 if (compression_header_size == 0)
13911 /* An error message will have already been generated
13912 by get_compression_header. */
13913 goto error_out;
0e602686 13914
813dabb9 13915 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
0e602686 13916 {
813dabb9 13917 warn (_("section '%s' has unsupported compress type: %d\n"),
dda8d76d 13918 printable_section_name (filedata, section), chdr.ch_type);
f761cb13 13919 goto error_out;
813dabb9 13920 }
813dabb9
L
13921 uncompressed_size = chdr.ch_size;
13922 start += compression_header_size;
13923 new_size -= compression_header_size;
0e602686
NC
13924 }
13925 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
13926 {
13927 /* Read the zlib header. In this case, it should be "ZLIB"
13928 followed by the uncompressed section size, 8 bytes in
13929 big-endian order. */
13930 uncompressed_size = start[4]; uncompressed_size <<= 8;
13931 uncompressed_size += start[5]; uncompressed_size <<= 8;
13932 uncompressed_size += start[6]; uncompressed_size <<= 8;
13933 uncompressed_size += start[7]; uncompressed_size <<= 8;
13934 uncompressed_size += start[8]; uncompressed_size <<= 8;
13935 uncompressed_size += start[9]; uncompressed_size <<= 8;
13936 uncompressed_size += start[10]; uncompressed_size <<= 8;
13937 uncompressed_size += start[11];
13938 start += 12;
13939 new_size -= 12;
13940 }
13941
1835f746
NC
13942 if (uncompressed_size)
13943 {
13944 if (uncompress_section_contents (& start,
13945 uncompressed_size, & new_size))
13946 num_bytes = new_size;
13947 else
13948 {
13949 error (_("Unable to decompress section %s\n"),
dda8d76d 13950 printable_section_name (filedata, section));
f761cb13 13951 goto error_out;
1835f746
NC
13952 }
13953 }
bc303e5d
NC
13954 else
13955 start = real_start;
0e602686 13956 }
fd8008d8 13957
cf13d699
NC
13958 /* If the section being dumped has relocations against it the user might
13959 be expecting these relocations to have been applied. Check for this
13960 case and issue a warning message in order to avoid confusion.
13961 FIXME: Maybe we ought to have an option that dumps a section with
13962 relocs applied ? */
dda8d76d
NC
13963 for (relsec = filedata->section_headers;
13964 relsec < filedata->section_headers + filedata->file_header.e_shnum;
cf13d699
NC
13965 ++relsec)
13966 {
13967 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
dda8d76d
NC
13968 || relsec->sh_info >= filedata->file_header.e_shnum
13969 || filedata->section_headers + relsec->sh_info != section
cf13d699 13970 || relsec->sh_size == 0
dda8d76d 13971 || relsec->sh_link >= filedata->file_header.e_shnum)
cf13d699
NC
13972 continue;
13973
13974 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
13975 break;
13976 }
13977
cf13d699
NC
13978 data = start;
13979 end = start + num_bytes;
13980 some_strings_shown = FALSE;
13981
ba3265d0
NC
13982#ifdef HAVE_MBSTATE_T
13983 mbstate_t state;
13984 /* Initialise the multibyte conversion state. */
13985 memset (& state, 0, sizeof (state));
13986#endif
13987
13988 bfd_boolean continuing = FALSE;
13989
cf13d699
NC
13990 while (data < end)
13991 {
13992 while (!ISPRINT (* data))
13993 if (++ data >= end)
13994 break;
13995
13996 if (data < end)
13997 {
071436c6
NC
13998 size_t maxlen = end - data;
13999
ba3265d0
NC
14000 if (continuing)
14001 {
14002 printf (" ");
14003 continuing = FALSE;
14004 }
14005 else
14006 {
d1ce973e 14007 printf (" [%6lx] ", (unsigned long) (data - start));
ba3265d0
NC
14008 }
14009
4082ef84
NC
14010 if (maxlen > 0)
14011 {
f3da8a96 14012 char c = 0;
ba3265d0
NC
14013
14014 while (maxlen)
14015 {
14016 c = *data++;
14017
14018 if (c == 0)
14019 break;
14020
14021 /* PR 25543: Treat new-lines as string-ending characters. */
14022 if (c == '\n')
14023 {
14024 printf ("\\n\n");
14025 if (*data != 0)
14026 continuing = TRUE;
14027 break;
14028 }
14029
14030 /* Do not print control characters directly as they can affect terminal
14031 settings. Such characters usually appear in the names generated
14032 by the assembler for local labels. */
14033 if (ISCNTRL (c))
14034 {
14035 printf ("^%c", c + 0x40);
14036 }
14037 else if (ISPRINT (c))
14038 {
14039 putchar (c);
14040 }
14041 else
14042 {
14043 size_t n;
14044#ifdef HAVE_MBSTATE_T
14045 wchar_t w;
14046#endif
14047 /* Let printf do the hard work of displaying multibyte characters. */
14048 printf ("%.1s", data - 1);
14049#ifdef HAVE_MBSTATE_T
14050 /* Try to find out how many bytes made up the character that was
14051 just printed. Advance the symbol pointer past the bytes that
14052 were displayed. */
14053 n = mbrtowc (& w, (char *)(data - 1), MB_CUR_MAX, & state);
14054#else
14055 n = 1;
14056#endif
14057 if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
14058 data += (n - 1);
14059 }
14060 }
14061
14062 if (c != '\n')
14063 putchar ('\n');
4082ef84
NC
14064 }
14065 else
14066 {
14067 printf (_("<corrupt>\n"));
14068 data = end;
14069 }
cf13d699
NC
14070 some_strings_shown = TRUE;
14071 }
14072 }
14073
14074 if (! some_strings_shown)
14075 printf (_(" No strings found in this section."));
14076
0e602686 14077 free (real_start);
cf13d699
NC
14078
14079 putchar ('\n');
32ec8896 14080 return TRUE;
f761cb13
AM
14081
14082error_out:
14083 free (real_start);
14084 return FALSE;
cf13d699
NC
14085}
14086
32ec8896 14087static bfd_boolean
dda8d76d
NC
14088dump_section_as_bytes (Elf_Internal_Shdr * section,
14089 Filedata * filedata,
14090 bfd_boolean relocate)
cf13d699
NC
14091{
14092 Elf_Internal_Shdr * relsec;
0e602686
NC
14093 bfd_size_type bytes;
14094 bfd_size_type section_size;
14095 bfd_vma addr;
14096 unsigned char * data;
14097 unsigned char * real_start;
14098 unsigned char * start;
14099
dda8d76d 14100 real_start = start = (unsigned char *) get_section_contents (section, filedata);
cf13d699 14101 if (start == NULL)
c6b78c96
NC
14102 /* PR 21820: Do not fail if the section was empty. */
14103 return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
32ec8896 14104
0e602686 14105 section_size = section->sh_size;
cf13d699 14106
dda8d76d 14107 printf (_("\nHex dump of section '%s':\n"), printable_section_name (filedata, section));
cf13d699 14108
0e602686
NC
14109 if (decompress_dumps)
14110 {
14111 dwarf_size_type new_size = section_size;
14112 dwarf_size_type uncompressed_size = 0;
14113
14114 if ((section->sh_flags & SHF_COMPRESSED) != 0)
14115 {
14116 Elf_Internal_Chdr chdr;
14117 unsigned int compression_header_size
ebdf1ebf 14118 = get_compression_header (& chdr, start, section_size);
0e602686 14119
5844b465
NC
14120 if (compression_header_size == 0)
14121 /* An error message will have already been generated
14122 by get_compression_header. */
14123 goto error_out;
14124
813dabb9 14125 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
0e602686 14126 {
813dabb9 14127 warn (_("section '%s' has unsupported compress type: %d\n"),
dda8d76d 14128 printable_section_name (filedata, section), chdr.ch_type);
f761cb13 14129 goto error_out;
0e602686 14130 }
813dabb9
L
14131 uncompressed_size = chdr.ch_size;
14132 start += compression_header_size;
14133 new_size -= compression_header_size;
0e602686
NC
14134 }
14135 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
14136 {
14137 /* Read the zlib header. In this case, it should be "ZLIB"
14138 followed by the uncompressed section size, 8 bytes in
14139 big-endian order. */
14140 uncompressed_size = start[4]; uncompressed_size <<= 8;
14141 uncompressed_size += start[5]; uncompressed_size <<= 8;
14142 uncompressed_size += start[6]; uncompressed_size <<= 8;
14143 uncompressed_size += start[7]; uncompressed_size <<= 8;
14144 uncompressed_size += start[8]; uncompressed_size <<= 8;
14145 uncompressed_size += start[9]; uncompressed_size <<= 8;
14146 uncompressed_size += start[10]; uncompressed_size <<= 8;
14147 uncompressed_size += start[11];
14148 start += 12;
14149 new_size -= 12;
14150 }
14151
f055032e
NC
14152 if (uncompressed_size)
14153 {
14154 if (uncompress_section_contents (& start, uncompressed_size,
14155 & new_size))
bc303e5d
NC
14156 {
14157 section_size = new_size;
14158 }
f055032e
NC
14159 else
14160 {
14161 error (_("Unable to decompress section %s\n"),
dda8d76d 14162 printable_section_name (filedata, section));
bc303e5d 14163 /* FIXME: Print the section anyway ? */
f761cb13 14164 goto error_out;
f055032e
NC
14165 }
14166 }
bc303e5d
NC
14167 else
14168 start = real_start;
0e602686 14169 }
14ae95f2 14170
cf13d699
NC
14171 if (relocate)
14172 {
dda8d76d 14173 if (! apply_relocations (filedata, section, start, section_size, NULL, NULL))
f761cb13 14174 goto error_out;
cf13d699
NC
14175 }
14176 else
14177 {
14178 /* If the section being dumped has relocations against it the user might
14179 be expecting these relocations to have been applied. Check for this
14180 case and issue a warning message in order to avoid confusion.
14181 FIXME: Maybe we ought to have an option that dumps a section with
14182 relocs applied ? */
dda8d76d
NC
14183 for (relsec = filedata->section_headers;
14184 relsec < filedata->section_headers + filedata->file_header.e_shnum;
cf13d699
NC
14185 ++relsec)
14186 {
14187 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
dda8d76d
NC
14188 || relsec->sh_info >= filedata->file_header.e_shnum
14189 || filedata->section_headers + relsec->sh_info != section
cf13d699 14190 || relsec->sh_size == 0
dda8d76d 14191 || relsec->sh_link >= filedata->file_header.e_shnum)
cf13d699
NC
14192 continue;
14193
14194 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
14195 break;
14196 }
14197 }
14198
14199 addr = section->sh_addr;
0e602686 14200 bytes = section_size;
cf13d699
NC
14201 data = start;
14202
14203 while (bytes)
14204 {
14205 int j;
14206 int k;
14207 int lbytes;
14208
14209 lbytes = (bytes > 16 ? 16 : bytes);
14210
14211 printf (" 0x%8.8lx ", (unsigned long) addr);
14212
14213 for (j = 0; j < 16; j++)
14214 {
14215 if (j < lbytes)
14216 printf ("%2.2x", data[j]);
14217 else
14218 printf (" ");
14219
14220 if ((j & 3) == 3)
14221 printf (" ");
14222 }
14223
14224 for (j = 0; j < lbytes; j++)
14225 {
14226 k = data[j];
14227 if (k >= ' ' && k < 0x7f)
14228 printf ("%c", k);
14229 else
14230 printf (".");
14231 }
14232
14233 putchar ('\n');
14234
14235 data += lbytes;
14236 addr += lbytes;
14237 bytes -= lbytes;
14238 }
14239
0e602686 14240 free (real_start);
cf13d699
NC
14241
14242 putchar ('\n');
32ec8896 14243 return TRUE;
f761cb13
AM
14244
14245 error_out:
14246 free (real_start);
14247 return FALSE;
cf13d699
NC
14248}
14249
094e34f2 14250#ifdef ENABLE_LIBCTF
7d9813f1
NA
14251static ctf_sect_t *
14252shdr_to_ctf_sect (ctf_sect_t *buf, Elf_Internal_Shdr *shdr, Filedata *filedata)
14253{
90bd5423 14254 buf->cts_name = SECTION_NAME (shdr);
7d9813f1
NA
14255 buf->cts_size = shdr->sh_size;
14256 buf->cts_entsize = shdr->sh_entsize;
7d9813f1
NA
14257
14258 return buf;
14259}
14260
14261/* Formatting callback function passed to ctf_dump. Returns either the pointer
14262 it is passed, or a pointer to newly-allocated storage, in which case
14263 dump_ctf() will free it when it no longer needs it. */
14264
2f6ecaed
NA
14265static char *
14266dump_ctf_indent_lines (ctf_sect_names_t sect ATTRIBUTE_UNUSED,
14267 char *s, void *arg)
7d9813f1 14268{
3e50a591 14269 const char *blanks = arg;
7d9813f1
NA
14270 char *new_s;
14271
3e50a591 14272 if (asprintf (&new_s, "%s%s", blanks, s) < 0)
7d9813f1
NA
14273 return s;
14274 return new_s;
14275}
14276
926c9e76
NA
14277/* Dump CTF errors/warnings. */
14278static void
14279dump_ctf_errs (ctf_file_t *fp)
14280{
14281 ctf_next_t *it = NULL;
14282 char *errtext;
14283 int is_warning;
14284 int err;
14285
14286 /* Dump accumulated errors and warnings. */
14287 while ((errtext = ctf_errwarning_next (fp, &it, &is_warning, &err)) != NULL)
14288 {
5e9b84f7 14289 error (_("%s: %s"), is_warning ? _("warning"): _("error"),
926c9e76
NA
14290 errtext);
14291 free (errtext);
14292 }
14293 if (err != ECTF_NEXT_END)
14294 error (_("CTF error: cannot get CTF errors: `%s'"), ctf_errmsg (err));
14295}
14296
2f6ecaed
NA
14297/* Dump one CTF archive member. */
14298
14299static int
14300dump_ctf_archive_member (ctf_file_t *ctf, const char *name, void *arg)
14301{
14302 ctf_file_t *parent = (ctf_file_t *) arg;
14303 const char *things[] = {"Header", "Labels", "Data objects",
14304 "Function objects", "Variables", "Types", "Strings",
14305 ""};
14306 const char **thing;
14307 size_t i;
8b37e7b6 14308 int err = 0;
2f6ecaed
NA
14309
14310 /* Only print out the name of non-default-named archive members.
14311 The name .ctf appears everywhere, even for things that aren't
14312 really archives, so printing it out is liable to be confusing.
14313
14314 The parent, if there is one, is the default-owned archive member:
14315 avoid importing it into itself. (This does no harm, but looks
14316 confusing.) */
14317
14318 if (strcmp (name, ".ctf") != 0)
14319 {
14320 printf (_("\nCTF archive member: %s:\n"), name);
14321 ctf_import (ctf, parent);
14322 }
14323
14324 for (i = 0, thing = things; *thing[0]; thing++, i++)
14325 {
14326 ctf_dump_state_t *s = NULL;
14327 char *item;
14328
14329 printf ("\n %s:\n", *thing);
14330 while ((item = ctf_dump (ctf, &s, i, dump_ctf_indent_lines,
14331 (void *) " ")) != NULL)
14332 {
14333 printf ("%s\n", item);
14334 free (item);
14335 }
14336
14337 if (ctf_errno (ctf))
14338 {
14339 error (_("Iteration failed: %s, %s\n"), *thing,
14340 ctf_errmsg (ctf_errno (ctf)));
8b37e7b6
NA
14341 err = 1;
14342 goto out;
2f6ecaed
NA
14343 }
14344 }
8b37e7b6
NA
14345
14346 out:
926c9e76 14347 dump_ctf_errs (ctf);
8b37e7b6 14348 return err;
2f6ecaed
NA
14349}
14350
7d9813f1
NA
14351static bfd_boolean
14352dump_section_as_ctf (Elf_Internal_Shdr * section, Filedata * filedata)
14353{
14354 Elf_Internal_Shdr * parent_sec = NULL;
14355 Elf_Internal_Shdr * symtab_sec = NULL;
14356 Elf_Internal_Shdr * strtab_sec = NULL;
d344b407
NA
14357 void * data = NULL;
14358 void * symdata = NULL;
14359 void * strdata = NULL;
14360 void * parentdata = NULL;
14361 ctf_sect_t ctfsect, symsect, strsect, parentsect;
14362 ctf_sect_t * symsectp = NULL;
14363 ctf_sect_t * strsectp = NULL;
2f6ecaed
NA
14364 ctf_archive_t * ctfa = NULL;
14365 ctf_archive_t * parenta = NULL, *lookparent;
14366 ctf_file_t * parent = NULL;
7d9813f1 14367
7d9813f1
NA
14368 int err;
14369 bfd_boolean ret = FALSE;
7d9813f1
NA
14370
14371 shdr_to_ctf_sect (&ctfsect, section, filedata);
14372 data = get_section_contents (section, filedata);
14373 ctfsect.cts_data = data;
14374
616febde
NA
14375 if (!dump_ctf_symtab_name)
14376 dump_ctf_symtab_name = strdup (".symtab");
14377
14378 if (!dump_ctf_strtab_name)
14379 dump_ctf_strtab_name = strdup (".strtab");
14380
14381 if (dump_ctf_symtab_name && dump_ctf_symtab_name[0] != 0)
7d9813f1
NA
14382 {
14383 if ((symtab_sec = find_section (filedata, dump_ctf_symtab_name)) == NULL)
14384 {
14385 error (_("No symbol section named %s\n"), dump_ctf_symtab_name);
14386 goto fail;
14387 }
14388 if ((symdata = (void *) get_data (NULL, filedata,
14389 symtab_sec->sh_offset, 1,
14390 symtab_sec->sh_size,
14391 _("symbols"))) == NULL)
14392 goto fail;
14393 symsectp = shdr_to_ctf_sect (&symsect, symtab_sec, filedata);
14394 symsect.cts_data = symdata;
14395 }
df16e041 14396 if (dump_ctf_strtab_name && dump_ctf_strtab_name[0] != 0)
7d9813f1
NA
14397 {
14398 if ((strtab_sec = find_section (filedata, dump_ctf_strtab_name)) == NULL)
14399 {
14400 error (_("No string table section named %s\n"),
14401 dump_ctf_strtab_name);
14402 goto fail;
14403 }
14404 if ((strdata = (void *) get_data (NULL, filedata,
14405 strtab_sec->sh_offset, 1,
14406 strtab_sec->sh_size,
14407 _("strings"))) == NULL)
14408 goto fail;
14409 strsectp = shdr_to_ctf_sect (&strsect, strtab_sec, filedata);
14410 strsect.cts_data = strdata;
14411 }
14412 if (dump_ctf_parent_name)
14413 {
14414 if ((parent_sec = find_section (filedata, dump_ctf_parent_name)) == NULL)
14415 {
14416 error (_("No CTF parent section named %s\n"), dump_ctf_parent_name);
14417 goto fail;
14418 }
14419 if ((parentdata = (void *) get_data (NULL, filedata,
14420 parent_sec->sh_offset, 1,
14421 parent_sec->sh_size,
14422 _("CTF parent"))) == NULL)
14423 goto fail;
14424 shdr_to_ctf_sect (&parentsect, parent_sec, filedata);
14425 parentsect.cts_data = parentdata;
14426 }
14427
2f6ecaed
NA
14428 /* Load the CTF file and dump it. It may be a raw CTF section, or an archive:
14429 libctf papers over the difference, so we can pretend it is always an
14430 archive. Possibly open the parent as well, if one was specified. */
7d9813f1 14431
2f6ecaed 14432 if ((ctfa = ctf_arc_bufopen (&ctfsect, symsectp, strsectp, &err)) == NULL)
7d9813f1 14433 {
926c9e76 14434 dump_ctf_errs (NULL);
7d9813f1
NA
14435 error (_("CTF open failure: %s\n"), ctf_errmsg (err));
14436 goto fail;
14437 }
14438
14439 if (parentdata)
14440 {
2f6ecaed
NA
14441 if ((parenta = ctf_arc_bufopen (&parentsect, symsectp, strsectp,
14442 &err)) == NULL)
7d9813f1 14443 {
926c9e76 14444 dump_ctf_errs (NULL);
7d9813f1
NA
14445 error (_("CTF open failure: %s\n"), ctf_errmsg (err));
14446 goto fail;
14447 }
2f6ecaed
NA
14448 lookparent = parenta;
14449 }
14450 else
14451 lookparent = ctfa;
7d9813f1 14452
2f6ecaed
NA
14453 /* Assume that the applicable parent archive member is the default one.
14454 (This is what all known implementations are expected to do, if they
14455 put CTFs and their parents in archives together.) */
14456 if ((parent = ctf_arc_open_by_name (lookparent, NULL, &err)) == NULL)
14457 {
926c9e76 14458 dump_ctf_errs (NULL);
2f6ecaed
NA
14459 error (_("CTF open failure: %s\n"), ctf_errmsg (err));
14460 goto fail;
7d9813f1
NA
14461 }
14462
14463 ret = TRUE;
14464
14465 printf (_("\nDump of CTF section '%s':\n"),
14466 printable_section_name (filedata, section));
14467
2f6ecaed
NA
14468 if (ctf_archive_iter (ctfa, dump_ctf_archive_member, parent) != 0)
14469 ret = FALSE;
7d9813f1
NA
14470
14471 fail:
7d9813f1 14472 ctf_file_close (parent);
2f6ecaed
NA
14473 ctf_close (ctfa);
14474 ctf_close (parenta);
7d9813f1
NA
14475 free (parentdata);
14476 free (data);
14477 free (symdata);
14478 free (strdata);
14479 return ret;
14480}
094e34f2 14481#endif
7d9813f1 14482
32ec8896 14483static bfd_boolean
dda8d76d
NC
14484load_specific_debug_section (enum dwarf_section_display_enum debug,
14485 const Elf_Internal_Shdr * sec,
14486 void * data)
1007acb3 14487{
2cf0635d 14488 struct dwarf_section * section = &debug_displays [debug].section;
19e6b90e 14489 char buf [64];
dda8d76d 14490 Filedata * filedata = (Filedata *) data;
9abca702 14491
19e6b90e 14492 if (section->start != NULL)
dda8d76d
NC
14493 {
14494 /* If it is already loaded, do nothing. */
14495 if (streq (section->filename, filedata->file_name))
14496 return TRUE;
14497 free (section->start);
14498 }
1007acb3 14499
19e6b90e
L
14500 snprintf (buf, sizeof (buf), _("%s section data"), section->name);
14501 section->address = sec->sh_addr;
06614111 14502 section->user_data = NULL;
dda8d76d
NC
14503 section->filename = filedata->file_name;
14504 section->start = (unsigned char *) get_data (NULL, filedata,
3f5e193b
NC
14505 sec->sh_offset, 1,
14506 sec->sh_size, buf);
59245841
NC
14507 if (section->start == NULL)
14508 section->size = 0;
14509 else
14510 {
77115a4a
L
14511 unsigned char *start = section->start;
14512 dwarf_size_type size = sec->sh_size;
dab394de 14513 dwarf_size_type uncompressed_size = 0;
77115a4a
L
14514
14515 if ((sec->sh_flags & SHF_COMPRESSED) != 0)
14516 {
14517 Elf_Internal_Chdr chdr;
d8024a91
NC
14518 unsigned int compression_header_size;
14519
f53be977
L
14520 if (size < (is_32bit_elf
14521 ? sizeof (Elf32_External_Chdr)
14522 : sizeof (Elf64_External_Chdr)))
d8024a91 14523 {
55be8fd0 14524 warn (_("compressed section %s is too small to contain a compression header\n"),
d8024a91 14525 section->name);
32ec8896 14526 return FALSE;
d8024a91
NC
14527 }
14528
ebdf1ebf 14529 compression_header_size = get_compression_header (&chdr, start, size);
5844b465
NC
14530 if (compression_header_size == 0)
14531 /* An error message will have already been generated
14532 by get_compression_header. */
14533 return FALSE;
d8024a91 14534
813dabb9
L
14535 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
14536 {
14537 warn (_("section '%s' has unsupported compress type: %d\n"),
14538 section->name, chdr.ch_type);
32ec8896 14539 return FALSE;
813dabb9 14540 }
dab394de 14541 uncompressed_size = chdr.ch_size;
77115a4a
L
14542 start += compression_header_size;
14543 size -= compression_header_size;
14544 }
dab394de
L
14545 else if (size > 12 && streq ((char *) start, "ZLIB"))
14546 {
14547 /* Read the zlib header. In this case, it should be "ZLIB"
14548 followed by the uncompressed section size, 8 bytes in
14549 big-endian order. */
14550 uncompressed_size = start[4]; uncompressed_size <<= 8;
14551 uncompressed_size += start[5]; uncompressed_size <<= 8;
14552 uncompressed_size += start[6]; uncompressed_size <<= 8;
14553 uncompressed_size += start[7]; uncompressed_size <<= 8;
14554 uncompressed_size += start[8]; uncompressed_size <<= 8;
14555 uncompressed_size += start[9]; uncompressed_size <<= 8;
14556 uncompressed_size += start[10]; uncompressed_size <<= 8;
14557 uncompressed_size += start[11];
14558 start += 12;
14559 size -= 12;
14560 }
14561
1835f746 14562 if (uncompressed_size)
77115a4a 14563 {
1835f746
NC
14564 if (uncompress_section_contents (&start, uncompressed_size,
14565 &size))
14566 {
14567 /* Free the compressed buffer, update the section buffer
14568 and the section size if uncompress is successful. */
14569 free (section->start);
14570 section->start = start;
14571 }
14572 else
14573 {
14574 error (_("Unable to decompress section %s\n"),
dda8d76d 14575 printable_section_name (filedata, sec));
32ec8896 14576 return FALSE;
1835f746 14577 }
77115a4a 14578 }
bc303e5d 14579
77115a4a 14580 section->size = size;
59245841 14581 }
4a114e3e 14582
1b315056 14583 if (section->start == NULL)
32ec8896 14584 return FALSE;
1b315056 14585
19e6b90e 14586 if (debug_displays [debug].relocate)
32ec8896 14587 {
dda8d76d 14588 if (! apply_relocations (filedata, sec, section->start, section->size,
32ec8896
NC
14589 & section->reloc_info, & section->num_relocs))
14590 return FALSE;
14591 }
d1c4b12b
NC
14592 else
14593 {
14594 section->reloc_info = NULL;
14595 section->num_relocs = 0;
14596 }
1007acb3 14597
32ec8896 14598 return TRUE;
1007acb3
L
14599}
14600
301a9420
AM
14601#if HAVE_LIBDEBUGINFOD
14602/* Return a hex string representation of the build-id. */
14603unsigned char *
14604get_build_id (void * data)
14605{
14606 Filedata * filedata = (Filedata *)data;
14607 Elf_Internal_Shdr * shdr;
14608 unsigned long i;
14609
55be8fd0
NC
14610 /* Iterate through notes to find note.gnu.build-id.
14611 FIXME: Only the first note in any note section is examined. */
301a9420
AM
14612 for (i = 0, shdr = filedata->section_headers;
14613 i < filedata->file_header.e_shnum && shdr != NULL;
14614 i++, shdr++)
14615 {
14616 if (shdr->sh_type != SHT_NOTE)
14617 continue;
14618
14619 char * next;
14620 char * end;
14621 size_t data_remaining;
14622 size_t min_notesz;
14623 Elf_External_Note * enote;
14624 Elf_Internal_Note inote;
14625
14626 bfd_vma offset = shdr->sh_offset;
14627 bfd_vma align = shdr->sh_addralign;
14628 bfd_vma length = shdr->sh_size;
14629
14630 enote = (Elf_External_Note *) get_section_contents (shdr, filedata);
14631 if (enote == NULL)
14632 continue;
14633
14634 if (align < 4)
14635 align = 4;
14636 else if (align != 4 && align != 8)
f761cb13
AM
14637 {
14638 free (enote);
14639 continue;
14640 }
301a9420
AM
14641
14642 end = (char *) enote + length;
14643 data_remaining = end - (char *) enote;
14644
14645 if (!is_ia64_vms (filedata))
14646 {
14647 min_notesz = offsetof (Elf_External_Note, name);
14648 if (data_remaining < min_notesz)
14649 {
55be8fd0
NC
14650 warn (_("\
14651malformed note encountered in section %s whilst scanning for build-id note\n"),
14652 printable_section_name (filedata, shdr));
f761cb13 14653 free (enote);
55be8fd0 14654 continue;
301a9420
AM
14655 }
14656 data_remaining -= min_notesz;
14657
14658 inote.type = BYTE_GET (enote->type);
14659 inote.namesz = BYTE_GET (enote->namesz);
14660 inote.namedata = enote->name;
14661 inote.descsz = BYTE_GET (enote->descsz);
14662 inote.descdata = ((char *) enote
14663 + ELF_NOTE_DESC_OFFSET (inote.namesz, align));
14664 inote.descpos = offset + (inote.descdata - (char *) enote);
14665 next = ((char *) enote
14666 + ELF_NOTE_NEXT_OFFSET (inote.namesz, inote.descsz, align));
14667 }
14668 else
14669 {
14670 Elf64_External_VMS_Note *vms_enote;
14671
14672 /* PR binutils/15191
14673 Make sure that there is enough data to read. */
14674 min_notesz = offsetof (Elf64_External_VMS_Note, name);
14675 if (data_remaining < min_notesz)
14676 {
55be8fd0
NC
14677 warn (_("\
14678malformed note encountered in section %s whilst scanning for build-id note\n"),
14679 printable_section_name (filedata, shdr));
f761cb13 14680 free (enote);
55be8fd0 14681 continue;
301a9420
AM
14682 }
14683 data_remaining -= min_notesz;
14684
14685 vms_enote = (Elf64_External_VMS_Note *) enote;
14686 inote.type = BYTE_GET (vms_enote->type);
14687 inote.namesz = BYTE_GET (vms_enote->namesz);
14688 inote.namedata = vms_enote->name;
14689 inote.descsz = BYTE_GET (vms_enote->descsz);
14690 inote.descdata = inote.namedata + align_power (inote.namesz, 3);
14691 inote.descpos = offset + (inote.descdata - (char *) enote);
14692 next = inote.descdata + align_power (inote.descsz, 3);
14693 }
14694
14695 /* Skip malformed notes. */
14696 if ((size_t) (inote.descdata - inote.namedata) < inote.namesz
14697 || (size_t) (inote.descdata - inote.namedata) > data_remaining
14698 || (size_t) (next - inote.descdata) < inote.descsz
14699 || ((size_t) (next - inote.descdata)
14700 > data_remaining - (size_t) (inote.descdata - inote.namedata)))
14701 {
55be8fd0
NC
14702 warn (_("\
14703malformed note encountered in section %s whilst scanning for build-id note\n"),
14704 printable_section_name (filedata, shdr));
f761cb13 14705 free (enote);
301a9420
AM
14706 continue;
14707 }
14708
14709 /* Check if this is the build-id note. If so then convert the build-id
14710 bytes to a hex string. */
14711 if (inote.namesz > 0
14712 && const_strneq (inote.namedata, "GNU")
14713 && inote.type == NT_GNU_BUILD_ID)
14714 {
14715 unsigned long j;
14716 char * build_id;
14717
14718 build_id = malloc (inote.descsz * 2 + 1);
14719 if (build_id == NULL)
f761cb13
AM
14720 {
14721 free (enote);
14722 return NULL;
14723 }
301a9420
AM
14724
14725 for (j = 0; j < inote.descsz; ++j)
14726 sprintf (build_id + (j * 2), "%02x", inote.descdata[j] & 0xff);
14727 build_id[inote.descsz * 2] = '\0';
f761cb13 14728 free (enote);
301a9420 14729
55be8fd0 14730 return (unsigned char *) build_id;
301a9420 14731 }
f761cb13 14732 free (enote);
301a9420
AM
14733 }
14734
14735 return NULL;
14736}
14737#endif /* HAVE_LIBDEBUGINFOD */
14738
657d0d47
CC
14739/* If this is not NULL, load_debug_section will only look for sections
14740 within the list of sections given here. */
32ec8896 14741static unsigned int * section_subset = NULL;
657d0d47 14742
32ec8896 14743bfd_boolean
dda8d76d 14744load_debug_section (enum dwarf_section_display_enum debug, void * data)
d966045b 14745{
2cf0635d
NC
14746 struct dwarf_section * section = &debug_displays [debug].section;
14747 Elf_Internal_Shdr * sec;
dda8d76d
NC
14748 Filedata * filedata = (Filedata *) data;
14749
f425ec66
NC
14750 /* Without section headers we cannot find any sections. */
14751 if (filedata->section_headers == NULL)
14752 return FALSE;
14753
9c1ce108
AM
14754 if (filedata->string_table == NULL
14755 && filedata->file_header.e_shstrndx != SHN_UNDEF
14756 && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
dda8d76d
NC
14757 {
14758 Elf_Internal_Shdr * strs;
14759
14760 /* Read in the string table, so that we have section names to scan. */
14761 strs = filedata->section_headers + filedata->file_header.e_shstrndx;
14762
4dff97b2 14763 if (strs != NULL && strs->sh_size != 0)
dda8d76d 14764 {
9c1ce108
AM
14765 filedata->string_table
14766 = (char *) get_data (NULL, filedata, strs->sh_offset,
14767 1, strs->sh_size, _("string table"));
dda8d76d 14768
9c1ce108
AM
14769 filedata->string_table_length
14770 = filedata->string_table != NULL ? strs->sh_size : 0;
dda8d76d
NC
14771 }
14772 }
d966045b
DJ
14773
14774 /* Locate the debug section. */
dda8d76d 14775 sec = find_section_in_set (filedata, section->uncompressed_name, section_subset);
d966045b
DJ
14776 if (sec != NULL)
14777 section->name = section->uncompressed_name;
14778 else
14779 {
dda8d76d 14780 sec = find_section_in_set (filedata, section->compressed_name, section_subset);
d966045b
DJ
14781 if (sec != NULL)
14782 section->name = section->compressed_name;
14783 }
14784 if (sec == NULL)
32ec8896 14785 return FALSE;
d966045b 14786
657d0d47
CC
14787 /* If we're loading from a subset of sections, and we've loaded
14788 a section matching this name before, it's likely that it's a
14789 different one. */
14790 if (section_subset != NULL)
14791 free_debug_section (debug);
14792
dda8d76d 14793 return load_specific_debug_section (debug, sec, data);
d966045b
DJ
14794}
14795
19e6b90e
L
14796void
14797free_debug_section (enum dwarf_section_display_enum debug)
1007acb3 14798{
2cf0635d 14799 struct dwarf_section * section = &debug_displays [debug].section;
1007acb3 14800
19e6b90e
L
14801 if (section->start == NULL)
14802 return;
1007acb3 14803
19e6b90e
L
14804 free ((char *) section->start);
14805 section->start = NULL;
14806 section->address = 0;
14807 section->size = 0;
a788aedd 14808
9db70fc3
AM
14809 free (section->reloc_info);
14810 section->reloc_info = NULL;
14811 section->num_relocs = 0;
1007acb3
L
14812}
14813
32ec8896 14814static bfd_boolean
dda8d76d 14815display_debug_section (int shndx, Elf_Internal_Shdr * section, Filedata * filedata)
1007acb3 14816{
2cf0635d 14817 char * name = SECTION_NAME (section);
dda8d76d 14818 const char * print_name = printable_section_name (filedata, section);
19e6b90e 14819 bfd_size_type length;
32ec8896 14820 bfd_boolean result = TRUE;
3f5e193b 14821 int i;
1007acb3 14822
19e6b90e
L
14823 length = section->sh_size;
14824 if (length == 0)
1007acb3 14825 {
74e1a04b 14826 printf (_("\nSection '%s' has no debugging data.\n"), print_name);
32ec8896 14827 return TRUE;
1007acb3 14828 }
5dff79d8
NC
14829 if (section->sh_type == SHT_NOBITS)
14830 {
14831 /* There is no point in dumping the contents of a debugging section
14832 which has the NOBITS type - the bits in the file will be random.
14833 This can happen when a file containing a .eh_frame section is
14834 stripped with the --only-keep-debug command line option. */
74e1a04b
NC
14835 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
14836 print_name);
32ec8896 14837 return FALSE;
5dff79d8 14838 }
1007acb3 14839
0112cd26 14840 if (const_strneq (name, ".gnu.linkonce.wi."))
19e6b90e 14841 name = ".debug_info";
1007acb3 14842
19e6b90e
L
14843 /* See if we know how to display the contents of this section. */
14844 for (i = 0; i < max; i++)
d85bf2ba
NC
14845 {
14846 enum dwarf_section_display_enum id = (enum dwarf_section_display_enum) i;
14847 struct dwarf_section_display * display = debug_displays + i;
14848 struct dwarf_section * sec = & display->section;
d966045b 14849
d85bf2ba
NC
14850 if (streq (sec->uncompressed_name, name)
14851 || (id == line && const_strneq (name, ".debug_line."))
14852 || streq (sec->compressed_name, name))
14853 {
14854 bfd_boolean secondary = (section != find_section (filedata, name));
1007acb3 14855
d85bf2ba
NC
14856 if (secondary)
14857 free_debug_section (id);
dda8d76d 14858
d85bf2ba
NC
14859 if (i == line && const_strneq (name, ".debug_line."))
14860 sec->name = name;
14861 else if (streq (sec->uncompressed_name, name))
14862 sec->name = sec->uncompressed_name;
14863 else
14864 sec->name = sec->compressed_name;
657d0d47 14865
d85bf2ba
NC
14866 if (load_specific_debug_section (id, section, filedata))
14867 {
14868 /* If this debug section is part of a CU/TU set in a .dwp file,
14869 restrict load_debug_section to the sections in that set. */
14870 section_subset = find_cu_tu_set (filedata, shndx);
1007acb3 14871
d85bf2ba 14872 result &= display->display (sec, filedata);
657d0d47 14873
d85bf2ba 14874 section_subset = NULL;
1007acb3 14875
d85bf2ba
NC
14876 if (secondary || (id != info && id != abbrev))
14877 free_debug_section (id);
14878 }
14879 break;
14880 }
14881 }
1007acb3 14882
19e6b90e 14883 if (i == max)
1007acb3 14884 {
74e1a04b 14885 printf (_("Unrecognized debug section: %s\n"), print_name);
32ec8896 14886 result = FALSE;
1007acb3
L
14887 }
14888
19e6b90e 14889 return result;
5b18a4bc 14890}
103f02d3 14891
aef1f6d0
DJ
14892/* Set DUMP_SECTS for all sections where dumps were requested
14893 based on section name. */
14894
14895static void
dda8d76d 14896initialise_dumps_byname (Filedata * filedata)
aef1f6d0 14897{
2cf0635d 14898 struct dump_list_entry * cur;
aef1f6d0
DJ
14899
14900 for (cur = dump_sects_byname; cur; cur = cur->next)
14901 {
14902 unsigned int i;
32ec8896 14903 bfd_boolean any = FALSE;
aef1f6d0 14904
dda8d76d
NC
14905 for (i = 0; i < filedata->file_header.e_shnum; i++)
14906 if (streq (SECTION_NAME (filedata->section_headers + i), cur->name))
aef1f6d0 14907 {
6431e409 14908 request_dump_bynumber (&filedata->dump, i, cur->type);
32ec8896 14909 any = TRUE;
aef1f6d0
DJ
14910 }
14911
14912 if (!any)
14913 warn (_("Section '%s' was not dumped because it does not exist!\n"),
14914 cur->name);
14915 }
14916}
14917
32ec8896 14918static bfd_boolean
dda8d76d 14919process_section_contents (Filedata * filedata)
5b18a4bc 14920{
2cf0635d 14921 Elf_Internal_Shdr * section;
19e6b90e 14922 unsigned int i;
32ec8896 14923 bfd_boolean res = TRUE;
103f02d3 14924
19e6b90e 14925 if (! do_dump)
32ec8896 14926 return TRUE;
103f02d3 14927
dda8d76d 14928 initialise_dumps_byname (filedata);
aef1f6d0 14929
dda8d76d 14930 for (i = 0, section = filedata->section_headers;
6431e409 14931 i < filedata->file_header.e_shnum && i < filedata->dump.num_dump_sects;
19e6b90e
L
14932 i++, section++)
14933 {
6431e409 14934 dump_type dump = filedata->dump.dump_sects[i];
dda8d76d 14935
19e6b90e 14936#ifdef SUPPORT_DISASSEMBLY
dda8d76d
NC
14937 if (dump & DISASS_DUMP)
14938 {
14939 if (! disassemble_section (section, filedata))
14940 res = FALSE;
14941 }
19e6b90e 14942#endif
dda8d76d 14943 if (dump & HEX_DUMP)
32ec8896 14944 {
dda8d76d 14945 if (! dump_section_as_bytes (section, filedata, FALSE))
32ec8896
NC
14946 res = FALSE;
14947 }
103f02d3 14948
dda8d76d 14949 if (dump & RELOC_DUMP)
32ec8896 14950 {
dda8d76d 14951 if (! dump_section_as_bytes (section, filedata, TRUE))
32ec8896
NC
14952 res = FALSE;
14953 }
09c11c86 14954
dda8d76d 14955 if (dump & STRING_DUMP)
32ec8896 14956 {
dda8d76d 14957 if (! dump_section_as_strings (section, filedata))
32ec8896
NC
14958 res = FALSE;
14959 }
cf13d699 14960
dda8d76d 14961 if (dump & DEBUG_DUMP)
32ec8896 14962 {
dda8d76d 14963 if (! display_debug_section (i, section, filedata))
32ec8896
NC
14964 res = FALSE;
14965 }
7d9813f1 14966
094e34f2 14967#ifdef ENABLE_LIBCTF
7d9813f1
NA
14968 if (dump & CTF_DUMP)
14969 {
14970 if (! dump_section_as_ctf (section, filedata))
14971 res = FALSE;
14972 }
094e34f2 14973#endif
5b18a4bc 14974 }
103f02d3 14975
19e6b90e
L
14976 /* Check to see if the user requested a
14977 dump of a section that does not exist. */
6431e409 14978 while (i < filedata->dump.num_dump_sects)
0ee3043f 14979 {
6431e409 14980 if (filedata->dump.dump_sects[i])
32ec8896
NC
14981 {
14982 warn (_("Section %d was not dumped because it does not exist!\n"), i);
14983 res = FALSE;
14984 }
0ee3043f
NC
14985 i++;
14986 }
32ec8896
NC
14987
14988 return res;
5b18a4bc 14989}
103f02d3 14990
5b18a4bc 14991static void
19e6b90e 14992process_mips_fpe_exception (int mask)
5b18a4bc 14993{
19e6b90e
L
14994 if (mask)
14995 {
32ec8896
NC
14996 bfd_boolean first = TRUE;
14997
19e6b90e 14998 if (mask & OEX_FPU_INEX)
32ec8896 14999 fputs ("INEX", stdout), first = FALSE;
19e6b90e 15000 if (mask & OEX_FPU_UFLO)
32ec8896 15001 printf ("%sUFLO", first ? "" : "|"), first = FALSE;
19e6b90e 15002 if (mask & OEX_FPU_OFLO)
32ec8896 15003 printf ("%sOFLO", first ? "" : "|"), first = FALSE;
19e6b90e 15004 if (mask & OEX_FPU_DIV0)
32ec8896 15005 printf ("%sDIV0", first ? "" : "|"), first = FALSE;
19e6b90e
L
15006 if (mask & OEX_FPU_INVAL)
15007 printf ("%sINVAL", first ? "" : "|");
15008 }
5b18a4bc 15009 else
19e6b90e 15010 fputs ("0", stdout);
5b18a4bc 15011}
103f02d3 15012
f6f0e17b
NC
15013/* Display's the value of TAG at location P. If TAG is
15014 greater than 0 it is assumed to be an unknown tag, and
15015 a message is printed to this effect. Otherwise it is
15016 assumed that a message has already been printed.
15017
15018 If the bottom bit of TAG is set it assumed to have a
15019 string value, otherwise it is assumed to have an integer
15020 value.
15021
15022 Returns an updated P pointing to the first unread byte
15023 beyond the end of TAG's value.
15024
15025 Reads at or beyond END will not be made. */
15026
15027static unsigned char *
60abdbed 15028display_tag_value (signed int tag,
f6f0e17b
NC
15029 unsigned char * p,
15030 const unsigned char * const end)
15031{
15032 unsigned long val;
15033
15034 if (tag > 0)
15035 printf (" Tag_unknown_%d: ", tag);
15036
15037 if (p >= end)
15038 {
4082ef84 15039 warn (_("<corrupt tag>\n"));
f6f0e17b
NC
15040 }
15041 else if (tag & 1)
15042 {
071436c6
NC
15043 /* PR 17531 file: 027-19978-0.004. */
15044 size_t maxlen = (end - p) - 1;
15045
15046 putchar ('"');
4082ef84
NC
15047 if (maxlen > 0)
15048 {
15049 print_symbol ((int) maxlen, (const char *) p);
15050 p += strnlen ((char *) p, maxlen) + 1;
15051 }
15052 else
15053 {
15054 printf (_("<corrupt string tag>"));
15055 p = (unsigned char *) end;
15056 }
071436c6 15057 printf ("\"\n");
f6f0e17b
NC
15058 }
15059 else
15060 {
cd30bcef 15061 READ_ULEB (val, p, end);
f6f0e17b
NC
15062 printf ("%ld (0x%lx)\n", val, val);
15063 }
15064
4082ef84 15065 assert (p <= end);
f6f0e17b
NC
15066 return p;
15067}
15068
53a346d8
CZ
15069/* ARC ABI attributes section. */
15070
15071static unsigned char *
15072display_arc_attribute (unsigned char * p,
15073 const unsigned char * const end)
15074{
15075 unsigned int tag;
53a346d8
CZ
15076 unsigned int val;
15077
cd30bcef 15078 READ_ULEB (tag, p, end);
53a346d8
CZ
15079
15080 switch (tag)
15081 {
15082 case Tag_ARC_PCS_config:
cd30bcef 15083 READ_ULEB (val, p, end);
53a346d8
CZ
15084 printf (" Tag_ARC_PCS_config: ");
15085 switch (val)
15086 {
15087 case 0:
15088 printf (_("Absent/Non standard\n"));
15089 break;
15090 case 1:
15091 printf (_("Bare metal/mwdt\n"));
15092 break;
15093 case 2:
15094 printf (_("Bare metal/newlib\n"));
15095 break;
15096 case 3:
15097 printf (_("Linux/uclibc\n"));
15098 break;
15099 case 4:
15100 printf (_("Linux/glibc\n"));
15101 break;
15102 default:
15103 printf (_("Unknown\n"));
15104 break;
15105 }
15106 break;
15107
15108 case Tag_ARC_CPU_base:
cd30bcef 15109 READ_ULEB (val, p, end);
53a346d8
CZ
15110 printf (" Tag_ARC_CPU_base: ");
15111 switch (val)
15112 {
15113 default:
15114 case TAG_CPU_NONE:
15115 printf (_("Absent\n"));
15116 break;
15117 case TAG_CPU_ARC6xx:
15118 printf ("ARC6xx\n");
15119 break;
15120 case TAG_CPU_ARC7xx:
15121 printf ("ARC7xx\n");
15122 break;
15123 case TAG_CPU_ARCEM:
15124 printf ("ARCEM\n");
15125 break;
15126 case TAG_CPU_ARCHS:
15127 printf ("ARCHS\n");
15128 break;
15129 }
15130 break;
15131
15132 case Tag_ARC_CPU_variation:
cd30bcef 15133 READ_ULEB (val, p, end);
53a346d8
CZ
15134 printf (" Tag_ARC_CPU_variation: ");
15135 switch (val)
15136 {
15137 default:
15138 if (val > 0 && val < 16)
53a346d8 15139 printf ("Core%d\n", val);
d8cbc93b
JL
15140 else
15141 printf ("Unknown\n");
15142 break;
15143
53a346d8
CZ
15144 case 0:
15145 printf (_("Absent\n"));
15146 break;
15147 }
15148 break;
15149
15150 case Tag_ARC_CPU_name:
15151 printf (" Tag_ARC_CPU_name: ");
15152 p = display_tag_value (-1, p, end);
15153 break;
15154
15155 case Tag_ARC_ABI_rf16:
cd30bcef 15156 READ_ULEB (val, p, end);
53a346d8
CZ
15157 printf (" Tag_ARC_ABI_rf16: %s\n", val ? _("yes") : _("no"));
15158 break;
15159
15160 case Tag_ARC_ABI_osver:
cd30bcef 15161 READ_ULEB (val, p, end);
53a346d8
CZ
15162 printf (" Tag_ARC_ABI_osver: v%d\n", val);
15163 break;
15164
15165 case Tag_ARC_ABI_pic:
15166 case Tag_ARC_ABI_sda:
cd30bcef 15167 READ_ULEB (val, p, end);
53a346d8
CZ
15168 printf (tag == Tag_ARC_ABI_sda ? " Tag_ARC_ABI_sda: "
15169 : " Tag_ARC_ABI_pic: ");
15170 switch (val)
15171 {
15172 case 0:
15173 printf (_("Absent\n"));
15174 break;
15175 case 1:
15176 printf ("MWDT\n");
15177 break;
15178 case 2:
15179 printf ("GNU\n");
15180 break;
15181 default:
15182 printf (_("Unknown\n"));
15183 break;
15184 }
15185 break;
15186
15187 case Tag_ARC_ABI_tls:
cd30bcef 15188 READ_ULEB (val, p, end);
53a346d8
CZ
15189 printf (" Tag_ARC_ABI_tls: %s\n", val ? "r25": "none");
15190 break;
15191
15192 case Tag_ARC_ABI_enumsize:
cd30bcef 15193 READ_ULEB (val, p, end);
53a346d8
CZ
15194 printf (" Tag_ARC_ABI_enumsize: %s\n", val ? _("default") :
15195 _("smallest"));
15196 break;
15197
15198 case Tag_ARC_ABI_exceptions:
cd30bcef 15199 READ_ULEB (val, p, end);
53a346d8
CZ
15200 printf (" Tag_ARC_ABI_exceptions: %s\n", val ? _("OPTFP")
15201 : _("default"));
15202 break;
15203
15204 case Tag_ARC_ABI_double_size:
cd30bcef 15205 READ_ULEB (val, p, end);
53a346d8
CZ
15206 printf (" Tag_ARC_ABI_double_size: %d\n", val);
15207 break;
15208
15209 case Tag_ARC_ISA_config:
15210 printf (" Tag_ARC_ISA_config: ");
15211 p = display_tag_value (-1, p, end);
15212 break;
15213
15214 case Tag_ARC_ISA_apex:
15215 printf (" Tag_ARC_ISA_apex: ");
15216 p = display_tag_value (-1, p, end);
15217 break;
15218
15219 case Tag_ARC_ISA_mpy_option:
cd30bcef 15220 READ_ULEB (val, p, end);
53a346d8
CZ
15221 printf (" Tag_ARC_ISA_mpy_option: %d\n", val);
15222 break;
15223
db1e1b45 15224 case Tag_ARC_ATR_version:
cd30bcef 15225 READ_ULEB (val, p, end);
db1e1b45 15226 printf (" Tag_ARC_ATR_version: %d\n", val);
15227 break;
15228
53a346d8
CZ
15229 default:
15230 return display_tag_value (tag & 1, p, end);
15231 }
15232
15233 return p;
15234}
15235
11c1ff18
PB
15236/* ARM EABI attributes section. */
15237typedef struct
15238{
70e99720 15239 unsigned int tag;
2cf0635d 15240 const char * name;
11c1ff18 15241 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
70e99720 15242 unsigned int type;
2cf0635d 15243 const char ** table;
11c1ff18
PB
15244} arm_attr_public_tag;
15245
2cf0635d 15246static const char * arm_attr_tag_CPU_arch[] =
11c1ff18 15247 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
ced40572 15248 "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "v8-R", "v8-M.baseline",
031254f2 15249 "v8-M.mainline", "", "", "", "v8.1-M.mainline"};
2cf0635d
NC
15250static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
15251static const char * arm_attr_tag_THUMB_ISA_use[] =
4ed7ed8d 15252 {"No", "Thumb-1", "Thumb-2", "Yes"};
75375b3e 15253static const char * arm_attr_tag_FP_arch[] =
bca38921 15254 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
a715796b 15255 "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
2cf0635d 15256static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
dd24e3da 15257static const char * arm_attr_tag_Advanced_SIMD_arch[] =
9411fd44
MW
15258 {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
15259 "NEON for ARMv8.1"};
2cf0635d 15260static const char * arm_attr_tag_PCS_config[] =
11c1ff18
PB
15261 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
15262 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
2cf0635d 15263static const char * arm_attr_tag_ABI_PCS_R9_use[] =
11c1ff18 15264 {"V6", "SB", "TLS", "Unused"};
2cf0635d 15265static const char * arm_attr_tag_ABI_PCS_RW_data[] =
11c1ff18 15266 {"Absolute", "PC-relative", "SB-relative", "None"};
2cf0635d 15267static const char * arm_attr_tag_ABI_PCS_RO_data[] =
11c1ff18 15268 {"Absolute", "PC-relative", "None"};
2cf0635d 15269static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
11c1ff18 15270 {"None", "direct", "GOT-indirect"};
2cf0635d 15271static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
11c1ff18 15272 {"None", "??? 1", "2", "??? 3", "4"};
2cf0635d
NC
15273static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
15274static const char * arm_attr_tag_ABI_FP_denormal[] =
f5f53991 15275 {"Unused", "Needed", "Sign only"};
2cf0635d
NC
15276static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
15277static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
15278static const char * arm_attr_tag_ABI_FP_number_model[] =
11c1ff18 15279 {"Unused", "Finite", "RTABI", "IEEE 754"};
2cf0635d 15280static const char * arm_attr_tag_ABI_enum_size[] =
11c1ff18 15281 {"Unused", "small", "int", "forced to int"};
2cf0635d 15282static const char * arm_attr_tag_ABI_HardFP_use[] =
99654aaf 15283 {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
2cf0635d 15284static const char * arm_attr_tag_ABI_VFP_args[] =
5c294fee 15285 {"AAPCS", "VFP registers", "custom", "compatible"};
2cf0635d 15286static const char * arm_attr_tag_ABI_WMMX_args[] =
11c1ff18 15287 {"AAPCS", "WMMX registers", "custom"};
2cf0635d 15288static const char * arm_attr_tag_ABI_optimization_goals[] =
11c1ff18
PB
15289 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
15290 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
2cf0635d 15291static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
11c1ff18
PB
15292 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
15293 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
2cf0635d 15294static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
75375b3e 15295static const char * arm_attr_tag_FP_HP_extension[] =
8e79c3df 15296 {"Not Allowed", "Allowed"};
2cf0635d 15297static const char * arm_attr_tag_ABI_FP_16bit_format[] =
8e79c3df 15298 {"None", "IEEE 754", "Alternative Format"};
15afaa63
TP
15299static const char * arm_attr_tag_DSP_extension[] =
15300 {"Follow architecture", "Allowed"};
dd24e3da 15301static const char * arm_attr_tag_MPextension_use[] =
cd21e546
MGD
15302 {"Not Allowed", "Allowed"};
15303static const char * arm_attr_tag_DIV_use[] =
dd24e3da 15304 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
cd21e546 15305 "Allowed in v7-A with integer division extension"};
2cf0635d
NC
15306static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
15307static const char * arm_attr_tag_Virtualization_use[] =
dd24e3da 15308 {"Not Allowed", "TrustZone", "Virtualization Extensions",
cd21e546 15309 "TrustZone and Virtualization Extensions"};
dd24e3da 15310static const char * arm_attr_tag_MPextension_use_legacy[] =
f5f53991 15311 {"Not Allowed", "Allowed"};
11c1ff18 15312
a7ad558c
AV
15313static const char * arm_attr_tag_MVE_arch[] =
15314 {"No MVE", "MVE Integer only", "MVE Integer and FP"};
15315
11c1ff18
PB
15316#define LOOKUP(id, name) \
15317 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
d70c5fc7 15318static arm_attr_public_tag arm_attr_public_tags[] =
11c1ff18
PB
15319{
15320 {4, "CPU_raw_name", 1, NULL},
15321 {5, "CPU_name", 1, NULL},
15322 LOOKUP(6, CPU_arch),
15323 {7, "CPU_arch_profile", 0, NULL},
15324 LOOKUP(8, ARM_ISA_use),
15325 LOOKUP(9, THUMB_ISA_use),
75375b3e 15326 LOOKUP(10, FP_arch),
11c1ff18 15327 LOOKUP(11, WMMX_arch),
f5f53991
AS
15328 LOOKUP(12, Advanced_SIMD_arch),
15329 LOOKUP(13, PCS_config),
11c1ff18
PB
15330 LOOKUP(14, ABI_PCS_R9_use),
15331 LOOKUP(15, ABI_PCS_RW_data),
f5f53991 15332 LOOKUP(16, ABI_PCS_RO_data),
11c1ff18
PB
15333 LOOKUP(17, ABI_PCS_GOT_use),
15334 LOOKUP(18, ABI_PCS_wchar_t),
15335 LOOKUP(19, ABI_FP_rounding),
15336 LOOKUP(20, ABI_FP_denormal),
15337 LOOKUP(21, ABI_FP_exceptions),
15338 LOOKUP(22, ABI_FP_user_exceptions),
15339 LOOKUP(23, ABI_FP_number_model),
75375b3e
MGD
15340 {24, "ABI_align_needed", 0, NULL},
15341 {25, "ABI_align_preserved", 0, NULL},
11c1ff18
PB
15342 LOOKUP(26, ABI_enum_size),
15343 LOOKUP(27, ABI_HardFP_use),
15344 LOOKUP(28, ABI_VFP_args),
15345 LOOKUP(29, ABI_WMMX_args),
15346 LOOKUP(30, ABI_optimization_goals),
15347 LOOKUP(31, ABI_FP_optimization_goals),
8e79c3df 15348 {32, "compatibility", 0, NULL},
f5f53991 15349 LOOKUP(34, CPU_unaligned_access),
75375b3e 15350 LOOKUP(36, FP_HP_extension),
8e79c3df 15351 LOOKUP(38, ABI_FP_16bit_format),
cd21e546
MGD
15352 LOOKUP(42, MPextension_use),
15353 LOOKUP(44, DIV_use),
15afaa63 15354 LOOKUP(46, DSP_extension),
a7ad558c 15355 LOOKUP(48, MVE_arch),
f5f53991
AS
15356 {64, "nodefaults", 0, NULL},
15357 {65, "also_compatible_with", 0, NULL},
15358 LOOKUP(66, T2EE_use),
15359 {67, "conformance", 1, NULL},
15360 LOOKUP(68, Virtualization_use),
cd21e546 15361 LOOKUP(70, MPextension_use_legacy)
11c1ff18
PB
15362};
15363#undef LOOKUP
15364
11c1ff18 15365static unsigned char *
f6f0e17b
NC
15366display_arm_attribute (unsigned char * p,
15367 const unsigned char * const end)
11c1ff18 15368{
70e99720 15369 unsigned int tag;
70e99720 15370 unsigned int val;
2cf0635d 15371 arm_attr_public_tag * attr;
11c1ff18 15372 unsigned i;
70e99720 15373 unsigned int type;
11c1ff18 15374
cd30bcef 15375 READ_ULEB (tag, p, end);
11c1ff18 15376 attr = NULL;
2cf0635d 15377 for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
11c1ff18
PB
15378 {
15379 if (arm_attr_public_tags[i].tag == tag)
15380 {
15381 attr = &arm_attr_public_tags[i];
15382 break;
15383 }
15384 }
15385
15386 if (attr)
15387 {
15388 printf (" Tag_%s: ", attr->name);
15389 switch (attr->type)
15390 {
15391 case 0:
15392 switch (tag)
15393 {
15394 case 7: /* Tag_CPU_arch_profile. */
cd30bcef 15395 READ_ULEB (val, p, end);
11c1ff18
PB
15396 switch (val)
15397 {
2b692964
NC
15398 case 0: printf (_("None\n")); break;
15399 case 'A': printf (_("Application\n")); break;
15400 case 'R': printf (_("Realtime\n")); break;
15401 case 'M': printf (_("Microcontroller\n")); break;
15402 case 'S': printf (_("Application or Realtime\n")); break;
11c1ff18
PB
15403 default: printf ("??? (%d)\n", val); break;
15404 }
15405 break;
15406
75375b3e 15407 case 24: /* Tag_align_needed. */
cd30bcef 15408 READ_ULEB (val, p, end);
75375b3e
MGD
15409 switch (val)
15410 {
2b692964
NC
15411 case 0: printf (_("None\n")); break;
15412 case 1: printf (_("8-byte\n")); break;
15413 case 2: printf (_("4-byte\n")); break;
75375b3e
MGD
15414 case 3: printf ("??? 3\n"); break;
15415 default:
15416 if (val <= 12)
dd24e3da 15417 printf (_("8-byte and up to %d-byte extended\n"),
75375b3e
MGD
15418 1 << val);
15419 else
15420 printf ("??? (%d)\n", val);
15421 break;
15422 }
15423 break;
15424
15425 case 25: /* Tag_align_preserved. */
cd30bcef 15426 READ_ULEB (val, p, end);
75375b3e
MGD
15427 switch (val)
15428 {
2b692964
NC
15429 case 0: printf (_("None\n")); break;
15430 case 1: printf (_("8-byte, except leaf SP\n")); break;
15431 case 2: printf (_("8-byte\n")); break;
75375b3e
MGD
15432 case 3: printf ("??? 3\n"); break;
15433 default:
15434 if (val <= 12)
dd24e3da 15435 printf (_("8-byte and up to %d-byte extended\n"),
75375b3e
MGD
15436 1 << val);
15437 else
15438 printf ("??? (%d)\n", val);
15439 break;
15440 }
15441 break;
15442
11c1ff18 15443 case 32: /* Tag_compatibility. */
071436c6 15444 {
cd30bcef 15445 READ_ULEB (val, p, end);
071436c6 15446 printf (_("flag = %d, vendor = "), val);
4082ef84
NC
15447 if (p < end - 1)
15448 {
15449 size_t maxlen = (end - p) - 1;
15450
15451 print_symbol ((int) maxlen, (const char *) p);
15452 p += strnlen ((char *) p, maxlen) + 1;
15453 }
15454 else
15455 {
15456 printf (_("<corrupt>"));
15457 p = (unsigned char *) end;
15458 }
071436c6 15459 putchar ('\n');
071436c6 15460 }
11c1ff18
PB
15461 break;
15462
f5f53991 15463 case 64: /* Tag_nodefaults. */
541a3cbd
NC
15464 /* PR 17531: file: 001-505008-0.01. */
15465 if (p < end)
15466 p++;
2b692964 15467 printf (_("True\n"));
f5f53991
AS
15468 break;
15469
15470 case 65: /* Tag_also_compatible_with. */
cd30bcef 15471 READ_ULEB (val, p, end);
f5f53991
AS
15472 if (val == 6 /* Tag_CPU_arch. */)
15473 {
cd30bcef 15474 READ_ULEB (val, p, end);
071436c6 15475 if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
f5f53991
AS
15476 printf ("??? (%d)\n", val);
15477 else
15478 printf ("%s\n", arm_attr_tag_CPU_arch[val]);
15479 }
15480 else
15481 printf ("???\n");
071436c6
NC
15482 while (p < end && *(p++) != '\0' /* NUL terminator. */)
15483 ;
f5f53991
AS
15484 break;
15485
11c1ff18 15486 default:
bee0ee85
NC
15487 printf (_("<unknown: %d>\n"), tag);
15488 break;
11c1ff18
PB
15489 }
15490 return p;
15491
15492 case 1:
f6f0e17b 15493 return display_tag_value (-1, p, end);
11c1ff18 15494 case 2:
f6f0e17b 15495 return display_tag_value (0, p, end);
11c1ff18
PB
15496
15497 default:
15498 assert (attr->type & 0x80);
cd30bcef 15499 READ_ULEB (val, p, end);
11c1ff18
PB
15500 type = attr->type & 0x7f;
15501 if (val >= type)
15502 printf ("??? (%d)\n", val);
15503 else
15504 printf ("%s\n", attr->table[val]);
15505 return p;
15506 }
15507 }
11c1ff18 15508
f6f0e17b 15509 return display_tag_value (tag, p, end);
11c1ff18
PB
15510}
15511
104d59d1 15512static unsigned char *
60bca95a 15513display_gnu_attribute (unsigned char * p,
60abdbed 15514 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const),
f6f0e17b 15515 const unsigned char * const end)
104d59d1 15516{
cd30bcef 15517 unsigned int tag;
60abdbed 15518 unsigned int val;
104d59d1 15519
cd30bcef 15520 READ_ULEB (tag, p, end);
104d59d1
JM
15521
15522 /* Tag_compatibility is the only generic GNU attribute defined at
15523 present. */
15524 if (tag == 32)
15525 {
cd30bcef 15526 READ_ULEB (val, p, end);
071436c6
NC
15527
15528 printf (_("flag = %d, vendor = "), val);
f6f0e17b
NC
15529 if (p == end)
15530 {
071436c6 15531 printf (_("<corrupt>\n"));
f6f0e17b
NC
15532 warn (_("corrupt vendor attribute\n"));
15533 }
15534 else
15535 {
4082ef84
NC
15536 if (p < end - 1)
15537 {
15538 size_t maxlen = (end - p) - 1;
071436c6 15539
4082ef84
NC
15540 print_symbol ((int) maxlen, (const char *) p);
15541 p += strnlen ((char *) p, maxlen) + 1;
15542 }
15543 else
15544 {
15545 printf (_("<corrupt>"));
15546 p = (unsigned char *) end;
15547 }
071436c6 15548 putchar ('\n');
f6f0e17b 15549 }
104d59d1
JM
15550 return p;
15551 }
15552
15553 if ((tag & 2) == 0 && display_proc_gnu_attribute)
f6f0e17b 15554 return display_proc_gnu_attribute (p, tag, end);
104d59d1 15555
f6f0e17b 15556 return display_tag_value (tag, p, end);
104d59d1
JM
15557}
15558
85f7484a
PB
15559static unsigned char *
15560display_m68k_gnu_attribute (unsigned char * p,
15561 unsigned int tag,
15562 const unsigned char * const end)
15563{
15564 unsigned int val;
15565
15566 if (tag == Tag_GNU_M68K_ABI_FP)
15567 {
15568 printf (" Tag_GNU_M68K_ABI_FP: ");
15569 if (p == end)
15570 {
15571 printf (_("<corrupt>\n"));
15572 return p;
15573 }
15574 READ_ULEB (val, p, end);
15575
15576 if (val > 3)
15577 printf ("(%#x), ", val);
15578
15579 switch (val & 3)
15580 {
15581 case 0:
15582 printf (_("unspecified hard/soft float\n"));
15583 break;
15584 case 1:
15585 printf (_("hard float\n"));
15586 break;
15587 case 2:
15588 printf (_("soft float\n"));
15589 break;
15590 }
15591 return p;
15592 }
15593
15594 return display_tag_value (tag & 1, p, end);
15595}
15596
34c8bcba 15597static unsigned char *
f6f0e17b 15598display_power_gnu_attribute (unsigned char * p,
60abdbed 15599 unsigned int tag,
f6f0e17b 15600 const unsigned char * const end)
34c8bcba 15601{
005d79fd 15602 unsigned int val;
34c8bcba
JM
15603
15604 if (tag == Tag_GNU_Power_ABI_FP)
15605 {
34c8bcba 15606 printf (" Tag_GNU_Power_ABI_FP: ");
cd30bcef 15607 if (p == end)
005d79fd
AM
15608 {
15609 printf (_("<corrupt>\n"));
15610 return p;
15611 }
cd30bcef 15612 READ_ULEB (val, p, end);
60bca95a 15613
005d79fd
AM
15614 if (val > 15)
15615 printf ("(%#x), ", val);
15616
15617 switch (val & 3)
34c8bcba
JM
15618 {
15619 case 0:
005d79fd 15620 printf (_("unspecified hard/soft float, "));
34c8bcba
JM
15621 break;
15622 case 1:
005d79fd 15623 printf (_("hard float, "));
34c8bcba
JM
15624 break;
15625 case 2:
005d79fd 15626 printf (_("soft float, "));
34c8bcba 15627 break;
3c7b9897 15628 case 3:
005d79fd 15629 printf (_("single-precision hard float, "));
3c7b9897 15630 break;
005d79fd
AM
15631 }
15632
15633 switch (val & 0xC)
15634 {
15635 case 0:
15636 printf (_("unspecified long double\n"));
15637 break;
15638 case 4:
15639 printf (_("128-bit IBM long double\n"));
15640 break;
15641 case 8:
15642 printf (_("64-bit long double\n"));
15643 break;
15644 case 12:
15645 printf (_("128-bit IEEE long double\n"));
34c8bcba
JM
15646 break;
15647 }
15648 return p;
005d79fd 15649 }
34c8bcba 15650
c6e65352
DJ
15651 if (tag == Tag_GNU_Power_ABI_Vector)
15652 {
c6e65352 15653 printf (" Tag_GNU_Power_ABI_Vector: ");
cd30bcef 15654 if (p == end)
005d79fd
AM
15655 {
15656 printf (_("<corrupt>\n"));
15657 return p;
15658 }
cd30bcef 15659 READ_ULEB (val, p, end);
005d79fd
AM
15660
15661 if (val > 3)
15662 printf ("(%#x), ", val);
15663
15664 switch (val & 3)
c6e65352
DJ
15665 {
15666 case 0:
005d79fd 15667 printf (_("unspecified\n"));
c6e65352
DJ
15668 break;
15669 case 1:
005d79fd 15670 printf (_("generic\n"));
c6e65352
DJ
15671 break;
15672 case 2:
15673 printf ("AltiVec\n");
15674 break;
15675 case 3:
15676 printf ("SPE\n");
15677 break;
c6e65352
DJ
15678 }
15679 return p;
005d79fd 15680 }
c6e65352 15681
f82e0623
NF
15682 if (tag == Tag_GNU_Power_ABI_Struct_Return)
15683 {
005d79fd 15684 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
cd30bcef 15685 if (p == end)
f6f0e17b 15686 {
005d79fd 15687 printf (_("<corrupt>\n"));
f6f0e17b
NC
15688 return p;
15689 }
cd30bcef 15690 READ_ULEB (val, p, end);
0b4362b0 15691
005d79fd
AM
15692 if (val > 2)
15693 printf ("(%#x), ", val);
15694
15695 switch (val & 3)
15696 {
15697 case 0:
15698 printf (_("unspecified\n"));
15699 break;
15700 case 1:
15701 printf ("r3/r4\n");
15702 break;
15703 case 2:
15704 printf (_("memory\n"));
15705 break;
15706 case 3:
15707 printf ("???\n");
15708 break;
15709 }
f82e0623
NF
15710 return p;
15711 }
15712
f6f0e17b 15713 return display_tag_value (tag & 1, p, end);
34c8bcba
JM
15714}
15715
643f7afb
AK
15716static unsigned char *
15717display_s390_gnu_attribute (unsigned char * p,
60abdbed 15718 unsigned int tag,
643f7afb
AK
15719 const unsigned char * const end)
15720{
cd30bcef 15721 unsigned int val;
643f7afb
AK
15722
15723 if (tag == Tag_GNU_S390_ABI_Vector)
15724 {
643f7afb 15725 printf (" Tag_GNU_S390_ABI_Vector: ");
cd30bcef 15726 READ_ULEB (val, p, end);
643f7afb
AK
15727
15728 switch (val)
15729 {
15730 case 0:
15731 printf (_("any\n"));
15732 break;
15733 case 1:
15734 printf (_("software\n"));
15735 break;
15736 case 2:
15737 printf (_("hardware\n"));
15738 break;
15739 default:
15740 printf ("??? (%d)\n", val);
15741 break;
15742 }
15743 return p;
15744 }
15745
15746 return display_tag_value (tag & 1, p, end);
15747}
15748
9e8c70f9 15749static void
60abdbed 15750display_sparc_hwcaps (unsigned int mask)
9e8c70f9
DM
15751{
15752 if (mask)
15753 {
32ec8896 15754 bfd_boolean first = TRUE;
071436c6 15755
9e8c70f9 15756 if (mask & ELF_SPARC_HWCAP_MUL32)
32ec8896 15757 fputs ("mul32", stdout), first = FALSE;
9e8c70f9 15758 if (mask & ELF_SPARC_HWCAP_DIV32)
32ec8896 15759 printf ("%sdiv32", first ? "" : "|"), first = FALSE;
9e8c70f9 15760 if (mask & ELF_SPARC_HWCAP_FSMULD)
32ec8896 15761 printf ("%sfsmuld", first ? "" : "|"), first = FALSE;
9e8c70f9 15762 if (mask & ELF_SPARC_HWCAP_V8PLUS)
32ec8896 15763 printf ("%sv8plus", first ? "" : "|"), first = FALSE;
9e8c70f9 15764 if (mask & ELF_SPARC_HWCAP_POPC)
32ec8896 15765 printf ("%spopc", first ? "" : "|"), first = FALSE;
9e8c70f9 15766 if (mask & ELF_SPARC_HWCAP_VIS)
32ec8896 15767 printf ("%svis", first ? "" : "|"), first = FALSE;
9e8c70f9 15768 if (mask & ELF_SPARC_HWCAP_VIS2)
32ec8896 15769 printf ("%svis2", first ? "" : "|"), first = FALSE;
9e8c70f9 15770 if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
32ec8896 15771 printf ("%sASIBlkInit", first ? "" : "|"), first = FALSE;
9e8c70f9 15772 if (mask & ELF_SPARC_HWCAP_FMAF)
32ec8896 15773 printf ("%sfmaf", first ? "" : "|"), first = FALSE;
9e8c70f9 15774 if (mask & ELF_SPARC_HWCAP_VIS3)
32ec8896 15775 printf ("%svis3", first ? "" : "|"), first = FALSE;
9e8c70f9 15776 if (mask & ELF_SPARC_HWCAP_HPC)
32ec8896 15777 printf ("%shpc", first ? "" : "|"), first = FALSE;
9e8c70f9 15778 if (mask & ELF_SPARC_HWCAP_RANDOM)
32ec8896 15779 printf ("%srandom", first ? "" : "|"), first = FALSE;
9e8c70f9 15780 if (mask & ELF_SPARC_HWCAP_TRANS)
32ec8896 15781 printf ("%strans", first ? "" : "|"), first = FALSE;
9e8c70f9 15782 if (mask & ELF_SPARC_HWCAP_FJFMAU)
32ec8896 15783 printf ("%sfjfmau", first ? "" : "|"), first = FALSE;
9e8c70f9 15784 if (mask & ELF_SPARC_HWCAP_IMA)
32ec8896 15785 printf ("%sima", first ? "" : "|"), first = FALSE;
9e8c70f9 15786 if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
32ec8896 15787 printf ("%scspare", first ? "" : "|"), first = FALSE;
9e8c70f9
DM
15788 }
15789 else
071436c6
NC
15790 fputc ('0', stdout);
15791 fputc ('\n', stdout);
9e8c70f9
DM
15792}
15793
3d68f91c 15794static void
60abdbed 15795display_sparc_hwcaps2 (unsigned int mask)
3d68f91c
JM
15796{
15797 if (mask)
15798 {
32ec8896 15799 bfd_boolean first = TRUE;
071436c6 15800
3d68f91c 15801 if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
32ec8896 15802 fputs ("fjathplus", stdout), first = FALSE;
3d68f91c 15803 if (mask & ELF_SPARC_HWCAP2_VIS3B)
32ec8896 15804 printf ("%svis3b", first ? "" : "|"), first = FALSE;
3d68f91c 15805 if (mask & ELF_SPARC_HWCAP2_ADP)
32ec8896 15806 printf ("%sadp", first ? "" : "|"), first = FALSE;
3d68f91c 15807 if (mask & ELF_SPARC_HWCAP2_SPARC5)
32ec8896 15808 printf ("%ssparc5", first ? "" : "|"), first = FALSE;
3d68f91c 15809 if (mask & ELF_SPARC_HWCAP2_MWAIT)
32ec8896 15810 printf ("%smwait", first ? "" : "|"), first = FALSE;
3d68f91c 15811 if (mask & ELF_SPARC_HWCAP2_XMPMUL)
32ec8896 15812 printf ("%sxmpmul", first ? "" : "|"), first = FALSE;
3d68f91c 15813 if (mask & ELF_SPARC_HWCAP2_XMONT)
32ec8896 15814 printf ("%sxmont2", first ? "" : "|"), first = FALSE;
3d68f91c 15815 if (mask & ELF_SPARC_HWCAP2_NSEC)
32ec8896 15816 printf ("%snsec", first ? "" : "|"), first = FALSE;
3d68f91c 15817 if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
32ec8896 15818 printf ("%sfjathhpc", first ? "" : "|"), first = FALSE;
3d68f91c 15819 if (mask & ELF_SPARC_HWCAP2_FJDES)
32ec8896 15820 printf ("%sfjdes", first ? "" : "|"), first = FALSE;
3d68f91c 15821 if (mask & ELF_SPARC_HWCAP2_FJAES)
32ec8896 15822 printf ("%sfjaes", first ? "" : "|"), first = FALSE;
3d68f91c
JM
15823 }
15824 else
071436c6
NC
15825 fputc ('0', stdout);
15826 fputc ('\n', stdout);
3d68f91c
JM
15827}
15828
9e8c70f9 15829static unsigned char *
f6f0e17b 15830display_sparc_gnu_attribute (unsigned char * p,
60abdbed 15831 unsigned int tag,
f6f0e17b 15832 const unsigned char * const end)
9e8c70f9 15833{
cd30bcef 15834 unsigned int val;
3d68f91c 15835
9e8c70f9
DM
15836 if (tag == Tag_GNU_Sparc_HWCAPS)
15837 {
cd30bcef 15838 READ_ULEB (val, p, end);
9e8c70f9 15839 printf (" Tag_GNU_Sparc_HWCAPS: ");
9e8c70f9
DM
15840 display_sparc_hwcaps (val);
15841 return p;
3d68f91c
JM
15842 }
15843 if (tag == Tag_GNU_Sparc_HWCAPS2)
15844 {
cd30bcef 15845 READ_ULEB (val, p, end);
3d68f91c
JM
15846 printf (" Tag_GNU_Sparc_HWCAPS2: ");
15847 display_sparc_hwcaps2 (val);
15848 return p;
15849 }
9e8c70f9 15850
f6f0e17b 15851 return display_tag_value (tag, p, end);
9e8c70f9
DM
15852}
15853
351cdf24 15854static void
32ec8896 15855print_mips_fp_abi_value (unsigned int val)
351cdf24
MF
15856{
15857 switch (val)
15858 {
15859 case Val_GNU_MIPS_ABI_FP_ANY:
15860 printf (_("Hard or soft float\n"));
15861 break;
15862 case Val_GNU_MIPS_ABI_FP_DOUBLE:
15863 printf (_("Hard float (double precision)\n"));
15864 break;
15865 case Val_GNU_MIPS_ABI_FP_SINGLE:
15866 printf (_("Hard float (single precision)\n"));
15867 break;
15868 case Val_GNU_MIPS_ABI_FP_SOFT:
15869 printf (_("Soft float\n"));
15870 break;
15871 case Val_GNU_MIPS_ABI_FP_OLD_64:
15872 printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
15873 break;
15874 case Val_GNU_MIPS_ABI_FP_XX:
15875 printf (_("Hard float (32-bit CPU, Any FPU)\n"));
15876 break;
15877 case Val_GNU_MIPS_ABI_FP_64:
15878 printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
15879 break;
15880 case Val_GNU_MIPS_ABI_FP_64A:
15881 printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
15882 break;
3350cc01
CM
15883 case Val_GNU_MIPS_ABI_FP_NAN2008:
15884 printf (_("NaN 2008 compatibility\n"));
15885 break;
351cdf24
MF
15886 default:
15887 printf ("??? (%d)\n", val);
15888 break;
15889 }
15890}
15891
2cf19d5c 15892static unsigned char *
f6f0e17b 15893display_mips_gnu_attribute (unsigned char * p,
60abdbed 15894 unsigned int tag,
f6f0e17b 15895 const unsigned char * const end)
2cf19d5c 15896{
2cf19d5c
JM
15897 if (tag == Tag_GNU_MIPS_ABI_FP)
15898 {
32ec8896 15899 unsigned int val;
f6f0e17b 15900
2cf19d5c 15901 printf (" Tag_GNU_MIPS_ABI_FP: ");
cd30bcef 15902 READ_ULEB (val, p, end);
351cdf24 15903 print_mips_fp_abi_value (val);
2cf19d5c
JM
15904 return p;
15905 }
15906
a9f58168
CF
15907 if (tag == Tag_GNU_MIPS_ABI_MSA)
15908 {
32ec8896 15909 unsigned int val;
a9f58168 15910
a9f58168 15911 printf (" Tag_GNU_MIPS_ABI_MSA: ");
cd30bcef 15912 READ_ULEB (val, p, end);
a9f58168
CF
15913
15914 switch (val)
15915 {
15916 case Val_GNU_MIPS_ABI_MSA_ANY:
15917 printf (_("Any MSA or not\n"));
15918 break;
15919 case Val_GNU_MIPS_ABI_MSA_128:
15920 printf (_("128-bit MSA\n"));
15921 break;
15922 default:
15923 printf ("??? (%d)\n", val);
15924 break;
15925 }
15926 return p;
15927 }
15928
f6f0e17b 15929 return display_tag_value (tag & 1, p, end);
2cf19d5c
JM
15930}
15931
59e6276b 15932static unsigned char *
f6f0e17b
NC
15933display_tic6x_attribute (unsigned char * p,
15934 const unsigned char * const end)
59e6276b 15935{
60abdbed 15936 unsigned int tag;
cd30bcef 15937 unsigned int val;
59e6276b 15938
cd30bcef 15939 READ_ULEB (tag, p, end);
59e6276b
JM
15940
15941 switch (tag)
15942 {
75fa6dc1 15943 case Tag_ISA:
75fa6dc1 15944 printf (" Tag_ISA: ");
cd30bcef 15945 READ_ULEB (val, p, end);
59e6276b
JM
15946
15947 switch (val)
15948 {
75fa6dc1 15949 case C6XABI_Tag_ISA_none:
59e6276b
JM
15950 printf (_("None\n"));
15951 break;
75fa6dc1 15952 case C6XABI_Tag_ISA_C62X:
59e6276b
JM
15953 printf ("C62x\n");
15954 break;
75fa6dc1 15955 case C6XABI_Tag_ISA_C67X:
59e6276b
JM
15956 printf ("C67x\n");
15957 break;
75fa6dc1 15958 case C6XABI_Tag_ISA_C67XP:
59e6276b
JM
15959 printf ("C67x+\n");
15960 break;
75fa6dc1 15961 case C6XABI_Tag_ISA_C64X:
59e6276b
JM
15962 printf ("C64x\n");
15963 break;
75fa6dc1 15964 case C6XABI_Tag_ISA_C64XP:
59e6276b
JM
15965 printf ("C64x+\n");
15966 break;
75fa6dc1 15967 case C6XABI_Tag_ISA_C674X:
59e6276b
JM
15968 printf ("C674x\n");
15969 break;
15970 default:
15971 printf ("??? (%d)\n", val);
15972 break;
15973 }
15974 return p;
15975
87779176 15976 case Tag_ABI_wchar_t:
87779176 15977 printf (" Tag_ABI_wchar_t: ");
cd30bcef 15978 READ_ULEB (val, p, end);
87779176
JM
15979 switch (val)
15980 {
15981 case 0:
15982 printf (_("Not used\n"));
15983 break;
15984 case 1:
15985 printf (_("2 bytes\n"));
15986 break;
15987 case 2:
15988 printf (_("4 bytes\n"));
15989 break;
15990 default:
15991 printf ("??? (%d)\n", val);
15992 break;
15993 }
15994 return p;
15995
15996 case Tag_ABI_stack_align_needed:
87779176 15997 printf (" Tag_ABI_stack_align_needed: ");
cd30bcef 15998 READ_ULEB (val, p, end);
87779176
JM
15999 switch (val)
16000 {
16001 case 0:
16002 printf (_("8-byte\n"));
16003 break;
16004 case 1:
16005 printf (_("16-byte\n"));
16006 break;
16007 default:
16008 printf ("??? (%d)\n", val);
16009 break;
16010 }
16011 return p;
16012
16013 case Tag_ABI_stack_align_preserved:
cd30bcef 16014 READ_ULEB (val, p, end);
87779176
JM
16015 printf (" Tag_ABI_stack_align_preserved: ");
16016 switch (val)
16017 {
16018 case 0:
16019 printf (_("8-byte\n"));
16020 break;
16021 case 1:
16022 printf (_("16-byte\n"));
16023 break;
16024 default:
16025 printf ("??? (%d)\n", val);
16026 break;
16027 }
16028 return p;
16029
b5593623 16030 case Tag_ABI_DSBT:
cd30bcef 16031 READ_ULEB (val, p, end);
b5593623
JM
16032 printf (" Tag_ABI_DSBT: ");
16033 switch (val)
16034 {
16035 case 0:
16036 printf (_("DSBT addressing not used\n"));
16037 break;
16038 case 1:
16039 printf (_("DSBT addressing used\n"));
16040 break;
16041 default:
16042 printf ("??? (%d)\n", val);
16043 break;
16044 }
16045 return p;
16046
87779176 16047 case Tag_ABI_PID:
cd30bcef 16048 READ_ULEB (val, p, end);
87779176
JM
16049 printf (" Tag_ABI_PID: ");
16050 switch (val)
16051 {
16052 case 0:
16053 printf (_("Data addressing position-dependent\n"));
16054 break;
16055 case 1:
16056 printf (_("Data addressing position-independent, GOT near DP\n"));
16057 break;
16058 case 2:
16059 printf (_("Data addressing position-independent, GOT far from DP\n"));
16060 break;
16061 default:
16062 printf ("??? (%d)\n", val);
16063 break;
16064 }
16065 return p;
16066
16067 case Tag_ABI_PIC:
cd30bcef 16068 READ_ULEB (val, p, end);
87779176
JM
16069 printf (" Tag_ABI_PIC: ");
16070 switch (val)
16071 {
16072 case 0:
16073 printf (_("Code addressing position-dependent\n"));
16074 break;
16075 case 1:
16076 printf (_("Code addressing position-independent\n"));
16077 break;
16078 default:
16079 printf ("??? (%d)\n", val);
16080 break;
16081 }
16082 return p;
16083
16084 case Tag_ABI_array_object_alignment:
cd30bcef 16085 READ_ULEB (val, p, end);
87779176
JM
16086 printf (" Tag_ABI_array_object_alignment: ");
16087 switch (val)
16088 {
16089 case 0:
16090 printf (_("8-byte\n"));
16091 break;
16092 case 1:
16093 printf (_("4-byte\n"));
16094 break;
16095 case 2:
16096 printf (_("16-byte\n"));
16097 break;
16098 default:
16099 printf ("??? (%d)\n", val);
16100 break;
16101 }
16102 return p;
16103
16104 case Tag_ABI_array_object_align_expected:
cd30bcef 16105 READ_ULEB (val, p, end);
87779176
JM
16106 printf (" Tag_ABI_array_object_align_expected: ");
16107 switch (val)
16108 {
16109 case 0:
16110 printf (_("8-byte\n"));
16111 break;
16112 case 1:
16113 printf (_("4-byte\n"));
16114 break;
16115 case 2:
16116 printf (_("16-byte\n"));
16117 break;
16118 default:
16119 printf ("??? (%d)\n", val);
16120 break;
16121 }
16122 return p;
16123
3cbd1c06 16124 case Tag_ABI_compatibility:
071436c6 16125 {
cd30bcef 16126 READ_ULEB (val, p, end);
071436c6 16127 printf (" Tag_ABI_compatibility: ");
071436c6 16128 printf (_("flag = %d, vendor = "), val);
4082ef84
NC
16129 if (p < end - 1)
16130 {
16131 size_t maxlen = (end - p) - 1;
16132
16133 print_symbol ((int) maxlen, (const char *) p);
16134 p += strnlen ((char *) p, maxlen) + 1;
16135 }
16136 else
16137 {
16138 printf (_("<corrupt>"));
16139 p = (unsigned char *) end;
16140 }
071436c6 16141 putchar ('\n');
071436c6
NC
16142 return p;
16143 }
87779176
JM
16144
16145 case Tag_ABI_conformance:
071436c6 16146 {
4082ef84
NC
16147 printf (" Tag_ABI_conformance: \"");
16148 if (p < end - 1)
16149 {
16150 size_t maxlen = (end - p) - 1;
071436c6 16151
4082ef84
NC
16152 print_symbol ((int) maxlen, (const char *) p);
16153 p += strnlen ((char *) p, maxlen) + 1;
16154 }
16155 else
16156 {
16157 printf (_("<corrupt>"));
16158 p = (unsigned char *) end;
16159 }
071436c6 16160 printf ("\"\n");
071436c6
NC
16161 return p;
16162 }
59e6276b
JM
16163 }
16164
f6f0e17b
NC
16165 return display_tag_value (tag, p, end);
16166}
59e6276b 16167
f6f0e17b 16168static void
60abdbed 16169display_raw_attribute (unsigned char * p, unsigned char const * const end)
f6f0e17b
NC
16170{
16171 unsigned long addr = 0;
16172 size_t bytes = end - p;
16173
feceaa59 16174 assert (end >= p);
f6f0e17b 16175 while (bytes)
87779176 16176 {
f6f0e17b
NC
16177 int j;
16178 int k;
16179 int lbytes = (bytes > 16 ? 16 : bytes);
16180
16181 printf (" 0x%8.8lx ", addr);
16182
16183 for (j = 0; j < 16; j++)
16184 {
16185 if (j < lbytes)
16186 printf ("%2.2x", p[j]);
16187 else
16188 printf (" ");
16189
16190 if ((j & 3) == 3)
16191 printf (" ");
16192 }
16193
16194 for (j = 0; j < lbytes; j++)
16195 {
16196 k = p[j];
16197 if (k >= ' ' && k < 0x7f)
16198 printf ("%c", k);
16199 else
16200 printf (".");
16201 }
16202
16203 putchar ('\n');
16204
16205 p += lbytes;
16206 bytes -= lbytes;
16207 addr += lbytes;
87779176 16208 }
59e6276b 16209
f6f0e17b 16210 putchar ('\n');
59e6276b
JM
16211}
16212
13761a11 16213static unsigned char *
b0191216 16214display_msp430_attribute (unsigned char * p,
13761a11
NC
16215 const unsigned char * const end)
16216{
60abdbed
NC
16217 unsigned int val;
16218 unsigned int tag;
13761a11 16219
cd30bcef 16220 READ_ULEB (tag, p, end);
0b4362b0 16221
13761a11
NC
16222 switch (tag)
16223 {
16224 case OFBA_MSPABI_Tag_ISA:
13761a11 16225 printf (" Tag_ISA: ");
cd30bcef 16226 READ_ULEB (val, p, end);
13761a11
NC
16227 switch (val)
16228 {
16229 case 0: printf (_("None\n")); break;
16230 case 1: printf (_("MSP430\n")); break;
16231 case 2: printf (_("MSP430X\n")); break;
16232 default: printf ("??? (%d)\n", val); break;
16233 }
16234 break;
16235
16236 case OFBA_MSPABI_Tag_Code_Model:
13761a11 16237 printf (" Tag_Code_Model: ");
cd30bcef 16238 READ_ULEB (val, p, end);
13761a11
NC
16239 switch (val)
16240 {
16241 case 0: printf (_("None\n")); break;
16242 case 1: printf (_("Small\n")); break;
16243 case 2: printf (_("Large\n")); break;
16244 default: printf ("??? (%d)\n", val); break;
16245 }
16246 break;
16247
16248 case OFBA_MSPABI_Tag_Data_Model:
13761a11 16249 printf (" Tag_Data_Model: ");
cd30bcef 16250 READ_ULEB (val, p, end);
13761a11
NC
16251 switch (val)
16252 {
16253 case 0: printf (_("None\n")); break;
16254 case 1: printf (_("Small\n")); break;
16255 case 2: printf (_("Large\n")); break;
16256 case 3: printf (_("Restricted Large\n")); break;
16257 default: printf ("??? (%d)\n", val); break;
16258 }
16259 break;
16260
16261 default:
16262 printf (_(" <unknown tag %d>: "), tag);
16263
16264 if (tag & 1)
16265 {
071436c6 16266 putchar ('"');
4082ef84
NC
16267 if (p < end - 1)
16268 {
16269 size_t maxlen = (end - p) - 1;
16270
16271 print_symbol ((int) maxlen, (const char *) p);
16272 p += strnlen ((char *) p, maxlen) + 1;
16273 }
16274 else
16275 {
16276 printf (_("<corrupt>"));
16277 p = (unsigned char *) end;
16278 }
071436c6 16279 printf ("\"\n");
13761a11
NC
16280 }
16281 else
16282 {
cd30bcef 16283 READ_ULEB (val, p, end);
13761a11
NC
16284 printf ("%d (0x%x)\n", val, val);
16285 }
16286 break;
16287 }
16288
4082ef84 16289 assert (p <= end);
13761a11
NC
16290 return p;
16291}
16292
c0ea7c52
JL
16293static unsigned char *
16294display_msp430_gnu_attribute (unsigned char * p,
16295 unsigned int tag,
16296 const unsigned char * const end)
16297{
16298 if (tag == Tag_GNU_MSP430_Data_Region)
16299 {
cd30bcef 16300 unsigned int val;
c0ea7c52 16301
c0ea7c52 16302 printf (" Tag_GNU_MSP430_Data_Region: ");
cd30bcef 16303 READ_ULEB (val, p, end);
c0ea7c52
JL
16304
16305 switch (val)
16306 {
16307 case Val_GNU_MSP430_Data_Region_Any:
16308 printf (_("Any Region\n"));
16309 break;
16310 case Val_GNU_MSP430_Data_Region_Lower:
16311 printf (_("Lower Region Only\n"));
16312 break;
16313 default:
cd30bcef 16314 printf ("??? (%u)\n", val);
c0ea7c52
JL
16315 }
16316 return p;
16317 }
16318 return display_tag_value (tag & 1, p, end);
16319}
16320
2dc8dd17
JW
16321struct riscv_attr_tag_t {
16322 const char *name;
cd30bcef 16323 unsigned int tag;
2dc8dd17
JW
16324};
16325
16326static struct riscv_attr_tag_t riscv_attr_tag[] =
16327{
16328#define T(tag) {"Tag_RISCV_" #tag, Tag_RISCV_##tag}
16329 T(arch),
16330 T(priv_spec),
16331 T(priv_spec_minor),
16332 T(priv_spec_revision),
16333 T(unaligned_access),
16334 T(stack_align),
16335#undef T
16336};
16337
16338static unsigned char *
16339display_riscv_attribute (unsigned char *p,
16340 const unsigned char * const end)
16341{
cd30bcef
AM
16342 unsigned int val;
16343 unsigned int tag;
2dc8dd17
JW
16344 struct riscv_attr_tag_t *attr = NULL;
16345 unsigned i;
16346
cd30bcef 16347 READ_ULEB (tag, p, end);
2dc8dd17
JW
16348
16349 /* Find the name of attribute. */
16350 for (i = 0; i < ARRAY_SIZE (riscv_attr_tag); i++)
16351 {
16352 if (riscv_attr_tag[i].tag == tag)
16353 {
16354 attr = &riscv_attr_tag[i];
16355 break;
16356 }
16357 }
16358
16359 if (attr)
16360 printf (" %s: ", attr->name);
16361 else
16362 return display_tag_value (tag, p, end);
16363
16364 switch (tag)
16365 {
16366 case Tag_RISCV_priv_spec:
16367 case Tag_RISCV_priv_spec_minor:
16368 case Tag_RISCV_priv_spec_revision:
cd30bcef
AM
16369 READ_ULEB (val, p, end);
16370 printf (_("%u\n"), val);
2dc8dd17
JW
16371 break;
16372 case Tag_RISCV_unaligned_access:
cd30bcef 16373 READ_ULEB (val, p, end);
2dc8dd17
JW
16374 switch (val)
16375 {
16376 case 0:
16377 printf (_("No unaligned access\n"));
16378 break;
16379 case 1:
16380 printf (_("Unaligned access\n"));
16381 break;
16382 }
16383 break;
16384 case Tag_RISCV_stack_align:
cd30bcef
AM
16385 READ_ULEB (val, p, end);
16386 printf (_("%u-bytes\n"), val);
2dc8dd17
JW
16387 break;
16388 case Tag_RISCV_arch:
16389 p = display_tag_value (-1, p, end);
16390 break;
16391 default:
16392 return display_tag_value (tag, p, end);
16393 }
16394
16395 return p;
16396}
16397
0861f561
CQ
16398static unsigned char *
16399display_csky_attribute (unsigned char * p,
16400 const unsigned char * const end)
16401{
16402 unsigned int tag;
16403 unsigned int val;
16404 READ_ULEB (tag, p, end);
16405
16406 if (tag >= Tag_CSKY_MAX)
16407 {
16408 return display_tag_value (-1, p, end);
16409 }
16410
16411 switch (tag)
16412 {
16413 case Tag_CSKY_ARCH_NAME:
16414 printf (" Tag_CSKY_ARCH_NAME:\t\t");
16415 return display_tag_value (-1, p, end);
16416 case Tag_CSKY_CPU_NAME:
16417 printf (" Tag_CSKY_CPU_NAME:\t\t");
16418 return display_tag_value (-1, p, end);
16419
16420 case Tag_CSKY_ISA_FLAGS:
16421 printf (" Tag_CSKY_ISA_FLAGS:\t\t");
16422 return display_tag_value (0, p, end);
16423 case Tag_CSKY_ISA_EXT_FLAGS:
16424 printf (" Tag_CSKY_ISA_EXT_FLAGS:\t");
16425 return display_tag_value (0, p, end);
16426
16427 case Tag_CSKY_DSP_VERSION:
16428 printf (" Tag_CSKY_DSP_VERSION:\t\t");
16429 READ_ULEB (val, p, end);
16430 if (val == VAL_CSKY_DSP_VERSION_EXTENSION)
16431 printf ("DSP Extension\n");
16432 else if (val == VAL_CSKY_DSP_VERSION_2)
16433 printf ("DSP 2.0\n");
16434 break;
16435
16436 case Tag_CSKY_VDSP_VERSION:
16437 printf (" Tag_CSKY_VDSP_VERSION:\t");
16438 READ_ULEB (val, p, end);
16439 printf ("VDSP Version %d\n", val);
16440 break;
16441
16442 case Tag_CSKY_FPU_VERSION:
16443 printf (" Tag_CSKY_FPU_VERSION:\t\t");
16444 READ_ULEB (val, p, end);
16445 if (val == VAL_CSKY_FPU_VERSION_1)
16446 printf ("ABIV1 FPU Version 1\n");
16447 else if (val == VAL_CSKY_FPU_VERSION_2)
16448 printf ("FPU Version 2\n");
16449 break;
16450
16451 case Tag_CSKY_FPU_ABI:
16452 printf (" Tag_CSKY_FPU_ABI:\t\t");
16453 READ_ULEB (val, p, end);
16454 if (val == VAL_CSKY_FPU_ABI_HARD)
16455 printf ("Hard\n");
16456 else if (val == VAL_CSKY_FPU_ABI_SOFTFP)
16457 printf ("SoftFP\n");
16458 else if (val == VAL_CSKY_FPU_ABI_SOFT)
16459 printf ("Soft\n");
16460 break;
16461 case Tag_CSKY_FPU_ROUNDING:
16462 READ_ULEB (val, p, end);
16463 if (val == 1) {
16464 printf (" Tag_CSKY_FPU_ROUNDING:\t");
16465 printf ("Needed\n");
16466 }
16467 break;
16468 case Tag_CSKY_FPU_DENORMAL:
16469 READ_ULEB (val, p, end);
16470 if (val == 1) {
16471 printf (" Tag_CSKY_FPU_DENORMAL:\t");
16472 printf ("Needed\n");
16473 }
16474 break;
16475 case Tag_CSKY_FPU_Exception:
16476 READ_ULEB (val, p, end);
16477 if (val == 1) {
16478 printf (" Tag_CSKY_FPU_Exception:\t");
16479 printf ("Needed\n");
16480 }
16481 break;
16482 case Tag_CSKY_FPU_NUMBER_MODULE:
16483 printf (" Tag_CSKY_FPU_NUMBER_MODULE:\t");
16484 return display_tag_value (-1, p, end);
16485 case Tag_CSKY_FPU_HARDFP:
16486 printf (" Tag_CSKY_FPU_HARDFP:\t\t");
16487 READ_ULEB (val, p, end);
16488 if (val & VAL_CSKY_FPU_HARDFP_HALF)
16489 printf (" Half");
16490 if (val & VAL_CSKY_FPU_HARDFP_SINGLE)
16491 printf (" Single");
16492 if (val & VAL_CSKY_FPU_HARDFP_DOUBLE)
16493 printf (" Double");
16494 printf ("\n");
16495 break;
16496 default:
16497 return display_tag_value (tag, p, end);
16498 }
16499 return p;
16500}
16501
32ec8896 16502static bfd_boolean
dda8d76d 16503process_attributes (Filedata * filedata,
60bca95a 16504 const char * public_name,
104d59d1 16505 unsigned int proc_type,
f6f0e17b 16506 unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
60abdbed 16507 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const))
11c1ff18 16508{
2cf0635d 16509 Elf_Internal_Shdr * sect;
11c1ff18 16510 unsigned i;
32ec8896 16511 bfd_boolean res = TRUE;
11c1ff18
PB
16512
16513 /* Find the section header so that we get the size. */
dda8d76d
NC
16514 for (i = 0, sect = filedata->section_headers;
16515 i < filedata->file_header.e_shnum;
11c1ff18
PB
16516 i++, sect++)
16517 {
071436c6
NC
16518 unsigned char * contents;
16519 unsigned char * p;
16520
104d59d1 16521 if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
11c1ff18
PB
16522 continue;
16523
dda8d76d 16524 contents = (unsigned char *) get_data (NULL, filedata, sect->sh_offset, 1,
3f5e193b 16525 sect->sh_size, _("attributes"));
60bca95a 16526 if (contents == NULL)
32ec8896
NC
16527 {
16528 res = FALSE;
16529 continue;
16530 }
60bca95a 16531
11c1ff18 16532 p = contents;
60abdbed
NC
16533 /* The first character is the version of the attributes.
16534 Currently only version 1, (aka 'A') is recognised here. */
16535 if (*p != 'A')
32ec8896
NC
16536 {
16537 printf (_("Unknown attributes version '%c'(%d) - expecting 'A'\n"), *p, *p);
16538 res = FALSE;
16539 }
60abdbed 16540 else
11c1ff18 16541 {
071436c6
NC
16542 bfd_vma section_len;
16543
16544 section_len = sect->sh_size - 1;
11c1ff18 16545 p++;
60bca95a 16546
071436c6 16547 while (section_len > 0)
11c1ff18 16548 {
071436c6 16549 bfd_vma attr_len;
e9847026 16550 unsigned int namelen;
11c1ff18 16551 bfd_boolean public_section;
104d59d1 16552 bfd_boolean gnu_section;
11c1ff18 16553
071436c6 16554 if (section_len <= 4)
e0a31db1
NC
16555 {
16556 error (_("Tag section ends prematurely\n"));
32ec8896 16557 res = FALSE;
e0a31db1
NC
16558 break;
16559 }
071436c6 16560 attr_len = byte_get (p, 4);
11c1ff18 16561 p += 4;
60bca95a 16562
071436c6 16563 if (attr_len > section_len)
11c1ff18 16564 {
071436c6
NC
16565 error (_("Bad attribute length (%u > %u)\n"),
16566 (unsigned) attr_len, (unsigned) section_len);
16567 attr_len = section_len;
32ec8896 16568 res = FALSE;
11c1ff18 16569 }
74e1a04b 16570 /* PR 17531: file: 001-101425-0.004 */
071436c6 16571 else if (attr_len < 5)
74e1a04b 16572 {
071436c6 16573 error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
32ec8896 16574 res = FALSE;
74e1a04b
NC
16575 break;
16576 }
e9847026 16577
071436c6
NC
16578 section_len -= attr_len;
16579 attr_len -= 4;
16580
16581 namelen = strnlen ((char *) p, attr_len) + 1;
16582 if (namelen == 0 || namelen >= attr_len)
e9847026
NC
16583 {
16584 error (_("Corrupt attribute section name\n"));
32ec8896 16585 res = FALSE;
e9847026
NC
16586 break;
16587 }
16588
071436c6
NC
16589 printf (_("Attribute Section: "));
16590 print_symbol (INT_MAX, (const char *) p);
16591 putchar ('\n');
60bca95a
NC
16592
16593 if (public_name && streq ((char *) p, public_name))
11c1ff18
PB
16594 public_section = TRUE;
16595 else
16596 public_section = FALSE;
60bca95a
NC
16597
16598 if (streq ((char *) p, "gnu"))
104d59d1
JM
16599 gnu_section = TRUE;
16600 else
16601 gnu_section = FALSE;
60bca95a 16602
11c1ff18 16603 p += namelen;
071436c6 16604 attr_len -= namelen;
e0a31db1 16605
071436c6 16606 while (attr_len > 0 && p < contents + sect->sh_size)
11c1ff18 16607 {
e0a31db1 16608 int tag;
cd30bcef 16609 unsigned int val;
11c1ff18 16610 bfd_vma size;
071436c6 16611 unsigned char * end;
60bca95a 16612
e0a31db1 16613 /* PR binutils/17531: Safe handling of corrupt files. */
071436c6 16614 if (attr_len < 6)
e0a31db1
NC
16615 {
16616 error (_("Unused bytes at end of section\n"));
32ec8896 16617 res = FALSE;
e0a31db1
NC
16618 section_len = 0;
16619 break;
16620 }
16621
16622 tag = *(p++);
11c1ff18 16623 size = byte_get (p, 4);
071436c6 16624 if (size > attr_len)
11c1ff18 16625 {
e9847026 16626 error (_("Bad subsection length (%u > %u)\n"),
071436c6 16627 (unsigned) size, (unsigned) attr_len);
32ec8896 16628 res = FALSE;
071436c6 16629 size = attr_len;
11c1ff18 16630 }
e0a31db1
NC
16631 /* PR binutils/17531: Safe handling of corrupt files. */
16632 if (size < 6)
16633 {
16634 error (_("Bad subsection length (%u < 6)\n"),
16635 (unsigned) size);
32ec8896 16636 res = FALSE;
e0a31db1
NC
16637 section_len = 0;
16638 break;
16639 }
60bca95a 16640
071436c6 16641 attr_len -= size;
11c1ff18 16642 end = p + size - 1;
071436c6 16643 assert (end <= contents + sect->sh_size);
11c1ff18 16644 p += 4;
60bca95a 16645
11c1ff18
PB
16646 switch (tag)
16647 {
16648 case 1:
2b692964 16649 printf (_("File Attributes\n"));
11c1ff18
PB
16650 break;
16651 case 2:
2b692964 16652 printf (_("Section Attributes:"));
11c1ff18
PB
16653 goto do_numlist;
16654 case 3:
2b692964 16655 printf (_("Symbol Attributes:"));
1a0670f3 16656 /* Fall through. */
11c1ff18
PB
16657 do_numlist:
16658 for (;;)
16659 {
cd30bcef 16660 READ_ULEB (val, p, end);
11c1ff18
PB
16661 if (val == 0)
16662 break;
16663 printf (" %d", val);
16664 }
16665 printf ("\n");
16666 break;
16667 default:
2b692964 16668 printf (_("Unknown tag: %d\n"), tag);
11c1ff18
PB
16669 public_section = FALSE;
16670 break;
16671 }
60bca95a 16672
071436c6 16673 if (public_section && display_pub_attribute != NULL)
11c1ff18
PB
16674 {
16675 while (p < end)
f6f0e17b 16676 p = display_pub_attribute (p, end);
60abdbed 16677 assert (p == end);
104d59d1 16678 }
071436c6 16679 else if (gnu_section && display_proc_gnu_attribute != NULL)
104d59d1
JM
16680 {
16681 while (p < end)
16682 p = display_gnu_attribute (p,
f6f0e17b
NC
16683 display_proc_gnu_attribute,
16684 end);
60abdbed 16685 assert (p == end);
11c1ff18 16686 }
071436c6 16687 else if (p < end)
11c1ff18 16688 {
071436c6 16689 printf (_(" Unknown attribute:\n"));
f6f0e17b 16690 display_raw_attribute (p, end);
11c1ff18
PB
16691 p = end;
16692 }
071436c6
NC
16693 else
16694 attr_len = 0;
11c1ff18
PB
16695 }
16696 }
16697 }
d70c5fc7 16698
60bca95a 16699 free (contents);
11c1ff18 16700 }
32ec8896
NC
16701
16702 return res;
11c1ff18
PB
16703}
16704
ccb4c951
RS
16705/* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
16706 Print the Address, Access and Initial fields of an entry at VMA ADDR
82b1b41b
NC
16707 and return the VMA of the next entry, or -1 if there was a problem.
16708 Does not read from DATA_END or beyond. */
ccb4c951
RS
16709
16710static bfd_vma
82b1b41b
NC
16711print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
16712 unsigned char * data_end)
ccb4c951
RS
16713{
16714 printf (" ");
16715 print_vma (addr, LONG_HEX);
16716 printf (" ");
16717 if (addr < pltgot + 0xfff0)
16718 printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
16719 else
16720 printf ("%10s", "");
16721 printf (" ");
16722 if (data == NULL)
2b692964 16723 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
ccb4c951
RS
16724 else
16725 {
16726 bfd_vma entry;
82b1b41b 16727 unsigned char * from = data + addr - pltgot;
ccb4c951 16728
82b1b41b
NC
16729 if (from + (is_32bit_elf ? 4 : 8) > data_end)
16730 {
16731 warn (_("MIPS GOT entry extends beyond the end of available data\n"));
16732 printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
16733 return (bfd_vma) -1;
16734 }
16735 else
16736 {
16737 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
16738 print_vma (entry, LONG_HEX);
16739 }
ccb4c951
RS
16740 }
16741 return addr + (is_32bit_elf ? 4 : 8);
16742}
16743
861fb55a
DJ
16744/* DATA points to the contents of a MIPS PLT GOT that starts at VMA
16745 PLTGOT. Print the Address and Initial fields of an entry at VMA
16746 ADDR and return the VMA of the next entry. */
16747
16748static bfd_vma
2cf0635d 16749print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
861fb55a
DJ
16750{
16751 printf (" ");
16752 print_vma (addr, LONG_HEX);
16753 printf (" ");
16754 if (data == NULL)
2b692964 16755 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
861fb55a
DJ
16756 else
16757 {
16758 bfd_vma entry;
16759
16760 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
16761 print_vma (entry, LONG_HEX);
16762 }
16763 return addr + (is_32bit_elf ? 4 : 8);
16764}
16765
351cdf24
MF
16766static void
16767print_mips_ases (unsigned int mask)
16768{
16769 if (mask & AFL_ASE_DSP)
16770 fputs ("\n\tDSP ASE", stdout);
16771 if (mask & AFL_ASE_DSPR2)
16772 fputs ("\n\tDSP R2 ASE", stdout);
8f4f9071
MF
16773 if (mask & AFL_ASE_DSPR3)
16774 fputs ("\n\tDSP R3 ASE", stdout);
351cdf24
MF
16775 if (mask & AFL_ASE_EVA)
16776 fputs ("\n\tEnhanced VA Scheme", stdout);
16777 if (mask & AFL_ASE_MCU)
16778 fputs ("\n\tMCU (MicroController) ASE", stdout);
16779 if (mask & AFL_ASE_MDMX)
16780 fputs ("\n\tMDMX ASE", stdout);
16781 if (mask & AFL_ASE_MIPS3D)
16782 fputs ("\n\tMIPS-3D ASE", stdout);
16783 if (mask & AFL_ASE_MT)
16784 fputs ("\n\tMT ASE", stdout);
16785 if (mask & AFL_ASE_SMARTMIPS)
16786 fputs ("\n\tSmartMIPS ASE", stdout);
16787 if (mask & AFL_ASE_VIRT)
16788 fputs ("\n\tVZ ASE", stdout);
16789 if (mask & AFL_ASE_MSA)
16790 fputs ("\n\tMSA ASE", stdout);
16791 if (mask & AFL_ASE_MIPS16)
16792 fputs ("\n\tMIPS16 ASE", stdout);
16793 if (mask & AFL_ASE_MICROMIPS)
16794 fputs ("\n\tMICROMIPS ASE", stdout);
16795 if (mask & AFL_ASE_XPA)
16796 fputs ("\n\tXPA ASE", stdout);
25499ac7
MR
16797 if (mask & AFL_ASE_MIPS16E2)
16798 fputs ("\n\tMIPS16e2 ASE", stdout);
730c3174
SE
16799 if (mask & AFL_ASE_CRC)
16800 fputs ("\n\tCRC ASE", stdout);
6f20c942
FS
16801 if (mask & AFL_ASE_GINV)
16802 fputs ("\n\tGINV ASE", stdout);
8095d2f7
CX
16803 if (mask & AFL_ASE_LOONGSON_MMI)
16804 fputs ("\n\tLoongson MMI ASE", stdout);
716c08de
CX
16805 if (mask & AFL_ASE_LOONGSON_CAM)
16806 fputs ("\n\tLoongson CAM ASE", stdout);
bdc6c06e
CX
16807 if (mask & AFL_ASE_LOONGSON_EXT)
16808 fputs ("\n\tLoongson EXT ASE", stdout);
a693765e
CX
16809 if (mask & AFL_ASE_LOONGSON_EXT2)
16810 fputs ("\n\tLoongson EXT2 ASE", stdout);
351cdf24
MF
16811 if (mask == 0)
16812 fprintf (stdout, "\n\t%s", _("None"));
00ac7aa0
MF
16813 else if ((mask & ~AFL_ASE_MASK) != 0)
16814 fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
351cdf24
MF
16815}
16816
16817static void
16818print_mips_isa_ext (unsigned int isa_ext)
16819{
16820 switch (isa_ext)
16821 {
16822 case 0:
16823 fputs (_("None"), stdout);
16824 break;
16825 case AFL_EXT_XLR:
16826 fputs ("RMI XLR", stdout);
16827 break;
2c629856
N
16828 case AFL_EXT_OCTEON3:
16829 fputs ("Cavium Networks Octeon3", stdout);
16830 break;
351cdf24
MF
16831 case AFL_EXT_OCTEON2:
16832 fputs ("Cavium Networks Octeon2", stdout);
16833 break;
16834 case AFL_EXT_OCTEONP:
16835 fputs ("Cavium Networks OcteonP", stdout);
16836 break;
351cdf24
MF
16837 case AFL_EXT_OCTEON:
16838 fputs ("Cavium Networks Octeon", stdout);
16839 break;
16840 case AFL_EXT_5900:
16841 fputs ("Toshiba R5900", stdout);
16842 break;
16843 case AFL_EXT_4650:
16844 fputs ("MIPS R4650", stdout);
16845 break;
16846 case AFL_EXT_4010:
16847 fputs ("LSI R4010", stdout);
16848 break;
16849 case AFL_EXT_4100:
16850 fputs ("NEC VR4100", stdout);
16851 break;
16852 case AFL_EXT_3900:
16853 fputs ("Toshiba R3900", stdout);
16854 break;
16855 case AFL_EXT_10000:
16856 fputs ("MIPS R10000", stdout);
16857 break;
16858 case AFL_EXT_SB1:
16859 fputs ("Broadcom SB-1", stdout);
16860 break;
16861 case AFL_EXT_4111:
16862 fputs ("NEC VR4111/VR4181", stdout);
16863 break;
16864 case AFL_EXT_4120:
16865 fputs ("NEC VR4120", stdout);
16866 break;
16867 case AFL_EXT_5400:
16868 fputs ("NEC VR5400", stdout);
16869 break;
16870 case AFL_EXT_5500:
16871 fputs ("NEC VR5500", stdout);
16872 break;
16873 case AFL_EXT_LOONGSON_2E:
16874 fputs ("ST Microelectronics Loongson 2E", stdout);
16875 break;
16876 case AFL_EXT_LOONGSON_2F:
16877 fputs ("ST Microelectronics Loongson 2F", stdout);
16878 break;
38bf472a
MR
16879 case AFL_EXT_INTERAPTIV_MR2:
16880 fputs ("Imagination interAptiv MR2", stdout);
16881 break;
351cdf24 16882 default:
00ac7aa0 16883 fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
351cdf24
MF
16884 }
16885}
16886
32ec8896 16887static signed int
351cdf24
MF
16888get_mips_reg_size (int reg_size)
16889{
16890 return (reg_size == AFL_REG_NONE) ? 0
16891 : (reg_size == AFL_REG_32) ? 32
16892 : (reg_size == AFL_REG_64) ? 64
16893 : (reg_size == AFL_REG_128) ? 128
16894 : -1;
16895}
16896
32ec8896 16897static bfd_boolean
dda8d76d 16898process_mips_specific (Filedata * filedata)
5b18a4bc 16899{
2cf0635d 16900 Elf_Internal_Dyn * entry;
351cdf24 16901 Elf_Internal_Shdr *sect = NULL;
19e6b90e
L
16902 size_t liblist_offset = 0;
16903 size_t liblistno = 0;
16904 size_t conflictsno = 0;
16905 size_t options_offset = 0;
16906 size_t conflicts_offset = 0;
861fb55a
DJ
16907 size_t pltrelsz = 0;
16908 size_t pltrel = 0;
ccb4c951 16909 bfd_vma pltgot = 0;
861fb55a
DJ
16910 bfd_vma mips_pltgot = 0;
16911 bfd_vma jmprel = 0;
ccb4c951
RS
16912 bfd_vma local_gotno = 0;
16913 bfd_vma gotsym = 0;
16914 bfd_vma symtabno = 0;
32ec8896 16915 bfd_boolean res = TRUE;
103f02d3 16916
dda8d76d 16917 if (! process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
32ec8896
NC
16918 display_mips_gnu_attribute))
16919 res = FALSE;
2cf19d5c 16920
dda8d76d 16921 sect = find_section (filedata, ".MIPS.abiflags");
351cdf24
MF
16922
16923 if (sect != NULL)
16924 {
16925 Elf_External_ABIFlags_v0 *abiflags_ext;
16926 Elf_Internal_ABIFlags_v0 abiflags_in;
16927
16928 if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
32ec8896
NC
16929 {
16930 error (_("Corrupt MIPS ABI Flags section.\n"));
16931 res = FALSE;
16932 }
351cdf24
MF
16933 else
16934 {
dda8d76d 16935 abiflags_ext = get_data (NULL, filedata, sect->sh_offset, 1,
351cdf24
MF
16936 sect->sh_size, _("MIPS ABI Flags section"));
16937 if (abiflags_ext)
16938 {
16939 abiflags_in.version = BYTE_GET (abiflags_ext->version);
16940 abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
16941 abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
16942 abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
16943 abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
16944 abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
16945 abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
16946 abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
16947 abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
16948 abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
16949 abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
16950
16951 printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
16952 printf ("\nISA: MIPS%d", abiflags_in.isa_level);
16953 if (abiflags_in.isa_rev > 1)
16954 printf ("r%d", abiflags_in.isa_rev);
16955 printf ("\nGPR size: %d",
16956 get_mips_reg_size (abiflags_in.gpr_size));
16957 printf ("\nCPR1 size: %d",
16958 get_mips_reg_size (abiflags_in.cpr1_size));
16959 printf ("\nCPR2 size: %d",
16960 get_mips_reg_size (abiflags_in.cpr2_size));
16961 fputs ("\nFP ABI: ", stdout);
16962 print_mips_fp_abi_value (abiflags_in.fp_abi);
16963 fputs ("ISA Extension: ", stdout);
16964 print_mips_isa_ext (abiflags_in.isa_ext);
16965 fputs ("\nASEs:", stdout);
16966 print_mips_ases (abiflags_in.ases);
16967 printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
16968 printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
16969 fputc ('\n', stdout);
16970 free (abiflags_ext);
16971 }
16972 }
16973 }
16974
19e6b90e 16975 /* We have a lot of special sections. Thanks SGI! */
978c4450 16976 if (filedata->dynamic_section == NULL)
bbdd9a68
MR
16977 {
16978 /* No dynamic information available. See if there is static GOT. */
dda8d76d 16979 sect = find_section (filedata, ".got");
bbdd9a68
MR
16980 if (sect != NULL)
16981 {
16982 unsigned char *data_end;
16983 unsigned char *data;
16984 bfd_vma ent, end;
16985 int addr_size;
16986
16987 pltgot = sect->sh_addr;
16988
16989 ent = pltgot;
16990 addr_size = (is_32bit_elf ? 4 : 8);
16991 end = pltgot + sect->sh_size;
16992
dda8d76d 16993 data = (unsigned char *) get_data (NULL, filedata, sect->sh_offset,
bbdd9a68
MR
16994 end - pltgot, 1,
16995 _("Global Offset Table data"));
16996 /* PR 12855: Null data is handled gracefully throughout. */
16997 data_end = data + (end - pltgot);
16998
16999 printf (_("\nStatic GOT:\n"));
17000 printf (_(" Canonical gp value: "));
17001 print_vma (ent + 0x7ff0, LONG_HEX);
17002 printf ("\n\n");
17003
17004 /* In a dynamic binary GOT[0] is reserved for the dynamic
17005 loader to store the lazy resolver pointer, however in
17006 a static binary it may well have been omitted and GOT
17007 reduced to a table of addresses.
17008 PR 21344: Check for the entry being fully available
17009 before fetching it. */
17010 if (data
17011 && data + ent - pltgot + addr_size <= data_end
17012 && byte_get (data + ent - pltgot, addr_size) == 0)
17013 {
17014 printf (_(" Reserved entries:\n"));
17015 printf (_(" %*s %10s %*s\n"),
17016 addr_size * 2, _("Address"), _("Access"),
17017 addr_size * 2, _("Value"));
17018 ent = print_mips_got_entry (data, pltgot, ent, data_end);
17019 printf ("\n");
17020 if (ent == (bfd_vma) -1)
17021 goto sgot_print_fail;
17022
17023 /* Check for the MSB of GOT[1] being set, identifying a
17024 GNU object. This entry will be used by some runtime
17025 loaders, to store the module pointer. Otherwise this
17026 is an ordinary local entry.
17027 PR 21344: Check for the entry being fully available
17028 before fetching it. */
17029 if (data
17030 && data + ent - pltgot + addr_size <= data_end
17031 && (byte_get (data + ent - pltgot, addr_size)
17032 >> (addr_size * 8 - 1)) != 0)
17033 {
17034 ent = print_mips_got_entry (data, pltgot, ent, data_end);
17035 printf ("\n");
17036 if (ent == (bfd_vma) -1)
17037 goto sgot_print_fail;
17038 }
17039 printf ("\n");
17040 }
17041
f17e9d8a 17042 if (data != NULL && ent < end)
bbdd9a68
MR
17043 {
17044 printf (_(" Local entries:\n"));
17045 printf (" %*s %10s %*s\n",
17046 addr_size * 2, _("Address"), _("Access"),
17047 addr_size * 2, _("Value"));
17048 while (ent < end)
17049 {
17050 ent = print_mips_got_entry (data, pltgot, ent, data_end);
17051 printf ("\n");
17052 if (ent == (bfd_vma) -1)
17053 goto sgot_print_fail;
17054 }
17055 printf ("\n");
17056 }
17057
17058 sgot_print_fail:
9db70fc3 17059 free (data);
bbdd9a68
MR
17060 }
17061 return res;
17062 }
252b5132 17063
978c4450 17064 for (entry = filedata->dynamic_section;
071436c6 17065 /* PR 17531 file: 012-50589-0.004. */
978c4450
AM
17066 (entry < filedata->dynamic_section + filedata->dynamic_nent
17067 && entry->d_tag != DT_NULL);
071436c6 17068 ++entry)
252b5132
RH
17069 switch (entry->d_tag)
17070 {
17071 case DT_MIPS_LIBLIST:
d93f0186 17072 liblist_offset
dda8d76d 17073 = offset_from_vma (filedata, entry->d_un.d_val,
d93f0186 17074 liblistno * sizeof (Elf32_External_Lib));
252b5132
RH
17075 break;
17076 case DT_MIPS_LIBLISTNO:
17077 liblistno = entry->d_un.d_val;
17078 break;
17079 case DT_MIPS_OPTIONS:
dda8d76d 17080 options_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
252b5132
RH
17081 break;
17082 case DT_MIPS_CONFLICT:
d93f0186 17083 conflicts_offset
dda8d76d 17084 = offset_from_vma (filedata, entry->d_un.d_val,
d93f0186 17085 conflictsno * sizeof (Elf32_External_Conflict));
252b5132
RH
17086 break;
17087 case DT_MIPS_CONFLICTNO:
17088 conflictsno = entry->d_un.d_val;
17089 break;
ccb4c951 17090 case DT_PLTGOT:
861fb55a
DJ
17091 pltgot = entry->d_un.d_ptr;
17092 break;
ccb4c951
RS
17093 case DT_MIPS_LOCAL_GOTNO:
17094 local_gotno = entry->d_un.d_val;
17095 break;
17096 case DT_MIPS_GOTSYM:
17097 gotsym = entry->d_un.d_val;
17098 break;
17099 case DT_MIPS_SYMTABNO:
17100 symtabno = entry->d_un.d_val;
17101 break;
861fb55a
DJ
17102 case DT_MIPS_PLTGOT:
17103 mips_pltgot = entry->d_un.d_ptr;
17104 break;
17105 case DT_PLTREL:
17106 pltrel = entry->d_un.d_val;
17107 break;
17108 case DT_PLTRELSZ:
17109 pltrelsz = entry->d_un.d_val;
17110 break;
17111 case DT_JMPREL:
17112 jmprel = entry->d_un.d_ptr;
17113 break;
252b5132
RH
17114 default:
17115 break;
17116 }
17117
17118 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
17119 {
2cf0635d 17120 Elf32_External_Lib * elib;
252b5132
RH
17121 size_t cnt;
17122
dda8d76d 17123 elib = (Elf32_External_Lib *) get_data (NULL, filedata, liblist_offset,
95099889
AM
17124 sizeof (Elf32_External_Lib),
17125 liblistno,
17126 _("liblist section data"));
a6e9f9df 17127 if (elib)
252b5132 17128 {
d3a49aa8
AM
17129 printf (ngettext ("\nSection '.liblist' contains %lu entry:\n",
17130 "\nSection '.liblist' contains %lu entries:\n",
17131 (unsigned long) liblistno),
a6e9f9df 17132 (unsigned long) liblistno);
2b692964 17133 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
a6e9f9df
AM
17134 stdout);
17135
17136 for (cnt = 0; cnt < liblistno; ++cnt)
252b5132 17137 {
a6e9f9df 17138 Elf32_Lib liblist;
91d6fa6a 17139 time_t atime;
d5b07ef4 17140 char timebuf[128];
2cf0635d 17141 struct tm * tmp;
a6e9f9df
AM
17142
17143 liblist.l_name = BYTE_GET (elib[cnt].l_name);
91d6fa6a 17144 atime = BYTE_GET (elib[cnt].l_time_stamp);
a6e9f9df
AM
17145 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
17146 liblist.l_version = BYTE_GET (elib[cnt].l_version);
17147 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
17148
91d6fa6a 17149 tmp = gmtime (&atime);
e9e44622
JJ
17150 snprintf (timebuf, sizeof (timebuf),
17151 "%04u-%02u-%02uT%02u:%02u:%02u",
17152 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
17153 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
a6e9f9df 17154
31104126 17155 printf ("%3lu: ", (unsigned long) cnt);
978c4450
AM
17156 if (VALID_DYNAMIC_NAME (filedata, liblist.l_name))
17157 print_symbol (20, GET_DYNAMIC_NAME (filedata, liblist.l_name));
d79b3d50 17158 else
2b692964 17159 printf (_("<corrupt: %9ld>"), liblist.l_name);
31104126
NC
17160 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
17161 liblist.l_version);
a6e9f9df
AM
17162
17163 if (liblist.l_flags == 0)
2b692964 17164 puts (_(" NONE"));
a6e9f9df
AM
17165 else
17166 {
17167 static const struct
252b5132 17168 {
2cf0635d 17169 const char * name;
a6e9f9df 17170 int bit;
252b5132 17171 }
a6e9f9df
AM
17172 l_flags_vals[] =
17173 {
17174 { " EXACT_MATCH", LL_EXACT_MATCH },
17175 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
17176 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
17177 { " EXPORTS", LL_EXPORTS },
17178 { " DELAY_LOAD", LL_DELAY_LOAD },
17179 { " DELTA", LL_DELTA }
17180 };
17181 int flags = liblist.l_flags;
17182 size_t fcnt;
17183
60bca95a 17184 for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
a6e9f9df
AM
17185 if ((flags & l_flags_vals[fcnt].bit) != 0)
17186 {
17187 fputs (l_flags_vals[fcnt].name, stdout);
17188 flags ^= l_flags_vals[fcnt].bit;
17189 }
17190 if (flags != 0)
17191 printf (" %#x", (unsigned int) flags);
252b5132 17192
a6e9f9df
AM
17193 puts ("");
17194 }
252b5132 17195 }
252b5132 17196
a6e9f9df
AM
17197 free (elib);
17198 }
32ec8896
NC
17199 else
17200 res = FALSE;
252b5132
RH
17201 }
17202
17203 if (options_offset != 0)
17204 {
2cf0635d 17205 Elf_External_Options * eopt;
252b5132
RH
17206 size_t offset;
17207 int cnt;
dda8d76d 17208 sect = filedata->section_headers;
252b5132
RH
17209
17210 /* Find the section header so that we get the size. */
dda8d76d 17211 sect = find_section_by_type (filedata, SHT_MIPS_OPTIONS);
948f632f 17212 /* PR 17533 file: 012-277276-0.004. */
071436c6
NC
17213 if (sect == NULL)
17214 {
17215 error (_("No MIPS_OPTIONS header found\n"));
32ec8896 17216 return FALSE;
071436c6 17217 }
7fc0c668
NC
17218 /* PR 24243 */
17219 if (sect->sh_size < sizeof (* eopt))
17220 {
17221 error (_("The MIPS options section is too small.\n"));
17222 return FALSE;
17223 }
252b5132 17224
dda8d76d 17225 eopt = (Elf_External_Options *) get_data (NULL, filedata, options_offset, 1,
3f5e193b 17226 sect->sh_size, _("options"));
a6e9f9df 17227 if (eopt)
252b5132 17228 {
fd17d1e6 17229 Elf_Internal_Options option;
76da6bbe 17230
a6e9f9df 17231 offset = cnt = 0;
82b1b41b 17232 while (offset <= sect->sh_size - sizeof (* eopt))
a6e9f9df 17233 {
2cf0635d 17234 Elf_External_Options * eoption;
fd17d1e6 17235 unsigned int optsize;
252b5132 17236
a6e9f9df 17237 eoption = (Elf_External_Options *) ((char *) eopt + offset);
252b5132 17238
fd17d1e6 17239 optsize = BYTE_GET (eoption->size);
76da6bbe 17240
82b1b41b 17241 /* PR 17531: file: ffa0fa3b. */
fd17d1e6
AM
17242 if (optsize < sizeof (* eopt)
17243 || optsize > sect->sh_size - offset)
82b1b41b 17244 {
645f43a8 17245 error (_("Invalid size (%u) for MIPS option\n"),
fd17d1e6 17246 optsize);
645f43a8 17247 free (eopt);
32ec8896 17248 return FALSE;
82b1b41b 17249 }
fd17d1e6 17250 offset += optsize;
a6e9f9df
AM
17251 ++cnt;
17252 }
252b5132 17253
d3a49aa8
AM
17254 printf (ngettext ("\nSection '%s' contains %d entry:\n",
17255 "\nSection '%s' contains %d entries:\n",
17256 cnt),
dda8d76d 17257 printable_section_name (filedata, sect), cnt);
76da6bbe 17258
82b1b41b 17259 offset = 0;
a6e9f9df 17260 while (cnt-- > 0)
252b5132 17261 {
a6e9f9df 17262 size_t len;
fd17d1e6
AM
17263 Elf_External_Options * eoption;
17264
17265 eoption = (Elf_External_Options *) ((char *) eopt + offset);
17266
17267 option.kind = BYTE_GET (eoption->kind);
17268 option.size = BYTE_GET (eoption->size);
17269 option.section = BYTE_GET (eoption->section);
17270 option.info = BYTE_GET (eoption->info);
a6e9f9df 17271
fd17d1e6 17272 switch (option.kind)
252b5132 17273 {
a6e9f9df
AM
17274 case ODK_NULL:
17275 /* This shouldn't happen. */
d0c4e780 17276 printf (" NULL %" PRId16 " %" PRIx32,
fd17d1e6 17277 option.section, option.info);
a6e9f9df 17278 break;
2e6be59c 17279
a6e9f9df
AM
17280 case ODK_REGINFO:
17281 printf (" REGINFO ");
dda8d76d 17282 if (filedata->file_header.e_machine == EM_MIPS)
a6e9f9df 17283 {
2cf0635d 17284 Elf32_External_RegInfo * ereg;
b34976b6 17285 Elf32_RegInfo reginfo;
a6e9f9df 17286
2e6be59c 17287 /* 32bit form. */
fd17d1e6
AM
17288 if (option.size < (sizeof (Elf_External_Options)
17289 + sizeof (Elf32_External_RegInfo)))
2e6be59c
NC
17290 {
17291 printf (_("<corrupt>\n"));
17292 error (_("Truncated MIPS REGINFO option\n"));
17293 cnt = 0;
17294 break;
17295 }
17296
fd17d1e6 17297 ereg = (Elf32_External_RegInfo *) (eoption + 1);
2e6be59c 17298
a6e9f9df
AM
17299 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
17300 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
17301 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
17302 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
17303 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
17304 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
17305
d0c4e780
AM
17306 printf ("GPR %08" PRIx32 " GP 0x%" PRIx32 "\n",
17307 reginfo.ri_gprmask, reginfo.ri_gp_value);
17308 printf (" "
17309 " CPR0 %08" PRIx32 " CPR1 %08" PRIx32
17310 " CPR2 %08" PRIx32 " CPR3 %08" PRIx32 "\n",
a6e9f9df
AM
17311 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
17312 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
17313 }
17314 else
17315 {
17316 /* 64 bit form. */
2cf0635d 17317 Elf64_External_RegInfo * ereg;
a6e9f9df
AM
17318 Elf64_Internal_RegInfo reginfo;
17319
fd17d1e6
AM
17320 if (option.size < (sizeof (Elf_External_Options)
17321 + sizeof (Elf64_External_RegInfo)))
2e6be59c
NC
17322 {
17323 printf (_("<corrupt>\n"));
17324 error (_("Truncated MIPS REGINFO option\n"));
17325 cnt = 0;
17326 break;
17327 }
17328
fd17d1e6 17329 ereg = (Elf64_External_RegInfo *) (eoption + 1);
a6e9f9df
AM
17330 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
17331 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
17332 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
17333 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
17334 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
66543521 17335 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
a6e9f9df 17336
d0c4e780
AM
17337 printf ("GPR %08" PRIx32 " GP 0x%" PRIx64 "\n",
17338 reginfo.ri_gprmask, reginfo.ri_gp_value);
17339 printf (" "
17340 " CPR0 %08" PRIx32 " CPR1 %08" PRIx32
17341 " CPR2 %08" PRIx32 " CPR3 %08" PRIx32 "\n",
a6e9f9df
AM
17342 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
17343 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
17344 }
fd17d1e6 17345 offset += option.size;
a6e9f9df 17346 continue;
2e6be59c 17347
a6e9f9df
AM
17348 case ODK_EXCEPTIONS:
17349 fputs (" EXCEPTIONS fpe_min(", stdout);
fd17d1e6 17350 process_mips_fpe_exception (option.info & OEX_FPU_MIN);
a6e9f9df 17351 fputs (") fpe_max(", stdout);
fd17d1e6 17352 process_mips_fpe_exception ((option.info & OEX_FPU_MAX) >> 8);
a6e9f9df
AM
17353 fputs (")", stdout);
17354
fd17d1e6 17355 if (option.info & OEX_PAGE0)
a6e9f9df 17356 fputs (" PAGE0", stdout);
fd17d1e6 17357 if (option.info & OEX_SMM)
a6e9f9df 17358 fputs (" SMM", stdout);
fd17d1e6 17359 if (option.info & OEX_FPDBUG)
a6e9f9df 17360 fputs (" FPDBUG", stdout);
fd17d1e6 17361 if (option.info & OEX_DISMISS)
a6e9f9df
AM
17362 fputs (" DISMISS", stdout);
17363 break;
2e6be59c 17364
a6e9f9df
AM
17365 case ODK_PAD:
17366 fputs (" PAD ", stdout);
fd17d1e6 17367 if (option.info & OPAD_PREFIX)
a6e9f9df 17368 fputs (" PREFIX", stdout);
fd17d1e6 17369 if (option.info & OPAD_POSTFIX)
a6e9f9df 17370 fputs (" POSTFIX", stdout);
fd17d1e6 17371 if (option.info & OPAD_SYMBOL)
a6e9f9df
AM
17372 fputs (" SYMBOL", stdout);
17373 break;
2e6be59c 17374
a6e9f9df
AM
17375 case ODK_HWPATCH:
17376 fputs (" HWPATCH ", stdout);
fd17d1e6 17377 if (option.info & OHW_R4KEOP)
a6e9f9df 17378 fputs (" R4KEOP", stdout);
fd17d1e6 17379 if (option.info & OHW_R8KPFETCH)
a6e9f9df 17380 fputs (" R8KPFETCH", stdout);
fd17d1e6 17381 if (option.info & OHW_R5KEOP)
a6e9f9df 17382 fputs (" R5KEOP", stdout);
fd17d1e6 17383 if (option.info & OHW_R5KCVTL)
a6e9f9df
AM
17384 fputs (" R5KCVTL", stdout);
17385 break;
2e6be59c 17386
a6e9f9df
AM
17387 case ODK_FILL:
17388 fputs (" FILL ", stdout);
17389 /* XXX Print content of info word? */
17390 break;
2e6be59c 17391
a6e9f9df
AM
17392 case ODK_TAGS:
17393 fputs (" TAGS ", stdout);
17394 /* XXX Print content of info word? */
17395 break;
2e6be59c 17396
a6e9f9df
AM
17397 case ODK_HWAND:
17398 fputs (" HWAND ", stdout);
fd17d1e6 17399 if (option.info & OHWA0_R4KEOP_CHECKED)
a6e9f9df 17400 fputs (" R4KEOP_CHECKED", stdout);
fd17d1e6 17401 if (option.info & OHWA0_R4KEOP_CLEAN)
a6e9f9df
AM
17402 fputs (" R4KEOP_CLEAN", stdout);
17403 break;
2e6be59c 17404
a6e9f9df
AM
17405 case ODK_HWOR:
17406 fputs (" HWOR ", stdout);
fd17d1e6 17407 if (option.info & OHWA0_R4KEOP_CHECKED)
a6e9f9df 17408 fputs (" R4KEOP_CHECKED", stdout);
fd17d1e6 17409 if (option.info & OHWA0_R4KEOP_CLEAN)
a6e9f9df
AM
17410 fputs (" R4KEOP_CLEAN", stdout);
17411 break;
2e6be59c 17412
a6e9f9df 17413 case ODK_GP_GROUP:
d0c4e780 17414 printf (" GP_GROUP %#06x self-contained %#06x",
fd17d1e6
AM
17415 option.info & OGP_GROUP,
17416 (option.info & OGP_SELF) >> 16);
a6e9f9df 17417 break;
2e6be59c 17418
a6e9f9df 17419 case ODK_IDENT:
d0c4e780 17420 printf (" IDENT %#06x self-contained %#06x",
fd17d1e6
AM
17421 option.info & OGP_GROUP,
17422 (option.info & OGP_SELF) >> 16);
a6e9f9df 17423 break;
2e6be59c 17424
a6e9f9df
AM
17425 default:
17426 /* This shouldn't happen. */
d0c4e780 17427 printf (" %3d ??? %" PRId16 " %" PRIx32,
fd17d1e6 17428 option.kind, option.section, option.info);
a6e9f9df 17429 break;
252b5132 17430 }
a6e9f9df 17431
2cf0635d 17432 len = sizeof (* eopt);
fd17d1e6 17433 while (len < option.size)
82b1b41b 17434 {
fd17d1e6 17435 unsigned char datum = *((unsigned char *) eoption + len);
a6e9f9df 17436
82b1b41b
NC
17437 if (ISPRINT (datum))
17438 printf ("%c", datum);
17439 else
17440 printf ("\\%03o", datum);
17441 len ++;
17442 }
a6e9f9df 17443 fputs ("\n", stdout);
82b1b41b 17444
fd17d1e6 17445 offset += option.size;
252b5132 17446 }
a6e9f9df 17447 free (eopt);
252b5132 17448 }
32ec8896
NC
17449 else
17450 res = FALSE;
252b5132
RH
17451 }
17452
17453 if (conflicts_offset != 0 && conflictsno != 0)
17454 {
2cf0635d 17455 Elf32_Conflict * iconf;
252b5132
RH
17456 size_t cnt;
17457
978c4450 17458 if (filedata->dynamic_symbols == NULL)
252b5132 17459 {
591a748a 17460 error (_("conflict list found without a dynamic symbol table\n"));
32ec8896 17461 return FALSE;
252b5132
RH
17462 }
17463
7296a62a
NC
17464 /* PR 21345 - print a slightly more helpful error message
17465 if we are sure that the cmalloc will fail. */
645f43a8 17466 if (conflictsno > filedata->file_size / sizeof (* iconf))
7296a62a
NC
17467 {
17468 error (_("Overlarge number of conflicts detected: %lx\n"),
17469 (long) conflictsno);
17470 return FALSE;
17471 }
17472
3f5e193b 17473 iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
252b5132
RH
17474 if (iconf == NULL)
17475 {
8b73c356 17476 error (_("Out of memory allocating space for dynamic conflicts\n"));
32ec8896 17477 return FALSE;
252b5132
RH
17478 }
17479
9ea033b2 17480 if (is_32bit_elf)
252b5132 17481 {
2cf0635d 17482 Elf32_External_Conflict * econf32;
a6e9f9df 17483
3f5e193b 17484 econf32 = (Elf32_External_Conflict *)
95099889
AM
17485 get_data (NULL, filedata, conflicts_offset,
17486 sizeof (*econf32), conflictsno, _("conflict"));
a6e9f9df 17487 if (!econf32)
5a814d6d
AM
17488 {
17489 free (iconf);
17490 return FALSE;
17491 }
252b5132
RH
17492
17493 for (cnt = 0; cnt < conflictsno; ++cnt)
17494 iconf[cnt] = BYTE_GET (econf32[cnt]);
a6e9f9df
AM
17495
17496 free (econf32);
252b5132
RH
17497 }
17498 else
17499 {
2cf0635d 17500 Elf64_External_Conflict * econf64;
a6e9f9df 17501
3f5e193b 17502 econf64 = (Elf64_External_Conflict *)
95099889
AM
17503 get_data (NULL, filedata, conflicts_offset,
17504 sizeof (*econf64), conflictsno, _("conflict"));
a6e9f9df 17505 if (!econf64)
5a814d6d
AM
17506 {
17507 free (iconf);
17508 return FALSE;
17509 }
252b5132
RH
17510
17511 for (cnt = 0; cnt < conflictsno; ++cnt)
17512 iconf[cnt] = BYTE_GET (econf64[cnt]);
a6e9f9df
AM
17513
17514 free (econf64);
252b5132
RH
17515 }
17516
d3a49aa8
AM
17517 printf (ngettext ("\nSection '.conflict' contains %lu entry:\n",
17518 "\nSection '.conflict' contains %lu entries:\n",
17519 (unsigned long) conflictsno),
c7e7ca54 17520 (unsigned long) conflictsno);
252b5132
RH
17521 puts (_(" Num: Index Value Name"));
17522
17523 for (cnt = 0; cnt < conflictsno; ++cnt)
17524 {
b34976b6 17525 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
e0a31db1 17526
978c4450 17527 if (iconf[cnt] >= filedata->num_dynamic_syms)
e0a31db1 17528 printf (_("<corrupt symbol index>"));
d79b3d50 17529 else
e0a31db1
NC
17530 {
17531 Elf_Internal_Sym * psym;
17532
978c4450 17533 psym = & filedata->dynamic_symbols[iconf[cnt]];
e0a31db1
NC
17534 print_vma (psym->st_value, FULL_HEX);
17535 putchar (' ');
978c4450
AM
17536 if (VALID_DYNAMIC_NAME (filedata, psym->st_name))
17537 print_symbol (25, GET_DYNAMIC_NAME (filedata, psym->st_name));
e0a31db1
NC
17538 else
17539 printf (_("<corrupt: %14ld>"), psym->st_name);
17540 }
31104126 17541 putchar ('\n');
252b5132
RH
17542 }
17543
252b5132
RH
17544 free (iconf);
17545 }
17546
ccb4c951
RS
17547 if (pltgot != 0 && local_gotno != 0)
17548 {
91d6fa6a 17549 bfd_vma ent, local_end, global_end;
bbeee7ea 17550 size_t i, offset;
2cf0635d 17551 unsigned char * data;
82b1b41b 17552 unsigned char * data_end;
bbeee7ea 17553 int addr_size;
ccb4c951 17554
91d6fa6a 17555 ent = pltgot;
ccb4c951
RS
17556 addr_size = (is_32bit_elf ? 4 : 8);
17557 local_end = pltgot + local_gotno * addr_size;
ccb4c951 17558
74e1a04b
NC
17559 /* PR binutils/17533 file: 012-111227-0.004 */
17560 if (symtabno < gotsym)
17561 {
17562 error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
82b1b41b 17563 (unsigned long) gotsym, (unsigned long) symtabno);
32ec8896 17564 return FALSE;
74e1a04b 17565 }
82b1b41b 17566
74e1a04b 17567 global_end = local_end + (symtabno - gotsym) * addr_size;
82b1b41b
NC
17568 /* PR 17531: file: 54c91a34. */
17569 if (global_end < local_end)
17570 {
17571 error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
32ec8896 17572 return FALSE;
82b1b41b 17573 }
948f632f 17574
dda8d76d
NC
17575 offset = offset_from_vma (filedata, pltgot, global_end - pltgot);
17576 data = (unsigned char *) get_data (NULL, filedata, offset,
9cf03b7e
NC
17577 global_end - pltgot, 1,
17578 _("Global Offset Table data"));
919383ac 17579 /* PR 12855: Null data is handled gracefully throughout. */
82b1b41b 17580 data_end = data + (global_end - pltgot);
59245841 17581
ccb4c951
RS
17582 printf (_("\nPrimary GOT:\n"));
17583 printf (_(" Canonical gp value: "));
17584 print_vma (pltgot + 0x7ff0, LONG_HEX);
17585 printf ("\n\n");
17586
17587 printf (_(" Reserved entries:\n"));
17588 printf (_(" %*s %10s %*s Purpose\n"),
2b692964
NC
17589 addr_size * 2, _("Address"), _("Access"),
17590 addr_size * 2, _("Initial"));
82b1b41b 17591 ent = print_mips_got_entry (data, pltgot, ent, data_end);
2b692964 17592 printf (_(" Lazy resolver\n"));
82b1b41b
NC
17593 if (ent == (bfd_vma) -1)
17594 goto got_print_fail;
75ec1fdb 17595
c4ab9505
MR
17596 /* Check for the MSB of GOT[1] being set, denoting a GNU object.
17597 This entry will be used by some runtime loaders, to store the
17598 module pointer. Otherwise this is an ordinary local entry.
17599 PR 21344: Check for the entry being fully available before
17600 fetching it. */
17601 if (data
17602 && data + ent - pltgot + addr_size <= data_end
17603 && (byte_get (data + ent - pltgot, addr_size)
17604 >> (addr_size * 8 - 1)) != 0)
17605 {
17606 ent = print_mips_got_entry (data, pltgot, ent, data_end);
17607 printf (_(" Module pointer (GNU extension)\n"));
17608 if (ent == (bfd_vma) -1)
17609 goto got_print_fail;
ccb4c951
RS
17610 }
17611 printf ("\n");
17612
f17e9d8a 17613 if (data != NULL && ent < local_end)
ccb4c951
RS
17614 {
17615 printf (_(" Local entries:\n"));
cc5914eb 17616 printf (" %*s %10s %*s\n",
2b692964
NC
17617 addr_size * 2, _("Address"), _("Access"),
17618 addr_size * 2, _("Initial"));
91d6fa6a 17619 while (ent < local_end)
ccb4c951 17620 {
82b1b41b 17621 ent = print_mips_got_entry (data, pltgot, ent, data_end);
ccb4c951 17622 printf ("\n");
82b1b41b
NC
17623 if (ent == (bfd_vma) -1)
17624 goto got_print_fail;
ccb4c951
RS
17625 }
17626 printf ("\n");
17627 }
17628
f17e9d8a 17629 if (data != NULL && gotsym < symtabno)
ccb4c951
RS
17630 {
17631 int sym_width;
17632
17633 printf (_(" Global entries:\n"));
cc5914eb 17634 printf (" %*s %10s %*s %*s %-7s %3s %s\n",
9cf03b7e
NC
17635 addr_size * 2, _("Address"),
17636 _("Access"),
2b692964 17637 addr_size * 2, _("Initial"),
9cf03b7e
NC
17638 addr_size * 2, _("Sym.Val."),
17639 _("Type"),
17640 /* Note for translators: "Ndx" = abbreviated form of "Index". */
17641 _("Ndx"), _("Name"));
0b4362b0 17642
ccb4c951 17643 sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
e0a31db1 17644
ccb4c951
RS
17645 for (i = gotsym; i < symtabno; i++)
17646 {
82b1b41b 17647 ent = print_mips_got_entry (data, pltgot, ent, data_end);
ccb4c951 17648 printf (" ");
e0a31db1 17649
978c4450 17650 if (filedata->dynamic_symbols == NULL)
e0a31db1 17651 printf (_("<no dynamic symbols>"));
978c4450 17652 else if (i < filedata->num_dynamic_syms)
e0a31db1 17653 {
978c4450 17654 Elf_Internal_Sym * psym = filedata->dynamic_symbols + i;
e0a31db1
NC
17655
17656 print_vma (psym->st_value, LONG_HEX);
17657 printf (" %-7s %3s ",
dda8d76d
NC
17658 get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
17659 get_symbol_index_type (filedata, psym->st_shndx));
e0a31db1 17660
978c4450
AM
17661 if (VALID_DYNAMIC_NAME (filedata, psym->st_name))
17662 print_symbol (sym_width,
17663 GET_DYNAMIC_NAME (filedata, psym->st_name));
e0a31db1
NC
17664 else
17665 printf (_("<corrupt: %14ld>"), psym->st_name);
17666 }
ccb4c951 17667 else
7fc5ac57
JBG
17668 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
17669 (unsigned long) i);
e0a31db1 17670
ccb4c951 17671 printf ("\n");
82b1b41b
NC
17672 if (ent == (bfd_vma) -1)
17673 break;
ccb4c951
RS
17674 }
17675 printf ("\n");
17676 }
17677
82b1b41b 17678 got_print_fail:
9db70fc3 17679 free (data);
ccb4c951
RS
17680 }
17681
861fb55a
DJ
17682 if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
17683 {
91d6fa6a 17684 bfd_vma ent, end;
861fb55a
DJ
17685 size_t offset, rel_offset;
17686 unsigned long count, i;
2cf0635d 17687 unsigned char * data;
861fb55a 17688 int addr_size, sym_width;
2cf0635d 17689 Elf_Internal_Rela * rels;
861fb55a 17690
dda8d76d 17691 rel_offset = offset_from_vma (filedata, jmprel, pltrelsz);
861fb55a
DJ
17692 if (pltrel == DT_RELA)
17693 {
dda8d76d 17694 if (!slurp_rela_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
32ec8896 17695 return FALSE;
861fb55a
DJ
17696 }
17697 else
17698 {
dda8d76d 17699 if (!slurp_rel_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
32ec8896 17700 return FALSE;
861fb55a
DJ
17701 }
17702
91d6fa6a 17703 ent = mips_pltgot;
861fb55a
DJ
17704 addr_size = (is_32bit_elf ? 4 : 8);
17705 end = mips_pltgot + (2 + count) * addr_size;
17706
dda8d76d
NC
17707 offset = offset_from_vma (filedata, mips_pltgot, end - mips_pltgot);
17708 data = (unsigned char *) get_data (NULL, filedata, offset, end - mips_pltgot,
9cf03b7e 17709 1, _("Procedure Linkage Table data"));
59245841 17710 if (data == NULL)
32ec8896 17711 return FALSE;
59245841 17712
9cf03b7e 17713 printf ("\nPLT GOT:\n\n");
861fb55a
DJ
17714 printf (_(" Reserved entries:\n"));
17715 printf (_(" %*s %*s Purpose\n"),
2b692964 17716 addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
91d6fa6a 17717 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
2b692964 17718 printf (_(" PLT lazy resolver\n"));
91d6fa6a 17719 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
2b692964 17720 printf (_(" Module pointer\n"));
861fb55a
DJ
17721 printf ("\n");
17722
17723 printf (_(" Entries:\n"));
cc5914eb 17724 printf (" %*s %*s %*s %-7s %3s %s\n",
2b692964
NC
17725 addr_size * 2, _("Address"),
17726 addr_size * 2, _("Initial"),
17727 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
861fb55a
DJ
17728 sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
17729 for (i = 0; i < count; i++)
17730 {
df97ab2a 17731 unsigned long idx = get_reloc_symindex (rels[i].r_info);
861fb55a 17732
91d6fa6a 17733 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
861fb55a 17734 printf (" ");
e0a31db1 17735
978c4450 17736 if (idx >= filedata->num_dynamic_syms)
df97ab2a 17737 printf (_("<corrupt symbol index: %lu>"), idx);
861fb55a 17738 else
e0a31db1 17739 {
978c4450 17740 Elf_Internal_Sym * psym = filedata->dynamic_symbols + idx;
e0a31db1
NC
17741
17742 print_vma (psym->st_value, LONG_HEX);
17743 printf (" %-7s %3s ",
dda8d76d
NC
17744 get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
17745 get_symbol_index_type (filedata, psym->st_shndx));
978c4450
AM
17746 if (VALID_DYNAMIC_NAME (filedata, psym->st_name))
17747 print_symbol (sym_width,
17748 GET_DYNAMIC_NAME (filedata, psym->st_name));
e0a31db1
NC
17749 else
17750 printf (_("<corrupt: %14ld>"), psym->st_name);
17751 }
861fb55a
DJ
17752 printf ("\n");
17753 }
17754 printf ("\n");
17755
9db70fc3 17756 free (data);
861fb55a
DJ
17757 free (rels);
17758 }
17759
32ec8896 17760 return res;
252b5132
RH
17761}
17762
32ec8896 17763static bfd_boolean
dda8d76d 17764process_nds32_specific (Filedata * filedata)
35c08157
KLC
17765{
17766 Elf_Internal_Shdr *sect = NULL;
17767
dda8d76d 17768 sect = find_section (filedata, ".nds32_e_flags");
9c7b8e9b 17769 if (sect != NULL && sect->sh_size >= 4)
35c08157 17770 {
9c7b8e9b
AM
17771 unsigned char *buf;
17772 unsigned int flag;
35c08157
KLC
17773
17774 printf ("\nNDS32 elf flags section:\n");
9c7b8e9b
AM
17775 buf = get_data (NULL, filedata, sect->sh_offset, 1, 4,
17776 _("NDS32 elf flags section"));
35c08157 17777
9c7b8e9b 17778 if (buf == NULL)
32ec8896
NC
17779 return FALSE;
17780
9c7b8e9b
AM
17781 flag = byte_get (buf, 4);
17782 free (buf);
17783 switch (flag & 0x3)
35c08157
KLC
17784 {
17785 case 0:
17786 printf ("(VEC_SIZE):\tNo entry.\n");
17787 break;
17788 case 1:
17789 printf ("(VEC_SIZE):\t4 bytes\n");
17790 break;
17791 case 2:
17792 printf ("(VEC_SIZE):\t16 bytes\n");
17793 break;
17794 case 3:
17795 printf ("(VEC_SIZE):\treserved\n");
17796 break;
17797 }
17798 }
17799
17800 return TRUE;
17801}
17802
32ec8896 17803static bfd_boolean
dda8d76d 17804process_gnu_liblist (Filedata * filedata)
047b2264 17805{
2cf0635d
NC
17806 Elf_Internal_Shdr * section;
17807 Elf_Internal_Shdr * string_sec;
17808 Elf32_External_Lib * elib;
17809 char * strtab;
c256ffe7 17810 size_t strtab_size;
047b2264 17811 size_t cnt;
d3a49aa8 17812 unsigned long num_liblist;
047b2264 17813 unsigned i;
32ec8896 17814 bfd_boolean res = TRUE;
047b2264
JJ
17815
17816 if (! do_arch)
32ec8896 17817 return TRUE;
047b2264 17818
dda8d76d
NC
17819 for (i = 0, section = filedata->section_headers;
17820 i < filedata->file_header.e_shnum;
b34976b6 17821 i++, section++)
047b2264
JJ
17822 {
17823 switch (section->sh_type)
17824 {
17825 case SHT_GNU_LIBLIST:
dda8d76d 17826 if (section->sh_link >= filedata->file_header.e_shnum)
c256ffe7
JJ
17827 break;
17828
3f5e193b 17829 elib = (Elf32_External_Lib *)
dda8d76d 17830 get_data (NULL, filedata, section->sh_offset, 1, section->sh_size,
9cf03b7e 17831 _("liblist section data"));
047b2264
JJ
17832
17833 if (elib == NULL)
32ec8896
NC
17834 {
17835 res = FALSE;
17836 break;
17837 }
047b2264 17838
dda8d76d
NC
17839 string_sec = filedata->section_headers + section->sh_link;
17840 strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
3f5e193b
NC
17841 string_sec->sh_size,
17842 _("liblist string table"));
047b2264
JJ
17843 if (strtab == NULL
17844 || section->sh_entsize != sizeof (Elf32_External_Lib))
17845 {
17846 free (elib);
2842702f 17847 free (strtab);
32ec8896 17848 res = FALSE;
047b2264
JJ
17849 break;
17850 }
59245841 17851 strtab_size = string_sec->sh_size;
047b2264 17852
d3a49aa8
AM
17853 num_liblist = section->sh_size / sizeof (Elf32_External_Lib);
17854 printf (ngettext ("\nLibrary list section '%s' contains %lu entries:\n",
17855 "\nLibrary list section '%s' contains %lu entries:\n",
17856 num_liblist),
dda8d76d 17857 printable_section_name (filedata, section),
d3a49aa8 17858 num_liblist);
047b2264 17859
2b692964 17860 puts (_(" Library Time Stamp Checksum Version Flags"));
047b2264
JJ
17861
17862 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
17863 ++cnt)
17864 {
17865 Elf32_Lib liblist;
91d6fa6a 17866 time_t atime;
d5b07ef4 17867 char timebuf[128];
2cf0635d 17868 struct tm * tmp;
047b2264
JJ
17869
17870 liblist.l_name = BYTE_GET (elib[cnt].l_name);
91d6fa6a 17871 atime = BYTE_GET (elib[cnt].l_time_stamp);
047b2264
JJ
17872 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
17873 liblist.l_version = BYTE_GET (elib[cnt].l_version);
17874 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
17875
91d6fa6a 17876 tmp = gmtime (&atime);
e9e44622
JJ
17877 snprintf (timebuf, sizeof (timebuf),
17878 "%04u-%02u-%02uT%02u:%02u:%02u",
17879 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
17880 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
047b2264
JJ
17881
17882 printf ("%3lu: ", (unsigned long) cnt);
17883 if (do_wide)
c256ffe7 17884 printf ("%-20s", liblist.l_name < strtab_size
2b692964 17885 ? strtab + liblist.l_name : _("<corrupt>"));
047b2264 17886 else
c256ffe7 17887 printf ("%-20.20s", liblist.l_name < strtab_size
2b692964 17888 ? strtab + liblist.l_name : _("<corrupt>"));
047b2264
JJ
17889 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
17890 liblist.l_version, liblist.l_flags);
17891 }
17892
17893 free (elib);
2842702f 17894 free (strtab);
047b2264
JJ
17895 }
17896 }
17897
32ec8896 17898 return res;
047b2264
JJ
17899}
17900
9437c45b 17901static const char *
dda8d76d 17902get_note_type (Filedata * filedata, unsigned e_type)
779fe533
NC
17903{
17904 static char buff[64];
103f02d3 17905
dda8d76d 17906 if (filedata->file_header.e_type == ET_CORE)
1ec5cd37
NC
17907 switch (e_type)
17908 {
57346661 17909 case NT_AUXV:
1ec5cd37 17910 return _("NT_AUXV (auxiliary vector)");
57346661 17911 case NT_PRSTATUS:
1ec5cd37 17912 return _("NT_PRSTATUS (prstatus structure)");
57346661 17913 case NT_FPREGSET:
1ec5cd37 17914 return _("NT_FPREGSET (floating point registers)");
57346661 17915 case NT_PRPSINFO:
1ec5cd37 17916 return _("NT_PRPSINFO (prpsinfo structure)");
57346661 17917 case NT_TASKSTRUCT:
1ec5cd37 17918 return _("NT_TASKSTRUCT (task structure)");
57346661 17919 case NT_PRXFPREG:
1ec5cd37 17920 return _("NT_PRXFPREG (user_xfpregs structure)");
e1e95dec
AM
17921 case NT_PPC_VMX:
17922 return _("NT_PPC_VMX (ppc Altivec registers)");
89eeb0bc
LM
17923 case NT_PPC_VSX:
17924 return _("NT_PPC_VSX (ppc VSX registers)");
66c3b5f8
GR
17925 case NT_PPC_TAR:
17926 return _("NT_PPC_TAR (ppc TAR register)");
17927 case NT_PPC_PPR:
17928 return _("NT_PPC_PPR (ppc PPR register)");
17929 case NT_PPC_DSCR:
17930 return _("NT_PPC_DSCR (ppc DSCR register)");
17931 case NT_PPC_EBB:
17932 return _("NT_PPC_EBB (ppc EBB registers)");
17933 case NT_PPC_PMU:
17934 return _("NT_PPC_PMU (ppc PMU registers)");
17935 case NT_PPC_TM_CGPR:
17936 return _("NT_PPC_TM_CGPR (ppc checkpointed GPR registers)");
17937 case NT_PPC_TM_CFPR:
17938 return _("NT_PPC_TM_CFPR (ppc checkpointed floating point registers)");
17939 case NT_PPC_TM_CVMX:
17940 return _("NT_PPC_TM_CVMX (ppc checkpointed Altivec registers)");
17941 case NT_PPC_TM_CVSX:
3fd21718 17942 return _("NT_PPC_TM_CVSX (ppc checkpointed VSX registers)");
66c3b5f8
GR
17943 case NT_PPC_TM_SPR:
17944 return _("NT_PPC_TM_SPR (ppc TM special purpose registers)");
17945 case NT_PPC_TM_CTAR:
17946 return _("NT_PPC_TM_CTAR (ppc checkpointed TAR register)");
17947 case NT_PPC_TM_CPPR:
17948 return _("NT_PPC_TM_CPPR (ppc checkpointed PPR register)");
17949 case NT_PPC_TM_CDSCR:
17950 return _("NT_PPC_TM_CDSCR (ppc checkpointed DSCR register)");
ff826ef3
TT
17951 case NT_386_TLS:
17952 return _("NT_386_TLS (x86 TLS information)");
17953 case NT_386_IOPERM:
17954 return _("NT_386_IOPERM (x86 I/O permissions)");
4339cae0
L
17955 case NT_X86_XSTATE:
17956 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
8d58ed37
L
17957 case NT_X86_CET:
17958 return _("NT_X86_CET (x86 CET state)");
0675e188
UW
17959 case NT_S390_HIGH_GPRS:
17960 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
d7eeb400
MS
17961 case NT_S390_TIMER:
17962 return _("NT_S390_TIMER (s390 timer register)");
17963 case NT_S390_TODCMP:
17964 return _("NT_S390_TODCMP (s390 TOD comparator register)");
17965 case NT_S390_TODPREG:
17966 return _("NT_S390_TODPREG (s390 TOD programmable register)");
17967 case NT_S390_CTRS:
17968 return _("NT_S390_CTRS (s390 control registers)");
17969 case NT_S390_PREFIX:
17970 return _("NT_S390_PREFIX (s390 prefix register)");
a367d729
AK
17971 case NT_S390_LAST_BREAK:
17972 return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
17973 case NT_S390_SYSTEM_CALL:
17974 return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
abb3f6cc
NC
17975 case NT_S390_TDB:
17976 return _("NT_S390_TDB (s390 transaction diagnostic block)");
4ef9f41a
AA
17977 case NT_S390_VXRS_LOW:
17978 return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
17979 case NT_S390_VXRS_HIGH:
17980 return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
88ab90e8
AA
17981 case NT_S390_GS_CB:
17982 return _("NT_S390_GS_CB (s390 guarded-storage registers)");
17983 case NT_S390_GS_BC:
17984 return _("NT_S390_GS_BC (s390 guarded-storage broadcast control)");
faa9a424
UW
17985 case NT_ARM_VFP:
17986 return _("NT_ARM_VFP (arm VFP registers)");
652451f8
YZ
17987 case NT_ARM_TLS:
17988 return _("NT_ARM_TLS (AArch TLS registers)");
17989 case NT_ARM_HW_BREAK:
17990 return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
17991 case NT_ARM_HW_WATCH:
17992 return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
27456742
AK
17993 case NT_ARC_V2:
17994 return _("NT_ARC_V2 (ARC HS accumulator/extra registers)");
57346661 17995 case NT_PSTATUS:
1ec5cd37 17996 return _("NT_PSTATUS (pstatus structure)");
57346661 17997 case NT_FPREGS:
1ec5cd37 17998 return _("NT_FPREGS (floating point registers)");
57346661 17999 case NT_PSINFO:
1ec5cd37 18000 return _("NT_PSINFO (psinfo structure)");
57346661 18001 case NT_LWPSTATUS:
1ec5cd37 18002 return _("NT_LWPSTATUS (lwpstatus_t structure)");
57346661 18003 case NT_LWPSINFO:
1ec5cd37 18004 return _("NT_LWPSINFO (lwpsinfo_t structure)");
57346661 18005 case NT_WIN32PSTATUS:
1ec5cd37 18006 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
9ece1fa9
TT
18007 case NT_SIGINFO:
18008 return _("NT_SIGINFO (siginfo_t data)");
18009 case NT_FILE:
18010 return _("NT_FILE (mapped files)");
1ec5cd37
NC
18011 default:
18012 break;
18013 }
18014 else
18015 switch (e_type)
18016 {
18017 case NT_VERSION:
18018 return _("NT_VERSION (version)");
18019 case NT_ARCH:
18020 return _("NT_ARCH (architecture)");
9ef920e9 18021 case NT_GNU_BUILD_ATTRIBUTE_OPEN:
6f156d7a 18022 return _("OPEN");
9ef920e9 18023 case NT_GNU_BUILD_ATTRIBUTE_FUNC:
6f156d7a 18024 return _("func");
1ec5cd37
NC
18025 default:
18026 break;
18027 }
18028
e9e44622 18029 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
1ec5cd37 18030 return buff;
779fe533
NC
18031}
18032
32ec8896 18033static bfd_boolean
9ece1fa9
TT
18034print_core_note (Elf_Internal_Note *pnote)
18035{
18036 unsigned int addr_size = is_32bit_elf ? 4 : 8;
18037 bfd_vma count, page_size;
18038 unsigned char *descdata, *filenames, *descend;
18039
18040 if (pnote->type != NT_FILE)
04ac15ab
AS
18041 {
18042 if (do_wide)
18043 printf ("\n");
18044 return TRUE;
18045 }
9ece1fa9
TT
18046
18047#ifndef BFD64
18048 if (!is_32bit_elf)
18049 {
18050 printf (_(" Cannot decode 64-bit note in 32-bit build\n"));
18051 /* Still "successful". */
32ec8896 18052 return TRUE;
9ece1fa9
TT
18053 }
18054#endif
18055
18056 if (pnote->descsz < 2 * addr_size)
18057 {
32ec8896
NC
18058 error (_(" Malformed note - too short for header\n"));
18059 return FALSE;
9ece1fa9
TT
18060 }
18061
18062 descdata = (unsigned char *) pnote->descdata;
18063 descend = descdata + pnote->descsz;
18064
18065 if (descdata[pnote->descsz - 1] != '\0')
18066 {
32ec8896
NC
18067 error (_(" Malformed note - does not end with \\0\n"));
18068 return FALSE;
9ece1fa9
TT
18069 }
18070
18071 count = byte_get (descdata, addr_size);
18072 descdata += addr_size;
18073
18074 page_size = byte_get (descdata, addr_size);
18075 descdata += addr_size;
18076
5396a86e
AM
18077 if (count > ((bfd_vma) -1 - 2 * addr_size) / (3 * addr_size)
18078 || pnote->descsz < 2 * addr_size + count * 3 * addr_size)
9ece1fa9 18079 {
32ec8896
NC
18080 error (_(" Malformed note - too short for supplied file count\n"));
18081 return FALSE;
9ece1fa9
TT
18082 }
18083
18084 printf (_(" Page size: "));
18085 print_vma (page_size, DEC);
18086 printf ("\n");
18087
18088 printf (_(" %*s%*s%*s\n"),
18089 (int) (2 + 2 * addr_size), _("Start"),
18090 (int) (4 + 2 * addr_size), _("End"),
18091 (int) (4 + 2 * addr_size), _("Page Offset"));
18092 filenames = descdata + count * 3 * addr_size;
595712bb 18093 while (count-- > 0)
9ece1fa9
TT
18094 {
18095 bfd_vma start, end, file_ofs;
18096
18097 if (filenames == descend)
18098 {
32ec8896
NC
18099 error (_(" Malformed note - filenames end too early\n"));
18100 return FALSE;
9ece1fa9
TT
18101 }
18102
18103 start = byte_get (descdata, addr_size);
18104 descdata += addr_size;
18105 end = byte_get (descdata, addr_size);
18106 descdata += addr_size;
18107 file_ofs = byte_get (descdata, addr_size);
18108 descdata += addr_size;
18109
18110 printf (" ");
18111 print_vma (start, FULL_HEX);
18112 printf (" ");
18113 print_vma (end, FULL_HEX);
18114 printf (" ");
18115 print_vma (file_ofs, FULL_HEX);
18116 printf ("\n %s\n", filenames);
18117
18118 filenames += 1 + strlen ((char *) filenames);
18119 }
18120
32ec8896 18121 return TRUE;
9ece1fa9
TT
18122}
18123
1118d252
RM
18124static const char *
18125get_gnu_elf_note_type (unsigned e_type)
18126{
1449284b 18127 /* NB/ Keep this switch statement in sync with print_gnu_note (). */
1118d252
RM
18128 switch (e_type)
18129 {
18130 case NT_GNU_ABI_TAG:
18131 return _("NT_GNU_ABI_TAG (ABI version tag)");
18132 case NT_GNU_HWCAP:
18133 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
18134 case NT_GNU_BUILD_ID:
18135 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
0297aed6
DM
18136 case NT_GNU_GOLD_VERSION:
18137 return _("NT_GNU_GOLD_VERSION (gold version)");
9ef920e9
NC
18138 case NT_GNU_PROPERTY_TYPE_0:
18139 return _("NT_GNU_PROPERTY_TYPE_0");
18140 case NT_GNU_BUILD_ATTRIBUTE_OPEN:
18141 return _("NT_GNU_BUILD_ATTRIBUTE_OPEN");
18142 case NT_GNU_BUILD_ATTRIBUTE_FUNC:
18143 return _("NT_GNU_BUILD_ATTRIBUTE_FUNC");
1118d252 18144 default:
1449284b
NC
18145 {
18146 static char buff[64];
1118d252 18147
1449284b
NC
18148 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
18149 return buff;
18150 }
18151 }
1118d252
RM
18152}
18153
a9eafb08
L
18154static void
18155decode_x86_compat_isa (unsigned int bitmask)
18156{
18157 while (bitmask)
18158 {
18159 unsigned int bit = bitmask & (- bitmask);
18160
18161 bitmask &= ~ bit;
18162 switch (bit)
18163 {
18164 case GNU_PROPERTY_X86_COMPAT_ISA_1_486:
18165 printf ("i486");
18166 break;
18167 case GNU_PROPERTY_X86_COMPAT_ISA_1_586:
18168 printf ("586");
18169 break;
18170 case GNU_PROPERTY_X86_COMPAT_ISA_1_686:
18171 printf ("686");
18172 break;
18173 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE:
18174 printf ("SSE");
18175 break;
18176 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE2:
18177 printf ("SSE2");
18178 break;
18179 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE3:
18180 printf ("SSE3");
18181 break;
18182 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSSE3:
18183 printf ("SSSE3");
18184 break;
18185 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_1:
18186 printf ("SSE4_1");
18187 break;
18188 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_2:
18189 printf ("SSE4_2");
18190 break;
18191 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX:
18192 printf ("AVX");
18193 break;
18194 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX2:
18195 printf ("AVX2");
18196 break;
18197 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512F:
18198 printf ("AVX512F");
18199 break;
18200 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512CD:
18201 printf ("AVX512CD");
18202 break;
18203 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512ER:
18204 printf ("AVX512ER");
18205 break;
18206 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512PF:
18207 printf ("AVX512PF");
18208 break;
18209 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512VL:
18210 printf ("AVX512VL");
18211 break;
18212 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512DQ:
18213 printf ("AVX512DQ");
18214 break;
18215 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512BW:
18216 printf ("AVX512BW");
18217 break;
65b3d26e
L
18218 default:
18219 printf (_("<unknown: %x>"), bit);
18220 break;
a9eafb08
L
18221 }
18222 if (bitmask)
18223 printf (", ");
18224 }
18225}
18226
9ef920e9 18227static void
32930e4e 18228decode_x86_compat_2_isa (unsigned int bitmask)
9ef920e9 18229{
0a59decb 18230 if (!bitmask)
90c745dc
L
18231 {
18232 printf (_("<None>"));
18233 return;
18234 }
90c745dc 18235
9ef920e9
NC
18236 while (bitmask)
18237 {
1fc87489 18238 unsigned int bit = bitmask & (- bitmask);
9ef920e9
NC
18239
18240 bitmask &= ~ bit;
18241 switch (bit)
18242 {
32930e4e 18243 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_CMOV:
a9eafb08
L
18244 printf ("CMOV");
18245 break;
32930e4e 18246 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_SSE:
a9eafb08
L
18247 printf ("SSE");
18248 break;
32930e4e 18249 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_SSE2:
a9eafb08
L
18250 printf ("SSE2");
18251 break;
32930e4e 18252 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_SSE3:
a9eafb08
L
18253 printf ("SSE3");
18254 break;
32930e4e 18255 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_SSSE3:
a9eafb08
L
18256 printf ("SSSE3");
18257 break;
32930e4e 18258 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_SSE4_1:
a9eafb08
L
18259 printf ("SSE4_1");
18260 break;
32930e4e 18261 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_SSE4_2:
a9eafb08
L
18262 printf ("SSE4_2");
18263 break;
32930e4e 18264 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX:
a9eafb08
L
18265 printf ("AVX");
18266 break;
32930e4e 18267 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX2:
a9eafb08
L
18268 printf ("AVX2");
18269 break;
32930e4e 18270 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_FMA:
a9eafb08
L
18271 printf ("FMA");
18272 break;
32930e4e 18273 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512F:
a9eafb08
L
18274 printf ("AVX512F");
18275 break;
32930e4e 18276 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512CD:
a9eafb08
L
18277 printf ("AVX512CD");
18278 break;
32930e4e 18279 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512ER:
a9eafb08
L
18280 printf ("AVX512ER");
18281 break;
32930e4e 18282 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512PF:
a9eafb08
L
18283 printf ("AVX512PF");
18284 break;
32930e4e 18285 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512VL:
a9eafb08
L
18286 printf ("AVX512VL");
18287 break;
32930e4e 18288 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512DQ:
a9eafb08
L
18289 printf ("AVX512DQ");
18290 break;
32930e4e 18291 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512BW:
a9eafb08
L
18292 printf ("AVX512BW");
18293 break;
32930e4e 18294 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512_4FMAPS:
a9eafb08
L
18295 printf ("AVX512_4FMAPS");
18296 break;
32930e4e 18297 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512_4VNNIW:
a9eafb08
L
18298 printf ("AVX512_4VNNIW");
18299 break;
32930e4e 18300 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512_BITALG:
a9eafb08
L
18301 printf ("AVX512_BITALG");
18302 break;
32930e4e 18303 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512_IFMA:
a9eafb08
L
18304 printf ("AVX512_IFMA");
18305 break;
32930e4e 18306 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512_VBMI:
a9eafb08
L
18307 printf ("AVX512_VBMI");
18308 break;
32930e4e 18309 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512_VBMI2:
a9eafb08
L
18310 printf ("AVX512_VBMI2");
18311 break;
32930e4e 18312 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512_VNNI:
a9eafb08
L
18313 printf ("AVX512_VNNI");
18314 break;
32930e4e 18315 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512_BF16:
462cac58
L
18316 printf ("AVX512_BF16");
18317 break;
65b3d26e
L
18318 default:
18319 printf (_("<unknown: %x>"), bit);
18320 break;
9ef920e9
NC
18321 }
18322 if (bitmask)
18323 printf (", ");
18324 }
18325}
18326
32930e4e
L
18327static void
18328decode_x86_isa (unsigned int bitmask)
18329{
18330 if (!bitmask)
18331 {
18332 printf (_("x86-64-baseline"));
18333 return;
18334 }
18335
18336 while (bitmask)
18337 {
18338 unsigned int bit = bitmask & (- bitmask);
18339
18340 bitmask &= ~ bit;
18341 switch (bit)
18342 {
18343 case GNU_PROPERTY_X86_ISA_1_V2:
18344 printf ("x86-64-v2");
18345 break;
18346 case GNU_PROPERTY_X86_ISA_1_V3:
18347 printf ("x86-64-v3");
18348 break;
18349 case GNU_PROPERTY_X86_ISA_1_V4:
18350 printf ("x86-64-v4");
18351 break;
18352 default:
18353 printf (_("<unknown: %x>"), bit);
18354 break;
18355 }
18356 if (bitmask)
18357 printf (", ");
18358 }
18359}
18360
ee2fdd6f 18361static void
a9eafb08 18362decode_x86_feature_1 (unsigned int bitmask)
ee2fdd6f 18363{
0a59decb 18364 if (!bitmask)
90c745dc
L
18365 {
18366 printf (_("<None>"));
18367 return;
18368 }
90c745dc 18369
ee2fdd6f
L
18370 while (bitmask)
18371 {
18372 unsigned int bit = bitmask & (- bitmask);
18373
18374 bitmask &= ~ bit;
18375 switch (bit)
18376 {
18377 case GNU_PROPERTY_X86_FEATURE_1_IBT:
a9eafb08 18378 printf ("IBT");
ee2fdd6f 18379 break;
48580982 18380 case GNU_PROPERTY_X86_FEATURE_1_SHSTK:
a9eafb08 18381 printf ("SHSTK");
48580982 18382 break;
ee2fdd6f
L
18383 default:
18384 printf (_("<unknown: %x>"), bit);
18385 break;
18386 }
18387 if (bitmask)
18388 printf (", ");
18389 }
18390}
18391
a9eafb08
L
18392static void
18393decode_x86_feature_2 (unsigned int bitmask)
18394{
0a59decb 18395 if (!bitmask)
90c745dc
L
18396 {
18397 printf (_("<None>"));
18398 return;
18399 }
90c745dc 18400
a9eafb08
L
18401 while (bitmask)
18402 {
18403 unsigned int bit = bitmask & (- bitmask);
18404
18405 bitmask &= ~ bit;
18406 switch (bit)
18407 {
18408 case GNU_PROPERTY_X86_FEATURE_2_X86:
18409 printf ("x86");
18410 break;
18411 case GNU_PROPERTY_X86_FEATURE_2_X87:
18412 printf ("x87");
18413 break;
18414 case GNU_PROPERTY_X86_FEATURE_2_MMX:
18415 printf ("MMX");
18416 break;
18417 case GNU_PROPERTY_X86_FEATURE_2_XMM:
18418 printf ("XMM");
18419 break;
18420 case GNU_PROPERTY_X86_FEATURE_2_YMM:
18421 printf ("YMM");
18422 break;
18423 case GNU_PROPERTY_X86_FEATURE_2_ZMM:
18424 printf ("ZMM");
18425 break;
a308b89d
L
18426 case GNU_PROPERTY_X86_FEATURE_2_TMM:
18427 printf ("TMM");
18428 break;
32930e4e
L
18429 case GNU_PROPERTY_X86_FEATURE_2_MASK:
18430 printf ("MASK");
18431 break;
a9eafb08
L
18432 case GNU_PROPERTY_X86_FEATURE_2_FXSR:
18433 printf ("FXSR");
18434 break;
18435 case GNU_PROPERTY_X86_FEATURE_2_XSAVE:
18436 printf ("XSAVE");
18437 break;
18438 case GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT:
18439 printf ("XSAVEOPT");
18440 break;
18441 case GNU_PROPERTY_X86_FEATURE_2_XSAVEC:
18442 printf ("XSAVEC");
18443 break;
65b3d26e
L
18444 default:
18445 printf (_("<unknown: %x>"), bit);
18446 break;
a9eafb08
L
18447 }
18448 if (bitmask)
18449 printf (", ");
18450 }
18451}
18452
cd702818
SD
18453static void
18454decode_aarch64_feature_1_and (unsigned int bitmask)
18455{
18456 while (bitmask)
18457 {
18458 unsigned int bit = bitmask & (- bitmask);
18459
18460 bitmask &= ~ bit;
18461 switch (bit)
18462 {
18463 case GNU_PROPERTY_AARCH64_FEATURE_1_BTI:
18464 printf ("BTI");
18465 break;
18466
18467 case GNU_PROPERTY_AARCH64_FEATURE_1_PAC:
18468 printf ("PAC");
18469 break;
18470
18471 default:
18472 printf (_("<unknown: %x>"), bit);
18473 break;
18474 }
18475 if (bitmask)
18476 printf (", ");
18477 }
18478}
18479
9ef920e9 18480static void
dda8d76d 18481print_gnu_property_note (Filedata * filedata, Elf_Internal_Note * pnote)
9ef920e9
NC
18482{
18483 unsigned char * ptr = (unsigned char *) pnote->descdata;
18484 unsigned char * ptr_end = ptr + pnote->descsz;
18485 unsigned int size = is_32bit_elf ? 4 : 8;
18486
18487 printf (_(" Properties: "));
18488
1fc87489 18489 if (pnote->descsz < 8 || (pnote->descsz % size) != 0)
9ef920e9
NC
18490 {
18491 printf (_("<corrupt GNU_PROPERTY_TYPE, size = %#lx>\n"), pnote->descsz);
18492 return;
18493 }
18494
6ab2c4ed 18495 while (ptr < ptr_end)
9ef920e9 18496 {
1fc87489 18497 unsigned int j;
6ab2c4ed
MC
18498 unsigned int type;
18499 unsigned int datasz;
18500
18501 if ((size_t) (ptr_end - ptr) < 8)
18502 {
18503 printf (_("<corrupt descsz: %#lx>\n"), pnote->descsz);
18504 break;
18505 }
18506
18507 type = byte_get (ptr, 4);
18508 datasz = byte_get (ptr + 4, 4);
9ef920e9 18509
1fc87489 18510 ptr += 8;
9ef920e9 18511
6ab2c4ed 18512 if (datasz > (size_t) (ptr_end - ptr))
9ef920e9 18513 {
1fc87489
L
18514 printf (_("<corrupt type (%#x) datasz: %#x>\n"),
18515 type, datasz);
9ef920e9 18516 break;
1fc87489 18517 }
9ef920e9 18518
1fc87489
L
18519 if (type >= GNU_PROPERTY_LOPROC && type <= GNU_PROPERTY_HIPROC)
18520 {
dda8d76d
NC
18521 if (filedata->file_header.e_machine == EM_X86_64
18522 || filedata->file_header.e_machine == EM_IAMCU
18523 || filedata->file_header.e_machine == EM_386)
1fc87489 18524 {
aa7bca9b
L
18525 unsigned int bitmask;
18526
18527 if (datasz == 4)
0a59decb 18528 bitmask = byte_get (ptr, 4);
aa7bca9b
L
18529 else
18530 bitmask = 0;
18531
1fc87489
L
18532 switch (type)
18533 {
18534 case GNU_PROPERTY_X86_ISA_1_USED:
1fc87489 18535 if (datasz != 4)
aa7bca9b
L
18536 printf (_("x86 ISA used: <corrupt length: %#x> "),
18537 datasz);
1fc87489 18538 else
aa7bca9b
L
18539 {
18540 printf ("x86 ISA used: ");
18541 decode_x86_isa (bitmask);
18542 }
1fc87489 18543 goto next;
9ef920e9 18544
1fc87489 18545 case GNU_PROPERTY_X86_ISA_1_NEEDED:
1fc87489 18546 if (datasz != 4)
aa7bca9b
L
18547 printf (_("x86 ISA needed: <corrupt length: %#x> "),
18548 datasz);
1fc87489 18549 else
aa7bca9b
L
18550 {
18551 printf ("x86 ISA needed: ");
18552 decode_x86_isa (bitmask);
18553 }
1fc87489 18554 goto next;
9ef920e9 18555
ee2fdd6f 18556 case GNU_PROPERTY_X86_FEATURE_1_AND:
ee2fdd6f 18557 if (datasz != 4)
aa7bca9b
L
18558 printf (_("x86 feature: <corrupt length: %#x> "),
18559 datasz);
ee2fdd6f 18560 else
aa7bca9b
L
18561 {
18562 printf ("x86 feature: ");
a9eafb08
L
18563 decode_x86_feature_1 (bitmask);
18564 }
18565 goto next;
18566
18567 case GNU_PROPERTY_X86_FEATURE_2_USED:
18568 if (datasz != 4)
18569 printf (_("x86 feature used: <corrupt length: %#x> "),
18570 datasz);
18571 else
18572 {
18573 printf ("x86 feature used: ");
18574 decode_x86_feature_2 (bitmask);
18575 }
18576 goto next;
18577
18578 case GNU_PROPERTY_X86_FEATURE_2_NEEDED:
18579 if (datasz != 4)
18580 printf (_("x86 feature needed: <corrupt length: %#x> "), datasz);
18581 else
18582 {
18583 printf ("x86 feature needed: ");
18584 decode_x86_feature_2 (bitmask);
18585 }
18586 goto next;
18587
18588 case GNU_PROPERTY_X86_COMPAT_ISA_1_USED:
18589 if (datasz != 4)
18590 printf (_("x86 ISA used: <corrupt length: %#x> "),
18591 datasz);
18592 else
18593 {
18594 printf ("x86 ISA used: ");
18595 decode_x86_compat_isa (bitmask);
18596 }
18597 goto next;
18598
18599 case GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED:
18600 if (datasz != 4)
18601 printf (_("x86 ISA needed: <corrupt length: %#x> "),
18602 datasz);
18603 else
18604 {
18605 printf ("x86 ISA needed: ");
18606 decode_x86_compat_isa (bitmask);
aa7bca9b 18607 }
ee2fdd6f
L
18608 goto next;
18609
32930e4e
L
18610 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_USED:
18611 if (datasz != 4)
18612 printf (_("x86 ISA used: <corrupt length: %#x> "),
18613 datasz);
18614 else
18615 {
18616 printf ("x86 ISA used: ");
18617 decode_x86_compat_2_isa (bitmask);
18618 }
18619 goto next;
18620
18621 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_NEEDED:
18622 if (datasz != 4)
18623 printf (_("x86 ISA needed: <corrupt length: %#x> "),
18624 datasz);
18625 else
18626 {
18627 printf ("x86 ISA needed: ");
18628 decode_x86_compat_2_isa (bitmask);
18629 }
18630 goto next;
18631
1fc87489
L
18632 default:
18633 break;
18634 }
18635 }
cd702818
SD
18636 else if (filedata->file_header.e_machine == EM_AARCH64)
18637 {
18638 if (type == GNU_PROPERTY_AARCH64_FEATURE_1_AND)
18639 {
18640 printf ("AArch64 feature: ");
18641 if (datasz != 4)
18642 printf (_("<corrupt length: %#x> "), datasz);
18643 else
18644 decode_aarch64_feature_1_and (byte_get (ptr, 4));
18645 goto next;
18646 }
18647 }
1fc87489
L
18648 }
18649 else
18650 {
18651 switch (type)
9ef920e9 18652 {
1fc87489
L
18653 case GNU_PROPERTY_STACK_SIZE:
18654 printf (_("stack size: "));
18655 if (datasz != size)
18656 printf (_("<corrupt length: %#x> "), datasz);
18657 else
18658 printf ("%#lx", (unsigned long) byte_get (ptr, size));
18659 goto next;
18660
18661 case GNU_PROPERTY_NO_COPY_ON_PROTECTED:
18662 printf ("no copy on protected ");
18663 if (datasz)
18664 printf (_("<corrupt length: %#x> "), datasz);
18665 goto next;
18666
18667 default:
9ef920e9
NC
18668 break;
18669 }
9ef920e9
NC
18670 }
18671
1fc87489
L
18672 if (type < GNU_PROPERTY_LOPROC)
18673 printf (_("<unknown type %#x data: "), type);
18674 else if (type < GNU_PROPERTY_LOUSER)
18675 printf (_("<procesor-specific type %#x data: "), type);
18676 else
18677 printf (_("<application-specific type %#x data: "), type);
18678 for (j = 0; j < datasz; ++j)
18679 printf ("%02x ", ptr[j] & 0xff);
18680 printf (">");
18681
dc1e8a47 18682 next:
9ef920e9 18683 ptr += ((datasz + (size - 1)) & ~ (size - 1));
1fc87489
L
18684 if (ptr == ptr_end)
18685 break;
1fc87489 18686
6ab2c4ed
MC
18687 if (do_wide)
18688 printf (", ");
18689 else
18690 printf ("\n\t");
9ef920e9
NC
18691 }
18692
18693 printf ("\n");
18694}
18695
32ec8896 18696static bfd_boolean
dda8d76d 18697print_gnu_note (Filedata * filedata, Elf_Internal_Note *pnote)
664f90a3 18698{
1449284b 18699 /* NB/ Keep this switch statement in sync with get_gnu_elf_note_type (). */
664f90a3
TT
18700 switch (pnote->type)
18701 {
18702 case NT_GNU_BUILD_ID:
18703 {
18704 unsigned long i;
18705
18706 printf (_(" Build ID: "));
18707 for (i = 0; i < pnote->descsz; ++i)
18708 printf ("%02x", pnote->descdata[i] & 0xff);
9cf03b7e 18709 printf ("\n");
664f90a3
TT
18710 }
18711 break;
18712
18713 case NT_GNU_ABI_TAG:
18714 {
18715 unsigned long os, major, minor, subminor;
18716 const char *osname;
18717
3102e897
NC
18718 /* PR 17531: file: 030-599401-0.004. */
18719 if (pnote->descsz < 16)
18720 {
18721 printf (_(" <corrupt GNU_ABI_TAG>\n"));
18722 break;
18723 }
18724
664f90a3
TT
18725 os = byte_get ((unsigned char *) pnote->descdata, 4);
18726 major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
18727 minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
18728 subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
18729
18730 switch (os)
18731 {
18732 case GNU_ABI_TAG_LINUX:
18733 osname = "Linux";
18734 break;
18735 case GNU_ABI_TAG_HURD:
18736 osname = "Hurd";
18737 break;
18738 case GNU_ABI_TAG_SOLARIS:
18739 osname = "Solaris";
18740 break;
18741 case GNU_ABI_TAG_FREEBSD:
18742 osname = "FreeBSD";
18743 break;
18744 case GNU_ABI_TAG_NETBSD:
18745 osname = "NetBSD";
18746 break;
14ae95f2
RM
18747 case GNU_ABI_TAG_SYLLABLE:
18748 osname = "Syllable";
18749 break;
18750 case GNU_ABI_TAG_NACL:
18751 osname = "NaCl";
18752 break;
664f90a3
TT
18753 default:
18754 osname = "Unknown";
18755 break;
18756 }
18757
18758 printf (_(" OS: %s, ABI: %ld.%ld.%ld\n"), osname,
18759 major, minor, subminor);
18760 }
18761 break;
926c5385
CC
18762
18763 case NT_GNU_GOLD_VERSION:
18764 {
18765 unsigned long i;
18766
18767 printf (_(" Version: "));
18768 for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
18769 printf ("%c", pnote->descdata[i]);
18770 printf ("\n");
18771 }
18772 break;
1449284b
NC
18773
18774 case NT_GNU_HWCAP:
18775 {
18776 unsigned long num_entries, mask;
18777
18778 /* Hardware capabilities information. Word 0 is the number of entries.
18779 Word 1 is a bitmask of enabled entries. The rest of the descriptor
18780 is a series of entries, where each entry is a single byte followed
18781 by a nul terminated string. The byte gives the bit number to test
18782 if enabled in the bitmask. */
18783 printf (_(" Hardware Capabilities: "));
18784 if (pnote->descsz < 8)
18785 {
32ec8896
NC
18786 error (_("<corrupt GNU_HWCAP>\n"));
18787 return FALSE;
1449284b
NC
18788 }
18789 num_entries = byte_get ((unsigned char *) pnote->descdata, 4);
18790 mask = byte_get ((unsigned char *) pnote->descdata + 4, 4);
18791 printf (_("num entries: %ld, enabled mask: %lx\n"), num_entries, mask);
18792 /* FIXME: Add code to display the entries... */
18793 }
18794 break;
18795
9ef920e9 18796 case NT_GNU_PROPERTY_TYPE_0:
dda8d76d 18797 print_gnu_property_note (filedata, pnote);
9ef920e9 18798 break;
9abca702 18799
1449284b
NC
18800 default:
18801 /* Handle unrecognised types. An error message should have already been
18802 created by get_gnu_elf_note_type(), so all that we need to do is to
18803 display the data. */
18804 {
18805 unsigned long i;
18806
18807 printf (_(" Description data: "));
18808 for (i = 0; i < pnote->descsz; ++i)
18809 printf ("%02x ", pnote->descdata[i] & 0xff);
18810 printf ("\n");
18811 }
18812 break;
664f90a3
TT
18813 }
18814
32ec8896 18815 return TRUE;
664f90a3
TT
18816}
18817
685080f2
NC
18818static const char *
18819get_v850_elf_note_type (enum v850_notes n_type)
18820{
18821 static char buff[64];
18822
18823 switch (n_type)
18824 {
18825 case V850_NOTE_ALIGNMENT: return _("Alignment of 8-byte objects");
18826 case V850_NOTE_DATA_SIZE: return _("Sizeof double and long double");
18827 case V850_NOTE_FPU_INFO: return _("Type of FPU support needed");
18828 case V850_NOTE_SIMD_INFO: return _("Use of SIMD instructions");
18829 case V850_NOTE_CACHE_INFO: return _("Use of cache");
18830 case V850_NOTE_MMU_INFO: return _("Use of MMU");
18831 default:
18832 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
18833 return buff;
18834 }
18835}
18836
32ec8896 18837static bfd_boolean
685080f2
NC
18838print_v850_note (Elf_Internal_Note * pnote)
18839{
18840 unsigned int val;
18841
18842 if (pnote->descsz != 4)
32ec8896
NC
18843 return FALSE;
18844
685080f2
NC
18845 val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
18846
18847 if (val == 0)
18848 {
18849 printf (_("not set\n"));
32ec8896 18850 return TRUE;
685080f2
NC
18851 }
18852
18853 switch (pnote->type)
18854 {
18855 case V850_NOTE_ALIGNMENT:
18856 switch (val)
18857 {
32ec8896
NC
18858 case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return TRUE;
18859 case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return TRUE;
685080f2
NC
18860 }
18861 break;
14ae95f2 18862
685080f2
NC
18863 case V850_NOTE_DATA_SIZE:
18864 switch (val)
18865 {
32ec8896
NC
18866 case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return TRUE;
18867 case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return TRUE;
685080f2
NC
18868 }
18869 break;
14ae95f2 18870
685080f2
NC
18871 case V850_NOTE_FPU_INFO:
18872 switch (val)
18873 {
32ec8896
NC
18874 case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return TRUE;
18875 case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return TRUE;
685080f2
NC
18876 }
18877 break;
14ae95f2 18878
685080f2
NC
18879 case V850_NOTE_MMU_INFO:
18880 case V850_NOTE_CACHE_INFO:
18881 case V850_NOTE_SIMD_INFO:
18882 if (val == EF_RH850_SIMD)
18883 {
18884 printf (_("yes\n"));
32ec8896 18885 return TRUE;
685080f2
NC
18886 }
18887 break;
18888
18889 default:
18890 /* An 'unknown note type' message will already have been displayed. */
18891 break;
18892 }
18893
18894 printf (_("unknown value: %x\n"), val);
32ec8896 18895 return FALSE;
685080f2
NC
18896}
18897
32ec8896 18898static bfd_boolean
c6056a74
SF
18899process_netbsd_elf_note (Elf_Internal_Note * pnote)
18900{
18901 unsigned int version;
18902
18903 switch (pnote->type)
18904 {
18905 case NT_NETBSD_IDENT:
b966f55f
AM
18906 if (pnote->descsz < 1)
18907 break;
c6056a74
SF
18908 version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
18909 if ((version / 10000) % 100)
b966f55f 18910 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
c6056a74
SF
18911 version, version / 100000000, (version / 1000000) % 100,
18912 (version / 10000) % 100 > 26 ? "Z" : "",
15f205b1 18913 'A' + (version / 10000) % 26);
c6056a74
SF
18914 else
18915 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
b966f55f 18916 version, version / 100000000, (version / 1000000) % 100,
15f205b1 18917 (version / 100) % 100);
32ec8896 18918 return TRUE;
c6056a74
SF
18919
18920 case NT_NETBSD_MARCH:
9abca702 18921 printf (" NetBSD\t\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
c6056a74 18922 pnote->descdata);
32ec8896 18923 return TRUE;
c6056a74 18924
9abca702
CZ
18925#ifdef NT_NETBSD_PAX
18926 case NT_NETBSD_PAX:
b966f55f
AM
18927 if (pnote->descsz < 1)
18928 break;
9abca702
CZ
18929 version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
18930 printf (" NetBSD\t\t0x%08lx\tPaX <%s%s%s%s%s%s>\n", pnote->descsz,
18931 ((version & NT_NETBSD_PAX_MPROTECT) ? "+mprotect" : ""),
18932 ((version & NT_NETBSD_PAX_NOMPROTECT) ? "-mprotect" : ""),
18933 ((version & NT_NETBSD_PAX_GUARD) ? "+guard" : ""),
18934 ((version & NT_NETBSD_PAX_NOGUARD) ? "-guard" : ""),
18935 ((version & NT_NETBSD_PAX_ASLR) ? "+ASLR" : ""),
18936 ((version & NT_NETBSD_PAX_NOASLR) ? "-ASLR" : ""));
18937 return TRUE;
18938#endif
c6056a74 18939 }
b966f55f
AM
18940
18941 printf (" NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n",
18942 pnote->descsz, pnote->type);
18943 return FALSE;
c6056a74
SF
18944}
18945
f4ddf30f 18946static const char *
dda8d76d 18947get_freebsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
f4ddf30f 18948{
f4ddf30f
JB
18949 switch (e_type)
18950 {
18951 case NT_FREEBSD_THRMISC:
18952 return _("NT_THRMISC (thrmisc structure)");
18953 case NT_FREEBSD_PROCSTAT_PROC:
18954 return _("NT_PROCSTAT_PROC (proc data)");
18955 case NT_FREEBSD_PROCSTAT_FILES:
18956 return _("NT_PROCSTAT_FILES (files data)");
18957 case NT_FREEBSD_PROCSTAT_VMMAP:
18958 return _("NT_PROCSTAT_VMMAP (vmmap data)");
18959 case NT_FREEBSD_PROCSTAT_GROUPS:
18960 return _("NT_PROCSTAT_GROUPS (groups data)");
18961 case NT_FREEBSD_PROCSTAT_UMASK:
18962 return _("NT_PROCSTAT_UMASK (umask data)");
18963 case NT_FREEBSD_PROCSTAT_RLIMIT:
18964 return _("NT_PROCSTAT_RLIMIT (rlimit data)");
18965 case NT_FREEBSD_PROCSTAT_OSREL:
18966 return _("NT_PROCSTAT_OSREL (osreldate data)");
18967 case NT_FREEBSD_PROCSTAT_PSSTRINGS:
18968 return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
18969 case NT_FREEBSD_PROCSTAT_AUXV:
18970 return _("NT_PROCSTAT_AUXV (auxv data)");
0b9305ed
JB
18971 case NT_FREEBSD_PTLWPINFO:
18972 return _("NT_PTLWPINFO (ptrace_lwpinfo structure)");
f4ddf30f 18973 }
dda8d76d 18974 return get_note_type (filedata, e_type);
f4ddf30f
JB
18975}
18976
9437c45b 18977static const char *
dda8d76d 18978get_netbsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
9437c45b
JT
18979{
18980 static char buff[64];
18981
540e6170
CZ
18982 switch (e_type)
18983 {
18984 case NT_NETBSDCORE_PROCINFO:
18985 /* NetBSD core "procinfo" structure. */
18986 return _("NetBSD procinfo structure");
9437c45b 18987
540e6170
CZ
18988#ifdef NT_NETBSDCORE_AUXV
18989 case NT_NETBSDCORE_AUXV:
18990 return _("NetBSD ELF auxiliary vector data");
18991#endif
9437c45b 18992
06d949ec
KR
18993#ifdef NT_NETBSDCORE_LWPSTATUS
18994 case NT_NETBSDCORE_LWPSTATUS:
18995 return _("PT_LWPSTATUS (ptrace_lwpstatus structure)");
18996#endif
18997
540e6170 18998 default:
06d949ec 18999 /* As of Jan 2020 there are no other machine-independent notes
540e6170
CZ
19000 defined for NetBSD core files. If the note type is less
19001 than the start of the machine-dependent note types, we don't
19002 understand it. */
19003
19004 if (e_type < NT_NETBSDCORE_FIRSTMACH)
19005 {
19006 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
19007 return buff;
19008 }
19009 break;
9437c45b
JT
19010 }
19011
dda8d76d 19012 switch (filedata->file_header.e_machine)
9437c45b
JT
19013 {
19014 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
19015 and PT_GETFPREGS == mach+2. */
19016
19017 case EM_OLD_ALPHA:
19018 case EM_ALPHA:
19019 case EM_SPARC:
19020 case EM_SPARC32PLUS:
19021 case EM_SPARCV9:
19022 switch (e_type)
19023 {
2b692964 19024 case NT_NETBSDCORE_FIRSTMACH + 0:
b4db1224 19025 return _("PT_GETREGS (reg structure)");
2b692964 19026 case NT_NETBSDCORE_FIRSTMACH + 2:
b4db1224 19027 return _("PT_GETFPREGS (fpreg structure)");
9437c45b
JT
19028 default:
19029 break;
19030 }
19031 break;
19032
c0d38b0e
CZ
19033 /* On SuperH, PT_GETREGS == mach+3 and PT_GETFPREGS == mach+5.
19034 There's also old PT___GETREGS40 == mach + 1 for old reg
19035 structure which lacks GBR. */
19036 case EM_SH:
19037 switch (e_type)
19038 {
19039 case NT_NETBSDCORE_FIRSTMACH + 1:
19040 return _("PT___GETREGS40 (old reg structure)");
19041 case NT_NETBSDCORE_FIRSTMACH + 3:
19042 return _("PT_GETREGS (reg structure)");
19043 case NT_NETBSDCORE_FIRSTMACH + 5:
19044 return _("PT_GETFPREGS (fpreg structure)");
19045 default:
19046 break;
19047 }
19048 break;
19049
9437c45b
JT
19050 /* On all other arch's, PT_GETREGS == mach+1 and
19051 PT_GETFPREGS == mach+3. */
19052 default:
19053 switch (e_type)
19054 {
2b692964 19055 case NT_NETBSDCORE_FIRSTMACH + 1:
b4db1224 19056 return _("PT_GETREGS (reg structure)");
2b692964 19057 case NT_NETBSDCORE_FIRSTMACH + 3:
b4db1224 19058 return _("PT_GETFPREGS (fpreg structure)");
9437c45b
JT
19059 default:
19060 break;
19061 }
19062 }
19063
9cf03b7e 19064 snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
e9e44622 19065 e_type - NT_NETBSDCORE_FIRSTMACH);
9437c45b
JT
19066 return buff;
19067}
19068
70616151
TT
19069static const char *
19070get_stapsdt_note_type (unsigned e_type)
19071{
19072 static char buff[64];
19073
19074 switch (e_type)
19075 {
19076 case NT_STAPSDT:
19077 return _("NT_STAPSDT (SystemTap probe descriptors)");
19078
19079 default:
19080 break;
19081 }
19082
19083 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
19084 return buff;
19085}
19086
32ec8896 19087static bfd_boolean
c6a9fc58
TT
19088print_stapsdt_note (Elf_Internal_Note *pnote)
19089{
3ca60c57
NC
19090 size_t len, maxlen;
19091 unsigned long addr_size = is_32bit_elf ? 4 : 8;
c6a9fc58
TT
19092 char *data = pnote->descdata;
19093 char *data_end = pnote->descdata + pnote->descsz;
19094 bfd_vma pc, base_addr, semaphore;
19095 char *provider, *probe, *arg_fmt;
19096
3ca60c57
NC
19097 if (pnote->descsz < (addr_size * 3))
19098 goto stapdt_note_too_small;
19099
c6a9fc58
TT
19100 pc = byte_get ((unsigned char *) data, addr_size);
19101 data += addr_size;
3ca60c57 19102
c6a9fc58
TT
19103 base_addr = byte_get ((unsigned char *) data, addr_size);
19104 data += addr_size;
3ca60c57 19105
c6a9fc58
TT
19106 semaphore = byte_get ((unsigned char *) data, addr_size);
19107 data += addr_size;
19108
3ca60c57
NC
19109 if (data >= data_end)
19110 goto stapdt_note_too_small;
19111 maxlen = data_end - data;
19112 len = strnlen (data, maxlen);
19113 if (len < maxlen)
19114 {
19115 provider = data;
19116 data += len + 1;
19117 }
19118 else
19119 goto stapdt_note_too_small;
19120
19121 if (data >= data_end)
19122 goto stapdt_note_too_small;
19123 maxlen = data_end - data;
19124 len = strnlen (data, maxlen);
19125 if (len < maxlen)
19126 {
19127 probe = data;
19128 data += len + 1;
19129 }
19130 else
19131 goto stapdt_note_too_small;
9abca702 19132
3ca60c57
NC
19133 if (data >= data_end)
19134 goto stapdt_note_too_small;
19135 maxlen = data_end - data;
19136 len = strnlen (data, maxlen);
19137 if (len < maxlen)
19138 {
19139 arg_fmt = data;
19140 data += len + 1;
19141 }
19142 else
19143 goto stapdt_note_too_small;
c6a9fc58
TT
19144
19145 printf (_(" Provider: %s\n"), provider);
19146 printf (_(" Name: %s\n"), probe);
19147 printf (_(" Location: "));
19148 print_vma (pc, FULL_HEX);
19149 printf (_(", Base: "));
19150 print_vma (base_addr, FULL_HEX);
19151 printf (_(", Semaphore: "));
19152 print_vma (semaphore, FULL_HEX);
9cf03b7e 19153 printf ("\n");
c6a9fc58
TT
19154 printf (_(" Arguments: %s\n"), arg_fmt);
19155
19156 return data == data_end;
3ca60c57
NC
19157
19158 stapdt_note_too_small:
19159 printf (_(" <corrupt - note is too small>\n"));
19160 error (_("corrupt stapdt note - the data size is too small\n"));
19161 return FALSE;
c6a9fc58
TT
19162}
19163
00e98fc7
TG
19164static const char *
19165get_ia64_vms_note_type (unsigned e_type)
19166{
19167 static char buff[64];
19168
19169 switch (e_type)
19170 {
19171 case NT_VMS_MHD:
19172 return _("NT_VMS_MHD (module header)");
19173 case NT_VMS_LNM:
19174 return _("NT_VMS_LNM (language name)");
19175 case NT_VMS_SRC:
19176 return _("NT_VMS_SRC (source files)");
19177 case NT_VMS_TITLE:
9cf03b7e 19178 return "NT_VMS_TITLE";
00e98fc7
TG
19179 case NT_VMS_EIDC:
19180 return _("NT_VMS_EIDC (consistency check)");
19181 case NT_VMS_FPMODE:
19182 return _("NT_VMS_FPMODE (FP mode)");
19183 case NT_VMS_LINKTIME:
9cf03b7e 19184 return "NT_VMS_LINKTIME";
00e98fc7
TG
19185 case NT_VMS_IMGNAM:
19186 return _("NT_VMS_IMGNAM (image name)");
19187 case NT_VMS_IMGID:
19188 return _("NT_VMS_IMGID (image id)");
19189 case NT_VMS_LINKID:
19190 return _("NT_VMS_LINKID (link id)");
19191 case NT_VMS_IMGBID:
19192 return _("NT_VMS_IMGBID (build id)");
19193 case NT_VMS_GSTNAM:
19194 return _("NT_VMS_GSTNAM (sym table name)");
19195 case NT_VMS_ORIG_DYN:
9cf03b7e 19196 return "NT_VMS_ORIG_DYN";
00e98fc7 19197 case NT_VMS_PATCHTIME:
9cf03b7e 19198 return "NT_VMS_PATCHTIME";
00e98fc7
TG
19199 default:
19200 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
19201 return buff;
19202 }
19203}
19204
32ec8896 19205static bfd_boolean
00e98fc7
TG
19206print_ia64_vms_note (Elf_Internal_Note * pnote)
19207{
8d18bf79
NC
19208 int maxlen = pnote->descsz;
19209
19210 if (maxlen < 2 || (unsigned long) maxlen != pnote->descsz)
19211 goto desc_size_fail;
19212
00e98fc7
TG
19213 switch (pnote->type)
19214 {
19215 case NT_VMS_MHD:
8d18bf79
NC
19216 if (maxlen <= 36)
19217 goto desc_size_fail;
19218
19219 int l = (int) strnlen (pnote->descdata + 34, maxlen - 34);
19220
19221 printf (_(" Creation date : %.17s\n"), pnote->descdata);
19222 printf (_(" Last patch date: %.17s\n"), pnote->descdata + 17);
19223 if (l + 34 < maxlen)
19224 {
19225 printf (_(" Module name : %s\n"), pnote->descdata + 34);
19226 if (l + 35 < maxlen)
19227 printf (_(" Module version : %s\n"), pnote->descdata + 34 + l + 1);
19228 else
19229 printf (_(" Module version : <missing>\n"));
19230 }
00e98fc7 19231 else
8d18bf79
NC
19232 {
19233 printf (_(" Module name : <missing>\n"));
19234 printf (_(" Module version : <missing>\n"));
19235 }
00e98fc7 19236 break;
8d18bf79 19237
00e98fc7 19238 case NT_VMS_LNM:
8d18bf79 19239 printf (_(" Language: %.*s\n"), maxlen, pnote->descdata);
00e98fc7 19240 break;
8d18bf79 19241
00e98fc7
TG
19242#ifdef BFD64
19243 case NT_VMS_FPMODE:
9cf03b7e 19244 printf (_(" Floating Point mode: "));
8d18bf79
NC
19245 if (maxlen < 8)
19246 goto desc_size_fail;
19247 /* FIXME: Generate an error if descsz > 8 ? */
19248
4a5cb34f 19249 printf ("0x%016" BFD_VMA_FMT "x\n",
8d18bf79 19250 (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
00e98fc7 19251 break;
8d18bf79 19252
00e98fc7
TG
19253 case NT_VMS_LINKTIME:
19254 printf (_(" Link time: "));
8d18bf79
NC
19255 if (maxlen < 8)
19256 goto desc_size_fail;
19257 /* FIXME: Generate an error if descsz > 8 ? */
19258
00e98fc7 19259 print_vms_time
8d18bf79 19260 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
00e98fc7
TG
19261 printf ("\n");
19262 break;
8d18bf79 19263
00e98fc7
TG
19264 case NT_VMS_PATCHTIME:
19265 printf (_(" Patch time: "));
8d18bf79
NC
19266 if (maxlen < 8)
19267 goto desc_size_fail;
19268 /* FIXME: Generate an error if descsz > 8 ? */
19269
00e98fc7 19270 print_vms_time
8d18bf79 19271 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
00e98fc7
TG
19272 printf ("\n");
19273 break;
8d18bf79 19274
00e98fc7 19275 case NT_VMS_ORIG_DYN:
8d18bf79
NC
19276 if (maxlen < 34)
19277 goto desc_size_fail;
19278
00e98fc7
TG
19279 printf (_(" Major id: %u, minor id: %u\n"),
19280 (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
19281 (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
9cf03b7e 19282 printf (_(" Last modified : "));
00e98fc7
TG
19283 print_vms_time
19284 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
9cf03b7e 19285 printf (_("\n Link flags : "));
4a5cb34f 19286 printf ("0x%016" BFD_VMA_FMT "x\n",
948f632f 19287 (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
00e98fc7 19288 printf (_(" Header flags: 0x%08x\n"),
948f632f 19289 (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
8d18bf79 19290 printf (_(" Image id : %.*s\n"), maxlen - 32, pnote->descdata + 32);
00e98fc7
TG
19291 break;
19292#endif
8d18bf79 19293
00e98fc7 19294 case NT_VMS_IMGNAM:
8d18bf79 19295 printf (_(" Image name: %.*s\n"), maxlen, pnote->descdata);
00e98fc7 19296 break;
8d18bf79 19297
00e98fc7 19298 case NT_VMS_GSTNAM:
8d18bf79 19299 printf (_(" Global symbol table name: %.*s\n"), maxlen, pnote->descdata);
00e98fc7 19300 break;
8d18bf79 19301
00e98fc7 19302 case NT_VMS_IMGID:
8d18bf79 19303 printf (_(" Image id: %.*s\n"), maxlen, pnote->descdata);
00e98fc7 19304 break;
8d18bf79 19305
00e98fc7 19306 case NT_VMS_LINKID:
8d18bf79 19307 printf (_(" Linker id: %.*s\n"), maxlen, pnote->descdata);
00e98fc7 19308 break;
8d18bf79 19309
00e98fc7 19310 default:
32ec8896 19311 return FALSE;
00e98fc7 19312 }
8d18bf79 19313
32ec8896 19314 return TRUE;
8d18bf79
NC
19315
19316 desc_size_fail:
19317 printf (_(" <corrupt - data size is too small>\n"));
19318 error (_("corrupt IA64 note: data size is too small\n"));
19319 return FALSE;
00e98fc7
TG
19320}
19321
fd486f32
AM
19322struct build_attr_cache {
19323 Filedata *filedata;
19324 char *strtab;
19325 unsigned long strtablen;
19326 Elf_Internal_Sym *symtab;
19327 unsigned long nsyms;
19328} ba_cache;
19329
6f156d7a
NC
19330/* Find the symbol associated with a build attribute that is attached
19331 to address OFFSET. If PNAME is non-NULL then store the name of
19332 the symbol (if found) in the provided pointer, Returns NULL if a
19333 symbol could not be found. */
c799a79d 19334
6f156d7a
NC
19335static Elf_Internal_Sym *
19336get_symbol_for_build_attribute (Filedata * filedata,
19337 unsigned long offset,
19338 bfd_boolean is_open_attr,
19339 const char ** pname)
9ef920e9 19340{
fd486f32
AM
19341 Elf_Internal_Sym *saved_sym = NULL;
19342 Elf_Internal_Sym *sym;
9ef920e9 19343
dda8d76d 19344 if (filedata->section_headers != NULL
fd486f32 19345 && (ba_cache.filedata == NULL || filedata != ba_cache.filedata))
9ef920e9 19346 {
c799a79d 19347 Elf_Internal_Shdr * symsec;
9ef920e9 19348
fd486f32
AM
19349 free (ba_cache.strtab);
19350 ba_cache.strtab = NULL;
19351 free (ba_cache.symtab);
19352 ba_cache.symtab = NULL;
19353
c799a79d 19354 /* Load the symbol and string sections. */
dda8d76d
NC
19355 for (symsec = filedata->section_headers;
19356 symsec < filedata->section_headers + filedata->file_header.e_shnum;
c799a79d 19357 symsec ++)
9ef920e9 19358 {
28d13567
AM
19359 if (symsec->sh_type == SHT_SYMTAB
19360 && get_symtab (filedata, symsec,
19361 &ba_cache.symtab, &ba_cache.nsyms,
19362 &ba_cache.strtab, &ba_cache.strtablen))
19363 break;
9ef920e9 19364 }
fd486f32 19365 ba_cache.filedata = filedata;
9ef920e9
NC
19366 }
19367
fd486f32 19368 if (ba_cache.symtab == NULL)
6f156d7a 19369 return NULL;
9ef920e9 19370
c799a79d 19371 /* Find a symbol whose value matches offset. */
fd486f32 19372 for (sym = ba_cache.symtab; sym < ba_cache.symtab + ba_cache.nsyms; sym ++)
c799a79d
NC
19373 if (sym->st_value == offset)
19374 {
fd486f32 19375 if (sym->st_name >= ba_cache.strtablen)
c799a79d
NC
19376 /* Huh ? This should not happen. */
19377 continue;
9ef920e9 19378
fd486f32 19379 if (ba_cache.strtab[sym->st_name] == 0)
c799a79d 19380 continue;
9ef920e9 19381
8fd75781
NC
19382 /* The AArch64 and ARM architectures define mapping symbols
19383 (eg $d, $x, $t) which we want to ignore. */
fd486f32
AM
19384 if (ba_cache.strtab[sym->st_name] == '$'
19385 && ba_cache.strtab[sym->st_name + 1] != 0
19386 && ba_cache.strtab[sym->st_name + 2] == 0)
8fd75781
NC
19387 continue;
19388
c799a79d
NC
19389 if (is_open_attr)
19390 {
19391 /* For OPEN attributes we prefer GLOBAL over LOCAL symbols
19392 and FILE or OBJECT symbols over NOTYPE symbols. We skip
19393 FUNC symbols entirely. */
19394 switch (ELF_ST_TYPE (sym->st_info))
19395 {
c799a79d 19396 case STT_OBJECT:
6f156d7a 19397 case STT_FILE:
c799a79d 19398 saved_sym = sym;
6f156d7a
NC
19399 if (sym->st_size)
19400 {
19401 /* If the symbol has a size associated
19402 with it then we can stop searching. */
fd486f32 19403 sym = ba_cache.symtab + ba_cache.nsyms;
6f156d7a 19404 }
c799a79d 19405 continue;
9ef920e9 19406
c799a79d
NC
19407 case STT_FUNC:
19408 /* Ignore function symbols. */
19409 continue;
19410
19411 default:
19412 break;
19413 }
19414
19415 switch (ELF_ST_BIND (sym->st_info))
9ef920e9 19416 {
c799a79d
NC
19417 case STB_GLOBAL:
19418 if (saved_sym == NULL
19419 || ELF_ST_TYPE (saved_sym->st_info) != STT_OBJECT)
19420 saved_sym = sym;
19421 break;
c871dade 19422
c799a79d
NC
19423 case STB_LOCAL:
19424 if (saved_sym == NULL)
19425 saved_sym = sym;
19426 break;
19427
19428 default:
9ef920e9
NC
19429 break;
19430 }
19431 }
c799a79d
NC
19432 else
19433 {
19434 if (ELF_ST_TYPE (sym->st_info) != STT_FUNC)
19435 continue;
19436
19437 saved_sym = sym;
19438 break;
19439 }
19440 }
19441
6f156d7a 19442 if (saved_sym && pname)
fd486f32 19443 * pname = ba_cache.strtab + saved_sym->st_name;
6f156d7a
NC
19444
19445 return saved_sym;
c799a79d
NC
19446}
19447
d20e98ab
NC
19448/* Returns true iff addr1 and addr2 are in the same section. */
19449
19450static bfd_boolean
19451same_section (Filedata * filedata, unsigned long addr1, unsigned long addr2)
19452{
19453 Elf_Internal_Shdr * a1;
19454 Elf_Internal_Shdr * a2;
19455
19456 a1 = find_section_by_address (filedata, addr1);
19457 a2 = find_section_by_address (filedata, addr2);
9abca702 19458
d20e98ab
NC
19459 return a1 == a2 && a1 != NULL;
19460}
19461
c799a79d 19462static bfd_boolean
dda8d76d
NC
19463print_gnu_build_attribute_description (Elf_Internal_Note * pnote,
19464 Filedata * filedata)
c799a79d 19465{
6f156d7a
NC
19466 static unsigned long global_offset = 0;
19467 static unsigned long global_end = 0;
19468 static unsigned long func_offset = 0;
19469 static unsigned long func_end = 0;
c871dade 19470
6f156d7a
NC
19471 Elf_Internal_Sym * sym;
19472 const char * name;
19473 unsigned long start;
19474 unsigned long end;
19475 bfd_boolean is_open_attr = pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN;
19476
19477 switch (pnote->descsz)
c799a79d 19478 {
6f156d7a
NC
19479 case 0:
19480 /* A zero-length description means that the range of
19481 the previous note of the same type should be used. */
c799a79d 19482 if (is_open_attr)
c871dade 19483 {
6f156d7a
NC
19484 if (global_end > global_offset)
19485 printf (_(" Applies to region from %#lx to %#lx\n"),
19486 global_offset, global_end);
19487 else
19488 printf (_(" Applies to region from %#lx\n"), global_offset);
c799a79d
NC
19489 }
19490 else
19491 {
6f156d7a
NC
19492 if (func_end > func_offset)
19493 printf (_(" Applies to region from %#lx to %#lx\n"), func_offset, func_end);
19494 else
19495 printf (_(" Applies to region from %#lx\n"), func_offset);
c871dade 19496 }
6f156d7a 19497 return TRUE;
9ef920e9 19498
6f156d7a
NC
19499 case 4:
19500 start = byte_get ((unsigned char *) pnote->descdata, 4);
19501 end = 0;
19502 break;
19503
19504 case 8:
19505 if (is_32bit_elf)
19506 {
19507 /* FIXME: We should check that version 3+ notes are being used here... */
19508 start = byte_get ((unsigned char *) pnote->descdata, 4);
19509 end = byte_get ((unsigned char *) pnote->descdata + 4, 4);
19510 }
19511 else
19512 {
19513 start = byte_get ((unsigned char *) pnote->descdata, 8);
19514 end = 0;
19515 }
19516 break;
19517
19518 case 16:
19519 start = byte_get ((unsigned char *) pnote->descdata, 8);
19520 end = byte_get ((unsigned char *) pnote->descdata + 8, 8);
19521 break;
9abca702 19522
6f156d7a 19523 default:
c799a79d
NC
19524 error (_(" <invalid description size: %lx>\n"), pnote->descsz);
19525 printf (_(" <invalid descsz>"));
19526 return FALSE;
19527 }
19528
6f156d7a
NC
19529 name = NULL;
19530 sym = get_symbol_for_build_attribute (filedata, start, is_open_attr, & name);
8fd75781
NC
19531 /* As of version 5 of the annobin plugin, filename symbols are biased by 2
19532 in order to avoid them being confused with the start address of the
19533 first function in the file... */
19534 if (sym == NULL && is_open_attr)
19535 sym = get_symbol_for_build_attribute (filedata, start + 2, is_open_attr,
19536 & name);
6f156d7a
NC
19537
19538 if (end == 0 && sym != NULL && sym->st_size > 0)
19539 end = start + sym->st_size;
c799a79d
NC
19540
19541 if (is_open_attr)
19542 {
d20e98ab
NC
19543 /* FIXME: Need to properly allow for section alignment.
19544 16 is just the alignment used on x86_64. */
19545 if (global_end > 0
19546 && start > BFD_ALIGN (global_end, 16)
19547 /* Build notes are not guaranteed to be organised in order of
19548 increasing address, but we should find the all of the notes
19549 for one section in the same place. */
19550 && same_section (filedata, start, global_end))
6f156d7a
NC
19551 warn (_("Gap in build notes detected from %#lx to %#lx\n"),
19552 global_end + 1, start - 1);
19553
19554 printf (_(" Applies to region from %#lx"), start);
19555 global_offset = start;
19556
19557 if (end)
19558 {
19559 printf (_(" to %#lx"), end);
19560 global_end = end;
19561 }
c799a79d
NC
19562 }
19563 else
19564 {
6f156d7a
NC
19565 printf (_(" Applies to region from %#lx"), start);
19566 func_offset = start;
19567
19568 if (end)
19569 {
19570 printf (_(" to %#lx"), end);
19571 func_end = end;
19572 }
c799a79d
NC
19573 }
19574
6f156d7a
NC
19575 if (sym && name)
19576 printf (_(" (%s)"), name);
19577
19578 printf ("\n");
19579 return TRUE;
9ef920e9
NC
19580}
19581
19582static bfd_boolean
19583print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
19584{
1d15e434
NC
19585 static const char string_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_STRING, 0 };
19586 static const char number_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC, 0 };
19587 static const char bool_expected [3] = { GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE, GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE, 0 };
9ef920e9
NC
19588 char name_type;
19589 char name_attribute;
1d15e434 19590 const char * expected_types;
9ef920e9
NC
19591 const char * name = pnote->namedata;
19592 const char * text;
88305e1b 19593 signed int left;
9ef920e9
NC
19594
19595 if (name == NULL || pnote->namesz < 2)
19596 {
19597 error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
7296a62a 19598 print_symbol (-20, _(" <corrupt name>"));
9ef920e9
NC
19599 return FALSE;
19600 }
19601
6f156d7a
NC
19602 if (do_wide)
19603 left = 28;
19604 else
19605 left = 20;
88305e1b
NC
19606
19607 /* Version 2 of the spec adds a "GA" prefix to the name field. */
19608 if (name[0] == 'G' && name[1] == 'A')
19609 {
6f156d7a
NC
19610 if (pnote->namesz < 4)
19611 {
19612 error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
19613 print_symbol (-20, _(" <corrupt name>"));
19614 return FALSE;
19615 }
19616
88305e1b
NC
19617 printf ("GA");
19618 name += 2;
19619 left -= 2;
19620 }
19621
9ef920e9
NC
19622 switch ((name_type = * name))
19623 {
19624 case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
19625 case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
19626 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
19627 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
19628 printf ("%c", * name);
88305e1b 19629 left --;
9ef920e9
NC
19630 break;
19631 default:
19632 error (_("unrecognised attribute type in name field: %d\n"), name_type);
19633 print_symbol (-20, _("<unknown name type>"));
19634 return FALSE;
19635 }
19636
9ef920e9
NC
19637 ++ name;
19638 text = NULL;
19639
19640 switch ((name_attribute = * name))
19641 {
19642 case GNU_BUILD_ATTRIBUTE_VERSION:
19643 text = _("<version>");
1d15e434 19644 expected_types = string_expected;
9ef920e9
NC
19645 ++ name;
19646 break;
19647 case GNU_BUILD_ATTRIBUTE_STACK_PROT:
19648 text = _("<stack prot>");
75d7d298 19649 expected_types = "!+*";
9ef920e9
NC
19650 ++ name;
19651 break;
19652 case GNU_BUILD_ATTRIBUTE_RELRO:
19653 text = _("<relro>");
1d15e434 19654 expected_types = bool_expected;
9ef920e9
NC
19655 ++ name;
19656 break;
19657 case GNU_BUILD_ATTRIBUTE_STACK_SIZE:
19658 text = _("<stack size>");
1d15e434 19659 expected_types = number_expected;
9ef920e9
NC
19660 ++ name;
19661 break;
19662 case GNU_BUILD_ATTRIBUTE_TOOL:
19663 text = _("<tool>");
1d15e434 19664 expected_types = string_expected;
9ef920e9
NC
19665 ++ name;
19666 break;
19667 case GNU_BUILD_ATTRIBUTE_ABI:
19668 text = _("<ABI>");
19669 expected_types = "$*";
19670 ++ name;
19671 break;
19672 case GNU_BUILD_ATTRIBUTE_PIC:
19673 text = _("<PIC>");
1d15e434 19674 expected_types = number_expected;
9ef920e9
NC
19675 ++ name;
19676 break;
a8be5506
NC
19677 case GNU_BUILD_ATTRIBUTE_SHORT_ENUM:
19678 text = _("<short enum>");
1d15e434 19679 expected_types = bool_expected;
a8be5506
NC
19680 ++ name;
19681 break;
9ef920e9
NC
19682 default:
19683 if (ISPRINT (* name))
19684 {
19685 int len = strnlen (name, pnote->namesz - (name - pnote->namedata)) + 1;
19686
19687 if (len > left && ! do_wide)
19688 len = left;
75d7d298 19689 printf ("%.*s:", len, name);
9ef920e9 19690 left -= len;
0dd6ae21 19691 name += len;
9ef920e9
NC
19692 }
19693 else
19694 {
3e6b6445 19695 static char tmpbuf [128];
88305e1b 19696
3e6b6445
NC
19697 error (_("unrecognised byte in name field: %d\n"), * name);
19698 sprintf (tmpbuf, _("<unknown:_%d>"), * name);
19699 text = tmpbuf;
19700 name ++;
9ef920e9
NC
19701 }
19702 expected_types = "*$!+";
19703 break;
19704 }
19705
19706 if (text)
88305e1b 19707 left -= printf ("%s", text);
9ef920e9
NC
19708
19709 if (strchr (expected_types, name_type) == NULL)
75d7d298 19710 warn (_("attribute does not have an expected type (%c)\n"), name_type);
9ef920e9
NC
19711
19712 if ((unsigned long)(name - pnote->namedata) > pnote->namesz)
19713 {
19714 error (_("corrupt name field: namesz: %lu but parsing gets to %ld\n"),
19715 (unsigned long) pnote->namesz,
19716 (long) (name - pnote->namedata));
19717 return FALSE;
19718 }
19719
19720 if (left < 1 && ! do_wide)
19721 return TRUE;
19722
19723 switch (name_type)
19724 {
19725 case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
19726 {
b06b2c92 19727 unsigned int bytes;
ddef72cd
NC
19728 unsigned long long val = 0;
19729 unsigned int shift = 0;
19730 char * decoded = NULL;
19731
b06b2c92
NC
19732 bytes = pnote->namesz - (name - pnote->namedata);
19733 if (bytes > 0)
19734 /* The -1 is because the name field is always 0 terminated, and we
19735 want to be able to ensure that the shift in the while loop below
19736 will not overflow. */
19737 -- bytes;
19738
ddef72cd
NC
19739 if (bytes > sizeof (val))
19740 {
3e6b6445
NC
19741 error (_("corrupt numeric name field: too many bytes in the value: %x\n"),
19742 bytes);
19743 bytes = sizeof (val);
ddef72cd 19744 }
3e6b6445
NC
19745 /* We do not bother to warn if bytes == 0 as this can
19746 happen with some early versions of the gcc plugin. */
9ef920e9
NC
19747
19748 while (bytes --)
19749 {
54b8331d 19750 unsigned long long byte = *name++ & 0xff;
79a964dc
NC
19751
19752 val |= byte << shift;
9ef920e9
NC
19753 shift += 8;
19754 }
19755
75d7d298 19756 switch (name_attribute)
9ef920e9 19757 {
75d7d298 19758 case GNU_BUILD_ATTRIBUTE_PIC:
9ef920e9
NC
19759 switch (val)
19760 {
75d7d298
NC
19761 case 0: decoded = "static"; break;
19762 case 1: decoded = "pic"; break;
19763 case 2: decoded = "PIC"; break;
19764 case 3: decoded = "pie"; break;
19765 case 4: decoded = "PIE"; break;
19766 default: break;
9ef920e9 19767 }
75d7d298
NC
19768 break;
19769 case GNU_BUILD_ATTRIBUTE_STACK_PROT:
19770 switch (val)
9ef920e9 19771 {
75d7d298
NC
19772 /* Based upon the SPCT_FLAG_xxx enum values in gcc/cfgexpand.c. */
19773 case 0: decoded = "off"; break;
19774 case 1: decoded = "on"; break;
19775 case 2: decoded = "all"; break;
19776 case 3: decoded = "strong"; break;
19777 case 4: decoded = "explicit"; break;
19778 default: break;
9ef920e9 19779 }
75d7d298
NC
19780 break;
19781 default:
19782 break;
9ef920e9
NC
19783 }
19784
75d7d298 19785 if (decoded != NULL)
3e6b6445
NC
19786 {
19787 print_symbol (-left, decoded);
19788 left = 0;
19789 }
19790 else if (val == 0)
19791 {
19792 printf ("0x0");
19793 left -= 3;
19794 }
9ef920e9 19795 else
75d7d298
NC
19796 {
19797 if (do_wide)
ddef72cd 19798 left -= printf ("0x%llx", val);
75d7d298 19799 else
ddef72cd 19800 left -= printf ("0x%-.*llx", left, val);
75d7d298 19801 }
9ef920e9
NC
19802 }
19803 break;
19804 case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
19805 left -= print_symbol (- left, name);
19806 break;
19807 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
19808 left -= print_symbol (- left, "true");
19809 break;
19810 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
19811 left -= print_symbol (- left, "false");
19812 break;
19813 }
19814
19815 if (do_wide && left > 0)
19816 printf ("%-*s", left, " ");
9abca702 19817
9ef920e9
NC
19818 return TRUE;
19819}
19820
6d118b09
NC
19821/* Note that by the ELF standard, the name field is already null byte
19822 terminated, and namesz includes the terminating null byte.
19823 I.E. the value of namesz for the name "FSF" is 4.
19824
e3c8793a 19825 If the value of namesz is zero, there is no name present. */
9ef920e9 19826
32ec8896 19827static bfd_boolean
9ef920e9 19828process_note (Elf_Internal_Note * pnote,
dda8d76d 19829 Filedata * filedata)
779fe533 19830{
2cf0635d
NC
19831 const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
19832 const char * nt;
9437c45b
JT
19833
19834 if (pnote->namesz == 0)
1ec5cd37
NC
19835 /* If there is no note name, then use the default set of
19836 note type strings. */
dda8d76d 19837 nt = get_note_type (filedata, pnote->type);
1ec5cd37 19838
1118d252
RM
19839 else if (const_strneq (pnote->namedata, "GNU"))
19840 /* GNU-specific object file notes. */
19841 nt = get_gnu_elf_note_type (pnote->type);
f4ddf30f
JB
19842
19843 else if (const_strneq (pnote->namedata, "FreeBSD"))
19844 /* FreeBSD-specific core file notes. */
dda8d76d 19845 nt = get_freebsd_elfcore_note_type (filedata, pnote->type);
1118d252 19846
0112cd26 19847 else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
1ec5cd37 19848 /* NetBSD-specific core file notes. */
dda8d76d 19849 nt = get_netbsd_elfcore_note_type (filedata, pnote->type);
1ec5cd37 19850
c6056a74
SF
19851 else if (const_strneq (pnote->namedata, "NetBSD"))
19852 /* NetBSD-specific core file notes. */
19853 return process_netbsd_elf_note (pnote);
19854
9abca702
CZ
19855 else if (const_strneq (pnote->namedata, "PaX"))
19856 /* NetBSD-specific core file notes. */
19857 return process_netbsd_elf_note (pnote);
19858
b15fa79e
AM
19859 else if (strneq (pnote->namedata, "SPU/", 4))
19860 {
19861 /* SPU-specific core file notes. */
19862 nt = pnote->namedata + 4;
19863 name = "SPU";
19864 }
19865
00e98fc7
TG
19866 else if (const_strneq (pnote->namedata, "IPF/VMS"))
19867 /* VMS/ia64-specific file notes. */
19868 nt = get_ia64_vms_note_type (pnote->type);
19869
70616151
TT
19870 else if (const_strneq (pnote->namedata, "stapsdt"))
19871 nt = get_stapsdt_note_type (pnote->type);
19872
9437c45b 19873 else
1ec5cd37
NC
19874 /* Don't recognize this note name; just use the default set of
19875 note type strings. */
dda8d76d 19876 nt = get_note_type (filedata, pnote->type);
9437c45b 19877
1449284b 19878 printf (" ");
9ef920e9 19879
483767a3
AM
19880 if (((const_strneq (pnote->namedata, "GA")
19881 && strchr ("*$!+", pnote->namedata[2]) != NULL)
19882 || strchr ("*$!+", pnote->namedata[0]) != NULL)
19883 && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
19884 || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
9ef920e9
NC
19885 print_gnu_build_attribute_name (pnote);
19886 else
19887 print_symbol (-20, name);
19888
19889 if (do_wide)
19890 printf (" 0x%08lx\t%s\t", pnote->descsz, nt);
19891 else
19892 printf (" 0x%08lx\t%s\n", pnote->descsz, nt);
00e98fc7
TG
19893
19894 if (const_strneq (pnote->namedata, "IPF/VMS"))
19895 return print_ia64_vms_note (pnote);
664f90a3 19896 else if (const_strneq (pnote->namedata, "GNU"))
dda8d76d 19897 return print_gnu_note (filedata, pnote);
c6a9fc58
TT
19898 else if (const_strneq (pnote->namedata, "stapsdt"))
19899 return print_stapsdt_note (pnote);
9ece1fa9
TT
19900 else if (const_strneq (pnote->namedata, "CORE"))
19901 return print_core_note (pnote);
483767a3
AM
19902 else if (((const_strneq (pnote->namedata, "GA")
19903 && strchr ("*$!+", pnote->namedata[2]) != NULL)
19904 || strchr ("*$!+", pnote->namedata[0]) != NULL)
19905 && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
19906 || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
dda8d76d 19907 return print_gnu_build_attribute_description (pnote, filedata);
779fe533 19908
9ef920e9 19909 if (pnote->descsz)
1449284b
NC
19910 {
19911 unsigned long i;
19912
19913 printf (_(" description data: "));
19914 for (i = 0; i < pnote->descsz; i++)
178d8719 19915 printf ("%02x ", pnote->descdata[i] & 0xff);
04ac15ab
AS
19916 if (!do_wide)
19917 printf ("\n");
1449284b
NC
19918 }
19919
9ef920e9
NC
19920 if (do_wide)
19921 printf ("\n");
19922
32ec8896 19923 return TRUE;
1449284b 19924}
6d118b09 19925
32ec8896 19926static bfd_boolean
dda8d76d
NC
19927process_notes_at (Filedata * filedata,
19928 Elf_Internal_Shdr * section,
19929 bfd_vma offset,
82ed9683
L
19930 bfd_vma length,
19931 bfd_vma align)
779fe533 19932{
2cf0635d
NC
19933 Elf_External_Note * pnotes;
19934 Elf_External_Note * external;
4dff97b2
NC
19935 char * end;
19936 bfd_boolean res = TRUE;
103f02d3 19937
779fe533 19938 if (length <= 0)
32ec8896 19939 return FALSE;
103f02d3 19940
1449284b
NC
19941 if (section)
19942 {
dda8d76d 19943 pnotes = (Elf_External_Note *) get_section_contents (section, filedata);
1449284b 19944 if (pnotes)
32ec8896 19945 {
dda8d76d 19946 if (! apply_relocations (filedata, section, (unsigned char *) pnotes, length, NULL, NULL))
f761cb13
AM
19947 {
19948 free (pnotes);
19949 return FALSE;
19950 }
32ec8896 19951 }
1449284b
NC
19952 }
19953 else
82ed9683 19954 pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
1449284b 19955 _("notes"));
4dff97b2 19956
dd24e3da 19957 if (pnotes == NULL)
32ec8896 19958 return FALSE;
779fe533 19959
103f02d3 19960 external = pnotes;
103f02d3 19961
1449284b 19962 if (section)
dda8d76d 19963 printf (_("\nDisplaying notes found in: %s\n"), printable_section_name (filedata, section));
1449284b
NC
19964 else
19965 printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
19966 (unsigned long) offset, (unsigned long) length);
19967
82ed9683
L
19968 /* NB: Some note sections may have alignment value of 0 or 1. gABI
19969 specifies that notes should be aligned to 4 bytes in 32-bit
19970 objects and to 8 bytes in 64-bit objects. As a Linux extension,
19971 we also support 4 byte alignment in 64-bit objects. If section
19972 alignment is less than 4, we treate alignment as 4 bytes. */
19973 if (align < 4)
19974 align = 4;
19975 else if (align != 4 && align != 8)
19976 {
19977 warn (_("Corrupt note: alignment %ld, expecting 4 or 8\n"),
19978 (long) align);
a788aedd 19979 free (pnotes);
82ed9683
L
19980 return FALSE;
19981 }
19982
dbe15e4e 19983 printf (_(" %-20s %-10s\tDescription\n"), _("Owner"), _("Data size"));
103f02d3 19984
c8071705
NC
19985 end = (char *) pnotes + length;
19986 while ((char *) external < end)
779fe533 19987 {
b34976b6 19988 Elf_Internal_Note inote;
15b42fb0 19989 size_t min_notesz;
4dff97b2 19990 char * next;
2cf0635d 19991 char * temp = NULL;
c8071705 19992 size_t data_remaining = end - (char *) external;
6d118b09 19993
dda8d76d 19994 if (!is_ia64_vms (filedata))
15b42fb0 19995 {
9dd3a467
NC
19996 /* PR binutils/15191
19997 Make sure that there is enough data to read. */
15b42fb0
AM
19998 min_notesz = offsetof (Elf_External_Note, name);
19999 if (data_remaining < min_notesz)
9dd3a467 20000 {
d3a49aa8
AM
20001 warn (ngettext ("Corrupt note: only %ld byte remains, "
20002 "not enough for a full note\n",
20003 "Corrupt note: only %ld bytes remain, "
20004 "not enough for a full note\n",
20005 data_remaining),
20006 (long) data_remaining);
9dd3a467
NC
20007 break;
20008 }
5396a86e
AM
20009 data_remaining -= min_notesz;
20010
15b42fb0
AM
20011 inote.type = BYTE_GET (external->type);
20012 inote.namesz = BYTE_GET (external->namesz);
20013 inote.namedata = external->name;
20014 inote.descsz = BYTE_GET (external->descsz);
276da9b3 20015 inote.descdata = ((char *) external
4dff97b2 20016 + ELF_NOTE_DESC_OFFSET (inote.namesz, align));
15b42fb0 20017 inote.descpos = offset + (inote.descdata - (char *) pnotes);
276da9b3 20018 next = ((char *) external
4dff97b2 20019 + ELF_NOTE_NEXT_OFFSET (inote.namesz, inote.descsz, align));
15b42fb0 20020 }
00e98fc7 20021 else
15b42fb0
AM
20022 {
20023 Elf64_External_VMS_Note *vms_external;
00e98fc7 20024
9dd3a467
NC
20025 /* PR binutils/15191
20026 Make sure that there is enough data to read. */
15b42fb0
AM
20027 min_notesz = offsetof (Elf64_External_VMS_Note, name);
20028 if (data_remaining < min_notesz)
9dd3a467 20029 {
d3a49aa8
AM
20030 warn (ngettext ("Corrupt note: only %ld byte remains, "
20031 "not enough for a full note\n",
20032 "Corrupt note: only %ld bytes remain, "
20033 "not enough for a full note\n",
20034 data_remaining),
20035 (long) data_remaining);
9dd3a467
NC
20036 break;
20037 }
5396a86e 20038 data_remaining -= min_notesz;
3e55a963 20039
15b42fb0
AM
20040 vms_external = (Elf64_External_VMS_Note *) external;
20041 inote.type = BYTE_GET (vms_external->type);
20042 inote.namesz = BYTE_GET (vms_external->namesz);
20043 inote.namedata = vms_external->name;
20044 inote.descsz = BYTE_GET (vms_external->descsz);
20045 inote.descdata = inote.namedata + align_power (inote.namesz, 3);
20046 inote.descpos = offset + (inote.descdata - (char *) pnotes);
20047 next = inote.descdata + align_power (inote.descsz, 3);
20048 }
20049
5396a86e
AM
20050 /* PR 17531: file: 3443835e. */
20051 /* PR 17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4. */
20052 if ((size_t) (inote.descdata - inote.namedata) < inote.namesz
20053 || (size_t) (inote.descdata - inote.namedata) > data_remaining
20054 || (size_t) (next - inote.descdata) < inote.descsz
20055 || ((size_t) (next - inote.descdata)
20056 > data_remaining - (size_t) (inote.descdata - inote.namedata)))
3e55a963 20057 {
15b42fb0 20058 warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
0af1713e 20059 (unsigned long) ((char *) external - (char *) pnotes));
4dff97b2
NC
20060 warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx, alignment: %u\n"),
20061 inote.type, inote.namesz, inote.descsz, (int) align);
3e55a963
NC
20062 break;
20063 }
20064
15b42fb0 20065 external = (Elf_External_Note *) next;
dd24e3da 20066
6d118b09
NC
20067 /* Verify that name is null terminated. It appears that at least
20068 one version of Linux (RedHat 6.0) generates corefiles that don't
20069 comply with the ELF spec by failing to include the null byte in
20070 namesz. */
18344509 20071 if (inote.namesz > 0 && inote.namedata[inote.namesz - 1] != '\0')
6d118b09 20072 {
5396a86e 20073 if ((size_t) (inote.descdata - inote.namedata) == inote.namesz)
6d118b09 20074 {
5396a86e
AM
20075 temp = (char *) malloc (inote.namesz + 1);
20076 if (temp == NULL)
20077 {
20078 error (_("Out of memory allocating space for inote name\n"));
20079 res = FALSE;
20080 break;
20081 }
76da6bbe 20082
5396a86e
AM
20083 memcpy (temp, inote.namedata, inote.namesz);
20084 inote.namedata = temp;
20085 }
20086 inote.namedata[inote.namesz] = 0;
6d118b09
NC
20087 }
20088
dda8d76d 20089 if (! process_note (& inote, filedata))
6b4bf3bc 20090 res = FALSE;
103f02d3 20091
9db70fc3
AM
20092 free (temp);
20093 temp = NULL;
779fe533
NC
20094 }
20095
20096 free (pnotes);
103f02d3 20097
779fe533
NC
20098 return res;
20099}
20100
32ec8896 20101static bfd_boolean
dda8d76d 20102process_corefile_note_segments (Filedata * filedata)
779fe533 20103{
2cf0635d 20104 Elf_Internal_Phdr * segment;
b34976b6 20105 unsigned int i;
32ec8896 20106 bfd_boolean res = TRUE;
103f02d3 20107
dda8d76d 20108 if (! get_program_headers (filedata))
6b4bf3bc 20109 return TRUE;
103f02d3 20110
dda8d76d
NC
20111 for (i = 0, segment = filedata->program_headers;
20112 i < filedata->file_header.e_phnum;
b34976b6 20113 i++, segment++)
779fe533
NC
20114 {
20115 if (segment->p_type == PT_NOTE)
dda8d76d 20116 if (! process_notes_at (filedata, NULL,
32ec8896 20117 (bfd_vma) segment->p_offset,
82ed9683
L
20118 (bfd_vma) segment->p_filesz,
20119 (bfd_vma) segment->p_align))
32ec8896 20120 res = FALSE;
779fe533 20121 }
103f02d3 20122
779fe533
NC
20123 return res;
20124}
20125
32ec8896 20126static bfd_boolean
dda8d76d 20127process_v850_notes (Filedata * filedata, bfd_vma offset, bfd_vma length)
685080f2
NC
20128{
20129 Elf_External_Note * pnotes;
20130 Elf_External_Note * external;
c8071705 20131 char * end;
32ec8896 20132 bfd_boolean res = TRUE;
685080f2
NC
20133
20134 if (length <= 0)
32ec8896 20135 return FALSE;
685080f2 20136
dda8d76d 20137 pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
685080f2
NC
20138 _("v850 notes"));
20139 if (pnotes == NULL)
32ec8896 20140 return FALSE;
685080f2
NC
20141
20142 external = pnotes;
c8071705 20143 end = (char*) pnotes + length;
685080f2
NC
20144
20145 printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
20146 (unsigned long) offset, (unsigned long) length);
20147
c8071705 20148 while ((char *) external + sizeof (Elf_External_Note) < end)
685080f2
NC
20149 {
20150 Elf_External_Note * next;
20151 Elf_Internal_Note inote;
20152
20153 inote.type = BYTE_GET (external->type);
20154 inote.namesz = BYTE_GET (external->namesz);
20155 inote.namedata = external->name;
20156 inote.descsz = BYTE_GET (external->descsz);
20157 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
20158 inote.descpos = offset + (inote.descdata - (char *) pnotes);
20159
c8071705
NC
20160 if (inote.descdata < (char *) pnotes || inote.descdata >= end)
20161 {
20162 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
20163 inote.descdata = inote.namedata;
20164 inote.namesz = 0;
20165 }
20166
685080f2
NC
20167 next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
20168
c8071705 20169 if ( ((char *) next > end)
685080f2
NC
20170 || ((char *) next < (char *) pnotes))
20171 {
20172 warn (_("corrupt descsz found in note at offset 0x%lx\n"),
20173 (unsigned long) ((char *) external - (char *) pnotes));
20174 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
20175 inote.type, inote.namesz, inote.descsz);
20176 break;
20177 }
20178
20179 external = next;
20180
20181 /* Prevent out-of-bounds indexing. */
c8071705 20182 if ( inote.namedata + inote.namesz > end
685080f2
NC
20183 || inote.namedata + inote.namesz < inote.namedata)
20184 {
20185 warn (_("corrupt namesz found in note at offset 0x%lx\n"),
20186 (unsigned long) ((char *) external - (char *) pnotes));
20187 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
20188 inote.type, inote.namesz, inote.descsz);
20189 break;
20190 }
20191
20192 printf (" %s: ", get_v850_elf_note_type (inote.type));
20193
20194 if (! print_v850_note (& inote))
20195 {
32ec8896 20196 res = FALSE;
685080f2
NC
20197 printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
20198 inote.namesz, inote.descsz);
20199 }
20200 }
20201
20202 free (pnotes);
20203
20204 return res;
20205}
20206
32ec8896 20207static bfd_boolean
dda8d76d 20208process_note_sections (Filedata * filedata)
1ec5cd37 20209{
2cf0635d 20210 Elf_Internal_Shdr * section;
1ec5cd37 20211 unsigned long i;
32ec8896
NC
20212 unsigned int n = 0;
20213 bfd_boolean res = TRUE;
1ec5cd37 20214
dda8d76d
NC
20215 for (i = 0, section = filedata->section_headers;
20216 i < filedata->file_header.e_shnum && section != NULL;
1ec5cd37 20217 i++, section++)
685080f2
NC
20218 {
20219 if (section->sh_type == SHT_NOTE)
20220 {
dda8d76d 20221 if (! process_notes_at (filedata, section,
32ec8896 20222 (bfd_vma) section->sh_offset,
82ed9683
L
20223 (bfd_vma) section->sh_size,
20224 (bfd_vma) section->sh_addralign))
32ec8896 20225 res = FALSE;
685080f2
NC
20226 n++;
20227 }
20228
dda8d76d
NC
20229 if (( filedata->file_header.e_machine == EM_V800
20230 || filedata->file_header.e_machine == EM_V850
20231 || filedata->file_header.e_machine == EM_CYGNUS_V850)
685080f2
NC
20232 && section->sh_type == SHT_RENESAS_INFO)
20233 {
dda8d76d 20234 if (! process_v850_notes (filedata,
32ec8896
NC
20235 (bfd_vma) section->sh_offset,
20236 (bfd_vma) section->sh_size))
20237 res = FALSE;
685080f2
NC
20238 n++;
20239 }
20240 }
df565f32
NC
20241
20242 if (n == 0)
20243 /* Try processing NOTE segments instead. */
dda8d76d 20244 return process_corefile_note_segments (filedata);
1ec5cd37
NC
20245
20246 return res;
20247}
20248
32ec8896 20249static bfd_boolean
dda8d76d 20250process_notes (Filedata * filedata)
779fe533
NC
20251{
20252 /* If we have not been asked to display the notes then do nothing. */
20253 if (! do_notes)
32ec8896 20254 return TRUE;
103f02d3 20255
dda8d76d
NC
20256 if (filedata->file_header.e_type != ET_CORE)
20257 return process_note_sections (filedata);
103f02d3 20258
779fe533 20259 /* No program headers means no NOTE segment. */
dda8d76d
NC
20260 if (filedata->file_header.e_phnum > 0)
20261 return process_corefile_note_segments (filedata);
779fe533 20262
1ec5cd37 20263 printf (_("No note segments present in the core file.\n"));
32ec8896 20264 return TRUE;
779fe533
NC
20265}
20266
60abdbed
NC
20267static unsigned char *
20268display_public_gnu_attributes (unsigned char * start,
20269 const unsigned char * const end)
20270{
20271 printf (_(" Unknown GNU attribute: %s\n"), start);
20272
20273 start += strnlen ((char *) start, end - start);
20274 display_raw_attribute (start, end);
20275
20276 return (unsigned char *) end;
20277}
20278
20279static unsigned char *
20280display_generic_attribute (unsigned char * start,
20281 unsigned int tag,
20282 const unsigned char * const end)
20283{
20284 if (tag == 0)
20285 return (unsigned char *) end;
20286
20287 return display_tag_value (tag, start, end);
20288}
20289
32ec8896 20290static bfd_boolean
dda8d76d 20291process_arch_specific (Filedata * filedata)
252b5132 20292{
a952a375 20293 if (! do_arch)
32ec8896 20294 return TRUE;
a952a375 20295
dda8d76d 20296 switch (filedata->file_header.e_machine)
252b5132 20297 {
53a346d8
CZ
20298 case EM_ARC:
20299 case EM_ARC_COMPACT:
20300 case EM_ARC_COMPACT2:
dda8d76d 20301 return process_attributes (filedata, "ARC", SHT_ARC_ATTRIBUTES,
53a346d8
CZ
20302 display_arc_attribute,
20303 display_generic_attribute);
11c1ff18 20304 case EM_ARM:
dda8d76d 20305 return process_attributes (filedata, "aeabi", SHT_ARM_ATTRIBUTES,
60abdbed
NC
20306 display_arm_attribute,
20307 display_generic_attribute);
20308
252b5132 20309 case EM_MIPS:
4fe85591 20310 case EM_MIPS_RS3_LE:
dda8d76d 20311 return process_mips_specific (filedata);
60abdbed
NC
20312
20313 case EM_MSP430:
dda8d76d 20314 return process_attributes (filedata, "mspabi", SHT_MSP430_ATTRIBUTES,
b0191216 20315 display_msp430_attribute,
c0ea7c52 20316 display_msp430_gnu_attribute);
60abdbed 20317
2dc8dd17
JW
20318 case EM_RISCV:
20319 return process_attributes (filedata, "riscv", SHT_RISCV_ATTRIBUTES,
20320 display_riscv_attribute,
20321 display_generic_attribute);
20322
35c08157 20323 case EM_NDS32:
dda8d76d 20324 return process_nds32_specific (filedata);
60abdbed 20325
85f7484a
PB
20326 case EM_68K:
20327 return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
20328 display_m68k_gnu_attribute);
20329
34c8bcba 20330 case EM_PPC:
b82317dd 20331 case EM_PPC64:
dda8d76d 20332 return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
60abdbed
NC
20333 display_power_gnu_attribute);
20334
643f7afb
AK
20335 case EM_S390:
20336 case EM_S390_OLD:
dda8d76d 20337 return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
60abdbed
NC
20338 display_s390_gnu_attribute);
20339
9e8c70f9
DM
20340 case EM_SPARC:
20341 case EM_SPARC32PLUS:
20342 case EM_SPARCV9:
dda8d76d 20343 return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
60abdbed
NC
20344 display_sparc_gnu_attribute);
20345
59e6276b 20346 case EM_TI_C6000:
dda8d76d 20347 return process_attributes (filedata, "c6xabi", SHT_C6000_ATTRIBUTES,
60abdbed
NC
20348 display_tic6x_attribute,
20349 display_generic_attribute);
20350
0861f561
CQ
20351 case EM_CSKY:
20352 return process_attributes (filedata, "csky", SHT_CSKY_ATTRIBUTES,
20353 display_csky_attribute, NULL);
20354
252b5132 20355 default:
dda8d76d 20356 return process_attributes (filedata, "gnu", SHT_GNU_ATTRIBUTES,
60abdbed
NC
20357 display_public_gnu_attributes,
20358 display_generic_attribute);
252b5132 20359 }
252b5132
RH
20360}
20361
32ec8896 20362static bfd_boolean
dda8d76d 20363get_file_header (Filedata * filedata)
252b5132 20364{
9ea033b2 20365 /* Read in the identity array. */
dda8d76d 20366 if (fread (filedata->file_header.e_ident, EI_NIDENT, 1, filedata->handle) != 1)
32ec8896 20367 return FALSE;
252b5132 20368
9ea033b2 20369 /* Determine how to read the rest of the header. */
dda8d76d 20370 switch (filedata->file_header.e_ident[EI_DATA])
9ea033b2 20371 {
1a0670f3
AM
20372 default:
20373 case ELFDATANONE:
adab8cdc
AO
20374 case ELFDATA2LSB:
20375 byte_get = byte_get_little_endian;
20376 byte_put = byte_put_little_endian;
20377 break;
20378 case ELFDATA2MSB:
20379 byte_get = byte_get_big_endian;
20380 byte_put = byte_put_big_endian;
20381 break;
9ea033b2
NC
20382 }
20383
20384 /* For now we only support 32 bit and 64 bit ELF files. */
dda8d76d 20385 is_32bit_elf = (filedata->file_header.e_ident[EI_CLASS] != ELFCLASS64);
9ea033b2
NC
20386
20387 /* Read in the rest of the header. */
20388 if (is_32bit_elf)
20389 {
20390 Elf32_External_Ehdr ehdr32;
252b5132 20391
dda8d76d 20392 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, filedata->handle) != 1)
32ec8896 20393 return FALSE;
103f02d3 20394
dda8d76d
NC
20395 filedata->file_header.e_type = BYTE_GET (ehdr32.e_type);
20396 filedata->file_header.e_machine = BYTE_GET (ehdr32.e_machine);
20397 filedata->file_header.e_version = BYTE_GET (ehdr32.e_version);
20398 filedata->file_header.e_entry = BYTE_GET (ehdr32.e_entry);
20399 filedata->file_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
20400 filedata->file_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
20401 filedata->file_header.e_flags = BYTE_GET (ehdr32.e_flags);
20402 filedata->file_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
20403 filedata->file_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
20404 filedata->file_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
20405 filedata->file_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
20406 filedata->file_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
20407 filedata->file_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
9ea033b2 20408 }
252b5132 20409 else
9ea033b2
NC
20410 {
20411 Elf64_External_Ehdr ehdr64;
a952a375
NC
20412
20413 /* If we have been compiled with sizeof (bfd_vma) == 4, then
20414 we will not be able to cope with the 64bit data found in
20415 64 ELF files. Detect this now and abort before we start
50c2245b 20416 overwriting things. */
a952a375
NC
20417 if (sizeof (bfd_vma) < 8)
20418 {
e3c8793a
NC
20419 error (_("This instance of readelf has been built without support for a\n\
2042064 bit data type and so it cannot read 64 bit ELF files.\n"));
32ec8896 20421 return FALSE;
a952a375 20422 }
103f02d3 20423
dda8d76d 20424 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, filedata->handle) != 1)
32ec8896 20425 return FALSE;
103f02d3 20426
dda8d76d
NC
20427 filedata->file_header.e_type = BYTE_GET (ehdr64.e_type);
20428 filedata->file_header.e_machine = BYTE_GET (ehdr64.e_machine);
20429 filedata->file_header.e_version = BYTE_GET (ehdr64.e_version);
20430 filedata->file_header.e_entry = BYTE_GET (ehdr64.e_entry);
20431 filedata->file_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
20432 filedata->file_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
20433 filedata->file_header.e_flags = BYTE_GET (ehdr64.e_flags);
20434 filedata->file_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
20435 filedata->file_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
20436 filedata->file_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
20437 filedata->file_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
20438 filedata->file_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
20439 filedata->file_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
9ea033b2 20440 }
252b5132 20441
dda8d76d 20442 if (filedata->file_header.e_shoff)
7ece0d85
JJ
20443 {
20444 /* There may be some extensions in the first section header. Don't
20445 bomb if we can't read it. */
20446 if (is_32bit_elf)
dda8d76d 20447 get_32bit_section_headers (filedata, TRUE);
7ece0d85 20448 else
dda8d76d 20449 get_64bit_section_headers (filedata, TRUE);
7ece0d85 20450 }
560f3c1c 20451
32ec8896 20452 return TRUE;
252b5132
RH
20453}
20454
dda8d76d
NC
20455static void
20456close_file (Filedata * filedata)
20457{
20458 if (filedata)
20459 {
20460 if (filedata->handle)
20461 fclose (filedata->handle);
20462 free (filedata);
20463 }
20464}
20465
20466void
20467close_debug_file (void * data)
20468{
20469 close_file ((Filedata *) data);
20470}
20471
20472static Filedata *
20473open_file (const char * pathname)
20474{
20475 struct stat statbuf;
20476 Filedata * filedata = NULL;
20477
20478 if (stat (pathname, & statbuf) < 0
20479 || ! S_ISREG (statbuf.st_mode))
20480 goto fail;
20481
20482 filedata = calloc (1, sizeof * filedata);
20483 if (filedata == NULL)
20484 goto fail;
20485
20486 filedata->handle = fopen (pathname, "rb");
20487 if (filedata->handle == NULL)
20488 goto fail;
20489
20490 filedata->file_size = (bfd_size_type) statbuf.st_size;
20491 filedata->file_name = pathname;
20492
20493 if (! get_file_header (filedata))
20494 goto fail;
20495
20496 if (filedata->file_header.e_shoff)
20497 {
20498 bfd_boolean res;
20499
20500 /* Read the section headers again, this time for real. */
20501 if (is_32bit_elf)
20502 res = get_32bit_section_headers (filedata, FALSE);
20503 else
20504 res = get_64bit_section_headers (filedata, FALSE);
20505
20506 if (!res)
20507 goto fail;
20508 }
20509
20510 return filedata;
20511
20512 fail:
20513 if (filedata)
20514 {
20515 if (filedata->handle)
20516 fclose (filedata->handle);
20517 free (filedata);
20518 }
20519 return NULL;
20520}
20521
20522void *
20523open_debug_file (const char * pathname)
20524{
20525 return open_file (pathname);
20526}
20527
fb52b2f4
NC
20528/* Process one ELF object file according to the command line options.
20529 This file may actually be stored in an archive. The file is
32ec8896
NC
20530 positioned at the start of the ELF object. Returns TRUE if no
20531 problems were encountered, FALSE otherwise. */
fb52b2f4 20532
32ec8896 20533static bfd_boolean
dda8d76d 20534process_object (Filedata * filedata)
252b5132 20535{
24841daa 20536 bfd_boolean have_separate_files;
252b5132 20537 unsigned int i;
2482f306 20538 bfd_boolean res;
252b5132 20539
dda8d76d 20540 if (! get_file_header (filedata))
252b5132 20541 {
dda8d76d 20542 error (_("%s: Failed to read file header\n"), filedata->file_name);
32ec8896 20543 return FALSE;
252b5132
RH
20544 }
20545
20546 /* Initialise per file variables. */
978c4450
AM
20547 for (i = ARRAY_SIZE (filedata->version_info); i--;)
20548 filedata->version_info[i] = 0;
252b5132 20549
978c4450
AM
20550 for (i = ARRAY_SIZE (filedata->dynamic_info); i--;)
20551 filedata->dynamic_info[i] = 0;
20552 filedata->dynamic_info_DT_GNU_HASH = 0;
20553 filedata->dynamic_info_DT_MIPS_XHASH = 0;
252b5132
RH
20554
20555 /* Process the file. */
20556 if (show_name)
dda8d76d 20557 printf (_("\nFile: %s\n"), filedata->file_name);
252b5132 20558
18bd398b
NC
20559 /* Initialise the dump_sects array from the cmdline_dump_sects array.
20560 Note we do this even if cmdline_dump_sects is empty because we
20561 must make sure that the dump_sets array is zeroed out before each
20562 object file is processed. */
6431e409
AM
20563 if (filedata->dump.num_dump_sects > cmdline.num_dump_sects)
20564 memset (filedata->dump.dump_sects, 0,
20565 filedata->dump.num_dump_sects * sizeof (*filedata->dump.dump_sects));
18bd398b 20566
dda8d76d 20567 if (cmdline.num_dump_sects > 0)
18bd398b 20568 {
6431e409 20569 if (filedata->dump.num_dump_sects == 0)
18bd398b 20570 /* A sneaky way of allocating the dump_sects array. */
6431e409 20571 request_dump_bynumber (&filedata->dump, cmdline.num_dump_sects, 0);
18bd398b 20572
6431e409
AM
20573 assert (filedata->dump.num_dump_sects >= cmdline.num_dump_sects);
20574 memcpy (filedata->dump.dump_sects, cmdline.dump_sects,
20575 cmdline.num_dump_sects * sizeof (*filedata->dump.dump_sects));
18bd398b 20576 }
d70c5fc7 20577
dda8d76d 20578 if (! process_file_header (filedata))
32ec8896 20579 return FALSE;
252b5132 20580
dda8d76d 20581 if (! process_section_headers (filedata))
2f62977e 20582 {
32ec8896
NC
20583 /* Without loaded section headers we cannot process lots of things. */
20584 do_unwind = do_version = do_dump = do_arch = FALSE;
252b5132 20585
2f62977e 20586 if (! do_using_dynamic)
32ec8896 20587 do_syms = do_dyn_syms = do_reloc = FALSE;
2f62977e 20588 }
252b5132 20589
dda8d76d 20590 if (! process_section_groups (filedata))
32ec8896
NC
20591 /* Without loaded section groups we cannot process unwind. */
20592 do_unwind = FALSE;
d1f5c6e3 20593
2482f306
AM
20594 res = process_program_headers (filedata);
20595 if (res)
20596 res = process_dynamic_section (filedata);
252b5132 20597
dda8d76d 20598 if (! process_relocs (filedata))
32ec8896 20599 res = FALSE;
252b5132 20600
dda8d76d 20601 if (! process_unwind (filedata))
32ec8896 20602 res = FALSE;
4d6ed7c8 20603
dda8d76d 20604 if (! process_symbol_table (filedata))
32ec8896 20605 res = FALSE;
252b5132 20606
dda8d76d 20607 if (! process_syminfo (filedata))
32ec8896 20608 res = FALSE;
252b5132 20609
dda8d76d 20610 if (! process_version_sections (filedata))
32ec8896 20611 res = FALSE;
252b5132 20612
82ed9683 20613 if (filedata->file_header.e_shstrndx != SHN_UNDEF)
24841daa 20614 have_separate_files = load_separate_debug_files (filedata, filedata->file_name);
82ed9683 20615 else
24841daa 20616 have_separate_files = FALSE;
dda8d76d
NC
20617
20618 if (! process_section_contents (filedata))
32ec8896 20619 res = FALSE;
f5842774 20620
24841daa 20621 if (have_separate_files)
dda8d76d 20622 {
24841daa
NC
20623 separate_info * d;
20624
20625 for (d = first_separate_info; d != NULL; d = d->next)
20626 {
20627 if (! process_section_headers (d->handle))
20628 res = FALSE;
20629 else if (! process_section_contents (d->handle))
20630 res = FALSE;
20631 }
20632
20633 /* The file handles are closed by the call to free_debug_memory() below. */
dda8d76d
NC
20634 }
20635
20636 if (! process_notes (filedata))
32ec8896 20637 res = FALSE;
103f02d3 20638
dda8d76d 20639 if (! process_gnu_liblist (filedata))
32ec8896 20640 res = FALSE;
047b2264 20641
dda8d76d 20642 if (! process_arch_specific (filedata))
32ec8896 20643 res = FALSE;
252b5132 20644
dda8d76d
NC
20645 free (filedata->program_headers);
20646 filedata->program_headers = NULL;
d93f0186 20647
dda8d76d
NC
20648 free (filedata->section_headers);
20649 filedata->section_headers = NULL;
252b5132 20650
dda8d76d
NC
20651 free (filedata->string_table);
20652 filedata->string_table = NULL;
20653 filedata->string_table_length = 0;
252b5132 20654
9db70fc3
AM
20655 free (filedata->dump.dump_sects);
20656 filedata->dump.dump_sects = NULL;
20657 filedata->dump.num_dump_sects = 0;
a788aedd 20658
9db70fc3
AM
20659 free (filedata->dynamic_strings);
20660 filedata->dynamic_strings = NULL;
20661 filedata->dynamic_strings_length = 0;
252b5132 20662
9db70fc3
AM
20663 free (filedata->dynamic_symbols);
20664 filedata->dynamic_symbols = NULL;
20665 filedata->num_dynamic_syms = 0;
252b5132 20666
9db70fc3
AM
20667 free (filedata->dynamic_syminfo);
20668 filedata->dynamic_syminfo = NULL;
ff78d6d6 20669
9db70fc3
AM
20670 free (filedata->dynamic_section);
20671 filedata->dynamic_section = NULL;
293c573e 20672
978c4450 20673 while (filedata->symtab_shndx_list != NULL)
8fb879cd 20674 {
978c4450
AM
20675 elf_section_list *next = filedata->symtab_shndx_list->next;
20676 free (filedata->symtab_shndx_list);
20677 filedata->symtab_shndx_list = next;
8fb879cd
AM
20678 }
20679
9db70fc3
AM
20680 free (filedata->section_headers_groups);
20681 filedata->section_headers_groups = NULL;
e4b17d5c 20682
978c4450 20683 if (filedata->section_groups)
e4b17d5c 20684 {
2cf0635d
NC
20685 struct group_list * g;
20686 struct group_list * next;
e4b17d5c 20687
978c4450 20688 for (i = 0; i < filedata->group_count; i++)
e4b17d5c 20689 {
978c4450 20690 for (g = filedata->section_groups [i].root; g != NULL; g = next)
e4b17d5c
L
20691 {
20692 next = g->next;
20693 free (g);
20694 }
20695 }
20696
978c4450
AM
20697 free (filedata->section_groups);
20698 filedata->section_groups = NULL;
e4b17d5c
L
20699 }
20700
19e6b90e 20701 free_debug_memory ();
18bd398b 20702
32ec8896 20703 return res;
252b5132
RH
20704}
20705
2cf0635d 20706/* Process an ELF archive.
32ec8896
NC
20707 On entry the file is positioned just after the ARMAG string.
20708 Returns TRUE upon success, FALSE otherwise. */
2cf0635d 20709
32ec8896 20710static bfd_boolean
dda8d76d 20711process_archive (Filedata * filedata, bfd_boolean is_thin_archive)
2cf0635d
NC
20712{
20713 struct archive_info arch;
20714 struct archive_info nested_arch;
20715 size_t got;
32ec8896 20716 bfd_boolean ret = TRUE;
2cf0635d 20717
32ec8896 20718 show_name = TRUE;
2cf0635d
NC
20719
20720 /* The ARCH structure is used to hold information about this archive. */
20721 arch.file_name = NULL;
20722 arch.file = NULL;
20723 arch.index_array = NULL;
20724 arch.sym_table = NULL;
20725 arch.longnames = NULL;
20726
20727 /* The NESTED_ARCH structure is used as a single-item cache of information
20728 about a nested archive (when members of a thin archive reside within
20729 another regular archive file). */
20730 nested_arch.file_name = NULL;
20731 nested_arch.file = NULL;
20732 nested_arch.index_array = NULL;
20733 nested_arch.sym_table = NULL;
20734 nested_arch.longnames = NULL;
20735
dda8d76d 20736 if (setup_archive (&arch, filedata->file_name, filedata->handle,
780f96ae
AM
20737 filedata->file_size, is_thin_archive,
20738 do_archive_index) != 0)
2cf0635d 20739 {
32ec8896 20740 ret = FALSE;
2cf0635d 20741 goto out;
4145f1d5 20742 }
fb52b2f4 20743
4145f1d5
NC
20744 if (do_archive_index)
20745 {
2cf0635d 20746 if (arch.sym_table == NULL)
1cb7d8b1
AM
20747 error (_("%s: unable to dump the index as none was found\n"),
20748 filedata->file_name);
4145f1d5
NC
20749 else
20750 {
591f7597 20751 unsigned long i, l;
4145f1d5
NC
20752 unsigned long current_pos;
20753
1cb7d8b1
AM
20754 printf (_("Index of archive %s: (%lu entries, 0x%lx bytes "
20755 "in the symbol table)\n"),
20756 filedata->file_name, (unsigned long) arch.index_num,
20757 arch.sym_size);
dda8d76d
NC
20758
20759 current_pos = ftell (filedata->handle);
4145f1d5 20760
2cf0635d 20761 for (i = l = 0; i < arch.index_num; i++)
4145f1d5 20762 {
1cb7d8b1
AM
20763 if (i == 0
20764 || (i > 0 && arch.index_array[i] != arch.index_array[i - 1]))
20765 {
20766 char * member_name
20767 = get_archive_member_name_at (&arch, arch.index_array[i],
20768 &nested_arch);
2cf0635d 20769
1cb7d8b1
AM
20770 if (member_name != NULL)
20771 {
20772 char * qualified_name
20773 = make_qualified_name (&arch, &nested_arch,
20774 member_name);
2cf0635d 20775
1cb7d8b1
AM
20776 if (qualified_name != NULL)
20777 {
20778 printf (_("Contents of binary %s at offset "),
20779 qualified_name);
c2a7d3f5
NC
20780 (void) print_vma (arch.index_array[i], PREFIX_HEX);
20781 putchar ('\n');
1cb7d8b1
AM
20782 free (qualified_name);
20783 }
fd486f32 20784 free (member_name);
4145f1d5
NC
20785 }
20786 }
2cf0635d
NC
20787
20788 if (l >= arch.sym_size)
4145f1d5 20789 {
1cb7d8b1
AM
20790 error (_("%s: end of the symbol table reached "
20791 "before the end of the index\n"),
dda8d76d 20792 filedata->file_name);
32ec8896 20793 ret = FALSE;
cb8f3167 20794 break;
4145f1d5 20795 }
591f7597 20796 /* PR 17531: file: 0b6630b2. */
1cb7d8b1
AM
20797 printf ("\t%.*s\n",
20798 (int) (arch.sym_size - l), arch.sym_table + l);
591f7597 20799 l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
4145f1d5
NC
20800 }
20801
67ce483b 20802 if (arch.uses_64bit_indices)
c2a7d3f5
NC
20803 l = (l + 7) & ~ 7;
20804 else
20805 l += l & 1;
20806
2cf0635d 20807 if (l < arch.sym_size)
32ec8896 20808 {
d3a49aa8
AM
20809 error (ngettext ("%s: %ld byte remains in the symbol table, "
20810 "but without corresponding entries in "
20811 "the index table\n",
20812 "%s: %ld bytes remain in the symbol table, "
20813 "but without corresponding entries in "
20814 "the index table\n",
20815 arch.sym_size - l),
dda8d76d 20816 filedata->file_name, arch.sym_size - l);
32ec8896
NC
20817 ret = FALSE;
20818 }
4145f1d5 20819
dda8d76d 20820 if (fseek (filedata->handle, current_pos, SEEK_SET) != 0)
4145f1d5 20821 {
1cb7d8b1
AM
20822 error (_("%s: failed to seek back to start of object files "
20823 "in the archive\n"),
dda8d76d 20824 filedata->file_name);
32ec8896 20825 ret = FALSE;
2cf0635d 20826 goto out;
4145f1d5 20827 }
fb52b2f4 20828 }
4145f1d5
NC
20829
20830 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
20831 && !do_segments && !do_header && !do_dump && !do_version
20832 && !do_histogram && !do_debugging && !do_arch && !do_notes
2c610e4b 20833 && !do_section_groups && !do_dyn_syms)
2cf0635d 20834 {
32ec8896 20835 ret = TRUE; /* Archive index only. */
2cf0635d
NC
20836 goto out;
20837 }
fb52b2f4
NC
20838 }
20839
fb52b2f4
NC
20840 while (1)
20841 {
2cf0635d
NC
20842 char * name;
20843 size_t namelen;
20844 char * qualified_name;
20845
20846 /* Read the next archive header. */
dda8d76d 20847 if (fseek (filedata->handle, arch.next_arhdr_offset, SEEK_SET) != 0)
1cb7d8b1
AM
20848 {
20849 error (_("%s: failed to seek to next archive header\n"),
20850 arch.file_name);
20851 ret = FALSE;
20852 break;
20853 }
dda8d76d 20854 got = fread (&arch.arhdr, 1, sizeof arch.arhdr, filedata->handle);
2cf0635d 20855 if (got != sizeof arch.arhdr)
1cb7d8b1
AM
20856 {
20857 if (got == 0)
2cf0635d 20858 break;
28e817cc
NC
20859 /* PR 24049 - we cannot use filedata->file_name as this will
20860 have already been freed. */
20861 error (_("%s: failed to read archive header\n"), arch.file_name);
9abca702 20862
1cb7d8b1
AM
20863 ret = FALSE;
20864 break;
20865 }
2cf0635d 20866 if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
1cb7d8b1
AM
20867 {
20868 error (_("%s: did not find a valid archive header\n"),
20869 arch.file_name);
20870 ret = FALSE;
20871 break;
20872 }
2cf0635d
NC
20873
20874 arch.next_arhdr_offset += sizeof arch.arhdr;
20875
978c4450
AM
20876 filedata->archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
20877 if (filedata->archive_file_size & 01)
20878 ++filedata->archive_file_size;
2cf0635d
NC
20879
20880 name = get_archive_member_name (&arch, &nested_arch);
20881 if (name == NULL)
fb52b2f4 20882 {
28e817cc 20883 error (_("%s: bad archive file name\n"), arch.file_name);
32ec8896 20884 ret = FALSE;
d989285c 20885 break;
fb52b2f4 20886 }
2cf0635d 20887 namelen = strlen (name);
fb52b2f4 20888
2cf0635d
NC
20889 qualified_name = make_qualified_name (&arch, &nested_arch, name);
20890 if (qualified_name == NULL)
fb52b2f4 20891 {
28e817cc 20892 error (_("%s: bad archive file name\n"), arch.file_name);
fd486f32 20893 free (name);
32ec8896 20894 ret = FALSE;
d989285c 20895 break;
fb52b2f4
NC
20896 }
20897
2cf0635d 20898 if (is_thin_archive && arch.nested_member_origin == 0)
1cb7d8b1
AM
20899 {
20900 /* This is a proxy for an external member of a thin archive. */
20901 Filedata * member_filedata;
20902 char * member_file_name = adjust_relative_path
dda8d76d 20903 (filedata->file_name, name, namelen);
32ec8896 20904
fd486f32 20905 free (name);
1cb7d8b1
AM
20906 if (member_file_name == NULL)
20907 {
fd486f32 20908 free (qualified_name);
1cb7d8b1
AM
20909 ret = FALSE;
20910 break;
20911 }
2cf0635d 20912
1cb7d8b1
AM
20913 member_filedata = open_file (member_file_name);
20914 if (member_filedata == NULL)
20915 {
20916 error (_("Input file '%s' is not readable.\n"), member_file_name);
20917 free (member_file_name);
fd486f32 20918 free (qualified_name);
1cb7d8b1
AM
20919 ret = FALSE;
20920 break;
20921 }
2cf0635d 20922
978c4450 20923 filedata->archive_file_offset = arch.nested_member_origin;
dda8d76d 20924 member_filedata->file_name = qualified_name;
2cf0635d 20925
1cb7d8b1 20926 if (! process_object (member_filedata))
32ec8896 20927 ret = FALSE;
2cf0635d 20928
1cb7d8b1
AM
20929 close_file (member_filedata);
20930 free (member_file_name);
1cb7d8b1 20931 }
2cf0635d 20932 else if (is_thin_archive)
1cb7d8b1
AM
20933 {
20934 Filedata thin_filedata;
eb02c04d 20935
1cb7d8b1 20936 memset (&thin_filedata, 0, sizeof (thin_filedata));
dda8d76d 20937
a043396b
NC
20938 /* PR 15140: Allow for corrupt thin archives. */
20939 if (nested_arch.file == NULL)
20940 {
20941 error (_("%s: contains corrupt thin archive: %s\n"),
28e817cc 20942 qualified_name, name);
fd486f32
AM
20943 free (qualified_name);
20944 free (name);
32ec8896 20945 ret = FALSE;
a043396b
NC
20946 break;
20947 }
fd486f32 20948 free (name);
a043396b 20949
1cb7d8b1 20950 /* This is a proxy for a member of a nested archive. */
978c4450
AM
20951 filedata->archive_file_offset
20952 = arch.nested_member_origin + sizeof arch.arhdr;
2cf0635d 20953
1cb7d8b1
AM
20954 /* The nested archive file will have been opened and setup by
20955 get_archive_member_name. */
978c4450
AM
20956 if (fseek (nested_arch.file, filedata->archive_file_offset,
20957 SEEK_SET) != 0)
1cb7d8b1
AM
20958 {
20959 error (_("%s: failed to seek to archive member.\n"),
20960 nested_arch.file_name);
fd486f32 20961 free (qualified_name);
1cb7d8b1
AM
20962 ret = FALSE;
20963 break;
20964 }
2cf0635d 20965
dda8d76d
NC
20966 thin_filedata.handle = nested_arch.file;
20967 thin_filedata.file_name = qualified_name;
9abca702 20968
1cb7d8b1 20969 if (! process_object (& thin_filedata))
32ec8896 20970 ret = FALSE;
1cb7d8b1 20971 }
2cf0635d 20972 else
1cb7d8b1 20973 {
fd486f32 20974 free (name);
978c4450 20975 filedata->archive_file_offset = arch.next_arhdr_offset;
6a6196fc 20976 filedata->file_name = qualified_name;
1cb7d8b1 20977 if (! process_object (filedata))
32ec8896 20978 ret = FALSE;
978c4450 20979 arch.next_arhdr_offset += filedata->archive_file_size;
4c836627 20980 /* Stop looping with "negative" archive_file_size. */
978c4450 20981 if (arch.next_arhdr_offset < filedata->archive_file_size)
80e2a3b6 20982 arch.next_arhdr_offset = -1ul;
1cb7d8b1 20983 }
fb52b2f4 20984
2cf0635d 20985 free (qualified_name);
fb52b2f4
NC
20986 }
20987
4145f1d5 20988 out:
2cf0635d
NC
20989 if (nested_arch.file != NULL)
20990 fclose (nested_arch.file);
20991 release_archive (&nested_arch);
20992 release_archive (&arch);
fb52b2f4 20993
d989285c 20994 return ret;
fb52b2f4
NC
20995}
20996
32ec8896 20997static bfd_boolean
2cf0635d 20998process_file (char * file_name)
fb52b2f4 20999{
dda8d76d 21000 Filedata * filedata = NULL;
fb52b2f4
NC
21001 struct stat statbuf;
21002 char armag[SARMAG];
32ec8896 21003 bfd_boolean ret = TRUE;
fb52b2f4
NC
21004
21005 if (stat (file_name, &statbuf) < 0)
21006 {
f24ddbdd
NC
21007 if (errno == ENOENT)
21008 error (_("'%s': No such file\n"), file_name);
21009 else
21010 error (_("Could not locate '%s'. System error message: %s\n"),
21011 file_name, strerror (errno));
32ec8896 21012 return FALSE;
f24ddbdd
NC
21013 }
21014
21015 if (! S_ISREG (statbuf.st_mode))
21016 {
21017 error (_("'%s' is not an ordinary file\n"), file_name);
32ec8896 21018 return FALSE;
fb52b2f4
NC
21019 }
21020
dda8d76d
NC
21021 filedata = calloc (1, sizeof * filedata);
21022 if (filedata == NULL)
21023 {
21024 error (_("Out of memory allocating file data structure\n"));
21025 return FALSE;
21026 }
21027
21028 filedata->file_name = file_name;
21029 filedata->handle = fopen (file_name, "rb");
21030 if (filedata->handle == NULL)
fb52b2f4 21031 {
f24ddbdd 21032 error (_("Input file '%s' is not readable.\n"), file_name);
dda8d76d 21033 free (filedata);
32ec8896 21034 return FALSE;
fb52b2f4
NC
21035 }
21036
dda8d76d 21037 if (fread (armag, SARMAG, 1, filedata->handle) != 1)
fb52b2f4 21038 {
4145f1d5 21039 error (_("%s: Failed to read file's magic number\n"), file_name);
dda8d76d
NC
21040 fclose (filedata->handle);
21041 free (filedata);
32ec8896 21042 return FALSE;
fb52b2f4
NC
21043 }
21044
dda8d76d 21045 filedata->file_size = (bfd_size_type) statbuf.st_size;
f54498b4 21046
fb52b2f4 21047 if (memcmp (armag, ARMAG, SARMAG) == 0)
32ec8896 21048 {
dda8d76d 21049 if (! process_archive (filedata, FALSE))
32ec8896
NC
21050 ret = FALSE;
21051 }
2cf0635d 21052 else if (memcmp (armag, ARMAGT, SARMAG) == 0)
32ec8896 21053 {
dda8d76d 21054 if ( ! process_archive (filedata, TRUE))
32ec8896
NC
21055 ret = FALSE;
21056 }
fb52b2f4
NC
21057 else
21058 {
1b513401 21059 if (do_archive_index && !check_all)
4145f1d5
NC
21060 error (_("File %s is not an archive so its index cannot be displayed.\n"),
21061 file_name);
21062
dda8d76d 21063 rewind (filedata->handle);
978c4450 21064 filedata->archive_file_size = filedata->archive_file_offset = 0;
32ec8896 21065
dda8d76d 21066 if (! process_object (filedata))
32ec8896 21067 ret = FALSE;
fb52b2f4
NC
21068 }
21069
dda8d76d 21070 fclose (filedata->handle);
8fb879cd
AM
21071 free (filedata->section_headers);
21072 free (filedata->program_headers);
21073 free (filedata->string_table);
6431e409 21074 free (filedata->dump.dump_sects);
dda8d76d 21075 free (filedata);
32ec8896 21076
fd486f32 21077 free (ba_cache.strtab);
1bd6175a 21078 ba_cache.strtab = NULL;
fd486f32 21079 free (ba_cache.symtab);
1bd6175a 21080 ba_cache.symtab = NULL;
fd486f32
AM
21081 ba_cache.filedata = NULL;
21082
fb52b2f4
NC
21083 return ret;
21084}
21085
252b5132
RH
21086#ifdef SUPPORT_DISASSEMBLY
21087/* Needed by the i386 disassembler. For extra credit, someone could
9ea033b2 21088 fix this so that we insert symbolic addresses here, esp for GOT/PLT
e3c8793a 21089 symbols. */
252b5132
RH
21090
21091void
2cf0635d 21092print_address (unsigned int addr, FILE * outfile)
252b5132
RH
21093{
21094 fprintf (outfile,"0x%8.8x", addr);
21095}
21096
e3c8793a 21097/* Needed by the i386 disassembler. */
dda8d76d 21098
252b5132
RH
21099void
21100db_task_printsym (unsigned int addr)
21101{
21102 print_address (addr, stderr);
21103}
21104#endif
21105
21106int
2cf0635d 21107main (int argc, char ** argv)
252b5132 21108{
ff78d6d6
L
21109 int err;
21110
252b5132
RH
21111#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
21112 setlocale (LC_MESSAGES, "");
3882b010
L
21113#endif
21114#if defined (HAVE_SETLOCALE)
21115 setlocale (LC_CTYPE, "");
252b5132
RH
21116#endif
21117 bindtextdomain (PACKAGE, LOCALEDIR);
21118 textdomain (PACKAGE);
21119
869b9d07
MM
21120 expandargv (&argc, &argv);
21121
dda8d76d 21122 parse_args (& cmdline, argc, argv);
59f14fc0 21123
18bd398b 21124 if (optind < (argc - 1))
1b513401
NC
21125 /* When displaying information for more than one file,
21126 prefix the information with the file name. */
32ec8896 21127 show_name = TRUE;
5656ba2c
L
21128 else if (optind >= argc)
21129 {
1b513401
NC
21130 /* Ensure that the warning is always displayed. */
21131 do_checks = TRUE;
21132
5656ba2c
L
21133 warn (_("Nothing to do.\n"));
21134 usage (stderr);
21135 }
18bd398b 21136
32ec8896 21137 err = FALSE;
252b5132 21138 while (optind < argc)
32ec8896
NC
21139 if (! process_file (argv[optind++]))
21140 err = TRUE;
252b5132 21141
9db70fc3 21142 free (cmdline.dump_sects);
252b5132 21143
7d9813f1
NA
21144 free (dump_ctf_symtab_name);
21145 free (dump_ctf_strtab_name);
21146 free (dump_ctf_parent_name);
21147
32ec8896 21148 return err ? EXIT_FAILURE : EXIT_SUCCESS;
252b5132 21149}