1/* readelf.c -- display contents of an ELF format file
2   Copyright (C) 1998-2017 Free Software Foundation, Inc.
3
4   Originally developed by Eric Youngdale <eric@andante.jic.com>
5   Modifications by Nick Clifton <nickc@redhat.com>
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
11   the Free Software Foundation; either version 3 of the License, or
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
21   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
22   02110-1301, USA.  */
23
24/* The difference between readelf and objdump:
25
26  Both programs are capable of displaying the contents of ELF format files,
27  so why does the binutils project have two file dumpers ?
28
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
43#include "sysdep.h"
44#include <assert.h>
45#include <time.h>
46#include <zlib.h>
47#ifdef HAVE_WCHAR_H
48#include <wchar.h>
49#endif
50
51#if __GNUC__ >= 2
52/* Define BFD64 here, even if our default architecture is 32 bit ELF
53   as this will allow us to read in and parse 64bit and 32bit ELF files.
54   Only do this if we believe that the compiler can support a 64 bit
55   data type.  For now we only rely on GCC being able to do this.  */
56#define BFD64
57#endif
58
59#include "bfd.h"
60#include "bucomm.h"
61#include "elfcomm.h"
62#include "dwarf.h"
63
64#include "elf/common.h"
65#include "elf/external.h"
66#include "elf/internal.h"
67
68
69/* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
70   we can obtain the H8 reloc numbers.  We need these for the
71   get_reloc_size() function.  We include h8.h again after defining
72   RELOC_MACROS_GEN_FUNC so that we get the naming function as well.  */
73
74#include "elf/h8.h"
75#undef _ELF_H8_H
76
77/* Undo the effects of #including reloc-macros.h.  */
78
79#undef START_RELOC_NUMBERS
80#undef RELOC_NUMBER
81#undef FAKE_RELOC
82#undef EMPTY_RELOC
83#undef END_RELOC_NUMBERS
84#undef _RELOC_MACROS_H
85
86/* The following headers use the elf/reloc-macros.h file to
87   automatically generate relocation recognition functions
88   such as elf_mips_reloc_type()  */
89
90#define RELOC_MACROS_GEN_FUNC
91
92#include "elf/aarch64.h"
93#include "elf/alpha.h"
94#include "elf/arc.h"
95#include "elf/arm.h"
96#include "elf/avr.h"
97#include "elf/bfin.h"
98#include "elf/cr16.h"
99#include "elf/cris.h"
100#include "elf/crx.h"
101#include "elf/d10v.h"
102#include "elf/d30v.h"
103#include "elf/dlx.h"
104#include "elf/epiphany.h"
105#include "elf/fr30.h"
106#include "elf/frv.h"
107#include "elf/ft32.h"
108#include "elf/h8.h"
109#include "elf/hppa.h"
110#include "elf/i386.h"
111#include "elf/i370.h"
112#include "elf/i860.h"
113#include "elf/i960.h"
114#include "elf/ia64.h"
115#include "elf/ip2k.h"
116#include "elf/lm32.h"
117#include "elf/iq2000.h"
118#include "elf/m32c.h"
119#include "elf/m32r.h"
120#include "elf/m68k.h"
121#include "elf/m68hc11.h"
122#include "elf/mcore.h"
123#include "elf/mep.h"
124#include "elf/metag.h"
125#include "elf/microblaze.h"
126#include "elf/mips.h"
127#include "elf/riscv.h"
128#include "elf/mmix.h"
129#include "elf/mn10200.h"
130#include "elf/mn10300.h"
131#include "elf/moxie.h"
132#include "elf/mt.h"
133#include "elf/msp430.h"
134#include "elf/nds32.h"
135#include "elf/nios2.h"
136#include "elf/or1k.h"
137#include "elf/pj.h"
138#include "elf/ppc.h"
139#include "elf/ppc64.h"
140#include "elf/rl78.h"
141#include "elf/rx.h"
142#include "elf/s390.h"
143#include "elf/score.h"
144#include "elf/sh.h"
145#include "elf/sparc.h"
146#include "elf/spu.h"
147#include "elf/tic6x.h"
148#include "elf/tilegx.h"
149#include "elf/tilepro.h"
150#include "elf/v850.h"
151#include "elf/vax.h"
152#include "elf/visium.h"
153#include "elf/x86-64.h"
154#include "elf/xc16x.h"
155#include "elf/xgate.h"
156#include "elf/xstormy16.h"
157#include "elf/xtensa.h"
158
159#include "getopt.h"
160#include "libiberty.h"
161#include "safe-ctype.h"
162#include "filenames.h"
163
164#ifndef offsetof
165#define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
166#endif
167
168typedef struct elf_section_list
169{
170  Elf_Internal_Shdr * hdr;
171  struct elf_section_list * next;
172} elf_section_list;
173
174char * program_name = "readelf";
175static unsigned long archive_file_offset;
176static unsigned long archive_file_size;
177static bfd_size_type current_file_size;
178static unsigned long dynamic_addr;
179static bfd_size_type dynamic_size;
180static size_t dynamic_nent;
181static char * dynamic_strings;
182static unsigned long dynamic_strings_length;
183static char * string_table;
184static unsigned long string_table_length;
185static unsigned long num_dynamic_syms;
186static Elf_Internal_Sym * dynamic_symbols;
187static Elf_Internal_Syminfo * dynamic_syminfo;
188static unsigned long dynamic_syminfo_offset;
189static unsigned int dynamic_syminfo_nent;
190static char program_interpreter[PATH_MAX];
191static bfd_vma dynamic_info[DT_ENCODING];
192static bfd_vma dynamic_info_DT_GNU_HASH;
193static bfd_vma version_info[16];
194static Elf_Internal_Ehdr elf_header;
195static Elf_Internal_Shdr * section_headers;
196static Elf_Internal_Phdr * program_headers;
197static Elf_Internal_Dyn *  dynamic_section;
198static elf_section_list * symtab_shndx_list;
199static int show_name;
200static int do_dynamic;
201static int do_syms;
202static int do_dyn_syms;
203static int do_reloc;
204static int do_sections;
205static int do_section_groups;
206static int do_section_details;
207static int do_segments;
208static int do_unwind;
209static int do_using_dynamic;
210static int do_header;
211static int do_dump;
212static int do_version;
213static int do_histogram;
214static int do_debugging;
215static int do_arch;
216static int do_notes;
217static int do_archive_index;
218static int is_32bit_elf;
219static int decompress_dumps;
220
221struct group_list
222{
223  struct group_list * next;
224  unsigned int section_index;
225};
226
227struct group
228{
229  struct group_list * root;
230  unsigned int group_index;
231};
232
233static size_t group_count;
234static struct group * section_groups;
235static struct group ** section_headers_groups;
236
237
238/* Flag bits indicating particular types of dump.  */
239#define HEX_DUMP	(1 << 0)	/* The -x command line switch.  */
240#define DISASS_DUMP	(1 << 1)	/* The -i command line switch.  */
241#define DEBUG_DUMP	(1 << 2)	/* The -w command line switch.  */
242#define STRING_DUMP     (1 << 3)	/* The -p command line switch.  */
243#define RELOC_DUMP      (1 << 4)	/* The -R command line switch.  */
244
245typedef unsigned char dump_type;
246
247/* A linked list of the section names for which dumps were requested.  */
248struct dump_list_entry
249{
250  char * name;
251  dump_type type;
252  struct dump_list_entry * next;
253};
254static struct dump_list_entry * dump_sects_byname;
255
256/* A dynamic array of flags indicating for which sections a dump
257   has been requested via command line switches.  */
258static dump_type *   cmdline_dump_sects = NULL;
259static unsigned int  num_cmdline_dump_sects = 0;
260
261/* A dynamic array of flags indicating for which sections a dump of
262   some kind has been requested.  It is reset on a per-object file
263   basis and then initialised from the cmdline_dump_sects array,
264   the results of interpreting the -w switch, and the
265   dump_sects_byname list.  */
266static dump_type *   dump_sects = NULL;
267static unsigned int  num_dump_sects = 0;
268
269
270/* How to print a vma value.  */
271typedef enum print_mode
272{
273  HEX,
274  DEC,
275  DEC_5,
276  UNSIGNED,
277  PREFIX_HEX,
278  FULL_HEX,
279  LONG_HEX
280}
281print_mode;
282
283/* Versioned symbol info.  */
284enum versioned_symbol_info
285{
286  symbol_undefined,
287  symbol_hidden,
288  symbol_public
289};
290
291static const char *get_symbol_version_string
292  (FILE *file, int is_dynsym, const char *strtab,
293   unsigned long int strtab_size, unsigned int si,
294   Elf_Internal_Sym *psym, enum versioned_symbol_info *sym_info,
295   unsigned short *vna_other);
296
297#define UNKNOWN -1
298
299#define SECTION_NAME(X)						\
300  ((X) == NULL ? _("<none>")					\
301   : string_table == NULL ? _("<no-name>")			\
302   : ((X)->sh_name >= string_table_length ? _("<corrupt>")	\
303  : string_table + (X)->sh_name))
304
305#define DT_VERSIONTAGIDX(tag)	(DT_VERNEEDNUM - (tag))	/* Reverse order!  */
306
307#define GET_ELF_SYMBOLS(file, section, sym_count)			\
308  (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count)	\
309   : get_64bit_elf_symbols (file, section, sym_count))
310
311#define VALID_DYNAMIC_NAME(offset)	((dynamic_strings != NULL) && (offset < dynamic_strings_length))
312/* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
313   already been called and verified that the string exists.  */
314#define GET_DYNAMIC_NAME(offset)	(dynamic_strings + offset)
315
316#define REMOVE_ARCH_BITS(ADDR)			\
317  do						\
318    {						\
319      if (elf_header.e_machine == EM_ARM)	\
320	(ADDR) &= ~1;				\
321    }						\
322  while (0)
323
324/* Retrieve NMEMB structures, each SIZE bytes long from FILE starting at OFFSET +
325   the offset of the current archive member, if we are examining an archive.
326   Put the retrieved data into VAR, if it is not NULL.  Otherwise allocate a buffer
327   using malloc and fill that.  In either case return the pointer to the start of
328   the retrieved data or NULL if something went wrong.  If something does go wrong
329   and REASON is not NULL then emit an error message using REASON as part of the
330   context.  */
331
332static void *
333get_data (void * var, FILE * file, unsigned long offset, bfd_size_type size,
334	  bfd_size_type nmemb, const char * reason)
335{
336  void * mvar;
337  bfd_size_type amt = size * nmemb;
338
339  if (size == 0 || nmemb == 0)
340    return NULL;
341
342  /* If the size_t type is smaller than the bfd_size_type, eg because
343     you are building a 32-bit tool on a 64-bit host, then make sure
344     that when the sizes are cast to (size_t) no information is lost.  */
345  if (sizeof (size_t) < sizeof (bfd_size_type)
346      && (   (bfd_size_type) ((size_t) size) != size
347	  || (bfd_size_type) ((size_t) nmemb) != nmemb))
348    {
349      if (reason)
350	error (_("Size truncation prevents reading 0x%" BFD_VMA_FMT "x"
351		 " elements of size 0x%" BFD_VMA_FMT "x for %s\n"),
352	       nmemb, size, reason);
353      return NULL;
354    }
355
356  /* Check for size overflow.  */
357  if (amt < nmemb)
358    {
359      if (reason)
360	error (_("Size overflow prevents reading 0x%" BFD_VMA_FMT "x"
361		 " elements of size 0x%" BFD_VMA_FMT "x for %s\n"),
362	       nmemb, size, reason);
363      return NULL;
364    }
365
366  /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
367     attempting to allocate memory when the read is bound to fail.  */
368  if (amt > current_file_size
369      || offset + archive_file_offset + amt > current_file_size)
370    {
371      if (reason)
372	error (_("Reading 0x%" BFD_VMA_FMT "x"
373		 " bytes extends past end of file for %s\n"),
374	       amt, reason);
375      return NULL;
376    }
377
378  if (fseek (file, archive_file_offset + offset, SEEK_SET))
379    {
380      if (reason)
381	error (_("Unable to seek to 0x%lx for %s\n"),
382	       archive_file_offset + offset, reason);
383      return NULL;
384    }
385
386  mvar = var;
387  if (mvar == NULL)
388    {
389      /* Check for overflow.  */
390      if (nmemb < (~(bfd_size_type) 0 - 1) / size)
391	/* + 1 so that we can '\0' terminate invalid string table sections.  */
392	mvar = malloc ((size_t) amt + 1);
393
394      if (mvar == NULL)
395	{
396	  if (reason)
397	    error (_("Out of memory allocating 0x%" BFD_VMA_FMT "x"
398		     " bytes for %s\n"),
399		   amt, reason);
400	  return NULL;
401	}
402
403      ((char *) mvar)[amt] = '\0';
404    }
405
406  if (fread (mvar, (size_t) size, (size_t) nmemb, file) != nmemb)
407    {
408      if (reason)
409	error (_("Unable to read in 0x%" BFD_VMA_FMT "x bytes of %s\n"),
410	       amt, reason);
411      if (mvar != var)
412	free (mvar);
413      return NULL;
414    }
415
416  return mvar;
417}
418
419/* Print a VMA value.  */
420
421static int
422print_vma (bfd_vma vma, print_mode mode)
423{
424  int nc = 0;
425
426  switch (mode)
427    {
428    case FULL_HEX:
429      nc = printf ("0x");
430      /* Fall through.  */
431
432    case LONG_HEX:
433#ifdef BFD64
434      if (is_32bit_elf)
435	return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
436#endif
437      printf_vma (vma);
438      return nc + 16;
439
440    case DEC_5:
441      if (vma <= 99999)
442	return printf ("%5" BFD_VMA_FMT "d", vma);
443      /* Fall through.  */
444
445    case PREFIX_HEX:
446      nc = printf ("0x");
447      /* Fall through.  */
448
449    case HEX:
450      return nc + printf ("%" BFD_VMA_FMT "x", vma);
451
452    case DEC:
453      return printf ("%" BFD_VMA_FMT "d", vma);
454
455    case UNSIGNED:
456      return printf ("%" BFD_VMA_FMT "u", vma);
457    }
458  return 0;
459}
460
461/* Display a symbol on stdout.  Handles the display of control characters and
462   multibye characters (assuming the host environment supports them).
463
464   Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
465
466   If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
467   padding as necessary.
468
469   Returns the number of emitted characters.  */
470
471static unsigned int
472print_symbol (int width, const char *symbol)
473{
474  bfd_boolean extra_padding = FALSE;
475  int num_printed = 0;
476#ifdef HAVE_MBSTATE_T
477  mbstate_t state;
478#endif
479  int width_remaining;
480
481  if (width < 0)
482    {
483      /* Keep the width positive.  This also helps.  */
484      width = - width;
485      extra_padding = TRUE;
486    }
487  assert (width != 0);
488
489  if (do_wide)
490    /* Set the remaining width to a very large value.
491       This simplifies the code below.  */
492    width_remaining = INT_MAX;
493  else
494    width_remaining = width;
495
496#ifdef HAVE_MBSTATE_T
497  /* Initialise the multibyte conversion state.  */
498  memset (& state, 0, sizeof (state));
499#endif
500
501  while (width_remaining)
502    {
503      size_t  n;
504      const char c = *symbol++;
505
506      if (c == 0)
507	break;
508
509      /* Do not print control characters directly as they can affect terminal
510	 settings.  Such characters usually appear in the names generated
511	 by the assembler for local labels.  */
512      if (ISCNTRL (c))
513	{
514	  if (width_remaining < 2)
515	    break;
516
517	  printf ("^%c", c + 0x40);
518	  width_remaining -= 2;
519	  num_printed += 2;
520	}
521      else if (ISPRINT (c))
522	{
523	  putchar (c);
524	  width_remaining --;
525	  num_printed ++;
526	}
527      else
528	{
529#ifdef HAVE_MBSTATE_T
530	  wchar_t w;
531#endif
532	  /* Let printf do the hard work of displaying multibyte characters.  */
533	  printf ("%.1s", symbol - 1);
534	  width_remaining --;
535	  num_printed ++;
536
537#ifdef HAVE_MBSTATE_T
538	  /* Try to find out how many bytes made up the character that was
539	     just printed.  Advance the symbol pointer past the bytes that
540	     were displayed.  */
541	  n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
542#else
543	  n = 1;
544#endif
545	  if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
546	    symbol += (n - 1);
547	}
548    }
549
550  if (extra_padding && num_printed < width)
551    {
552      /* Fill in the remaining spaces.  */
553      printf ("%-*s", width - num_printed, " ");
554      num_printed = width;
555    }
556
557  return num_printed;
558}
559
560/* Returns a pointer to a static buffer containing a printable version of
561   the given section's name.  Like print_symbol, except that it does not try
562   to print multibyte characters, it just interprets them as hex values.  */
563
564static const char *
565printable_section_name (const Elf_Internal_Shdr * sec)
566{
567#define MAX_PRINT_SEC_NAME_LEN 128
568  static char  sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
569  const char * name = SECTION_NAME (sec);
570  char *       buf = sec_name_buf;
571  char         c;
572  unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
573
574  while ((c = * name ++) != 0)
575    {
576      if (ISCNTRL (c))
577	{
578	  if (remaining < 2)
579	    break;
580
581	  * buf ++ = '^';
582	  * buf ++ = c + 0x40;
583	  remaining -= 2;
584	}
585      else if (ISPRINT (c))
586	{
587	  * buf ++ = c;
588	  remaining -= 1;
589	}
590      else
591	{
592	  static char hex[17] = "0123456789ABCDEF";
593
594	  if (remaining < 4)
595	    break;
596	  * buf ++ = '<';
597	  * buf ++ = hex[(c & 0xf0) >> 4];
598	  * buf ++ = hex[c & 0x0f];
599	  * buf ++ = '>';
600	  remaining -= 4;
601	}
602
603      if (remaining == 0)
604	break;
605    }
606
607  * buf = 0;
608  return sec_name_buf;
609}
610
611static const char *
612printable_section_name_from_index (unsigned long ndx)
613{
614  if (ndx >= elf_header.e_shnum)
615    return _("<corrupt>");
616
617  return printable_section_name (section_headers + ndx);
618}
619
620/* Return a pointer to section NAME, or NULL if no such section exists.  */
621
622static Elf_Internal_Shdr *
623find_section (const char * name)
624{
625  unsigned int i;
626
627  for (i = 0; i < elf_header.e_shnum; i++)
628    if (streq (SECTION_NAME (section_headers + i), name))
629      return section_headers + i;
630
631  return NULL;
632}
633
634/* Return a pointer to a section containing ADDR, or NULL if no such
635   section exists.  */
636
637static Elf_Internal_Shdr *
638find_section_by_address (bfd_vma addr)
639{
640  unsigned int i;
641
642  for (i = 0; i < elf_header.e_shnum; i++)
643    {
644      Elf_Internal_Shdr *sec = section_headers + i;
645      if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
646	return sec;
647    }
648
649  return NULL;
650}
651
652static Elf_Internal_Shdr *
653find_section_by_type (unsigned int type)
654{
655  unsigned int i;
656
657  for (i = 0; i < elf_header.e_shnum; i++)
658    {
659      Elf_Internal_Shdr *sec = section_headers + i;
660      if (sec->sh_type == type)
661	return sec;
662    }
663
664  return NULL;
665}
666
667/* Return a pointer to section NAME, or NULL if no such section exists,
668   restricted to the list of sections given in SET.  */
669
670static Elf_Internal_Shdr *
671find_section_in_set (const char * name, unsigned int * set)
672{
673  unsigned int i;
674
675  if (set != NULL)
676    {
677      while ((i = *set++) > 0)
678	if (streq (SECTION_NAME (section_headers + i), name))
679	  return section_headers + i;
680    }
681
682  return find_section (name);
683}
684
685/* Read an unsigned LEB128 encoded value from p.  Set *PLEN to the number of
686   bytes read.  */
687
688static inline unsigned long
689read_uleb128 (unsigned char *data,
690	      unsigned int *length_return,
691	      const unsigned char * const end)
692{
693  return read_leb128 (data, length_return, FALSE, end);
694}
695
696/* Return true if the current file is for IA-64 machine and OpenVMS ABI.
697   This OS has so many departures from the ELF standard that we test it at
698   many places.  */
699
700static inline int
701is_ia64_vms (void)
702{
703  return elf_header.e_machine == EM_IA_64
704    && elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
705}
706
707/* Guess the relocation size commonly used by the specific machines.  */
708
709static int
710guess_is_rela (unsigned int e_machine)
711{
712  switch (e_machine)
713    {
714      /* Targets that use REL relocations.  */
715    case EM_386:
716    case EM_IAMCU:
717    case EM_960:
718    case EM_ARM:
719    case EM_D10V:
720    case EM_CYGNUS_D10V:
721    case EM_DLX:
722    case EM_MIPS:
723    case EM_MIPS_RS3_LE:
724    case EM_CYGNUS_M32R:
725    case EM_SCORE:
726    case EM_XGATE:
727      return FALSE;
728
729      /* Targets that use RELA relocations.  */
730    case EM_68K:
731    case EM_860:
732    case EM_AARCH64:
733    case EM_ADAPTEVA_EPIPHANY:
734    case EM_ALPHA:
735    case EM_ALTERA_NIOS2:
736    case EM_ARC:
737    case EM_ARC_COMPACT:
738    case EM_ARC_COMPACT2:
739    case EM_AVR:
740    case EM_AVR_OLD:
741    case EM_BLACKFIN:
742    case EM_CR16:
743    case EM_CRIS:
744    case EM_CRX:
745    case EM_D30V:
746    case EM_CYGNUS_D30V:
747    case EM_FR30:
748    case EM_FT32:
749    case EM_CYGNUS_FR30:
750    case EM_CYGNUS_FRV:
751    case EM_H8S:
752    case EM_H8_300:
753    case EM_H8_300H:
754    case EM_IA_64:
755    case EM_IP2K:
756    case EM_IP2K_OLD:
757    case EM_IQ2000:
758    case EM_LATTICEMICO32:
759    case EM_M32C_OLD:
760    case EM_M32C:
761    case EM_M32R:
762    case EM_MCORE:
763    case EM_CYGNUS_MEP:
764    case EM_METAG:
765    case EM_MMIX:
766    case EM_MN10200:
767    case EM_CYGNUS_MN10200:
768    case EM_MN10300:
769    case EM_CYGNUS_MN10300:
770    case EM_MOXIE:
771    case EM_MSP430:
772    case EM_MSP430_OLD:
773    case EM_MT:
774    case EM_NDS32:
775    case EM_NIOS32:
776    case EM_OR1K:
777    case EM_PPC64:
778    case EM_PPC:
779    case EM_RISCV:
780    case EM_RL78:
781    case EM_RX:
782    case EM_S390:
783    case EM_S390_OLD:
784    case EM_SH:
785    case EM_SPARC:
786    case EM_SPARC32PLUS:
787    case EM_SPARCV9:
788    case EM_SPU:
789    case EM_TI_C6000:
790    case EM_TILEGX:
791    case EM_TILEPRO:
792    case EM_V800:
793    case EM_V850:
794    case EM_CYGNUS_V850:
795    case EM_VAX:
796    case EM_VISIUM:
797    case EM_X86_64:
798    case EM_L1OM:
799    case EM_K1OM:
800    case EM_XSTORMY16:
801    case EM_XTENSA:
802    case EM_XTENSA_OLD:
803    case EM_MICROBLAZE:
804    case EM_MICROBLAZE_OLD:
805      return TRUE;
806
807    case EM_68HC05:
808    case EM_68HC08:
809    case EM_68HC11:
810    case EM_68HC16:
811    case EM_FX66:
812    case EM_ME16:
813    case EM_MMA:
814    case EM_NCPU:
815    case EM_NDR1:
816    case EM_PCP:
817    case EM_ST100:
818    case EM_ST19:
819    case EM_ST7:
820    case EM_ST9PLUS:
821    case EM_STARCORE:
822    case EM_SVX:
823    case EM_TINYJ:
824    default:
825      warn (_("Don't know about relocations on this machine architecture\n"));
826      return FALSE;
827    }
828}
829
830static int
831slurp_rela_relocs (FILE * file,
832		   unsigned long rel_offset,
833		   unsigned long rel_size,
834		   Elf_Internal_Rela ** relasp,
835		   unsigned long * nrelasp)
836{
837  Elf_Internal_Rela * relas;
838  size_t nrelas;
839  unsigned int i;
840
841  if (is_32bit_elf)
842    {
843      Elf32_External_Rela * erelas;
844
845      erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset, 1,
846                                                 rel_size, _("32-bit relocation data"));
847      if (!erelas)
848	return 0;
849
850      nrelas = rel_size / sizeof (Elf32_External_Rela);
851
852      relas = (Elf_Internal_Rela *) cmalloc (nrelas,
853                                             sizeof (Elf_Internal_Rela));
854
855      if (relas == NULL)
856	{
857	  free (erelas);
858	  error (_("out of memory parsing relocs\n"));
859	  return 0;
860	}
861
862      for (i = 0; i < nrelas; i++)
863	{
864	  relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
865	  relas[i].r_info   = BYTE_GET (erelas[i].r_info);
866	  relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
867	}
868
869      free (erelas);
870    }
871  else
872    {
873      Elf64_External_Rela * erelas;
874
875      erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset, 1,
876                                                 rel_size, _("64-bit relocation data"));
877      if (!erelas)
878	return 0;
879
880      nrelas = rel_size / sizeof (Elf64_External_Rela);
881
882      relas = (Elf_Internal_Rela *) cmalloc (nrelas,
883                                             sizeof (Elf_Internal_Rela));
884
885      if (relas == NULL)
886	{
887	  free (erelas);
888	  error (_("out of memory parsing relocs\n"));
889	  return 0;
890	}
891
892      for (i = 0; i < nrelas; i++)
893	{
894	  relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
895	  relas[i].r_info   = BYTE_GET (erelas[i].r_info);
896	  relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
897
898	  /* The #ifdef BFD64 below is to prevent a compile time
899	     warning.  We know that if we do not have a 64 bit data
900	     type that we will never execute this code anyway.  */
901#ifdef BFD64
902	  if (elf_header.e_machine == EM_MIPS
903	      && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
904	    {
905	      /* In little-endian objects, r_info isn't really a
906		 64-bit little-endian value: it has a 32-bit
907		 little-endian symbol index followed by four
908		 individual byte fields.  Reorder INFO
909		 accordingly.  */
910	      bfd_vma inf = relas[i].r_info;
911	      inf = (((inf & 0xffffffff) << 32)
912		      | ((inf >> 56) & 0xff)
913		      | ((inf >> 40) & 0xff00)
914		      | ((inf >> 24) & 0xff0000)
915		      | ((inf >> 8) & 0xff000000));
916	      relas[i].r_info = inf;
917	    }
918#endif /* BFD64 */
919	}
920
921      free (erelas);
922    }
923  *relasp = relas;
924  *nrelasp = nrelas;
925  return 1;
926}
927
928static int
929slurp_rel_relocs (FILE * file,
930		  unsigned long rel_offset,
931		  unsigned long rel_size,
932		  Elf_Internal_Rela ** relsp,
933		  unsigned long * nrelsp)
934{
935  Elf_Internal_Rela * rels;
936  size_t nrels;
937  unsigned int i;
938
939  if (is_32bit_elf)
940    {
941      Elf32_External_Rel * erels;
942
943      erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset, 1,
944                                               rel_size, _("32-bit relocation data"));
945      if (!erels)
946	return 0;
947
948      nrels = rel_size / sizeof (Elf32_External_Rel);
949
950      rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
951
952      if (rels == NULL)
953	{
954	  free (erels);
955	  error (_("out of memory parsing relocs\n"));
956	  return 0;
957	}
958
959      for (i = 0; i < nrels; i++)
960	{
961	  rels[i].r_offset = BYTE_GET (erels[i].r_offset);
962	  rels[i].r_info   = BYTE_GET (erels[i].r_info);
963	  rels[i].r_addend = 0;
964	}
965
966      free (erels);
967    }
968  else
969    {
970      Elf64_External_Rel * erels;
971
972      erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset, 1,
973                                               rel_size, _("64-bit relocation data"));
974      if (!erels)
975	return 0;
976
977      nrels = rel_size / sizeof (Elf64_External_Rel);
978
979      rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
980
981      if (rels == NULL)
982	{
983	  free (erels);
984	  error (_("out of memory parsing relocs\n"));
985	  return 0;
986	}
987
988      for (i = 0; i < nrels; i++)
989	{
990	  rels[i].r_offset = BYTE_GET (erels[i].r_offset);
991	  rels[i].r_info   = BYTE_GET (erels[i].r_info);
992	  rels[i].r_addend = 0;
993
994	  /* The #ifdef BFD64 below is to prevent a compile time
995	     warning.  We know that if we do not have a 64 bit data
996	     type that we will never execute this code anyway.  */
997#ifdef BFD64
998	  if (elf_header.e_machine == EM_MIPS
999	      && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
1000	    {
1001	      /* In little-endian objects, r_info isn't really a
1002		 64-bit little-endian value: it has a 32-bit
1003		 little-endian symbol index followed by four
1004		 individual byte fields.  Reorder INFO
1005		 accordingly.  */
1006	      bfd_vma inf = rels[i].r_info;
1007	      inf = (((inf & 0xffffffff) << 32)
1008		     | ((inf >> 56) & 0xff)
1009		     | ((inf >> 40) & 0xff00)
1010		     | ((inf >> 24) & 0xff0000)
1011		     | ((inf >> 8) & 0xff000000));
1012	      rels[i].r_info = inf;
1013	    }
1014#endif /* BFD64 */
1015	}
1016
1017      free (erels);
1018    }
1019  *relsp = rels;
1020  *nrelsp = nrels;
1021  return 1;
1022}
1023
1024/* Returns the reloc type extracted from the reloc info field.  */
1025
1026static unsigned int
1027get_reloc_type (bfd_vma reloc_info)
1028{
1029  if (is_32bit_elf)
1030    return ELF32_R_TYPE (reloc_info);
1031
1032  switch (elf_header.e_machine)
1033    {
1034    case EM_MIPS:
1035      /* Note: We assume that reloc_info has already been adjusted for us.  */
1036      return ELF64_MIPS_R_TYPE (reloc_info);
1037
1038    case EM_SPARCV9:
1039      return ELF64_R_TYPE_ID (reloc_info);
1040
1041    default:
1042      return ELF64_R_TYPE (reloc_info);
1043    }
1044}
1045
1046/* Return the symbol index extracted from the reloc info field.  */
1047
1048static bfd_vma
1049get_reloc_symindex (bfd_vma reloc_info)
1050{
1051  return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
1052}
1053
1054static inline bfd_boolean
1055uses_msp430x_relocs (void)
1056{
1057  return
1058    elf_header.e_machine == EM_MSP430 /* Paranoia.  */
1059    /* GCC uses osabi == ELFOSBI_STANDALONE.  */
1060    && (((elf_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
1061	/* TI compiler uses ELFOSABI_NONE.  */
1062	|| (elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
1063}
1064
1065/* Display the contents of the relocation data found at the specified
1066   offset.  */
1067
1068static void
1069dump_relocations (FILE * file,
1070		  unsigned long rel_offset,
1071		  unsigned long rel_size,
1072		  Elf_Internal_Sym * symtab,
1073		  unsigned long nsyms,
1074		  char * strtab,
1075		  unsigned long strtablen,
1076		  int is_rela,
1077		  int is_dynsym)
1078{
1079  unsigned int i;
1080  Elf_Internal_Rela * rels;
1081
1082  if (is_rela == UNKNOWN)
1083    is_rela = guess_is_rela (elf_header.e_machine);
1084
1085  if (is_rela)
1086    {
1087      if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
1088	return;
1089    }
1090  else
1091    {
1092      if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
1093	return;
1094    }
1095
1096  if (is_32bit_elf)
1097    {
1098      if (is_rela)
1099	{
1100	  if (do_wide)
1101	    printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name + Addend\n"));
1102	  else
1103	    printf (_(" Offset     Info    Type            Sym.Value  Sym. Name + Addend\n"));
1104	}
1105      else
1106	{
1107	  if (do_wide)
1108	    printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name\n"));
1109	  else
1110	    printf (_(" Offset     Info    Type            Sym.Value  Sym. Name\n"));
1111	}
1112    }
1113  else
1114    {
1115      if (is_rela)
1116	{
1117	  if (do_wide)
1118	    printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name + Addend\n"));
1119	  else
1120	    printf (_("  Offset          Info           Type           Sym. Value    Sym. Name + Addend\n"));
1121	}
1122      else
1123	{
1124	  if (do_wide)
1125	    printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name\n"));
1126	  else
1127	    printf (_("  Offset          Info           Type           Sym. Value    Sym. Name\n"));
1128	}
1129    }
1130
1131  for (i = 0; i < rel_size; i++)
1132    {
1133      const char * rtype;
1134      bfd_vma offset;
1135      bfd_vma inf;
1136      bfd_vma symtab_index;
1137      bfd_vma type;
1138
1139      offset = rels[i].r_offset;
1140      inf    = rels[i].r_info;
1141
1142      type = get_reloc_type (inf);
1143      symtab_index = get_reloc_symindex  (inf);
1144
1145      if (is_32bit_elf)
1146	{
1147	  printf ("%8.8lx  %8.8lx ",
1148		  (unsigned long) offset & 0xffffffff,
1149		  (unsigned long) inf & 0xffffffff);
1150	}
1151      else
1152	{
1153#if BFD_HOST_64BIT_LONG
1154	  printf (do_wide
1155		  ? "%16.16lx  %16.16lx "
1156		  : "%12.12lx  %12.12lx ",
1157		  offset, inf);
1158#elif BFD_HOST_64BIT_LONG_LONG
1159#ifndef __MSVCRT__
1160	  printf (do_wide
1161		  ? "%16.16llx  %16.16llx "
1162		  : "%12.12llx  %12.12llx ",
1163		  offset, inf);
1164#else
1165	  printf (do_wide
1166		  ? "%16.16I64x  %16.16I64x "
1167		  : "%12.12I64x  %12.12I64x ",
1168		  offset, inf);
1169#endif
1170#else
1171	  printf (do_wide
1172		  ? "%8.8lx%8.8lx  %8.8lx%8.8lx "
1173		  : "%4.4lx%8.8lx  %4.4lx%8.8lx ",
1174		  _bfd_int64_high (offset),
1175		  _bfd_int64_low (offset),
1176		  _bfd_int64_high (inf),
1177		  _bfd_int64_low (inf));
1178#endif
1179	}
1180
1181      switch (elf_header.e_machine)
1182	{
1183	default:
1184	  rtype = NULL;
1185	  break;
1186
1187	case EM_AARCH64:
1188	  rtype = elf_aarch64_reloc_type (type);
1189	  break;
1190
1191	case EM_M32R:
1192	case EM_CYGNUS_M32R:
1193	  rtype = elf_m32r_reloc_type (type);
1194	  break;
1195
1196	case EM_386:
1197	case EM_IAMCU:
1198	  rtype = elf_i386_reloc_type (type);
1199	  break;
1200
1201	case EM_68HC11:
1202	case EM_68HC12:
1203	  rtype = elf_m68hc11_reloc_type (type);
1204	  break;
1205
1206	case EM_68K:
1207	  rtype = elf_m68k_reloc_type (type);
1208	  break;
1209
1210	case EM_960:
1211	  rtype = elf_i960_reloc_type (type);
1212	  break;
1213
1214	case EM_AVR:
1215	case EM_AVR_OLD:
1216	  rtype = elf_avr_reloc_type (type);
1217	  break;
1218
1219	case EM_OLD_SPARCV9:
1220	case EM_SPARC32PLUS:
1221	case EM_SPARCV9:
1222	case EM_SPARC:
1223	  rtype = elf_sparc_reloc_type (type);
1224	  break;
1225
1226	case EM_SPU:
1227	  rtype = elf_spu_reloc_type (type);
1228	  break;
1229
1230	case EM_V800:
1231	  rtype = v800_reloc_type (type);
1232	  break;
1233	case EM_V850:
1234	case EM_CYGNUS_V850:
1235	  rtype = v850_reloc_type (type);
1236	  break;
1237
1238	case EM_D10V:
1239	case EM_CYGNUS_D10V:
1240	  rtype = elf_d10v_reloc_type (type);
1241	  break;
1242
1243	case EM_D30V:
1244	case EM_CYGNUS_D30V:
1245	  rtype = elf_d30v_reloc_type (type);
1246	  break;
1247
1248	case EM_DLX:
1249	  rtype = elf_dlx_reloc_type (type);
1250	  break;
1251
1252	case EM_SH:
1253	  rtype = elf_sh_reloc_type (type);
1254	  break;
1255
1256	case EM_MN10300:
1257	case EM_CYGNUS_MN10300:
1258	  rtype = elf_mn10300_reloc_type (type);
1259	  break;
1260
1261	case EM_MN10200:
1262	case EM_CYGNUS_MN10200:
1263	  rtype = elf_mn10200_reloc_type (type);
1264	  break;
1265
1266	case EM_FR30:
1267	case EM_CYGNUS_FR30:
1268	  rtype = elf_fr30_reloc_type (type);
1269	  break;
1270
1271	case EM_CYGNUS_FRV:
1272	  rtype = elf_frv_reloc_type (type);
1273	  break;
1274
1275	case EM_FT32:
1276	  rtype = elf_ft32_reloc_type (type);
1277	  break;
1278
1279	case EM_MCORE:
1280	  rtype = elf_mcore_reloc_type (type);
1281	  break;
1282
1283	case EM_MMIX:
1284	  rtype = elf_mmix_reloc_type (type);
1285	  break;
1286
1287	case EM_MOXIE:
1288	  rtype = elf_moxie_reloc_type (type);
1289	  break;
1290
1291	case EM_MSP430:
1292	  if (uses_msp430x_relocs ())
1293	    {
1294	      rtype = elf_msp430x_reloc_type (type);
1295	      break;
1296	    }
1297	  /* Fall through.  */
1298	case EM_MSP430_OLD:
1299	  rtype = elf_msp430_reloc_type (type);
1300	  break;
1301
1302	case EM_NDS32:
1303	  rtype = elf_nds32_reloc_type (type);
1304	  break;
1305
1306	case EM_PPC:
1307	  rtype = elf_ppc_reloc_type (type);
1308	  break;
1309
1310	case EM_PPC64:
1311	  rtype = elf_ppc64_reloc_type (type);
1312	  break;
1313
1314	case EM_MIPS:
1315	case EM_MIPS_RS3_LE:
1316	  rtype = elf_mips_reloc_type (type);
1317	  break;
1318
1319	case EM_RISCV:
1320	  rtype = elf_riscv_reloc_type (type);
1321	  break;
1322
1323	case EM_ALPHA:
1324	  rtype = elf_alpha_reloc_type (type);
1325	  break;
1326
1327	case EM_ARM:
1328	  rtype = elf_arm_reloc_type (type);
1329	  break;
1330
1331	case EM_ARC:
1332	case EM_ARC_COMPACT:
1333	case EM_ARC_COMPACT2:
1334	  rtype = elf_arc_reloc_type (type);
1335	  break;
1336
1337	case EM_PARISC:
1338	  rtype = elf_hppa_reloc_type (type);
1339	  break;
1340
1341	case EM_H8_300:
1342	case EM_H8_300H:
1343	case EM_H8S:
1344	  rtype = elf_h8_reloc_type (type);
1345	  break;
1346
1347	case EM_OR1K:
1348	  rtype = elf_or1k_reloc_type (type);
1349	  break;
1350
1351	case EM_PJ:
1352	case EM_PJ_OLD:
1353	  rtype = elf_pj_reloc_type (type);
1354	  break;
1355	case EM_IA_64:
1356	  rtype = elf_ia64_reloc_type (type);
1357	  break;
1358
1359	case EM_CRIS:
1360	  rtype = elf_cris_reloc_type (type);
1361	  break;
1362
1363	case EM_860:
1364	  rtype = elf_i860_reloc_type (type);
1365	  break;
1366
1367	case EM_X86_64:
1368	case EM_L1OM:
1369	case EM_K1OM:
1370	  rtype = elf_x86_64_reloc_type (type);
1371	  break;
1372
1373	case EM_S370:
1374	  rtype = i370_reloc_type (type);
1375	  break;
1376
1377	case EM_S390_OLD:
1378	case EM_S390:
1379	  rtype = elf_s390_reloc_type (type);
1380	  break;
1381
1382	case EM_SCORE:
1383	  rtype = elf_score_reloc_type (type);
1384	  break;
1385
1386	case EM_XSTORMY16:
1387	  rtype = elf_xstormy16_reloc_type (type);
1388	  break;
1389
1390	case EM_CRX:
1391	  rtype = elf_crx_reloc_type (type);
1392	  break;
1393
1394	case EM_VAX:
1395	  rtype = elf_vax_reloc_type (type);
1396	  break;
1397
1398	case EM_VISIUM:
1399	  rtype = elf_visium_reloc_type (type);
1400	  break;
1401
1402	case EM_ADAPTEVA_EPIPHANY:
1403	  rtype = elf_epiphany_reloc_type (type);
1404	  break;
1405
1406	case EM_IP2K:
1407	case EM_IP2K_OLD:
1408	  rtype = elf_ip2k_reloc_type (type);
1409	  break;
1410
1411	case EM_IQ2000:
1412	  rtype = elf_iq2000_reloc_type (type);
1413	  break;
1414
1415	case EM_XTENSA_OLD:
1416	case EM_XTENSA:
1417	  rtype = elf_xtensa_reloc_type (type);
1418	  break;
1419
1420	case EM_LATTICEMICO32:
1421	  rtype = elf_lm32_reloc_type (type);
1422	  break;
1423
1424	case EM_M32C_OLD:
1425	case EM_M32C:
1426	  rtype = elf_m32c_reloc_type (type);
1427	  break;
1428
1429	case EM_MT:
1430	  rtype = elf_mt_reloc_type (type);
1431	  break;
1432
1433	case EM_BLACKFIN:
1434	  rtype = elf_bfin_reloc_type (type);
1435	  break;
1436
1437	case EM_CYGNUS_MEP:
1438	  rtype = elf_mep_reloc_type (type);
1439	  break;
1440
1441	case EM_CR16:
1442	  rtype = elf_cr16_reloc_type (type);
1443	  break;
1444
1445	case EM_MICROBLAZE:
1446	case EM_MICROBLAZE_OLD:
1447	  rtype = elf_microblaze_reloc_type (type);
1448	  break;
1449
1450	case EM_RL78:
1451	  rtype = elf_rl78_reloc_type (type);
1452	  break;
1453
1454	case EM_RX:
1455	  rtype = elf_rx_reloc_type (type);
1456	  break;
1457
1458	case EM_METAG:
1459	  rtype = elf_metag_reloc_type (type);
1460	  break;
1461
1462	case EM_XC16X:
1463	case EM_C166:
1464	  rtype = elf_xc16x_reloc_type (type);
1465	  break;
1466
1467	case EM_TI_C6000:
1468	  rtype = elf_tic6x_reloc_type (type);
1469	  break;
1470
1471	case EM_TILEGX:
1472	  rtype = elf_tilegx_reloc_type (type);
1473	  break;
1474
1475	case EM_TILEPRO:
1476	  rtype = elf_tilepro_reloc_type (type);
1477	  break;
1478
1479	case EM_XGATE:
1480	  rtype = elf_xgate_reloc_type (type);
1481	  break;
1482
1483	case EM_ALTERA_NIOS2:
1484	  rtype = elf_nios2_reloc_type (type);
1485	  break;
1486	}
1487
1488      if (rtype == NULL)
1489	printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1490      else
1491	printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
1492
1493      if (elf_header.e_machine == EM_ALPHA
1494	  && rtype != NULL
1495	  && streq (rtype, "R_ALPHA_LITUSE")
1496	  && is_rela)
1497	{
1498	  switch (rels[i].r_addend)
1499	    {
1500	    case LITUSE_ALPHA_ADDR:   rtype = "ADDR";   break;
1501	    case LITUSE_ALPHA_BASE:   rtype = "BASE";   break;
1502	    case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1503	    case LITUSE_ALPHA_JSR:    rtype = "JSR";    break;
1504	    case LITUSE_ALPHA_TLSGD:  rtype = "TLSGD";  break;
1505	    case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1506	    case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1507	    default: rtype = NULL;
1508	    }
1509	  if (rtype)
1510	    printf (" (%s)", rtype);
1511	  else
1512	    {
1513	      putchar (' ');
1514	      printf (_("<unknown addend: %lx>"),
1515		      (unsigned long) rels[i].r_addend);
1516	    }
1517	}
1518      else if (symtab_index)
1519	{
1520	  if (symtab == NULL || symtab_index >= nsyms)
1521	    printf (_(" bad symbol index: %08lx"), (unsigned long) symtab_index);
1522	  else
1523	    {
1524	      Elf_Internal_Sym * psym;
1525	      const char * version_string;
1526	      enum versioned_symbol_info sym_info;
1527	      unsigned short vna_other;
1528
1529	      psym = symtab + symtab_index;
1530
1531	      version_string
1532		= get_symbol_version_string (file, is_dynsym,
1533					     strtab, strtablen,
1534					     symtab_index,
1535					     psym,
1536					     &sym_info,
1537					     &vna_other);
1538
1539	      printf (" ");
1540
1541	      if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1542		{
1543		  const char * name;
1544		  unsigned int len;
1545		  unsigned int width = is_32bit_elf ? 8 : 14;
1546
1547		  /* Relocations against GNU_IFUNC symbols do not use the value
1548		     of the symbol as the address to relocate against.  Instead
1549		     they invoke the function named by the symbol and use its
1550		     result as the address for relocation.
1551
1552		     To indicate this to the user, do not display the value of
1553		     the symbol in the "Symbols's Value" field.  Instead show
1554		     its name followed by () as a hint that the symbol is
1555		     invoked.  */
1556
1557		  if (strtab == NULL
1558		      || psym->st_name == 0
1559		      || psym->st_name >= strtablen)
1560		    name = "??";
1561		  else
1562		    name = strtab + psym->st_name;
1563
1564		  len = print_symbol (width, name);
1565		  if (version_string)
1566		    printf (sym_info == symbol_public ? "@@%s" : "@%s",
1567			    version_string);
1568		  printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1569		}
1570	      else
1571		{
1572		  print_vma (psym->st_value, LONG_HEX);
1573
1574		  printf (is_32bit_elf ? "   " : " ");
1575		}
1576
1577	      if (psym->st_name == 0)
1578		{
1579		  const char * sec_name = "<null>";
1580		  char name_buf[40];
1581
1582		  if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1583		    {
1584		      if (psym->st_shndx < elf_header.e_shnum)
1585			sec_name = SECTION_NAME (section_headers + psym->st_shndx);
1586		      else if (psym->st_shndx == SHN_ABS)
1587			sec_name = "ABS";
1588		      else if (psym->st_shndx == SHN_COMMON)
1589			sec_name = "COMMON";
1590		      else if ((elf_header.e_machine == EM_MIPS
1591				&& psym->st_shndx == SHN_MIPS_SCOMMON)
1592			       || (elf_header.e_machine == EM_TI_C6000
1593				   && psym->st_shndx == SHN_TIC6X_SCOMMON))
1594			sec_name = "SCOMMON";
1595		      else if (elf_header.e_machine == EM_MIPS
1596			       && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1597			sec_name = "SUNDEF";
1598		      else if ((elf_header.e_machine == EM_X86_64
1599				|| elf_header.e_machine == EM_L1OM
1600				|| elf_header.e_machine == EM_K1OM)
1601			       && psym->st_shndx == SHN_X86_64_LCOMMON)
1602			sec_name = "LARGE_COMMON";
1603		      else if (elf_header.e_machine == EM_IA_64
1604			       && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1605			       && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1606			sec_name = "ANSI_COM";
1607		      else if (is_ia64_vms ()
1608			       && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1609			sec_name = "VMS_SYMVEC";
1610		      else
1611			{
1612			  sprintf (name_buf, "<section 0x%x>",
1613				   (unsigned int) psym->st_shndx);
1614			  sec_name = name_buf;
1615			}
1616		    }
1617		  print_symbol (22, sec_name);
1618		}
1619	      else if (strtab == NULL)
1620		printf (_("<string table index: %3ld>"), psym->st_name);
1621	      else if (psym->st_name >= strtablen)
1622		printf (_("<corrupt string table index: %3ld>"), psym->st_name);
1623	      else
1624		{
1625		  print_symbol (22, strtab + psym->st_name);
1626		  if (version_string)
1627		    printf (sym_info == symbol_public ? "@@%s" : "@%s",
1628			    version_string);
1629		}
1630
1631	      if (is_rela)
1632		{
1633		  bfd_vma off = rels[i].r_addend;
1634
1635		  if ((bfd_signed_vma) off < 0)
1636		    printf (" - %" BFD_VMA_FMT "x", - off);
1637		  else
1638		    printf (" + %" BFD_VMA_FMT "x", off);
1639		}
1640	    }
1641	}
1642      else if (is_rela)
1643	{
1644	  bfd_vma off = rels[i].r_addend;
1645
1646	  printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1647	  if ((bfd_signed_vma) off < 0)
1648	    printf ("-%" BFD_VMA_FMT "x", - off);
1649	  else
1650	    printf ("%" BFD_VMA_FMT "x", off);
1651	}
1652
1653      if (elf_header.e_machine == EM_SPARCV9
1654	  && rtype != NULL
1655	  && streq (rtype, "R_SPARC_OLO10"))
1656	printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1657
1658      putchar ('\n');
1659
1660#ifdef BFD64
1661      if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1662	{
1663	  bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1664	  bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1665	  const char * rtype2 = elf_mips_reloc_type (type2);
1666	  const char * rtype3 = elf_mips_reloc_type (type3);
1667
1668	  printf ("                    Type2: ");
1669
1670	  if (rtype2 == NULL)
1671	    printf (_("unrecognized: %-7lx"),
1672		    (unsigned long) type2 & 0xffffffff);
1673	  else
1674	    printf ("%-17.17s", rtype2);
1675
1676	  printf ("\n                    Type3: ");
1677
1678	  if (rtype3 == NULL)
1679	    printf (_("unrecognized: %-7lx"),
1680		    (unsigned long) type3 & 0xffffffff);
1681	  else
1682	    printf ("%-17.17s", rtype3);
1683
1684	  putchar ('\n');
1685	}
1686#endif /* BFD64 */
1687    }
1688
1689  free (rels);
1690}
1691
1692static const char *
1693get_mips_dynamic_type (unsigned long type)
1694{
1695  switch (type)
1696    {
1697    case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1698    case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1699    case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1700    case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1701    case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1702    case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1703    case DT_MIPS_MSYM: return "MIPS_MSYM";
1704    case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1705    case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1706    case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1707    case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1708    case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1709    case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1710    case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1711    case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1712    case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1713    case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1714    case DT_MIPS_RLD_MAP_REL: return "MIPS_RLD_MAP_REL";
1715    case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1716    case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1717    case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1718    case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1719    case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1720    case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1721    case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1722    case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1723    case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1724    case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1725    case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1726    case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1727    case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1728    case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1729    case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1730    case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1731    case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1732    case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1733    case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1734    case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1735    case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1736    case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1737    case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1738    case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1739    case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1740    case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1741    case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1742    case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1743    default:
1744      return NULL;
1745    }
1746}
1747
1748static const char *
1749get_sparc64_dynamic_type (unsigned long type)
1750{
1751  switch (type)
1752    {
1753    case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1754    default:
1755      return NULL;
1756    }
1757}
1758
1759static const char *
1760get_ppc_dynamic_type (unsigned long type)
1761{
1762  switch (type)
1763    {
1764    case DT_PPC_GOT:    return "PPC_GOT";
1765    case DT_PPC_OPT:    return "PPC_OPT";
1766    default:
1767      return NULL;
1768    }
1769}
1770
1771static const char *
1772get_ppc64_dynamic_type (unsigned long type)
1773{
1774  switch (type)
1775    {
1776    case DT_PPC64_GLINK:  return "PPC64_GLINK";
1777    case DT_PPC64_OPD:    return "PPC64_OPD";
1778    case DT_PPC64_OPDSZ:  return "PPC64_OPDSZ";
1779    case DT_PPC64_OPT:    return "PPC64_OPT";
1780    default:
1781      return NULL;
1782    }
1783}
1784
1785static const char *
1786get_parisc_dynamic_type (unsigned long type)
1787{
1788  switch (type)
1789    {
1790    case DT_HP_LOAD_MAP:	return "HP_LOAD_MAP";
1791    case DT_HP_DLD_FLAGS:	return "HP_DLD_FLAGS";
1792    case DT_HP_DLD_HOOK:	return "HP_DLD_HOOK";
1793    case DT_HP_UX10_INIT:	return "HP_UX10_INIT";
1794    case DT_HP_UX10_INITSZ:	return "HP_UX10_INITSZ";
1795    case DT_HP_PREINIT:		return "HP_PREINIT";
1796    case DT_HP_PREINITSZ:	return "HP_PREINITSZ";
1797    case DT_HP_NEEDED:		return "HP_NEEDED";
1798    case DT_HP_TIME_STAMP:	return "HP_TIME_STAMP";
1799    case DT_HP_CHECKSUM:	return "HP_CHECKSUM";
1800    case DT_HP_GST_SIZE:	return "HP_GST_SIZE";
1801    case DT_HP_GST_VERSION:	return "HP_GST_VERSION";
1802    case DT_HP_GST_HASHVAL:	return "HP_GST_HASHVAL";
1803    case DT_HP_EPLTREL:		return "HP_GST_EPLTREL";
1804    case DT_HP_EPLTRELSZ:	return "HP_GST_EPLTRELSZ";
1805    case DT_HP_FILTERED:	return "HP_FILTERED";
1806    case DT_HP_FILTER_TLS:	return "HP_FILTER_TLS";
1807    case DT_HP_COMPAT_FILTERED:	return "HP_COMPAT_FILTERED";
1808    case DT_HP_LAZYLOAD:	return "HP_LAZYLOAD";
1809    case DT_HP_BIND_NOW_COUNT:	return "HP_BIND_NOW_COUNT";
1810    case DT_PLT:		return "PLT";
1811    case DT_PLT_SIZE:		return "PLT_SIZE";
1812    case DT_DLT:		return "DLT";
1813    case DT_DLT_SIZE:		return "DLT_SIZE";
1814    default:
1815      return NULL;
1816    }
1817}
1818
1819static const char *
1820get_ia64_dynamic_type (unsigned long type)
1821{
1822  switch (type)
1823    {
1824    case DT_IA_64_PLT_RESERVE:         return "IA_64_PLT_RESERVE";
1825    case DT_IA_64_VMS_SUBTYPE:         return "VMS_SUBTYPE";
1826    case DT_IA_64_VMS_IMGIOCNT:        return "VMS_IMGIOCNT";
1827    case DT_IA_64_VMS_LNKFLAGS:        return "VMS_LNKFLAGS";
1828    case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1829    case DT_IA_64_VMS_IDENT:           return "VMS_IDENT";
1830    case DT_IA_64_VMS_NEEDED_IDENT:    return "VMS_NEEDED_IDENT";
1831    case DT_IA_64_VMS_IMG_RELA_CNT:    return "VMS_IMG_RELA_CNT";
1832    case DT_IA_64_VMS_SEG_RELA_CNT:    return "VMS_SEG_RELA_CNT";
1833    case DT_IA_64_VMS_FIXUP_RELA_CNT:  return "VMS_FIXUP_RELA_CNT";
1834    case DT_IA_64_VMS_FIXUP_NEEDED:    return "VMS_FIXUP_NEEDED";
1835    case DT_IA_64_VMS_SYMVEC_CNT:      return "VMS_SYMVEC_CNT";
1836    case DT_IA_64_VMS_XLATED:          return "VMS_XLATED";
1837    case DT_IA_64_VMS_STACKSIZE:       return "VMS_STACKSIZE";
1838    case DT_IA_64_VMS_UNWINDSZ:        return "VMS_UNWINDSZ";
1839    case DT_IA_64_VMS_UNWIND_CODSEG:   return "VMS_UNWIND_CODSEG";
1840    case DT_IA_64_VMS_UNWIND_INFOSEG:  return "VMS_UNWIND_INFOSEG";
1841    case DT_IA_64_VMS_LINKTIME:        return "VMS_LINKTIME";
1842    case DT_IA_64_VMS_SEG_NO:          return "VMS_SEG_NO";
1843    case DT_IA_64_VMS_SYMVEC_OFFSET:   return "VMS_SYMVEC_OFFSET";
1844    case DT_IA_64_VMS_SYMVEC_SEG:      return "VMS_SYMVEC_SEG";
1845    case DT_IA_64_VMS_UNWIND_OFFSET:   return "VMS_UNWIND_OFFSET";
1846    case DT_IA_64_VMS_UNWIND_SEG:      return "VMS_UNWIND_SEG";
1847    case DT_IA_64_VMS_STRTAB_OFFSET:   return "VMS_STRTAB_OFFSET";
1848    case DT_IA_64_VMS_SYSVER_OFFSET:   return "VMS_SYSVER_OFFSET";
1849    case DT_IA_64_VMS_IMG_RELA_OFF:    return "VMS_IMG_RELA_OFF";
1850    case DT_IA_64_VMS_SEG_RELA_OFF:    return "VMS_SEG_RELA_OFF";
1851    case DT_IA_64_VMS_FIXUP_RELA_OFF:  return "VMS_FIXUP_RELA_OFF";
1852    case DT_IA_64_VMS_PLTGOT_OFFSET:   return "VMS_PLTGOT_OFFSET";
1853    case DT_IA_64_VMS_PLTGOT_SEG:      return "VMS_PLTGOT_SEG";
1854    case DT_IA_64_VMS_FPMODE:          return "VMS_FPMODE";
1855    default:
1856      return NULL;
1857    }
1858}
1859
1860static const char *
1861get_solaris_section_type (unsigned long type)
1862{
1863  switch (type)
1864    {
1865    case 0x6fffffee: return "SUNW_ancillary";
1866    case 0x6fffffef: return "SUNW_capchain";
1867    case 0x6ffffff0: return "SUNW_capinfo";
1868    case 0x6ffffff1: return "SUNW_symsort";
1869    case 0x6ffffff2: return "SUNW_tlssort";
1870    case 0x6ffffff3: return "SUNW_LDYNSYM";
1871    case 0x6ffffff4: return "SUNW_dof";
1872    case 0x6ffffff5: return "SUNW_cap";
1873    case 0x6ffffff6: return "SUNW_SIGNATURE";
1874    case 0x6ffffff7: return "SUNW_ANNOTATE";
1875    case 0x6ffffff8: return "SUNW_DEBUGSTR";
1876    case 0x6ffffff9: return "SUNW_DEBUG";
1877    case 0x6ffffffa: return "SUNW_move";
1878    case 0x6ffffffb: return "SUNW_COMDAT";
1879    case 0x6ffffffc: return "SUNW_syminfo";
1880    case 0x6ffffffd: return "SUNW_verdef";
1881    case 0x6ffffffe: return "SUNW_verneed";
1882    case 0x6fffffff: return "SUNW_versym";
1883    case 0x70000000: return "SPARC_GOTDATA";
1884    default: return NULL;
1885    }
1886}
1887
1888static const char *
1889get_alpha_dynamic_type (unsigned long type)
1890{
1891  switch (type)
1892    {
1893    case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1894    default:
1895      return NULL;
1896    }
1897}
1898
1899static const char *
1900get_score_dynamic_type (unsigned long type)
1901{
1902  switch (type)
1903    {
1904    case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1905    case DT_SCORE_LOCAL_GOTNO:  return "SCORE_LOCAL_GOTNO";
1906    case DT_SCORE_SYMTABNO:     return "SCORE_SYMTABNO";
1907    case DT_SCORE_GOTSYM:       return "SCORE_GOTSYM";
1908    case DT_SCORE_UNREFEXTNO:   return "SCORE_UNREFEXTNO";
1909    case DT_SCORE_HIPAGENO:     return "SCORE_HIPAGENO";
1910    default:
1911      return NULL;
1912    }
1913}
1914
1915static const char *
1916get_tic6x_dynamic_type (unsigned long type)
1917{
1918  switch (type)
1919    {
1920    case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1921    case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1922    case DT_C6000_DSBT_BASE:   return "C6000_DSBT_BASE";
1923    case DT_C6000_DSBT_SIZE:   return "C6000_DSBT_SIZE";
1924    case DT_C6000_PREEMPTMAP:  return "C6000_PREEMPTMAP";
1925    case DT_C6000_DSBT_INDEX:  return "C6000_DSBT_INDEX";
1926    default:
1927      return NULL;
1928    }
1929}
1930
1931static const char *
1932get_nios2_dynamic_type (unsigned long type)
1933{
1934  switch (type)
1935    {
1936    case DT_NIOS2_GP: return "NIOS2_GP";
1937    default:
1938      return NULL;
1939    }
1940}
1941
1942static const char *
1943get_solaris_dynamic_type (unsigned long type)
1944{
1945  switch (type)
1946    {
1947    case 0x6000000d: return "SUNW_AUXILIARY";
1948    case 0x6000000e: return "SUNW_RTLDINF";
1949    case 0x6000000f: return "SUNW_FILTER";
1950    case 0x60000010: return "SUNW_CAP";
1951    case 0x60000011: return "SUNW_SYMTAB";
1952    case 0x60000012: return "SUNW_SYMSZ";
1953    case 0x60000013: return "SUNW_SORTENT";
1954    case 0x60000014: return "SUNW_SYMSORT";
1955    case 0x60000015: return "SUNW_SYMSORTSZ";
1956    case 0x60000016: return "SUNW_TLSSORT";
1957    case 0x60000017: return "SUNW_TLSSORTSZ";
1958    case 0x60000018: return "SUNW_CAPINFO";
1959    case 0x60000019: return "SUNW_STRPAD";
1960    case 0x6000001a: return "SUNW_CAPCHAIN";
1961    case 0x6000001b: return "SUNW_LDMACH";
1962    case 0x6000001d: return "SUNW_CAPCHAINENT";
1963    case 0x6000001f: return "SUNW_CAPCHAINSZ";
1964    case 0x60000021: return "SUNW_PARENT";
1965    case 0x60000023: return "SUNW_ASLR";
1966    case 0x60000025: return "SUNW_RELAX";
1967    case 0x60000029: return "SUNW_NXHEAP";
1968    case 0x6000002b: return "SUNW_NXSTACK";
1969
1970    case 0x70000001: return "SPARC_REGISTER";
1971    case 0x7ffffffd: return "AUXILIARY";
1972    case 0x7ffffffe: return "USED";
1973    case 0x7fffffff: return "FILTER";
1974
1975    default: return NULL;
1976    }
1977}
1978
1979static const char *
1980get_dynamic_type (unsigned long type)
1981{
1982  static char buff[64];
1983
1984  switch (type)
1985    {
1986    case DT_NULL:	return "NULL";
1987    case DT_NEEDED:	return "NEEDED";
1988    case DT_PLTRELSZ:	return "PLTRELSZ";
1989    case DT_PLTGOT:	return "PLTGOT";
1990    case DT_HASH:	return "HASH";
1991    case DT_STRTAB:	return "STRTAB";
1992    case DT_SYMTAB:	return "SYMTAB";
1993    case DT_RELA:	return "RELA";
1994    case DT_RELASZ:	return "RELASZ";
1995    case DT_RELAENT:	return "RELAENT";
1996    case DT_STRSZ:	return "STRSZ";
1997    case DT_SYMENT:	return "SYMENT";
1998    case DT_INIT:	return "INIT";
1999    case DT_FINI:	return "FINI";
2000    case DT_SONAME:	return "SONAME";
2001    case DT_RPATH:	return "RPATH";
2002    case DT_SYMBOLIC:	return "SYMBOLIC";
2003    case DT_REL:	return "REL";
2004    case DT_RELSZ:	return "RELSZ";
2005    case DT_RELENT:	return "RELENT";
2006    case DT_PLTREL:	return "PLTREL";
2007    case DT_DEBUG:	return "DEBUG";
2008    case DT_TEXTREL:	return "TEXTREL";
2009    case DT_JMPREL:	return "JMPREL";
2010    case DT_BIND_NOW:   return "BIND_NOW";
2011    case DT_INIT_ARRAY: return "INIT_ARRAY";
2012    case DT_FINI_ARRAY: return "FINI_ARRAY";
2013    case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
2014    case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
2015    case DT_RUNPATH:    return "RUNPATH";
2016    case DT_FLAGS:      return "FLAGS";
2017
2018    case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2019    case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
2020    case DT_SYMTAB_SHNDX: return "SYMTAB_SHNDX";
2021
2022    case DT_CHECKSUM:	return "CHECKSUM";
2023    case DT_PLTPADSZ:	return "PLTPADSZ";
2024    case DT_MOVEENT:	return "MOVEENT";
2025    case DT_MOVESZ:	return "MOVESZ";
2026    case DT_FEATURE:	return "FEATURE";
2027    case DT_POSFLAG_1:	return "POSFLAG_1";
2028    case DT_SYMINSZ:	return "SYMINSZ";
2029    case DT_SYMINENT:	return "SYMINENT"; /* aka VALRNGHI */
2030
2031    case DT_ADDRRNGLO:  return "ADDRRNGLO";
2032    case DT_CONFIG:	return "CONFIG";
2033    case DT_DEPAUDIT:	return "DEPAUDIT";
2034    case DT_AUDIT:	return "AUDIT";
2035    case DT_PLTPAD:	return "PLTPAD";
2036    case DT_MOVETAB:	return "MOVETAB";
2037    case DT_SYMINFO:	return "SYMINFO"; /* aka ADDRRNGHI */
2038
2039    case DT_VERSYM:	return "VERSYM";
2040
2041    case DT_TLSDESC_GOT: return "TLSDESC_GOT";
2042    case DT_TLSDESC_PLT: return "TLSDESC_PLT";
2043    case DT_RELACOUNT:	return "RELACOUNT";
2044    case DT_RELCOUNT:	return "RELCOUNT";
2045    case DT_FLAGS_1:	return "FLAGS_1";
2046    case DT_VERDEF:	return "VERDEF";
2047    case DT_VERDEFNUM:	return "VERDEFNUM";
2048    case DT_VERNEED:	return "VERNEED";
2049    case DT_VERNEEDNUM:	return "VERNEEDNUM";
2050
2051    case DT_AUXILIARY:	return "AUXILIARY";
2052    case DT_USED:	return "USED";
2053    case DT_FILTER:	return "FILTER";
2054
2055    case DT_GNU_PRELINKED: return "GNU_PRELINKED";
2056    case DT_GNU_CONFLICT: return "GNU_CONFLICT";
2057    case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
2058    case DT_GNU_LIBLIST: return "GNU_LIBLIST";
2059    case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
2060    case DT_GNU_HASH:	return "GNU_HASH";
2061
2062    default:
2063      if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
2064	{
2065	  const char * result;
2066
2067	  switch (elf_header.e_machine)
2068	    {
2069	    case EM_MIPS:
2070	    case EM_MIPS_RS3_LE:
2071	      result = get_mips_dynamic_type (type);
2072	      break;
2073	    case EM_SPARCV9:
2074	      result = get_sparc64_dynamic_type (type);
2075	      break;
2076	    case EM_PPC:
2077	      result = get_ppc_dynamic_type (type);
2078	      break;
2079	    case EM_PPC64:
2080	      result = get_ppc64_dynamic_type (type);
2081	      break;
2082	    case EM_IA_64:
2083	      result = get_ia64_dynamic_type (type);
2084	      break;
2085	    case EM_ALPHA:
2086	      result = get_alpha_dynamic_type (type);
2087	      break;
2088	    case EM_SCORE:
2089	      result = get_score_dynamic_type (type);
2090	      break;
2091	    case EM_TI_C6000:
2092	      result = get_tic6x_dynamic_type (type);
2093	      break;
2094	    case EM_ALTERA_NIOS2:
2095	      result = get_nios2_dynamic_type (type);
2096	      break;
2097	    default:
2098	      if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2099		result = get_solaris_dynamic_type (type);
2100	      else
2101		result = NULL;
2102	      break;
2103	    }
2104
2105	  if (result != NULL)
2106	    return result;
2107
2108	  snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
2109	}
2110      else if (((type >= DT_LOOS) && (type <= DT_HIOS))
2111	       || (elf_header.e_machine == EM_PARISC
2112		   && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
2113	{
2114	  const char * result;
2115
2116	  switch (elf_header.e_machine)
2117	    {
2118	    case EM_PARISC:
2119	      result = get_parisc_dynamic_type (type);
2120	      break;
2121	    case EM_IA_64:
2122	      result = get_ia64_dynamic_type (type);
2123	      break;
2124	    default:
2125	      if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2126		result = get_solaris_dynamic_type (type);
2127	      else
2128		result = NULL;
2129	      break;
2130	    }
2131
2132	  if (result != NULL)
2133	    return result;
2134
2135	  snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2136		    type);
2137	}
2138      else
2139	snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
2140
2141      return buff;
2142    }
2143}
2144
2145static char *
2146get_file_type (unsigned e_type)
2147{
2148  static char buff[32];
2149
2150  switch (e_type)
2151    {
2152    case ET_NONE:	return _("NONE (None)");
2153    case ET_REL:	return _("REL (Relocatable file)");
2154    case ET_EXEC:	return _("EXEC (Executable file)");
2155    case ET_DYN:	return _("DYN (Shared object file)");
2156    case ET_CORE:	return _("CORE (Core file)");
2157
2158    default:
2159      if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
2160	snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
2161      else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
2162	snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
2163      else
2164	snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
2165      return buff;
2166    }
2167}
2168
2169static char *
2170get_machine_name (unsigned e_machine)
2171{
2172  static char buff[64]; /* XXX */
2173
2174  switch (e_machine)
2175    {
2176    case EM_NONE:		return _("None");
2177    case EM_AARCH64:		return "AArch64";
2178    case EM_M32:		return "WE32100";
2179    case EM_SPARC:		return "Sparc";
2180    case EM_SPU:		return "SPU";
2181    case EM_386:		return "Intel 80386";
2182    case EM_68K:		return "MC68000";
2183    case EM_88K:		return "MC88000";
2184    case EM_IAMCU:		return "Intel MCU";
2185    case EM_860:		return "Intel 80860";
2186    case EM_MIPS:		return "MIPS R3000";
2187    case EM_S370:		return "IBM System/370";
2188    case EM_MIPS_RS3_LE:	return "MIPS R4000 big-endian";
2189    case EM_OLD_SPARCV9:	return "Sparc v9 (old)";
2190    case EM_PARISC:		return "HPPA";
2191    case EM_PPC_OLD:		return "Power PC (old)";
2192    case EM_SPARC32PLUS:	return "Sparc v8+" ;
2193    case EM_960:		return "Intel 90860";
2194    case EM_PPC:		return "PowerPC";
2195    case EM_PPC64:		return "PowerPC64";
2196    case EM_FR20:		return "Fujitsu FR20";
2197    case EM_FT32:		return "FTDI FT32";
2198    case EM_RH32:		return "TRW RH32";
2199    case EM_MCORE:		return "MCORE";
2200    case EM_ARM:		return "ARM";
2201    case EM_OLD_ALPHA:		return "Digital Alpha (old)";
2202    case EM_SH:			return "Renesas / SuperH SH";
2203    case EM_SPARCV9:		return "Sparc v9";
2204    case EM_TRICORE:		return "Siemens Tricore";
2205    case EM_ARC:		return "ARC";
2206    case EM_ARC_COMPACT:	return "ARCompact";
2207    case EM_ARC_COMPACT2:	return "ARCv2";
2208    case EM_H8_300:		return "Renesas H8/300";
2209    case EM_H8_300H:		return "Renesas H8/300H";
2210    case EM_H8S:		return "Renesas H8S";
2211    case EM_H8_500:		return "Renesas H8/500";
2212    case EM_IA_64:		return "Intel IA-64";
2213    case EM_MIPS_X:		return "Stanford MIPS-X";
2214    case EM_COLDFIRE:		return "Motorola Coldfire";
2215    case EM_ALPHA:		return "Alpha";
2216    case EM_CYGNUS_D10V:
2217    case EM_D10V:		return "d10v";
2218    case EM_CYGNUS_D30V:
2219    case EM_D30V:		return "d30v";
2220    case EM_CYGNUS_M32R:
2221    case EM_M32R:		return "Renesas M32R (formerly Mitsubishi M32r)";
2222    case EM_CYGNUS_V850:
2223    case EM_V800:		return "Renesas V850 (using RH850 ABI)";
2224    case EM_V850:		return "Renesas V850";
2225    case EM_CYGNUS_MN10300:
2226    case EM_MN10300:		return "mn10300";
2227    case EM_CYGNUS_MN10200:
2228    case EM_MN10200:		return "mn10200";
2229    case EM_MOXIE:		return "Moxie";
2230    case EM_CYGNUS_FR30:
2231    case EM_FR30:		return "Fujitsu FR30";
2232    case EM_CYGNUS_FRV:		return "Fujitsu FR-V";
2233    case EM_PJ_OLD:
2234    case EM_PJ:			return "picoJava";
2235    case EM_MMA:		return "Fujitsu Multimedia Accelerator";
2236    case EM_PCP:		return "Siemens PCP";
2237    case EM_NCPU:		return "Sony nCPU embedded RISC processor";
2238    case EM_NDR1:		return "Denso NDR1 microprocesspr";
2239    case EM_STARCORE:		return "Motorola Star*Core processor";
2240    case EM_ME16:		return "Toyota ME16 processor";
2241    case EM_ST100:		return "STMicroelectronics ST100 processor";
2242    case EM_TINYJ:		return "Advanced Logic Corp. TinyJ embedded processor";
2243    case EM_PDSP:		return "Sony DSP processor";
2244    case EM_PDP10:		return "Digital Equipment Corp. PDP-10";
2245    case EM_PDP11:		return "Digital Equipment Corp. PDP-11";
2246    case EM_FX66:		return "Siemens FX66 microcontroller";
2247    case EM_ST9PLUS:		return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2248    case EM_ST7:		return "STMicroelectronics ST7 8-bit microcontroller";
2249    case EM_68HC16:		return "Motorola MC68HC16 Microcontroller";
2250    case EM_68HC12:		return "Motorola MC68HC12 Microcontroller";
2251    case EM_68HC11:		return "Motorola MC68HC11 Microcontroller";
2252    case EM_68HC08:		return "Motorola MC68HC08 Microcontroller";
2253    case EM_68HC05:		return "Motorola MC68HC05 Microcontroller";
2254    case EM_SVX:		return "Silicon Graphics SVx";
2255    case EM_ST19:		return "STMicroelectronics ST19 8-bit microcontroller";
2256    case EM_VAX:		return "Digital VAX";
2257    case EM_VISIUM:		return "CDS VISIUMcore processor";
2258    case EM_AVR_OLD:
2259    case EM_AVR:		return "Atmel AVR 8-bit microcontroller";
2260    case EM_CRIS:		return "Axis Communications 32-bit embedded processor";
2261    case EM_JAVELIN:		return "Infineon Technologies 32-bit embedded cpu";
2262    case EM_FIREPATH:		return "Element 14 64-bit DSP processor";
2263    case EM_ZSP:		return "LSI Logic's 16-bit DSP processor";
2264    case EM_MMIX:		return "Donald Knuth's educational 64-bit processor";
2265    case EM_HUANY:		return "Harvard Universitys's machine-independent object format";
2266    case EM_PRISM:		return "Vitesse Prism";
2267    case EM_X86_64:		return "Advanced Micro Devices X86-64";
2268    case EM_L1OM:		return "Intel L1OM";
2269    case EM_K1OM:		return "Intel K1OM";
2270    case EM_S390_OLD:
2271    case EM_S390:		return "IBM S/390";
2272    case EM_SCORE:		return "SUNPLUS S+Core";
2273    case EM_XSTORMY16:		return "Sanyo XStormy16 CPU core";
2274    case EM_OR1K:		return "OpenRISC 1000";
2275    case EM_CRX:		return "National Semiconductor CRX microprocessor";
2276    case EM_ADAPTEVA_EPIPHANY:	return "Adapteva EPIPHANY";
2277    case EM_DLX:		return "OpenDLX";
2278    case EM_IP2K_OLD:
2279    case EM_IP2K:		return "Ubicom IP2xxx 8-bit microcontrollers";
2280    case EM_IQ2000:       	return "Vitesse IQ2000";
2281    case EM_XTENSA_OLD:
2282    case EM_XTENSA:		return "Tensilica Xtensa Processor";
2283    case EM_VIDEOCORE:		return "Alphamosaic VideoCore processor";
2284    case EM_TMM_GPP:		return "Thompson Multimedia General Purpose Processor";
2285    case EM_NS32K:		return "National Semiconductor 32000 series";
2286    case EM_TPC:		return "Tenor Network TPC processor";
2287    case EM_ST200:		return "STMicroelectronics ST200 microcontroller";
2288    case EM_MAX:		return "MAX Processor";
2289    case EM_CR:			return "National Semiconductor CompactRISC";
2290    case EM_F2MC16:		return "Fujitsu F2MC16";
2291    case EM_MSP430:		return "Texas Instruments msp430 microcontroller";
2292    case EM_LATTICEMICO32:	return "Lattice Mico32";
2293    case EM_M32C_OLD:
2294    case EM_M32C:	        return "Renesas M32c";
2295    case EM_MT:                 return "Morpho Techologies MT processor";
2296    case EM_BLACKFIN:		return "Analog Devices Blackfin";
2297    case EM_SE_C33:		return "S1C33 Family of Seiko Epson processors";
2298    case EM_SEP:		return "Sharp embedded microprocessor";
2299    case EM_ARCA:		return "Arca RISC microprocessor";
2300    case EM_UNICORE:		return "Unicore";
2301    case EM_EXCESS:		return "eXcess 16/32/64-bit configurable embedded CPU";
2302    case EM_DXP:		return "Icera Semiconductor Inc. Deep Execution Processor";
2303    case EM_NIOS32:		return "Altera Nios";
2304    case EM_ALTERA_NIOS2:	return "Altera Nios II";
2305    case EM_C166:
2306    case EM_XC16X:		return "Infineon Technologies xc16x";
2307    case EM_M16C:		return "Renesas M16C series microprocessors";
2308    case EM_DSPIC30F:		return "Microchip Technology dsPIC30F Digital Signal Controller";
2309    case EM_CE:			return "Freescale Communication Engine RISC core";
2310    case EM_TSK3000:		return "Altium TSK3000 core";
2311    case EM_RS08:		return "Freescale RS08 embedded processor";
2312    case EM_ECOG2:		return "Cyan Technology eCOG2 microprocessor";
2313    case EM_DSP24:		return "New Japan Radio (NJR) 24-bit DSP Processor";
2314    case EM_VIDEOCORE3:		return "Broadcom VideoCore III processor";
2315    case EM_SE_C17:		return "Seiko Epson C17 family";
2316    case EM_TI_C6000:		return "Texas Instruments TMS320C6000 DSP family";
2317    case EM_TI_C2000:		return "Texas Instruments TMS320C2000 DSP family";
2318    case EM_TI_C5500:		return "Texas Instruments TMS320C55x DSP family";
2319    case EM_MMDSP_PLUS:		return "STMicroelectronics 64bit VLIW Data Signal Processor";
2320    case EM_CYPRESS_M8C:	return "Cypress M8C microprocessor";
2321    case EM_R32C:		return "Renesas R32C series microprocessors";
2322    case EM_TRIMEDIA:		return "NXP Semiconductors TriMedia architecture family";
2323    case EM_QDSP6:		return "QUALCOMM DSP6 Processor";
2324    case EM_8051:		return "Intel 8051 and variants";
2325    case EM_STXP7X:		return "STMicroelectronics STxP7x family";
2326    case EM_NDS32:		return "Andes Technology compact code size embedded RISC processor family";
2327    case EM_ECOG1X:		return "Cyan Technology eCOG1X family";
2328    case EM_MAXQ30:		return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2329    case EM_XIMO16:		return "New Japan Radio (NJR) 16-bit DSP Processor";
2330    case EM_MANIK:		return "M2000 Reconfigurable RISC Microprocessor";
2331    case EM_CRAYNV2:		return "Cray Inc. NV2 vector architecture";
2332    case EM_CYGNUS_MEP:         return "Toshiba MeP Media Engine";
2333    case EM_CR16:
2334    case EM_MICROBLAZE:
2335    case EM_MICROBLAZE_OLD:	return "Xilinx MicroBlaze";
2336    case EM_RISCV:		return "RISC-V";
2337    case EM_RL78:		return "Renesas RL78";
2338    case EM_RX:			return "Renesas RX";
2339    case EM_METAG:		return "Imagination Technologies Meta processor architecture";
2340    case EM_MCST_ELBRUS:	return "MCST Elbrus general purpose hardware architecture";
2341    case EM_ECOG16:		return "Cyan Technology eCOG16 family";
2342    case EM_ETPU:		return "Freescale Extended Time Processing Unit";
2343    case EM_SLE9X:		return "Infineon Technologies SLE9X core";
2344    case EM_AVR32:		return "Atmel Corporation 32-bit microprocessor family";
2345    case EM_STM8:		return "STMicroeletronics STM8 8-bit microcontroller";
2346    case EM_TILE64:		return "Tilera TILE64 multicore architecture family";
2347    case EM_TILEPRO:		return "Tilera TILEPro multicore architecture family";
2348    case EM_TILEGX:		return "Tilera TILE-Gx multicore architecture family";
2349    case EM_CUDA:		return "NVIDIA CUDA architecture";
2350    case EM_XGATE:		return "Motorola XGATE embedded processor";
2351    case EM_CLOUDSHIELD:	return "CloudShield architecture family";
2352    case EM_COREA_1ST:		return "KIPO-KAIST Core-A 1st generation processor family";
2353    case EM_COREA_2ND:		return "KIPO-KAIST Core-A 2nd generation processor family";
2354    case EM_OPEN8:		return "Open8 8-bit RISC soft processor core";
2355    case EM_VIDEOCORE5:		return "Broadcom VideoCore V processor";
2356    case EM_56800EX:		return "Freescale 56800EX Digital Signal Controller (DSC)";
2357    case EM_BA1:		return "Beyond BA1 CPU architecture";
2358    case EM_BA2:		return "Beyond BA2 CPU architecture";
2359    case EM_XCORE:		return "XMOS xCORE processor family";
2360    case EM_MCHP_PIC:		return "Microchip 8-bit PIC(r) family";
2361    case EM_KM32:		return "KM211 KM32 32-bit processor";
2362    case EM_KMX32:		return "KM211 KMX32 32-bit processor";
2363    case EM_KMX16:		return "KM211 KMX16 16-bit processor";
2364    case EM_KMX8:		return "KM211 KMX8 8-bit processor";
2365    case EM_KVARC:		return "KM211 KVARC processor";
2366    case EM_CDP:		return "Paneve CDP architecture family";
2367    case EM_COGE:		return "Cognitive Smart Memory Processor";
2368    case EM_COOL:		return "Bluechip Systems CoolEngine";
2369    case EM_NORC:		return "Nanoradio Optimized RISC";
2370    case EM_CSR_KALIMBA:	return "CSR Kalimba architecture family";
2371    case EM_Z80:		return "Zilog Z80";
2372    case EM_AMDGPU:		return "AMD GPU architecture";
2373    default:
2374      snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2375      return buff;
2376    }
2377}
2378
2379static void
2380decode_ARC_machine_flags (unsigned e_flags, unsigned e_machine, char buf[])
2381{
2382  /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2.  Some
2383     other compilers don't a specific architecture type in the e_flags, and
2384     instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
2385     architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
2386     architectures.
2387
2388     Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
2389     but also sets a specific architecture type in the e_flags field.
2390
2391     However, when decoding the flags we don't worry if we see an
2392     unexpected pairing, for example EM_ARC_COMPACT machine type, with
2393     ARCEM architecture type.  */
2394
2395  switch (e_flags & EF_ARC_MACH_MSK)
2396    {
2397      /* We only expect these to occur for EM_ARC_COMPACT2.  */
2398    case EF_ARC_CPU_ARCV2EM:
2399      strcat (buf, ", ARC EM");
2400      break;
2401    case EF_ARC_CPU_ARCV2HS:
2402      strcat (buf, ", ARC HS");
2403      break;
2404
2405      /* We only expect these to occur for EM_ARC_COMPACT.  */
2406    case E_ARC_MACH_ARC600:
2407      strcat (buf, ", ARC600");
2408      break;
2409    case E_ARC_MACH_ARC601:
2410      strcat (buf, ", ARC601");
2411      break;
2412    case E_ARC_MACH_ARC700:
2413      strcat (buf, ", ARC700");
2414      break;
2415
2416      /* The only times we should end up here are (a) A corrupt ELF, (b) A
2417         new ELF with new architecture being read by an old version of
2418         readelf, or (c) An ELF built with non-GNU compiler that does not
2419         set the architecture in the e_flags.  */
2420    default:
2421      if (e_machine == EM_ARC_COMPACT)
2422        strcat (buf, ", Unknown ARCompact");
2423      else
2424        strcat (buf, ", Unknown ARC");
2425      break;
2426    }
2427
2428  switch (e_flags & EF_ARC_OSABI_MSK)
2429    {
2430    case E_ARC_OSABI_ORIG:
2431      strcat (buf, ", (ABI:legacy)");
2432      break;
2433    case E_ARC_OSABI_V2:
2434      strcat (buf, ", (ABI:v2)");
2435      break;
2436      /* Only upstream 3.9+ kernels will support ARCv2 ISA.  */
2437    case E_ARC_OSABI_V3:
2438      strcat (buf, ", v3 no-legacy-syscalls ABI");
2439      break;
2440    default:
2441      strcat (buf, ", unrecognised ARC OSABI flag");
2442      break;
2443    }
2444}
2445
2446static void
2447decode_ARM_machine_flags (unsigned e_flags, char buf[])
2448{
2449  unsigned eabi;
2450  int unknown = 0;
2451
2452  eabi = EF_ARM_EABI_VERSION (e_flags);
2453  e_flags &= ~ EF_ARM_EABIMASK;
2454
2455  /* Handle "generic" ARM flags.  */
2456  if (e_flags & EF_ARM_RELEXEC)
2457    {
2458      strcat (buf, ", relocatable executable");
2459      e_flags &= ~ EF_ARM_RELEXEC;
2460    }
2461
2462  /* Now handle EABI specific flags.  */
2463  switch (eabi)
2464    {
2465    default:
2466      strcat (buf, ", <unrecognized EABI>");
2467      if (e_flags)
2468	unknown = 1;
2469      break;
2470
2471    case EF_ARM_EABI_VER1:
2472      strcat (buf, ", Version1 EABI");
2473      while (e_flags)
2474	{
2475	  unsigned flag;
2476
2477	  /* Process flags one bit at a time.  */
2478	  flag = e_flags & - e_flags;
2479	  e_flags &= ~ flag;
2480
2481	  switch (flag)
2482	    {
2483	    case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2484	      strcat (buf, ", sorted symbol tables");
2485	      break;
2486
2487	    default:
2488	      unknown = 1;
2489	      break;
2490	    }
2491	}
2492      break;
2493
2494    case EF_ARM_EABI_VER2:
2495      strcat (buf, ", Version2 EABI");
2496      while (e_flags)
2497	{
2498	  unsigned flag;
2499
2500	  /* Process flags one bit at a time.  */
2501	  flag = e_flags & - e_flags;
2502	  e_flags &= ~ flag;
2503
2504	  switch (flag)
2505	    {
2506	    case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2507	      strcat (buf, ", sorted symbol tables");
2508	      break;
2509
2510	    case EF_ARM_DYNSYMSUSESEGIDX:
2511	      strcat (buf, ", dynamic symbols use segment index");
2512	      break;
2513
2514	    case EF_ARM_MAPSYMSFIRST:
2515	      strcat (buf, ", mapping symbols precede others");
2516	      break;
2517
2518	    default:
2519	      unknown = 1;
2520	      break;
2521	    }
2522	}
2523      break;
2524
2525    case EF_ARM_EABI_VER3:
2526      strcat (buf, ", Version3 EABI");
2527      break;
2528
2529    case EF_ARM_EABI_VER4:
2530      strcat (buf, ", Version4 EABI");
2531      while (e_flags)
2532	{
2533	  unsigned flag;
2534
2535	  /* Process flags one bit at a time.  */
2536	  flag = e_flags & - e_flags;
2537	  e_flags &= ~ flag;
2538
2539	  switch (flag)
2540	    {
2541	    case EF_ARM_BE8:
2542	      strcat (buf, ", BE8");
2543	      break;
2544
2545	    case EF_ARM_LE8:
2546	      strcat (buf, ", LE8");
2547	      break;
2548
2549	    default:
2550	      unknown = 1;
2551	      break;
2552	    }
2553      break;
2554	}
2555      break;
2556
2557    case EF_ARM_EABI_VER5:
2558      strcat (buf, ", Version5 EABI");
2559      while (e_flags)
2560	{
2561	  unsigned flag;
2562
2563	  /* Process flags one bit at a time.  */
2564	  flag = e_flags & - e_flags;
2565	  e_flags &= ~ flag;
2566
2567	  switch (flag)
2568	    {
2569	    case EF_ARM_BE8:
2570	      strcat (buf, ", BE8");
2571	      break;
2572
2573	    case EF_ARM_LE8:
2574	      strcat (buf, ", LE8");
2575	      break;
2576
2577	    case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT.  */
2578	      strcat (buf, ", soft-float ABI");
2579	      break;
2580
2581	    case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT.  */
2582	      strcat (buf, ", hard-float ABI");
2583	      break;
2584
2585	    default:
2586	      unknown = 1;
2587	      break;
2588	    }
2589	}
2590      break;
2591
2592    case EF_ARM_EABI_UNKNOWN:
2593      strcat (buf, ", GNU EABI");
2594      while (e_flags)
2595	{
2596	  unsigned flag;
2597
2598	  /* Process flags one bit at a time.  */
2599	  flag = e_flags & - e_flags;
2600	  e_flags &= ~ flag;
2601
2602	  switch (flag)
2603	    {
2604	    case EF_ARM_INTERWORK:
2605	      strcat (buf, ", interworking enabled");
2606	      break;
2607
2608	    case EF_ARM_APCS_26:
2609	      strcat (buf, ", uses APCS/26");
2610	      break;
2611
2612	    case EF_ARM_APCS_FLOAT:
2613	      strcat (buf, ", uses APCS/float");
2614	      break;
2615
2616	    case EF_ARM_PIC:
2617	      strcat (buf, ", position independent");
2618	      break;
2619
2620	    case EF_ARM_ALIGN8:
2621	      strcat (buf, ", 8 bit structure alignment");
2622	      break;
2623
2624	    case EF_ARM_NEW_ABI:
2625	      strcat (buf, ", uses new ABI");
2626	      break;
2627
2628	    case EF_ARM_OLD_ABI:
2629	      strcat (buf, ", uses old ABI");
2630	      break;
2631
2632	    case EF_ARM_SOFT_FLOAT:
2633	      strcat (buf, ", software FP");
2634	      break;
2635
2636	    case EF_ARM_VFP_FLOAT:
2637	      strcat (buf, ", VFP");
2638	      break;
2639
2640	    case EF_ARM_MAVERICK_FLOAT:
2641	      strcat (buf, ", Maverick FP");
2642	      break;
2643
2644	    default:
2645	      unknown = 1;
2646	      break;
2647	    }
2648	}
2649    }
2650
2651  if (unknown)
2652    strcat (buf,_(", <unknown>"));
2653}
2654
2655static void
2656decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2657{
2658  --size; /* Leave space for null terminator.  */
2659
2660  switch (e_flags & EF_AVR_MACH)
2661    {
2662    case E_AVR_MACH_AVR1:
2663      strncat (buf, ", avr:1", size);
2664      break;
2665    case E_AVR_MACH_AVR2:
2666      strncat (buf, ", avr:2", size);
2667      break;
2668    case E_AVR_MACH_AVR25:
2669      strncat (buf, ", avr:25", size);
2670      break;
2671    case E_AVR_MACH_AVR3:
2672      strncat (buf, ", avr:3", size);
2673      break;
2674    case E_AVR_MACH_AVR31:
2675      strncat (buf, ", avr:31", size);
2676      break;
2677    case E_AVR_MACH_AVR35:
2678      strncat (buf, ", avr:35", size);
2679      break;
2680    case E_AVR_MACH_AVR4:
2681      strncat (buf, ", avr:4", size);
2682      break;
2683    case E_AVR_MACH_AVR5:
2684      strncat (buf, ", avr:5", size);
2685      break;
2686    case E_AVR_MACH_AVR51:
2687      strncat (buf, ", avr:51", size);
2688      break;
2689    case E_AVR_MACH_AVR6:
2690      strncat (buf, ", avr:6", size);
2691      break;
2692    case E_AVR_MACH_AVRTINY:
2693      strncat (buf, ", avr:100", size);
2694      break;
2695    case E_AVR_MACH_XMEGA1:
2696      strncat (buf, ", avr:101", size);
2697      break;
2698    case E_AVR_MACH_XMEGA2:
2699      strncat (buf, ", avr:102", size);
2700      break;
2701    case E_AVR_MACH_XMEGA3:
2702      strncat (buf, ", avr:103", size);
2703      break;
2704    case E_AVR_MACH_XMEGA4:
2705      strncat (buf, ", avr:104", size);
2706      break;
2707    case E_AVR_MACH_XMEGA5:
2708      strncat (buf, ", avr:105", size);
2709      break;
2710    case E_AVR_MACH_XMEGA6:
2711      strncat (buf, ", avr:106", size);
2712      break;
2713    case E_AVR_MACH_XMEGA7:
2714      strncat (buf, ", avr:107", size);
2715      break;
2716    default:
2717      strncat (buf, ", avr:<unknown>", size);
2718      break;
2719    }
2720
2721  size -= strlen (buf);
2722  if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2723    strncat (buf, ", link-relax", size);
2724}
2725
2726static void
2727decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2728{
2729  unsigned abi;
2730  unsigned arch;
2731  unsigned config;
2732  unsigned version;
2733  int has_fpu = 0;
2734  int r = 0;
2735
2736  static const char *ABI_STRINGS[] =
2737  {
2738    "ABI v0", /* use r5 as return register; only used in N1213HC */
2739    "ABI v1", /* use r0 as return register */
2740    "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2741    "ABI v2fp", /* for FPU */
2742    "AABI",
2743    "ABI2 FP+"
2744  };
2745  static const char *VER_STRINGS[] =
2746  {
2747    "Andes ELF V1.3 or older",
2748    "Andes ELF V1.3.1",
2749    "Andes ELF V1.4"
2750  };
2751  static const char *ARCH_STRINGS[] =
2752  {
2753    "",
2754    "Andes Star v1.0",
2755    "Andes Star v2.0",
2756    "Andes Star v3.0",
2757    "Andes Star v3.0m"
2758  };
2759
2760  abi = EF_NDS_ABI & e_flags;
2761  arch = EF_NDS_ARCH & e_flags;
2762  config = EF_NDS_INST & e_flags;
2763  version = EF_NDS32_ELF_VERSION & e_flags;
2764
2765  memset (buf, 0, size);
2766
2767  switch (abi)
2768    {
2769    case E_NDS_ABI_V0:
2770    case E_NDS_ABI_V1:
2771    case E_NDS_ABI_V2:
2772    case E_NDS_ABI_V2FP:
2773    case E_NDS_ABI_AABI:
2774    case E_NDS_ABI_V2FP_PLUS:
2775      /* In case there are holes in the array.  */
2776      r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2777      break;
2778
2779    default:
2780      r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2781      break;
2782    }
2783
2784  switch (version)
2785    {
2786    case E_NDS32_ELF_VER_1_2:
2787    case E_NDS32_ELF_VER_1_3:
2788    case E_NDS32_ELF_VER_1_4:
2789      r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2790      break;
2791
2792    default:
2793      r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2794      break;
2795    }
2796
2797  if (E_NDS_ABI_V0 == abi)
2798    {
2799      /* OLD ABI; only used in N1213HC, has performance extension 1.  */
2800      r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2801      if (arch == E_NDS_ARCH_STAR_V1_0)
2802	r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2803      return;
2804    }
2805
2806  switch (arch)
2807    {
2808    case E_NDS_ARCH_STAR_V1_0:
2809    case E_NDS_ARCH_STAR_V2_0:
2810    case E_NDS_ARCH_STAR_V3_0:
2811    case E_NDS_ARCH_STAR_V3_M:
2812      r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2813      break;
2814
2815    default:
2816      r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2817      /* ARCH version determines how the e_flags are interpreted.
2818	 If it is unknown, we cannot proceed.  */
2819      return;
2820    }
2821
2822  /* Newer ABI; Now handle architecture specific flags.  */
2823  if (arch == E_NDS_ARCH_STAR_V1_0)
2824    {
2825      if (config & E_NDS32_HAS_MFUSR_PC_INST)
2826	r += snprintf (buf + r, size -r, ", MFUSR_PC");
2827
2828      if (!(config & E_NDS32_HAS_NO_MAC_INST))
2829	r += snprintf (buf + r, size -r, ", MAC");
2830
2831      if (config & E_NDS32_HAS_DIV_INST)
2832	r += snprintf (buf + r, size -r, ", DIV");
2833
2834      if (config & E_NDS32_HAS_16BIT_INST)
2835	r += snprintf (buf + r, size -r, ", 16b");
2836    }
2837  else
2838    {
2839      if (config & E_NDS32_HAS_MFUSR_PC_INST)
2840	{
2841	  if (version <= E_NDS32_ELF_VER_1_3)
2842	    r += snprintf (buf + r, size -r, ", [B8]");
2843	  else
2844	    r += snprintf (buf + r, size -r, ", EX9");
2845	}
2846
2847      if (config & E_NDS32_HAS_MAC_DX_INST)
2848	r += snprintf (buf + r, size -r, ", MAC_DX");
2849
2850      if (config & E_NDS32_HAS_DIV_DX_INST)
2851	r += snprintf (buf + r, size -r, ", DIV_DX");
2852
2853      if (config & E_NDS32_HAS_16BIT_INST)
2854	{
2855	  if (version <= E_NDS32_ELF_VER_1_3)
2856	    r += snprintf (buf + r, size -r, ", 16b");
2857	  else
2858	    r += snprintf (buf + r, size -r, ", IFC");
2859	}
2860    }
2861
2862  if (config & E_NDS32_HAS_EXT_INST)
2863    r += snprintf (buf + r, size -r, ", PERF1");
2864
2865  if (config & E_NDS32_HAS_EXT2_INST)
2866    r += snprintf (buf + r, size -r, ", PERF2");
2867
2868  if (config & E_NDS32_HAS_FPU_INST)
2869    {
2870      has_fpu = 1;
2871      r += snprintf (buf + r, size -r, ", FPU_SP");
2872    }
2873
2874  if (config & E_NDS32_HAS_FPU_DP_INST)
2875    {
2876      has_fpu = 1;
2877      r += snprintf (buf + r, size -r, ", FPU_DP");
2878    }
2879
2880  if (config & E_NDS32_HAS_FPU_MAC_INST)
2881    {
2882      has_fpu = 1;
2883      r += snprintf (buf + r, size -r, ", FPU_MAC");
2884    }
2885
2886  if (has_fpu)
2887    {
2888      switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
2889	{
2890	case E_NDS32_FPU_REG_8SP_4DP:
2891	  r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
2892	  break;
2893	case E_NDS32_FPU_REG_16SP_8DP:
2894	  r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
2895	  break;
2896	case E_NDS32_FPU_REG_32SP_16DP:
2897	  r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
2898	  break;
2899	case E_NDS32_FPU_REG_32SP_32DP:
2900	  r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
2901	  break;
2902	}
2903    }
2904
2905  if (config & E_NDS32_HAS_AUDIO_INST)
2906    r += snprintf (buf + r, size -r, ", AUDIO");
2907
2908  if (config & E_NDS32_HAS_STRING_INST)
2909    r += snprintf (buf + r, size -r, ", STR");
2910
2911  if (config & E_NDS32_HAS_REDUCED_REGS)
2912    r += snprintf (buf + r, size -r, ", 16REG");
2913
2914  if (config & E_NDS32_HAS_VIDEO_INST)
2915    {
2916      if (version <= E_NDS32_ELF_VER_1_3)
2917	r += snprintf (buf + r, size -r, ", VIDEO");
2918      else
2919	r += snprintf (buf + r, size -r, ", SATURATION");
2920    }
2921
2922  if (config & E_NDS32_HAS_ENCRIPT_INST)
2923    r += snprintf (buf + r, size -r, ", ENCRP");
2924
2925  if (config & E_NDS32_HAS_L2C_INST)
2926    r += snprintf (buf + r, size -r, ", L2C");
2927}
2928
2929static char *
2930get_machine_flags (unsigned e_flags, unsigned e_machine)
2931{
2932  static char buf[1024];
2933
2934  buf[0] = '\0';
2935
2936  if (e_flags)
2937    {
2938      switch (e_machine)
2939	{
2940	default:
2941	  break;
2942
2943	case EM_ARC_COMPACT2:
2944	case EM_ARC_COMPACT:
2945          decode_ARC_machine_flags (e_flags, e_machine, buf);
2946          break;
2947
2948	case EM_ARM:
2949	  decode_ARM_machine_flags (e_flags, buf);
2950	  break;
2951
2952        case EM_AVR:
2953          decode_AVR_machine_flags (e_flags, buf, sizeof buf);
2954          break;
2955
2956	case EM_BLACKFIN:
2957	  if (e_flags & EF_BFIN_PIC)
2958	    strcat (buf, ", PIC");
2959
2960	  if (e_flags & EF_BFIN_FDPIC)
2961	    strcat (buf, ", FDPIC");
2962
2963	  if (e_flags & EF_BFIN_CODE_IN_L1)
2964	    strcat (buf, ", code in L1");
2965
2966	  if (e_flags & EF_BFIN_DATA_IN_L1)
2967	    strcat (buf, ", data in L1");
2968
2969	  break;
2970
2971	case EM_CYGNUS_FRV:
2972	  switch (e_flags & EF_FRV_CPU_MASK)
2973	    {
2974	    case EF_FRV_CPU_GENERIC:
2975	      break;
2976
2977	    default:
2978	      strcat (buf, ", fr???");
2979	      break;
2980
2981	    case EF_FRV_CPU_FR300:
2982	      strcat (buf, ", fr300");
2983	      break;
2984
2985	    case EF_FRV_CPU_FR400:
2986	      strcat (buf, ", fr400");
2987	      break;
2988	    case EF_FRV_CPU_FR405:
2989	      strcat (buf, ", fr405");
2990	      break;
2991
2992	    case EF_FRV_CPU_FR450:
2993	      strcat (buf, ", fr450");
2994	      break;
2995
2996	    case EF_FRV_CPU_FR500:
2997	      strcat (buf, ", fr500");
2998	      break;
2999	    case EF_FRV_CPU_FR550:
3000	      strcat (buf, ", fr550");
3001	      break;
3002
3003	    case EF_FRV_CPU_SIMPLE:
3004	      strcat (buf, ", simple");
3005	      break;
3006	    case EF_FRV_CPU_TOMCAT:
3007	      strcat (buf, ", tomcat");
3008	      break;
3009	    }
3010	  break;
3011
3012	case EM_68K:
3013	  if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
3014	    strcat (buf, ", m68000");
3015	  else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
3016	    strcat (buf, ", cpu32");
3017	  else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
3018	    strcat (buf, ", fido_a");
3019	  else
3020	    {
3021	      char const * isa = _("unknown");
3022	      char const * mac = _("unknown mac");
3023	      char const * additional = NULL;
3024
3025	      switch (e_flags & EF_M68K_CF_ISA_MASK)
3026		{
3027		case EF_M68K_CF_ISA_A_NODIV:
3028		  isa = "A";
3029		  additional = ", nodiv";
3030		  break;
3031		case EF_M68K_CF_ISA_A:
3032		  isa = "A";
3033		  break;
3034		case EF_M68K_CF_ISA_A_PLUS:
3035		  isa = "A+";
3036		  break;
3037		case EF_M68K_CF_ISA_B_NOUSP:
3038		  isa = "B";
3039		  additional = ", nousp";
3040		  break;
3041		case EF_M68K_CF_ISA_B:
3042		  isa = "B";
3043		  break;
3044		case EF_M68K_CF_ISA_C:
3045		  isa = "C";
3046		  break;
3047		case EF_M68K_CF_ISA_C_NODIV:
3048		  isa = "C";
3049		  additional = ", nodiv";
3050		  break;
3051		}
3052	      strcat (buf, ", cf, isa ");
3053	      strcat (buf, isa);
3054	      if (additional)
3055		strcat (buf, additional);
3056	      if (e_flags & EF_M68K_CF_FLOAT)
3057		strcat (buf, ", float");
3058	      switch (e_flags & EF_M68K_CF_MAC_MASK)
3059		{
3060		case 0:
3061		  mac = NULL;
3062		  break;
3063		case EF_M68K_CF_MAC:
3064		  mac = "mac";
3065		  break;
3066		case EF_M68K_CF_EMAC:
3067		  mac = "emac";
3068		  break;
3069		case EF_M68K_CF_EMAC_B:
3070		  mac = "emac_b";
3071		  break;
3072		}
3073	      if (mac)
3074		{
3075		  strcat (buf, ", ");
3076		  strcat (buf, mac);
3077		}
3078	    }
3079	  break;
3080
3081	case EM_CYGNUS_MEP:
3082	  switch (e_flags & EF_MEP_CPU_MASK)
3083	    {
3084	    case EF_MEP_CPU_MEP: strcat (buf, ", generic MeP"); break;
3085	    case EF_MEP_CPU_C2: strcat (buf, ", MeP C2"); break;
3086	    case EF_MEP_CPU_C3: strcat (buf, ", MeP C3"); break;
3087	    case EF_MEP_CPU_C4: strcat (buf, ", MeP C4"); break;
3088	    case EF_MEP_CPU_C5: strcat (buf, ", MeP C5"); break;
3089	    case EF_MEP_CPU_H1: strcat (buf, ", MeP H1"); break;
3090	    default: strcat (buf, _(", <unknown MeP cpu type>")); break;
3091	    }
3092
3093	  switch (e_flags & EF_MEP_COP_MASK)
3094	    {
3095	    case EF_MEP_COP_NONE: break;
3096	    case EF_MEP_COP_AVC: strcat (buf, ", AVC coprocessor"); break;
3097	    case EF_MEP_COP_AVC2: strcat (buf, ", AVC2 coprocessor"); break;
3098	    case EF_MEP_COP_FMAX: strcat (buf, ", FMAX coprocessor"); break;
3099	    case EF_MEP_COP_IVC2: strcat (buf, ", IVC2 coprocessor"); break;
3100	    default: strcat (buf, _("<unknown MeP copro type>")); break;
3101	    }
3102
3103	  if (e_flags & EF_MEP_LIBRARY)
3104	    strcat (buf, ", Built for Library");
3105
3106	  if (e_flags & EF_MEP_INDEX_MASK)
3107	    sprintf (buf + strlen (buf), ", Configuration Index: %#x",
3108		     e_flags & EF_MEP_INDEX_MASK);
3109
3110	  if (e_flags & ~ EF_MEP_ALL_FLAGS)
3111	    sprintf (buf + strlen (buf), _(", unknown flags bits: %#x"),
3112		     e_flags & ~ EF_MEP_ALL_FLAGS);
3113	  break;
3114
3115	case EM_PPC:
3116	  if (e_flags & EF_PPC_EMB)
3117	    strcat (buf, ", emb");
3118
3119	  if (e_flags & EF_PPC_RELOCATABLE)
3120	    strcat (buf, _(", relocatable"));
3121
3122	  if (e_flags & EF_PPC_RELOCATABLE_LIB)
3123	    strcat (buf, _(", relocatable-lib"));
3124	  break;
3125
3126	case EM_PPC64:
3127	  if (e_flags & EF_PPC64_ABI)
3128	    {
3129	      char abi[] = ", abiv0";
3130
3131	      abi[6] += e_flags & EF_PPC64_ABI;
3132	      strcat (buf, abi);
3133	    }
3134	  break;
3135
3136	case EM_V800:
3137	  if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
3138	    strcat (buf, ", RH850 ABI");
3139
3140	  if (e_flags & EF_V800_850E3)
3141	    strcat (buf, ", V3 architecture");
3142
3143	  if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
3144	    strcat (buf, ", FPU not used");
3145
3146	  if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
3147	    strcat (buf, ", regmode: COMMON");
3148
3149	  if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
3150	    strcat (buf, ", r4 not used");
3151
3152	  if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
3153	    strcat (buf, ", r30 not used");
3154
3155	  if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
3156	    strcat (buf, ", r5 not used");
3157
3158	  if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
3159	    strcat (buf, ", r2 not used");
3160
3161	  for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
3162	    {
3163	      switch (e_flags & - e_flags)
3164		{
3165		case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
3166		case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
3167		case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
3168		case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
3169		case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
3170		case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
3171		case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
3172		case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
3173		case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
3174		case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
3175		case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
3176		case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
3177		default: break;
3178		}
3179	    }
3180	  break;
3181
3182	case EM_V850:
3183	case EM_CYGNUS_V850:
3184	  switch (e_flags & EF_V850_ARCH)
3185	    {
3186	    case E_V850E3V5_ARCH:
3187	      strcat (buf, ", v850e3v5");
3188	      break;
3189	    case E_V850E2V3_ARCH:
3190	      strcat (buf, ", v850e2v3");
3191	      break;
3192	    case E_V850E2_ARCH:
3193	      strcat (buf, ", v850e2");
3194	      break;
3195            case E_V850E1_ARCH:
3196              strcat (buf, ", v850e1");
3197	      break;
3198	    case E_V850E_ARCH:
3199	      strcat (buf, ", v850e");
3200	      break;
3201	    case E_V850_ARCH:
3202	      strcat (buf, ", v850");
3203	      break;
3204	    default:
3205	      strcat (buf, _(", unknown v850 architecture variant"));
3206	      break;
3207	    }
3208	  break;
3209
3210	case EM_M32R:
3211	case EM_CYGNUS_M32R:
3212	  if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3213	    strcat (buf, ", m32r");
3214	  break;
3215
3216	case EM_MIPS:
3217	case EM_MIPS_RS3_LE:
3218	  if (e_flags & EF_MIPS_NOREORDER)
3219	    strcat (buf, ", noreorder");
3220
3221	  if (e_flags & EF_MIPS_PIC)
3222	    strcat (buf, ", pic");
3223
3224	  if (e_flags & EF_MIPS_CPIC)
3225	    strcat (buf, ", cpic");
3226
3227	  if (e_flags & EF_MIPS_UCODE)
3228	    strcat (buf, ", ugen_reserved");
3229
3230	  if (e_flags & EF_MIPS_ABI2)
3231	    strcat (buf, ", abi2");
3232
3233	  if (e_flags & EF_MIPS_OPTIONS_FIRST)
3234	    strcat (buf, ", odk first");
3235
3236	  if (e_flags & EF_MIPS_32BITMODE)
3237	    strcat (buf, ", 32bitmode");
3238
3239	  if (e_flags & EF_MIPS_NAN2008)
3240	    strcat (buf, ", nan2008");
3241
3242	  if (e_flags & EF_MIPS_FP64)
3243	    strcat (buf, ", fp64");
3244
3245	  switch ((e_flags & EF_MIPS_MACH))
3246	    {
3247	    case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3248	    case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3249	    case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
3250	    case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
3251	    case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3252	    case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3253	    case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3254	    case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
3255	    case E_MIPS_MACH_SB1:  strcat (buf, ", sb1");  break;
3256	    case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
3257  	    case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3258  	    case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
3259  	    case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
3260	    case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
3261	    case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
3262	    case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
3263	    case E_MIPS_MACH_XLR:  strcat (buf, ", xlr"); break;
3264	    case 0:
3265	    /* We simply ignore the field in this case to avoid confusion:
3266	       MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3267	       extension.  */
3268	      break;
3269	    default: strcat (buf, _(", unknown CPU")); break;
3270	    }
3271
3272	  switch ((e_flags & EF_MIPS_ABI))
3273	    {
3274	    case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3275	    case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3276	    case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3277	    case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3278	    case 0:
3279	    /* We simply ignore the field in this case to avoid confusion:
3280	       MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3281	       This means it is likely to be an o32 file, but not for
3282	       sure.  */
3283	      break;
3284	    default: strcat (buf, _(", unknown ABI")); break;
3285	    }
3286
3287	  if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3288	    strcat (buf, ", mdmx");
3289
3290	  if (e_flags & EF_MIPS_ARCH_ASE_M16)
3291	    strcat (buf, ", mips16");
3292
3293	  if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3294	    strcat (buf, ", micromips");
3295
3296	  switch ((e_flags & EF_MIPS_ARCH))
3297	    {
3298	    case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3299	    case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3300	    case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3301	    case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3302	    case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3303	    case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
3304	    case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
3305	    case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
3306	    case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
3307	    case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
3308	    case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
3309	    default: strcat (buf, _(", unknown ISA")); break;
3310	    }
3311	  break;
3312
3313	case EM_NDS32:
3314	  decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3315	  break;
3316
3317	case EM_RISCV:
3318	  if (e_flags & EF_RISCV_RVC)
3319	    strcat (buf, ", RVC");
3320
3321	  switch (e_flags & EF_RISCV_FLOAT_ABI)
3322	    {
3323	    case EF_RISCV_FLOAT_ABI_SOFT:
3324	      strcat (buf, ", soft-float ABI");
3325	      break;
3326
3327	    case EF_RISCV_FLOAT_ABI_SINGLE:
3328	      strcat (buf, ", single-float ABI");
3329	      break;
3330
3331	    case EF_RISCV_FLOAT_ABI_DOUBLE:
3332	      strcat (buf, ", double-float ABI");
3333	      break;
3334
3335	    case EF_RISCV_FLOAT_ABI_QUAD:
3336	      strcat (buf, ", quad-float ABI");
3337	      break;
3338	    }
3339	  break;
3340
3341	case EM_SH:
3342	  switch ((e_flags & EF_SH_MACH_MASK))
3343	    {
3344	    case EF_SH1: strcat (buf, ", sh1"); break;
3345	    case EF_SH2: strcat (buf, ", sh2"); break;
3346	    case EF_SH3: strcat (buf, ", sh3"); break;
3347	    case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3348	    case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3349	    case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3350	    case EF_SH3E: strcat (buf, ", sh3e"); break;
3351	    case EF_SH4: strcat (buf, ", sh4"); break;
3352	    case EF_SH5: strcat (buf, ", sh5"); break;
3353	    case EF_SH2E: strcat (buf, ", sh2e"); break;
3354	    case EF_SH4A: strcat (buf, ", sh4a"); break;
3355	    case EF_SH2A: strcat (buf, ", sh2a"); break;
3356	    case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3357	    case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
3358	    case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
3359	    case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3360	    case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3361	    case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3362	    case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3363	    case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3364	    case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
3365	    default: strcat (buf, _(", unknown ISA")); break;
3366	    }
3367
3368	  if (e_flags & EF_SH_PIC)
3369	    strcat (buf, ", pic");
3370
3371	  if (e_flags & EF_SH_FDPIC)
3372	    strcat (buf, ", fdpic");
3373	  break;
3374
3375        case EM_OR1K:
3376          if (e_flags & EF_OR1K_NODELAY)
3377            strcat (buf, ", no delay");
3378          break;
3379
3380	case EM_SPARCV9:
3381	  if (e_flags & EF_SPARC_32PLUS)
3382	    strcat (buf, ", v8+");
3383
3384	  if (e_flags & EF_SPARC_SUN_US1)
3385	    strcat (buf, ", ultrasparcI");
3386
3387	  if (e_flags & EF_SPARC_SUN_US3)
3388	    strcat (buf, ", ultrasparcIII");
3389
3390	  if (e_flags & EF_SPARC_HAL_R1)
3391	    strcat (buf, ", halr1");
3392
3393	  if (e_flags & EF_SPARC_LEDATA)
3394	    strcat (buf, ", ledata");
3395
3396	  if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3397	    strcat (buf, ", tso");
3398
3399	  if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3400	    strcat (buf, ", pso");
3401
3402	  if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3403	    strcat (buf, ", rmo");
3404	  break;
3405
3406	case EM_PARISC:
3407	  switch (e_flags & EF_PARISC_ARCH)
3408	    {
3409	    case EFA_PARISC_1_0:
3410	      strcpy (buf, ", PA-RISC 1.0");
3411	      break;
3412	    case EFA_PARISC_1_1:
3413	      strcpy (buf, ", PA-RISC 1.1");
3414	      break;
3415	    case EFA_PARISC_2_0:
3416	      strcpy (buf, ", PA-RISC 2.0");
3417	      break;
3418	    default:
3419	      break;
3420	    }
3421	  if (e_flags & EF_PARISC_TRAPNIL)
3422	    strcat (buf, ", trapnil");
3423	  if (e_flags & EF_PARISC_EXT)
3424	    strcat (buf, ", ext");
3425	  if (e_flags & EF_PARISC_LSB)
3426	    strcat (buf, ", lsb");
3427	  if (e_flags & EF_PARISC_WIDE)
3428	    strcat (buf, ", wide");
3429	  if (e_flags & EF_PARISC_NO_KABP)
3430	    strcat (buf, ", no kabp");
3431	  if (e_flags & EF_PARISC_LAZYSWAP)
3432	    strcat (buf, ", lazyswap");
3433	  break;
3434
3435	case EM_PJ:
3436	case EM_PJ_OLD:
3437	  if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3438	    strcat (buf, ", new calling convention");
3439
3440	  if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3441	    strcat (buf, ", gnu calling convention");
3442	  break;
3443
3444	case EM_IA_64:
3445	  if ((e_flags & EF_IA_64_ABI64))
3446	    strcat (buf, ", 64-bit");
3447	  else
3448	    strcat (buf, ", 32-bit");
3449	  if ((e_flags & EF_IA_64_REDUCEDFP))
3450	    strcat (buf, ", reduced fp model");
3451	  if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3452	    strcat (buf, ", no function descriptors, constant gp");
3453	  else if ((e_flags & EF_IA_64_CONS_GP))
3454	    strcat (buf, ", constant gp");
3455	  if ((e_flags & EF_IA_64_ABSOLUTE))
3456	    strcat (buf, ", absolute");
3457          if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3458            {
3459              if ((e_flags & EF_IA_64_VMS_LINKAGES))
3460                strcat (buf, ", vms_linkages");
3461              switch ((e_flags & EF_IA_64_VMS_COMCOD))
3462                {
3463                case EF_IA_64_VMS_COMCOD_SUCCESS:
3464                  break;
3465                case EF_IA_64_VMS_COMCOD_WARNING:
3466                  strcat (buf, ", warning");
3467                  break;
3468                case EF_IA_64_VMS_COMCOD_ERROR:
3469                  strcat (buf, ", error");
3470                  break;
3471                case EF_IA_64_VMS_COMCOD_ABORT:
3472                  strcat (buf, ", abort");
3473                  break;
3474                default:
3475		  warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3476			e_flags & EF_IA_64_VMS_COMCOD);
3477		  strcat (buf, ", <unknown>");
3478                }
3479            }
3480	  break;
3481
3482	case EM_VAX:
3483	  if ((e_flags & EF_VAX_NONPIC))
3484	    strcat (buf, ", non-PIC");
3485	  if ((e_flags & EF_VAX_DFLOAT))
3486	    strcat (buf, ", D-Float");
3487	  if ((e_flags & EF_VAX_GFLOAT))
3488	    strcat (buf, ", G-Float");
3489	  break;
3490
3491        case EM_VISIUM:
3492	  if (e_flags & EF_VISIUM_ARCH_MCM)
3493	    strcat (buf, ", mcm");
3494	  else if (e_flags & EF_VISIUM_ARCH_MCM24)
3495	    strcat (buf, ", mcm24");
3496	  if (e_flags & EF_VISIUM_ARCH_GR6)
3497	    strcat (buf, ", gr6");
3498	  break;
3499
3500	case EM_RL78:
3501	  switch (e_flags & E_FLAG_RL78_CPU_MASK)
3502	    {
3503	    case E_FLAG_RL78_ANY_CPU: break;
3504	    case E_FLAG_RL78_G10: strcat (buf, ", G10"); break;
3505	    case E_FLAG_RL78_G13: strcat (buf, ", G13"); break;
3506	    case E_FLAG_RL78_G14: strcat (buf, ", G14"); break;
3507	    }
3508	  if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3509	    strcat (buf, ", 64-bit doubles");
3510	  break;
3511
3512	case EM_RX:
3513	  if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3514	    strcat (buf, ", 64-bit doubles");
3515	  if (e_flags & E_FLAG_RX_DSP)
3516	    strcat (buf, ", dsp");
3517	  if (e_flags & E_FLAG_RX_PID)
3518	    strcat (buf, ", pid");
3519	  if (e_flags & E_FLAG_RX_ABI)
3520	    strcat (buf, ", RX ABI");
3521	  if (e_flags & E_FLAG_RX_SINSNS_SET)
3522	    strcat (buf, e_flags & E_FLAG_RX_SINSNS_YES
3523		    ? ", uses String instructions" : ", bans String instructions");
3524	  if (e_flags & E_FLAG_RX_V2)
3525	    strcat (buf, ", V2");
3526	  break;
3527
3528	case EM_S390:
3529	  if (e_flags & EF_S390_HIGH_GPRS)
3530	    strcat (buf, ", highgprs");
3531	  break;
3532
3533	case EM_TI_C6000:
3534	  if ((e_flags & EF_C6000_REL))
3535	    strcat (buf, ", relocatable module");
3536	  break;
3537
3538	case EM_MSP430:
3539	  strcat (buf, _(": architecture variant: "));
3540	  switch (e_flags & EF_MSP430_MACH)
3541	    {
3542	    case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3543	    case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3544	    case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3545	    case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3546	    case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3547	    case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3548	    case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3549	    case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3550	    case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3551	    case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3552	    case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3553	    case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3554	    case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3555	    case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3556	    case E_MSP430_MACH_MSP430X  : strcat (buf, "MSP430X"); break;
3557	    default:
3558	      strcat (buf, _(": unknown")); break;
3559	    }
3560
3561	  if (e_flags & ~ EF_MSP430_MACH)
3562	    strcat (buf, _(": unknown extra flag bits also present"));
3563	}
3564    }
3565
3566  return buf;
3567}
3568
3569static const char *
3570get_osabi_name (unsigned int osabi)
3571{
3572  static char buff[32];
3573
3574  switch (osabi)
3575    {
3576    case ELFOSABI_NONE:		return "UNIX - System V";
3577    case ELFOSABI_HPUX:		return "UNIX - HP-UX";
3578    case ELFOSABI_NETBSD:	return "UNIX - NetBSD";
3579    case ELFOSABI_GNU:		return "UNIX - GNU";
3580    case ELFOSABI_SOLARIS:	return "UNIX - Solaris";
3581    case ELFOSABI_AIX:		return "UNIX - AIX";
3582    case ELFOSABI_IRIX:		return "UNIX - IRIX";
3583    case ELFOSABI_FREEBSD:	return "UNIX - FreeBSD";
3584    case ELFOSABI_TRU64:	return "UNIX - TRU64";
3585    case ELFOSABI_MODESTO:	return "Novell - Modesto";
3586    case ELFOSABI_OPENBSD:	return "UNIX - OpenBSD";
3587    case ELFOSABI_OPENVMS:	return "VMS - OpenVMS";
3588    case ELFOSABI_NSK:		return "HP - Non-Stop Kernel";
3589    case ELFOSABI_AROS:		return "AROS";
3590    case ELFOSABI_FENIXOS:	return "FenixOS";
3591    case ELFOSABI_CLOUDABI:	return "Nuxi CloudABI";
3592    case ELFOSABI_OPENVOS:	return "Stratus Technologies OpenVOS";
3593    default:
3594      if (osabi >= 64)
3595	switch (elf_header.e_machine)
3596	  {
3597	  case EM_ARM:
3598	    switch (osabi)
3599	      {
3600	      case ELFOSABI_ARM:	return "ARM";
3601	      default:
3602		break;
3603	      }
3604	    break;
3605
3606	  case EM_MSP430:
3607	  case EM_MSP430_OLD:
3608	  case EM_VISIUM:
3609	    switch (osabi)
3610	      {
3611	      case ELFOSABI_STANDALONE:	return _("Standalone App");
3612	      default:
3613		break;
3614	      }
3615	    break;
3616
3617	  case EM_TI_C6000:
3618	    switch (osabi)
3619	      {
3620	      case ELFOSABI_C6000_ELFABI:	return _("Bare-metal C6000");
3621	      case ELFOSABI_C6000_LINUX:	return "Linux C6000";
3622	      default:
3623		break;
3624	      }
3625	    break;
3626
3627	  default:
3628	    break;
3629	  }
3630      snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3631      return buff;
3632    }
3633}
3634
3635static const char *
3636get_aarch64_segment_type (unsigned long type)
3637{
3638  switch (type)
3639    {
3640    case PT_AARCH64_ARCHEXT:
3641      return "AARCH64_ARCHEXT";
3642    default:
3643      break;
3644    }
3645
3646  return NULL;
3647}
3648
3649static const char *
3650get_arm_segment_type (unsigned long type)
3651{
3652  switch (type)
3653    {
3654    case PT_ARM_EXIDX:
3655      return "EXIDX";
3656    default:
3657      break;
3658    }
3659
3660  return NULL;
3661}
3662
3663static const char *
3664get_mips_segment_type (unsigned long type)
3665{
3666  switch (type)
3667    {
3668    case PT_MIPS_REGINFO:
3669      return "REGINFO";
3670    case PT_MIPS_RTPROC:
3671      return "RTPROC";
3672    case PT_MIPS_OPTIONS:
3673      return "OPTIONS";
3674    case PT_MIPS_ABIFLAGS:
3675      return "ABIFLAGS";
3676    default:
3677      break;
3678    }
3679
3680  return NULL;
3681}
3682
3683static const char *
3684get_parisc_segment_type (unsigned long type)
3685{
3686  switch (type)
3687    {
3688    case PT_HP_TLS:		return "HP_TLS";
3689    case PT_HP_CORE_NONE:	return "HP_CORE_NONE";
3690    case PT_HP_CORE_VERSION:	return "HP_CORE_VERSION";
3691    case PT_HP_CORE_KERNEL:	return "HP_CORE_KERNEL";
3692    case PT_HP_CORE_COMM:	return "HP_CORE_COMM";
3693    case PT_HP_CORE_PROC:	return "HP_CORE_PROC";
3694    case PT_HP_CORE_LOADABLE:	return "HP_CORE_LOADABLE";
3695    case PT_HP_CORE_STACK:	return "HP_CORE_STACK";
3696    case PT_HP_CORE_SHM:	return "HP_CORE_SHM";
3697    case PT_HP_CORE_MMF:	return "HP_CORE_MMF";
3698    case PT_HP_PARALLEL:	return "HP_PARALLEL";
3699    case PT_HP_FASTBIND:	return "HP_FASTBIND";
3700    case PT_HP_OPT_ANNOT:	return "HP_OPT_ANNOT";
3701    case PT_HP_HSL_ANNOT:	return "HP_HSL_ANNOT";
3702    case PT_HP_STACK:		return "HP_STACK";
3703    case PT_HP_CORE_UTSNAME:	return "HP_CORE_UTSNAME";
3704    case PT_PARISC_ARCHEXT:	return "PARISC_ARCHEXT";
3705    case PT_PARISC_UNWIND:	return "PARISC_UNWIND";
3706    case PT_PARISC_WEAKORDER:	return "PARISC_WEAKORDER";
3707    default:
3708      break;
3709    }
3710
3711  return NULL;
3712}
3713
3714static const char *
3715get_ia64_segment_type (unsigned long type)
3716{
3717  switch (type)
3718    {
3719    case PT_IA_64_ARCHEXT:	return "IA_64_ARCHEXT";
3720    case PT_IA_64_UNWIND:	return "IA_64_UNWIND";
3721    case PT_HP_TLS:		return "HP_TLS";
3722    case PT_IA_64_HP_OPT_ANOT:	return "HP_OPT_ANNOT";
3723    case PT_IA_64_HP_HSL_ANOT:	return "HP_HSL_ANNOT";
3724    case PT_IA_64_HP_STACK:	return "HP_STACK";
3725    default:
3726      break;
3727    }
3728
3729  return NULL;
3730}
3731
3732static const char *
3733get_tic6x_segment_type (unsigned long type)
3734{
3735  switch (type)
3736    {
3737    case PT_C6000_PHATTR:	return "C6000_PHATTR";
3738    default:
3739      break;
3740    }
3741
3742  return NULL;
3743}
3744
3745static const char *
3746get_solaris_segment_type (unsigned long type)
3747{
3748  switch (type)
3749    {
3750    case 0x6464e550: return "PT_SUNW_UNWIND";
3751    case 0x6474e550: return "PT_SUNW_EH_FRAME";
3752    case 0x6ffffff7: return "PT_LOSUNW";
3753    case 0x6ffffffa: return "PT_SUNWBSS";
3754    case 0x6ffffffb: return "PT_SUNWSTACK";
3755    case 0x6ffffffc: return "PT_SUNWDTRACE";
3756    case 0x6ffffffd: return "PT_SUNWCAP";
3757    case 0x6fffffff: return "PT_HISUNW";
3758    default: return NULL;
3759    }
3760}
3761
3762static const char *
3763get_segment_type (unsigned long p_type)
3764{
3765  static char buff[32];
3766
3767  switch (p_type)
3768    {
3769    case PT_NULL:	return "NULL";
3770    case PT_LOAD:	return "LOAD";
3771    case PT_DYNAMIC:	return "DYNAMIC";
3772    case PT_INTERP:	return "INTERP";
3773    case PT_NOTE:	return "NOTE";
3774    case PT_SHLIB:	return "SHLIB";
3775    case PT_PHDR:	return "PHDR";
3776    case PT_TLS:	return "TLS";
3777
3778    case PT_GNU_EH_FRAME:
3779			return "GNU_EH_FRAME";
3780    case PT_GNU_STACK:	return "GNU_STACK";
3781    case PT_GNU_RELRO:  return "GNU_RELRO";
3782
3783    default:
3784      if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3785	{
3786	  const char * result;
3787
3788	  switch (elf_header.e_machine)
3789	    {
3790	    case EM_AARCH64:
3791	      result = get_aarch64_segment_type (p_type);
3792	      break;
3793	    case EM_ARM:
3794	      result = get_arm_segment_type (p_type);
3795	      break;
3796	    case EM_MIPS:
3797	    case EM_MIPS_RS3_LE:
3798	      result = get_mips_segment_type (p_type);
3799	      break;
3800	    case EM_PARISC:
3801	      result = get_parisc_segment_type (p_type);
3802	      break;
3803	    case EM_IA_64:
3804	      result = get_ia64_segment_type (p_type);
3805	      break;
3806	    case EM_TI_C6000:
3807	      result = get_tic6x_segment_type (p_type);
3808	      break;
3809	    default:
3810	      result = NULL;
3811	      break;
3812	    }
3813
3814	  if (result != NULL)
3815	    return result;
3816
3817	  sprintf (buff, "LOPROC+%#lx", p_type - PT_LOPROC);
3818	}
3819      else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3820	{
3821	  const char * result;
3822
3823	  switch (elf_header.e_machine)
3824	    {
3825	    case EM_PARISC:
3826	      result = get_parisc_segment_type (p_type);
3827	      break;
3828	    case EM_IA_64:
3829	      result = get_ia64_segment_type (p_type);
3830	      break;
3831	    default:
3832	      if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
3833		result = get_solaris_segment_type (p_type);
3834	      else
3835		result = NULL;
3836	      break;
3837	    }
3838
3839	  if (result != NULL)
3840	    return result;
3841
3842	  sprintf (buff, "LOOS+%#lx", p_type - PT_LOOS);
3843	}
3844      else
3845	snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
3846
3847      return buff;
3848    }
3849}
3850
3851static const char *
3852get_mips_section_type_name (unsigned int sh_type)
3853{
3854  switch (sh_type)
3855    {
3856    case SHT_MIPS_LIBLIST:	 return "MIPS_LIBLIST";
3857    case SHT_MIPS_MSYM:		 return "MIPS_MSYM";
3858    case SHT_MIPS_CONFLICT:	 return "MIPS_CONFLICT";
3859    case SHT_MIPS_GPTAB:	 return "MIPS_GPTAB";
3860    case SHT_MIPS_UCODE:	 return "MIPS_UCODE";
3861    case SHT_MIPS_DEBUG:	 return "MIPS_DEBUG";
3862    case SHT_MIPS_REGINFO:	 return "MIPS_REGINFO";
3863    case SHT_MIPS_PACKAGE:	 return "MIPS_PACKAGE";
3864    case SHT_MIPS_PACKSYM:	 return "MIPS_PACKSYM";
3865    case SHT_MIPS_RELD:		 return "MIPS_RELD";
3866    case SHT_MIPS_IFACE:	 return "MIPS_IFACE";
3867    case SHT_MIPS_CONTENT:	 return "MIPS_CONTENT";
3868    case SHT_MIPS_OPTIONS:	 return "MIPS_OPTIONS";
3869    case SHT_MIPS_SHDR:		 return "MIPS_SHDR";
3870    case SHT_MIPS_FDESC:	 return "MIPS_FDESC";
3871    case SHT_MIPS_EXTSYM:	 return "MIPS_EXTSYM";
3872    case SHT_MIPS_DENSE:	 return "MIPS_DENSE";
3873    case SHT_MIPS_PDESC:	 return "MIPS_PDESC";
3874    case SHT_MIPS_LOCSYM:	 return "MIPS_LOCSYM";
3875    case SHT_MIPS_AUXSYM:	 return "MIPS_AUXSYM";
3876    case SHT_MIPS_OPTSYM:	 return "MIPS_OPTSYM";
3877    case SHT_MIPS_LOCSTR:	 return "MIPS_LOCSTR";
3878    case SHT_MIPS_LINE:		 return "MIPS_LINE";
3879    case SHT_MIPS_RFDESC:	 return "MIPS_RFDESC";
3880    case SHT_MIPS_DELTASYM:	 return "MIPS_DELTASYM";
3881    case SHT_MIPS_DELTAINST:	 return "MIPS_DELTAINST";
3882    case SHT_MIPS_DELTACLASS:	 return "MIPS_DELTACLASS";
3883    case SHT_MIPS_DWARF:	 return "MIPS_DWARF";
3884    case SHT_MIPS_DELTADECL:	 return "MIPS_DELTADECL";
3885    case SHT_MIPS_SYMBOL_LIB:	 return "MIPS_SYMBOL_LIB";
3886    case SHT_MIPS_EVENTS:	 return "MIPS_EVENTS";
3887    case SHT_MIPS_TRANSLATE:	 return "MIPS_TRANSLATE";
3888    case SHT_MIPS_PIXIE:	 return "MIPS_PIXIE";
3889    case SHT_MIPS_XLATE:	 return "MIPS_XLATE";
3890    case SHT_MIPS_XLATE_DEBUG:	 return "MIPS_XLATE_DEBUG";
3891    case SHT_MIPS_WHIRL:	 return "MIPS_WHIRL";
3892    case SHT_MIPS_EH_REGION:	 return "MIPS_EH_REGION";
3893    case SHT_MIPS_XLATE_OLD:	 return "MIPS_XLATE_OLD";
3894    case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
3895    case SHT_MIPS_ABIFLAGS:	 return "MIPS_ABIFLAGS";
3896    default:
3897      break;
3898    }
3899  return NULL;
3900}
3901
3902static const char *
3903get_parisc_section_type_name (unsigned int sh_type)
3904{
3905  switch (sh_type)
3906    {
3907    case SHT_PARISC_EXT:	return "PARISC_EXT";
3908    case SHT_PARISC_UNWIND:	return "PARISC_UNWIND";
3909    case SHT_PARISC_DOC:	return "PARISC_DOC";
3910    case SHT_PARISC_ANNOT:	return "PARISC_ANNOT";
3911    case SHT_PARISC_SYMEXTN:	return "PARISC_SYMEXTN";
3912    case SHT_PARISC_STUBS:	return "PARISC_STUBS";
3913    case SHT_PARISC_DLKM:	return "PARISC_DLKM";
3914    default:
3915      break;
3916    }
3917  return NULL;
3918}
3919
3920static const char *
3921get_ia64_section_type_name (unsigned int sh_type)
3922{
3923  /* If the top 8 bits are 0x78 the next 8 are the os/abi ID.  */
3924  if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
3925    return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
3926
3927  switch (sh_type)
3928    {
3929    case SHT_IA_64_EXT:		       return "IA_64_EXT";
3930    case SHT_IA_64_UNWIND:	       return "IA_64_UNWIND";
3931    case SHT_IA_64_PRIORITY_INIT:      return "IA_64_PRIORITY_INIT";
3932    case SHT_IA_64_VMS_TRACE:          return "VMS_TRACE";
3933    case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
3934    case SHT_IA_64_VMS_DEBUG:          return "VMS_DEBUG";
3935    case SHT_IA_64_VMS_DEBUG_STR:      return "VMS_DEBUG_STR";
3936    case SHT_IA_64_VMS_LINKAGES:       return "VMS_LINKAGES";
3937    case SHT_IA_64_VMS_SYMBOL_VECTOR:  return "VMS_SYMBOL_VECTOR";
3938    case SHT_IA_64_VMS_FIXUP:          return "VMS_FIXUP";
3939    default:
3940      break;
3941    }
3942  return NULL;
3943}
3944
3945static const char *
3946get_x86_64_section_type_name (unsigned int sh_type)
3947{
3948  switch (sh_type)
3949    {
3950    case SHT_X86_64_UNWIND:	return "X86_64_UNWIND";
3951    default:
3952      break;
3953    }
3954  return NULL;
3955}
3956
3957static const char *
3958get_aarch64_section_type_name (unsigned int sh_type)
3959{
3960  switch (sh_type)
3961    {
3962    case SHT_AARCH64_ATTRIBUTES:
3963      return "AARCH64_ATTRIBUTES";
3964    default:
3965      break;
3966    }
3967  return NULL;
3968}
3969
3970static const char *
3971get_arm_section_type_name (unsigned int sh_type)
3972{
3973  switch (sh_type)
3974    {
3975    case SHT_ARM_EXIDX:           return "ARM_EXIDX";
3976    case SHT_ARM_PREEMPTMAP:      return "ARM_PREEMPTMAP";
3977    case SHT_ARM_ATTRIBUTES:      return "ARM_ATTRIBUTES";
3978    case SHT_ARM_DEBUGOVERLAY:    return "ARM_DEBUGOVERLAY";
3979    case SHT_ARM_OVERLAYSECTION:  return "ARM_OVERLAYSECTION";
3980    default:
3981      break;
3982    }
3983  return NULL;
3984}
3985
3986static const char *
3987get_tic6x_section_type_name (unsigned int sh_type)
3988{
3989  switch (sh_type)
3990    {
3991    case SHT_C6000_UNWIND:
3992      return "C6000_UNWIND";
3993    case SHT_C6000_PREEMPTMAP:
3994      return "C6000_PREEMPTMAP";
3995    case SHT_C6000_ATTRIBUTES:
3996      return "C6000_ATTRIBUTES";
3997    case SHT_TI_ICODE:
3998      return "TI_ICODE";
3999    case SHT_TI_XREF:
4000      return "TI_XREF";
4001    case SHT_TI_HANDLER:
4002      return "TI_HANDLER";
4003    case SHT_TI_INITINFO:
4004      return "TI_INITINFO";
4005    case SHT_TI_PHATTRS:
4006      return "TI_PHATTRS";
4007    default:
4008      break;
4009    }
4010  return NULL;
4011}
4012
4013static const char *
4014get_msp430x_section_type_name (unsigned int sh_type)
4015{
4016  switch (sh_type)
4017    {
4018    case SHT_MSP430_SEC_FLAGS:   return "MSP430_SEC_FLAGS";
4019    case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
4020    case SHT_MSP430_ATTRIBUTES:  return "MSP430_ATTRIBUTES";
4021    default: return NULL;
4022    }
4023}
4024
4025static const char *
4026get_v850_section_type_name (unsigned int sh_type)
4027{
4028  switch (sh_type)
4029    {
4030    case SHT_V850_SCOMMON: return "V850 Small Common";
4031    case SHT_V850_TCOMMON: return "V850 Tiny Common";
4032    case SHT_V850_ZCOMMON: return "V850 Zero Common";
4033    case SHT_RENESAS_IOP:  return "RENESAS IOP";
4034    case SHT_RENESAS_INFO: return "RENESAS INFO";
4035    default: return NULL;
4036    }
4037}
4038
4039static const char *
4040get_section_type_name (unsigned int sh_type)
4041{
4042  static char buff[32];
4043  const char * result;
4044
4045  switch (sh_type)
4046    {
4047    case SHT_NULL:		return "NULL";
4048    case SHT_PROGBITS:		return "PROGBITS";
4049    case SHT_SYMTAB:		return "SYMTAB";
4050    case SHT_STRTAB:		return "STRTAB";
4051    case SHT_RELA:		return "RELA";
4052    case SHT_HASH:		return "HASH";
4053    case SHT_DYNAMIC:		return "DYNAMIC";
4054    case SHT_NOTE:		return "NOTE";
4055    case SHT_NOBITS:		return "NOBITS";
4056    case SHT_REL:		return "REL";
4057    case SHT_SHLIB:		return "SHLIB";
4058    case SHT_DYNSYM:		return "DYNSYM";
4059    case SHT_INIT_ARRAY:	return "INIT_ARRAY";
4060    case SHT_FINI_ARRAY:	return "FINI_ARRAY";
4061    case SHT_PREINIT_ARRAY:	return "PREINIT_ARRAY";
4062    case SHT_GNU_HASH:		return "GNU_HASH";
4063    case SHT_GROUP:		return "GROUP";
4064    case SHT_SYMTAB_SHNDX:	return "SYMTAB SECTION INDICIES";
4065    case SHT_GNU_verdef:	return "VERDEF";
4066    case SHT_GNU_verneed:	return "VERNEED";
4067    case SHT_GNU_versym:	return "VERSYM";
4068    case 0x6ffffff0:		return "VERSYM";
4069    case 0x6ffffffc:		return "VERDEF";
4070    case 0x7ffffffd:		return "AUXILIARY";
4071    case 0x7fffffff:		return "FILTER";
4072    case SHT_GNU_LIBLIST:	return "GNU_LIBLIST";
4073
4074    default:
4075      if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
4076	{
4077	  switch (elf_header.e_machine)
4078	    {
4079	    case EM_MIPS:
4080	    case EM_MIPS_RS3_LE:
4081	      result = get_mips_section_type_name (sh_type);
4082	      break;
4083	    case EM_PARISC:
4084	      result = get_parisc_section_type_name (sh_type);
4085	      break;
4086	    case EM_IA_64:
4087	      result = get_ia64_section_type_name (sh_type);
4088	      break;
4089	    case EM_X86_64:
4090	    case EM_L1OM:
4091	    case EM_K1OM:
4092	      result = get_x86_64_section_type_name (sh_type);
4093	      break;
4094	    case EM_AARCH64:
4095	      result = get_aarch64_section_type_name (sh_type);
4096	      break;
4097	    case EM_ARM:
4098	      result = get_arm_section_type_name (sh_type);
4099	      break;
4100	    case EM_TI_C6000:
4101	      result = get_tic6x_section_type_name (sh_type);
4102	      break;
4103	    case EM_MSP430:
4104	      result = get_msp430x_section_type_name (sh_type);
4105	      break;
4106	    case EM_V800:
4107	    case EM_V850:
4108	    case EM_CYGNUS_V850:
4109	      result = get_v850_section_type_name (sh_type);
4110	      break;
4111	    default:
4112	      result = NULL;
4113	      break;
4114	    }
4115
4116	  if (result != NULL)
4117	    return result;
4118
4119	  sprintf (buff, "LOPROC+%#x", sh_type - SHT_LOPROC);
4120	}
4121      else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
4122	{
4123	  switch (elf_header.e_machine)
4124	    {
4125	    case EM_IA_64:
4126	      result = get_ia64_section_type_name (sh_type);
4127	      break;
4128	    default:
4129	      if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
4130		result = get_solaris_section_type (sh_type);
4131	      else
4132		result = NULL;
4133	      break;
4134	    }
4135
4136	  if (result != NULL)
4137	    return result;
4138
4139	  sprintf (buff, "LOOS+%#x", sh_type - SHT_LOOS);
4140	}
4141      else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
4142	{
4143	  switch (elf_header.e_machine)
4144	    {
4145	    case EM_V800:
4146	    case EM_V850:
4147	    case EM_CYGNUS_V850:
4148	      result = get_v850_section_type_name (sh_type);
4149	      break;
4150	    default:
4151	      result = NULL;
4152	      break;
4153	    }
4154
4155	  if (result != NULL)
4156	    return result;
4157
4158	  sprintf (buff, "LOUSER+%#x", sh_type - SHT_LOUSER);
4159	}
4160      else
4161	/* This message is probably going to be displayed in a 15
4162	   character wide field, so put the hex value first.  */
4163	snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
4164
4165      return buff;
4166    }
4167}
4168
4169#define OPTION_DEBUG_DUMP	512
4170#define OPTION_DYN_SYMS		513
4171#define OPTION_DWARF_DEPTH	514
4172#define OPTION_DWARF_START	515
4173#define OPTION_DWARF_CHECK	516
4174
4175static struct option options[] =
4176{
4177  {"all",	       no_argument, 0, 'a'},
4178  {"file-header",      no_argument, 0, 'h'},
4179  {"program-headers",  no_argument, 0, 'l'},
4180  {"headers",	       no_argument, 0, 'e'},
4181  {"histogram",	       no_argument, 0, 'I'},
4182  {"segments",	       no_argument, 0, 'l'},
4183  {"sections",	       no_argument, 0, 'S'},
4184  {"section-headers",  no_argument, 0, 'S'},
4185  {"section-groups",   no_argument, 0, 'g'},
4186  {"section-details",  no_argument, 0, 't'},
4187  {"full-section-name",no_argument, 0, 'N'},
4188  {"symbols",	       no_argument, 0, 's'},
4189  {"syms",	       no_argument, 0, 's'},
4190  {"dyn-syms",	       no_argument, 0, OPTION_DYN_SYMS},
4191  {"relocs",	       no_argument, 0, 'r'},
4192  {"notes",	       no_argument, 0, 'n'},
4193  {"dynamic",	       no_argument, 0, 'd'},
4194  {"arch-specific",    no_argument, 0, 'A'},
4195  {"version-info",     no_argument, 0, 'V'},
4196  {"use-dynamic",      no_argument, 0, 'D'},
4197  {"unwind",	       no_argument, 0, 'u'},
4198  {"archive-index",    no_argument, 0, 'c'},
4199  {"hex-dump",	       required_argument, 0, 'x'},
4200  {"relocated-dump",   required_argument, 0, 'R'},
4201  {"string-dump",      required_argument, 0, 'p'},
4202  {"decompress",       no_argument, 0, 'z'},
4203#ifdef SUPPORT_DISASSEMBLY
4204  {"instruction-dump", required_argument, 0, 'i'},
4205#endif
4206  {"debug-dump",       optional_argument, 0, OPTION_DEBUG_DUMP},
4207
4208  {"dwarf-depth",      required_argument, 0, OPTION_DWARF_DEPTH},
4209  {"dwarf-start",      required_argument, 0, OPTION_DWARF_START},
4210  {"dwarf-check",      no_argument, 0, OPTION_DWARF_CHECK},
4211
4212  {"version",	       no_argument, 0, 'v'},
4213  {"wide",	       no_argument, 0, 'W'},
4214  {"help",	       no_argument, 0, 'H'},
4215  {0,		       no_argument, 0, 0}
4216};
4217
4218static void
4219usage (FILE * stream)
4220{
4221  fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
4222  fprintf (stream, _(" Display information about the contents of ELF format files\n"));
4223  fprintf (stream, _(" Options are:\n\
4224  -a --all               Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4225  -h --file-header       Display the ELF file header\n\
4226  -l --program-headers   Display the program headers\n\
4227     --segments          An alias for --program-headers\n\
4228  -S --section-headers   Display the sections' header\n\
4229     --sections          An alias for --section-headers\n\
4230  -g --section-groups    Display the section groups\n\
4231  -t --section-details   Display the section details\n\
4232  -e --headers           Equivalent to: -h -l -S\n\
4233  -s --syms              Display the symbol table\n\
4234     --symbols           An alias for --syms\n\
4235  --dyn-syms             Display the dynamic symbol table\n\
4236  -n --notes             Display the core notes (if present)\n\
4237  -r --relocs            Display the relocations (if present)\n\
4238  -u --unwind            Display the unwind info (if present)\n\
4239  -d --dynamic           Display the dynamic section (if present)\n\
4240  -V --version-info      Display the version sections (if present)\n\
4241  -A --arch-specific     Display architecture specific information (if any)\n\
4242  -c --archive-index     Display the symbol/file index in an archive\n\
4243  -D --use-dynamic       Use the dynamic section info when displaying symbols\n\
4244  -x --hex-dump=<number|name>\n\
4245                         Dump the contents of section <number|name> as bytes\n\
4246  -p --string-dump=<number|name>\n\
4247                         Dump the contents of section <number|name> as strings\n\
4248  -R --relocated-dump=<number|name>\n\
4249                         Dump the contents of section <number|name> as relocated bytes\n\
4250  -z --decompress        Decompress section before dumping it\n\
4251  -w[lLiaprmfFsoRt] or\n\
4252  --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
4253               =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
4254               =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4255               =addr,=cu_index]\n\
4256                         Display the contents of DWARF2 debug sections\n"));
4257  fprintf (stream, _("\
4258  --dwarf-depth=N        Do not display DIEs at depth N or greater\n\
4259  --dwarf-start=N        Display DIEs starting with N, at the same depth\n\
4260                         or deeper\n"));
4261#ifdef SUPPORT_DISASSEMBLY
4262  fprintf (stream, _("\
4263  -i --instruction-dump=<number|name>\n\
4264                         Disassemble the contents of section <number|name>\n"));
4265#endif
4266  fprintf (stream, _("\
4267  -I --histogram         Display histogram of bucket list lengths\n\
4268  -W --wide              Allow output width to exceed 80 characters\n\
4269  @<file>                Read options from <file>\n\
4270  -H --help              Display this information\n\
4271  -v --version           Display the version number of readelf\n"));
4272
4273  if (REPORT_BUGS_TO[0] && stream == stdout)
4274    fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
4275
4276  exit (stream == stdout ? 0 : 1);
4277}
4278
4279/* Record the fact that the user wants the contents of section number
4280   SECTION to be displayed using the method(s) encoded as flags bits
4281   in TYPE.  Note, TYPE can be zero if we are creating the array for
4282   the first time.  */
4283
4284static void
4285request_dump_bynumber (unsigned int section, dump_type type)
4286{
4287  if (section >= num_dump_sects)
4288    {
4289      dump_type * new_dump_sects;
4290
4291      new_dump_sects = (dump_type *) calloc (section + 1,
4292                                             sizeof (* dump_sects));
4293
4294      if (new_dump_sects == NULL)
4295	error (_("Out of memory allocating dump request table.\n"));
4296      else
4297	{
4298	  if (dump_sects)
4299	    {
4300	      /* Copy current flag settings.  */
4301	      memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
4302
4303	      free (dump_sects);
4304	    }
4305
4306	  dump_sects = new_dump_sects;
4307	  num_dump_sects = section + 1;
4308	}
4309    }
4310
4311  if (dump_sects)
4312    dump_sects[section] |= type;
4313
4314  return;
4315}
4316
4317/* Request a dump by section name.  */
4318
4319static void
4320request_dump_byname (const char * section, dump_type type)
4321{
4322  struct dump_list_entry * new_request;
4323
4324  new_request = (struct dump_list_entry *)
4325      malloc (sizeof (struct dump_list_entry));
4326  if (!new_request)
4327    error (_("Out of memory allocating dump request table.\n"));
4328
4329  new_request->name = strdup (section);
4330  if (!new_request->name)
4331    error (_("Out of memory allocating dump request table.\n"));
4332
4333  new_request->type = type;
4334
4335  new_request->next = dump_sects_byname;
4336  dump_sects_byname = new_request;
4337}
4338
4339static inline void
4340request_dump (dump_type type)
4341{
4342  int section;
4343  char * cp;
4344
4345  do_dump++;
4346  section = strtoul (optarg, & cp, 0);
4347
4348  if (! *cp && section >= 0)
4349    request_dump_bynumber (section, type);
4350  else
4351    request_dump_byname (optarg, type);
4352}
4353
4354
4355static void
4356parse_args (int argc, char ** argv)
4357{
4358  int c;
4359
4360  if (argc < 2)
4361    usage (stderr);
4362
4363  while ((c = getopt_long
4364	  (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
4365    {
4366      switch (c)
4367	{
4368	case 0:
4369	  /* Long options.  */
4370	  break;
4371	case 'H':
4372	  usage (stdout);
4373	  break;
4374
4375	case 'a':
4376	  do_syms++;
4377	  do_reloc++;
4378	  do_unwind++;
4379	  do_dynamic++;
4380	  do_header++;
4381	  do_sections++;
4382	  do_section_groups++;
4383	  do_segments++;
4384	  do_version++;
4385	  do_histogram++;
4386	  do_arch++;
4387	  do_notes++;
4388	  break;
4389	case 'g':
4390	  do_section_groups++;
4391	  break;
4392	case 't':
4393	case 'N':
4394	  do_sections++;
4395	  do_section_details++;
4396	  break;
4397	case 'e':
4398	  do_header++;
4399	  do_sections++;
4400	  do_segments++;
4401	  break;
4402	case 'A':
4403	  do_arch++;
4404	  break;
4405	case 'D':
4406	  do_using_dynamic++;
4407	  break;
4408	case 'r':
4409	  do_reloc++;
4410	  break;
4411	case 'u':
4412	  do_unwind++;
4413	  break;
4414	case 'h':
4415	  do_header++;
4416	  break;
4417	case 'l':
4418	  do_segments++;
4419	  break;
4420	case 's':
4421	  do_syms++;
4422	  break;
4423	case 'S':
4424	  do_sections++;
4425	  break;
4426	case 'd':
4427	  do_dynamic++;
4428	  break;
4429	case 'I':
4430	  do_histogram++;
4431	  break;
4432	case 'n':
4433	  do_notes++;
4434	  break;
4435	case 'c':
4436	  do_archive_index++;
4437	  break;
4438	case 'x':
4439	  request_dump (HEX_DUMP);
4440	  break;
4441	case 'p':
4442	  request_dump (STRING_DUMP);
4443	  break;
4444	case 'R':
4445	  request_dump (RELOC_DUMP);
4446	  break;
4447	case 'z':
4448	  decompress_dumps++;
4449	  break;
4450	case 'w':
4451	  do_dump++;
4452	  if (optarg == 0)
4453	    {
4454	      do_debugging = 1;
4455	      dwarf_select_sections_all ();
4456	    }
4457	  else
4458	    {
4459	      do_debugging = 0;
4460	      dwarf_select_sections_by_letters (optarg);
4461	    }
4462	  break;
4463	case OPTION_DEBUG_DUMP:
4464	  do_dump++;
4465	  if (optarg == 0)
4466	    do_debugging = 1;
4467	  else
4468	    {
4469	      do_debugging = 0;
4470	      dwarf_select_sections_by_names (optarg);
4471	    }
4472	  break;
4473	case OPTION_DWARF_DEPTH:
4474	  {
4475	    char *cp;
4476
4477	    dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4478	  }
4479	  break;
4480	case OPTION_DWARF_START:
4481	  {
4482	    char *cp;
4483
4484	    dwarf_start_die = strtoul (optarg, & cp, 0);
4485	  }
4486	  break;
4487	case OPTION_DWARF_CHECK:
4488	  dwarf_check = 1;
4489	  break;
4490	case OPTION_DYN_SYMS:
4491	  do_dyn_syms++;
4492	  break;
4493#ifdef SUPPORT_DISASSEMBLY
4494	case 'i':
4495	  request_dump (DISASS_DUMP);
4496	  break;
4497#endif
4498	case 'v':
4499	  print_version (program_name);
4500	  break;
4501	case 'V':
4502	  do_version++;
4503	  break;
4504	case 'W':
4505	  do_wide++;
4506	  break;
4507	default:
4508	  /* xgettext:c-format */
4509	  error (_("Invalid option '-%c'\n"), c);
4510	  /* Fall through.  */
4511	case '?':
4512	  usage (stderr);
4513	}
4514    }
4515
4516  if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
4517      && !do_segments && !do_header && !do_dump && !do_version
4518      && !do_histogram && !do_debugging && !do_arch && !do_notes
4519      && !do_section_groups && !do_archive_index
4520      && !do_dyn_syms)
4521    usage (stderr);
4522}
4523
4524static const char *
4525get_elf_class (unsigned int elf_class)
4526{
4527  static char buff[32];
4528
4529  switch (elf_class)
4530    {
4531    case ELFCLASSNONE: return _("none");
4532    case ELFCLASS32:   return "ELF32";
4533    case ELFCLASS64:   return "ELF64";
4534    default:
4535      snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
4536      return buff;
4537    }
4538}
4539
4540static const char *
4541get_data_encoding (unsigned int encoding)
4542{
4543  static char buff[32];
4544
4545  switch (encoding)
4546    {
4547    case ELFDATANONE: return _("none");
4548    case ELFDATA2LSB: return _("2's complement, little endian");
4549    case ELFDATA2MSB: return _("2's complement, big endian");
4550    default:
4551      snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
4552      return buff;
4553    }
4554}
4555
4556/* Decode the data held in 'elf_header'.  */
4557
4558static int
4559process_file_header (void)
4560{
4561  if (   elf_header.e_ident[EI_MAG0] != ELFMAG0
4562      || elf_header.e_ident[EI_MAG1] != ELFMAG1
4563      || elf_header.e_ident[EI_MAG2] != ELFMAG2
4564      || elf_header.e_ident[EI_MAG3] != ELFMAG3)
4565    {
4566      error
4567	(_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4568      return 0;
4569    }
4570
4571  init_dwarf_regnames (elf_header.e_machine);
4572
4573  if (do_header)
4574    {
4575      int i;
4576
4577      printf (_("ELF Header:\n"));
4578      printf (_("  Magic:   "));
4579      for (i = 0; i < EI_NIDENT; i++)
4580	printf ("%2.2x ", elf_header.e_ident[i]);
4581      printf ("\n");
4582      printf (_("  Class:                             %s\n"),
4583	      get_elf_class (elf_header.e_ident[EI_CLASS]));
4584      printf (_("  Data:                              %s\n"),
4585	      get_data_encoding (elf_header.e_ident[EI_DATA]));
4586      printf (_("  Version:                           %d %s\n"),
4587	      elf_header.e_ident[EI_VERSION],
4588	      (elf_header.e_ident[EI_VERSION] == EV_CURRENT
4589	       ? "(current)"
4590	       : (elf_header.e_ident[EI_VERSION] != EV_NONE
4591		  ? _("<unknown: %lx>")
4592		  : "")));
4593      printf (_("  OS/ABI:                            %s\n"),
4594	      get_osabi_name (elf_header.e_ident[EI_OSABI]));
4595      printf (_("  ABI Version:                       %d\n"),
4596	      elf_header.e_ident[EI_ABIVERSION]);
4597      printf (_("  Type:                              %s\n"),
4598	      get_file_type (elf_header.e_type));
4599      printf (_("  Machine:                           %s\n"),
4600	      get_machine_name (elf_header.e_machine));
4601      printf (_("  Version:                           0x%lx\n"),
4602	      (unsigned long) elf_header.e_version);
4603
4604      printf (_("  Entry point address:               "));
4605      print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4606      printf (_("\n  Start of program headers:          "));
4607      print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4608      printf (_(" (bytes into file)\n  Start of section headers:          "));
4609      print_vma ((bfd_vma) elf_header.e_shoff, DEC);
4610      printf (_(" (bytes into file)\n"));
4611
4612      printf (_("  Flags:                             0x%lx%s\n"),
4613	      (unsigned long) elf_header.e_flags,
4614	      get_machine_flags (elf_header.e_flags, elf_header.e_machine));
4615      printf (_("  Size of this header:               %ld (bytes)\n"),
4616	      (long) elf_header.e_ehsize);
4617      printf (_("  Size of program headers:           %ld (bytes)\n"),
4618	      (long) elf_header.e_phentsize);
4619      printf (_("  Number of program headers:         %ld"),
4620	      (long) elf_header.e_phnum);
4621      if (section_headers != NULL
4622	  && elf_header.e_phnum == PN_XNUM
4623	  && section_headers[0].sh_info != 0)
4624	printf (" (%ld)", (long) section_headers[0].sh_info);
4625      putc ('\n', stdout);
4626      printf (_("  Size of section headers:           %ld (bytes)\n"),
4627	      (long) elf_header.e_shentsize);
4628      printf (_("  Number of section headers:         %ld"),
4629	      (long) elf_header.e_shnum);
4630      if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
4631	printf (" (%ld)", (long) section_headers[0].sh_size);
4632      putc ('\n', stdout);
4633      printf (_("  Section header string table index: %ld"),
4634	      (long) elf_header.e_shstrndx);
4635      if (section_headers != NULL
4636	  && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4637	printf (" (%u)", section_headers[0].sh_link);
4638      else if (elf_header.e_shstrndx != SHN_UNDEF
4639	       && elf_header.e_shstrndx >= elf_header.e_shnum)
4640	printf (_(" <corrupt: out of range>"));
4641      putc ('\n', stdout);
4642    }
4643
4644  if (section_headers != NULL)
4645    {
4646      if (elf_header.e_phnum == PN_XNUM
4647	  && section_headers[0].sh_info != 0)
4648	elf_header.e_phnum = section_headers[0].sh_info;
4649      if (elf_header.e_shnum == SHN_UNDEF)
4650	elf_header.e_shnum = section_headers[0].sh_size;
4651      if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4652	elf_header.e_shstrndx = section_headers[0].sh_link;
4653      else if (elf_header.e_shstrndx >= elf_header.e_shnum)
4654	elf_header.e_shstrndx = SHN_UNDEF;
4655      free (section_headers);
4656      section_headers = NULL;
4657    }
4658
4659  return 1;
4660}
4661
4662static bfd_boolean
4663get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4664{
4665  Elf32_External_Phdr * phdrs;
4666  Elf32_External_Phdr * external;
4667  Elf_Internal_Phdr *   internal;
4668  unsigned int i;
4669  unsigned int size = elf_header.e_phentsize;
4670  unsigned int num  = elf_header.e_phnum;
4671
4672  /* PR binutils/17531: Cope with unexpected section header sizes.  */
4673  if (size == 0 || num == 0)
4674    return FALSE;
4675  if (size < sizeof * phdrs)
4676    {
4677      error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4678      return FALSE;
4679    }
4680  if (size > sizeof * phdrs)
4681    warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4682
4683  phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4684                                            size, num, _("program headers"));
4685  if (phdrs == NULL)
4686    return FALSE;
4687
4688  for (i = 0, internal = pheaders, external = phdrs;
4689       i < elf_header.e_phnum;
4690       i++, internal++, external++)
4691    {
4692      internal->p_type   = BYTE_GET (external->p_type);
4693      internal->p_offset = BYTE_GET (external->p_offset);
4694      internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4695      internal->p_paddr  = BYTE_GET (external->p_paddr);
4696      internal->p_filesz = BYTE_GET (external->p_filesz);
4697      internal->p_memsz  = BYTE_GET (external->p_memsz);
4698      internal->p_flags  = BYTE_GET (external->p_flags);
4699      internal->p_align  = BYTE_GET (external->p_align);
4700    }
4701
4702  free (phdrs);
4703  return TRUE;
4704}
4705
4706static bfd_boolean
4707get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4708{
4709  Elf64_External_Phdr * phdrs;
4710  Elf64_External_Phdr * external;
4711  Elf_Internal_Phdr *   internal;
4712  unsigned int i;
4713  unsigned int size = elf_header.e_phentsize;
4714  unsigned int num  = elf_header.e_phnum;
4715
4716  /* PR binutils/17531: Cope with unexpected section header sizes.  */
4717  if (size == 0 || num == 0)
4718    return FALSE;
4719  if (size < sizeof * phdrs)
4720    {
4721      error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4722      return FALSE;
4723    }
4724  if (size > sizeof * phdrs)
4725    warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4726
4727  phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4728                                            size, num, _("program headers"));
4729  if (!phdrs)
4730    return FALSE;
4731
4732  for (i = 0, internal = pheaders, external = phdrs;
4733       i < elf_header.e_phnum;
4734       i++, internal++, external++)
4735    {
4736      internal->p_type   = BYTE_GET (external->p_type);
4737      internal->p_flags  = BYTE_GET (external->p_flags);
4738      internal->p_offset = BYTE_GET (external->p_offset);
4739      internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4740      internal->p_paddr  = BYTE_GET (external->p_paddr);
4741      internal->p_filesz = BYTE_GET (external->p_filesz);
4742      internal->p_memsz  = BYTE_GET (external->p_memsz);
4743      internal->p_align  = BYTE_GET (external->p_align);
4744    }
4745
4746  free (phdrs);
4747  return TRUE;
4748}
4749
4750/* Returns 1 if the program headers were read into `program_headers'.  */
4751
4752static int
4753get_program_headers (FILE * file)
4754{
4755  Elf_Internal_Phdr * phdrs;
4756
4757  /* Check cache of prior read.  */
4758  if (program_headers != NULL)
4759    return 1;
4760
4761  phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
4762                                         sizeof (Elf_Internal_Phdr));
4763
4764  if (phdrs == NULL)
4765    {
4766      error (_("Out of memory reading %u program headers\n"),
4767	     elf_header.e_phnum);
4768      return 0;
4769    }
4770
4771  if (is_32bit_elf
4772      ? get_32bit_program_headers (file, phdrs)
4773      : get_64bit_program_headers (file, phdrs))
4774    {
4775      program_headers = phdrs;
4776      return 1;
4777    }
4778
4779  free (phdrs);
4780  return 0;
4781}
4782
4783/* Returns 1 if the program headers were loaded.  */
4784
4785static int
4786process_program_headers (FILE * file)
4787{
4788  Elf_Internal_Phdr * segment;
4789  unsigned int i;
4790  Elf_Internal_Phdr * previous_load = NULL;
4791
4792  if (elf_header.e_phnum == 0)
4793    {
4794      /* PR binutils/12467.  */
4795      if (elf_header.e_phoff != 0)
4796	warn (_("possibly corrupt ELF header - it has a non-zero program"
4797		" header offset, but no program headers\n"));
4798      else if (do_segments)
4799	printf (_("\nThere are no program headers in this file.\n"));
4800      return 0;
4801    }
4802
4803  if (do_segments && !do_header)
4804    {
4805      printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
4806      printf (_("Entry point "));
4807      print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4808      printf (_("\nThere are %d program headers, starting at offset "),
4809	      elf_header.e_phnum);
4810      print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4811      printf ("\n");
4812    }
4813
4814  if (! get_program_headers (file))
4815      return 0;
4816
4817  if (do_segments)
4818    {
4819      if (elf_header.e_phnum > 1)
4820	printf (_("\nProgram Headers:\n"));
4821      else
4822	printf (_("\nProgram Headers:\n"));
4823
4824      if (is_32bit_elf)
4825	printf
4826	  (_("  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align\n"));
4827      else if (do_wide)
4828	printf
4829	  (_("  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align\n"));
4830      else
4831	{
4832	  printf
4833	    (_("  Type           Offset             VirtAddr           PhysAddr\n"));
4834	  printf
4835	    (_("                 FileSiz            MemSiz              Flags  Align\n"));
4836	}
4837    }
4838
4839  dynamic_addr = 0;
4840  dynamic_size = 0;
4841
4842  for (i = 0, segment = program_headers;
4843       i < elf_header.e_phnum;
4844       i++, segment++)
4845    {
4846      if (do_segments)
4847	{
4848	  printf ("  %-14.14s ", get_segment_type (segment->p_type));
4849
4850	  if (is_32bit_elf)
4851	    {
4852	      printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4853	      printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
4854	      printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
4855	      printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
4856	      printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
4857	      printf ("%c%c%c ",
4858		      (segment->p_flags & PF_R ? 'R' : ' '),
4859		      (segment->p_flags & PF_W ? 'W' : ' '),
4860		      (segment->p_flags & PF_X ? 'E' : ' '));
4861	      printf ("%#lx", (unsigned long) segment->p_align);
4862	    }
4863	  else if (do_wide)
4864	    {
4865	      if ((unsigned long) segment->p_offset == segment->p_offset)
4866		printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4867	      else
4868		{
4869		  print_vma (segment->p_offset, FULL_HEX);
4870		  putchar (' ');
4871		}
4872
4873	      print_vma (segment->p_vaddr, FULL_HEX);
4874	      putchar (' ');
4875	      print_vma (segment->p_paddr, FULL_HEX);
4876	      putchar (' ');
4877
4878	      if ((unsigned long) segment->p_filesz == segment->p_filesz)
4879		printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
4880	      else
4881		{
4882		  print_vma (segment->p_filesz, FULL_HEX);
4883		  putchar (' ');
4884		}
4885
4886	      if ((unsigned long) segment->p_memsz == segment->p_memsz)
4887		printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
4888	      else
4889		{
4890		  print_vma (segment->p_memsz, FULL_HEX);
4891		}
4892
4893	      printf (" %c%c%c ",
4894		      (segment->p_flags & PF_R ? 'R' : ' '),
4895		      (segment->p_flags & PF_W ? 'W' : ' '),
4896		      (segment->p_flags & PF_X ? 'E' : ' '));
4897
4898	      if ((unsigned long) segment->p_align == segment->p_align)
4899		printf ("%#lx", (unsigned long) segment->p_align);
4900	      else
4901		{
4902		  print_vma (segment->p_align, PREFIX_HEX);
4903		}
4904	    }
4905	  else
4906	    {
4907	      print_vma (segment->p_offset, FULL_HEX);
4908	      putchar (' ');
4909	      print_vma (segment->p_vaddr, FULL_HEX);
4910	      putchar (' ');
4911	      print_vma (segment->p_paddr, FULL_HEX);
4912	      printf ("\n                 ");
4913	      print_vma (segment->p_filesz, FULL_HEX);
4914	      putchar (' ');
4915	      print_vma (segment->p_memsz, FULL_HEX);
4916	      printf ("  %c%c%c    ",
4917		      (segment->p_flags & PF_R ? 'R' : ' '),
4918		      (segment->p_flags & PF_W ? 'W' : ' '),
4919		      (segment->p_flags & PF_X ? 'E' : ' '));
4920	      print_vma (segment->p_align, PREFIX_HEX);
4921	    }
4922
4923	  putc ('\n', stdout);
4924	}
4925
4926      switch (segment->p_type)
4927	{
4928	case PT_LOAD:
4929#if 0 /* Do not warn about out of order PT_LOAD segments.  Although officially
4930	 required by the ELF standard, several programs, including the Linux
4931	 kernel, make use of non-ordered segments.  */
4932	  if (previous_load
4933	      && previous_load->p_vaddr > segment->p_vaddr)
4934	    error (_("LOAD segments must be sorted in order of increasing VirtAddr\n"));
4935#endif
4936	  if (segment->p_memsz < segment->p_filesz)
4937	    error (_("the segment's file size is larger than its memory size\n"));
4938	  previous_load = segment;
4939	  break;
4940
4941	case PT_PHDR:
4942	  /* PR 20815 - Verify that the program header is loaded into memory.  */
4943	  if (i > 0 && previous_load != NULL)
4944	    error (_("the PHDR segment must occur before any LOAD segment\n"));
4945	  if (elf_header.e_machine != EM_PARISC)
4946	    {
4947	      unsigned int j;
4948
4949	      for (j = 1; j < elf_header.e_phnum; j++)
4950		if (program_headers[j].p_vaddr <= segment->p_vaddr
4951		    && (program_headers[j].p_vaddr + program_headers[j].p_memsz)
4952		    >= (segment->p_vaddr + segment->p_filesz))
4953		  break;
4954	      if (j == elf_header.e_phnum)
4955		error (_("the PHDR segment is not covered by a LOAD segment\n"));
4956	    }
4957	  break;
4958
4959	case PT_DYNAMIC:
4960	  if (dynamic_addr)
4961	    error (_("more than one dynamic segment\n"));
4962
4963	  /* By default, assume that the .dynamic section is the first
4964	     section in the DYNAMIC segment.  */
4965	  dynamic_addr = segment->p_offset;
4966	  dynamic_size = segment->p_filesz;
4967	  /* PR binutils/17512: Avoid corrupt dynamic section info in the segment.  */
4968	  if (dynamic_addr + dynamic_size >= current_file_size)
4969	    {
4970	      error (_("the dynamic segment offset + size exceeds the size of the file\n"));
4971	      dynamic_addr = dynamic_size = 0;
4972	    }
4973
4974	  /* Try to locate the .dynamic section. If there is
4975	     a section header table, we can easily locate it.  */
4976	  if (section_headers != NULL)
4977	    {
4978	      Elf_Internal_Shdr * sec;
4979
4980	      sec = find_section (".dynamic");
4981	      if (sec == NULL || sec->sh_size == 0)
4982		{
4983                  /* A corresponding .dynamic section is expected, but on
4984                     IA-64/OpenVMS it is OK for it to be missing.  */
4985                  if (!is_ia64_vms ())
4986                    error (_("no .dynamic section in the dynamic segment\n"));
4987		  break;
4988		}
4989
4990	      if (sec->sh_type == SHT_NOBITS)
4991		{
4992		  dynamic_size = 0;
4993		  break;
4994		}
4995
4996	      dynamic_addr = sec->sh_offset;
4997	      dynamic_size = sec->sh_size;
4998
4999	      if (dynamic_addr < segment->p_offset
5000		  || dynamic_addr > segment->p_offset + segment->p_filesz)
5001		warn (_("the .dynamic section is not contained"
5002			" within the dynamic segment\n"));
5003	      else if (dynamic_addr > segment->p_offset)
5004		warn (_("the .dynamic section is not the first section"
5005			" in the dynamic segment.\n"));
5006	    }
5007	  break;
5008
5009	case PT_INTERP:
5010	  if (fseek (file, archive_file_offset + (long) segment->p_offset,
5011		     SEEK_SET))
5012	    error (_("Unable to find program interpreter name\n"));
5013	  else
5014	    {
5015	      char fmt [32];
5016	      int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
5017
5018	      if (ret >= (int) sizeof (fmt) || ret < 0)
5019		error (_("Internal error: failed to create format string to display program interpreter\n"));
5020
5021	      program_interpreter[0] = 0;
5022	      if (fscanf (file, fmt, program_interpreter) <= 0)
5023		error (_("Unable to read program interpreter name\n"));
5024
5025	      if (do_segments)
5026		printf (_("      [Requesting program interpreter: %s]\n"),
5027		    program_interpreter);
5028	    }
5029	  break;
5030	}
5031    }
5032
5033  if (do_segments && section_headers != NULL && string_table != NULL)
5034    {
5035      printf (_("\n Section to Segment mapping:\n"));
5036      printf (_("  Segment Sections...\n"));
5037
5038      for (i = 0; i < elf_header.e_phnum; i++)
5039	{
5040	  unsigned int j;
5041	  Elf_Internal_Shdr * section;
5042
5043	  segment = program_headers + i;
5044	  section = section_headers + 1;
5045
5046	  printf ("   %2.2d     ", i);
5047
5048	  for (j = 1; j < elf_header.e_shnum; j++, section++)
5049	    {
5050	      if (!ELF_TBSS_SPECIAL (section, segment)
5051		  && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
5052		printf ("%s ", printable_section_name (section));
5053	    }
5054
5055	  putc ('\n',stdout);
5056	}
5057    }
5058
5059  return 1;
5060}
5061
5062
5063/* Find the file offset corresponding to VMA by using the program headers.  */
5064
5065static long
5066offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
5067{
5068  Elf_Internal_Phdr * seg;
5069
5070  if (! get_program_headers (file))
5071    {
5072      warn (_("Cannot interpret virtual addresses without program headers.\n"));
5073      return (long) vma;
5074    }
5075
5076  for (seg = program_headers;
5077       seg < program_headers + elf_header.e_phnum;
5078       ++seg)
5079    {
5080      if (seg->p_type != PT_LOAD)
5081	continue;
5082
5083      if (vma >= (seg->p_vaddr & -seg->p_align)
5084	  && vma + size <= seg->p_vaddr + seg->p_filesz)
5085	return vma - seg->p_vaddr + seg->p_offset;
5086    }
5087
5088  warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
5089	(unsigned long) vma);
5090  return (long) vma;
5091}
5092
5093
5094/* Allocate memory and load the sections headers into the global pointer
5095   SECTION_HEADERS.  If PROBE is true, this is just a probe and we do not
5096   generate any error messages if the load fails.  */
5097
5098static bfd_boolean
5099get_32bit_section_headers (FILE * file, bfd_boolean probe)
5100{
5101  Elf32_External_Shdr * shdrs;
5102  Elf_Internal_Shdr *   internal;
5103  unsigned int i;
5104  unsigned int size = elf_header.e_shentsize;
5105  unsigned int num = probe ? 1 : elf_header.e_shnum;
5106
5107  /* PR binutils/17531: Cope with unexpected section header sizes.  */
5108  if (size == 0 || num == 0)
5109    return FALSE;
5110  if (size < sizeof * shdrs)
5111    {
5112      if (! probe)
5113	error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5114      return FALSE;
5115    }
5116  if (!probe && size > sizeof * shdrs)
5117    warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5118
5119  shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
5120                                            size, num,
5121					    probe ? NULL : _("section headers"));
5122  if (shdrs == NULL)
5123    return FALSE;
5124
5125  if (section_headers != NULL)
5126    free (section_headers);
5127  section_headers = (Elf_Internal_Shdr *) cmalloc (num,
5128                                                   sizeof (Elf_Internal_Shdr));
5129  if (section_headers == NULL)
5130    {
5131      if (!probe)
5132	error (_("Out of memory reading %u section headers\n"), num);
5133      return FALSE;
5134    }
5135
5136  for (i = 0, internal = section_headers;
5137       i < num;
5138       i++, internal++)
5139    {
5140      internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
5141      internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
5142      internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
5143      internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
5144      internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
5145      internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
5146      internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
5147      internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
5148      internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5149      internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
5150      if (!probe && internal->sh_link > num)
5151	warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5152      if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5153	warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5154    }
5155
5156  free (shdrs);
5157  return TRUE;
5158}
5159
5160static bfd_boolean
5161get_64bit_section_headers (FILE * file, bfd_boolean probe)
5162{
5163  Elf64_External_Shdr * shdrs;
5164  Elf_Internal_Shdr *   internal;
5165  unsigned int i;
5166  unsigned int size = elf_header.e_shentsize;
5167  unsigned int num = probe ? 1 : elf_header.e_shnum;
5168
5169  /* PR binutils/17531: Cope with unexpected section header sizes.  */
5170  if (size == 0 || num == 0)
5171    return FALSE;
5172  if (size < sizeof * shdrs)
5173    {
5174      if (! probe)
5175	error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5176      return FALSE;
5177    }
5178  if (! probe && size > sizeof * shdrs)
5179    warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5180
5181  shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
5182                                            size, num,
5183					    probe ? NULL : _("section headers"));
5184  if (shdrs == NULL)
5185    return FALSE;
5186
5187  if (section_headers != NULL)
5188    free (section_headers);
5189  section_headers = (Elf_Internal_Shdr *) cmalloc (num,
5190                                                   sizeof (Elf_Internal_Shdr));
5191  if (section_headers == NULL)
5192    {
5193      if (! probe)
5194	error (_("Out of memory reading %u section headers\n"), num);
5195      return FALSE;
5196    }
5197
5198  for (i = 0, internal = section_headers;
5199       i < num;
5200       i++, internal++)
5201    {
5202      internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
5203      internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
5204      internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
5205      internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
5206      internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
5207      internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
5208      internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
5209      internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
5210      internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
5211      internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5212      if (!probe && internal->sh_link > num)
5213	warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5214      if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5215	warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5216    }
5217
5218  free (shdrs);
5219  return TRUE;
5220}
5221
5222static Elf_Internal_Sym *
5223get_32bit_elf_symbols (FILE * file,
5224		       Elf_Internal_Shdr * section,
5225		       unsigned long * num_syms_return)
5226{
5227  unsigned long number = 0;
5228  Elf32_External_Sym * esyms = NULL;
5229  Elf_External_Sym_Shndx * shndx = NULL;
5230  Elf_Internal_Sym * isyms = NULL;
5231  Elf_Internal_Sym * psym;
5232  unsigned int j;
5233
5234  if (section->sh_size == 0)
5235    {
5236      if (num_syms_return != NULL)
5237	* num_syms_return = 0;
5238      return NULL;
5239    }
5240
5241  /* Run some sanity checks first.  */
5242  if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5243    {
5244      error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5245	     printable_section_name (section), (unsigned long) section->sh_entsize);
5246      goto exit_point;
5247    }
5248
5249  if (section->sh_size > current_file_size)
5250    {
5251      error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5252	     printable_section_name (section), (unsigned long) section->sh_size);
5253      goto exit_point;
5254    }
5255
5256  number = section->sh_size / section->sh_entsize;
5257
5258  if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
5259    {
5260      error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5261	     (unsigned long) section->sh_size,
5262	     printable_section_name (section),
5263	     (unsigned long) section->sh_entsize);
5264      goto exit_point;
5265    }
5266
5267  esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5268                                           section->sh_size, _("symbols"));
5269  if (esyms == NULL)
5270    goto exit_point;
5271
5272  {
5273    elf_section_list * entry;
5274
5275    shndx = NULL;
5276    for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5277      if (entry->hdr->sh_link == (unsigned long) (section - section_headers))
5278	{
5279	  shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5280						       entry->hdr->sh_offset,
5281						       1, entry->hdr->sh_size,
5282						       _("symbol table section indicies"));
5283	  if (shndx == NULL)
5284	    goto exit_point;
5285	  /* PR17531: file: heap-buffer-overflow */
5286	  else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5287	    {
5288	      error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5289		     printable_section_name (entry->hdr),
5290		     (unsigned long) entry->hdr->sh_size,
5291		     (unsigned long) section->sh_size);
5292	      goto exit_point;
5293	    }
5294	}
5295  }
5296
5297  isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5298
5299  if (isyms == NULL)
5300    {
5301      error (_("Out of memory reading %lu symbols\n"),
5302	     (unsigned long) number);
5303      goto exit_point;
5304    }
5305
5306  for (j = 0, psym = isyms; j < number; j++, psym++)
5307    {
5308      psym->st_name  = BYTE_GET (esyms[j].st_name);
5309      psym->st_value = BYTE_GET (esyms[j].st_value);
5310      psym->st_size  = BYTE_GET (esyms[j].st_size);
5311      psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5312      if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5313	psym->st_shndx
5314	  = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5315      else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5316	psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5317      psym->st_info  = BYTE_GET (esyms[j].st_info);
5318      psym->st_other = BYTE_GET (esyms[j].st_other);
5319    }
5320
5321 exit_point:
5322  if (shndx != NULL)
5323    free (shndx);
5324  if (esyms != NULL)
5325    free (esyms);
5326
5327  if (num_syms_return != NULL)
5328    * num_syms_return = isyms == NULL ? 0 : number;
5329
5330  return isyms;
5331}
5332
5333static Elf_Internal_Sym *
5334get_64bit_elf_symbols (FILE * file,
5335		       Elf_Internal_Shdr * section,
5336		       unsigned long * num_syms_return)
5337{
5338  unsigned long number = 0;
5339  Elf64_External_Sym * esyms = NULL;
5340  Elf_External_Sym_Shndx * shndx = NULL;
5341  Elf_Internal_Sym * isyms = NULL;
5342  Elf_Internal_Sym * psym;
5343  unsigned int j;
5344
5345  if (section->sh_size == 0)
5346    {
5347      if (num_syms_return != NULL)
5348	* num_syms_return = 0;
5349      return NULL;
5350    }
5351
5352  /* Run some sanity checks first.  */
5353  if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5354    {
5355      error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5356	     printable_section_name (section),
5357	     (unsigned long) section->sh_entsize);
5358      goto exit_point;
5359    }
5360
5361  if (section->sh_size > current_file_size)
5362    {
5363      error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5364	     printable_section_name (section),
5365	     (unsigned long) section->sh_size);
5366      goto exit_point;
5367    }
5368
5369  number = section->sh_size / section->sh_entsize;
5370
5371  if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5372    {
5373      error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5374	     (unsigned long) section->sh_size,
5375	     printable_section_name (section),
5376	     (unsigned long) section->sh_entsize);
5377      goto exit_point;
5378    }
5379
5380  esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5381                                           section->sh_size, _("symbols"));
5382  if (!esyms)
5383    goto exit_point;
5384
5385  {
5386    elf_section_list * entry;
5387
5388    shndx = NULL;
5389    for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5390      if (entry->hdr->sh_link == (unsigned long) (section - section_headers))
5391	{
5392	  shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5393						       entry->hdr->sh_offset,
5394						       1, entry->hdr->sh_size,
5395						       _("symbol table section indicies"));
5396	  if (shndx == NULL)
5397	    goto exit_point;
5398	  /* PR17531: file: heap-buffer-overflow */
5399	  else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5400	    {
5401	      error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5402		     printable_section_name (entry->hdr),
5403		     (unsigned long) entry->hdr->sh_size,
5404		     (unsigned long) section->sh_size);
5405	      goto exit_point;
5406	    }
5407	}
5408  }
5409
5410  isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5411
5412  if (isyms == NULL)
5413    {
5414      error (_("Out of memory reading %lu symbols\n"),
5415	     (unsigned long) number);
5416      goto exit_point;
5417    }
5418
5419  for (j = 0, psym = isyms; j < number; j++, psym++)
5420    {
5421      psym->st_name  = BYTE_GET (esyms[j].st_name);
5422      psym->st_info  = BYTE_GET (esyms[j].st_info);
5423      psym->st_other = BYTE_GET (esyms[j].st_other);
5424      psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5425
5426      if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5427	psym->st_shndx
5428	  = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5429      else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5430	psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5431
5432      psym->st_value = BYTE_GET (esyms[j].st_value);
5433      psym->st_size  = BYTE_GET (esyms[j].st_size);
5434    }
5435
5436 exit_point:
5437  if (shndx != NULL)
5438    free (shndx);
5439  if (esyms != NULL)
5440    free (esyms);
5441
5442  if (num_syms_return != NULL)
5443    * num_syms_return = isyms == NULL ? 0 : number;
5444
5445  return isyms;
5446}
5447
5448static const char *
5449get_elf_section_flags (bfd_vma sh_flags)
5450{
5451  static char buff[1024];
5452  char * p = buff;
5453  int field_size = is_32bit_elf ? 8 : 16;
5454  int sindex;
5455  int size = sizeof (buff) - (field_size + 4 + 1);
5456  bfd_vma os_flags = 0;
5457  bfd_vma proc_flags = 0;
5458  bfd_vma unknown_flags = 0;
5459  static const struct
5460    {
5461      const char * str;
5462      int len;
5463    }
5464  flags [] =
5465    {
5466      /*  0 */ { STRING_COMMA_LEN ("WRITE") },
5467      /*  1 */ { STRING_COMMA_LEN ("ALLOC") },
5468      /*  2 */ { STRING_COMMA_LEN ("EXEC") },
5469      /*  3 */ { STRING_COMMA_LEN ("MERGE") },
5470      /*  4 */ { STRING_COMMA_LEN ("STRINGS") },
5471      /*  5 */ { STRING_COMMA_LEN ("INFO LINK") },
5472      /*  6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5473      /*  7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5474      /*  8 */ { STRING_COMMA_LEN ("GROUP") },
5475      /*  9 */ { STRING_COMMA_LEN ("TLS") },
5476      /* IA-64 specific.  */
5477      /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5478      /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5479      /* IA-64 OpenVMS specific.  */
5480      /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5481      /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5482      /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5483      /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5484      /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5485      /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
5486      /* Generic.  */
5487      /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
5488      /* SPARC specific.  */
5489      /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
5490      /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5491      /* ARM specific.  */
5492      /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
5493      /* 22 */ { STRING_COMMA_LEN ("ARM_PURECODE") },
5494      /* 23 */ { STRING_COMMA_LEN ("COMDEF") }
5495    };
5496
5497  if (do_section_details)
5498    {
5499      sprintf (buff, "[%*.*lx]: ",
5500	       field_size, field_size, (unsigned long) sh_flags);
5501      p += field_size + 4;
5502    }
5503
5504  while (sh_flags)
5505    {
5506      bfd_vma flag;
5507
5508      flag = sh_flags & - sh_flags;
5509      sh_flags &= ~ flag;
5510
5511      if (do_section_details)
5512	{
5513	  switch (flag)
5514	    {
5515	    case SHF_WRITE:		sindex = 0; break;
5516	    case SHF_ALLOC:		sindex = 1; break;
5517	    case SHF_EXECINSTR:		sindex = 2; break;
5518	    case SHF_MERGE:		sindex = 3; break;
5519	    case SHF_STRINGS:		sindex = 4; break;
5520	    case SHF_INFO_LINK:		sindex = 5; break;
5521	    case SHF_LINK_ORDER:	sindex = 6; break;
5522	    case SHF_OS_NONCONFORMING:	sindex = 7; break;
5523	    case SHF_GROUP:		sindex = 8; break;
5524	    case SHF_TLS:		sindex = 9; break;
5525	    case SHF_EXCLUDE:		sindex = 18; break;
5526	    case SHF_COMPRESSED:	sindex = 20; break;
5527
5528	    default:
5529	      sindex = -1;
5530	      switch (elf_header.e_machine)
5531		{
5532		case EM_IA_64:
5533		  if (flag == SHF_IA_64_SHORT)
5534		    sindex = 10;
5535		  else if (flag == SHF_IA_64_NORECOV)
5536		    sindex = 11;
5537#ifdef BFD64
5538		  else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5539		    switch (flag)
5540		      {
5541		      case SHF_IA_64_VMS_GLOBAL:      sindex = 12; break;
5542		      case SHF_IA_64_VMS_OVERLAID:    sindex = 13; break;
5543		      case SHF_IA_64_VMS_SHARED:      sindex = 14; break;
5544		      case SHF_IA_64_VMS_VECTOR:      sindex = 15; break;
5545		      case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5546		      case SHF_IA_64_VMS_PROTECTED:   sindex = 17; break;
5547		      default:                        break;
5548		      }
5549#endif
5550		  break;
5551
5552		case EM_386:
5553		case EM_IAMCU:
5554		case EM_X86_64:
5555		case EM_L1OM:
5556		case EM_K1OM:
5557		case EM_OLD_SPARCV9:
5558		case EM_SPARC32PLUS:
5559		case EM_SPARCV9:
5560		case EM_SPARC:
5561		  if (flag == SHF_ORDERED)
5562		    sindex = 19;
5563		  break;
5564
5565		case EM_ARM:
5566		  switch (flag)
5567		    {
5568		    case SHF_ENTRYSECT: sindex = 21; break;
5569		    case SHF_ARM_PURECODE: sindex = 22; break;
5570		    case SHF_COMDEF: sindex = 23; break;
5571		    default: break;
5572		    }
5573		  break;
5574
5575		default:
5576		  break;
5577		}
5578	    }
5579
5580	  if (sindex != -1)
5581	    {
5582	      if (p != buff + field_size + 4)
5583		{
5584		  if (size < (10 + 2))
5585		    {
5586		      warn (_("Internal error: not enough buffer room for section flag info"));
5587		      return _("<unknown>");
5588		    }
5589		  size -= 2;
5590		  *p++ = ',';
5591		  *p++ = ' ';
5592		}
5593
5594	      size -= flags [sindex].len;
5595	      p = stpcpy (p, flags [sindex].str);
5596	    }
5597	  else if (flag & SHF_MASKOS)
5598	    os_flags |= flag;
5599	  else if (flag & SHF_MASKPROC)
5600	    proc_flags |= flag;
5601	  else
5602	    unknown_flags |= flag;
5603	}
5604      else
5605	{
5606	  switch (flag)
5607	    {
5608	    case SHF_WRITE:		*p = 'W'; break;
5609	    case SHF_ALLOC:		*p = 'A'; break;
5610	    case SHF_EXECINSTR:		*p = 'X'; break;
5611	    case SHF_MERGE:		*p = 'M'; break;
5612	    case SHF_STRINGS:		*p = 'S'; break;
5613	    case SHF_INFO_LINK:		*p = 'I'; break;
5614	    case SHF_LINK_ORDER:	*p = 'L'; break;
5615	    case SHF_OS_NONCONFORMING:	*p = 'O'; break;
5616	    case SHF_GROUP:		*p = 'G'; break;
5617	    case SHF_TLS:		*p = 'T'; break;
5618	    case SHF_EXCLUDE:		*p = 'E'; break;
5619	    case SHF_COMPRESSED:	*p = 'C'; break;
5620
5621	    default:
5622	      if ((elf_header.e_machine == EM_X86_64
5623		   || elf_header.e_machine == EM_L1OM
5624		   || elf_header.e_machine == EM_K1OM)
5625		  && flag == SHF_X86_64_LARGE)
5626		*p = 'l';
5627	      else if (elf_header.e_machine == EM_ARM
5628		       && flag == SHF_ARM_PURECODE)
5629		  *p = 'y';
5630	      else if (flag & SHF_MASKOS)
5631		{
5632		  *p = 'o';
5633		  sh_flags &= ~ SHF_MASKOS;
5634		}
5635	      else if (flag & SHF_MASKPROC)
5636		{
5637		  *p = 'p';
5638		  sh_flags &= ~ SHF_MASKPROC;
5639		}
5640	      else
5641		*p = 'x';
5642	      break;
5643	    }
5644	  p++;
5645	}
5646    }
5647
5648  if (do_section_details)
5649    {
5650      if (os_flags)
5651	{
5652	  size -= 5 + field_size;
5653	  if (p != buff + field_size + 4)
5654	    {
5655	      if (size < (2 + 1))
5656		{
5657		  warn (_("Internal error: not enough buffer room for section flag info"));
5658		  return _("<unknown>");
5659		}
5660	      size -= 2;
5661	      *p++ = ',';
5662	      *p++ = ' ';
5663	    }
5664	  sprintf (p, "OS (%*.*lx)", field_size, field_size,
5665		   (unsigned long) os_flags);
5666	  p += 5 + field_size;
5667	}
5668      if (proc_flags)
5669	{
5670	  size -= 7 + field_size;
5671	  if (p != buff + field_size + 4)
5672	    {
5673	      if (size < (2 + 1))
5674		{
5675		  warn (_("Internal error: not enough buffer room for section flag info"));
5676		  return _("<unknown>");
5677		}
5678	      size -= 2;
5679	      *p++ = ',';
5680	      *p++ = ' ';
5681	    }
5682	  sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5683		   (unsigned long) proc_flags);
5684	  p += 7 + field_size;
5685	}
5686      if (unknown_flags)
5687	{
5688	  size -= 10 + field_size;
5689	  if (p != buff + field_size + 4)
5690	    {
5691	      if (size < (2 + 1))
5692		{
5693		  warn (_("Internal error: not enough buffer room for section flag info"));
5694		  return _("<unknown>");
5695		}
5696	      size -= 2;
5697	      *p++ = ',';
5698	      *p++ = ' ';
5699	    }
5700	  sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
5701		   (unsigned long) unknown_flags);
5702	  p += 10 + field_size;
5703	}
5704    }
5705
5706  *p = '\0';
5707  return buff;
5708}
5709
5710static unsigned int
5711get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf)
5712{
5713  if (is_32bit_elf)
5714    {
5715      Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
5716
5717      chdr->ch_type = BYTE_GET (echdr->ch_type);
5718      chdr->ch_size = BYTE_GET (echdr->ch_size);
5719      chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5720      return sizeof (*echdr);
5721    }
5722  else
5723    {
5724      Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) buf;
5725
5726      chdr->ch_type = BYTE_GET (echdr->ch_type);
5727      chdr->ch_size = BYTE_GET (echdr->ch_size);
5728      chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5729      return sizeof (*echdr);
5730    }
5731}
5732
5733static int
5734process_section_headers (FILE * file)
5735{
5736  Elf_Internal_Shdr * section;
5737  unsigned int i;
5738
5739  section_headers = NULL;
5740
5741  if (elf_header.e_shnum == 0)
5742    {
5743      /* PR binutils/12467.  */
5744      if (elf_header.e_shoff != 0)
5745	warn (_("possibly corrupt ELF file header - it has a non-zero"
5746		" section header offset, but no section headers\n"));
5747      else if (do_sections)
5748	printf (_("\nThere are no sections in this file.\n"));
5749
5750      return 1;
5751    }
5752
5753  if (do_sections && !do_header)
5754    printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
5755	    elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
5756
5757  if (is_32bit_elf)
5758    {
5759      if (! get_32bit_section_headers (file, FALSE))
5760	return 0;
5761    }
5762  else if (! get_64bit_section_headers (file, FALSE))
5763    return 0;
5764
5765  /* Read in the string table, so that we have names to display.  */
5766  if (elf_header.e_shstrndx != SHN_UNDEF
5767       && elf_header.e_shstrndx < elf_header.e_shnum)
5768    {
5769      section = section_headers + elf_header.e_shstrndx;
5770
5771      if (section->sh_size != 0)
5772	{
5773	  string_table = (char *) get_data (NULL, file, section->sh_offset,
5774                                            1, section->sh_size,
5775                                            _("string table"));
5776
5777	  string_table_length = string_table != NULL ? section->sh_size : 0;
5778	}
5779    }
5780
5781  /* Scan the sections for the dynamic symbol table
5782     and dynamic string table and debug sections.  */
5783  dynamic_symbols = NULL;
5784  dynamic_strings = NULL;
5785  dynamic_syminfo = NULL;
5786  symtab_shndx_list = NULL;
5787
5788  eh_addr_size = is_32bit_elf ? 4 : 8;
5789  switch (elf_header.e_machine)
5790    {
5791    case EM_MIPS:
5792    case EM_MIPS_RS3_LE:
5793      /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
5794	 FDE addresses.  However, the ABI also has a semi-official ILP32
5795	 variant for which the normal FDE address size rules apply.
5796
5797	 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
5798	 section, where XX is the size of longs in bits.  Unfortunately,
5799	 earlier compilers provided no way of distinguishing ILP32 objects
5800	 from LP64 objects, so if there's any doubt, we should assume that
5801	 the official LP64 form is being used.  */
5802      if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
5803	  && find_section (".gcc_compiled_long32") == NULL)
5804	eh_addr_size = 8;
5805      break;
5806
5807    case EM_H8_300:
5808    case EM_H8_300H:
5809      switch (elf_header.e_flags & EF_H8_MACH)
5810	{
5811	case E_H8_MACH_H8300:
5812	case E_H8_MACH_H8300HN:
5813	case E_H8_MACH_H8300SN:
5814	case E_H8_MACH_H8300SXN:
5815	  eh_addr_size = 2;
5816	  break;
5817	case E_H8_MACH_H8300H:
5818	case E_H8_MACH_H8300S:
5819	case E_H8_MACH_H8300SX:
5820	  eh_addr_size = 4;
5821	  break;
5822	}
5823      break;
5824
5825    case EM_M32C_OLD:
5826    case EM_M32C:
5827      switch (elf_header.e_flags & EF_M32C_CPU_MASK)
5828	{
5829	case EF_M32C_CPU_M16C:
5830	  eh_addr_size = 2;
5831	  break;
5832	}
5833      break;
5834    }
5835
5836#define CHECK_ENTSIZE_VALUES(section, i, size32, size64)		\
5837  do									\
5838    {									\
5839      bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64;	\
5840      if (section->sh_entsize != expected_entsize)			\
5841	{								\
5842	  char buf[40];							\
5843	  sprintf_vma (buf, section->sh_entsize);			\
5844	  /* Note: coded this way so that there is a single string for  \
5845	     translation.  */ \
5846	  error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
5847	  error (_("(Using the expected size of %u for the rest of this dump)\n"), \
5848		   (unsigned) expected_entsize);			\
5849	  section->sh_entsize = expected_entsize;			\
5850	}								\
5851    }									\
5852  while (0)
5853
5854#define CHECK_ENTSIZE(section, i, type)					\
5855  CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type),	    \
5856			sizeof (Elf64_External_##type))
5857
5858  for (i = 0, section = section_headers;
5859       i < elf_header.e_shnum;
5860       i++, section++)
5861    {
5862      char * name = SECTION_NAME (section);
5863
5864      if (section->sh_type == SHT_DYNSYM)
5865	{
5866	  if (dynamic_symbols != NULL)
5867	    {
5868	      error (_("File contains multiple dynamic symbol tables\n"));
5869	      continue;
5870	    }
5871
5872	  CHECK_ENTSIZE (section, i, Sym);
5873	  dynamic_symbols = GET_ELF_SYMBOLS (file, section, & num_dynamic_syms);
5874	}
5875      else if (section->sh_type == SHT_STRTAB
5876	       && streq (name, ".dynstr"))
5877	{
5878	  if (dynamic_strings != NULL)
5879	    {
5880	      error (_("File contains multiple dynamic string tables\n"));
5881	      continue;
5882	    }
5883
5884	  dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
5885                                               1, section->sh_size,
5886                                               _("dynamic strings"));
5887	  dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
5888	}
5889      else if (section->sh_type == SHT_SYMTAB_SHNDX)
5890	{
5891	  elf_section_list * entry = xmalloc (sizeof * entry);
5892	  entry->hdr = section;
5893	  entry->next = symtab_shndx_list;
5894	  symtab_shndx_list = entry;
5895	}
5896      else if (section->sh_type == SHT_SYMTAB)
5897	CHECK_ENTSIZE (section, i, Sym);
5898      else if (section->sh_type == SHT_GROUP)
5899	CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
5900      else if (section->sh_type == SHT_REL)
5901	CHECK_ENTSIZE (section, i, Rel);
5902      else if (section->sh_type == SHT_RELA)
5903	CHECK_ENTSIZE (section, i, Rela);
5904      else if ((do_debugging || do_debug_info || do_debug_abbrevs
5905		|| do_debug_lines || do_debug_pubnames || do_debug_pubtypes
5906		|| do_debug_aranges || do_debug_frames || do_debug_macinfo
5907		|| do_debug_str || do_debug_loc || do_debug_ranges
5908		|| do_debug_addr || do_debug_cu_index)
5909	       && (const_strneq (name, ".debug_")
5910                   || const_strneq (name, ".zdebug_")))
5911	{
5912          if (name[1] == 'z')
5913            name += sizeof (".zdebug_") - 1;
5914          else
5915            name += sizeof (".debug_") - 1;
5916
5917	  if (do_debugging
5918	      || (do_debug_info     && const_strneq (name, "info"))
5919	      || (do_debug_info     && const_strneq (name, "types"))
5920	      || (do_debug_abbrevs  && const_strneq (name, "abbrev"))
5921	      || (do_debug_lines    && strcmp (name, "line") == 0)
5922	      || (do_debug_lines    && const_strneq (name, "line."))
5923	      || (do_debug_pubnames && const_strneq (name, "pubnames"))
5924	      || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
5925	      || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
5926	      || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
5927	      || (do_debug_aranges  && const_strneq (name, "aranges"))
5928	      || (do_debug_ranges   && const_strneq (name, "ranges"))
5929	      || (do_debug_frames   && const_strneq (name, "frame"))
5930	      || (do_debug_macinfo  && const_strneq (name, "macinfo"))
5931	      || (do_debug_macinfo  && const_strneq (name, "macro"))
5932	      || (do_debug_str      && const_strneq (name, "str"))
5933	      || (do_debug_loc      && const_strneq (name, "loc"))
5934	      || (do_debug_addr     && const_strneq (name, "addr"))
5935	      || (do_debug_cu_index && const_strneq (name, "cu_index"))
5936	      || (do_debug_cu_index && const_strneq (name, "tu_index"))
5937	      )
5938	    request_dump_bynumber (i, DEBUG_DUMP);
5939	}
5940      /* Linkonce section to be combined with .debug_info at link time.  */
5941      else if ((do_debugging || do_debug_info)
5942	       && const_strneq (name, ".gnu.linkonce.wi."))
5943	request_dump_bynumber (i, DEBUG_DUMP);
5944      else if (do_debug_frames && streq (name, ".eh_frame"))
5945	request_dump_bynumber (i, DEBUG_DUMP);
5946      else if (do_gdb_index && streq (name, ".gdb_index"))
5947	request_dump_bynumber (i, DEBUG_DUMP);
5948      /* Trace sections for Itanium VMS.  */
5949      else if ((do_debugging || do_trace_info || do_trace_abbrevs
5950                || do_trace_aranges)
5951	       && const_strneq (name, ".trace_"))
5952	{
5953          name += sizeof (".trace_") - 1;
5954
5955	  if (do_debugging
5956	      || (do_trace_info     && streq (name, "info"))
5957	      || (do_trace_abbrevs  && streq (name, "abbrev"))
5958	      || (do_trace_aranges  && streq (name, "aranges"))
5959	      )
5960	    request_dump_bynumber (i, DEBUG_DUMP);
5961	}
5962    }
5963
5964  if (! do_sections)
5965    return 1;
5966
5967  if (elf_header.e_shnum > 1)
5968    printf (_("\nSection Headers:\n"));
5969  else
5970    printf (_("\nSection Header:\n"));
5971
5972  if (is_32bit_elf)
5973    {
5974      if (do_section_details)
5975	{
5976	  printf (_("  [Nr] Name\n"));
5977	  printf (_("       Type            Addr     Off    Size   ES   Lk Inf Al\n"));
5978	}
5979      else
5980	printf
5981	  (_("  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al\n"));
5982    }
5983  else if (do_wide)
5984    {
5985      if (do_section_details)
5986	{
5987	  printf (_("  [Nr] Name\n"));
5988	  printf (_("       Type            Address          Off    Size   ES   Lk Inf Al\n"));
5989	}
5990      else
5991	printf
5992	  (_("  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al\n"));
5993    }
5994  else
5995    {
5996      if (do_section_details)
5997	{
5998	  printf (_("  [Nr] Name\n"));
5999	  printf (_("       Type              Address          Offset            Link\n"));
6000	  printf (_("       Size              EntSize          Info              Align\n"));
6001	}
6002      else
6003	{
6004	  printf (_("  [Nr] Name              Type             Address           Offset\n"));
6005	  printf (_("       Size              EntSize          Flags  Link  Info  Align\n"));
6006	}
6007    }
6008
6009  if (do_section_details)
6010    printf (_("       Flags\n"));
6011
6012  for (i = 0, section = section_headers;
6013       i < elf_header.e_shnum;
6014       i++, section++)
6015    {
6016      /* Run some sanity checks on the section header.  */
6017
6018      /* Check the sh_link field.  */
6019      switch (section->sh_type)
6020	{
6021	case SHT_SYMTAB_SHNDX:
6022	case SHT_GROUP:
6023	case SHT_HASH:
6024	case SHT_GNU_HASH:
6025	case SHT_GNU_versym:
6026	case SHT_REL:
6027	case SHT_RELA:
6028	  if (section->sh_link < 1
6029	      || section->sh_link >= elf_header.e_shnum
6030	      || (section_headers[section->sh_link].sh_type != SHT_SYMTAB
6031		  && section_headers[section->sh_link].sh_type != SHT_DYNSYM))
6032	    warn (_("[%2u]: Link field (%u) should index a symtab section.\n"),
6033		  i, section->sh_link);
6034	  break;
6035
6036	case SHT_DYNAMIC:
6037	case SHT_SYMTAB:
6038	case SHT_DYNSYM:
6039	case SHT_GNU_verneed:
6040	case SHT_GNU_verdef:
6041	case SHT_GNU_LIBLIST:
6042	  if (section->sh_link < 1
6043	      || section->sh_link >= elf_header.e_shnum
6044	      || section_headers[section->sh_link].sh_type != SHT_STRTAB)
6045	    warn (_("[%2u]: Link field (%u) should index a string section.\n"),
6046		  i, section->sh_link);
6047	  break;
6048
6049	case SHT_INIT_ARRAY:
6050	case SHT_FINI_ARRAY:
6051	case SHT_PREINIT_ARRAY:
6052	  if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6053	    warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6054		  i, section->sh_link);
6055	  break;
6056
6057	default:
6058	  /* FIXME: Add support for target specific section types.  */
6059#if 0 	  /* Currently we do not check other section types as there are too
6060	     many special cases.  Stab sections for example have a type
6061	     of SHT_PROGBITS but an sh_link field that links to the .stabstr
6062	     section.  */
6063	  if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6064	    warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6065		  i, section->sh_link);
6066#endif
6067	  break;
6068	}
6069
6070      /* Check the sh_info field.  */
6071      switch (section->sh_type)
6072	{
6073	case SHT_REL:
6074	case SHT_RELA:
6075	  if (section->sh_info < 1
6076	      || section->sh_info >= elf_header.e_shnum
6077	      || (section_headers[section->sh_info].sh_type != SHT_PROGBITS
6078		  && section_headers[section->sh_info].sh_type != SHT_NOBITS
6079		  && section_headers[section->sh_info].sh_type != SHT_NOTE
6080		  && section_headers[section->sh_info].sh_type != SHT_INIT_ARRAY
6081		  /* FIXME: Are other section types valid ?  */
6082		  && section_headers[section->sh_info].sh_type < SHT_LOOS))
6083	    {
6084	      if (section->sh_info == 0
6085		  && (streq (SECTION_NAME (section), ".rel.dyn")
6086		      || streq (SECTION_NAME (section), ".rela.dyn")))
6087		/* The .rel.dyn and .rela.dyn sections have an sh_info field
6088		   of zero.  The relocations in these sections may apply
6089		   to many different sections.  */
6090		   ;
6091	      else
6092		warn (_("[%2u]: Info field (%u) should index a relocatable section.\n"),
6093		      i, section->sh_info);
6094	    }
6095	  break;
6096
6097	case SHT_DYNAMIC:
6098	case SHT_HASH:
6099	case SHT_SYMTAB_SHNDX:
6100	case SHT_INIT_ARRAY:
6101	case SHT_FINI_ARRAY:
6102	case SHT_PREINIT_ARRAY:
6103	  if (section->sh_info != 0)
6104	    warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6105		  i, section->sh_info);
6106	  break;
6107
6108	case SHT_GROUP:
6109	case SHT_SYMTAB:
6110	case SHT_DYNSYM:
6111	  /* A symbol index - we assume that it is valid.  */
6112	  break;
6113
6114	default:
6115	  /* FIXME: Add support for target specific section types.  */
6116	  if (section->sh_type == SHT_NOBITS)
6117	    /* NOBITS section headers with non-zero sh_info fields can be
6118	       created when a binary is stripped of everything but its debug
6119	       information.  The stripped sections have their headers
6120	       preserved but their types set to SHT_NOBITS.  So do not check
6121	       this type of section.  */
6122	    ;
6123	  else if (section->sh_flags & SHF_INFO_LINK)
6124	    {
6125	      if (section->sh_info < 1 || section->sh_info >= elf_header.e_shnum)
6126		warn (_("[%2u]: Expected link to another section in info field"), i);
6127	    }
6128	  else if (section->sh_type < SHT_LOOS && section->sh_info != 0)
6129	    warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6130		  i, section->sh_info);
6131	  break;
6132	}
6133
6134      printf ("  [%2u] ", i);
6135      if (do_section_details)
6136	printf ("%s\n      ", printable_section_name (section));
6137      else
6138	print_symbol (-17, SECTION_NAME (section));
6139
6140      printf (do_wide ? " %-15s " : " %-15.15s ",
6141	      get_section_type_name (section->sh_type));
6142
6143      if (is_32bit_elf)
6144	{
6145	  const char * link_too_big = NULL;
6146
6147	  print_vma (section->sh_addr, LONG_HEX);
6148
6149	  printf ( " %6.6lx %6.6lx %2.2lx",
6150		   (unsigned long) section->sh_offset,
6151		   (unsigned long) section->sh_size,
6152		   (unsigned long) section->sh_entsize);
6153
6154	  if (do_section_details)
6155	    fputs ("  ", stdout);
6156	  else
6157	    printf (" %3s ", get_elf_section_flags (section->sh_flags));
6158
6159	  if (section->sh_link >= elf_header.e_shnum)
6160	    {
6161	      link_too_big = "";
6162	      /* The sh_link value is out of range.  Normally this indicates
6163		 an error but it can have special values in Solaris binaries.  */
6164	      switch (elf_header.e_machine)
6165		{
6166		case EM_386:
6167		case EM_IAMCU:
6168		case EM_X86_64:
6169		case EM_L1OM:
6170		case EM_K1OM:
6171		case EM_OLD_SPARCV9:
6172		case EM_SPARC32PLUS:
6173		case EM_SPARCV9:
6174		case EM_SPARC:
6175		  if (section->sh_link == (SHN_BEFORE & 0xffff))
6176		    link_too_big = "BEFORE";
6177		  else if (section->sh_link == (SHN_AFTER & 0xffff))
6178		    link_too_big = "AFTER";
6179		  break;
6180		default:
6181		  break;
6182		}
6183	    }
6184
6185	  if (do_section_details)
6186	    {
6187	      if (link_too_big != NULL && * link_too_big)
6188		printf ("<%s> ", link_too_big);
6189	      else
6190		printf ("%2u ", section->sh_link);
6191	      printf ("%3u %2lu\n", section->sh_info,
6192		      (unsigned long) section->sh_addralign);
6193	    }
6194	  else
6195	    printf ("%2u %3u %2lu\n",
6196		    section->sh_link,
6197		    section->sh_info,
6198		    (unsigned long) section->sh_addralign);
6199
6200	  if (link_too_big && ! * link_too_big)
6201	    warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
6202		  i, section->sh_link);
6203	}
6204      else if (do_wide)
6205	{
6206	  print_vma (section->sh_addr, LONG_HEX);
6207
6208	  if ((long) section->sh_offset == section->sh_offset)
6209	    printf (" %6.6lx", (unsigned long) section->sh_offset);
6210	  else
6211	    {
6212	      putchar (' ');
6213	      print_vma (section->sh_offset, LONG_HEX);
6214	    }
6215
6216	  if ((unsigned long) section->sh_size == section->sh_size)
6217	    printf (" %6.6lx", (unsigned long) section->sh_size);
6218	  else
6219	    {
6220	      putchar (' ');
6221	      print_vma (section->sh_size, LONG_HEX);
6222	    }
6223
6224	  if ((unsigned long) section->sh_entsize == section->sh_entsize)
6225	    printf (" %2.2lx", (unsigned long) section->sh_entsize);
6226	  else
6227	    {
6228	      putchar (' ');
6229	      print_vma (section->sh_entsize, LONG_HEX);
6230	    }
6231
6232	  if (do_section_details)
6233	    fputs ("  ", stdout);
6234	  else
6235	    printf (" %3s ", get_elf_section_flags (section->sh_flags));
6236
6237	  printf ("%2u %3u ", section->sh_link, section->sh_info);
6238
6239	  if ((unsigned long) section->sh_addralign == section->sh_addralign)
6240	    printf ("%2lu\n", (unsigned long) section->sh_addralign);
6241	  else
6242	    {
6243	      print_vma (section->sh_addralign, DEC);
6244	      putchar ('\n');
6245	    }
6246	}
6247      else if (do_section_details)
6248	{
6249	  printf ("       %-15.15s  ",
6250		  get_section_type_name (section->sh_type));
6251	  print_vma (section->sh_addr, LONG_HEX);
6252	  if ((long) section->sh_offset == section->sh_offset)
6253	    printf ("  %16.16lx", (unsigned long) section->sh_offset);
6254	  else
6255	    {
6256	      printf ("  ");
6257	      print_vma (section->sh_offset, LONG_HEX);
6258	    }
6259	  printf ("  %u\n       ", section->sh_link);
6260	  print_vma (section->sh_size, LONG_HEX);
6261	  putchar (' ');
6262	  print_vma (section->sh_entsize, LONG_HEX);
6263
6264	  printf ("  %-16u  %lu\n",
6265		  section->sh_info,
6266		  (unsigned long) section->sh_addralign);
6267	}
6268      else
6269	{
6270	  putchar (' ');
6271	  print_vma (section->sh_addr, LONG_HEX);
6272	  if ((long) section->sh_offset == section->sh_offset)
6273	    printf ("  %8.8lx", (unsigned long) section->sh_offset);
6274	  else
6275	    {
6276	      printf ("  ");
6277	      print_vma (section->sh_offset, LONG_HEX);
6278	    }
6279	  printf ("\n       ");
6280	  print_vma (section->sh_size, LONG_HEX);
6281	  printf ("  ");
6282	  print_vma (section->sh_entsize, LONG_HEX);
6283
6284	  printf (" %3s ", get_elf_section_flags (section->sh_flags));
6285
6286	  printf ("     %2u   %3u     %lu\n",
6287		  section->sh_link,
6288		  section->sh_info,
6289		  (unsigned long) section->sh_addralign);
6290	}
6291
6292      if (do_section_details)
6293	{
6294	  printf ("       %s\n", get_elf_section_flags (section->sh_flags));
6295	  if ((section->sh_flags & SHF_COMPRESSED) != 0)
6296	    {
6297	      /* Minimum section size is 12 bytes for 32-bit compression
6298		 header + 12 bytes for compressed data header.  */
6299	      unsigned char buf[24];
6300
6301	      assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
6302	      if (get_data (&buf, (FILE *) file, section->sh_offset, 1,
6303			    sizeof (buf), _("compression header")))
6304		{
6305		  Elf_Internal_Chdr chdr;
6306
6307		  (void) get_compression_header (&chdr, buf);
6308
6309		  if (chdr.ch_type == ELFCOMPRESS_ZLIB)
6310		    printf ("       ZLIB, ");
6311		  else
6312		    printf (_("       [<unknown>: 0x%x], "),
6313			    chdr.ch_type);
6314		  print_vma (chdr.ch_size, LONG_HEX);
6315		  printf (", %lu\n", (unsigned long) chdr.ch_addralign);
6316		}
6317	    }
6318	}
6319    }
6320
6321  if (!do_section_details)
6322    {
6323      /* The ordering of the letters shown here matches the ordering of the
6324	 corresponding SHF_xxx values, and hence the order in which these
6325	 letters will be displayed to the user.  */
6326      printf (_("Key to Flags:\n\
6327  W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6328  L (link order), O (extra OS processing required), G (group), T (TLS),\n\
6329  C (compressed), x (unknown), o (OS specific), E (exclude),\n  "));
6330      if (elf_header.e_machine == EM_X86_64
6331	  || elf_header.e_machine == EM_L1OM
6332	  || elf_header.e_machine == EM_K1OM)
6333	printf (_("l (large), "));
6334      else if (elf_header.e_machine == EM_ARM)
6335	printf (_("y (purecode), "));
6336      printf ("p (processor specific)\n");
6337    }
6338
6339  return 1;
6340}
6341
6342static const char *
6343get_group_flags (unsigned int flags)
6344{
6345  static char buff[128];
6346
6347  if (flags == 0)
6348    return "";
6349  else if (flags == GRP_COMDAT)
6350    return "COMDAT ";
6351
6352  snprintf (buff, 14, _("[0x%x: "), flags);
6353
6354  flags &= ~ GRP_COMDAT;
6355  if (flags & GRP_MASKOS)
6356    {
6357      strcat (buff, "<OS specific>");
6358      flags &= ~ GRP_MASKOS;
6359    }
6360
6361  if (flags & GRP_MASKPROC)
6362    {
6363      strcat (buff, "<PROC specific>");
6364      flags &= ~ GRP_MASKPROC;
6365    }
6366
6367  if (flags)
6368    strcat (buff, "<unknown>");
6369
6370  strcat (buff, "]");
6371  return buff;
6372}
6373
6374static int
6375process_section_groups (FILE * file)
6376{
6377  Elf_Internal_Shdr * section;
6378  unsigned int i;
6379  struct group * group;
6380  Elf_Internal_Shdr * symtab_sec;
6381  Elf_Internal_Shdr * strtab_sec;
6382  Elf_Internal_Sym * symtab;
6383  unsigned long num_syms;
6384  char * strtab;
6385  size_t strtab_size;
6386
6387  /* Don't process section groups unless needed.  */
6388  if (!do_unwind && !do_section_groups)
6389    return 1;
6390
6391  if (elf_header.e_shnum == 0)
6392    {
6393      if (do_section_groups)
6394	printf (_("\nThere are no sections to group in this file.\n"));
6395
6396      return 1;
6397    }
6398
6399  if (section_headers == NULL)
6400    {
6401      error (_("Section headers are not available!\n"));
6402      /* PR 13622: This can happen with a corrupt ELF header.  */
6403      return 0;
6404    }
6405
6406  section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
6407                                                     sizeof (struct group *));
6408
6409  if (section_headers_groups == NULL)
6410    {
6411      error (_("Out of memory reading %u section group headers\n"),
6412	     elf_header.e_shnum);
6413      return 0;
6414    }
6415
6416  /* Scan the sections for the group section.  */
6417  group_count = 0;
6418  for (i = 0, section = section_headers;
6419       i < elf_header.e_shnum;
6420       i++, section++)
6421    if (section->sh_type == SHT_GROUP)
6422      group_count++;
6423
6424  if (group_count == 0)
6425    {
6426      if (do_section_groups)
6427	printf (_("\nThere are no section groups in this file.\n"));
6428
6429      return 1;
6430    }
6431
6432  section_groups = (struct group *) calloc (group_count, sizeof (struct group));
6433
6434  if (section_groups == NULL)
6435    {
6436      error (_("Out of memory reading %lu groups\n"),
6437	     (unsigned long) group_count);
6438      return 0;
6439    }
6440
6441  symtab_sec = NULL;
6442  strtab_sec = NULL;
6443  symtab = NULL;
6444  num_syms = 0;
6445  strtab = NULL;
6446  strtab_size = 0;
6447  for (i = 0, section = section_headers, group = section_groups;
6448       i < elf_header.e_shnum;
6449       i++, section++)
6450    {
6451      if (section->sh_type == SHT_GROUP)
6452	{
6453	  const char * name = printable_section_name (section);
6454	  const char * group_name;
6455	  unsigned char * start;
6456	  unsigned char * indices;
6457	  unsigned int entry, j, size;
6458	  Elf_Internal_Shdr * sec;
6459	  Elf_Internal_Sym * sym;
6460
6461	  /* Get the symbol table.  */
6462	  if (section->sh_link >= elf_header.e_shnum
6463	      || ((sec = section_headers + section->sh_link)->sh_type
6464		  != SHT_SYMTAB))
6465	    {
6466	      error (_("Bad sh_link in group section `%s'\n"), name);
6467	      continue;
6468	    }
6469
6470	  if (symtab_sec != sec)
6471	    {
6472	      symtab_sec = sec;
6473	      if (symtab)
6474		free (symtab);
6475	      symtab = GET_ELF_SYMBOLS (file, symtab_sec, & num_syms);
6476	    }
6477
6478	  if (symtab == NULL)
6479	    {
6480	      error (_("Corrupt header in group section `%s'\n"), name);
6481	      continue;
6482	    }
6483
6484	  if (section->sh_info >= num_syms)
6485	    {
6486	      error (_("Bad sh_info in group section `%s'\n"), name);
6487	      continue;
6488	    }
6489
6490	  sym = symtab + section->sh_info;
6491
6492	  if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6493	    {
6494	      if (sym->st_shndx == 0
6495		  || sym->st_shndx >= elf_header.e_shnum)
6496		{
6497		  error (_("Bad sh_info in group section `%s'\n"), name);
6498		  continue;
6499		}
6500
6501	      group_name = SECTION_NAME (section_headers + sym->st_shndx);
6502	      strtab_sec = NULL;
6503	      if (strtab)
6504		free (strtab);
6505	      strtab = NULL;
6506	      strtab_size = 0;
6507	    }
6508	  else
6509	    {
6510	      /* Get the string table.  */
6511	      if (symtab_sec->sh_link >= elf_header.e_shnum)
6512		{
6513		  strtab_sec = NULL;
6514		  if (strtab)
6515		    free (strtab);
6516		  strtab = NULL;
6517		  strtab_size = 0;
6518		}
6519	      else if (strtab_sec
6520		       != (sec = section_headers + symtab_sec->sh_link))
6521		{
6522		  strtab_sec = sec;
6523		  if (strtab)
6524		    free (strtab);
6525
6526		  strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
6527					      1, strtab_sec->sh_size,
6528					      _("string table"));
6529		  strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
6530		}
6531	      group_name = sym->st_name < strtab_size
6532		? strtab + sym->st_name : _("<corrupt>");
6533	    }
6534
6535	  /* PR 17531: file: loop.  */
6536	  if (section->sh_entsize > section->sh_size)
6537	    {
6538	      error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6539		     printable_section_name (section),
6540		     (unsigned long) section->sh_entsize,
6541		     (unsigned long) section->sh_size);
6542	      break;
6543	    }
6544
6545	  start = (unsigned char *) get_data (NULL, file, section->sh_offset,
6546                                              1, section->sh_size,
6547                                              _("section data"));
6548	  if (start == NULL)
6549	    continue;
6550
6551	  indices = start;
6552	  size = (section->sh_size / section->sh_entsize) - 1;
6553	  entry = byte_get (indices, 4);
6554	  indices += 4;
6555
6556	  if (do_section_groups)
6557	    {
6558	      printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
6559		      get_group_flags (entry), i, name, group_name, size);
6560
6561	      printf (_("   [Index]    Name\n"));
6562	    }
6563
6564	  group->group_index = i;
6565
6566	  for (j = 0; j < size; j++)
6567	    {
6568	      struct group_list * g;
6569
6570	      entry = byte_get (indices, 4);
6571	      indices += 4;
6572
6573	      if (entry >= elf_header.e_shnum)
6574		{
6575		  static unsigned num_group_errors = 0;
6576
6577		  if (num_group_errors ++ < 10)
6578		    {
6579		      error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6580			     entry, i, elf_header.e_shnum - 1);
6581		      if (num_group_errors == 10)
6582			warn (_("Futher error messages about overlarge group section indicies suppressed\n"));
6583		    }
6584		  continue;
6585		}
6586
6587	      if (section_headers_groups [entry] != NULL)
6588		{
6589		  if (entry)
6590		    {
6591		      static unsigned num_errs = 0;
6592
6593		      if (num_errs ++ < 10)
6594			{
6595			  error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6596				 entry, i,
6597				 section_headers_groups [entry]->group_index);
6598			  if (num_errs == 10)
6599			    warn (_("Further error messages about already contained group sections suppressed\n"));
6600			}
6601		      continue;
6602		    }
6603		  else
6604		    {
6605		      /* Intel C/C++ compiler may put section 0 in a
6606			 section group. We just warn it the first time
6607			 and ignore it afterwards.  */
6608		      static int warned = 0;
6609		      if (!warned)
6610			{
6611			  error (_("section 0 in group section [%5u]\n"),
6612				 section_headers_groups [entry]->group_index);
6613			  warned++;
6614			}
6615		    }
6616		}
6617
6618	      section_headers_groups [entry] = group;
6619
6620	      if (do_section_groups)
6621		{
6622		  sec = section_headers + entry;
6623		  printf ("   [%5u]   %s\n", entry, printable_section_name (sec));
6624		}
6625
6626	      g = (struct group_list *) xmalloc (sizeof (struct group_list));
6627	      g->section_index = entry;
6628	      g->next = group->root;
6629	      group->root = g;
6630	    }
6631
6632	  if (start)
6633	    free (start);
6634
6635	  group++;
6636	}
6637    }
6638
6639  if (symtab)
6640    free (symtab);
6641  if (strtab)
6642    free (strtab);
6643  return 1;
6644}
6645
6646/* Data used to display dynamic fixups.  */
6647
6648struct ia64_vms_dynfixup
6649{
6650  bfd_vma needed_ident;		/* Library ident number.  */
6651  bfd_vma needed;		/* Index in the dstrtab of the library name.  */
6652  bfd_vma fixup_needed;		/* Index of the library.  */
6653  bfd_vma fixup_rela_cnt;	/* Number of fixups.  */
6654  bfd_vma fixup_rela_off;	/* Fixups offset in the dynamic segment.  */
6655};
6656
6657/* Data used to display dynamic relocations.  */
6658
6659struct ia64_vms_dynimgrela
6660{
6661  bfd_vma img_rela_cnt;		/* Number of relocations.  */
6662  bfd_vma img_rela_off;		/* Reloc offset in the dynamic segment.  */
6663};
6664
6665/* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6666   library).  */
6667
6668static void
6669dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
6670                              const char *strtab, unsigned int strtab_sz)
6671{
6672  Elf64_External_VMS_IMAGE_FIXUP *imfs;
6673  long i;
6674  const char *lib_name;
6675
6676  imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
6677		   1, fixup->fixup_rela_cnt * sizeof (*imfs),
6678		   _("dynamic section image fixups"));
6679  if (!imfs)
6680    return;
6681
6682  if (fixup->needed < strtab_sz)
6683    lib_name = strtab + fixup->needed;
6684  else
6685    {
6686      warn ("corrupt library name index of 0x%lx found in dynamic entry",
6687            (unsigned long) fixup->needed);
6688      lib_name = "???";
6689    }
6690  printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
6691	  (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
6692  printf
6693    (_("Seg Offset           Type                             SymVec DataType\n"));
6694
6695  for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
6696    {
6697      unsigned int type;
6698      const char *rtype;
6699
6700      printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
6701      printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
6702      type = BYTE_GET (imfs [i].type);
6703      rtype = elf_ia64_reloc_type (type);
6704      if (rtype == NULL)
6705        printf (" 0x%08x                       ", type);
6706      else
6707        printf (" %-32s ", rtype);
6708      printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
6709      printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
6710    }
6711
6712  free (imfs);
6713}
6714
6715/* Display IA-64 OpenVMS dynamic relocations (used to relocate an image).  */
6716
6717static void
6718dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
6719{
6720  Elf64_External_VMS_IMAGE_RELA *imrs;
6721  long i;
6722
6723  imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
6724		   1, imgrela->img_rela_cnt * sizeof (*imrs),
6725		   _("dynamic section image relocations"));
6726  if (!imrs)
6727    return;
6728
6729  printf (_("\nImage relocs\n"));
6730  printf
6731    (_("Seg Offset   Type                            Addend            Seg Sym Off\n"));
6732
6733  for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
6734    {
6735      unsigned int type;
6736      const char *rtype;
6737
6738      printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
6739      printf ("%08" BFD_VMA_FMT "x ",
6740              (bfd_vma) BYTE_GET (imrs [i].rela_offset));
6741      type = BYTE_GET (imrs [i].type);
6742      rtype = elf_ia64_reloc_type (type);
6743      if (rtype == NULL)
6744        printf ("0x%08x                      ", type);
6745      else
6746        printf ("%-31s ", rtype);
6747      print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
6748      printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
6749      printf ("%08" BFD_VMA_FMT "x\n",
6750              (bfd_vma) BYTE_GET (imrs [i].sym_offset));
6751    }
6752
6753  free (imrs);
6754}
6755
6756/* Display IA-64 OpenVMS dynamic relocations and fixups.  */
6757
6758static int
6759process_ia64_vms_dynamic_relocs (FILE *file)
6760{
6761  struct ia64_vms_dynfixup fixup;
6762  struct ia64_vms_dynimgrela imgrela;
6763  Elf_Internal_Dyn *entry;
6764  int res = 0;
6765  bfd_vma strtab_off = 0;
6766  bfd_vma strtab_sz = 0;
6767  char *strtab = NULL;
6768
6769  memset (&fixup, 0, sizeof (fixup));
6770  memset (&imgrela, 0, sizeof (imgrela));
6771
6772  /* Note: the order of the entries is specified by the OpenVMS specs.  */
6773  for (entry = dynamic_section;
6774       entry < dynamic_section + dynamic_nent;
6775       entry++)
6776    {
6777      switch (entry->d_tag)
6778        {
6779        case DT_IA_64_VMS_STRTAB_OFFSET:
6780          strtab_off = entry->d_un.d_val;
6781          break;
6782        case DT_STRSZ:
6783          strtab_sz = entry->d_un.d_val;
6784          if (strtab == NULL)
6785            strtab = get_data (NULL, file, dynamic_addr + strtab_off,
6786                               1, strtab_sz, _("dynamic string section"));
6787          break;
6788
6789        case DT_IA_64_VMS_NEEDED_IDENT:
6790          fixup.needed_ident = entry->d_un.d_val;
6791          break;
6792        case DT_NEEDED:
6793          fixup.needed = entry->d_un.d_val;
6794          break;
6795        case DT_IA_64_VMS_FIXUP_NEEDED:
6796          fixup.fixup_needed = entry->d_un.d_val;
6797          break;
6798        case DT_IA_64_VMS_FIXUP_RELA_CNT:
6799          fixup.fixup_rela_cnt = entry->d_un.d_val;
6800          break;
6801        case DT_IA_64_VMS_FIXUP_RELA_OFF:
6802          fixup.fixup_rela_off = entry->d_un.d_val;
6803          res++;
6804          dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
6805          break;
6806
6807        case DT_IA_64_VMS_IMG_RELA_CNT:
6808	  imgrela.img_rela_cnt = entry->d_un.d_val;
6809          break;
6810        case DT_IA_64_VMS_IMG_RELA_OFF:
6811	  imgrela.img_rela_off = entry->d_un.d_val;
6812          res++;
6813          dump_ia64_vms_dynamic_relocs (file, &imgrela);
6814          break;
6815
6816        default:
6817          break;
6818	}
6819    }
6820
6821  if (strtab != NULL)
6822    free (strtab);
6823
6824  return res;
6825}
6826
6827static struct
6828{
6829  const char * name;
6830  int reloc;
6831  int size;
6832  int rela;
6833} dynamic_relocations [] =
6834{
6835    { "REL", DT_REL, DT_RELSZ, FALSE },
6836    { "RELA", DT_RELA, DT_RELASZ, TRUE },
6837    { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
6838};
6839
6840/* Process the reloc section.  */
6841
6842static int
6843process_relocs (FILE * file)
6844{
6845  unsigned long rel_size;
6846  unsigned long rel_offset;
6847
6848
6849  if (!do_reloc)
6850    return 1;
6851
6852  if (do_using_dynamic)
6853    {
6854      int is_rela;
6855      const char * name;
6856      int has_dynamic_reloc;
6857      unsigned int i;
6858
6859      has_dynamic_reloc = 0;
6860
6861      for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
6862	{
6863	  is_rela = dynamic_relocations [i].rela;
6864	  name = dynamic_relocations [i].name;
6865	  rel_size = dynamic_info [dynamic_relocations [i].size];
6866	  rel_offset = dynamic_info [dynamic_relocations [i].reloc];
6867
6868	  has_dynamic_reloc |= rel_size;
6869
6870	  if (is_rela == UNKNOWN)
6871	    {
6872	      if (dynamic_relocations [i].reloc == DT_JMPREL)
6873		switch (dynamic_info[DT_PLTREL])
6874		  {
6875		  case DT_REL:
6876		    is_rela = FALSE;
6877		    break;
6878		  case DT_RELA:
6879		    is_rela = TRUE;
6880		    break;
6881		  }
6882	    }
6883
6884	  if (rel_size)
6885	    {
6886	      printf
6887		(_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
6888		 name, rel_offset, rel_size);
6889
6890	      dump_relocations (file,
6891				offset_from_vma (file, rel_offset, rel_size),
6892				rel_size,
6893				dynamic_symbols, num_dynamic_syms,
6894				dynamic_strings, dynamic_strings_length,
6895				is_rela, 1);
6896	    }
6897	}
6898
6899      if (is_ia64_vms ())
6900        has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
6901
6902      if (! has_dynamic_reloc)
6903	printf (_("\nThere are no dynamic relocations in this file.\n"));
6904    }
6905  else
6906    {
6907      Elf_Internal_Shdr * section;
6908      unsigned long i;
6909      int found = 0;
6910
6911      for (i = 0, section = section_headers;
6912	   i < elf_header.e_shnum;
6913	   i++, section++)
6914	{
6915	  if (   section->sh_type != SHT_RELA
6916	      && section->sh_type != SHT_REL)
6917	    continue;
6918
6919	  rel_offset = section->sh_offset;
6920	  rel_size   = section->sh_size;
6921
6922	  if (rel_size)
6923	    {
6924	      Elf_Internal_Shdr * strsec;
6925	      int is_rela;
6926
6927	      printf (_("\nRelocation section "));
6928
6929	      if (string_table == NULL)
6930		printf ("%d", section->sh_name);
6931	      else
6932		printf ("'%s'", printable_section_name (section));
6933
6934	      printf (_(" at offset 0x%lx contains %lu entries:\n"),
6935		 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
6936
6937	      is_rela = section->sh_type == SHT_RELA;
6938
6939	      if (section->sh_link != 0
6940		  && section->sh_link < elf_header.e_shnum)
6941		{
6942		  Elf_Internal_Shdr * symsec;
6943		  Elf_Internal_Sym *  symtab;
6944		  unsigned long nsyms;
6945		  unsigned long strtablen = 0;
6946		  char * strtab = NULL;
6947
6948		  symsec = section_headers + section->sh_link;
6949		  if (symsec->sh_type != SHT_SYMTAB
6950		      && symsec->sh_type != SHT_DYNSYM)
6951                    continue;
6952
6953		  symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms);
6954
6955		  if (symtab == NULL)
6956		    continue;
6957
6958		  if (symsec->sh_link != 0
6959		      && symsec->sh_link < elf_header.e_shnum)
6960		    {
6961		      strsec = section_headers + symsec->sh_link;
6962
6963		      strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6964						  1, strsec->sh_size,
6965						  _("string table"));
6966		      strtablen = strtab == NULL ? 0 : strsec->sh_size;
6967		    }
6968
6969		  dump_relocations (file, rel_offset, rel_size,
6970				    symtab, nsyms, strtab, strtablen,
6971				    is_rela,
6972				    symsec->sh_type == SHT_DYNSYM);
6973		  if (strtab)
6974		    free (strtab);
6975		  free (symtab);
6976		}
6977	      else
6978		dump_relocations (file, rel_offset, rel_size,
6979				  NULL, 0, NULL, 0, is_rela, 0);
6980
6981	      found = 1;
6982	    }
6983	}
6984
6985      if (! found)
6986	printf (_("\nThere are no relocations in this file.\n"));
6987    }
6988
6989  return 1;
6990}
6991
6992/* An absolute address consists of a section and an offset.  If the
6993   section is NULL, the offset itself is the address, otherwise, the
6994   address equals to LOAD_ADDRESS(section) + offset.  */
6995
6996struct absaddr
6997{
6998  unsigned short section;
6999  bfd_vma offset;
7000};
7001
7002#define ABSADDR(a) \
7003  ((a).section \
7004   ? section_headers [(a).section].sh_addr + (a).offset \
7005   : (a).offset)
7006
7007/* Find the nearest symbol at or below ADDR.  Returns the symbol
7008   name, if found, and the offset from the symbol to ADDR.  */
7009
7010static void
7011find_symbol_for_address (Elf_Internal_Sym * symtab,
7012			 unsigned long      nsyms,
7013			 const char *       strtab,
7014			 unsigned long      strtab_size,
7015			 struct absaddr     addr,
7016			 const char **      symname,
7017			 bfd_vma *          offset)
7018{
7019  bfd_vma dist = 0x100000;
7020  Elf_Internal_Sym * sym;
7021  Elf_Internal_Sym * beg;
7022  Elf_Internal_Sym * end;
7023  Elf_Internal_Sym * best = NULL;
7024
7025  REMOVE_ARCH_BITS (addr.offset);
7026  beg = symtab;
7027  end = symtab + nsyms;
7028
7029  while (beg < end)
7030    {
7031      bfd_vma value;
7032
7033      sym = beg + (end - beg) / 2;
7034
7035      value = sym->st_value;
7036      REMOVE_ARCH_BITS (value);
7037
7038      if (sym->st_name != 0
7039	  && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
7040	  && addr.offset >= value
7041	  && addr.offset - value < dist)
7042	{
7043	  best = sym;
7044	  dist = addr.offset - value;
7045	  if (!dist)
7046	    break;
7047	}
7048
7049      if (addr.offset < value)
7050	end = sym;
7051      else
7052	beg = sym + 1;
7053    }
7054
7055  if (best)
7056    {
7057      *symname = (best->st_name >= strtab_size
7058		  ? _("<corrupt>") : strtab + best->st_name);
7059      *offset = dist;
7060      return;
7061    }
7062
7063  *symname = NULL;
7064  *offset = addr.offset;
7065}
7066
7067static int
7068symcmp (const void *p, const void *q)
7069{
7070  Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
7071  Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
7072
7073  return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
7074}
7075
7076/* Process the unwind section.  */
7077
7078#include "unwind-ia64.h"
7079
7080struct ia64_unw_table_entry
7081{
7082  struct absaddr start;
7083  struct absaddr end;
7084  struct absaddr info;
7085};
7086
7087struct ia64_unw_aux_info
7088{
7089  struct ia64_unw_table_entry *table;	/* Unwind table.  */
7090  unsigned long table_len;		/* Length of unwind table.  */
7091  unsigned char * info;			/* Unwind info.  */
7092  unsigned long info_size;		/* Size of unwind info.  */
7093  bfd_vma info_addr;			/* Starting address of unwind info.  */
7094  bfd_vma seg_base;			/* Starting address of segment.  */
7095  Elf_Internal_Sym * symtab;		/* The symbol table.  */
7096  unsigned long nsyms;			/* Number of symbols.  */
7097  Elf_Internal_Sym * funtab;		/* Sorted table of STT_FUNC symbols.  */
7098  unsigned long nfuns;			/* Number of entries in funtab.  */
7099  char * strtab;			/* The string table.  */
7100  unsigned long strtab_size;		/* Size of string table.  */
7101};
7102
7103static void
7104dump_ia64_unwind (struct ia64_unw_aux_info * aux)
7105{
7106  struct ia64_unw_table_entry * tp;
7107  unsigned long j, nfuns;
7108  int in_body;
7109
7110  aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7111  for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7112    if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7113      aux->funtab[nfuns++] = aux->symtab[j];
7114  aux->nfuns = nfuns;
7115  qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7116
7117  for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7118    {
7119      bfd_vma stamp;
7120      bfd_vma offset;
7121      const unsigned char * dp;
7122      const unsigned char * head;
7123      const unsigned char * end;
7124      const char * procname;
7125
7126      find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7127			       aux->strtab_size, tp->start, &procname, &offset);
7128
7129      fputs ("\n<", stdout);
7130
7131      if (procname)
7132	{
7133	  fputs (procname, stdout);
7134
7135	  if (offset)
7136	    printf ("+%lx", (unsigned long) offset);
7137	}
7138
7139      fputs (">: [", stdout);
7140      print_vma (tp->start.offset, PREFIX_HEX);
7141      fputc ('-', stdout);
7142      print_vma (tp->end.offset, PREFIX_HEX);
7143      printf ("], info at +0x%lx\n",
7144	      (unsigned long) (tp->info.offset - aux->seg_base));
7145
7146      /* PR 17531: file: 86232b32.  */
7147      if (aux->info == NULL)
7148	continue;
7149
7150      /* PR 17531: file: 0997b4d1.  */
7151      if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
7152	{
7153	  warn (_("Invalid offset %lx in table entry %ld\n"),
7154		(long) tp->info.offset, (long) (tp - aux->table));
7155	  continue;
7156	}
7157
7158      head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
7159      stamp = byte_get ((unsigned char *) head, sizeof (stamp));
7160
7161      printf ("  v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
7162	      (unsigned) UNW_VER (stamp),
7163	      (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
7164	      UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
7165	      UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
7166	      (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
7167
7168      if (UNW_VER (stamp) != 1)
7169	{
7170	  printf (_("\tUnknown version.\n"));
7171	  continue;
7172	}
7173
7174      in_body = 0;
7175      end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
7176      /* PR 17531: file: 16ceda89.  */
7177      if (end > aux->info + aux->info_size)
7178	end = aux->info + aux->info_size;
7179      for (dp = head + 8; dp < end;)
7180	dp = unw_decode (dp, in_body, & in_body, end);
7181    }
7182
7183  free (aux->funtab);
7184}
7185
7186static bfd_boolean
7187slurp_ia64_unwind_table (FILE * file,
7188			 struct ia64_unw_aux_info * aux,
7189			 Elf_Internal_Shdr * sec)
7190{
7191  unsigned long size, nrelas, i;
7192  Elf_Internal_Phdr * seg;
7193  struct ia64_unw_table_entry * tep;
7194  Elf_Internal_Shdr * relsec;
7195  Elf_Internal_Rela * rela;
7196  Elf_Internal_Rela * rp;
7197  unsigned char * table;
7198  unsigned char * tp;
7199  Elf_Internal_Sym * sym;
7200  const char * relname;
7201
7202  aux->table_len = 0;
7203
7204  /* First, find the starting address of the segment that includes
7205     this section: */
7206
7207  if (elf_header.e_phnum)
7208    {
7209      if (! get_program_headers (file))
7210	  return FALSE;
7211
7212      for (seg = program_headers;
7213	   seg < program_headers + elf_header.e_phnum;
7214	   ++seg)
7215	{
7216	  if (seg->p_type != PT_LOAD)
7217	    continue;
7218
7219	  if (sec->sh_addr >= seg->p_vaddr
7220	      && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7221	    {
7222	      aux->seg_base = seg->p_vaddr;
7223	      break;
7224	    }
7225	}
7226    }
7227
7228  /* Second, build the unwind table from the contents of the unwind section:  */
7229  size = sec->sh_size;
7230  table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7231                                      _("unwind table"));
7232  if (!table)
7233    return FALSE;
7234
7235  aux->table_len = size / (3 * eh_addr_size);
7236  aux->table = (struct ia64_unw_table_entry *)
7237    xcmalloc (aux->table_len, sizeof (aux->table[0]));
7238  tep = aux->table;
7239
7240  for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
7241    {
7242      tep->start.section = SHN_UNDEF;
7243      tep->end.section   = SHN_UNDEF;
7244      tep->info.section  = SHN_UNDEF;
7245      tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7246      tep->end.offset   = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7247      tep->info.offset  = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7248      tep->start.offset += aux->seg_base;
7249      tep->end.offset   += aux->seg_base;
7250      tep->info.offset  += aux->seg_base;
7251    }
7252  free (table);
7253
7254  /* Third, apply any relocations to the unwind table:  */
7255  for (relsec = section_headers;
7256       relsec < section_headers + elf_header.e_shnum;
7257       ++relsec)
7258    {
7259      if (relsec->sh_type != SHT_RELA
7260	  || relsec->sh_info >= elf_header.e_shnum
7261	  || section_headers + relsec->sh_info != sec)
7262	continue;
7263
7264      if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7265			      & rela, & nrelas))
7266	{
7267	  free (aux->table);
7268	  aux->table = NULL;
7269	  aux->table_len = 0;
7270	  return FALSE;
7271	}
7272
7273      for (rp = rela; rp < rela + nrelas; ++rp)
7274	{
7275	  relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
7276	  sym = aux->symtab + get_reloc_symindex (rp->r_info);
7277
7278	  /* PR 17531: file: 9fa67536.  */
7279	  if (relname == NULL)
7280	    {
7281	      warn (_("Skipping unknown relocation type: %u\n"), get_reloc_type (rp->r_info));
7282	      continue;
7283	    }
7284
7285	  if (! const_strneq (relname, "R_IA64_SEGREL"))
7286	    {
7287	      warn (_("Skipping unexpected relocation type: %s\n"), relname);
7288	      continue;
7289	    }
7290
7291	  i = rp->r_offset / (3 * eh_addr_size);
7292
7293	  /* PR 17531: file: 5bc8d9bf.  */
7294	  if (i >= aux->table_len)
7295	    {
7296	      warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
7297	      continue;
7298	    }
7299
7300	  switch (rp->r_offset / eh_addr_size % 3)
7301	    {
7302	    case 0:
7303	      aux->table[i].start.section = sym->st_shndx;
7304	      aux->table[i].start.offset  = rp->r_addend + sym->st_value;
7305	      break;
7306	    case 1:
7307	      aux->table[i].end.section   = sym->st_shndx;
7308	      aux->table[i].end.offset    = rp->r_addend + sym->st_value;
7309	      break;
7310	    case 2:
7311	      aux->table[i].info.section  = sym->st_shndx;
7312	      aux->table[i].info.offset   = rp->r_addend + sym->st_value;
7313	      break;
7314	    default:
7315	      break;
7316	    }
7317	}
7318
7319      free (rela);
7320    }
7321
7322  return TRUE;
7323}
7324
7325static void
7326ia64_process_unwind (FILE * file)
7327{
7328  Elf_Internal_Shdr * sec;
7329  Elf_Internal_Shdr * unwsec = NULL;
7330  Elf_Internal_Shdr * strsec;
7331  unsigned long i, unwcount = 0, unwstart = 0;
7332  struct ia64_unw_aux_info aux;
7333
7334  memset (& aux, 0, sizeof (aux));
7335
7336  for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7337    {
7338      if (sec->sh_type == SHT_SYMTAB
7339	  && sec->sh_link < elf_header.e_shnum)
7340	{
7341	  aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7342
7343	  strsec = section_headers + sec->sh_link;
7344	  if (aux.strtab != NULL)
7345	    {
7346	      error (_("Multiple auxillary string tables encountered\n"));
7347	      free (aux.strtab);
7348	    }
7349	  aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7350                                          1, strsec->sh_size,
7351                                          _("string table"));
7352	  aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7353	}
7354      else if (sec->sh_type == SHT_IA_64_UNWIND)
7355	unwcount++;
7356    }
7357
7358  if (!unwcount)
7359    printf (_("\nThere are no unwind sections in this file.\n"));
7360
7361  while (unwcount-- > 0)
7362    {
7363      char * suffix;
7364      size_t len, len2;
7365
7366      for (i = unwstart, sec = section_headers + unwstart, unwsec = NULL;
7367	   i < elf_header.e_shnum; ++i, ++sec)
7368	if (sec->sh_type == SHT_IA_64_UNWIND)
7369	  {
7370	    unwsec = sec;
7371	    break;
7372	  }
7373      /* We have already counted the number of SHT_IA64_UNWIND
7374	 sections so the loop above should never fail.  */
7375      assert (unwsec != NULL);
7376
7377      unwstart = i + 1;
7378      len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
7379
7380      if ((unwsec->sh_flags & SHF_GROUP) != 0)
7381	{
7382	  /* We need to find which section group it is in.  */
7383	  struct group_list * g;
7384
7385	  if (section_headers_groups == NULL
7386	      || section_headers_groups [i] == NULL)
7387	    i = elf_header.e_shnum;
7388	  else
7389	    {
7390	      g = section_headers_groups [i]->root;
7391
7392	      for (; g != NULL; g = g->next)
7393		{
7394		  sec = section_headers + g->section_index;
7395
7396		  if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
7397		    break;
7398		}
7399
7400	      if (g == NULL)
7401		i = elf_header.e_shnum;
7402	    }
7403	}
7404      else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
7405	{
7406	  /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO.  */
7407	  len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
7408	  suffix = SECTION_NAME (unwsec) + len;
7409	  for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7410	       ++i, ++sec)
7411	    if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
7412		&& streq (SECTION_NAME (sec) + len2, suffix))
7413	      break;
7414	}
7415      else
7416	{
7417	  /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
7418	     .IA_64.unwind or BAR -> .IA_64.unwind_info.  */
7419	  len = sizeof (ELF_STRING_ia64_unwind) - 1;
7420	  len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
7421	  suffix = "";
7422	  if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
7423	    suffix = SECTION_NAME (unwsec) + len;
7424	  for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7425	       ++i, ++sec)
7426	    if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
7427		&& streq (SECTION_NAME (sec) + len2, suffix))
7428	      break;
7429	}
7430
7431      if (i == elf_header.e_shnum)
7432	{
7433	  printf (_("\nCould not find unwind info section for "));
7434
7435	  if (string_table == NULL)
7436	    printf ("%d", unwsec->sh_name);
7437	  else
7438	    printf ("'%s'", printable_section_name (unwsec));
7439	}
7440      else
7441	{
7442	  aux.info_addr = sec->sh_addr;
7443	  aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
7444						 sec->sh_size,
7445						 _("unwind info"));
7446	  aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
7447
7448	  printf (_("\nUnwind section "));
7449
7450	  if (string_table == NULL)
7451	    printf ("%d", unwsec->sh_name);
7452	  else
7453	    printf ("'%s'", printable_section_name (unwsec));
7454
7455	  printf (_(" at offset 0x%lx contains %lu entries:\n"),
7456		  (unsigned long) unwsec->sh_offset,
7457		  (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
7458
7459	  if (slurp_ia64_unwind_table (file, & aux, unwsec)
7460	      && aux.table_len > 0)
7461	    dump_ia64_unwind (& aux);
7462
7463	  if (aux.table)
7464	    free ((char *) aux.table);
7465	  if (aux.info)
7466	    free ((char *) aux.info);
7467	  aux.table = NULL;
7468	  aux.info = NULL;
7469	}
7470    }
7471
7472  if (aux.symtab)
7473    free (aux.symtab);
7474  if (aux.strtab)
7475    free ((char *) aux.strtab);
7476}
7477
7478struct hppa_unw_table_entry
7479  {
7480    struct absaddr start;
7481    struct absaddr end;
7482    unsigned int Cannot_unwind:1;		/* 0 */
7483    unsigned int Millicode:1;			/* 1 */
7484    unsigned int Millicode_save_sr0:1;		/* 2 */
7485    unsigned int Region_description:2;		/* 3..4 */
7486    unsigned int reserved1:1;			/* 5 */
7487    unsigned int Entry_SR:1;			/* 6 */
7488    unsigned int Entry_FR:4;     /* number saved */	/* 7..10 */
7489    unsigned int Entry_GR:5;     /* number saved */	/* 11..15 */
7490    unsigned int Args_stored:1;			/* 16 */
7491    unsigned int Variable_Frame:1;		/* 17 */
7492    unsigned int Separate_Package_Body:1;	/* 18 */
7493    unsigned int Frame_Extension_Millicode:1;	/* 19 */
7494    unsigned int Stack_Overflow_Check:1;	/* 20 */
7495    unsigned int Two_Instruction_SP_Increment:1;/* 21 */
7496    unsigned int Ada_Region:1;			/* 22 */
7497    unsigned int cxx_info:1;			/* 23 */
7498    unsigned int cxx_try_catch:1;		/* 24 */
7499    unsigned int sched_entry_seq:1;		/* 25 */
7500    unsigned int reserved2:1;			/* 26 */
7501    unsigned int Save_SP:1;			/* 27 */
7502    unsigned int Save_RP:1;			/* 28 */
7503    unsigned int Save_MRP_in_frame:1;		/* 29 */
7504    unsigned int extn_ptr_defined:1;		/* 30 */
7505    unsigned int Cleanup_defined:1;		/* 31 */
7506
7507    unsigned int MPE_XL_interrupt_marker:1;	/* 0 */
7508    unsigned int HP_UX_interrupt_marker:1;	/* 1 */
7509    unsigned int Large_frame:1;			/* 2 */
7510    unsigned int Pseudo_SP_Set:1;		/* 3 */
7511    unsigned int reserved4:1;			/* 4 */
7512    unsigned int Total_frame_size:27;		/* 5..31 */
7513  };
7514
7515struct hppa_unw_aux_info
7516{
7517  struct hppa_unw_table_entry * table;	/* Unwind table.  */
7518  unsigned long table_len;		/* Length of unwind table.  */
7519  bfd_vma seg_base;			/* Starting address of segment.  */
7520  Elf_Internal_Sym * symtab;		/* The symbol table.  */
7521  unsigned long nsyms;			/* Number of symbols.  */
7522  Elf_Internal_Sym * funtab;		/* Sorted table of STT_FUNC symbols.  */
7523  unsigned long nfuns;			/* Number of entries in funtab.  */
7524  char * strtab;			/* The string table.  */
7525  unsigned long strtab_size;		/* Size of string table.  */
7526};
7527
7528static void
7529dump_hppa_unwind (struct hppa_unw_aux_info * aux)
7530{
7531  struct hppa_unw_table_entry * tp;
7532  unsigned long j, nfuns;
7533
7534  aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7535  for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7536    if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7537      aux->funtab[nfuns++] = aux->symtab[j];
7538  aux->nfuns = nfuns;
7539  qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7540
7541  for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7542    {
7543      bfd_vma offset;
7544      const char * procname;
7545
7546      find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7547			       aux->strtab_size, tp->start, &procname,
7548			       &offset);
7549
7550      fputs ("\n<", stdout);
7551
7552      if (procname)
7553	{
7554	  fputs (procname, stdout);
7555
7556	  if (offset)
7557	    printf ("+%lx", (unsigned long) offset);
7558	}
7559
7560      fputs (">: [", stdout);
7561      print_vma (tp->start.offset, PREFIX_HEX);
7562      fputc ('-', stdout);
7563      print_vma (tp->end.offset, PREFIX_HEX);
7564      printf ("]\n\t");
7565
7566#define PF(_m) if (tp->_m) printf (#_m " ");
7567#define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
7568      PF(Cannot_unwind);
7569      PF(Millicode);
7570      PF(Millicode_save_sr0);
7571      /* PV(Region_description);  */
7572      PF(Entry_SR);
7573      PV(Entry_FR);
7574      PV(Entry_GR);
7575      PF(Args_stored);
7576      PF(Variable_Frame);
7577      PF(Separate_Package_Body);
7578      PF(Frame_Extension_Millicode);
7579      PF(Stack_Overflow_Check);
7580      PF(Two_Instruction_SP_Increment);
7581      PF(Ada_Region);
7582      PF(cxx_info);
7583      PF(cxx_try_catch);
7584      PF(sched_entry_seq);
7585      PF(Save_SP);
7586      PF(Save_RP);
7587      PF(Save_MRP_in_frame);
7588      PF(extn_ptr_defined);
7589      PF(Cleanup_defined);
7590      PF(MPE_XL_interrupt_marker);
7591      PF(HP_UX_interrupt_marker);
7592      PF(Large_frame);
7593      PF(Pseudo_SP_Set);
7594      PV(Total_frame_size);
7595#undef PF
7596#undef PV
7597    }
7598
7599  printf ("\n");
7600
7601  free (aux->funtab);
7602}
7603
7604static int
7605slurp_hppa_unwind_table (FILE * file,
7606			 struct hppa_unw_aux_info * aux,
7607			 Elf_Internal_Shdr * sec)
7608{
7609  unsigned long size, unw_ent_size, nentries, nrelas, i;
7610  Elf_Internal_Phdr * seg;
7611  struct hppa_unw_table_entry * tep;
7612  Elf_Internal_Shdr * relsec;
7613  Elf_Internal_Rela * rela;
7614  Elf_Internal_Rela * rp;
7615  unsigned char * table;
7616  unsigned char * tp;
7617  Elf_Internal_Sym * sym;
7618  const char * relname;
7619
7620  /* First, find the starting address of the segment that includes
7621     this section.  */
7622
7623  if (elf_header.e_phnum)
7624    {
7625      if (! get_program_headers (file))
7626	return 0;
7627
7628      for (seg = program_headers;
7629	   seg < program_headers + elf_header.e_phnum;
7630	   ++seg)
7631	{
7632	  if (seg->p_type != PT_LOAD)
7633	    continue;
7634
7635	  if (sec->sh_addr >= seg->p_vaddr
7636	      && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7637	    {
7638	      aux->seg_base = seg->p_vaddr;
7639	      break;
7640	    }
7641	}
7642    }
7643
7644  /* Second, build the unwind table from the contents of the unwind
7645     section.  */
7646  size = sec->sh_size;
7647  table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7648                                      _("unwind table"));
7649  if (!table)
7650    return 0;
7651
7652  unw_ent_size = 16;
7653  nentries = size / unw_ent_size;
7654  size = unw_ent_size * nentries;
7655
7656  tep = aux->table = (struct hppa_unw_table_entry *)
7657      xcmalloc (nentries, sizeof (aux->table[0]));
7658
7659  for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
7660    {
7661      unsigned int tmp1, tmp2;
7662
7663      tep->start.section = SHN_UNDEF;
7664      tep->end.section   = SHN_UNDEF;
7665
7666      tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
7667      tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
7668      tmp1 = byte_get ((unsigned char *) tp + 8, 4);
7669      tmp2 = byte_get ((unsigned char *) tp + 12, 4);
7670
7671      tep->start.offset += aux->seg_base;
7672      tep->end.offset   += aux->seg_base;
7673
7674      tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
7675      tep->Millicode = (tmp1 >> 30) & 0x1;
7676      tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
7677      tep->Region_description = (tmp1 >> 27) & 0x3;
7678      tep->reserved1 = (tmp1 >> 26) & 0x1;
7679      tep->Entry_SR = (tmp1 >> 25) & 0x1;
7680      tep->Entry_FR = (tmp1 >> 21) & 0xf;
7681      tep->Entry_GR = (tmp1 >> 16) & 0x1f;
7682      tep->Args_stored = (tmp1 >> 15) & 0x1;
7683      tep->Variable_Frame = (tmp1 >> 14) & 0x1;
7684      tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
7685      tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
7686      tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
7687      tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
7688      tep->Ada_Region = (tmp1 >> 9) & 0x1;
7689      tep->cxx_info = (tmp1 >> 8) & 0x1;
7690      tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
7691      tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
7692      tep->reserved2 = (tmp1 >> 5) & 0x1;
7693      tep->Save_SP = (tmp1 >> 4) & 0x1;
7694      tep->Save_RP = (tmp1 >> 3) & 0x1;
7695      tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
7696      tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
7697      tep->Cleanup_defined = tmp1 & 0x1;
7698
7699      tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
7700      tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
7701      tep->Large_frame = (tmp2 >> 29) & 0x1;
7702      tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
7703      tep->reserved4 = (tmp2 >> 27) & 0x1;
7704      tep->Total_frame_size = tmp2 & 0x7ffffff;
7705    }
7706  free (table);
7707
7708  /* Third, apply any relocations to the unwind table.  */
7709  for (relsec = section_headers;
7710       relsec < section_headers + elf_header.e_shnum;
7711       ++relsec)
7712    {
7713      if (relsec->sh_type != SHT_RELA
7714	  || relsec->sh_info >= elf_header.e_shnum
7715	  || section_headers + relsec->sh_info != sec)
7716	continue;
7717
7718      if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7719			      & rela, & nrelas))
7720	return 0;
7721
7722      for (rp = rela; rp < rela + nrelas; ++rp)
7723	{
7724	  relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
7725	  sym = aux->symtab + get_reloc_symindex (rp->r_info);
7726
7727	  /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64.  */
7728	  if (! const_strneq (relname, "R_PARISC_SEGREL"))
7729	    {
7730	      warn (_("Skipping unexpected relocation type %s\n"), relname);
7731	      continue;
7732	    }
7733
7734	  i = rp->r_offset / unw_ent_size;
7735
7736	  switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
7737	    {
7738	    case 0:
7739	      aux->table[i].start.section = sym->st_shndx;
7740	      aux->table[i].start.offset  = sym->st_value + rp->r_addend;
7741	      break;
7742	    case 1:
7743	      aux->table[i].end.section   = sym->st_shndx;
7744	      aux->table[i].end.offset    = sym->st_value + rp->r_addend;
7745	      break;
7746	    default:
7747	      break;
7748	    }
7749	}
7750
7751      free (rela);
7752    }
7753
7754  aux->table_len = nentries;
7755
7756  return 1;
7757}
7758
7759static void
7760hppa_process_unwind (FILE * file)
7761{
7762  struct hppa_unw_aux_info aux;
7763  Elf_Internal_Shdr * unwsec = NULL;
7764  Elf_Internal_Shdr * strsec;
7765  Elf_Internal_Shdr * sec;
7766  unsigned long i;
7767
7768  if (string_table == NULL)
7769    return;
7770
7771  memset (& aux, 0, sizeof (aux));
7772
7773  for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7774    {
7775      if (sec->sh_type == SHT_SYMTAB
7776	  && sec->sh_link < elf_header.e_shnum)
7777	{
7778	  aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7779
7780	  strsec = section_headers + sec->sh_link;
7781	  if (aux.strtab != NULL)
7782	    {
7783	      error (_("Multiple auxillary string tables encountered\n"));
7784	      free (aux.strtab);
7785	    }
7786	  aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7787                                          1, strsec->sh_size,
7788                                          _("string table"));
7789	  aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7790	}
7791      else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7792	unwsec = sec;
7793    }
7794
7795  if (!unwsec)
7796    printf (_("\nThere are no unwind sections in this file.\n"));
7797
7798  for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7799    {
7800      if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7801	{
7802	  printf (_("\nUnwind section '%s' at offset 0x%lx contains %lu entries:\n"),
7803		  printable_section_name (sec),
7804		  (unsigned long) sec->sh_offset,
7805		  (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
7806
7807          slurp_hppa_unwind_table (file, &aux, sec);
7808	  if (aux.table_len > 0)
7809	    dump_hppa_unwind (&aux);
7810
7811	  if (aux.table)
7812	    free ((char *) aux.table);
7813	  aux.table = NULL;
7814	}
7815    }
7816
7817  if (aux.symtab)
7818    free (aux.symtab);
7819  if (aux.strtab)
7820    free ((char *) aux.strtab);
7821}
7822
7823struct arm_section
7824{
7825  unsigned char *      data;		/* The unwind data.  */
7826  Elf_Internal_Shdr *  sec;		/* The cached unwind section header.  */
7827  Elf_Internal_Rela *  rela;		/* The cached relocations for this section.  */
7828  unsigned long        nrelas;		/* The number of relocations.  */
7829  unsigned int         rel_type;	/* REL or RELA ?  */
7830  Elf_Internal_Rela *  next_rela;	/* Cyclic pointer to the next reloc to process.  */
7831};
7832
7833struct arm_unw_aux_info
7834{
7835  FILE *              file;		/* The file containing the unwind sections.  */
7836  Elf_Internal_Sym *  symtab;		/* The file's symbol table.  */
7837  unsigned long       nsyms;		/* Number of symbols.  */
7838  Elf_Internal_Sym *  funtab;		/* Sorted table of STT_FUNC symbols.  */
7839  unsigned long       nfuns;		/* Number of these symbols.  */
7840  char *              strtab;		/* The file's string table.  */
7841  unsigned long       strtab_size;	/* Size of string table.  */
7842};
7843
7844static const char *
7845arm_print_vma_and_name (struct arm_unw_aux_info *aux,
7846			bfd_vma fn, struct absaddr addr)
7847{
7848  const char *procname;
7849  bfd_vma sym_offset;
7850
7851  if (addr.section == SHN_UNDEF)
7852    addr.offset = fn;
7853
7854  find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7855			   aux->strtab_size, addr, &procname,
7856			   &sym_offset);
7857
7858  print_vma (fn, PREFIX_HEX);
7859
7860  if (procname)
7861    {
7862      fputs (" <", stdout);
7863      fputs (procname, stdout);
7864
7865      if (sym_offset)
7866	printf ("+0x%lx", (unsigned long) sym_offset);
7867      fputc ('>', stdout);
7868    }
7869
7870  return procname;
7871}
7872
7873static void
7874arm_free_section (struct arm_section *arm_sec)
7875{
7876  if (arm_sec->data != NULL)
7877    free (arm_sec->data);
7878
7879  if (arm_sec->rela != NULL)
7880    free (arm_sec->rela);
7881}
7882
7883/* 1) If SEC does not match the one cached in ARM_SEC, then free the current
7884      cached section and install SEC instead.
7885   2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
7886      and return its valued in * WORDP, relocating if necessary.
7887   3) Update the NEXT_RELA field in ARM_SEC and store the section index and
7888      relocation's offset in ADDR.
7889   4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
7890      into the string table of the symbol associated with the reloc.  If no
7891      reloc was applied store -1 there.
7892   5) Return TRUE upon success, FALSE otherwise.  */
7893
7894static bfd_boolean
7895get_unwind_section_word (struct arm_unw_aux_info *  aux,
7896			 struct arm_section *       arm_sec,
7897			 Elf_Internal_Shdr *        sec,
7898			 bfd_vma 		    word_offset,
7899			 unsigned int *             wordp,
7900			 struct absaddr *           addr,
7901			 bfd_vma *		    sym_name)
7902{
7903  Elf_Internal_Rela *rp;
7904  Elf_Internal_Sym *sym;
7905  const char * relname;
7906  unsigned int word;
7907  bfd_boolean wrapped;
7908
7909  if (sec == NULL || arm_sec == NULL)
7910    return FALSE;
7911
7912  addr->section = SHN_UNDEF;
7913  addr->offset = 0;
7914
7915  if (sym_name != NULL)
7916    *sym_name = (bfd_vma) -1;
7917
7918  /* If necessary, update the section cache.  */
7919  if (sec != arm_sec->sec)
7920    {
7921      Elf_Internal_Shdr *relsec;
7922
7923      arm_free_section (arm_sec);
7924
7925      arm_sec->sec = sec;
7926      arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
7927				sec->sh_size, _("unwind data"));
7928      arm_sec->rela = NULL;
7929      arm_sec->nrelas = 0;
7930
7931      for (relsec = section_headers;
7932	   relsec < section_headers + elf_header.e_shnum;
7933	   ++relsec)
7934	{
7935	  if (relsec->sh_info >= elf_header.e_shnum
7936	      || section_headers + relsec->sh_info != sec
7937	      /* PR 15745: Check the section type as well.  */
7938	      || (relsec->sh_type != SHT_REL
7939		  && relsec->sh_type != SHT_RELA))
7940	    continue;
7941
7942	  arm_sec->rel_type = relsec->sh_type;
7943	  if (relsec->sh_type == SHT_REL)
7944	    {
7945	      if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
7946				     relsec->sh_size,
7947				     & arm_sec->rela, & arm_sec->nrelas))
7948		return FALSE;
7949	    }
7950	  else /* relsec->sh_type == SHT_RELA */
7951	    {
7952	      if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
7953				      relsec->sh_size,
7954				      & arm_sec->rela, & arm_sec->nrelas))
7955		return FALSE;
7956	    }
7957	  break;
7958	}
7959
7960      arm_sec->next_rela = arm_sec->rela;
7961    }
7962
7963  /* If there is no unwind data we can do nothing.  */
7964  if (arm_sec->data == NULL)
7965    return FALSE;
7966
7967  /* If the offset is invalid then fail.  */
7968  if (word_offset > (sec->sh_size - 4)
7969      /* PR 18879 */
7970      || (sec->sh_size < 5 && word_offset >= sec->sh_size)
7971      || ((bfd_signed_vma) word_offset) < 0)
7972    return FALSE;
7973
7974  /* Get the word at the required offset.  */
7975  word = byte_get (arm_sec->data + word_offset, 4);
7976
7977  /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128.  */
7978  if (arm_sec->rela == NULL)
7979    {
7980      * wordp = word;
7981      return TRUE;
7982    }
7983
7984  /* Look through the relocs to find the one that applies to the provided offset.  */
7985  wrapped = FALSE;
7986  for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
7987    {
7988      bfd_vma prelval, offset;
7989
7990      if (rp->r_offset > word_offset && !wrapped)
7991	{
7992	  rp = arm_sec->rela;
7993	  wrapped = TRUE;
7994	}
7995      if (rp->r_offset > word_offset)
7996	break;
7997
7998      if (rp->r_offset & 3)
7999	{
8000	  warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
8001		(unsigned long) rp->r_offset);
8002	  continue;
8003	}
8004
8005      if (rp->r_offset < word_offset)
8006	continue;
8007
8008      /* PR 17531: file: 027-161405-0.004  */
8009      if (aux->symtab == NULL)
8010	continue;
8011
8012      if (arm_sec->rel_type == SHT_REL)
8013	{
8014	  offset = word & 0x7fffffff;
8015	  if (offset & 0x40000000)
8016	    offset |= ~ (bfd_vma) 0x7fffffff;
8017	}
8018      else if (arm_sec->rel_type == SHT_RELA)
8019	offset = rp->r_addend;
8020      else
8021	{
8022	  error (_("Unknown section relocation type %d encountered\n"),
8023		 arm_sec->rel_type);
8024	  break;
8025	}
8026
8027      /* PR 17531 file: 027-1241568-0.004.  */
8028      if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
8029	{
8030	  error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
8031		 (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
8032	  break;
8033	}
8034
8035      sym = aux->symtab + ELF32_R_SYM (rp->r_info);
8036      offset += sym->st_value;
8037      prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
8038
8039      /* Check that we are processing the expected reloc type.  */
8040      if (elf_header.e_machine == EM_ARM)
8041	{
8042	  relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
8043	  if (relname == NULL)
8044	    {
8045	      warn (_("Skipping unknown ARM relocation type: %d\n"),
8046		    (int) ELF32_R_TYPE (rp->r_info));
8047	      continue;
8048	    }
8049
8050	  if (streq (relname, "R_ARM_NONE"))
8051	      continue;
8052
8053	  if (! streq (relname, "R_ARM_PREL31"))
8054	    {
8055	      warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
8056	      continue;
8057	    }
8058	}
8059      else if (elf_header.e_machine == EM_TI_C6000)
8060	{
8061	  relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
8062	  if (relname == NULL)
8063	    {
8064	      warn (_("Skipping unknown C6000 relocation type: %d\n"),
8065		    (int) ELF32_R_TYPE (rp->r_info));
8066	      continue;
8067	    }
8068
8069	  if (streq (relname, "R_C6000_NONE"))
8070	    continue;
8071
8072	  if (! streq (relname, "R_C6000_PREL31"))
8073	    {
8074	      warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
8075	      continue;
8076	    }
8077
8078	  prelval >>= 1;
8079	}
8080      else
8081	{
8082	  /* This function currently only supports ARM and TI unwinders.  */
8083	  warn (_("Only TI and ARM unwinders are currently supported\n"));
8084	  break;
8085	}
8086
8087      word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
8088      addr->section = sym->st_shndx;
8089      addr->offset = offset;
8090
8091      if (sym_name)
8092	* sym_name = sym->st_name;
8093      break;
8094    }
8095
8096  *wordp = word;
8097  arm_sec->next_rela = rp;
8098
8099  return TRUE;
8100}
8101
8102static const char *tic6x_unwind_regnames[16] =
8103{
8104  "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
8105  "A14", "A13", "A12", "A11", "A10",
8106  "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
8107};
8108
8109static void
8110decode_tic6x_unwind_regmask (unsigned int mask)
8111{
8112  int i;
8113
8114  for (i = 12; mask; mask >>= 1, i--)
8115    {
8116      if (mask & 1)
8117	{
8118	  fputs (tic6x_unwind_regnames[i], stdout);
8119	  if (mask > 1)
8120	    fputs (", ", stdout);
8121	}
8122    }
8123}
8124
8125#define ADVANCE							\
8126  if (remaining == 0 && more_words)				\
8127    {								\
8128      data_offset += 4;						\
8129      if (! get_unwind_section_word (aux, data_arm_sec, data_sec,	\
8130				     data_offset, & word, & addr, NULL))	\
8131	return;							\
8132      remaining = 4;						\
8133      more_words--;						\
8134    }								\
8135
8136#define GET_OP(OP)			\
8137  ADVANCE;				\
8138  if (remaining)			\
8139    {					\
8140      remaining--;			\
8141      (OP) = word >> 24;		\
8142      word <<= 8;			\
8143    }					\
8144  else					\
8145    {					\
8146      printf (_("[Truncated opcode]\n"));	\
8147      return;				\
8148    }					\
8149  printf ("0x%02x ", OP)
8150
8151static void
8152decode_arm_unwind_bytecode (struct arm_unw_aux_info *  aux,
8153			    unsigned int               word,
8154			    unsigned int               remaining,
8155			    unsigned int               more_words,
8156			    bfd_vma                    data_offset,
8157			    Elf_Internal_Shdr *        data_sec,
8158			    struct arm_section *       data_arm_sec)
8159{
8160  struct absaddr addr;
8161
8162  /* Decode the unwinding instructions.  */
8163  while (1)
8164    {
8165      unsigned int op, op2;
8166
8167      ADVANCE;
8168      if (remaining == 0)
8169	break;
8170      remaining--;
8171      op = word >> 24;
8172      word <<= 8;
8173
8174      printf ("  0x%02x ", op);
8175
8176      if ((op & 0xc0) == 0x00)
8177	{
8178	  int offset = ((op & 0x3f) << 2) + 4;
8179
8180	  printf ("     vsp = vsp + %d", offset);
8181	}
8182      else if ((op & 0xc0) == 0x40)
8183	{
8184	  int offset = ((op & 0x3f) << 2) + 4;
8185
8186	  printf ("     vsp = vsp - %d", offset);
8187	}
8188      else if ((op & 0xf0) == 0x80)
8189	{
8190	  GET_OP (op2);
8191	  if (op == 0x80 && op2 == 0)
8192	    printf (_("Refuse to unwind"));
8193	  else
8194	    {
8195	      unsigned int mask = ((op & 0x0f) << 8) | op2;
8196	      int first = 1;
8197	      int i;
8198
8199	      printf ("pop {");
8200	      for (i = 0; i < 12; i++)
8201		if (mask & (1 << i))
8202		  {
8203		    if (first)
8204		      first = 0;
8205		    else
8206		      printf (", ");
8207		    printf ("r%d", 4 + i);
8208		  }
8209	      printf ("}");
8210	    }
8211	}
8212      else if ((op & 0xf0) == 0x90)
8213	{
8214	  if (op == 0x9d || op == 0x9f)
8215	    printf (_("     [Reserved]"));
8216	  else
8217	    printf ("     vsp = r%d", op & 0x0f);
8218	}
8219      else if ((op & 0xf0) == 0xa0)
8220	{
8221	  int end = 4 + (op & 0x07);
8222	  int first = 1;
8223	  int i;
8224
8225	  printf ("     pop {");
8226	  for (i = 4; i <= end; i++)
8227	    {
8228	      if (first)
8229		first = 0;
8230	      else
8231		printf (", ");
8232	      printf ("r%d", i);
8233	    }
8234	  if (op & 0x08)
8235	    {
8236	      if (!first)
8237		printf (", ");
8238	      printf ("r14");
8239	    }
8240	  printf ("}");
8241	}
8242      else if (op == 0xb0)
8243	printf (_("     finish"));
8244      else if (op == 0xb1)
8245	{
8246	  GET_OP (op2);
8247	  if (op2 == 0 || (op2 & 0xf0) != 0)
8248	    printf (_("[Spare]"));
8249	  else
8250	    {
8251	      unsigned int mask = op2 & 0x0f;
8252	      int first = 1;
8253	      int i;
8254
8255	      printf ("pop {");
8256	      for (i = 0; i < 12; i++)
8257		if (mask & (1 << i))
8258		  {
8259		    if (first)
8260		      first = 0;
8261		    else
8262		      printf (", ");
8263		    printf ("r%d", i);
8264		  }
8265	      printf ("}");
8266	    }
8267	}
8268      else if (op == 0xb2)
8269	{
8270	  unsigned char buf[9];
8271	  unsigned int i, len;
8272	  unsigned long offset;
8273
8274	  for (i = 0; i < sizeof (buf); i++)
8275	    {
8276	      GET_OP (buf[i]);
8277	      if ((buf[i] & 0x80) == 0)
8278		break;
8279	    }
8280	  if (i == sizeof (buf))
8281	    printf (_("corrupt change to vsp"));
8282	  else
8283	    {
8284	      offset = read_uleb128 (buf, &len, buf + i + 1);
8285	      assert (len == i + 1);
8286	      offset = offset * 4 + 0x204;
8287	      printf ("vsp = vsp + %ld", offset);
8288	    }
8289	}
8290      else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
8291	{
8292	  unsigned int first, last;
8293
8294	  GET_OP (op2);
8295	  first = op2 >> 4;
8296	  last = op2 & 0x0f;
8297	  if (op == 0xc8)
8298	    first = first + 16;
8299	  printf ("pop {D%d", first);
8300	  if (last)
8301	    printf ("-D%d", first + last);
8302	  printf ("}");
8303	}
8304      else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
8305	{
8306	  unsigned int count = op & 0x07;
8307
8308	  printf ("pop {D8");
8309	  if (count)
8310	    printf ("-D%d", 8 + count);
8311	  printf ("}");
8312	}
8313      else if (op >= 0xc0 && op <= 0xc5)
8314	{
8315	  unsigned int count = op & 0x07;
8316
8317	  printf ("     pop {wR10");
8318	  if (count)
8319	    printf ("-wR%d", 10 + count);
8320	  printf ("}");
8321	}
8322      else if (op == 0xc6)
8323	{
8324	  unsigned int first, last;
8325
8326	  GET_OP (op2);
8327	  first = op2 >> 4;
8328	  last = op2 & 0x0f;
8329	  printf ("pop {wR%d", first);
8330	  if (last)
8331	    printf ("-wR%d", first + last);
8332	  printf ("}");
8333	}
8334      else if (op == 0xc7)
8335	{
8336	  GET_OP (op2);
8337	  if (op2 == 0 || (op2 & 0xf0) != 0)
8338	    printf (_("[Spare]"));
8339	  else
8340	    {
8341	      unsigned int mask = op2 & 0x0f;
8342	      int first = 1;
8343	      int i;
8344
8345	      printf ("pop {");
8346	      for (i = 0; i < 4; i++)
8347		if (mask & (1 << i))
8348		  {
8349		    if (first)
8350		      first = 0;
8351		    else
8352		      printf (", ");
8353		    printf ("wCGR%d", i);
8354		  }
8355	      printf ("}");
8356	    }
8357	}
8358      else
8359	printf (_("     [unsupported opcode]"));
8360      printf ("\n");
8361    }
8362}
8363
8364static void
8365decode_tic6x_unwind_bytecode (struct arm_unw_aux_info *  aux,
8366			      unsigned int               word,
8367			      unsigned int               remaining,
8368			      unsigned int               more_words,
8369			      bfd_vma                    data_offset,
8370			      Elf_Internal_Shdr *        data_sec,
8371			      struct arm_section *       data_arm_sec)
8372{
8373  struct absaddr addr;
8374
8375  /* Decode the unwinding instructions.  */
8376  while (1)
8377    {
8378      unsigned int op, op2;
8379
8380      ADVANCE;
8381      if (remaining == 0)
8382	break;
8383      remaining--;
8384      op = word >> 24;
8385      word <<= 8;
8386
8387      printf ("  0x%02x ", op);
8388
8389      if ((op & 0xc0) == 0x00)
8390	{
8391	  int offset = ((op & 0x3f) << 3) + 8;
8392	  printf ("     sp = sp + %d", offset);
8393	}
8394      else if ((op & 0xc0) == 0x80)
8395	{
8396	  GET_OP (op2);
8397	  if (op == 0x80 && op2 == 0)
8398	    printf (_("Refuse to unwind"));
8399	  else
8400	    {
8401	      unsigned int mask = ((op & 0x1f) << 8) | op2;
8402	      if (op & 0x20)
8403		printf ("pop compact {");
8404	      else
8405		printf ("pop {");
8406
8407	      decode_tic6x_unwind_regmask (mask);
8408	      printf("}");
8409	    }
8410	}
8411      else if ((op & 0xf0) == 0xc0)
8412	{
8413	  unsigned int reg;
8414	  unsigned int nregs;
8415	  unsigned int i;
8416	  const char *name;
8417	  struct
8418	  {
8419	      unsigned int offset;
8420	      unsigned int reg;
8421	  } regpos[16];
8422
8423	  /* Scan entire instruction first so that GET_OP output is not
8424	     interleaved with disassembly.  */
8425	  nregs = 0;
8426	  for (i = 0; nregs < (op & 0xf); i++)
8427	    {
8428	      GET_OP (op2);
8429	      reg = op2 >> 4;
8430	      if (reg != 0xf)
8431		{
8432		  regpos[nregs].offset = i * 2;
8433		  regpos[nregs].reg = reg;
8434		  nregs++;
8435		}
8436
8437	      reg = op2 & 0xf;
8438	      if (reg != 0xf)
8439		{
8440		  regpos[nregs].offset = i * 2 + 1;
8441		  regpos[nregs].reg = reg;
8442		  nregs++;
8443		}
8444	    }
8445
8446	  printf (_("pop frame {"));
8447	  reg = nregs - 1;
8448	  for (i = i * 2; i > 0; i--)
8449	    {
8450	      if (regpos[reg].offset == i - 1)
8451		{
8452		  name = tic6x_unwind_regnames[regpos[reg].reg];
8453		  if (reg > 0)
8454		    reg--;
8455		}
8456	      else
8457		name = _("[pad]");
8458
8459	      fputs (name, stdout);
8460	      if (i > 1)
8461		printf (", ");
8462	    }
8463
8464	  printf ("}");
8465	}
8466      else if (op == 0xd0)
8467	printf ("     MOV FP, SP");
8468      else if (op == 0xd1)
8469	printf ("     __c6xabi_pop_rts");
8470      else if (op == 0xd2)
8471	{
8472	  unsigned char buf[9];
8473	  unsigned int i, len;
8474	  unsigned long offset;
8475
8476	  for (i = 0; i < sizeof (buf); i++)
8477	    {
8478	      GET_OP (buf[i]);
8479	      if ((buf[i] & 0x80) == 0)
8480		break;
8481	    }
8482	  /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2.  */
8483	  if (i == sizeof (buf))
8484	    {
8485	      printf ("<corrupt sp adjust>\n");
8486	      warn (_("Corrupt stack pointer adjustment detected\n"));
8487	      return;
8488	    }
8489
8490	  offset = read_uleb128 (buf, &len, buf + i + 1);
8491	  assert (len == i + 1);
8492	  offset = offset * 8 + 0x408;
8493	  printf (_("sp = sp + %ld"), offset);
8494	}
8495      else if ((op & 0xf0) == 0xe0)
8496	{
8497	  if ((op & 0x0f) == 7)
8498	    printf ("     RETURN");
8499	  else
8500	    printf ("     MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
8501	}
8502      else
8503	{
8504	  printf (_("     [unsupported opcode]"));
8505	}
8506      putchar ('\n');
8507    }
8508}
8509
8510static bfd_vma
8511arm_expand_prel31 (bfd_vma word, bfd_vma where)
8512{
8513  bfd_vma offset;
8514
8515  offset = word & 0x7fffffff;
8516  if (offset & 0x40000000)
8517    offset |= ~ (bfd_vma) 0x7fffffff;
8518
8519  if (elf_header.e_machine == EM_TI_C6000)
8520    offset <<= 1;
8521
8522  return offset + where;
8523}
8524
8525static void
8526decode_arm_unwind (struct arm_unw_aux_info *  aux,
8527		   unsigned int               word,
8528		   unsigned int               remaining,
8529		   bfd_vma                    data_offset,
8530		   Elf_Internal_Shdr *        data_sec,
8531		   struct arm_section *       data_arm_sec)
8532{
8533  int per_index;
8534  unsigned int more_words = 0;
8535  struct absaddr addr;
8536  bfd_vma sym_name = (bfd_vma) -1;
8537
8538  if (remaining == 0)
8539    {
8540      /* Fetch the first word.
8541	 Note - when decoding an object file the address extracted
8542	 here will always be 0.  So we also pass in the sym_name
8543	 parameter so that we can find the symbol associated with
8544	 the personality routine.  */
8545      if (! get_unwind_section_word (aux, data_arm_sec, data_sec, data_offset,
8546				     & word, & addr, & sym_name))
8547	return;
8548
8549      remaining = 4;
8550    }
8551
8552  if ((word & 0x80000000) == 0)
8553    {
8554      /* Expand prel31 for personality routine.  */
8555      bfd_vma fn;
8556      const char *procname;
8557
8558      fn = arm_expand_prel31 (word, data_sec->sh_addr + data_offset);
8559      printf (_("  Personality routine: "));
8560      if (fn == 0
8561	  && addr.section == SHN_UNDEF && addr.offset == 0
8562	  && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
8563	{
8564	  procname = aux->strtab + sym_name;
8565	  print_vma (fn, PREFIX_HEX);
8566	  if (procname)
8567	    {
8568	      fputs (" <", stdout);
8569	      fputs (procname, stdout);
8570	      fputc ('>', stdout);
8571	    }
8572	}
8573      else
8574	procname = arm_print_vma_and_name (aux, fn, addr);
8575      fputc ('\n', stdout);
8576
8577      /* The GCC personality routines use the standard compact
8578	 encoding, starting with one byte giving the number of
8579	 words.  */
8580      if (procname != NULL
8581	  && (const_strneq (procname, "__gcc_personality_v0")
8582	      || const_strneq (procname, "__gxx_personality_v0")
8583	      || const_strneq (procname, "__gcj_personality_v0")
8584	      || const_strneq (procname, "__gnu_objc_personality_v0")))
8585	{
8586	  remaining = 0;
8587	  more_words = 1;
8588	  ADVANCE;
8589	  if (!remaining)
8590	    {
8591	      printf (_("  [Truncated data]\n"));
8592	      return;
8593	    }
8594	  more_words = word >> 24;
8595	  word <<= 8;
8596	  remaining--;
8597	  per_index = -1;
8598	}
8599      else
8600	return;
8601    }
8602  else
8603    {
8604      /* ARM EHABI Section 6.3:
8605
8606	 An exception-handling table entry for the compact model looks like:
8607
8608           31 30-28 27-24 23-0
8609	   -- ----- ----- ----
8610            1   0   index Data for personalityRoutine[index]    */
8611
8612      if (elf_header.e_machine == EM_ARM
8613	  && (word & 0x70000000))
8614	warn (_("Corrupt ARM compact model table entry: %x \n"), word);
8615
8616      per_index = (word >> 24) & 0x7f;
8617      printf (_("  Compact model index: %d\n"), per_index);
8618      if (per_index == 0)
8619	{
8620	  more_words = 0;
8621	  word <<= 8;
8622	  remaining--;
8623	}
8624      else if (per_index < 3)
8625	{
8626	  more_words = (word >> 16) & 0xff;
8627	  word <<= 16;
8628	  remaining -= 2;
8629	}
8630    }
8631
8632  switch (elf_header.e_machine)
8633    {
8634    case EM_ARM:
8635      if (per_index < 3)
8636	{
8637	  decode_arm_unwind_bytecode (aux, word, remaining, more_words,
8638				      data_offset, data_sec, data_arm_sec);
8639	}
8640      else
8641	{
8642	  warn (_("Unknown ARM compact model index encountered\n"));
8643	  printf (_("  [reserved]\n"));
8644	}
8645      break;
8646
8647    case EM_TI_C6000:
8648      if (per_index < 3)
8649	{
8650	  decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
8651					data_offset, data_sec, data_arm_sec);
8652	}
8653      else if (per_index < 5)
8654	{
8655	  if (((word >> 17) & 0x7f) == 0x7f)
8656	    printf (_("  Restore stack from frame pointer\n"));
8657	  else
8658	    printf (_("  Stack increment %d\n"), (word >> 14) & 0x1fc);
8659	  printf (_("  Registers restored: "));
8660	  if (per_index == 4)
8661	    printf (" (compact) ");
8662	  decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
8663	  putchar ('\n');
8664	  printf (_("  Return register: %s\n"),
8665		  tic6x_unwind_regnames[word & 0xf]);
8666	}
8667      else
8668	printf (_("  [reserved (%d)]\n"), per_index);
8669      break;
8670
8671    default:
8672      error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
8673	     elf_header.e_machine);
8674    }
8675
8676  /* Decode the descriptors.  Not implemented.  */
8677}
8678
8679static void
8680dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
8681{
8682  struct arm_section exidx_arm_sec, extab_arm_sec;
8683  unsigned int i, exidx_len;
8684  unsigned long j, nfuns;
8685
8686  memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
8687  memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
8688  exidx_len = exidx_sec->sh_size / 8;
8689
8690  aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
8691  for (nfuns = 0, j = 0; j < aux->nsyms; j++)
8692    if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
8693      aux->funtab[nfuns++] = aux->symtab[j];
8694  aux->nfuns = nfuns;
8695  qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
8696
8697  for (i = 0; i < exidx_len; i++)
8698    {
8699      unsigned int exidx_fn, exidx_entry;
8700      struct absaddr fn_addr, entry_addr;
8701      bfd_vma fn;
8702
8703      fputc ('\n', stdout);
8704
8705      if (! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8706				     8 * i, & exidx_fn, & fn_addr, NULL)
8707	  || ! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8708					8 * i + 4, & exidx_entry, & entry_addr, NULL))
8709	{
8710	  free (aux->funtab);
8711	  arm_free_section (& exidx_arm_sec);
8712	  arm_free_section (& extab_arm_sec);
8713	  return;
8714	}
8715
8716      /* ARM EHABI, Section 5:
8717	 An index table entry consists of 2 words.
8718         The first word contains a prel31 offset to the start of a function, with bit 31 clear.  */
8719      if (exidx_fn & 0x80000000)
8720	warn (_("corrupt index table entry: %x\n"), exidx_fn);
8721
8722      fn = arm_expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
8723
8724      arm_print_vma_and_name (aux, fn, fn_addr);
8725      fputs (": ", stdout);
8726
8727      if (exidx_entry == 1)
8728	{
8729	  print_vma (exidx_entry, PREFIX_HEX);
8730	  fputs (" [cantunwind]\n", stdout);
8731	}
8732      else if (exidx_entry & 0x80000000)
8733	{
8734	  print_vma (exidx_entry, PREFIX_HEX);
8735	  fputc ('\n', stdout);
8736	  decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
8737	}
8738      else
8739	{
8740	  bfd_vma table, table_offset = 0;
8741	  Elf_Internal_Shdr *table_sec;
8742
8743	  fputs ("@", stdout);
8744	  table = arm_expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
8745	  print_vma (table, PREFIX_HEX);
8746	  printf ("\n");
8747
8748	  /* Locate the matching .ARM.extab.  */
8749	  if (entry_addr.section != SHN_UNDEF
8750	      && entry_addr.section < elf_header.e_shnum)
8751	    {
8752	      table_sec = section_headers + entry_addr.section;
8753	      table_offset = entry_addr.offset;
8754	      /* PR 18879 */
8755	      if (table_offset > table_sec->sh_size
8756		  || ((bfd_signed_vma) table_offset) < 0)
8757		{
8758		  warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
8759			(unsigned long) table_offset,
8760			printable_section_name (table_sec));
8761		  continue;
8762		}
8763	    }
8764	  else
8765	    {
8766	      table_sec = find_section_by_address (table);
8767	      if (table_sec != NULL)
8768		table_offset = table - table_sec->sh_addr;
8769	    }
8770	  if (table_sec == NULL)
8771	    {
8772	      warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
8773		    (unsigned long) table);
8774	      continue;
8775	    }
8776	  decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
8777			     &extab_arm_sec);
8778	}
8779    }
8780
8781  printf ("\n");
8782
8783  free (aux->funtab);
8784  arm_free_section (&exidx_arm_sec);
8785  arm_free_section (&extab_arm_sec);
8786}
8787
8788/* Used for both ARM and C6X unwinding tables.  */
8789
8790static void
8791arm_process_unwind (FILE *file)
8792{
8793  struct arm_unw_aux_info aux;
8794  Elf_Internal_Shdr *unwsec = NULL;
8795  Elf_Internal_Shdr *strsec;
8796  Elf_Internal_Shdr *sec;
8797  unsigned long i;
8798  unsigned int sec_type;
8799
8800  switch (elf_header.e_machine)
8801    {
8802    case EM_ARM:
8803      sec_type = SHT_ARM_EXIDX;
8804      break;
8805
8806    case EM_TI_C6000:
8807      sec_type = SHT_C6000_UNWIND;
8808      break;
8809
8810    default:
8811      error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
8812	     elf_header.e_machine);
8813      return;
8814    }
8815
8816  if (string_table == NULL)
8817    return;
8818
8819  memset (& aux, 0, sizeof (aux));
8820  aux.file = file;
8821
8822  for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8823    {
8824      if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
8825	{
8826	  aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
8827
8828	  strsec = section_headers + sec->sh_link;
8829
8830	  /* PR binutils/17531 file: 011-12666-0.004.  */
8831	  if (aux.strtab != NULL)
8832	    {
8833	      error (_("Multiple string tables found in file.\n"));
8834	      free (aux.strtab);
8835	    }
8836	  aux.strtab = get_data (NULL, file, strsec->sh_offset,
8837				 1, strsec->sh_size, _("string table"));
8838	  aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8839	}
8840      else if (sec->sh_type == sec_type)
8841	unwsec = sec;
8842    }
8843
8844  if (unwsec == NULL)
8845    printf (_("\nThere are no unwind sections in this file.\n"));
8846  else
8847    for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8848      {
8849	if (sec->sh_type == sec_type)
8850	  {
8851	    printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
8852		    printable_section_name (sec),
8853		    (unsigned long) sec->sh_offset,
8854		    (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
8855
8856	    dump_arm_unwind (&aux, sec);
8857	  }
8858      }
8859
8860  if (aux.symtab)
8861    free (aux.symtab);
8862  if (aux.strtab)
8863    free ((char *) aux.strtab);
8864}
8865
8866static void
8867process_unwind (FILE * file)
8868{
8869  struct unwind_handler
8870  {
8871    int machtype;
8872    void (* handler)(FILE *);
8873  } handlers[] =
8874  {
8875    { EM_ARM, arm_process_unwind },
8876    { EM_IA_64, ia64_process_unwind },
8877    { EM_PARISC, hppa_process_unwind },
8878    { EM_TI_C6000, arm_process_unwind },
8879    { 0, 0 }
8880  };
8881  int i;
8882
8883  if (!do_unwind)
8884    return;
8885
8886  for (i = 0; handlers[i].handler != NULL; i++)
8887    if (elf_header.e_machine == handlers[i].machtype)
8888      {
8889	handlers[i].handler (file);
8890	return;
8891      }
8892
8893  printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
8894	  get_machine_name (elf_header.e_machine));
8895}
8896
8897static void
8898dynamic_section_mips_val (Elf_Internal_Dyn * entry)
8899{
8900  switch (entry->d_tag)
8901    {
8902    case DT_MIPS_FLAGS:
8903      if (entry->d_un.d_val == 0)
8904	printf (_("NONE"));
8905      else
8906	{
8907	  static const char * opts[] =
8908	  {
8909	    "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
8910	    "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
8911	    "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
8912	    "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
8913	    "RLD_ORDER_SAFE"
8914	  };
8915	  unsigned int cnt;
8916	  int first = 1;
8917
8918	  for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
8919	    if (entry->d_un.d_val & (1 << cnt))
8920	      {
8921		printf ("%s%s", first ? "" : " ", opts[cnt]);
8922		first = 0;
8923	      }
8924	}
8925      break;
8926
8927    case DT_MIPS_IVERSION:
8928      if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8929	printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
8930      else
8931	{
8932	  char buf[40];
8933	  sprintf_vma (buf, entry->d_un.d_ptr);
8934	  /* Note: coded this way so that there is a single string for translation.  */
8935	  printf (_("<corrupt: %s>"), buf);
8936	}
8937      break;
8938
8939    case DT_MIPS_TIME_STAMP:
8940      {
8941	char timebuf[128];
8942	struct tm * tmp;
8943	time_t atime = entry->d_un.d_val;
8944
8945	tmp = gmtime (&atime);
8946	/* PR 17531: file: 6accc532.  */
8947	if (tmp == NULL)
8948	  snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
8949	else
8950	  snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
8951		    tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8952		    tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8953	printf (_("Time Stamp: %s"), timebuf);
8954      }
8955      break;
8956
8957    case DT_MIPS_RLD_VERSION:
8958    case DT_MIPS_LOCAL_GOTNO:
8959    case DT_MIPS_CONFLICTNO:
8960    case DT_MIPS_LIBLISTNO:
8961    case DT_MIPS_SYMTABNO:
8962    case DT_MIPS_UNREFEXTNO:
8963    case DT_MIPS_HIPAGENO:
8964    case DT_MIPS_DELTA_CLASS_NO:
8965    case DT_MIPS_DELTA_INSTANCE_NO:
8966    case DT_MIPS_DELTA_RELOC_NO:
8967    case DT_MIPS_DELTA_SYM_NO:
8968    case DT_MIPS_DELTA_CLASSSYM_NO:
8969    case DT_MIPS_COMPACT_SIZE:
8970      print_vma (entry->d_un.d_val, DEC);
8971      break;
8972
8973    default:
8974      print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8975    }
8976    putchar ('\n');
8977}
8978
8979static void
8980dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
8981{
8982  switch (entry->d_tag)
8983    {
8984    case DT_HP_DLD_FLAGS:
8985      {
8986	static struct
8987	{
8988	  long int bit;
8989	  const char * str;
8990	}
8991	flags[] =
8992	{
8993	  { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
8994	  { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
8995	  { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
8996	  { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
8997	  { DT_HP_BIND_NOW, "HP_BIND_NOW" },
8998	  { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
8999	  { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
9000	  { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
9001	  { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
9002	  { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
9003	  { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
9004	  { DT_HP_GST, "HP_GST" },
9005	  { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
9006	  { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
9007	  { DT_HP_NODELETE, "HP_NODELETE" },
9008	  { DT_HP_GROUP, "HP_GROUP" },
9009	  { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
9010	};
9011	int first = 1;
9012	size_t cnt;
9013	bfd_vma val = entry->d_un.d_val;
9014
9015	for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
9016	  if (val & flags[cnt].bit)
9017	    {
9018	      if (! first)
9019		putchar (' ');
9020	      fputs (flags[cnt].str, stdout);
9021	      first = 0;
9022	      val ^= flags[cnt].bit;
9023	    }
9024
9025	if (val != 0 || first)
9026	  {
9027	    if (! first)
9028	      putchar (' ');
9029	    print_vma (val, HEX);
9030	  }
9031      }
9032      break;
9033
9034    default:
9035      print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9036      break;
9037    }
9038  putchar ('\n');
9039}
9040
9041#ifdef BFD64
9042
9043/* VMS vs Unix time offset and factor.  */
9044
9045#define VMS_EPOCH_OFFSET 35067168000000000LL
9046#define VMS_GRANULARITY_FACTOR 10000000
9047
9048/* Display a VMS time in a human readable format.  */
9049
9050static void
9051print_vms_time (bfd_int64_t vmstime)
9052{
9053  struct tm *tm;
9054  time_t unxtime;
9055
9056  unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
9057  tm = gmtime (&unxtime);
9058  printf ("%04u-%02u-%02uT%02u:%02u:%02u",
9059          tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
9060          tm->tm_hour, tm->tm_min, tm->tm_sec);
9061}
9062#endif /* BFD64 */
9063
9064static void
9065dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
9066{
9067  switch (entry->d_tag)
9068    {
9069    case DT_IA_64_PLT_RESERVE:
9070      /* First 3 slots reserved.  */
9071      print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9072      printf (" -- ");
9073      print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
9074      break;
9075
9076    case DT_IA_64_VMS_LINKTIME:
9077#ifdef BFD64
9078      print_vms_time (entry->d_un.d_val);
9079#endif
9080      break;
9081
9082    case DT_IA_64_VMS_LNKFLAGS:
9083      print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9084      if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
9085        printf (" CALL_DEBUG");
9086      if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
9087        printf (" NOP0BUFS");
9088      if (entry->d_un.d_val & VMS_LF_P0IMAGE)
9089        printf (" P0IMAGE");
9090      if (entry->d_un.d_val & VMS_LF_MKTHREADS)
9091        printf (" MKTHREADS");
9092      if (entry->d_un.d_val & VMS_LF_UPCALLS)
9093        printf (" UPCALLS");
9094      if (entry->d_un.d_val & VMS_LF_IMGSTA)
9095        printf (" IMGSTA");
9096      if (entry->d_un.d_val & VMS_LF_INITIALIZE)
9097        printf (" INITIALIZE");
9098      if (entry->d_un.d_val & VMS_LF_MAIN)
9099        printf (" MAIN");
9100      if (entry->d_un.d_val & VMS_LF_EXE_INIT)
9101        printf (" EXE_INIT");
9102      if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
9103        printf (" TBK_IN_IMG");
9104      if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
9105        printf (" DBG_IN_IMG");
9106      if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
9107        printf (" TBK_IN_DSF");
9108      if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
9109        printf (" DBG_IN_DSF");
9110      if (entry->d_un.d_val & VMS_LF_SIGNATURES)
9111        printf (" SIGNATURES");
9112      if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
9113        printf (" REL_SEG_OFF");
9114      break;
9115
9116    default:
9117      print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9118      break;
9119    }
9120  putchar ('\n');
9121}
9122
9123static int
9124get_32bit_dynamic_section (FILE * file)
9125{
9126  Elf32_External_Dyn * edyn;
9127  Elf32_External_Dyn * ext;
9128  Elf_Internal_Dyn * entry;
9129
9130  edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
9131                                          dynamic_size, _("dynamic section"));
9132  if (!edyn)
9133    return 0;
9134
9135  /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9136     might not have the luxury of section headers.  Look for the DT_NULL
9137     terminator to determine the number of entries.  */
9138  for (ext = edyn, dynamic_nent = 0;
9139       (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9140       ext++)
9141    {
9142      dynamic_nent++;
9143      if (BYTE_GET (ext->d_tag) == DT_NULL)
9144	break;
9145    }
9146
9147  dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9148                                                  sizeof (* entry));
9149  if (dynamic_section == NULL)
9150    {
9151      error (_("Out of memory allocating space for %lu dynamic entries\n"),
9152	     (unsigned long) dynamic_nent);
9153      free (edyn);
9154      return 0;
9155    }
9156
9157  for (ext = edyn, entry = dynamic_section;
9158       entry < dynamic_section + dynamic_nent;
9159       ext++, entry++)
9160    {
9161      entry->d_tag      = BYTE_GET (ext->d_tag);
9162      entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9163    }
9164
9165  free (edyn);
9166
9167  return 1;
9168}
9169
9170static int
9171get_64bit_dynamic_section (FILE * file)
9172{
9173  Elf64_External_Dyn * edyn;
9174  Elf64_External_Dyn * ext;
9175  Elf_Internal_Dyn * entry;
9176
9177  /* Read in the data.  */
9178  edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
9179                                          dynamic_size, _("dynamic section"));
9180  if (!edyn)
9181    return 0;
9182
9183  /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9184     might not have the luxury of section headers.  Look for the DT_NULL
9185     terminator to determine the number of entries.  */
9186  for (ext = edyn, dynamic_nent = 0;
9187       /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer.  */
9188       (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9189       ext++)
9190    {
9191      dynamic_nent++;
9192      if (BYTE_GET (ext->d_tag) == DT_NULL)
9193	break;
9194    }
9195
9196  dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9197                                                  sizeof (* entry));
9198  if (dynamic_section == NULL)
9199    {
9200      error (_("Out of memory allocating space for %lu dynamic entries\n"),
9201	     (unsigned long) dynamic_nent);
9202      free (edyn);
9203      return 0;
9204    }
9205
9206  /* Convert from external to internal formats.  */
9207  for (ext = edyn, entry = dynamic_section;
9208       entry < dynamic_section + dynamic_nent;
9209       ext++, entry++)
9210    {
9211      entry->d_tag      = BYTE_GET (ext->d_tag);
9212      entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9213    }
9214
9215  free (edyn);
9216
9217  return 1;
9218}
9219
9220static void
9221print_dynamic_flags (bfd_vma flags)
9222{
9223  int first = 1;
9224
9225  while (flags)
9226    {
9227      bfd_vma flag;
9228
9229      flag = flags & - flags;
9230      flags &= ~ flag;
9231
9232      if (first)
9233	first = 0;
9234      else
9235	putc (' ', stdout);
9236
9237      switch (flag)
9238	{
9239	case DF_ORIGIN:		fputs ("ORIGIN", stdout); break;
9240	case DF_SYMBOLIC:	fputs ("SYMBOLIC", stdout); break;
9241	case DF_TEXTREL:	fputs ("TEXTREL", stdout); break;
9242	case DF_BIND_NOW:	fputs ("BIND_NOW", stdout); break;
9243	case DF_STATIC_TLS:	fputs ("STATIC_TLS", stdout); break;
9244	default:		fputs (_("unknown"), stdout); break;
9245	}
9246    }
9247  puts ("");
9248}
9249
9250/* Parse and display the contents of the dynamic section.  */
9251
9252static int
9253process_dynamic_section (FILE * file)
9254{
9255  Elf_Internal_Dyn * entry;
9256
9257  if (dynamic_size == 0)
9258    {
9259      if (do_dynamic)
9260	printf (_("\nThere is no dynamic section in this file.\n"));
9261
9262      return 1;
9263    }
9264
9265  if (is_32bit_elf)
9266    {
9267      if (! get_32bit_dynamic_section (file))
9268	return 0;
9269    }
9270  else if (! get_64bit_dynamic_section (file))
9271    return 0;
9272
9273  /* Find the appropriate symbol table.  */
9274  if (dynamic_symbols == NULL)
9275    {
9276      for (entry = dynamic_section;
9277	   entry < dynamic_section + dynamic_nent;
9278	   ++entry)
9279	{
9280	  Elf_Internal_Shdr section;
9281
9282	  if (entry->d_tag != DT_SYMTAB)
9283	    continue;
9284
9285	  dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
9286
9287	  /* Since we do not know how big the symbol table is,
9288	     we default to reading in the entire file (!) and
9289	     processing that.  This is overkill, I know, but it
9290	     should work.  */
9291	  section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
9292
9293	  if (archive_file_offset != 0)
9294	    section.sh_size = archive_file_size - section.sh_offset;
9295	  else
9296	    {
9297	      if (fseek (file, 0, SEEK_END))
9298		error (_("Unable to seek to end of file!\n"));
9299
9300	      section.sh_size = ftell (file) - section.sh_offset;
9301	    }
9302
9303	  if (is_32bit_elf)
9304	    section.sh_entsize = sizeof (Elf32_External_Sym);
9305	  else
9306	    section.sh_entsize = sizeof (Elf64_External_Sym);
9307	  section.sh_name = string_table_length;
9308
9309	  dynamic_symbols = GET_ELF_SYMBOLS (file, &section, & num_dynamic_syms);
9310	  if (num_dynamic_syms < 1)
9311	    {
9312	      error (_("Unable to determine the number of symbols to load\n"));
9313	      continue;
9314	    }
9315	}
9316    }
9317
9318  /* Similarly find a string table.  */
9319  if (dynamic_strings == NULL)
9320    {
9321      for (entry = dynamic_section;
9322	   entry < dynamic_section + dynamic_nent;
9323	   ++entry)
9324	{
9325	  unsigned long offset;
9326	  long str_tab_len;
9327
9328	  if (entry->d_tag != DT_STRTAB)
9329	    continue;
9330
9331	  dynamic_info[DT_STRTAB] = entry->d_un.d_val;
9332
9333	  /* Since we do not know how big the string table is,
9334	     we default to reading in the entire file (!) and
9335	     processing that.  This is overkill, I know, but it
9336	     should work.  */
9337
9338	  offset = offset_from_vma (file, entry->d_un.d_val, 0);
9339
9340	  if (archive_file_offset != 0)
9341	    str_tab_len = archive_file_size - offset;
9342	  else
9343	    {
9344	      if (fseek (file, 0, SEEK_END))
9345		error (_("Unable to seek to end of file\n"));
9346	      str_tab_len = ftell (file) - offset;
9347	    }
9348
9349	  if (str_tab_len < 1)
9350	    {
9351	      error
9352		(_("Unable to determine the length of the dynamic string table\n"));
9353	      continue;
9354	    }
9355
9356	  dynamic_strings = (char *) get_data (NULL, file, offset, 1,
9357                                               str_tab_len,
9358                                               _("dynamic string table"));
9359	  dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
9360	  break;
9361	}
9362    }
9363
9364  /* And find the syminfo section if available.  */
9365  if (dynamic_syminfo == NULL)
9366    {
9367      unsigned long syminsz = 0;
9368
9369      for (entry = dynamic_section;
9370	   entry < dynamic_section + dynamic_nent;
9371	   ++entry)
9372	{
9373	  if (entry->d_tag == DT_SYMINENT)
9374	    {
9375	      /* Note: these braces are necessary to avoid a syntax
9376		 error from the SunOS4 C compiler.  */
9377	      /* PR binutils/17531: A corrupt file can trigger this test.
9378		 So do not use an assert, instead generate an error message.  */
9379	      if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
9380		error (_("Bad value (%d) for SYMINENT entry\n"),
9381		       (int) entry->d_un.d_val);
9382	    }
9383	  else if (entry->d_tag == DT_SYMINSZ)
9384	    syminsz = entry->d_un.d_val;
9385	  else if (entry->d_tag == DT_SYMINFO)
9386	    dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
9387						      syminsz);
9388	}
9389
9390      if (dynamic_syminfo_offset != 0 && syminsz != 0)
9391	{
9392	  Elf_External_Syminfo * extsyminfo;
9393	  Elf_External_Syminfo * extsym;
9394	  Elf_Internal_Syminfo * syminfo;
9395
9396	  /* There is a syminfo section.  Read the data.  */
9397	  extsyminfo = (Elf_External_Syminfo *)
9398              get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
9399                        _("symbol information"));
9400	  if (!extsyminfo)
9401	    return 0;
9402
9403	  dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
9404	  if (dynamic_syminfo == NULL)
9405	    {
9406	      error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9407		     (unsigned long) syminsz);
9408	      return 0;
9409	    }
9410
9411	  dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
9412	  for (syminfo = dynamic_syminfo, extsym = extsyminfo;
9413	       syminfo < dynamic_syminfo + dynamic_syminfo_nent;
9414	       ++syminfo, ++extsym)
9415	    {
9416	      syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
9417	      syminfo->si_flags = BYTE_GET (extsym->si_flags);
9418	    }
9419
9420	  free (extsyminfo);
9421	}
9422    }
9423
9424  if (do_dynamic && dynamic_addr)
9425    printf (_("\nDynamic section at offset 0x%lx contains %lu entries:\n"),
9426	    dynamic_addr, (unsigned long) dynamic_nent);
9427  if (do_dynamic)
9428    printf (_("  Tag        Type                         Name/Value\n"));
9429
9430  for (entry = dynamic_section;
9431       entry < dynamic_section + dynamic_nent;
9432       entry++)
9433    {
9434      if (do_dynamic)
9435	{
9436	  const char * dtype;
9437
9438	  putchar (' ');
9439	  print_vma (entry->d_tag, FULL_HEX);
9440	  dtype = get_dynamic_type (entry->d_tag);
9441	  printf (" (%s)%*s", dtype,
9442		  ((is_32bit_elf ? 27 : 19)
9443		   - (int) strlen (dtype)),
9444		  " ");
9445	}
9446
9447      switch (entry->d_tag)
9448	{
9449	case DT_FLAGS:
9450	  if (do_dynamic)
9451	    print_dynamic_flags (entry->d_un.d_val);
9452	  break;
9453
9454	case DT_AUXILIARY:
9455	case DT_FILTER:
9456	case DT_CONFIG:
9457	case DT_DEPAUDIT:
9458	case DT_AUDIT:
9459	  if (do_dynamic)
9460	    {
9461	      switch (entry->d_tag)
9462		{
9463		case DT_AUXILIARY:
9464		  printf (_("Auxiliary library"));
9465		  break;
9466
9467		case DT_FILTER:
9468		  printf (_("Filter library"));
9469		  break;
9470
9471		case DT_CONFIG:
9472		  printf (_("Configuration file"));
9473		  break;
9474
9475		case DT_DEPAUDIT:
9476		  printf (_("Dependency audit library"));
9477		  break;
9478
9479		case DT_AUDIT:
9480		  printf (_("Audit library"));
9481		  break;
9482		}
9483
9484	      if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9485		printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
9486	      else
9487		{
9488		  printf (": ");
9489		  print_vma (entry->d_un.d_val, PREFIX_HEX);
9490		  putchar ('\n');
9491		}
9492	    }
9493	  break;
9494
9495	case DT_FEATURE:
9496	  if (do_dynamic)
9497	    {
9498	      printf (_("Flags:"));
9499
9500	      if (entry->d_un.d_val == 0)
9501		printf (_(" None\n"));
9502	      else
9503		{
9504		  unsigned long int val = entry->d_un.d_val;
9505
9506		  if (val & DTF_1_PARINIT)
9507		    {
9508		      printf (" PARINIT");
9509		      val ^= DTF_1_PARINIT;
9510		    }
9511		  if (val & DTF_1_CONFEXP)
9512		    {
9513		      printf (" CONFEXP");
9514		      val ^= DTF_1_CONFEXP;
9515		    }
9516		  if (val != 0)
9517		    printf (" %lx", val);
9518		  puts ("");
9519		}
9520	    }
9521	  break;
9522
9523	case DT_POSFLAG_1:
9524	  if (do_dynamic)
9525	    {
9526	      printf (_("Flags:"));
9527
9528	      if (entry->d_un.d_val == 0)
9529		printf (_(" None\n"));
9530	      else
9531		{
9532		  unsigned long int val = entry->d_un.d_val;
9533
9534		  if (val & DF_P1_LAZYLOAD)
9535		    {
9536		      printf (" LAZYLOAD");
9537		      val ^= DF_P1_LAZYLOAD;
9538		    }
9539		  if (val & DF_P1_GROUPPERM)
9540		    {
9541		      printf (" GROUPPERM");
9542		      val ^= DF_P1_GROUPPERM;
9543		    }
9544		  if (val != 0)
9545		    printf (" %lx", val);
9546		  puts ("");
9547		}
9548	    }
9549	  break;
9550
9551	case DT_FLAGS_1:
9552	  if (do_dynamic)
9553	    {
9554	      printf (_("Flags:"));
9555	      if (entry->d_un.d_val == 0)
9556		printf (_(" None\n"));
9557	      else
9558		{
9559		  unsigned long int val = entry->d_un.d_val;
9560
9561		  if (val & DF_1_NOW)
9562		    {
9563		      printf (" NOW");
9564		      val ^= DF_1_NOW;
9565		    }
9566		  if (val & DF_1_GLOBAL)
9567		    {
9568		      printf (" GLOBAL");
9569		      val ^= DF_1_GLOBAL;
9570		    }
9571		  if (val & DF_1_GROUP)
9572		    {
9573		      printf (" GROUP");
9574		      val ^= DF_1_GROUP;
9575		    }
9576		  if (val & DF_1_NODELETE)
9577		    {
9578		      printf (" NODELETE");
9579		      val ^= DF_1_NODELETE;
9580		    }
9581		  if (val & DF_1_LOADFLTR)
9582		    {
9583		      printf (" LOADFLTR");
9584		      val ^= DF_1_LOADFLTR;
9585		    }
9586		  if (val & DF_1_INITFIRST)
9587		    {
9588		      printf (" INITFIRST");
9589		      val ^= DF_1_INITFIRST;
9590		    }
9591		  if (val & DF_1_NOOPEN)
9592		    {
9593		      printf (" NOOPEN");
9594		      val ^= DF_1_NOOPEN;
9595		    }
9596		  if (val & DF_1_ORIGIN)
9597		    {
9598		      printf (" ORIGIN");
9599		      val ^= DF_1_ORIGIN;
9600		    }
9601		  if (val & DF_1_DIRECT)
9602		    {
9603		      printf (" DIRECT");
9604		      val ^= DF_1_DIRECT;
9605		    }
9606		  if (val & DF_1_TRANS)
9607		    {
9608		      printf (" TRANS");
9609		      val ^= DF_1_TRANS;
9610		    }
9611		  if (val & DF_1_INTERPOSE)
9612		    {
9613		      printf (" INTERPOSE");
9614		      val ^= DF_1_INTERPOSE;
9615		    }
9616		  if (val & DF_1_NODEFLIB)
9617		    {
9618		      printf (" NODEFLIB");
9619		      val ^= DF_1_NODEFLIB;
9620		    }
9621		  if (val & DF_1_NODUMP)
9622		    {
9623		      printf (" NODUMP");
9624		      val ^= DF_1_NODUMP;
9625		    }
9626		  if (val & DF_1_CONFALT)
9627		    {
9628		      printf (" CONFALT");
9629		      val ^= DF_1_CONFALT;
9630		    }
9631		  if (val & DF_1_ENDFILTEE)
9632		    {
9633		      printf (" ENDFILTEE");
9634		      val ^= DF_1_ENDFILTEE;
9635		    }
9636		  if (val & DF_1_DISPRELDNE)
9637		    {
9638		      printf (" DISPRELDNE");
9639		      val ^= DF_1_DISPRELDNE;
9640		    }
9641		  if (val & DF_1_DISPRELPND)
9642		    {
9643		      printf (" DISPRELPND");
9644		      val ^= DF_1_DISPRELPND;
9645		    }
9646		  if (val & DF_1_NODIRECT)
9647		    {
9648		      printf (" NODIRECT");
9649		      val ^= DF_1_NODIRECT;
9650		    }
9651		  if (val & DF_1_IGNMULDEF)
9652		    {
9653		      printf (" IGNMULDEF");
9654		      val ^= DF_1_IGNMULDEF;
9655		    }
9656		  if (val & DF_1_NOKSYMS)
9657		    {
9658		      printf (" NOKSYMS");
9659		      val ^= DF_1_NOKSYMS;
9660		    }
9661		  if (val & DF_1_NOHDR)
9662		    {
9663		      printf (" NOHDR");
9664		      val ^= DF_1_NOHDR;
9665		    }
9666		  if (val & DF_1_EDITED)
9667		    {
9668		      printf (" EDITED");
9669		      val ^= DF_1_EDITED;
9670		    }
9671		  if (val & DF_1_NORELOC)
9672		    {
9673		      printf (" NORELOC");
9674		      val ^= DF_1_NORELOC;
9675		    }
9676		  if (val & DF_1_SYMINTPOSE)
9677		    {
9678		      printf (" SYMINTPOSE");
9679		      val ^= DF_1_SYMINTPOSE;
9680		    }
9681		  if (val & DF_1_GLOBAUDIT)
9682		    {
9683		      printf (" GLOBAUDIT");
9684		      val ^= DF_1_GLOBAUDIT;
9685		    }
9686		  if (val & DF_1_SINGLETON)
9687		    {
9688		      printf (" SINGLETON");
9689		      val ^= DF_1_SINGLETON;
9690		    }
9691		  if (val & DF_1_STUB)
9692		    {
9693		      printf (" STUB");
9694		      val ^= DF_1_STUB;
9695		    }
9696		  if (val & DF_1_PIE)
9697		    {
9698		      printf (" PIE");
9699		      val ^= DF_1_PIE;
9700		    }
9701		  if (val != 0)
9702		    printf (" %lx", val);
9703		  puts ("");
9704		}
9705	    }
9706	  break;
9707
9708	case DT_PLTREL:
9709	  dynamic_info[entry->d_tag] = entry->d_un.d_val;
9710	  if (do_dynamic)
9711	    puts (get_dynamic_type (entry->d_un.d_val));
9712	  break;
9713
9714	case DT_NULL	:
9715	case DT_NEEDED	:
9716	case DT_PLTGOT	:
9717	case DT_HASH	:
9718	case DT_STRTAB	:
9719	case DT_SYMTAB	:
9720	case DT_RELA	:
9721	case DT_INIT	:
9722	case DT_FINI	:
9723	case DT_SONAME	:
9724	case DT_RPATH	:
9725	case DT_SYMBOLIC:
9726	case DT_REL	:
9727	case DT_DEBUG	:
9728	case DT_TEXTREL	:
9729	case DT_JMPREL	:
9730	case DT_RUNPATH	:
9731	  dynamic_info[entry->d_tag] = entry->d_un.d_val;
9732
9733	  if (do_dynamic)
9734	    {
9735	      char * name;
9736
9737	      if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9738		name = GET_DYNAMIC_NAME (entry->d_un.d_val);
9739	      else
9740		name = NULL;
9741
9742	      if (name)
9743		{
9744		  switch (entry->d_tag)
9745		    {
9746		    case DT_NEEDED:
9747		      printf (_("Shared library: [%s]"), name);
9748
9749		      if (streq (name, program_interpreter))
9750			printf (_(" program interpreter"));
9751		      break;
9752
9753		    case DT_SONAME:
9754		      printf (_("Library soname: [%s]"), name);
9755		      break;
9756
9757		    case DT_RPATH:
9758		      printf (_("Library rpath: [%s]"), name);
9759		      break;
9760
9761		    case DT_RUNPATH:
9762		      printf (_("Library runpath: [%s]"), name);
9763		      break;
9764
9765		    default:
9766		      print_vma (entry->d_un.d_val, PREFIX_HEX);
9767		      break;
9768		    }
9769		}
9770	      else
9771		print_vma (entry->d_un.d_val, PREFIX_HEX);
9772
9773	      putchar ('\n');
9774	    }
9775	  break;
9776
9777	case DT_PLTRELSZ:
9778	case DT_RELASZ	:
9779	case DT_STRSZ	:
9780	case DT_RELSZ	:
9781	case DT_RELAENT	:
9782	case DT_SYMENT	:
9783	case DT_RELENT	:
9784	  dynamic_info[entry->d_tag] = entry->d_un.d_val;
9785	  /* Fall through.  */
9786	case DT_PLTPADSZ:
9787	case DT_MOVEENT	:
9788	case DT_MOVESZ	:
9789	case DT_INIT_ARRAYSZ:
9790	case DT_FINI_ARRAYSZ:
9791	case DT_GNU_CONFLICTSZ:
9792	case DT_GNU_LIBLISTSZ:
9793	  if (do_dynamic)
9794	    {
9795	      print_vma (entry->d_un.d_val, UNSIGNED);
9796	      printf (_(" (bytes)\n"));
9797	    }
9798	  break;
9799
9800	case DT_VERDEFNUM:
9801	case DT_VERNEEDNUM:
9802	case DT_RELACOUNT:
9803	case DT_RELCOUNT:
9804	  if (do_dynamic)
9805	    {
9806	      print_vma (entry->d_un.d_val, UNSIGNED);
9807	      putchar ('\n');
9808	    }
9809	  break;
9810
9811	case DT_SYMINSZ:
9812	case DT_SYMINENT:
9813	case DT_SYMINFO:
9814	case DT_USED:
9815	case DT_INIT_ARRAY:
9816	case DT_FINI_ARRAY:
9817	  if (do_dynamic)
9818	    {
9819	      if (entry->d_tag == DT_USED
9820		  && VALID_DYNAMIC_NAME (entry->d_un.d_val))
9821		{
9822		  char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
9823
9824		  if (*name)
9825		    {
9826		      printf (_("Not needed object: [%s]\n"), name);
9827		      break;
9828		    }
9829		}
9830
9831	      print_vma (entry->d_un.d_val, PREFIX_HEX);
9832	      putchar ('\n');
9833	    }
9834	  break;
9835
9836	case DT_BIND_NOW:
9837	  /* The value of this entry is ignored.  */
9838	  if (do_dynamic)
9839	    putchar ('\n');
9840	  break;
9841
9842	case DT_GNU_PRELINKED:
9843	  if (do_dynamic)
9844	    {
9845	      struct tm * tmp;
9846	      time_t atime = entry->d_un.d_val;
9847
9848	      tmp = gmtime (&atime);
9849	      /* PR 17533 file: 041-1244816-0.004.  */
9850	      if (tmp == NULL)
9851		printf (_("<corrupt time val: %lx"),
9852			(unsigned long) atime);
9853	      else
9854		printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
9855			tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9856			tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9857
9858	    }
9859	  break;
9860
9861	case DT_GNU_HASH:
9862	  dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
9863	  if (do_dynamic)
9864	    {
9865	      print_vma (entry->d_un.d_val, PREFIX_HEX);
9866	      putchar ('\n');
9867	    }
9868	  break;
9869
9870	default:
9871	  if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
9872	    version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
9873	      entry->d_un.d_val;
9874
9875	  if (do_dynamic)
9876	    {
9877	      switch (elf_header.e_machine)
9878		{
9879		case EM_MIPS:
9880		case EM_MIPS_RS3_LE:
9881		  dynamic_section_mips_val (entry);
9882		  break;
9883		case EM_PARISC:
9884		  dynamic_section_parisc_val (entry);
9885		  break;
9886		case EM_IA_64:
9887		  dynamic_section_ia64_val (entry);
9888		  break;
9889		default:
9890		  print_vma (entry->d_un.d_val, PREFIX_HEX);
9891		  putchar ('\n');
9892		}
9893	    }
9894	  break;
9895	}
9896    }
9897
9898  return 1;
9899}
9900
9901static char *
9902get_ver_flags (unsigned int flags)
9903{
9904  static char buff[32];
9905
9906  buff[0] = 0;
9907
9908  if (flags == 0)
9909    return _("none");
9910
9911  if (flags & VER_FLG_BASE)
9912    strcat (buff, "BASE ");
9913
9914  if (flags & VER_FLG_WEAK)
9915    {
9916      if (flags & VER_FLG_BASE)
9917	strcat (buff, "| ");
9918
9919      strcat (buff, "WEAK ");
9920    }
9921
9922  if (flags & VER_FLG_INFO)
9923    {
9924      if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
9925	strcat (buff, "| ");
9926
9927      strcat (buff, "INFO ");
9928    }
9929
9930  if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
9931    strcat (buff, _("| <unknown>"));
9932
9933  return buff;
9934}
9935
9936/* Display the contents of the version sections.  */
9937
9938static int
9939process_version_sections (FILE * file)
9940{
9941  Elf_Internal_Shdr * section;
9942  unsigned i;
9943  int found = 0;
9944
9945  if (! do_version)
9946    return 1;
9947
9948  for (i = 0, section = section_headers;
9949       i < elf_header.e_shnum;
9950       i++, section++)
9951    {
9952      switch (section->sh_type)
9953	{
9954	case SHT_GNU_verdef:
9955	  {
9956	    Elf_External_Verdef * edefs;
9957	    unsigned int idx;
9958	    unsigned int cnt;
9959	    char * endbuf;
9960
9961	    found = 1;
9962
9963	    printf (_("\nVersion definition section '%s' contains %u entries:\n"),
9964		    printable_section_name (section),
9965		    section->sh_info);
9966
9967	    printf (_("  Addr: 0x"));
9968	    printf_vma (section->sh_addr);
9969	    printf (_("  Offset: %#08lx  Link: %u (%s)"),
9970		    (unsigned long) section->sh_offset, section->sh_link,
9971		    printable_section_name_from_index (section->sh_link));
9972
9973	    edefs = (Elf_External_Verdef *)
9974                get_data (NULL, file, section->sh_offset, 1,section->sh_size,
9975                          _("version definition section"));
9976	    if (!edefs)
9977	      break;
9978	    endbuf = (char *) edefs + section->sh_size;
9979
9980	    for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9981	      {
9982		char * vstart;
9983		Elf_External_Verdef * edef;
9984		Elf_Internal_Verdef ent;
9985		Elf_External_Verdaux * eaux;
9986		Elf_Internal_Verdaux aux;
9987		int j;
9988		int isum;
9989
9990		/* Check for very large indices.  */
9991		if (idx > (size_t) (endbuf - (char *) edefs))
9992		  break;
9993
9994		vstart = ((char *) edefs) + idx;
9995		if (vstart + sizeof (*edef) > endbuf)
9996		  break;
9997
9998		edef = (Elf_External_Verdef *) vstart;
9999
10000		ent.vd_version = BYTE_GET (edef->vd_version);
10001		ent.vd_flags   = BYTE_GET (edef->vd_flags);
10002		ent.vd_ndx     = BYTE_GET (edef->vd_ndx);
10003		ent.vd_cnt     = BYTE_GET (edef->vd_cnt);
10004		ent.vd_hash    = BYTE_GET (edef->vd_hash);
10005		ent.vd_aux     = BYTE_GET (edef->vd_aux);
10006		ent.vd_next    = BYTE_GET (edef->vd_next);
10007
10008		printf (_("  %#06x: Rev: %d  Flags: %s"),
10009			idx, ent.vd_version, get_ver_flags (ent.vd_flags));
10010
10011		printf (_("  Index: %d  Cnt: %d  "),
10012			ent.vd_ndx, ent.vd_cnt);
10013
10014		/* Check for overflow.  */
10015		if (ent.vd_aux > (size_t) (endbuf - vstart))
10016		  break;
10017
10018		vstart += ent.vd_aux;
10019
10020		eaux = (Elf_External_Verdaux *) vstart;
10021
10022		aux.vda_name = BYTE_GET (eaux->vda_name);
10023		aux.vda_next = BYTE_GET (eaux->vda_next);
10024
10025		if (VALID_DYNAMIC_NAME (aux.vda_name))
10026		  printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
10027		else
10028		  printf (_("Name index: %ld\n"), aux.vda_name);
10029
10030		isum = idx + ent.vd_aux;
10031
10032		for (j = 1; j < ent.vd_cnt; j++)
10033		  {
10034		    /* Check for overflow.  */
10035		    if (aux.vda_next > (size_t) (endbuf - vstart))
10036		      break;
10037
10038		    isum   += aux.vda_next;
10039		    vstart += aux.vda_next;
10040
10041		    eaux = (Elf_External_Verdaux *) vstart;
10042		    if (vstart + sizeof (*eaux) > endbuf)
10043		      break;
10044
10045		    aux.vda_name = BYTE_GET (eaux->vda_name);
10046		    aux.vda_next = BYTE_GET (eaux->vda_next);
10047
10048		    if (VALID_DYNAMIC_NAME (aux.vda_name))
10049		      printf (_("  %#06x: Parent %d: %s\n"),
10050			      isum, j, GET_DYNAMIC_NAME (aux.vda_name));
10051		    else
10052		      printf (_("  %#06x: Parent %d, name index: %ld\n"),
10053			      isum, j, aux.vda_name);
10054		  }
10055
10056		if (j < ent.vd_cnt)
10057		  printf (_("  Version def aux past end of section\n"));
10058
10059		/* PR 17531: file: id:000001,src:000172+005151,op:splice,rep:2.  */
10060		if (idx + ent.vd_next <= idx)
10061		  break;
10062
10063		idx += ent.vd_next;
10064	      }
10065
10066	    if (cnt < section->sh_info)
10067	      printf (_("  Version definition past end of section\n"));
10068
10069	    free (edefs);
10070	  }
10071	  break;
10072
10073	case SHT_GNU_verneed:
10074	  {
10075	    Elf_External_Verneed * eneed;
10076	    unsigned int idx;
10077	    unsigned int cnt;
10078	    char * endbuf;
10079
10080	    found = 1;
10081
10082	    printf (_("\nVersion needs section '%s' contains %u entries:\n"),
10083		    printable_section_name (section), section->sh_info);
10084
10085	    printf (_(" Addr: 0x"));
10086	    printf_vma (section->sh_addr);
10087	    printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
10088		    (unsigned long) section->sh_offset, section->sh_link,
10089		    printable_section_name_from_index (section->sh_link));
10090
10091	    eneed = (Elf_External_Verneed *) get_data (NULL, file,
10092                                                       section->sh_offset, 1,
10093                                                       section->sh_size,
10094                                                       _("Version Needs section"));
10095	    if (!eneed)
10096	      break;
10097	    endbuf = (char *) eneed + section->sh_size;
10098
10099	    for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10100	      {
10101		Elf_External_Verneed * entry;
10102		Elf_Internal_Verneed ent;
10103		int j;
10104		int isum;
10105		char * vstart;
10106
10107		if (idx > (size_t) (endbuf - (char *) eneed))
10108		  break;
10109
10110		vstart = ((char *) eneed) + idx;
10111		if (vstart + sizeof (*entry) > endbuf)
10112		  break;
10113
10114		entry = (Elf_External_Verneed *) vstart;
10115
10116		ent.vn_version = BYTE_GET (entry->vn_version);
10117		ent.vn_cnt     = BYTE_GET (entry->vn_cnt);
10118		ent.vn_file    = BYTE_GET (entry->vn_file);
10119		ent.vn_aux     = BYTE_GET (entry->vn_aux);
10120		ent.vn_next    = BYTE_GET (entry->vn_next);
10121
10122		printf (_("  %#06x: Version: %d"), idx, ent.vn_version);
10123
10124		if (VALID_DYNAMIC_NAME (ent.vn_file))
10125		  printf (_("  File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
10126		else
10127		  printf (_("  File: %lx"), ent.vn_file);
10128
10129		printf (_("  Cnt: %d\n"), ent.vn_cnt);
10130
10131		/* Check for overflow.  */
10132		if (ent.vn_aux > (size_t) (endbuf - vstart))
10133		  break;
10134		vstart += ent.vn_aux;
10135
10136		for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
10137		  {
10138		    Elf_External_Vernaux * eaux;
10139		    Elf_Internal_Vernaux aux;
10140
10141		    if (vstart + sizeof (*eaux) > endbuf)
10142		      break;
10143		    eaux = (Elf_External_Vernaux *) vstart;
10144
10145		    aux.vna_hash  = BYTE_GET (eaux->vna_hash);
10146		    aux.vna_flags = BYTE_GET (eaux->vna_flags);
10147		    aux.vna_other = BYTE_GET (eaux->vna_other);
10148		    aux.vna_name  = BYTE_GET (eaux->vna_name);
10149		    aux.vna_next  = BYTE_GET (eaux->vna_next);
10150
10151		    if (VALID_DYNAMIC_NAME (aux.vna_name))
10152		      printf (_("  %#06x:   Name: %s"),
10153			      isum, GET_DYNAMIC_NAME (aux.vna_name));
10154		    else
10155		      printf (_("  %#06x:   Name index: %lx"),
10156			      isum, aux.vna_name);
10157
10158		    printf (_("  Flags: %s  Version: %d\n"),
10159			    get_ver_flags (aux.vna_flags), aux.vna_other);
10160
10161		    /* Check for overflow.  */
10162		    if (aux.vna_next > (size_t) (endbuf - vstart)
10163			|| (aux.vna_next == 0 && j < ent.vn_cnt - 1))
10164		      {
10165			warn (_("Invalid vna_next field of %lx\n"),
10166			      aux.vna_next);
10167			j = ent.vn_cnt;
10168			break;
10169		      }
10170		    isum   += aux.vna_next;
10171		    vstart += aux.vna_next;
10172		  }
10173
10174		if (j < ent.vn_cnt)
10175		  warn (_("Missing Version Needs auxillary information\n"));
10176
10177		if (ent.vn_next == 0 && cnt < section->sh_info - 1)
10178		  {
10179		    warn (_("Corrupt Version Needs structure - offset to next structure is zero with entries still left to be processed\n"));
10180		    cnt = section->sh_info;
10181		    break;
10182		  }
10183		idx += ent.vn_next;
10184	      }
10185
10186	    if (cnt < section->sh_info)
10187	      warn (_("Missing Version Needs information\n"));
10188
10189	    free (eneed);
10190	  }
10191	  break;
10192
10193	case SHT_GNU_versym:
10194	  {
10195	    Elf_Internal_Shdr * link_section;
10196	    size_t total;
10197	    unsigned int cnt;
10198	    unsigned char * edata;
10199	    unsigned short * data;
10200	    char * strtab;
10201	    Elf_Internal_Sym * symbols;
10202	    Elf_Internal_Shdr * string_sec;
10203	    unsigned long num_syms;
10204	    long off;
10205
10206	    if (section->sh_link >= elf_header.e_shnum)
10207	      break;
10208
10209	    link_section = section_headers + section->sh_link;
10210	    total = section->sh_size / sizeof (Elf_External_Versym);
10211
10212	    if (link_section->sh_link >= elf_header.e_shnum)
10213	      break;
10214
10215	    found = 1;
10216
10217	    symbols = GET_ELF_SYMBOLS (file, link_section, & num_syms);
10218	    if (symbols == NULL)
10219	      break;
10220
10221	    string_sec = section_headers + link_section->sh_link;
10222
10223	    strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
10224                                        string_sec->sh_size,
10225                                        _("version string table"));
10226	    if (!strtab)
10227	      {
10228		free (symbols);
10229		break;
10230	      }
10231
10232	    printf (_("\nVersion symbols section '%s' contains %lu entries:\n"),
10233		    printable_section_name (section), (unsigned long) total);
10234
10235	    printf (_(" Addr: "));
10236	    printf_vma (section->sh_addr);
10237	    printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
10238		    (unsigned long) section->sh_offset, section->sh_link,
10239		    printable_section_name (link_section));
10240
10241	    off = offset_from_vma (file,
10242				   version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10243				   total * sizeof (short));
10244	    edata = (unsigned char *) get_data (NULL, file, off, total,
10245                                                sizeof (short),
10246                                                _("version symbol data"));
10247	    if (!edata)
10248	      {
10249		free (strtab);
10250		free (symbols);
10251		break;
10252	      }
10253
10254	    data = (short unsigned int *) cmalloc (total, sizeof (short));
10255
10256	    for (cnt = total; cnt --;)
10257	      data[cnt] = byte_get (edata + cnt * sizeof (short),
10258				    sizeof (short));
10259
10260	    free (edata);
10261
10262	    for (cnt = 0; cnt < total; cnt += 4)
10263	      {
10264		int j, nn;
10265		char *name;
10266		char *invalid = _("*invalid*");
10267
10268		printf ("  %03x:", cnt);
10269
10270		for (j = 0; (j < 4) && (cnt + j) < total; ++j)
10271		  switch (data[cnt + j])
10272		    {
10273		    case 0:
10274		      fputs (_("   0 (*local*)    "), stdout);
10275		      break;
10276
10277		    case 1:
10278		      fputs (_("   1 (*global*)   "), stdout);
10279		      break;
10280
10281		    default:
10282		      nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
10283				   data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
10284
10285		      /* If this index value is greater than the size of the symbols
10286		         array, break to avoid an out-of-bounds read.  */
10287		      if ((unsigned long)(cnt + j) >= num_syms)
10288		        {
10289		          warn (_("invalid index into symbol array\n"));
10290		          break;
10291			}
10292
10293		      name = NULL;
10294		      if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10295			{
10296			  Elf_Internal_Verneed ivn;
10297			  unsigned long offset;
10298
10299			  offset = offset_from_vma
10300			    (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10301			     sizeof (Elf_External_Verneed));
10302
10303			  do
10304			    {
10305			      Elf_Internal_Vernaux ivna;
10306			      Elf_External_Verneed evn;
10307			      Elf_External_Vernaux evna;
10308			      unsigned long a_off;
10309
10310			      if (get_data (&evn, file, offset, sizeof (evn), 1,
10311					    _("version need")) == NULL)
10312				break;
10313
10314			      ivn.vn_aux  = BYTE_GET (evn.vn_aux);
10315			      ivn.vn_next = BYTE_GET (evn.vn_next);
10316
10317			      a_off = offset + ivn.vn_aux;
10318
10319			      do
10320				{
10321				  if (get_data (&evna, file, a_off, sizeof (evna),
10322						1, _("version need aux (2)")) == NULL)
10323				    {
10324				      ivna.vna_next  = 0;
10325				      ivna.vna_other = 0;
10326				    }
10327				  else
10328				    {
10329				      ivna.vna_next  = BYTE_GET (evna.vna_next);
10330				      ivna.vna_other = BYTE_GET (evna.vna_other);
10331				    }
10332
10333				  a_off += ivna.vna_next;
10334				}
10335			      while (ivna.vna_other != data[cnt + j]
10336				     && ivna.vna_next != 0);
10337
10338			      if (ivna.vna_other == data[cnt + j])
10339				{
10340				  ivna.vna_name = BYTE_GET (evna.vna_name);
10341
10342				  if (ivna.vna_name >= string_sec->sh_size)
10343				    name = invalid;
10344				  else
10345				    name = strtab + ivna.vna_name;
10346				  break;
10347				}
10348
10349			      offset += ivn.vn_next;
10350			    }
10351			  while (ivn.vn_next);
10352			}
10353
10354		      if (data[cnt + j] != 0x8001
10355			  && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10356			{
10357			  Elf_Internal_Verdef ivd;
10358			  Elf_External_Verdef evd;
10359			  unsigned long offset;
10360
10361			  offset = offset_from_vma
10362			    (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10363			     sizeof evd);
10364
10365			  do
10366			    {
10367			      if (get_data (&evd, file, offset, sizeof (evd), 1,
10368					    _("version def")) == NULL)
10369				{
10370				  ivd.vd_next = 0;
10371				  /* PR 17531: file: 046-1082287-0.004.  */
10372				  ivd.vd_ndx  = (data[cnt + j] & VERSYM_VERSION) + 1;
10373				  break;
10374				}
10375			      else
10376				{
10377				  ivd.vd_next = BYTE_GET (evd.vd_next);
10378				  ivd.vd_ndx  = BYTE_GET (evd.vd_ndx);
10379				}
10380
10381			      offset += ivd.vd_next;
10382			    }
10383			  while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
10384				 && ivd.vd_next != 0);
10385
10386			  if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
10387			    {
10388			      Elf_External_Verdaux evda;
10389			      Elf_Internal_Verdaux ivda;
10390
10391			      ivd.vd_aux = BYTE_GET (evd.vd_aux);
10392
10393			      if (get_data (&evda, file,
10394					    offset - ivd.vd_next + ivd.vd_aux,
10395					    sizeof (evda), 1,
10396					    _("version def aux")) == NULL)
10397				break;
10398
10399			      ivda.vda_name = BYTE_GET (evda.vda_name);
10400
10401			      if (ivda.vda_name >= string_sec->sh_size)
10402				name = invalid;
10403			      else if (name != NULL && name != invalid)
10404				name = _("*both*");
10405			      else
10406				name = strtab + ivda.vda_name;
10407			    }
10408			}
10409		      if (name != NULL)
10410			nn += printf ("(%s%-*s",
10411				      name,
10412				      12 - (int) strlen (name),
10413				      ")");
10414
10415		      if (nn < 18)
10416			printf ("%*c", 18 - nn, ' ');
10417		    }
10418
10419		putchar ('\n');
10420	      }
10421
10422	    free (data);
10423	    free (strtab);
10424	    free (symbols);
10425	  }
10426	  break;
10427
10428	default:
10429	  break;
10430	}
10431    }
10432
10433  if (! found)
10434    printf (_("\nNo version information found in this file.\n"));
10435
10436  return 1;
10437}
10438
10439static const char *
10440get_symbol_binding (unsigned int binding)
10441{
10442  static char buff[32];
10443
10444  switch (binding)
10445    {
10446    case STB_LOCAL:	return "LOCAL";
10447    case STB_GLOBAL:	return "GLOBAL";
10448    case STB_WEAK:	return "WEAK";
10449    default:
10450      if (binding >= STB_LOPROC && binding <= STB_HIPROC)
10451	snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
10452		  binding);
10453      else if (binding >= STB_LOOS && binding <= STB_HIOS)
10454	{
10455	  if (binding == STB_GNU_UNIQUE
10456	      && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10457		  /* GNU is still using the default value 0.  */
10458		  || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10459	    return "UNIQUE";
10460	  snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
10461	}
10462      else
10463	snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
10464      return buff;
10465    }
10466}
10467
10468static const char *
10469get_symbol_type (unsigned int type)
10470{
10471  static char buff[32];
10472
10473  switch (type)
10474    {
10475    case STT_NOTYPE:	return "NOTYPE";
10476    case STT_OBJECT:	return "OBJECT";
10477    case STT_FUNC:	return "FUNC";
10478    case STT_SECTION:	return "SECTION";
10479    case STT_FILE:	return "FILE";
10480    case STT_COMMON:	return "COMMON";
10481    case STT_TLS:	return "TLS";
10482    case STT_RELC:      return "RELC";
10483    case STT_SRELC:     return "SRELC";
10484    default:
10485      if (type >= STT_LOPROC && type <= STT_HIPROC)
10486	{
10487	  if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
10488	    return "THUMB_FUNC";
10489
10490	  if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
10491	    return "REGISTER";
10492
10493	  if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
10494	    return "PARISC_MILLI";
10495
10496	  snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
10497	}
10498      else if (type >= STT_LOOS && type <= STT_HIOS)
10499	{
10500	  if (elf_header.e_machine == EM_PARISC)
10501	    {
10502	      if (type == STT_HP_OPAQUE)
10503		return "HP_OPAQUE";
10504	      if (type == STT_HP_STUB)
10505		return "HP_STUB";
10506	    }
10507
10508	  if (type == STT_GNU_IFUNC
10509	      && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10510		  || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
10511		  /* GNU is still using the default value 0.  */
10512		  || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10513	    return "IFUNC";
10514
10515	  snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
10516	}
10517      else
10518	snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
10519      return buff;
10520    }
10521}
10522
10523static const char *
10524get_symbol_visibility (unsigned int visibility)
10525{
10526  switch (visibility)
10527    {
10528    case STV_DEFAULT:	return "DEFAULT";
10529    case STV_INTERNAL:	return "INTERNAL";
10530    case STV_HIDDEN:	return "HIDDEN";
10531    case STV_PROTECTED: return "PROTECTED";
10532    default:
10533      error (_("Unrecognized visibility value: %u"), visibility);
10534      return _("<unknown>");
10535    }
10536}
10537
10538static const char *
10539get_solaris_symbol_visibility (unsigned int visibility)
10540{
10541  switch (visibility)
10542    {
10543    case 4: return "EXPORTED";
10544    case 5: return "SINGLETON";
10545    case 6: return "ELIMINATE";
10546    default: return get_symbol_visibility (visibility);
10547    }
10548}
10549
10550static const char *
10551get_mips_symbol_other (unsigned int other)
10552{
10553  switch (other)
10554    {
10555    case STO_OPTIONAL:
10556      return "OPTIONAL";
10557    case STO_MIPS_PLT:
10558      return "MIPS PLT";
10559    case STO_MIPS_PIC:
10560      return "MIPS PIC";
10561    case STO_MICROMIPS:
10562      return "MICROMIPS";
10563    case STO_MICROMIPS | STO_MIPS_PIC:
10564      return "MICROMIPS, MIPS PIC";
10565    case STO_MIPS16:
10566      return "MIPS16";
10567    default:
10568      return NULL;
10569    }
10570}
10571
10572static const char *
10573get_ia64_symbol_other (unsigned int other)
10574{
10575  if (is_ia64_vms ())
10576    {
10577      static char res[32];
10578
10579      res[0] = 0;
10580
10581      /* Function types is for images and .STB files only.  */
10582      switch (elf_header.e_type)
10583        {
10584        case ET_DYN:
10585        case ET_EXEC:
10586          switch (VMS_ST_FUNC_TYPE (other))
10587            {
10588            case VMS_SFT_CODE_ADDR:
10589              strcat (res, " CA");
10590              break;
10591            case VMS_SFT_SYMV_IDX:
10592              strcat (res, " VEC");
10593              break;
10594            case VMS_SFT_FD:
10595              strcat (res, " FD");
10596              break;
10597            case VMS_SFT_RESERVE:
10598              strcat (res, " RSV");
10599              break;
10600            default:
10601	      warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
10602		    VMS_ST_FUNC_TYPE (other));
10603	      strcat (res, " <unknown>");
10604	      break;
10605            }
10606          break;
10607        default:
10608          break;
10609        }
10610      switch (VMS_ST_LINKAGE (other))
10611        {
10612        case VMS_STL_IGNORE:
10613          strcat (res, " IGN");
10614          break;
10615        case VMS_STL_RESERVE:
10616          strcat (res, " RSV");
10617          break;
10618        case VMS_STL_STD:
10619          strcat (res, " STD");
10620          break;
10621        case VMS_STL_LNK:
10622          strcat (res, " LNK");
10623          break;
10624        default:
10625	  warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
10626		VMS_ST_LINKAGE (other));
10627	  strcat (res, " <unknown>");
10628	  break;
10629        }
10630
10631      if (res[0] != 0)
10632        return res + 1;
10633      else
10634        return res;
10635    }
10636  return NULL;
10637}
10638
10639static const char *
10640get_ppc64_symbol_other (unsigned int other)
10641{
10642  if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
10643    {
10644      static char buf[32];
10645      snprintf (buf, sizeof buf, _("<localentry>: %d"),
10646		PPC64_LOCAL_ENTRY_OFFSET (other));
10647      return buf;
10648    }
10649  return NULL;
10650}
10651
10652static const char *
10653get_symbol_other (unsigned int other)
10654{
10655  const char * result = NULL;
10656  static char buff [32];
10657
10658  if (other == 0)
10659    return "";
10660
10661  switch (elf_header.e_machine)
10662    {
10663    case EM_MIPS:
10664      result = get_mips_symbol_other (other);
10665      break;
10666    case EM_IA_64:
10667      result = get_ia64_symbol_other (other);
10668      break;
10669    case EM_PPC64:
10670      result = get_ppc64_symbol_other (other);
10671      break;
10672    default:
10673      result = NULL;
10674      break;
10675    }
10676
10677  if (result)
10678    return result;
10679
10680  snprintf (buff, sizeof buff, _("<other>: %x"), other);
10681  return buff;
10682}
10683
10684static const char *
10685get_symbol_index_type (unsigned int type)
10686{
10687  static char buff[32];
10688
10689  switch (type)
10690    {
10691    case SHN_UNDEF:	return "UND";
10692    case SHN_ABS:	return "ABS";
10693    case SHN_COMMON:	return "COM";
10694    default:
10695      if (type == SHN_IA_64_ANSI_COMMON
10696	  && elf_header.e_machine == EM_IA_64
10697	  && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
10698	return "ANSI_COM";
10699      else if ((elf_header.e_machine == EM_X86_64
10700		|| elf_header.e_machine == EM_L1OM
10701		|| elf_header.e_machine == EM_K1OM)
10702	       && type == SHN_X86_64_LCOMMON)
10703	return "LARGE_COM";
10704      else if ((type == SHN_MIPS_SCOMMON
10705		&& elf_header.e_machine == EM_MIPS)
10706	       || (type == SHN_TIC6X_SCOMMON
10707		   && elf_header.e_machine == EM_TI_C6000))
10708	return "SCOM";
10709      else if (type == SHN_MIPS_SUNDEFINED
10710	       && elf_header.e_machine == EM_MIPS)
10711	return "SUND";
10712      else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
10713	sprintf (buff, "PRC[0x%04x]", type & 0xffff);
10714      else if (type >= SHN_LOOS && type <= SHN_HIOS)
10715	sprintf (buff, "OS [0x%04x]", type & 0xffff);
10716      else if (type >= SHN_LORESERVE)
10717	sprintf (buff, "RSV[0x%04x]", type & 0xffff);
10718      else if (type >= elf_header.e_shnum)
10719	sprintf (buff, _("bad section index[%3d]"), type);
10720      else
10721	sprintf (buff, "%3d", type);
10722      break;
10723    }
10724
10725  return buff;
10726}
10727
10728static bfd_vma *
10729get_dynamic_data (FILE * file, bfd_size_type number, unsigned int ent_size)
10730{
10731  unsigned char * e_data;
10732  bfd_vma * i_data;
10733
10734  /* If the size_t type is smaller than the bfd_size_type, eg because
10735     you are building a 32-bit tool on a 64-bit host, then make sure
10736     that when (number) is cast to (size_t) no information is lost.  */
10737  if (sizeof (size_t) < sizeof (bfd_size_type)
10738      && (bfd_size_type) ((size_t) number) != number)
10739    {
10740      error (_("Size truncation prevents reading %" BFD_VMA_FMT "u"
10741	       " elements of size %u\n"),
10742	     number, ent_size);
10743      return NULL;
10744    }
10745
10746  /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
10747     attempting to allocate memory when the read is bound to fail.  */
10748  if (ent_size * number > current_file_size)
10749    {
10750      error (_("Invalid number of dynamic entries: %" BFD_VMA_FMT "u\n"),
10751	     number);
10752      return NULL;
10753    }
10754
10755  e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
10756  if (e_data == NULL)
10757    {
10758      error (_("Out of memory reading %" BFD_VMA_FMT "u dynamic entries\n"),
10759	     number);
10760      return NULL;
10761    }
10762
10763  if (fread (e_data, ent_size, (size_t) number, file) != number)
10764    {
10765      error (_("Unable to read in %" BFD_VMA_FMT "u bytes of dynamic data\n"),
10766	     number * ent_size);
10767      free (e_data);
10768      return NULL;
10769    }
10770
10771  i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
10772  if (i_data == NULL)
10773    {
10774      error (_("Out of memory allocating space for %" BFD_VMA_FMT "u"
10775	       " dynamic entries\n"),
10776	     number);
10777      free (e_data);
10778      return NULL;
10779    }
10780
10781  while (number--)
10782    i_data[number] = byte_get (e_data + number * ent_size, ent_size);
10783
10784  free (e_data);
10785
10786  return i_data;
10787}
10788
10789static void
10790print_dynamic_symbol (bfd_vma si, unsigned long hn)
10791{
10792  Elf_Internal_Sym * psym;
10793  int n;
10794
10795  n = print_vma (si, DEC_5);
10796  if (n < 5)
10797    fputs (&"     "[n], stdout);
10798  printf (" %3lu: ", hn);
10799
10800  if (dynamic_symbols == NULL || si >= num_dynamic_syms)
10801    {
10802      printf (_("<No info available for dynamic symbol number %lu>\n"),
10803	      (unsigned long) si);
10804      return;
10805    }
10806
10807  psym = dynamic_symbols + si;
10808  print_vma (psym->st_value, LONG_HEX);
10809  putchar (' ');
10810  print_vma (psym->st_size, DEC_5);
10811
10812  printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10813  printf (" %-6s",  get_symbol_binding (ELF_ST_BIND (psym->st_info)));
10814
10815  if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
10816    printf (" %-7s",  get_solaris_symbol_visibility (psym->st_other));
10817  else
10818    {
10819      unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
10820
10821      printf (" %-7s",  get_symbol_visibility (vis));
10822      /* Check to see if any other bits in the st_other field are set.
10823	 Note - displaying this information disrupts the layout of the
10824	 table being generated, but for the moment this case is very
10825	 rare.  */
10826      if (psym->st_other ^ vis)
10827	printf (" [%s] ", get_symbol_other (psym->st_other ^ vis));
10828    }
10829
10830  printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
10831  if (VALID_DYNAMIC_NAME (psym->st_name))
10832    print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
10833  else
10834    printf (_(" <corrupt: %14ld>"), psym->st_name);
10835  putchar ('\n');
10836}
10837
10838static const char *
10839get_symbol_version_string (FILE *                       file,
10840			   bfd_boolean                  is_dynsym,
10841			   const char *                 strtab,
10842			   unsigned long int            strtab_size,
10843			   unsigned int                 si,
10844			   Elf_Internal_Sym *           psym,
10845			   enum versioned_symbol_info * sym_info,
10846			   unsigned short *             vna_other)
10847{
10848  unsigned char data[2];
10849  unsigned short vers_data;
10850  unsigned long offset;
10851
10852  if (!is_dynsym
10853      || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
10854    return NULL;
10855
10856  offset = offset_from_vma (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10857			    sizeof data + si * sizeof (vers_data));
10858
10859  if (get_data (&data, file, offset + si * sizeof (vers_data),
10860		sizeof (data), 1, _("version data")) == NULL)
10861    return NULL;
10862
10863  vers_data = byte_get (data, 2);
10864
10865  if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data <= 1)
10866    return NULL;
10867
10868  /* Usually we'd only see verdef for defined symbols, and verneed for
10869     undefined symbols.  However, symbols defined by the linker in
10870     .dynbss for variables copied from a shared library in order to
10871     avoid text relocations are defined yet have verneed.  We could
10872     use a heuristic to detect the special case, for example, check
10873     for verneed first on symbols defined in SHT_NOBITS sections, but
10874     it is simpler and more reliable to just look for both verdef and
10875     verneed.  .dynbss might not be mapped to a SHT_NOBITS section.  */
10876
10877  if (psym->st_shndx != SHN_UNDEF
10878      && vers_data != 0x8001
10879      && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10880    {
10881      Elf_Internal_Verdef ivd;
10882      Elf_Internal_Verdaux ivda;
10883      Elf_External_Verdaux evda;
10884      unsigned long off;
10885
10886      off = offset_from_vma (file,
10887			     version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10888			     sizeof (Elf_External_Verdef));
10889
10890      do
10891	{
10892	  Elf_External_Verdef evd;
10893
10894	  if (get_data (&evd, file, off, sizeof (evd), 1,
10895			_("version def")) == NULL)
10896	    {
10897	      ivd.vd_ndx = 0;
10898	      ivd.vd_aux = 0;
10899	      ivd.vd_next = 0;
10900	    }
10901	  else
10902	    {
10903	      ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10904	      ivd.vd_aux = BYTE_GET (evd.vd_aux);
10905	      ivd.vd_next = BYTE_GET (evd.vd_next);
10906	    }
10907
10908	  off += ivd.vd_next;
10909	}
10910      while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
10911
10912      if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
10913	{
10914	  off -= ivd.vd_next;
10915	  off += ivd.vd_aux;
10916
10917	  if (get_data (&evda, file, off, sizeof (evda), 1,
10918			_("version def aux")) != NULL)
10919	    {
10920	      ivda.vda_name = BYTE_GET (evda.vda_name);
10921
10922	      if (psym->st_name != ivda.vda_name)
10923		{
10924		  *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
10925			       ? symbol_hidden : symbol_public);
10926		  return (ivda.vda_name < strtab_size
10927			  ? strtab + ivda.vda_name : _("<corrupt>"));
10928		}
10929	    }
10930	}
10931    }
10932
10933  if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10934    {
10935      Elf_External_Verneed evn;
10936      Elf_Internal_Verneed ivn;
10937      Elf_Internal_Vernaux ivna;
10938
10939      offset = offset_from_vma (file,
10940				version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10941				sizeof evn);
10942      do
10943	{
10944	  unsigned long vna_off;
10945
10946	  if (get_data (&evn, file, offset, sizeof (evn), 1,
10947			_("version need")) == NULL)
10948	    {
10949	      ivna.vna_next = 0;
10950	      ivna.vna_other = 0;
10951	      ivna.vna_name = 0;
10952	      break;
10953	    }
10954
10955	  ivn.vn_aux  = BYTE_GET (evn.vn_aux);
10956	  ivn.vn_next = BYTE_GET (evn.vn_next);
10957
10958	  vna_off = offset + ivn.vn_aux;
10959
10960	  do
10961	    {
10962	      Elf_External_Vernaux evna;
10963
10964	      if (get_data (&evna, file, vna_off, sizeof (evna), 1,
10965			    _("version need aux (3)")) == NULL)
10966		{
10967		  ivna.vna_next = 0;
10968		  ivna.vna_other = 0;
10969		  ivna.vna_name = 0;
10970		}
10971	      else
10972		{
10973		  ivna.vna_other = BYTE_GET (evna.vna_other);
10974		  ivna.vna_next  = BYTE_GET (evna.vna_next);
10975		  ivna.vna_name  = BYTE_GET (evna.vna_name);
10976		}
10977
10978	      vna_off += ivna.vna_next;
10979	    }
10980	  while (ivna.vna_other != vers_data && ivna.vna_next != 0);
10981
10982	  if (ivna.vna_other == vers_data)
10983	    break;
10984
10985	  offset += ivn.vn_next;
10986	}
10987      while (ivn.vn_next != 0);
10988
10989      if (ivna.vna_other == vers_data)
10990	{
10991	  *sym_info = symbol_undefined;
10992	  *vna_other = ivna.vna_other;
10993	  return (ivna.vna_name < strtab_size
10994		  ? strtab + ivna.vna_name : _("<corrupt>"));
10995	}
10996    }
10997  return NULL;
10998}
10999
11000/* Dump the symbol table.  */
11001static int
11002process_symbol_table (FILE * file)
11003{
11004  Elf_Internal_Shdr * section;
11005  bfd_size_type nbuckets = 0;
11006  bfd_size_type nchains = 0;
11007  bfd_vma * buckets = NULL;
11008  bfd_vma * chains = NULL;
11009  bfd_vma ngnubuckets = 0;
11010  bfd_vma * gnubuckets = NULL;
11011  bfd_vma * gnuchains = NULL;
11012  bfd_vma gnusymidx = 0;
11013  bfd_size_type ngnuchains = 0;
11014
11015  if (!do_syms && !do_dyn_syms && !do_histogram)
11016    return 1;
11017
11018  if (dynamic_info[DT_HASH]
11019      && (do_histogram
11020	  || (do_using_dynamic
11021	      && !do_dyn_syms
11022	      && dynamic_strings != NULL)))
11023    {
11024      unsigned char nb[8];
11025      unsigned char nc[8];
11026      unsigned int hash_ent_size = 4;
11027
11028      if ((elf_header.e_machine == EM_ALPHA
11029	   || elf_header.e_machine == EM_S390
11030	   || elf_header.e_machine == EM_S390_OLD)
11031	  && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
11032	hash_ent_size = 8;
11033
11034      if (fseek (file,
11035		 (archive_file_offset
11036		  + offset_from_vma (file, dynamic_info[DT_HASH],
11037				     sizeof nb + sizeof nc)),
11038		 SEEK_SET))
11039	{
11040	  error (_("Unable to seek to start of dynamic information\n"));
11041	  goto no_hash;
11042	}
11043
11044      if (fread (nb, hash_ent_size, 1, file) != 1)
11045	{
11046	  error (_("Failed to read in number of buckets\n"));
11047	  goto no_hash;
11048	}
11049
11050      if (fread (nc, hash_ent_size, 1, file) != 1)
11051	{
11052	  error (_("Failed to read in number of chains\n"));
11053	  goto no_hash;
11054	}
11055
11056      nbuckets = byte_get (nb, hash_ent_size);
11057      nchains  = byte_get (nc, hash_ent_size);
11058
11059      buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
11060      chains  = get_dynamic_data (file, nchains, hash_ent_size);
11061
11062    no_hash:
11063      if (buckets == NULL || chains == NULL)
11064	{
11065	  if (do_using_dynamic)
11066	    return 0;
11067	  free (buckets);
11068	  free (chains);
11069	  buckets = NULL;
11070	  chains = NULL;
11071	  nbuckets = 0;
11072	  nchains = 0;
11073	}
11074    }
11075
11076  if (dynamic_info_DT_GNU_HASH
11077      && (do_histogram
11078	  || (do_using_dynamic
11079	      && !do_dyn_syms
11080	      && dynamic_strings != NULL)))
11081    {
11082      unsigned char nb[16];
11083      bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
11084      bfd_vma buckets_vma;
11085
11086      if (fseek (file,
11087		 (archive_file_offset
11088		  + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
11089				     sizeof nb)),
11090		 SEEK_SET))
11091	{
11092	  error (_("Unable to seek to start of dynamic information\n"));
11093	  goto no_gnu_hash;
11094	}
11095
11096      if (fread (nb, 16, 1, file) != 1)
11097	{
11098	  error (_("Failed to read in number of buckets\n"));
11099	  goto no_gnu_hash;
11100	}
11101
11102      ngnubuckets = byte_get (nb, 4);
11103      gnusymidx = byte_get (nb + 4, 4);
11104      bitmaskwords = byte_get (nb + 8, 4);
11105      buckets_vma = dynamic_info_DT_GNU_HASH + 16;
11106      if (is_32bit_elf)
11107	buckets_vma += bitmaskwords * 4;
11108      else
11109	buckets_vma += bitmaskwords * 8;
11110
11111      if (fseek (file,
11112		 (archive_file_offset
11113		  + offset_from_vma (file, buckets_vma, 4)),
11114		 SEEK_SET))
11115	{
11116	  error (_("Unable to seek to start of dynamic information\n"));
11117	  goto no_gnu_hash;
11118	}
11119
11120      gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
11121
11122      if (gnubuckets == NULL)
11123	goto no_gnu_hash;
11124
11125      for (i = 0; i < ngnubuckets; i++)
11126	if (gnubuckets[i] != 0)
11127	  {
11128	    if (gnubuckets[i] < gnusymidx)
11129	      return 0;
11130
11131	    if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
11132	      maxchain = gnubuckets[i];
11133	  }
11134
11135      if (maxchain == 0xffffffff)
11136	goto no_gnu_hash;
11137
11138      maxchain -= gnusymidx;
11139
11140      if (fseek (file,
11141		 (archive_file_offset
11142		  + offset_from_vma (file, buckets_vma
11143					   + 4 * (ngnubuckets + maxchain), 4)),
11144		 SEEK_SET))
11145	{
11146	  error (_("Unable to seek to start of dynamic information\n"));
11147	  goto no_gnu_hash;
11148	}
11149
11150      do
11151	{
11152	  if (fread (nb, 4, 1, file) != 1)
11153	    {
11154	      error (_("Failed to determine last chain length\n"));
11155	      goto no_gnu_hash;
11156	    }
11157
11158	  if (maxchain + 1 == 0)
11159	    goto no_gnu_hash;
11160
11161	  ++maxchain;
11162	}
11163      while ((byte_get (nb, 4) & 1) == 0);
11164
11165      if (fseek (file,
11166		 (archive_file_offset
11167		  + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
11168		 SEEK_SET))
11169	{
11170	  error (_("Unable to seek to start of dynamic information\n"));
11171	  goto no_gnu_hash;
11172	}
11173
11174      gnuchains = get_dynamic_data (file, maxchain, 4);
11175      ngnuchains = maxchain;
11176
11177    no_gnu_hash:
11178      if (gnuchains == NULL)
11179	{
11180	  free (gnubuckets);
11181	  gnubuckets = NULL;
11182	  ngnubuckets = 0;
11183	  if (do_using_dynamic)
11184	    return 0;
11185	}
11186    }
11187
11188  if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
11189      && do_syms
11190      && do_using_dynamic
11191      && dynamic_strings != NULL
11192      && dynamic_symbols != NULL)
11193    {
11194      unsigned long hn;
11195
11196      if (dynamic_info[DT_HASH])
11197	{
11198	  bfd_vma si;
11199
11200	  printf (_("\nSymbol table for image:\n"));
11201	  if (is_32bit_elf)
11202	    printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
11203	  else
11204	    printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
11205
11206	  for (hn = 0; hn < nbuckets; hn++)
11207	    {
11208	      if (! buckets[hn])
11209		continue;
11210
11211	      for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
11212		print_dynamic_symbol (si, hn);
11213	    }
11214	}
11215
11216      if (dynamic_info_DT_GNU_HASH)
11217	{
11218	  printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
11219	  if (is_32bit_elf)
11220	    printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
11221	  else
11222	    printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
11223
11224	  for (hn = 0; hn < ngnubuckets; ++hn)
11225	    if (gnubuckets[hn] != 0)
11226	      {
11227		bfd_vma si = gnubuckets[hn];
11228		bfd_vma off = si - gnusymidx;
11229
11230		do
11231		  {
11232		    print_dynamic_symbol (si, hn);
11233		    si++;
11234		  }
11235		while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
11236	      }
11237	}
11238    }
11239  else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
11240	   && section_headers != NULL)
11241    {
11242      unsigned int i;
11243
11244      for (i = 0, section = section_headers;
11245	   i < elf_header.e_shnum;
11246	   i++, section++)
11247	{
11248	  unsigned int si;
11249	  char * strtab = NULL;
11250	  unsigned long int strtab_size = 0;
11251	  Elf_Internal_Sym * symtab;
11252	  Elf_Internal_Sym * psym;
11253	  unsigned long num_syms;
11254
11255	  if ((section->sh_type != SHT_SYMTAB
11256	       && section->sh_type != SHT_DYNSYM)
11257	      || (!do_syms
11258		  && section->sh_type == SHT_SYMTAB))
11259	    continue;
11260
11261	  if (section->sh_entsize == 0)
11262	    {
11263	      printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
11264		      printable_section_name (section));
11265	      continue;
11266	    }
11267
11268	  printf (_("\nSymbol table '%s' contains %lu entries:\n"),
11269		  printable_section_name (section),
11270		  (unsigned long) (section->sh_size / section->sh_entsize));
11271
11272	  if (is_32bit_elf)
11273	    printf (_("   Num:    Value  Size Type    Bind   Vis      Ndx Name\n"));
11274	  else
11275	    printf (_("   Num:    Value          Size Type    Bind   Vis      Ndx Name\n"));
11276
11277	  symtab = GET_ELF_SYMBOLS (file, section, & num_syms);
11278	  if (symtab == NULL)
11279	    continue;
11280
11281	  if (section->sh_link == elf_header.e_shstrndx)
11282	    {
11283	      strtab = string_table;
11284	      strtab_size = string_table_length;
11285	    }
11286	  else if (section->sh_link < elf_header.e_shnum)
11287	    {
11288	      Elf_Internal_Shdr * string_sec;
11289
11290	      string_sec = section_headers + section->sh_link;
11291
11292	      strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
11293                                          1, string_sec->sh_size,
11294                                          _("string table"));
11295	      strtab_size = strtab != NULL ? string_sec->sh_size : 0;
11296	    }
11297
11298	  for (si = 0, psym = symtab; si < num_syms; si++, psym++)
11299	    {
11300	      const char *version_string;
11301	      enum versioned_symbol_info sym_info;
11302	      unsigned short vna_other;
11303
11304	      printf ("%6d: ", si);
11305	      print_vma (psym->st_value, LONG_HEX);
11306	      putchar (' ');
11307	      print_vma (psym->st_size, DEC_5);
11308	      printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
11309	      printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
11310	      if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11311		printf (" %-7s",  get_solaris_symbol_visibility (psym->st_other));
11312	      else
11313		{
11314		  unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11315
11316		  printf (" %-7s", get_symbol_visibility (vis));
11317		  /* Check to see if any other bits in the st_other field are set.
11318		     Note - displaying this information disrupts the layout of the
11319		     table being generated, but for the moment this case is very rare.  */
11320		  if (psym->st_other ^ vis)
11321		    printf (" [%s] ", get_symbol_other (psym->st_other ^ vis));
11322		}
11323	      printf (" %4s ", get_symbol_index_type (psym->st_shndx));
11324	      print_symbol (25, psym->st_name < strtab_size
11325			    ? strtab + psym->st_name : _("<corrupt>"));
11326
11327	      version_string
11328		= get_symbol_version_string (file,
11329					     section->sh_type == SHT_DYNSYM,
11330					     strtab, strtab_size, si,
11331					     psym, &sym_info, &vna_other);
11332	      if (version_string)
11333		{
11334		  if (sym_info == symbol_undefined)
11335		    printf ("@%s (%d)", version_string, vna_other);
11336		  else
11337		    printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
11338			    version_string);
11339		}
11340
11341	      putchar ('\n');
11342
11343	      if (ELF_ST_BIND (psym->st_info) == STB_LOCAL
11344		  && si >= section->sh_info
11345		  /* Irix 5 and 6 MIPS binaries are known to ignore this requirement.  */
11346		  && elf_header.e_machine != EM_MIPS
11347		  /* Solaris binaries have been found to violate this requirement as
11348		     well.  Not sure if this is a bug or an ABI requirement.  */
11349		  && elf_header.e_ident[EI_OSABI] != ELFOSABI_SOLARIS)
11350		warn (_("local symbol %u found at index >= %s's sh_info value of %u\n"),
11351		      si, printable_section_name (section), section->sh_info);
11352	    }
11353
11354	  free (symtab);
11355	  if (strtab != string_table)
11356	    free (strtab);
11357	}
11358    }
11359  else if (do_syms)
11360    printf
11361      (_("\nDynamic symbol information is not available for displaying symbols.\n"));
11362
11363  if (do_histogram && buckets != NULL)
11364    {
11365      unsigned long * lengths;
11366      unsigned long * counts;
11367      unsigned long hn;
11368      bfd_vma si;
11369      unsigned long maxlength = 0;
11370      unsigned long nzero_counts = 0;
11371      unsigned long nsyms = 0;
11372      unsigned long chained;
11373
11374      printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
11375	      (unsigned long) nbuckets);
11376
11377      lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
11378      if (lengths == NULL)
11379	{
11380	  error (_("Out of memory allocating space for histogram buckets\n"));
11381	  return 0;
11382	}
11383
11384      printf (_(" Length  Number     %% of total  Coverage\n"));
11385      for (hn = 0; hn < nbuckets; ++hn)
11386	{
11387	  for (si = buckets[hn], chained = 0;
11388	       si > 0 && si < nchains && si < nbuckets && chained <= nchains;
11389	       si = chains[si], ++chained)
11390	    {
11391	      ++nsyms;
11392	      if (maxlength < ++lengths[hn])
11393		++maxlength;
11394	    }
11395
11396	    /* PR binutils/17531: A corrupt binary could contain broken
11397	       histogram data.  Do not go into an infinite loop trying
11398	       to process it.  */
11399	    if (chained > nchains)
11400	      {
11401		error (_("histogram chain is corrupt\n"));
11402		break;
11403	      }
11404	}
11405
11406      counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11407      if (counts == NULL)
11408	{
11409	  free (lengths);
11410	  error (_("Out of memory allocating space for histogram counts\n"));
11411	  return 0;
11412	}
11413
11414      for (hn = 0; hn < nbuckets; ++hn)
11415	++counts[lengths[hn]];
11416
11417      if (nbuckets > 0)
11418	{
11419	  unsigned long i;
11420	  printf ("      0  %-10lu (%5.1f%%)\n",
11421		  counts[0], (counts[0] * 100.0) / nbuckets);
11422	  for (i = 1; i <= maxlength; ++i)
11423	    {
11424	      nzero_counts += counts[i] * i;
11425	      printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
11426		      i, counts[i], (counts[i] * 100.0) / nbuckets,
11427		      (nzero_counts * 100.0) / nsyms);
11428	    }
11429	}
11430
11431      free (counts);
11432      free (lengths);
11433    }
11434
11435  if (buckets != NULL)
11436    {
11437      free (buckets);
11438      free (chains);
11439    }
11440
11441  if (do_histogram && gnubuckets != NULL)
11442    {
11443      unsigned long * lengths;
11444      unsigned long * counts;
11445      unsigned long hn;
11446      unsigned long maxlength = 0;
11447      unsigned long nzero_counts = 0;
11448      unsigned long nsyms = 0;
11449
11450      printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
11451	      (unsigned long) ngnubuckets);
11452
11453      lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
11454      if (lengths == NULL)
11455	{
11456	  error (_("Out of memory allocating space for gnu histogram buckets\n"));
11457	  return 0;
11458	}
11459
11460      printf (_(" Length  Number     %% of total  Coverage\n"));
11461
11462      for (hn = 0; hn < ngnubuckets; ++hn)
11463	if (gnubuckets[hn] != 0)
11464	  {
11465	    bfd_vma off, length = 1;
11466
11467	    for (off = gnubuckets[hn] - gnusymidx;
11468		 /* PR 17531 file: 010-77222-0.004.  */
11469		 off < ngnuchains && (gnuchains[off] & 1) == 0;
11470		 ++off)
11471	      ++length;
11472	    lengths[hn] = length;
11473	    if (length > maxlength)
11474	      maxlength = length;
11475	    nsyms += length;
11476	  }
11477
11478      counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11479      if (counts == NULL)
11480	{
11481	  free (lengths);
11482	  error (_("Out of memory allocating space for gnu histogram counts\n"));
11483	  return 0;
11484	}
11485
11486      for (hn = 0; hn < ngnubuckets; ++hn)
11487	++counts[lengths[hn]];
11488
11489      if (ngnubuckets > 0)
11490	{
11491	  unsigned long j;
11492	  printf ("      0  %-10lu (%5.1f%%)\n",
11493		  counts[0], (counts[0] * 100.0) / ngnubuckets);
11494	  for (j = 1; j <= maxlength; ++j)
11495	    {
11496	      nzero_counts += counts[j] * j;
11497	      printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
11498		      j, counts[j], (counts[j] * 100.0) / ngnubuckets,
11499		      (nzero_counts * 100.0) / nsyms);
11500	    }
11501	}
11502
11503      free (counts);
11504      free (lengths);
11505      free (gnubuckets);
11506      free (gnuchains);
11507    }
11508
11509  return 1;
11510}
11511
11512static int
11513process_syminfo (FILE * file ATTRIBUTE_UNUSED)
11514{
11515  unsigned int i;
11516
11517  if (dynamic_syminfo == NULL
11518      || !do_dynamic)
11519    /* No syminfo, this is ok.  */
11520    return 1;
11521
11522  /* There better should be a dynamic symbol section.  */
11523  if (dynamic_symbols == NULL || dynamic_strings == NULL)
11524    return 0;
11525
11526  if (dynamic_addr)
11527    printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
11528	    dynamic_syminfo_offset, dynamic_syminfo_nent);
11529
11530  printf (_(" Num: Name                           BoundTo     Flags\n"));
11531  for (i = 0; i < dynamic_syminfo_nent; ++i)
11532    {
11533      unsigned short int flags = dynamic_syminfo[i].si_flags;
11534
11535      printf ("%4d: ", i);
11536      if (i >= num_dynamic_syms)
11537	printf (_("<corrupt index>"));
11538      else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
11539	print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
11540      else
11541	printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
11542      putchar (' ');
11543
11544      switch (dynamic_syminfo[i].si_boundto)
11545	{
11546	case SYMINFO_BT_SELF:
11547	  fputs ("SELF       ", stdout);
11548	  break;
11549	case SYMINFO_BT_PARENT:
11550	  fputs ("PARENT     ", stdout);
11551	  break;
11552	default:
11553	  if (dynamic_syminfo[i].si_boundto > 0
11554	      && dynamic_syminfo[i].si_boundto < dynamic_nent
11555	      && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
11556	    {
11557	      print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
11558	      putchar (' ' );
11559	    }
11560	  else
11561	    printf ("%-10d ", dynamic_syminfo[i].si_boundto);
11562	  break;
11563	}
11564
11565      if (flags & SYMINFO_FLG_DIRECT)
11566	printf (" DIRECT");
11567      if (flags & SYMINFO_FLG_PASSTHRU)
11568	printf (" PASSTHRU");
11569      if (flags & SYMINFO_FLG_COPY)
11570	printf (" COPY");
11571      if (flags & SYMINFO_FLG_LAZYLOAD)
11572	printf (" LAZYLOAD");
11573
11574      puts ("");
11575    }
11576
11577  return 1;
11578}
11579
11580/* Check to see if the given reloc needs to be handled in a target specific
11581   manner.  If so then process the reloc and return TRUE otherwise return
11582   FALSE.  */
11583
11584static bfd_boolean
11585target_specific_reloc_handling (Elf_Internal_Rela * reloc,
11586				unsigned char *     start,
11587				Elf_Internal_Sym *  symtab)
11588{
11589  unsigned int reloc_type = get_reloc_type (reloc->r_info);
11590
11591  switch (elf_header.e_machine)
11592    {
11593    case EM_MSP430:
11594    case EM_MSP430_OLD:
11595      {
11596	static Elf_Internal_Sym * saved_sym = NULL;
11597
11598	switch (reloc_type)
11599	  {
11600	  case 10: /* R_MSP430_SYM_DIFF */
11601	    if (uses_msp430x_relocs ())
11602	      break;
11603	    /* Fall through.  */
11604	  case 21: /* R_MSP430X_SYM_DIFF */
11605	    saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11606	    return TRUE;
11607
11608	  case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
11609	  case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
11610	    goto handle_sym_diff;
11611
11612	  case 5: /* R_MSP430_16_BYTE */
11613	  case 9: /* R_MSP430_8 */
11614	    if (uses_msp430x_relocs ())
11615	      break;
11616	    goto handle_sym_diff;
11617
11618	  case 2: /* R_MSP430_ABS16 */
11619	  case 15: /* R_MSP430X_ABS16 */
11620	    if (! uses_msp430x_relocs ())
11621	      break;
11622	    goto handle_sym_diff;
11623
11624	  handle_sym_diff:
11625	    if (saved_sym != NULL)
11626	      {
11627		bfd_vma value;
11628
11629		value = reloc->r_addend
11630		  + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11631		     - saved_sym->st_value);
11632
11633		byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
11634
11635		saved_sym = NULL;
11636		return TRUE;
11637	      }
11638	    break;
11639
11640	  default:
11641	    if (saved_sym != NULL)
11642	      error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
11643	    break;
11644	  }
11645	break;
11646      }
11647
11648    case EM_MN10300:
11649    case EM_CYGNUS_MN10300:
11650      {
11651	static Elf_Internal_Sym * saved_sym = NULL;
11652
11653	switch (reloc_type)
11654	  {
11655	  case 34: /* R_MN10300_ALIGN */
11656	    return TRUE;
11657	  case 33: /* R_MN10300_SYM_DIFF */
11658	    saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11659	    return TRUE;
11660	  case 1: /* R_MN10300_32 */
11661	  case 2: /* R_MN10300_16 */
11662	    if (saved_sym != NULL)
11663	      {
11664		bfd_vma value;
11665
11666		value = reloc->r_addend
11667		  + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11668		     - saved_sym->st_value);
11669
11670		byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
11671
11672		saved_sym = NULL;
11673		return TRUE;
11674	      }
11675	    break;
11676	  default:
11677	    if (saved_sym != NULL)
11678	      error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
11679	    break;
11680	  }
11681	break;
11682      }
11683
11684    case EM_RL78:
11685      {
11686	static bfd_vma saved_sym1 = 0;
11687	static bfd_vma saved_sym2 = 0;
11688	static bfd_vma value;
11689
11690	switch (reloc_type)
11691	  {
11692	  case 0x80: /* R_RL78_SYM.  */
11693	    saved_sym1 = saved_sym2;
11694	    saved_sym2 = symtab[get_reloc_symindex (reloc->r_info)].st_value;
11695	    saved_sym2 += reloc->r_addend;
11696	    return TRUE;
11697
11698	  case 0x83: /* R_RL78_OPsub.  */
11699	    value = saved_sym1 - saved_sym2;
11700	    saved_sym2 = saved_sym1 = 0;
11701	    return TRUE;
11702	    break;
11703
11704	  case 0x41: /* R_RL78_ABS32.  */
11705	    byte_put (start + reloc->r_offset, value, 4);
11706	    value = 0;
11707	    return TRUE;
11708
11709	  case 0x43: /* R_RL78_ABS16.  */
11710	    byte_put (start + reloc->r_offset, value, 2);
11711	    value = 0;
11712	    return TRUE;
11713
11714	  default:
11715	    break;
11716	  }
11717	break;
11718      }
11719    }
11720
11721  return FALSE;
11722}
11723
11724/* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
11725   DWARF debug sections.  This is a target specific test.  Note - we do not
11726   go through the whole including-target-headers-multiple-times route, (as
11727   we have already done with <elf/h8.h>) because this would become very
11728   messy and even then this function would have to contain target specific
11729   information (the names of the relocs instead of their numeric values).
11730   FIXME: This is not the correct way to solve this problem.  The proper way
11731   is to have target specific reloc sizing and typing functions created by
11732   the reloc-macros.h header, in the same way that it already creates the
11733   reloc naming functions.  */
11734
11735static bfd_boolean
11736is_32bit_abs_reloc (unsigned int reloc_type)
11737{
11738  /* Please keep this table alpha-sorted for ease of visual lookup.  */
11739  switch (elf_header.e_machine)
11740    {
11741    case EM_386:
11742    case EM_IAMCU:
11743      return reloc_type == 1; /* R_386_32.  */
11744    case EM_68K:
11745      return reloc_type == 1; /* R_68K_32.  */
11746    case EM_860:
11747      return reloc_type == 1; /* R_860_32.  */
11748    case EM_960:
11749      return reloc_type == 2; /* R_960_32.  */
11750    case EM_AARCH64:
11751      return (reloc_type == 258
11752	      || reloc_type == 1); /* R_AARCH64_ABS32 || R_AARCH64_P32_ABS32 */
11753    case EM_ADAPTEVA_EPIPHANY:
11754      return reloc_type == 3;
11755    case EM_ALPHA:
11756      return reloc_type == 1; /* R_ALPHA_REFLONG.  */
11757    case EM_ARC:
11758      return reloc_type == 1; /* R_ARC_32.  */
11759    case EM_ARC_COMPACT:
11760    case EM_ARC_COMPACT2:
11761      return reloc_type == 4; /* R_ARC_32.  */
11762    case EM_ARM:
11763      return reloc_type == 2; /* R_ARM_ABS32 */
11764    case EM_AVR_OLD:
11765    case EM_AVR:
11766      return reloc_type == 1;
11767    case EM_BLACKFIN:
11768      return reloc_type == 0x12; /* R_byte4_data.  */
11769    case EM_CRIS:
11770      return reloc_type == 3; /* R_CRIS_32.  */
11771    case EM_CR16:
11772      return reloc_type == 3; /* R_CR16_NUM32.  */
11773    case EM_CRX:
11774      return reloc_type == 15; /* R_CRX_NUM32.  */
11775    case EM_CYGNUS_FRV:
11776      return reloc_type == 1;
11777    case EM_CYGNUS_D10V:
11778    case EM_D10V:
11779      return reloc_type == 6; /* R_D10V_32.  */
11780    case EM_CYGNUS_D30V:
11781    case EM_D30V:
11782      return reloc_type == 12; /* R_D30V_32_NORMAL.  */
11783    case EM_DLX:
11784      return reloc_type == 3; /* R_DLX_RELOC_32.  */
11785    case EM_CYGNUS_FR30:
11786    case EM_FR30:
11787      return reloc_type == 3; /* R_FR30_32.  */
11788    case EM_FT32:
11789      return reloc_type == 1; /* R_FT32_32.  */
11790    case EM_H8S:
11791    case EM_H8_300:
11792    case EM_H8_300H:
11793      return reloc_type == 1; /* R_H8_DIR32.  */
11794    case EM_IA_64:
11795      return reloc_type == 0x65 /* R_IA64_SECREL32LSB.  */
11796	|| reloc_type == 0x25;  /* R_IA64_DIR32LSB.  */
11797    case EM_IP2K_OLD:
11798    case EM_IP2K:
11799      return reloc_type == 2; /* R_IP2K_32.  */
11800    case EM_IQ2000:
11801      return reloc_type == 2; /* R_IQ2000_32.  */
11802    case EM_LATTICEMICO32:
11803      return reloc_type == 3; /* R_LM32_32.  */
11804    case EM_M32C_OLD:
11805    case EM_M32C:
11806      return reloc_type == 3; /* R_M32C_32.  */
11807    case EM_M32R:
11808      return reloc_type == 34; /* R_M32R_32_RELA.  */
11809    case EM_68HC11:
11810    case EM_68HC12:
11811      return reloc_type == 6; /* R_M68HC11_32.  */
11812    case EM_MCORE:
11813      return reloc_type == 1; /* R_MCORE_ADDR32.  */
11814    case EM_CYGNUS_MEP:
11815      return reloc_type == 4; /* R_MEP_32.  */
11816    case EM_METAG:
11817      return reloc_type == 2; /* R_METAG_ADDR32.  */
11818    case EM_MICROBLAZE:
11819      return reloc_type == 1; /* R_MICROBLAZE_32.  */
11820    case EM_MIPS:
11821      return reloc_type == 2; /* R_MIPS_32.  */
11822    case EM_MMIX:
11823      return reloc_type == 4; /* R_MMIX_32.  */
11824    case EM_CYGNUS_MN10200:
11825    case EM_MN10200:
11826      return reloc_type == 1; /* R_MN10200_32.  */
11827    case EM_CYGNUS_MN10300:
11828    case EM_MN10300:
11829      return reloc_type == 1; /* R_MN10300_32.  */
11830    case EM_MOXIE:
11831      return reloc_type == 1; /* R_MOXIE_32.  */
11832    case EM_MSP430_OLD:
11833    case EM_MSP430:
11834      return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32.  */
11835    case EM_MT:
11836      return reloc_type == 2; /* R_MT_32.  */
11837    case EM_NDS32:
11838      return reloc_type == 20; /* R_NDS32_RELA.  */
11839    case EM_ALTERA_NIOS2:
11840      return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32.  */
11841    case EM_NIOS32:
11842      return reloc_type == 1; /* R_NIOS_32.  */
11843    case EM_OR1K:
11844      return reloc_type == 1; /* R_OR1K_32.  */
11845    case EM_PARISC:
11846      return (reloc_type == 1 /* R_PARISC_DIR32.  */
11847	      || reloc_type == 41); /* R_PARISC_SECREL32.  */
11848    case EM_PJ:
11849    case EM_PJ_OLD:
11850      return reloc_type == 1; /* R_PJ_DATA_DIR32.  */
11851    case EM_PPC64:
11852      return reloc_type == 1; /* R_PPC64_ADDR32.  */
11853    case EM_PPC:
11854      return reloc_type == 1; /* R_PPC_ADDR32.  */
11855    case EM_RISCV:
11856      return reloc_type == 1; /* R_RISCV_32.  */
11857    case EM_RL78:
11858      return reloc_type == 1; /* R_RL78_DIR32.  */
11859    case EM_RX:
11860      return reloc_type == 1; /* R_RX_DIR32.  */
11861    case EM_S370:
11862      return reloc_type == 1; /* R_I370_ADDR31.  */
11863    case EM_S390_OLD:
11864    case EM_S390:
11865      return reloc_type == 4; /* R_S390_32.  */
11866    case EM_SCORE:
11867      return reloc_type == 8; /* R_SCORE_ABS32.  */
11868    case EM_SH:
11869      return reloc_type == 1; /* R_SH_DIR32.  */
11870    case EM_SPARC32PLUS:
11871    case EM_SPARCV9:
11872    case EM_SPARC:
11873      return reloc_type == 3 /* R_SPARC_32.  */
11874	|| reloc_type == 23; /* R_SPARC_UA32.  */
11875    case EM_SPU:
11876      return reloc_type == 6; /* R_SPU_ADDR32 */
11877    case EM_TI_C6000:
11878      return reloc_type == 1; /* R_C6000_ABS32.  */
11879    case EM_TILEGX:
11880      return reloc_type == 2; /* R_TILEGX_32.  */
11881    case EM_TILEPRO:
11882      return reloc_type == 1; /* R_TILEPRO_32.  */
11883    case EM_CYGNUS_V850:
11884    case EM_V850:
11885      return reloc_type == 6; /* R_V850_ABS32.  */
11886    case EM_V800:
11887      return reloc_type == 0x33; /* R_V810_WORD.  */
11888    case EM_VAX:
11889      return reloc_type == 1; /* R_VAX_32.  */
11890    case EM_VISIUM:
11891      return reloc_type == 3;  /* R_VISIUM_32. */
11892    case EM_X86_64:
11893    case EM_L1OM:
11894    case EM_K1OM:
11895      return reloc_type == 10; /* R_X86_64_32.  */
11896    case EM_XC16X:
11897    case EM_C166:
11898      return reloc_type == 3; /* R_XC16C_ABS_32.  */
11899    case EM_XGATE:
11900      return reloc_type == 4; /* R_XGATE_32.  */
11901    case EM_XSTORMY16:
11902      return reloc_type == 1; /* R_XSTROMY16_32.  */
11903    case EM_XTENSA_OLD:
11904    case EM_XTENSA:
11905      return reloc_type == 1; /* R_XTENSA_32.  */
11906    default:
11907      {
11908	static unsigned int prev_warn = 0;
11909
11910	/* Avoid repeating the same warning multiple times.  */
11911	if (prev_warn != elf_header.e_machine)
11912	  error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
11913		 elf_header.e_machine);
11914	prev_warn = elf_header.e_machine;
11915	return FALSE;
11916      }
11917    }
11918}
11919
11920/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11921   a 32-bit pc-relative RELA relocation used in DWARF debug sections.  */
11922
11923static bfd_boolean
11924is_32bit_pcrel_reloc (unsigned int reloc_type)
11925{
11926  switch (elf_header.e_machine)
11927  /* Please keep this table alpha-sorted for ease of visual lookup.  */
11928    {
11929    case EM_386:
11930    case EM_IAMCU:
11931      return reloc_type == 2;  /* R_386_PC32.  */
11932    case EM_68K:
11933      return reloc_type == 4;  /* R_68K_PC32.  */
11934    case EM_AARCH64:
11935      return reloc_type == 261; /* R_AARCH64_PREL32 */
11936    case EM_ADAPTEVA_EPIPHANY:
11937      return reloc_type == 6;
11938    case EM_ALPHA:
11939      return reloc_type == 10; /* R_ALPHA_SREL32.  */
11940    case EM_ARC_COMPACT:
11941    case EM_ARC_COMPACT2:
11942      return reloc_type == 49; /* R_ARC_32_PCREL.  */
11943    case EM_ARM:
11944      return reloc_type == 3;  /* R_ARM_REL32 */
11945    case EM_AVR_OLD:
11946    case EM_AVR:
11947      return reloc_type == 36; /* R_AVR_32_PCREL.  */
11948    case EM_MICROBLAZE:
11949      return reloc_type == 2;  /* R_MICROBLAZE_32_PCREL.  */
11950    case EM_OR1K:
11951      return reloc_type == 9; /* R_OR1K_32_PCREL.  */
11952    case EM_PARISC:
11953      return reloc_type == 9;  /* R_PARISC_PCREL32.  */
11954    case EM_PPC:
11955      return reloc_type == 26; /* R_PPC_REL32.  */
11956    case EM_PPC64:
11957      return reloc_type == 26; /* R_PPC64_REL32.  */
11958    case EM_S390_OLD:
11959    case EM_S390:
11960      return reloc_type == 5;  /* R_390_PC32.  */
11961    case EM_SH:
11962      return reloc_type == 2;  /* R_SH_REL32.  */
11963    case EM_SPARC32PLUS:
11964    case EM_SPARCV9:
11965    case EM_SPARC:
11966      return reloc_type == 6;  /* R_SPARC_DISP32.  */
11967    case EM_SPU:
11968      return reloc_type == 13; /* R_SPU_REL32.  */
11969    case EM_TILEGX:
11970      return reloc_type == 6; /* R_TILEGX_32_PCREL.  */
11971    case EM_TILEPRO:
11972      return reloc_type == 4; /* R_TILEPRO_32_PCREL.  */
11973    case EM_VISIUM:
11974      return reloc_type == 6;  /* R_VISIUM_32_PCREL */
11975    case EM_X86_64:
11976    case EM_L1OM:
11977    case EM_K1OM:
11978      return reloc_type == 2;  /* R_X86_64_PC32.  */
11979    case EM_XTENSA_OLD:
11980    case EM_XTENSA:
11981      return reloc_type == 14; /* R_XTENSA_32_PCREL.  */
11982    default:
11983      /* Do not abort or issue an error message here.  Not all targets use
11984	 pc-relative 32-bit relocs in their DWARF debug information and we
11985	 have already tested for target coverage in is_32bit_abs_reloc.  A
11986	 more helpful warning message will be generated by apply_relocations
11987	 anyway, so just return.  */
11988      return FALSE;
11989    }
11990}
11991
11992/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11993   a 64-bit absolute RELA relocation used in DWARF debug sections.  */
11994
11995static bfd_boolean
11996is_64bit_abs_reloc (unsigned int reloc_type)
11997{
11998  switch (elf_header.e_machine)
11999    {
12000    case EM_AARCH64:
12001      return reloc_type == 257;	/* R_AARCH64_ABS64.  */
12002    case EM_ALPHA:
12003      return reloc_type == 2; /* R_ALPHA_REFQUAD.  */
12004    case EM_IA_64:
12005      return reloc_type == 0x27; /* R_IA64_DIR64LSB.  */
12006    case EM_PARISC:
12007      return reloc_type == 80; /* R_PARISC_DIR64.  */
12008    case EM_PPC64:
12009      return reloc_type == 38; /* R_PPC64_ADDR64.  */
12010    case EM_RISCV:
12011      return reloc_type == 2; /* R_RISCV_64.  */
12012    case EM_SPARC32PLUS:
12013    case EM_SPARCV9:
12014    case EM_SPARC:
12015      return reloc_type == 54; /* R_SPARC_UA64.  */
12016    case EM_X86_64:
12017    case EM_L1OM:
12018    case EM_K1OM:
12019      return reloc_type == 1; /* R_X86_64_64.  */
12020    case EM_S390_OLD:
12021    case EM_S390:
12022      return reloc_type == 22;	/* R_S390_64.  */
12023    case EM_TILEGX:
12024      return reloc_type == 1; /* R_TILEGX_64.  */
12025    case EM_MIPS:
12026      return reloc_type == 18;	/* R_MIPS_64.  */
12027    default:
12028      return FALSE;
12029    }
12030}
12031
12032/* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
12033   a 64-bit pc-relative RELA relocation used in DWARF debug sections.  */
12034
12035static bfd_boolean
12036is_64bit_pcrel_reloc (unsigned int reloc_type)
12037{
12038  switch (elf_header.e_machine)
12039    {
12040    case EM_AARCH64:
12041      return reloc_type == 260;	/* R_AARCH64_PREL64.  */
12042    case EM_ALPHA:
12043      return reloc_type == 11; /* R_ALPHA_SREL64.  */
12044    case EM_IA_64:
12045      return reloc_type == 0x4f; /* R_IA64_PCREL64LSB.  */
12046    case EM_PARISC:
12047      return reloc_type == 72; /* R_PARISC_PCREL64.  */
12048    case EM_PPC64:
12049      return reloc_type == 44; /* R_PPC64_REL64.  */
12050    case EM_SPARC32PLUS:
12051    case EM_SPARCV9:
12052    case EM_SPARC:
12053      return reloc_type == 46; /* R_SPARC_DISP64.  */
12054    case EM_X86_64:
12055    case EM_L1OM:
12056    case EM_K1OM:
12057      return reloc_type == 24; /* R_X86_64_PC64.  */
12058    case EM_S390_OLD:
12059    case EM_S390:
12060      return reloc_type == 23;	/* R_S390_PC64.  */
12061    case EM_TILEGX:
12062      return reloc_type == 5;  /* R_TILEGX_64_PCREL.  */
12063    default:
12064      return FALSE;
12065    }
12066}
12067
12068/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12069   a 24-bit absolute RELA relocation used in DWARF debug sections.  */
12070
12071static bfd_boolean
12072is_24bit_abs_reloc (unsigned int reloc_type)
12073{
12074  switch (elf_header.e_machine)
12075    {
12076    case EM_CYGNUS_MN10200:
12077    case EM_MN10200:
12078      return reloc_type == 4; /* R_MN10200_24.  */
12079    case EM_FT32:
12080      return reloc_type == 5; /* R_FT32_20.  */
12081    default:
12082      return FALSE;
12083    }
12084}
12085
12086/* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12087   a 16-bit absolute RELA relocation used in DWARF debug sections.  */
12088
12089static bfd_boolean
12090is_16bit_abs_reloc (unsigned int reloc_type)
12091{
12092  /* Please keep this table alpha-sorted for ease of visual lookup.  */
12093  switch (elf_header.e_machine)
12094    {
12095    case EM_ARC:
12096    case EM_ARC_COMPACT:
12097    case EM_ARC_COMPACT2:
12098      return reloc_type == 2; /* R_ARC_16.  */
12099    case EM_ADAPTEVA_EPIPHANY:
12100      return reloc_type == 5;
12101    case EM_AVR_OLD:
12102    case EM_AVR:
12103      return reloc_type == 4; /* R_AVR_16.  */
12104    case EM_CYGNUS_D10V:
12105    case EM_D10V:
12106      return reloc_type == 3; /* R_D10V_16.  */
12107    case EM_H8S:
12108    case EM_H8_300:
12109    case EM_H8_300H:
12110      return reloc_type == R_H8_DIR16;
12111    case EM_IP2K_OLD:
12112    case EM_IP2K:
12113      return reloc_type == 1; /* R_IP2K_16.  */
12114    case EM_M32C_OLD:
12115    case EM_M32C:
12116      return reloc_type == 1; /* R_M32C_16 */
12117    case EM_CYGNUS_MN10200:
12118    case EM_MN10200:
12119      return reloc_type == 2; /* R_MN10200_16.  */
12120    case EM_CYGNUS_MN10300:
12121    case EM_MN10300:
12122      return reloc_type == 2; /* R_MN10300_16.  */
12123    case EM_MSP430:
12124      if (uses_msp430x_relocs ())
12125	return reloc_type == 2; /* R_MSP430_ABS16.  */
12126      /* Fall through.  */
12127    case EM_MSP430_OLD:
12128      return reloc_type == 5; /* R_MSP430_16_BYTE.  */
12129    case EM_NDS32:
12130      return reloc_type == 19; /* R_NDS32_RELA.  */
12131    case EM_ALTERA_NIOS2:
12132      return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16.  */
12133    case EM_NIOS32:
12134      return reloc_type == 9; /* R_NIOS_16.  */
12135    case EM_OR1K:
12136      return reloc_type == 2; /* R_OR1K_16.  */
12137    case EM_TI_C6000:
12138      return reloc_type == 2; /* R_C6000_ABS16.  */
12139    case EM_VISIUM:
12140      return reloc_type == 2; /* R_VISIUM_16. */
12141    case EM_XC16X:
12142    case EM_C166:
12143      return reloc_type == 2; /* R_XC16C_ABS_16.  */
12144    case EM_XGATE:
12145      return reloc_type == 3; /* R_XGATE_16.  */
12146    default:
12147      return FALSE;
12148    }
12149}
12150
12151/* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
12152   relocation entries (possibly formerly used for SHT_GROUP sections).  */
12153
12154static bfd_boolean
12155is_none_reloc (unsigned int reloc_type)
12156{
12157  switch (elf_header.e_machine)
12158    {
12159    case EM_386:     /* R_386_NONE.  */
12160    case EM_68K:     /* R_68K_NONE.  */
12161    case EM_ADAPTEVA_EPIPHANY:
12162    case EM_ALPHA:   /* R_ALPHA_NONE.  */
12163    case EM_ALTERA_NIOS2: /* R_NIOS2_NONE.  */
12164    case EM_ARC:     /* R_ARC_NONE.  */
12165    case EM_ARC_COMPACT2: /* R_ARC_NONE.  */
12166    case EM_ARC_COMPACT: /* R_ARC_NONE.  */
12167    case EM_ARM:     /* R_ARM_NONE.  */
12168    case EM_C166:    /* R_XC16X_NONE.  */
12169    case EM_CRIS:    /* R_CRIS_NONE.  */
12170    case EM_FT32:    /* R_FT32_NONE.  */
12171    case EM_IA_64:   /* R_IA64_NONE.  */
12172    case EM_K1OM:    /* R_X86_64_NONE.  */
12173    case EM_L1OM:    /* R_X86_64_NONE.  */
12174    case EM_M32R:    /* R_M32R_NONE.  */
12175    case EM_MIPS:    /* R_MIPS_NONE.  */
12176    case EM_MN10300: /* R_MN10300_NONE.  */
12177    case EM_MOXIE:   /* R_MOXIE_NONE.  */
12178    case EM_NIOS32:  /* R_NIOS_NONE.  */
12179    case EM_OR1K:    /* R_OR1K_NONE. */
12180    case EM_PARISC:  /* R_PARISC_NONE.  */
12181    case EM_PPC64:   /* R_PPC64_NONE.  */
12182    case EM_PPC:     /* R_PPC_NONE.  */
12183    case EM_RISCV:   /* R_RISCV_NONE.  */
12184    case EM_S390:    /* R_390_NONE.  */
12185    case EM_S390_OLD:
12186    case EM_SH:      /* R_SH_NONE.  */
12187    case EM_SPARC32PLUS:
12188    case EM_SPARC:   /* R_SPARC_NONE.  */
12189    case EM_SPARCV9:
12190    case EM_TILEGX:  /* R_TILEGX_NONE.  */
12191    case EM_TILEPRO: /* R_TILEPRO_NONE.  */
12192    case EM_TI_C6000:/* R_C6000_NONE.  */
12193    case EM_X86_64:  /* R_X86_64_NONE.  */
12194    case EM_XC16X:
12195      return reloc_type == 0;
12196
12197    case EM_AARCH64:
12198      return reloc_type == 0 || reloc_type == 256;
12199    case EM_AVR_OLD:
12200    case EM_AVR:
12201      return (reloc_type == 0 /* R_AVR_NONE.  */
12202	      || reloc_type == 30 /* R_AVR_DIFF8.  */
12203	      || reloc_type == 31 /* R_AVR_DIFF16.  */
12204	      || reloc_type == 32 /* R_AVR_DIFF32.  */);
12205    case EM_METAG:
12206      return reloc_type == 3; /* R_METAG_NONE.  */
12207    case EM_NDS32:
12208      return (reloc_type == 0       /* R_XTENSA_NONE.  */
12209	      || reloc_type == 204  /* R_NDS32_DIFF8.  */
12210	      || reloc_type == 205  /* R_NDS32_DIFF16.  */
12211	      || reloc_type == 206  /* R_NDS32_DIFF32.  */
12212	      || reloc_type == 207  /* R_NDS32_ULEB128.  */);
12213    case EM_XTENSA_OLD:
12214    case EM_XTENSA:
12215      return (reloc_type == 0      /* R_XTENSA_NONE.  */
12216	      || reloc_type == 17  /* R_XTENSA_DIFF8.  */
12217	      || reloc_type == 18  /* R_XTENSA_DIFF16.  */
12218	      || reloc_type == 19  /* R_XTENSA_DIFF32.  */);
12219    }
12220  return FALSE;
12221}
12222
12223/* Returns TRUE if there is a relocation against
12224   section NAME at OFFSET bytes.  */
12225
12226bfd_boolean
12227reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
12228{
12229  Elf_Internal_Rela * relocs;
12230  Elf_Internal_Rela * rp;
12231
12232  if (dsec == NULL || dsec->reloc_info == NULL)
12233    return FALSE;
12234
12235  relocs = (Elf_Internal_Rela *) dsec->reloc_info;
12236
12237  for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
12238    if (rp->r_offset == offset)
12239      return TRUE;
12240
12241   return FALSE;
12242}
12243
12244/* Apply relocations to a section.
12245   Note: So far support has been added only for those relocations
12246   which can be found in debug sections.
12247   If RELOCS_RETURN is non-NULL then returns in it a pointer to the
12248   loaded relocs.  It is then the caller's responsibility to free them.
12249   FIXME: Add support for more relocations ?  */
12250
12251static void
12252apply_relocations (void *                     file,
12253		   const Elf_Internal_Shdr *  section,
12254		   unsigned char *            start,
12255		   bfd_size_type              size,
12256		   void **                    relocs_return,
12257		   unsigned long *            num_relocs_return)
12258{
12259  Elf_Internal_Shdr * relsec;
12260  unsigned char * end = start + size;
12261
12262  if (relocs_return != NULL)
12263    {
12264      * (Elf_Internal_Rela **) relocs_return = NULL;
12265      * num_relocs_return = 0;
12266    }
12267
12268  if (elf_header.e_type != ET_REL)
12269    return;
12270
12271  /* Find the reloc section associated with the section.  */
12272  for (relsec = section_headers;
12273       relsec < section_headers + elf_header.e_shnum;
12274       ++relsec)
12275    {
12276      bfd_boolean is_rela;
12277      unsigned long num_relocs;
12278      Elf_Internal_Rela * relocs;
12279      Elf_Internal_Rela * rp;
12280      Elf_Internal_Shdr * symsec;
12281      Elf_Internal_Sym * symtab;
12282      unsigned long num_syms;
12283      Elf_Internal_Sym * sym;
12284
12285      if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12286	  || relsec->sh_info >= elf_header.e_shnum
12287	  || section_headers + relsec->sh_info != section
12288	  || relsec->sh_size == 0
12289	  || relsec->sh_link >= elf_header.e_shnum)
12290	continue;
12291
12292      is_rela = relsec->sh_type == SHT_RELA;
12293
12294      if (is_rela)
12295	{
12296	  if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
12297                                  relsec->sh_size, & relocs, & num_relocs))
12298	    return;
12299	}
12300      else
12301	{
12302	  if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
12303                                 relsec->sh_size, & relocs, & num_relocs))
12304	    return;
12305	}
12306
12307      /* SH uses RELA but uses in place value instead of the addend field.  */
12308      if (elf_header.e_machine == EM_SH)
12309	is_rela = FALSE;
12310
12311      symsec = section_headers + relsec->sh_link;
12312      if (symsec->sh_type != SHT_SYMTAB
12313	  && symsec->sh_type != SHT_DYNSYM)
12314	return;
12315      symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec, & num_syms);
12316
12317      for (rp = relocs; rp < relocs + num_relocs; ++rp)
12318	{
12319	  bfd_vma         addend;
12320	  unsigned int    reloc_type;
12321	  unsigned int    reloc_size;
12322	  unsigned char * rloc;
12323	  unsigned long   sym_index;
12324
12325	  reloc_type = get_reloc_type (rp->r_info);
12326
12327	  if (target_specific_reloc_handling (rp, start, symtab))
12328	    continue;
12329	  else if (is_none_reloc (reloc_type))
12330	    continue;
12331	  else if (is_32bit_abs_reloc (reloc_type)
12332		   || is_32bit_pcrel_reloc (reloc_type))
12333	    reloc_size = 4;
12334	  else if (is_64bit_abs_reloc (reloc_type)
12335		   || is_64bit_pcrel_reloc (reloc_type))
12336	    reloc_size = 8;
12337	  else if (is_24bit_abs_reloc (reloc_type))
12338	    reloc_size = 3;
12339	  else if (is_16bit_abs_reloc (reloc_type))
12340	    reloc_size = 2;
12341	  else
12342	    {
12343	      static unsigned int prev_reloc = 0;
12344	      if (reloc_type != prev_reloc)
12345		warn (_("unable to apply unsupported reloc type %d to section %s\n"),
12346		      reloc_type, printable_section_name (section));
12347	      prev_reloc = reloc_type;
12348	      continue;
12349	    }
12350
12351	  rloc = start + rp->r_offset;
12352	  if ((rloc + reloc_size) > end || (rloc < start))
12353	    {
12354	      warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
12355		    (unsigned long) rp->r_offset,
12356		    printable_section_name (section));
12357	      continue;
12358	    }
12359
12360	  sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
12361	  if (sym_index >= num_syms)
12362	    {
12363	      warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
12364		    sym_index, printable_section_name (section));
12365	      continue;
12366	    }
12367	  sym = symtab + sym_index;
12368
12369	  /* If the reloc has a symbol associated with it,
12370	     make sure that it is of an appropriate type.
12371
12372	     Relocations against symbols without type can happen.
12373	     Gcc -feliminate-dwarf2-dups may generate symbols
12374	     without type for debug info.
12375
12376	     Icc generates relocations against function symbols
12377	     instead of local labels.
12378
12379	     Relocations against object symbols can happen, eg when
12380	     referencing a global array.  For an example of this see
12381	     the _clz.o binary in libgcc.a.  */
12382	  if (sym != symtab
12383	      && ELF_ST_TYPE (sym->st_info) != STT_COMMON
12384	      && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
12385	    {
12386	      warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
12387		    get_symbol_type (ELF_ST_TYPE (sym->st_info)),
12388		    (long int)(rp - relocs),
12389		    printable_section_name (relsec));
12390	      continue;
12391	    }
12392
12393	  addend = 0;
12394	  if (is_rela)
12395	    addend += rp->r_addend;
12396	  /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
12397	     partial_inplace.  */
12398	  if (!is_rela
12399	      || (elf_header.e_machine == EM_XTENSA
12400		  && reloc_type == 1)
12401	      || ((elf_header.e_machine == EM_PJ
12402		   || elf_header.e_machine == EM_PJ_OLD)
12403		  && reloc_type == 1)
12404	      || ((elf_header.e_machine == EM_D30V
12405		   || elf_header.e_machine == EM_CYGNUS_D30V)
12406		  && reloc_type == 12))
12407	    addend += byte_get (rloc, reloc_size);
12408
12409	  if (is_32bit_pcrel_reloc (reloc_type)
12410	      || is_64bit_pcrel_reloc (reloc_type))
12411	    {
12412	      /* On HPPA, all pc-relative relocations are biased by 8.  */
12413	      if (elf_header.e_machine == EM_PARISC)
12414		addend -= 8;
12415	      byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
12416		        reloc_size);
12417	    }
12418	  else
12419	    byte_put (rloc, addend + sym->st_value, reloc_size);
12420	}
12421
12422      free (symtab);
12423
12424      if (relocs_return)
12425	{
12426	  * (Elf_Internal_Rela **) relocs_return = relocs;
12427	  * num_relocs_return = num_relocs;
12428	}
12429      else
12430	free (relocs);
12431
12432      break;
12433    }
12434}
12435
12436#ifdef SUPPORT_DISASSEMBLY
12437static int
12438disassemble_section (Elf_Internal_Shdr * section, FILE * file)
12439{
12440  printf (_("\nAssembly dump of section %s\n"), printable_section_name (section));
12441
12442  /* FIXME: XXX -- to be done --- XXX */
12443
12444  return 1;
12445}
12446#endif
12447
12448/* Reads in the contents of SECTION from FILE, returning a pointer
12449   to a malloc'ed buffer or NULL if something went wrong.  */
12450
12451static char *
12452get_section_contents (Elf_Internal_Shdr * section, FILE * file)
12453{
12454  bfd_size_type num_bytes;
12455
12456  num_bytes = section->sh_size;
12457
12458  if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
12459    {
12460      printf (_("\nSection '%s' has no data to dump.\n"),
12461	      printable_section_name (section));
12462      return NULL;
12463    }
12464
12465  return  (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
12466                             _("section contents"));
12467}
12468
12469/* Uncompresses a section that was compressed using zlib, in place.  */
12470
12471static bfd_boolean
12472uncompress_section_contents (unsigned char **buffer,
12473			     dwarf_size_type uncompressed_size,
12474			     dwarf_size_type *size)
12475{
12476  dwarf_size_type compressed_size = *size;
12477  unsigned char * compressed_buffer = *buffer;
12478  unsigned char * uncompressed_buffer;
12479  z_stream strm;
12480  int rc;
12481
12482  /* It is possible the section consists of several compressed
12483     buffers concatenated together, so we uncompress in a loop.  */
12484  /* PR 18313: The state field in the z_stream structure is supposed
12485     to be invisible to the user (ie us), but some compilers will
12486     still complain about it being used without initialisation.  So
12487     we first zero the entire z_stream structure and then set the fields
12488     that we need.  */
12489  memset (& strm, 0, sizeof strm);
12490  strm.avail_in = compressed_size;
12491  strm.next_in = (Bytef *) compressed_buffer;
12492  strm.avail_out = uncompressed_size;
12493  uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
12494
12495  rc = inflateInit (& strm);
12496  while (strm.avail_in > 0)
12497    {
12498      if (rc != Z_OK)
12499        goto fail;
12500      strm.next_out = ((Bytef *) uncompressed_buffer
12501                       + (uncompressed_size - strm.avail_out));
12502      rc = inflate (&strm, Z_FINISH);
12503      if (rc != Z_STREAM_END)
12504        goto fail;
12505      rc = inflateReset (& strm);
12506    }
12507  rc = inflateEnd (& strm);
12508  if (rc != Z_OK
12509      || strm.avail_out != 0)
12510    goto fail;
12511
12512  *buffer = uncompressed_buffer;
12513  *size = uncompressed_size;
12514  return TRUE;
12515
12516 fail:
12517  free (uncompressed_buffer);
12518  /* Indicate decompression failure.  */
12519  *buffer = NULL;
12520  return FALSE;
12521}
12522
12523static void
12524dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
12525{
12526  Elf_Internal_Shdr *  relsec;
12527  bfd_size_type        num_bytes;
12528  unsigned char *      data;
12529  unsigned char *      end;
12530  unsigned char *      real_start;
12531  unsigned char *      start;
12532  bfd_boolean          some_strings_shown;
12533
12534  real_start = start = (unsigned char *) get_section_contents (section,
12535							       file);
12536  if (start == NULL)
12537    return;
12538  num_bytes = section->sh_size;
12539
12540  printf (_("\nString dump of section '%s':\n"), printable_section_name (section));
12541
12542  if (decompress_dumps)
12543    {
12544      dwarf_size_type new_size = num_bytes;
12545      dwarf_size_type uncompressed_size = 0;
12546
12547      if ((section->sh_flags & SHF_COMPRESSED) != 0)
12548	{
12549	  Elf_Internal_Chdr chdr;
12550	  unsigned int compression_header_size
12551	    = get_compression_header (& chdr, (unsigned char *) start);
12552
12553	  if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12554	    {
12555	      warn (_("section '%s' has unsupported compress type: %d\n"),
12556		    printable_section_name (section), chdr.ch_type);
12557	      return;
12558	    }
12559	  else if (chdr.ch_addralign != section->sh_addralign)
12560	    {
12561	      warn (_("compressed section '%s' is corrupted\n"),
12562		    printable_section_name (section));
12563	      return;
12564	    }
12565	  uncompressed_size = chdr.ch_size;
12566	  start += compression_header_size;
12567	  new_size -= compression_header_size;
12568	}
12569      else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12570	{
12571	  /* Read the zlib header.  In this case, it should be "ZLIB"
12572	     followed by the uncompressed section size, 8 bytes in
12573	     big-endian order.  */
12574	  uncompressed_size = start[4]; uncompressed_size <<= 8;
12575	  uncompressed_size += start[5]; uncompressed_size <<= 8;
12576	  uncompressed_size += start[6]; uncompressed_size <<= 8;
12577	  uncompressed_size += start[7]; uncompressed_size <<= 8;
12578	  uncompressed_size += start[8]; uncompressed_size <<= 8;
12579	  uncompressed_size += start[9]; uncompressed_size <<= 8;
12580	  uncompressed_size += start[10]; uncompressed_size <<= 8;
12581	  uncompressed_size += start[11];
12582	  start += 12;
12583	  new_size -= 12;
12584	}
12585
12586      if (uncompressed_size
12587	  && uncompress_section_contents (& start,
12588					  uncompressed_size, & new_size))
12589	num_bytes = new_size;
12590    }
12591
12592  /* If the section being dumped has relocations against it the user might
12593     be expecting these relocations to have been applied.  Check for this
12594     case and issue a warning message in order to avoid confusion.
12595     FIXME: Maybe we ought to have an option that dumps a section with
12596     relocs applied ?  */
12597  for (relsec = section_headers;
12598       relsec < section_headers + elf_header.e_shnum;
12599       ++relsec)
12600    {
12601      if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12602	  || relsec->sh_info >= elf_header.e_shnum
12603	  || section_headers + relsec->sh_info != section
12604	  || relsec->sh_size == 0
12605	  || relsec->sh_link >= elf_header.e_shnum)
12606	continue;
12607
12608      printf (_("  Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12609      break;
12610    }
12611
12612  data = start;
12613  end  = start + num_bytes;
12614  some_strings_shown = FALSE;
12615
12616  while (data < end)
12617    {
12618      while (!ISPRINT (* data))
12619	if (++ data >= end)
12620	  break;
12621
12622      if (data < end)
12623	{
12624	  size_t maxlen = end - data;
12625
12626#ifndef __MSVCRT__
12627	  /* PR 11128: Use two separate invocations in order to work
12628             around bugs in the Solaris 8 implementation of printf.  */
12629	  printf ("  [%6tx]  ", data - start);
12630#else
12631	  printf ("  [%6Ix]  ", (size_t) (data - start));
12632#endif
12633	  if (maxlen > 0)
12634	    {
12635	      print_symbol ((int) maxlen, (const char *) data);
12636	      putchar ('\n');
12637	      data += strnlen ((const char *) data, maxlen);
12638	    }
12639	  else
12640	    {
12641	      printf (_("<corrupt>\n"));
12642	      data = end;
12643	    }
12644	  some_strings_shown = TRUE;
12645	}
12646    }
12647
12648  if (! some_strings_shown)
12649    printf (_("  No strings found in this section."));
12650
12651  free (real_start);
12652
12653  putchar ('\n');
12654}
12655
12656static void
12657dump_section_as_bytes (Elf_Internal_Shdr * section,
12658		       FILE * file,
12659		       bfd_boolean relocate)
12660{
12661  Elf_Internal_Shdr * relsec;
12662  bfd_size_type       bytes;
12663  bfd_size_type       section_size;
12664  bfd_vma             addr;
12665  unsigned char *     data;
12666  unsigned char *     real_start;
12667  unsigned char *     start;
12668
12669  real_start = start = (unsigned char *) get_section_contents (section, file);
12670  if (start == NULL)
12671    return;
12672  section_size = section->sh_size;
12673
12674  printf (_("\nHex dump of section '%s':\n"), printable_section_name (section));
12675
12676  if (decompress_dumps)
12677    {
12678      dwarf_size_type new_size = section_size;
12679      dwarf_size_type uncompressed_size = 0;
12680
12681      if ((section->sh_flags & SHF_COMPRESSED) != 0)
12682	{
12683	  Elf_Internal_Chdr chdr;
12684	  unsigned int compression_header_size
12685	    = get_compression_header (& chdr, start);
12686
12687	  if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12688	    {
12689	      warn (_("section '%s' has unsupported compress type: %d\n"),
12690		    printable_section_name (section), chdr.ch_type);
12691	      return;
12692	    }
12693	  else if (chdr.ch_addralign != section->sh_addralign)
12694	    {
12695	      warn (_("compressed section '%s' is corrupted\n"),
12696		    printable_section_name (section));
12697	      return;
12698	    }
12699	  uncompressed_size = chdr.ch_size;
12700	  start += compression_header_size;
12701	  new_size -= compression_header_size;
12702	}
12703      else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12704	{
12705	  /* Read the zlib header.  In this case, it should be "ZLIB"
12706	     followed by the uncompressed section size, 8 bytes in
12707	     big-endian order.  */
12708	  uncompressed_size = start[4]; uncompressed_size <<= 8;
12709	  uncompressed_size += start[5]; uncompressed_size <<= 8;
12710	  uncompressed_size += start[6]; uncompressed_size <<= 8;
12711	  uncompressed_size += start[7]; uncompressed_size <<= 8;
12712	  uncompressed_size += start[8]; uncompressed_size <<= 8;
12713	  uncompressed_size += start[9]; uncompressed_size <<= 8;
12714	  uncompressed_size += start[10]; uncompressed_size <<= 8;
12715	  uncompressed_size += start[11];
12716	  start += 12;
12717	  new_size -= 12;
12718	}
12719
12720      if (uncompressed_size
12721	  && uncompress_section_contents (& start, uncompressed_size,
12722					  & new_size))
12723	section_size = new_size;
12724    }
12725
12726  if (relocate)
12727    {
12728      apply_relocations (file, section, start, section_size, NULL, NULL);
12729    }
12730  else
12731    {
12732      /* If the section being dumped has relocations against it the user might
12733	 be expecting these relocations to have been applied.  Check for this
12734	 case and issue a warning message in order to avoid confusion.
12735	 FIXME: Maybe we ought to have an option that dumps a section with
12736	 relocs applied ?  */
12737      for (relsec = section_headers;
12738	   relsec < section_headers + elf_header.e_shnum;
12739	   ++relsec)
12740	{
12741	  if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12742	      || relsec->sh_info >= elf_header.e_shnum
12743	      || section_headers + relsec->sh_info != section
12744	      || relsec->sh_size == 0
12745	      || relsec->sh_link >= elf_header.e_shnum)
12746	    continue;
12747
12748	  printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12749	  break;
12750	}
12751    }
12752
12753  addr = section->sh_addr;
12754  bytes = section_size;
12755  data = start;
12756
12757  while (bytes)
12758    {
12759      int j;
12760      int k;
12761      int lbytes;
12762
12763      lbytes = (bytes > 16 ? 16 : bytes);
12764
12765      printf ("  0x%8.8lx ", (unsigned long) addr);
12766
12767      for (j = 0; j < 16; j++)
12768	{
12769	  if (j < lbytes)
12770	    printf ("%2.2x", data[j]);
12771	  else
12772	    printf ("  ");
12773
12774	  if ((j & 3) == 3)
12775	    printf (" ");
12776	}
12777
12778      for (j = 0; j < lbytes; j++)
12779	{
12780	  k = data[j];
12781	  if (k >= ' ' && k < 0x7f)
12782	    printf ("%c", k);
12783	  else
12784	    printf (".");
12785	}
12786
12787      putchar ('\n');
12788
12789      data  += lbytes;
12790      addr  += lbytes;
12791      bytes -= lbytes;
12792    }
12793
12794  free (real_start);
12795
12796  putchar ('\n');
12797}
12798
12799static int
12800load_specific_debug_section (enum dwarf_section_display_enum debug,
12801			     const Elf_Internal_Shdr * sec, void * file)
12802{
12803  struct dwarf_section * section = &debug_displays [debug].section;
12804  char buf [64];
12805
12806  /* If it is already loaded, do nothing.  */
12807  if (section->start != NULL)
12808    return 1;
12809
12810  snprintf (buf, sizeof (buf), _("%s section data"), section->name);
12811  section->address = sec->sh_addr;
12812  section->user_data = NULL;
12813  section->start = (unsigned char *) get_data (NULL, (FILE *) file,
12814                                               sec->sh_offset, 1,
12815                                               sec->sh_size, buf);
12816  if (section->start == NULL)
12817    section->size = 0;
12818  else
12819    {
12820      unsigned char *start = section->start;
12821      dwarf_size_type size = sec->sh_size;
12822      dwarf_size_type uncompressed_size = 0;
12823
12824      if ((sec->sh_flags & SHF_COMPRESSED) != 0)
12825	{
12826	  Elf_Internal_Chdr chdr;
12827	  unsigned int compression_header_size;
12828
12829	  if (size < (is_32bit_elf
12830		      ? sizeof (Elf32_External_Chdr)
12831		      : sizeof (Elf64_External_Chdr)))
12832	    {
12833	      warn (_("compressed section %s is too small to contain a compression header"),
12834		    section->name);
12835	      return 0;
12836	    }
12837
12838	  compression_header_size = get_compression_header (&chdr, start);
12839
12840	  if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12841	    {
12842	      warn (_("section '%s' has unsupported compress type: %d\n"),
12843		    section->name, chdr.ch_type);
12844	      return 0;
12845	    }
12846	  else if (chdr.ch_addralign != sec->sh_addralign)
12847	    {
12848	      warn (_("compressed section '%s' is corrupted\n"),
12849		    section->name);
12850	      return 0;
12851	    }
12852	  uncompressed_size = chdr.ch_size;
12853	  start += compression_header_size;
12854	  size -= compression_header_size;
12855	}
12856      else if (size > 12 && streq ((char *) start, "ZLIB"))
12857	{
12858	  /* Read the zlib header.  In this case, it should be "ZLIB"
12859	     followed by the uncompressed section size, 8 bytes in
12860	     big-endian order.  */
12861	  uncompressed_size = start[4]; uncompressed_size <<= 8;
12862	  uncompressed_size += start[5]; uncompressed_size <<= 8;
12863	  uncompressed_size += start[6]; uncompressed_size <<= 8;
12864	  uncompressed_size += start[7]; uncompressed_size <<= 8;
12865	  uncompressed_size += start[8]; uncompressed_size <<= 8;
12866	  uncompressed_size += start[9]; uncompressed_size <<= 8;
12867	  uncompressed_size += start[10]; uncompressed_size <<= 8;
12868	  uncompressed_size += start[11];
12869	  start += 12;
12870	  size -= 12;
12871	}
12872
12873      if (uncompressed_size
12874	  && uncompress_section_contents (&start, uncompressed_size,
12875					  &size))
12876	{
12877	  /* Free the compressed buffer, update the section buffer
12878	     and the section size if uncompress is successful.  */
12879	  free (section->start);
12880	  section->start = start;
12881	}
12882      section->size = size;
12883    }
12884
12885  if (section->start == NULL)
12886    return 0;
12887
12888  if (debug_displays [debug].relocate)
12889    apply_relocations ((FILE *) file, sec, section->start, section->size,
12890		       & section->reloc_info, & section->num_relocs);
12891  else
12892    {
12893      section->reloc_info = NULL;
12894      section->num_relocs = 0;
12895    }
12896
12897  return 1;
12898}
12899
12900/* If this is not NULL, load_debug_section will only look for sections
12901   within the list of sections given here.  */
12902unsigned int *section_subset = NULL;
12903
12904int
12905load_debug_section (enum dwarf_section_display_enum debug, void * file)
12906{
12907  struct dwarf_section * section = &debug_displays [debug].section;
12908  Elf_Internal_Shdr * sec;
12909
12910  /* Locate the debug section.  */
12911  sec = find_section_in_set (section->uncompressed_name, section_subset);
12912  if (sec != NULL)
12913    section->name = section->uncompressed_name;
12914  else
12915    {
12916      sec = find_section_in_set (section->compressed_name, section_subset);
12917      if (sec != NULL)
12918	section->name = section->compressed_name;
12919    }
12920  if (sec == NULL)
12921    return 0;
12922
12923  /* If we're loading from a subset of sections, and we've loaded
12924     a section matching this name before, it's likely that it's a
12925     different one.  */
12926  if (section_subset != NULL)
12927    free_debug_section (debug);
12928
12929  return load_specific_debug_section (debug, sec, (FILE *) file);
12930}
12931
12932void
12933free_debug_section (enum dwarf_section_display_enum debug)
12934{
12935  struct dwarf_section * section = &debug_displays [debug].section;
12936
12937  if (section->start == NULL)
12938    return;
12939
12940  free ((char *) section->start);
12941  section->start = NULL;
12942  section->address = 0;
12943  section->size = 0;
12944}
12945
12946static int
12947display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
12948{
12949  char * name = SECTION_NAME (section);
12950  const char * print_name = printable_section_name (section);
12951  bfd_size_type length;
12952  int result = 1;
12953  int i;
12954
12955  length = section->sh_size;
12956  if (length == 0)
12957    {
12958      printf (_("\nSection '%s' has no debugging data.\n"), print_name);
12959      return 0;
12960    }
12961  if (section->sh_type == SHT_NOBITS)
12962    {
12963      /* There is no point in dumping the contents of a debugging section
12964	 which has the NOBITS type - the bits in the file will be random.
12965	 This can happen when a file containing a .eh_frame section is
12966	 stripped with the --only-keep-debug command line option.  */
12967      printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
12968	      print_name);
12969      return 0;
12970    }
12971
12972  if (const_strneq (name, ".gnu.linkonce.wi."))
12973    name = ".debug_info";
12974
12975  /* See if we know how to display the contents of this section.  */
12976  for (i = 0; i < max; i++)
12977    if (streq (debug_displays[i].section.uncompressed_name, name)
12978	|| (i == line && const_strneq (name, ".debug_line."))
12979        || streq (debug_displays[i].section.compressed_name, name))
12980      {
12981	struct dwarf_section * sec = &debug_displays [i].section;
12982	int secondary = (section != find_section (name));
12983
12984	if (secondary)
12985	  free_debug_section ((enum dwarf_section_display_enum) i);
12986
12987	if (i == line && const_strneq (name, ".debug_line."))
12988	  sec->name = name;
12989	else if (streq (sec->uncompressed_name, name))
12990	  sec->name = sec->uncompressed_name;
12991	else
12992	  sec->name = sec->compressed_name;
12993	if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
12994                                         section, file))
12995	  {
12996	    /* If this debug section is part of a CU/TU set in a .dwp file,
12997	       restrict load_debug_section to the sections in that set.  */
12998	    section_subset = find_cu_tu_set (file, shndx);
12999
13000	    result &= debug_displays[i].display (sec, file);
13001
13002	    section_subset = NULL;
13003
13004	    if (secondary || (i != info && i != abbrev))
13005	      free_debug_section ((enum dwarf_section_display_enum) i);
13006	  }
13007
13008	break;
13009      }
13010
13011  if (i == max)
13012    {
13013      printf (_("Unrecognized debug section: %s\n"), print_name);
13014      result = 0;
13015    }
13016
13017  return result;
13018}
13019
13020/* Set DUMP_SECTS for all sections where dumps were requested
13021   based on section name.  */
13022
13023static void
13024initialise_dumps_byname (void)
13025{
13026  struct dump_list_entry * cur;
13027
13028  for (cur = dump_sects_byname; cur; cur = cur->next)
13029    {
13030      unsigned int i;
13031      int any;
13032
13033      for (i = 0, any = 0; i < elf_header.e_shnum; i++)
13034	if (streq (SECTION_NAME (section_headers + i), cur->name))
13035	  {
13036	    request_dump_bynumber (i, cur->type);
13037	    any = 1;
13038	  }
13039
13040      if (!any)
13041	warn (_("Section '%s' was not dumped because it does not exist!\n"),
13042	      cur->name);
13043    }
13044}
13045
13046static void
13047process_section_contents (FILE * file)
13048{
13049  Elf_Internal_Shdr * section;
13050  unsigned int i;
13051
13052  if (! do_dump)
13053    return;
13054
13055  initialise_dumps_byname ();
13056
13057  for (i = 0, section = section_headers;
13058       i < elf_header.e_shnum && i < num_dump_sects;
13059       i++, section++)
13060    {
13061#ifdef SUPPORT_DISASSEMBLY
13062      if (dump_sects[i] & DISASS_DUMP)
13063	disassemble_section (section, file);
13064#endif
13065      if (dump_sects[i] & HEX_DUMP)
13066	dump_section_as_bytes (section, file, FALSE);
13067
13068      if (dump_sects[i] & RELOC_DUMP)
13069	dump_section_as_bytes (section, file, TRUE);
13070
13071      if (dump_sects[i] & STRING_DUMP)
13072	dump_section_as_strings (section, file);
13073
13074      if (dump_sects[i] & DEBUG_DUMP)
13075	display_debug_section (i, section, file);
13076    }
13077
13078  /* Check to see if the user requested a
13079     dump of a section that does not exist.  */
13080  while (i++ < num_dump_sects)
13081    if (dump_sects[i])
13082      warn (_("Section %d was not dumped because it does not exist!\n"), i);
13083}
13084
13085static void
13086process_mips_fpe_exception (int mask)
13087{
13088  if (mask)
13089    {
13090      int first = 1;
13091      if (mask & OEX_FPU_INEX)
13092	fputs ("INEX", stdout), first = 0;
13093      if (mask & OEX_FPU_UFLO)
13094	printf ("%sUFLO", first ? "" : "|"), first = 0;
13095      if (mask & OEX_FPU_OFLO)
13096	printf ("%sOFLO", first ? "" : "|"), first = 0;
13097      if (mask & OEX_FPU_DIV0)
13098	printf ("%sDIV0", first ? "" : "|"), first = 0;
13099      if (mask & OEX_FPU_INVAL)
13100	printf ("%sINVAL", first ? "" : "|");
13101    }
13102  else
13103    fputs ("0", stdout);
13104}
13105
13106/* Display's the value of TAG at location P.  If TAG is
13107   greater than 0 it is assumed to be an unknown tag, and
13108   a message is printed to this effect.  Otherwise it is
13109   assumed that a message has already been printed.
13110
13111   If the bottom bit of TAG is set it assumed to have a
13112   string value, otherwise it is assumed to have an integer
13113   value.
13114
13115   Returns an updated P pointing to the first unread byte
13116   beyond the end of TAG's value.
13117
13118   Reads at or beyond END will not be made.  */
13119
13120static unsigned char *
13121display_tag_value (int tag,
13122		   unsigned char * p,
13123		   const unsigned char * const end)
13124{
13125  unsigned long val;
13126
13127  if (tag > 0)
13128    printf ("  Tag_unknown_%d: ", tag);
13129
13130  if (p >= end)
13131    {
13132      warn (_("<corrupt tag>\n"));
13133    }
13134  else if (tag & 1)
13135    {
13136      /* PR 17531 file: 027-19978-0.004.  */
13137      size_t maxlen = (end - p) - 1;
13138
13139      putchar ('"');
13140      if (maxlen > 0)
13141	{
13142	  print_symbol ((int) maxlen, (const char *) p);
13143	  p += strnlen ((char *) p, maxlen) + 1;
13144	}
13145      else
13146	{
13147	  printf (_("<corrupt string tag>"));
13148	  p = (unsigned char *) end;
13149	}
13150      printf ("\"\n");
13151    }
13152  else
13153    {
13154      unsigned int len;
13155
13156      val = read_uleb128 (p, &len, end);
13157      p += len;
13158      printf ("%ld (0x%lx)\n", val, val);
13159    }
13160
13161  assert (p <= end);
13162  return p;
13163}
13164
13165/* ARM EABI attributes section.  */
13166typedef struct
13167{
13168  unsigned int tag;
13169  const char * name;
13170  /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup.  */
13171  unsigned int type;
13172  const char ** table;
13173} arm_attr_public_tag;
13174
13175static const char * arm_attr_tag_CPU_arch[] =
13176  {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
13177   "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "", "v8-M.baseline",
13178   "v8-M.mainline"};
13179static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
13180static const char * arm_attr_tag_THUMB_ISA_use[] =
13181  {"No", "Thumb-1", "Thumb-2", "Yes"};
13182static const char * arm_attr_tag_FP_arch[] =
13183  {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
13184   "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
13185static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
13186static const char * arm_attr_tag_Advanced_SIMD_arch[] =
13187  {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
13188   "NEON for ARMv8.1"};
13189static const char * arm_attr_tag_PCS_config[] =
13190  {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
13191   "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
13192static const char * arm_attr_tag_ABI_PCS_R9_use[] =
13193  {"V6", "SB", "TLS", "Unused"};
13194static const char * arm_attr_tag_ABI_PCS_RW_data[] =
13195  {"Absolute", "PC-relative", "SB-relative", "None"};
13196static const char * arm_attr_tag_ABI_PCS_RO_data[] =
13197  {"Absolute", "PC-relative", "None"};
13198static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
13199  {"None", "direct", "GOT-indirect"};
13200static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
13201  {"None", "??? 1", "2", "??? 3", "4"};
13202static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
13203static const char * arm_attr_tag_ABI_FP_denormal[] =
13204  {"Unused", "Needed", "Sign only"};
13205static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
13206static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
13207static const char * arm_attr_tag_ABI_FP_number_model[] =
13208  {"Unused", "Finite", "RTABI", "IEEE 754"};
13209static const char * arm_attr_tag_ABI_enum_size[] =
13210  {"Unused", "small", "int", "forced to int"};
13211static const char * arm_attr_tag_ABI_HardFP_use[] =
13212  {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
13213static const char * arm_attr_tag_ABI_VFP_args[] =
13214  {"AAPCS", "VFP registers", "custom", "compatible"};
13215static const char * arm_attr_tag_ABI_WMMX_args[] =
13216  {"AAPCS", "WMMX registers", "custom"};
13217static const char * arm_attr_tag_ABI_optimization_goals[] =
13218  {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
13219    "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
13220static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
13221  {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
13222    "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
13223static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
13224static const char * arm_attr_tag_FP_HP_extension[] =
13225  {"Not Allowed", "Allowed"};
13226static const char * arm_attr_tag_ABI_FP_16bit_format[] =
13227  {"None", "IEEE 754", "Alternative Format"};
13228static const char * arm_attr_tag_DSP_extension[] =
13229  {"Follow architecture", "Allowed"};
13230static const char * arm_attr_tag_MPextension_use[] =
13231  {"Not Allowed", "Allowed"};
13232static const char * arm_attr_tag_DIV_use[] =
13233  {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
13234    "Allowed in v7-A with integer division extension"};
13235static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
13236static const char * arm_attr_tag_Virtualization_use[] =
13237  {"Not Allowed", "TrustZone", "Virtualization Extensions",
13238    "TrustZone and Virtualization Extensions"};
13239static const char * arm_attr_tag_MPextension_use_legacy[] =
13240  {"Not Allowed", "Allowed"};
13241
13242#define LOOKUP(id, name) \
13243  {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
13244static arm_attr_public_tag arm_attr_public_tags[] =
13245{
13246  {4, "CPU_raw_name", 1, NULL},
13247  {5, "CPU_name", 1, NULL},
13248  LOOKUP(6, CPU_arch),
13249  {7, "CPU_arch_profile", 0, NULL},
13250  LOOKUP(8, ARM_ISA_use),
13251  LOOKUP(9, THUMB_ISA_use),
13252  LOOKUP(10, FP_arch),
13253  LOOKUP(11, WMMX_arch),
13254  LOOKUP(12, Advanced_SIMD_arch),
13255  LOOKUP(13, PCS_config),
13256  LOOKUP(14, ABI_PCS_R9_use),
13257  LOOKUP(15, ABI_PCS_RW_data),
13258  LOOKUP(16, ABI_PCS_RO_data),
13259  LOOKUP(17, ABI_PCS_GOT_use),
13260  LOOKUP(18, ABI_PCS_wchar_t),
13261  LOOKUP(19, ABI_FP_rounding),
13262  LOOKUP(20, ABI_FP_denormal),
13263  LOOKUP(21, ABI_FP_exceptions),
13264  LOOKUP(22, ABI_FP_user_exceptions),
13265  LOOKUP(23, ABI_FP_number_model),
13266  {24, "ABI_align_needed", 0, NULL},
13267  {25, "ABI_align_preserved", 0, NULL},
13268  LOOKUP(26, ABI_enum_size),
13269  LOOKUP(27, ABI_HardFP_use),
13270  LOOKUP(28, ABI_VFP_args),
13271  LOOKUP(29, ABI_WMMX_args),
13272  LOOKUP(30, ABI_optimization_goals),
13273  LOOKUP(31, ABI_FP_optimization_goals),
13274  {32, "compatibility", 0, NULL},
13275  LOOKUP(34, CPU_unaligned_access),
13276  LOOKUP(36, FP_HP_extension),
13277  LOOKUP(38, ABI_FP_16bit_format),
13278  LOOKUP(42, MPextension_use),
13279  LOOKUP(44, DIV_use),
13280  LOOKUP(46, DSP_extension),
13281  {64, "nodefaults", 0, NULL},
13282  {65, "also_compatible_with", 0, NULL},
13283  LOOKUP(66, T2EE_use),
13284  {67, "conformance", 1, NULL},
13285  LOOKUP(68, Virtualization_use),
13286  LOOKUP(70, MPextension_use_legacy)
13287};
13288#undef LOOKUP
13289
13290static unsigned char *
13291display_arm_attribute (unsigned char * p,
13292		       const unsigned char * const end)
13293{
13294  unsigned int tag;
13295  unsigned int len;
13296  unsigned int val;
13297  arm_attr_public_tag * attr;
13298  unsigned i;
13299  unsigned int type;
13300
13301  tag = read_uleb128 (p, &len, end);
13302  p += len;
13303  attr = NULL;
13304  for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
13305    {
13306      if (arm_attr_public_tags[i].tag == tag)
13307	{
13308	  attr = &arm_attr_public_tags[i];
13309	  break;
13310	}
13311    }
13312
13313  if (attr)
13314    {
13315      printf ("  Tag_%s: ", attr->name);
13316      switch (attr->type)
13317	{
13318	case 0:
13319	  switch (tag)
13320	    {
13321	    case 7: /* Tag_CPU_arch_profile.  */
13322	      val = read_uleb128 (p, &len, end);
13323	      p += len;
13324	      switch (val)
13325		{
13326		case 0: printf (_("None\n")); break;
13327		case 'A': printf (_("Application\n")); break;
13328		case 'R': printf (_("Realtime\n")); break;
13329		case 'M': printf (_("Microcontroller\n")); break;
13330		case 'S': printf (_("Application or Realtime\n")); break;
13331		default: printf ("??? (%d)\n", val); break;
13332		}
13333	      break;
13334
13335	    case 24: /* Tag_align_needed.  */
13336	      val = read_uleb128 (p, &len, end);
13337	      p += len;
13338	      switch (val)
13339		{
13340		case 0: printf (_("None\n")); break;
13341		case 1: printf (_("8-byte\n")); break;
13342		case 2: printf (_("4-byte\n")); break;
13343		case 3: printf ("??? 3\n"); break;
13344		default:
13345		  if (val <= 12)
13346		    printf (_("8-byte and up to %d-byte extended\n"),
13347			    1 << val);
13348		  else
13349		    printf ("??? (%d)\n", val);
13350		  break;
13351		}
13352	      break;
13353
13354	    case 25: /* Tag_align_preserved.  */
13355	      val = read_uleb128 (p, &len, end);
13356	      p += len;
13357	      switch (val)
13358		{
13359		case 0: printf (_("None\n")); break;
13360		case 1: printf (_("8-byte, except leaf SP\n")); break;
13361		case 2: printf (_("8-byte\n")); break;
13362		case 3: printf ("??? 3\n"); break;
13363		default:
13364		  if (val <= 12)
13365		    printf (_("8-byte and up to %d-byte extended\n"),
13366			    1 << val);
13367		  else
13368		    printf ("??? (%d)\n", val);
13369		  break;
13370		}
13371	      break;
13372
13373	    case 32: /* Tag_compatibility.  */
13374	      {
13375		val = read_uleb128 (p, &len, end);
13376		p += len;
13377		printf (_("flag = %d, vendor = "), val);
13378		if (p < end - 1)
13379		  {
13380		    size_t maxlen = (end - p) - 1;
13381
13382		    print_symbol ((int) maxlen, (const char *) p);
13383		    p += strnlen ((char *) p, maxlen) + 1;
13384		  }
13385		else
13386		  {
13387		    printf (_("<corrupt>"));
13388		    p = (unsigned char *) end;
13389		  }
13390		putchar ('\n');
13391	      }
13392	      break;
13393
13394	    case 64: /* Tag_nodefaults.  */
13395	      /* PR 17531: file: 001-505008-0.01.  */
13396	      if (p < end)
13397		p++;
13398	      printf (_("True\n"));
13399	      break;
13400
13401	    case 65: /* Tag_also_compatible_with.  */
13402	      val = read_uleb128 (p, &len, end);
13403	      p += len;
13404	      if (val == 6 /* Tag_CPU_arch.  */)
13405		{
13406		  val = read_uleb128 (p, &len, end);
13407		  p += len;
13408		  if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
13409		    printf ("??? (%d)\n", val);
13410		  else
13411		    printf ("%s\n", arm_attr_tag_CPU_arch[val]);
13412		}
13413	      else
13414		printf ("???\n");
13415	      while (p < end && *(p++) != '\0' /* NUL terminator.  */)
13416		;
13417	      break;
13418
13419	    default:
13420	      printf (_("<unknown: %d>\n"), tag);
13421	      break;
13422	    }
13423	  return p;
13424
13425	case 1:
13426	  return display_tag_value (-1, p, end);
13427	case 2:
13428	  return display_tag_value (0, p, end);
13429
13430	default:
13431	  assert (attr->type & 0x80);
13432	  val = read_uleb128 (p, &len, end);
13433	  p += len;
13434	  type = attr->type & 0x7f;
13435	  if (val >= type)
13436	    printf ("??? (%d)\n", val);
13437	  else
13438	    printf ("%s\n", attr->table[val]);
13439	  return p;
13440	}
13441    }
13442
13443  return display_tag_value (tag, p, end);
13444}
13445
13446static unsigned char *
13447display_gnu_attribute (unsigned char * p,
13448		       unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const),
13449		       const unsigned char * const end)
13450{
13451  int tag;
13452  unsigned int len;
13453  int val;
13454
13455  tag = read_uleb128 (p, &len, end);
13456  p += len;
13457
13458  /* Tag_compatibility is the only generic GNU attribute defined at
13459     present.  */
13460  if (tag == 32)
13461    {
13462      val = read_uleb128 (p, &len, end);
13463      p += len;
13464
13465      printf (_("flag = %d, vendor = "), val);
13466      if (p == end)
13467	{
13468	  printf (_("<corrupt>\n"));
13469	  warn (_("corrupt vendor attribute\n"));
13470	}
13471      else
13472	{
13473	  if (p < end - 1)
13474	    {
13475	      size_t maxlen = (end - p) - 1;
13476
13477	      print_symbol ((int) maxlen, (const char *) p);
13478	      p += strnlen ((char *) p, maxlen) + 1;
13479	    }
13480	  else
13481	    {
13482	      printf (_("<corrupt>"));
13483	      p = (unsigned char *) end;
13484	    }
13485	  putchar ('\n');
13486	}
13487      return p;
13488    }
13489
13490  if ((tag & 2) == 0 && display_proc_gnu_attribute)
13491    return display_proc_gnu_attribute (p, tag, end);
13492
13493  return display_tag_value (tag, p, end);
13494}
13495
13496static unsigned char *
13497display_power_gnu_attribute (unsigned char * p,
13498			     int tag,
13499			     const unsigned char * const end)
13500{
13501  unsigned int len;
13502  unsigned int val;
13503
13504  if (tag == Tag_GNU_Power_ABI_FP)
13505    {
13506      val = read_uleb128 (p, &len, end);
13507      p += len;
13508      printf ("  Tag_GNU_Power_ABI_FP: ");
13509      if (len == 0)
13510	{
13511	  printf (_("<corrupt>\n"));
13512	  return p;
13513	}
13514
13515      if (val > 15)
13516	printf ("(%#x), ", val);
13517
13518      switch (val & 3)
13519	{
13520	case 0:
13521	  printf (_("unspecified hard/soft float, "));
13522	  break;
13523	case 1:
13524	  printf (_("hard float, "));
13525	  break;
13526	case 2:
13527	  printf (_("soft float, "));
13528	  break;
13529	case 3:
13530	  printf (_("single-precision hard float, "));
13531	  break;
13532	}
13533
13534      switch (val & 0xC)
13535	{
13536	case 0:
13537	  printf (_("unspecified long double\n"));
13538	  break;
13539	case 4:
13540	  printf (_("128-bit IBM long double\n"));
13541	  break;
13542	case 8:
13543	  printf (_("64-bit long double\n"));
13544	  break;
13545	case 12:
13546	  printf (_("128-bit IEEE long double\n"));
13547	  break;
13548	}
13549      return p;
13550    }
13551
13552  if (tag == Tag_GNU_Power_ABI_Vector)
13553    {
13554      val = read_uleb128 (p, &len, end);
13555      p += len;
13556      printf ("  Tag_GNU_Power_ABI_Vector: ");
13557      if (len == 0)
13558	{
13559	  printf (_("<corrupt>\n"));
13560	  return p;
13561	}
13562
13563      if (val > 3)
13564	printf ("(%#x), ", val);
13565
13566      switch (val & 3)
13567	{
13568	case 0:
13569	  printf (_("unspecified\n"));
13570	  break;
13571	case 1:
13572	  printf (_("generic\n"));
13573	  break;
13574	case 2:
13575	  printf ("AltiVec\n");
13576	  break;
13577	case 3:
13578	  printf ("SPE\n");
13579	  break;
13580	}
13581      return p;
13582    }
13583
13584  if (tag == Tag_GNU_Power_ABI_Struct_Return)
13585    {
13586      val = read_uleb128 (p, &len, end);
13587      p += len;
13588      printf ("  Tag_GNU_Power_ABI_Struct_Return: ");
13589      if (len == 0)
13590	{
13591	  printf (_("<corrupt>\n"));
13592	  return p;
13593	}
13594
13595      if (val > 2)
13596	printf ("(%#x), ", val);
13597
13598      switch (val & 3)
13599	{
13600	case 0:
13601	  printf (_("unspecified\n"));
13602	  break;
13603	case 1:
13604	  printf ("r3/r4\n");
13605	  break;
13606	case 2:
13607	  printf (_("memory\n"));
13608	  break;
13609	case 3:
13610	  printf ("???\n");
13611	  break;
13612	}
13613      return p;
13614    }
13615
13616  return display_tag_value (tag & 1, p, end);
13617}
13618
13619static unsigned char *
13620display_s390_gnu_attribute (unsigned char * p,
13621			    int tag,
13622			    const unsigned char * const end)
13623{
13624  unsigned int len;
13625  int val;
13626
13627  if (tag == Tag_GNU_S390_ABI_Vector)
13628    {
13629      val = read_uleb128 (p, &len, end);
13630      p += len;
13631      printf ("  Tag_GNU_S390_ABI_Vector: ");
13632
13633      switch (val)
13634	{
13635	case 0:
13636	  printf (_("any\n"));
13637	  break;
13638	case 1:
13639	  printf (_("software\n"));
13640	  break;
13641	case 2:
13642	  printf (_("hardware\n"));
13643	  break;
13644	default:
13645	  printf ("??? (%d)\n", val);
13646	  break;
13647	}
13648      return p;
13649   }
13650
13651  return display_tag_value (tag & 1, p, end);
13652}
13653
13654static void
13655display_sparc_hwcaps (int mask)
13656{
13657  if (mask)
13658    {
13659      int first = 1;
13660
13661      if (mask & ELF_SPARC_HWCAP_MUL32)
13662	fputs ("mul32", stdout), first = 0;
13663      if (mask & ELF_SPARC_HWCAP_DIV32)
13664	printf ("%sdiv32", first ? "" : "|"), first = 0;
13665      if (mask & ELF_SPARC_HWCAP_FSMULD)
13666	printf ("%sfsmuld", first ? "" : "|"), first = 0;
13667      if (mask & ELF_SPARC_HWCAP_V8PLUS)
13668	printf ("%sv8plus", first ? "" : "|"), first = 0;
13669      if (mask & ELF_SPARC_HWCAP_POPC)
13670	printf ("%spopc", first ? "" : "|"), first = 0;
13671      if (mask & ELF_SPARC_HWCAP_VIS)
13672	printf ("%svis", first ? "" : "|"), first = 0;
13673      if (mask & ELF_SPARC_HWCAP_VIS2)
13674	printf ("%svis2", first ? "" : "|"), first = 0;
13675      if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
13676	printf ("%sASIBlkInit", first ? "" : "|"), first = 0;
13677      if (mask & ELF_SPARC_HWCAP_FMAF)
13678	printf ("%sfmaf", first ? "" : "|"), first = 0;
13679      if (mask & ELF_SPARC_HWCAP_VIS3)
13680	printf ("%svis3", first ? "" : "|"), first = 0;
13681      if (mask & ELF_SPARC_HWCAP_HPC)
13682	printf ("%shpc", first ? "" : "|"), first = 0;
13683      if (mask & ELF_SPARC_HWCAP_RANDOM)
13684	printf ("%srandom", first ? "" : "|"), first = 0;
13685      if (mask & ELF_SPARC_HWCAP_TRANS)
13686	printf ("%strans", first ? "" : "|"), first = 0;
13687      if (mask & ELF_SPARC_HWCAP_FJFMAU)
13688	printf ("%sfjfmau", first ? "" : "|"), first = 0;
13689      if (mask & ELF_SPARC_HWCAP_IMA)
13690	printf ("%sima", first ? "" : "|"), first = 0;
13691      if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
13692	printf ("%scspare", first ? "" : "|"), first = 0;
13693    }
13694  else
13695    fputc ('0', stdout);
13696  fputc ('\n', stdout);
13697}
13698
13699static void
13700display_sparc_hwcaps2 (int mask)
13701{
13702  if (mask)
13703    {
13704      int first = 1;
13705
13706      if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
13707	fputs ("fjathplus", stdout), first = 0;
13708      if (mask & ELF_SPARC_HWCAP2_VIS3B)
13709	printf ("%svis3b", first ? "" : "|"), first = 0;
13710      if (mask & ELF_SPARC_HWCAP2_ADP)
13711	printf ("%sadp", first ? "" : "|"), first = 0;
13712      if (mask & ELF_SPARC_HWCAP2_SPARC5)
13713	printf ("%ssparc5", first ? "" : "|"), first = 0;
13714      if (mask & ELF_SPARC_HWCAP2_MWAIT)
13715	printf ("%smwait", first ? "" : "|"), first = 0;
13716      if (mask & ELF_SPARC_HWCAP2_XMPMUL)
13717	printf ("%sxmpmul", first ? "" : "|"), first = 0;
13718      if (mask & ELF_SPARC_HWCAP2_XMONT)
13719	printf ("%sxmont2", first ? "" : "|"), first = 0;
13720      if (mask & ELF_SPARC_HWCAP2_NSEC)
13721	printf ("%snsec", first ? "" : "|"), first = 0;
13722      if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
13723	printf ("%sfjathhpc", first ? "" : "|"), first = 0;
13724      if (mask & ELF_SPARC_HWCAP2_FJDES)
13725	printf ("%sfjdes", first ? "" : "|"), first = 0;
13726      if (mask & ELF_SPARC_HWCAP2_FJAES)
13727	printf ("%sfjaes", first ? "" : "|"), first = 0;
13728    }
13729  else
13730    fputc ('0', stdout);
13731  fputc ('\n', stdout);
13732}
13733
13734static unsigned char *
13735display_sparc_gnu_attribute (unsigned char * p,
13736			     int tag,
13737			     const unsigned char * const end)
13738{
13739  unsigned int len;
13740  int val;
13741
13742  if (tag == Tag_GNU_Sparc_HWCAPS)
13743    {
13744      val = read_uleb128 (p, &len, end);
13745      p += len;
13746      printf ("  Tag_GNU_Sparc_HWCAPS: ");
13747      display_sparc_hwcaps (val);
13748      return p;
13749    }
13750  if (tag == Tag_GNU_Sparc_HWCAPS2)
13751    {
13752      val = read_uleb128 (p, &len, end);
13753      p += len;
13754      printf ("  Tag_GNU_Sparc_HWCAPS2: ");
13755      display_sparc_hwcaps2 (val);
13756      return p;
13757    }
13758
13759  return display_tag_value (tag, p, end);
13760}
13761
13762static void
13763print_mips_fp_abi_value (int val)
13764{
13765  switch (val)
13766    {
13767    case Val_GNU_MIPS_ABI_FP_ANY:
13768      printf (_("Hard or soft float\n"));
13769      break;
13770    case Val_GNU_MIPS_ABI_FP_DOUBLE:
13771      printf (_("Hard float (double precision)\n"));
13772      break;
13773    case Val_GNU_MIPS_ABI_FP_SINGLE:
13774      printf (_("Hard float (single precision)\n"));
13775      break;
13776    case Val_GNU_MIPS_ABI_FP_SOFT:
13777      printf (_("Soft float\n"));
13778      break;
13779    case Val_GNU_MIPS_ABI_FP_OLD_64:
13780      printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
13781      break;
13782    case Val_GNU_MIPS_ABI_FP_XX:
13783      printf (_("Hard float (32-bit CPU, Any FPU)\n"));
13784      break;
13785    case Val_GNU_MIPS_ABI_FP_64:
13786      printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
13787      break;
13788    case Val_GNU_MIPS_ABI_FP_64A:
13789      printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
13790      break;
13791    case Val_GNU_MIPS_ABI_FP_NAN2008:
13792      printf (_("NaN 2008 compatibility\n"));
13793      break;
13794    default:
13795      printf ("??? (%d)\n", val);
13796      break;
13797    }
13798}
13799
13800static unsigned char *
13801display_mips_gnu_attribute (unsigned char * p,
13802			    int tag,
13803			    const unsigned char * const end)
13804{
13805  if (tag == Tag_GNU_MIPS_ABI_FP)
13806    {
13807      unsigned int len;
13808      int val;
13809
13810      val = read_uleb128 (p, &len, end);
13811      p += len;
13812      printf ("  Tag_GNU_MIPS_ABI_FP: ");
13813
13814      print_mips_fp_abi_value (val);
13815
13816      return p;
13817   }
13818
13819  if (tag == Tag_GNU_MIPS_ABI_MSA)
13820    {
13821      unsigned int len;
13822      int val;
13823
13824      val = read_uleb128 (p, &len, end);
13825      p += len;
13826      printf ("  Tag_GNU_MIPS_ABI_MSA: ");
13827
13828      switch (val)
13829	{
13830	case Val_GNU_MIPS_ABI_MSA_ANY:
13831	  printf (_("Any MSA or not\n"));
13832	  break;
13833	case Val_GNU_MIPS_ABI_MSA_128:
13834	  printf (_("128-bit MSA\n"));
13835	  break;
13836	default:
13837	  printf ("??? (%d)\n", val);
13838	  break;
13839	}
13840      return p;
13841    }
13842
13843  return display_tag_value (tag & 1, p, end);
13844}
13845
13846static unsigned char *
13847display_tic6x_attribute (unsigned char * p,
13848			 const unsigned char * const end)
13849{
13850  int tag;
13851  unsigned int len;
13852  int val;
13853
13854  tag = read_uleb128 (p, &len, end);
13855  p += len;
13856
13857  switch (tag)
13858    {
13859    case Tag_ISA:
13860      val = read_uleb128 (p, &len, end);
13861      p += len;
13862      printf ("  Tag_ISA: ");
13863
13864      switch (val)
13865	{
13866	case C6XABI_Tag_ISA_none:
13867	  printf (_("None\n"));
13868	  break;
13869	case C6XABI_Tag_ISA_C62X:
13870	  printf ("C62x\n");
13871	  break;
13872	case C6XABI_Tag_ISA_C67X:
13873	  printf ("C67x\n");
13874	  break;
13875	case C6XABI_Tag_ISA_C67XP:
13876	  printf ("C67x+\n");
13877	  break;
13878	case C6XABI_Tag_ISA_C64X:
13879	  printf ("C64x\n");
13880	  break;
13881	case C6XABI_Tag_ISA_C64XP:
13882	  printf ("C64x+\n");
13883	  break;
13884	case C6XABI_Tag_ISA_C674X:
13885	  printf ("C674x\n");
13886	  break;
13887	default:
13888	  printf ("??? (%d)\n", val);
13889	  break;
13890	}
13891      return p;
13892
13893    case Tag_ABI_wchar_t:
13894      val = read_uleb128 (p, &len, end);
13895      p += len;
13896      printf ("  Tag_ABI_wchar_t: ");
13897      switch (val)
13898	{
13899	case 0:
13900	  printf (_("Not used\n"));
13901	  break;
13902	case 1:
13903	  printf (_("2 bytes\n"));
13904	  break;
13905	case 2:
13906	  printf (_("4 bytes\n"));
13907	  break;
13908	default:
13909	  printf ("??? (%d)\n", val);
13910	  break;
13911	}
13912      return p;
13913
13914    case Tag_ABI_stack_align_needed:
13915      val = read_uleb128 (p, &len, end);
13916      p += len;
13917      printf ("  Tag_ABI_stack_align_needed: ");
13918      switch (val)
13919	{
13920	case 0:
13921	  printf (_("8-byte\n"));
13922	  break;
13923	case 1:
13924	  printf (_("16-byte\n"));
13925	  break;
13926	default:
13927	  printf ("??? (%d)\n", val);
13928	  break;
13929	}
13930      return p;
13931
13932    case Tag_ABI_stack_align_preserved:
13933      val = read_uleb128 (p, &len, end);
13934      p += len;
13935      printf ("  Tag_ABI_stack_align_preserved: ");
13936      switch (val)
13937	{
13938	case 0:
13939	  printf (_("8-byte\n"));
13940	  break;
13941	case 1:
13942	  printf (_("16-byte\n"));
13943	  break;
13944	default:
13945	  printf ("??? (%d)\n", val);
13946	  break;
13947	}
13948      return p;
13949
13950    case Tag_ABI_DSBT:
13951      val = read_uleb128 (p, &len, end);
13952      p += len;
13953      printf ("  Tag_ABI_DSBT: ");
13954      switch (val)
13955	{
13956	case 0:
13957	  printf (_("DSBT addressing not used\n"));
13958	  break;
13959	case 1:
13960	  printf (_("DSBT addressing used\n"));
13961	  break;
13962	default:
13963	  printf ("??? (%d)\n", val);
13964	  break;
13965	}
13966      return p;
13967
13968    case Tag_ABI_PID:
13969      val = read_uleb128 (p, &len, end);
13970      p += len;
13971      printf ("  Tag_ABI_PID: ");
13972      switch (val)
13973	{
13974	case 0:
13975	  printf (_("Data addressing position-dependent\n"));
13976	  break;
13977	case 1:
13978	  printf (_("Data addressing position-independent, GOT near DP\n"));
13979	  break;
13980	case 2:
13981	  printf (_("Data addressing position-independent, GOT far from DP\n"));
13982	  break;
13983	default:
13984	  printf ("??? (%d)\n", val);
13985	  break;
13986	}
13987      return p;
13988
13989    case Tag_ABI_PIC:
13990      val = read_uleb128 (p, &len, end);
13991      p += len;
13992      printf ("  Tag_ABI_PIC: ");
13993      switch (val)
13994	{
13995	case 0:
13996	  printf (_("Code addressing position-dependent\n"));
13997	  break;
13998	case 1:
13999	  printf (_("Code addressing position-independent\n"));
14000	  break;
14001	default:
14002	  printf ("??? (%d)\n", val);
14003	  break;
14004	}
14005      return p;
14006
14007    case Tag_ABI_array_object_alignment:
14008      val = read_uleb128 (p, &len, end);
14009      p += len;
14010      printf ("  Tag_ABI_array_object_alignment: ");
14011      switch (val)
14012	{
14013	case 0:
14014	  printf (_("8-byte\n"));
14015	  break;
14016	case 1:
14017	  printf (_("4-byte\n"));
14018	  break;
14019	case 2:
14020	  printf (_("16-byte\n"));
14021	  break;
14022	default:
14023	  printf ("??? (%d)\n", val);
14024	  break;
14025	}
14026      return p;
14027
14028    case Tag_ABI_array_object_align_expected:
14029      val = read_uleb128 (p, &len, end);
14030      p += len;
14031      printf ("  Tag_ABI_array_object_align_expected: ");
14032      switch (val)
14033	{
14034	case 0:
14035	  printf (_("8-byte\n"));
14036	  break;
14037	case 1:
14038	  printf (_("4-byte\n"));
14039	  break;
14040	case 2:
14041	  printf (_("16-byte\n"));
14042	  break;
14043	default:
14044	  printf ("??? (%d)\n", val);
14045	  break;
14046	}
14047      return p;
14048
14049    case Tag_ABI_compatibility:
14050      {
14051	val = read_uleb128 (p, &len, end);
14052	p += len;
14053	printf ("  Tag_ABI_compatibility: ");
14054	printf (_("flag = %d, vendor = "), val);
14055	if (p < end - 1)
14056	  {
14057	    size_t maxlen = (end - p) - 1;
14058
14059	    print_symbol ((int) maxlen, (const char *) p);
14060	    p += strnlen ((char *) p, maxlen) + 1;
14061	  }
14062	else
14063	  {
14064	    printf (_("<corrupt>"));
14065	    p = (unsigned char *) end;
14066	  }
14067	putchar ('\n');
14068	return p;
14069      }
14070
14071    case Tag_ABI_conformance:
14072      {
14073	printf ("  Tag_ABI_conformance: \"");
14074	if (p < end - 1)
14075	  {
14076	    size_t maxlen = (end - p) - 1;
14077
14078	    print_symbol ((int) maxlen, (const char *) p);
14079	    p += strnlen ((char *) p, maxlen) + 1;
14080	  }
14081	else
14082	  {
14083	    printf (_("<corrupt>"));
14084	    p = (unsigned char *) end;
14085	  }
14086	printf ("\"\n");
14087	return p;
14088      }
14089    }
14090
14091  return display_tag_value (tag, p, end);
14092}
14093
14094static void
14095display_raw_attribute (unsigned char * p, unsigned char * end)
14096{
14097  unsigned long addr = 0;
14098  size_t bytes = end - p;
14099
14100  assert (end > p);
14101  while (bytes)
14102    {
14103      int j;
14104      int k;
14105      int lbytes = (bytes > 16 ? 16 : bytes);
14106
14107      printf ("  0x%8.8lx ", addr);
14108
14109      for (j = 0; j < 16; j++)
14110	{
14111	  if (j < lbytes)
14112	    printf ("%2.2x", p[j]);
14113	  else
14114	    printf ("  ");
14115
14116	  if ((j & 3) == 3)
14117	    printf (" ");
14118	}
14119
14120      for (j = 0; j < lbytes; j++)
14121	{
14122	  k = p[j];
14123	  if (k >= ' ' && k < 0x7f)
14124	    printf ("%c", k);
14125	  else
14126	    printf (".");
14127	}
14128
14129      putchar ('\n');
14130
14131      p  += lbytes;
14132      bytes -= lbytes;
14133      addr += lbytes;
14134    }
14135
14136  putchar ('\n');
14137}
14138
14139static unsigned char *
14140display_msp430x_attribute (unsigned char * p,
14141			   const unsigned char * const end)
14142{
14143  unsigned int len;
14144  int val;
14145  int tag;
14146
14147  tag = read_uleb128 (p, & len, end);
14148  p += len;
14149
14150  switch (tag)
14151    {
14152    case OFBA_MSPABI_Tag_ISA:
14153      val = read_uleb128 (p, &len, end);
14154      p += len;
14155      printf ("  Tag_ISA: ");
14156      switch (val)
14157	{
14158	case 0: printf (_("None\n")); break;
14159	case 1: printf (_("MSP430\n")); break;
14160	case 2: printf (_("MSP430X\n")); break;
14161	default: printf ("??? (%d)\n", val); break;
14162	}
14163      break;
14164
14165    case OFBA_MSPABI_Tag_Code_Model:
14166      val = read_uleb128 (p, &len, end);
14167      p += len;
14168      printf ("  Tag_Code_Model: ");
14169      switch (val)
14170	{
14171	case 0: printf (_("None\n")); break;
14172	case 1: printf (_("Small\n")); break;
14173	case 2: printf (_("Large\n")); break;
14174	default: printf ("??? (%d)\n", val); break;
14175	}
14176      break;
14177
14178    case OFBA_MSPABI_Tag_Data_Model:
14179      val = read_uleb128 (p, &len, end);
14180      p += len;
14181      printf ("  Tag_Data_Model: ");
14182      switch (val)
14183	{
14184	case 0: printf (_("None\n")); break;
14185	case 1: printf (_("Small\n")); break;
14186	case 2: printf (_("Large\n")); break;
14187	case 3: printf (_("Restricted Large\n")); break;
14188	default: printf ("??? (%d)\n", val); break;
14189	}
14190      break;
14191
14192    default:
14193      printf (_("  <unknown tag %d>: "), tag);
14194
14195      if (tag & 1)
14196	{
14197	  putchar ('"');
14198	  if (p < end - 1)
14199	    {
14200	      size_t maxlen = (end - p) - 1;
14201
14202	      print_symbol ((int) maxlen, (const char *) p);
14203	      p += strnlen ((char *) p, maxlen) + 1;
14204	    }
14205	  else
14206	    {
14207	      printf (_("<corrupt>"));
14208	      p = (unsigned char *) end;
14209	    }
14210	  printf ("\"\n");
14211	}
14212      else
14213	{
14214	  val = read_uleb128 (p, &len, end);
14215	  p += len;
14216	  printf ("%d (0x%x)\n", val, val);
14217	}
14218      break;
14219   }
14220
14221  assert (p <= end);
14222  return p;
14223}
14224
14225static int
14226process_attributes (FILE * file,
14227		    const char * public_name,
14228		    unsigned int proc_type,
14229		    unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
14230		    unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const))
14231{
14232  Elf_Internal_Shdr * sect;
14233  unsigned i;
14234
14235  /* Find the section header so that we get the size.  */
14236  for (i = 0, sect = section_headers;
14237       i < elf_header.e_shnum;
14238       i++, sect++)
14239    {
14240      unsigned char * contents;
14241      unsigned char * p;
14242
14243      if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
14244	continue;
14245
14246      contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
14247                                             sect->sh_size, _("attributes"));
14248      if (contents == NULL)
14249	continue;
14250
14251      p = contents;
14252      if (*p == 'A')
14253	{
14254	  bfd_vma section_len;
14255
14256	  section_len = sect->sh_size - 1;
14257	  p++;
14258
14259	  while (section_len > 0)
14260	    {
14261	      bfd_vma attr_len;
14262	      unsigned int namelen;
14263	      bfd_boolean public_section;
14264	      bfd_boolean gnu_section;
14265
14266	      if (section_len <= 4)
14267		{
14268		  error (_("Tag section ends prematurely\n"));
14269		  break;
14270		}
14271	      attr_len = byte_get (p, 4);
14272	      p += 4;
14273
14274	      if (attr_len > section_len)
14275		{
14276		  error (_("Bad attribute length (%u > %u)\n"),
14277			  (unsigned) attr_len, (unsigned) section_len);
14278		  attr_len = section_len;
14279		}
14280	      /* PR 17531: file: 001-101425-0.004  */
14281	      else if (attr_len < 5)
14282		{
14283		  error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
14284		  break;
14285		}
14286
14287	      section_len -= attr_len;
14288	      attr_len -= 4;
14289
14290	      namelen = strnlen ((char *) p, attr_len) + 1;
14291	      if (namelen == 0 || namelen >= attr_len)
14292		{
14293		  error (_("Corrupt attribute section name\n"));
14294		  break;
14295		}
14296
14297	      printf (_("Attribute Section: "));
14298	      print_symbol (INT_MAX, (const char *) p);
14299	      putchar ('\n');
14300
14301	      if (public_name && streq ((char *) p, public_name))
14302		public_section = TRUE;
14303	      else
14304		public_section = FALSE;
14305
14306	      if (streq ((char *) p, "gnu"))
14307		gnu_section = TRUE;
14308	      else
14309		gnu_section = FALSE;
14310
14311	      p += namelen;
14312	      attr_len -= namelen;
14313
14314	      while (attr_len > 0 && p < contents + sect->sh_size)
14315		{
14316		  int tag;
14317		  int val;
14318		  bfd_vma size;
14319		  unsigned char * end;
14320
14321		  /* PR binutils/17531: Safe handling of corrupt files.  */
14322		  if (attr_len < 6)
14323		    {
14324		      error (_("Unused bytes at end of section\n"));
14325		      section_len = 0;
14326		      break;
14327		    }
14328
14329		  tag = *(p++);
14330		  size = byte_get (p, 4);
14331		  if (size > attr_len)
14332		    {
14333		      error (_("Bad subsection length (%u > %u)\n"),
14334			      (unsigned) size, (unsigned) attr_len);
14335		      size = attr_len;
14336		    }
14337		  /* PR binutils/17531: Safe handling of corrupt files.  */
14338		  if (size < 6)
14339		    {
14340		      error (_("Bad subsection length (%u < 6)\n"),
14341			      (unsigned) size);
14342		      section_len = 0;
14343		      break;
14344		    }
14345
14346		  attr_len -= size;
14347		  end = p + size - 1;
14348		  assert (end <= contents + sect->sh_size);
14349		  p += 4;
14350
14351		  switch (tag)
14352		    {
14353		    case 1:
14354		      printf (_("File Attributes\n"));
14355		      break;
14356		    case 2:
14357		      printf (_("Section Attributes:"));
14358		      goto do_numlist;
14359		    case 3:
14360		      printf (_("Symbol Attributes:"));
14361		      /* Fall through.  */
14362		    do_numlist:
14363		      for (;;)
14364			{
14365			  unsigned int j;
14366
14367			  val = read_uleb128 (p, &j, end);
14368			  p += j;
14369			  if (val == 0)
14370			    break;
14371			  printf (" %d", val);
14372			}
14373		      printf ("\n");
14374		      break;
14375		    default:
14376		      printf (_("Unknown tag: %d\n"), tag);
14377		      public_section = FALSE;
14378		      break;
14379		    }
14380
14381		  if (public_section && display_pub_attribute != NULL)
14382		    {
14383		      while (p < end)
14384			p = display_pub_attribute (p, end);
14385		      assert (p <= end);
14386		    }
14387		  else if (gnu_section && display_proc_gnu_attribute != NULL)
14388		    {
14389		      while (p < end)
14390			p = display_gnu_attribute (p,
14391						   display_proc_gnu_attribute,
14392						   end);
14393		      assert (p <= end);
14394		    }
14395		  else if (p < end)
14396		    {
14397		      printf (_("  Unknown attribute:\n"));
14398		      display_raw_attribute (p, end);
14399		      p = end;
14400		    }
14401		  else
14402		    attr_len = 0;
14403		}
14404	    }
14405	}
14406      else
14407	printf (_("Unknown format '%c' (%d)\n"), *p, *p);
14408
14409      free (contents);
14410    }
14411  return 1;
14412}
14413
14414static int
14415process_arm_specific (FILE * file)
14416{
14417  return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
14418			     display_arm_attribute, NULL);
14419}
14420
14421static int
14422process_power_specific (FILE * file)
14423{
14424  return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14425			     display_power_gnu_attribute);
14426}
14427
14428static int
14429process_s390_specific (FILE * file)
14430{
14431  return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14432			     display_s390_gnu_attribute);
14433}
14434
14435static int
14436process_sparc_specific (FILE * file)
14437{
14438  return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14439			     display_sparc_gnu_attribute);
14440}
14441
14442static int
14443process_tic6x_specific (FILE * file)
14444{
14445  return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
14446			     display_tic6x_attribute, NULL);
14447}
14448
14449static int
14450process_msp430x_specific (FILE * file)
14451{
14452  return process_attributes (file, "mspabi", SHT_MSP430_ATTRIBUTES,
14453			     display_msp430x_attribute, NULL);
14454}
14455
14456/* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
14457   Print the Address, Access and Initial fields of an entry at VMA ADDR
14458   and return the VMA of the next entry, or -1 if there was a problem.
14459   Does not read from DATA_END or beyond.  */
14460
14461static bfd_vma
14462print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
14463		      unsigned char * data_end)
14464{
14465  printf ("  ");
14466  print_vma (addr, LONG_HEX);
14467  printf (" ");
14468  if (addr < pltgot + 0xfff0)
14469    printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
14470  else
14471    printf ("%10s", "");
14472  printf (" ");
14473  if (data == NULL)
14474    printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
14475  else
14476    {
14477      bfd_vma entry;
14478      unsigned char * from = data + addr - pltgot;
14479
14480      if (from + (is_32bit_elf ? 4 : 8) > data_end)
14481	{
14482	  warn (_("MIPS GOT entry extends beyond the end of available data\n"));
14483	  printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
14484	  return (bfd_vma) -1;
14485	}
14486      else
14487	{
14488	  entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14489	  print_vma (entry, LONG_HEX);
14490	}
14491    }
14492  return addr + (is_32bit_elf ? 4 : 8);
14493}
14494
14495/* DATA points to the contents of a MIPS PLT GOT that starts at VMA
14496   PLTGOT.  Print the Address and Initial fields of an entry at VMA
14497   ADDR and return the VMA of the next entry.  */
14498
14499static bfd_vma
14500print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
14501{
14502  printf ("  ");
14503  print_vma (addr, LONG_HEX);
14504  printf (" ");
14505  if (data == NULL)
14506    printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
14507  else
14508    {
14509      bfd_vma entry;
14510
14511      entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14512      print_vma (entry, LONG_HEX);
14513    }
14514  return addr + (is_32bit_elf ? 4 : 8);
14515}
14516
14517static void
14518print_mips_ases (unsigned int mask)
14519{
14520  if (mask & AFL_ASE_DSP)
14521    fputs ("\n\tDSP ASE", stdout);
14522  if (mask & AFL_ASE_DSPR2)
14523    fputs ("\n\tDSP R2 ASE", stdout);
14524  if (mask & AFL_ASE_DSPR3)
14525    fputs ("\n\tDSP R3 ASE", stdout);
14526  if (mask & AFL_ASE_EVA)
14527    fputs ("\n\tEnhanced VA Scheme", stdout);
14528  if (mask & AFL_ASE_MCU)
14529    fputs ("\n\tMCU (MicroController) ASE", stdout);
14530  if (mask & AFL_ASE_MDMX)
14531    fputs ("\n\tMDMX ASE", stdout);
14532  if (mask & AFL_ASE_MIPS3D)
14533    fputs ("\n\tMIPS-3D ASE", stdout);
14534  if (mask & AFL_ASE_MT)
14535    fputs ("\n\tMT ASE", stdout);
14536  if (mask & AFL_ASE_SMARTMIPS)
14537    fputs ("\n\tSmartMIPS ASE", stdout);
14538  if (mask & AFL_ASE_VIRT)
14539    fputs ("\n\tVZ ASE", stdout);
14540  if (mask & AFL_ASE_MSA)
14541    fputs ("\n\tMSA ASE", stdout);
14542  if (mask & AFL_ASE_MIPS16)
14543    fputs ("\n\tMIPS16 ASE", stdout);
14544  if (mask & AFL_ASE_MICROMIPS)
14545    fputs ("\n\tMICROMIPS ASE", stdout);
14546  if (mask & AFL_ASE_XPA)
14547    fputs ("\n\tXPA ASE", stdout);
14548  if (mask == 0)
14549    fprintf (stdout, "\n\t%s", _("None"));
14550  else if ((mask & ~AFL_ASE_MASK) != 0)
14551    fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
14552}
14553
14554static void
14555print_mips_isa_ext (unsigned int isa_ext)
14556{
14557  switch (isa_ext)
14558    {
14559    case 0:
14560      fputs (_("None"), stdout);
14561      break;
14562    case AFL_EXT_XLR:
14563      fputs ("RMI XLR", stdout);
14564      break;
14565    case AFL_EXT_OCTEON3:
14566      fputs ("Cavium Networks Octeon3", stdout);
14567      break;
14568    case AFL_EXT_OCTEON2:
14569      fputs ("Cavium Networks Octeon2", stdout);
14570      break;
14571    case AFL_EXT_OCTEONP:
14572      fputs ("Cavium Networks OcteonP", stdout);
14573      break;
14574    case AFL_EXT_LOONGSON_3A:
14575      fputs ("Loongson 3A", stdout);
14576      break;
14577    case AFL_EXT_OCTEON:
14578      fputs ("Cavium Networks Octeon", stdout);
14579      break;
14580    case AFL_EXT_5900:
14581      fputs ("Toshiba R5900", stdout);
14582      break;
14583    case AFL_EXT_4650:
14584      fputs ("MIPS R4650", stdout);
14585      break;
14586    case AFL_EXT_4010:
14587      fputs ("LSI R4010", stdout);
14588      break;
14589    case AFL_EXT_4100:
14590      fputs ("NEC VR4100", stdout);
14591      break;
14592    case AFL_EXT_3900:
14593      fputs ("Toshiba R3900", stdout);
14594      break;
14595    case AFL_EXT_10000:
14596      fputs ("MIPS R10000", stdout);
14597      break;
14598    case AFL_EXT_SB1:
14599      fputs ("Broadcom SB-1", stdout);
14600      break;
14601    case AFL_EXT_4111:
14602      fputs ("NEC VR4111/VR4181", stdout);
14603      break;
14604    case AFL_EXT_4120:
14605      fputs ("NEC VR4120", stdout);
14606      break;
14607    case AFL_EXT_5400:
14608      fputs ("NEC VR5400", stdout);
14609      break;
14610    case AFL_EXT_5500:
14611      fputs ("NEC VR5500", stdout);
14612      break;
14613    case AFL_EXT_LOONGSON_2E:
14614      fputs ("ST Microelectronics Loongson 2E", stdout);
14615      break;
14616    case AFL_EXT_LOONGSON_2F:
14617      fputs ("ST Microelectronics Loongson 2F", stdout);
14618      break;
14619    default:
14620      fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
14621    }
14622}
14623
14624static int
14625get_mips_reg_size (int reg_size)
14626{
14627  return (reg_size == AFL_REG_NONE) ? 0
14628	 : (reg_size == AFL_REG_32) ? 32
14629	 : (reg_size == AFL_REG_64) ? 64
14630	 : (reg_size == AFL_REG_128) ? 128
14631	 : -1;
14632}
14633
14634static int
14635process_mips_specific (FILE * file)
14636{
14637  Elf_Internal_Dyn * entry;
14638  Elf_Internal_Shdr *sect = NULL;
14639  size_t liblist_offset = 0;
14640  size_t liblistno = 0;
14641  size_t conflictsno = 0;
14642  size_t options_offset = 0;
14643  size_t conflicts_offset = 0;
14644  size_t pltrelsz = 0;
14645  size_t pltrel = 0;
14646  bfd_vma pltgot = 0;
14647  bfd_vma mips_pltgot = 0;
14648  bfd_vma jmprel = 0;
14649  bfd_vma local_gotno = 0;
14650  bfd_vma gotsym = 0;
14651  bfd_vma symtabno = 0;
14652
14653  process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14654		      display_mips_gnu_attribute);
14655
14656  sect = find_section (".MIPS.abiflags");
14657
14658  if (sect != NULL)
14659    {
14660      Elf_External_ABIFlags_v0 *abiflags_ext;
14661      Elf_Internal_ABIFlags_v0 abiflags_in;
14662
14663      if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
14664	fputs ("\nCorrupt ABI Flags section.\n", stdout);
14665      else
14666	{
14667	  abiflags_ext = get_data (NULL, file, sect->sh_offset, 1,
14668				   sect->sh_size, _("MIPS ABI Flags section"));
14669	  if (abiflags_ext)
14670	    {
14671	      abiflags_in.version = BYTE_GET (abiflags_ext->version);
14672	      abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
14673	      abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
14674	      abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
14675	      abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
14676	      abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
14677	      abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
14678	      abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
14679	      abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
14680	      abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
14681	      abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
14682
14683	      printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
14684	      printf ("\nISA: MIPS%d", abiflags_in.isa_level);
14685	      if (abiflags_in.isa_rev > 1)
14686		printf ("r%d", abiflags_in.isa_rev);
14687	      printf ("\nGPR size: %d",
14688		      get_mips_reg_size (abiflags_in.gpr_size));
14689	      printf ("\nCPR1 size: %d",
14690		      get_mips_reg_size (abiflags_in.cpr1_size));
14691	      printf ("\nCPR2 size: %d",
14692		      get_mips_reg_size (abiflags_in.cpr2_size));
14693	      fputs ("\nFP ABI: ", stdout);
14694	      print_mips_fp_abi_value (abiflags_in.fp_abi);
14695	      fputs ("ISA Extension: ", stdout);
14696	      print_mips_isa_ext (abiflags_in.isa_ext);
14697	      fputs ("\nASEs:", stdout);
14698	      print_mips_ases (abiflags_in.ases);
14699	      printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
14700	      printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
14701	      fputc ('\n', stdout);
14702	      free (abiflags_ext);
14703	    }
14704	}
14705    }
14706
14707  /* We have a lot of special sections.  Thanks SGI!  */
14708  if (dynamic_section == NULL)
14709    /* No information available.  */
14710    return 0;
14711
14712  for (entry = dynamic_section;
14713       /* PR 17531 file: 012-50589-0.004.  */
14714       entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
14715       ++entry)
14716    switch (entry->d_tag)
14717      {
14718      case DT_MIPS_LIBLIST:
14719	liblist_offset
14720	  = offset_from_vma (file, entry->d_un.d_val,
14721			     liblistno * sizeof (Elf32_External_Lib));
14722	break;
14723      case DT_MIPS_LIBLISTNO:
14724	liblistno = entry->d_un.d_val;
14725	break;
14726      case DT_MIPS_OPTIONS:
14727	options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
14728	break;
14729      case DT_MIPS_CONFLICT:
14730	conflicts_offset
14731	  = offset_from_vma (file, entry->d_un.d_val,
14732			     conflictsno * sizeof (Elf32_External_Conflict));
14733	break;
14734      case DT_MIPS_CONFLICTNO:
14735	conflictsno = entry->d_un.d_val;
14736	break;
14737      case DT_PLTGOT:
14738	pltgot = entry->d_un.d_ptr;
14739	break;
14740      case DT_MIPS_LOCAL_GOTNO:
14741	local_gotno = entry->d_un.d_val;
14742	break;
14743      case DT_MIPS_GOTSYM:
14744	gotsym = entry->d_un.d_val;
14745	break;
14746      case DT_MIPS_SYMTABNO:
14747	symtabno = entry->d_un.d_val;
14748	break;
14749      case DT_MIPS_PLTGOT:
14750	mips_pltgot = entry->d_un.d_ptr;
14751	break;
14752      case DT_PLTREL:
14753	pltrel = entry->d_un.d_val;
14754	break;
14755      case DT_PLTRELSZ:
14756	pltrelsz = entry->d_un.d_val;
14757	break;
14758      case DT_JMPREL:
14759	jmprel = entry->d_un.d_ptr;
14760	break;
14761      default:
14762	break;
14763      }
14764
14765  if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
14766    {
14767      Elf32_External_Lib * elib;
14768      size_t cnt;
14769
14770      elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
14771                                              liblistno,
14772                                              sizeof (Elf32_External_Lib),
14773                                              _("liblist section data"));
14774      if (elib)
14775	{
14776	  printf (_("\nSection '.liblist' contains %lu entries:\n"),
14777		  (unsigned long) liblistno);
14778	  fputs (_("     Library              Time Stamp          Checksum   Version Flags\n"),
14779		 stdout);
14780
14781	  for (cnt = 0; cnt < liblistno; ++cnt)
14782	    {
14783	      Elf32_Lib liblist;
14784	      time_t atime;
14785	      char timebuf[128];
14786	      struct tm * tmp;
14787
14788	      liblist.l_name = BYTE_GET (elib[cnt].l_name);
14789	      atime = BYTE_GET (elib[cnt].l_time_stamp);
14790	      liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
14791	      liblist.l_version = BYTE_GET (elib[cnt].l_version);
14792	      liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
14793
14794	      tmp = gmtime (&atime);
14795	      snprintf (timebuf, sizeof (timebuf),
14796			"%04u-%02u-%02uT%02u:%02u:%02u",
14797			tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
14798			tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
14799
14800	      printf ("%3lu: ", (unsigned long) cnt);
14801	      if (VALID_DYNAMIC_NAME (liblist.l_name))
14802		print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
14803	      else
14804		printf (_("<corrupt: %9ld>"), liblist.l_name);
14805	      printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
14806		      liblist.l_version);
14807
14808	      if (liblist.l_flags == 0)
14809		puts (_(" NONE"));
14810	      else
14811		{
14812		  static const struct
14813		  {
14814		    const char * name;
14815		    int bit;
14816		  }
14817		  l_flags_vals[] =
14818		  {
14819		    { " EXACT_MATCH", LL_EXACT_MATCH },
14820		    { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
14821		    { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
14822		    { " EXPORTS", LL_EXPORTS },
14823		    { " DELAY_LOAD", LL_DELAY_LOAD },
14824		    { " DELTA", LL_DELTA }
14825		  };
14826		  int flags = liblist.l_flags;
14827		  size_t fcnt;
14828
14829		  for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
14830		    if ((flags & l_flags_vals[fcnt].bit) != 0)
14831		      {
14832			fputs (l_flags_vals[fcnt].name, stdout);
14833			flags ^= l_flags_vals[fcnt].bit;
14834		      }
14835		  if (flags != 0)
14836		    printf (" %#x", (unsigned int) flags);
14837
14838		  puts ("");
14839		}
14840	    }
14841
14842	  free (elib);
14843	}
14844    }
14845
14846  if (options_offset != 0)
14847    {
14848      Elf_External_Options * eopt;
14849      Elf_Internal_Options * iopt;
14850      Elf_Internal_Options * option;
14851      size_t offset;
14852      int cnt;
14853      sect = section_headers;
14854
14855      /* Find the section header so that we get the size.  */
14856      sect = find_section_by_type (SHT_MIPS_OPTIONS);
14857      /* PR 17533 file: 012-277276-0.004.  */
14858      if (sect == NULL)
14859	{
14860	  error (_("No MIPS_OPTIONS header found\n"));
14861	  return 0;
14862	}
14863
14864      eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
14865                                                sect->sh_size, _("options"));
14866      if (eopt)
14867	{
14868	  iopt = (Elf_Internal_Options *)
14869              cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
14870	  if (iopt == NULL)
14871	    {
14872	      error (_("Out of memory allocating space for MIPS options\n"));
14873	      return 0;
14874	    }
14875
14876	  offset = cnt = 0;
14877	  option = iopt;
14878
14879	  while (offset <= sect->sh_size - sizeof (* eopt))
14880	    {
14881	      Elf_External_Options * eoption;
14882
14883	      eoption = (Elf_External_Options *) ((char *) eopt + offset);
14884
14885	      option->kind = BYTE_GET (eoption->kind);
14886	      option->size = BYTE_GET (eoption->size);
14887	      option->section = BYTE_GET (eoption->section);
14888	      option->info = BYTE_GET (eoption->info);
14889
14890	      /* PR 17531: file: ffa0fa3b.  */
14891	      if (option->size < sizeof (* eopt)
14892		  || offset + option->size > sect->sh_size)
14893		{
14894		  error (_("Invalid size (%u) for MIPS option\n"), option->size);
14895		  return 0;
14896		}
14897	      offset += option->size;
14898
14899	      ++option;
14900	      ++cnt;
14901	    }
14902
14903	  printf (_("\nSection '%s' contains %d entries:\n"),
14904		  printable_section_name (sect), cnt);
14905
14906	  option = iopt;
14907	  offset = 0;
14908
14909	  while (cnt-- > 0)
14910	    {
14911	      size_t len;
14912
14913	      switch (option->kind)
14914		{
14915		case ODK_NULL:
14916		  /* This shouldn't happen.  */
14917		  printf (" NULL       %d %lx", option->section, option->info);
14918		  break;
14919		case ODK_REGINFO:
14920		  printf (" REGINFO    ");
14921		  if (elf_header.e_machine == EM_MIPS)
14922		    {
14923		      /* 32bit form.  */
14924		      Elf32_External_RegInfo * ereg;
14925		      Elf32_RegInfo reginfo;
14926
14927		      ereg = (Elf32_External_RegInfo *) (option + 1);
14928		      reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
14929		      reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
14930		      reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
14931		      reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
14932		      reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
14933		      reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
14934
14935		      printf ("GPR %08lx  GP 0x%lx\n",
14936			      reginfo.ri_gprmask,
14937			      (unsigned long) reginfo.ri_gp_value);
14938		      printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
14939			      reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
14940			      reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
14941		    }
14942		  else
14943		    {
14944		      /* 64 bit form.  */
14945		      Elf64_External_RegInfo * ereg;
14946		      Elf64_Internal_RegInfo reginfo;
14947
14948		      ereg = (Elf64_External_RegInfo *) (option + 1);
14949		      reginfo.ri_gprmask    = BYTE_GET (ereg->ri_gprmask);
14950		      reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
14951		      reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
14952		      reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
14953		      reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
14954		      reginfo.ri_gp_value   = BYTE_GET (ereg->ri_gp_value);
14955
14956		      printf ("GPR %08lx  GP 0x",
14957			      reginfo.ri_gprmask);
14958		      printf_vma (reginfo.ri_gp_value);
14959		      printf ("\n");
14960
14961		      printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
14962			      reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
14963			      reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
14964		    }
14965		  ++option;
14966		  continue;
14967		case ODK_EXCEPTIONS:
14968		  fputs (" EXCEPTIONS fpe_min(", stdout);
14969		  process_mips_fpe_exception (option->info & OEX_FPU_MIN);
14970		  fputs (") fpe_max(", stdout);
14971		  process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
14972		  fputs (")", stdout);
14973
14974		  if (option->info & OEX_PAGE0)
14975		    fputs (" PAGE0", stdout);
14976		  if (option->info & OEX_SMM)
14977		    fputs (" SMM", stdout);
14978		  if (option->info & OEX_FPDBUG)
14979		    fputs (" FPDBUG", stdout);
14980		  if (option->info & OEX_DISMISS)
14981		    fputs (" DISMISS", stdout);
14982		  break;
14983		case ODK_PAD:
14984		  fputs (" PAD       ", stdout);
14985		  if (option->info & OPAD_PREFIX)
14986		    fputs (" PREFIX", stdout);
14987		  if (option->info & OPAD_POSTFIX)
14988		    fputs (" POSTFIX", stdout);
14989		  if (option->info & OPAD_SYMBOL)
14990		    fputs (" SYMBOL", stdout);
14991		  break;
14992		case ODK_HWPATCH:
14993		  fputs (" HWPATCH   ", stdout);
14994		  if (option->info & OHW_R4KEOP)
14995		    fputs (" R4KEOP", stdout);
14996		  if (option->info & OHW_R8KPFETCH)
14997		    fputs (" R8KPFETCH", stdout);
14998		  if (option->info & OHW_R5KEOP)
14999		    fputs (" R5KEOP", stdout);
15000		  if (option->info & OHW_R5KCVTL)
15001		    fputs (" R5KCVTL", stdout);
15002		  break;
15003		case ODK_FILL:
15004		  fputs (" FILL       ", stdout);
15005		  /* XXX Print content of info word?  */
15006		  break;
15007		case ODK_TAGS:
15008		  fputs (" TAGS       ", stdout);
15009		  /* XXX Print content of info word?  */
15010		  break;
15011		case ODK_HWAND:
15012		  fputs (" HWAND     ", stdout);
15013		  if (option->info & OHWA0_R4KEOP_CHECKED)
15014		    fputs (" R4KEOP_CHECKED", stdout);
15015		  if (option->info & OHWA0_R4KEOP_CLEAN)
15016		    fputs (" R4KEOP_CLEAN", stdout);
15017		  break;
15018		case ODK_HWOR:
15019		  fputs (" HWOR      ", stdout);
15020		  if (option->info & OHWA0_R4KEOP_CHECKED)
15021		    fputs (" R4KEOP_CHECKED", stdout);
15022		  if (option->info & OHWA0_R4KEOP_CLEAN)
15023		    fputs (" R4KEOP_CLEAN", stdout);
15024		  break;
15025		case ODK_GP_GROUP:
15026		  printf (" GP_GROUP  %#06lx  self-contained %#06lx",
15027			  option->info & OGP_GROUP,
15028			  (option->info & OGP_SELF) >> 16);
15029		  break;
15030		case ODK_IDENT:
15031		  printf (" IDENT     %#06lx  self-contained %#06lx",
15032			  option->info & OGP_GROUP,
15033			  (option->info & OGP_SELF) >> 16);
15034		  break;
15035		default:
15036		  /* This shouldn't happen.  */
15037		  printf (" %3d ???     %d %lx",
15038			  option->kind, option->section, option->info);
15039		  break;
15040		}
15041
15042	      len = sizeof (* eopt);
15043	      while (len < option->size)
15044		{
15045		  unsigned char datum = * ((unsigned char *) eopt + offset + len);
15046
15047		  if (ISPRINT (datum))
15048		    printf ("%c", datum);
15049		  else
15050		    printf ("\\%03o", datum);
15051		  len ++;
15052		}
15053	      fputs ("\n", stdout);
15054
15055	      offset += option->size;
15056	      ++option;
15057	    }
15058
15059	  free (eopt);
15060	}
15061    }
15062
15063  if (conflicts_offset != 0 && conflictsno != 0)
15064    {
15065      Elf32_Conflict * iconf;
15066      size_t cnt;
15067
15068      if (dynamic_symbols == NULL)
15069	{
15070	  error (_("conflict list found without a dynamic symbol table\n"));
15071	  return 0;
15072	}
15073
15074      iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
15075      if (iconf == NULL)
15076	{
15077	  error (_("Out of memory allocating space for dynamic conflicts\n"));
15078	  return 0;
15079	}
15080
15081      if (is_32bit_elf)
15082	{
15083	  Elf32_External_Conflict * econf32;
15084
15085	  econf32 = (Elf32_External_Conflict *)
15086              get_data (NULL, file, conflicts_offset, conflictsno,
15087                        sizeof (* econf32), _("conflict"));
15088	  if (!econf32)
15089	    return 0;
15090
15091	  for (cnt = 0; cnt < conflictsno; ++cnt)
15092	    iconf[cnt] = BYTE_GET (econf32[cnt]);
15093
15094	  free (econf32);
15095	}
15096      else
15097	{
15098	  Elf64_External_Conflict * econf64;
15099
15100	  econf64 = (Elf64_External_Conflict *)
15101              get_data (NULL, file, conflicts_offset, conflictsno,
15102                        sizeof (* econf64), _("conflict"));
15103	  if (!econf64)
15104	    return 0;
15105
15106	  for (cnt = 0; cnt < conflictsno; ++cnt)
15107	    iconf[cnt] = BYTE_GET (econf64[cnt]);
15108
15109	  free (econf64);
15110	}
15111
15112      printf (_("\nSection '.conflict' contains %lu entries:\n"),
15113	      (unsigned long) conflictsno);
15114      puts (_("  Num:    Index       Value  Name"));
15115
15116      for (cnt = 0; cnt < conflictsno; ++cnt)
15117	{
15118	  printf ("%5lu: %8lu  ", (unsigned long) cnt, iconf[cnt]);
15119
15120	  if (iconf[cnt] >= num_dynamic_syms)
15121	    printf (_("<corrupt symbol index>"));
15122	  else
15123	    {
15124	      Elf_Internal_Sym * psym;
15125
15126	      psym = & dynamic_symbols[iconf[cnt]];
15127	      print_vma (psym->st_value, FULL_HEX);
15128	      putchar (' ');
15129	      if (VALID_DYNAMIC_NAME (psym->st_name))
15130		print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
15131	      else
15132		printf (_("<corrupt: %14ld>"), psym->st_name);
15133	    }
15134	  putchar ('\n');
15135	}
15136
15137      free (iconf);
15138    }
15139
15140  if (pltgot != 0 && local_gotno != 0)
15141    {
15142      bfd_vma ent, local_end, global_end;
15143      size_t i, offset;
15144      unsigned char * data;
15145      unsigned char * data_end;
15146      int addr_size;
15147
15148      ent = pltgot;
15149      addr_size = (is_32bit_elf ? 4 : 8);
15150      local_end = pltgot + local_gotno * addr_size;
15151
15152      /* PR binutils/17533 file: 012-111227-0.004  */
15153      if (symtabno < gotsym)
15154	{
15155	  error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
15156		 (unsigned long) gotsym, (unsigned long) symtabno);
15157	  return 0;
15158	}
15159
15160      global_end = local_end + (symtabno - gotsym) * addr_size;
15161      /* PR 17531: file: 54c91a34.  */
15162      if (global_end < local_end)
15163	{
15164	  error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
15165	  return 0;
15166	}
15167
15168      offset = offset_from_vma (file, pltgot, global_end - pltgot);
15169      data = (unsigned char *) get_data (NULL, file, offset,
15170                                         global_end - pltgot, 1,
15171					 _("Global Offset Table data"));
15172      if (data == NULL)
15173	return 0;
15174      data_end = data + (global_end - pltgot);
15175
15176      printf (_("\nPrimary GOT:\n"));
15177      printf (_(" Canonical gp value: "));
15178      print_vma (pltgot + 0x7ff0, LONG_HEX);
15179      printf ("\n\n");
15180
15181      printf (_(" Reserved entries:\n"));
15182      printf (_("  %*s %10s %*s Purpose\n"),
15183	      addr_size * 2, _("Address"), _("Access"),
15184	      addr_size * 2, _("Initial"));
15185      ent = print_mips_got_entry (data, pltgot, ent, data_end);
15186      printf (_(" Lazy resolver\n"));
15187      if (ent == (bfd_vma) -1)
15188	goto got_print_fail;
15189      if (data
15190	  && (byte_get (data + ent - pltgot, addr_size)
15191	      >> (addr_size * 8 - 1)) != 0)
15192	{
15193	  ent = print_mips_got_entry (data, pltgot, ent, data_end);
15194	  printf (_(" Module pointer (GNU extension)\n"));
15195	  if (ent == (bfd_vma) -1)
15196	    goto got_print_fail;
15197	}
15198      printf ("\n");
15199
15200      if (ent < local_end)
15201	{
15202	  printf (_(" Local entries:\n"));
15203	  printf ("  %*s %10s %*s\n",
15204		  addr_size * 2, _("Address"), _("Access"),
15205		  addr_size * 2, _("Initial"));
15206	  while (ent < local_end)
15207	    {
15208	      ent = print_mips_got_entry (data, pltgot, ent, data_end);
15209	      printf ("\n");
15210	      if (ent == (bfd_vma) -1)
15211		goto got_print_fail;
15212	    }
15213	  printf ("\n");
15214	}
15215
15216      if (gotsym < symtabno)
15217	{
15218	  int sym_width;
15219
15220	  printf (_(" Global entries:\n"));
15221	  printf ("  %*s %10s %*s %*s %-7s %3s %s\n",
15222		  addr_size * 2, _("Address"),
15223		  _("Access"),
15224		  addr_size * 2, _("Initial"),
15225		  addr_size * 2, _("Sym.Val."),
15226		  _("Type"),
15227		  /* Note for translators: "Ndx" = abbreviated form of "Index".  */
15228		  _("Ndx"), _("Name"));
15229
15230	  sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
15231
15232	  for (i = gotsym; i < symtabno; i++)
15233	    {
15234	      ent = print_mips_got_entry (data, pltgot, ent, data_end);
15235	      printf (" ");
15236
15237	      if (dynamic_symbols == NULL)
15238		printf (_("<no dynamic symbols>"));
15239	      else if (i < num_dynamic_syms)
15240		{
15241		  Elf_Internal_Sym * psym = dynamic_symbols + i;
15242
15243		  print_vma (psym->st_value, LONG_HEX);
15244		  printf (" %-7s %3s ",
15245			  get_symbol_type (ELF_ST_TYPE (psym->st_info)),
15246			  get_symbol_index_type (psym->st_shndx));
15247
15248		  if (VALID_DYNAMIC_NAME (psym->st_name))
15249		    print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
15250		  else
15251		    printf (_("<corrupt: %14ld>"), psym->st_name);
15252		}
15253	      else
15254		printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
15255			(unsigned long) i);
15256
15257	      printf ("\n");
15258	      if (ent == (bfd_vma) -1)
15259		break;
15260	    }
15261	  printf ("\n");
15262	}
15263
15264    got_print_fail:
15265      if (data)
15266	free (data);
15267    }
15268
15269  if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
15270    {
15271      bfd_vma ent, end;
15272      size_t offset, rel_offset;
15273      unsigned long count, i;
15274      unsigned char * data;
15275      int addr_size, sym_width;
15276      Elf_Internal_Rela * rels;
15277
15278      rel_offset = offset_from_vma (file, jmprel, pltrelsz);
15279      if (pltrel == DT_RELA)
15280	{
15281	  if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
15282	    return 0;
15283	}
15284      else
15285	{
15286	  if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
15287	    return 0;
15288	}
15289
15290      ent = mips_pltgot;
15291      addr_size = (is_32bit_elf ? 4 : 8);
15292      end = mips_pltgot + (2 + count) * addr_size;
15293
15294      offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
15295      data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
15296                                         1, _("Procedure Linkage Table data"));
15297      if (data == NULL)
15298	return 0;
15299
15300      printf ("\nPLT GOT:\n\n");
15301      printf (_(" Reserved entries:\n"));
15302      printf (_("  %*s %*s Purpose\n"),
15303	      addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
15304      ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
15305      printf (_(" PLT lazy resolver\n"));
15306      ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
15307      printf (_(" Module pointer\n"));
15308      printf ("\n");
15309
15310      printf (_(" Entries:\n"));
15311      printf ("  %*s %*s %*s %-7s %3s %s\n",
15312	      addr_size * 2, _("Address"),
15313	      addr_size * 2, _("Initial"),
15314	      addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
15315      sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
15316      for (i = 0; i < count; i++)
15317	{
15318	  unsigned long idx = get_reloc_symindex (rels[i].r_info);
15319
15320	  ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
15321	  printf (" ");
15322
15323	  if (idx >= num_dynamic_syms)
15324	    printf (_("<corrupt symbol index: %lu>"), idx);
15325	  else
15326	    {
15327	      Elf_Internal_Sym * psym = dynamic_symbols + idx;
15328
15329	      print_vma (psym->st_value, LONG_HEX);
15330	      printf (" %-7s %3s ",
15331		      get_symbol_type (ELF_ST_TYPE (psym->st_info)),
15332		      get_symbol_index_type (psym->st_shndx));
15333	      if (VALID_DYNAMIC_NAME (psym->st_name))
15334		print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
15335	      else
15336		printf (_("<corrupt: %14ld>"), psym->st_name);
15337	    }
15338	  printf ("\n");
15339	}
15340      printf ("\n");
15341
15342      if (data)
15343	free (data);
15344      free (rels);
15345    }
15346
15347  return 1;
15348}
15349
15350static int
15351process_nds32_specific (FILE * file)
15352{
15353  Elf_Internal_Shdr *sect = NULL;
15354
15355  sect = find_section (".nds32_e_flags");
15356  if (sect != NULL)
15357    {
15358      unsigned int *flag;
15359
15360      printf ("\nNDS32 elf flags section:\n");
15361      flag = get_data (NULL, file, sect->sh_offset, 1,
15362		       sect->sh_size, _("NDS32 elf flags section"));
15363
15364      switch ((*flag) & 0x3)
15365	{
15366	case 0:
15367	  printf ("(VEC_SIZE):\tNo entry.\n");
15368	  break;
15369	case 1:
15370	  printf ("(VEC_SIZE):\t4 bytes\n");
15371	  break;
15372	case 2:
15373	  printf ("(VEC_SIZE):\t16 bytes\n");
15374	  break;
15375	case 3:
15376	  printf ("(VEC_SIZE):\treserved\n");
15377	  break;
15378	}
15379    }
15380
15381  return TRUE;
15382}
15383
15384static int
15385process_gnu_liblist (FILE * file)
15386{
15387  Elf_Internal_Shdr * section;
15388  Elf_Internal_Shdr * string_sec;
15389  Elf32_External_Lib * elib;
15390  char * strtab;
15391  size_t strtab_size;
15392  size_t cnt;
15393  unsigned i;
15394
15395  if (! do_arch)
15396    return 0;
15397
15398  for (i = 0, section = section_headers;
15399       i < elf_header.e_shnum;
15400       i++, section++)
15401    {
15402      switch (section->sh_type)
15403	{
15404	case SHT_GNU_LIBLIST:
15405	  if (section->sh_link >= elf_header.e_shnum)
15406	    break;
15407
15408	  elib = (Elf32_External_Lib *)
15409              get_data (NULL, file, section->sh_offset, 1, section->sh_size,
15410                        _("liblist section data"));
15411
15412	  if (elib == NULL)
15413	    break;
15414	  string_sec = section_headers + section->sh_link;
15415
15416	  strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
15417                                      string_sec->sh_size,
15418                                      _("liblist string table"));
15419	  if (strtab == NULL
15420	      || section->sh_entsize != sizeof (Elf32_External_Lib))
15421	    {
15422	      free (elib);
15423	      free (strtab);
15424	      break;
15425	    }
15426	  strtab_size = string_sec->sh_size;
15427
15428	  printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
15429		  printable_section_name (section),
15430		  (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
15431
15432	  puts (_("     Library              Time Stamp          Checksum   Version Flags"));
15433
15434	  for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
15435	       ++cnt)
15436	    {
15437	      Elf32_Lib liblist;
15438	      time_t atime;
15439	      char timebuf[128];
15440	      struct tm * tmp;
15441
15442	      liblist.l_name = BYTE_GET (elib[cnt].l_name);
15443	      atime = BYTE_GET (elib[cnt].l_time_stamp);
15444	      liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
15445	      liblist.l_version = BYTE_GET (elib[cnt].l_version);
15446	      liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
15447
15448	      tmp = gmtime (&atime);
15449	      snprintf (timebuf, sizeof (timebuf),
15450			"%04u-%02u-%02uT%02u:%02u:%02u",
15451			tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
15452			tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
15453
15454	      printf ("%3lu: ", (unsigned long) cnt);
15455	      if (do_wide)
15456		printf ("%-20s", liblist.l_name < strtab_size
15457			? strtab + liblist.l_name : _("<corrupt>"));
15458	      else
15459		printf ("%-20.20s", liblist.l_name < strtab_size
15460			? strtab + liblist.l_name : _("<corrupt>"));
15461	      printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
15462		      liblist.l_version, liblist.l_flags);
15463	    }
15464
15465	  free (elib);
15466	  free (strtab);
15467	}
15468    }
15469
15470  return 1;
15471}
15472
15473static const char *
15474get_note_type (unsigned e_type)
15475{
15476  static char buff[64];
15477
15478  if (elf_header.e_type == ET_CORE)
15479    switch (e_type)
15480      {
15481      case NT_AUXV:
15482	return _("NT_AUXV (auxiliary vector)");
15483      case NT_PRSTATUS:
15484	return _("NT_PRSTATUS (prstatus structure)");
15485      case NT_FPREGSET:
15486	return _("NT_FPREGSET (floating point registers)");
15487      case NT_PRPSINFO:
15488	return _("NT_PRPSINFO (prpsinfo structure)");
15489      case NT_TASKSTRUCT:
15490	return _("NT_TASKSTRUCT (task structure)");
15491      case NT_PRXFPREG:
15492	return _("NT_PRXFPREG (user_xfpregs structure)");
15493      case NT_PPC_VMX:
15494	return _("NT_PPC_VMX (ppc Altivec registers)");
15495      case NT_PPC_VSX:
15496	return _("NT_PPC_VSX (ppc VSX registers)");
15497      case NT_386_TLS:
15498	return _("NT_386_TLS (x86 TLS information)");
15499      case NT_386_IOPERM:
15500	return _("NT_386_IOPERM (x86 I/O permissions)");
15501      case NT_X86_XSTATE:
15502	return _("NT_X86_XSTATE (x86 XSAVE extended state)");
15503      case NT_S390_HIGH_GPRS:
15504	return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
15505      case NT_S390_TIMER:
15506	return _("NT_S390_TIMER (s390 timer register)");
15507      case NT_S390_TODCMP:
15508	return _("NT_S390_TODCMP (s390 TOD comparator register)");
15509      case NT_S390_TODPREG:
15510	return _("NT_S390_TODPREG (s390 TOD programmable register)");
15511      case NT_S390_CTRS:
15512	return _("NT_S390_CTRS (s390 control registers)");
15513      case NT_S390_PREFIX:
15514	return _("NT_S390_PREFIX (s390 prefix register)");
15515      case NT_S390_LAST_BREAK:
15516	return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
15517      case NT_S390_SYSTEM_CALL:
15518	return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
15519      case NT_S390_TDB:
15520	return _("NT_S390_TDB (s390 transaction diagnostic block)");
15521      case NT_S390_VXRS_LOW:
15522	return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
15523      case NT_S390_VXRS_HIGH:
15524	return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
15525      case NT_ARM_VFP:
15526	return _("NT_ARM_VFP (arm VFP registers)");
15527      case NT_ARM_TLS:
15528	return _("NT_ARM_TLS (AArch TLS registers)");
15529      case NT_ARM_HW_BREAK:
15530	return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
15531      case NT_ARM_HW_WATCH:
15532	return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
15533      case NT_PSTATUS:
15534	return _("NT_PSTATUS (pstatus structure)");
15535      case NT_FPREGS:
15536	return _("NT_FPREGS (floating point registers)");
15537      case NT_PSINFO:
15538	return _("NT_PSINFO (psinfo structure)");
15539      case NT_LWPSTATUS:
15540	return _("NT_LWPSTATUS (lwpstatus_t structure)");
15541      case NT_LWPSINFO:
15542	return _("NT_LWPSINFO (lwpsinfo_t structure)");
15543      case NT_WIN32PSTATUS:
15544	return _("NT_WIN32PSTATUS (win32_pstatus structure)");
15545      case NT_SIGINFO:
15546	return _("NT_SIGINFO (siginfo_t data)");
15547      case NT_FILE:
15548	return _("NT_FILE (mapped files)");
15549      default:
15550	break;
15551      }
15552  else
15553    switch (e_type)
15554      {
15555      case NT_VERSION:
15556	return _("NT_VERSION (version)");
15557      case NT_ARCH:
15558	return _("NT_ARCH (architecture)");
15559      default:
15560	break;
15561      }
15562
15563  snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15564  return buff;
15565}
15566
15567static int
15568print_core_note (Elf_Internal_Note *pnote)
15569{
15570  unsigned int addr_size = is_32bit_elf ? 4 : 8;
15571  bfd_vma count, page_size;
15572  unsigned char *descdata, *filenames, *descend;
15573
15574  if (pnote->type != NT_FILE)
15575    return 1;
15576
15577#ifndef BFD64
15578  if (!is_32bit_elf)
15579    {
15580      printf (_("    Cannot decode 64-bit note in 32-bit build\n"));
15581      /* Still "successful".  */
15582      return 1;
15583    }
15584#endif
15585
15586  if (pnote->descsz < 2 * addr_size)
15587    {
15588      printf (_("    Malformed note - too short for header\n"));
15589      return 0;
15590    }
15591
15592  descdata = (unsigned char *) pnote->descdata;
15593  descend = descdata + pnote->descsz;
15594
15595  if (descdata[pnote->descsz - 1] != '\0')
15596    {
15597      printf (_("    Malformed note - does not end with \\0\n"));
15598      return 0;
15599    }
15600
15601  count = byte_get (descdata, addr_size);
15602  descdata += addr_size;
15603
15604  page_size = byte_get (descdata, addr_size);
15605  descdata += addr_size;
15606
15607  if (pnote->descsz < 2 * addr_size + count * 3 * addr_size)
15608    {
15609      printf (_("    Malformed note - too short for supplied file count\n"));
15610      return 0;
15611    }
15612
15613  printf (_("    Page size: "));
15614  print_vma (page_size, DEC);
15615  printf ("\n");
15616
15617  printf (_("    %*s%*s%*s\n"),
15618	  (int) (2 + 2 * addr_size), _("Start"),
15619	  (int) (4 + 2 * addr_size), _("End"),
15620	  (int) (4 + 2 * addr_size), _("Page Offset"));
15621  filenames = descdata + count * 3 * addr_size;
15622  while (count-- > 0)
15623    {
15624      bfd_vma start, end, file_ofs;
15625
15626      if (filenames == descend)
15627	{
15628	  printf (_("    Malformed note - filenames end too early\n"));
15629	  return 0;
15630	}
15631
15632      start = byte_get (descdata, addr_size);
15633      descdata += addr_size;
15634      end = byte_get (descdata, addr_size);
15635      descdata += addr_size;
15636      file_ofs = byte_get (descdata, addr_size);
15637      descdata += addr_size;
15638
15639      printf ("    ");
15640      print_vma (start, FULL_HEX);
15641      printf ("  ");
15642      print_vma (end, FULL_HEX);
15643      printf ("  ");
15644      print_vma (file_ofs, FULL_HEX);
15645      printf ("\n        %s\n", filenames);
15646
15647      filenames += 1 + strlen ((char *) filenames);
15648    }
15649
15650  return 1;
15651}
15652
15653static const char *
15654get_gnu_elf_note_type (unsigned e_type)
15655{
15656  /* NB/ Keep this switch statement in sync with print_gnu_note ().  */
15657  switch (e_type)
15658    {
15659    case NT_GNU_ABI_TAG:
15660      return _("NT_GNU_ABI_TAG (ABI version tag)");
15661    case NT_GNU_HWCAP:
15662      return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
15663    case NT_GNU_BUILD_ID:
15664      return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
15665    case NT_GNU_GOLD_VERSION:
15666      return _("NT_GNU_GOLD_VERSION (gold version)");
15667    default:
15668      {
15669	static char buff[64];
15670
15671	snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15672	return buff;
15673      }
15674    }
15675}
15676
15677static int
15678print_gnu_note (Elf_Internal_Note *pnote)
15679{
15680  /* NB/ Keep this switch statement in sync with get_gnu_elf_note_type ().  */
15681  switch (pnote->type)
15682    {
15683    case NT_GNU_BUILD_ID:
15684      {
15685	unsigned long i;
15686
15687	printf (_("    Build ID: "));
15688	for (i = 0; i < pnote->descsz; ++i)
15689	  printf ("%02x", pnote->descdata[i] & 0xff);
15690	printf ("\n");
15691      }
15692      break;
15693
15694    case NT_GNU_ABI_TAG:
15695      {
15696	unsigned long os, major, minor, subminor;
15697	const char *osname;
15698
15699	/* PR 17531: file: 030-599401-0.004.  */
15700	if (pnote->descsz < 16)
15701	  {
15702	    printf (_("    <corrupt GNU_ABI_TAG>\n"));
15703	    break;
15704	  }
15705
15706	os = byte_get ((unsigned char *) pnote->descdata, 4);
15707	major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
15708	minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
15709	subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
15710
15711	switch (os)
15712	  {
15713	  case GNU_ABI_TAG_LINUX:
15714	    osname = "Linux";
15715	    break;
15716	  case GNU_ABI_TAG_HURD:
15717	    osname = "Hurd";
15718	    break;
15719	  case GNU_ABI_TAG_SOLARIS:
15720	    osname = "Solaris";
15721	    break;
15722	  case GNU_ABI_TAG_FREEBSD:
15723	    osname = "FreeBSD";
15724	    break;
15725	  case GNU_ABI_TAG_NETBSD:
15726	    osname = "NetBSD";
15727	    break;
15728	  case GNU_ABI_TAG_SYLLABLE:
15729	    osname = "Syllable";
15730	    break;
15731	  case GNU_ABI_TAG_NACL:
15732	    osname = "NaCl";
15733	    break;
15734	  default:
15735	    osname = "Unknown";
15736	    break;
15737	  }
15738
15739	printf (_("    OS: %s, ABI: %ld.%ld.%ld\n"), osname,
15740		major, minor, subminor);
15741      }
15742      break;
15743
15744    case NT_GNU_GOLD_VERSION:
15745      {
15746	unsigned long i;
15747
15748	printf (_("    Version: "));
15749	for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
15750	  printf ("%c", pnote->descdata[i]);
15751	printf ("\n");
15752      }
15753      break;
15754
15755    case NT_GNU_HWCAP:
15756      {
15757	unsigned long num_entries, mask;
15758
15759	/* Hardware capabilities information.  Word 0 is the number of entries.
15760	   Word 1 is a bitmask of enabled entries.  The rest of the descriptor
15761	   is a series of entries, where each entry is a single byte followed
15762	   by a nul terminated string.  The byte gives the bit number to test
15763	   if enabled in the bitmask.  */
15764	printf (_("      Hardware Capabilities: "));
15765	if (pnote->descsz < 8)
15766	  {
15767	    printf (_("<corrupt GNU_HWCAP>\n"));
15768	    break;
15769	  }
15770	num_entries = byte_get ((unsigned char *) pnote->descdata, 4);
15771	mask = byte_get ((unsigned char *) pnote->descdata + 4, 4);
15772	printf (_("num entries: %ld, enabled mask: %lx\n"), num_entries, mask);
15773	/* FIXME: Add code to display the entries... */
15774      }
15775      break;
15776
15777    default:
15778      /* Handle unrecognised types.  An error message should have already been
15779	 created by get_gnu_elf_note_type(), so all that we need to do is to
15780	 display the data.  */
15781      {
15782	unsigned long i;
15783
15784	printf (_("    Description data: "));
15785	for (i = 0; i < pnote->descsz; ++i)
15786	  printf ("%02x ", pnote->descdata[i] & 0xff);
15787	printf ("\n");
15788      }
15789      break;
15790    }
15791
15792  return 1;
15793}
15794
15795static const char *
15796get_v850_elf_note_type (enum v850_notes n_type)
15797{
15798  static char buff[64];
15799
15800  switch (n_type)
15801    {
15802    case V850_NOTE_ALIGNMENT:  return _("Alignment of 8-byte objects");
15803    case V850_NOTE_DATA_SIZE:  return _("Sizeof double and long double");
15804    case V850_NOTE_FPU_INFO:   return _("Type of FPU support needed");
15805    case V850_NOTE_SIMD_INFO:  return _("Use of SIMD instructions");
15806    case V850_NOTE_CACHE_INFO: return _("Use of cache");
15807    case V850_NOTE_MMU_INFO:   return _("Use of MMU");
15808    default:
15809      snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
15810      return buff;
15811    }
15812}
15813
15814static int
15815print_v850_note (Elf_Internal_Note * pnote)
15816{
15817  unsigned int val;
15818
15819  if (pnote->descsz != 4)
15820    return 0;
15821  val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
15822
15823  if (val == 0)
15824    {
15825      printf (_("not set\n"));
15826      return 1;
15827    }
15828
15829  switch (pnote->type)
15830    {
15831    case V850_NOTE_ALIGNMENT:
15832      switch (val)
15833	{
15834	case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return 1;
15835	case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return 1;
15836	}
15837      break;
15838
15839    case V850_NOTE_DATA_SIZE:
15840      switch (val)
15841	{
15842	case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return 1;
15843	case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return 1;
15844	}
15845      break;
15846
15847    case V850_NOTE_FPU_INFO:
15848      switch (val)
15849	{
15850	case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return 1;
15851	case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return 1;
15852	}
15853      break;
15854
15855    case V850_NOTE_MMU_INFO:
15856    case V850_NOTE_CACHE_INFO:
15857    case V850_NOTE_SIMD_INFO:
15858      if (val == EF_RH850_SIMD)
15859	{
15860	  printf (_("yes\n"));
15861	  return 1;
15862	}
15863      break;
15864
15865    default:
15866      /* An 'unknown note type' message will already have been displayed.  */
15867      break;
15868    }
15869
15870  printf (_("unknown value: %x\n"), val);
15871  return 0;
15872}
15873
15874static int
15875process_netbsd_elf_note (Elf_Internal_Note * pnote)
15876{
15877  unsigned int version;
15878
15879  switch (pnote->type)
15880    {
15881    case NT_NETBSD_IDENT:
15882      version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
15883      if ((version / 10000) % 100)
15884        printf ("  NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
15885		version, version / 100000000, (version / 1000000) % 100,
15886		(version / 10000) % 100 > 26 ? "Z" : "",
15887		'A' + (version / 10000) % 26);
15888      else
15889	printf ("  NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
15890	        version, version / 100000000, (version / 1000000) % 100,
15891		(version / 100) % 100);
15892      return 1;
15893
15894    case NT_NETBSD_MARCH:
15895      printf ("  NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
15896	      pnote->descdata);
15897      return 1;
15898
15899    default:
15900      break;
15901    }
15902
15903  printf ("  NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
15904	  pnote->type);
15905  return 1;
15906}
15907
15908static const char *
15909get_freebsd_elfcore_note_type (unsigned e_type)
15910{
15911  switch (e_type)
15912    {
15913    case NT_FREEBSD_THRMISC:
15914      return _("NT_THRMISC (thrmisc structure)");
15915    case NT_FREEBSD_PROCSTAT_PROC:
15916      return _("NT_PROCSTAT_PROC (proc data)");
15917    case NT_FREEBSD_PROCSTAT_FILES:
15918      return _("NT_PROCSTAT_FILES (files data)");
15919    case NT_FREEBSD_PROCSTAT_VMMAP:
15920      return _("NT_PROCSTAT_VMMAP (vmmap data)");
15921    case NT_FREEBSD_PROCSTAT_GROUPS:
15922      return _("NT_PROCSTAT_GROUPS (groups data)");
15923    case NT_FREEBSD_PROCSTAT_UMASK:
15924      return _("NT_PROCSTAT_UMASK (umask data)");
15925    case NT_FREEBSD_PROCSTAT_RLIMIT:
15926      return _("NT_PROCSTAT_RLIMIT (rlimit data)");
15927    case NT_FREEBSD_PROCSTAT_OSREL:
15928      return _("NT_PROCSTAT_OSREL (osreldate data)");
15929    case NT_FREEBSD_PROCSTAT_PSSTRINGS:
15930      return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
15931    case NT_FREEBSD_PROCSTAT_AUXV:
15932      return _("NT_PROCSTAT_AUXV (auxv data)");
15933    }
15934  return get_note_type (e_type);
15935}
15936
15937static const char *
15938get_netbsd_elfcore_note_type (unsigned e_type)
15939{
15940  static char buff[64];
15941
15942  if (e_type == NT_NETBSDCORE_PROCINFO)
15943    {
15944      /* NetBSD core "procinfo" structure.  */
15945      return _("NetBSD procinfo structure");
15946    }
15947
15948  /* As of Jan 2002 there are no other machine-independent notes
15949     defined for NetBSD core files.  If the note type is less
15950     than the start of the machine-dependent note types, we don't
15951     understand it.  */
15952
15953  if (e_type < NT_NETBSDCORE_FIRSTMACH)
15954    {
15955      snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15956      return buff;
15957    }
15958
15959  switch (elf_header.e_machine)
15960    {
15961    /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
15962       and PT_GETFPREGS == mach+2.  */
15963
15964    case EM_OLD_ALPHA:
15965    case EM_ALPHA:
15966    case EM_SPARC:
15967    case EM_SPARC32PLUS:
15968    case EM_SPARCV9:
15969      switch (e_type)
15970	{
15971	case NT_NETBSDCORE_FIRSTMACH + 0:
15972	  return _("PT_GETREGS (reg structure)");
15973	case NT_NETBSDCORE_FIRSTMACH + 2:
15974	  return _("PT_GETFPREGS (fpreg structure)");
15975	default:
15976	  break;
15977	}
15978      break;
15979
15980    /* On all other arch's, PT_GETREGS == mach+1 and
15981       PT_GETFPREGS == mach+3.  */
15982    default:
15983      switch (e_type)
15984	{
15985	case NT_NETBSDCORE_FIRSTMACH + 1:
15986	  return _("PT_GETREGS (reg structure)");
15987	case NT_NETBSDCORE_FIRSTMACH + 3:
15988	  return _("PT_GETFPREGS (fpreg structure)");
15989	default:
15990	  break;
15991	}
15992    }
15993
15994  snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
15995	    e_type - NT_NETBSDCORE_FIRSTMACH);
15996  return buff;
15997}
15998
15999static const char *
16000get_stapsdt_note_type (unsigned e_type)
16001{
16002  static char buff[64];
16003
16004  switch (e_type)
16005    {
16006    case NT_STAPSDT:
16007      return _("NT_STAPSDT (SystemTap probe descriptors)");
16008
16009    default:
16010      break;
16011    }
16012
16013  snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
16014  return buff;
16015}
16016
16017static int
16018print_stapsdt_note (Elf_Internal_Note *pnote)
16019{
16020  int addr_size = is_32bit_elf ? 4 : 8;
16021  char *data = pnote->descdata;
16022  char *data_end = pnote->descdata + pnote->descsz;
16023  bfd_vma pc, base_addr, semaphore;
16024  char *provider, *probe, *arg_fmt;
16025
16026  pc = byte_get ((unsigned char *) data, addr_size);
16027  data += addr_size;
16028  base_addr = byte_get ((unsigned char *) data, addr_size);
16029  data += addr_size;
16030  semaphore = byte_get ((unsigned char *) data, addr_size);
16031  data += addr_size;
16032
16033  provider = data;
16034  data += strlen (data) + 1;
16035  probe = data;
16036  data += strlen (data) + 1;
16037  arg_fmt = data;
16038  data += strlen (data) + 1;
16039
16040  printf (_("    Provider: %s\n"), provider);
16041  printf (_("    Name: %s\n"), probe);
16042  printf (_("    Location: "));
16043  print_vma (pc, FULL_HEX);
16044  printf (_(", Base: "));
16045  print_vma (base_addr, FULL_HEX);
16046  printf (_(", Semaphore: "));
16047  print_vma (semaphore, FULL_HEX);
16048  printf ("\n");
16049  printf (_("    Arguments: %s\n"), arg_fmt);
16050
16051  return data == data_end;
16052}
16053
16054static const char *
16055get_ia64_vms_note_type (unsigned e_type)
16056{
16057  static char buff[64];
16058
16059  switch (e_type)
16060    {
16061    case NT_VMS_MHD:
16062      return _("NT_VMS_MHD (module header)");
16063    case NT_VMS_LNM:
16064      return _("NT_VMS_LNM (language name)");
16065    case NT_VMS_SRC:
16066      return _("NT_VMS_SRC (source files)");
16067    case NT_VMS_TITLE:
16068      return "NT_VMS_TITLE";
16069    case NT_VMS_EIDC:
16070      return _("NT_VMS_EIDC (consistency check)");
16071    case NT_VMS_FPMODE:
16072      return _("NT_VMS_FPMODE (FP mode)");
16073    case NT_VMS_LINKTIME:
16074      return "NT_VMS_LINKTIME";
16075    case NT_VMS_IMGNAM:
16076      return _("NT_VMS_IMGNAM (image name)");
16077    case NT_VMS_IMGID:
16078      return _("NT_VMS_IMGID (image id)");
16079    case NT_VMS_LINKID:
16080      return _("NT_VMS_LINKID (link id)");
16081    case NT_VMS_IMGBID:
16082      return _("NT_VMS_IMGBID (build id)");
16083    case NT_VMS_GSTNAM:
16084      return _("NT_VMS_GSTNAM (sym table name)");
16085    case NT_VMS_ORIG_DYN:
16086      return "NT_VMS_ORIG_DYN";
16087    case NT_VMS_PATCHTIME:
16088      return "NT_VMS_PATCHTIME";
16089    default:
16090      snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
16091      return buff;
16092    }
16093}
16094
16095static int
16096print_ia64_vms_note (Elf_Internal_Note * pnote)
16097{
16098  switch (pnote->type)
16099    {
16100    case NT_VMS_MHD:
16101      if (pnote->descsz > 36)
16102        {
16103          size_t l = strlen (pnote->descdata + 34);
16104          printf (_("    Creation date  : %.17s\n"), pnote->descdata);
16105          printf (_("    Last patch date: %.17s\n"), pnote->descdata + 17);
16106          printf (_("    Module name    : %s\n"), pnote->descdata + 34);
16107          printf (_("    Module version : %s\n"), pnote->descdata + 34 + l + 1);
16108        }
16109      else
16110        printf (_("    Invalid size\n"));
16111      break;
16112    case NT_VMS_LNM:
16113      printf (_("   Language: %s\n"), pnote->descdata);
16114      break;
16115#ifdef BFD64
16116    case NT_VMS_FPMODE:
16117      printf (_("   Floating Point mode: "));
16118      printf ("0x%016" BFD_VMA_FMT "x\n",
16119              (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
16120      break;
16121    case NT_VMS_LINKTIME:
16122      printf (_("   Link time: "));
16123      print_vms_time
16124        ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
16125      printf ("\n");
16126      break;
16127    case NT_VMS_PATCHTIME:
16128      printf (_("   Patch time: "));
16129      print_vms_time
16130        ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
16131      printf ("\n");
16132      break;
16133    case NT_VMS_ORIG_DYN:
16134      printf (_("   Major id: %u,  minor id: %u\n"),
16135              (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
16136              (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
16137      printf (_("   Last modified  : "));
16138      print_vms_time
16139        ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
16140      printf (_("\n   Link flags  : "));
16141      printf ("0x%016" BFD_VMA_FMT "x\n",
16142              (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
16143      printf (_("   Header flags: 0x%08x\n"),
16144              (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
16145      printf (_("   Image id    : %s\n"), pnote->descdata + 32);
16146      break;
16147#endif
16148    case NT_VMS_IMGNAM:
16149      printf (_("    Image name: %s\n"), pnote->descdata);
16150      break;
16151    case NT_VMS_GSTNAM:
16152      printf (_("    Global symbol table name: %s\n"), pnote->descdata);
16153      break;
16154    case NT_VMS_IMGID:
16155      printf (_("    Image id: %s\n"), pnote->descdata);
16156      break;
16157    case NT_VMS_LINKID:
16158      printf (_("    Linker id: %s\n"), pnote->descdata);
16159      break;
16160    default:
16161      break;
16162    }
16163  return 1;
16164}
16165
16166/* Note that by the ELF standard, the name field is already null byte
16167   terminated, and namesz includes the terminating null byte.
16168   I.E. the value of namesz for the name "FSF" is 4.
16169
16170   If the value of namesz is zero, there is no name present.  */
16171static int
16172process_note (Elf_Internal_Note * pnote,
16173	      FILE * file ATTRIBUTE_UNUSED,
16174	      Elf_Internal_Shdr * section ATTRIBUTE_UNUSED)
16175{
16176  const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
16177  const char * nt;
16178
16179  if (pnote->namesz == 0)
16180    /* If there is no note name, then use the default set of
16181       note type strings.  */
16182    nt = get_note_type (pnote->type);
16183
16184  else if (const_strneq (pnote->namedata, "GNU"))
16185    /* GNU-specific object file notes.  */
16186    nt = get_gnu_elf_note_type (pnote->type);
16187
16188  else if (const_strneq (pnote->namedata, "FreeBSD"))
16189    /* FreeBSD-specific core file notes.  */
16190    nt = get_freebsd_elfcore_note_type (pnote->type);
16191
16192  else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
16193    /* NetBSD-specific core file notes.  */
16194    nt = get_netbsd_elfcore_note_type (pnote->type);
16195
16196  else if (const_strneq (pnote->namedata, "NetBSD"))
16197    /* NetBSD-specific core file notes.  */
16198    return process_netbsd_elf_note (pnote);
16199
16200  else if (strneq (pnote->namedata, "SPU/", 4))
16201    {
16202      /* SPU-specific core file notes.  */
16203      nt = pnote->namedata + 4;
16204      name = "SPU";
16205    }
16206
16207  else if (const_strneq (pnote->namedata, "IPF/VMS"))
16208    /* VMS/ia64-specific file notes.  */
16209    nt = get_ia64_vms_note_type (pnote->type);
16210
16211  else if (const_strneq (pnote->namedata, "stapsdt"))
16212    nt = get_stapsdt_note_type (pnote->type);
16213
16214  else
16215    /* Don't recognize this note name; just use the default set of
16216       note type strings.  */
16217    nt = get_note_type (pnote->type);
16218
16219  printf ("  ");
16220  print_symbol (-20, name);
16221  printf (" 0x%08lx\t%s\n", pnote->descsz, nt);
16222
16223  if (const_strneq (pnote->namedata, "IPF/VMS"))
16224    return print_ia64_vms_note (pnote);
16225  else if (const_strneq (pnote->namedata, "GNU"))
16226    return print_gnu_note (pnote);
16227  else if (const_strneq (pnote->namedata, "stapsdt"))
16228    return print_stapsdt_note (pnote);
16229  else if (const_strneq (pnote->namedata, "CORE"))
16230    return print_core_note (pnote);
16231
16232  else if (pnote->descsz)
16233    {
16234      unsigned long i;
16235
16236      printf (_("   description data: "));
16237      for (i = 0; i < pnote->descsz; i++)
16238	printf ("%02x ", pnote->descdata[i]);
16239      printf ("\n");
16240    }
16241
16242  return 1;
16243}
16244
16245static int
16246process_notes_at (FILE *              file,
16247		  Elf_Internal_Shdr * section,
16248		  bfd_vma             offset,
16249		  bfd_vma             length)
16250{
16251  Elf_External_Note * pnotes;
16252  Elf_External_Note * external;
16253  char * end;
16254  int res = 1;
16255
16256  if (length <= 0)
16257    return 0;
16258
16259  if (section)
16260    {
16261      pnotes = (Elf_External_Note *) get_section_contents (section, file);
16262      if (pnotes)
16263	apply_relocations (file, section, (unsigned char *) pnotes, length, NULL, NULL);
16264    }
16265  else
16266    pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
16267					     _("notes"));
16268  if (pnotes == NULL)
16269    return 0;
16270
16271  external = pnotes;
16272
16273  if (section)
16274    printf (_("\nDisplaying notes found in: %s\n"), printable_section_name (section));
16275  else
16276    printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
16277	    (unsigned long) offset, (unsigned long) length);
16278
16279  printf (_("  %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
16280
16281  end = (char *) pnotes + length;
16282  while ((char *) external < end)
16283    {
16284      Elf_Internal_Note inote;
16285      size_t min_notesz;
16286      char *next;
16287      char * temp = NULL;
16288      size_t data_remaining = end - (char *) external;
16289
16290      if (!is_ia64_vms ())
16291	{
16292	  /* PR binutils/15191
16293	     Make sure that there is enough data to read.  */
16294	  min_notesz = offsetof (Elf_External_Note, name);
16295	  if (data_remaining < min_notesz)
16296	    {
16297	      warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
16298		    (int) data_remaining);
16299	      break;
16300	    }
16301	  inote.type     = BYTE_GET (external->type);
16302	  inote.namesz   = BYTE_GET (external->namesz);
16303	  inote.namedata = external->name;
16304	  inote.descsz   = BYTE_GET (external->descsz);
16305	  inote.descdata = inote.namedata + align_power (inote.namesz, 2);
16306	  /* PR 17531: file: 3443835e.  */
16307	  if (inote.descdata < (char *) pnotes || inote.descdata > end)
16308	    {
16309	      warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
16310	      inote.descdata = inote.namedata;
16311	      inote.namesz   = 0;
16312	    }
16313
16314	  inote.descpos  = offset + (inote.descdata - (char *) pnotes);
16315	  next = inote.descdata + align_power (inote.descsz, 2);
16316	}
16317      else
16318	{
16319	  Elf64_External_VMS_Note *vms_external;
16320
16321	  /* PR binutils/15191
16322	     Make sure that there is enough data to read.  */
16323	  min_notesz = offsetof (Elf64_External_VMS_Note, name);
16324	  if (data_remaining < min_notesz)
16325	    {
16326	      warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
16327		    (int) data_remaining);
16328	      break;
16329	    }
16330
16331	  vms_external = (Elf64_External_VMS_Note *) external;
16332	  inote.type     = BYTE_GET (vms_external->type);
16333	  inote.namesz   = BYTE_GET (vms_external->namesz);
16334	  inote.namedata = vms_external->name;
16335	  inote.descsz   = BYTE_GET (vms_external->descsz);
16336	  inote.descdata = inote.namedata + align_power (inote.namesz, 3);
16337	  inote.descpos  = offset + (inote.descdata - (char *) pnotes);
16338	  next = inote.descdata + align_power (inote.descsz, 3);
16339	}
16340
16341      if (inote.descdata < (char *) external + min_notesz
16342	  || next < (char *) external + min_notesz
16343	  /* PR binutils/17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4.  */
16344	  || inote.namedata + inote.namesz < inote.namedata
16345	  || inote.descdata + inote.descsz < inote.descdata
16346	  || data_remaining < (size_t)(next - (char *) external))
16347	{
16348	  warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
16349		(unsigned long) ((char *) external - (char *) pnotes));
16350	  warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
16351		inote.type, inote.namesz, inote.descsz);
16352	  break;
16353	}
16354
16355      external = (Elf_External_Note *) next;
16356
16357      /* Verify that name is null terminated.  It appears that at least
16358	 one version of Linux (RedHat 6.0) generates corefiles that don't
16359	 comply with the ELF spec by failing to include the null byte in
16360	 namesz.  */
16361      if (inote.namedata[inote.namesz - 1] != '\0')
16362	{
16363	  temp = (char *) malloc (inote.namesz + 1);
16364	  if (temp == NULL)
16365	    {
16366	      error (_("Out of memory allocating space for inote name\n"));
16367	      res = 0;
16368	      break;
16369	    }
16370
16371	  strncpy (temp, inote.namedata, inote.namesz);
16372	  temp[inote.namesz] = 0;
16373
16374	  /* warn (_("'%s' NOTE name not properly null terminated\n"), temp);  */
16375	  inote.namedata = temp;
16376	}
16377
16378      res &= process_note (& inote, file, section);
16379
16380      if (temp != NULL)
16381	{
16382	  free (temp);
16383	  temp = NULL;
16384	}
16385    }
16386
16387  free (pnotes);
16388
16389  return res;
16390}
16391
16392static int
16393process_corefile_note_segments (FILE * file)
16394{
16395  Elf_Internal_Phdr * segment;
16396  unsigned int i;
16397  int res = 1;
16398
16399  if (! get_program_headers (file))
16400      return 0;
16401
16402  for (i = 0, segment = program_headers;
16403       i < elf_header.e_phnum;
16404       i++, segment++)
16405    {
16406      if (segment->p_type == PT_NOTE)
16407	res &= process_notes_at (file, NULL,
16408				 (bfd_vma) segment->p_offset,
16409				 (bfd_vma) segment->p_filesz);
16410    }
16411
16412  return res;
16413}
16414
16415static int
16416process_v850_notes (FILE * file, bfd_vma offset, bfd_vma length)
16417{
16418  Elf_External_Note * pnotes;
16419  Elf_External_Note * external;
16420  char * end;
16421  int res = 1;
16422
16423  if (length <= 0)
16424    return 0;
16425
16426  pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
16427                                           _("v850 notes"));
16428  if (pnotes == NULL)
16429    return 0;
16430
16431  external = pnotes;
16432  end = (char*) pnotes + length;
16433
16434  printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
16435	  (unsigned long) offset, (unsigned long) length);
16436
16437  while ((char *) external + sizeof (Elf_External_Note) < end)
16438    {
16439      Elf_External_Note * next;
16440      Elf_Internal_Note inote;
16441
16442      inote.type     = BYTE_GET (external->type);
16443      inote.namesz   = BYTE_GET (external->namesz);
16444      inote.namedata = external->name;
16445      inote.descsz   = BYTE_GET (external->descsz);
16446      inote.descdata = inote.namedata + align_power (inote.namesz, 2);
16447      inote.descpos  = offset + (inote.descdata - (char *) pnotes);
16448
16449      if (inote.descdata < (char *) pnotes || inote.descdata >= end)
16450	{
16451	  warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
16452	  inote.descdata = inote.namedata;
16453	  inote.namesz   = 0;
16454	}
16455
16456      next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
16457
16458      if (   ((char *) next > end)
16459	  || ((char *) next <  (char *) pnotes))
16460	{
16461	  warn (_("corrupt descsz found in note at offset 0x%lx\n"),
16462		(unsigned long) ((char *) external - (char *) pnotes));
16463	  warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
16464		inote.type, inote.namesz, inote.descsz);
16465	  break;
16466	}
16467
16468      external = next;
16469
16470      /* Prevent out-of-bounds indexing.  */
16471      if (   inote.namedata + inote.namesz > end
16472	  || inote.namedata + inote.namesz < inote.namedata)
16473        {
16474          warn (_("corrupt namesz found in note at offset 0x%lx\n"),
16475                (unsigned long) ((char *) external - (char *) pnotes));
16476          warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
16477                inote.type, inote.namesz, inote.descsz);
16478          break;
16479        }
16480
16481      printf ("  %s: ", get_v850_elf_note_type (inote.type));
16482
16483      if (! print_v850_note (& inote))
16484	{
16485	  res = 0;
16486	  printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
16487		  inote.namesz, inote.descsz);
16488	}
16489    }
16490
16491  free (pnotes);
16492
16493  return res;
16494}
16495
16496static int
16497process_note_sections (FILE * file)
16498{
16499  Elf_Internal_Shdr * section;
16500  unsigned long i;
16501  int n = 0;
16502  int res = 1;
16503
16504  for (i = 0, section = section_headers;
16505       i < elf_header.e_shnum && section != NULL;
16506       i++, section++)
16507    {
16508      if (section->sh_type == SHT_NOTE)
16509	{
16510	  res &= process_notes_at (file, section,
16511				   (bfd_vma) section->sh_offset,
16512				   (bfd_vma) section->sh_size);
16513	  n++;
16514	}
16515
16516      if ((   elf_header.e_machine == EM_V800
16517	   || elf_header.e_machine == EM_V850
16518	   || elf_header.e_machine == EM_CYGNUS_V850)
16519	  && section->sh_type == SHT_RENESAS_INFO)
16520	{
16521	  res &= process_v850_notes (file,
16522				     (bfd_vma) section->sh_offset,
16523				     (bfd_vma) section->sh_size);
16524	  n++;
16525	}
16526    }
16527
16528  if (n == 0)
16529    /* Try processing NOTE segments instead.  */
16530    return process_corefile_note_segments (file);
16531
16532  return res;
16533}
16534
16535static int
16536process_notes (FILE * file)
16537{
16538  /* If we have not been asked to display the notes then do nothing.  */
16539  if (! do_notes)
16540    return 1;
16541
16542  if (elf_header.e_type != ET_CORE)
16543    return process_note_sections (file);
16544
16545  /* No program headers means no NOTE segment.  */
16546  if (elf_header.e_phnum > 0)
16547    return process_corefile_note_segments (file);
16548
16549  printf (_("No note segments present in the core file.\n"));
16550  return 1;
16551}
16552
16553static int
16554process_arch_specific (FILE * file)
16555{
16556  if (! do_arch)
16557    return 1;
16558
16559  switch (elf_header.e_machine)
16560    {
16561    case EM_ARM:
16562      return process_arm_specific (file);
16563    case EM_MIPS:
16564    case EM_MIPS_RS3_LE:
16565      return process_mips_specific (file);
16566      break;
16567    case EM_NDS32:
16568      return process_nds32_specific (file);
16569      break;
16570    case EM_PPC:
16571    case EM_PPC64:
16572      return process_power_specific (file);
16573      break;
16574    case EM_S390:
16575    case EM_S390_OLD:
16576      return process_s390_specific (file);
16577      break;
16578    case EM_SPARC:
16579    case EM_SPARC32PLUS:
16580    case EM_SPARCV9:
16581      return process_sparc_specific (file);
16582      break;
16583    case EM_TI_C6000:
16584      return process_tic6x_specific (file);
16585      break;
16586    case EM_MSP430:
16587      return process_msp430x_specific (file);
16588    default:
16589      break;
16590    }
16591  return 1;
16592}
16593
16594static int
16595get_file_header (FILE * file)
16596{
16597  /* Read in the identity array.  */
16598  if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
16599    return 0;
16600
16601  /* Determine how to read the rest of the header.  */
16602  switch (elf_header.e_ident[EI_DATA])
16603    {
16604    default:
16605    case ELFDATANONE:
16606    case ELFDATA2LSB:
16607      byte_get = byte_get_little_endian;
16608      byte_put = byte_put_little_endian;
16609      break;
16610    case ELFDATA2MSB:
16611      byte_get = byte_get_big_endian;
16612      byte_put = byte_put_big_endian;
16613      break;
16614    }
16615
16616  /* For now we only support 32 bit and 64 bit ELF files.  */
16617  is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
16618
16619  /* Read in the rest of the header.  */
16620  if (is_32bit_elf)
16621    {
16622      Elf32_External_Ehdr ehdr32;
16623
16624      if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
16625	return 0;
16626
16627      elf_header.e_type      = BYTE_GET (ehdr32.e_type);
16628      elf_header.e_machine   = BYTE_GET (ehdr32.e_machine);
16629      elf_header.e_version   = BYTE_GET (ehdr32.e_version);
16630      elf_header.e_entry     = BYTE_GET (ehdr32.e_entry);
16631      elf_header.e_phoff     = BYTE_GET (ehdr32.e_phoff);
16632      elf_header.e_shoff     = BYTE_GET (ehdr32.e_shoff);
16633      elf_header.e_flags     = BYTE_GET (ehdr32.e_flags);
16634      elf_header.e_ehsize    = BYTE_GET (ehdr32.e_ehsize);
16635      elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
16636      elf_header.e_phnum     = BYTE_GET (ehdr32.e_phnum);
16637      elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
16638      elf_header.e_shnum     = BYTE_GET (ehdr32.e_shnum);
16639      elf_header.e_shstrndx  = BYTE_GET (ehdr32.e_shstrndx);
16640    }
16641  else
16642    {
16643      Elf64_External_Ehdr ehdr64;
16644
16645      /* If we have been compiled with sizeof (bfd_vma) == 4, then
16646	 we will not be able to cope with the 64bit data found in
16647	 64 ELF files.  Detect this now and abort before we start
16648	 overwriting things.  */
16649      if (sizeof (bfd_vma) < 8)
16650	{
16651	  error (_("This instance of readelf has been built without support for a\n\
1665264 bit data type and so it cannot read 64 bit ELF files.\n"));
16653	  return 0;
16654	}
16655
16656      if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
16657	return 0;
16658
16659      elf_header.e_type      = BYTE_GET (ehdr64.e_type);
16660      elf_header.e_machine   = BYTE_GET (ehdr64.e_machine);
16661      elf_header.e_version   = BYTE_GET (ehdr64.e_version);
16662      elf_header.e_entry     = BYTE_GET (ehdr64.e_entry);
16663      elf_header.e_phoff     = BYTE_GET (ehdr64.e_phoff);
16664      elf_header.e_shoff     = BYTE_GET (ehdr64.e_shoff);
16665      elf_header.e_flags     = BYTE_GET (ehdr64.e_flags);
16666      elf_header.e_ehsize    = BYTE_GET (ehdr64.e_ehsize);
16667      elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
16668      elf_header.e_phnum     = BYTE_GET (ehdr64.e_phnum);
16669      elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
16670      elf_header.e_shnum     = BYTE_GET (ehdr64.e_shnum);
16671      elf_header.e_shstrndx  = BYTE_GET (ehdr64.e_shstrndx);
16672    }
16673
16674  if (elf_header.e_shoff)
16675    {
16676      /* There may be some extensions in the first section header.  Don't
16677	 bomb if we can't read it.  */
16678      if (is_32bit_elf)
16679	get_32bit_section_headers (file, TRUE);
16680      else
16681	get_64bit_section_headers (file, TRUE);
16682    }
16683
16684  return 1;
16685}
16686
16687/* Process one ELF object file according to the command line options.
16688   This file may actually be stored in an archive.  The file is
16689   positioned at the start of the ELF object.  */
16690
16691static int
16692process_object (char * file_name, FILE * file)
16693{
16694  unsigned int i;
16695
16696  if (! get_file_header (file))
16697    {
16698      error (_("%s: Failed to read file header\n"), file_name);
16699      return 1;
16700    }
16701
16702  /* Initialise per file variables.  */
16703  for (i = ARRAY_SIZE (version_info); i--;)
16704    version_info[i] = 0;
16705
16706  for (i = ARRAY_SIZE (dynamic_info); i--;)
16707    dynamic_info[i] = 0;
16708  dynamic_info_DT_GNU_HASH = 0;
16709
16710  /* Process the file.  */
16711  if (show_name)
16712    printf (_("\nFile: %s\n"), file_name);
16713
16714  /* Initialise the dump_sects array from the cmdline_dump_sects array.
16715     Note we do this even if cmdline_dump_sects is empty because we
16716     must make sure that the dump_sets array is zeroed out before each
16717     object file is processed.  */
16718  if (num_dump_sects > num_cmdline_dump_sects)
16719    memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
16720
16721  if (num_cmdline_dump_sects > 0)
16722    {
16723      if (num_dump_sects == 0)
16724	/* A sneaky way of allocating the dump_sects array.  */
16725	request_dump_bynumber (num_cmdline_dump_sects, 0);
16726
16727      assert (num_dump_sects >= num_cmdline_dump_sects);
16728      memcpy (dump_sects, cmdline_dump_sects,
16729	      num_cmdline_dump_sects * sizeof (* dump_sects));
16730    }
16731
16732  if (! process_file_header ())
16733    return 1;
16734
16735  if (! process_section_headers (file))
16736    {
16737      /* Without loaded section headers we cannot process lots of
16738	 things.  */
16739      do_unwind = do_version = do_dump = do_arch = 0;
16740
16741      if (! do_using_dynamic)
16742	do_syms = do_dyn_syms = do_reloc = 0;
16743    }
16744
16745  if (! process_section_groups (file))
16746    {
16747      /* Without loaded section groups we cannot process unwind.  */
16748      do_unwind = 0;
16749    }
16750
16751  if (process_program_headers (file))
16752    process_dynamic_section (file);
16753
16754  process_relocs (file);
16755
16756  process_unwind (file);
16757
16758  process_symbol_table (file);
16759
16760  process_syminfo (file);
16761
16762  process_version_sections (file);
16763
16764  process_section_contents (file);
16765
16766  process_notes (file);
16767
16768  process_gnu_liblist (file);
16769
16770  process_arch_specific (file);
16771
16772  if (program_headers)
16773    {
16774      free (program_headers);
16775      program_headers = NULL;
16776    }
16777
16778  if (section_headers)
16779    {
16780      free (section_headers);
16781      section_headers = NULL;
16782    }
16783
16784  if (string_table)
16785    {
16786      free (string_table);
16787      string_table = NULL;
16788      string_table_length = 0;
16789    }
16790
16791  if (dynamic_strings)
16792    {
16793      free (dynamic_strings);
16794      dynamic_strings = NULL;
16795      dynamic_strings_length = 0;
16796    }
16797
16798  if (dynamic_symbols)
16799    {
16800      free (dynamic_symbols);
16801      dynamic_symbols = NULL;
16802      num_dynamic_syms = 0;
16803    }
16804
16805  if (dynamic_syminfo)
16806    {
16807      free (dynamic_syminfo);
16808      dynamic_syminfo = NULL;
16809    }
16810
16811  if (dynamic_section)
16812    {
16813      free (dynamic_section);
16814      dynamic_section = NULL;
16815    }
16816
16817  if (section_headers_groups)
16818    {
16819      free (section_headers_groups);
16820      section_headers_groups = NULL;
16821    }
16822
16823  if (section_groups)
16824    {
16825      struct group_list * g;
16826      struct group_list * next;
16827
16828      for (i = 0; i < group_count; i++)
16829	{
16830	  for (g = section_groups [i].root; g != NULL; g = next)
16831	    {
16832	      next = g->next;
16833	      free (g);
16834	    }
16835	}
16836
16837      free (section_groups);
16838      section_groups = NULL;
16839    }
16840
16841  free_debug_memory ();
16842
16843  return 0;
16844}
16845
16846/* Process an ELF archive.
16847   On entry the file is positioned just after the ARMAG string.  */
16848
16849static int
16850process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
16851{
16852  struct archive_info arch;
16853  struct archive_info nested_arch;
16854  size_t got;
16855  int ret;
16856
16857  show_name = 1;
16858
16859  /* The ARCH structure is used to hold information about this archive.  */
16860  arch.file_name = NULL;
16861  arch.file = NULL;
16862  arch.index_array = NULL;
16863  arch.sym_table = NULL;
16864  arch.longnames = NULL;
16865
16866  /* The NESTED_ARCH structure is used as a single-item cache of information
16867     about a nested archive (when members of a thin archive reside within
16868     another regular archive file).  */
16869  nested_arch.file_name = NULL;
16870  nested_arch.file = NULL;
16871  nested_arch.index_array = NULL;
16872  nested_arch.sym_table = NULL;
16873  nested_arch.longnames = NULL;
16874
16875  if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
16876    {
16877      ret = 1;
16878      goto out;
16879    }
16880
16881  if (do_archive_index)
16882    {
16883      if (arch.sym_table == NULL)
16884	error (_("%s: unable to dump the index as none was found\n"), file_name);
16885      else
16886	{
16887	  unsigned long i, l;
16888	  unsigned long current_pos;
16889
16890	  printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
16891		  file_name, (unsigned long) arch.index_num, arch.sym_size);
16892	  current_pos = ftell (file);
16893
16894	  for (i = l = 0; i < arch.index_num; i++)
16895	    {
16896	      if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
16897	        {
16898	          char * member_name;
16899
16900		  member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
16901
16902                  if (member_name != NULL)
16903                    {
16904	              char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
16905
16906                      if (qualified_name != NULL)
16907                        {
16908		          printf (_("Contents of binary %s at offset "), qualified_name);
16909			  (void) print_vma (arch.index_array[i], PREFIX_HEX);
16910			  putchar ('\n');
16911		          free (qualified_name);
16912		        }
16913		    }
16914		}
16915
16916	      if (l >= arch.sym_size)
16917		{
16918		  error (_("%s: end of the symbol table reached before the end of the index\n"),
16919			 file_name);
16920		  break;
16921		}
16922	      /* PR 17531: file: 0b6630b2.  */
16923	      printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
16924	      l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
16925	    }
16926
16927	  if (arch.uses_64bit_indicies)
16928	    l = (l + 7) & ~ 7;
16929	  else
16930	    l += l & 1;
16931
16932	  if (l < arch.sym_size)
16933	    error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
16934		   file_name, arch.sym_size - l);
16935
16936	  if (fseek (file, current_pos, SEEK_SET) != 0)
16937	    {
16938	      error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
16939	      ret = 1;
16940	      goto out;
16941	    }
16942	}
16943
16944      if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
16945	  && !do_segments && !do_header && !do_dump && !do_version
16946	  && !do_histogram && !do_debugging && !do_arch && !do_notes
16947	  && !do_section_groups && !do_dyn_syms)
16948	{
16949	  ret = 0; /* Archive index only.  */
16950	  goto out;
16951	}
16952    }
16953
16954  ret = 0;
16955
16956  while (1)
16957    {
16958      char * name;
16959      size_t namelen;
16960      char * qualified_name;
16961
16962      /* Read the next archive header.  */
16963      if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
16964        {
16965          error (_("%s: failed to seek to next archive header\n"), file_name);
16966          return 1;
16967        }
16968      got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
16969      if (got != sizeof arch.arhdr)
16970        {
16971          if (got == 0)
16972	    break;
16973          error (_("%s: failed to read archive header\n"), file_name);
16974          ret = 1;
16975          break;
16976        }
16977      if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
16978        {
16979          error (_("%s: did not find a valid archive header\n"), arch.file_name);
16980          ret = 1;
16981          break;
16982        }
16983
16984      arch.next_arhdr_offset += sizeof arch.arhdr;
16985
16986      archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
16987      if (archive_file_size & 01)
16988        ++archive_file_size;
16989
16990      name = get_archive_member_name (&arch, &nested_arch);
16991      if (name == NULL)
16992	{
16993	  error (_("%s: bad archive file name\n"), file_name);
16994	  ret = 1;
16995	  break;
16996	}
16997      namelen = strlen (name);
16998
16999      qualified_name = make_qualified_name (&arch, &nested_arch, name);
17000      if (qualified_name == NULL)
17001	{
17002	  error (_("%s: bad archive file name\n"), file_name);
17003	  ret = 1;
17004	  break;
17005	}
17006
17007      if (is_thin_archive && arch.nested_member_origin == 0)
17008        {
17009          /* This is a proxy for an external member of a thin archive.  */
17010          FILE * member_file;
17011          char * member_file_name = adjust_relative_path (file_name, name, namelen);
17012          if (member_file_name == NULL)
17013            {
17014              ret = 1;
17015              break;
17016            }
17017
17018          member_file = fopen (member_file_name, "rb");
17019          if (member_file == NULL)
17020            {
17021              error (_("Input file '%s' is not readable.\n"), member_file_name);
17022              free (member_file_name);
17023              ret = 1;
17024              break;
17025            }
17026
17027          archive_file_offset = arch.nested_member_origin;
17028
17029          ret |= process_object (qualified_name, member_file);
17030
17031          fclose (member_file);
17032          free (member_file_name);
17033        }
17034      else if (is_thin_archive)
17035        {
17036	  /* PR 15140: Allow for corrupt thin archives.  */
17037	  if (nested_arch.file == NULL)
17038	    {
17039	      error (_("%s: contains corrupt thin archive: %s\n"),
17040		     file_name, name);
17041	      ret = 1;
17042	      break;
17043	    }
17044
17045          /* This is a proxy for a member of a nested archive.  */
17046          archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
17047
17048          /* The nested archive file will have been opened and setup by
17049             get_archive_member_name.  */
17050          if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
17051            {
17052              error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
17053              ret = 1;
17054              break;
17055            }
17056
17057          ret |= process_object (qualified_name, nested_arch.file);
17058        }
17059      else
17060        {
17061          archive_file_offset = arch.next_arhdr_offset;
17062          arch.next_arhdr_offset += archive_file_size;
17063
17064          ret |= process_object (qualified_name, file);
17065        }
17066
17067      if (dump_sects != NULL)
17068	{
17069	  free (dump_sects);
17070	  dump_sects = NULL;
17071	  num_dump_sects = 0;
17072	}
17073
17074      free (qualified_name);
17075    }
17076
17077 out:
17078  if (nested_arch.file != NULL)
17079    fclose (nested_arch.file);
17080  release_archive (&nested_arch);
17081  release_archive (&arch);
17082
17083  return ret;
17084}
17085
17086static int
17087process_file (char * file_name)
17088{
17089  FILE * file;
17090  struct stat statbuf;
17091  char armag[SARMAG];
17092  int ret;
17093
17094  if (stat (file_name, &statbuf) < 0)
17095    {
17096      if (errno == ENOENT)
17097	error (_("'%s': No such file\n"), file_name);
17098      else
17099	error (_("Could not locate '%s'.  System error message: %s\n"),
17100	       file_name, strerror (errno));
17101      return 1;
17102    }
17103
17104  if (! S_ISREG (statbuf.st_mode))
17105    {
17106      error (_("'%s' is not an ordinary file\n"), file_name);
17107      return 1;
17108    }
17109
17110  file = fopen (file_name, "rb");
17111  if (file == NULL)
17112    {
17113      error (_("Input file '%s' is not readable.\n"), file_name);
17114      return 1;
17115    }
17116
17117  if (fread (armag, SARMAG, 1, file) != 1)
17118    {
17119      error (_("%s: Failed to read file's magic number\n"), file_name);
17120      fclose (file);
17121      return 1;
17122    }
17123
17124  current_file_size = (bfd_size_type) statbuf.st_size;
17125
17126  if (memcmp (armag, ARMAG, SARMAG) == 0)
17127    ret = process_archive (file_name, file, FALSE);
17128  else if (memcmp (armag, ARMAGT, SARMAG) == 0)
17129    ret = process_archive (file_name, file, TRUE);
17130  else
17131    {
17132      if (do_archive_index)
17133	error (_("File %s is not an archive so its index cannot be displayed.\n"),
17134	       file_name);
17135
17136      rewind (file);
17137      archive_file_size = archive_file_offset = 0;
17138      ret = process_object (file_name, file);
17139    }
17140
17141  fclose (file);
17142
17143  current_file_size = 0;
17144  return ret;
17145}
17146
17147#ifdef SUPPORT_DISASSEMBLY
17148/* Needed by the i386 disassembler.  For extra credit, someone could
17149   fix this so that we insert symbolic addresses here, esp for GOT/PLT
17150   symbols.  */
17151
17152void
17153print_address (unsigned int addr, FILE * outfile)
17154{
17155  fprintf (outfile,"0x%8.8x", addr);
17156}
17157
17158/* Needed by the i386 disassembler.  */
17159void
17160db_task_printsym (unsigned int addr)
17161{
17162  print_address (addr, stderr);
17163}
17164#endif
17165
17166int
17167main (int argc, char ** argv)
17168{
17169  int err;
17170
17171#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
17172  setlocale (LC_MESSAGES, "");
17173#endif
17174#if defined (HAVE_SETLOCALE)
17175  setlocale (LC_CTYPE, "");
17176#endif
17177  bindtextdomain (PACKAGE, LOCALEDIR);
17178  textdomain (PACKAGE);
17179
17180  expandargv (&argc, &argv);
17181
17182  parse_args (argc, argv);
17183
17184  if (num_dump_sects > 0)
17185    {
17186      /* Make a copy of the dump_sects array.  */
17187      cmdline_dump_sects = (dump_type *)
17188          malloc (num_dump_sects * sizeof (* dump_sects));
17189      if (cmdline_dump_sects == NULL)
17190	error (_("Out of memory allocating dump request table.\n"));
17191      else
17192	{
17193	  memcpy (cmdline_dump_sects, dump_sects,
17194		  num_dump_sects * sizeof (* dump_sects));
17195	  num_cmdline_dump_sects = num_dump_sects;
17196	}
17197    }
17198
17199  if (optind < (argc - 1))
17200    show_name = 1;
17201  else if (optind >= argc)
17202    {
17203      warn (_("Nothing to do.\n"));
17204      usage (stderr);
17205    }
17206
17207  err = 0;
17208  while (optind < argc)
17209    err |= process_file (argv[optind++]);
17210
17211  if (dump_sects != NULL)
17212    free (dump_sects);
17213  if (cmdline_dump_sects != NULL)
17214    free (cmdline_dump_sects);
17215
17216  return err;
17217}
17218